Don't call is_osize_32 from far_return and far_jump
This commit is contained in:
parent
4972c3ae33
commit
81a43f8a88
|
@ -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); },
|
||||
|
|
23
src/cpu.js
23
src/cpu.js
|
@ -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);
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in a new issue