|
@@ -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
|