10 typedef struct Extend Extend;
11 typedef struct Dir Dir;
12 typedef struct Pbs Pbs;
64 int readsect(ulong drive, ulong lba, void *buf);
67 read(void *f, void *data, int len)
71 if(ex->len > 0 && ex->rp >= ex->ep)
72 if(readsect(ex->drive, ex->lba++, ex->rp = ex->buf))
76 if(len > (ex->ep - ex->rp))
77 len = ex->ep - ex->rp;
78 memmove(data, ex->rp, len);
92 ex->rp = ex->ep = ex->buf + Sectsz;
99 Pbs *p = (Pbs*)fat->buf;
102 lba += *((ushort*)p->nreserv);
103 lba += *((ushort*)p->fatsize) * p->nfats;
108 dirlba(Extend *fat, Dir *d)
113 Pbs *p = (Pbs*)fat->buf;
116 dirs = *((ushort*)p->rootsize);
117 lba += (dirs * Dirsz + Sectsz-1) / Sectsz;
118 clust = *((ushort*)d->starthi)<<16 | *((ushort*)d->startlo);
119 lba += (clust - 2) * p->clustsize;
124 dirname(Dir *d, char buf[Maxpath])
128 if(d->attr == 0x0F || *d->name <= 0)
130 memmove(buf, d->name, 8);
132 while(x > buf && x[-1] == ' ')
134 if(d->name[8] != ' '){
136 memmove(x, d->name+8, 3);
139 while(x > buf && x[-1] == ' ')
144 if(c >= 'A' && c <= 'Z'){
154 fatwalk(Extend *ex, Extend *fat, char *path)
156 char name[Maxpath], *end;
157 Pbs *pbs = (Pbs*)fat->buf;
162 ex->drive = fat->drive;
163 ex->lba = rootlba(fat);
164 ex->len = *((ushort*)pbs->rootsize) * Dirsz;
166 if(readn(ex, &d, Dirsz) != Dirsz)
168 if((i = dirname(&d, name)) <= 0)
172 if((end = strchr(path, '/')) == 0)
173 end = path + strlen(path);
175 if(i == j && memcmp(name, path, j) == 0){
177 ex->lba = dirlba(fat, &d);
178 ex->len = *((ulong*)d.len);
181 else if(d.attr & 0x10){
182 ex->len = pbs->clustsize * Sectsz;
194 findfat(Extend *fat, int drive)
206 if(readsect(drive, 0, fat->buf))
208 if(fat->buf[0x1fe] != 0x55 || fat->buf[0x1ff] != 0xAA)
210 p = (void*)&fat->buf[0x1be];
212 if(p[i].status != 0x80)
216 fat->lba = *((ulong*)p[i].lba);
217 if(readsect(drive, fat->lba, fat->buf))
227 char path[Maxpath], *kern;
232 /* drive passed in DL */
233 drive = ((ushort*)sp)[5] & 0xFF;
235 if(findfat(&fat, drive)){
239 if(fatwalk(f = &ex, &fat, "plan9.ini")){
240 print("no config\r\n");
244 kern = configure(f, path); f = 0;
245 if(fatwalk(&ex, &fat, kern)){
246 print("not found\r\n");
249 print(bootkern(&ex));