1 #include <machine/asm.h>
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>
12 ENTRY(fault_32bit_sn0)
17 ENTRY(fault_32bit_sn1)
22 ENTRY(fault_32bit_so0)
27 ENTRY(fault_32bit_so1)
32 ENTRY(fault_64bit_sn0)
34 stx %sp, [%g4 + PCB_RWSP]
38 stx %g5, [%g4 + PCB_NSAVED]
44 and %g5, TSTATE_CWP_MASK, %g5
45 ba,pt %xcc, tl0_skip_utrap
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
57 stxa %g5, [%g6 + PCB_NSAVED]%asi
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
76 sta %g6, [PCPU_REG + PC_KWBUF_FULL]%asi
82 ENTRY(fault_64bit_so0)
84 ldx [%g6 + PCB_NSAVED], %g2
86 stx %g3, [%g6 + PCB_NSAVED]
88 sll %g2, PTR_SHIFT, %g4
89 add %g6, PCB_RWSP, %g3
91 sll %g2, RW_SHIFT, %g4
99 ENTRY(fault_64bit_so1)
100 GET_PCB_PHYS(%g5, %g6)
101 wr %g0, ASI_REAL, %asi
102 ldxa [%g6 + PCB_NSAVED]%asi, %g5
104 stxa %g7, [%g6 + PCB_NSAVED]%asi
106 sll %g5, PTR_SHIFT, %g7
108 stxa %sp, [%g7 + PCB_RWSP]%asi
110 sll %g5, RW_SHIFT, %g7 ! offset
111 add %g6, %g7, %g7 ! pcb + offset
112 add %g7, PCB_RW, %g7 ! offset into wbuf area
121 ENTRY(fault_32bit_fn0)
128 and %g5, TSTATE_CWP_MASK, %g5
130 ba,pt %xcc, tl0_skip_utrap
135 ENTRY(fault_32bit_fn1)
140 and %g1, TSTATE_CWP_MASK, %g1
143 ! fake tl1 traps regs so that after pagefault runs, we
144 ! re-execute at user_rtt.
147 set TSTATE_KERNEL | TSTATE_IE, %g1
148 wrpr %g0, %g1, %tstate
156 sllx %g5, CTX_OTHER_SHIFT, %g5
161 sllx %l1, WSTATE_SHIFT, %l1
162 wrpr %l1, WSTATE_K64, %wstate
165 SET_MMU_CONTEXT(%g6, %g5)
168 ba,pt %xcc, tl0_ktrap
172 ENTRY(fault_64bit_fn0)
177 ENTRY(fault_64bit_fn1)
189 ENTRY(fault_32bit_not)
190 ENTRY(fault_64bit_not)
192 ba,pt %xcc, ptl1_panic
193 mov PTL1_BAD_WTRAP, %g1
199 GET_PCB_PHYS(%g5, %g6)
201 wr %g0, ASI_REAL, %asi
202 /* pcpu->pad[0] = %tpc */
204 stxa %g4, [PCPU(PAD)]%asi
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
212 stxa %g6, [PCPU(PAD) + 24]%asi
215 stxa %g6, [PCPU(PAD) + 32]%asi