summaryrefslogtreecommitdiff
path: root/ports/c667x/ccs/src/tx_thread_schedule.asm
blob: 10d0b3ad46caf631c36c896b4f447702c92428e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
;/***************************************************************************
; * Copyright (c) 2024 Microsoft Corporation
; *
; * This program and the accompanying materials are made available under the
; * terms of the MIT License which is available at
; * https://opensource.org/licenses/MIT.
; *
; * SPDX-License-Identifier: MIT
; **************************************************************************/
;
;
;/**************************************************************************/
;/**************************************************************************/
;/**                                                                       */
;/** ThreadX Component                                                     */
;/**                                                                       */
;/**   Thread                                                              */
;/**                                                                       */
;/**************************************************************************/
;/**************************************************************************/
;
;
;#define TX_SOURCE_CODE
;
;
;/* Include necessary system files.  */
;
;#include "tx_api.h"
;#include "tx_thread.h"
;#include "tx_timer.h"
;
FP          .set    A15
DP          .set    B14
SP          .set    B15
;
;
    .global    _tx_thread_execute_ptr
    .global    _tx_thread_current_ptr
    .global    _tx_timer_time_slice
;
;
    .sect   ".text"
;/**************************************************************************/
;/*                                                                        */
;/*  FUNCTION                                               RELEASE        */
;/*                                                                        */
;/*    _tx_thread_schedule                                 C667x/TI        */
;/*                                                           6.1          */
;/*  AUTHOR                                                                */
;/*                                                                        */
;/*    William E. Lamie, Microsoft Corporation                             */
;/*                                                                        */
;/*  DESCRIPTION                                                           */
;/*                                                                        */
;/*    This function waits for a thread control block pointer to appear in */
;/*    the _tx_thread_execute_ptr variable.  Once a thread pointer appears */
;/*    in the variable, the corresponding thread is resumed.               */
;/*                                                                        */
;/*  INPUT                                                                 */
;/*                                                                        */
;/*    None                                                                */
;/*                                                                        */
;/*  OUTPUT                                                                */
;/*                                                                        */
;/*    None                                                                */
;/*                                                                        */
;/*  CALLS                                                                 */
;/*                                                                        */
;/*    None                                                                */
;/*                                                                        */
;/*  CALLED BY                                                             */
;/*                                                                        */
;/*    _tx_initialize_kernel_enter          ThreadX entry function         */
;/*    _tx_thread_system_return             Return to system from thread   */
;/*    _tx_thread_context_restore           Restore thread's context       */
;/*                                                                        */
;/*  RELEASE HISTORY                                                       */
;/*                                                                        */
;/*    DATE              NAME                      DESCRIPTION             */
;/*                                                                        */
;/*  09-30-2020     William E. Lamie         Initial Version 6.1           */
;/*                                                                        */
;/**************************************************************************/
;VOID   _tx_thread_schedule(VOID)
;{
    .global _tx_thread_schedule
_tx_thread_schedule
;
;    /* Enable interrupts.  */
;
        MVC         CSR,B0                              ; Pickup current CSR
        OR          1,B0,B0                             ; Build interrupt enable value
        MVC         B0,CSR                              ; Enable interrupts
        MVKL        _tx_thread_execute_ptr,A0           ; Build address of execute pointer
        MVKH        _tx_thread_execute_ptr,A0           ;
;
;    /* Wait for a thread to execute.  */
;    do
;    {
;
_tx_thread_schedule_loop:
;
        LDW         *A0,A1                              ; Pickup next thread to execute
        NOP         4                                   ; Delay slots
 [!A1]  B           _tx_thread_schedule_loop            ; If Null, just wait here for thread
                                                        ;   to become ready
        MV          A1,A4                               ; Move thread pointer to A4
        MVKL        _tx_thread_current_ptr,A1           ; Build address of current thread ptr
        MVKH        _tx_thread_current_ptr,A1           ;
        MVKL        _tx_timer_time_slice,A2             ; Build address of time-slice
        MVKH        _tx_timer_time_slice,A2             ;
;
;    }
;    while(_tx_thread_execute_ptr == TX_NULL);
;
;    /* Yes! We have a thread to execute.  Lockout interrupts and
;       transfer control to it.  */
;
        AND         -2,B0,B0                            ; Build interrupt lockout value
        MVC         B0,CSR                              ; Lockout interrupts
;
;    /* Setup the current thread pointer.  */
;    _tx_thread_current_ptr =  _tx_thread_execute_ptr;
;
        LDW         *+A4(4),A3                          ; Pickup run-count
        LDW         *+A4(8),SP                          ; Switch to thread's stack
        LDW         *+A4(24),B1                         ; Pickup time-slice
        STW         A4,*A1                              ; Setup current pointer
        NOP                                             ; Delay
;
;    /* Increment the run count for this thread.  */
;    _tx_thread_current_ptr -> tx_thread_run_count++;
;
        ADD         1,A3,A3                             ; Increment run-counter
        LDW         *+SP(4),B0                          ; Pickup stack-type
        STW         A3,*+A4(4)                          ; Store run-counter
;
;    /* Setup time-slice, if present.  */
;    _tx_timer_time_slice =  _tx_thread_current_ptr -> tx_thread_time_slice;
;
        STW         B1,*A2                              ; Setup time-slice
;
;    /* Switch to the thread's stack.  */
;    SP =  _tx_thread_execute_ptr -> tx_thread_stack_ptr;
;
;    /* Determine if an interrupt frame or a synchronous task suspension frame
;   is present.  */
;
        NOP         2                                   ; Delay slots
 [B0]   B           _tx_thread_interrupt_stack          ; Look for interrupt stack frame
        LDW         *+SP(8),B0                          ; Pickup saved CSR
        LDW         *+SP(12),B3                         ; Pickup saved B3/IPR
        LDW         *+SP(16),B1                         ; Pickup saved AMR
        LDW         *+SP(20),A10                        ; Restore A10
        LDW         *+SP(24),A11                        ; Restore A11
        LDW         *+SP(28),A12                        ; Restore A12
        LDW         *+SP(32),A13                        ; Restore A13
        MVC         B0,CSR                              ; Restore CSR
        MVC         B1,AMR                              ; Restore AMR
        LDW         *+SP(36),A14                        ; Restore A14
        LDW         *+SP(40),A15                        ; Restore A15
        LDW         *+SP(44),B10                        ; Restore B10
        LDW         *+SP(48),B11                        ; Restore B11
        LDW         *+SP(52),B12                        ; Restore B12
        LDW         *+SP(56),B13                        ; Restore B13
        LDW         *+SP(60),B0                         ; Restore ILC
        LDW         *+SP(64),B1                         ; Restore RILC
        NOP         4                                   ; Delay slots
        MVC         B0,ILC                              ; Restore ILC
        MVC         B1,RILC                             ; Restore RILC
        B           B3                                  ; Return to caller
        ADDK        64,SP                               ; Recover stack space
        NOP         4                                   ; Delay slots
;
_tx_thread_interrupt_stack:
        MVC         B0,CSR                              ; Restore CSR
        MVC         B3,IRP                              ; Restore IPR
        MVC         B1,AMR                              ; Restore AMR
        LDW         *+SP(268),B0                        ; Recover saved ILC
        LDW         *+SP(272),B1                        ; Recover saved RILC
        LDW         *+SP(276),B2                        ; Recover saved ITSR
        NOP         4                                   ; Delay
        MVC         B0,ILC                              ; Setup ILC
        MVC         B1,RILC                             ; Setup RILC
        MVC         B2,ITSR                             ; Setup ITSR
        LDW         *+SP(20),A0                         ; Recover A0
        LDW         *+SP(24),A1                         ; Recover A1
        LDW         *+SP(28),A2                         ; Recover A2
        LDW         *+SP(32),A3                         ; Recover A3
        LDW         *+SP(36),A4                         ; Recover A4
        LDW         *+SP(40),A5                         ; Recover A5
        LDW         *+SP(44),A6                         ; Recover A6
        LDW         *+SP(48),A7                         ; Recover A7
        LDW         *+SP(52),A8                         ; Recover A8
        LDW         *+SP(56),A9                         ; Recover A9
        LDW         *+SP(60),A10                        ; Recover A10
        LDW         *+SP(64),A11                        ; Recover A11
        LDW         *+SP(68),A12                        ; Recover A12
        LDW         *+SP(72),A13                        ; Recover A13
        LDW         *+SP(76),A14                        ; Recover A14
        LDW         *+SP(80),A15                        ; Recover A15 (FP)
        LDW         *+SP(84),B0                         ; Recover B0
        LDW         *+SP(88),B1                         ; Recover B1
        LDW         *+SP(92),B2                         ; Recover B2
        LDW         *+SP(96),B3                         ; Recover B3
        LDW         *+SP(100),B4                        ; Recover B4
        LDW         *+SP(104),B5                        ; Recover B5
        LDW         *+SP(108),B6                        ; Recover B6
        LDW         *+SP(112),B7                        ; Recover B7
        LDW         *+SP(116),B8                        ; Recover B8
        LDW         *+SP(120),B9                        ; Recover B9
        LDW         *+SP(124),B10                       ; Recover B10
        LDW         *+SP(128),B11                       ; Recover B11
        LDW         *+SP(140),A16                       ; Recover A16
        LDW         *+SP(144),A17                       ; Recover A17
        LDW         *+SP(148),A18                       ; Recover A18
        LDW         *+SP(152),A19                       ; Recover A19
        LDW         *+SP(156),A20                       ; Recover A20
        LDW         *+SP(160),A21                       ; Recover A21
        LDW         *+SP(164),A22                       ; Recover A22
        LDW         *+SP(168),A23                       ; Recover A23
        LDW         *+SP(172),A24                       ; Recover A24
        LDW         *+SP(176),A25                       ; Recover A25
        LDW         *+SP(180),A26                       ; Recover A26
        LDW         *+SP(184),A27                       ; Recover A27
        LDW         *+SP(188),A28                       ; Recover A28
        LDW         *+SP(192),A29                       ; Recover A29
        LDW         *+SP(196),A30                       ; Recover A30
        LDW         *+SP(200),A31                       ; Recover A31
        LDW         *+SP(204),B16                       ; Recover B16
        LDW         *+SP(208),B17                       ; Recover B17
        LDW         *+SP(212),B18                       ; Recover B18
        LDW         *+SP(216),B19                       ; Recover B19
        LDW         *+SP(220),B20                       ; Recover B20
        LDW         *+SP(224),B21                       ; Recover B21
        LDW         *+SP(228),B22                       ; Recover B22
        LDW         *+SP(232),B23                       ; Recover B23
        LDW         *+SP(236),B24                       ; Recover B24
        LDW         *+SP(240),B25                       ; Recover B25
        LDW         *+SP(244),B26                       ; Recover B26
        LDW         *+SP(248),B27                       ; Recover B27
        LDW         *+SP(252),B28                       ; Recover B28
        LDW         *+SP(256),B29                       ; Recover B29
        LDW         *+SP(260),B30                       ; Recover B30
        LDW         *+SP(264),B31                       ; Recover B31
        B           IRP                                 ; Return to point of interrupt
||      LDW         *+SP(132),B12                       ; Recover B12
        LDW         *+SP(136),B13                       ; Recover B13
        ADDK.S2     288,SP                              ; Recover stack space
        NOP         3                                   ; Delay slots
;
;}