x86_64: GS base work
[akaros.git] / kern / arch / x86 / ros / trapframe64.h
1 #ifndef ROS_INC_ARCH_TRAPFRAME64_H
2 #define ROS_INC_ARCH_TRAPFRAME64_H
3
4 #ifndef ROS_INC_ARCH_TRAPFRAME_H
5 #error "Do not include include ros/arch/trapframe64.h directly"
6 #endif
7
8 struct hw_trapframe {
9         uint64_t tf_gsbase;
10         uint64_t tf_fsbase;
11         uint64_t tf_rax;
12         uint64_t tf_rbx;
13         uint64_t tf_rcx;
14         uint64_t tf_rdx;
15         uint64_t tf_rbp;
16         uint64_t tf_rsi;
17         uint64_t tf_rdi;
18         uint64_t tf_r8;
19         uint64_t tf_r9;
20         uint64_t tf_r10;
21         uint64_t tf_r11;
22         uint64_t tf_r12;
23         uint64_t tf_r13;
24         uint64_t tf_r14;
25         uint64_t tf_r15;
26         uint32_t tf_trapno;
27         uint32_t tf_padding5;
28         /* below here defined by x86 hardware (error code optional) */
29         uint32_t tf_err;
30         uint32_t tf_padding4;
31         uint64_t tf_rip;
32         uint16_t tf_cs;
33         uint16_t tf_padding3;
34         uint32_t tf_padding2;
35         uint64_t tf_rflags;
36         /* unlike 32 bit, SS:RSP is always pushed, even when not changing rings */
37         uint64_t tf_rsp;
38         uint16_t tf_ss;
39         uint16_t tf_padding1;
40         uint32_t tf_padding0;
41 };
42
43 struct sw_trapframe {
44         uint32_t tf_ebp;
45         uint32_t tf_ebx;
46         uint32_t tf_esi;
47         uint32_t tf_edi;
48         uint32_t tf_esp;
49         uint32_t tf_eip;
50         uint32_t tf_mxcsr;
51         uint16_t tf_fpucw;
52         uint16_t tf_gs;         /* something to track TLS is callee-saved (sort of) */
53 };
54
55 #endif /* ROS_INC_ARCH_TRAPFRAME64_H */