From 3e65f07e842a8ca4ce3d9c838b696d5e9b03287a Mon Sep 17 00:00:00 2001 From: bdbai Date: Fri, 20 Dec 2024 21:39:57 +0800 Subject: [PATCH 1/3] Attempt to fix arm32 Windows --- src/windows_sys.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/windows_sys.rs b/src/windows_sys.rs index 1e401d5a..bf26dd2e 100644 --- a/src/windows_sys.rs +++ b/src/windows_sys.rs @@ -245,6 +245,51 @@ pub struct CONTEXT { pub SegSs: u32, pub ExtendedRegisters: [u8; 512], } + +cfg_if::cfg_if! { + if #[cfg(target_arch = "arm")] { + pub const ARM_MAX_BREAKPOINTS: usize = 8; + pub const ARM_MAX_WATCHPOINTS: usize = 1; + + #[repr(C)] + #[derive(Clone, Copy)] + pub struct CONTEXT_u([u64; 32]); + + #[repr(C)] + #[derive(Clone, Copy)] + pub struct CONTEXT { + pub ContextFlags: u32, + pub R0: u32, + pub R1: u32, + pub R2: u32, + pub R3: u32, + pub R4: u32, + pub R5: u32, + pub R6: u32, + pub R7: u32, + pub R8: u32, + pub R9: u32, + pub R10: u32, + pub R11: u32, + pub R12: u32, + pub Sp: u32, + pub Lr: u32, + pub Pc: u32, + pub Cpsr: u32, + pub Fpsrc: u32, + pub Padding: u32, + pub u: CONTEXT_u, + pub Bvr: [u32; ARM_MAX_BREAKPOINTS], + pub Bcr: [u32; ARM_MAX_BREAKPOINTS], + pub Wvr: [u32; ARM_MAX_WATCHPOINTS], + pub Wcr: [u32; ARM_MAX_WATCHPOINTS], + pub Padding2: [u32; 2], + } + + pub const IMAGE_FILE_MACHINE_ARMNT: IMAGE_FILE_MACHINE = 0x01c4; + } +} + pub type CONTEXT_FLAGS = u32; pub const CP_UTF8: u32 = 65001u32; pub type CREATE_TOOLHELP_SNAPSHOT_FLAGS = u32; From 41f921db98a4f32eeb3fbdc79795b7b58832f471 Mon Sep 17 00:00:00 2001 From: bdbai Date: Wed, 25 Dec 2024 16:23:11 +0800 Subject: [PATCH 2/3] Match arm definitions with winsdk --- src/windows_sys.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/windows_sys.rs b/src/windows_sys.rs index bf26dd2e..eabaf9be 100644 --- a/src/windows_sys.rs +++ b/src/windows_sys.rs @@ -253,7 +253,18 @@ cfg_if::cfg_if! { #[repr(C)] #[derive(Clone, Copy)] - pub struct CONTEXT_u([u64; 32]); + pub struct NEON128 { + pub Low: u64, + pub High: i64, + } + + #[repr(C)] + #[derive(Clone, Copy)] + pub union CONTEXT_FloatRegs{ + pub Q: [NEON128; 16], + pub D: [u64; 32], + pub S: [u32; 32], + } #[repr(C)] #[derive(Clone, Copy)] @@ -272,13 +283,16 @@ cfg_if::cfg_if! { pub R10: u32, pub R11: u32, pub R12: u32, + // Control registers pub Sp: u32, pub Lr: u32, pub Pc: u32, pub Cpsr: u32, + // Floating-point registers pub Fpsrc: u32, pub Padding: u32, - pub u: CONTEXT_u, + pub u: CONTEXT_FloatRegs, + // Debug registers pub Bvr: [u32; ARM_MAX_BREAKPOINTS], pub Bcr: [u32; ARM_MAX_BREAKPOINTS], pub Wvr: [u32; ARM_MAX_WATCHPOINTS], From 9e236607282f9769799c3f73cddd1356a9fb8b53 Mon Sep 17 00:00:00 2001 From: bdbai Date: Mon, 6 Jan 2025 16:46:24 +0800 Subject: [PATCH 3/3] Move win arm shim to a separate file --- src/windows_sys.rs | 61 ++--------------------------------- src/windows_sys_arm32_shim.rs | 53 ++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 58 deletions(-) create mode 100644 src/windows_sys_arm32_shim.rs diff --git a/src/windows_sys.rs b/src/windows_sys.rs index eabaf9be..443a1696 100644 --- a/src/windows_sys.rs +++ b/src/windows_sys.rs @@ -246,64 +246,6 @@ pub struct CONTEXT { pub ExtendedRegisters: [u8; 512], } -cfg_if::cfg_if! { - if #[cfg(target_arch = "arm")] { - pub const ARM_MAX_BREAKPOINTS: usize = 8; - pub const ARM_MAX_WATCHPOINTS: usize = 1; - - #[repr(C)] - #[derive(Clone, Copy)] - pub struct NEON128 { - pub Low: u64, - pub High: i64, - } - - #[repr(C)] - #[derive(Clone, Copy)] - pub union CONTEXT_FloatRegs{ - pub Q: [NEON128; 16], - pub D: [u64; 32], - pub S: [u32; 32], - } - - #[repr(C)] - #[derive(Clone, Copy)] - pub struct CONTEXT { - pub ContextFlags: u32, - pub R0: u32, - pub R1: u32, - pub R2: u32, - pub R3: u32, - pub R4: u32, - pub R5: u32, - pub R6: u32, - pub R7: u32, - pub R8: u32, - pub R9: u32, - pub R10: u32, - pub R11: u32, - pub R12: u32, - // Control registers - pub Sp: u32, - pub Lr: u32, - pub Pc: u32, - pub Cpsr: u32, - // Floating-point registers - pub Fpsrc: u32, - pub Padding: u32, - pub u: CONTEXT_FloatRegs, - // Debug registers - pub Bvr: [u32; ARM_MAX_BREAKPOINTS], - pub Bcr: [u32; ARM_MAX_BREAKPOINTS], - pub Wvr: [u32; ARM_MAX_WATCHPOINTS], - pub Wcr: [u32; ARM_MAX_WATCHPOINTS], - pub Padding2: [u32; 2], - } - - pub const IMAGE_FILE_MACHINE_ARMNT: IMAGE_FILE_MACHINE = 0x01c4; - } -} - pub type CONTEXT_FLAGS = u32; pub const CP_UTF8: u32 = 65001u32; pub type CREATE_TOOLHELP_SNAPSHOT_FLAGS = u32; @@ -721,3 +663,6 @@ pub struct XSAVE_FORMAT { pub XmmRegisters: [M128A; 8], pub Reserved4: [u8; 224], } + +#[cfg(target_arch = "arm")] +include!("./windows_sys_arm32_shim.rs"); diff --git a/src/windows_sys_arm32_shim.rs b/src/windows_sys_arm32_shim.rs new file mode 100644 index 00000000..4df9064c --- /dev/null +++ b/src/windows_sys_arm32_shim.rs @@ -0,0 +1,53 @@ +pub const ARM_MAX_BREAKPOINTS: usize = 8; +pub const ARM_MAX_WATCHPOINTS: usize = 1; + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NEON128 { + pub Low: u64, + pub High: i64, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub union CONTEXT_FloatRegs { + pub Q: [NEON128; 16], + pub D: [u64; 32], + pub S: [u32; 32], +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct CONTEXT { + pub ContextFlags: u32, + pub R0: u32, + pub R1: u32, + pub R2: u32, + pub R3: u32, + pub R4: u32, + pub R5: u32, + pub R6: u32, + pub R7: u32, + pub R8: u32, + pub R9: u32, + pub R10: u32, + pub R11: u32, + pub R12: u32, + // Control registers + pub Sp: u32, + pub Lr: u32, + pub Pc: u32, + pub Cpsr: u32, + // Floating-point registers + pub Fpsrc: u32, + pub Padding: u32, + pub u: CONTEXT_FloatRegs, + // Debug registers + pub Bvr: [u32; ARM_MAX_BREAKPOINTS], + pub Bcr: [u32; ARM_MAX_BREAKPOINTS], + pub Wvr: [u32; ARM_MAX_WATCHPOINTS], + pub Wcr: [u32; ARM_MAX_WATCHPOINTS], + pub Padding2: [u32; 2], +} + +pub const IMAGE_FILE_MACHINE_ARMNT: IMAGE_FILE_MACHINE = 0x01c4;