x86: allows panic earlier in the boot process
[akaros.git] / kern / arch / i686 / 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
34 // T_SYSCALL is defined by the following include:
35 #include <ros/arch/syscall.h>
36
37 #define T_DEFAULT   0xdeadbeef          // catchall
38
39 /* IPIs */
40 /* Testing IPI (used in testing.c) */
41 #define I_TESTING               230
42 /* smp_call_function IPIs, keep in sync with NUM_HANDLER_WRAPPERS (and < 16)
43  * it's important that this begins with 0xf0.  check i386/trap.c for details. */
44 #define I_SMP_CALL0     0xf0 // 240
45 #define I_SMP_CALL1     0xf1
46 #define I_SMP_CALL2     0xf2
47 #define I_SMP_CALL3     0xf3
48 #define I_SMP_CALL4     0xf4
49 #define I_SMP_CALL_LAST I_SMP_CALL4
50 /* Direct/Hardwired IPIs.  Hardwired in trapentry.S */
51 #define I_ACTIVE_MSG    255
52
53 /* Number of active messages available per core (arbitrary) */
54 #define NUM_ACTIVE_MESSAGES 5
55
56
57 #ifndef __ASSEMBLER__
58
59 #include <ros/common.h>
60 #include <arch/mmu.h>
61
62 /* The kernel's interrupt descriptor table */
63 extern gatedesc_t idt[];
64 extern taskstate_t ts;
65
66 typedef struct PushRegs {
67         /* registers as pushed by pusha */
68         uint32_t reg_edi;
69         uint32_t reg_esi;
70         uint32_t reg_ebp;
71         uint32_t reg_oesp;              /* Useless */
72         uint32_t reg_ebx;
73         uint32_t reg_edx;
74         uint32_t reg_ecx;
75         uint32_t reg_eax;
76 } push_regs_t;
77
78 typedef struct Trapframe {
79         push_regs_t tf_regs;
80         uint16_t tf_gs;
81         uint16_t tf_padding1;
82         uint16_t tf_fs;
83         uint16_t tf_padding2;
84         uint16_t tf_es;
85         uint16_t tf_padding3;
86         uint16_t tf_ds;
87         uint16_t tf_padding4;
88         uint32_t tf_trapno;
89         /* below here defined by x86 hardware */
90         uint32_t tf_err;
91         uintptr_t tf_eip;
92         uint16_t tf_cs;
93         uint16_t tf_padding5;
94         uint32_t tf_eflags;
95         /* below here only when crossing rings, such as from user to kernel */
96         uintptr_t tf_esp;
97         uint16_t tf_ss;
98         uint16_t tf_padding6;
99 } trapframe_t;
100
101 typedef struct AncillaryState {
102         uint32_t silly; // remove this when you actually use this struct
103 } ancillary_state_t;
104
105 static inline void set_errno(trapframe_t* tf, uint32_t errno)
106 {
107         tf->tf_regs.reg_esi = errno;
108 }
109
110 #endif /* !__ASSEMBLER__ */
111
112 #endif /* !ROS_INC_ARCH_TRAP_H */