Added more SharC annotations
[akaros.git] / kern / arch / i386 / trap.h
1 #ifndef ROS_INCLUDE_ARCH_TRAP_H
2 #define ROS_INCLUDE_ARCH_TRAP_H
3
4 #define MSR_IA32_SYSENTER_CS 0x174
5 #define MSR_IA32_SYSENTER_ESP 0x175
6 #define MSR_IA32_SYSENTER_EIP 0x176
7
8 // Trap numbers
9 // These are processor defined:
10 #define T_DIVIDE     0          // divide error
11 #define T_DEBUG      1          // debug exception
12 #define T_NMI        2          // non-maskable interrupt
13 #define T_BRKPT      3          // breakpoint
14 #define T_OFLOW      4          // overflow
15 #define T_BOUND      5          // bounds check
16 #define T_ILLOP      6          // illegal opcode
17 #define T_DEVICE     7          // device not available 
18 #define T_DBLFLT     8          // double fault
19 /* #define T_COPROC  9 */       // reserved (not generated by recent processors)
20 #define T_TSS       10          // invalid task switch segment
21 #define T_SEGNP     11          // segment not present
22 #define T_STACK     12          // stack exception
23 #define T_GPFLT     13          // genernal protection fault
24 #define T_PGFLT     14          // page fault
25 /* #define T_RES    15 */       // reserved
26 #define T_FPERR     16          // floating point error
27 #define T_ALIGN     17          // aligment check
28 #define T_MCHK      18          // machine check
29 #define T_SIMDERR   19          // SIMD floating point error
30
31 // These are arbitrarily chosen, but with care not to overlap
32 // processor defined exceptions or interrupt vectors.
33 #define T_SYSCALL   0x80                        // system call
34 #define T_DEFAULT   0xdeadbeef          // catchall
35
36 /* IPIs */
37 /* Testing IPI (used in testing.c) */
38 #define I_TESTING               230
39 /* smp_call_function IPIs, keep in sync with NUM_HANDLER_WRAPPERS (and < 16)
40  * it's important that this begins with 0xf0.  check i386/trap.c for details. */
41 #define I_SMP_CALL0     0xf0 // 240
42 #define I_SMP_CALL1     0xf1
43 #define I_SMP_CALL2     0xf2
44 #define I_SMP_CALL3     0xf3
45 #define I_SMP_CALL4     0xf4
46 #define I_SMP_CALL_LAST I_SMP_CALL4
47 /* Direct/Hardwired IPIs.  Hardwired in trapentry.S */
48 #define I_ACTIVE_MSG    255
49
50 /* Number of active messages available per core (arbitrary) */
51 #define NUM_ACTIVE_MESSAGES 5
52
53
54 #ifndef __ASSEMBLER__
55
56 #include <ros/common.h>
57 #include <arch/mmu.h>
58
59 /* The kernel's interrupt descriptor table */
60 extern gatedesc_t idt[];
61 extern taskstate_t ts;
62
63 typedef struct PushRegs {
64         /* registers as pushed by pusha */
65         uint32_t reg_edi;
66         uint32_t reg_esi;
67         uint32_t reg_ebp;
68         uint32_t reg_oesp;              /* Useless */
69         uint32_t reg_ebx;
70         uint32_t reg_edx;
71         uint32_t reg_ecx;
72         uint32_t reg_eax;
73 } push_regs_t;
74
75 typedef struct Trapframe {
76         push_regs_t tf_regs;
77         uint16_t tf_es;
78         uint16_t tf_padding1;
79         uint16_t tf_ds;
80         uint16_t tf_padding2;
81         uint32_t tf_trapno;
82         /* below here defined by x86 hardware */
83         uint32_t tf_err;
84         uintptr_t tf_eip;
85         uint16_t tf_cs;
86         uint16_t tf_padding3;
87         uint32_t tf_eflags;
88         /* below here only when crossing rings, such as from user to kernel */
89         uintptr_t tf_esp;
90         uint16_t tf_ss;
91         uint16_t tf_padding4;
92 } trapframe_t;
93
94 typedef struct AncillaryState {
95         uint32_t silly; // remove this when you actually use this struct
96 } ancillary_state_t;
97
98 #endif /* !__ASSEMBLER__ */
99
100 // Must equal 'sizeof(trapframe_t)'.
101 // A static_assert in kern/trap.c checks this.
102 #define SIZEOF_STRUCT_TRAPFRAME 0x44
103
104 #endif /* !ROS_INC_ARCH_TRAP_H */