lucicos/kernel/log/asm/dump.S

128 lines
1.9 KiB
ArmAsm

.global reg_dump
.extern printf
.text
/*
* reg_dump:
* -------------
*
* Save the context of caller in prev_* memory locations and print them.
*
* Registers must be saved before calling other routines because they may
* change the registers.
*
* 4 is added to prev_esp because current esp has the return address. eip
* is fetched by dereferencing esp.
*/
reg_dump:
mov %esp, prev_esp
add $0x04, prev_esp
mov %ebp, prev_ebp
mov %eax, prev_eax
mov %ecx, prev_ecx
mov %edx, prev_edx
mov %ebx, prev_ebx
mov %esi, prev_esi
mov %edi, prev_edi
mov (%esp), %eax
mov %eax, prev_eip
push %ebp
mov %esp, %ebp
push $NL_STR
call printf
add $0x04, %esp
push prev_eax
push $EAX_FMT
call printf
add $0x08, %esp
push prev_ecx
push $ECX_FMT
call printf
add $0x08, %esp
push prev_edx
push $EDX_FMT
call printf
add $0x08, %esp
push prev_ebx
push $EBX_FMT
call printf
add $0x08, %esp
push prev_esp
push $ESP_FMT
call printf
add $0x08, %esp
push prev_ebp
push $EBP_FMT
call printf
add $0x08, %esp
push prev_esi
push $ESI_FMT
call printf
add $0x08, %esp
push prev_edi
push $EDI_FMT
call printf
add $0x08, %esp
push prev_eip
push $EIP_FMT
call printf
add $0x08, %esp
mov %ebp, %esp
pop %ebp
ret
.data
NL_STR: .string "\n"
EAX_FMT: .string "eax: 0x%x\n"
ECX_FMT: .string "ecx: 0x%x\n"
EDX_FMT: .string "edx: 0x%x\n"
EBX_FMT: .string "ebx: 0x%x\n"
ESP_FMT: .string "esp: 0x%x\n"
EBP_FMT: .string "ebp: 0x%x\n"
ESI_FMT: .string "esi: 0x%x\n"
EDI_FMT: .string "edi: 0x%x\n"
EIP_FMT: .string "eip: 0x%x\n"
.bss
prev_eax: .skip 4
prev_ecx: .skip 4
prev_edx: .skip 4
prev_ebx: .skip 4
prev_esp: .skip 4
prev_ebp: .skip 4
prev_esi: .skip 4
prev_edi: .skip 4
prev_eip: .skip 4