tvarious forgotten files - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e5c26b01f70303f3322ac98d670ef886a62ac38a | |
parent dcc9531c5a8d5d43d71060f8975d592c7598b349 | |
Author: rsc <devnull@localhost> | |
Date: Mon, 20 Sep 2004 15:08:57 +0000 | |
various forgotten files | |
Diffstat: | |
M src/cmd/9term/9term.c | 20 ++++++++++++++------ | |
M src/cmd/rio/menu.c | 3 +++ | |
A src/lib9/getcallerpc-power.c | 11 +++++++++++ | |
A src/lib9/tas-power.c | 42 +++++++++++++++++++++++++++++… | |
A src/libthread/asm-Linux-power.s | 80 +++++++++++++++++++++++++++++… | |
A src/libthread/power.c | 40 +++++++++++++++++++++++++++++… | |
M src/libthread/sched.c | 1 - | |
A src/libthread/tfork.c | 23 +++++++++++++++++++++++ | |
A unix/make/Make.Linux-power | 6 ++++++ | |
9 files changed, 219 insertions(+), 7 deletions(-) | |
--- | |
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c | |
t@@ -879,6 +879,20 @@ key(Rune r) | |
return; | |
} | |
+ switch(r) { | |
+ case 0x03: /* ^C: send interrupt */ | |
+ case 0x7F: /* DEL: send interrupt */ | |
+ t.qh = t.q0 = t.q1 = t.nr; | |
+ show(t.q0); | |
+{int x; x=tcgetpgrp(rcfd); | |
+print("postnote %d pgrp %d\n", rcpid, x); | |
+ postnote(PNGROUP, x, "interrupt"); | |
+if(x >= 2) killpg(x, 2); | |
+} | |
+ // write(rcfd, "\x7F", 1); | |
+ return; | |
+ } | |
+ | |
if(rawon() && t.q0==t.nr){ | |
addraw(&r, 1); | |
consread(); | |
t@@ -898,12 +912,6 @@ key(Rune r) | |
snarf(); | |
switch(r) { | |
- case 0x03: /* ^C: send interrupt */ | |
- case 0x7F: /* DEL: send interrupt */ | |
- t.qh = t.q0 = t.q1 = t.nr; | |
- show(t.q0); | |
- write(rcfd, "\x7F", 1); | |
- break; | |
case 0x06: /* ^F: file name completion */ | |
case Kins: /* Insert: file name completion */ | |
rp = namecomplete(); | |
diff --git a/src/cmd/rio/menu.c b/src/cmd/rio/menu.c | |
t@@ -138,6 +138,9 @@ spawn(ScreenInfo *s) | |
close(ConnectionNumber(dpy)); | |
if (s->display[0] != '\0') | |
putenv(s->display); | |
+ signal(SIGINT, SIG_DFL); | |
+ signal(SIGTERM, SIG_DFL); | |
+ signal(SIGHUP, SIG_DFL); | |
if (termprog != NULL) { | |
execl(shell, shell, "-c", termprog, 0); | |
fprintf(stderr, "rio: exec %s", shell); | |
diff --git a/src/lib9/getcallerpc-power.c b/src/lib9/getcallerpc-power.c | |
t@@ -0,0 +1,11 @@ | |
+#include <lib9.h> | |
+ | |
+ulong | |
+getcallerpc(void *x) | |
+{ | |
+ ulong *lp; | |
+ | |
+ lp = x; | |
+ | |
+ return lp[-1]; | |
+} | |
diff --git a/src/lib9/tas-power.c b/src/lib9/tas-power.c | |
t@@ -0,0 +1,42 @@ | |
+#include "u.h" | |
+#include "libc.h" | |
+ | |
+/* | |
+ * first argument (l) is in r3 at entry. | |
+ * r3 contains return value upon return. | |
+ */ | |
+int | |
+_tas(int *x) | |
+{ | |
+ int v; | |
+ int tmp, tmp2, tmp3; | |
+ | |
+ /* | |
+ * this __asm__ works with gcc on linux | |
+ */ | |
+ __asm__("\n sync\n" | |
+ " li %1,0\n" | |
+ " mr %2,%4 /* &x->val */\n" | |
+ " lis %3,0xdead /* assemble constant 0xdeaddead *… | |
+ " ori %3,%3,0xdead /* \" */\n" | |
+ "tas1:\n" | |
+ " dcbf %2,%1 /* cache flush; \"fix for 603x bug\"… | |
+ " lwarx %0,%2,%1 /* v = x->val with reservation *… | |
+ " cmp cr0,0,%0,%1 /* v == 0 */\n" | |
+ " bne tas0\n" | |
+ " stwcx. %3,%2,%1 /* if (x->val same) x->val = 0xdeadd… | |
+ " bne tas1\n" | |
+ "tas0:\n" | |
+ " sync\n" | |
+ " isync\n" | |
+ : "=r" (v), "=&r" (tmp), "=&r"(tmp2), "=&r"(tmp3) | |
+ : "r" (x) | |
+ : "cr0", "memory" | |
+ ); | |
+ switch(v) { | |
+ case 0: return 0; | |
+ case 0xdeaddead: return 1; | |
+ default: fprint(2, "tas: corrupted 0x%lux\n", v); | |
+ } | |
+ return 0; | |
+} | |
diff --git a/src/libthread/asm-Linux-power.s b/src/libthread/asm-Linux-power.s | |
t@@ -0,0 +1,80 @@ | |
+/* get FPR and VR use flags with sc 0x7FF3 */ | |
+/* get vsave with mfspr reg, 256 */ | |
+ | |
+.text | |
+.align 2 | |
+ | |
+.globl _setlabel | |
+ | |
+_setlabel: /* xxx: instruction scheduling */ | |
+ mflr 0 | |
+ mfcr 5 | |
+ mfctr 6 | |
+ mfxer 7 | |
+ stw 0, 0*4(3) | |
+ stw 5, 1*4(3) | |
+ stw 6, 2*4(3) | |
+ stw 7, 3*4(3) | |
+ | |
+ stw 1, 4*4(3) | |
+ stw 2, 5*4(3) | |
+ | |
+ stw 13, (0+6)*4(3) /* callee-save GPRs */ | |
+ stw 14, (1+6)*4(3) /* xxx: block move */ | |
+ stw 15, (2+6)*4(3) | |
+ stw 16, (3+6)*4(3) | |
+ stw 17, (4+6)*4(3) | |
+ stw 18, (5+6)*4(3) | |
+ stw 19, (6+6)*4(3) | |
+ stw 20, (7+6)*4(3) | |
+ stw 21, (8+6)*4(3) | |
+ stw 22, (9+6)*4(3) | |
+ stw 23, (10+6)*4(3) | |
+ stw 24, (11+6)*4(3) | |
+ stw 25, (12+6)*4(3) | |
+ stw 26, (13+6)*4(3) | |
+ stw 27, (14+6)*4(3) | |
+ stw 28, (15+6)*4(3) | |
+ stw 29, (16+6)*4(3) | |
+ stw 30, (17+6)*4(3) | |
+ stw 31, (18+6)*4(3) | |
+ | |
+ li 3, 0 /* return */ | |
+ blr | |
+ | |
+.globl _gotolabel | |
+ | |
+_gotolabel: | |
+ lwz 13, (0+6)*4(3) /* callee-save GPRs */ | |
+ lwz 14, (1+6)*4(3) /* xxx: block move */ | |
+ lwz 15, (2+6)*4(3) | |
+ lwz 16, (3+6)*4(3) | |
+ lwz 17, (4+6)*4(3) | |
+ lwz 18, (5+6)*4(3) | |
+ lwz 19, (6+6)*4(3) | |
+ lwz 20, (7+6)*4(3) | |
+ lwz 21, (8+6)*4(3) | |
+ lwz 22, (9+6)*4(3) | |
+ lwz 23, (10+6)*4(3) | |
+ lwz 24, (11+6)*4(3) | |
+ lwz 25, (12+6)*4(3) | |
+ lwz 26, (13+6)*4(3) | |
+ lwz 27, (14+6)*4(3) | |
+ lwz 28, (15+6)*4(3) | |
+ lwz 29, (16+6)*4(3) | |
+ lwz 30, (17+6)*4(3) | |
+ lwz 31, (18+6)*4(3) | |
+ | |
+ lwz 1, 4*4(3) | |
+ lwz 2, 5*4(3) | |
+ | |
+ lwz 0, 0*4(3) | |
+ mtlr 0 | |
+ lwz 0, 1*4(3) | |
+ mtcr 0 /* mtcrf 0xFF, r0 */ | |
+ lwz 0, 2*4(3) | |
+ mtctr 0 | |
+ lwz 0, 3*4(3) | |
+ mtxer 0 | |
+ li 3, 1 | |
+ blr | |
diff --git a/src/libthread/power.c b/src/libthread/power.c | |
t@@ -0,0 +1,40 @@ | |
+#include "threadimpl.h" | |
+ | |
+static void | |
+launcherpower(int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, | |
+ void (*f)(void *arg), void *arg) | |
+{ | |
+ (*f)(arg); | |
+ threadexits(nil); | |
+} | |
+ | |
+void | |
+_threadinitstack(Thread *t, void (*f)(void*), void *arg) | |
+{ | |
+ ulong *tos, *stk; | |
+ | |
+ tos = (ulong*)&t->stk[t->stksize&~7]; | |
+ stk = tos; | |
+ --stk; | |
+ --stk; | |
+ --stk; | |
+ --stk; | |
+ *--stk = (ulong)arg; | |
+ *--stk = (ulong)f; | |
+ t->sched.pc = (ulong)launcherpower+LABELDPC; | |
+ t->sched.sp = ((ulong)stk)-8; | |
+ *((ulong *)t->sched.sp) = 0; | |
+} | |
+ | |
+void | |
+_threadinswitch(int enter) | |
+{ | |
+ USED(enter); | |
+} | |
+ | |
+void | |
+_threadstacklimit(void *addr, void *addr2) | |
+{ | |
+ USED(addr); | |
+} | |
+ | |
diff --git a/src/libthread/sched.c b/src/libthread/sched.c | |
t@@ -26,7 +26,6 @@ _schedinit(void *arg) | |
Proc *p; | |
Thread *t; | |
extern void ignusr1(int), _threaddie(int); | |
- ignusr1(1); | |
signal(SIGTERM, _threaddie); | |
p = arg; | |
diff --git a/src/libthread/tfork.c b/src/libthread/tfork.c | |
t@@ -0,0 +1,23 @@ | |
+#include <u.h> | |
+#include <libc.h> | |
+#include <thread.h> | |
+ | |
+Channel *c; | |
+ | |
+void | |
+f(void *v) | |
+{ | |
+ recvp(c); | |
+} | |
+ | |
+void | |
+threadmain(int argc, char **argv) | |
+{ | |
+ int i; | |
+ | |
+ c = chancreate(sizeof(ulong), 0); | |
+ for(i=0;; i++){ | |
+ print("%d\n", i); | |
+ proccreate(f, nil, 8192); | |
+ } | |
+} | |
diff --git a/unix/make/Make.Linux-power b/unix/make/Make.Linux-power | |
t@@ -0,0 +1,6 @@ | |
+CC=gcc | |
+CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I. | |
+O=o | |
+AR=ar | |
+ARFLAGS=rvc | |
+NAN=nan64.$O |