handle_irqs: Do interrupt flag check from Rust

This commit is contained in:
Fabian 2018-09-01 22:03:36 -05:00
parent 36a46bca80
commit fcdda9487e
4 changed files with 25 additions and 12 deletions

View file

@ -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); },

View file

@ -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();
}
};

View file

@ -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()
}
}

View file

@ -29,8 +29,6 @@ extern "C" {
#[no_mangle]
fn iret32();
#[no_mangle]
fn handle_irqs();
#[no_mangle]
fn hlt_op();
}