From 095b950f7ba6974002fd0f6ae0b07654eefebce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Pal=C3=A9ologue?= Date: Wed, 11 May 2022 14:47:50 +0200 Subject: [PATCH 1/3] Complete i686-unknown-linux-musl ucontext_t #2787 --- libc-test/build.rs | 6 ++- src/unix/linux_like/linux/musl/b32/x86/mod.rs | 54 +++++++++++++++++-- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/libc-test/build.rs b/libc-test/build.rs index 0e56050b008de..113ecb1f8c7f3 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -2730,6 +2730,7 @@ fn test_linux(target: &str) { ), } + let aarch64 = target.contains("aarch64"); let arm = target.contains("arm"); let i686 = target.contains("i686"); let mips = target.contains("mips"); @@ -2742,8 +2743,8 @@ fn test_linux(target: &str) { let x32 = target.contains("x32"); let x86_32 = target.contains("i686"); let x86_64 = target.contains("x86_64"); - let aarch64_musl = target.contains("aarch64") && musl; - let gnueabihf = target.contains("gnueabihf"); + let aarch64_musl = aarch64 && musl; + let gnuabihf = target.contains("gnueabihf"); let x86_64_gnux32 = target.contains("gnux32") && x86_64; let riscv64 = target.contains("riscv64"); let uclibc = target.contains("uclibc"); @@ -2914,6 +2915,7 @@ fn test_linux(target: &str) { "linux/vm_sockets.h", "linux/wait.h", "sys/fanotify.h", + [!aarch64 && !mips && !i686 && !arm && musl]: "asm/sigcontext.h", // is not present on uclibc [!uclibc]: "sys/auxv.h", } diff --git a/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/src/unix/linux_like/linux/musl/b32/x86/mod.rs index c319b91b61434..851ac7ed1d62d 100644 --- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs +++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs @@ -1,5 +1,6 @@ pub type c_char = i8; pub type wchar_t = i32; +pub type greg_t = i32; s! { pub struct stat { @@ -49,7 +50,7 @@ s! { pub struct stack_t { pub ss_sp: *mut ::c_void, pub ss_flags: ::c_int, - pub ss_size: ::size_t + pub ss_size: ::size_t, } pub struct ipc_perm { @@ -61,7 +62,7 @@ s! { pub mode: ::mode_t, pub __seq: ::c_int, __unused1: ::c_long, - __unused2: ::c_long + __unused2: ::c_long, } pub struct shmid_ds { @@ -112,8 +113,28 @@ s! { pub f_spare: [::c_ulong; 4], } + pub struct _fpreg { + pub significand: [u16; 4], + pub exponent: u16, + } + + pub struct _fpstate { + pub cw: ::c_ulong, + pub sw: ::c_ulong, + pub tag: ::c_ulong, + pub ipoff: ::c_ulong, + pub cssel: ::c_ulong, + pub dataoff: ::c_ulong, + pub datasel: ::c_ulong, + pub _st: [_fpreg; 8], + pub status: ::c_ulong, + } + pub struct mcontext_t { - __private: [u32; 22] + pub gregs: [greg_t; 19], + pub fpregs: *mut _fpstate, + pub oldmask: ::c_ulong, + pub cr2: ::c_ulong, } pub struct siginfo_t { @@ -124,6 +145,10 @@ s! { _align: [usize; 0], } + pub struct sigset_t { + pub sig: [::c_ulong; 2] + } + pub struct statfs64 { pub f_type: ::c_ulong, pub f_bsize: ::c_ulong, @@ -163,7 +188,7 @@ s_no_extra_traits! { pub uc_stack: ::stack_t, pub uc_mcontext: mcontext_t, pub uc_sigmask: ::sigset_t, - __private: [u8; 112], + pub __fpregs_mem: [::c_ulong; 28], } } @@ -884,6 +909,27 @@ pub const EFL: ::c_int = 14; pub const UESP: ::c_int = 15; pub const SS: ::c_int = 16; +// offsets in mcontext_t.gregs from sys/ucontext.h +pub const REG_GS: ::c_int = 0; +pub const REG_FS: ::c_int = 1; +pub const REG_ES: ::c_int = 2; +pub const REG_DS: ::c_int = 3; +pub const REG_EDI: ::c_int = 4; +pub const REG_ESI: ::c_int = 5; +pub const REG_EBP: ::c_int = 6; +pub const REG_ESP: ::c_int = 7; +pub const REG_EBX: ::c_int = 8; +pub const REG_EDX: ::c_int = 9; +pub const REG_ECX: ::c_int = 10; +pub const REG_EAX: ::c_int = 11; +pub const REG_TRAPNO: ::c_int = 12; +pub const REG_ERR: ::c_int = 13; +pub const REG_EIP: ::c_int = 14; +pub const REG_CS: ::c_int = 15; +pub const REG_EFL: ::c_int = 16; +pub const REG_UESP: ::c_int = 17; +pub const REG_SS: ::c_int = 18; + extern "C" { pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; } From cf694c193c824ef931aee277aad7aa93cf8d7512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Pal=C3=A9ologue?= Date: Fri, 2 Sep 2022 18:05:22 +0200 Subject: [PATCH 2/3] WIP: add RUST_BACKTRACE --- ci/run.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/run.sh b/ci/run.sh index 4de8087699e24..2da36222d899f 100755 --- a/ci/run.sh +++ b/ci/run.sh @@ -82,6 +82,7 @@ if [ "$QEMU" != "" ]; then exec grep -E "^(PASSED)|(test result: ok)" "${CARGO_TARGET_DIR}/out.log" fi +export RUST_BACKTRACE=1 if [ "$TARGET" = "s390x-unknown-linux-gnu" ]; then # FIXME: s390x-unknown-linux-gnu often fails to test due to timeout, # so we retry this N times. From 89cd883044dba6d89df2604ade72078457f0e627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Pal=C3=A9ologue?= Date: Mon, 3 Oct 2022 13:31:12 +0200 Subject: [PATCH 3/3] Trying something arbitrary --- libc-test/build.rs | 2 +- src/unix/linux_like/linux/musl/b32/x86/mod.rs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/libc-test/build.rs b/libc-test/build.rs index 113ecb1f8c7f3..38f7f3db33d17 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -2744,7 +2744,7 @@ fn test_linux(target: &str) { let x86_32 = target.contains("i686"); let x86_64 = target.contains("x86_64"); let aarch64_musl = aarch64 && musl; - let gnuabihf = target.contains("gnueabihf"); + let gnueabihf = target.contains("gnueabihf"); let x86_64_gnux32 = target.contains("gnux32") && x86_64; let riscv64 = target.contains("riscv64"); let uclibc = target.contains("uclibc"); diff --git a/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/src/unix/linux_like/linux/musl/b32/x86/mod.rs index 851ac7ed1d62d..ed1ba1b932be4 100644 --- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs +++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs @@ -3,6 +3,11 @@ pub type wchar_t = i32; pub type greg_t = i32; s! { + pub struct _libc_fpreg { + pub significand: [u16; 4], + pub exponent: u16, + } + pub struct stat { pub st_dev: ::dev_t, __st_dev_padding: ::c_int, @@ -126,7 +131,7 @@ s! { pub cssel: ::c_ulong, pub dataoff: ::c_ulong, pub datasel: ::c_ulong, - pub _st: [_fpreg; 8], + pub _st: [_libc_fpreg; 8], pub status: ::c_ulong, }