source: rtems/c/src/lib/start/a29k/pswmacro.ah @ d2632274

4.104.114.84.95
Last change on this file since d2632274 was d6b2bba, checked in by Joel Sherrill <joel.sherrill@…>, on 09/18/96 at 20:56:35

new files submitted by Craig Lebakken (lebakken@…) and Derrick Ostertag
(ostertag@…)

  • Property mode set to 100644
File size: 9.5 KB
Line 
1; /* @(#)pswmacro.ah    1.1 96/05/23 08:56:58, TEI */
2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3;                macros: Do_install and init_TLB
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;  /* $Id$ */
6
7;* File information and includes.
8
9        .file   "macro.ah"
10        .ident  "@(#)pswmacro.ah        1.1 96/05/23 08:56:58, TEI"
11
12
13        .macro  CONST32, RegName, RegValue
14                const   RegName, RegValue
15                consth  RegName, RegValue
16        .endm
17
18        .macro  CONSTX, RegName, RegValue
19                .if (RegValue) <= 0x0000ffff
20                        const   RegName, RegValue
21                .else
22                        const   RegName, RegValue
23                        consth  RegName, RegValue
24                .endif
25        .endm
26
27        .macro  PRODEV, RegName
28                srl     RegName, RegName, 24
29        .endm
30
31;
32;* MACRO TO INSTALL VECTOR TABLE ENTRIES
33;
34 
35;* Assumes vector table address in v0
36 
37        .macro  _setvec, trapnum, trapaddr
38                mfsr    v0, vab                 ;
39                const   v2, trapnum             ;
40                sll     v1, v2, 2               ;
41                add     v1, v1, v0              ; v0 has location of vector tab
42 
43                const   v2, trapaddr            ;
44                consth  v2, trapaddr            ;
45                store   0, 0, v2, v1            ;
46                nop                             ;
47        .endm
48 
49        .macro  syscall, name
50                const     tav, HIF_@name        ;
51                asneq   V_SYSCALL, gr1, gr1     ;
52                nop                             ;
53                nop                             ;
54        .endm
55
56
57
58;* MACRO TO INSTALL VECTOR TABLE ENTRIES
59
60        .macro  Do_Install, V_Number, V_Address
61                const   lr4, V_Address
62                consth  lr4, V_Address
63                const   lr3, V_Number * 4
64                consth  lr3, V_Number * 4
65                call    lr0, V_Install
66                nop
67        .endm
68
69        .macro  Do_InstallX, V_Number, V_Address
70                const   lr4, V_Address
71                consth  lr4, V_Address
72                const   lr3, V_Number * 4
73                consth  lr3, V_Number * 4
74                call    lr0, V_InstallX
75                nop
76        .endm
77
78
79
80; push a register onto the stack
81        .macro  pushreg, reg, sp
82        sub     sp, sp, 4               ; adjust stack pointer
83        store   0, 0, reg, sp           ; push register
84        .endm
85
86        .macro  push, sp, reg
87                sub     sp, sp, 4
88                store   0, 0, reg, sp
89        .endm
90
91; pop the register from stack
92        .macro  popreg, reg, sp
93        load    0, 0, reg, sp           ; pop register
94        add     sp, sp, 4               ; adjust stack pointer
95        .endm
96        .macro  pop, reg, sp
97                load    0, 0, reg, sp
98                add     sp, sp, 4
99        .endm
100
101; push a special register onto stack
102        .macro  pushspcl, spcl, tmpreg, sp
103        sub     sp, sp, 4               ; adjust stack pointer
104        mfsr    tmpreg, spcl            ; get spcl reg
105        store   0, 0, tmpreg, sp        ; push onto stack
106        .endm
107
108        .macro  pushsr, sp, reg, sreg
109                mfsr    reg, sreg
110                sub     sp, sp, 4
111                store   0, 0, reg, sp
112        .endm
113
114; pop a special register from stack
115        .macro  popspcl, spcl, tmpreg, sp
116        load    0, 0, tmpreg, sp        ; pop from stack
117        add     sp, sp, 4               ; adjust stack pointer
118        mtsr    spcl, tmpreg            ; set spcl reg
119        .endm
120
121        .macro  popsr, sreg, reg, sp
122                load    0, 0, reg, sp
123                add     sp, sp, 4
124                mtsr    sreg, reg
125        .endm
126
127;
128; save freeze mode registers on memory stack.
129;
130
131        .macro  SaveFZState,    tmp1, tmp2
132
133                ; save freeze mode registers.
134
135                pushspcl pc0, tmp1, msp
136                pushspcl pc1, tmp1, msp
137                pushspcl alu, tmp1, msp
138
139                pushspcl cha, tmp1, msp
140                pushspcl chd, tmp1, msp
141                pushspcl chc, tmp1, msp
142
143                pushspcl ops, tmp1, msp
144
145                ; turn freeze off
146
147                const   tmp2, FZ
148                mfsr    tmp1, cps
149                andn    tmp1, tmp1, tmp2
150                mtsr    cps, tmp1
151        .endm
152
153; restore freeze mode registers from memory stack.
154
155        .macro  RestoreFZState, tmp1, tmp2
156
157                ; turn freeze on
158
159                const   tmp2, (FZ|DI|DA)
160                mfsr    tmp1, cps
161                or      tmp1, tmp1, tmp2
162                mtsr    cps, tmp1
163
164                ; restore freeze mode registers.
165
166                popspcl ops, tmp1, msp
167                popspcl chc, tmp1, msp
168                popspcl chd, tmp1, msp
169                popspcl cha, tmp1, msp
170                popspcl alu, tmp1, msp
171                popspcl pc1, tmp1, msp
172                popspcl pc0, tmp1, msp
173        .endm
174
175;
176;*
177;
178        .equ    WS,     512                             ; window size
179        .equ    RALLOC, 4 * 4                           ; stack alloc for C
180        .equ    SIGCTX_UM_SIZE, 40 * 4                  ;
181        .equ    SIGCTX_RFB, (38) * 4                    ; user mode saved
182        .equ    SIGCTX_SM_SIZE, 12 * 4                  ;
183        .equ    SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE     ;
184        .equ    SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE     ;
185        .equ    SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE      ;
186        .equ    SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE      ;
187        .equ    SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE      ;
188        .equ    SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE      ;
189        .equ    SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE      ;
190        .equ    SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE      ;
191        .equ    SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE      ;
192
193        .macro  sup_sv
194                add     it2, trapreg, 0                 ; transfer signal #
195                sub     msp, msp, 4                     ;
196                store   0, 0, it2, msp                  ; save signal number
197                sub     msp, msp, 4                     ; push gr1
198
199                store   0, 0, gr1, msp                  ;
200                sub     msp, msp, 4                     ; push rab
201                store   0, 0, rab, msp                  ;
202                const   it0, WS                         ; Window size   
203
204                sub     rab, rfb, it0                   ; set rab = rfb-512
205                pushsr  msp, it0, PC0                   ; save program counter0
206                pushsr  msp, it0, PC1                   ; save program counter1
207                pushsr  msp, it0, PC2                   ; save program counter2
208
209                pushsr  msp, it0, CHA                   ; save channel address
210                pushsr  msp, it0, CHD                   ; save channel data
211                pushsr  msp, it0, CHC                   ; save channel control
212                pushsr  msp, it0, ALU                   ; save alu
213
214                pushsr  msp, it0, OPS                   ; save ops
215                sub     msp, msp, 4                     ;
216                store   0, 0, tav, msp                  ; push tav
217                mtsrim  chc, 0                          ; no loadm/storem
218
219                mfsr    it0, ops                        ; get ops value
220                const   it1, (TD | DI)                  ; disable interrupts
221                consth  it1, (TD | DI)                  ; disable interrupts
222                or      it0, it0, it1                   ; set bits
223
224                mtsr    ops, it0                        ; set new ops
225                const   it0, sigcode                    ; signal handler
226                consth  it0, sigcode                    ; signal handler
227                mtsr    pc1, it0                        ; store pc1
228
229                add     it1, it0, 4                     ; next addr
230                mtsr    pc0, it1                        ; store pc1 location
231                iret                                    ; return
232                nop                                     ; ALIGN
233        .endm
234
235        .macro  sig_return
236                mfsr    it0, cps                        ; get processor status
237                const   it1, FZ|DA                      ; Freeze + traps disable
238                or      it0, it0, it1                   ; to set FZ+DA
239                mtsr    cps, it0                        ; in freeze mode
240
241                load    0, 0, tav, msp                  ; restore tav
242                add     msp, msp, 4                     ;
243               
244                popsr   OPS,it0, msp                    ;
245                popsr   ALU,it0, msp                    ;
246                popsr   CHC,it0, msp                    ;
247                popsr   CHD,it0, msp                    ;
248
249                popsr   CHA,it0, msp                    ;
250                popsr   PC2,it0, msp                    ;
251                popsr   PC1,it0, msp                    ;
252                popsr   PC0,it0, msp                    ;
253
254                load    0, 0, rab, msp                  ;
255                add     msp, msp, 4                     ;
256                load    0, 0, it0, msp                  ;
257                add     gr1, it0, 0                     ; pop rsp
258
259                add     msp, msp, 8                     ; discount signal #
260                iret
261        .endm
262
263        .macro  repair_R_stack
264                add     v0, msp, SIGCTX_GR1             ; interrupted gr1
265                load    0, 0, v2, v0                    ;
266                add     v0, msp, SIGCTX_RFB             ;
267                load    0, 0, v3, v0                    ; interupted rfb
268
269                const   v1, WS                          ;       
270                sub     v1, v3, v1                      ; rfb-512
271                cpltu   v0, v2, v1                      ; test gr1 < rfb-512
272                jmpf    v0, $1                          ;
273
274                add     gr1, rab, 0                     ;
275                add     v2, v1, 0                       ; set LB = rfb-512
276$1:
277;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill
278;* if no, LB=gr1 interrupted cache < 126 registers
279                cpleu   v0, v2, rfb                     ; test LB<=rfb
280                jmpf    v0, $2                          ;
281                nop                                     ;
282                add     v2, rfb, 0                      ;
283$2:
284                cpeq    v0, v3, rfb                     ; fill rfb->'rfb
285                jmpt    v0, $3                          ; if rfb==rfb'
286                const   tav, (0x80<<2)                  ; prepare for fill
287                or      tav, tav, v2                    ;
288
289                mtsr    IPA, tav                        ; IPA=LA<<2
290                sub     tav, v3, gr98                   ; cache fill LA->rfb
291                srl     tav, tav, 2                     ; convert to words
292                sub     tav, tav, 1                     ;
293
294                mtsr    cr, tav                         ;
295                loadm   0, 0, gr0, v2                   ; fill from LA->rfb
296$3:
297                add     rfb, v3, 0                      ; move rfb upto 'rfb
298                sub     rab, v1, 0                      ; assign rab to rfb-512
299
300                add     v0, msp, SIGCTX_GR1             ;
301                load    0, 0, v2, v0                    ; v0 = interrupted gr1
302                add     gr1, v2, 0                      ; move gr1 upto 'gr1
303                nop                                     ;
304        .endm   
305               
306        .macro  repair_regs
307                mtsrim  cr, 29 - 1                      ; to restore locals
308                loadm   0, 0, v0, msp                   ;
309                add     msp, msp, 29*4                  ;
310                popsr   Q, tav, msp                     ;
311
312                popsr   IPC, tav, msp                   ;
313                popsr   IPB, tav, msp                   ;
314                popsr   IPA, tav, msp                   ;
315                pop     FPStat3, msp                    ; floating point regs
316
317                pop     FPStat2, msp                    ; floating point regs
318                pop     FPStat1, msp                    ; floating point regs
319                pop     FPStat0, msp                    ; floating point regs
320
321                add     msp, msp, 3*4                   ; R-stack repaired
322        .endm
323
324;
325;*HIF related...
326;
327
328
329
330
331; send the message in bufaddr to Montip.
332        .macro  SendMessageToMontip,    bufaddr
333        const   lr2, bufaddr
334$1:
335        call    lr0, _msg_send
336        consth  lr2, bufaddr
337        cpeq    gr96, gr96, 0
338        jmpf    gr96, $1
339        const   lr2, bufaddr
340        .endm
341
342; build a HIF_CALL message in bufaddr to send to montip.
343        .macro  BuildHIFCALLMsg,        bufaddr, tmp1, tmp2
344        const   tmp1, bufaddr
345        consth  tmp1, bufaddr
346        const   tmp2, HIF_CALL_MSGCODE
347        store   0, 0, tmp2, tmp1        ; msg code
348        add     tmp1, tmp1, 4
349        const   tmp2, HIF_CALL_MSGLEN   
350        store   0, 0, tmp2, tmp1        ; msg len
351        add     tmp1, tmp1, 4
352        store   0, 0, gr121, tmp1       ; service number
353        add     tmp1, tmp1, 4
354        store   0, 0, lr2, tmp1         ; lr2
355        add     tmp1, tmp1, 4
356        store   0, 0, lr3, tmp1         ; lr3
357        add     tmp1, tmp1, 4
358        store   0, 0, lr4, tmp1         ; lr4
359        .endm
360
361;
362;*
363;* All the funky AMD style macros go in here...simply for
364;* compatility
365;
366;
367  .macro        IMPORT, symbol
368        .extern symbol
369  .endm
370
371  .macro        GLOBAL, symbol
372        .global symbol
373  .endm
374
375  .macro        USESECT, name, type
376        .sect   name, type
377        .use    name
378  .endm
379
380  .macro        SECTION, name, type
381        .sect   name, type
382  .endm
383
384 .macro FUNC, fname, lineno
385        .global fname
386fname:
387 .endm
388
389 .macro ENDFUNC, fname, lineno
390 .endm
391
392;*************************************LONG
393 .macro LONG, varname
394varname:
395        .block  4
396 .endm
397
398;*************************************UNSIGNED LONG
399 .macro ULONG, varname
400varname:
401        .block  4
402 .endm
403
404;*************************************SHORT
405 .macro SHORT, varname
406varname:
407        .block  2
408 .endm
409
410;*************************************CHAR
411 .macro CHAR, varname
412varname:
413        .block  1
414 .endm
415
416;*************************************LONGARRAY
417 .macro LONGARRAY, name, count
418name:
419        .block  count*4
420 .endm
421
422;*************************************SHORTARRAY
423
424 .macro SHORTARRAY, name, count
425name:
426        .block  count*2
427 .endm
428
429;*************************************CHARARRAY
430
431 .macro CHARARRAY, name, count
432name:
433        .block  count
434 .endm
435
436
437;*************************************VOID_FPTR
438
439 .macro VOID_FPTR, name
440name:
441        .block  4
442 .endm
Note: See TracBrowser for help on using the repository browser.