Skip to content

Commit 2ec333c

Browse files
committed
Auto merge of #2008 - bsteinb:macos-aarch64-mcontext, r=JohnTitor
Make test suite pass on macOS on aarch64 While working on #2007 I tried to run `cargo test` in `libc-test`, which failed, because the definition of `__darwin_mcontext64` was incomplete (see #1990). This adds definitions for the exception state and the floating point state as well. `libc-test` still does not pass, because I use the type `[u128; 32]` for the `__v` field of `__darwin_arm_neon_state64` (in C it is `__uint128_t __v[32]`. `ctest2` does not translate `u128` to `__uint128_t` and the generated C code does not compile. Any ideas for working around this?
2 parents a98a649 + ee84dae commit 2ec333c

File tree

10 files changed

+191
-130
lines changed

10 files changed

+191
-130
lines changed

libc-test/build.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ fn test_apple(target: &str) {
199199
"SF_SETTABLE" => true,
200200
// FIXME: the value has been changed since Catalina (VM_FLAGS_RESILIENT_MEDIA is also contained now).
201201
"VM_FLAGS_USER_REMAP" => true,
202+
// FIXME: the values have been changed since Big Sur
203+
"HW_TARGET" | "HW_PRODUCT" | "HW_MAXID" => true,
202204
_ => false,
203205
}
204206
});
@@ -220,6 +222,7 @@ fn test_apple(target: &str) {
220222
match (struct_, field) {
221223
// FIXME: the array size has been changed since macOS 10.15 ([8] -> [7]).
222224
("statfs", "f_reserved") => true,
225+
("__darwin_arm_neon_state64", "__v") => true,
223226
_ => false,
224227
}
225228
});

src/unix/bsd/apple/b64/aarch64.rs

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
pub type mcontext_t = *mut __darwin_mcontext64;
2+
3+
s_no_extra_traits! {
4+
#[allow(missing_debug_implementations)]
5+
pub struct max_align_t {
6+
priv_: f64
7+
}
8+
}
9+
10+
s! {
11+
pub struct ucontext_t {
12+
pub uc_onstack: ::c_int,
13+
pub uc_sigmask: ::sigset_t,
14+
pub uc_stack: ::stack_t,
15+
pub uc_link: *mut ::ucontext_t,
16+
pub uc_mcsize: usize,
17+
pub uc_mcontext: mcontext_t,
18+
}
19+
20+
pub struct __darwin_mcontext64 {
21+
pub __es: __darwin_arm_exception_state64,
22+
pub __ss: __darwin_arm_thread_state64,
23+
pub __ns: __darwin_arm_neon_state64,
24+
}
25+
26+
pub struct __darwin_arm_exception_state64 {
27+
pub __far: u64,
28+
pub __esr: u32,
29+
pub __exception: u32,
30+
}
31+
32+
pub struct __darwin_arm_thread_state64 {
33+
pub __x: [u64; 29],
34+
pub __fp: u64,
35+
pub __lr: u64,
36+
pub __sp: u64,
37+
pub __pc: u64,
38+
pub __cpsr: u32,
39+
pub __pad: u32,
40+
}
41+
42+
#[repr(align(16))]
43+
pub struct __darwin_arm_neon_state64 {
44+
pub __v: [[u64; 2]; 32],
45+
pub __fpsr: u32,
46+
pub __fpcr: u32,
47+
}
48+
}

src/unix/bsd/apple/b64/aarch64/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
pub type boolean_t = ::c_int;
2+
3+
cfg_if! {
4+
if #[cfg(libc_align)] {
5+
mod align;
6+
pub use self::align::*;
7+
}
8+
}

src/unix/bsd/apple/b64/mod.rs

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
33
pub type c_long = i64;
44
pub type c_ulong = u64;
5-
pub type boolean_t = ::c_uint;
6-
pub type mcontext_t = *mut __darwin_mcontext64;
75

