Merge branch 'floating-point-fixups' into 'aarch64-rebase'
Floating point fixups See merge request redox-os/kernel!165
This commit is contained in:
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ pub fn clone(flags: CloneFlags, stack_base: usize) -> Result<ContextId> {
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user