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