86
s! {
97
pub struct timeval32 {
@@ -49,77 +47,6 @@ s! {
4947
pub bh_datalen: u32,
5048
pub bh_hdrlen: ::c_ushort,
5149
}
52-
53-
pub struct ucontext_t {
54-
pub uc_onstack: ::c_int,
55-
pub uc_sigmask: ::sigset_t,
56-
pub uc_stack: ::stack_t,
57-
pub uc_link: *mut ::ucontext_t,
58-
pub uc_mcsize: usize,
59-
pub uc_mcontext: mcontext_t,
60-
}
61-
62-
pub struct __darwin_x86_exception_state64 {
63-
pub __trapno: u16,
64-
pub __cpu: u16,
65-
pub __err: u32,
66-
pub __faultvaddr: u64,
67-
}
68-
69-
pub struct __darwin_x86_float_state64 {
70-
pub __fpu_reserved: [::c_int; 2],
71-
__fpu_fcw: ::c_short,
72-
__fpu_fsw: ::c_short,
73-
pub __fpu_ftw: u8,
74-
pub __fpu_rsrv1: u8,
75-
pub __fpu_fop: u16,
76-
pub __fpu_ip: u32,
77-
pub __fpu_cs: u16,
78-
pub __fpu_rsrv2: u16,
79-
pub __fpu_dp: u32,
80-
pub __fpu_ds: u16,
81-
pub __fpu_rsrv3: u16,
82-
pub __fpu_mxcsr: u32,
83-
pub __fpu_mxcsrmask: u32,
84-
pub __fpu_stmm0: __darwin_mmst_reg,
85-
pub __fpu_stmm1: __darwin_mmst_reg,
86-
pub __fpu_stmm2: __darwin_mmst_reg,
87-
pub __fpu_stmm3: __darwin_mmst_reg,
88-
pub __fpu_stmm4: __darwin_mmst_reg,
89-
pub __fpu_stmm5: __darwin_mmst_reg,
90-
pub __fpu_stmm6: __darwin_mmst_reg,
91-
pub __fpu_stmm7: __darwin_mmst_reg,
92-
pub __fpu_xmm0: __darwin_xmm_reg,
93-
pub __fpu_xmm1: __darwin_xmm_reg,
94-
pub __fpu_xmm2: __darwin_xmm_reg,
95-
pub __fpu_xmm3: __darwin_xmm_reg,
96-
pub __fpu_xmm4: __darwin_xmm_reg,
97-
pub __fpu_xmm5: __darwin_xmm_reg,
98-
pub __fpu_xmm6: __darwin_xmm_reg,
99-
pub __fpu_xmm7: __darwin_xmm_reg,
100-
pub __fpu_xmm8: __darwin_xmm_reg,
101-
pub __fpu_xmm9: __darwin_xmm_reg,
102-
pub __fpu_xmm10: __darwin_xmm_reg,
103-
pub __fpu_xmm11: __darwin_xmm_reg,
104-
pub __fpu_xmm12: __darwin_xmm_reg,
105-
pub __fpu_xmm13: __darwin_xmm_reg,
106-
pub __fpu_xmm14: __darwin_xmm_reg,
107-
pub __fpu_xmm15: __darwin_xmm_reg,
108-
// this field is actually [u8; 96], but defining it with a bigger type
109-
// allows us to auto-implement traits for it since the length of the
110-
// array is less than 32
111-
__fpu_rsrv4: [u32; 24],
112-
pub __fpu_reserved1: ::c_int,
113-
}
114-
115-
pub struct __darwin_mmst_reg {
116-
pub __mmst_reg: [::c_char; 10],
117-
pub __mmst_rsrv: [::c_char; 6],
118-
}
119-
120-
pub struct __darwin_xmm_reg {
121-
pub __xmm_reg: [::c_char; 16],
122-
}
12350
}
12451

12552
s_no_extra_traits! {
@@ -184,13 +111,6 @@ extern "C" {
184111
) -> ::c_int;
185112
}
186113

187-
cfg_if! {
188-
if #[cfg(libc_align)] {
189-
mod align;
190-
pub use self::align::*;
191-
}
192-
}
193-
194114
cfg_if! {
195115
if #[cfg(target_arch = "x86_64")] {
196116
mod x86_64;

src/unix/bsd/apple/b64/x86_64.rs

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
s_no_extra_traits! {
2+
#[allow(missing_debug_implementations)]
3+
#[repr(align(16))]
4+
pub struct max_align_t {
5+
priv_: [f64; 2]
6+
}
7+
}

src/unix/bsd/apple/b64/x86_64/mod.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
pub type boolean_t = ::c_uint;
2+
pub type mcontext_t = *mut __darwin_mcontext64;
3+
4+
s! {
5+
pub struct ucontext_t {
6+
pub uc_onstack: ::c_int,
7+
pub uc_sigmask: ::sigset_t,
8+
pub uc_stack: ::stack_t,
9+
pub uc_link: *mut ::ucontext_t,
10+
pub uc_mcsize: usize,
11+
pub uc_mcontext: mcontext_t,
12+
}
13+
14+
pub struct __darwin_mcontext64 {
15+
pub __es: __darwin_x86_exception_state64,
16+
pub __ss: __darwin_x86_thread_state64,
17+
pub __fs: __darwin_x86_float_state64,
18+
}
19+
20+
pub struct __darwin_x86_exception_state64 {
21+
pub __trapno: u16,
22+
pub __cpu: u16,
23+
pub __err: u32,
24+
pub __faultvaddr: u64,
25+
}
26+
27+
pub struct __darwin_x86_thread_state64 {
28+
pub __rax: u64,
29+
pub __rbx: u64,
30+
pub __rcx: u64,
31+
pub __rdx: u64,
32+
pub __rdi: u64,
33+
pub __rsi: u64,
34+
pub __rbp: u64,
35+
pub __rsp: u64,
36+
pub __r8: u64,
37+
pub __r9: u64,
38+
pub __r10: u64,
39+
pub __r11: u64,
40+
pub __r12: u64,
41+
pub __r13: u64,
42+
pub __r14: u64,
43+
pub __r15: u64,
44+
pub __rip: u64,
45+
pub __rflags: u64,
46+
pub __cs: u64,
47+
pub __fs: u64,
48+
pub __gs: u64,
49+
}
50+
51+
pub struct __darwin_x86_float_state64 {
52+
pub __fpu_reserved: [::c_int; 2],
53+
__fpu_fcw: ::c_short,
54+
__fpu_fsw: ::c_short,
55+
pub __fpu_ftw: u8,
56+
pub __fpu_rsrv1: u8,
57+
pub __fpu_fop: u16,
58+
pub __fpu_ip: u32,
59+
pub __fpu_cs: u16,
60+
pub __fpu_rsrv2: u16,
61+
pub __fpu_dp: u32,
62+
pub __fpu_ds: u16,
63+
pub __fpu_rsrv3: u16,
64+
pub __fpu_mxcsr: u32,
65+
pub __fpu_mxcsrmask: u32,
66+
pub __fpu_stmm0: __darwin_mmst_reg,
67+
pub __fpu_stmm1: __darwin_mmst_reg,
68+
pub __fpu_stmm2: __darwin_mmst_reg,
69+
pub __fpu_stmm3: __darwin_mmst_reg,
70+
pub __fpu_stmm4: __darwin_mmst_reg,
71+
pub __fpu_stmm5: __darwin_mmst_reg,
72+
pub __fpu_stmm6: __darwin_mmst_reg,
73+
pub __fpu_stmm7: __darwin_mmst_reg,
74+
pub __fpu_xmm0: __darwin_xmm_reg,
75+
pub __fpu_xmm1: __darwin_xmm_reg,
76+
pub __fpu_xmm2: __darwin_xmm_reg,
77+
pub __fpu_xmm3: __darwin_xmm_reg,
78+
pub __fpu_xmm4: __darwin_xmm_reg,
79+
pub __fpu_xmm5: __darwin_xmm_reg,
80+
pub __fpu_xmm6: __darwin_xmm_reg,
81+
pub __fpu_xmm7: __darwin_xmm_reg,
82+
pub __fpu_xmm8: __darwin_xmm_reg,
83+
pub __fpu_xmm9: __darwin_xmm_reg,
84+
pub __fpu_xmm10: __darwin_xmm_reg,
85+
pub __fpu_xmm11: __darwin_xmm_reg,
86+
pub __fpu_xmm12: __darwin_xmm_reg,
87+
pub __fpu_xmm13: __darwin_xmm_reg,
88+
pub __fpu_xmm14: __darwin_xmm_reg,
89+
pub __fpu_xmm15: __darwin_xmm_reg,
90+
// this field is actually [u8; 96], but defining it with a bigger type
91+
// allows us to auto-implement traits for it since the length of the
92+
// array is less than 32
93+
__fpu_rsrv4: [u32; 24],
94+
pub __fpu_reserved1: ::c_int,
95+
}
96+
97+
pub struct __darwin_mmst_reg {
98+
pub __mmst_reg: [::c_char; 10],
99+
pub __mmst_rsrv: [::c_char; 6],
100+
}
101+
102+
pub struct __darwin_xmm_reg {
103+
pub __xmm_reg: [::c_char; 16],
104+
}
105+
}
106+
107+
cfg_if! {
108+
if #[cfg(libc_align)] {
109+
mod align;
110+
pub use self::align::*;
111+
}
112+
}

