From 7c4cbd0b04961554dc86662a7c4eb6660b012cdb Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 10 Sep 2025 16:04:02 -0300 Subject: [PATCH] fix: correct field indices for restoring old state images with apic --- src/cpu.js | 18 +++++++++--------- src/rust/cpu/apic.rs | 6 +++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/cpu.js b/src/cpu.js index 6e572543..67659731 100644 --- a/src/cpu.js +++ b/src/cpu.js @@ -822,15 +822,15 @@ CPU.prototype.set_state_apic = function(state) apic[2] = state[2]; // timer_divider_shift apic[3] = state[3]; // timer_initial_count apic[4] = state[4]; // timer_current_count - // skip next_tick (in js: state[4]; in rust: apic[5] and apic[6]) - apic[7] = state[6]; // lvt_timer - apic[8] = state[7]; // lvt_perf_counter - apic[9] = state[8]; // lvt_int0 - apic[10] = state[9]; // lvt_int1 - apic[11] = state[10]; // lvt_error - apic[12] = state[11]; // tpr - apic[13] = state[12]; // icr0 - apic[14] = state[13]; // icr1 + // skip next_tick (in js: state[4]; in rust: apic[6] and apic[7]) + apic[8] = state[6]; // lvt_timer + apic[9] = state[7]; // lvt_perf_counter + apic[10] = state[8]; // lvt_int0 + apic[11] = state[9]; // lvt_int1 + apic[12] = state[10]; // lvt_error + apic[13] = state[11]; // tpr + apic[14] = state[12]; // icr0 + apic[15] = state[13]; // icr1 apic.set(state[15], 16); // irr apic.set(state[15], 24); // isr apic.set(state[16], 32); // tmr diff --git a/src/rust/cpu/apic.rs b/src/rust/cpu/apic.rs index 1ef1dd75..e9da04df 100644 --- a/src/rust/cpu/apic.rs +++ b/src/rust/cpu/apic.rs @@ -39,7 +39,11 @@ const IOAPIC_DELIVERY_FIXED: u8 = 0; const APIC_STRUCT_SIZE: usize = 4 * 46; // Note: JavaScript (cpu.get_state_apic) depens on this layout +const _: () = assert!(std::mem::offset_of!(Apic, timer_last_tick) == 6 * 4); +const _: () = assert!(std::mem::offset_of!(Apic, lvt_timer) == 8 * 4); +const _: () = assert!(std::mem::offset_of!(Apic, lvt_perf_counter) == 9 * 4); const _: () = assert!(std::mem::offset_of!(Apic, icr0) == 14 * 4); +const _: () = assert!(std::mem::offset_of!(Apic, icr1) == 15 * 4); const _: () = assert!(std::mem::offset_of!(Apic, irr) == 16 * 4); const _: () = assert!(std::mem::offset_of!(Apic, isr) == 24 * 4); const _: () = assert!(std::mem::offset_of!(Apic, tmr) == 32 * 4); @@ -552,7 +556,7 @@ fn deliver(apic: &mut Apic, vector: u8, mode: u8, is_level: bool) { } if vector < 0x10 || vector == 0xFF { - dbg_assert!(false, "TODO: Invalid vector"); + dbg_assert!(false, "TODO: Invalid vector: {:x}", vector); } if register_get_bit(&apic.irr, vector) {