diff --git a/boot/boot.c b/boot/boot.c index 5cc4085..5489b6a 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -10,6 +10,7 @@ void (*probe1[])(void) = { cpuidprobe, }; void (*probe2[])(void) = { + diskprobe, }; BootProbe probes[] = { @@ -102,11 +103,9 @@ boot(int bootdev) fmtinstall('D', fmtdisk); print("\n===> Hello world <===\n\t" "Booted on disk 0x%x debug:%d\n\t", bootdev, debug); - machdep(); + machdep(); bdiskget(bootdev, &d); - print("%D\n%D", d,d); - for(;;){ char buf[8192]; diff --git a/boot/dat.h b/boot/dat.h index 6344877..371229d 100644 --- a/boot/dat.h +++ b/boot/dat.h @@ -7,6 +7,9 @@ #define BOOT_DEBUG 1 #endif +#define DOSPARTOFF 446 +#define NDOSPART 4 + enum{ CON_PC, CON_SRI, @@ -57,6 +60,25 @@ typedef struct{ }Op; // disk.c +typedef struct{ + u8 flag; /* bootstrap flags */ + u8 bhd; /* begin head */ + u8 bsec; /* begin sector */ + u8 bcyl; /* begin cylinder */ + u8 type; /* partition type (see below) */ + u8 ehd; /* end head */ + u8 esec; /* end sec2r */ + u8 ecyl; /* end cylinder */ + u32 beg; /* absolute starting sectoff number */ + u32 size; /* partition size in sec2rs */ +} __attribute__((packed)) DOSpart; + +typedef struct{ + u8 boot[DOSPARTOFF]; + DOSpart parts[NDOSPART]; + u16 sign; +} __attribute__((packed)) DOSmbr; + typedef struct{ int n; u32 ncyl; @@ -68,6 +90,17 @@ typedef struct{ u32 flag; } __attribute__((packed)) BIOSdisk; +typedef struct{ + +}Disklabel; + +typedef struct{ + BIOSdisk bdsk; // bios disk info + Disklabel label; + + int bootdev, osdev; +}Disk; + // gdt.S extern volatile struct BIOSreg BIOSreg; diff --git a/boot/disk.c b/boot/disk.c index 183b8a9..62498c7 100644 --- a/boot/disk.c +++ b/boot/disk.c @@ -2,6 +2,14 @@ #include "dat.h" #include "fn.h" +#define BDA_DISK 0x0475 // of hard disk drives detected +#define MAX_DISK_ENTRY 1 // for now + +enum{ + Bread = 0x4200, + Bwrite = 0x4300, +}; + // interrupt 41h exension support bitmap enum{ Eeda = 0x01, // Extended disk access funcions 42-44,47,48 @@ -9,6 +17,18 @@ enum{ Eedd = 0x04, // Enhanced disk drive functions }; +typedef struct{ + u8 len; + u8 res1; + u8 nblk; + u8 res2; + u16 off; + u16 seg; + u64 daddr; // starting block +}EDDcb; + +Disk disks[MAX_DISK_ENTRY]; + static int ireset(int dev) { @@ -81,6 +101,67 @@ bdiskget(int dev, BIOSdisk *d) return 0; } +static int +diskrw(uint rw, int dev, u32 daddr, u32 blk, void *buf) +{ + int rv; + volatile EDDcb cb = {0,}; + + cb.len = sizeof(cb); + cb.nblk = blk; + cb.seg = ((u32)buf>>4 & 0xffff); + cb.off = (u32)buf & 0xf; + cb.daddr = daddr; + if(cb.seg==0 || cb.off==0) + return -1; + BIOSreg.ds = (u32)&cb >> 4; + __asm volatile ("int $0x33\n\t" + "setc %b0\n\t" + : "=a" (rv) + : "0" (rw), "d" (dev), "S" ((int)(&cb)&0xf) + : "%ecx", "cc"); + return rv&0xff? -1 : 0; +} + +static int +findos(BIOSdisk *bd) +{ + DOSmbr mbr = {0,}; + + if(diskrw(Bread, bd->n, 0, 1, &mbr)){ + print("Can't find os disk %d\n", bd->n); + return -1; + } + print("found os disk signature: 0x%x\n", mbr.sign); + return 0; +} + +static int +findlabel(BIOSdisk *b, Disklabel *dl) +{ + if(b->n & 0x80){ + findos(b); + return 0; // for now + } + print("Can't found disk label:%x \n", b->n); + return -1; +} + +void +diskprobe(void) +{ + int n = MIN((int)*(char*)BDA_DISK, MAX_DISK_ENTRY); + + for(int i = 0x80; i < 0x80+n; ++i){ + if(bdiskget(i, &disks[i].bdsk)) + return; + print("Disnk info: %D\n", disks[i].bdsk); + if(findlabel(&disks[i].bdsk, &disks[i].label)){ + + } + } +} + int fmtdisk(Op *op) { diff --git a/boot/fn.h b/boot/fn.h index 83f023f..03d4823 100644 --- a/boot/fn.h +++ b/boot/fn.h @@ -44,6 +44,7 @@ void free(void*); // disk.c int bdiskget(int dev, BIOSdisk *d); int fmtdisk(Op *op); +void diskprobe(void); // util void* memset(void *dst, int v, int l);