src/unix/bsd/apple/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,9 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 2;
19071907
pub const PTHREAD_PROCESS_SHARED: ::c_int = 1;
19081908
pub const PTHREAD_CREATE_JOINABLE: ::c_int = 1;
19091909
pub const PTHREAD_CREATE_DETACHED: ::c_int = 2;
1910+
#[cfg(target_arch = "aarch64")]
1911+
pub const PTHREAD_STACK_MIN: ::size_t = 16384;
1912+
#[cfg(not(target_arch = "aarch64"))]
19101913
pub const PTHREAD_STACK_MIN: ::size_t = 8192;
19111914

19121915
pub const RLIMIT_CPU: ::c_int = 0;
@@ -2843,7 +2846,9 @@ pub const HW_L3CACHESIZE: ::c_int = 22;
28432846
pub const HW_TB_FREQ: ::c_int = 23;
28442847
pub const HW_MEMSIZE: ::c_int = 24;
28452848
pub const HW_AVAILCPU: ::c_int = 25;
2846-
pub const HW_MAXID: ::c_int = 26;
2849+
pub const HW_TARGET: ::c_int = 26;
2850+
pub const HW_PRODUCT: ::c_int = 27;
2851+
pub const HW_MAXID: ::c_int = 28;
28472852
pub const USER_CS_PATH: ::c_int = 1;
28482853
pub const USER_BC_BASE_MAX: ::c_int = 2;
28492854
pub const USER_BC_DIM_MAX: ::c_int = 3;
@@ -3129,6 +3134,9 @@ pub const SETALL: ::c_int = 9;
31293134
// sys/shm.h
31303135
pub const SHM_RDONLY: ::c_int = 0x1000;
31313136
pub const SHM_RND: ::c_int = 0x2000;
3137+
#[cfg(target_arch = "aarch64")]
3138+
pub const SHMLBA: ::c_int = 16 * 1024;
3139+
#[cfg(not(target_arch = "aarch64"))]
31323140
pub const SHMLBA: ::c_int = 4096;
31333141
pub const SHM_R: ::c_int = IPC_R;
31343142
pub const SHM_W: ::c_int = IPC_W;

src/unix/bsd/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,10 @@ extern "C" {
632632
egid: *mut ::gid_t,
633633
) -> ::c_int;
634634

635-
#[cfg_attr(target_os = "macos", link_name = "glob$INODE64")]
635+
#[cfg_attr(
636+
all(target_os = "macos", not(target_arch = "aarch64")),
637+
link_name = "glob$INODE64")
638+
]
636639
#[cfg_attr(target_os = "netbsd", link_name = "__glob30")]
637640
#[cfg_attr(
638641
all(target_os = "freebsd", any(freebsd11, freebsd10)),

0 commit comments

Comments
 (0)