/* * Checksum one more block on all harddrives * * Use the adler32() function from libz, * as it is quick, small, and available. */ int disksum(int blk) { struct diskinfo *dip, *dip2; int st, reprobe = 0; char *buf; buf = alloca(DEV_BSIZE); for(dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)){ bios_diskinfo_t *bdi = &dip->bios_info; /* Skip this disk if it is not a HD or has had an I/O error */ if (!(bdi->bios_number & 0x80) || bdi->flags & BDI_INVALID) continue; /* Adler32 checksum */ st = biosd_io(F_READ, bdi, blk, 1, buf); if (st) { bdi->flags |= BDI_INVALID; continue; } bdi->checksum = adler32(bdi->checksum, buf, DEV_BSIZE); for(dip2 = TAILQ_FIRST(&disklist); dip2 != dip; dip2 = TAILQ_NEXT(dip2, list)){ bios_diskinfo_t *bd = &dip2->bios_info; if ((bd->bios_number & 0x80) && !(bd->flags & BDI_INVALID) && bdi->checksum == bd->checksum) reprobe = 1; } } return (reprobe); }
static int Xboot() { int dev, part, st; char buf[DEV_BSIZE], *dest = (void*)0x7c00; if(cmd.argc != 2) { printf("machine boot {fd,hd}<0123>[abcd]\n"); printf("Where [0123] is the disk number," " and [abcd] is the partition.\n"); return 0; } /* Check arg */ if(cmd.argv[1][0] != 'f' && cmd.argv[1][0] != 'h') goto bad; if(cmd.argv[1][1] != 'd') goto bad; if(cmd.argv[1][2] < '0' || cmd.argv[1][2] > '3') goto bad; if((cmd.argv[1][3] < 'a' || cmd.argv[1][3] > 'd') && cmd.argv[1][3] != '\0') goto bad; printf("Booting from %s ", cmd.argv[1]); dev = (cmd.argv[1][0] == 'h')?0x80:0; dev += (cmd.argv[1][2] - '0'); part = (cmd.argv[1][3] - 'a'); if (part > 0) printf("[%x,%d]\n", dev, part); else printf("[%x]\n", dev); /* Read boot sector from device */ st = biosd_io(F_READ, dev, 0, 0, 0, 1, buf); if(st) goto bad; /* Frob boot flag in buffer from HD */ if((dev & 0x80) && (part > 0)){ int i, j; for(i = 0, j = DOSPARTOFF; i < 4; i++, j += 16) if(part == i) buf[j] |= 0x80; else buf[j] &= ~0x80; } /* Load %dl, ljmp */ bcopy(buf, dest, DEV_BSIZE); bootbuf(dest, dev); bad: printf("Invalid device!\n"); return 0; }