|
|
1.1 root 1: |* ctxsw.s - ctxsw
2:
3: |*-----------------------------------------------------------------------------
4: |* ctxsw -- actually perform context switch, saving and loading registers
5: |* This routine is executed in kernel mode.
6: |*
7: |* Upon entry, d0-d7, a0-a6, the ssp, the sr, and the pc are
8: |* saved. The usp is ignored.
9: |*
10: |* Upon exit, all registers saved are restored, and the value
11: |* of the supervisor stack pointer is copied into the user
12: |* stack pointer.
13: |*-----------------------------------------------------------------------------
14:
15: .data
16: .text
17: .globl _ctxsw
18: _ctxsw:
19: movl a0, sp@(-4) ; Save A0 onto old stack
20: movl sp@(4), a0 ; Move address of old area into A0
21: moveml #0xffff,a0@ ; Save all registers
22: movl sp@(-4),a0@(32) ; Put original A0 in old savearea
23: addl #64, a0 ; Skip past registers d0-7,a0-7
24: movw #0, a0@+ ; Pad SR savearea, since SR is a word
25: movw sr, a0@+ ; Save SR in old savearea
26: movl sp@, a0@+ ; Save PC in old savearea
27:
28: |Save image:d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,ssp,0x00, sr, pc
29: | 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 66 68
30:
31: movl sp@(8), a0 ; Move address of new area into A0
32: moveml a0@,#0x7fff ; Restore all regs (even A0) except SP
33: movl sp@(8), a0 ; Move address of new area into A0 again
34: movl a0@(60),sp ; Put SSP into both kernel stack
35: movl sp, usp ; and user stack
36: movw a0@(66),sr ; Restore SR from new area
37: movl a0@(68),sp@ ; Move PC onto current stack
38: movl a0@(32),a0 ; Restore A0 from new area
39: rts
40: .data
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.