FreeCalypso > hg > fc-selenite
annotate src/nucleus/gcc/tct.S @ 78:95ef11e76c5b
src/cs/system/main/gcc: asm code pieced from Citrine
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 20 Jul 2018 06:46:56 +0000 |
parents | 6738273be0b3 |
children |
rev | line source |
---|---|
74
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * Copyright Mentor Graphics Corporation 2002 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * All Rights Reserved. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * SUBJECT TO LICENSE TERMS. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 * FILE NAME VERSION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 * tct.s Nucleus PLUS\ARM925\Code Composer 1.14.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * COMPONENT |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 * TC - Thread Control |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 * This file contains the target processor dependent routines for |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 * performing target-dependent scheduling functions. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 * FUNCTIONS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 * TCT_Control_Interrupts Enable / disable interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 * by changing |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 * TCD_Interrupt_Level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 * TCT_Local_Control_Interrupts Enable/disable interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 * by not changing |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 * TCD_Interrupt_Level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 * TCT_Restore_Interrupts Restores interrupts to the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 * level in TCD_Interrupt_Level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 * TCT_Build_Task_Stack Build initial task stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 * TCT_Build_HISR_Stack Build initial HISR stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 * TCT_Build_Signal_Frame Build signal handler frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 * TCT_Check_Stack Check current stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 * TCT_Schedule Schedule the next thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 * TCT_Control_To_Thread Transfer control to a thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 * TCT_Control_To_System Transfer control from thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 * TCT_Signal_Exit Exit from signal handler |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 * TCT_Current_Thread Returns a pointer to current |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 * thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 * TCT_Set_Execute_Task Sets TCD_Execute_Task under |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 * protection from interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 * TCT_Protect Protect critical section |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 * TCT_Unprotect Unprotect critical section |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 * TCT_Unprotect_Specific Release specific protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 * TCT_Set_Current_Protect Set the thread's current |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 * protection field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 * TCT_Protect_Switch Switch to protected thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 * TCT_Schedule_Protected Schedule the protected thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 * TCT_Interrupt_Context_Save Save interrupted context |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 * TCT_Interrupt_Context_Restore Restore interrupted context |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 * TCT_Activate_HISR Activate a HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 * TCT_HISR_Shell HISR execution shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 * DEPENDENCIES |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 * cs_extr.h Common Service functions |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 * tc_extr.h Thread Control functions |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 * B. Ronquillo 08-28-2002 Released version 1.14.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 #define NU_SOURCE_FILE |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 ****************************** |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 * INCLUDE ASSEMBLY CONSTANTS * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 ****************************** |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 * Define constants used in low-level initialization. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 #include "asm_defs.h" |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 .code 32 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 /* TCT_System_Limit is a global variable defined in this module */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 .comm TCT_System_Limit,4,4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 .text |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 ********************************** |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 * LOCAL VARIABLE DECLARATIONS * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 ********************************** |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 * Define pointers to system variables so their addresses may be obtained in a |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 * pc-relative manner. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 System_Limit: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 .word TCT_System_Limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 Int_Level: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 .word TCD_Interrupt_Level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 Task_Shell: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 .word TCC_Task_Shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 HISR_Shell: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 .word TCT_HISR_Shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 Signal_Shell: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 .word TCC_Signal_Shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 Current_Thread: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 .word TCD_Current_Thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 Execute_HISR: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 .word TCD_Execute_HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 Execute_Task: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 .word TCD_Execute_Task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 Time_Slice: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 .word TMD_Time_Slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 Slice_State: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 .word TMD_Time_Slice_State |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 System_Stack: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 .word TCD_System_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 Int_Count: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 .word TCD_Interrupt_Count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 HISR_Tails: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 .word TCD_Active_HISR_Tails |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 HISR_Heads: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 .word TCD_Active_HISR_Heads |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 * TCT_Control_Interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 * This function enables and disables interrupts as specified by |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 * the caller. Interrupts disabled by this call are left disabled |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 * until the another call is made to enable them. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 * new_level New interrupt enable level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 * old_level Previous interrupt enable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 * level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 * C. Meredith 03-01-1994 Lockout interrupts while setting |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 * up the new level, resutling in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 * version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 * M. Trippi 02-03-1997 Masked the return value to only |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 * return the interrupt bits. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 * (SPR0252) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 @INT TCT_Control_Interrupts (INT new_level) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 .globl TCT_Control_Interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 TCT_Control_Interrupts: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 @INT old_level; Old interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 @ lock out all interrupts before any checking or changing |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 @ Obtain the current interrupt lockout posture. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 @ old_level = TCD_Interrupt_Level; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 @ Setup new interrupt lockout posture. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 @ TCD_Interrupt_Level = new_level; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 @ renable interrupts for the specified lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 @ Return old interrupt lockout level. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 @ return(old_level); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 MRS r2,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 ORR r2,r2,#LOCKOUT @ Build lockout CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 MSR CPSR,r2 @ Lockout interrupts temporarily |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 LDR r1, Int_Level @ Pickup interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 LDR r3,[r1, #0] @ Pickup current interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 BIC r2,r2,#LOCK_MSK @ Clear lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 ORR r2,r2,r0 @ Build new CPSR with appropriate |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 @ interrupts locked out |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 STR r0,[r1,#0] @ Save current lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 MSR CPSR,r2 @ Setup new CPSR lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 AND r0,r3,#LOCK_MSK @ Return previous lockout (SPR0252) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 * TCT_Local_Control_Interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 * This function enables and disables interrupts as specified by |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 * the caller. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 * new_level New interrupt enable level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 * old_level Previous interrupt enable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 * level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 * C. Meredith 03-01-1994 Created initial version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 * M. Trippi 02-03-1997 Masked the return value to only |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 * return the interrupt bits. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 * (SPR0252) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 @INT TCT_Local_Control_Interrupts (INT new_level) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 .globl TCT_Local_Control_Interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 TCT_Local_Control_Interrupts: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 @INT old_level; Old interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 @ read in the old level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 @ old_level = current interrupt level of processor; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 MRS r2,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 MOV r3,r2 @ save the old level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 @ clear out the old level and set the new level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 @ current interrupt level of processor &= ~LOCKOUT; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 @ current interrupt level of processor |= new_level; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 BIC r2,r2,#LOCK_MSK @ Clear all current interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 ORR r2,r2,r0 @ Build new CPSR with new |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 @ interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 MSR CPSR,r2 @ Setup new CPSR interrupt bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 @ Return old interrupt lockout level. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 @ return(old_level); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 AND r0,r3,#LOCK_MSK @ Return previous lockout (SPR0252) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 * TCT_Restore_Interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 * This function restores interrupts to that specified in the global |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 * TCD_Interrupt_Level variable. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 * None. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 * None. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 * C. Meredith 03-01-1994 Created initial version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 @VOID TCT_Restore_Interrupts (VOID) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 .globl TCT_Restore_Interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 TCT_Restore_Interrupts: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 @ Lock out all interrupts before any checking or changing |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 @ Obtain the current interrupt lockout posture. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 @ Reload the level base on the TCD_Interrupt_Level variable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 MOV r2,r1 @ save the CPSR value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 ORR r1,r1,#LOCKOUT @ Build lockout CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 MSR CPSR,r1 @ Lockout interrupts temporarily |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 BIC r2,r2,#LOCK_MSK @ Clear current interrupt levels |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 LDR r1,Int_Level @ Load address of TCD_Interrupt_Level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 LDR r0,[r1, #0] @ Pickup current interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 ORR r2,r2,r0 @ Build new CPSR with appropriate |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 @ interrupts locked out |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 MSR CPSR,r2 @ Setup new CPSR lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 * TCT_Build_Task_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 * This function builds an initial stack frame for a task. The |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 * initial stack contains information concerning initial values of |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 * registers and the task's point of entry. Furthermore, the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 * initial stack frame is in the same form as an interrupt stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 * frame. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 * TCC_Create_Task Create a new task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 * TCC_Reset_Task Reset the specified task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 * task Task control block pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 @VOID TCT_Build_Task_Stack(TC_TCB *task) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 .globl TCT_Build_Task_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 TCT_Build_Task_Stack: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 @ Pickup the stack base. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 @ REG_Stack_Base = (BYTE_PTR) task -> tc_stack_start; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 LDR r2,[r0,#0x24] @ Pickup the stack starting address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 @ Pickup the stack size. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 @ REG_Stack_Size = task -> tc_stack_size; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 LDR r1,[r0,#0x30] @ Pickup the stack size in bytes |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 @ Calculate the stack ending address. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 @ REG_Stack_End = REG_Stack_Base + REG_Stack_Size - 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 ADD r3,r1,r2 @ Compute the beginning of stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 BIC r3,r3,#3 @ Insure word alignment |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 SUB r3,r3,#4 @ Reserve a word |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 @ Save the stack ending address. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 @ task -> tc_stack_end = REG_Stack_End; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 STR r3,[r0,#0x28] @ Save the stack ending address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 @ Reference the task shell. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 @ REG_Function_Ptr = (VOID *) TCC_Task_Shell; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 @ Build an initial stack. This initial stack frame facilitates an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 @ interrupt return to the TCC_Task_Shell function, which in turn |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 @ invokes the application task. The initial stack frame has the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 @ following format: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 @ (Lower Address) Stack Top -> 1 (Interrupt stack type) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 @ CPSR Saved CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 @ r0 Saved r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 @ r1 Saved r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 @ r2 Saved r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 @ r3 Saved r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 @ r4 Saved r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 @ r5 Saved r5 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 @ r6 Saved r6 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 @ r7 Saved r7 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 @ r8 Saved r8 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 @ r9/sb Saved r9/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 @ r10/sl Saved r10/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 @ fp Saved fp |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 @ r12 Saved r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 @ r13 Saved r13 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 @ r14 Saved r14 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 @ (Higher Address) Stack Bottom-> r15 Saved r15 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 LDR r2, Task_Shell @ Pickup address of shell entry |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 STR r2,[r3], #-4 @ Store entry address on stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 MOV r2,#0 @ Clear value for initial registers |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 STR r2,[r3], #-4 @ Store initial r14 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 ADD r2,r3,#8 @ Compute initial r13 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 STR r2,[r3], #-4 @ Store initial r13 (Stack Bottom) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 STR r2,[r3], #-4 @ Store initial r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 STR r2,[r3], #-4 @ Store initial fp |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 LDR r2,[r0,#0x24] @ Pickup the stack starting address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 STR r2,[r3], #-4 @ Store initial r10/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 MOV r2,#0 @ Clear value for initial registers |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 STR r2,[r3], #-4 @ Store initial r9/sb |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 STR r2,[r3], #-4 @ Store initial r8 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 STR r2,[r3], #-4 @ Store initial r7 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477 STR r2,[r3], #-4 @ Store initial r6 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 STR r2,[r3], #-4 @ Store initial r5 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 STR r2,[r3], #-4 @ Store initial r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 STR r2,[r3], #-4 @ Store initial r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 STR r2,[r3], #-4 @ Store initial r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482 STR r2,[r3], #-4 @ Store initial r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 STR r2,[r3], #-4 @ Store initial r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 MSR CPSR_f,r2 @ Clear the flags |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 MRS r2,CPSR @ Pickup the CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 BIC r2,r2,#LOCK_MSK @ Clear initial interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 STR r2,[r3], #-4 @ Store CPSR on the initial stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 MOV r2,#1 @ Build interrupt stack type (1) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 STR r2,[r3, #0] @ Store stack type on the top |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 @ Save the minimum amount of remaining stack memory. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 @ task -> tc_stack_minimum = REG_Stack_Size - 72; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 MOV r2,#72 @ Size of interrupt stack frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 SUB r1,r1,r2 @ Compute minimum available bytes |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 STR r1,[r0, #0x34] @ Save in minimum stack area |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 @ Save the new stack pointer into the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 @ task -> tc_stack_pointer = (VOID *) Stack_Top; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 STR r3,[r0, #0x2C] @ Save stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 * TCT_Build_HISR_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
513 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
514 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
515 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
516 * This function builds an HISR stack frame that allows quick |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
517 * scheduling of the HISR. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
518 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
519 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
520 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
521 * TCC_Create_HISR Create HISR function |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
522 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
523 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
524 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
525 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
526 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
527 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
528 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
529 * hisr HISR control block pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
530 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
531 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
532 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
533 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
534 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
535 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
536 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
537 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
538 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
539 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
540 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
541 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
542 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
543 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
544 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
545 @VOID TCT_Build_HISR_Stack(TC_HCB *hisr) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
546 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
547 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
548 .globl TCT_Build_HISR_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
549 TCT_Build_HISR_Stack: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
550 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
551 @ Pickup the stack base. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
552 @ REG_Stack_Base = (BYTE_PTR) hisr -> tc_stack_start; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
553 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
554 LDR r2,[r0,#0x24] @ Pickup the stack starting address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
555 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
556 @ Pickup the stack size. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
557 @ REG_Stack_Size = hisr -> tc_stack_size; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
558 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
559 LDR r1,[r0,#0x30] @ Pickup the stack size in bytes |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
560 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
561 @ Calculate the stack ending address. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
562 @ REG_Stack_End = REG_Stack_Base + REG_Stack_Size; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
563 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
564 ADD r3,r1,r2 @ Compute the beginning of stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
565 BIC r3,r3,#3 @ Insure word alignment |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
566 SUB r3,r3,#4 @ Reserve a word |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
567 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
568 @ Save the stack ending address. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
569 @ hisr -> tc_stack_end = REG_Stack_End; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
570 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
571 STR r3,[r0,#0x28] @ Save the stack ending address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
572 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
573 @ Reference the HISR shell. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
574 @ REG_Function_Ptr = (VOID *) TCT_HISR_Shell; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
575 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
576 @ Build an initial stack. This initial stack frame facilitates an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
577 @ solicited return to the TCT_HISR_Shell function, which in turn |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
578 @ invokes the appropriate HISR. The initial HISR stack frame has the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
579 @ following format: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
580 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
581 @ (Lower Address) Stack Top -> 0 (Solicited stack type) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
582 @ !!FOR THUMB ONLY!! 0/0x20 Saved state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
583 @ r4 Saved r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
584 @ r5 Saved r5 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
585 @ r6 Saved r6 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
586 @ r7 Saved r7 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
587 @ r8 Saved r8 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
588 @ r9/sb Saved r9/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
589 @ r10/sl Saved r10/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
590 @ fp Saved fp |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
591 @ r12 Saved r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
592 @ (Higher Address) Stack Bottom-> r15 Saved r15 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
593 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
594 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
595 LDR r2,HISR_Shell @ Pickup address of shell entry |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
596 STR r2,[r3], #-4 @ Store entry address on stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
597 ADD r2,r3,#4 @ Compute initial r13 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
598 STR r2,[r3], #-4 @ Store initial r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
599 STR r2,[r3], #-4 @ Store initial fp |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
600 LDR r2,[r0,#0x24] @ Pickup the stack starting address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
601 STR r2,[r3], #-4 @ Store initial r10/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
602 MOV r2,#0 @ Clear value for initial registers |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
603 STR r2,[r3], #-4 @ Store initial r9/sb |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
604 STR r2,[r3], #-4 @ Store initial r8 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
605 STR r2,[r3], #-4 @ Store initial r7 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
606 STR r2,[r3], #-4 @ Store initial r6 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
607 STR r2,[r3], #-4 @ Store initial r5 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
608 STR r2,[r3], #-4 @ Store initial r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
609 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
610 STR r2,[r3], #-4 @ Store initial state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
611 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
612 STR r2,[r3, #0] @ Store solicited stack type on the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
613 @ top of the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
614 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
615 @ Save the minimum amount of remaining stack memory. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
616 @ hisr -> tc_stack_minimum = REG_Stack_Size - (ARM)44 or (THUMB)48; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
617 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
618 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
619 MOV r2,#48 @ Size of solicited stack frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
620 #else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
621 MOV r2,#44 @ Size of solicited stack frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
622 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
623 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
624 SUB r1,r1,r2 @ Compute minimum available bytes |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
625 STR r1,[r0, #0x34] @ Save in minimum stack area |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
626 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
627 @ Save the new stack pointer into the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
628 @ hisr -> tc_stack_pointer = (VOID *) Stack_Top; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
629 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
630 STR r3,[r0, #0x2C] @ Save stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
631 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
632 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
633 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
634 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
635 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
636 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
637 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
638 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
639 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
640 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
641 * TCT_Build_Signal_Frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
642 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
643 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
644 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
645 * This function builds a frame on top of the task's stack to |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
646 * cause the task's signal handler to execute the next time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
647 * the task is executed. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
648 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
649 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
650 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
651 * TCC_Send_Signals Send signals to a task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
652 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
653 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
654 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
655 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
656 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
657 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
658 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
659 * task Task control block pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
660 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
661 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
662 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
663 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
664 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
665 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
666 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
667 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
668 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
669 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
670 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
671 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
672 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
673 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
674 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
675 @VOID TCT_Build_Signal_Frame(TC_TCB *task) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
676 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
677 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
678 .globl TCT_Build_Signal_Frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
679 TCT_Build_Signal_Frame: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
680 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
681 @ Pickup the stack pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
682 @ REG_Stack_Ptr = (BYTE_PTR) task -> tc_stack_pointer; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
683 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
684 LDR r3,[r0,#0x2c] @ Pickup the current stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
685 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
686 @ Reference the Signal shell. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
687 @ REG_Function_Ptr = (VOID *) TCC_Signal_Shell; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
688 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
689 @ Build a signal stack. This signal stack frame facilitates an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
690 @ solicited return to the TCC_Signal_Shell function, which in turn |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
691 @ invokes the appropriate signal handler. The initial HISR stack frame |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
692 @ has the following format: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
693 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
694 @ (Lower Address) Stack Top -> 0 (Solicited stack type) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
695 @ !!FOR THUMB ONLY!! 0/0x20 Saved state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
696 @ r4 Saved r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
697 @ r5 Saved r5 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
698 @ r6 Saved r6 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
699 @ r7 Saved r7 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
700 @ r8 Saved r8 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
701 @ r9/sb Saved r9/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
702 @ r10/sl Saved r10/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
703 @ fp Saved fp |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
704 @ r12 Saved r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
705 @ (Higher Address) Stack Bottom-> r15 Saved r15 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
706 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
707 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
708 LDR r2,Signal_Shell @ Pickup address of shell entry |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
709 SUB r3,r3,#4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
710 STR r2,[r3], #-4 @ Store entry address on stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
711 ADD r2,r3,#4 @ Compute initial r13 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
712 STR r2,[r3], #-4 @ Store initial r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
713 STR r2,[r3], #-4 @ Store initial fp |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
714 LDR r2,[r0,#0x24] @ Pickup the stack starting address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
715 STR r2,[r3], #-4 @ Store initial r10/sl |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
716 MOV r2,#0 @ Clear value for initial registers |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
717 STR r2,[r3], #-4 @ Store initial r9/sb |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
718 STR r2,[r3], #-4 @ Store initial r8 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
719 STR r2,[r3], #-4 @ Store initial r7 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
720 STR r2,[r3], #-4 @ Store initial r6 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
721 STR r2,[r3], #-4 @ Store initial r5 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
722 STR r2,[r3], #-4 @ Store initial r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
723 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
724 MOV r1,#0x20 @ Get initial state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
725 STR r1,[r3], #-4 @ Store initial state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
726 #else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
727 STR r2,[r3], #-4 @ TCC_Signal_Shell is an ARM proc |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
728 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
729 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
730 STR r2,[r3, #0] @ Store solicited stack type on the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
731 @ top of the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
732 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
733 @ Save the new stack pointer into the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
734 @ task -> tc_stack_pointer = (VOID *) (REG_Stack_Ptr - REG_Stack_Size); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
735 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
736 STR r3,[r0, #0x2C] @ Save stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
737 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
738 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
739 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
740 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
741 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
742 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
743 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
744 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
745 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
746 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
747 * TCT_Check_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
748 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
749 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
750 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
751 * This function checks the current stack for overflow conditions. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
752 * Additionally, this function keeps track of the minimum amount |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
753 * of stack space for the calling thread and returns the current |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
754 * available stack space. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
755 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
756 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
757 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
758 * TCC_Send_Signals Send signals to a task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
759 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
760 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
761 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
762 * ERC_System_Error System error handler |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
763 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
764 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
765 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
766 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
767 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
768 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
769 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
770 * available bytes in stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
771 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
772 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
773 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
774 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
775 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
776 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
777 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
778 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
779 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
780 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
781 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
782 @UNSIGNED TCT_Check_Stack(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
783 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
784 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
785 .globl TCT_Check_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
786 TCT_Check_Stack: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
787 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
788 @TC_TCB *thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
789 @UNSIGNED remaining; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
790 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
791 @ Pickup the current task/HISR pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
792 @ thread = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
793 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
794 LDR r0,Current_Thread @ Pickup address of thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
795 LDR r0,[r0,#0] @ Pickup thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
796 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
797 @ Determine if there is a current thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
798 @ if (thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
799 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
800 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
801 CMP r0,#0 @ Determine if a thread is active |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
802 MOV r3,#0 @ Default remaining value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
803 BEQ TCT_Skip_Stack_Check @ If NU_NULL, skip stack checking |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
804 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
805 @ Determine if the stack pointers are out of range. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
806 @ if ((thread -> tc_stack_pointer < thread -> tc_stack_start) || |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
807 @ (thread -> tc_stack_pointer > thread -> tc_stack_end)) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
808 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
809 LDR r2,[r0,#0x24] @ Pickup start of stack area |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
810 CMP r13,r2 @ Compare with current stack ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
811 BLT TCT_Stack_Range_Error @ If less, stack is out of range |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
812 LDR r1,[r0,#0x28] @ Pickup end of stack area |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
813 CMP r13,r1 @ Compare with current stack ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
814 BLE TCT_Stack_Range_Okay @ If less, stack range is okay |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
815 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
816 @ Stack overflow condition exits. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
817 @ ERC_System_Error(NU_STACK_OVERFLOW); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
818 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
819 TCT_Stack_Range_Error: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
820 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
821 STR r14,[r13, #4]! @ Store r14 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
822 MOV r0,#3 @ Build NU_STACK_OVERFLOW code |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
823 BL ERC_System_Error @ Call system error handler. Note: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
824 @ control is not returned! |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
825 @ Examine stack to find return |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
826 @ address of this routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
827 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
828 TCT_Stack_Range_Okay: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
829 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
830 @ Calculate the amount of available space on the stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
831 @ remaining = (BYTE_PTR) thread -> tc_stack_pointer - |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
832 @ (BYTE_PTR) thread -> tc_stack_start; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
833 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
834 SUB r3,r13,r2 @ Calculate remaining stack size |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
835 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
836 @ Determine if there is enough memory on the stack to save all of the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
837 @ registers. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
838 @ if (remaining < 80) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
839 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
840 CMP r3,#80 @ Is there enough room for an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
841 @ interrupt frame? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
842 BCS TCT_No_Stack_Error @ If so, no stack overflow yet |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
843 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
844 @ Stack overflow condition is about to happen. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
845 @ ERC_System_Error(NU_STACK_OVERFLOW); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
846 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
847 STR r14,[r13, #4]! @ Store r14 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
848 MOV r0,#3 @ Build NU_STACK_OVERFLOW code |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
849 BL ERC_System_Error @ Call system error handler. Note: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
850 @ control is not returned! |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
851 @ Examine stack to find return |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
852 @ address of this routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
853 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
854 TCT_No_Stack_Error: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
855 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
856 @ Determine if this is a new minimum amount of stack space. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
857 @ if (remaining < thread -> tc_stack_minimum) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
858 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
859 LDR r2,[r0,#0x34] |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
860 CMP r3,r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
861 STRCC r3,[r0,#0x34] |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
862 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
863 @ Save the new stack minimum. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
864 @ thread -> tc_stack_minimum = remaining; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
865 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
866 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
867 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
868 @ Set the remaining bytes to 0. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
869 @ remaining = 0; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
870 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
871 @ Return the remaining number of bytes on the stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
872 @ return(remaining); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
873 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
874 TCT_Skip_Stack_Check: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
875 MOV r0,r3 @ Return remaining bytes |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
876 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
877 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
878 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
879 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
880 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
881 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
882 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
883 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
884 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
885 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
886 * TCT_Schedule |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
887 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
888 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
889 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
890 * This function waits for a thread to become ready. Once a thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
891 * is ready, this function initiates a transfer of control to that |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
892 * thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
893 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
894 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
895 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
896 * INC_Initialize Main initialization routine |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
897 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
898 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
899 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
900 * TCT_Control_To_Thread Transfer control to a thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
901 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
902 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
903 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
904 * TCD_Execute_Task Pointer to task to execute |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
905 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
906 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
907 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
908 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
909 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
910 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
911 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
912 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
913 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
914 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
915 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
916 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
917 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
918 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
919 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
920 @VOID TCT_Schedule(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
921 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
922 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
923 .globl TCT_Schedule |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
924 TCT_Schedule: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
925 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
926 @ Restore interrupts according to the value contained in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
927 @ TCD_Interrupt_Level. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
928 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
929 LDR r1,Int_Level @ Build address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
930 MRS r0,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
931 LDR r2,[r1, #0] @ Pickup current interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
932 BIC r0,r0,#LOCK_MSK @ Clear the interrupt lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
933 ORR r0,r0,r2 @ Build new interrupt lockout CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
934 MSR CPSR,r0 @ Setup new CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
935 LDR r2,Execute_HISR @ Pickup TCD_Execute_HISR address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
936 LDR r3,Execute_Task @ Pickup TCD_Execute_Task address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
937 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
938 #ifdef INCLUDE_PROVIEW |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
939 @ Nucleus ProView Hook |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
940 @ We check if upon entering TCT_Schedule we already have a task to excute. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
941 @ if not, we start IDLE. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
942 LDR r0,[r2, #0] @ Pickup highest priority HISR ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
943 CMP r0,#0 @ Is there a HISR active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
944 BNE TCT_Schedule_Thread @ Found an HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
945 LDR r0,[r3, #0] @ Pickup highest priority Task ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
946 CMP r0,#0 @ Is there a task active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
947 BNE TCT_Schedule_Thread @ If not, start IDLE. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
948 STR r2,[r13, #-4]! @ Save r2 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
949 STR r3,[r13, #-4]! @ Save r3 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
950 BL _NU_Idle_Hook |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
951 LDR r3,[r13], #4 @ Recover r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
952 LDR r2,[r13], #4 @ Recover r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
953 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
954 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
955 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
956 @ Wait until a thread (task or HISR) is available to execute. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
957 @ do |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
958 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
959 .globl TCT_Schedule_Loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
960 TCT_Schedule_Loop: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
961 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
962 @ } while ((!TCD_Execute_HISR) && (!TCD_Execute_Task)); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
963 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
964 LDR r0,[r2, #0] @ Pickup highest priority HISR ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
965 CMP r0,#0 @ Is there a HISR active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
966 BNE TCT_Schedule_Thread @ Found an HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
967 LDR r0,[r3, #0] @ Pickup highest priority Task ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
968 CMP r0,#0 @ Is there a task active? |
75
6738273be0b3
Nucleus gcc assembly modules compile
Mychaela Falconia <falcon@freecalypso.org>
parents:
74
diff
changeset
|
969 #if 1 /* was CONFIG_INCLUDE_L1 in Citrine */ |
74
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
970 BEQ _GSM_Small_Sleep |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
971 #else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
972 BEQ TCT_Schedule_Loop @ If not, continue the search |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
973 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
974 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
975 @ Yes, either a task or an HISR is ready to execute. Lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
976 @ interrupts while the thread is transferred to. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
977 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
978 TCT_Schedule_Thread: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
979 MRS r1,CPSR @ Pickup CPSR again |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
980 ORR r1,r1,#LOCKOUT @ Build interrupt lockout value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
981 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
982 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
983 @ Transfer control to the thread by falling through to the following |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
984 @ routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
985 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
986 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
987 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
988 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
989 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
990 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
991 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
992 * TCT_Control_To_Thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
993 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
994 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
995 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
996 * This function transfers control to the specified thread. Each |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
997 * time control is transferred to a thread, its scheduled counter |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
998 * is incremented. Additionally, time-slicing for task threads is |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
999 * enabled in this routine. The TCD_Current_Thread pointer is |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1000 * setup by this function. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1001 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1002 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1003 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1004 * TCT_Schedule Indirectly called |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1005 * TCT_Protect Protection task switch |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1006 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1007 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1008 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1009 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1010 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1011 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1012 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1013 * thread Thread control block pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1014 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1015 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1016 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1017 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1018 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1019 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1020 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1021 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1022 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1023 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1024 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1025 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1026 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1027 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1028 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1029 @VOID TCT_Control_To_Thread(TC_TCB *thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1030 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1031 TCT_Control_To_Thread: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1032 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1033 @ Setup the current thread pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1034 @ TCD_Current_Thread = (VOID *) thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1035 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1036 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1037 LDR r2,[r0, #0x1c] @ Pickup scheduled count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1038 STR r0,[r1, #0] @ Setup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1039 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1040 @ Increment the thread scheduled counter. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1041 @ thread -> tc_scheduled++; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1042 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1043 LDR r3,[r0, #0x20] @ Pickup time slice value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1044 ADD r2,r2,#1 @ Increment the scheduled count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1045 STR r2,[r0, #0x1c] @ Store new scheduled count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1046 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1047 @ Check for time slice option. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1048 @ if (thread -> tc_cur_time_slice) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1049 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1050 CMP r3,#0 @ Is there a time slice? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1051 BEQ TCT_No_Start_TS_1 @ If 0, there is no time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1052 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1053 @ Start a time slice. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1054 @ TMD_Time_Slice = thread -> tc_cur_time_slice; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1055 @ TMD_Time_Slice_State = 0; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1056 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1057 LDR r2,Time_Slice @ Pickup address of TMD_Time_Slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1058 LDR r1,Slice_State @ Pickup address of |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1059 @ TMD_Time_Slice_State |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1060 STR r3,[r2, #0] @ Setup the time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1061 MOV r2,#0 @ Build active state flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1062 STR r2,[r1,#0] @ Set the active flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1063 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1064 TCT_No_Start_TS_1: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1065 #ifdef INCLUDE_PROVIEW |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1066 @ Nucleus ProView Hook |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1067 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1068 STR r0,[r13, #-4]! @ Save r0 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1069 BL _NU_Schedule_Task_Hook @ Branch to RTView |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1070 LDR r0,[r13], #4 @ Recover return address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1071 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1072 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1073 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1074 @ Pickup the stack pointer and resume the thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1075 @ REG_Stack_Ptr = thread -> tc_stack_pointer; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1076 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1077 LDR r13,[r0, #0x2c] @ Switch to thread's stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1078 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1079 @ Pop off the saved information associated with the thread. After we |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1080 @ determine which type of stack is present. A 1 on the top of the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1081 @ stack indicates an interrupt stack, while a 0 on the top of the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1082 @ stack indicates a solicited type of stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1083 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1084 @ Remember that the interrupt level that is restored must represent |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1085 @ the interrupt level in TCD_Interrupt_Level. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1086 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1087 LDR r1,[r13], #4 @ Pop off the stack type |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1088 CMP r1,#1 @ See if it is an interrupt stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1089 BEQ TCT_Interrupt_Resume @ If so, an interrupt resume of |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1090 @ thread is required |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1091 LDR r1, Int_Level @ Pickup address of interrupt |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1092 @ lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1093 MRS r0,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1094 BIC r0,r0,#LOCK_MSK @ Clear lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1095 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1096 BIC r0,r0,#0x80000000 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1097 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1098 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1099 LDR r2,[r1, #0] @ Pickup interrupt lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1100 ORR r0,r0,r2 @ Build new interrupt lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1101 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1102 LDR r2,[r13], #4 @ Pop off the state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1103 ORR r0,r0,r2 @ Set appropriate state |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1104 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1105 MSR SPSR,r0 @ Place it into the SPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1106 LDMIA r13!,{r4-r12,r15}^ @ A solicited return is required. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1107 @ This type of return only |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1108 @ recovers r4-r13 & r15 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1109 TCT_Interrupt_Resume: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1110 LDR r0,[r13], #4 @ Pop off the CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1111 LDR r1,Int_Level @ Pickup address of interrupt |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1112 @ lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1113 BIC r0,r0,#LOCK_MSK @ Clear lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1114 LDR r2,[r1, #0] @ Pickup interrupt lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1115 ORR r0,r0,r2 @ Build new interrupt lockout mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1116 MSR SPSR,r0 @ Place it into the SPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1117 LDMIA r13,{r0-r15}^ @ Recover all registers and resume |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1118 @ at point of interrupt |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1119 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1120 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1121 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1122 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1123 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1124 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1125 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1126 * TCT_Control_To_System |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1127 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1128 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1129 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1130 * This function returns control from a thread to the system. Note |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1131 * that this service is called in a solicited manner, i.e. it is |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1132 * not called from an interrupt thread. Registers required by the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1133 * compiler to be preserved across function boundaries are saved by |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1134 * this routine. Note that this is usually a sub-set of the total |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1135 * number of available registers. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1136 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1137 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1138 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1139 * Other Components |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1140 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1141 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1142 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1143 * TCT_Schedule Schedule the next thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1144 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1145 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1146 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1147 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1148 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1149 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1150 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1151 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1152 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1153 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1154 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1155 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1156 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1157 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1158 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1159 * C. Meredith 03-01-1994 Corrected problem in time-slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1160 * reset logic, resulting in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1161 * version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1162 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1163 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1164 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1165 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1166 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1167 @VOID TCT_Control_To_System(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1168 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1169 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1170 .globl TCT_Control_To_System |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1171 TCT_Control_To_System: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1172 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1173 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1174 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1175 MRS r0,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1176 ORR r0,r0,#LOCKOUT @ Build interrupt lockout value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1177 MSR CPSR,r0 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1178 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1179 @ Save a minimal context of the thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1180 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1181 STMDB r13!,{r4-r12,r14} @ Save minimal context of thread on |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1182 @ the current stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1183 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1184 MOV r2,r14 @ Determine what state the caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1185 MOV r2,r2,LSL #31 @ was in and build an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1186 MOV r2,r2,LSR #26 @ appropriate state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1187 STR r2,[r13, #-4]! @ Place it on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1188 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1189 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1190 MOV r2,#0 @ Build solicited stack type value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1191 @ and NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1192 STR r2,[r13, #-4]! @ Place it on the top of the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1193 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1194 @ Setup a pointer to the thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1195 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1196 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1197 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1198 LDR r0,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1199 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1200 @ Clear the current thread control block pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1201 @ TCD_Current_Thread = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1202 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1203 LDR r3,Slice_State @ Pickup time slice state address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1204 STR r2,[r1, #0] @ Set current thread pointer to |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1205 @ NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1206 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1207 @ Check to see if a time slice is active. If so, copy the original time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1208 @ slice into the current time slice field of the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1209 @ if (TMD_Time_Slice_State == 0) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1210 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1211 LDR r1,[r3, #0] @ Pickup time slice state flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1212 CMP r1,#0 @ Compare with active value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1213 BNE TCT_No_Stop_TS_1 @ If non-active, don't disable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1214 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1215 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1216 @ Insure that the next time the task runs it gets a fresh time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1217 @ slice. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1218 @ REG_Thread_Ptr -> tc_cur_time_slice = REG_Thread_Ptr -> tc_time_slice; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1219 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1220 LDR r1,[r0, #0x40] @ Pickup original time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1221 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1222 @ Clear any active time slice by setting the state to NOT_ACTIVE. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1223 @ TMD_Time_Slice_State = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1224 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1225 MOV r2,#1 @ Build disable value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1226 STR r2,[r3, #0] @ Disable time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1227 STR r1,[r0, #0x20] @ Reset current time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1228 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1229 TCT_No_Stop_TS_1: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1230 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1231 @ Save off the current stack pointer in the control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1232 @ REG_Thread_Ptr -> tc_stack_pointer = (VOID *) REG_Stack_Ptr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1233 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1234 STR r13,[r0, #0x2c] @ Save the thread's stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1235 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1236 @ Clear the task's current protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1237 @ (REG_Thread_Ptr -> tc_current_protect) -> tc_tcb_pointer = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1238 @ REG_Thread_Ptr -> tc_current_protect = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1239 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1240 LDR r1,[r0, #0x38] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1241 MOV r2,#0 @ Build NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1242 STR r2,[r0, #0x38] @ Clear the protect pointer field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1243 STR r2,[r1, #0] @ Release the actual protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1244 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1245 @ Switch to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1246 @ REG_Stack_Ptr = TCD_System_Stack; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1247 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1248 LDR r1, System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1249 LDR r2, System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1250 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1251 LDR r10,[r2, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1252 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1253 @ Finished, return to the scheduling loop. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1254 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1255 B TCT_Schedule @ Return to scheduling loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1256 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1257 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1258 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1259 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1260 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1261 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1262 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1263 * TCT_Signal_Exit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1264 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1265 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1266 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1267 * This function exits from a signal handler. The primary purpose |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1268 * of this function is to clear the scheduler protection and switch |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1269 * the stack pointer back to the normal task's stack pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1270 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1271 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1272 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1273 * TCC_Signal_Shell Signal handling shell func |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1274 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1275 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1276 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1277 * TCT_Schedule Scheduler |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1278 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1279 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1280 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1281 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1282 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1283 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1284 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1285 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1286 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1287 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1288 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1289 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1290 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1291 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1292 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1293 * C. Meredith 03-01-1994 Corrected problem in time-slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1294 * reset logic, resulting in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1295 * version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1296 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1297 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1298 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1299 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1300 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1301 @VOID TCT_Signal_Exit(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1302 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1303 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1304 .globl TCT_Signal_Exit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1305 TCT_Signal_Exit: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1306 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1307 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1308 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1309 MRS r3,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1310 ORR r3,r3,#LOCKOUT @ Build lockout value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1311 MSR CPSR,r3 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1312 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1313 @ Setup a pointer to the thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1314 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1315 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1316 LDR r1,Current_Thread @ Pickup address of thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1317 MOV r2,#0 @ Build NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1318 LDR r0,[r1,#0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1319 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1320 @ Clear the current thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1321 @ TCD_Current_Thread = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1322 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1323 LDR r3,Slice_State @ Pickup time slice state address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1324 STR r2,[r1, #0] @ Clear current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1325 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1326 @ Check to see if a time slice is active. If so, copy the original time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1327 @ slice into the current time slice field of the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1328 @ if (TMD_Time_Slice_State == 0) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1329 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1330 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1331 LDR r1,[r3, #0] @ Pickup time slice state flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1332 CMP r1,#0 @ Compare with active value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1333 BNE TCT_No_Stop_TS_2 @ If non-active, don't disable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1334 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1335 @ Insure that the next time the task runs it gets a fresh time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1336 @ slice. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1337 @ REG_Thread_Ptr -> tc_cur_time_slice = REG_Thread_Ptr -> tc_time_slice; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1338 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1339 LDR r1,[r0, #0x40] @ Pickup original time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1340 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1341 @ Clear any active time slice by setting the state to NOT_ACTIVE. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1342 @ TMD_Time_Slice_State = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1343 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1344 MOV r2,#1 @ Build disable value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1345 STR r2,[r3, #0] @ Disable time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1346 STR r1,[r0, #0x20] @ Reset current time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1347 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1348 TCT_No_Stop_TS_2: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1349 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1350 @ Switch back to the saved stack. The saved stack pointer was saved |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1351 @ before the signal frame was built. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1352 @ REG_Thread_Ptr -> tc_stack_pointer = |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1353 @ REG_Thread_Ptr -> tc_saved_stack_ptr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1354 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1355 LDR r1,[r0, #0x3c] @ Pickup saved stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1356 STR r1,[r0, #0x2c] @ Place in current stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1357 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1358 @ Clear the task's current protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1359 @ (REG_Thread_Ptr -> tc_current_protect) -> tc_tcb_pointer = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1360 @ REG_Thread_Ptr -> tc_current_protect = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1361 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1362 LDR r1,[r0, #0x38] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1363 MOV r2,#0 @ Build NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1364 STR r2,[r0, #0x38] @ Clear the protect pointer field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1365 STR r2,[r1, #0] @ Release the actual protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1366 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1367 @ Switch to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1368 @ REG_Stack_Ptr = (BYTE_PTR) TCD_System_Stack; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1369 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1370 LDR r1, System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1371 LDR r2, System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1372 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1373 LDR r10,[r2, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1374 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1375 @ Finished, return to the scheduling loop. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1376 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1377 B TCT_Schedule @ Return to scheduling loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1378 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1379 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1380 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1381 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1382 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1383 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1384 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1385 * TCT_Current_Thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1386 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1387 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1388 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1389 * This function returns the current thread pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1390 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1391 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1392 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1393 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1394 * System Components |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1395 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1396 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1397 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1398 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1399 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1400 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1401 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1402 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1403 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1404 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1405 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1406 * Pointer to current thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1407 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1408 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1409 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1410 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1411 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1412 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1413 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1414 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1415 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1416 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1417 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1418 @VOID *TCT_Current_Thread(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1419 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1420 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1421 .globl TCT_Current_Thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1422 TCT_Current_Thread: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1423 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1424 @ Return the current thread pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1425 @ return(TCD_Current_Thread); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1426 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1427 LDR r0, Current_Thread @ Pickup address of thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1428 LDR r0,[r0, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1429 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1430 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1431 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1432 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1433 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1434 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1435 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1436 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1437 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1438 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1439 * TCT_Set_Execute_Task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1440 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1441 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1442 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1443 * This function sets the current task to execute variable under |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1444 * protection against interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1445 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1446 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1447 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1448 * TCC Scheduling Routines |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1449 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1450 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1451 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1452 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1453 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1454 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1455 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1456 * task Pointer to task control block |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1457 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1458 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1459 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1460 * TCD_Execute_Task Modified variable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1461 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1462 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1463 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1464 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1465 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1466 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1467 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1468 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1469 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1470 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1471 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1472 @VOID TCT_Set_Execute_Task(TC_TCB *task) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1473 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1474 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1475 .globl TCT_Set_Execute_Task |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1476 TCT_Set_Execute_Task: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1477 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1478 @ Now setup the TCD_Execute_Task pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1479 @ TCD_Execute_Task = task; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1480 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1481 LDR r1, Execute_Task @ Pickup execute task ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1482 STR r0,[r1,#0] @ Setup new task to execute |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1483 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1484 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1485 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1486 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1487 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1488 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1489 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1490 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1491 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1492 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1493 * TCT_Protect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1494 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1495 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1496 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1497 * This function protects against multiple thread access. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1498 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1499 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1500 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1501 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1502 * System Components |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1503 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1504 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1505 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1506 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1507 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1508 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1509 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1510 * protect Pointer to protection block |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1511 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1512 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1513 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1514 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1515 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1516 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1517 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1518 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1519 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1520 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1521 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1522 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1523 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1524 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1525 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1526 @VOID TCT_Protect(TC_PROTECT *protect) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1527 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1528 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1529 .globl TCT_Protect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1530 TCT_Protect: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1531 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1532 @ Determine if the caller is in a task or HISR thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1533 @ if (TCD_Current_Thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1534 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1535 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1536 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1537 LDR r3,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1538 CMP r3,#0 @ Check to see if it is non-NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1539 BEQ TCT_Skip_Protect @ If NULL, skip protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1540 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1541 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1542 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1543 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1544 ORR r1,r1,#LOCKOUT @ Place lockout value in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1545 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1546 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1547 @ Wait until the protect structure is available. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1548 @ while (protect -> tc_tcb_pointer != NU_NULL) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1549 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1550 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1551 TCT_Protect_Loop: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1552 LDR r1,[r0, #0] @ Pickup protection owner field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1553 CMP r1,#0 @ Is there any protection? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1554 BEQ TCT_Protect_Available @ If NU_NULL, no current protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1555 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1556 @ Protection structure is not available. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1557 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1558 @ Indicate that another thread is waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1559 @ protect -> tc_thread_waiting = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1560 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1561 MOV r2,#1 @ Build thread waiting flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1562 STR r2,[r0, #4] @ Set waiting field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1563 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1564 @ Directly schedule the thread waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1565 @ TCT_Schedule_Protected(protect -> tc_tcb_pointer); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1566 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1567 STR r0,[r13, #-4]! @ Save r0 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1568 STR r14,[r13, #-4]! @ Save r14 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1569 MOV r0,r3 @ Place current thread into r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1570 BL TCT_Schedule_Protected @ Call routine to schedule the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1571 @ owner of the thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1572 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1573 LDR r14,[r13], #4 @ Recover saved r14 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1574 LDR r0,[r13], #4 @ Recover saved r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1575 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1576 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1577 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1578 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1579 LDR r3,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1580 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1581 ORR r1,r1,#LOCKOUT @ Place lockout value in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1582 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1583 B TCT_Protect_Loop @ Examine protect flags again |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1584 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1585 TCT_Protect_Available: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1586 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1587 @ Protection structure is available. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1588 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1589 @ Indicate that this thread owns the protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1590 @ protect -> tc_tcb_pointer = TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1591 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1592 STR r3,[r0, #0] @ Indicate calling thread owns this |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1593 @ protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1594 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1595 @ Clear the thread waiting flag. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1596 @ protect -> tc_thread_waiting = 0; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1597 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1598 MOV r2,#0 @ Clear value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1599 STR r2,[r0, #4] @ Clear the thread waiting flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1600 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1601 @ Save the protection pointer in the thread's control block. Note |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1602 @ that both task and HISR threads share the same control block |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1603 @ format. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1604 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1605 @ REG_Thread_Ptr -> tc_current_protect = protect; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1606 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1607 STR r0,[r3, #0x38] @ Setup current protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1608 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1609 @ Restore interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1610 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1611 LDR r2,Int_Level @ Pickup address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1612 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1613 LDR r3,[r2, #0] @ Pickup interrupt lockout level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1614 BIC r1,r1,#LOCK_MSK @ Clear lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1615 ORR r1,r1,r3 @ Build new interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1616 MSR CPSR,r1 @ Setup CPSR appropriately |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1617 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1618 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1619 TCT_Skip_Protect: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1620 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1621 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1622 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1623 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1624 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1625 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1626 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1627 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1628 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1629 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1630 * TCT_Unprotect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1631 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1632 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1633 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1634 * This function releases protection of the currently active |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1635 * thread. If the caller is not an active thread, then this |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1636 * request is ignored. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1637 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1638 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1639 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1640 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1641 * System Components |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1642 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1643 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1644 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1645 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1646 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1647 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1648 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1649 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1650 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1651 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1652 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1653 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1654 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1655 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1656 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1657 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1658 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1659 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1660 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1661 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1662 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1663 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1664 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1665 @VOID TCT_Unprotect(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1666 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1667 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1668 .globl TCT_Unprotect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1669 TCT_Unprotect: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1670 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1671 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1672 @ Determine if the caller is in a task or HISR thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1673 @ if (TCD_Current_Thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1674 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1675 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1676 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1677 LDR r3,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1678 CMP r3,#0 @ Check to see if it is non-NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1679 BEQ TCT_Skip_Unprotect @ If NULL, skip unprotection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1680 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1681 @ Setup a thread control block pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1682 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1683 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1684 @ Determine if there is a currently active protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1685 @ if (REG_Thread_Ptr -> tc_current_protect) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1686 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1687 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1688 LDR r0,[r3, #0x38] @ Pickup current protect field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1689 CMP r0,#0 @ Is there a protection in force? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1690 BEQ TCT_Skip_Unprotect @ If not, nothing is protected |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1691 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1692 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1693 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1694 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1695 ORR r1,r1,#LOCKOUT @ Place lockout value in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1696 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1697 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1698 @ Yes, this thread still has this protection structure. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1699 @ REG_Protect_Ptr = REG_Thread_Ptr -> tc_current_protect; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1700 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1701 @ Is there a higher priority thread waiting for the protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1702 @ structure? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1703 @ if (REG_Protect_Ptr -> tc_thread_waiting) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1704 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1705 LDR r2,[r0, #4] @ Pickup thread waiting flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1706 CMP r2,#0 @ Are there any threads waiting? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1707 BEQ TCT_Not_Waiting_Unpr @ If not, just release protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1708 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1709 @ Transfer control to the system. Note that this |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1710 @ automatically clears the current protection and it returns |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1711 @ to the caller of this routine instead of this routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1712 @ TCT_Control_To_System(); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1713 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1714 B TCT_Control_To_System @ Return control to the system |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1715 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1716 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1717 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1718 TCT_Not_Waiting_Unpr: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1719 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1720 @ Clear the protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1721 @ REG_Thread_Ptr -> tc_current_protect = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1722 @ REG_Protect_Ptr -> tc_tcb_pointer = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1723 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1724 MOV r2,#0 @ Build NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1725 STR r2,[r0, #0] @ Release the protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1726 STR r2,[r3, #0x38] @ Clear protection pointer in the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1727 @ control block |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1728 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1729 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1730 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1731 TCT_Not_Protected: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1732 @ Restore interrupts again. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1733 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1734 LDR r2,Int_Level @ Pickup address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1735 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1736 LDR r3,[r2, #0] @ Pickup interrupt lockout level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1737 BIC r1,r1,#LOCK_MSK @ Clear lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1738 ORR r1,r1,r3 @ Build new interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1739 MSR CPSR,r1 @ Setup CPSR appropriately |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1740 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1741 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1742 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1743 TCT_Skip_Unprotect: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1744 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1745 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1746 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1747 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1748 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1749 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1750 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1751 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1752 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1753 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1754 * TCT_Unprotect_Specific |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1755 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1756 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1757 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1758 * This function releases a specific protection structure. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1759 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1760 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1761 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1762 * Application |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1763 * System Components |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1764 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1765 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1766 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1767 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1768 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1769 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1770 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1771 * protect Pointer to protection block |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1772 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1773 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1774 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1775 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1776 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1777 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1778 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1779 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1780 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1781 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1782 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1783 * C. Meredith 03-01-1994 Corrected problem in time-slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1784 * reset logic, corrected bug |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1785 * using protect ptr, resulting |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1786 * in version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1787 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1788 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1789 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1790 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1791 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1792 @VOID Specific(TC_PROTECT *protect) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1793 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1794 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1795 .globl TCT_Unprotect_Specific |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1796 TCT_Unprotect_Specific: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1797 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1798 @ Determine if the caller is in a task or HISR thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1799 @ if (TCD_Current_Thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1800 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1801 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1802 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1803 LDR r3,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1804 CMP r3,#0 @ Check to see if it is non-NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1805 BEQ TCT_Skip_Unprot_Spec @ If NULL, skip unprotect specific |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1806 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1807 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1808 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1809 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1810 ORR r1,r1,#LOCKOUT @ Place lockout value in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1811 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1812 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1813 @ Clear the protection pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1814 @ protect -> tc_tcb_pointer = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1815 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1816 MOV r2,#0 @ Build NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1817 STR r2,[r0, #0] @ Clear protection ownership |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1818 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1819 @ Determine if a thread is waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1820 @ if (protect -> tc_thread_waiting) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1821 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1822 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1823 LDR r1,[r0, #4] @ Pickup the waiting field |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1824 CMP r1,#0 @ Is there another thread waiting? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1825 BEQ TCT_Not_Waiting_Unspec @ No, restore interrupts and return |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1826 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1827 @ A higher-priority thread is waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1828 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1829 @ Save a minimal context of the thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1830 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1831 STMDB r13!,{r4-r12,r14} @ Save minimal context of thread on |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1832 @ the current stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1833 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1834 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1835 MOV r2,r14 @ Determine what state the caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1836 MOV r2,r2,LSL #31 @ was in and build an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1837 MOV r2,r2,LSR #26 @ appropriate state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1838 STR r2,[r13, #-4]! @ Place it on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1839 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1840 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1841 MOV r2,#0 @ Build solicited stack type value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1842 @ and NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1843 STR r2,[r13, #-4]! @ Place it on the top of the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1844 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1845 @ Setup a pointer to the thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1846 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1847 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1848 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1849 LDR r0,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1850 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1851 @ Clear the current thread control block pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1852 @ TCD_Current_Thread = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1853 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1854 LDR r3,Slice_State @ Pickup time slice state address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1855 STR r2,[r1, #0] @ Set current thread pointer to |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1856 @ NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1857 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1858 @ Check to see if a time slice is active. If so, copy the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1859 @ original time slice into the current time slice field of the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1860 @ thread's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1861 @ if (TMD_Time_Slice_State == 0) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1862 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1863 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1864 LDR r1,[r3, #0] @ Pickup time slice state flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1865 CMP r1,#0 @ Compare with active value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1866 BNE TCT_No_Stop_TS_3 @ If non-active, don't disable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1867 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1868 @ Insure that the next time the task runs it gets a fresh time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1869 @ slice. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1870 @ REG_Thread_Ptr -> tc_cur_time_slice = |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1871 @ REG_Thread_Ptr -> tc_time_slice; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1872 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1873 LDR r1,[r0, #0x40] @ Pickup original time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1874 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1875 @ Clear any active time slice by setting the state to |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1876 @ NOT_ACTIVE. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1877 @ TMD_Time_Slice_State = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1878 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1879 MOV r2,#1 @ Build disable value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1880 STR r2,[r3, #0] @ Disable time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1881 STR r1,[r0, #0x20] @ Reset current time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1882 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1883 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1884 TCT_No_Stop_TS_3: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1885 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1886 @ Save off the current stack pointer in the control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1887 @ REG_Thread_Ptr -> tc_stack_pointer = (VOID *) REG_Stack_Ptr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1888 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1889 STR r13,[r0, #0x2c] @ Save the thread's stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1890 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1891 @ Switch to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1892 @ REG_Stack_Ptr = TCD_System_Stack; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1893 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1894 LDR r1,System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1895 LDR r2,System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1896 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1897 LDR r10,[r2, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1898 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1899 @ Finished, return to the scheduling loop. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1900 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1901 B TCT_Schedule @ Return to scheduling loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1902 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1903 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1904 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1905 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1906 TCT_Not_Waiting_Unspec: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1907 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1908 @ No higher-priority thread is waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1909 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1910 @ Restore interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1911 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1912 LDR r2,Int_Level @ Pickup address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1913 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1914 LDR r3,[r2, #0] @ Pickup interrupt lockout level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1915 BIC r1,r1,#LOCK_MSK @ Clear lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1916 ORR r1,r1,r3 @ Build new interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1917 MSR CPSR,r1 @ Setup CPSR appropriately |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1918 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1919 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1920 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1921 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1922 TCT_Skip_Unprot_Spec: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1923 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1924 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1925 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1926 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1927 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1928 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1929 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1930 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1931 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1932 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1933 * TCT_Set_Current_Protect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1934 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1935 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1936 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1937 * This function sets the current protection field of the current |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1938 * thread's control block to the specified protection pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1939 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1940 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1941 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1942 * TCC_Resume_Task Resume task function |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1943 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1944 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1945 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1946 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1947 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1948 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1949 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1950 * protect Pointer to protection block |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1951 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1952 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1953 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1954 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1955 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1956 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1957 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1958 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1959 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1960 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1961 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1962 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1963 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1964 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1965 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1966 @VOID TCT_Set_Current_Protect(TC_PROTECT *protect) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1967 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1968 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1969 .globl TCT_Set_Current_Protect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1970 TCT_Set_Current_Protect: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1971 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1972 @ Determine if the caller is in a task or HISR thread. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1973 @ if (TCD_Current_Thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1974 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1975 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1976 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1977 LDR r3,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1978 CMP r3,#0 @ Check to see if a thread is |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1979 @ active |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1980 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1981 @ Point at the current thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1982 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1983 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1984 @ Modify the current protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1985 @ REG_Thread_Ptr -> tc_current_protect = protect; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1986 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1987 STRNE r0,[r3, #0x38] @ Setup new protection |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1988 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1989 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1990 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1991 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1992 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1993 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1994 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1995 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1996 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1997 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1998 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1999 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2000 * TCT_Protect_Switch |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2001 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2002 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2003 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2004 * This function waits until a specific task no longer has any |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2005 * protection associated with it. This is necessary since task's |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2006 * cannot be suspended or terminated unless they have released all |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2007 * of their protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2008 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2009 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2010 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2011 * System Components |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2012 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2013 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2014 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2015 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2016 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2017 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2018 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2019 * thread Pointer to thread control blk |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2020 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2021 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2022 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2023 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2024 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2025 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2026 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2027 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2028 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2029 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2030 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2031 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2032 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2033 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2034 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2035 @VOID TCT_Protect_Switch(VOID *thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2036 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2037 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2038 .globl TCT_Protect_Switch |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2039 TCT_Protect_Switch: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2040 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2041 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2042 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2043 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2044 ORR r1,r1,#LOCKOUT @ Place lockout value in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2045 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2046 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2047 @ REG_Thread_Ptr = (TC_TCB *) thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2048 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2049 @ Wait until the specified task has no protection associated with it. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2050 @ while (REG_Thread_Ptr -> tc_current_protect) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2051 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2052 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2053 LDR r1,[r0, #0x38] @ Pickup protection of specified |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2054 @ thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2055 CMP r1,#0 @ Does the specified thread have |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2056 @ an active protection? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2057 BEQ TCT_Switch_Done @ If not, protect switch is done |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2058 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2059 @ Let the task run again in an attempt to clear its protection. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2060 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2061 @ Indicate that a higher priority thread is waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2062 @ (REG_Thread_Ptr -> tc_current_protect) -> tc_thread_waiting = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2063 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2064 MOV r2,#1 @ Build waiting flag value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2065 STR r2,[r1, #4] @ Set waiting flag of the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2066 @ protection owned by the other |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2067 @ thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2068 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2069 @ Directly schedule the thread waiting. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2070 @ TCT_Schedule_Protected((REG_Thread_Ptr -> tc_current_protect) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2071 @ -> tc_tcb_pointer); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2072 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2073 LDR r2,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2074 STR r0,[r13, #-4]! @ Save r0 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2075 STR r14,[r13, #-4]! @ Save r14 on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2076 MOV r1,r0 @ Move new thread into r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2077 LDR r0,[r2, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2078 BL TCT_Schedule_Protected @ Call routine to schedule the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2079 @ owner of the thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2080 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2081 LDR r14,[r13], #4 @ Recover saved r14 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2082 LDR r0,[r13], #4 @ Recover saved r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2083 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2084 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2085 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2086 B TCT_Protect_Switch @ Branch to top of routine and |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2087 @ start over |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2088 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2089 TCT_Switch_Done: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2090 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2091 @ Restore interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2092 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2093 LDR r2,Int_Level @ Pickup address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2094 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2095 LDR r3,[r2, #0] @ Pickup interrupt lockout level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2096 BIC r1,r1,#LOCK_MSK @ Clear lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2097 ORR r1,r1,r3 @ Build new interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2098 MSR CPSR,r1 @ Setup CPSR appropriately |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2099 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2100 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2101 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2102 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2103 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2104 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2105 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2106 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2107 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2108 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2109 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2110 * TCT_Schedule_Protected |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2111 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2112 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2113 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2114 * This function saves the minimal context of the thread and then |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2115 * directly schedules the thread that has protection over the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2116 * the thread that called this routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2117 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2118 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2119 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2120 * TCT_Protect |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2121 * TCT_Protect_Switch |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2122 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2123 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2124 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2125 * TCT_Control_To_Thread Transfer control to protected |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2126 * thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2127 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2128 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2129 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2130 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2131 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2132 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2133 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2134 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2135 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2136 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2137 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2138 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2139 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2140 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2141 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2142 * C. Meredith 03-01-1994 Corrected problem in time-slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2143 * reset logic, resulting in |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2144 * version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2145 * D. Lamie 03-18-1994 Verified version 1.1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2146 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2147 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2148 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2149 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2150 @VOID TCT_Schedule_Protected(VOID *thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2151 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2152 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2153 .globl TCT_Schedule_Protected |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2154 TCT_Schedule_Protected: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2155 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2156 @ Interrupts are already locked out by the caller. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2157 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2158 @ Save minimal context required by the system. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2159 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2160 STMDB r13!,{r4-r12,r14} @ Save minimal context of thread on |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2161 @ the current stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2162 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2163 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2164 MOV r2,r14 @ Determine what state the caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2165 MOV r2,r2,LSL #31 @ was in and build an |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2166 MOV r2,r2,LSR #26 @ appropriate state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2167 STR r2,[r13, #-4]! @ Place it on the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2168 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2169 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2170 MOV r2,#0 @ Build solicited stack type value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2171 @ and NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2172 STR r2,[r13, #-4]! @ Place it on the top of the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2173 MOV r4,r1 @ Save thread to schedule |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2174 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2175 @ Setup a pointer to the thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2176 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2177 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2178 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2179 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2180 @ Clear the current thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2181 @ TCD_Current_Thread = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2182 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2183 LDR r3,Slice_State @ Pickup time slice state address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2184 STR r2,[r1, #0] @ Set current thread pointer to |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2185 @ NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2186 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2187 @ Check to see if a time slice is active. If so, copy the original time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2188 @ slice into the current time slice field of the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2189 @ if (TMD_Time_Slice_State == 0) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2190 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2191 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2192 LDR r1,[r3, #0] @ Pickup time slice state flag |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2193 CMP r1,#0 @ Compare with active value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2194 BNE TCT_No_Stop_TS_4 @ If non-active, don't disable |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2195 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2196 @ Insure that the next time the task runs it gets a fresh time |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2197 @ slice. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2198 @ REG_Thread_Ptr -> tc_cur_time_slice = REG_Thread_Ptr -> tc_time_slice; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2199 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2200 LDR r1,[r0, #0x40] @ Pickup original time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2201 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2202 @ Clear any active time slice by setting the state to NOT_ACTIVE. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2203 @ TMD_Time_Slice_State = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2204 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2205 MOV r2,#1 @ Build disable value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2206 STR r2,[r3, #0] @ Disable time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2207 STR r1,[r0, #0x20] @ Reset current time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2208 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2209 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2210 TCT_No_Stop_TS_4: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2211 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2212 @ Save off the current stack pointer in the control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2213 @ REG_Thread_Ptr -> tc_stack_pointer = (VOID *) REG_Stack_Ptr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2214 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2215 STR r13,[r0, #0x2c] @ Save the thread's stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2216 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2217 @ Switch to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2218 @ TCD_System_Stack = (VOID *) REG_Stack_Ptr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2219 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2220 LDR r1,System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2221 LDR r2,System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2222 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2223 LDR r10,[r2, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2224 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2225 @ Transfer control to the specified thread directly. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2226 @ TCT_Control_To_Thread(thread); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2227 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2228 LDR r2,Int_Level @ Pickup address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2229 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2230 LDR r3,[r2, #0] @ Pickup interrupt lockout level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2231 BIC r1,r1,#LOCK_MSK @ Clear lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2232 ORR r1,r1,r3 @ Build new interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2233 MOV r0,r4 @ Indicate thread to schedule |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2234 MSR CPSR,r1 @ Setup CPSR appropriately |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2235 ORR r1,r1,#LOCKOUT @ Build lockout value again |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2236 MSR CPSR,r1 @ Lockout interrupts again |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2237 B TCT_Control_To_Thread @ Schedule the thread indirectly |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2238 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2239 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2240 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2241 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2242 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2243 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2244 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2245 * TCT_Interrupt_Context_Save |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2246 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2247 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2248 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2249 * This function saves the interrupted thread's context. Nested |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2250 * interrupts are also supported. If a task or HISR thread was |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2251 * interrupted, the stack pointer is switched to the system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2252 * after the context is saved. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2253 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2254 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2255 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2256 * Application ISRs Assembly language ISRs |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2257 * INT_Interrupt_Shell Interrupt handler shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2258 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2259 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2260 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2261 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2262 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2263 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2264 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2265 * vector Interrupt's vector number |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2266 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2267 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2268 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2269 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2270 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2271 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2272 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2273 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2274 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2275 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2276 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2277 * D. Driscoll 01-04-2002 Released version 1.13.3. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2278 * Updated to handle nested / |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2279 * prioritized IRQs |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2280 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2281 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2282 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2283 @VOID TCT_Interrupt_Context_Save(INT vector) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2284 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2285 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2286 .globl TCT_Interrupt_Context_Save |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2287 TCT_Interrupt_Context_Save: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2288 @ Determine if this is a nested interrupt. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2289 LDR r1,Int_Count @ Pickup address of interrupt count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2290 LDR r2,[r1, #0] @ Pickup interrupt counter |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2291 ADD r2,r2,#1 @ Add 1 to interrupt counter |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2292 STR r2,[r1, #0] @ Store new interrupt counter value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2293 CMP r2,#1 @ Is it nested? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2294 BEQ TCT_Not_Nested_Save @ No |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2295 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2296 @ Nested interrupt. Save complete context on the current stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2297 TCT_Nested_Save: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2298 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2299 /* No longer needed in the FreeCalypso version, as we can use r0 instead. */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2300 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2301 @ 1. Save another register on the exception stack so we have enough to work with |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2302 STMDB r13!,{r5} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2303 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2304 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2305 @ 2. Save the necessary exception registers into r1-r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2306 MOV r1,r13 @ Put the exception r13 into r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2307 MOV r2,r14 @ Move the return address for the caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2308 @ of this function into r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2309 MRS r3,spsr @ Put the exception spsr into r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2310 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2311 @ 3. Adjust the exception stack pointer for future exceptions |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2312 ADD r13,r13,#20 @ r13 reset to pre-interrupt value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2313 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2314 @ 4. Switch CPU modes to save context on system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2315 MRS r0,CPSR @ Pickup the current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2316 BIC r0,r0,#MODE_MASK @ Clear the mode bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2317 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2318 ORR r0,r0,#SUP_MODE @ Change to supervisor mode (SVD) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2319 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2320 MSR CPSR,r0 @ Switch modes (IRQ->SVC) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2321 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2322 @ 5. Store the SVC r13 into r5 so the r13 can be saved as is. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2323 @ FreeCalyspo: using r0 instead |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2324 MOV r0,r13 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2325 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2326 @ 6. Save the exception return address on the stack (r15). |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2327 STMDB r0!,{r4} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2328 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2329 @ 7. Save r5-r14 on stack (used to be r6-r14) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2330 STMDB r0!,{r5-r14} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2331 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2332 @ 8. Switch back to using r13 now that the original r13 has been saved. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2333 MOV r13,r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2334 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2335 /* no longer relevant */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2336 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2337 @ 9. Get r5 and exception enable registers off of exception stack and |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2338 @ save r5 (stored in r4) back to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2339 LDMIA r1!,{r4-r5} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2340 STMDB r13!,{r4} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2341 MOV r4,r5 @ Put exception enable value into r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2342 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2343 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2344 @ 10. Get the rest of the registers off the exception stack and |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2345 @ save them onto the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2346 LDMIA r1!,{r5-r8,r11} @ Get r0-r4 off exception stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2347 STMDB r13!,{r5-r8,r11} @ Put r0-r4 on system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2348 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2349 /* no longer relevant */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2350 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2351 @ 11. Store the exception enable value back on the exception stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2352 STMDB r1,{r4} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2353 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2354 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2355 @ 12. Save the SPSR on the system stack (CPSR) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2356 STMDB r13!,{r3} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2357 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2358 /* TI's approach to interrupt handling does not support re-enabling here */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2359 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2360 @ 13. Re-enable interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2361 MRS r1,CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2362 BIC r1,r1,#(IRQ_BIT_OR_FIQ_BIT) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2363 MSR CPSR,r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2364 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2365 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2366 BX r2 @ Return to calling ISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2367 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2368 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2369 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2370 TCT_Not_Nested_Save: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2371 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2372 @ Determine if a thread was interrupted. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2373 @ if (TCD_Current_Thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2374 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2375 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2376 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2377 LDR r1,[r1, #0] @ Pickup the current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2378 CMP r1,#0 @ Is it NU_NULL? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2379 BEQ TCT_Idle_Context_Save @ If no, no real save is necessary |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2380 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2381 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2382 @ Yes, a thread was interrupted. Save complete context on the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2383 @ thread's stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2384 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2385 /* No longer needed in the FreeCalypso version, as we can use r0 instead. */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2386 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2387 @ 1. Save another register on the exception stack so we have enough to work with |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2388 STMDB r13!,{r5} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2389 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2390 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2391 @ 2. Save the necessary exception registers into r1-r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2392 MOV r1,r13 @ Put the exception r13 into r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2393 MOV r2,r14 @ Move the return address for the caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2394 @ of this function into r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2395 MRS r3,spsr @ Put the exception spsr into r3 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2396 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2397 @ 3. Adjust the exception stack pointer for future exceptions |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2398 ADD r13,r13,#20 @ r13 reset to pre-interrupt value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2399 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2400 @ 4. Switch CPU modes to save context on system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2401 MRS r0,CPSR @ Pickup the current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2402 BIC r0,r0,#MODE_MASK @ Clear the mode bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2403 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2404 ORR r0,r0,#SUP_MODE @ Change to supervisor mode (SVD) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2405 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2406 MSR CPSR,r0 @ Switch modes (IRQ->SVC) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2407 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2408 @ 5. Store the SVC r13 into r5 so the r13 can be saved as is. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2409 @ FreeCalyspo: using r0 instead |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2410 MOV r0,r13 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2411 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2412 @ 6. Save the exception return address on the stack (r15). |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2413 STMDB r0!,{r4} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2414 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2415 @ 7. Save r5-r14 on stack (used to be r6-r14) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2416 STMDB r0!,{r5-r14} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2417 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2418 @ 8. Switch back to using r13 now that the original r13 has been saved. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2419 MOV r13,r0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2420 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2421 /* no longer relevant */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2422 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2423 @ 9. Get r5 and exception enable registers off of exception stack and |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2424 @ save r5 (stored in r4) back to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2425 LDMIA r1!,{r4-r5} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2426 STMDB r13!,{r4} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2427 MOV r4,r5 @ Put exception enable value into r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2428 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2429 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2430 @ 10. Get the rest of the registers off the exception stack and |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2431 @ save them onto the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2432 LDMIA r1!,{r5-r8,r11} @ Get r0-r4 off exception stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2433 STMDB r13!,{r5-r8,r11} @ Put r0-r4 on system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2434 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2435 /* no longer relevant */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2436 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2437 @ 11. Store the exception enable value back on the exception stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2438 STMDB r1,{r4} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2439 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2440 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2441 @ 12. Save the SPSR on the system stack (CPSR) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2442 STMDB r13!,{r3} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2443 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2444 @ 13. Save stack type to the task stack (1=interrupt stack) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2445 MOV r1,#1 @ Interrupt stack type |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2446 STMDB r13!,{r1} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2447 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2448 @ Save the thread's stack pointer in the control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2449 @ REG_Thread_Ptr = (TC_TCB *) TCD_Current_Thread |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2450 @ REG_Thread_Ptr -> tc_stack_pointer = (VOID *) REG_Stack_Ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2451 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2452 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2453 LDR r3,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2454 STR r13,[r3, #TC_STACK_POINTER] @ Save stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2455 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2456 @ Switch to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2457 @ REG_Stack_Ptr = TCD_System_Stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2458 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2459 LDR r1,System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2460 LDR r3,System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2461 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2462 LDR r10,[r3, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2463 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2464 /* TI's approach to interrupt handling does not support re-enabling here */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2465 #if 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2466 @ Re-enable interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2467 MRS r1,CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2468 BIC r1,r1,#(IRQ_BIT_OR_FIQ_BIT) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2469 MSR CPSR,r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2470 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2471 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2472 @ Return to caller ISR. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2473 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2474 BX r2 @ Return to caller ISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2475 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2476 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2477 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2478 TCT_Idle_Context_Save: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2479 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2480 MOV r2,r14 @ Save r14 in r2 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2481 @ LDR r3,[r13] @ Get exception enable value from stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2482 ADD r13,r13,#20 @ Adjust exception r13 for future interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2483 @ STR r3,[r13] @ Put exception enable value back on stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2484 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2485 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2486 BIC r1,r1,#MODE_MASK @ Clear the current mode |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2487 @ BIC r1,r1,#(IRQ_BIT_OR_FIQ_BIT) @ Re-enable interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2488 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2489 ORR r1,r1,#SUP_MODE @ Prepare to switch to supervisor |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2490 @ mode (SVC) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2491 MSR CPSR,r1 @ Switch to supervisor mode (SVC) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2492 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2493 BX r2 @ Return to caller ISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2494 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2495 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2496 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2497 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2498 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2499 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2500 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2501 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2502 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2503 * TCT_Interrupt_Context_Restore |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2504 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2505 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2506 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2507 * This function restores the interrupt context if a nested |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2508 * interrupt condition is present. Otherwise, this routine |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2509 * transfers control to the scheduling function. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2510 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2511 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2512 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2513 * Application ISRs Assembly language ISRs |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2514 * INT_Interrupt_Shell Interrupt handler shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2515 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2516 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2517 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2518 * TCT_Schedule Thread scheduling function |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2519 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2520 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2521 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2522 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2523 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2524 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2525 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2526 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2527 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2528 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2529 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2530 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2531 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2532 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2533 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2534 * D. Driscoll 01-04-2002 Released version 1.13.3. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2535 * Updated to handle nested / |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2536 * prioritized IRQs |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2537 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2538 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2539 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2540 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2541 @VOID TCT_Interrupt_Context_Restore(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2542 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2543 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2544 .globl TCT_Interrupt_Context_Restore |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2545 TCT_Interrupt_Context_Restore: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2546 @ It is assumed that anything pushed on the stack by ISRs has been |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2547 @ removed upon entry into this routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2548 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2549 @ Decrement and check for nested interrupt conditions. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2550 @ if (--TCD_Interrupt_Count) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2551 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2552 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2553 LDR r1,Int_Count @ Pickup address of interrupt count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2554 LDR r2,[r1, #0] @ Pickup interrupt counter |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2555 SUB r2,r2,#1 @ Decrement interrupt counter |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2556 STR r2,[r1, #0] @ Store interrupt counter |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2557 CMP r2,#0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2558 BEQ TCT_Not_Nested_Restore |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2559 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2560 @ Restore previous context. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2561 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2562 LDR r1,[r13], #4 @ Pickup the saved CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2563 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2564 MSR SPSR,r1 @ Place into saved SPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2565 LDMIA r13,{r0-r15}^ @ Return to the point of interrupt |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2566 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2567 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2568 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2569 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2570 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2571 TCT_Not_Nested_Restore: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2572 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2573 @ Determine if a thread is active. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2574 @ if (TCD_Current_Thread) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2575 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2576 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2577 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2578 LDR r0,[r1, #0] @ Pickup current thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2579 CMP r0,#0 @ Determine if a thread is active |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2580 BEQ TCT_Idle_Context_Restore @ If not, idle system restore |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2581 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2582 @ Clear the current thread pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2583 @ TCD_Current_Thread = NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2584 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2585 MOV r2,#0 @ Build NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2586 STR r2,[r1, #0] @ Set current thread ptr to NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2587 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2588 @ Determine if a time slice is active. If so, the remaining |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2589 @ time left on the time slice must be saved in the task's |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2590 @ control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2591 @ if (TMD_Time_Slice_State == 0) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2592 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2593 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2594 LDR r3,Slice_State @ Pickup time slice state address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2595 LDR r1,[r3, #0] @ Pickup time slice state |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2596 CMP r1,#0 @ Determine if time slice active |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2597 BNE TCT_Idle_Context_Restore @ If not, skip time slice reset |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2598 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2599 @ Pickup the remaining portion of the time slice and save it |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2600 @ in the task's control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2601 @ REG_Thread_Ptr -> tc_cur_time_slice = TMD_Time_Slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2602 @ TMD_Time_Slice_State = 1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2603 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2604 LDR r2,Time_Slice @ Pickup address of time slice left |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2605 MOV r1,#1 @ Build disable time slice value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2606 LDR r2,[r2, #0] @ Pickup remaining time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2607 STR r1,[r3, #0] @ Disable time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2608 STR r2,[r0, #TC_CUR_TIME_SLICE] @ Store remaining time slice |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2609 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2610 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2611 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2612 TCT_Idle_Context_Restore: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2613 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2614 @ Reset the system stack pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2615 LDR r1,System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2616 LDR r2,System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2617 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2618 LDR r10,[r2, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2619 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2620 @ Return to scheduler. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2621 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2622 B TCT_Schedule @ Return to scheduling loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2623 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2624 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2625 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2626 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2627 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2628 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2629 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2630 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2631 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2632 * TCT_Activate_HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2633 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2634 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2635 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2636 * This function activates the specified HISR. If the HISR is |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2637 * already activated, the HISR's activation count is simply |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2638 * incremented. Otherwise, the HISR is placed on the appropriate |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2639 * HISR priority list in preparation for execution. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2640 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2641 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2642 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2643 * Application LISRs |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2644 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2645 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2646 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2647 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2648 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2649 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2650 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2651 * hisr Pointer to HISR to activate |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2652 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2653 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2654 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2655 * NU_SUCCESS Successful completion |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2656 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2657 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2658 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2659 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2660 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2661 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2662 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2663 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2664 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2665 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2666 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2667 @STATUS TCT_Activate_HISR(TC_HCB *hisr) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2668 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2669 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2670 .globl TCT_Activate_HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2671 TCT_Activate_HISR: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2672 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2673 @INT priority; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2674 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2675 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2676 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2677 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2678 STR r4,[r13, #-4]! @ Save r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2679 MRS r4,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2680 ORR r1,r4,#LOCKOUT @ Build interrupt lockout value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2681 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2682 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2683 @ Determine if the HISR is already active. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2684 @ if (hisr -> tc_activation_count) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2685 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2686 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2687 LDR r1,[r0,#0x40] @ Pickup current activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2688 CMP r1,#0 @ Is it the first activation? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2689 BEQ TCT_First_Activate @ Yes, place it on the correct list |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2690 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2691 @ Increment the activation count. Make sure that it does not go |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2692 @ to zero. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2693 @ hisr -> tc_activation_count++; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2694 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2695 ADDS r1,r1,#1 @ Increment the activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2696 STR r1,[r0,#0x40] @ Store new activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2697 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2698 @ if (hisr -> tc_activation_count == 0) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2699 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2700 @ hisr -> tc_activation_count = 0xFFFFFFFFUL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2701 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2702 MVNEQ r1,#0 @ If counter rolled-over reset |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2703 STREQ r1,[r0,#0x40] @ Store all ones count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2704 B TCT_Activate_Done @ Finished with activation |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2705 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2706 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2707 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2708 TCT_First_Activate: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2709 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2710 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2711 @ Set the activation count to 1. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2712 @ hisr -> tc_activation_count = 1; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2713 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2714 MOV r1,#1 @ Initial activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2715 STR r1,[r0,#0x40] @ Store initial activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2716 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2717 @ Pickup the HISR's priority. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2718 @ priority = hisr -> tc_priority; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2719 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2720 @ Determine if there is something in the given priority list. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2721 @ if (TCD_Active_HISR_Tails[priority]) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2722 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2723 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2724 LDRB r1,[r0,#0x1a] @ Pickup priority of HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2725 LDR r2,HISR_Tails @ Pickup tail pointer base |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2726 LDR r3,[r2,r1,LSL #2] @ Pickup tail pointer for priority |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2727 CMP r3,#0 @ Is this first HISR at priority? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2728 BEQ TCT_First_HISR @ No, append to end of HISR list |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2729 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2730 @ Something is already on this list. Add after the tail. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2731 @ (TCD_Active_HISR_Tails[priority]) -> tc_active_next = hisr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2732 @ TCD_Active_HISR_Tails[priority] = hisr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2733 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2734 STR r0,[r3,#0x3c] @ Setup the active next pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2735 STR r0,[r2,r1,LSL #2] @ Setup the tail pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2736 B TCT_Activate_Done @ Finished with activate processing |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2737 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2738 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2739 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2740 TCT_First_HISR: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2741 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2742 @ Nothing is on this list. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2743 @ TCD_Active_HISR_Heads[priority] = hisr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2744 @ TCD_Active_HISR_Tails[priority] = hisr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2745 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2746 LDR r3,HISR_Heads @ Pickup address of head pointers |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2747 STR r0,[r2,r1,LSL #2] @ Set tail pointer to this HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2748 STR r0,[r3,r1,LSL #2] @ Set head pointer to this HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2749 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2750 @ Determine the highest priority HISR. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2751 @ if (TCD_Active_HISR_Heads[0]) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2752 @ TCD_Execute_HISR = TCD_Active_HISR_Heads[0]; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2753 @ else if (TCD_Active_HISR_Heads[1]) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2754 @ TCD_Execute_HISR = TCD_Active_HISR_Heads[1]; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2755 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2756 @ TCD_Execute_HISR = TCD_Active_HISR_Heads[2]; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2757 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2758 LDR r1,[r3,#0] @ Pickup priority 0 head pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2759 LDR r0,Execute_HISR @ Build address to execute HISR ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2760 CMP r1,#0 @ Is priority 0 active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2761 LDREQ r1,[r3,#4] @ If not, pickup priority 1 head |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2762 CMPEQ r1,#0 @ Is priority 1 active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2763 LDREQ r1,[r3,#8] @ Else, must be priority 2 active |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2764 STR r1,[r0,#0] @ Store which ever priority is the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2765 @ active one |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2766 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2767 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2768 TCT_Activate_Done: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2769 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2770 MSR CPSR,r4 @ Restore interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2771 LDR r4,[r13], #4 @ Restore corrupted r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2772 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2773 @ return(NU_SUCCESS); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2774 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2775 MOV r0,#0 @ Always return NU_SUCCESS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2776 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2777 BX r14 @ Return to caller |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2778 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2779 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2780 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2781 /* |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2782 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2783 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2784 * FUNCTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2785 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2786 * TCT_HISR_Shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2787 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2788 * DESCRIPTION |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2789 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2790 * This function is the execution shell of each and every HISR. If |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2791 * the HISR has completed its processing, this shell routine exits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2792 * back to the system. Otherwise, it sequentially calls the HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2793 * routine until the activation count goes to zero. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2794 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2795 * CALLED BY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2796 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2797 * HISR Scheduling |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2798 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2799 * CALLS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2800 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2801 * hisr -> tc_entry Actual entry function of HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2802 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2803 * INPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2804 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2805 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2806 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2807 * OUTPUTS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2808 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2809 * None |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2810 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2811 * HISTORY |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2812 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2813 * NAME DATE REMARKS |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2814 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2815 * W. Lamie 02-15-1994 Created initial version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2816 * D. Lamie 02-15-1994 Verified version 1.0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2817 * |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2818 ************************************************************************ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2819 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2820 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2821 @VOID TCT_HISR_Shell(void) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2822 @{ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2823 .globl TCT_HISR_Shell |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2824 TCT_HISR_Shell: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2825 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2826 @ Point at the HISR. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2827 @ REG_HISR_Ptr = (TC_HCB *) TCD_Current_Thread; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2828 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2829 LDR r0,Current_Thread @ Build address of thread pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2830 LDR r5,[r0, #0] @ Pickup control block pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2831 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2832 @ do |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2833 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2834 TCT_HISR_Loop: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2835 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2836 @ Call the HISR's entry routine. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2837 @ (*(REG_HISR_Ptr -> tc_entry)) (); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2838 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2839 /* old TMS470 code: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2840 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2841 .if THUMB = 0 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2842 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2843 MOV r14,r15 ; Setup return value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2844 LDR r15,[r5,#44h] ; Call HISR entry function |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2845 .else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2846 LDR r4,[r5,#44h] ; Get HISR entry function |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2847 TST r4,#1 ; See if calling Thumb or ARM |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2848 BNE Thumbsec |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2849 MOV r14,r15 ; Setup return value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2850 BX r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2851 B ARMCODE |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2852 Thumbsec: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2853 ADD r14, r15, #1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2854 BX r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2855 .state16 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2856 ThumbAfterHisr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2857 MOV r1, r15 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2858 BX r1 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2859 .state32 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2860 .endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2861 */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2862 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2863 /* new code for the GNU style of ARM/Thumb interworking */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2864 ldr r4, [r5, #TC_HISR_ENTRY] |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2865 mov lr, pc |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2866 bx r4 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2867 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2868 @ Lockout interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2869 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2870 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2871 ORR r1,r1,#LOCKOUT @ Build interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2872 MSR CPSR,r1 @ Lockout interrupts |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2873 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2874 @ On return, decrement the activation count and check to see if |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2875 @ it is 0. Once it reaches 0, the HISR should be made inactive. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2876 @ REG_HISR_Ptr -> tc_activation_count--; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2877 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2878 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2879 LDR r0,[r5, #0x40] @ Pickup current activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2880 SUBS r0,r0,#1 @ Subtract and set condition codes |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2881 STR r0,[r5, #0x40] @ Store new activation count |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2882 BEQ TCT_HISR_Finished @ Finished processing HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2883 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2884 @ Restore interrupts. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2885 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2886 LDR r2,Int_Level @ Pickup address of interrupt level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2887 MRS r1,CPSR @ Pickup current CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2888 LDR r3,[r2, #0] @ Pickup interrupt lockout level |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2889 BIC r1,r1,#LOCK_MSK @ Clear lockout bits |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2890 ORR r1,r1,r3 @ Build new interrupt lockout |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2891 MSR CPSR,r1 @ Setup CPSR appropriately |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2892 B TCT_HISR_Loop @ Return to HISR loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2893 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2894 @ while (REG_HISR_Ptr -> tc_activation_count); |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2895 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2896 TCT_HISR_Finished: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2897 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2898 @ At this point, the HISR needs to be made inactive. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2899 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2900 @ Determine if this is the only HISR on the given priority list. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2901 @ if (REG_HISR_Ptr == TCD_Active_HISR_Tails[REG_HISR_Ptr -> tc_priority]) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2902 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2903 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2904 LDR r14,HISR_Tails @ Pickup tail pointers address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2905 LDRB r3,[r5,#0x1a] @ Pickup priority |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2906 LDR r6,[r14,r3,LSL #2] @ Pickup this priority tail pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2907 LDR r2,Execute_HISR @ Build address to execute HISR ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2908 MOV r12,#0 @ Clear r12 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2909 LDR r1,HISR_Heads @ Pickup head pointers address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2910 CMP r6,r5 @ Is this priority tail the same as |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2911 @ the current HISR? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2912 BNE TCT_More_HISRs @ If not, more HISRs at this |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2913 @ priority |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2914 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2915 @ The only HISR on the list. Clean up the list and check for the |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2916 @ highest priority HISR. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2917 @ TCD_Active_HISR_Heads[REG_HISR_Ptr -> tc_priority] = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2918 @ TCD_Active_HISR_Tails[REG_HISR_Ptr -> tc_priority] = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2919 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2920 STR r12,[r1,r3,LSL #2] @ Set head pointer to NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2921 STR r12,[r14,r3,LSL #2] @ Set tail pointer to NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2922 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2923 @ Determine the highest priority HISR. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2924 @ if (TCD_Active_HISR_Heads[0]) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2925 @ TCD_Execute_HISR = TCD_Active_HISR_Heads[0]; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2926 @ else if (TCD_Active_HISR_Heads[1]) |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2927 @ TCD_Execute_HISR = TCD_Active_HISR_Heads[1]; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2928 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2929 @ TCD_Execute_HISR = TCD_Active_HISR_Heads[2]; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2930 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2931 LDR r3,[r1,#0] @ Pickup priority 0 head pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2932 CMP r3,#0 @ Is there an HISR active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2933 LDREQ r3,[r1,#4] @ If not, pickup priority 1 pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2934 CMPEQ r3,#0 @ Is there an HISR active? |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2935 LDREQ r3,[r1,#8] @ If not, pickup priority 2 pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2936 STR r3,[r2,#0] @ Setup execute HISR pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2937 B TCT_HISR_Exit @ Exit HISR processing |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2938 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2939 @ else |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2940 @ { |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2941 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2942 TCT_More_HISRs: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2943 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2944 @ Move the head pointer to the next HISR in the list. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2945 @ TCD_Active_HISR_Heads[REG_HISR_Ptr -> tc_priority] = |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2946 @ REG_HISR_Ptr -> tc_active_next; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2947 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2948 @ Also set the TCD_Execute_HISR pointer. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2949 @ TCD_Execute_HISR = REG_HISR_Ptr -> tc_active_next; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2950 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2951 LDR r14,[r5,#0x3c] @ Pickup next HISR to activate |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2952 STR r14,[r1,r3,LSL #2] @ Setup new head pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2953 STR r14,[r2, #0] @ Setup execute HISR pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2954 @ } |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2955 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2956 TCT_HISR_Exit: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2957 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2958 @ Build fake return to the top of this loop. The next time the HISR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2959 @ is activated, it will return to the top of this function. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2960 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2961 LDR r14,HISR_Shell @ Pickup address of shell entry |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2962 STMDB r13!,{r4-r12,r14} @ Save minimal context of thread on |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2963 @ the current stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2964 MOV r2,#0 @ Build solicited stack type value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2965 @ and NU_NULL value |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2966 #if 1 /* was .if THUMB */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2967 STR r2,[r13, #-4]! @ Save state mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2968 #endif |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2969 STR r2,[r13, #-4]! @ Place it on the top of the stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2970 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2971 @ Clear the current thread control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2972 @ TCD_Current_Thread = NU_NULL; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2973 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2974 LDR r1,Current_Thread @ Pickup current thread ptr address |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2975 STR r2,[r1, #0] @ Set current thread pointer to |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2976 @ NU_NULL |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2977 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2978 @ Save off the current stack pointer in the control block. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2979 @ REG_HISR_Ptr -> tc_stack_pointer = (VOID *) REG_Stack_Ptr; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2980 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2981 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2982 STR r13,[r5, #0x2c] @ Save the thread's stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2983 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2984 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2985 @ Switch to the system stack. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2986 @ REG_Stack_Ptr = (BYTE_PTR) TCD_System_Stack; |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2987 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2988 LDR r1,System_Stack @ Pickup address of stack pointer |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2989 LDR r2,System_Limit @ Pickup address of stack limit ptr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2990 LDR r13,[r1, #0] @ Switch to system stack |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2991 LDR r10,[r2, #0] @ Setup system stack limit |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2992 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2993 @ Transfer control to the main scheduling loop. |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2994 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2995 B TCT_Schedule @ Return to main scheduling loop |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2996 @} |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2997 |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2998 /* FreeCalypso addition, used by riviera/rvf/rvf_task.c: */ |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2999 .globl INT_Check_IRQ_Mask |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3000 INT_Check_IRQ_Mask: |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3001 MRS r0,CPSR |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3002 BX lr |
d076885a0669
src/nucleus/gcc: initial import from Citrine
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3003 |