ref: 8287e0cd29d9afdb41efa029705644f8427cf53a
parent: 1900acf7ad612d4f40701ad9b32434579c269304
author: kws <kws@cirno>
date: Fri Dec 29 22:27:09 EST 2023
more libraries
--- a/bind.rc
+++ b/bind.rc
@@ -4,6 +4,11 @@
bind -b sys/include /sys/include
bind -bc sys/src/libmach /sys/src/libmach
bind -bc sys/src/boot/efi /sys/src/boot/efi
+bind -a sys/src/libc /sys/src/libc
+bind -a sys/src/libsec /sys/src/libsec
+bind -a sys/src/libmp /sys/src/libmp
+bind -ac sys/src/libthread /sys/src/libthread
+bind -bc sys/src/libc/9syscall /sys/src/libc/9syscall
bind -ac sys/src/cmd /sys/src/cmd
bind -c sys/src/cmd/aux/aout2efi.c /sys/src/cmd/aux/aout2efi.c
bind -c sys/lib/rootstub /sys/lib/rootstub
--- a/sys/src/cmd/zc/list.c
+++ b/sys/src/cmd/zc/list.c
@@ -115,6 +115,12 @@
sprint(str, "%N(R%d)(REG)", a, a->reg);
break;
+ case D_FREG:
+ sprint(str, "F%d", a->reg);
+ if(a->name != D_NONE || a->sym != S)
+ sprint(str, "%N(R%d)(REG)", a, a->reg);
+ break;
+
case D_FCCREG:
sprint(str, "FCC%d", a->reg);
if(a->name != D_NONE || a->sym != S)
--- a/sys/src/cmd/zc/reg.c
+++ b/sys/src/cmd/zc/reg.c
@@ -577,7 +577,7 @@
v++;
}
if(s)
- if(s->name[0] == '.')
+ if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
goto none;
if(nvar >= NVAR) {
if(debug['w'] > 1 && s)
--- a/sys/src/cmd/zc/txt.c
+++ b/sys/src/cmd/zc/txt.c
@@ -559,7 +559,6 @@
{
int ft, tt, a;
Node nod;
- Prog *p1;
ft = f->type->etype;
tt = t->type->etype;
@@ -748,40 +747,12 @@
case TULONG:
switch(tt) {
case TDOUBLE:
- diag(Z, "TODO long -> double");
-#ifdef TODO
- gins(AMOVW, f, t);
- gins(AMOVWD, t, t);
- if(ft == TULONG || ft == TUINT) {
- regalloc(&nod, t, Z);
- gins(ACMPGED, t, Z);
- p->reg = FREGZERO;
- gins(ABFPT, Z, Z);
- p1 = p;
- gins(AMOVD, nodfconst(4294967296.), &nod);
- gins(AADDD, &nod, t);
- patch(p1, pc);
- regfree(&nod);
- }
-#endif
+ gins(AMOVV, f, t);
+ gins(AMOVVD, t, t);
return;
case TFLOAT:
- diag(Z, "TODO long -> float");
-#ifdef TODO
gins(AMOVW, f, t);
- gins(AMOVWF, t, t);
- if(ft == TULONG || ft == TUINT) {
- regalloc(&nod, t, Z);
- gins(ACMPGEF, t, Z);
- p->reg = FREGZERO;
- gins(ABFPT, Z, Z);
- p1 = p;
- gins(AMOVF, nodfconst(4294967296.), &nod);
- gins(AADDF, &nod, t);
- patch(p1, pc);
- regfree(&nod);
- }
-#endif
+ gins(AMOVVF, t, t);
return;
case TUVLONG:
case TVLONG:
--- a/sys/src/cmd/zl/asm.c
+++ b/sys/src/cmd/zl/asm.c
@@ -994,18 +994,6 @@
o3 = OP_12IRR(opirr(p->as+ALAST), v, REGTMP, p->to.reg);
break;
-#ifdef TODO
- case 37: /* movw r,mr */
- a = OP_TEN(); /* movgr2cf */
- o1 = OP_RR(a, p->from.reg, p->to.reg);
- break;
-
- case 38: /* movw mr,r */
- a = OP_TEN(); /* movcf2gr */
- o1 = OP_RR(a, p->to.reg, p->from.reg);
- break;
-#endif
-
case 40: /* word */
if(aflag)
return 0;
@@ -1012,29 +1000,15 @@
o1 = regoff(&p->to);
break;
-#ifdef TODO
- case 41: /* movw r,fcr */
- a = OP_TEN(); /* movgr2fcsr */
- o1 = OP_RR(a, p->from.reg, p->to.reg);
- break;
-
- case 42: /* movw fcr,r */
- a = OP_TEN(); /* movfcsr2gr */
- o1 = OP_RR(a, p->to.reg, p->from.reg);
- break;
-#endif
-
-#ifdef TODO
case 47: /* movv r,fr */
- r = SP(2,1)|(5<<21); /* dmtc1 */
- o1 = OP_RRR(r, p->from.reg, 0, p->to.reg);
+ r = OP_TEN(8, 1322); /* movgr2fr.d */
+ o1 = OP_RR(r, p->from.reg, p->to.reg);
break;
case 48: /* movv fr,r */
- r = SP(2,1)|(1<<21); /* dmfc1 */
- o1 = OP_RRR(r, p->to.reg, 0, p->from.reg);
+ r = OP_TEN(8, 1326); /* movfr2gr.d */
+ o1 = OP_RR(r, p->from.reg, p->to.reg);
break;
-#endif
}
if(aflag)
return o1;
--- a/sys/src/cmd/zl/obj.c
+++ b/sys/src/cmd/zl/obj.c
@@ -477,24 +477,25 @@
void
addlib(char *obj)
{
- char fn1[LIBNAMELEN], comp[LIBNAMELEN], *p, *name;
- int i, search;
+ char name[1024], comp[256], *p;
+ int i;
if(histfrogp <= 0)
return;
- name = fn1;
- search = 0;
if(histfrog[0]->name[1] == '/') {
- sprint(name, "");
+ name[0] = 0;
i = 1;
- } else if(histfrog[0]->name[1] == '.') {
- sprint(name, ".");
+ } else
+ if(histfrog[0]->name[1] == '.') {
+ snprint(name, sizeof name, ".");
i = 0;
} else {
- sprint(name, "");
+ if(debug['9'])
+ snprint(name, sizeof name, "/%s/lib", thestring);
+ else
+ snprint(name, sizeof name, "/usr/%clib", thechar);
i = 0;
- search = 1;
}
for(; i<histfrogp; i++) {
@@ -517,13 +518,12 @@
memmove(p+strlen(thestring), p+2, strlen(p+2)+1);
memmove(p, thestring, strlen(thestring));
}
- if(strlen(fn1) + strlen(comp) + 3 >= sizeof(fn1)) {
+ if(strlen(name) + strlen(comp) + 3 >= sizeof(name)) {
diag("library component too long");
return;
}
- if(i > 0 || !search)
- strcat(fn1, "/");
- strcat(fn1, comp);
+ strcat(name, "/");
+ strcat(name, comp);
}
for(i=0; i<libraryp; i++)
if(strcmp(name, library[i]) == 0)
--- /dev/null
+++ b/sys/src/libc/9syscall/mkfile
@@ -1,0 +1,160 @@
+NPROC=1
+</$objtype/mkfile
+
+install:V:
+ SYS=`{sed '/^#define._X[123]/d; s/#define.([A-Z0-9_]*).*/\1/' sys.h}
+ for(I in $SYS) {
+ i=`{echo $I|tr A-Z a-z}
+ n=`{sed -n '/[ ]'$I'[ ]/s/.* //p' sys.h}
+ if(~ $i (exits nsec)) i=_$i
+ {switch($objtype){
+ case 68000 68020
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVL '$'$n, R0
+ echo TRAP '$0'
+ echo RTS
+ case mips
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R1, '0(FP)'
+ echo MOVW '$'$n, R1
+ echo SYSCALL
+ if(~ $i (seek _nsec)) {
+ echo 'MOVW $-1,R5
+ BNE R1,R5,4(PC)
+ MOVW a+0(FP),R5
+ MOVW R1,0(R5)
+ MOVW R1,4(R5)'
+ }
+ echo RET
+ case mips2
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R1, '0(FP)'
+ echo MOVW '$'$n, R1
+ echo ADD '$4',R29
+ echo SYSCALL
+ echo ADD '$-4',R29
+ echo RET
+ case spim
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R1, '0(FP)'
+ echo MOVW '$'$n, R1
+ echo ADD '$4',R29
+ echo SYSCALL
+ echo ADD '$-4',R29
+ if(~ $i (seek _nsec)) { # untested so far - geoff
+ echo 'MOVW $-1,R5
+ BNE R1,R5,4(PC)
+ MOVW a+0(FP),R5
+ MOVW R1,0(R5)
+ MOVW R1,4(R5)'
+ }
+ echo RET
+ case 386
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVL '$'$n, AX
+ echo INT '$'64
+ if(~ $i (seek _nsec)) {
+ echo 'CMPL AX,$-1
+ JNE 4(PC)
+ MOVL a+0(FP),CX
+ MOVL AX,0(CX)
+ MOVL AX,4(CX)'
+ }
+ echo RET
+ case amd64
+ j=$i
+ if(~ $i seek) j=_seek
+ echo TEXT $j'(SB)', 1, '$0'
+ echo MOVQ RARG, 'a0+0(FP)'
+ echo MOVQ '$'$n, RARG
+ echo SYSCALL
+ echo RET
+ case sparc sparc64
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R7, '0(FP)'
+ echo MOVW '$'$n, R7
+ echo TA R0
+ if(~ $i (seek _nsec)) {
+ echo 'CMP R7,$-1
+ BNE 4(PC)
+ MOVW a+0(FP),R8
+ MOVW R7,0(R8)
+ MOVW R7,4(R8)'
+ }
+ echo RETURN
+ case 3210
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R3, '0(FP)'
+ echo MOVW '$'$n, R3
+ echo WORD '$0x06000000'
+ echo RETURN
+ case 29000
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVL R69, '0(FP)'
+ echo MOVL '$'$n, R69
+ echo EMULATE 0
+ echo RET
+ case arm
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R0, '0(FP)'
+ echo MOVW '$'$n, R0
+ echo SWI 0
+ if(~ $i (seek _nsec)) {
+ echo 'CMP $-1,R0
+ BNE 4(PC)
+ MOVW a+0(FP),R1
+ MOVW R0,0(R1)
+ MOVW R0,4(R1)'
+ }
+ echo RET
+ case arm64
+ j=$i
+ if(~ $i seek) j=_seek
+ echo TEXT $j'(SB)', 1, '$0'
+ echo MOV R0, '0(FP)'
+ echo MOV '$'$n, R0
+ echo SVC
+ echo RETURN
+ case loong
+ j=$i
+ if(~ $i seek) j=_seek
+ echo TEXT $j'(SB)', 1, '$0'
+ echo MOVV R4, '0(FP)'
+ echo MOVV '$'$n, R4
+ echo SYSCALL
+ echo RET
+ case power
+ echo TEXT $i'(SB)', 1, '$0'
+ echo MOVW R3, '0(FP)'
+ echo MOVW '$'$n, R3
+ echo SYSCALL
+ if(~ $i (seek _nsec)) {
+ echo 'CMP R3,$-1
+ BNE 4(PC)
+ MOVW a+0(FP),R8
+ MOVW R3,0(R8)
+ MOVW R3,4(R8)'
+ }
+ echo RETURN
+ case alpha
+ j=$i
+ if(~ $i seek) j=_seek
+ echo TEXT $j'(SB)', 1, '$0'
+ echo MOVL R0, '0(FP)'
+ echo MOVQ '$'$n, R0
+ echo CALL_PAL '$'0x83
+ echo RET
+ }} > $i.s
+ $AS $i.s
+ }
+ ar vu /$objtype/lib/libc.a *.$O
+ rm -f *.$O *.s
+
+nuke clean:V:
+ rm -f *.[$OS]
+
+installall:V:
+ for(objtype in $CPUS) mk install
+
+update:V:
+ update $UPDATEFLAGS mkfile sys.h
--- /dev/null
+++ b/sys/src/libc/loong/_seek.c
@@ -1,0 +1,14 @@
+#include <u.h>
+#include <libc.h>
+
+extern int _seek(vlong*, int, vlong, int);
+
+vlong
+seek(int fd, vlong o, int p)
+{
+ vlong l;
+
+ if(_seek(&l, fd, o, p) < 0)
+ l = -1LL;
+ return l;
+}
--- /dev/null
+++ b/sys/src/libc/loong/argv0.s
@@ -1,0 +1,4 @@
+GLOBL argv0(SB), $8
+GLOBL _tos(SB), $8
+GLOBL _privates(SB), $8
+GLOBL _nprivates(SB), $4
--- /dev/null
+++ b/sys/src/libc/loong/getcallerpc.s
@@ -1,0 +1,3 @@
+TEXT getcallerpc(SB), $0
+ MOVV 0(SP), R4
+ RET
--- /dev/null
+++ b/sys/src/libc/loong/mkfile
@@ -1,0 +1,29 @@
+objtype=loong
+</$objtype/mkfile
+OS=z
+
+LIB=/$objtype/lib/libc.a
+SFILES=\
+ argv0.s\
+# atom.s\
+ getcallerpc.s\
+# getfcr.s\
+# main9.s\
+# main9p.s\
+# setjmp.s\
+# tas.s\
+
+CFILES=\
+ notejmp.c\
+ _seek.c\
+
+HFILES=/sys/include/libc.h
+
+OFILES=${CFILES:%.c=%.$O} ${SFILES:%.s=%.$O}
+
+UPDATE=mkfile\
+ $HFILES\
+ $CFILES\
+ $SFILES\
+
+</sys/src/cmd/mksyslib
--- /dev/null
+++ b/sys/src/libc/loong/notejmp.c
@@ -1,0 +1,16 @@
+#include <u.h>
+#include <libc.h>
+#include <ureg.h>
+
+void
+notejmp(void *vr, jmp_buf j, int ret)
+{
+ struct Ureg *r = vr;
+
+ r->r4 = ret;
+ if(ret == 0)
+ r->r4 = 1;
+ r->pc = j[JMPBUFPC];
+ r->sp = j[JMPBUFSP];
+ noted(NCONT);
+}
--- /dev/null
+++ b/sys/src/libmp/loong/mkfile
@@ -1,0 +1,7 @@
+objtype=loong
+</$objtype/mkfile
+
+install clean all update:V:
+
+
+
--- /dev/null
+++ b/sys/src/libsec/loong/mkfile
@@ -1,0 +1,2 @@
+install clean all:V:
+ exit
--- /dev/null
+++ b/sys/src/libthread/loong.c
@@ -1,0 +1,28 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include "threadimpl.h"
+
+/* first argument goes in a register; simplest just to ignore it */
+static void
+launcherloong(int, void (*f)(void *arg), void *arg)
+{
+ (*f)(arg);
+ threadexits(nil);
+}
+
+void
+_threadinitstack(Thread *t, void (*f)(void*), void *arg)
+{
+ uintptr *tos;
+
+ tos = (uintptr*)&t->stk[t->stksize&~15];
+ *--tos = (uintptr)arg;
+ *--tos = (uintptr)f;
+ *--tos = 0; /* first arg to launcherloong */
+ *--tos = 0; /* place to store return PC */
+
+ t->sched[JMPBUFPC] = (uintptr)launcherloong+JMPBUFDPC;
+ t->sched[JMPBUFSP] = (uintptr)tos;
+}
+