summaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-11-29 16:09:32 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2022-11-29 19:23:51 +0100
commit9b3dd99abc763f5e2039933eda510ec62d395f8a (patch)
tree8db0b52f5fcb6a4572d8d2612d7eb94c1f4f2fb1 /kernel/src
parentd36487d9fd2c19b54a3b97bdf3562a17184711fe (diff)
pushing all regs in irq_handler
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/boot/boot.S2
-rw-r--r--kernel/src/boot/boot64.S13
-rw-r--r--kernel/src/check/panic.c50
-rw-r--r--kernel/src/check/ubsan.c1
-rw-r--r--kernel/src/cpu/irq_stub.S29
-rw-r--r--kernel/src/sys/syscall_asm.S12
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