xref: /plan9/sys/src/9/pcboot/stub.c (revision a826b788f46ccc92a1e0e05eb47067d9d683fddd)
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