xref: /titanic_44/usr/src/uts/sparc/fs/proc/prmachdep.c (revision 24fe0b3bf671e123467ce1df0b67cadd3614c8e4)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 #include <sys/types.h>
31 #include <sys/t_lock.h>
32 #include <sys/param.h>
33 #include <sys/cred.h>
34 #include <sys/debug.h>
35 #include <sys/inline.h>
36 #include <sys/kmem.h>
37 #include <sys/proc.h>
38 #include <sys/sysmacros.h>
39 #include <sys/systm.h>
40 #include <sys/vmsystm.h>
41 #include <sys/vfs.h>
42 #include <sys/vnode.h>
43 #include <sys/pcb.h>
44 #include <sys/buf.h>
45 #include <sys/signal.h>
46 #include <sys/user.h>
47 #include <sys/cpuvar.h>
48 #include <sys/copyops.h>
49 #include <sys/watchpoint.h>
50 
51 #include <sys/fault.h>
52 #include <sys/syscall.h>
53 #include <sys/procfs.h>
54 #include <sys/archsystm.h>
55 #include <sys/cmn_err.h>
56 #include <sys/stack.h>
57 #include <sys/machpcb.h>
58 #include <sys/simulate.h>
59 #include <sys/fpu/fpusystm.h>
60 
61 #include <sys/pte.h>
62 #include <sys/vmem.h>
63 #include <sys/mman.h>
64 #include <sys/vmparam.h>
65 #include <vm/hat.h>
66 #include <vm/as.h>
67 #include <vm/seg.h>
68 #include <vm/seg_kmem.h>
69 #include <vm/seg_kp.h>
70 #include <vm/page.h>
71 
72 #include <fs/proc/prdata.h>
73 #include <v9/sys/psr_compat.h>
74 
75 int	prnwatch = 10000;	/* maximum number of watched areas */
76 
77 /*
78  * Force a thread into the kernel if it is not already there.
79  * This is a no-op on uniprocessors.
80  */
81 /* ARGSUSED */
82 void
83 prpokethread(kthread_t *t)
84 {
85 	if (t->t_state == TS_ONPROC && t->t_cpu != CPU)
86 		poke_cpu(t->t_cpu->cpu_id);
87 }
88 
89 /*
90  * Return general registers.
91  */
92 void
93 prgetprregs(klwp_t *lwp, prgregset_t prp)
94 {
95 	gregset_t gr;
96 
97 	ASSERT(MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
98 
99 	getgregs(lwp, gr);
100 	bzero(prp, sizeof (prp));
101 
102 	/*
103 	 * Can't copy since prgregset_t and gregset_t
104 	 * use different defines.
105 	 */
106 	prp[R_G1] = gr[REG_G1];
107 	prp[R_G2] = gr[REG_G2];
108 	prp[R_G3] = gr[REG_G3];
109 	prp[R_G4] = gr[REG_G4];
110 	prp[R_G5] = gr[REG_G5];
111 	prp[R_G6] = gr[REG_G6];
112 	prp[R_G7] = gr[REG_G7];
113 
114 	prp[R_O0] = gr[REG_O0];
115 	prp[R_O1] = gr[REG_O1];
116 	prp[R_O2] = gr[REG_O2];
117 	prp[R_O3] = gr[REG_O3];
118 	prp[R_O4] = gr[REG_O4];
119 	prp[R_O5] = gr[REG_O5];
120 	prp[R_O6] = gr[REG_O6];
121 	prp[R_O7] = gr[REG_O7];
122 
123 	if (lwp->lwp_pcb.pcb_xregstat != XREGNONE) {
124 		prp[R_L0] = lwp->lwp_pcb.pcb_xregs.rw_local[0];
125 		prp[R_L1] = lwp->lwp_pcb.pcb_xregs.rw_local[1];
126 		prp[R_L2] = lwp->lwp_pcb.pcb_xregs.rw_local[2];
127 		prp[R_L3] = lwp->lwp_pcb.pcb_xregs.rw_local[3];
128 		prp[R_L4] = lwp->lwp_pcb.pcb_xregs.rw_local[4];
129 		prp[R_L5] = lwp->lwp_pcb.pcb_xregs.rw_local[5];
130 		prp[R_L6] = lwp->lwp_pcb.pcb_xregs.rw_local[6];
131 		prp[R_L7] = lwp->lwp_pcb.pcb_xregs.rw_local[7];
132 
133 		prp[R_I0] = lwp->lwp_pcb.pcb_xregs.rw_in[0];
134 		prp[R_I1] = lwp->lwp_pcb.pcb_xregs.rw_in[1];
135 		prp[R_I2] = lwp->lwp_pcb.pcb_xregs.rw_in[2];
136 		prp[R_I3] = lwp->lwp_pcb.pcb_xregs.rw_in[3];
137 		prp[R_I4] = lwp->lwp_pcb.pcb_xregs.rw_in[4];
138 		prp[R_I5] = lwp->lwp_pcb.pcb_xregs.rw_in[5];
139 		prp[R_I6] = lwp->lwp_pcb.pcb_xregs.rw_in[6];
140 		prp[R_I7] = lwp->lwp_pcb.pcb_xregs.rw_in[7];
141 	}
142 
143 	prp[R_CCR] = gr[REG_CCR];
144 	prp[R_ASI] = gr[REG_ASI];
145 	prp[R_FPRS] = gr[REG_FPRS];
146 	prp[R_PC]  = gr[REG_PC];
147 	prp[R_nPC] = gr[REG_nPC];
148 	prp[R_Y]   = gr[REG_Y];
149 }
150 
151 /*
152  * Set general registers.
153  */
154 void
155 prsetprregs(klwp_t *lwp, prgregset_t prp, int initial)
156 {
157 	gregset_t gr;
158 
159 	gr[REG_G1] = prp[R_G1];
160 	gr[REG_G2] = prp[R_G2];
161 	gr[REG_G3] = prp[R_G3];
162 	gr[REG_G4] = prp[R_G4];
163 	gr[REG_G5] = prp[R_G5];
164 	gr[REG_G6] = prp[R_G6];
165 	gr[REG_G7] = prp[R_G7];
166 
167 	gr[REG_O0] = prp[R_O0];
168 	gr[REG_O1] = prp[R_O1];
169 	gr[REG_O2] = prp[R_O2];
170 	gr[REG_O3] = prp[R_O3];
171 	gr[REG_O4] = prp[R_O4];
172 	gr[REG_O5] = prp[R_O5];
173 	gr[REG_O6] = prp[R_O6];
174 	gr[REG_O7] = prp[R_O7];
175 
176 	lwp->lwp_pcb.pcb_xregs.rw_local[0] = prp[R_L0];
177 	lwp->lwp_pcb.pcb_xregs.rw_local[1] = prp[R_L1];
178 	lwp->lwp_pcb.pcb_xregs.rw_local[2] = prp[R_L2];
179 	lwp->lwp_pcb.pcb_xregs.rw_local[3] = prp[R_L3];
180 	lwp->lwp_pcb.pcb_xregs.rw_local[4] = prp[R_L4];
181 	lwp->lwp_pcb.pcb_xregs.rw_local[5] = prp[R_L5];
182 	lwp->lwp_pcb.pcb_xregs.rw_local[6] = prp[R_L6];
183 	lwp->lwp_pcb.pcb_xregs.rw_local[7] = prp[R_L7];
184 
185 	lwp->lwp_pcb.pcb_xregs.rw_in[0] = prp[R_I0];
186 	lwp->lwp_pcb.pcb_xregs.rw_in[1] = prp[R_I1];
187 	lwp->lwp_pcb.pcb_xregs.rw_in[2] = prp[R_I2];
188 	lwp->lwp_pcb.pcb_xregs.rw_in[3] = prp[R_I3];
189 	lwp->lwp_pcb.pcb_xregs.rw_in[4] = prp[R_I4];
190 	lwp->lwp_pcb.pcb_xregs.rw_in[5] = prp[R_I5];
191 	lwp->lwp_pcb.pcb_xregs.rw_in[6] = prp[R_I6];
192 	lwp->lwp_pcb.pcb_xregs.rw_in[7] = prp[R_I7];
193 
194 	lwp->lwp_pcb.pcb_xregstat = XREGMODIFIED;
195 	lwptot(lwp)->t_post_sys = 1;
196 
197 	/*
198 	 * setgregs will only allow the condition codes to be set.
199 	 */
200 	gr[REG_CCR] = prp[R_CCR];
201 	gr[REG_ASI] = prp[R_ASI];
202 	gr[REG_FPRS] = prp[R_FPRS];
203 	gr[REG_PC]  = prp[R_PC];
204 	gr[REG_nPC] = prp[R_nPC];
205 	gr[REG_Y]   = prp[R_Y];
206 
207 	if (initial) {		/* set initial values */
208 		if (lwptoproc(lwp)->p_model == DATAMODEL_LP64)
209 			lwptoregs(lwp)->r_tstate = TSTATE_USER64|TSTATE_MM_TSO;
210 		else
211 			lwptoregs(lwp)->r_tstate = TSTATE_USER32|TSTATE_MM_TSO;
212 		if (!fpu_exists)
213 			lwptoregs(lwp)->r_tstate &= ~TSTATE_PEF;
214 	}
215 
216 	setgregs(lwp, gr);
217 }
218 
219 #ifdef _SYSCALL32_IMPL
220 
221 /*
222  * modify the lower 32bits of a uint64_t
223  */
224 #define	SET_LOWER_32(all, lower)	\
225 	(((uint64_t)(all) & 0xffffffff00000000) | (uint32_t)(lower))
226 
227 /*
228  * Convert prgregset32 to native prgregset.
229  */
230 void
231 prgregset_32ton(klwp_t *lwp, prgregset32_t src, prgregset_t dest)
232 {
233 	struct regs *r = lwptoregs(lwp);
234 
235 	dest[R_G0] = SET_LOWER_32(0, src[R_G0]);
236 	dest[R_G1] = SET_LOWER_32(r->r_g1, src[R_G1]);
237 	dest[R_G2] = SET_LOWER_32(r->r_g2, src[R_G2]);
238 	dest[R_G3] = SET_LOWER_32(r->r_g3, src[R_G3]);
239 	dest[R_G4] = SET_LOWER_32(r->r_g4, src[R_G4]);
240 	dest[R_G5] = SET_LOWER_32(r->r_g5, src[R_G5]);
241 	dest[R_G6] = SET_LOWER_32(r->r_g6, src[R_G6]);
242 	dest[R_G7] = SET_LOWER_32(r->r_g7, src[R_G7]);
243 
244 	dest[R_O0] = SET_LOWER_32(r->r_o0, src[R_O0]);
245 	dest[R_O1] = SET_LOWER_32(r->r_o1, src[R_O1]);
246 	dest[R_O2] = SET_LOWER_32(r->r_o2, src[R_O2]);
247 	dest[R_O3] = SET_LOWER_32(r->r_o3, src[R_O3]);
248 	dest[R_O4] = SET_LOWER_32(r->r_o4, src[R_O4]);
249 	dest[R_O5] = SET_LOWER_32(r->r_o5, src[R_O5]);
250 	dest[R_O6] = SET_LOWER_32(r->r_o6, src[R_O6]);
251 	dest[R_O7] = SET_LOWER_32(r->r_o7, src[R_O7]);
252 
253 	if (lwp->lwp_pcb.pcb_xregstat != XREGNONE) {
254 		struct rwindow *rw = &lwp->lwp_pcb.pcb_xregs;
255 
256 		dest[R_L0] = SET_LOWER_32(rw->rw_local[0], src[R_L0]);
257 		dest[R_L1] = SET_LOWER_32(rw->rw_local[1], src[R_L1]);
258 		dest[R_L2] = SET_LOWER_32(rw->rw_local[2], src[R_L2]);
259 		dest[R_L3] = SET_LOWER_32(rw->rw_local[3], src[R_L3]);
260 		dest[R_L4] = SET_LOWER_32(rw->rw_local[4], src[R_L4]);
261 		dest[R_L5] = SET_LOWER_32(rw->rw_local[5], src[R_L5]);
262 		dest[R_L6] = SET_LOWER_32(rw->rw_local[6], src[R_L6]);
263 		dest[R_L7] = SET_LOWER_32(rw->rw_local[7], src[R_L7]);
264 
265 		dest[R_I0] = SET_LOWER_32(rw->rw_in[0], src[R_I0]);
266 		dest[R_I1] = SET_LOWER_32(rw->rw_in[1], src[R_I1]);
267 		dest[R_I2] = SET_LOWER_32(rw->rw_in[2], src[R_I2]);
268 		dest[R_I3] = SET_LOWER_32(rw->rw_in[3], src[R_I3]);
269 		dest[R_I4] = SET_LOWER_32(rw->rw_in[4], src[R_I4]);
270 		dest[R_I5] = SET_LOWER_32(rw->rw_in[5], src[R_I5]);
271 		dest[R_I6] = SET_LOWER_32(rw->rw_in[6], src[R_I6]);
272 		dest[R_I7] = SET_LOWER_32(rw->rw_in[7], src[R_I7]);
273 	} else {
274 		dest[R_L0] = (uint32_t)src[R_L0];
275 		dest[R_L1] = (uint32_t)src[R_L1];
276 		dest[R_L2] = (uint32_t)src[R_L2];
277 		dest[R_L3] = (uint32_t)src[R_L3];
278 		dest[R_L4] = (uint32_t)src[R_L4];
279 		dest[R_L5] = (uint32_t)src[R_L5];
280 		dest[R_L6] = (uint32_t)src[R_L6];
281 		dest[R_L7] = (uint32_t)src[R_L7];
282 
283 		dest[R_I0] = (uint32_t)src[R_I0];
284 		dest[R_I1] = (uint32_t)src[R_I1];
285 		dest[R_I2] = (uint32_t)src[R_I2];
286 		dest[R_I3] = (uint32_t)src[R_I3];
287 		dest[R_I4] = (uint32_t)src[R_I4];
288 		dest[R_I5] = (uint32_t)src[R_I5];
289 		dest[R_I6] = (uint32_t)src[R_I6];
290 		dest[R_I7] = (uint32_t)src[R_I7];
291 	}
292 
293 	dest[R_CCR] = ((r->r_tstate >> TSTATE_CCR_SHIFT) & CCR_XCC) |
294 	    ((src[R_PSR] >> (TSTATE_CCR_SHIFT-PSR_TSTATE_CC_SHIFT)) & CCR_ICC);
295 
296 	dest[R_PC] = SET_LOWER_32(r->r_pc, src[R_PC]);
297 	dest[R_nPC] = SET_LOWER_32(r->r_npc, src[R_nPC]);
298 	dest[R_Y] = (uint32_t)src[R_Y];
299 
300 	dest[R_ASI] = (r->r_tstate >> TSTATE_ASI_SHIFT) & TSTATE_ASI_MASK;
301 	dest[R_FPRS] = lwptofpu(lwp)->fpu_fprs;
302 }
303 
304 /*
305  * Return 32-bit general registers.
306  */
307 
308 /* conversion from 64-bit register to 32-bit register */
309 #define	R32(r)	(prgreg32_t)(uint32_t)(r)
310 
311 void
312 prgetprregs32(klwp_t *lwp, prgregset32_t prp)
313 {
314 	gregset32_t gr;
315 
316 	extern void getgregs32(klwp_t *, gregset32_t);
317 
318 	ASSERT(MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
319 
320 	getgregs32(lwp, gr);
321 	bzero(prp, sizeof (prp));
322 
323 	/*
324 	 * Can't copy since prgregset_t and gregset_t
325 	 * use different defines.
326 	 */
327 	prp[R_G1] = gr[REG_G1];
328 	prp[R_G2] = gr[REG_G2];
329 	prp[R_G3] = gr[REG_G3];
330 	prp[R_G4] = gr[REG_G4];
331 	prp[R_G5] = gr[REG_G5];
332 	prp[R_G6] = gr[REG_G6];
333 	prp[R_G7] = gr[REG_G7];
334 
335 	prp[R_O0] = gr[REG_O0];
336 	prp[R_O1] = gr[REG_O1];
337 	prp[R_O2] = gr[REG_O2];
338 	prp[R_O3] = gr[REG_O3];
339 	prp[R_O4] = gr[REG_O4];
340 	prp[R_O5] = gr[REG_O5];
341 	prp[R_O6] = gr[REG_O6];
342 	prp[R_O7] = gr[REG_O7];
343 
344 	if (lwp->lwp_pcb.pcb_xregstat != XREGNONE) {
345 		prp[R_L0] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[0]);
346 		prp[R_L1] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[1]);
347 		prp[R_L2] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[2]);
348 		prp[R_L3] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[3]);
349 		prp[R_L4] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[4]);
350 		prp[R_L5] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[5]);
351 		prp[R_L6] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[6]);
352 		prp[R_L7] = R32(lwp->lwp_pcb.pcb_xregs.rw_local[7]);
353 
354 		prp[R_I0] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[0]);
355 		prp[R_I1] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[1]);
356 		prp[R_I2] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[2]);
357 		prp[R_I3] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[3]);
358 		prp[R_I4] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[4]);
359 		prp[R_I5] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[5]);
360 		prp[R_I6] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[6]);
361 		prp[R_I7] = R32(lwp->lwp_pcb.pcb_xregs.rw_in[7]);
362 	}
363 
364 	prp[R_PSR] = gr[REG_PSR];
365 	prp[R_PC]  = gr[REG_PC];
366 	prp[R_nPC] = gr[REG_nPC];
367 	prp[R_Y]   = gr[REG_Y];
368 }
369 
370 #endif	/* _SYSCALL32_IMPL */
371 
372 /*
373  * Get the syscall return values for the lwp.
374  */
375 int
376 prgetrvals(klwp_t *lwp, long *rval1, long *rval2)
377 {
378 	struct regs *r = lwptoregs(lwp);
379 
380 	if (r->r_tstate & TSTATE_IC)
381 		return ((int)r->r_o0);
382 	if (lwp->lwp_eosys == JUSTRETURN) {
383 		*rval1 = 0;
384 		*rval2 = 0;
385 	} else if (lwptoproc(lwp)->p_model == DATAMODEL_ILP32) {
386 		*rval1 = r->r_o0 & (uint32_t)0xffffffffU;
387 		*rval2 = r->r_o1 & (uint32_t)0xffffffffU;
388 	} else {
389 		*rval1 = r->r_o0;
390 		*rval2 = r->r_o1;
391 	}
392 	return (0);
393 }
394 
395 /*
396  * Does the system support floating-point, either through hardware
397  * or by trapping and emulating floating-point machine instructions?
398  */
399 int
400 prhasfp(void)
401 {
402 	/*
403 	 * SunOS5.0 emulates floating-point if FP hardware is not present.
404 	 */
405 	return (1);
406 }
407 
408 /*
409  * Get floating-point registers.
410  */
411 void
412 prgetprfpregs(klwp_t *lwp, prfpregset_t *pfp)
413 {
414 	bzero(pfp, sizeof (*pfp));
415 	/*
416 	 * This works only because prfpregset_t is intentionally
417 	 * constructed to be identical to fpregset_t, with additional
418 	 * space for the floating-point queue at the end.
419 	 */
420 	getfpregs(lwp, (fpregset_t *)pfp);
421 	/*
422 	 * This is supposed to be a pointer to the floating point queue.
423 	 * We can't provide such a thing through the /proc interface.
424 	 */
425 	pfp->pr_filler = NULL;
426 	/*
427 	 * XXX: to be done: fetch the FP queue if it is non-empty.
428 	 */
429 }
430 
431 #ifdef	_SYSCALL32_IMPL
432 void
433 prgetprfpregs32(klwp_t *lwp, prfpregset32_t *pfp)
434 {
435 	bzero(pfp, sizeof (*pfp));
436 	/*
437 	 * This works only because prfpregset32_t is intentionally
438 	 * constructed to be identical to fpregset32_t, with additional
439 	 * space for the floating-point queue at the end.
440 	 */
441 	getfpregs32(lwp, (fpregset32_t *)pfp);
442 	/*
443 	 * This is supposed to be a pointer to the floating point queue.
444 	 * We can't provide such a thing through the /proc interface.
445 	 */
446 	pfp->pr_filler = NULL;
447 	/*
448 	 * XXX: to be done: fetch the FP queue if it is non-empty.
449 	 */
450 }
451 #endif	/* _SYSCALL32_IMPL */
452 
453 /*
454  * Set floating-point registers.
455  */
456 void
457 prsetprfpregs(klwp_t *lwp, prfpregset_t *pfp)
458 {
459 	/*
460 	 * XXX: to be done: store the FP queue if it is non-empty.
461 	 */
462 	pfp->pr_qcnt = 0;
463 	/*
464 	 * We set fpu_en before calling setfpregs() in order to
465 	 * retain the semantics of this operation from older
466 	 * versions of the system.  SunOS 5.4 and prior never
467 	 * queried fpu_en; they just set the registers.  The
468 	 * proper operation if fpu_en is zero is to disable
469 	 * floating point in the target process, but this can
470 	 * only change after a proper end-of-life period for
471 	 * the old semantics.
472 	 */
473 	pfp->pr_en = 1;
474 	/*
475 	 * This works only because prfpregset_t is intentionally
476 	 * constructed to be identical to fpregset_t, with additional
477 	 * space for the floating-point queue at the end.
478 	 */
479 	setfpregs(lwp, (fpregset_t *)pfp);
480 }
481 
482 #ifdef	_SYSCALL32_IMPL
483 void
484 prsetprfpregs32(klwp_t *lwp, prfpregset32_t *pfp)
485 {
486 	/*
487 	 * XXX: to be done: store the FP queue if it is non-empty.
488 	 */
489 	pfp->pr_qcnt = 0;
490 	/*
491 	 * We set fpu_en before calling setfpregs() in order to
492 	 * retain the semantics of this operation from older
493 	 * versions of the system.  SunOS 5.4 and prior never
494 	 * queried fpu_en; they just set the registers.  The
495 	 * proper operation if fpu_en is zero is to disable
496 	 * floating point in the target process, but this can
497 	 * only change after a proper end-of-life period for
498 	 * the old semantics.
499 	 */
500 	pfp->pr_en = 1;
501 	/*
502 	 * This works only because prfpregset32_t is intentionally
503 	 * constructed to be identical to fpregset32_t, with additional
504 	 * space for the floating-point queue at the end.
505 	 */
506 	setfpregs32(lwp, (fpregset32_t *)pfp);
507 }
508 #endif	/* _SYSCALL32_IMPL */
509 
510 /*
511  * Does the system support extra register state?
512  * In a kernel that supports both an _LP64 and an _ILP32 data model,
513  * the answer depends on the data model of the process.
514  * An _LP64 process does not have extra registers.
515  */
516 int
517 prhasx(proc_t *p)
518 {
519 	extern int xregs_exists;
520 
521 	if (p->p_model == DATAMODEL_LP64)
522 		return (0);
523 	else
524 		return (xregs_exists);
525 }
526 
527 /*
528  * Get the size of the extra registers.
529  */
530 int
531 prgetprxregsize(proc_t *p)
532 {
533 	return (xregs_getsize(p));
534 }
535 
536 /*
537  * Get extra registers.
538  */
539 void
540 prgetprxregs(klwp_t *lwp, caddr_t prx)
541 {
542 	extern void xregs_get(struct _klwp *, caddr_t);
543 
544 	(void) xregs_get(lwp, prx);
545 }
546 
547 /*
548  * Set extra registers.
549  */
550 void
551 prsetprxregs(klwp_t *lwp, caddr_t prx)
552 {
553 	extern void xregs_set(struct _klwp *, caddr_t);
554 
555 	(void) xregs_set(lwp, prx);
556 }
557 
558 /*
559  * Get the ancillary state registers.
560  */
561 void
562 prgetasregs(klwp_t *lwp, asrset_t asrset)
563 {
564 	bzero(asrset, sizeof (asrset_t));
565 	getasrs(lwp, asrset);
566 	getfpasrs(lwp, asrset);
567 }
568 
569 /*
570  * Set the ancillary state registers.
571  */
572 void
573 prsetasregs(klwp_t *lwp, asrset_t asrset)
574 {
575 	setasrs(lwp, asrset);
576 	setfpasrs(lwp, asrset);
577 }
578 
579 /*
580  * Return the base (lower limit) of the process stack.
581  */
582 caddr_t
583 prgetstackbase(proc_t *p)
584 {
585 	return (p->p_usrstack - p->p_stksize);
586 }
587 
588 /*
589  * Return the "addr" field for pr_addr in prpsinfo_t.
590  * This is a vestige of the past, so whatever we return is OK.
591  */
592 caddr_t
593 prgetpsaddr(proc_t *p)
594 {
595 	return ((caddr_t)p);
596 }
597 
598 /*
599  * Arrange to single-step the lwp.
600  */
601 void
602 prstep(klwp_t *lwp, int watchstep)
603 {
604 	ASSERT(MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
605 
606 	lwp->lwp_pcb.pcb_step = STEP_REQUESTED;
607 	lwp->lwp_pcb.pcb_tracepc = NULL;
608 	if (watchstep)
609 		lwp->lwp_pcb.pcb_flags |= WATCH_STEP;
610 	else
611 		lwp->lwp_pcb.pcb_flags |= NORMAL_STEP;
612 }
613 
614 /*
615  * Undo prstep().
616  */
617 void
618 prnostep(klwp_t *lwp)
619 {
620 	ASSERT(ttolwp(curthread) == lwp ||
621 	    MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
622 
623 	lwp->lwp_pcb.pcb_step = STEP_NONE;
624 	lwp->lwp_pcb.pcb_tracepc = NULL;
625 	lwp->lwp_pcb.pcb_flags &= ~(NORMAL_STEP|WATCH_STEP);
626 }
627 
628 /*
629  * Return non-zero if a single-step is in effect.
630  */
631 int
632 prisstep(klwp_t *lwp)
633 {
634 	ASSERT(MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
635 
636 	return (lwp->lwp_pcb.pcb_step != STEP_NONE);
637 }
638 
639 /*
640  * Set the PC to the specified virtual address.
641  */
642 void
643 prsvaddr(klwp_t *lwp, caddr_t vaddr)
644 {
645 	struct regs *r = lwptoregs(lwp);
646 
647 	ASSERT(MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
648 
649 	/*
650 	 * pc and npc must be word aligned on sparc.
651 	 * We silently make it so to avoid a watchdog reset.
652 	 */
653 	r->r_pc = (uintptr_t)vaddr & ~03L;
654 	r->r_npc = r->r_pc + 4;
655 }
656 
657 /*
658  * Map address "addr" in address space "as" into a kernel virtual address.
659  * The memory is guaranteed to be resident and locked down.
660  */
661 caddr_t
662 prmapin(struct as *as, caddr_t addr, int writing)
663 {
664 	page_t *pp;
665 	caddr_t kaddr;
666 	pfn_t pfnum;
667 
668 	/*
669 	 * XXX - Because of past mistakes, we have bits being returned
670 	 * by getpfnum that are actually the page type bits of the pte.
671 	 * When the object we are trying to map is a memory page with
672 	 * a page structure everything is ok and we can use the optimal
673 	 * method, ppmapin.  Otherwise, we have to do something special.
674 	 */
675 	pfnum = hat_getpfnum(as->a_hat, addr);
676 	if (pf_is_memory(pfnum)) {
677 		pp = page_numtopp_nolock(pfnum);
678 		if (pp != NULL) {
679 			ASSERT(PAGE_LOCKED(pp));
680 			kaddr = ppmapin(pp, writing ?
681 			    (PROT_READ | PROT_WRITE) : PROT_READ,
682 			    (caddr_t)-1);
683 			return (kaddr + ((uintptr_t)addr & PAGEOFFSET));
684 		}
685 	}
686 
687 	/*
688 	 * Oh well, we didn't have a page struct for the object we were
689 	 * trying to map in; ppmapin doesn't handle devices, but allocating a
690 	 * heap address allows ppmapout to free virutal space when done.
691 	 */
692 	kaddr = vmem_alloc(heap_arena, PAGESIZE, VM_SLEEP);
693 
694 	hat_devload(kas.a_hat, kaddr, PAGESIZE, pfnum,
695 	    writing ? (PROT_READ | PROT_WRITE) : PROT_READ, HAT_LOAD_LOCK);
696 
697 	return (kaddr + ((uintptr_t)addr & PAGEOFFSET));
698 }
699 
700 /*
701  * Unmap address "addr" in address space "as"; inverse of prmapin().
702  */
703 /* ARGSUSED */
704 void
705 prmapout(struct as *as, caddr_t addr, caddr_t vaddr, int writing)
706 {
707 	extern void ppmapout(caddr_t);
708 
709 	vaddr = (caddr_t)((uintptr_t)vaddr & PAGEMASK);
710 	ppmapout(vaddr);
711 }
712 
713 
714 #define	BAMASK22 0xffc00000	/* for masking out disp22 from ba,a */
715 #define	BAA	0x30800000	/* ba,a without disp22 */
716 #define	FBAA	0x31800000	/* fba,a without disp22 */
717 #define	CBAA	0x31c00000	/* cba,a without disp22 */
718 
719 #define	BAMASK19 0xfff80000	/* for masking out disp19 from ba,a %[ix]cc */
720 #define	BAA_icc	0x30480000	/* ba,a %icc without disp19 */
721 #define	BAA_xcc	0x30680000	/* ba,a %xcc without disp19 */
722 
723 
724 /*
725  * Prepare to single-step the lwp if requested.
726  * This is called by the lwp itself just before returning to user level.
727  */
728 void
729 prdostep(void)
730 {
731 	klwp_t *lwp = ttolwp(curthread);
732 	struct regs *r = lwptoregs(lwp);
733 	proc_t *p = lwptoproc(lwp);
734 	struct as *as = p->p_as;
735 	caddr_t pc;
736 	caddr_t npc;
737 
738 	ASSERT(lwp != NULL);
739 	ASSERT(r != NULL);
740 
741 	if (lwp->lwp_pcb.pcb_step == STEP_NONE ||
742 	    lwp->lwp_pcb.pcb_step == STEP_ACTIVE)
743 		return;
744 
745 	if (p->p_model == DATAMODEL_ILP32) {
746 		pc = (caddr_t)(uintptr_t)(caddr32_t)r->r_pc;
747 		npc = (caddr_t)(uintptr_t)(caddr32_t)r->r_npc;
748 	} else {
749 		pc = (caddr_t)r->r_pc;
750 		npc = (caddr_t)r->r_npc;
751 	}
752 
753 	if (lwp->lwp_pcb.pcb_step == STEP_WASACTIVE) {
754 		if (npc == (caddr_t)lwp->lwp_pcb.pcb_tracepc)
755 			r->r_npc = (greg_t)as->a_userlimit;
756 		else {
757 			lwp->lwp_pcb.pcb_tracepc = (void *)pc;
758 			r->r_pc = (greg_t)as->a_userlimit;
759 		}
760 	} else {
761 		/*
762 		 * Single-stepping on sparc is effected by setting nPC
763 		 * to an invalid address and expecting FLTBOUNDS to
764 		 * occur after the instruction at PC is executed.
765 		 * This is not the whole story, however; we must
766 		 * deal with branch-always instructions with the
767 		 * annul bit set as a special case here.
768 		 *
769 		 * fuword() returns -1 on error and we can't distinguish
770 		 * this from a legitimate instruction of all 1's.
771 		 * However 0xffffffff is not one of the branch-always
772 		 * instructions we are interested in.  No problem.
773 		 */
774 		int32_t instr;
775 		int32_t i;
776 
777 		if (fuword32_nowatch((void *)pc, (uint32_t *)&instr) != 0)
778 			instr = -1;
779 		if ((i = instr & BAMASK22) == BAA || i == FBAA || i == CBAA) {
780 			/*
781 			 * For ba,a and relatives, compute the
782 			 * new PC from the instruction.
783 			 */
784 			i = (instr << 10) >> 8;
785 			lwp->lwp_pcb.pcb_tracepc = (void *)(pc + i);
786 			r->r_pc = (greg_t)as->a_userlimit;
787 			r->r_npc = r->r_pc + 4;
788 		} else if ((i = instr & BAMASK19) == BAA_icc || i == BAA_xcc) {
789 			/*
790 			 * For ba,a %icc and ba,a %xcc, compute the
791 			 * new PC from the instruction.
792 			 */
793 			i = (instr << 13) >> 11;
794 			lwp->lwp_pcb.pcb_tracepc = (void *)(pc + i);
795 			r->r_pc = (greg_t)as->a_userlimit;
796 			r->r_npc = r->r_pc + 4;
797 		} else {
798 			lwp->lwp_pcb.pcb_tracepc = (void *)npc;
799 			r->r_npc = (greg_t)as->a_userlimit;
800 		}
801 	}
802 
803 	lwp->lwp_pcb.pcb_step = STEP_ACTIVE;
804 }
805 
806 /*
807  * Wrap up single stepping of the lwp.
808  * This is called by the lwp itself just after it has taken
809  * the FLTBOUNDS trap.  We fix up the PC and nPC to have their
810  * proper values after the step.  We return 1 to indicate that
811  * this fault really is the one we are expecting, else 0.
812  *
813  * This is also called from syscall() and stop() to reset PC
814  * and nPC to their proper values for debugger visibility.
815  */
816 int
817 prundostep(void)
818 {
819 	klwp_t *lwp = ttolwp(curthread);
820 	proc_t *p = ttoproc(curthread);
821 	struct as *as = p->p_as;
822 	int rc = 0;
823 	caddr_t pc;
824 	caddr_t npc;
825 
826 	ASSERT(lwp != NULL);
827 
828 	if (lwp->lwp_pcb.pcb_step == STEP_ACTIVE) {
829 		struct regs *r = lwptoregs(lwp);
830 
831 		ASSERT(r != NULL);
832 
833 		if (p->p_model == DATAMODEL_ILP32) {
834 			pc = (caddr_t)(uintptr_t)(caddr32_t)r->r_pc;
835 			npc = (caddr_t)(uintptr_t)(caddr32_t)r->r_npc;
836 		} else {
837 			pc = (caddr_t)r->r_pc;
838 			npc = (caddr_t)r->r_npc;
839 		}
840 
841 		if (pc == (caddr_t)as->a_userlimit ||
842 		    pc == (caddr_t)as->a_userlimit + 4) {
843 			if (pc == (caddr_t)as->a_userlimit) {
844 				r->r_pc = (greg_t)lwp->lwp_pcb.pcb_tracepc;
845 				if (npc == (caddr_t)as->a_userlimit + 4)
846 					r->r_npc = r->r_pc + 4;
847 			} else {
848 				r->r_pc = (greg_t)lwp->lwp_pcb.pcb_tracepc + 4;
849 				r->r_npc = r->r_pc + 4;
850 			}
851 			rc = 1;
852 		} else {
853 			r->r_npc = (greg_t)lwp->lwp_pcb.pcb_tracepc;
854 		}
855 		lwp->lwp_pcb.pcb_step = STEP_WASACTIVE;
856 	}
857 
858 	return (rc);
859 }
860 
861 /*
862  * Make sure the lwp is in an orderly state
863  * for inspection by a debugger through /proc.
864  * Called from stop() and from syslwp_create().
865  */
866 /* ARGSUSED */
867 void
868 prstop(int why, int what)
869 {
870 	klwp_t *lwp = ttolwp(curthread);
871 	proc_t *p = lwptoproc(lwp);
872 	struct regs *r = lwptoregs(lwp);
873 	kfpu_t *pfp = lwptofpu(lwp);
874 	caddr_t sp;
875 	caddr_t pc;
876 	int watched;
877 	extern void fp_prsave(kfpu_t *);
878 
879 	/*
880 	 * Make sure we don't deadlock on a recursive call
881 	 * to prstop().  stop() tests the lwp_nostop flag.
882 	 */
883 	ASSERT(lwp->lwp_nostop == 0);
884 	lwp->lwp_nostop = 1;
885 	(void) flush_user_windows_to_stack(NULL);
886 	if (lwp->lwp_pcb.pcb_step != STEP_NONE)
887 		(void) prundostep();
888 
889 	if (lwp->lwp_pcb.pcb_xregstat == XREGNONE) {
890 		/*
891 		 * Attempt to fetch the last register window from the stack.
892 		 * If that fails, look for it in the pcb.
893 		 * If that fails, give up.
894 		 */
895 		struct machpcb *mpcb = lwptompcb(lwp);
896 		struct rwindow32 rwindow32;
897 		size_t rw_size;
898 		caddr_t rwp;
899 		int is64;
900 
901 		if (mpcb->mpcb_wstate == WSTATE_USER32) {
902 			rw_size = sizeof (struct rwindow32);
903 			sp = (caddr_t)(uintptr_t)(caddr32_t)r->r_sp;
904 			rwp = sp;
905 			is64 = 0;
906 		} else {
907 			rw_size = sizeof (struct rwindow);
908 			sp = (caddr_t)r->r_sp;
909 			rwp = sp + V9BIAS64;
910 			is64 = 1;
911 		}
912 
913 		watched = watch_disable_addr(rwp, rw_size, S_READ);
914 		if (is64 &&
915 		    copyin(rwp, &lwp->lwp_pcb.pcb_xregs, rw_size) == 0)
916 			lwp->lwp_pcb.pcb_xregstat = XREGPRESENT;
917 		else if (!is64 &&
918 		    copyin(rwp, &rwindow32, rw_size) == 0) {
919 			rwindow_32ton(&rwindow32, &lwp->lwp_pcb.pcb_xregs);
920 			lwp->lwp_pcb.pcb_xregstat = XREGPRESENT;
921 		} else {
922 			int i;
923 
924 			for (i = 0; i < mpcb->mpcb_wbcnt; i++) {
925 				if (sp == mpcb->mpcb_spbuf[i]) {
926 					if (is64) {
927 						bcopy(mpcb->mpcb_wbuf +
928 						    (i * rw_size),
929 						    &lwp->lwp_pcb.pcb_xregs,
930 						    rw_size);
931 					} else {
932 						struct rwindow32 *rw32 =
933 						    (struct rwindow32 *)
934 						    (mpcb->mpcb_wbuf +
935 						    (i * rw_size));
936 						rwindow_32ton(rw32,
937 						    &lwp->lwp_pcb.pcb_xregs);
938 					}
939 					lwp->lwp_pcb.pcb_xregstat = XREGPRESENT;
940 					break;
941 				}
942 			}
943 		}
944 		if (watched)
945 			watch_enable_addr(rwp, rw_size, S_READ);
946 	}
947 
948 	/*
949 	 * Make sure the floating point state is saved.
950 	 */
951 	fp_prsave(pfp);
952 
953 	if (p->p_model == DATAMODEL_ILP32)
954 		pc = (caddr_t)(uintptr_t)(caddr32_t)r->r_pc;
955 	else
956 		pc = (caddr_t)r->r_pc;
957 
958 	if (copyin_nowatch(pc, &lwp->lwp_pcb.pcb_instr,
959 	    sizeof (lwp->lwp_pcb.pcb_instr)) == 0)
960 		lwp->lwp_pcb.pcb_flags |= INSTR_VALID;
961 	else {
962 		lwp->lwp_pcb.pcb_flags &= ~INSTR_VALID;
963 		lwp->lwp_pcb.pcb_instr = 0;
964 	}
965 
966 	(void) save_syscall_args();
967 	ASSERT(lwp->lwp_nostop == 1);
968 	lwp->lwp_nostop = 0;
969 }
970 
971 /*
972  * Fetch the user-level instruction on which the lwp is stopped.
973  * It was saved by the lwp itself, in prstop().
974  * Return non-zero if the instruction is valid.
975  */
976 int
977 prfetchinstr(klwp_t *lwp, ulong_t *ip)
978 {
979 	*ip = (ulong_t)(instr_t)lwp->lwp_pcb.pcb_instr;
980 	return (lwp->lwp_pcb.pcb_flags & INSTR_VALID);
981 }
982 
983 int
984 prnwindows(klwp_t *lwp)
985 {
986 	struct machpcb *mpcb = lwptompcb(lwp);
987 
988 	return (mpcb->mpcb_wbcnt);
989 }
990 
991 void
992 prgetwindows(klwp_t *lwp, gwindows_t *gwp)
993 {
994 	getgwins(lwp, gwp);
995 }
996 
997 #ifdef	_SYSCALL32_IMPL
998 void
999 prgetwindows32(klwp_t *lwp, gwindows32_t *gwp)
1000 {
1001 	getgwins32(lwp, gwp);
1002 }
1003 #endif	/* _SYSCALL32_IMPL */
1004 
1005 /*
1006  * Called from trap() when a load or store instruction
1007  * falls in a watched page but is not a watchpoint.
1008  * We emulate the instruction in the kernel.
1009  */
1010 int
1011 pr_watch_emul(struct regs *rp, caddr_t addr, enum seg_rw rw)
1012 {
1013 	char *badaddr = (caddr_t)(-1);
1014 	int res;
1015 	int watched;
1016 
1017 	/* prevent recursive calls to pr_watch_emul() */
1018 	ASSERT(!(curthread->t_flag & T_WATCHPT));
1019 	curthread->t_flag |= T_WATCHPT;
1020 
1021 	watched = watch_disable_addr(addr, 16, rw);
1022 	res = do_unaligned(rp, &badaddr);
1023 	if (watched)
1024 		watch_enable_addr(addr, 16, rw);
1025 
1026 	curthread->t_flag &= ~T_WATCHPT;
1027 	if (res == SIMU_SUCCESS) {
1028 		rp->r_pc = rp->r_npc;
1029 		rp->r_npc += 4;
1030 		return (1);
1031 	}
1032 	return (0);
1033 }
1034