handle_irqs: Do interrupt flag check from Rust
This commit is contained in:
parent
36a46bca80
commit
fcdda9487e
|
@ -188,7 +188,7 @@ function V86Starter(options)
|
|||
"switch_seg": function(reg, selector) { return cpu.switch_seg(reg, selector); },
|
||||
"iret16": function() { return cpu.iret16(); },
|
||||
"iret32": function() { return cpu.iret32(); },
|
||||
"handle_irqs": function() { return cpu.handle_irqs(); },
|
||||
"pic_acknowledge": function() { cpu.pic_acknowledge(); },
|
||||
|
||||
"io_port_read8": function(addr) { return cpu.io.port_read8(addr); },
|
||||
"io_port_read16": function(addr) { return cpu.io.port_read16(addr); },
|
||||
|
|
25
src/cpu.js
25
src/cpu.js
|
@ -2964,17 +2964,24 @@ CPU.prototype.handle_irqs = function()
|
|||
{
|
||||
//dbg_assert(this.prefixes[0] === 0);
|
||||
|
||||
if((this.flags[0] & flag_interrupt))
|
||||
if(this.flags[0] & flag_interrupt)
|
||||
{
|
||||
if(this.devices.pic)
|
||||
{
|
||||
this.devices.pic.acknowledge_irq();
|
||||
}
|
||||
this.pic_acknowledge();
|
||||
}
|
||||
};
|
||||
|
||||
if(this.devices.apic)
|
||||
{
|
||||
this.devices.apic.acknowledge_irq();
|
||||
}
|
||||
CPU.prototype.pic_acknowledge = function()
|
||||
{
|
||||
dbg_assert(this.flags[0] & flag_interrupt);
|
||||
|
||||
if(this.devices.pic)
|
||||
{
|
||||
this.devices.pic.acknowledge_irq();
|
||||
}
|
||||
|
||||
if(this.devices.apic)
|
||||
{
|
||||
this.devices.apic.acknowledge_irq();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@ extern "C" {
|
|||
fn microtick() -> f64;
|
||||
#[no_mangle]
|
||||
fn call_indirect1(f: i32, x: u16);
|
||||
#[no_mangle]
|
||||
fn pic_acknowledge();
|
||||
}
|
||||
|
||||
use cpu2::global_pointers::*;
|
||||
|
@ -1720,3 +1722,9 @@ pub unsafe fn trigger_ss(mut code: i32) {
|
|||
|
||||
#[no_mangle]
|
||||
pub unsafe fn store_current_tsc() { *current_tsc = read_tsc(); }
|
||||
|
||||
pub unsafe fn handle_irqs() {
|
||||
if *flags & FLAG_INTERRUPT != 0 {
|
||||
pic_acknowledge()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,8 +29,6 @@ extern "C" {
|
|||
#[no_mangle]
|
||||
fn iret32();
|
||||
|
||||
#[no_mangle]
|
||||
fn handle_irqs();
|
||||
#[no_mangle]
|
||||
fn hlt_op();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue