summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2009-06-12 18:34:15 +0000
committerCharles.Forsyth <devnull@localhost>2009-06-12 18:34:15 +0000
commitd2caef7bfa67181341fe2f1cbf68884ae6e45639 (patch)
tree1a2ebabf87a883d4886351007af33aa6ca5fd4ed
parentf4ab6bd1adbb9bff11da6885084de2ed31f2a415 (diff)
20090612-1932
-rw-r--r--CHANGES2
-rw-r--r--emu/Linux/asm-power.S108
-rw-r--r--emu/Linux/segflush-power.c2
-rw-r--r--include/version.h2
-rw-r--r--lib/proto/inferno4
-rw-r--r--lib9/getcallerpc-Linux-power.c12
-rw-r--r--libinterp/das-power.c8
7 files changed, 89 insertions, 49 deletions
diff --git a/CHANGES b/CHANGES
index 172caf73..2410e9c3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+200090612
+ added support for Linux-power (ericvh; and further simplified)
20090605
appl/cmd/disk/kfs.b dis/disk/kfs.dis - don't try to update super block if readonly(!) [issue 175]
20090526
diff --git a/emu/Linux/asm-power.S b/emu/Linux/asm-power.S
index ff5f97cd..6af21fba 100644
--- a/emu/Linux/asm-power.S
+++ b/emu/Linux/asm-power.S
@@ -1,57 +1,80 @@
-#include <asm-ppc/reg.h>
-
- .file "asm-power.S"
- .section ".text"
- .align 2
- .globl FPsave
- .type FPsave, @function
+ .align 2
+ .global FPsave
FPsave:
- .set _framesize,0
- mffs f0
- stfd f0,0(r3)
+ stfd %f14,0*8(%r3)
+ stfd %f15,1*8(%r3)
+ stfd %f16,2*8(%r3)
+ stfd %f17,3*8(%r3)
+ stfd %f18,4*8(%r3)
+ stfd %f19,5*8(%r3)
+ stfd %f20,6*8(%r3)
+ stfd %f21,7*8(%r3)
+ stfd %f22,8*8(%r3)
+ stfd %f23,9*8(%r3)
+ stfd %f24,10*8(%r3)
+ stfd %f25,11*8(%r3)
+ stfd %f26,12*8(%r3)
+ stfd %f27,13*8(%r3)
+ stfd %f28,14*8(%r3)
+ stfd %f29,15*8(%r3)
+ stfd %f30,16*8(%r3)
+ stfd %f31,17*8(%r3)
blr
- .size FPsave,.-FPsave
- .align 2
- .globl FPrestore
+ .align 2
+ .global FPrestore
FPrestore:
- lfd f0,0(r3)
- mtfsf 0xff,f0
+ lfd %f14,0*8(%r3)
+ lfd %f15,1*8(%r3)
+ lfd %f16,2*8(%r3)
+ lfd %f17,3*8(%r3)
+ lfd %f18,4*8(%r3)
+ lfd %f19,5*8(%r3)
+ lfd %f20,6*8(%r3)
+ lfd %f21,7*8(%r3)
+ lfd %f22,8*8(%r3)
+ lfd %f23,9*8(%r3)
+ lfd %f24,10*8(%r3)
+ lfd %f25,11*8(%r3)
+ lfd %f26,12*8(%r3)
+ lfd %f27,13*8(%r3)
+ lfd %f28,14*8(%r3)
+ lfd %f29,15*8(%r3)
+ lfd %f30,16*8(%r3)
+ lfd %f31,17*8(%r3)
blr
- .size FPrestore, .-FPrestore
- .align 2
- .globl _tas
+ .align 2
+ .global _tas
_tas:
sync
- mr r4,r3
- addi r5,0,0x1
+ mr %r4, %r3
+ addi %r5,0,0x1
1:
- lwarx r3,0,r4
- cmpwi r3,0x0
- bne- 2f
- stwcx. r5,0,r4
- bne- 1b /* Lost reservation, try again */
+ lwarx %r3, 0, %r4
+ cmpwi %r3, 0
+ bne- 2f
+ stwcx. %r5, 0, %r4
+ bne- 1b
2:
sync
blr
- .size _tas,.-_tas
/*
- * void executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
+ * void
+ * executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
*/
.align 2
- .globl executeonnewstack:
+ .global executeonnewstack
executeonnewstack:
- mr r1,r3 /* change stacks */
- stwu 1,-16(r1) /* save lr to aid the traceback */
- li r0,0
- stw r0,20(r1)
- mr r3,r5
- mtctr r4
- bctrl /* tramp(arg) */
- br . /* failed */
- .size executeonnewstack,.-executeonnewstack
+ mr %r1,%r3 /* change stacks */
+ stwu %lr,-16(%r1) /* save lr to aid the traceback */
+ li %r0,0
+ stw %r0,20(%r1)
+ mr %r3,%r5
+ mtctr %r4
+ bctrl /* tramp(arg) */
+ br
/*
* void unlockandexit(int *key)
@@ -63,10 +86,9 @@ executeonnewstack:
.align 2
.globl unlockandexit
unlockandexit:
- li r0,0x0
- stw r0,0(r3) /* unlock */
- li r0,1 /* sys exit; 234 is exit group */
- li r3,0 /* exit status */
+ li %r0,0x0
+ stw %r0,0(%r3) /* unlock */
+ li %r0,1 /* sys exit; 234 is exit group */
+ li %r3,0 /* exit status */
sc
- br . /* not reached */
- .size unlockandexit,.-unlockandexit
+ br
diff --git a/emu/Linux/segflush-power.c b/emu/Linux/segflush-power.c
index 8fa58189..0804d686 100644
--- a/emu/Linux/segflush-power.c
+++ b/emu/Linux/segflush-power.c
@@ -16,7 +16,7 @@ segflush(void *a, ulong n)
// cache blocks are often eight words (32 bytes) long, sometimes 16 bytes.
// need to determine it dynamically?
- for (p = (ulong *)((ulong)a & ~3UL); (char *)p < (char *)a + n; p++)
+ for (p = (ulong *)((ulong)a & ~7UL); (char *)p < (char *)a + n; p++)
__asm__("dcbst 0,%0\n\t" // not dcbf, which writes back, then invalidates
"icbi 0,%0\n\t"
: // no output
diff --git a/include/version.h b/include/version.h
index 31235b07..f72e7a3b 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define VERSION "Fourth Edition (20090605)"
+#define VERSION "Fourth Edition (20090612)"
diff --git a/lib/proto/inferno b/lib/proto/inferno
index bb34f1af..f020a7ec 100644
--- a/lib/proto/inferno
+++ b/lib/proto/inferno
@@ -25,6 +25,10 @@ Linux
bin
include
lib
+ power
+ bin
+ include
+ lib
spim
bin
include
diff --git a/lib9/getcallerpc-Linux-power.c b/lib9/getcallerpc-Linux-power.c
new file mode 100644
index 00000000..4a4e4fb5
--- /dev/null
+++ b/lib9/getcallerpc-Linux-power.c
@@ -0,0 +1,12 @@
+#include <lib9.h>
+
+ulong
+getcallerpc(void *x)
+{
+ulong *lp;
+
+ lp = x;
+
+ return lp[-1];
+}
+
diff --git a/libinterp/das-power.c b/libinterp/das-power.c
index a3a1799a..90d7813e 100644
--- a/libinterp/das-power.c
+++ b/libinterp/das-power.c
@@ -413,7 +413,7 @@ sub(Opcode *o, Instr *i)
}
static void
-div(Opcode *o, Instr *i)
+idiv(Opcode *o, Instr *i)
{
format(o->mnemonic, i, 0);
if(i->op == 31)
@@ -554,8 +554,8 @@ static Opcode opcodes[] = {
{31, 246, ALL, "DCBTST", dcb, 0},
{31, 1014, ALL, "DCBZ", dcb, 0},
- {31, 491, OEM, "DIVW%V%C", div, ir3},
- {31, 459, OEM, "DIVWU%V%C", div, ir3},
+ {31, 491, OEM, "DIVW%V%C", idiv, ir3},
+ {31, 459, OEM, "DIVWU%V%C", idiv, ir3},
{31, 310, ALL, "ECIWX", ldx, 0},
{31, 438, ALL, "ECOWX", stx, 0},
@@ -647,7 +647,7 @@ static Opcode opcodes[] = {
{31, 242, ALL, "MOVW", gen, "R%s,SEG(R%b)"},
{31, 235, OEM, "MULLW%V%C", gencc, ir3},
- {7, 0, 0, "MULLW", div, "%i,R%a,R%d"},
+ {7, 0, 0, "MULLW", idiv, "%i,R%a,R%d"},
{31, 476, ALL, "NAND%C", gencc, il3},
{31, 104, OEM, "NEG%V%C", neg, ir2},