summaryrefslogtreecommitdiff
path: root/emu
diff options
context:
space:
mode:
Diffstat (limited to 'emu')
-rw-r--r--emu/NetBSD/asm-power.S91
-rw-r--r--emu/NetBSD/emu3
-rw-r--r--emu/NetBSD/emu-g4
-rw-r--r--emu/NetBSD/emu.c88
-rw-r--r--emu/NetBSD/mkfile7
-rw-r--r--emu/NetBSD/os.c8
-rw-r--r--emu/NetBSD/segflush-386.c9
-rw-r--r--emu/NetBSD/segflush-power.c12
8 files changed, 122 insertions, 100 deletions
diff --git a/emu/NetBSD/asm-power.S b/emu/NetBSD/asm-power.S
new file mode 100644
index 00000000..da40e825
--- /dev/null
+++ b/emu/NetBSD/asm-power.S
@@ -0,0 +1,91 @@
+#include <machine/asm.h>
+
+ENTRY_NOPROFILE(FPsave)
+ 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
+ END(FPsave)
+
+ENTRY_NOPROFILE(FPrestore)
+ 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
+ END(FPrestore)
+
+ENTRY_NOPROFILE(_tas)
+ sync
+ mr %r4, %r3
+ addi %r5,0,0x1
+1:
+ lwarx %r3, 0, %r4
+ cmpwi %r3, 0
+ bne- 2f
+ stwcx. %r5, 0, %r4
+ bne- 1b
+2:
+ sync
+ blr
+ END(_tas)
+
+/*
+ * void
+ * executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
+ */
+ENTRY_NOPROFILE(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
+ END(executeonnewstack)
+
+/*
+ * void unlockandexit(int *key)
+ *
+ * NB: the return status may be garbaged if the stack is reused
+ * between the unlock and the system call, but this should
+ * not matter since no task is waiting for the result
+ */
+ENTRY_NOPROFILE(unlockandexit)
+ li %r0,0x0
+ stw %r0,0(%r3) /* unlock */
+ li %r0,1 /* sys exit; 234 is exit group */
+ li %r3,0 /* exit status */
+ sc
+ br
+ END(unlockandexit)
diff --git a/emu/NetBSD/emu b/emu/NetBSD/emu
index 55705a2b..d89c5bc5 100644
--- a/emu/NetBSD/emu
+++ b/emu/NetBSD/emu
@@ -81,6 +81,9 @@ port
uqid
code
+ #ifdef __powerpc__
+ int macjit = 1; /* tell compiler it's not plan9 abi */
+ #endif
init
emuinit
diff --git a/emu/NetBSD/emu-g b/emu/NetBSD/emu-g
index e662b4c1..6e87297a 100644
--- a/emu/NetBSD/emu-g
+++ b/emu/NetBSD/emu-g
@@ -70,6 +70,10 @@ port
uqid
code
+ #ifdef __powerpc__
+ int macjit = 1; /* tell compiler it's not plan9 abi */
+ #endif
+
void setpointer(int x, int y){USED(x); USED(y);}
ulong strtochan(char *s){USED(s); return ~0;}
diff --git a/emu/NetBSD/emu.c b/emu/NetBSD/emu.c
deleted file mode 100644
index 69e1139d..00000000
--- a/emu/NetBSD/emu.c
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "dat.h"
-#include "fns.h"
-#include "error.h"
-#include "interp.h"
-
-
-#include "emu.root.h"
-
-ulong ndevs = 29;
-
-extern Dev rootdevtab;
-extern Dev consdevtab;
-extern Dev envdevtab;
-extern Dev mntdevtab;
-extern Dev pipedevtab;
-extern Dev progdevtab;
-extern Dev profdevtab;
-extern Dev srvdevtab;
-extern Dev dupdevtab;
-extern Dev ssldevtab;
-extern Dev capdevtab;
-extern Dev fsdevtab;
-extern Dev cmddevtab;
-extern Dev indirdevtab;
-extern Dev drawdevtab;
-extern Dev pointerdevtab;
-extern Dev snarfdevtab;
-extern Dev ipdevtab;
-extern Dev eiadevtab;
-extern Dev audiodevtab;
-extern Dev memdevtab;
-Dev* devtab[]={
- &rootdevtab,
- &consdevtab,
- &envdevtab,
- &mntdevtab,
- &pipedevtab,
- &progdevtab,
- &profdevtab,
- &srvdevtab,
- &dupdevtab,
- &ssldevtab,
- &capdevtab,
- &fsdevtab,
- &cmddevtab,
- &indirdevtab,
- &drawdevtab,
- &pointerdevtab,
- &snarfdevtab,
- &ipdevtab,
- &eiadevtab,
- &audiodevtab,
- &memdevtab,
- nil,
- nil,
- nil,
- nil,
- nil,
- nil,
- nil,
- nil,
- nil,
-};
-
-void links(void){
-}
-
-extern void sysmodinit(void);
-extern void drawmodinit(void);
-extern void tkmodinit(void);
-extern void mathmodinit(void);
-extern void srvmodinit(void);
-extern void keyringmodinit(void);
-extern void loadermodinit(void);
-extern void freetypemodinit(void);
-void modinit(void){
- sysmodinit();
- drawmodinit();
- tkmodinit();
- mathmodinit();
- srvmodinit();
- keyringmodinit();
- loadermodinit();
- freetypemodinit();
-}
-
-char* conffile = "emu";
-ulong kerndate = KERNDATE;
diff --git a/emu/NetBSD/mkfile b/emu/NetBSD/mkfile
index effbaefe..ce001d96 100644
--- a/emu/NetBSD/mkfile
+++ b/emu/NetBSD/mkfile
@@ -1,8 +1,6 @@
SYSTARG=NetBSD
-OBJTYPE=386
<../../mkconfig
SYSTARG=NetBSD
-OBJTYPE=386
#Configurable parameters
@@ -24,6 +22,7 @@ X11LIBS= -L/usr/X11R7/lib -R/usr/X11R7/lib -lXext -lX11
OBJ=\
asm-$OBJTYPE.$O\
os.$O\
+ segflush-$OBJTYPE.$O\
$CONF.root.$O\
lock.$O\
$DEVS\
@@ -37,8 +36,6 @@ KERNDATE=`{$NDATE}
default:V: $O.$CONF
-<../port/portmkfile
-
$O.$CONF: $OBJ $CONF.c $CONF.root.h $LIBFILES
$CC $CFLAGS '-DKERNDATE='$KERNDATE $CONF.c
$LD $LDFLAGS -o $target $OBJ $CONF.$O $LIBFILES $SYSLIBS
@@ -46,4 +43,6 @@ $O.$CONF: $OBJ $CONF.c $CONF.root.h $LIBFILES
install:V: $O.$CONF
cp $O.$CONF $INSTALLDIR/$CONF
+<../port/portmkfile
+
devfs.$O: ../port/devfs-posix.c
diff --git a/emu/NetBSD/os.c b/emu/NetBSD/os.c
index e299a188..b6ffab99 100644
--- a/emu/NetBSD/os.c
+++ b/emu/NetBSD/os.c
@@ -527,11 +527,3 @@ stackalloc(Proc *p, void **tos)
*(Proc **)rv = p;
return rv;
}
-
-int
-segflush(void *a, ulong n)
-{
- USED(a);
- USED(n);
- return 0;
-}
diff --git a/emu/NetBSD/segflush-386.c b/emu/NetBSD/segflush-386.c
new file mode 100644
index 00000000..cdf0496b
--- /dev/null
+++ b/emu/NetBSD/segflush-386.c
@@ -0,0 +1,9 @@
+#include "dat.h"
+
+int
+segflush(void *a, ulong n)
+{
+ USED(a);
+ USED(n);
+ return 0;
+}
diff --git a/emu/NetBSD/segflush-power.c b/emu/NetBSD/segflush-power.c
new file mode 100644
index 00000000..845d74f6
--- /dev/null
+++ b/emu/NetBSD/segflush-power.c
@@ -0,0 +1,12 @@
+#include <sys/types.h>
+#include <machine/cpu.h>
+
+#include "dat.h"
+
+
+int
+segflush(void *a, ulong n)
+{
+ __syncicache(a, n);
+ return 0;
+}