Update spec and register offset for interrupts
Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
@@ -169,6 +169,10 @@ impl State {
|
||||
Ok(slice)
|
||||
}
|
||||
|
||||
// stack size of 288 - yowza
|
||||
// Maybe we don't need 32 registers... this works out to 288
|
||||
const INTERRUPT_REG_SPACE: u64 = (R31 - R00 + 4) as u64 * 8;
|
||||
|
||||
/// Invoke an interrupt.
|
||||
pub fn interrupt(&mut self, return_ip: u64, index: usize, aux: u64) -> Result<u64> {
|
||||
assert!(index < IVT_LENGTH, "invalid interrupt index");
|
||||
@@ -192,8 +196,9 @@ impl State {
|
||||
self.push(Source::Reg(reg))?;
|
||||
}
|
||||
|
||||
|
||||
let sp = self.sp();
|
||||
self.set_reg_unchecked(FP, sp - 48);
|
||||
self.set_reg_unchecked(FP, sp - Self::INTERRUPT_REG_SPACE);
|
||||
self.set_reg_unchecked(R00, index as u64);
|
||||
self.set_reg_unchecked(R01, aux);
|
||||
|
||||
@@ -203,7 +208,7 @@ impl State {
|
||||
/// Exit/return from the current interrupt.
|
||||
pub fn exit_interrupt(&mut self) -> Result<u64> {
|
||||
let fp = self.fp();
|
||||
let sp = fp + 48;
|
||||
let sp = fp + Self::INTERRUPT_REG_SPACE;
|
||||
|
||||
self.set_reg_unchecked(SP, sp);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user