trap.c revision 1.59 1 /* $NetBSD: trap.c,v 1.59 2009/04/30 07:01:27 skrll Exp $ */
2
3 /*-
4 * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matthew Fredette.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /* $OpenBSD: trap.c,v 1.30 2001/09/19 20:50:56 mickey Exp $ */
33
34 /*
35 * Copyright (c) 1998-2000 Michael Shalayeff
36 * All rights reserved.
37 *
38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions
40 * are met:
41 * 1. Redistributions of source code must retain the above copyright
42 * notice, this list of conditions and the following disclaimer.
43 * 2. Redistributions in binary form must reproduce the above copyright
44 * notice, this list of conditions and the following disclaimer in the
45 * documentation and/or other materials provided with the distribution.
46 * 3. All advertising materials mentioning features or use of this software
47 * must display the following acknowledgement:
48 * This product includes software developed by Michael Shalayeff.
49 * 4. The name of the author may not be used to endorse or promote products
50 * derived from this software without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
53 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
54 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
55 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
56 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
57 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
59 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
61 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62 */
63
64 #include <sys/cdefs.h>
65 __KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.59 2009/04/30 07:01:27 skrll Exp $");
66
67 /* #define INTRDEBUG */
68 /* #define TRAPDEBUG */
69 /* #define USERTRACE */
70
71 #include "opt_kgdb.h"
72 #include "opt_ptrace.h"
73 #include "opt_sa.h"
74
75 #include <sys/param.h>
76 #include <sys/systm.h>
77 #include <sys/kernel.h>
78 #include <sys/syscall.h>
79 #include <sys/syscallvar.h>
80 #include <sys/sa.h>
81 #include <sys/savar.h>
82 #include <sys/mutex.h>
83 #include <sys/ktrace.h>
84 #include <sys/proc.h>
85 #include <sys/signalvar.h>
86 #include <sys/user.h>
87 #include <sys/acct.h>
88 #include <sys/signal.h>
89 #include <sys/device.h>
90 #include <sys/pool.h>
91 #include <sys/userret.h>
92
93 #include <net/netisr.h>
94
95 #ifdef KGDB
96 #include <sys/kgdb.h>
97 #endif
98
99 #include <uvm/uvm.h>
100
101 #include <machine/iomod.h>
102 #include <machine/cpufunc.h>
103 #include <machine/reg.h>
104 #include <machine/autoconf.h>
105
106 #include <machine/db_machdep.h>
107
108 #include <hppa/hppa/machdep.h>
109
110 #include <ddb/db_output.h>
111 #include <ddb/db_interface.h>
112
113 #ifdef PTRACE
114 void ss_clear_breakpoints(struct lwp *l);
115 int ss_put_value(struct lwp *, vaddr_t, u_int);
116 int ss_get_value(struct lwp *, vaddr_t, u_int *);
117 #endif
118
119 /* single-step breakpoint */
120 #define SSBREAKPOINT (HPPA_BREAK_KERNEL | (HPPA_BREAK_SS << 13))
121
122 #if defined(DEBUG) || defined(DIAGNOSTIC)
123 /*
124 * 0x6fc1000 is a stwm r1, d(sr0, sp), which is the last
125 * instruction in the function prologue that gcc -O0 uses.
126 * When we have this instruction we know the relationship
127 * between the stack pointer and the gcc -O0 frame pointer
128 * (in r3, loaded with the initial sp) for the body of a
129 * function.
130 *
131 * If the given instruction is a stwm r1, d(sr0, sp) where
132 * d > 0, we evaluate to d, else we evaluate to zero.
133 */
134 #define STWM_R1_D_SR0_SP(inst) \
135 (((inst) & 0xffffc001) == 0x6fc10000 ? (((inst) & 0x00003ff) >> 1) : 0)
136 #endif /* DEBUG || DIAGNOSTIC */
137
138 const char *trap_type[] = {
139 "invalid",
140 "HPMC",
141 "power failure",
142 "recovery counter",
143 "external interrupt",
144 "LPMC",
145 "ITLB miss fault",
146 "instruction protection",
147 "Illegal instruction",
148 "break instruction",
149 "privileged operation",
150 "privileged register",
151 "overflow",
152 "conditional",
153 "assist exception",
154 "DTLB miss",
155 "ITLB non-access miss",
156 "DTLB non-access miss",
157 "data protection/rights/alignment",
158 "data break",
159 "TLB dirty",
160 "page reference",
161 "assist emulation",
162 "higher-priv transfer",
163 "lower-priv transfer",
164 "taken branch",
165 "data access rights",
166 "data protection",
167 "unaligned data ref",
168 };
169 int trap_types = sizeof(trap_type)/sizeof(trap_type[0]);
170
171 uint8_t fpopmap[] = {
172 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 };
181
182 volatile int astpending;
183
184 void pmap_hptdump(void);
185 void syscall(struct trapframe *, int *);
186
187 #if defined(DEBUG)
188 struct trapframe *sanity_frame;
189 struct lwp *sanity_lwp;
190 int sanity_checked = 0;
191 void frame_sanity_check(int, int, struct trapframe *, struct lwp *);
192 #endif
193
194
195 #ifdef USERTRACE
196 /*
197 * USERTRACE is a crude facility that traces the PC of
198 * a single user process. This tracing is normally
199 * activated by the dispatching of a certain syscall
200 * with certain arguments - see the activation code in
201 * syscall().
202 */
203 static void user_backtrace(struct trapframe *, struct lwp *, int);
204 static void user_backtrace_raw(u_int, u_int);
205
206 u_int rctr_next_iioq;
207 #endif
208
209 static inline void
210 userret(struct lwp *l, register_t pc, u_quad_t oticks)
211 {
212 struct proc *p = l->l_proc;
213
214 if (curcpu()->ci_want_resched) {
215 preempt();
216 }
217
218 mi_userret(l);
219
220 /*
221 * If profiling, charge recent system time to the trapped pc.
222 */
223 if (p->p_stflag & PST_PROFIL) {
224 extern int psratio;
225
226 addupc_task(l, pc, (int)(p->p_sticks - oticks) * psratio);
227 }
228 }
229
230 /*
231 * This handles some messy kernel debugger details.
232 * It dispatches into either kgdb or DDB, and knows
233 * about some special things to do, like skipping over
234 * break instructions and how to really set up for
235 * a single-step.
236 */
237 #if defined(KGDB) || defined(DDB)
238 static int
239 trap_kdebug(int type, int code, struct trapframe *frame)
240 {
241 int handled;
242 u_int tf_iioq_head_old;
243 u_int tf_iioq_tail_old;
244
245 for(;;) {
246
247 /* This trap has not been handled. */
248 handled = 0;
249
250 /* Remember the instruction offset queue. */
251 tf_iioq_head_old = frame->tf_iioq_head;
252 tf_iioq_tail_old = frame->tf_iioq_tail;
253
254 #ifdef KGDB
255 /* Let KGDB handle it (if connected) */
256 if (!handled)
257 handled = kgdb_trap(type, frame);
258 #endif
259 #ifdef DDB
260 /* Let DDB handle it. */
261 if (!handled)
262 handled = kdb_trap(type, code, frame);
263 #endif
264
265 /* If this trap wasn't handled, return now. */
266 if (!handled)
267 return(0);
268
269 /*
270 * If the instruction offset queue head changed,
271 * but the offset queue tail didn't, assume that
272 * the user wants to jump to the head offset, and
273 * adjust the tail accordingly. This should fix
274 * the kgdb `jump' command, and can help DDB users
275 * who `set' the offset head but forget the tail.
276 */
277 if (frame->tf_iioq_head != tf_iioq_head_old &&
278 frame->tf_iioq_tail == tf_iioq_tail_old)
279 frame->tf_iioq_tail = frame->tf_iioq_head + 4;
280
281 /*
282 * This is some single-stepping support.
283 * If we're trying to step through a nullified
284 * instruction, just advance by hand and trap
285 * again. Otherwise, load the recovery counter
286 * with zero.
287 */
288 if (frame->tf_ipsw & PSW_R) {
289 #ifdef TRAPDEBUG
290 printf("(single stepping at head 0x%x tail 0x%x)\n",
291 frame->tf_iioq_head, frame->tf_iioq_tail);
292 #endif
293 if (frame->tf_ipsw & PSW_N) {
294 #ifdef TRAPDEBUG
295 printf("(single stepping past nullified)\n");
296 #endif
297
298 /* Advance the program counter. */
299 frame->tf_iioq_head = frame->tf_iioq_tail;
300 frame->tf_iioq_tail = frame->tf_iioq_head + 4;
301
302 /* Clear flags. */
303 frame->tf_ipsw &= ~(PSW_N|PSW_X|PSW_Y|PSW_Z|PSW_B|PSW_T|PSW_H|PSW_L);
304
305 /* Simulate another trap. */
306 type = T_RECOVERY;
307 continue;
308 }
309 frame->tf_rctr = 0;
310 }
311
312 /* We handled this trap. */
313 return (1);
314 }
315 /* NOTREACHED */
316 }
317 #else /* !KGDB && !DDB */
318 #define trap_kdebug(t, c, f) (0)
319 #endif /* !KGDB && !DDB */
320
321 #if defined(DEBUG) || defined(USERTRACE)
322 /*
323 * These functions give a crude usermode backtrace. They
324 * really only work when code has been compiled without
325 * optimization, as they assume a certain function prologue
326 * sets up a frame pointer and stores the return pointer
327 * and arguments in it.
328 */
329 static void
330 user_backtrace_raw(u_int pc, u_int fp)
331 {
332 int frame_number;
333 int arg_number;
334
335 for (frame_number = 0;
336 frame_number < 100 && pc > HPPA_PC_PRIV_MASK && fp;
337 frame_number++) {
338
339 printf("%3d: pc=%08x%s fp=0x%08x", frame_number,
340 pc & ~HPPA_PC_PRIV_MASK, USERMODE(pc) ? " " : "**", fp);
341 for(arg_number = 0; arg_number < 4; arg_number++)
342 printf(" arg%d=0x%08x", arg_number,
343 (int) fuword(HPPA_FRAME_CARG(arg_number, fp)));
344 printf("\n");
345 pc = fuword(((register_t *) fp) - 5); /* fetch rp */
346 if (pc == -1) {
347 printf(" fuword for pc failed\n");
348 break;
349 }
350 fp = fuword(((register_t *) fp) + 0); /* fetch previous fp */
351 if (fp == -1) {
352 printf(" fuword for fp failed\n");
353 break;
354 }
355 }
356 printf(" backtrace stopped with pc %08x fp 0x%08x\n", pc, fp);
357 }
358
359 static void
360 user_backtrace(struct trapframe *tf, struct lwp *l, int type)
361 {
362 struct proc *p = l->l_proc;
363 u_int pc, fp, inst;
364
365 /*
366 * Display any trap type that we have.
367 */
368 if (type >= 0)
369 printf("pid %d (%s) trap #%d\n",
370 p->p_pid, p->p_comm, type & ~T_USER);
371
372 /*
373 * Assuming that the frame pointer in r3 is valid,
374 * dump out a stack trace.
375 */
376 fp = tf->tf_r3;
377 printf("pid %d (%s) backtrace, starting with fp 0x%08x\n",
378 p->p_pid, p->p_comm, fp);
379 user_backtrace_raw(tf->tf_iioq_head, fp);
380
381 /*
382 * In case the frame pointer in r3 is not valid,
383 * assuming the stack pointer is valid and the
384 * faulting function is a non-leaf, if we can
385 * find its prologue we can recover its frame
386 * pointer.
387 */
388 pc = tf->tf_iioq_head;
389 fp = tf->tf_sp - HPPA_FRAME_SIZE;
390 printf("pid %d (%s) backtrace, starting with sp 0x%08x pc 0x%08x\n",
391 p->p_pid, p->p_comm, tf->tf_sp, pc);
392 for (pc &= ~HPPA_PC_PRIV_MASK; pc > 0; pc -= sizeof(inst)) {
393 inst = fuword((register_t *) pc);
394 if (inst == -1) {
395 printf(" fuword for inst at pc %08x failed\n", pc);
396 break;
397 }
398 /* Check for the prologue instruction that sets sp. */
399 if (STWM_R1_D_SR0_SP(inst)) {
400 fp = tf->tf_sp - STWM_R1_D_SR0_SP(inst);
401 printf(" sp from fp at pc %08x: %08x\n", pc, inst);
402 break;
403 }
404 }
405 user_backtrace_raw(tf->tf_iioq_head, fp);
406 }
407 #endif /* DEBUG || USERTRACE */
408
409 #ifdef DEBUG
410 /*
411 * This sanity-checks a trapframe. It is full of various
412 * assumptions about what a healthy CPU state should be,
413 * with some documented elsewhere, some not.
414 */
415 void
416 frame_sanity_check(int where, int type, struct trapframe *tf, struct lwp *l)
417 {
418 extern int kernel_text;
419 extern int etext;
420 extern register_t kpsw;
421 #define SANITY(e) \
422 do { \
423 if (sanity_frame == NULL && !(e)) { \
424 sanity_frame = tf; \
425 sanity_lwp = l; \
426 sanity_checked = __LINE__; \
427 } \
428 } while (/* CONSTCOND */ 0)
429
430 SANITY((tf->tf_ipsw & kpsw) == kpsw);
431 SANITY((kpsw & PSW_I) == 0 || tf->tf_eiem != 0);
432 if (tf->tf_iisq_head == HPPA_SID_KERNEL) {
433 vaddr_t minsp, maxsp;
434
435 /*
436 * If the trap happened in the gateway
437 * page, we take the easy way out and
438 * assume that the trapframe is okay.
439 */
440 if ((tf->tf_iioq_head & ~PAGE_MASK) == SYSCALLGATE)
441 goto out;
442
443 SANITY(!USERMODE(tf->tf_iioq_head));
444 SANITY(!USERMODE(tf->tf_iioq_tail));
445
446 /*
447 * Don't check the instruction queues or stack on interrupts
448 * as we could be be in the sti code (outside normal kernel
449 * text) or switching LWPs (curlwp and sp are not in sync)
450 */
451 if ((type & ~T_USER) == T_INTERRUPT)
452 goto out;
453
454 SANITY(tf->tf_iioq_head >= (u_int) &kernel_text);
455 SANITY(tf->tf_iioq_head < (u_int) &etext);
456 SANITY(tf->tf_iioq_tail >= (u_int) &kernel_text);
457 SANITY(tf->tf_iioq_tail < (u_int) &etext);
458
459 maxsp = (u_int)(l->l_addr) + USPACE + PAGE_SIZE;
460 minsp = (u_int)(l->l_addr) + PAGE_SIZE;
461
462 SANITY(l != NULL || (tf->tf_sp >= minsp && tf->tf_sp < maxsp));
463 } else {
464 SANITY(USERMODE(tf->tf_iioq_head));
465 SANITY(USERMODE(tf->tf_iioq_tail));
466 SANITY(l != NULL && tf->tf_cr30 == kvtop((void *)l->l_addr));
467 }
468 #undef SANITY
469 out:
470 if (sanity_frame == tf) {
471 printf("insanity: where 0x%x type 0x%x tf %p lwp %p line %d "
472 "sp 0x%x pc 0x%x\n",
473 where, type, sanity_frame, sanity_lwp, sanity_checked,
474 tf->tf_sp, tf->tf_iioq_head);
475 (void) trap_kdebug(T_IBREAK, 0, tf);
476 sanity_frame = NULL;
477 sanity_lwp = NULL;
478 sanity_checked = 0;
479 }
480 }
481 #endif /* DEBUG */
482
483 void
484 trap(int type, struct trapframe *frame)
485 {
486 struct lwp *l;
487 struct proc *p;
488 struct pcb *pcbp;
489 vaddr_t va;
490 struct vm_map *map;
491 struct vmspace *vm;
492 vm_prot_t vftype;
493 pa_space_t space;
494 ksiginfo_t ksi;
495 u_int opcode, onfault;
496 int ret;
497 const char *tts;
498 int type_raw;
499 #ifdef DIAGNOSTIC
500 extern int emergency_stack_start, emergency_stack_end;
501 #endif
502
503 type_raw = type & ~T_USER;
504 opcode = frame->tf_iir;
505 if (type_raw == T_ITLBMISS || type_raw == T_ITLBMISSNA ||
506 type_raw == T_IBREAK || type_raw == T_TAKENBR) {
507 va = frame->tf_iioq_head;
508 space = frame->tf_iisq_head;
509 vftype = VM_PROT_EXECUTE;
510 } else {
511 va = frame->tf_ior;
512 space = frame->tf_isr;
513 vftype = inst_store(opcode) ? VM_PROT_WRITE : VM_PROT_READ;
514 }
515
516 l = curlwp;
517 p = l ? l->l_proc : NULL;
518 if ((type & T_USER) != 0)
519 LWP_CACHE_CREDS(l, p);
520
521 tts = (type & ~T_USER) > trap_types ? "reserved" :
522 trap_type[type & ~T_USER];
523
524 #ifdef DIAGNOSTIC
525 /*
526 * If we are on the emergency stack, then we either got
527 * a fault on the kernel stack, or we're just handling
528 * a trap for the machine check handler (which also
529 * runs on the emergency stack).
530 *
531 * We *very crudely* differentiate between the two cases
532 * by checking the faulting instruction: if it is the
533 * function prologue instruction that stores the old
534 * frame pointer and updates the stack pointer, we assume
535 * that we faulted on the kernel stack.
536 *
537 * In this case, not completing that instruction will
538 * probably confuse backtraces in kgdb/ddb. Completing
539 * it would be difficult, because we already faulted on
540 * that part of the stack, so instead we fix up the
541 * frame as if the function called has just returned.
542 * This has peculiar knowledge about what values are in
543 * what registers during the "normal gcc -g" prologue.
544 */
545 if (&type >= &emergency_stack_start &&
546 &type < &emergency_stack_end &&
547 type != T_IBREAK && STWM_R1_D_SR0_SP(opcode)) {
548 /* Restore the caller's frame pointer. */
549 frame->tf_r3 = frame->tf_r1;
550 /* Restore the caller's instruction offsets. */
551 frame->tf_iioq_head = frame->tf_rp;
552 frame->tf_iioq_tail = frame->tf_iioq_head + 4;
553 goto dead_end;
554 }
555 #endif /* DIAGNOSTIC */
556
557 #ifdef DEBUG
558 frame_sanity_check(0xdead01, type, frame, l);
559 #endif /* DEBUG */
560
561 /* If this is a trap, not an interrupt, reenable interrupts. */
562 if (type_raw != T_INTERRUPT)
563 mtctl(frame->tf_eiem, CR_EIEM);
564
565 if (frame->tf_flags & TFF_LAST)
566 l->l_md.md_regs = frame;
567
568 #ifdef TRAPDEBUG
569 if (type_raw != T_INTERRUPT && type_raw != T_IBREAK)
570 printf("trap: %d, %s for %x:%x at %x:%x, fp=%p, rp=%x\n",
571 type, tts, space, (u_int)va, frame->tf_iisq_head,
572 frame->tf_iioq_head, frame, frame->tf_rp);
573 else if (type_raw == T_IBREAK)
574 printf("trap: break instruction %x:%x at %x:%x, fp=%p\n",
575 break5(opcode), break13(opcode),
576 frame->tf_iisq_head, frame->tf_iioq_head, frame);
577
578 {
579 extern int etext;
580 if (frame < (struct trapframe *)&etext) {
581 printf("trap: bogus frame ptr %p\n", frame);
582 goto dead_end;
583 }
584 }
585 #endif
586 switch (type) {
587 case T_NONEXIST:
588 case T_NONEXIST|T_USER:
589 #if !defined(DDB) && !defined(KGDB)
590 /* we've got screwed up by the central scrutinizer */
591 panic ("trap: elvis has just left the building!");
592 break;
593 #else
594 goto dead_end;
595 #endif
596 case T_RECOVERY|T_USER:
597 #ifdef USERTRACE
598 for(;;) {
599 if (frame->tf_iioq_head != rctr_next_iioq)
600 printf("-%08x\nr %08x",
601 rctr_next_iioq - 4,
602 frame->tf_iioq_head);
603 rctr_next_iioq = frame->tf_iioq_head + 4;
604 if (frame->tf_ipsw & PSW_N) {
605 /* Advance the program counter. */
606 frame->tf_iioq_head = frame->tf_iioq_tail;
607 frame->tf_iioq_tail = frame->tf_iioq_head + 4;
608 /* Clear flags. */
609 frame->tf_ipsw &= ~(PSW_N|PSW_X|PSW_Y|PSW_Z|PSW_B|PSW_T|PSW_H|PSW_L);
610 /* Simulate another trap. */
611 continue;
612 }
613 break;
614 }
615 frame->tf_rctr = 0;
616 break;
617 #endif /* USERTRACE */
618 case T_RECOVERY:
619 #if !defined(DDB) && !defined(KGDB)
620 /* XXX will implement later */
621 printf ("trap: handicapped");
622 break;
623 #else
624 goto dead_end;
625 #endif
626
627 case T_EMULATION | T_USER:
628 #ifdef FPEMUL
629 hppa_fpu_emulate(frame, l, opcode);
630 #else /* !FPEMUL */
631 /*
632 * We don't have FPU emulation, so signal the
633 * process with a SIGFPE.
634 */
635
636 KSI_INIT_TRAP(&ksi);
637 ksi.ksi_signo = SIGFPE;
638 ksi.ksi_code = SI_NOINFO;
639 ksi.ksi_trap = type;
640 ksi.ksi_addr = (void *)frame->tf_iioq_head;
641 trapsignal(l, &ksi);
642 #endif /* !FPEMUL */
643 break;
644
645 case T_DATALIGN:
646 if (l->l_addr->u_pcb.pcb_onfault) {
647 do_onfault:
648 pcbp = &l->l_addr->u_pcb;
649 frame->tf_iioq_tail = 4 +
650 (frame->tf_iioq_head =
651 pcbp->pcb_onfault);
652 pcbp->pcb_onfault = 0;
653 break;
654 }
655 /*FALLTHROUGH*/
656
657 #ifdef DIAGNOSTIC
658 /* these just can't happen ever */
659 case T_PRIV_OP:
660 case T_PRIV_REG:
661 /* these just can't make it to the trap() ever */
662 case T_HPMC:
663 case T_HPMC | T_USER:
664 case T_EMULATION:
665 case T_EXCEPTION:
666 #endif
667 case T_IBREAK:
668 case T_DBREAK:
669 dead_end:
670 if (type & T_USER) {
671 #ifdef DEBUG
672 user_backtrace(frame, l, type);
673 #endif
674 KSI_INIT_TRAP(&ksi);
675 ksi.ksi_signo = SIGILL;
676 ksi.ksi_code = ILL_ILLTRP;
677 ksi.ksi_trap = type;
678 ksi.ksi_addr = (void *)frame->tf_iioq_head;
679 trapsignal(l, &ksi);
680 break;
681 }
682 if (trap_kdebug(type, va, frame))
683 return;
684 else if (type == T_DATALIGN)
685 panic ("trap: %s at 0x%x", tts, (u_int) va);
686 else
687 panic ("trap: no debugger for \"%s\" (%d)", tts, type);
688 break;
689
690 case T_IBREAK | T_USER:
691 case T_DBREAK | T_USER:
692 KSI_INIT_TRAP(&ksi);
693 ksi.ksi_signo = SIGTRAP;
694 ksi.ksi_code = TRAP_TRACE;
695 ksi.ksi_trap = type_raw;
696 ksi.ksi_addr = (void *)frame->tf_iioq_head;
697 #ifdef PTRACE
698 ss_clear_breakpoints(l);
699 if (opcode == SSBREAKPOINT)
700 ksi.ksi_code = TRAP_BRKPT;
701 #endif
702 /* pass to user debugger */
703 trapsignal(l, &ksi);
704
705 break;
706
707 #ifdef PTRACE
708 case T_TAKENBR | T_USER:
709 ss_clear_breakpoints(l);
710
711 KSI_INIT_TRAP(&ksi);
712 ksi.ksi_signo = SIGTRAP;
713 ksi.ksi_code = TRAP_TRACE;
714 ksi.ksi_trap = type_raw;
715 ksi.ksi_addr = (void *)frame->tf_iioq_head;
716
717 /* pass to user debugger */
718 trapsignal(l, &ksi);
719 break;
720 #endif
721
722 case T_EXCEPTION | T_USER: { /* co-proc assist trap */
723 uint64_t *fpp;
724 uint32_t *pex, ex, inst;
725 int i;
726
727 hppa_fpu_flush(l);
728 fpp = l->l_addr->u_pcb.pcb_fpregs;
729 pex = (uint32_t *)&fpp[1];
730 for (i = 1; i < 8 && !*pex; i++, pex++)
731 ;
732 KASSERT(i < 8);
733 ex = *pex;
734 *pex = 0;
735
736 /* reset the trap flag, as if there was none */
737 fpp[0] &= ~(((uint64_t)HPPA_FPU_T) << 32);
738
739 /* emulate the instruction */
740 inst = ((uint32_t)fpopmap[ex >> 26] << 26) | (ex & 0x03ffffff);
741 hppa_fpu_emulate(frame, l, inst);
742 }
743 break;
744
745 case T_OVERFLOW | T_USER:
746 KSI_INIT_TRAP(&ksi);
747 ksi.ksi_signo = SIGFPE;
748 ksi.ksi_code = SI_NOINFO;
749 ksi.ksi_trap = type;
750 ksi.ksi_addr = (void *)va;
751 trapsignal(l, &ksi);
752 break;
753
754 case T_CONDITION | T_USER:
755 KSI_INIT_TRAP(&ksi);
756 ksi.ksi_signo = SIGFPE;
757 ksi.ksi_code = FPE_INTDIV;
758 ksi.ksi_trap = type;
759 ksi.ksi_addr = (void *)va;
760 trapsignal(l, &ksi);
761 break;
762
763 case T_ILLEGAL | T_USER:
764 #ifdef DEBUG
765 user_backtrace(frame, l, type);
766 #endif
767 KSI_INIT_TRAP(&ksi);
768 ksi.ksi_signo = SIGILL;
769 ksi.ksi_code = ILL_ILLOPC;
770 ksi.ksi_trap = type;
771 ksi.ksi_addr = (void *)va;
772 trapsignal(l, &ksi);
773 break;
774
775 case T_PRIV_OP | T_USER:
776 #ifdef DEBUG
777 user_backtrace(frame, l, type);
778 #endif
779 KSI_INIT_TRAP(&ksi);
780 ksi.ksi_signo = SIGILL;
781 ksi.ksi_code = ILL_PRVOPC;
782 ksi.ksi_trap = type;
783 ksi.ksi_addr = (void *)va;
784 trapsignal(l, &ksi);
785 break;
786
787 case T_PRIV_REG | T_USER:
788 #ifdef DEBUG
789 user_backtrace(frame, l, type);
790 #endif
791 KSI_INIT_TRAP(&ksi);
792 ksi.ksi_signo = SIGILL;
793 ksi.ksi_code = ILL_PRVREG;
794 ksi.ksi_trap = type;
795 ksi.ksi_addr = (void *)va;
796 trapsignal(l, &ksi);
797 break;
798
799 /* these should never got here */
800 case T_HIGHERPL | T_USER:
801 case T_LOWERPL | T_USER:
802 KSI_INIT_TRAP(&ksi);
803 ksi.ksi_signo = SIGSEGV;
804 ksi.ksi_code = SEGV_ACCERR;
805 ksi.ksi_trap = type;
806 ksi.ksi_addr = (void *)va;
807 trapsignal(l, &ksi);
808 break;
809
810 case T_IPROT | T_USER:
811 case T_DPROT | T_USER:
812 KSI_INIT_TRAP(&ksi);
813 ksi.ksi_signo = SIGSEGV;
814 ksi.ksi_code = SEGV_ACCERR;
815 ksi.ksi_trap = type;
816 ksi.ksi_addr = (void *)va;
817 trapsignal(l, &ksi);
818 break;
819
820 case T_DATACC: case T_USER | T_DATACC:
821 case T_ITLBMISS: case T_USER | T_ITLBMISS:
822 case T_DTLBMISS: case T_USER | T_DTLBMISS:
823 case T_ITLBMISSNA: case T_USER | T_ITLBMISSNA:
824 case T_DTLBMISSNA: case T_USER | T_DTLBMISSNA:
825 case T_TLB_DIRTY: case T_USER | T_TLB_DIRTY:
826 vm = p->p_vmspace;
827
828 if (!vm) {
829 #ifdef TRAPDEBUG
830 printf("trap: no vm, p=%p\n", p);
831 #endif
832 goto dead_end;
833 }
834
835 /*
836 * it could be a kernel map for exec_map faults
837 */
838 if (!(type & T_USER) && space == HPPA_SID_KERNEL)
839 map = kernel_map;
840 else {
841 map = &vm->vm_map;
842 if ((l->l_flag & LW_SA)
843 && (~l->l_pflag & LP_SA_NOBLOCK)) {
844 l->l_savp->savp_faultaddr = va;
845 l->l_pflag |= LP_SA_PAGEFAULT;
846 }
847 }
848
849 va = trunc_page(va);
850
851 if (map->pmap->pm_space != space) {
852 #ifdef TRAPDEBUG
853 printf("trap: space mismatch %d != %d\n",
854 space, map->pmap->pm_space);
855 #endif
856 /* actually dump the user, crap the kernel */
857 goto dead_end;
858 }
859
860 /* Never call uvm_fault in interrupt context. */
861 KASSERT(hppa_intr_depth == 0);
862
863 onfault = l->l_addr->u_pcb.pcb_onfault;
864 l->l_addr->u_pcb.pcb_onfault = 0;
865 ret = uvm_fault(map, va, vftype);
866 l->l_addr->u_pcb.pcb_onfault = onfault;
867
868 #ifdef TRAPDEBUG
869 printf("uvm_fault(%p, %x, %d)=%d\n",
870 map, (u_int)va, vftype, ret);
871 #endif
872
873 if (map != kernel_map)
874 l->l_pflag &= ~LP_SA_PAGEFAULT;
875
876 /*
877 * If this was a stack access we keep track of the maximum
878 * accessed stack size. Also, if uvm_fault gets a protection
879 * failure it is due to accessing the stack region outside
880 * the current limit and we need to reflect that as an access
881 * error.
882 */
883 if (map != kernel_map && va >= (vaddr_t)vm->vm_minsaddr) {
884 if (ret == 0)
885 uvm_grow(l->l_proc, va);
886 else if (ret == EACCES)
887 ret = EFAULT;
888 }
889
890 if (ret != 0) {
891 if (type & T_USER) {
892 #ifdef DEBUG
893 user_backtrace(frame, l, type);
894 #endif
895 KSI_INIT_TRAP(&ksi);
896 ksi.ksi_signo = SIGSEGV;
897 ksi.ksi_code = (ret == EACCES ?
898 SEGV_ACCERR : SEGV_MAPERR);
899 ksi.ksi_trap = type;
900 ksi.ksi_addr = (void *)va;
901 trapsignal(l, &ksi);
902 } else {
903 if (l->l_addr->u_pcb.pcb_onfault) {
904 goto do_onfault;
905 }
906 panic("trap: uvm_fault(%p, %lx, %d): %d",
907 map, va, vftype, ret);
908 }
909 }
910 break;
911
912 case T_DATALIGN | T_USER:
913 #ifdef DEBUG
914 user_backtrace(frame, l, type);
915 #endif
916 KSI_INIT_TRAP(&ksi);
917 ksi.ksi_signo = SIGBUS;
918 ksi.ksi_code = BUS_ADRALN;
919 ksi.ksi_trap = type;
920 ksi.ksi_addr = (void *)va;
921 trapsignal(l, &ksi);
922 break;
923
924 case T_INTERRUPT:
925 case T_INTERRUPT|T_USER:
926 hppa_intr(frame);
927 mtctl(frame->tf_eiem, CR_EIEM);
928 break;
929
930 case T_LOWERPL:
931 case T_DPROT:
932 case T_IPROT:
933 case T_OVERFLOW:
934 case T_CONDITION:
935 case T_ILLEGAL:
936 case T_HIGHERPL:
937 case T_TAKENBR:
938 case T_POWERFAIL:
939 case T_LPMC:
940 case T_PAGEREF:
941 case T_DATAPID: case T_DATAPID | T_USER:
942 if (0 /* T-chip */) {
943 break;
944 }
945 /* FALLTHROUGH to unimplemented */
946 default:
947 panic ("trap: unimplemented \'%s\' (%d)", tts, type);
948 }
949
950 if (type & T_USER)
951 userret(l, l->l_md.md_regs->tf_iioq_head, 0);
952
953 #ifdef DEBUG
954 frame_sanity_check(0xdead02, type, frame, l);
955 if (frame->tf_flags & TFF_LAST && (curlwp->l_flag & LW_IDLE) == 0)
956 frame_sanity_check(0xdead03, type, curlwp->l_md.md_regs,
957 curlwp);
958 #endif /* DEBUG */
959 }
960
961 void
962 child_return(void *arg)
963 {
964 struct lwp *l = arg;
965
966 userret(l, l->l_md.md_regs->tf_iioq_head, 0);
967 ktrsysret(SYS_fork, 0, 0);
968 #ifdef DEBUG
969 frame_sanity_check(0xdead04, 0, l->l_md.md_regs, l);
970 #endif /* DEBUG */
971 }
972
973 #ifdef PTRACE
974
975 #include <sys/ptrace.h>
976
977 int
978 ss_get_value(struct lwp *l, vaddr_t addr, u_int *value)
979 {
980 struct uio uio;
981 struct iovec iov;
982
983 iov.iov_base = (void *)value;
984 iov.iov_len = sizeof(u_int);
985 uio.uio_iov = &iov;
986 uio.uio_iovcnt = 1;
987 uio.uio_offset = (off_t)addr;
988 uio.uio_resid = sizeof(u_int);
989 uio.uio_rw = UIO_READ;
990 UIO_SETUP_SYSSPACE(&uio);
991
992 return (process_domem(curlwp, l, &uio));
993 }
994
995 int
996 ss_put_value(struct lwp *l, vaddr_t addr, u_int value)
997 {
998 struct uio uio;
999 struct iovec iov;
1000
1001 iov.iov_base = (void *)&value;
1002 iov.iov_len = sizeof(u_int);
1003 uio.uio_iov = &iov;
1004 uio.uio_iovcnt = 1;
1005 uio.uio_offset = (off_t)addr;
1006 uio.uio_resid = sizeof(u_int);
1007 uio.uio_rw = UIO_WRITE;
1008 UIO_SETUP_SYSSPACE(&uio);
1009
1010 return (process_domem(curlwp, l, &uio));
1011 }
1012
1013 void
1014 ss_clear_breakpoints(struct lwp *l)
1015 {
1016 /* Restore origional instructions. */
1017 if (l->l_md.md_bpva != 0) {
1018 ss_put_value(l, l->l_md.md_bpva, l->l_md.md_bpsave[0]);
1019 ss_put_value(l, l->l_md.md_bpva + 4, l->l_md.md_bpsave[1]);
1020 l->l_md.md_bpva = 0;
1021 }
1022 }
1023
1024
1025 int
1026 process_sstep(struct lwp *l, int sstep)
1027 {
1028 struct trapframe *tf = l->l_md.md_regs;
1029 int error;
1030
1031 ss_clear_breakpoints(l);
1032
1033 /* We're continuing... */
1034 /* Don't touch the syscall gateway page. */
1035 /* XXX head */
1036 if (sstep == 0 ||
1037 (tf->tf_iioq_tail & ~PAGE_MASK) == SYSCALLGATE) {
1038 tf->tf_ipsw &= ~PSW_T;
1039 return 0;
1040 }
1041
1042 l->l_md.md_bpva = tf->tf_iioq_tail & ~HPPA_PC_PRIV_MASK;
1043
1044 /*
1045 * Insert two breakpoint instructions; the first one might be
1046 * nullified. Of course we need to save two instruction
1047 * first.
1048 */
1049
1050 error = ss_get_value(l, l->l_md.md_bpva, &l->l_md.md_bpsave[0]);
1051 if (error)
1052 return (error);
1053 error = ss_get_value(l, l->l_md.md_bpva + 4, &l->l_md.md_bpsave[1]);
1054 if (error)
1055 return (error);
1056
1057 error = ss_put_value(l, l->l_md.md_bpva, SSBREAKPOINT);
1058 if (error)
1059 return error;
1060 error = ss_put_value(l, l->l_md.md_bpva + 4, SSBREAKPOINT);
1061 if (error)
1062 return error;
1063
1064 tf->tf_ipsw |= PSW_T;
1065
1066 return 0;
1067 }
1068 #endif
1069
1070
1071 /*
1072 * call actual syscall routine
1073 * from the low-level syscall handler:
1074 * - all HPPA_FRAME_NARGS syscall's arguments supposed to be copied onto
1075 * our stack, this wins compared to copyin just needed amount anyway
1076 * - register args are copied onto stack too
1077 */
1078 void
1079 syscall(struct trapframe *frame, int *args)
1080 {
1081 struct lwp *l;
1082 struct proc *p;
1083 const struct sysent *callp;
1084 int nsys, code, error;
1085 int tmp;
1086 int rval[2];
1087
1088 uvmexp.syscalls++;
1089
1090 #ifdef DEBUG
1091 frame_sanity_check(0xdead04, 0, frame, curlwp);
1092 #endif /* DEBUG */
1093
1094 if (!USERMODE(frame->tf_iioq_head))
1095 panic("syscall");
1096
1097 l = curlwp;
1098 p = l->l_proc;
1099 l->l_md.md_regs = frame;
1100 nsys = p->p_emul->e_nsysent;
1101 callp = p->p_emul->e_sysent;
1102 code = frame->tf_t1;
1103 LWP_CACHE_CREDS(l, p);
1104
1105 #ifdef KERN_SA
1106 if (__predict_false((l->l_savp)
1107 && (l->l_savp->savp_pflags & SAVP_FLAG_DELIVERING)))
1108 l->l_savp->savp_pflags &= ~SAVP_FLAG_DELIVERING;
1109 #endif
1110
1111 /*
1112 * Restarting a system call is touchy on the HPPA,
1113 * because syscall arguments are passed in registers
1114 * and the program counter of the syscall "point"
1115 * isn't easily divined.
1116 *
1117 * We handle the first problem by assuming that we
1118 * will have to restart this system call, so we
1119 * stuff the first four words of the original arguments
1120 * back into the frame as arg0...arg3, which is where
1121 * we found them in the first place. Any further
1122 * arguments are (still) on the user's stack and the
1123 * syscall code will fetch them from there (again).
1124 *
1125 * The program counter problem is addressed below.
1126 */
1127 frame->tf_arg0 = args[0];
1128 frame->tf_arg1 = args[1];
1129 frame->tf_arg2 = args[2];
1130 frame->tf_arg3 = args[3];
1131
1132 /*
1133 * Some special handling for the syscall(2) and
1134 * __syscall(2) system calls.
1135 */
1136 switch (code) {
1137 case SYS_syscall:
1138 code = *args;
1139 args += 1;
1140 break;
1141 case SYS___syscall:
1142 if (callp != sysent)
1143 break;
1144 /*
1145 * NB: even though __syscall(2) takes a quad_t
1146 * containing the system call number, because
1147 * our argument copying word-swaps 64-bit arguments,
1148 * the least significant word of that quad_t
1149 * is the first word in the argument array.
1150 */
1151 code = *args;
1152 args += 2;
1153 }
1154
1155 /*
1156 * Stacks growing from lower addresses to higher
1157 * addresses are not really such a good idea, because
1158 * it makes it impossible to overlay a struct on top
1159 * of C stack arguments (the arguments appear in
1160 * reversed order).
1161 *
1162 * You can do the obvious thing (as locore.S does) and
1163 * copy argument words one by one, laying them out in
1164 * the "right" order in the destination buffer, but this
1165 * ends up word-swapping multi-word arguments (like off_t).
1166 *
1167 * To compensate, we have some automatically-generated
1168 * code that word-swaps these multi-word arguments.
1169 * Right now the script that generates this code is
1170 * in Perl, because I don't know awk.
1171 *
1172 * FIXME - this works only on native binaries and
1173 * will probably screw up any and all emulation.
1174 */
1175 switch (code) {
1176 case SYS_pread:
1177 /*
1178 * syscallarg(int) fd;
1179 * syscallarg(void *) buf;
1180 * syscallarg(size_t) nbyte;
1181 * syscallarg(int) pad;
1182 * syscallarg(off_t) offset;
1183 */
1184 tmp = args[4];
1185 args[4] = args[4 + 1];
1186 args[4 + 1] = tmp;
1187 break;
1188 case SYS_pwrite:
1189 /*
1190 * syscallarg(int) fd;
1191 * syscallarg(const void *) buf;
1192 * syscallarg(size_t) nbyte;
1193 * syscallarg(int) pad;
1194 * syscallarg(off_t) offset;
1195 */
1196 tmp = args[4];
1197 args[4] = args[4 + 1];
1198 args[4 + 1] = tmp;
1199 break;
1200 case SYS_mmap:
1201 /*
1202 * syscallarg(void *) addr;
1203 * syscallarg(size_t) len;
1204 * syscallarg(int) prot;
1205 * syscallarg(int) flags;
1206 * syscallarg(int) fd;
1207 * syscallarg(long) pad;
1208 * syscallarg(off_t) pos;
1209 */
1210 tmp = args[6];
1211 args[6] = args[6 + 1];
1212 args[6 + 1] = tmp;
1213 break;
1214 case SYS_lseek:
1215 /*
1216 * syscallarg(int) fd;
1217 * syscallarg(int) pad;
1218 * syscallarg(off_t) offset;
1219 */
1220 tmp = args[2];
1221 args[2] = args[2 + 1];
1222 args[2 + 1] = tmp;
1223 break;
1224 case SYS_truncate:
1225 /*
1226 * syscallarg(const char *) path;
1227 * syscallarg(int) pad;
1228 * syscallarg(off_t) length;
1229 */
1230 tmp = args[2];
1231 args[2] = args[2 + 1];
1232 args[2 + 1] = tmp;
1233 break;
1234 case SYS_ftruncate:
1235 /*
1236 * syscallarg(int) fd;
1237 * syscallarg(int) pad;
1238 * syscallarg(off_t) length;
1239 */
1240 tmp = args[2];
1241 args[2] = args[2 + 1];
1242 args[2 + 1] = tmp;
1243 break;
1244 case SYS_preadv:
1245 /*
1246 * syscallarg(int) fd;
1247 * syscallarg(const struct iovec *) iovp;
1248 * syscallarg(int) iovcnt;
1249 * syscallarg(int) pad;
1250 * syscallarg(off_t) offset;
1251 */
1252 tmp = args[4];
1253 args[4] = args[4 + 1];
1254 args[4 + 1] = tmp;
1255 break;
1256 case SYS_pwritev:
1257 /*
1258 * syscallarg(int) fd;
1259 * syscallarg(const struct iovec *) iovp;
1260 * syscallarg(int) iovcnt;
1261 * syscallarg(int) pad;
1262 * syscallarg(off_t) offset;
1263 */
1264 tmp = args[4];
1265 args[4] = args[4 + 1];
1266 args[4 + 1] = tmp;
1267 break;
1268 case SYS___posix_fadvise50:
1269 /*
1270 * syscallarg(int) fd;
1271 * syscallarg(int) pad;
1272 * syscallarg(off_t) offset;
1273 * syscallarg(off_t) len;
1274 * syscallarg(int) advice;
1275 */
1276 tmp = args[2];
1277 args[2] = args[2 + 1];
1278 args[2 + 1] = tmp;
1279 tmp = args[4];
1280 args[4] = args[4 + 1];
1281 args[4 + 1] = tmp;
1282 case SYS___mknod50:
1283 /*
1284 * syscallarg(const char *) path;
1285 * syscallarg(mode_t) mode;
1286 * syscallarg(dev_t) dev;
1287 */
1288 tmp = args[2];
1289 args[2] = args[2 + 1];
1290 args[2 + 1] = tmp;
1291 default:
1292 break;
1293 }
1294
1295 #ifdef USERTRACE
1296 if (0) {
1297 user_backtrace(frame, l, -1);
1298 frame->tf_ipsw |= PSW_R;
1299 frame->tf_rctr = 0;
1300 printf("r %08x", frame->tf_iioq_head);
1301 rctr_next_iioq = frame->tf_iioq_head + 4;
1302 }
1303 #endif
1304
1305 if (code < 0 || code >= nsys)
1306 callp += p->p_emul->e_nosys; /* bad syscall # */
1307 else
1308 callp += code;
1309
1310 if ((error = trace_enter(code, args, callp->sy_narg)) != 0)
1311 goto out;
1312
1313 rval[0] = 0;
1314 rval[1] = 0;
1315 error = sy_call(callp, l, args, rval);
1316 out:
1317 switch (error) {
1318 case 0:
1319 l = curlwp; /* changes on exec() */
1320 frame = l->l_md.md_regs;
1321 frame->tf_ret0 = rval[0];
1322 frame->tf_ret1 = rval[1];
1323 frame->tf_t1 = 0;
1324 break;
1325 case ERESTART:
1326 /*
1327 * Now we have to wind back the instruction
1328 * offset queue to the point where the system
1329 * call will be made again. This is inherently
1330 * tied to the SYSCALL macro.
1331 *
1332 * Currently, the part of the SYSCALL macro
1333 * that we want to rerun reads as:
1334 *
1335 * ldil L%SYSCALLGATE, r1
1336 * ble 4(sr7, r1)
1337 * ldi __CONCAT(SYS_,x), t1
1338 * comb,<> %r0, %t1, __cerror
1339 *
1340 * And our offset queue head points to the
1341 * comb instruction. So we need to
1342 * subtract twelve to reach the ldil.
1343 */
1344 frame->tf_iioq_head -= 12;
1345 frame->tf_iioq_tail = frame->tf_iioq_head + 4;
1346 break;
1347 case EJUSTRETURN:
1348 p = curproc;
1349 break;
1350 default:
1351 if (p->p_emul->e_errno)
1352 error = p->p_emul->e_errno[error];
1353 frame->tf_t1 = error;
1354 break;
1355 }
1356
1357 trace_exit(code, rval, error);
1358
1359 userret(l, frame->tf_iioq_head, 0);
1360 #ifdef DEBUG
1361 frame_sanity_check(0xdead05, 0, frame, l);
1362 #endif /* DEBUG */
1363 }
1364
1365 /*
1366 * Start a new LWP
1367 */
1368 void
1369 startlwp(void *arg)
1370 {
1371 int err;
1372 ucontext_t *uc = arg;
1373 struct lwp *l = curlwp;
1374
1375 err = cpu_setmcontext(l, &uc->uc_mcontext, uc->uc_flags);
1376 #if DIAGNOSTIC
1377 if (err) {
1378 printf("Error %d from cpu_setmcontext.", err);
1379 }
1380 #endif
1381 pool_put(&lwp_uc_pool, uc);
1382
1383 userret(l, l->l_md.md_regs->tf_iioq_head, 0);
1384 }
1385
1386 /*
1387 * XXX This is a terrible name.
1388 */
1389 void
1390 upcallret(struct lwp *l)
1391 {
1392 userret(l, l->l_md.md_regs->tf_iioq_head, 0);
1393 }
1394