Refactor system_breakpoint_handler
Modifies system_breakpoint_handler so that all fox32 registers are saved on the stack in a predictable order, and they are printed using a loop. Also comments out two seemingly unneccessary additions in the monitor's hex printing functions.
This commit is contained in:
parent
bb3d709ad6
commit
b1aa77aa70
493
exception.asm
493
exception.asm
|
@ -41,12 +41,14 @@ system_page_fault_handler:
|
||||||
system_page_fault_str: data.str "Page fault at virtual address r1" data.8 10 data.8 0
|
system_page_fault_str: data.str "Page fault at virtual address r1" data.8 10 data.8 0
|
||||||
|
|
||||||
; called upon execution of a `brk` instruction
|
; called upon execution of a `brk` instruction
|
||||||
; ensure the stack has at least 256 bytes of free space before triggering this exception!!
|
; ensure the stack has at least 128 bytes of free space before triggering this exception!!
|
||||||
; this code is extremely ugly, but it works :P
|
|
||||||
system_breakpoint_handler:
|
system_breakpoint_handler:
|
||||||
add rsp, 4
|
add rsp, 4
|
||||||
|
|
||||||
; push all registers once to save them
|
; push all registers once to save them
|
||||||
|
push rfp
|
||||||
|
push resp
|
||||||
|
push rsp
|
||||||
push r31
|
push r31
|
||||||
push r30
|
push r30
|
||||||
push r29
|
push r29
|
||||||
|
@ -80,470 +82,60 @@ system_breakpoint_handler:
|
||||||
push r1
|
push r1
|
||||||
push r0
|
push r0
|
||||||
|
|
||||||
; then push all registers again so they can be popped one by one to print to the monitor
|
; modify the saved rsp value to reflect the value of rsp before the
|
||||||
push r31
|
; interrupt occured
|
||||||
push r30
|
; resp (4) + rfp (4) + flags (1) + return address (4) = 13 bytes
|
||||||
push r29
|
add [rsp+128], 13
|
||||||
push r28
|
|
||||||
push r27
|
|
||||||
push r26
|
|
||||||
push r25
|
|
||||||
push r24
|
|
||||||
push r23
|
|
||||||
push r22
|
|
||||||
push r21
|
|
||||||
push r20
|
|
||||||
push r19
|
|
||||||
push r18
|
|
||||||
push r17
|
|
||||||
push r16
|
|
||||||
push r15
|
|
||||||
push r14
|
|
||||||
push r13
|
|
||||||
push r12
|
|
||||||
push r11
|
|
||||||
push r10
|
|
||||||
push r9
|
|
||||||
push r8
|
|
||||||
push r7
|
|
||||||
push r6
|
|
||||||
push r5
|
|
||||||
push r4
|
|
||||||
push r3
|
|
||||||
push r2
|
|
||||||
push r1
|
|
||||||
push r0
|
|
||||||
|
|
||||||
|
; print breakpoint message
|
||||||
mov r0, system_breakpoint_str
|
mov r0, system_breakpoint_str
|
||||||
call debug_print
|
call debug_print
|
||||||
call print_string_to_monitor
|
call print_string_to_monitor
|
||||||
|
|
||||||
; r0
|
; print the display containing all of the registers
|
||||||
mov r0, system_breakpoint_r0_str
|
; r1 - used to store a pointer to the current string
|
||||||
|
; r2 - stores the current address on the stack
|
||||||
|
; r3 - loop counter
|
||||||
|
mov r1, system_breakpoint_r0_str
|
||||||
|
mov r2, rsp
|
||||||
|
mov r3, 0
|
||||||
|
system_breakpoint_print_loop:
|
||||||
|
; print the register label
|
||||||
|
mov r0, r1
|
||||||
call print_string_to_monitor
|
call print_string_to_monitor
|
||||||
pop r0
|
; print the register value
|
||||||
|
mov r0, [r2]
|
||||||
call print_hex_word_to_monitor
|
call print_hex_word_to_monitor
|
||||||
|
; adjust string pointer, stack address, and loop counter
|
||||||
mov r0, ' '
|
add r1, SYSTEM_BREAKPOINT_R_STR_SIZE
|
||||||
call print_character_to_monitor
|
inc r2, 4
|
||||||
mov r0, '|'
|
inc r3
|
||||||
call print_character_to_monitor
|
; decide whether to print a separator or a newline by checking if the loop
|
||||||
mov r0, ' '
|
; counter is a multiple of 4
|
||||||
call print_character_to_monitor
|
mov r0, r3
|
||||||
|
and r0, 0x03
|
||||||
; r1
|
ifnz jmp system_breakpoint_print_sep
|
||||||
mov r0, system_breakpoint_r1_str
|
system_breakpoint_print_newline:
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r2
|
|
||||||
mov r0, system_breakpoint_r2_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r3
|
|
||||||
mov r0, system_breakpoint_r3_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
mov r0, 10
|
||||||
call print_character_to_monitor
|
jmp system_breakpoint_print_last_char
|
||||||
; ---
|
system_breakpoint_print_sep:
|
||||||
|
|
||||||
; r4
|
|
||||||
mov r0, system_breakpoint_r4_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
mov r0, ' '
|
||||||
call print_character_to_monitor
|
call print_character_to_monitor
|
||||||
mov r0, '|'
|
mov r0, '|'
|
||||||
call print_character_to_monitor
|
call print_character_to_monitor
|
||||||
mov r0, ' '
|
mov r0, ' '
|
||||||
|
system_breakpoint_print_last_char:
|
||||||
call print_character_to_monitor
|
call print_character_to_monitor
|
||||||
|
; loop again if not on last register
|
||||||
; r5
|
cmp r3, 35
|
||||||
mov r0, system_breakpoint_r5_str
|
iflt jmp system_breakpoint_print_loop
|
||||||
call print_string_to_monitor
|
; print rip
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r6
|
|
||||||
mov r0, system_breakpoint_r6_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r7
|
|
||||||
mov r0, system_breakpoint_r7_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; r8
|
|
||||||
mov r0, system_breakpoint_r8_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r9
|
|
||||||
mov r0, system_breakpoint_r9_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r10
|
|
||||||
mov r0, system_breakpoint_r10_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r11
|
|
||||||
mov r0, system_breakpoint_r11_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; r12
|
|
||||||
mov r0, system_breakpoint_r12_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r13
|
|
||||||
mov r0, system_breakpoint_r13_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r14
|
|
||||||
mov r0, system_breakpoint_r14_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r15
|
|
||||||
mov r0, system_breakpoint_r15_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; r16
|
|
||||||
mov r0, system_breakpoint_r16_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r17
|
|
||||||
mov r0, system_breakpoint_r17_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r18
|
|
||||||
mov r0, system_breakpoint_r18_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r19
|
|
||||||
mov r0, system_breakpoint_r19_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; r20
|
|
||||||
mov r0, system_breakpoint_r20_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r21
|
|
||||||
mov r0, system_breakpoint_r21_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r22
|
|
||||||
mov r0, system_breakpoint_r22_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r23
|
|
||||||
mov r0, system_breakpoint_r23_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; r24
|
|
||||||
mov r0, system_breakpoint_r24_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r25
|
|
||||||
mov r0, system_breakpoint_r25_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r26
|
|
||||||
mov r0, system_breakpoint_r26_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r27
|
|
||||||
mov r0, system_breakpoint_r27_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; r28
|
|
||||||
mov r0, system_breakpoint_r28_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r29
|
|
||||||
mov r0, system_breakpoint_r29_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r30
|
|
||||||
mov r0, system_breakpoint_r30_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; r31
|
|
||||||
mov r0, system_breakpoint_r31_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
pop r0
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
|
||||||
call print_character_to_monitor
|
|
||||||
; ---
|
|
||||||
|
|
||||||
; rsp
|
|
||||||
mov r0, system_breakpoint_rsp_str
|
|
||||||
call print_string_to_monitor
|
|
||||||
mov r0, rsp
|
|
||||||
add r0, 133 ; account for the registers pushed above, and for the int calling convention
|
|
||||||
call print_hex_word_to_monitor
|
|
||||||
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, '|'
|
|
||||||
call print_character_to_monitor
|
|
||||||
mov r0, ' '
|
|
||||||
call print_character_to_monitor
|
|
||||||
|
|
||||||
; rip
|
|
||||||
mov r0, system_breakpoint_rip_str
|
mov r0, system_breakpoint_rip_str
|
||||||
call print_string_to_monitor
|
call print_string_to_monitor
|
||||||
mov r0, rsp
|
mov r0, [r2+1]
|
||||||
add r0, 129 ; read instruction pointer from the stack
|
|
||||||
mov r0, [r0]
|
|
||||||
call print_hex_word_to_monitor
|
call print_hex_word_to_monitor
|
||||||
|
|
||||||
; ---
|
|
||||||
mov r0, 10
|
mov r0, 10
|
||||||
call print_character_to_monitor
|
call print_character_to_monitor
|
||||||
; ---
|
|
||||||
|
|
||||||
call invoke_monitor
|
call invoke_monitor
|
||||||
|
|
||||||
|
@ -579,8 +171,13 @@ system_breakpoint_handler:
|
||||||
pop r29
|
pop r29
|
||||||
pop r30
|
pop r30
|
||||||
pop r31
|
pop r31
|
||||||
|
; don't restore rsp and resp. not sure whether restoring a potentially
|
||||||
|
; modified resp would break things, but changing rsp definitely would.
|
||||||
|
add rsp, 8
|
||||||
|
pop rfp
|
||||||
reti
|
reti
|
||||||
system_breakpoint_str: data.str "Breakpoint reached!" data.8 10 data.8 0
|
system_breakpoint_str: data.str "Breakpoint reached!" data.8 10 data.8 0
|
||||||
|
const SYSTEM_BREAKPOINT_R_STR_SIZE: 7
|
||||||
system_breakpoint_r0_str: data.strz "r0: "
|
system_breakpoint_r0_str: data.strz "r0: "
|
||||||
system_breakpoint_r1_str: data.strz "r1: "
|
system_breakpoint_r1_str: data.strz "r1: "
|
||||||
system_breakpoint_r2_str: data.strz "r2: "
|
system_breakpoint_r2_str: data.strz "r2: "
|
||||||
|
@ -614,4 +211,6 @@ system_breakpoint_r29_str: data.strz "r29: "
|
||||||
system_breakpoint_r30_str: data.strz "r30: "
|
system_breakpoint_r30_str: data.strz "r30: "
|
||||||
system_breakpoint_r31_str: data.strz "r31: "
|
system_breakpoint_r31_str: data.strz "r31: "
|
||||||
system_breakpoint_rsp_str: data.strz "rsp: "
|
system_breakpoint_rsp_str: data.strz "rsp: "
|
||||||
|
system_breakpoint_resp_str: data.strz "resp: "
|
||||||
|
system_breakpoint_rfp_str: data.strz "rfp: "
|
||||||
system_breakpoint_rip_str: data.strz "rip: "
|
system_breakpoint_rip_str: data.strz "rip: "
|
||||||
|
|
|
@ -38,7 +38,7 @@ print_hex_word_to_monitor_loop:
|
||||||
add r12, r11
|
add r12, r11
|
||||||
movz.8 r0, [r12]
|
movz.8 r0, [r12]
|
||||||
call print_character_to_monitor
|
call print_character_to_monitor
|
||||||
add r1, r6
|
;add r1, r6
|
||||||
loop print_hex_word_to_monitor_loop
|
loop print_hex_word_to_monitor_loop
|
||||||
|
|
||||||
pop r31
|
pop r31
|
||||||
|
@ -67,7 +67,7 @@ print_hex_byte_to_monitor_loop:
|
||||||
add r12, r11
|
add r12, r11
|
||||||
movz.8 r0, [r12]
|
movz.8 r0, [r12]
|
||||||
call print_character_to_monitor
|
call print_character_to_monitor
|
||||||
add r1, r6
|
;add r1, r6
|
||||||
loop print_hex_byte_to_monitor_loop
|
loop print_hex_byte_to_monitor_loop
|
||||||
|
|
||||||
pop r31
|
pop r31
|
||||||
|
|
Loading…
Reference in New Issue
Block a user