125210b06SDavid du Colombier /*
225210b06SDavid du Colombier * stubs to make bootstrap kernels link, copies of a few functions
325210b06SDavid du Colombier * to avoid including system calls yet have access to i/o functions,
425210b06SDavid du Colombier * and some convenience routines.
525210b06SDavid du Colombier */
625210b06SDavid du Colombier #include "u.h"
725210b06SDavid du Colombier #include "../port/lib.h"
825210b06SDavid du Colombier #include "mem.h"
925210b06SDavid du Colombier #include "dat.h"
1025210b06SDavid du Colombier #include "fns.h"
1125210b06SDavid du Colombier #include "../port/error.h"
1225210b06SDavid du Colombier
1325210b06SDavid du Colombier void (*proctrace)(Proc*, int, vlong);
1425210b06SDavid du Colombier
1525210b06SDavid du Colombier /* devmnt.c */
1625210b06SDavid du Colombier
1725210b06SDavid du Colombier void
muxclose(Mnt *)1825210b06SDavid du Colombier muxclose(Mnt *)
1925210b06SDavid du Colombier {
2025210b06SDavid du Colombier }
2125210b06SDavid du Colombier
2225210b06SDavid du Colombier Chan*
mntauth(Chan *,char *)2325210b06SDavid du Colombier mntauth(Chan *, char *)
2425210b06SDavid du Colombier {
2525210b06SDavid du Colombier return nil;
2625210b06SDavid du Colombier }
2725210b06SDavid du Colombier
2825210b06SDavid du Colombier long
mntversion(Chan *,char *,int,int)2925210b06SDavid du Colombier mntversion(Chan *, char *, int, int)
3025210b06SDavid du Colombier {
3125210b06SDavid du Colombier return 0;
3225210b06SDavid du Colombier }
3325210b06SDavid du Colombier
3425210b06SDavid du Colombier /* swap.c */
3525210b06SDavid du Colombier
3625210b06SDavid du Colombier Image swapimage;
3725210b06SDavid du Colombier
3825210b06SDavid du Colombier void
putswap(Page *)3925210b06SDavid du Colombier putswap(Page *)
4025210b06SDavid du Colombier {
4125210b06SDavid du Colombier }
4225210b06SDavid du Colombier
4325210b06SDavid du Colombier void
dupswap(Page *)4425210b06SDavid du Colombier dupswap(Page *)
4525210b06SDavid du Colombier {
4625210b06SDavid du Colombier }
4725210b06SDavid du Colombier
4825210b06SDavid du Colombier void
kickpager(void)4925210b06SDavid du Colombier kickpager(void)
5025210b06SDavid du Colombier {
5125210b06SDavid du Colombier }
5225210b06SDavid du Colombier
5325210b06SDavid du Colombier int
swapcount(ulong)5425210b06SDavid du Colombier swapcount(ulong)
5525210b06SDavid du Colombier {
5625210b06SDavid du Colombier return 0;
5725210b06SDavid du Colombier }
5825210b06SDavid du Colombier
5925210b06SDavid du Colombier void
pagersummary(void)6025210b06SDavid du Colombier pagersummary(void)
6125210b06SDavid du Colombier {
6225210b06SDavid du Colombier }
6325210b06SDavid du Colombier
6425210b06SDavid du Colombier void
setswapchan(Chan *)6525210b06SDavid du Colombier setswapchan(Chan *)
6625210b06SDavid du Colombier {
6725210b06SDavid du Colombier }
6825210b06SDavid du Colombier
6925210b06SDavid du Colombier /* devenv.c */
7025210b06SDavid du Colombier
7125210b06SDavid du Colombier void
closeegrp(Egrp *)7225210b06SDavid du Colombier closeegrp(Egrp *)
7325210b06SDavid du Colombier {
7425210b06SDavid du Colombier }
7525210b06SDavid du Colombier
7625210b06SDavid du Colombier void
ksetenv(char *,char *,int)7725210b06SDavid du Colombier ksetenv(char *, char *, int)
7825210b06SDavid du Colombier {
7925210b06SDavid du Colombier }
8025210b06SDavid du Colombier
8125210b06SDavid du Colombier /* devproc.c */
8225210b06SDavid du Colombier
8325210b06SDavid du Colombier Segment*
data2txt(Segment * s)8425210b06SDavid du Colombier data2txt(Segment *s)
8525210b06SDavid du Colombier {
8625210b06SDavid du Colombier Segment *ps;
8725210b06SDavid du Colombier
8825210b06SDavid du Colombier ps = newseg(SG_TEXT, s->base, s->size);
8925210b06SDavid du Colombier ps->image = s->image;
9025210b06SDavid du Colombier incref(ps->image);
9125210b06SDavid du Colombier ps->fstart = s->fstart;
9225210b06SDavid du Colombier ps->flen = s->flen;
9325210b06SDavid du Colombier ps->flushme = 1;
9425210b06SDavid du Colombier return ps;
9525210b06SDavid du Colombier }
9625210b06SDavid du Colombier
9725210b06SDavid du Colombier /* sysproc.c */
9825210b06SDavid du Colombier
9925210b06SDavid du Colombier int
return0(void *)10025210b06SDavid du Colombier return0(void*)
10125210b06SDavid du Colombier {
10225210b06SDavid du Colombier return 0;
10325210b06SDavid du Colombier }
10425210b06SDavid du Colombier
10525210b06SDavid du Colombier /* syscallfmt.c */
10625210b06SDavid du Colombier void
syscallfmt(int,ulong,va_list)10725210b06SDavid du Colombier syscallfmt(int, ulong, va_list)
10825210b06SDavid du Colombier {
10925210b06SDavid du Colombier }
11025210b06SDavid du Colombier
11125210b06SDavid du Colombier void
sysretfmt(int,va_list,long,uvlong,uvlong)11225210b06SDavid du Colombier sysretfmt(int, va_list, long, uvlong, uvlong)
11325210b06SDavid du Colombier {
11425210b06SDavid du Colombier }
11525210b06SDavid du Colombier
11625210b06SDavid du Colombier /* sysfile.c */
11725210b06SDavid du Colombier
11825210b06SDavid du Colombier int
newfd(Chan *)11925210b06SDavid du Colombier newfd(Chan *)
12025210b06SDavid du Colombier {
12125210b06SDavid du Colombier return -1;
12225210b06SDavid du Colombier }
12325210b06SDavid du Colombier
12425210b06SDavid du Colombier void
validstat(uchar * s,int n)12525210b06SDavid du Colombier validstat(uchar *s, int n)
12625210b06SDavid du Colombier {
12725210b06SDavid du Colombier int m;
12825210b06SDavid du Colombier char buf[64];
12925210b06SDavid du Colombier
13025210b06SDavid du Colombier if(statcheck(s, n) < 0)
13125210b06SDavid du Colombier error(Ebadstat);
13225210b06SDavid du Colombier /* verify that name entry is acceptable */
13325210b06SDavid du Colombier s += STATFIXLEN - 4*BIT16SZ; /* location of first string */
13425210b06SDavid du Colombier /*
13525210b06SDavid du Colombier * s now points at count for first string.
13625210b06SDavid du Colombier * if it's too long, let the server decide; this is
13725210b06SDavid du Colombier * only for his protection anyway. otherwise
13825210b06SDavid du Colombier * we'd have to allocate and waserror.
13925210b06SDavid du Colombier */
14025210b06SDavid du Colombier m = GBIT16(s);
14125210b06SDavid du Colombier s += BIT16SZ;
14225210b06SDavid du Colombier if(m+1 > sizeof buf)
14325210b06SDavid du Colombier return;
14425210b06SDavid du Colombier memmove(buf, s, m);
14525210b06SDavid du Colombier buf[m] = '\0';
14625210b06SDavid du Colombier /* name could be '/' */
14725210b06SDavid du Colombier if(strcmp(buf, "/") != 0)
14825210b06SDavid du Colombier validname(buf, 0);
14925210b06SDavid du Colombier }
15025210b06SDavid du Colombier
15125210b06SDavid du Colombier Chan*
fdtochan(int fd,int mode,int chkmnt,int iref)15225210b06SDavid du Colombier fdtochan(int fd, int mode, int chkmnt, int iref)
15325210b06SDavid du Colombier {
15425210b06SDavid du Colombier Chan *c;
15525210b06SDavid du Colombier Fgrp *f;
15625210b06SDavid du Colombier
15725210b06SDavid du Colombier c = 0;
15825210b06SDavid du Colombier f = up->fgrp;
15925210b06SDavid du Colombier
16025210b06SDavid du Colombier lock(f);
16125210b06SDavid du Colombier if(fd<0 || f->nfd<=fd || (c = f->fd[fd])==0) {
16225210b06SDavid du Colombier unlock(f);
16325210b06SDavid du Colombier error(Ebadfd);
16425210b06SDavid du Colombier }
16525210b06SDavid du Colombier if(iref)
16625210b06SDavid du Colombier incref(c);
16725210b06SDavid du Colombier unlock(f);
16825210b06SDavid du Colombier
16925210b06SDavid du Colombier if(chkmnt && (c->flag&CMSG)) {
17025210b06SDavid du Colombier if(iref)
17125210b06SDavid du Colombier cclose(c);
17225210b06SDavid du Colombier error(Ebadusefd);
17325210b06SDavid du Colombier }
17425210b06SDavid du Colombier
17525210b06SDavid du Colombier if(mode<0 || c->mode==ORDWR)
17625210b06SDavid du Colombier return c;
17725210b06SDavid du Colombier
17825210b06SDavid du Colombier if((mode&OTRUNC) && c->mode==OREAD) {
17925210b06SDavid du Colombier if(iref)
18025210b06SDavid du Colombier cclose(c);
18125210b06SDavid du Colombier error(Ebadusefd);
18225210b06SDavid du Colombier }
18325210b06SDavid du Colombier
18425210b06SDavid du Colombier if((mode&~OTRUNC) != c->mode) {
18525210b06SDavid du Colombier if(iref)
18625210b06SDavid du Colombier cclose(c);
18725210b06SDavid du Colombier error(Ebadusefd);
18825210b06SDavid du Colombier }
18925210b06SDavid du Colombier
19025210b06SDavid du Colombier return c;
19125210b06SDavid du Colombier }
19225210b06SDavid du Colombier
19325210b06SDavid du Colombier int
openmode(ulong o)19425210b06SDavid du Colombier openmode(ulong o)
19525210b06SDavid du Colombier {
19625210b06SDavid du Colombier o &= ~(OTRUNC|OCEXEC|ORCLOSE);
19725210b06SDavid du Colombier if(o > OEXEC)
19825210b06SDavid du Colombier error(Ebadarg);
19925210b06SDavid du Colombier if(o == OEXEC)
20025210b06SDavid du Colombier return OREAD;
20125210b06SDavid du Colombier return o;
20225210b06SDavid du Colombier }
20325210b06SDavid du Colombier
20425210b06SDavid du Colombier int
bind(char * old,char * new,int flag)20525210b06SDavid du Colombier bind(char *old, char *new, int flag)
20625210b06SDavid du Colombier {
20725210b06SDavid du Colombier int ret;
20825210b06SDavid du Colombier Chan *c0, *c1;
20925210b06SDavid du Colombier
21025210b06SDavid du Colombier if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
21125210b06SDavid du Colombier error(Ebadarg);
21225210b06SDavid du Colombier
21325210b06SDavid du Colombier c0 = namec(old, Abind, 0, 0);
21425210b06SDavid du Colombier if(waserror()){
21525210b06SDavid du Colombier cclose(c0);
21625210b06SDavid du Colombier return -1;
21725210b06SDavid du Colombier }
21825210b06SDavid du Colombier
21925210b06SDavid du Colombier c1 = namec(new, Amount, 0, 0);
22025210b06SDavid du Colombier if(waserror()){
22125210b06SDavid du Colombier cclose(c1);
22225210b06SDavid du Colombier nexterror();
22325210b06SDavid du Colombier }
22425210b06SDavid du Colombier
22525210b06SDavid du Colombier ret = cmount(&c0, c1, flag, nil);
22625210b06SDavid du Colombier
22725210b06SDavid du Colombier poperror();
22825210b06SDavid du Colombier cclose(c1);
22925210b06SDavid du Colombier poperror();
23025210b06SDavid du Colombier cclose(c0);
23125210b06SDavid du Colombier return ret;
23225210b06SDavid du Colombier }
23325210b06SDavid du Colombier
23425210b06SDavid du Colombier long
unmount(char * name,char * old)23525210b06SDavid du Colombier unmount(char *name, char *old)
23625210b06SDavid du Colombier {
23725210b06SDavid du Colombier Chan *cmount, *cmounted;
23825210b06SDavid du Colombier
23925210b06SDavid du Colombier cmounted = 0;
24025210b06SDavid du Colombier cmount = namec(old, Amount, 0, 0);
24125210b06SDavid du Colombier if(waserror()) {
24225210b06SDavid du Colombier cclose(cmount);
24325210b06SDavid du Colombier if(cmounted)
24425210b06SDavid du Colombier cclose(cmounted);
24525210b06SDavid du Colombier return -1;
24625210b06SDavid du Colombier }
24725210b06SDavid du Colombier
24825210b06SDavid du Colombier if(name)
24925210b06SDavid du Colombier /*
25025210b06SDavid du Colombier * This has to be namec(..., Aopen, ...) because
25125210b06SDavid du Colombier * if name is something like /srv/cs or /fd/0,
25225210b06SDavid du Colombier * opening it is the only way to get at the real
25325210b06SDavid du Colombier * Chan underneath.
25425210b06SDavid du Colombier */
25525210b06SDavid du Colombier cmounted = namec(name, Aopen, OREAD, 0);
25625210b06SDavid du Colombier cunmount(cmount, cmounted);
25725210b06SDavid du Colombier poperror();
25825210b06SDavid du Colombier cclose(cmount);
25925210b06SDavid du Colombier if(cmounted)
26025210b06SDavid du Colombier cclose(cmounted);
26125210b06SDavid du Colombier return 0;
26225210b06SDavid du Colombier }
26325210b06SDavid du Colombier
26425210b06SDavid du Colombier long
chdir(char * dir)26525210b06SDavid du Colombier chdir(char *dir)
26625210b06SDavid du Colombier {
26725210b06SDavid du Colombier Chan *c;
26825210b06SDavid du Colombier
26925210b06SDavid du Colombier if (waserror())
27025210b06SDavid du Colombier return -1;
27125210b06SDavid du Colombier c = namec(dir, Atodir, 0, 0);
27225210b06SDavid du Colombier if (up->dot)
27325210b06SDavid du Colombier cclose(up->dot);
27425210b06SDavid du Colombier up->dot = c;
27525210b06SDavid du Colombier poperror();
27625210b06SDavid du Colombier return 0;
27725210b06SDavid du Colombier }
27825210b06SDavid du Colombier
27925210b06SDavid du Colombier Chan *
namecopen(char * name,int mode)28025210b06SDavid du Colombier namecopen(char *name, int mode)
28125210b06SDavid du Colombier {
28225210b06SDavid du Colombier Chan *c;
28325210b06SDavid du Colombier
28425210b06SDavid du Colombier if (waserror())
28525210b06SDavid du Colombier return nil;
28625210b06SDavid du Colombier c = namec(name, Aopen, mode, 0);
28725210b06SDavid du Colombier poperror();
28825210b06SDavid du Colombier return c;
28925210b06SDavid du Colombier }
29025210b06SDavid du Colombier
29125210b06SDavid du Colombier Chan *
enamecopen(char * name,int mode)29225210b06SDavid du Colombier enamecopen(char *name, int mode)
29325210b06SDavid du Colombier {
29425210b06SDavid du Colombier Chan *c;
29525210b06SDavid du Colombier
29625210b06SDavid du Colombier c = namecopen(name, mode);
29725210b06SDavid du Colombier if (c == nil)
29825210b06SDavid du Colombier panic("can't open %s", name);
29925210b06SDavid du Colombier return c;
30025210b06SDavid du Colombier }
30125210b06SDavid du Colombier
30225210b06SDavid du Colombier Chan *
nameccreate(char * name,int mode)30325210b06SDavid du Colombier nameccreate(char *name, int mode)
30425210b06SDavid du Colombier {
30525210b06SDavid du Colombier Chan *c;
30625210b06SDavid du Colombier
30725210b06SDavid du Colombier if (waserror())
30825210b06SDavid du Colombier return nil;
30925210b06SDavid du Colombier c = namec(name, Acreate, mode, 0);
31025210b06SDavid du Colombier poperror();
31125210b06SDavid du Colombier return c;
31225210b06SDavid du Colombier }
31325210b06SDavid du Colombier
31425210b06SDavid du Colombier Chan *
enameccreate(char * name,int mode)31525210b06SDavid du Colombier enameccreate(char *name, int mode)
31625210b06SDavid du Colombier {
31725210b06SDavid du Colombier Chan *c;
31825210b06SDavid du Colombier
31925210b06SDavid du Colombier c = nameccreate(name, mode);
32025210b06SDavid du Colombier if (c == nil)
32125210b06SDavid du Colombier panic("can't create %s", name);
32225210b06SDavid du Colombier return c;
32325210b06SDavid du Colombier }
32425210b06SDavid du Colombier
32525210b06SDavid du Colombier int
myreadn(Chan * c,void * vp,long n)32625210b06SDavid du Colombier myreadn(Chan *c, void *vp, long n)
32725210b06SDavid du Colombier {
32825210b06SDavid du Colombier char *p = vp;
32925210b06SDavid du Colombier long nn;
33025210b06SDavid du Colombier
33125210b06SDavid du Colombier while(n > 0) {
33225210b06SDavid du Colombier nn = devtab[c->type]->read(c, p, n, c->offset);
33325210b06SDavid du Colombier if(nn == 0)
33425210b06SDavid du Colombier break;
33525210b06SDavid du Colombier c->offset += nn;
33625210b06SDavid du Colombier p += nn;
33725210b06SDavid du Colombier n -= nn;
33825210b06SDavid du Colombier }
33925210b06SDavid du Colombier return p - (char *)vp;
34025210b06SDavid du Colombier }
34125210b06SDavid du Colombier
34225210b06SDavid du Colombier int
readfile(char * file,void * buf,int len)34325210b06SDavid du Colombier readfile(char *file, void *buf, int len)
34425210b06SDavid du Colombier {
34525210b06SDavid du Colombier int n;
34625210b06SDavid du Colombier Chan *cc;
34725210b06SDavid du Colombier
34825210b06SDavid du Colombier cc = nil;
34925210b06SDavid du Colombier if (waserror()) {
35025210b06SDavid du Colombier if (cc)
35125210b06SDavid du Colombier cclose(cc);
35225210b06SDavid du Colombier return -1;
35325210b06SDavid du Colombier }
35425210b06SDavid du Colombier cc = namecopen(file, OREAD);
35525210b06SDavid du Colombier if (cc == nil)
35625210b06SDavid du Colombier error("no such file");
35725210b06SDavid du Colombier n = myreadn(cc, buf, len);
35825210b06SDavid du Colombier poperror();
35925210b06SDavid du Colombier cclose(cc);
36025210b06SDavid du Colombier return n;
36125210b06SDavid du Colombier }
36225210b06SDavid du Colombier
36325210b06SDavid du Colombier static int
dumpfile(char * file)36425210b06SDavid du Colombier dumpfile(char *file)
36525210b06SDavid du Colombier {
36625210b06SDavid du Colombier int n;
36725210b06SDavid du Colombier char *buf;
36825210b06SDavid du Colombier
36925210b06SDavid du Colombier buf = smalloc(Maxfile + 1);
37025210b06SDavid du Colombier n = readfile(file, buf, Maxfile);
37125210b06SDavid du Colombier if (n < 0)
37225210b06SDavid du Colombier return -1;
37325210b06SDavid du Colombier buf[n] = 0;
37425210b06SDavid du Colombier print("%s (%d bytes):\n", file, n);
37525210b06SDavid du Colombier print("%s\n", buf);
37625210b06SDavid du Colombier free(buf);
37725210b06SDavid du Colombier return 0;
37825210b06SDavid du Colombier }
37925210b06SDavid du Colombier
38025210b06SDavid du Colombier /* main.c */
38125210b06SDavid du Colombier
38225210b06SDavid du Colombier void
fpx87restore(FPsave *)38325210b06SDavid du Colombier fpx87restore(FPsave*)
38425210b06SDavid du Colombier {
38525210b06SDavid du Colombier }
38625210b06SDavid du Colombier
38725210b06SDavid du Colombier void
fpx87save(FPsave *)38825210b06SDavid du Colombier fpx87save(FPsave*)
38925210b06SDavid du Colombier {
39025210b06SDavid du Colombier }
39125210b06SDavid du Colombier
39225210b06SDavid du Colombier void
fpssesave(FPsave *)39325210b06SDavid du Colombier fpssesave(FPsave *)
39425210b06SDavid du Colombier {
39525210b06SDavid du Colombier }
39625210b06SDavid du Colombier
39725210b06SDavid du Colombier void
fpsserestore(FPsave *)39825210b06SDavid du Colombier fpsserestore(FPsave *)
39925210b06SDavid du Colombier {
40025210b06SDavid du Colombier }
401*a826b788SDavid du Colombier
402*a826b788SDavid du Colombier ulong
l2be(long l)403*a826b788SDavid du Colombier l2be(long l)
404*a826b788SDavid du Colombier {
405*a826b788SDavid du Colombier uchar *cp;
406*a826b788SDavid du Colombier
407*a826b788SDavid du Colombier cp = (uchar*)&l;
408*a826b788SDavid du Colombier return (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | cp[3];
409*a826b788SDavid du Colombier }
410