# HG changeset patch # User Paul Boddie # Date 1511024075 -3600 # Node ID 389d1792af4ace54f2bdafd6f91f0c3e95ab9e20 # Parent 61443a9bb80feff0c37e146a463fb61a14c0de85 Introduced macros to ensure register saving and loading consistency. diff -r 61443a9bb80f -r 389d1792af4a vga.S --- a/vga.S Sat Nov 18 17:53:12 2017 +0100 +++ b/vga.S Sat Nov 18 17:54:35 2017 +0100 @@ -61,6 +61,44 @@ .extern blit_string .extern message +.macro load_affected + lw $v0, -4($k0) + lw $v1, -8($k0) + lw $s0, -12($k0) + lw $s1, -16($k0) + lw $s2, -20($k0) + lw $s3, -24($k0) + lw $t8, -28($k0) + lw $ra, -32($k0) + lw $sp, -36($k0) +.endm + +.macro load_state + lw $s0, -44($k0) + lw $s1, -48($k0) + lw $s2, -52($k0) + lw $s3, -56($k0) +.endm + +.macro save_affected + sw $v0, -4($k0) + sw $v1, -8($k0) + sw $s0, -12($k0) + sw $s1, -16($k0) + sw $s2, -20($k0) + sw $s3, -24($k0) + sw $t8, -28($k0) + sw $ra, -32($k0) + sw $sp, -36($k0) +.endm + +.macro save_state + sw $s0, -44($k0) + sw $s1, -48($k0) + sw $s2, -52($k0) + sw $s3, -56($k0) +.endm + _start: /* Configure RAM. @@ -161,10 +199,7 @@ /* Save the state for retrieval in the interrupt handler. */ li $k0, IRQ_STACK_LIMIT - sw $s0, -44($k0) - sw $s1, -48($k0) - sw $s2, -52($k0) - sw $s3, -56($k0) + save_state /* Enable interrupts and loop. */ @@ -730,26 +765,14 @@ interrupt_handler: - /* Store affected registers. */ + /* + Save affected registers, restoring IRQ state and switching to the IRQ + stack. + */ li $k0, IRQ_STACK_LIMIT - sw $v0, -4($k0) - sw $v1, -8($k0) - sw $s0, -12($k0) - sw $s1, -16($k0) - sw $s2, -20($k0) - sw $s3, -24($k0) - sw $t8, -28($k0) - sw $ra, -32($k0) - sw $sp, -36($k0) - - /* Load state. */ - - lw $s0, -44($k0) - lw $s1, -48($k0) - lw $s2, -52($k0) - lw $s3, -56($k0) - + save_affected + load_state li $sp, IRQ_STACK_TOP /* @@ -814,25 +837,14 @@ nop irq_exit: - /* Save state. */ + /* + Save IRQ state and restore the affected registers, switching back to the + original stack. + */ li $k0, IRQ_STACK_LIMIT - sw $s0, -44($k0) - sw $s1, -48($k0) - sw $s2, -52($k0) - sw $s3, -56($k0) - - /* Restore affected registers. */ - - lw $v0, -4($k0) - lw $v1, -8($k0) - lw $s0, -12($k0) - lw $s1, -16($k0) - lw $s2, -20($k0) - lw $s3, -24($k0) - lw $t8, -28($k0) - lw $ra, -32($k0) - lw $sp, -36($k0) + save_state + load_affected eret nop