]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/sun4v/sun4v/wbuf.S
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / sun4v / sun4v / wbuf.S
1 #include <machine/asm.h>
2 __FBSDID("$FreeBSD$")
3
4 #include <machine/asi.h>
5 #include <machine/asmacros.h>
6 #include <machine/frame.h>
7 #include <machine/pcb.h>
8 #include <machine/pstate.h>
9
10 #include "assym.s"
11
12 ENTRY(fault_32bit_sn0)
13         MAGIC_TRAP_ON   
14         MAGIC_EXIT      
15 END(fault_32bit_sn0)
16
17 ENTRY(fault_32bit_sn1)
18         MAGIC_TRAP_ON   
19         MAGIC_EXIT      
20 END(fault_32bit_sn1)
21
22 ENTRY(fault_32bit_so0)
23         MAGIC_TRAP_ON   
24         MAGIC_EXIT      
25 END(fault_32bit_so0)
26
27 ENTRY(fault_32bit_so1)
28         MAGIC_TRAP_ON   
29         MAGIC_EXIT      
30 END(fault_32bit_so1)
31
32 ENTRY(fault_64bit_sn0)
33         GET_PCB(%g4)
34         stx     %sp, [%g4 + PCB_RWSP]
35         add     %g4, PCB_RW, %g5
36         SAVE_WINDOW(%g5)
37         mov     1, %g5
38         stx     %g5, [%g4 + PCB_NSAVED]
39
40         set     trap, %g1
41         sub     %g0, 1, %g4
42
43         rdpr    %tstate, %g5
44         and     %g5, TSTATE_CWP_MASK, %g5
45         ba,pt   %xcc, tl0_skip_utrap
46           wrpr  %g0, %g5, %cwp  
47 END(fault_64bit_sn0)
48
49 ENTRY(fault_64bit_sn1)
50         /* XXX need to use physical addresses here */
51         GET_PCB_PHYS(%g5, %g6)
52         wr      %g0, ASI_REAL, %asi
53         stxa    %sp, [%g6 + PCB_RWSP]%asi
54         add     %g6, PCB_RW, %g5
55         SAVE_WINDOW_ASI(%g5)
56         mov     1, %g5
57         stxa    %g5, [%g6 + PCB_NSAVED]%asi
58         saved
59         set     tl0_trap, %g5
60         wrpr    %g5, %tnpc
61         done
62 END(fault_64bit_sn1)
63
64 ENTRY(fault_32bit_sk)
65         MAGIC_TRAP_ON
66         MAGIC_EXIT      
67 END(fault_32bit_sk)
68
69 ENTRY(fault_64bit_sk)
70         GET_PCPU_PHYS_SCRATCH(%g5)
71         wr      %g0, ASI_REAL, %asi
72         stxa    %sp, [PCPU_REG + PC_KWBUF_SP]%asi
73         add     PCPU_REG, PC_KWBUF, %g6
74         SAVE_WINDOW_ASI(%g6)
75         mov     1, %g6
76         sta     %g6, [PCPU_REG + PC_KWBUF_FULL]%asi
77         saved
78         retry
79 END(fault_64bit_sk)
80
81         
82 ENTRY(fault_64bit_so0)
83         GET_PCB(%g6)
84         ldx     [%g6 + PCB_NSAVED], %g2
85         add     %g2, 1, %g3
86         stx     %g3, [%g6 + PCB_NSAVED]
87
88         sll     %g2, PTR_SHIFT, %g4
89         add     %g6, PCB_RWSP, %g3
90         stx     %sp, [%g3 + %g4]
91         sll     %g2, RW_SHIFT, %g4
92         add     %g4, %g6, %g4
93         add     %g4, PCB_RW, %g3
94         SAVE_WINDOW(%g3)
95         saved
96         retry
97 END(fault_64bit_so0)
98
99 ENTRY(fault_64bit_so1)
100         GET_PCB_PHYS(%g5, %g6)
101         wr      %g0, ASI_REAL, %asi
102         ldxa    [%g6 + PCB_NSAVED]%asi, %g5
103         add     %g5, 1, %g7
104         stxa    %g7, [%g6 + PCB_NSAVED]%asi
105
106         sll     %g5, PTR_SHIFT, %g7
107         add     %g6, %g7, %g7
108         stxa    %sp, [%g7 + PCB_RWSP]%asi
109
110         sll     %g5, RW_SHIFT, %g7              ! offset
111         add     %g6, %g7, %g7                   ! pcb + offset
112         add     %g7, PCB_RW, %g7                ! offset into wbuf area
113
114         SAVE_WINDOW_ASI(%g7)
115         saved
116         set     tl0_trap, %g5
117         wrpr    %g5, %tnpc
118         done
119 END(fault_64bit_so1)
120
121 ENTRY(fault_32bit_fn0)
122         MAGIC_TRAP_ON   
123         MAGIC_EXIT      
124 fault_fn0_common:
125         set     trap, %g1
126         sub     %g0, 1, %g4
127         rdpr    %tstate, %g5
128         and     %g5, TSTATE_CWP_MASK, %g5
129         GET_PCPU_SCRATCH
130         ba,pt   %xcc, tl0_skip_utrap
131           wrpr  %g0, %g5, %cwp  
132 END(fault_32bit_fn0)
133         MAGIC_TRAP_ON   
134         MAGIC_EXIT      
135 ENTRY(fault_32bit_fn1)
136         MAGIC_TRAP_ON   
137         MAGIC_EXIT
138 fault_fn1_common:
139         rdpr    %tstate, %g1
140         and     %g1, TSTATE_CWP_MASK, %g1
141         wrpr    %g0, %g1, %cwp
142         !
143         ! fake tl1 traps regs so that after pagefault runs, we
144         ! re-execute at user_rtt.
145         !
146         wrpr    %g0, 1, %tl
147         set     TSTATE_KERNEL | TSTATE_IE, %g1
148         wrpr    %g0, %g1, %tstate
149         set     user_rtt, %g1
150         wrpr    %g0, %g1, %tpc
151         add     %g1, 4, %g1
152         wrpr    %g0, %g1, %tnpc
153
154         set     trap, %g1
155         mov     1, %g5
156         sllx    %g5, CTX_OTHER_SHIFT, %g5
157         or      %g5, %g2, %g2   
158
159         sub     %g0, 1, %g4
160         rdpr    %wstate, %l1
161         sllx    %l1, WSTATE_SHIFT, %l1
162         wrpr    %l1, WSTATE_K64, %wstate
163         mov     KCONTEXT, %g5
164         mov     MMU_CID_P, %g6
165         SET_MMU_CONTEXT(%g6, %g5)
166
167
168         ba,pt   %xcc, tl0_ktrap 
169           membar        #Sync
170 END(fault_32bit_fn1)
171         
172 ENTRY(fault_64bit_fn0)
173         b       fault_fn0_common
174           nop
175 END(fault_64bit_fn0)
176
177 ENTRY(fault_64bit_fn1)
178         wrpr    %g0, 1, %gl
179         b       fault_fn1_common
180           nop
181 END(fault_64bit_fn1)
182
183 ENTRY(fault_rtt_fn1)
184         b       fault_fn1_common
185           nop
186 END(fault_rtt_fn1)
187
188
189 ENTRY(fault_32bit_not)
190 ENTRY(fault_64bit_not)
191
192         ba,pt   %xcc, ptl1_panic
193           mov   PTL1_BAD_WTRAP, %g1
194         
195 END(fault_32bit_not)
196 END(fault_64bit_not)
197
198 ENTRY(ptl1_panic)
199         GET_PCB_PHYS(%g5, %g6)
200 #ifdef TRAP_TRACING
201         wr      %g0, ASI_REAL, %asi
202         /* pcpu->pad[0] = %tpc */
203         rdpr    %tpc, %g4
204         stxa    %g4, [PCPU(PAD)]%asi
205
206         /* pcpu->pad[1] = %l7 */
207         stxa    %l7, [PCPU(PAD) + 8]%asi
208         /* pcpu->pad[2] = pcb->pcb_kstack */
209         ldxa    [%g6 + PCB_KSTACK]%asi, %g6
210         stxa    %g6, [PCPU(PAD) + 16]%asi
211         rdpr    %tt, %g6
212         stxa    %g6, [PCPU(PAD) + 24]%asi
213         wrpr    %g0, 1, %tl
214         rdpr    %tt, %g6
215         stxa    %g6, [PCPU(PAD) + 32]%asi
216 #endif
217
218
219 2:      nop
220         ba,a,pt %xcc, 2b
221                 
222 END(ptl1_panic)