Browse Source

fsave: set high bits of 16-bit fields

Fabian 1 year ago
parent
commit
3c81e70794
1 changed files with 5 additions and 4 deletions
  1. 5 4
      src/rust/cpu/fpu.rs

+ 5 - 4
src/rust/cpu/fpu.rs

@@ -551,14 +551,15 @@ pub unsafe fn fpu_fstenv32(addr: i32) {
             return;
         },
     }
-    safe_write16(addr, (*fpu_control_word).into()).unwrap();
-    safe_write16(addr + 4, fpu_load_status_word().into()).unwrap();
-    safe_write16(addr + 8, fpu_load_tag_word()).unwrap();
+    let high_bits = 0xFFFF0000u32 as i32;
+    safe_write32(addr + 0, high_bits + *fpu_control_word as i32).unwrap();
+    safe_write32(addr + 4, high_bits + fpu_load_status_word() as i32).unwrap();
+    safe_write32(addr + 8, high_bits + fpu_load_tag_word()).unwrap();
     safe_write32(addr + 12, *fpu_ip).unwrap();
     safe_write16(addr + 16, *fpu_ip_selector).unwrap();
     safe_write16(addr + 18, *fpu_opcode).unwrap();
     safe_write32(addr + 20, *fpu_dp).unwrap();
-    safe_write16(addr + 24, *fpu_dp_selector).unwrap();
+    safe_write32(addr + 24, high_bits | *fpu_dp_selector).unwrap();
 }
 #[no_mangle]
 pub unsafe fn fpu_load_tag_word() -> i32 {