Kmsg debug routine
[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/arch/trapframe.h>
11 #include <arch/ros/arch.h>
12 #include <arch/sparc.h>
13
14 /* These are the stacks the kernel will load when it receives a trap from user
15  * space. */
16 uintptr_t core_stacktops[MAX_NUM_CPUS];
17
18 /* the struct trapframe and friends are in ros/arch/trapframe.h */
19
20 void data_access_exception(trapframe_t* state);
21 void real_fp_exception(trapframe_t* state, ancillary_state_t* astate);
22 void address_unaligned(trapframe_t* state);
23 void illegal_instruction(trapframe_t* state);
24
25 void save_fp_state(ancillary_state_t* silly);
26 void restore_fp_state(ancillary_state_t* silly);
27 void emulate_fpu(trapframe_t* state, ancillary_state_t* astate);
28
29 static inline bool in_kernel(struct trapframe *tf)
30 {
31         return tf->psr & PSR_PS;
32 }
33
34 /* Needs to leave room for a trapframe at the top of the stack. */
35 static inline void __attribute__((always_inline))
36 set_stack_pointer(uintptr_t sp)
37 {
38         sp = sp - SIZEOF_TRAPFRAME_T;
39         asm volatile("mov %0,%%sp" : : "r"(sp));
40 }
41
42 /* Save's the current kernel context into tf, setting the PC to the end of this
43  * function. */
44 static inline void save_kernel_tf(struct trapframe *tf)
45 {
46         /* TODO: save the registers, stack pointer, and have the PC pt to the end */
47 }
48
49 #endif /* !__ASSEMBLER__ */
50
51 #endif /* !ROS_INC_ARCH_TRAP_H */