/************************************************************************** MAIN - Kick off routine **************************************************************************/ main() { int c; extern char edata[], end[]; bzero(edata,end-edata); /* Zero BSS */ #ifdef ASK_BOOT while (1) { printf("\nBoot from Network (Y/N) ? "); c = getchar(); if ((c >= 'a') && (c <= 'z')) c &= 0x5F; if (c == '\r') break; putchar(c); if (c == 'N') exit(0); if (c == 'Y') break; printf(" - bad response\n"); } #endif /* get the bios's idea about the disks geometry */ #ifdef PC98 for(c = 0; c < 2; c ++) { if (*(unsigned char*)0xa155d & (1 << c)) { /* check DISK_EQUIP */ bootinfo.bi_bios_geom[c] = get_diskinfo(c + 0x80); } } #else /* IBM-PC */ for(c = 0; c < N_BIOS_GEOM; c ++) bootinfo.bi_bios_geom[c] = get_diskinfo(c + 0x80); #endif /* PC98 */ gateA20(); #ifdef PC98 /* set machine type to PC98_SYSTEM_PARAMETER */ machine_check(); #endif printf("\nBOOTP/TFTP/NFS bootstrap loader ESC for menu\n" "\nSearching for adapter..."); if (!eth_probe()) { printf("No adapter found.\n"); exit(0); } kernel = DEFAULT_BOOTFILE; while (1) { if (setjmp(jmp_bootmenu)) bootmenu(); else load(); } }
/* NORETURN */ void boot(int drive) { int ret; #ifdef PC98 int i; unsigned char disk_equips; #endif /* Pick up the story from the Bios on geometry of disks */ #ifdef PC98 for(ret = 0; ret < 2; ret ++) { if (*(unsigned char*)V(0xA155d) & (1 << ret)) { bootinfo.bi_bios_geom[ret] = get_diskinfo(ret + 0x80); } #else /* IBM-PC */ for(ret = 0; ret < N_BIOS_GEOM; ret ++) bootinfo.bi_bios_geom[ret] = get_diskinfo(ret + 0x80); #endif /* PC98 */ } bootinfo.bi_basemem = memsize(0); bootinfo.bi_extmem = memsize(1); bootinfo.bi_memsizes_valid = 1; gateA20(); #ifdef PC98 /* set machine type to PC98_SYSTEM_PARAMETER */ machine_check(); #endif /* PC98 */ /* * The default boot device is the first partition in the * compatibility slice on the boot drive. */ dosdev = drive; #ifdef PC98 maj = (drive&0x70) >> 3; /* a good first bet */ if (maj == 4) { /* sd */ disk_equips = *(unsigned char *)V(0xA1482); unit = 0; for (i=0; i<(drive&0x0f); i++) { unit += (disk_equips >> i) & 1; } } else {
void refresh_perf_data_block(PERF_DATA_BLOCK *data, RuntimeSettings rt) { data->PerfTime100nSec = 0; get_meminfo(data); get_cpuinfo(data); get_processinfo(data); get_diskinfo(data); return; }
int main(int argc, char *argv[]) { char *kernel="/kernel", *ptr; int i, dos=0; long howto=0; extern unsigned long get_diskinfo(int); VCPIboot = 0; slice = 0; for (i = 1; i < argc; i++) { /* check arguments */ if (argv[i][0] != '-') { /* kernel name */ kernel = argv[i]; break; } ptr = &argv[i][1]; while (*ptr) { /* check options */ switch(*ptr) { case 'r': howto |= RB_DFLTROOT; break; case 's': howto |= RB_SINGLE; break; case 'a': howto |= RB_ASKNAME; break; case 'c': howto |= RB_CONFIG; break; case 'd': howto |= RB_KDB; break; case 'g': howto |= RB_GDB; break; case 'v': howto |= RB_VERBOSE; break; case 'C': howto |= RB_CDROM; break; case 'D': dos = 1; kernel = "c:\\kernel"; break; case '?': default: usage(argv[0]); } ptr++; } } bootinfo.bi_version = BOOTINFO_VERSION; for (i = 0; i < N_BIOS_GEOM; i++) bootinfo.bi_bios_geom[i] = get_diskinfo(0x80+i); bootinfo.bi_basemem = memsize(0); bootinfo.bi_extmem = memsize(1); bootinfo.bi_memsizes_valid = 0; /* that is not yet valid!! */ bootinfo.bi_kernelname = (char *) ptr2pa(kernel); bootinfo.bi_nfs_diskless = NULL; bootinfo.bi_size = sizeof(bootinfo); if (dos) dosboot(howto, kernel); /* boot given kernel from DOS partition */ else bsdboot(0x80, howto, kernel); /* boot from FreeBSD partition */ return 0; }
int disk_open(void) { int di; di = get_diskinfo(BDEV(dev,unit)); #ifdef DEBUG if(debug) { printf("disk_open()\n"); printf("diskinfo %x\n", di); printf("HS %d %d\n", HEADS(di) ,SPT(di)); } #endif spc = (spt = SPT(di)) * HEADS(di); use_badsect = FALSE; if (dev == DEV_FLOPPY) { boff = 0; part = (spt == 15 ? 3 : 1); return 0; } else { /* * Usually H=32 S=64 for SCSI * But sometimes we also have H=33 & S=62. * For IDE Apparently H<64 */ if (spt >= 64 || HEADS(di) > 32) /* scsi */ dev = DEV_SD; if (read_partitions()) return(1); #if DEBUG if(debug) printf("%d partitions, active is %d\n", npartitions, active_partition); #endif if (part > npartitions) return(1); boff = partitions[part].p_start; } return 0; }
int devopen(void) { struct dos_partition *dptr; struct disklabel *dl; char *p; int i, sector = 0, di, dosdev_copy; dosdev_copy = dosdev; di = get_diskinfo(dosdev_copy); spt = SPT(di); /* Hack for 2.88MB floppy drives. */ if (!(dosdev_copy & 0x80) && spt == 36) spt = 18; spc = spt * HEADS(di); #ifndef RAWBOOT { #ifdef EMBEDDED_DISKLABEL dl = &disklabel; #else EMBEDDED_DISKLABEL p = Bread(dosdev_copy, 0); dptr = (struct dos_partition *)(p+DOSPARTOFF); slice = WHOLE_DISK_SLICE; for (i = 0; i < NDOSPART; i++, dptr++) if (dptr->dp_typ == DOSPTYP_386BSD) { slice = BASE_SLICE + i; sector = dptr->dp_start; break; } p = Bread(dosdev_copy, sector + LABELSECTOR); dl=((struct disklabel *)p); disklabel = *dl; /* structure copy (maybe useful later)*/ #endif EMBEDDED_DISKLABEL if (dl->d_magic != DISKMAGIC) { printf("bad disklabel"); return 1; } if( (maj == 4) || (maj == 0) || (maj == 1)) { if (dl->d_type == DTYPE_SCSI) { maj = 4; /* use scsi as boot dev */ } else { maj = 0; /* must be ESDI/IDE */ } } /* This little trick is for OnTrack DiskManager disks */ boff = dl->d_partitions[part].p_offset - dl->d_partitions[2].p_offset + sector; /* This is a good idea for all disks */ bsize = dl->d_partitions[part].p_size; #ifdef DO_BAD144 do_bad144 = 0; if (dl->d_flags & D_BADSECT) { /* this disk uses bad144 */ int i; int dkbbnum; struct dkbad *dkbptr; /* find the first readable bad sector table */ /* some of this code is copied from ufs/ufs_disksubr.c */ /* including the bugs :-( */ /* read a bad sector table */ #define BAD144_PART 2 /* XXX scattered magic numbers */ #define BSD_PART 0 /* XXX should be 2 but bad144.c uses 0 */ if (dl->d_partitions[BSD_PART].p_offset != 0) dkbbnum = dl->d_partitions[BAD144_PART].p_offset + dl->d_partitions[BAD144_PART].p_size; else dkbbnum = dl->d_secperunit; dkbbnum -= dl->d_nsectors; if (dl->d_secsize > DEV_BSIZE) dkbbnum *= dl->d_secsize / DEV_BSIZE; else dkbbnum /= DEV_BSIZE / dl->d_secsize; i = 0; do_bad144 = 0; do { /* XXX: what if the "DOS sector" < 512 bytes ??? */ p = Bread(dosdev_copy, dkbbnum + i); dkbptr = (struct dkbad *) p; /* XXX why is this not in <sys/dkbad.h> ??? */ #define DKBAD_MAGIC 0x4321 if (dkbptr->bt_mbz == 0 && dkbptr->bt_flag == DKBAD_MAGIC) { dkb = *dkbptr; /* structure copy */ do_bad144 = 1; break; } i += 2; } while (i < 10 && (unsigned)i < dl->d_nsectors); if (!do_bad144) printf("Bad bad sector table\n"); else printf("Using bad sector table at %d\n", dkbbnum+i); } #endif /* DO_BAD144 */ } #endif /* RAWBOOT */ return 0; }
int read_partitions(void) { char *altptr; struct ipart *iptr, *active, *extended; int i, sector; int base =0; int ext_base = 0; struct evtoc *evp; int di; di = get_diskinfo(BDEV(dev,unit)); spc = (spt = SPT(di)) * HEADS(di); use_badsect = FALSE; npartitions = 0; active_partition = 0; active = (struct ipart *)0; extended = (struct ipart *)0; disk_read(0, BPS, (vm_offset_t)0); iptr = (struct ipart *)((struct mboot *)0)->parts; for (i = 0; i < FD_NUMPART; i++, iptr++) { #if DEBUG if (debug) show_part(iptr, i, 0); #endif if (iptr->bootid == ACTIVE) { active = iptr; active_partition = i; } if (iptr->systid == EXT_PART) extended = iptr; partitions[i].p_start = iptr->relsect; partitions[i].p_size = iptr->numsect; } if (active && active->systid == UNIXOS) { sector = active->relsect + HDPDLOC; evp = (struct evtoc *)0; if (disk_read(sector++, BPS, (vm_offset_t)0) == 0 && evp->sanity == VTOC_SANE) { /* compatibility */ bcopy((char *)evp->part, (char *)partitions, sizeof(partitions)); npartitions = evp->nparts; altptr = (char *)(&alt_info); for (i = 0; i++ < 4; altptr += BPS, sector++) { if (disk_read(sector, BPS, (vm_offset_t)altptr)) return 1; } if (alt_info.alt_sanity != ALT_SANITY) { printf("Bad alt_sanity\n"); return 1; } active_partition = 0; use_badsect = TRUE; return 0; } } if (extended) { /* look for extended partitions */ base = extended->relsect; ext_base = base; while (1) { if (disk_read(base, BPS, (vm_offset_t)0)) return 1; iptr = (struct ipart *)((struct mboot *)0)->parts; #if DEBUG if (debug) show_part(iptr, i, base); #endif partitions[i].p_start = base + iptr->relsect; partitions[i].p_size = iptr->numsect; i++; iptr++; #if DEBUG if (debug) show_part(iptr, i, base); #endif if (iptr->systid == EXT_PART) { extended = iptr; base = extended->relsect + ext_base; } else break; } } npartitions = i; return 0; }
int devopen(void) { struct dos_partition *dptr; struct disklabel *dl; int dosdev = (int) inode.i_dev; int i; long di, sector; di = get_diskinfo(dosdev); spc = (spt = (int)SPT(di)) * (int)HEADS(di); if (dosdev == 2) { boff = 0; part = (spt == 15 ? 3 : 1); } else { #ifdef EMBEDDED_DISKLABEL dl = &disklabel; #else EMBEDDED_DISKLABEL Bread(dosdev, 0); dptr = (struct dos_partition *)(((char *)I_ADDR)+DOSPARTOFF); sector = LABELSECTOR; slice = WHOLE_DISK_SLICE; for (i = 0; i < NDOSPART; i++, dptr++) if (dptr->dp_typ == DOSPTYP_386BSD) { slice = BASE_SLICE + i; sector = dptr->dp_start + LABELSECTOR; break; } Bread(dosdev, sector++); dl=((struct disklabel *)I_ADDR); disklabel = *dl; /* structure copy (maybe useful later)*/ #endif EMBEDDED_DISKLABEL if (dl->d_magic != DISKMAGIC) { printf("bad disklabel"); return 1; } if( (maj == 4) || (maj == 0) || (maj == 1)) { if (dl->d_type == DTYPE_SCSI) maj = 4; /* use scsi as boot dev */ else maj = 0; /* must be ESDI/IDE */ } boff = dl->d_partitions[part].p_offset; #ifdef DO_BAD144 bsize = dl->d_partitions[part].p_size; do_bad144 = 0; if (dl->d_flags & D_BADSECT) { /* this disk uses bad144 */ int i; long dkbbnum; struct dkbad *dkbptr; /* find the first readable bad sector table */ /* some of this code is copied from ufs/ufs_disksubr.c */ /* including the bugs :-( */ /* read a bad sector table */ #define BAD144_PART 2 /* XXX scattered magic numbers */ #define BSD_PART 0 /* XXX should be 2 but bad144.c uses 0 */ if (dl->d_partitions[BSD_PART].p_offset != 0) dkbbnum = dl->d_partitions[BAD144_PART].p_offset + dl->d_partitions[BAD144_PART].p_size; else dkbbnum = dl->d_secperunit; dkbbnum -= dl->d_nsectors; if (dl->d_secsize > DEV_BSIZE) dkbbnum *= dl->d_secsize / DEV_BSIZE; else dkbbnum /= DEV_BSIZE / dl->d_secsize; i = 0; do_bad144 = 0; do { /* XXX: what if the "DOS sector" < 512 bytes ??? */ Bread(dosdev, dkbbnum + i); dkbptr = (struct dkbad *) I_ADDR; /* XXX why is this not in <sys/dkbad.h> ??? */ #define DKBAD_MAGIC 0x4321 if (dkbptr->bt_mbz == 0 && dkbptr->bt_flag == DKBAD_MAGIC) { dkb = *dkbptr; /* structure copy */ do_bad144 = 1; break; } i += 2; } while (i < 10 && (u_long) i < dl->d_nsectors); if (!do_bad144) printf("Bad badsect table\n"); else printf("Using bad144 bad sector at %ld\n", dkbbnum+i); } #endif } return 0; }
int devopen(void) { struct dos_partition *dptr; struct disklabel *dl; char *p; int i, sector = 0, di, dosdev_copy; dosdev_copy = dosdev; di = get_diskinfo(dosdev_copy); spt = SPT(di); /* Hack for 2.88MB floppy drives. */ if (!(dosdev_copy & 0x80) && spt == 36) spt = 18; spc = spt * HEADS(di); #ifndef RAWBOOT { #ifdef EMBEDDED_DISKLABEL dl = &disklabel; #else EMBEDDED_DISKLABEL p = Bread(dosdev_copy, 0); dptr = (struct dos_partition *)(p+DOSPARTOFF); slice = WHOLE_DISK_SLICE; for (i = 0; i < NDOSPART; i++, dptr++) if (dptr->dp_typ == DOSPTYP_386BSD) { slice = BASE_SLICE + i; sector = dptr->dp_start; break; } p = Bread(dosdev_copy, sector + LABELSECTOR); dl=((struct disklabel *)p); disklabel = *dl; /* structure copy (maybe useful later)*/ #endif EMBEDDED_DISKLABEL if (dl->d_magic != DISKMAGIC) { printf("bad disklabel\n"); return 1; } if( (maj == 4) || (maj == 0) || (maj == 1)) { if (dl->d_type == DTYPE_SCSI) { maj = 4; /* use scsi as boot dev */ } else { maj = 0; /* must be ESDI/IDE */ } } /* This little trick is for OnTrack DiskManager disks */ boff = dl->d_partitions[part].p_offset - dl->d_partitions[2].p_offset + sector; bsize = dl->d_partitions[part].p_size; if (bsize == 0) { printf("empty partition\n"); return 1; } } #endif /* RAWBOOT */ return 0; }