|
|
1.1 root 1: #include "u.h"
2: #include "lib.h"
3: #include "mem.h"
4: #include "dat.h"
5: #include "fns.h"
6:
7: /*
8: * read in a segment
9: */
10: static long
11: readseg(int dev, long (*read)(int, void*, int), long len, long addr)
12: {
13: char *a;
14: long n, sofar;
15:
16: a = (char *)addr;
17: for(sofar = 0; sofar < len; sofar += n){
18: n = 8*1024;
19: if(len - sofar < n)
20: n = len - sofar;
21: n = (*read)(dev, a + sofar, n);
22: if(n <= 0)
23: break;
24: print(".");
25: }
26: return sofar;
27: }
28:
29: /*
30: * boot
31: */
32: int
33: plan9boot(int dev, long (*seek)(int, long), long (*read)(int, void*, int))
34: {
35: long n;
36: long addr;
37: void (*b)(void);
38: Exec *ep;
39:
40: if((*seek)(dev, 0) < 0)
41: return -1;
42:
43: /*
44: * read header
45: */
46: ep = (Exec *) ialloc(sizeof(Exec), 0);
47: n = sizeof(Exec);
48: if(readseg(dev, read, n, (ulong) ep) != n){
49: print("premature EOF\n");
50: return -1;
51: }
52: if(GLLONG(ep->magic) != I_MAGIC){
53: print("bad magic 0x%lux not a plan 9 executable!\n", GLLONG(ep->magic));
54: return -1;
55: }
56:
57: /*
58: * read text
59: */
60: addr = PADDR(GLLONG(ep->entry));
61: n = GLLONG(ep->text);
62: print("%d", n);
63: if(readseg(dev, read, n, addr) != n){
64: print("premature EOF\n");
65: return -1;
66: }
67:
68: /*
69: * read data (starts at first page after kernel)
70: */
71: addr = PGROUND(addr+n);
72: n = GLLONG(ep->data);
73: print("+%d", n);
74: if(readseg(dev, read, n, addr) != n){
75: print("premature EOF\n");
76: return -1;
77: }
78:
79: /*
80: * bss and entry point
81: */
82: print("+%d\nstart at 0x%lux\n", GLLONG(ep->bss), GLLONG(ep->entry));
83:
84: /*
85: * Go to new code. It's up to the program to get its PC relocated to
86: * the right place.
87: */
88: b = (void (*)(void))(PADDR(GLLONG(ep->entry)));
89: (*b)();
90: return 0;
91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.