diff options
-rw-r--r-- | sys/arch/hppa/hppa/locore.S | 92 | ||||
-rw-r--r-- | sys/arch/hppa/include/cpufunc.h | 35 | ||||
-rw-r--r-- | sys/arch/hppa/include/trap.h | 4 |
3 files changed, 76 insertions, 55 deletions
diff --git a/sys/arch/hppa/hppa/locore.S b/sys/arch/hppa/hppa/locore.S index 3cb203c06a3..1daf747c734 100644 --- a/sys/arch/hppa/hppa/locore.S +++ b/sys/arch/hppa/hppa/locore.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.S,v 1.6 1999/04/20 20:36:06 mickey Exp $ */ +/* $OpenBSD: locore.S,v 1.7 1999/05/02 03:42:42 mickey Exp $ */ /* * Copyright (c) 1998,1999 Michael Shalayeff @@ -140,7 +140,7 @@ s_textsize */ ENTRY(__start) /* - * start(pdc, boothowto, bootdev, esym bootapiver, argv, argc) + * start(pdc, boothowto, bootdev, esym, bootapiver, argv, argc) * * pdc - PDC entry point (not used, HP-UX compatibility) * boothowto - boot flags (see "reboot.h") @@ -321,22 +321,6 @@ $noddb /* should never return... */ EXIT(__start) -ENTRY(set_psw) - mtctl r0,pcsq - mtctl r0,pcsq - ldil L%$set_psw,t1 - ldo R%$set_psw(t1),t1 - mtctl t1,pcoq - ldo 4(t1),t1 - mtctl t1,pcoq - mtctl arg0,ipsw - rfi - nop -$set_psw - bv 0(rp) - nop -EXIT(set_psw) - /* * Kernel Gateway Page (must be at known address) * System Call Gate @@ -609,7 +593,7 @@ $ivaaddr CTRAP(itlb,T_ITLBMISS) /* 6. instruction TLB miss fault */ ATRAP(iprot,T_IPROT) /* 7. instruction protection trap */ ATRAP(illegal,T_ILLEGAL)/* 8. Illegal instruction trap */ - ATRAP(ibreak,T_IBREAK) /* 9. break instruction trap */ + CTRAP(ibreak,T_IBREAK) /* 9. break instruction trap */ ATRAP(privop,T_PRIV_OP) /* 10. privileged operation trap */ ATRAP(privr,T_PRIV_REG) /* 11. privileged register trap */ ATRAP(ovrfl,T_OVERFLOW) /* 12. overflow trap */ @@ -808,6 +792,52 @@ $tlbret rfir nop + .export TLABEL(ibreak), code +TLABEL(ibreak) + mfctl iir, r16 + extru r16, 31, 5, r9 + comib,<>,n HPPA_BREAK_KERNEL, r9, TLABEL(all) + + /* If this was called by a user process then always pass it to trap() */ + mfctl pcoq, r8 + extru,= r8, 31, 2, r0 + b,n TLABEL(all) + + /* don't accept breaks from data segments */ + .import etext + ldil L%etext, r9 + ldo R%etext(r9), r9 + comb,<<,n r8, r9, TLABEL(all) + + /* now process all those `break' calls we make */ + extru r16, 18, 13, r9 + comib,<>,n HPPA_BREAK_GET_PSW, r9, $ibreak_ngetpsw + + b $ibreak_exit + mfctl ipsw, ret0 + +$ibreak_ngetpsw + comib,<>,n HPPA_BREAK_SET_PSW, r9, $ibreak_nsetpsw + + mfctl ipsw, ret0 + b $ibreak_exit + mtctl arg0, ipsw + +$ibreak_nsetpsw + b TLABEL(all) + nop + +$ibreak_exit + /* skip the break */ + mfctl pcoq, r8 + mfctl pcoq, r8 + mtctl r8, pcoq + add r8, 4, r8 + mtctl r8, pcoq + rfir + nop + + .export TLABEL(all), code TLABEL(all) /* r1 still has trap type */ @@ -1628,22 +1658,16 @@ ENTRY(switch_exit) EXIT(switch_exit) ENTRY(switch_trampoline) - /* TODO */ - bv 0(rp) - nop + /* XXX load curproc here? */ + bv 0(arg0) + copy arg1, arg0 EXIT(switch_trampoline) -ENTRY(child_return) - /* TODO */ - bv 0(rp) - nop -EXIT(child_return) - /* * Signal "trampoline" code. Invoked from RTE setup by sendsig(). */ ENTRY(sigcode) - /* TODO */ + /* TODO signal trampoline */ ALTENTRY(esigcode) bv 0(rp) nop @@ -1653,18 +1677,10 @@ EXIT(sigcode) ENTRY(linux_sigcode) ALTENTRY(linux_esigcode) - /* TODO */ + /* TODO linux signal trampoline */ bv 0(rp) nop EXIT(linix_esigcode) #endif /* COMPAT_LINUX */ - /* Leave this down here. It avoids a nasty, hard-to-fix bug in gas. */ - .space $PRIVATE$ - - .export $global$,data -$global$ - .word 0 - .end - diff --git a/sys/arch/hppa/include/cpufunc.h b/sys/arch/hppa/include/cpufunc.h index 4e6b0b89e6c..6dbe1e102d0 100644 --- a/sys/arch/hppa/include/cpufunc.h +++ b/sys/arch/hppa/include/cpufunc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpufunc.h,v 1.7 1999/04/20 19:29:12 mickey Exp $ */ +/* $OpenBSD: cpufunc.h,v 1.8 1999/05/02 03:41:45 mickey Exp $ */ /* * Copyright (c) 1998 Michael Shalayeff @@ -93,22 +93,25 @@ static __inline u_int mtsm(u_int mask) { return ret; } -#if 0 -static __inline void set_psw(u_int psw) { - __asm __volatile("mtctl %0, %%cr22\n\t" - "mtctl %%r0, %%cr17\n\t" - "mtctl %%r0, %%cr17\n\t" - "ldil L%%., %0\n\t" - "ldo R%%.+24(%0), %0\n\t" - "mtctl %0, %%cr18\n\t" - "ldo 4(%0), %0\n\t" - "mtctl %0, %%cr18\n\t" - "rfi\n\tnop\n\tnop" - :: "r" (psw)); +static __inline register_t get_psw(void) +{ + register u_int ret; + __asm __volatile("break %1, %2\n\tcopy %%ret0, %0" : "=r" (ret) + : "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_GET_PSW) + : "r28"); + return ret; } -#else -void set_psw __P((u_int psw)); -#endif + +static __inline register_t set_psw(register_t psw) +{ + register u_int ret; + __asm __volatile("copy %0, %%arg0\n\tbreak %1, %2\n\tcopy %%ret0, %0" + : "=r" (ret) + : "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_SET_PSW), "0" (psw) + : "r26", "r28"); + return ret; +} + #define fdce(sp,off) __asm __volatile("fdce 0(%0,%1)":: "i" (sp), "r" (off)) #define fice(sp,off) __asm __volatile("fice 0(%0,%1)":: "i" (sp), "r" (off)) diff --git a/sys/arch/hppa/include/trap.h b/sys/arch/hppa/include/trap.h index ab1a9b70241..5a1a63a98cd 100644 --- a/sys/arch/hppa/include/trap.h +++ b/sys/arch/hppa/include/trap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.h,v 1.3 1999/02/17 20:40:32 mickey Exp $ */ +/* $OpenBSD: trap.h,v 1.4 1999/05/02 03:41:45 mickey Exp $ */ /* * Copyright (c) 1988-1994, The University of Utah and @@ -85,6 +85,8 @@ #define HPPA_BREAK_IVA 7 #define HPPA_BREAK_PDC_IODC_CALL 8 #define HPPA_BREAK_GDB 8 /* Standard GDB breakpoint. */ +#define HPPA_BREAK_GET_PSW 9 +#define HPPA_BREAK_SET_PSW 10 /* * Tear apart a break instruction to find its type. |