x86/trap: fix trap frame layout

main
anna 2 years ago
parent 2e32e299d2
commit c6c92ac39f
Signed by: fef
GPG Key ID: EC22E476DC2D3D84

@ -10,11 +10,6 @@
* @brief Complete context save on the amd64.
*/
struct amd64_trap_frame {
/* this doesn't need to be a pointer because unlike on
* i386, the hardware frame always has the same size */
struct amd64_hw_frame hw_frame;
u64 rsi;
u64 rdi;
u64 rax;
u64 rbx;
u64 rcx;
@ -28,5 +23,10 @@ struct amd64_trap_frame {
u64 r13;
u64 r14;
u64 r15;
u64 rdi;
u64 rsi;
/* this doesn't need to be a pointer because unlike on
* i386, the hardware frame always has the same size */
struct amd64_hw_frame hw_frame;
} __packed;
typedef struct amd64_trap_frame trap_frame_t;

@ -7,14 +7,14 @@
void print_regs(const struct amd64_trap_frame *ctx)
{
kprintf("RIP = %#x:%#016lx\n", ctx->hw_frame.cs, ctx->hw_frame.rip);
kprintf("RFLAGS = %#016lx\n", ctx->hw_frame.rflags);
kprintf("RAX = %#016lx RDI = %#016lx\n", ctx->rax, ctx->rdi);
kprintf("RBX = %#016lx RSI = %#016lx\n", ctx->rbx, ctx->rsi);
kprintf("RCX = %#016lx RSP = %#016lx\n", ctx->rcx, ctx->hw_frame.rsp);
kprintf("RDX = %#016lx RBP = %#016lx\n", ctx->rdx, ctx->rbp);
kprintf("R8 = %#016lx R12 = %#016lx\n", ctx->r8, ctx->r12);
kprintf("R9 = %#016lx R13 = %#016lx\n", ctx->r9, ctx->r13);
kprintf("R10 = %#016lx R14 = %#016lx\n", ctx->r10, ctx->r14);
kprintf("R11 = %#016lx R15 = %#016lx\n", ctx->r11, ctx->r15);
kprintf("RIP = %04hx:0x%016lx\n", ctx->hw_frame.cs, ctx->hw_frame.rip);
kprintf("RFLAGS = 0x%016lx\n", ctx->hw_frame.rflags);
kprintf("RAX = 0x%016lx RDI = 0x%016lx\n", ctx->rax, ctx->rdi);
kprintf("RBX = 0x%016lx RSI = 0x%016lx\n", ctx->rbx, ctx->rsi);
kprintf("RCX = 0x%016lx RSP = 0x%016lx\n", ctx->rcx, ctx->hw_frame.rsp);
kprintf("RDX = 0x%016lx RBP = 0x%016lx\n", ctx->rdx, ctx->rbp);
kprintf("R8 = 0x%016lx R12 = 0x%016lx\n", ctx->r8, ctx->r12);
kprintf("R9 = 0x%016lx R13 = 0x%016lx\n", ctx->r9, ctx->r13);
kprintf("R10 = 0x%016lx R14 = 0x%016lx\n", ctx->r10, ctx->r14);
kprintf("R11 = 0x%016lx R15 = 0x%016lx\n", ctx->r11, ctx->r15);
}

@ -15,39 +15,36 @@
*/
.macro prepare_trap_entry
pushq %rdi
movq %rsp, %rdi
/* 16 bytes for %rsi and %rdi, plus sizeof(struct amd64_hw_frame) */
subq $56, %rdi
pushq %rax
pushq %rbx
pushq %rcx
pushq %rdx
pushq %rbp
pushq %r8
pushq %r9
pushq %r10
pushq %r11
pushq %r12
pushq %r13
pushq %r14
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %r11
pushq %r10
pushq %r9
pushq %r8
pushq %rbp
pushq %rdx
pushq %rcx
pushq %rbx
pushq %rax
movq %rsp, %rdi
.endm
.macro prepare_trap_leave
popq %r15
popq %r14
popq %r13
popq %r12
popq %r11
popq %r10
popq %r9
popq %r8
popq %rbp
popq %rdx
popq %rcx
popq %rbx
popq %rax
popq %rbx
popq %rcx
popq %rdx
popq %rbp
popq %r8
popq %r9
popq %r10
popq %r11
popq %r12
popq %r13
popq %r14
popq %r15
popq %rdi
.endm

@ -45,7 +45,11 @@ void x86_setup_interrupts(void)
void x86_set_gate(u8 vector, void (*handler)(void), u8 flags)
{
struct x86_idt_entry *entry = &x86_idt[vector];
#ifdef __x86_64__
entry->selector = X86_64_KERN_CS;
#else
entry->selector = X86_32_KERN_CS;
#endif
entry->_rsvd0 = 0;
entry->attr = flags;

@ -12,7 +12,7 @@ set(CFG_KERN_ORIGIN "0x00400000" CACHE STRING "Physical address where the kernel
option(CFG_POISON_PAGES "Poison pages after allocate and free" ON)
option(CFG_POISON_HEAP "Poison heap memory after kmalloc() and kfree()" ON)
option(CFG_POISON_SLABS "Poison slab allocations (kmalloc() and friends)" ON)
set(CFG_PAGE_EMERG_DENOM "16" CACHE STRING "Denominator for the fraction of pages kept in emergency reserves")

@ -6,6 +6,7 @@
#include <gay/config.h>
#include <gay/kprintf.h>
#include <gay/ktrace.h>
#include <gay/systm.h>
#include <stdarg.h>
@ -23,6 +24,7 @@ void panic(const char *fmt, ...)
else
kvprintf(fmt, args);
kprintf("\n");
ktrace_print();
kprintf("\nKernel version: %s\nSystem halted", GAY_VERSION_STR);
@ -33,3 +35,26 @@ void panic(const char *fmt, ...)
disable_intr();
}
}
__noreturn
void panic_notrace(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
disable_intr();
kprintf("Kernel panic: ");
if (fmt == nil)
kprintf("(nil)\n");
else
kvprintf(fmt, args);
kprintf("\nKernel version: %s\nSystem halted", GAY_VERSION_STR);
/* no need for va_end() here i guess */
while (1) {
halt();
disable_intr();
}
}

Loading…
Cancel
Save