add disk read
not implementing disk write yet
This commit is contained in:
parent
14fac398c5
commit
06160c1ed3
@ -10,6 +10,7 @@ void (*probe1[])(void) = {
|
||||
cpuidprobe,
|
||||
};
|
||||
void (*probe2[])(void) = {
|
||||
diskprobe,
|
||||
};
|
||||
|
||||
BootProbe probes[] = {
|
||||
@ -105,8 +106,6 @@ boot(int bootdev)
|
||||
machdep();
|
||||
|
||||
bdiskget(bootdev, &d);
|
||||
print("%D\n%D", d,d);
|
||||
|
||||
for(;;){
|
||||
char buf[8192];
|
||||
|
||||
|
||||
33
boot/dat.h
33
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;
|
||||
|
||||
|
||||
81
boot/disk.c
81
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)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user