Update spec and register offset for interrupts

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-03-09 18:42:31 -04:00
parent 8c4a9991fd
commit 3522b3d0cd
2 changed files with 12 additions and 7 deletions

View File

@@ -169,6 +169,10 @@ impl State {
Ok(slice) 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. /// Invoke an interrupt.
pub fn interrupt(&mut self, return_ip: u64, index: usize, aux: u64) -> Result<u64> { pub fn interrupt(&mut self, return_ip: u64, index: usize, aux: u64) -> Result<u64> {
assert!(index < IVT_LENGTH, "invalid interrupt index"); assert!(index < IVT_LENGTH, "invalid interrupt index");
@@ -192,8 +196,9 @@ impl State {
self.push(Source::Reg(reg))?; self.push(Source::Reg(reg))?;
} }
let sp = self.sp(); 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(R00, index as u64);
self.set_reg_unchecked(R01, aux); self.set_reg_unchecked(R01, aux);
@@ -203,7 +208,7 @@ impl State {
/// Exit/return from the current interrupt. /// Exit/return from the current interrupt.
pub fn exit_interrupt(&mut self) -> Result<u64> { pub fn exit_interrupt(&mut self) -> Result<u64> {
let fp = self.fp(); let fp = self.fp();
let sp = fp + 48; let sp = fp + Self::INTERRUPT_REG_SPACE;
self.set_reg_unchecked(SP, sp); self.set_reg_unchecked(SP, sp);

10
vm.md
View File

@@ -228,16 +228,15 @@ wrapping around to 0.
* Push the IP of the next instruction to be called * Push the IP of the next instruction to be called
* Push the FLAGS register * Push the FLAGS register
* Push the STATUS register * Push the STATUS register
* Push the R0 register * Push the R0-R31 registers
* Push the R1 register
* Update the IP (i.e., jump) to the address of the given interrupt vector in the IVT * Update the IP (i.e., jump) to the address of the given interrupt vector in the IVT
* Update the R0 register to the value in the first parameter * Update the R0 register to the value in the first parameter
* Update the R1 register to the value in the second parameter * Update the R1 register to the value in the second parameter
* Update the frame pointer to the current stack pointer - 48 * Update the frame pointer to the current stack pointer - 288
* IRet * IRet
* Opcode: 0x3005 * Opcode: 0x3005
* When this instruction is executed, these actions occur: * When this instruction is executed, these actions occur:
* Update the stack pointer to the current frame pointer + 48 * Update the stack pointer to the current frame pointer + 288
* Pop the old R1 value * Pop the old R1 value
* Pop the old R0 value * Pop the old R0 value
* Pop the old STATUS value * Pop the old STATUS value
@@ -410,8 +409,9 @@ A VM must provide support for the following meta-values:
# General TODO # General TODO
* Memory permissions
* MMIO regions * MMIO regions
* Paging? * Paging
* Determine how address sizes are determined * Determine how address sizes are determined
* source size <= dest size - zero extend source and copy * source size <= dest size - zero extend source and copy
* mov %r0, (label)u32 * mov %r0, (label)u32