-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Separate L4Re from Linux code, add aarch64 and enable tests #4479
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Some changes occurred in the Android module cc @maurer |
92284e5 to
40a082a
Compare
|
Hi @tgross35, this is the refactoring of the recent L4Re PR: #4383 (which is kept around just in case). I think the failure of the freebsd nightly checks is not my fault. The rest succeeds now. I did most of what you requested in your comment on the old PR, I just kept the linux/mod.rs file around since there is a massive part of code that is linux-only and is not supported by L4Re and it did not seem to make sense to put it all in shared.rs. Also, I put some more code that's shared from the sub modules (emscripten, android, linux, l4re) up in linux_like/mod.rs. In theory, I think there's potential to do that with more code, that's just the one that I would have put in shared.rs but realized that it could go into linux_like/mod.rs instead. |
26e9993 to
5b60e70
Compare
tgross35
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry this has taken a while to get to, but thank you for all the changes here! The shape of this one looks much better. I have a handful of small comments but will need to take a deeper look at the big refactor portions again.
|
@rustbot author, for the above review and a rebase |
|
Reminder, once the PR becomes ready for a review, use |
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
61f844b to
b64b370
Compare
|
@rustbot ready |
| use crate::prelude::*; | ||
|
|
||
| pub type l4_umword_t = c_ulong; // Unsigned machine word. | ||
| pub type pthread_t = *mut c_void; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where does this come from? From https://github.com/search?q=repo%3Akernkonzept%2Fl4re-core+%2Ftypedef.*pthread_t%3B%2F&type=code, it seems like they are all c_ulong, like upstream uclibc. (Not that it really matters too much.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will try to investigate (since changing it brings me a warning). I'd like to leave it for another PR if that's ok.
| #[cfg_attr(any(target_pointer_width = "32",), repr(align(4)))] | ||
| #[cfg_attr(not(any(target_pointer_width = "32",)), repr(align(8)))] | ||
| pub struct pthread_mutexattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_MUTEXATTR_T], | ||
| } | ||
|
|
||
| #[cfg_attr(any(target_pointer_width = "32"), repr(align(4)))] | ||
| #[cfg_attr(all(target_pointer_width = "64"), repr(align(8)))] | ||
| pub struct pthread_rwlockattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_RWLOCKATTR_T], | ||
| } | ||
|
|
||
| #[repr(align(4))] | ||
| pub struct pthread_condattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_CONDATTR_T], | ||
| } | ||
|
|
||
| #[repr(align(4))] | ||
| pub struct pthread_barrierattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_BARRIERATTR_T], | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm looking at the definitions here https://github.com/kernkonzept/l4re-core/blob/e1bf5beeb2933af404b03ca1571e82f33c3385c2/libc/uclibc-ng/libpthread/include/bits/pthreadtypes.h and they don't seem to match up at all - is that the wrong place?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, the definitions are different. I thought it might have been a concious design decision in the linux part of the code to commonize the pthread structs by just putting an array of bytes into them so I kept this (especially because some time in the near future we might support other libcs). But I'm also happy to choose the actual struct definitions if you prefer this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh no it wasn't a deviant decision, that's actually how they're defined in the linux libs https://github.com/bminor/glibc/blob/f9e61cd446d45016e20b6fe85ab87364ebdbec1b/sysdeps/nptl/bits/pthreadtypes.h#L67-L72. I would indeed prefer to match the struct definitions (with all fields private). It's much easier to make sure the fields line up than to add manually compute the size/align, and I don't know that the sizes are likely to always stay the same across platforms anyway.
The L4Re code was previously attached to the Linux code which was not correct in many ways. This commit separates the L4Re code and enables the libc-tests and includes the fixes for the failing tests. Aarch64 is added as a second supported architecture (more to come).
|
@rustbot ready |
tgross35
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Still some leftovers in the pthread definitions, and I would like the uclibc pthread defs to match source rather than using the array. But after this, LGTM!
| #[cfg_attr(any(target_pointer_width = "32",), repr(align(4)))] | ||
| #[cfg_attr(not(any(target_pointer_width = "32",)), repr(align(8)))] | ||
| pub struct pthread_mutexattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_MUTEXATTR_T], | ||
| } | ||
|
|
||
| #[cfg_attr(any(target_pointer_width = "32"), repr(align(4)))] | ||
| #[cfg_attr(all(target_pointer_width = "64"), repr(align(8)))] | ||
| pub struct pthread_rwlockattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_RWLOCKATTR_T], | ||
| } | ||
|
|
||
| #[repr(align(4))] | ||
| pub struct pthread_condattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_CONDATTR_T], | ||
| } | ||
|
|
||
| #[repr(align(4))] | ||
| pub struct pthread_barrierattr_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_BARRIERATTR_T], | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh no it wasn't a deviant decision, that's actually how they're defined in the linux libs https://github.com/bminor/glibc/blob/f9e61cd446d45016e20b6fe85ab87364ebdbec1b/sysdeps/nptl/bits/pthreadtypes.h#L67-L72. I would indeed prefer to match the struct definitions (with all fields private). It's much easier to make sure the fields line up than to add manually compute the size/align, and I don't know that the sizes are likely to always stay the same across platforms anyway.
| size: [u8; crate::__SIZEOF_PTHREAD_COND_T], | ||
| pub size: [u8; crate::__SIZEOF_PTHREAD_COND_T], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please no!
| #[cfg_attr( | ||
| all( | ||
| any(target_env = "musl", target_env = "ohos"), | ||
| any(target_env = "musl", target_env = "ohos", target_os = "emscripten"), | ||
| target_pointer_width = "32" | ||
| ), | ||
| repr(align(4)) | ||
| )] | ||
| #[cfg_attr( | ||
| all( | ||
| any(target_env = "musl", target_env = "ohos"), | ||
| any(target_env = "musl", target_env = "ohos", target_os = "emscripten"), | ||
| target_pointer_width = "64" | ||
| ), | ||
| repr(align(8)) | ||
| )] | ||
| #[cfg_attr( | ||
| all( | ||
| not(any(target_env = "musl", target_env = "ohos")), | ||
| not(any(target_env = "musl", target_env = "ohos", target_os = "emscripten")), | ||
| target_arch = "x86" | ||
| ), | ||
| repr(align(4)) | ||
| )] | ||
| #[cfg_attr( | ||
| all( | ||
| not(any(target_env = "musl", target_env = "ohos")), | ||
| not(any(target_env = "musl", target_env = "ohos", target_os = "emscripten")), | ||
| not(target_arch = "x86") | ||
| ), | ||
| repr(align(8)) | ||
| )] | ||
| pub struct pthread_cond_t { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you please make sure to self-review these pthread diffs? Again this has some changes for emscripten that aren't relevant.
| target_arch = "powerpc", | ||
| target_arch = "sparc", | ||
| target_arch = "x86_64", | ||
| target_arch = "x86" | ||
| target_arch = "x86", | ||
| target_os = "emscripten", | ||
| ) | ||
| ), | ||
| repr(align(4)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto, drop this
| target_arch = "powerpc", | ||
| target_arch = "sparc", | ||
| target_arch = "x86_64", | ||
| target_arch = "x86" | ||
| target_arch = "x86", | ||
| target_os = "emscripten", | ||
| )) | ||
| ), | ||
| repr(align(8)) | ||
| )] | ||
| pub struct pthread_mutex_t { | ||
| #[doc(hidden)] | ||
| size: [u8; crate::__SIZEOF_PTHREAD_MUTEX_T], | ||
| pub size: [c_char; crate::__SIZEOF_PTHREAD_MUTEX_T], | ||
| } | ||
|
|
||
| #[cfg_attr( | ||
| all( | ||
| target_pointer_width = "32", | ||
| any( | ||
| target_os = "emscripten", | ||
| target_arch = "mips", | ||
| target_arch = "mips32r6", | ||
| target_arch = "arm", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto
| any( | ||
| target_pointer_width = "64", | ||
| not(any( | ||
| target_os = "emscripten", | ||
| target_arch = "mips", | ||
| target_arch = "mips32r6", | ||
| target_arch = "arm", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto
| repr(align(8)) | ||
| )] | ||
| pub struct pthread_rwlock_t { | ||
| size: [u8; crate::__SIZEOF_PTHREAD_RWLOCK_T], | ||
| pub size: [u8; crate::__SIZEOF_PTHREAD_RWLOCK_T], | ||
| } | ||
|
|
||
| #[cfg_attr( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto
This is imperfect but should get things closer to what is available on l4re's uclibc fork. Based on work by Marius Melzer [rust-lang#4479]. [rust-lang#4479]: rust-lang#4479 (backport <rust-lang#4836>) (cherry picked from commit 34d8ce7)
The L4Re code was previously attached to the Linux code which was not correct in many ways. This commit separates the L4Re code and enables the libc-tests and includes the fixes for the failing tests. Aarch64 is added as a second supported architecture (more to come).
Sources
L4Re-adapted version of uclibc: https://github.com/kernkonzept/l4re-core/tree/master/uclibc/lib.
Checklist
libc-test/semverhave been updated*LASTor*MAXareincluded (see #3131)
cd libc-test && cargo test --target mytarget);especially relevant for platforms that may not be checked in CI