xref: /plan9/sys/src/9/pcboot/stub.c (revision a826b788f46ccc92a1e0e05eb47067d9d683fddd)
1 /*
2  * stubs to make bootstrap kernels link, copies of a few functions
3  * to avoid including system calls yet have access to i/o functions,
4  * and some convenience routines.
5  */
6 #include	"u.h"
7 #include	"../port/lib.h"
8 #include	"mem.h"
9 #include	"dat.h"
10 #include	"fns.h"
11 #include	"../port/error.h"
12 
13 void (*proctrace)(Proc*, int, vlong);
14 
15 /* devmnt.c */
16 
17 void
muxclose(Mnt *)18 muxclose(Mnt *)
19 {
20 }
21 
22 Chan*
mntauth(Chan *,char *)23 mntauth(Chan *, char *)
24 {
25 	return nil;
26 }
27 
28 long
mntversion(Chan *,char *,int,int)29 mntversion(Chan *, char *, int, int)
30 {
31 	return 0;
32 }
33 
34 /* swap.c */
35 
36 Image swapimage;
37 
38 void
putswap(Page *)39 putswap(Page *)
40 {
41 }
42 
43 void
dupswap(Page *)44 dupswap(Page *)
45 {
46 }
47 
48 void
kickpager(void)49 kickpager(void)
50 {
51 }
52 
53 int
swapcount(ulong)54 swapcount(ulong)
55 {
56 	return 0;
57 }
58 
59 void
pagersummary(void)60 pagersummary(void)
61 {
62 }
63 
64 void
setswapchan(Chan *)65 setswapchan(Chan *)
66 {
67 }
68 
69 /* devenv.c */
70 
71 void
closeegrp(Egrp *)72 closeegrp(Egrp *)
73 {
74 }
75 
76 void
ksetenv(char *,char *,int)77 ksetenv(char *, char *, int)
78 {
79 }
80 
81 /* devproc.c */
82 
83 Segment*
data2txt(Segment * s)84 data2txt(Segment *s)
85 {
86 	Segment *ps;
87 
88 	ps = newseg(SG_TEXT, s->base, s->size);
89 	ps->image = s->image;
90 	incref(ps->image);
91 	ps->fstart = s->fstart;
92 	ps->flen = s->flen;
93 	ps->flushme = 1;
94 	return ps;
95 }
96 
97 /* sysproc.c */
98 
99 int
return0(void *)100 return0(void*)
101 {
102 	return 0;
103 }
104 
105 /* syscallfmt.c */
106 void
syscallfmt(int,ulong,va_list)107 syscallfmt(int, ulong, va_list)
108 {
109 }
110 
111 void
sysretfmt(int,va_list,long,uvlong,uvlong)112 sysretfmt(int, va_list, long, uvlong, uvlong)
113 {
114 }
115 
116 /* sysfile.c */
117 
118 int
newfd(Chan *)119 newfd(Chan *)
120 {
121 	return -1;
122 }
123 
124 void
validstat(uchar * s,int n)125 validstat(uchar *s, int n)
126 {
127 	int m;
128 	char buf[64];
129 
130 	if(statcheck(s, n) < 0)
131 		error(Ebadstat);
132 	/* verify that name entry is acceptable */
133 	s += STATFIXLEN - 4*BIT16SZ;	/* location of first string */
134 	/*
135 	 * s now points at count for first string.
136 	 * if it's too long, let the server decide; this is
137 	 * only for his protection anyway. otherwise
138 	 * we'd have to allocate and waserror.
139 	 */
140 	m = GBIT16(s);
141 	s += BIT16SZ;
142 	if(m+1 > sizeof buf)
143 		return;
144 	memmove(buf, s, m);
145 	buf[m] = '\0';
146 	/* name could be '/' */
147 	if(strcmp(buf, "/") != 0)
148 		validname(buf, 0);
149 }
150 
151 Chan*
fdtochan(int fd,int mode,int chkmnt,int iref)152 fdtochan(int fd, int mode, int chkmnt, int iref)
153 {
154 	Chan *c;
155 	Fgrp *f;
156 
157 	c = 0;
158 	f = up->fgrp;
159 
160 	lock(f);
161 	if(fd<0 || f->nfd<=fd || (c = f->fd[fd])==0) {
162 		unlock(f);
163 		error(Ebadfd);
164 	}
165 	if(iref)
166 		incref(c);
167 	unlock(f);
168 
169 	if(chkmnt && (c->flag&CMSG)) {
170 		if(iref)
171 			cclose(c);
172 		error(Ebadusefd);
173 	}
174 
175 	if(mode<0 || c->mode==ORDWR)
176 		return c;
177 
178 	if((mode&OTRUNC) && c->mode==OREAD) {
179 		if(iref)
180 			cclose(c);
181 		error(Ebadusefd);
182 	}
183 
184 	if((mode&~OTRUNC) != c->mode) {
185 		if(iref)
186 			cclose(c);
187 		error(Ebadusefd);
188 	}
189 
190 	return c;
191 }
192 
193 int
openmode(ulong o)194 openmode(ulong o)
195 {
196 	o &= ~(OTRUNC|OCEXEC|ORCLOSE);
197 	if(o > OEXEC)
198 		error(Ebadarg);
199 	if(o == OEXEC)
200 		return OREAD;
201 	return o;
202 }
203 
204 int
bind(char * old,char * new,int flag)205 bind(char *old, char *new, int flag)
206 {
207 	int ret;
208 	Chan *c0, *c1;
209 
210 	if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
211 		error(Ebadarg);
212 
213 	c0 = namec(old, Abind, 0, 0);
214 	if(waserror()){
215 		cclose(c0);
216 		return -1;
217 	}
218 
219 	c1 = namec(new, Amount, 0, 0);
220 	if(waserror()){
221 		cclose(c1);
222 		nexterror();
223 	}
224 
225 	ret = cmount(&c0, c1, flag, nil);
226 
227 	poperror();
228 	cclose(c1);
229 	poperror();
230 	cclose(c0);
231 	return ret;
232 }
233 
234 long
unmount(char * name,char * old)235 unmount(char *name, char *old)
236 {
237 	Chan *cmount, *cmounted;
238 
239 	cmounted = 0;
240 	cmount = namec(old, Amount, 0, 0);
241 	if(waserror()) {
242 		cclose(cmount);
243 		if(cmounted)
244 			cclose(cmounted);
245 		return -1;
246 	}
247 
248 	if(name)
249 		/*
250 		 * This has to be namec(..., Aopen, ...) because
251 		 * if name is something like /srv/cs or /fd/0,
252 		 * opening it is the only way to get at the real
253 		 * Chan underneath.
254 		 */
255 		cmounted = namec(name, Aopen, OREAD, 0);
256 	cunmount(cmount, cmounted);
257 	poperror();
258 	cclose(cmount);
259 	if(cmounted)
260 		cclose(cmounted);
261 	return 0;
262 }
263 
264 long
chdir(char * dir)265 chdir(char *dir)
266 {
267 	Chan *c;
268 
269 	if (waserror())
270 		return -1;
271 	c = namec(dir, Atodir, 0, 0);
272 	if (up->dot)
273 		cclose(up->dot);
274 	up->dot = c;
275 	poperror();
276 	return 0;
277 }
278 
279 Chan *
namecopen(char * name,int mode)280 namecopen(char *name, int mode)
281 {
282 	Chan *c;
283 
284 	if (waserror())
285 		return nil;
286 	c = namec(name, Aopen, mode, 0);
287 	poperror();
288 	return c;
289 }
290 
291 Chan *
enamecopen(char * name,int mode)292 enamecopen(char *name, int mode)
293 {
294 	Chan *c;
295 
296 	c = namecopen(name, mode);
297 	if (c == nil)
298 		panic("can't open %s", name);
299 	return c;
300 }
301 
302 Chan *
nameccreate(char * name,int mode)303 nameccreate(char *name, int mode)
304 {
305 	Chan *c;
306 
307 	if (waserror())
308 		return nil;
309 	c = namec(name, Acreate, mode, 0);
310 	poperror();
311 	return c;
312 }
313 
314 Chan *
enameccreate(char * name,int mode)315 enameccreate(char *name, int mode)
316 {
317 	Chan *c;
318 
319 	c = nameccreate(name, mode);
320 	if (c == nil)
321 		panic("can't create %s", name);
322 	return c;
323 }
324 
325 int
myreadn(Chan * c,void * vp,long n)326 myreadn(Chan *c, void *vp, long n)
327 {
328 	char *p = vp;
329 	long nn;
330 
331 	while(n > 0) {
332 		nn = devtab[c->type]->read(c, p, n, c->offset);
333 		if(nn == 0)
334 			break;
335 		c->offset += nn;
336 		p += nn;
337 		n -= nn;
338 	}
339 	return p - (char *)vp;
340 }
341 
342 int
readfile(char * file,void * buf,int len)343 readfile(char *file, void *buf, int len)
344 {
345 	int n;
346 	Chan *cc;
347 
348 	cc = nil;
349 	if (waserror()) {
350 		if (cc)
351 			cclose(cc);
352 		return -1;
353 	}
354 	cc = namecopen(file, OREAD);
355 	if (cc == nil)
356 		error("no such file");
357 	n = myreadn(cc, buf, len);
358 	poperror();
359 	cclose(cc);
360 	return n;
361 }
362 
363 static int
dumpfile(char * file)364 dumpfile(char *file)
365 {
366 	int n;
367 	char *buf;
368 
369 	buf = smalloc(Maxfile + 1);
370 	n = readfile(file, buf, Maxfile);
371 	if (n < 0)
372 		return -1;
373 	buf[n] = 0;
374 	print("%s (%d bytes):\n", file, n);
375 	print("%s\n", buf);
376 	free(buf);
377 	return 0;
378 }
379 
380 /* main.c */
381 
382 void
fpx87restore(FPsave *)383 fpx87restore(FPsave*)
384 {
385 }
386 
387 void
fpx87save(FPsave *)388 fpx87save(FPsave*)
389 {
390 }
391 
392 void
fpssesave(FPsave *)393 fpssesave(FPsave *)
394 {
395 }
396 
397 void
fpsserestore(FPsave *)398 fpsserestore(FPsave *)
399 {
400 }
401 
402 ulong
l2be(long l)403 l2be(long l)
404 {
405 	uchar *cp;
406 
407 	cp = (uchar*)&l;
408 	return (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | cp[3];
409 }
410