]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/pc/iso.c
audiohda: fix syntax error
[plan9front.git] / sys / src / boot / pc / iso.c
1 #include <u.h>
2 #include "fns.h"
3
4 enum {
5         Sectsz = 0x800,
6         Maxpath = 256,
7         Dirsz = 33,
8 };
9
10 typedef struct Extend Extend;
11 typedef struct Dir Dir;
12
13 struct Extend
14 {
15         int drive;
16         ulong lba;
17         ulong len;
18         uchar *rp;
19         uchar *ep;
20         uchar buf[Sectsz];
21 };
22
23 struct Dir
24 {
25         uchar dirlen;
26         uchar extlen;
27
28         uchar lba[8];
29         uchar len[8];
30
31         uchar date[7];
32
33         uchar flags[3];
34
35         uchar seq[4];
36
37         uchar namelen;
38 };
39
40 int readsect(ulong drive, ulong lba, void *buf);
41
42 #ifdef FAT
43 int
44 readsect4(ulong drive, ulong lba, void *buf)
45 {
46         int i;
47
48         lba *= Sectsz/512;
49         for(i = 0; i<Sectsz/512; i++){
50                 if(readsect(drive, lba++, buf))
51                         return -1;
52                 buf = (uchar*)buf + 512;
53         }
54         return 0;
55 }
56 #define readsect readsect4
57 #endif
58
59 void
60 unload(void)
61 {
62 }
63
64 int
65 read(void *f, void *data, int len)
66 {
67         Extend *ex = f;
68
69         if(ex->len > 0 && ex->rp >= ex->ep)
70                 if(readsect(ex->drive, ex->lba++, ex->rp = ex->buf))
71                         return -1;
72         if(ex->len < len)
73                 len = ex->len;
74         if(len > (ex->ep - ex->rp))
75                 len = ex->ep - ex->rp;
76         memmove(data, ex->rp, len);
77         ex->rp += len;
78         ex->len -= len;
79         return len;
80 }
81
82 void
83 close(void *f)
84 {
85         Extend *ex = f;
86
87         ex->drive = 0;
88         ex->lba = 0;
89         ex->len = 0;
90         ex->rp = ex->ep = ex->buf + Sectsz;
91 }
92
93 static int
94 isowalk(Extend *ex, int drive, char *path)
95 {
96         char name[Maxpath], c, *end;
97         int i;
98         Dir d;
99
100         close(ex);
101         ex->drive = drive;
102
103         /* find pvd */
104         for(i=0x10; i<0x1000; i++){
105                 if(readsect(drive, i, ex->buf))
106                         return -1;
107                 if(*ex->buf == 1)
108                         break;
109         }
110         ex->lba = *((ulong*)(ex->buf + 156 + 2));
111         ex->len = *((ulong*)(ex->buf + 156 + 10));
112
113         for(;;){
114                 if(readn(ex, &d, Dirsz) != Dirsz)
115                         break;
116                 if(d.dirlen == 0)
117                         break;
118                 if(readn(ex, name, d.namelen) != d.namelen)
119                         break;
120                 i = d.dirlen - (Dirsz + d.namelen);
121                 while(i-- > 0)
122                         read(ex, &c, 1);
123                 for(i=0; i<d.namelen; i++){
124                         c = name[i];
125                         if(c >= 'A' && c <= 'Z'){
126                                 c -= 'A';
127                                 c += 'a';
128                         }
129                         name[i] = c;
130                 }
131                 name[i] = 0;
132                 while(*path == '/')
133                         path++;
134                 if((end = strchr(path, '/')) == 0)
135                         end = path + strlen(path);
136                 i = end - path;
137                 if(d.namelen == i && memcmp(name, path, i) == 0){
138                         ex->rp = ex->ep;
139                         ex->lba = *((ulong*)d.lba);
140                         ex->len = *((ulong*)d.len);
141                         if(*end == 0)
142                                 return 0;
143                         else if(d.flags[0] & 2){
144                                 path = end;
145                                 continue;
146                         }
147                         break;
148                 }
149         }
150         close(ex);
151         return -1;
152 }
153
154 void
155 start(void *sp)
156 {
157         char path[Maxpath], *kern;
158         int drive;
159         Extend ex;
160         void *f;
161
162         /* drive passed in DL */
163         drive = ((ushort*)sp)[5] & 0xFF;
164
165 #ifndef FAT
166         /*
167          * load full bootblock as only the frist 2K get
168          * loaded from bios. the code is specially arranged
169          * to have all the important routines in the first
170          * 2K of the 9bootiso image. (strings have been
171          * placed in l.s to make sure they will be < 2K)
172          */
173         if(isowalk(&ex, drive, bootname)){
174                 print(bootname);
175                 putc('?');
176                 halt();
177         }
178         readn(&ex, origin, ex.len);
179         close(&ex);
180 #endif
181
182         if(isowalk(f = &ex, drive, "/cfg/plan9.ini")){
183                 print("no config\n");
184                 f = 0;
185         }
186         for(;;){
187                 kern = configure(f, path); f = 0;
188                 if(isowalk(&ex, drive, kern)){
189                         print("not found\n");
190                         continue;
191                 }
192                 print(bootkern(&ex));
193                 print("\n");
194         }
195 }
196