1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS - include
3   File:     context.h
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-09-17#$
14   $Rev: 8556 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NITRO_OS_CONTEXT_H_
19 #define NITRO_OS_CONTEXT_H_
20 
21 #ifdef SDK_ARM9
22 #include <nitro/cp/context.h>
23 #endif
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 //----------------------------------------------------------------------------
30 #define SDK_CONTEXT_HAS_SP_SVC
31 
32 //----------------------------------------------------------------------------
33 
34 #define OS_CONTEXT_CPSR      0
35 #define OS_CONTEXT_R0        4
36 #define OS_CONTEXT_R1        8
37 #define OS_CONTEXT_R2       12
38 #define OS_CONTEXT_R3       16
39 #define OS_CONTEXT_R4       20
40 #define OS_CONTEXT_R5       24
41 #define OS_CONTEXT_R6       28
42 #define OS_CONTEXT_R7       32
43 #define OS_CONTEXT_R8       36
44 #define OS_CONTEXT_R9       40
45 #define OS_CONTEXT_R10      44
46 #define OS_CONTEXT_R11      48
47 #define OS_CONTEXT_R12      52
48 #define OS_CONTEXT_R13      56
49 #define OS_CONTEXT_R14      60
50 #define OS_CONTEXT_PC_PLUS4 64         // Should be set to PC+4 for interrupt handling
51 
52 #define OS_CONTEXT_SP       OS_CONTEXT_R13
53 #define OS_CONTEXT_LR       OS_CONTEXT_R14
54 
55 #ifdef  SDK_CONTEXT_HAS_SP_SVC
56 #define OS_CONTEXT_R13_SVC  68
57 #define OS_CONTEXT_SP_SVC   OS_CONTEXT_R13_SVC
58 #endif
59 
60 #ifdef SDK_ARM9
61 #ifdef SDK_CONTEXT_HAS_SP_SVC
62 #define OS_CONTEXT_CP_CONTEXT 72
63 #else
64 #define OS_CONTEXT_CP_CONTEXT 68
65 #endif
66 #endif
67 
68 
69 typedef struct OSContext
70 {
71     u32     cpsr;
72     u32     r[13];
73     u32     sp;
74     u32     lr;
75     u32     pc_plus4;
76 #ifdef  SDK_CONTEXT_HAS_SP_SVC
77     u32     sp_svc;
78 #endif
79 #ifdef  SDK_ARM9
80     CPContext cp_context;
81 #endif
82 }
83 OSContext;
84 
85 
86 //----------------------------------------------------------------------------
87 
88 void    OS_InitContext(OSContext *context, u32 newpc, u32 newsp);
89 BOOL    OS_SaveContext(OSContext *context);
90 void    OS_LoadContext(OSContext *context);
91 void    OS_DumpContext(OSContext *context);
92 
93 #ifdef __cplusplus
94 } /* extern "C" */
95 #endif
96 
97 /* NITRO_OS_CONTEXT_H_ */
98 #endif
99