|
|
1.1 root 1: /*
2: * FCode boot loader
3: */
4:
5: #include "config.h"
6: #include "kernel/kernel.h"
7: #include "libopenbios/bindings.h"
8: #include "libopenbios/fcode_load.h"
9: #include "libopenbios/sys_info.h"
10: #include "libc/diskio.h"
11: #define printf printk
12: #define debug printk
13:
14: static int fd;
15:
16: int
17: is_fcode(unsigned char *fcode)
18: {
19: return (fcode[0] == 0xf0 // start0
20: || fcode[0] == 0xf1 // start1
21: || fcode[0] == 0xf2 // start2
22: || fcode[0] == 0xf3 // start4
23: || fcode[0] == 0xfd); // version1
24: }
25:
26: int
27: fcode_load(ihandle_t dev)
28: {
29: int retval = -1;
30: uint8_t fcode_header[8];
31: unsigned long start, size;
32: unsigned int offset;
33:
34: /* Mark the saved-program-state as invalid */
35: feval("0 state-valid !");
36:
37: fd = open_ih(dev);
38: if (fd == -1) {
39: goto out;
40: }
41:
42: for (offset = 0; offset < 16 * 512; offset += 512) {
43: seek_io(fd, offset);
44: if (read_io(fd, &fcode_header, sizeof(fcode_header))
45: != sizeof(fcode_header)) {
46: debug("Can't read FCode header from ihandle " FMT_ucellx "\n", dev);
47: retval = LOADER_NOT_SUPPORT;
48: goto out;
49: }
50:
51: if (is_fcode(fcode_header))
52: goto found;
53: }
54:
55: debug("Not a bootable FCode image\n");
56: retval = LOADER_NOT_SUPPORT;
57: goto out;
58:
59: found:
60: size = (fcode_header[4] << 24) | (fcode_header[5] << 16) |
61: (fcode_header[6] << 8) | fcode_header[7];
62:
63: fword("load-base");
64: start = POP();
65:
66: printf("\nLoading FCode image...\n");
67:
68: seek_io(fd, offset);
69:
70: if ((size_t)read_io(fd, (void *)start, size) != size) {
71: printf("Can't read file (size 0x%lx)\n", size);
72: goto out;
73: }
74:
75: debug("Loaded %lu bytes\n", size);
76: debug("entry point is %#lx\n", start);
77:
78: // Initialise saved-program-state
79: PUSH(start);
80: feval("saved-program-state >sps.entry !");
81: PUSH(size);
82: feval("saved-program-state >sps.file-size !");
83: feval("fcode saved-program-state >sps.file-type !");
84:
85: feval("-1 state-valid !");
86:
87: out:
88: close_io(fd);
89: return retval;
90: }
91:
92: void
93: fcode_init_program(void)
94: {
95: /* If the payload is Fcode then we execute it immediately */
96: ucell address;
97: uint8_t fcode_header[8];
98:
99: fword("load-base");
100: address = POP();
101:
102: if (!is_fcode((unsigned char *)address)) {
103: debug("Not a valid Fcode memory image\n");
104: return;
105: }
106:
107: PUSH(address + sizeof(fcode_header));
108: PUSH(1);
109: fword("byte-load");
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.