Defines new struct user_context (XCC)
[akaros.git] / kern / arch / sparc / trap.h
1 #ifndef ROS_INC_ARCH_TRAP_H
2 #define ROS_INC_ARCH_TRAP_H
3
4 #define SIZEOF_TRAPFRAME_T      0xA8
5 #define SIZEOF_KERNEL_MESSAGE_T 0x20
6
7 #ifndef __ASSEMBLER__
8
9 #include <ros/common.h>
10 #include <ros/trapframe.h>
11 #include <arch/ros/arch.h>
12 #include <arch/sparc.h>
13
14 /* Kernel message interrupt vector.  ignored, for the most part */
15 #define I_KERNEL_MSG 255
16
17 /* These are the stacks the kernel will load when it receives a trap from user
18  * space. */
19 uintptr_t core_stacktops[MAX_NUM_CPUS];
20
21 /* the struct trapframe and friends are in ros/arch/trapframe.h */
22
23 void data_access_exception(trapframe_t* state);
24 void real_fp_exception(trapframe_t* state, ancillary_state_t* astate);
25 void address_unaligned(trapframe_t* state);
26 void illegal_instruction(trapframe_t* state);
27
28 void save_fp_state(ancillary_state_t* silly);
29 void restore_fp_state(ancillary_state_t* silly);
30 void emulate_fpu(trapframe_t* state, ancillary_state_t* astate);
31
32 static inline bool in_kernel(struct trapframe *tf)
33 {
34         return tf->psr & PSR_PS;
35 }
36
37 /* Needs to leave room for a trapframe at the top of the stack. */
38 static inline void __attribute__((always_inline))
39 set_stack_pointer(uintptr_t sp)
40 {
41         sp = sp - SIZEOF_TRAPFRAME_T;
42         asm volatile("mov %0,%%sp" : : "r"(sp));
43 }
44
45 /* Save's the current kernel context into tf, setting the PC to the end of this
46  * function. */
47 static inline void save_kernel_tf(struct trapframe *tf)
48 {
49         /* TODO: save the registers, stack pointer, and have the PC pt to the end */
50 }
51
52 #endif /* !__ASSEMBLER__ */
53
54 #endif /* !ROS_INC_ARCH_TRAP_H */