From afca6ab31ca8fcf27557c45672afb5a125bdb274 Mon Sep 17 00:00:00 2001 From: Robin Randhawa Date: Thu, 28 Jan 2021 16:50:07 +0000 Subject: [PATCH 1/2] aarch64: Fix incorrect FP save/restore --- src/context/arch/aarch64.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/context/arch/aarch64.rs b/src/context/arch/aarch64.rs index a8af274..2b850a7 100644 --- a/src/context/arch/aarch64.rs +++ b/src/context/arch/aarch64.rs @@ -225,7 +225,7 @@ impl Context { #[inline(never)] #[naked] pub unsafe fn switch_to(&mut self, next: &mut Context) { - let mut float_regs = self.fx_address as *mut FloatRegisters; + let mut float_regs = &mut *(self.fx_address as *mut FloatRegisters); asm!( "stp q0, q1, [{0}, #16 * 0]", "stp q2, q3, [{0}, #16 * 2]", @@ -245,14 +245,15 @@ impl Context { "stp q30, q31, [{0}, #16 * 30]", "mrs {1}, fpcr", "mrs {2}, fpsr", - in(reg) (&(*(float_regs)).fp_simd_regs), - out(reg) ((*(float_regs)).fpcr), - out(reg) ((*(float_regs)).fpsr) + in(reg) &mut float_regs.fp_simd_regs, + out(reg) float_regs.fpcr, + out(reg) float_regs.fpsr ); self.fx_loadable = true; if next.fx_loadable { + let mut float_regs = &mut *(next.fx_address as *mut FloatRegisters); asm!( "ldp q0, q1, [{0}, #16 * 0]", "ldp q2, q3, [{0}, #16 * 2]", @@ -272,9 +273,9 @@ impl Context { "ldp q30, q31, [{0}, #16 * 30]", "msr fpcr, {1}", "msr fpsr, {2}", - in(reg) (&(*(float_regs)).fp_simd_regs), - in(reg) ((*(float_regs)).fpcr), - in(reg) ((*(float_regs)).fpsr) + in(reg) &mut float_regs.fp_simd_regs, + in(reg) float_regs.fpcr, + in(reg) float_regs.fpsr ); } From 1e10cac3e1d951258920a6d7aed36343fe162e64 Mon Sep 17 00:00:00 2001 From: Robin Randhawa Date: Thu, 28 Jan 2021 16:51:50 +0000 Subject: [PATCH 2/2] aarch64: Increase storage for FP context to consider AArch64's needs Brute-forcing this at present. Would be better to wrap this conditionally for the architecture. --- src/context/list.rs | 2 +- src/context/mod.rs | 2 +- src/syscall/process.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/context/list.rs b/src/context/list.rs index 47c6c9f..704642e 100644 --- a/src/context/list.rs +++ b/src/context/list.rs @@ -75,7 +75,7 @@ impl ContextList { let context_lock = self.new_context()?; { let mut context = context_lock.write(); - let mut fx = unsafe { Box::from_raw(crate::ALLOCATOR.alloc(Layout::from_size_align_unchecked(512, 16)) as *mut [u8; 512]) }; + let mut fx = unsafe { Box::from_raw(crate::ALLOCATOR.alloc(Layout::from_size_align_unchecked(1024, 16)) as *mut [u8; 1024]) }; for b in fx.iter_mut() { *b = 0; } diff --git a/src/context/mod.rs b/src/context/mod.rs index 6c29328..a19c428 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -55,7 +55,7 @@ pub fn init() { let mut contexts = contexts_mut(); let context_lock = contexts.new_context().expect("could not initialize first context"); let mut context = context_lock.write(); - let mut fx = unsafe { Box::from_raw(crate::ALLOCATOR.alloc(Layout::from_size_align_unchecked(512, 16)) as *mut [u8; 512]) }; + let mut fx = unsafe { Box::from_raw(crate::ALLOCATOR.alloc(Layout::from_size_align_unchecked(1024, 16)) as *mut [u8; 1024]) }; for b in fx.iter_mut() { *b = 0; } diff --git a/src/syscall/process.rs b/src/syscall/process.rs index df1b24d..9adad28 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -87,7 +87,7 @@ pub fn clone(flags: CloneFlags, stack_base: usize) -> Result { arch = context.arch.clone(); if let Some(ref fx) = context.kfx { - let mut new_fx = unsafe { Box::from_raw(crate::ALLOCATOR.alloc(Layout::from_size_align_unchecked(512, 16)) as *mut [u8; 512]) }; + let mut new_fx = unsafe { Box::from_raw(crate::ALLOCATOR.alloc(Layout::from_size_align_unchecked(1024, 16)) as *mut [u8; 1024]) }; for (new_b, b) in new_fx.iter_mut().zip(fx.iter()) { *new_b = *b; }