1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - OS - include
3 File: system.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 #ifndef NITRO_OS_SYSTEM_H_
18 #define NITRO_OS_SYSTEM_H_
19
20 #ifndef SDK_ASM
21 #include <nitro/types.h>
22 #include <nitro/os/common/systemCall.h>
23
24 #include <nitro/os/common/tick.h>
25 #include <nitro/os/common/thread.h>
26 #include <nitro/os/common/alarm.h>
27 #include <nitro/os/common/arena.h>
28 #include <nitro/os/common/valarm.h>
29 #endif
30
31 #include <nitro/hw/common/armArch.h>
32
33 #ifdef SDK_TWL
34 #include <twl/os/common/system.h>
35 #endif
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 //----------------------------------------------------------------------------
42 #ifndef SDK_ASM
43 #define OS_EXIT_STRING_1 "*** Exit Nitro/Twl program (status="
44 #define OS_EXIT_STRING_2 "%d).\n"
45 #define OS_EXIT_STRING OS_EXIT_STRING_1 OS_EXIT_STRING_2
46
47 typedef enum
48 {
49 OS_PROCMODE_USER = HW_PSR_USER_MODE,
50 OS_PROCMODE_FIQ = HW_PSR_FIQ_MODE,
51 OS_PROCMODE_IRQ = HW_PSR_IRQ_MODE,
52 OS_PROCMODE_SVC = HW_PSR_SVC_MODE,
53 OS_PROCMODE_ABORT = HW_PSR_ABORT_MODE,
54 OS_PROCMODE_UNDEF = HW_PSR_UNDEF_MODE,
55 OS_PROCMODE_SYS = HW_PSR_SYS_MODE
56 }
57 OSProcMode;
58
59
60 typedef enum
61 {
62 OS_INTRMODE_IRQ_DISABLE = HW_PSR_IRQ_DISABLE,
63 OS_INTRMODE_IRQ_ENABLE = 0
64 }
65 OSIntrMode_Irq;
66
67 typedef enum
68 {
69 OS_INTRMODE_FIQ_DISABLE = HW_PSR_FIQ_DISABLE,
70 OS_INTRMODE_FIQ_ENABLE = 0
71 }
72 OSIntrMode_Fiq;
73
74 typedef u32 OSIntrMode;
75
76 #ifdef SDK_ARM9
77 typedef void (*OSTerminateCallback)(void*);
78 #endif
79
80 //============================================================================
81 // CONTROL INTERRUPT
82 //============================================================================
83 /*---------------------------------------------------------------------------*
84 Name: OS_EnableInterrupts
85
86 Description: Set CPSR to enable irq interrupts
87
88 Arguments: None.
89
90 Returns: last state of HW_PSR_IRQ_DISABLE
91 *---------------------------------------------------------------------------*/
92 extern OSIntrMode OS_EnableInterrupts(void);
93
94 /*---------------------------------------------------------------------------*
95 Name: OS_DisableInterrupts
96
97 Description: Set CPSR to disable irq interrupts
98
99 Arguments: None.
100
101 Returns: last state of HW_PSR_IRQ_DISABLE
102 *---------------------------------------------------------------------------*/
103 extern OSIntrMode OS_DisableInterrupts(void);
104
105 /*---------------------------------------------------------------------------*
106 Name: OS_RestoreInterrupts
107
108 Description: Restore CPSR irq interrupt
109
110 Arguments: state of irq interrupt bit
111
112 Returns: last state of HW_PSR_IRQ_DISABLE
113 *---------------------------------------------------------------------------*/
114 extern OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
115
116 /*---------------------------------------------------------------------------*
117 Name: OS_EnableInterrupts_IrqAndFiq
118
119 Description: Set CPSR to enable irq and fiq interrupts
120
121 Arguments: None.
122
123 Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
124 *---------------------------------------------------------------------------*/
125 extern OSIntrMode OS_EnableInterrupts_IrqAndFiq(void);
126
127 /*---------------------------------------------------------------------------*
128 Name: OS_DisableInterrupts_IrqAndFiq
129
130 Description: Set CPSR to disable irq and fiq interrupts
131
132 Arguments: None.
133
134 Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
135 *---------------------------------------------------------------------------*/
136 extern OSIntrMode OS_DisableInterrupts_IrqAndFiq(void);
137
138 /*---------------------------------------------------------------------------*
139 Name: OS_RestoreInterrupts_IrqAndFiq
140
141 Description: Restore CPSR irq and fiq interrupt
142
143 Arguments: state of irq and fiq interrupt bit
144
145 Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
146 *---------------------------------------------------------------------------*/
147 extern OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
148
149 /*---------------------------------------------------------------------------*
150 Name: OS_GetCpsrIrq
151
152 Description: Get current state of CPSR irq interrupt
153
154 Arguments: None
155
156 Returns: last state of HW_PSR_IRQ_DISABLE
157 *---------------------------------------------------------------------------*/
158 extern OSIntrMode_Irq OS_GetCpsrIrq(void);
159
160 //============================================================================
161 // PROCESSER MODE
162 //============================================================================
163 /*---------------------------------------------------------------------------*
164 Name: OS_GetProcMode
165
166 Description: Get processor mode from CPSR
167
168 Arguments: None.
169
170 Returns: CPU processor mode (field 0x10-0x1f)
171 *---------------------------------------------------------------------------*/
172 extern OSProcMode OS_GetProcMode(void);
173
174
175 //============================================================================
176 // TERMINATE and HALT
177 //============================================================================
178 /*---------------------------------------------------------------------------*
179 Name: OS_Terminate
180
181 Description: finalize and terminate
182
183 Arguments: None
184
185 Returns: None
186 *---------------------------------------------------------------------------*/
187 extern void OS_Terminate(void);
188
189 /*---------------------------------------------------------------------------*
190 Name: OSi_TerminateCore
191
192 Description: Halt CPU and loop
193
194 Arguments: None
195
196 Returns: None
197 *---------------------------------------------------------------------------*/
198 extern void OSi_TerminateCore(void);
199
200 #ifdef SDK_ARM9
201 /*---------------------------------------------------------------------------*
202 Name: OSi_SetTerminateCallback
203
204 Description: set terminate callback
205 (internal function. don't use)
206
207 Arguments: callback : callback
208 arg : callback argument
209
210 Returns: None
211 *---------------------------------------------------------------------------*/
212 extern void OSi_SetTerminateCallback( OSTerminateCallback callback, void* arg );
213 #endif
214
215 /*---------------------------------------------------------------------------*
216 Name: OS_Halt
217
218 Description: Halt CPU
219
220 Arguments: None
221
222 Returns: None
223 *---------------------------------------------------------------------------*/
224 #ifdef SDK_ARM9
225 extern void OS_Halt(void);
226 #else
OS_Halt(void)227 static inline void OS_Halt(void)
228 {
229 SVC_Halt();
230 }
231 #endif
232
233 /*---------------------------------------------------------------------------*
234 Name: OS_Exit / OS_FExit
235
236 Description: Display exit string and Terminate.
237 This is useful for 'loadrun' tool command.
238
239 Arguments: console : console to output string
240 status : exit status
241
242 Returns: -- (Never return)
243 *---------------------------------------------------------------------------*/
244 extern void OS_Exit(int status);
245 extern void OS_FExit(int console, int status);
246
247 //============================================================================
248 // WAIT
249 //============================================================================
250 /*---------------------------------------------------------------------------*
251 Name: OS_SpinWaitCpuCycles
252
253 Description: Spin and Wait for specified CPU cycles at least
254
255 Arguments: cycles waiting CPU cycle
256
257 Returns: None
258 *---------------------------------------------------------------------------*/
259 extern void OS_SpinWaitCpuCycles(u32 cycle);
260
261 /*---------------------------------------------------------------------------*
262 Name: OS_SpinWaitSysCycles
263
264 Description: Spin and Wait for specified SYSTEM cycles at least
265
266 Arguments: cycles waiting SYSTEM cycle
267
268 Returns: None
269 *---------------------------------------------------------------------------*/
270 extern void OS_SpinWaitSysCycles(u32 cycle);
271
272 /*---------------------------------------------------------------------------*
273 Name: OS_SpinWait
274
275 Description: Spin and Wait for specified CPU cycles at least
276
277 Arguments: cycles waiting SYSTEM/2 cycle
278
279 Returns: None
280 *---------------------------------------------------------------------------*/
281 #ifdef SDK_ARM9
282 #define OS_SpinWait(cycle) OS_SpinWaitSysCycles((cycle)>>1)
283 #else
284 #define OS_SpinWait(cycle) OS_SpinWaitSysCycles(cycle)
285 #endif
286
287 /*---------------------------------------------------------------------------*
288 Name: OS_WaitInterrupt
289
290 Description: wait specified interrupt
291 the difference between OS_WaitIrq and OS_WaitInterrupt,
292 in waiting interrupt
293 OS_WaitIrq does switch thread,
294 OS_WaitInterrupt doesn't switch thread.
295 OS_WaitIrq wait by using OS_SleepThread() with threadQueue,
296 OS_WaitInterrupt wait by using OS_Halt().
297 if SDK_NO_THREAD defined, 2 functions become same.
298
299 Arguments: clear TRUE if want to clear interrupt flag before wait.
300 FALSE if not.
301 irqFlags bit of interrupts to wait for
302
303 Returns: None
304 *---------------------------------------------------------------------------*/
305 #ifndef OSi_OSIRQMASK_DEFINED
306 typedef u32 OSIrqMask;
307 #define OSi_OSIRQMASK_DEFINED
308 #endif
309 extern void OS_WaitInterrupt(BOOL clear, OSIrqMask irqFlags);
310
311 /*---------------------------------------------------------------------------*
312 Name: OS_WaitVBlankIntr
313
314 Description: wait till vblank interrupt occurred.
315 the difference between SVC_WaitVBlankIntr and OS_WaitVBlankIntr is:
316 OS_WaitVBlankIntr does switch thread,
317 SVC_WaitVBlankIntr doesn't switch thread.
318
319 Arguments: None
320
321 Returns: None
322 *---------------------------------------------------------------------------*/
323 extern void OS_WaitVBlankIntr(void);
324
325
326 #endif /* SDK_ASM */
327
328 #ifdef __cplusplus
329 } /* extern "C" */
330 #endif
331
332 /*NITRO_OS_SYSTEM_H_*/
333 #endif
334