aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2024-01-14 19:43:03 +0100
committerHelge Deller <deller@gmx.de>2024-01-14 19:43:03 +0100
commitb4d69ded5aed7d8a698ce8f134c15e7f162ffce7 (patch)
tree1f9b421df219f2e813000cfec116eee0f70c7877
parentc05d6dd9d950afbd758e2a6708e3a5ec8e8f8a13 (diff)
downloadseabios-hppa-b4d69ded5aed7d8a698ce8f134c15e7f162ffce7.zip
seabios-hppa-b4d69ded5aed7d8a698ce8f134c15e7f162ffce7.tar.gz
seabios-hppa-b4d69ded5aed7d8a698ce8f134c15e7f162ffce7.tar.bz2
32-bit still works
-rw-r--r--src/parisc/head.S74
1 files changed, 43 insertions, 31 deletions
diff --git a/src/parisc/head.S b/src/parisc/head.S
index 952f85c..f75ba20 100644
--- a/src/parisc/head.S
+++ b/src/parisc/head.S
@@ -282,7 +282,8 @@ END(startup)
ENTRY(start_kernel)
#ifdef CONFIG_64BIT
- bv,n 0(%r22)
+ bv 0(%r22)
+ clear_PSW_W /* clear PSW before we start the kernel! */
#else
ldw -0x34(%sp),%r1
bv,n 0(%r1)
@@ -415,18 +416,33 @@ END(smp_ivt)
PDC and IODC entry
*******************************************************/
-/* XXX: memory location in page0: vec_pad0[], temporary storage for PSW.W */
-#define PSW_OFFSET1 24
-#define PSW_OFFSET2 28
+#ifdef CONFIG_64BIT
+ENTRY(pdc_entry_64_32) /* 32-bit call on 64-bit PDC */
+ stw %rp,-20(%sp)
+ stw %dp,-32(%sp)
+ stw %arg0,-36(%sp)
+ stw %arg1,-40(%sp)
+ stw %arg2,-44(%sp)
+ stw %arg3,-48(%sp)
+ ldo -FRAME_SIZE(%sp),%arg0
-ENTRY(pdc_entry)
+ loadgp
+ b,l parisc_pdc_entry, %rp
+ ldo FRAME_SIZE(%sp),%sp
+
+ ldo -FRAME_SIZE(%sp),%sp
+ ldw -20(%sp),%rp
+ ldw -32(%sp),%dp
+ bv,n %r0(%rp)
+END(pdc_entry_64_32)
+#else
+ENTRY(pdc_entry_32) /* 32-bit PDC */
stw %rp,-20(%sp)
stw %dp,-32(%sp)
stw %arg0,-36(%sp)
stw %arg1,-40(%sp)
stw %arg2,-44(%sp)
stw %arg3,-48(%sp)
- stw %r31,PSW_OFFSET1(%r0) /* store PSW_W */
ldo -FRAME_SIZE(%sp),%arg0
loadgp
@@ -436,22 +452,30 @@ ENTRY(pdc_entry)
ldo -FRAME_SIZE(%sp),%sp
ldw -20(%sp),%rp
ldw -32(%sp),%dp
- ldw PSW_OFFSET1(%r0),%r31
- load32 0x8000000,%r1 /* mask PSW_W */
- and,= %r31,%r1,%r0
- bv %r0(%rp) /* return without setting PSW_W */
- nop
- bv %r0(%rp) /* return with setting PSW_W */
- .level 2.0
- nop // ssm PSW_W_SM,%r0
- .level LEVEL
-END(pdc_entry)
+ bv,n %r0(%rp)
+END(pdc_entry_32)
+#endif
/* pdc_entry_table will be copied into low memory. */
ENTRY(pdc_entry_table)
- load32 pdc_entry,%r1
- clear_PSW_W
+#ifdef CONFIG_64BIT
+ /* see section "Testing the Current State of the PSW W-Bit",
+ page I-2 in parisc2 spec */
+ addb,*>,n %r0,%r0,pdc_called_narrow /* branch if narrow addressing */
+ /* we know that PDC was called with PSW.W=1 */
+ nop
+ nop
+ nop
+pdc_called_narrow:
+ /* we know that PDC was called with PSW.W=0 */
+ depdi 0, 31, 32, %arg0
+ depdi 0, 31, 32, %arg1
+ depdi 0, 31, 32, %arg2
+ depdi 0, 31, 32, %arg3
+#else
+ load32 pdc_entry_32,%r1 /* entry of 32-bit PDC */
bv,n %r0(%r1)
+#endif
pdc_entry_table_end:
.export pdc_entry_table_end
END(pdc_entry_table)
@@ -475,8 +499,6 @@ ENTRY(iodc_entry)
stw %arg1,-40(%sp)
stw %arg2,-44(%sp)
stw %arg3,-48(%sp)
- clear_PSW_W
- stw %r31,PSW_OFFSET2(%r0) /* store PSW_W */
ldo -FRAME_SIZE(%sp),%arg0
loadgp
@@ -487,17 +509,7 @@ ENTRY(iodc_entry)
ldo -FRAME_SIZE(%sp),%sp
ldw -20(%sp),%rp
ldw -32(%sp),%dp
-
-// .word 0xfffdead0
- ldw PSW_OFFSET2(%r0),%r31
- load32 0x8000000,%r1 /* mask PSW_W */
- and,= %r31,%r1,%r0
- bv %r0(%rp) /* return without setting PSW_W */
- nop
- bv %r0(%rp) /* return with setting PSW_W */
- .level 2.0
- nop // ssm PSW_W_SM,%r0
- .level LEVEL
+ bv,n %r0(%rp)
END(iodc_entry)
/****************************************************************