x86_64: kernel trap/interrupt handling
[akaros.git] / kern / arch / x86 / ros / trapframe64.h
index d86e79a..125da6a 100644 (file)
@@ -5,38 +5,38 @@
 #error "Do not include include ros/arch/trapframe64.h directly"
 #endif
 
-typedef struct pushregs {
-       /* registers as pushed by pusha */
-       uint32_t reg_edi;
-       uint32_t reg_esi;
-       uint32_t reg_ebp; uint32_t reg_oesp;            /* Useless */
-       uint32_t reg_ebx;
-       uint32_t reg_edx;
-       uint32_t reg_ecx;
-       uint32_t reg_eax;
-} push_regs_t;
-
 struct hw_trapframe {
-       push_regs_t tf_regs;
+       uint64_t tf_rax;
+       uint64_t tf_rbx;
+       uint64_t tf_rcx;
+       uint64_t tf_rdx;
+       uint64_t tf_rbp;
+       uint64_t tf_rsi;
+       uint64_t tf_rdi;
+       uint64_t tf_r8;
+       uint64_t tf_r9;
+       uint64_t tf_r10;
+       uint64_t tf_r11;
+       uint64_t tf_r12;
+       uint64_t tf_r13;
+       uint64_t tf_r14;
+       uint64_t tf_r15;
+       uint32_t tf_trapno;
        uint16_t tf_gs;
-       uint16_t tf_padding1;
        uint16_t tf_fs;
-       uint16_t tf_padding2;
-       uint16_t tf_es;
-       uint16_t tf_padding3;
-       uint16_t tf_ds;
-       uint16_t tf_padding4;
-       uint32_t tf_trapno;
-       /* below here defined by x86 hardware */
+       /* below here defined by x86 hardware (error code optional) */
        uint32_t tf_err;
-       uintptr_t tf_eip;
+       uint32_t tf_padding4;
+       uint64_t tf_rip;
        uint16_t tf_cs;
-       uint16_t tf_padding5;
-       uint32_t tf_eflags;
-       /* below here only when crossing rings, such as from user to kernel */
-       uintptr_t tf_esp;
+       uint16_t tf_padding3;
+       uint32_t tf_padding2;
+       uint64_t tf_rflags;
+       /* unlike 32 bit, SS:RSP is always pushed, even when not changing rings */
+       uint64_t tf_rsp;
        uint16_t tf_ss;
-       uint16_t tf_padding6;
+       uint16_t tf_padding1;
+       uint32_t tf_padding0;
 };
 
 struct sw_trapframe {