interrupt: dump all registers and panic on INT<32

This commit is contained in:
Edgaru089 2021-10-11 22:52:02 +08:00
parent 6ff7aff718
commit 4b59394238
3 changed files with 66 additions and 43 deletions

View File

@ -48,55 +48,53 @@ section '.text' executable
macro inth op1 { macro inth op1 {
push r15
lea r15, [rsp+8]
push r14
push r13
push r12
push r11
push r10
push r9
push r8
push r15 ; original rsp in r15
push rbp
push rdi push rdi
mov rdi, op1
push rsi push rsi
push rdx push rdx
mov rdx, [rsp+24] mov r9, rcx
push rcx mov r8, rbx
push r8 mov rcx, rax
push r9 mov rdx, [rsp+104] ; 13*8 (13 pushes of 8 bytes)
push r10 xor rsi, rsi
push r11 mov rdi, op1
push rax
call interrupt_Handler call interrupt_Handler
pop rax ; interrupt_Handler panics
pop r11
pop r10
pop r9
pop r8
pop rcx
pop rdx
pop rsi
pop rdi
iretq
} }
macro inth_err op1 { macro inth_err op1 {
push rsi push r15
push rdi lea r15, [rsp+8]
mov rdi, op1 push r14
mov esi, [rsp+16] push r13
push rdx push r12
mov rdx, [rsp+32]
push rcx
push r8
push r9
push r10
push r11 push r11
push rax push r10
push r9
push r8
push r15 ; original rsp in r15
push rbp
push rdi
push rsi
push rdx
mov r9, rcx
mov r8, rbx
mov rcx, rax
mov rdx, [rsp+8+104] ; 13*8 (13 pushes of 8 bytes)
mov esi, [rsp+104]
mov rdi, op1
call interrupt_Handler call interrupt_Handler
pop rax ; interrupt_Handler panics
pop r11
pop r10
pop r9
pop r8
pop rcx
pop rdx
pop rdi
pop rsi
add rsp, 8 ; pop the error code
iretq
} }
interrupt_Int0: ; does not return interrupt_Int0: ; does not return

View File

@ -38,8 +38,33 @@ const char *interrupt_Descriptions[] = {
"Interrupt 31", "Interrupt 31",
}; };
SYSV_ABI void interrupt_Handler(int vec, int errcode, uint64_t rip, int c, int d, int e) { /* A little snippet for testing the handler:
io_Printf("Panic: INT %02xh: %s, err=%d(0x%02x), rip=%llx\n", vec, interrupt_Descriptions[vec], errcode, errcode, rip); asm volatile(
"mov $0, %rax\n\t"
"mov $1, %rbx\n\t"
"mov $2, %rcx\n\t"
"mov $3, %rdx\n\t"
"mov $4, %rsi\n\t"
"mov $5, %rdi\n\t"
"mov $6, %rbp\n\t"
"mov $8, %r8\n\t"
"mov $9, %r9\n\t"
"mov $10, %r10\n\t"
"mov $11, %r11\n\t"
"mov $12, %r12\n\t"
"mov $13, %r13\n\t"
"mov $14, %r14\n\t"
"mov $15, %r15\n\t"
"int3");
*/
SYSV_ABI void interrupt_Handler(int vec, int errcode, uint64_t rip, uint64_t rax, uint64_t rbx, uint64_t rcx, uint64_t rdx, uint64_t rsi, uint64_t rdi, uint64_t rbp, uint64_t rsp, uint64_t r8, uint64_t r9, uint64_t r10, uint64_t r11, uint64_t r12, uint64_t r13, uint64_t r14, uint64_t r15) {
io_Printf("Panic: INT %02xh: %s, err=%d(0x%02x), rip=%llx\n"
" RAX=%016llX, RBX=%016llX, RCX=%016llX, RDX=%016llX\n"
" RSI=%016llX, RDI=%016llX, RBP=%016llX, RSP=%016llX\n"
" R8=%016llX, R9=%016llX, R10=%016llX, R11=%016llX\n"
" R12=%016llX, R13=%016llX, R14=%016llX, R15=%016llX",
vec, interrupt_Descriptions[vec], errcode, errcode, rip, rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8, r9, r10, r11, r12, r13, r14, r15);
__Panic_HaltSystem(); __Panic_HaltSystem();
} }

View File

@ -48,7 +48,7 @@ SYSV_ABI void interrupt_MapHandler(void *handler, int interrupt);
// errorcode is 0 if nonexistent // errorcode is 0 if nonexistent
// //
// for IRQs, params are documented in assembly // for IRQs, params are documented in assembly
SYSV_ABI void interrupt_Handler(int vec, int errcode, uint64_t rip, int c, int d, int e); SYSV_ABI void interrupt_Handler(int vec, int errcode, uint64_t rip, uint64_t rax, uint64_t rbx, uint64_t rcx, uint64_t rdx, uint64_t rsi, uint64_t rdi, uint64_t rbp, uint64_t rsp, uint64_t r8, uint64_t r9, uint64_t r10, uint64_t r11, uint64_t r12, uint64_t r13, uint64_t r14, uint64_t r15);
// defined in assembly // defined in assembly
SYSV_ABI void interrupt_LoadGDT(void *gdtr); SYSV_ABI void interrupt_LoadGDT(void *gdtr);