FP save/restore on x86
[akaros.git] / kern / arch / i686 / trap.h
1 #ifndef ROS_KERN_ARCH_TRAP_H
2 #define ROS_KERN_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_KERNEL_MSG    255
52
53 #ifndef __ASSEMBLER__
54
55 #include <ros/common.h>
56 #include <arch/mmu.h>
57 #include <ros/arch/trapframe.h>
58
59 /* The kernel's interrupt descriptor table */
60 extern gatedesc_t idt[];
61 extern taskstate_t ts;
62
63 /* the struct trapframe and friends are in ros/arch/trapframe.h */
64
65 static inline void set_errno(trapframe_t* tf, uint32_t errno)
66 {
67         tf->tf_regs.reg_esi = errno;
68 }
69
70 /* Determines if the given TF was in the kernel or not. */
71 static inline bool in_kernel(struct trapframe *tf)
72 {
73         return (tf->tf_cs & ~3) == GD_KT;
74 }
75
76 /* TODO: (HSS) */
77 static inline void save_fp_state(struct ancillary_state *silly)
78 {
79         asm volatile("fxsave %0" : : "m"(*silly));
80 }
81
82 static inline void restore_fp_state(struct ancillary_state *silly)
83 {
84         asm volatile("fxrstor %0" : : "m"(*silly));
85 }
86
87 #endif /* !__ASSEMBLER__ */
88
89 #endif /* !ROS_INC_ARCH_TRAP_H */