diff --git a/src/drivers/nulldrv/main.s b/src/drivers/nulldrv/main.s index 53dfffb..3106842 100644 --- a/src/drivers/nulldrv/main.s +++ b/src/drivers/nulldrv/main.s @@ -63,6 +63,6 @@ _start: syscall ; int 0xee jmp .preloop -.doexit +.doexit: mov rax, 9 ; EXIT syscall syscall diff --git a/src/kernel/interrupts.s b/src/kernel/interrupts.s index 490579f..8bbcba0 100644 --- a/src/kernel/interrupts.s +++ b/src/kernel/interrupts.s @@ -3,7 +3,7 @@ extern isr_handler global isr_handler_prelude isr_handler_prelude: - push_all_and_segments + push_all check_swap_gs mov rdi, rsp @@ -15,7 +15,7 @@ isr_handler_prelude: extern irq_handler global irq_handler_prelude irq_handler_prelude: - push_all_and_segments + push_all check_swap_gs mov rdi, rsp @@ -27,7 +27,7 @@ irq_handler_prelude: global isr_handler_return isr_handler_return: check_swap_gs - pop_all_and_segments + pop_all add rsp, 16 ; because the ISRs added err/num iretq diff --git a/src/kernel/loader.s b/src/kernel/loader.s index cc8bf41..eb58d8f 100644 --- a/src/kernel/loader.s +++ b/src/kernel/loader.s @@ -27,7 +27,7 @@ ramdisk_process_loader: mov fs, ax mov gs, ax - pop_all_and_segments + pop_all add rsp, 16 ; because the ISRs add err/num iretq diff --git a/src/kernel/push_all.inc b/src/kernel/push_all.inc index 8087769..47ed935 100644 --- a/src/kernel/push_all.inc +++ b/src/kernel/push_all.inc @@ -1,47 +1,43 @@ -%macro push_all_and_segments 0 - ; ss ; rsp + a8 - ; rsp ; rsp + a0 - ; rflags ; rsp + 98 - ; cs ; rsp + 90 - ; rip ; rsp + 88 - ; error ; rsp + 80 - ; vector ; rsp + 78 +%macro push_all 0 + sub rsp, 0x78 - push rax ; rsp + 70 - push rcx ; rsp + 68 - push rdx ; rsp + 60 - push rbx ; rsp + 58 - push rbp ; rsp + 50 - push rsi ; rsp + 48 - push rdi ; rsp + 40 + mov [rsp + 0x70], rax + mov [rsp + 0x68], rcx + mov [rsp + 0x60], rdx + mov [rsp + 0x58], rbx + mov [rsp + 0x50], rbp + mov [rsp + 0x48], rsi + mov [rsp + 0x40], rdi - push r8 ; rsp + 38 - push r9 ; rsp + 30 - push r10 ; rsp + 28 - push r11 ; rsp + 20 - push r12 ; rsp + 18 - push r13 ; rsp + 10 - push r14 ; rsp + 08 - push r15 ; rsp + 00 + mov [rsp + 0x38], r8 + mov [rsp + 0x30], r9 + mov [rsp + 0x28], r10 + mov [rsp + 0x20], r11 + mov [rsp + 0x18], r12 + mov [rsp + 0x10], r13 + mov [rsp + 0x08], r14 + mov [rsp + 0x00], r15 %endmacro -%macro pop_all_and_segments 0 - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 +%macro pop_all 0 + mov rax, [rsp + 0x70] + mov rcx, [rsp + 0x68] + mov rdx, [rsp + 0x60] + mov rbx, [rsp + 0x58] + mov rbp, [rsp + 0x50] + mov rsi, [rsp + 0x48] + mov rdi, [rsp + 0x40] - pop rdi - pop rsi - pop rbp - pop rbx - pop rdx - pop rcx - pop rax + mov r8, [rsp + 0x38] + mov r9, [rsp + 0x30] + mov r10, [rsp + 0x28] + mov r11, [rsp + 0x20] + mov r12, [rsp + 0x18] + mov r13, [rsp + 0x10] + mov r14, [rsp + 0x08] + mov r15, [rsp + 0x00] + + add rsp, 0x78 %endmacro %macro check_swap_gs 0 diff --git a/src/kernel/syscall.s b/src/kernel/syscall.s index a5b3668..9f6b493 100644 --- a/src/kernel/syscall.s +++ b/src/kernel/syscall.s @@ -18,7 +18,7 @@ syscall_handler_prelude: push rcx ; user rip push 0 ; bogus interrupt push 0 ; bogus errorcode - push_all_and_segments + push_all inc qword [rel __counter_syscall_enter] @@ -39,7 +39,7 @@ syscall_handler_prelude: swapgs - pop_all_and_segments + pop_all add rsp, 16 ; ignore bogus interrupt / error pop rcx ; user rip add rsp, 32 ; ignore cs, flags, rsp, ss