diff options
Diffstat (limited to 'sys/arch/i386/stand/libsa/diskprobe.c')
-rw-r--r-- | sys/arch/i386/stand/libsa/diskprobe.c | 133 |
1 files changed, 79 insertions, 54 deletions
diff --git a/sys/arch/i386/stand/libsa/diskprobe.c b/sys/arch/i386/stand/libsa/diskprobe.c index d59ad4a5ed7..66d7f6fd83d 100644 --- a/sys/arch/i386/stand/libsa/diskprobe.c +++ b/sys/arch/i386/stand/libsa/diskprobe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diskprobe.c,v 1.2 1997/10/18 00:33:15 weingart Exp $ */ +/* $OpenBSD: diskprobe.c,v 1.3 1997/10/22 23:34:38 mickey Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -34,91 +34,116 @@ #include <sys/param.h> #include <sys/reboot.h> +#include <sys/disklabel.h> +#include <stand/boot/bootarg.h> #include <machine/biosvar.h> #include "biosdev.h" #include "libsa.h" - -extern struct BIOS_vars BIOS_vars; - /* These get passed to kernel */ bios_diskinfo_t bios_diskinfo[16]; - -/* Find info on given BIOS disk */ -bios_diskinfo_t * -diskfind(dev) - int dev; +#if notyet +/* Checksum given buffer */ +static u_int32_t +bufsum(buf, len) + void *buf; + int len; { - int i; + u_int32_t sum = 0; + u_int8_t *p = buf; - for(i = 0; bios_diskinfo[i].bios_number != -1; i++) - if(bios_diskinfo[i].bios_number == dev) - return(&bios_diskinfo[i]); + while(len--){ + sum += p[len]; + } + return(sum); +} - return(NULL); +/* Checksum given drive until different */ +void +disksum(pos) + int pos; +{ + u_int32_t sum; + int len, i; } +#endif /* Probe for all BIOS disks */ void diskprobe() { - int drive, i = 0; + u_int drive, i = 0, rv; + struct disklabel label; + u_int unit, type; printf("Probing disks:"); /* Floppies */ - for(drive = 0; drive < 4; drive++){ - u_int32_t p = biosdinfo(drive); - - if(BIOSNSECTS(p) < 2) continue; - if(p){ - u_int32_t t = biosdprobe(drive); - if(t & 0x00FF) continue; - if(!(t & 0xFF00)) continue; + for(drive = 0; drive < 4; drive++) { + rv = bios_getinfo(drive, &bios_diskinfo[i]); - printf(" fd%d", drive); + if( (rv & 0x00FF)) continue; + if(!(rv & 0xFF00)) continue; - /* Fill out best we can */ - bios_diskinfo[i].bsd_dev = MAKEBOOTDEV(2, 0, 0, 0, 0); /* fd? */ - bios_diskinfo[i].bios_number = drive; - bios_diskinfo[i].bios_cylinders = BIOSNTRACKS(p); - bios_diskinfo[i].bios_heads = BIOSNHEADS(p); - bios_diskinfo[i].bios_sectors = BIOSNSECTS(p); + printf(" fd%u", drive); - i++; - } + /* Fill out best we can - (fd?) */ + bios_diskinfo[i].bsd_dev = MAKEBOOTDEV(2, 0, 0, drive, 0); +#if 0 + disksum(&bios_diskinfo[i]); +#endif + i++; } /* Hard disks */ - for(drive = 0x80; drive < 0x88; drive++){ - u_int32_t p = biosdinfo(drive); - - if(BIOSNSECTS(p) < 2) continue; - if(p){ - u_int32_t t = biosdprobe(drive); - if(t & 0x00FF) continue; - if(!(t & 0xFF00)) continue; - - printf(" hd%d", drive - 128); - - /* Fill out best we can */ - bios_diskinfo[i].bsd_dev = -1; /* XXX - fill in */ - bios_diskinfo[i].bios_number = drive; - bios_diskinfo[i].bios_cylinders = BIOSNTRACKS(p); - bios_diskinfo[i].bios_heads = BIOSNHEADS(p); - bios_diskinfo[i].bios_sectors = BIOSNSECTS(p); - - i++; + for(drive = 0x80; drive < 0x88; drive++) { + rv = bios_getinfo(drive, &bios_diskinfo[i]); + + if( (rv & 0x00FF)) continue; + if(!(rv & 0xFF00)) continue; + + unit = drive - 0x80; + printf(" hd%u%s", unit, (bios_diskinfo[i].bios_edd > 0?"+":"")); + + /* Try to find the label, to figure out device type */ + if((bios_getdisklabel(drive, &label)) ) { + printf("*"); + type = 0; /* XXX let it be IDE */ + } else { + /* Best guess */ + if (label.d_type == DTYPE_SCSI) + type = 4; + else + type = 0; } + + /* Fill out best we can */ + bios_diskinfo[i].bsd_dev = MAKEBOOTDEV(type, 0, 0, unit, 0); +#if 0 + disksum(&bios_diskinfo[i]); +#endif + i++; } /* End of list */ bios_diskinfo[i].bios_number = -1; - - /* XXX - This needs a better place! */ - BIOS_vars.boot_data = bios_diskinfo; + addbootarg(BOOTARG_DISKINFO, + (i + 1) * sizeof(bios_diskinfo[0]), bios_diskinfo); printf("\n"); } +/* Find info on given BIOS disk */ +bios_diskinfo_t * +bios_dklookup(dev) + register int dev; +{ + register int i; + + for(i = 0; bios_diskinfo[i].bios_number != -1; i++) + if(bios_diskinfo[i].bios_number == dev) + return(&bios_diskinfo[i]); + + return(NULL); +} |