Browse Source

fix: mov sreg, reg triggers pf before ud

Fabian 1 year ago
parent
commit
14b72530d4
1 changed files with 12 additions and 7 deletions
  1. 12 7
      src/rust/cpu/instructions.rs

+ 12 - 7
src/rust/cpu/instructions.rs

@@ -919,23 +919,28 @@ pub unsafe fn instr32_8D_mem(modrm_byte: i32, r: i32) {
     *prefixes = 0;
 }
 
-unsafe fn instr_8E_helper(data: i32, r: i32) {
+#[no_mangle]
+pub unsafe fn instr_8E_mem(addr: i32, r: i32) {
     if r == ES || r == SS || r == DS || r == FS || r == GS {
-        if !switch_seg(r, data) {
+        if !switch_seg(r, return_on_pagefault!(safe_read16(addr))) {
             return;
         }
     }
     else {
         dbg_log!("mov sreg #ud");
         trigger_ud();
-    };
+    }
 }
 #[no_mangle]
-pub unsafe fn instr_8E_mem(addr: i32, r: i32) {
-    instr_8E_helper(return_on_pagefault!(safe_read16(addr)), r);
+pub unsafe fn instr_8E_reg(r1: i32, r: i32) {
+    if r == ES || r == SS || r == DS || r == FS || r == GS {
+        switch_seg(r, read_reg16(r1));
+    }
+    else {
+        dbg_log!("mov sreg #ud");
+        trigger_ud();
+    }
 }
-#[no_mangle]
-pub unsafe fn instr_8E_reg(r1: i32, r: i32) { instr_8E_helper(read_reg16(r1), r); }
 
 pub unsafe fn instr16_8F_0_mem(modrm_byte: i32) {
     // pop