summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/hppa/hppa/locore.S74
1 files changed, 45 insertions, 29 deletions
diff --git a/sys/arch/hppa/hppa/locore.S b/sys/arch/hppa/hppa/locore.S
index 4d910c38f86..4ede22ff14e 100644
--- a/sys/arch/hppa/hppa/locore.S
+++ b/sys/arch/hppa/hppa/locore.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.S,v 1.46 2001/09/20 18:33:03 mickey Exp $ */
+/* $OpenBSD: locore.S,v 1.47 2002/02/02 21:14:03 mickey Exp $ */
/*
* Copyright (c) 1998-2001 Michael Shalayeff
@@ -501,8 +501,8 @@ $bsd_syscall
*/
.import $syscall,code
.call
- ldil L%$syscall,r1
- be,n R%$syscall(sr7,r1)
+ ldil L%$syscall, t2
+ be,n R%$syscall(sr7, t2)
nop
.align NBPG
@@ -520,36 +520,38 @@ $trap_tmp_save /* XXX assumed to be aligned on 2048 */
$syscall
/*
*
- * t1: curproc
+ * t1: syscall number
* t2: user
* t3: args
* t4: user stack
*
- * N.B. we are trying to rely on the fact that bottom of kernel
- * stack contains a print of some past trapframe, so
- * we do not save hard to get information, but do restore
- * the whole context later on return anyway.
- * XXXXXX this is very bad. everything must be saved
*/
ldil L%curproc, t3
ldw R%curproc(sr1, t3), t3
+ copy sp, t4
ldw P_ADDR(sr1, t3), t2 /* XXX can use ,sl */
/* calculate kernel sp, load, create kernel stack frame */
- copy sp, t4
ldo NBPG+TRAPFRAME_SIZEOF(t2), t3
ldo HPPA_FRAME_SIZE+HPPA_FRAME_MAXARGS(t3), sp
stw t1, TF_R22 -TRAPFRAME_SIZEOF(sr1, t3) /* syscall # */
stw t4, TF_R30 -TRAPFRAME_SIZEOF(sr1, t3) /* user stack */
- stw r1, TF_CR15-TRAPFRAME_SIZEOF(sr1, t3) /* eiem */
+ ldil L%kpsw, t1
+ ldw R%kpsw(t1), t1
+ stw r1, TF_CR15-TRAPFRAME_SIZEOF(sr1, t3) /* eiem ,bc */
+ stw t1, TF_CR22-TRAPFRAME_SIZEOF(sr1, t3) /* ipsw */
+ mfsp sr3, t1
+ stw t1, TF_SR3-TRAPFRAME_SIZEOF(sr1, t3)
+ stw r28, TF_CR8-TRAPFRAME_SIZEOF(sr1, t3) /* pidr1 */
+ /* now we can allow interrupts to happen */
mtctl r1, eiem
/*
* we believe that any callee-save registers
* will be saved accordingly in either syscall()
- * or deeper called functions
+ * or deeper called functions and caller-save
+ * are saved in userland.
*/
- stw r27, TF_R27-TRAPFRAME_SIZEOF(sr1, t3) /* dp */
stw r3 , TF_R3 -TRAPFRAME_SIZEOF(sr1, t3)
#ifdef DDB
/* save callee-save registers */
@@ -569,6 +571,7 @@ $syscall
stw r17, TF_R17-TRAPFRAME_SIZEOF(sr1, t3)
stw r18, TF_R18-TRAPFRAME_SIZEOF(sr1, t3)
#endif
+ stw r27, TF_R27-TRAPFRAME_SIZEOF(sr1, t3) /* dp */
stw r0, 0(sr1, t3) /* terminate frame */
copy r0 , r3
stw r0, HPPA_FRAME_PSP(sr1, sp)
@@ -603,25 +606,19 @@ $syscall
/*
* Save the rest of the CPU context
*/
+ mfsp sr0, arg0 /* use ,bc */
+ stw arg0, TF_IISQH-TRAPFRAME_SIZEOF(sr1, t3)
+ stw arg0, TF_IISQT-TRAPFRAME_SIZEOF(sr1, t3)
ldo 4(r31), arg1
stw r31, TF_IIOQH-TRAPFRAME_SIZEOF(sr1, t3)
stw arg1, TF_IIOQT-TRAPFRAME_SIZEOF(sr1, t3)
- mfsp sr0, arg0
- stw arg0, TF_IISQH-TRAPFRAME_SIZEOF(sr1, t3)
- stw arg0, TF_IISQT-TRAPFRAME_SIZEOF(sr1, t3)
-
- stw arg0, TF_CR20-TRAPFRAME_SIZEOF(sr1, t3)
+ stw arg0, TF_CR20-TRAPFRAME_SIZEOF(sr1, t3) /* use ,bc */
stw r31, TF_CR21-TRAPFRAME_SIZEOF(sr1, t3)
- mfsp sr3, arg0
- stw arg0, TF_SR3-TRAPFRAME_SIZEOF(sr1, t3)
- stw r28, TF_CR8-TRAPFRAME_SIZEOF(sr1, t3) /* pidr1 */
-
- mfctl iir, arg0 /* XXX bogus */
ldil TFF_LAST|TFF_SYS, arg1
- stw arg0, TF_CR19-TRAPFRAME_SIZEOF(sr1, t3)
+ stw r0, TF_CR19-TRAPFRAME_SIZEOF(sr1, t3) /* iir */
stw arg1, TF_FLAGS-TRAPFRAME_SIZEOF(sr1, t3)
mfsp sr0, arg0
@@ -663,6 +660,8 @@ $syscall
stw arg0, TF_CR25-TRAPFRAME_SIZEOF(sr1, t3)
stw arg1, TF_CR28-TRAPFRAME_SIZEOF(sr1, t3)
#endif
+ mfctl cr30, arg0
+ stw arg0, TF_CR30(sr1, t3)
/* setup kernel context */
mtsp r0, sr0
@@ -687,6 +686,7 @@ $syscall
.call
blr r0, rp
bv,n 0(r1)
+ nop
ldil L%curproc, r1
ldw R%curproc(r1), r1
@@ -842,7 +842,7 @@ $syscall_end
mtctl r1, tr7 ! \
ldil L%TLABEL(name), r1 ! \
.call ! \
- be R%TLABEL(name)(sr4, r1) ! \
+ be R%TLABEL(name)(sr7, r1) ! \
ldi num, r1 ! \
.align 32
@@ -1244,12 +1244,16 @@ LEAF_ENTRY(desidhash_s)
ALTENTRY(desidhash_x)
MFCPU_T(DR_CPUCFG,22) /* t1 */
MFCPU_T(DR_CPUCFG,22)
+ nop
+ nop
depi 0, DR0_PCXS_DHE, 3, t1 /* 3 4 DR0_PCXS_DOMAIN|DR0_PCXS_IHE */
depi 1, DR0_PCXS_EQWSTO, 1, t1
depi 0, DR0_PCXS_DHPMC, 1, t1
depi 0, DR0_PCXS_ILPMC, 1, t1
MTCPU_T(22,DR_CPUCFG)
MTCPU_T(22,DR_CPUCFG)
+ nop
+ nop
bv 0(rp)
extru t1, 4, 5, ret0 /* return chip revision */
EXIT(desidhash_s)
@@ -1262,12 +1266,16 @@ EXIT(desidhash_s)
LEAF_ENTRY(desidhash_t)
MFCPU_T(DR_CPUCFG,22) /* t1 */
MFCPU_T(DR_CPUCFG,22)
+ nop
+ nop
depi 0, DR0_PCXT_IHE, 1, t1
depi 0, DR0_PCXT_DHE, 1, t1
depi 0, DR0_PCXT_DHPMC, 1, t1
depi 0, DR0_PCXT_ILPMC, 1, t1
MTCPU_T(22,DR_CPUCFG)
MTCPU_T(22,DR_CPUCFG)
+ nop
+ nop
bv 0(rp)
extru t1, 4, 5, ret0 /* return chip revision */
EXIT(desidhash_t)
@@ -1416,11 +1424,15 @@ LEAF_ENTRY(pbtlb_l)
ldil L%0xc041, t1
dep arg0, 30, 3, t1
MTCPU_T(22,DR_DTLB) /* t1 */
+ nop
+ nop
mtsp r0, sr1
idtlba r0,(sr1,r0)
idtlbp r0,(sr1,r0)
zdepi -1, 18, 1, t1
MTCPU_T(22,DR_DTLB)
+ nop
+ nop
bv 0(rp)
mtsm t4
EXIT(pbtlb_l)
@@ -1430,6 +1442,8 @@ EXIT(pbtlb_l)
*/
LEAF_ENTRY(desidhash_l)
MFCPU_C(DR_CPUCFG,22) /* t1 */
+ nop
+ nop
depi 0, DR0_PCXL_L2IHASH_EN, 2, t1 /* + DR0_PCXL_L2DHASH_EN */
depi 0, DR0_PCXL_L2IHPMC, 1, t1 /* don't reset */
depi 0, DR0_PCXL_L2DHPMC, 1, t1 /* don't reset */
@@ -1437,6 +1451,8 @@ LEAF_ENTRY(desidhash_l)
depi 0, DR0_PCXL_L2PARERR,1, t1 /* don't reset */
/* set DR0_PCXL_L1ICACHE_EN ??? */
MTCPU_C(22,DR_CPUCFG)
+ nop
+ nop
bv 0(rp)
extru t1, 4, 5, ret0 /* return chip revision */
EXIT(desidhash_l)
@@ -1820,7 +1836,7 @@ $trapnowvirt
* form trap type in the first argument to trap()
*/
ldw TF_FLAGS(t3), arg0
- dep r0, 26, 27, arg0
+ dep r0, 24, 25, arg0
copy t3, arg1
#ifdef DDB
@@ -2232,9 +2248,9 @@ LEAF_ENTRY(microtime)
/* splx(t4) */
mtctl t4, eiem
- add 1, t2, t2
+ addi 1, t2, t2
addb,< t2, t3, microtime_no
- add 1, t1, t1
+ addi 1, t1, t1
copy t3, t2
@@ -2350,7 +2366,7 @@ remrunqueue_ok
comb,<> t4, arg0, Lqnempty
nop
- vdepi 1, 1, t3
+ vdepi 0, 1, t3
stw t3, R%whichqs(t2)
Lqnempty
bv 0(rp)