1
2
3
4
5
6
7 #include <asm/head.h>
8 #include <asm/asi.h>
9 #include <asm/contregs.h>
10 #include <asm/cprefix.h>
11 #include <asm/psr.h>
12 #include <asm/asmmacro.h>
13 #include <asm/ptrace.h>
14 #include <asm/winmacro.h>
15
16 #define sw_ntask g1
17 #define sw_psr g4
18 #define sw_wim g5
19 #define sw_tmp g6
20 #define sw_ctx g7
21
22
23
24
25
26
27 .align 4
28 .globl C_LABEL(sparc_switch_to)
29 C_LABEL(sparc_switch_to):
30 mov %o0, %sw_ntask
31
32
33 FLUSH_ALL_KERNEL_WINDOWS;
34 STORE_WINDOW(sp)
35 rd %psr, %sw_psr
36 LOAD_CURRENT(sw_tmp, sw_wim)
37 rd %wim, %sw_wim
38 std %sw_psr, [%sw_tmp + THREAD_KPSR]
39 std %sp, [%sw_tmp + THREAD_KSP]
40
41
42 wr %sw_psr, PSR_ET, %psr
43 WRITE_PAUSE
44 #ifdef __SMP__
45 GET_PROCESSOR_OFFSET(sw_psr)
46 set C_LABEL(current_set), %sw_tmp
47 st %sw_ntask, [%sw_tmp + %sw_psr]
48 #else
49 sethi %hi(C_LABEL(current_set)), %sw_tmp
50 st %sw_ntask, [%sw_tmp + %lo(C_LABEL(current_set))]
51 #endif
52 ldd [%sw_ntask + THREAD_KPSR], %sw_psr
53 wr %sw_psr, PSR_ET, %psr
54 WRITE_PAUSE
55 wr %sw_wim, 0x0, %wim
56 WRITE_PAUSE
57 ldd [%sw_ntask + THREAD_KSP], %sp
58 LOAD_WINDOW(sp)
59
60 wr %sw_psr, 0x0, %psr ! traps back on
61 WRITE_PAUSE
62
63 retl
64 nop
65
66
67 #ifdef __SMP__
68
69
70
71
72 .globl C_LABEL(sparc_cpusched)
73 C_LABEL(sparc_cpusched):
74 LOAD_CURRENT(g1, g2)
75 rd %psr, %g7
76
77 wr %g7, PSR_ET, %psr
78 WRITE_PAUSE
79
80 ldd [%g1 + THREAD_KPSR], %g2
81
82 wr %g2, PSR_ET, %psr
83 WRITE_PAUSE
84
85 wr %g3, 0x0, %wim
86 WRITE_PAUSE
87
88 ldd [%g1 + THREAD_KSP], %sp
89 LOAD_WINDOW(sp)
90
91 wr %g2, 0x0, %psr
92 WRITE_PAUSE
93
94 retl
95 nop
96 #endif