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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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