Merge commit 'syslinux-3.83-pre1'
authorH. Peter Anvin <hpa@zytor.com>
Mon, 27 Jul 2009 18:15:43 +0000 (11:15 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 27 Jul 2009 18:15:43 +0000 (11:15 -0700)
Conflicts:
com32/modules/chain.c

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
1  2 
com32/modules/chain.c

@@@ -591,189 -584,184 +591,188 @@@ static int hide_unhide(char *mbr, int p
  
  int main(int argc, char *argv[])
  {
 -  char *mbr, *p;
 -  void *boot_sector = NULL;
 -  struct part_entry *partinfo;
 -  struct syslinux_rm_regs regs;
 -  char *drivename, *partition;
 -  int hd, drive, whichpart;
 -  int i;
 -  size_t boot_size = SECTOR;
 -
 -  openconsole(&dev_null_r, &dev_stdcon_w);
 -
 -  drivename = "boot";
 -  partition = NULL;
 -
 -  /* Prepare the register set */
 -  memset(&regs, 0, sizeof regs);
 -
 -  for (i = 1; i < argc; i++) {
 -    if (!strncmp(argv[i], "file=", 5)) {
 -      opt.loadfile = argv[i]+5;
 -    } else if (!strncmp(argv[i], "seg=", 4)) {
 -      uint32_t segval = strtoul(argv[i]+4, NULL, 0);
 -      if (segval < 0x50 || segval > 0x9f000) {
 -      error("Invalid segment");
 -      goto bail;
 -      }
 -      opt.seg = segval;
 -    } else if (!strncmp(argv[i], "ntldr=", 6)) {
 -      opt.seg = 0x2000;               /* NTLDR wants this address */
 -      opt.loadfile = argv[i]+6;
 -    } else if (!strncmp(argv[i], "freedos=", 8)) {
 -      opt.seg = 0x60;         /* FREEDOS wants this address */
 -      opt.loadfile = argv[i]+8;
 -    } else if (!strncmp(argv[i], "msdos=", 6) ||
 -             !strncmp(argv[i], "pcdos=", 6)) {
 -      opt.seg = 0x70;         /* MS-DOS 2.0+ wants this address */
 -      opt.loadfile = argv[i]+6;
 -    } else if (!strcmp(argv[i], "swap")) {
 -      opt.swap = true;
 -    } else if (!strcmp(argv[i], "hide")) {
 -      opt.hide = true;
 -    } else if (!strcmp(argv[i], "keeppxe")) {
 -      opt.keeppxe = 3;
 -    } else if (((argv[i][0] == 'h' || argv[i][0] == 'f') && argv[i][1] == 'd')
 -             || !strncmp(argv[i], "mbr:", 4)
 -             || !strncmp(argv[i], "mbr=", 4)
 -             || !strcmp(argv[i], "boot") || !strncmp(argv[i], "boot,", 5)) {
 -      drivename = argv[i];
 -      p = strchr(drivename, ',');
 -      if (p) {
 -      *p = '\0';
 -      partition = p+1;
 -      } else if (argv[i+1] && argv[i+1][0] >= '0' && argv[i+1][0] <= '9') {
 -      partition = argv[++i];
 -      }
 +    char *mbr, *p;
 +    void *boot_sector = NULL;
 +    struct part_entry *partinfo;
 +    struct syslinux_rm_regs regs;
 +    char *drivename, *partition;
 +    int hd, drive, whichpart;
 +    int i;
 +    size_t boot_size = SECTOR;
 +
 +    openconsole(&dev_null_r, &dev_stdcon_w);
 +
 +    drivename = "boot";
 +    partition = NULL;
 +
 +    /* Prepare the register set */
 +    memset(&regs, 0, sizeof regs);
 +
 +    for (i = 1; i < argc; i++) {
 +      if (!strncmp(argv[i], "file=", 5)) {
 +          opt.loadfile = argv[i] + 5;
 +      } else if (!strncmp(argv[i], "seg=", 4)) {
 +          uint32_t segval = strtoul(argv[i] + 4, NULL, 0);
 +          if (segval < 0x50 || segval > 0x9f000) {
 +              error("Invalid segment");
 +              goto bail;
 +          }
 +          opt.seg = segval;
 +      } else if (!strncmp(argv[i], "ntldr=", 6)) {
 +          opt.seg = 0x2000;   /* NTLDR wants this address */
 +          opt.loadfile = argv[i] + 6;
 +      } else if (!strncmp(argv[i], "freedos=", 8)) {
 +          opt.seg = 0x60;     /* FREEDOS wants this address */
 +          opt.loadfile = argv[i] + 8;
 +      } else if (!strncmp(argv[i], "msdos=", 6) ||
 +                 !strncmp(argv[i], "pcdos=", 6)) {
 +          opt.seg = 0x70;     /* MS-DOS 2.0+ wants this address */
 +          opt.loadfile = argv[i] + 6;
 +      } else if (!strcmp(argv[i], "swap")) {
 +          opt.swap = true;
 +      } else if (!strcmp(argv[i], "hide")) {
 +          opt.hide = true;
 +      } else if (!strcmp(argv[i], "keeppxe")) {
 +          opt.keeppxe = 3;
 +      } else
 +          if (((argv[i][0] == 'h' || argv[i][0] == 'f') && argv[i][1] == 'd')
 +              || !strncmp(argv[i], "mbr:", 4)
 +              || !strncmp(argv[i], "mbr=", 4)
 +              || !strcmp(argv[i], "boot") || !strncmp(argv[i], "boot,", 5)) {
 +          drivename = argv[i];
 +          p = strchr(drivename, ',');
 +          if (p) {
 +              *p = '\0';
 +              partition = p + 1;
 +          } else if (argv[i + 1] && argv[i + 1][0] >= '0'
 +                     && argv[i + 1][0] <= '9') {
 +              partition = argv[++i];
 +          }
 +      } else {
 +          error
 +              ("Usage: chain.c32 (hd#|fd#|mbr:#|boot)[,partition] [options]\n");
 +          goto bail;
 +      }
 +    }
 +
 +    if (opt.seg) {
 +      regs.es = regs.cs = regs.ss = regs.ds = regs.fs = regs.gs = opt.seg;
 +    } else {
 +      regs.ip = regs.esp.l = 0x7c00;
 +    }
 +
 +    hd = 0;
 +    if (!strncmp(drivename, "mbr", 3)) {
 +      drive = find_disk(strtoul(drivename + 4, NULL, 0));
 +      if (drive == -1) {
 +          error("Unable to find requested MBR signature\n");
 +          goto bail;
 +      }
 +    } else if ((drivename[0] == 'h' || drivename[0] == 'f') &&
 +             drivename[1] == 'd') {
 +      hd = drivename[0] == 'h';
 +      drivename += 2;
 +      drive = (hd ? 0x80 : 0) | strtoul(drivename, NULL, 0);
 +    } else if (!strcmp(drivename, "boot")) {
 +      const union syslinux_derivative_info *sdi;
 +      sdi = syslinux_derivative_info();
-       if (sdi->c.filesystem == SYSLINUX_FS_PXELINUX ||
-           sdi->c.filesystem == SYSLINUX_FS_ISOLINUX)
++      if (sdi->c.filesystem == SYSLINUX_FS_PXELINUX)
 +          drive = 0x80;       /* Boot drive not available */
 +      else
 +          drive = sdi->disk.drive_number;
      } else {
 -      error("Usage: chain.c32 (hd#|fd#|mbr:#|boot)[,partition] [options]\n");
 -      goto bail;
 +      error("Unparsable drive specification\n");
 +      goto bail;
      }
 -  }
 -
 -  if (opt.seg) {
 -    regs.es = regs.cs = regs.ss = regs.ds = regs.fs = regs.gs = opt.seg;
 -  } else {
 -    regs.ip = regs.esp.l = 0x7c00;
 -  }
 -
 -  hd = 0;
 -  if ( !strncmp(drivename, "mbr", 3) ) {
 -    drive = find_disk(strtoul(drivename+4, NULL, 0));
 -    if (drive == -1) {
 -      error("Unable to find requested MBR signature\n");
 -      goto bail;
 +
 +    /* DOS kernels want the drive number in BL instead of DL.  Indulge them. */
 +    regs.ebx.b[0] = regs.edx.b[0] = drive;
 +
 +    whichpart = 0;            /* Default */
 +
 +    if (partition)
 +      whichpart = strtoul(partition, NULL, 0);
 +
 +    if (!(drive & 0x80) && whichpart) {
 +      error("Warning: Partitions of floppy devices may not work\n");
      }
 -  } else if ((drivename[0] == 'h' || drivename[0] == 'f') &&
 -            drivename[1] == 'd') {
 -    hd = drivename[0] == 'h';
 -    drivename += 2;
 -    drive = (hd ? 0x80 : 0) | strtoul(drivename, NULL, 0);
 -  } else if (!strcmp(drivename, "boot")) {
 -    const union syslinux_derivative_info *sdi;
 -    sdi = syslinux_derivative_info();
 -    if (sdi->c.filesystem == SYSLINUX_FS_PXELINUX)
 -      drive = 0x80;           /* Boot drive not available */
 -    else
 -      drive = sdi->disk.drive_number;
 -  } else {
 -    error("Unparsable drive specification\n");
 -    goto bail;
 -  }
 -
 -  /* DOS kernels want the drive number in BL instead of DL.  Indulge them. */
 -  regs.ebx.b[0] = regs.edx.b[0] = drive;
 -
 -  whichpart = 0;              /* Default */
 -
 -  if ( partition )
 -    whichpart = strtoul(partition, NULL, 0);
 -
 -  if ( !(drive & 0x80) && whichpart ) {
 -    error("Warning: Partitions of floppy devices may not work\n");
 -  }
 -
 -  /* Get the disk geometry and disk access setup */
 -  if ( get_disk_params(drive) ) {
 -    error("Cannot get disk parameters\n");
 -    goto bail;
 -  }
 -
 -  /* Get MBR */
 -  if ( !(mbr = read_sector(0)) ) {
 -    error("Cannot read Master Boot Record\n");
 -    goto bail;
 -  }
 -
 -  if (opt.hide) {
 -    if (whichpart < 1 || whichpart > 4)
 -      error("WARNING: hide specified without a non-primary partition\n");
 -    if (hide_unhide(mbr, whichpart))
 -      error("WARNING: failed to write MBR for 'hide'\n");
 -  }
 -
 -  if ( whichpart == 0 ) {
 -    /* Boot the MBR */
 -
 -    partinfo = NULL;
 -    boot_sector = mbr;
 -  } else if ( whichpart <= 4 ) {
 -    /* Boot a primary partition */
 -
 -    partinfo = &((struct part_entry *)(mbr + 0x1be))[whichpart-1];
 -    if ( partinfo->ostype == 0 ) {
 -      error("Invalid primary partition\n");
 -      goto bail;
 +
 +    /* Get the disk geometry and disk access setup */
 +    if (get_disk_params(drive)) {
 +      error("Cannot get disk parameters\n");
 +      goto bail;
      }
 -  } else {
 -    /* Boot a logical partition */
  
 -    nextpart = 5;
 -    partinfo = find_logical_partition(whichpart, mbr, NULL, NULL);
 +    /* Get MBR */
 +    if (!(mbr = read_sector(0))) {
 +      error("Cannot read Master Boot Record\n");
 +      goto bail;
 +    }
  
 -    if ( !partinfo || partinfo->ostype == 0 ) {
 -      error("Requested logical partition not found\n");
 -      goto bail;
 +    if (opt.hide) {
 +      if (whichpart < 1 || whichpart > 4)
 +          error("WARNING: hide specified without a non-primary partition\n");
 +      if (hide_unhide(mbr, whichpart))
 +          error("WARNING: failed to write MBR for 'hide'\n");
      }
 -  }
 -
 -  /* Do the actual chainloading */
 -  if (opt.loadfile) {
 -    fputs("Loading the boot file...\n", stdout);
 -    if ( loadfile(opt.loadfile, &boot_sector, &boot_size) ) {
 -      error("Failed to load the boot file\n");
 -      goto bail;
 +
 +    if (whichpart == 0) {
 +      /* Boot the MBR */
 +
 +      partinfo = NULL;
 +      boot_sector = mbr;
 +    } else if (whichpart <= 4) {
 +      /* Boot a primary partition */
 +
 +      partinfo = &((struct part_entry *)(mbr + 0x1be))[whichpart - 1];
 +      if (partinfo->ostype == 0) {
 +          error("Invalid primary partition\n");
 +          goto bail;
 +      }
 +    } else {
 +      /* Boot a logical partition */
 +
 +      nextpart = 5;
 +      partinfo = find_logical_partition(whichpart, mbr, NULL, NULL);
 +
 +      if (!partinfo || partinfo->ostype == 0) {
 +          error("Requested logical partition not found\n");
 +          goto bail;
 +      }
      }
 -  } else if (partinfo) {
 -    /* Actually read the boot sector */
 -    /* Pick the first buffer that isn't already in use */
 -    if ( !(boot_sector = read_sector(partinfo->start_lba)) ) {
 -      error("Cannot read boot sector\n");
 -      goto bail;
 +
 +    /* Do the actual chainloading */
 +    if (opt.loadfile) {
 +      fputs("Loading the boot file...\n", stdout);
 +      if (loadfile(opt.loadfile, &boot_sector, &boot_size)) {
 +          error("Failed to load the boot file\n");
 +          goto bail;
 +      }
 +    } else if (partinfo) {
 +      /* Actually read the boot sector */
 +      /* Pick the first buffer that isn't already in use */
 +      if (!(boot_sector = read_sector(partinfo->start_lba))) {
 +          error("Cannot read boot sector\n");
 +          goto bail;
 +      }
      }
 -  }
  
 -  if (!opt.loadfile) {
 -    if (*(uint16_t *)((char *)boot_sector+boot_size-2) != 0xaa55) {
 -      error("Boot sector signature not found (unbootable disk/partition?)\n");
 -      goto bail;
 +    if (!opt.loadfile) {
 +      if (*(uint16_t *) ((char *)boot_sector + boot_size - 2) != 0xaa55) {
 +          error
 +              ("Boot sector signature not found (unbootable disk/partition?)\n");
 +          goto bail;
 +      }
      }
 -  }
  
 -  if (partinfo) {
 -    /* 0x7BE is the canonical place for the first partition entry. */
 -    regs.esi.w[0] = 0x7be;
 -    memcpy((char *)0x7be, partinfo, sizeof(*partinfo));
 -  }
 +    if (partinfo) {
 +      /* 0x7BE is the canonical place for the first partition entry. */
 +      regs.esi.w[0] = 0x7be;
 +      memcpy((char *)0x7be, partinfo, sizeof(*partinfo));
 +    }
  
 -  do_boot(boot_sector, boot_size, &regs);
 +    do_boot(boot_sector, boot_size, &regs);
  
  bail:
 -  return 255;
 +    return 255;
  }