diff options
| -rw-r--r-- | CHANGES | 2 | ||||
| -rw-r--r-- | emu/Linux/asm-power.S | 108 | ||||
| -rw-r--r-- | emu/Linux/segflush-power.c | 2 | ||||
| -rw-r--r-- | include/version.h | 2 | ||||
| -rw-r--r-- | lib/proto/inferno | 4 | ||||
| -rw-r--r-- | lib9/getcallerpc-Linux-power.c | 12 | ||||
| -rw-r--r-- | libinterp/das-power.c | 8 |
7 files changed, 89 insertions, 49 deletions
@@ -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}, |
