This source file includes following definitions.
- Xdiskinfo
- Xregs
- Xboot
- Xmemory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include <sys/param.h>
32 #include <sys/reboot.h>
33 #include <machine/biosvar.h>
34 #include <sys/disklabel.h>
35 #include "disk.h"
36 #include "debug.h"
37 #include "biosdev.h"
38 #include "libsa.h"
39 #include <cmd.h>
40
41
42 extern const char version[];
43
44 int Xboot(void);
45 int Xdiskinfo(void);
46 int Xmemory(void);
47 int Xregs(void);
48
49
50 int bootbuf(void *, int);
51
52 const struct cmd_table cmd_machine[] = {
53 { "boot", CMDT_CMD, Xboot },
54 { "diskinfo", CMDT_CMD, Xdiskinfo },
55 { "memory", CMDT_CMD, Xmemory },
56 #ifdef DEBUG
57 { "regs", CMDT_CMD, Xregs },
58 #endif
59 { NULL, 0 }
60 };
61
62 int
63 Xdiskinfo(void)
64 {
65 #ifndef _TEST
66 dump_diskinfo();
67 #endif
68 return 0;
69 }
70
71 #ifdef DEBUG
72 int
73 Xregs(void)
74 {
75 DUMP_REGS;
76 return 0;
77 }
78 #endif
79
80 int
81 Xboot(void)
82 {
83 #ifndef _TEST
84 int dev, part, st;
85 bios_diskinfo_t *bd = NULL;
86 char buf[DEV_BSIZE], *dest = (void *)BOOTBIOS_ADDR;
87
88 if (cmd.argc != 2) {
89 printf("machine boot {fd,hd}<0123>[abcd]\n");
90 printf("Where [0123] is the disk number,"
91 " and [abcd] is the partition.\n");
92 return 0;
93 }
94
95
96 if (cmd.argv[1][0] != 'f' && cmd.argv[1][0] != 'h')
97 goto bad;
98 if (cmd.argv[1][1] != 'd')
99 goto bad;
100 if (cmd.argv[1][2] < '0' || cmd.argv[1][2] > '3')
101 goto bad;
102 if ((cmd.argv[1][3] < 'a' || cmd.argv[1][3] > 'd') &&
103 cmd.argv[1][3] != '\0')
104 goto bad;
105
106 printf("Booting from %s ", cmd.argv[1]);
107
108 dev = (cmd.argv[1][0] == 'h')?0x80:0;
109 dev += (cmd.argv[1][2] - '0');
110 part = (cmd.argv[1][3] - 'a');
111
112 if (part > 0)
113 printf("[%x,%d]\n", dev, part);
114 else
115 printf("[%x]\n", dev);
116
117
118 bd = bios_dklookup(dev);
119 st = biosd_io(F_READ, bd, 0, 1, buf);
120 if (st)
121 goto bad;
122
123
124 if ((dev & 0x80) && (part > 0)){
125 int i, j;
126
127 for (i = 0, j = DOSPARTOFF; i < 4; i++, j += 16)
128 if (part == i)
129 buf[j] |= 0x80;
130 else
131 buf[j] &= ~0x80;
132 }
133
134
135 bcopy(buf, dest, DEV_BSIZE);
136 bootbuf(dest, dev);
137
138 bad:
139 printf("Invalid device!\n");
140 #endif
141 return 0;
142 }
143
144 int
145 Xmemory(void)
146 {
147 if (cmd.argc >= 2) {
148 int i;
149
150
151 for (i = 1; i < cmd.argc; i++) {
152 char *p;
153 long long addr, size;
154
155 p = cmd.argv[i];
156
157 size = strtoll(p + 1, &p, 0);
158 if (*p && *p == '@')
159 addr = strtoll(p + 1, NULL, 0);
160 else
161 addr = 0;
162 if (addr == 0 && (*p != '@' || size == 0)) {
163 printf("bad language\n");
164 return 0;
165 } else {
166 switch (cmd.argv[i][0]) {
167 case '-':
168 mem_delete(addr, addr + size);
169 break;
170 case '+':
171 mem_add(addr, addr + size);
172 break;
173 default :
174 printf("bad OP\n");
175 return 0;
176 }
177 }
178 }
179 }
180
181 dump_biosmem(NULL);
182
183 return 0;
184 }