diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/src/boot/boot.S | 2 | ||||
| -rw-r--r-- | kernel/src/boot/boot64.S | 13 | ||||
| -rw-r--r-- | kernel/src/check/panic.c | 50 | ||||
| -rw-r--r-- | kernel/src/check/ubsan.c | 1 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 29 | ||||
| -rw-r--r-- | kernel/src/sys/syscall_asm.S | 12 |
6 files changed, 72 insertions, 35 deletions
diff --git a/kernel/src/boot/boot.S b/kernel/src/boot/boot.S index 40ddf2b..1833f73 100644 --- a/kernel/src/boot/boot.S +++ b/kernel/src/boot/boot.S @@ -101,7 +101,7 @@ gdt_code = . - gdt gdt_data = . - gdt .long 0xFFFF .byte 0 - .byte 0xA2 + .byte 0x92 .byte 0xAF .byte 0 gdtp: diff --git a/kernel/src/boot/boot64.S b/kernel/src/boot/boot64.S index e95f55b..8231b3e 100644 --- a/kernel/src/boot/boot64.S +++ b/kernel/src/boot/boot64.S @@ -6,13 +6,12 @@ .global begin_long_mode begin_long_mode: -// xchgw %bx, %bx -// mov $0x10, %ax -// mov %ax, %ds -// mov %ax, %es -// mov %ax, %ss -// mov %ax, %fs -// mov %ax, %gs + mov $0x10, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %ss + mov %ax, %fs + mov %ax, %gs add $KERNEL_VMA, %rsp movabs $jump_main, %rax diff --git a/kernel/src/check/panic.c b/kernel/src/check/panic.c index c618c40..769c72f 100644 --- a/kernel/src/check/panic.c +++ b/kernel/src/check/panic.c @@ -15,28 +15,34 @@ void panic(const char *s, ...) vprintf(s, list); va_end(list); - printf("regs:\n"); - uint64_t i = 0; - printf("rflags: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("r11: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("r10: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("r9: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("r8: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rdi: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rsi: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rdx: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("rcx: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rax: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("exception: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rip: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("cs: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rflags: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("rsp: 0x%x; ", *((uint64_t*)panic_rsp + i++)); - printf("ss: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); - printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + if (panic_rsp != 0) { + printf("info:\n"); + uint64_t i = 0; + printf("ss: 0x%x ", (uint16_t)*((uint64_t*)panic_rsp + i++)); + printf("ds: 0x%x ", (uint16_t)*((uint64_t*)panic_rsp + i++)); + printf("es: 0x%x ", (uint16_t)*((uint64_t*)panic_rsp + i++)); + printf("r15: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r14: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r13: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r12: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r11: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r10: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r9: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("r8: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rdi: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rsi: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rdx: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rcx: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rbx: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rax: 0x%x ", *((uint64_t*)panic_rsp + i++)); + if (*((uint64_t*)panic_rsp + i) <= 0xffffffff) + printf("err code: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rip: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("cs: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rflags: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("rsp: 0x%x ", *((uint64_t*)panic_rsp + i++)); + printf("ss: 0x%x ", *((uint64_t*)panic_rsp + i++)); + } __asm__ volatile ("cli;"); for(;;) { diff --git a/kernel/src/check/ubsan.c b/kernel/src/check/ubsan.c index 2e302bb..c3933da 100644 --- a/kernel/src/check/ubsan.c +++ b/kernel/src/check/ubsan.c @@ -53,6 +53,7 @@ static void ubsan_abort(const struct ubsan_source_location* location, if ( !location || !location->filename ) location = &unknown_location; + panic_rsp = 0; panic( "filename = %s; line = %d; column = %d; violation = %s;\n", location->filename, location->line, location->column, violation); diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S index f8a05b6..ee02d3e 100644 --- a/kernel/src/cpu/irq_stub.S +++ b/kernel/src/cpu/irq_stub.S @@ -2,6 +2,7 @@ .macro pushall push %rax + push %rbx push %rcx push %rdx push %rsi @@ -10,11 +11,32 @@ push %r9 push %r10 push %r11 - pushfq + push %r12 + push %r13 + push %r14 + push %r15 + mov %ds, %ax + push %rax + mov %es, %ax + push %rax + mov %ss, %ax + push %rax + mov $0x10, %ax + mov %ax, %ds + mov %ax, %es + mov 0x80(%rsp), %rax .endm .macro popall - popfq + pop %rax + pop %rax + mov %ax, %es + pop %rax + mov %ax, %ds + pop %r15 + pop %r14 + pop %r13 + pop %r12 pop %r11 pop %r10 pop %r9 @@ -23,6 +45,7 @@ pop %rsi pop %rdx pop %rcx + pop %rbx pop %rax .endm @@ -41,7 +64,7 @@ isr\number: .global isr\number isr\number: pushall - mov 0x50(%rsp), %rdi + mov 0x88(%rsp), %rdi cld mov %rsp, panic_rsp call isr\number\()_handler diff --git a/kernel/src/sys/syscall_asm.S b/kernel/src/sys/syscall_asm.S index a9942ca..2e3c0bb 100644 --- a/kernel/src/sys/syscall_asm.S +++ b/kernel/src/sys/syscall_asm.S @@ -2,6 +2,7 @@ .macro pushall push %rax + push %rbx push %rcx push %rdx push %rsi @@ -10,11 +11,17 @@ push %r9 push %r10 push %r11 - pushfq + push %r12 + push %r13 + push %r14 + push %r15 .endm .macro popall - popfq + pop %r15 + pop %r14 + pop %r13 + pop %r12 pop %r11 pop %r10 pop %r9 @@ -23,6 +30,7 @@ pop %rsi pop %rdx pop %rcx + pop %rbx pop %rax .endm |
