aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications/include/ds2_excpt.h
blob: 08fe77ea6b5fbea520208522bf07ae45f1272229 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef __DS2_EXCPT_H__
#define __DS2_EXCPT_H__

#include <mipsregs.h>
extern unsigned int Process_RA;
extern unsigned int Process_SP;

#define SAVE_PROCESS_REGISTER()				\
    do{ unsigned int sr    ;				\
    	sr = read_c0_status();				\
    	write_c0_status((sr&(~1)));			\
			__asm__ __volatile__(			\
			"sw $31,0x00(%0)\n\t"			\
			"sw $29,0x00(%1)\n\t"			\
            :										\
			: "r" (&Process_RA),"r" (&Process_SP)); \
       write_c0_status(sr);     \
    }while(0)

#define RESTORE_PROCESS_REGISTER()			\
			__asm__ __volatile__(			\
			"lw $31,0x00(%0)\n\t"			\
			"lw $29,0x00(%1)\n\t"			\
            :								\
			: "r" (&Process_RA),"r" (&Process_SP))

inline static void excpt_exit(x) \
{
	unsigned int sr;
	sr = read_c0_status();
	write_c0_status(sr & (~1));
	__asm__ __volatile__("lw $2,0x00(%0)\n\t" :: "r" (&x));
	RESTORE_PROCESS_REGISTER();		
    write_c0_status(sr);
    __asm__ __volatile__(
		"jr $31\n\t"
		"nop\n\t"
		);
}

typedef void (*PFun_Exception_Handler)(unsigned int);

//Setup handle to process the exception
//except_index: exception number
//except_handle: handle to process the exception
//arg: argument to the handle
extern int Setup_except_handle(unsigned int except_index, PFun_Exception_Handler except_handle, unsigned int arg);

//Add a write watched exception, if the CPU write the addr, a exception will
//  generated, the watch exception's number is 23
//addr: address to be watched
extern void add_watch_point(unsigned int addr);

#endif //__DS2_EXCPT_H__