Don't call is_osize_32 from far_return and far_jump

This commit is contained in:
Fabian 2020-12-31 19:14:30 -06:00
parent 4972c3ae33
commit 81a43f8a88
3 changed files with 25 additions and 30 deletions

View file

@ -120,8 +120,8 @@ function V86Starter(options)
dbg_trace();
},
"far_jump": function(eip, selector, is_call) { return cpu.far_jump(eip, selector, !!is_call); },
"far_return": function(eip, selector, stack_adjust) { return cpu.far_return(eip, selector, stack_adjust); },
"far_jump": function(eip, selector, is_call, is_osize_32) { return cpu.far_jump(eip, selector, !!is_call, !!is_osize_32); },
"far_return": function(eip, selector, stack_adjust, is_osize_32) { return cpu.far_return(eip, selector, stack_adjust, !!is_osize_32); },
"pic_acknowledge": function() { cpu.pic_acknowledge(); },
"io_port_read8": function(addr) { return cpu.io.port_read8(addr); },

View file

@ -1580,7 +1580,7 @@ CPU.prototype.jit_clear_cache = function()
}
};
CPU.prototype.far_return = function(eip, selector, stack_adjust)
CPU.prototype.far_return = function(eip, selector, stack_adjust, is_osize_32)
{
dbg_assert(typeof selector === "number" && selector < 0x10000 && selector >= 0);
@ -1597,7 +1597,7 @@ CPU.prototype.far_return = function(eip, selector, stack_adjust)
{
this.switch_cs_real_mode(selector);
this.instruction_pointer[0] = this.get_seg_cs() + eip | 0;
this.adjust_stack_reg(2 * (this.is_osize_32() ? 4 : 2) + stack_adjust);
this.adjust_stack_reg(2 * (is_osize_32 ? 4 : 2) + stack_adjust);
return;
}
@ -1662,9 +1662,9 @@ CPU.prototype.far_return = function(eip, selector, stack_adjust)
if(info.rpl > this.cpl[0])
{
dbg_log("far return privilege change cs: " + h(selector) + " from=" + this.cpl[0] + " to=" + info.rpl + " is_16=" + this.is_osize_32(), LOG_CPU);
dbg_log("far return privilege change cs: " + h(selector) + " from=" + this.cpl[0] + " to=" + info.rpl + " is_16=" + is_osize_32, LOG_CPU);
if(this.is_osize_32())
if(is_osize_32)
{
//dbg_log("esp read from " + h(this.translate_address_system_read(this.get_stack_pointer(stack_adjust + 8))))
var temp_esp = this.safe_read32s(this.get_stack_pointer(stack_adjust + 8));
@ -1686,7 +1686,7 @@ CPU.prototype.far_return = function(eip, selector, stack_adjust)
if(!this.switch_seg(reg_ss, temp_ss)) dbg_assert(false);
this.set_stack_reg(temp_esp + stack_adjust);
//if(this.is_osize_32())
//if(is_osize_32)
//{
// this.adjust_stack_reg(2 * 4);
//}
@ -1701,7 +1701,7 @@ CPU.prototype.far_return = function(eip, selector, stack_adjust)
}
else
{
if(this.is_osize_32())
if(is_osize_32)
{
this.adjust_stack_reg(2 * 4 + stack_adjust);
}
@ -1729,7 +1729,7 @@ CPU.prototype.far_return = function(eip, selector, stack_adjust)
CPU_LOG_VERBOSE && this.debug.dump_state("far ret end");
};
CPU.prototype.far_jump = function(eip, selector, is_call)
CPU.prototype.far_jump = function(eip, selector, is_call, is_osize_32)
{
is_call = !!is_call;
dbg_assert(typeof selector === "number" && selector < 0x10000 && selector >= 0);
@ -1741,7 +1741,7 @@ CPU.prototype.far_jump = function(eip, selector, is_call)
{
if(is_call)
{
if(this.is_osize_32())
if(is_osize_32)
{
if(!this.writable_or_pagefault(this.get_stack_pointer(-8), 8))
{
@ -2065,7 +2065,7 @@ CPU.prototype.far_jump = function(eip, selector, is_call)
if(is_call)
{
if(this.is_osize_32())
if(is_osize_32)
{
if(!this.writable_or_pagefault(this.get_stack_pointer(-8), 8))
{
@ -3017,11 +3017,6 @@ CPU.prototype.verw = function(selector)
}
};
CPU.prototype.is_osize_32 = function()
{
return Boolean(this.is_32[0]) !== ((this.prefixes[0] & PREFIX_MASK_OPSIZE) === PREFIX_MASK_OPSIZE);
};
CPU.prototype.is_asize_32 = function()
{
return Boolean(this.is_32[0]) !== ((this.prefixes[0] & PREFIX_MASK_ADDRSIZE) === PREFIX_MASK_ADDRSIZE);

View file

@ -13,9 +13,9 @@ extern "C" {
#[no_mangle]
fn arpl(seg: i32, r: i32) -> i32;
#[no_mangle]
fn far_jump(eip: i32, selector: i32, is_call: bool);
fn far_jump(eip: i32, selector: i32, is_call: bool, is_osize_32: bool);
#[no_mangle]
fn far_return(eip: i32, selector: i32, stack_adjust: i32);
fn far_return(eip: i32, selector: i32, stack_adjust: i32, is_osize_32: bool);
#[no_mangle]
fn hlt_op();
@ -1465,7 +1465,7 @@ pub unsafe fn instr32_99() { *reg32.offset(EDX as isize) = *reg32.offset(EAX as
#[no_mangle]
pub unsafe fn instr16_9A(new_ip: i32, new_cs: i32) {
// callf
far_jump(new_ip, new_cs, true);
far_jump(new_ip, new_cs, true, false);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -1475,7 +1475,7 @@ pub unsafe fn instr32_9A(new_ip: i32, new_cs: i32) {
dbg_assert!(false);
}
}
far_jump(new_ip, new_cs, true);
far_jump(new_ip, new_cs, true, true);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -1949,14 +1949,14 @@ pub unsafe fn instr16_CA(imm16: i32) {
// retf
let ip = return_on_pagefault!(safe_read16(get_stack_pointer(0)));
let cs = return_on_pagefault!(safe_read16(get_stack_pointer(2)));
far_return(ip, cs, imm16);
far_return(ip, cs, imm16, false);
}
#[no_mangle]
pub unsafe fn instr32_CA(imm16: i32) {
// retf
let ip = return_on_pagefault!(safe_read32s(get_stack_pointer(0)));
let cs = return_on_pagefault!(safe_read32s(get_stack_pointer(4))) & 0xFFFF;
far_return(ip, cs, imm16);
far_return(ip, cs, imm16, true);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -1964,7 +1964,7 @@ pub unsafe fn instr16_CB() {
// retf
let ip = return_on_pagefault!(safe_read16(get_stack_pointer(0)));
let cs = return_on_pagefault!(safe_read16(get_stack_pointer(2)));
far_return(ip, cs, 0);
far_return(ip, cs, 0, false);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -1972,7 +1972,7 @@ pub unsafe fn instr32_CB() {
// retf
let ip = return_on_pagefault!(safe_read32s(get_stack_pointer(0)));
let cs = return_on_pagefault!(safe_read32s(get_stack_pointer(4))) & 0xFFFF;
far_return(ip, cs, 0);
far_return(ip, cs, 0, true);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -2522,13 +2522,13 @@ pub unsafe fn instr32_E9(imm32s: i32) {
#[no_mangle]
pub unsafe fn instr16_EA(new_ip: i32, cs: i32) {
// jmpf
far_jump(new_ip, cs, false);
far_jump(new_ip, cs, false, false);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
pub unsafe fn instr32_EA(new_ip: i32, cs: i32) {
// jmpf
far_jump(new_ip, cs, false);
far_jump(new_ip, cs, false, true);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -2909,7 +2909,7 @@ pub unsafe fn instr16_FF_3_mem(addr: i32) {
// callf
let new_ip = return_on_pagefault!(safe_read16(addr));
let new_cs = return_on_pagefault!(safe_read16(addr + 2));
far_jump(new_ip, new_cs, true);
far_jump(new_ip, new_cs, true, false);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -2934,7 +2934,7 @@ pub unsafe fn instr16_FF_5_mem(addr: i32) {
// jmpf
let new_ip = return_on_pagefault!(safe_read16(addr));
let new_cs = return_on_pagefault!(safe_read16(addr + 2));
far_jump(new_ip, new_cs, false);
far_jump(new_ip, new_cs, false, false);
dbg_assert!(*is_32 || get_real_eip() < 0x10000);
}
#[no_mangle]
@ -2986,7 +2986,7 @@ pub unsafe fn instr32_FF_3_mem(addr: i32) {
dbg_assert!(false);
}
}
far_jump(new_ip, new_cs, true);
far_jump(new_ip, new_cs, true, true);
dbg_assert!(*is_32 || new_ip < 0x10000);
}
#[no_mangle]
@ -3016,7 +3016,7 @@ pub unsafe fn instr32_FF_5_mem(addr: i32) {
dbg_assert!(false);
}
}
far_jump(new_ip, new_cs, false);
far_jump(new_ip, new_cs, false, true);
dbg_assert!(*is_32 || new_ip < 0x10000);
}
#[no_mangle]