]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2004-03-27 Yoshinori K. Okuji <okuji@enbug.org>
authorokuji <okuji@localhost>
Sat, 27 Mar 2004 17:02:54 +0000 (17:02 +0000)
committerokuji <okuji@localhost>
Sat, 27 Mar 2004 17:02:54 +0000 (17:02 +0000)
* stage2/char_io.c [!GRUB_UTIL] (memcpy): New function. It is
defined as an alias of grub_memmove. This is copied from GRUB 2.

* stage2/disk_io.c (print_completions): Simplified conditionals
to make it easier to edit the file with Emacs.
Added support for (cd).
(set_device): Likewise.

* stage2/common.c (init_bios_info): Check if BOOT_DRIVE is a
CDROM drive. If it is true, set CDROM_DRIVE to BOOT_DRIVE.
(cdrom_drive): New variable.

From Leonid Lisovskiy <lly@pisem.net>:
* stage2/start_eltorito.S: New file.

* stage2/stage2.c (run_menu): Use GRUB_INVALID_DRIVE instead of
0xFF.

* stage2/shared.h (STAGE2_ID_ISO9660_STAGE1_5): New macro.
[FSYS_ISO9660] (STAGE2_ID): Set to STAGE2_ID_ISO9660_STAGE1_5.
(struct geometry): Added a new member ``sector_size''.
(BIOSDISK_FLAG_CDROM): New macro.
(cdrom_drive): Declared.

* stage2/fsys_iso9660.c: New file.
* stage2/iso9660.h: Likewise.

* stage2/filesys.h (FSYS_ISO9660_NUM): New macro.
[FSYS_ISO9660] (iso9660_mount): Declared.
[FSYS_ISO9660] (iso9660_read): Likewise.
[FSYS_ISO9660] (iso9660_dir): Likewise.
(NUM_FSYS): Added FSYS_ISO9660_NUM.

* stage2/disk_io.c (fsys_table) [FSYS_ISO9660]: Added iso9660.
(current_drive): Use GRUB_INVALID_DRIVE.
(log2): New function.
(rawread): Use BUF_GEOM.SECTOR_SIZE instead of SECTOR_SIZE.
Change the type of BUFADDR from int to char *.
Use a virtual track to make sure that one track fits in the
buffer.
(sane_partition): Allow CURRENT_DRIVE to be CDROM_DRIVE, because
a bios drive for a CD-ROM is often assigned to greater than
0x88.
(set_device): Use GRUB_INVALID_DRIVE instead of 0xFF.
(setup_part): Likewise.

* stage2/cmdline.c (init_cmdline): Use GRUB_INVALID_DRIVE.

* stage2/builtins.c (install_func): Use GRUB_INVALID_DRIVE.
(setup_func): Added iso9660_stage1_5.

* stage2/bios.c (biosdisk): Don't fall back to the CHS mode
if the drive is a CDROM.
(get_cdinfo): New function.
(get_diskinfo): Call get_cdinfo if the drive is greater than or
equal to 0x88 or the drive supports LBA.
Set the sector size to SECTOR_SIZE if it is not a CD-ROM.

* stage2/asm.S (biosdisk_int13_extensions): Take a word
argument AX instead of a byte argument AH.
(get_diskinfo_int13_extensions): Removed.

* stage2/Makefile.am (noinst_HEADERS): Added iso9660.h.
(libgrub_a_SOURCES): Added fsys_iso9660.c.
(libgrub_a_CFLAGS): Added -DFSYS_ISO9660=1.
(pkgdata_DATA): Added iso9660_stage1_5 and stage2_eltorito.
(noinst_PROGRAMS): Added iso9660_stage1_5.exec and
start_eltorito.exec.
(noinst_DATA): Added start_eltorito.
(pre_stage2_exec_SOURCES): Added fsys_iso9660.c.
(START_ELTORITO_LINK): New variable.
(start_eltorito_exec_SOURCES): Likewise.
(start_eltorito_exec_CCASFLAGS): Likewise.
(start_eltorito_exec_LDFLAGS): Likewise.
(start_eltorito_exec-start.$(OBJEXT)): New dependency.
(stage2_eltorito): New target.
(iso9660_stage1_5_exec_SOURCES): New variable.
(iso9660_stage1_5_exec_CFLAGS): Likewise.
(iso9660_stage1_5_exec_CCASFLAGS): Likewise.
(iso9660_stage1_5_exec_LDFLAGS): Likewise.

* stage1/stage1.h (GRUB_INVALID_DRIVE): New macro.

* stage1/stage1.S (boot_drive): Use the macro GRUB_INVALID_DRIVE.
(real_start): Likewise.

* lib/device.c (get_drive_geometry): Set GEOM->SECTOR_SIZE to
SECTOR_SIZE by default.

* configure.ac (--disable-iso9660): New option.

28 files changed:
AUTHORS
ChangeLog
INSTALL
NEWS
THANKS
configure
configure.ac
docs/grub-md5-crypt.8
docs/grub-terminfo.8
grub/Makefile.in
lib/device.c
stage1/stage1.S
stage1/stage1.h
stage2/Makefile.am
stage2/Makefile.in
stage2/asm.S
stage2/bios.c
stage2/builtins.c
stage2/char_io.c
stage2/cmdline.c
stage2/common.c
stage2/disk_io.c
stage2/filesys.h
stage2/fsys_iso9660.c [new file with mode: 0644]
stage2/iso9660.h [new file with mode: 0644]
stage2/shared.h
stage2/stage2.c
stage2/start_eltorito.S [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 8f36d68e449c6a57457e0f1cf6006474bcd71736..ea8cb4a1b91dcdd4b9f9c97bf816080b7d0d734a 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -50,3 +50,5 @@ KB Sriram added a better detection of FAT filesystem and fixed a
 network device completion.
 
 Eric Kvaalen fixed a lot of problems in the GRUB manual.
+
+Leonid Lisovskiy added El Torito support.
index d3bf5b117db0db0815b4947780c611bdd7a3611f..cb0f8167d93167306396b9265363905f91adb853 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,98 @@
-2004-03-13  Yoshinori K. Okuji  <okuji@enbug.org>
+2004-03-27  Yoshinori K. Okuji  <okuji@enbug.org>
+
+       * stage2/char_io.c [!GRUB_UTIL] (memcpy): New function. It is
+       defined as an alias of grub_memmove. This is copied from GRUB 2.
+
+       * stage2/disk_io.c (print_completions): Simplified conditionals
+       to make it easier to edit the file with Emacs.
+       Added support for (cd).
+       (set_device): Likewise.
+
+       * stage2/common.c (init_bios_info): Check if BOOT_DRIVE is a
+       CDROM drive. If it is true, set CDROM_DRIVE to BOOT_DRIVE.
+       (cdrom_drive): New variable.
+
+       From Leonid Lisovskiy <lly@pisem.net>:
+       * stage2/start_eltorito.S: New file.
+
+       * stage2/stage2.c (run_menu): Use GRUB_INVALID_DRIVE instead of
+       0xFF.
+
+       * stage2/shared.h (STAGE2_ID_ISO9660_STAGE1_5): New macro.
+       [FSYS_ISO9660] (STAGE2_ID): Set to STAGE2_ID_ISO9660_STAGE1_5.
+       (struct geometry): Added a new member ``sector_size''.
+       (BIOSDISK_FLAG_CDROM): New macro.
+       (cdrom_drive): Declared.
+
+       * stage2/fsys_iso9660.c: New file.
+       * stage2/iso9660.h: Likewise.
+
+       * stage2/filesys.h (FSYS_ISO9660_NUM): New macro.
+       [FSYS_ISO9660] (iso9660_mount): Declared.
+       [FSYS_ISO9660] (iso9660_read): Likewise.
+       [FSYS_ISO9660] (iso9660_dir): Likewise.
+       (NUM_FSYS): Added FSYS_ISO9660_NUM.
+
+       * stage2/disk_io.c (fsys_table) [FSYS_ISO9660]: Added iso9660.
+       (current_drive): Use GRUB_INVALID_DRIVE.
+       (log2): New function.
+       (rawread): Use BUF_GEOM.SECTOR_SIZE instead of SECTOR_SIZE.
+       Change the type of BUFADDR from int to char *.
+       Use a virtual track to make sure that one track fits in the
+       buffer.
+       (sane_partition): Allow CURRENT_DRIVE to be CDROM_DRIVE, because
+       a bios drive for a CD-ROM is often assigned to greater than
+       0x88.
+       (set_device): Use GRUB_INVALID_DRIVE instead of 0xFF.
+       (setup_part): Likewise.
+
+       * stage2/cmdline.c (init_cmdline): Use GRUB_INVALID_DRIVE.
+
+       * stage2/builtins.c (install_func): Use GRUB_INVALID_DRIVE.
+       (setup_func): Added iso9660_stage1_5.
+
+       * stage2/bios.c (biosdisk): Don't fall back to the CHS mode
+       if the drive is a CDROM.
+       (get_cdinfo): New function.
+       (get_diskinfo): Call get_cdinfo if the drive is greater than or
+       equal to 0x88 or the drive supports LBA.
+       Set the sector size to SECTOR_SIZE if it is not a CD-ROM.
+
+       * stage2/asm.S (biosdisk_int13_extensions): Take a word
+       argument AX instead of a byte argument AH.
+       (get_diskinfo_int13_extensions): Removed.
+
+       * stage2/Makefile.am (noinst_HEADERS): Added iso9660.h.
+       (libgrub_a_SOURCES): Added fsys_iso9660.c.
+       (libgrub_a_CFLAGS): Added -DFSYS_ISO9660=1.
+       (pkgdata_DATA): Added iso9660_stage1_5 and stage2_eltorito.
+       (noinst_PROGRAMS): Added iso9660_stage1_5.exec and
+       start_eltorito.exec.
+       (noinst_DATA): Added start_eltorito.
+       (pre_stage2_exec_SOURCES): Added fsys_iso9660.c.
+       (START_ELTORITO_LINK): New variable.
+       (start_eltorito_exec_SOURCES): Likewise.
+       (start_eltorito_exec_CCASFLAGS): Likewise.
+       (start_eltorito_exec_LDFLAGS): Likewise.
+       (start_eltorito_exec-start.$(OBJEXT)): New dependency.
+       (stage2_eltorito): New target.
+       (iso9660_stage1_5_exec_SOURCES): New variable.
+       (iso9660_stage1_5_exec_CFLAGS): Likewise.
+       (iso9660_stage1_5_exec_CCASFLAGS): Likewise.
+       (iso9660_stage1_5_exec_LDFLAGS): Likewise.
+
+       * stage1/stage1.h (GRUB_INVALID_DRIVE): New macro.
+
+       * stage1/stage1.S (boot_drive): Use the macro GRUB_INVALID_DRIVE.
+       (real_start): Likewise.
+
+       * lib/device.c (get_drive_geometry): Set GEOM->SECTOR_SIZE to
+       SECTOR_SIZE by default.
+
+       * configure.ac (--disable-iso9660): New option.
 
+2004-03-13  Yoshinori K. Okuji  <okuji@enbug.org>
+       
        From Daniele Zelante <zeldan@email.it>:
        * stage2/asm.S (stop_floppy): Use INT 13, AH=00h to stop the
        floppy controller instead of a direct I/O.
diff --git a/INSTALL b/INSTALL
index bc215a8be87fb31bbf98fb084bf8ecf3efe69769..a5a68de821ab920556e5f7d9858c04e334c83d33 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -216,6 +216,9 @@ operates.
 `--disable-xfs'
      Omit the XFS support in Stage 2.
 
+`--disable-iso9660'
+     Omit the ISO9660 support in Stage 2.
+
 `--disable-gunzip'
      Omit the decompression support in Stage 2.
 
diff --git a/NEWS b/NEWS
index eff7a952c809290984e4d88ca5c9439baafcbacc..ecb841ca473d0fc7677773e4106290578db98c99 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ New:
 * Add support for ReiserFS 3.
 * Fix support for FreeBSD 5.
 * Support ATARAID for Linux in the grub shell and grub-install.
+* Add CDROM support for El Torito with no emulation mode. You can use
+  (cd) as a CDROM drive in the config file.
 
 New in 0.94 - 2004-01-25:
 * Support building on x86-64 with gcc -m32.
diff --git a/THANKS b/THANKS
index ce6a8adc0ce8faa4dca07c9034aae1a18b748ff5..87b7b190b5f1f822922fdc3c112b5fcb28428576 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -71,6 +71,7 @@ Klaus Reichl <klaus.reichl@alcatel.at>
 Kristoffer Branemyr <ztion@swipnet.se>
 Kunihiro Ishiguro <kunihiro@zebra.org>
 Leendert Meyer <leen.meyer@home.nl>
+Leonid Lisovskiy <lly@pisem.net>
 M. Meiarashi <mes@st.rim.or.jp>
 Mark Kettenis <kettenis@chello.nl>
 Mark Lundeberg <aa026@pgfn.bc.ca>
index b6adca8c08b6f4f737e6e34d5a6fb56eae9cacd4..c26ea52cdf32033330d66fff4dc7d5dd7ec78d7a 100644 (file)
--- a/configure
+++ b/configure
@@ -864,6 +864,7 @@ Optional Features:
   --disable-vstafs        disable VSTa FS support in Stage 2
   --disable-jfs           disable IBM JFS support in Stage 2
   --disable-xfs           disable SGI XFS support in Stage 2
+  --disable-iso9660       disable ISO9660 support in Stage 2
   --disable-gunzip        disable decompression in Stage 2
   --disable-md5-password  disable MD5 password support in Stage 2
   --disable-packet-retransmission
@@ -5098,6 +5099,16 @@ if test x"$enable_xfs" != xno; then
   FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_XFS=1"
 fi
 
+# Check whether --enable-iso9660 or --disable-iso9660 was given.
+if test "${enable_iso9660+set}" = set; then
+  enableval="$enable_iso9660"
+
+fi;
+
+if test x"$enable_iso9660" != xno; then
+  FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_ISO9660=1"
+fi
+
 
 # Check whether --enable-gunzip or --disable-gunzip was given.
 if test "${enable_gunzip+set}" = set; then
index 8000a76f93dfcf362502d2af8047e26f28ff8681..8bb18b56a1a212501caf8522e01e80dd4e62d87e 100644 (file)
@@ -1,5 +1,5 @@
 dnl Configure script for GRUB.
-dnl Copyright 1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+dnl Copyright 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
 
 dnl Permission to use, copy, modify and distribute this software and its
 dnl documentation is hereby granted, provided that both the copyright
@@ -262,6 +262,13 @@ if test x"$enable_xfs" != xno; then
   FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_XFS=1"
 fi
 
+AC_ARG_ENABLE(iso9660,
+  [  --disable-iso9660       disable ISO9660 support in Stage 2])
+
+if test x"$enable_iso9660" != xno; then
+  FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_ISO9660=1"
+fi
+
 dnl AC_ARG_ENABLE(tftp,
 dnl [  --enable-tftp           enable TFTP support in Stage 2])
 dnl 
index 9c7aa2454ce1ec04d9c3fe68defe41246023df37..28505648cb542bd6a2750631f53d494fa0b8074a 100644 (file)
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.23.
-.TH GRUB-MD5-CRYPT "8" "January 2004" "grub-md5-crypt (GNU GRUB )" FSF
+.TH GRUB-MD5-CRYPT "8" "March 2004" "grub-md5-crypt (GNU GRUB )" FSF
 .SH NAME
 grub-md5-crypt \- Encrypt a password in MD5 format
 .SH SYNOPSIS
index 46f6a306c2f8c2fbb38537c35c7c3cd05c761f4c..869d08c4335a961e1d5289755210bf0920f62bb9 100644 (file)
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.23.
-.TH GRUB-TERMINFO "8" "January 2004" "grub-terminfo (GNU GRUB 0.94)" FSF
+.TH GRUB-TERMINFO "8" "March 2004" "grub-terminfo (GNU GRUB 0.94)" FSF
 .SH NAME
 grub-terminfo \- Generate a terminfo command from a terminfo name
 .SH SYNOPSIS
index eef7a20fc9cb18e1ed9b237bf0115192ca71732c..2da761b2b5f605e127a103a45c57d6c47f137596 100644 (file)
@@ -142,9 +142,9 @@ sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
 sbin_PROGRAMS = grub
-@SERIAL_SPEED_SIMULATION_FALSE@SERIAL_FLAGS = -DSUPPORT_SERIAL=1 
 
 @SERIAL_SPEED_SIMULATION_TRUE@SERIAL_FLAGS = -DSUPPORT_SERIAL=1 -DSIMULATE_SLOWNESS_OF_SERIAL=1
+@SERIAL_SPEED_SIMULATION_FALSE@SERIAL_FLAGS = -DSUPPORT_SERIAL=1 
 
 AM_CPPFLAGS = -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 \
        -DFSYS_FFS=1 -DFSYS_MINIX=1 -DSUPPORT_HERCULES=1 \
index afddee819adbb833478d160fd3fd8917b512938f..3a54cef4cfe9aabc5e398dc327999f90ca92d65e 100644 (file)
@@ -108,6 +108,9 @@ get_drive_geometry (struct geometry *geom, char **map, int drive)
   else
     fd = geom->flags;
 
+  /* XXX This is the default size.  */
+  geom->sector_size = SECTOR_SIZE;
+  
 #if defined(__linux__)
   /* Linux */
   {
index cb41fe6bff7d40115a198796b56db6d272d6c0b0..50c63e4ae6370ca1da5537bea60a0a40fabed0a1 100644 (file)
@@ -1,7 +1,7 @@
 /* -*-Asm-*- */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002   Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2004   Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -91,8 +91,7 @@ cylinder_start:
 stage1_version:        
        .byte   COMPAT_VERSION_MAJOR, COMPAT_VERSION_MINOR
 boot_drive:    
-       .byte 0xff      /* the disk to load stage2 from */
-                       /* 0xff means use the boot drive */
+       .byte   GRUB_INVALID_DRIVE      /* the disk to load stage2 from */
 force_lba:
        .byte   0
 stage2_address:
@@ -138,7 +137,7 @@ real_start:
         *  Check if we have a forced disk reference here
         */
        MOV_MEM_TO_AL(ABS(boot_drive))  /* movb ABS(boot_drive), %al */
-       cmpb    $0xff, %al
+       cmpb    $GRUB_INVALID_DRIVE, %al
        je      1f
        movb    %al, %dl
 1:
index 402a3663e7a2e8bc92a12f69fe40fc3e93e97dc2..4205a5fd87a25c8850e4d4b1d6bf85dd6ed493ed 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2002   Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2002,2004   Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -80,4 +80,7 @@
    floppy.  */
 #define STAGE1_BIOS_HD_FLAG    0x80
 
+/* The drive number of an invalid drive.  */
+#define GRUB_INVALID_DRIVE     0xFF
+
 #endif /* ! STAGE1_HEADER */
index 729a6c32694fdd0fbfd3209fa36e81583333150d..cf4dc01f226435daecbd5743d9dfae5b945beec4 100644 (file)
@@ -5,9 +5,9 @@ noinst_SCRIPTS = $(TESTS)
 # For dist target.
 noinst_HEADERS = apic.h defs.h dir.h disk_inode.h disk_inode_ffs.h \
         fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
-       imgact_aout.h jfs.h mb_header.h mb_info.h md5.h nbi.h \
-       pc_slice.h serial.h shared.h smp-imps.h term.h terminfo.h \
-       tparm.h nbi.h vstafs.h xfs.h
+       imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
+       nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
+       terminfo.h tparm.h nbi.h vstafs.h xfs.h
 EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
 
 # For <stage1.h>.
@@ -16,13 +16,13 @@ INCLUDES = -I$(top_srcdir)/stage1
 # The library for /sbin/grub.
 noinst_LIBRARIES = libgrub.a
 libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
-       disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_jfs.c \
-       fsys_minix.c fsys_reiserfs.c fsys_vstafs.c fsys_xfs.c gunzip.c \
-       md5.c serial.c stage2.c terminfo.c tparm.c
+       disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
+       fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_vstafs.c \
+       fsys_xfs.c gunzip.c md5.c serial.c stage2.c terminfo.c tparm.c
 libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
        -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-       -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 -DFSYS_VSTAFS=1 \
-       -DFSYS_XFS=1 -DUSE_MD5_PASSWORDS=1 \
+       -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
+       -DFSYS_VSTAFS=1 -DFSYS_XFS=1 -DUSE_MD5_PASSWORDS=1 \
        -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 -fwritable-strings
 
 # Stage 2 and Stage 1.5's.
@@ -31,24 +31,24 @@ pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
 EXTRA_PROGRAMS = nbloader.exec pxeloader.exec diskless.exec
 
 if DISKLESS_SUPPORT
-pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
-       jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 vstafs_stage1_5 \
-       xfs_stage1_5 nbgrub pxegrub
-noinst_DATA = pre_stage2 start nbloader pxeloader diskless
-noinst_PROGRAMS = pre_stage2.exec start.exec e2fs_stage1_5.exec \
-       fat_stage1_5.exec ffs_stage1_5.exec jfs_stage1_5.exec \
-       minix_stage1_5.exec reiserfs_stage1_5.exec \
-       vstafs_stage1_5.exec xfs_stage1_5.exec nbloader.exec \
-       pxeloader.exec diskless.exec
+pkgdata_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+       ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+       reiserfs_stage1_5 vstafs_stage1_5 xfs_stage1_5 nbgrub pxegrub
+noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
+noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
+       e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
+       iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
+       reiserfs_stage1_5.exec vstafs_stage1_5.exec xfs_stage1_5.exec \
+       nbloader.exec pxeloader.exec diskless.exec
 else
-pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
-       jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 vstafs_stage1_5 \
-       xfs_stage1_5
-noinst_DATA = pre_stage2 start
-noinst_PROGRAMS = pre_stage2.exec start.exec e2fs_stage1_5.exec \
-       fat_stage1_5.exec ffs_stage1_5.exec jfs_stage1_5.exec \
-       minix_stage1_5.exec reiserfs_stage1_5.exec \
-       vstafs_stage1_5.exec xfs_stage1_5.exec
+pkgdata_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+       ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+       reiserfs_stage1_5 vstafs_stage1_5 xfs_stage1_5
+noinst_DATA = pre_stage2 start start_eltorito
+noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
+       e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
+       iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
+       reiserfs_stage1_5.exec vstafs_stage1_5.exec xfs_stage1_5.exec
 endif
 MOSTLYCLEANFILES = $(noinst_PROGRAMS)
 
@@ -56,6 +56,7 @@ PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
 START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
 NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
 PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
+START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
 
 if NETBOOT_SUPPORT
 NETBOOT_FLAGS = -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1
@@ -84,9 +85,9 @@ STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
 # For stage2 target.
 pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
        cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
-       fsys_fat.c fsys_ffs.c fsys_jfs.c fsys_minix.c fsys_reiserfs.c \
-       fsys_vstafs.c fsys_xfs.c gunzip.c hercules.c md5.c serial.c \
-       smp-imps.c stage2.c terminfo.c tparm.c
+       fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
+       fsys_reiserfs.c fsys_vstafs.c fsys_xfs.c gunzip.c hercules.c \
+       md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c
 pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
 pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
 pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
@@ -122,6 +123,16 @@ stage2: pre_stage2 start
        -rm -f stage2
        cat start pre_stage2 > stage2
 
+start_eltorito_exec_SOURCES = start_eltorito.S
+start_eltorito_exec_CCASFLAGS = $(STAGE2_COMPILE)
+start_eltorito_exec_LDFLAGS = $(START_ELTORITO_LINK)
+
+start_eltorito_exec-start.$(OBJEXT): stage2_size.h
+
+stage2_eltorito: pre_stage2 start_eltorito
+       -rm -f stage2_eltorito
+       cat start_eltorito pre_stage2 > stage2_eltorito
+
 # For e2fs_stage1_5 target.
 e2fs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
        stage1_5.c fsys_ext2fs.c bios.c
@@ -194,6 +205,15 @@ xfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_XFS=1 \
        -DNO_BLOCK_FILES=1
 xfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
 
+# For iso9660_stage1_5 target.
+iso9660_stage1_5_exec_SOURCES = start_eltorito.S asm.S common.c char_io.c \
+       disk_io.c stage1_5.c fsys_iso9660.c bios.c
+iso9660_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ISO9660=1 \
+       -DNO_BLOCK_FILES=1
+iso9660_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ISO9660=1 \
+       -DNO_BLOCK_FILES=1
+iso9660_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+
 # For diskless target.
 diskless_exec_SOURCES = $(pre_stage2_exec_SOURCES)
 diskless_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) \
index 92ac31c922ef54a9e59b96ea40e80285ad02c5b6..f4771eeab0f150615340049553ab2106ee55ec45 100644 (file)
@@ -151,9 +151,9 @@ noinst_SCRIPTS = $(TESTS)
 # For dist target.
 noinst_HEADERS = apic.h defs.h dir.h disk_inode.h disk_inode_ffs.h \
         fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
-       imgact_aout.h jfs.h mb_header.h mb_info.h md5.h nbi.h \
-       pc_slice.h serial.h shared.h smp-imps.h term.h terminfo.h \
-       tparm.h nbi.h vstafs.h xfs.h
+       imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
+       nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
+       terminfo.h tparm.h nbi.h vstafs.h xfs.h
 
 EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
 
@@ -163,39 +163,39 @@ INCLUDES = -I$(top_srcdir)/stage1
 # The library for /sbin/grub.
 noinst_LIBRARIES = libgrub.a
 libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
-       disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_jfs.c \
-       fsys_minix.c fsys_reiserfs.c fsys_vstafs.c fsys_xfs.c gunzip.c \
-       md5.c serial.c stage2.c terminfo.c tparm.c
+       disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
+       fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_vstafs.c \
+       fsys_xfs.c gunzip.c md5.c serial.c stage2.c terminfo.c tparm.c
 
 libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
        -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-       -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 -DFSYS_VSTAFS=1 \
-       -DFSYS_XFS=1 -DUSE_MD5_PASSWORDS=1 \
+       -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
+       -DFSYS_VSTAFS=1 -DFSYS_XFS=1 -DUSE_MD5_PASSWORDS=1 \
        -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 -fwritable-strings
 
 
 EXTRA_PROGRAMS = nbloader.exec pxeloader.exec diskless.exec
 
-@DISKLESS_SUPPORT_TRUE@pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
-@DISKLESS_SUPPORT_TRUE@        jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 vstafs_stage1_5 \
-@DISKLESS_SUPPORT_TRUE@        xfs_stage1_5 nbgrub pxegrub
+@DISKLESS_SUPPORT_TRUE@pkgdata_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+@DISKLESS_SUPPORT_TRUE@        ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+@DISKLESS_SUPPORT_TRUE@        reiserfs_stage1_5 vstafs_stage1_5 xfs_stage1_5 nbgrub pxegrub
 
-@DISKLESS_SUPPORT_FALSE@pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
-@DISKLESS_SUPPORT_FALSE@       jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 vstafs_stage1_5 \
-@DISKLESS_SUPPORT_FALSE@       xfs_stage1_5
+@DISKLESS_SUPPORT_FALSE@pkgdata_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+@DISKLESS_SUPPORT_FALSE@       ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+@DISKLESS_SUPPORT_FALSE@       reiserfs_stage1_5 vstafs_stage1_5 xfs_stage1_5
 
-@DISKLESS_SUPPORT_TRUE@noinst_DATA = pre_stage2 start nbloader pxeloader diskless
-@DISKLESS_SUPPORT_FALSE@noinst_DATA = pre_stage2 start
-@DISKLESS_SUPPORT_TRUE@noinst_PROGRAMS = pre_stage2.exec start.exec e2fs_stage1_5.exec \
-@DISKLESS_SUPPORT_TRUE@        fat_stage1_5.exec ffs_stage1_5.exec jfs_stage1_5.exec \
-@DISKLESS_SUPPORT_TRUE@        minix_stage1_5.exec reiserfs_stage1_5.exec \
-@DISKLESS_SUPPORT_TRUE@        vstafs_stage1_5.exec xfs_stage1_5.exec nbloader.exec \
-@DISKLESS_SUPPORT_TRUE@        pxeloader.exec diskless.exec
+@DISKLESS_SUPPORT_TRUE@noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
+@DISKLESS_SUPPORT_FALSE@noinst_DATA = pre_stage2 start start_eltorito
+@DISKLESS_SUPPORT_TRUE@noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
+@DISKLESS_SUPPORT_TRUE@        e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
+@DISKLESS_SUPPORT_TRUE@        iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
+@DISKLESS_SUPPORT_TRUE@        reiserfs_stage1_5.exec vstafs_stage1_5.exec xfs_stage1_5.exec \
+@DISKLESS_SUPPORT_TRUE@        nbloader.exec pxeloader.exec diskless.exec
 
-@DISKLESS_SUPPORT_FALSE@noinst_PROGRAMS = pre_stage2.exec start.exec e2fs_stage1_5.exec \
-@DISKLESS_SUPPORT_FALSE@       fat_stage1_5.exec ffs_stage1_5.exec jfs_stage1_5.exec \
-@DISKLESS_SUPPORT_FALSE@       minix_stage1_5.exec reiserfs_stage1_5.exec \
-@DISKLESS_SUPPORT_FALSE@       vstafs_stage1_5.exec xfs_stage1_5.exec
+@DISKLESS_SUPPORT_FALSE@noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
+@DISKLESS_SUPPORT_FALSE@       e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
+@DISKLESS_SUPPORT_FALSE@       iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
+@DISKLESS_SUPPORT_FALSE@       reiserfs_stage1_5.exec vstafs_stage1_5.exec xfs_stage1_5.exec
 
 MOSTLYCLEANFILES = $(noinst_PROGRAMS)
 
@@ -203,12 +203,13 @@ PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
 START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
 NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
 PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
+START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
 
 @NETBOOT_SUPPORT_TRUE@NETBOOT_FLAGS = -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1
 @NETBOOT_SUPPORT_FALSE@NETBOOT_FLAGS = 
-@SERIAL_SUPPORT_FALSE@SERIAL_FLAGS = 
 
 @SERIAL_SUPPORT_TRUE@SERIAL_FLAGS = -DSUPPORT_SERIAL=1
+@SERIAL_SUPPORT_FALSE@SERIAL_FLAGS = 
 @HERCULES_SUPPORT_FALSE@HERCULES_FLAGS = 
 
 @HERCULES_SUPPORT_TRUE@HERCULES_FLAGS = -DSUPPORT_HERCULES=1
@@ -223,9 +224,9 @@ STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
 # For stage2 target.
 pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
        cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
-       fsys_fat.c fsys_ffs.c fsys_jfs.c fsys_minix.c fsys_reiserfs.c \
-       fsys_vstafs.c fsys_xfs.c gunzip.c hercules.c md5.c serial.c \
-       smp-imps.c stage2.c terminfo.c tparm.c
+       fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
+       fsys_reiserfs.c fsys_vstafs.c fsys_xfs.c gunzip.c hercules.c \
+       md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c
 
 pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
 pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
@@ -242,6 +243,10 @@ start_exec_SOURCES = start.S
 start_exec_CCASFLAGS = $(STAGE2_COMPILE)
 start_exec_LDFLAGS = $(START_LINK)
 
+start_eltorito_exec_SOURCES = start_eltorito.S
+start_eltorito_exec_CCASFLAGS = $(STAGE2_COMPILE)
+start_eltorito_exec_LDFLAGS = $(START_ELTORITO_LINK)
+
 # For e2fs_stage1_5 target.
 e2fs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
        stage1_5.c fsys_ext2fs.c bios.c
@@ -338,6 +343,18 @@ xfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_XFS=1 \
 
 xfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
 
+# For iso9660_stage1_5 target.
+iso9660_stage1_5_exec_SOURCES = start_eltorito.S asm.S common.c char_io.c \
+       disk_io.c stage1_5.c fsys_iso9660.c bios.c
+
+iso9660_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ISO9660=1 \
+       -DNO_BLOCK_FILES=1
+
+iso9660_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ISO9660=1 \
+       -DNO_BLOCK_FILES=1
+
+iso9660_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+
 # For diskless target.
 diskless_exec_SOURCES = $(pre_stage2_exec_SOURCES)
 diskless_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) \
@@ -371,7 +388,8 @@ am_libgrub_a_OBJECTS = libgrub_a-boot.$(OBJEXT) \
        libgrub_a-cmdline.$(OBJEXT) libgrub_a-common.$(OBJEXT) \
        libgrub_a-disk_io.$(OBJEXT) libgrub_a-fsys_ext2fs.$(OBJEXT) \
        libgrub_a-fsys_fat.$(OBJEXT) libgrub_a-fsys_ffs.$(OBJEXT) \
-       libgrub_a-fsys_jfs.$(OBJEXT) libgrub_a-fsys_minix.$(OBJEXT) \
+       libgrub_a-fsys_iso9660.$(OBJEXT) libgrub_a-fsys_jfs.$(OBJEXT) \
+       libgrub_a-fsys_minix.$(OBJEXT) \
        libgrub_a-fsys_reiserfs.$(OBJEXT) \
        libgrub_a-fsys_vstafs.$(OBJEXT) libgrub_a-fsys_xfs.$(OBJEXT) \
        libgrub_a-gunzip.$(OBJEXT) libgrub_a-md5.$(OBJEXT) \
@@ -382,9 +400,11 @@ EXTRA_PROGRAMS = nbloader.exec$(EXEEXT) pxeloader.exec$(EXEEXT) \
        diskless.exec$(EXEEXT)
 @DISKLESS_SUPPORT_TRUE@noinst_PROGRAMS = pre_stage2.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        start.exec$(EXEEXT) \
+@DISKLESS_SUPPORT_TRUE@        start_eltorito.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        e2fs_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        fat_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        ffs_stage1_5.exec$(EXEEXT) \
+@DISKLESS_SUPPORT_TRUE@        iso9660_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        jfs_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        minix_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        reiserfs_stage1_5.exec$(EXEEXT) \
@@ -395,9 +415,11 @@ EXTRA_PROGRAMS = nbloader.exec$(EXEEXT) pxeloader.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_TRUE@        diskless.exec$(EXEEXT)
 @DISKLESS_SUPPORT_FALSE@noinst_PROGRAMS = pre_stage2.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       start.exec$(EXEEXT) \
+@DISKLESS_SUPPORT_FALSE@       start_eltorito.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       e2fs_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       fat_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       ffs_stage1_5.exec$(EXEEXT) \
+@DISKLESS_SUPPORT_FALSE@       iso9660_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       jfs_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       minix_stage1_5.exec$(EXEEXT) \
 @DISKLESS_SUPPORT_FALSE@       reiserfs_stage1_5.exec$(EXEEXT) \
@@ -413,6 +435,7 @@ am__objects_1 = diskless_exec-asm.$(OBJEXT) diskless_exec-bios.$(OBJEXT) \
        diskless_exec-fsys_ext2fs.$(OBJEXT) \
        diskless_exec-fsys_fat.$(OBJEXT) \
        diskless_exec-fsys_ffs.$(OBJEXT) \
+       diskless_exec-fsys_iso9660.$(OBJEXT) \
        diskless_exec-fsys_jfs.$(OBJEXT) \
        diskless_exec-fsys_minix.$(OBJEXT) \
        diskless_exec-fsys_reiserfs.$(OBJEXT) \
@@ -458,6 +481,18 @@ am_ffs_stage1_5_exec_OBJECTS = ffs_stage1_5_exec-start.$(OBJEXT) \
 ffs_stage1_5_exec_OBJECTS = $(am_ffs_stage1_5_exec_OBJECTS)
 ffs_stage1_5_exec_LDADD = $(LDADD)
 ffs_stage1_5_exec_DEPENDENCIES =
+am_iso9660_stage1_5_exec_OBJECTS = \
+       iso9660_stage1_5_exec-start_eltorito.$(OBJEXT) \
+       iso9660_stage1_5_exec-asm.$(OBJEXT) \
+       iso9660_stage1_5_exec-common.$(OBJEXT) \
+       iso9660_stage1_5_exec-char_io.$(OBJEXT) \
+       iso9660_stage1_5_exec-disk_io.$(OBJEXT) \
+       iso9660_stage1_5_exec-stage1_5.$(OBJEXT) \
+       iso9660_stage1_5_exec-fsys_iso9660.$(OBJEXT) \
+       iso9660_stage1_5_exec-bios.$(OBJEXT)
+iso9660_stage1_5_exec_OBJECTS = $(am_iso9660_stage1_5_exec_OBJECTS)
+iso9660_stage1_5_exec_LDADD = $(LDADD)
+iso9660_stage1_5_exec_DEPENDENCIES =
 am_jfs_stage1_5_exec_OBJECTS = jfs_stage1_5_exec-start.$(OBJEXT) \
        jfs_stage1_5_exec-asm.$(OBJEXT) \
        jfs_stage1_5_exec-common.$(OBJEXT) \
@@ -495,6 +530,7 @@ am_pre_stage2_exec_OBJECTS = pre_stage2_exec-asm.$(OBJEXT) \
        pre_stage2_exec-fsys_ext2fs.$(OBJEXT) \
        pre_stage2_exec-fsys_fat.$(OBJEXT) \
        pre_stage2_exec-fsys_ffs.$(OBJEXT) \
+       pre_stage2_exec-fsys_iso9660.$(OBJEXT) \
        pre_stage2_exec-fsys_jfs.$(OBJEXT) \
        pre_stage2_exec-fsys_minix.$(OBJEXT) \
        pre_stage2_exec-fsys_reiserfs.$(OBJEXT) \
@@ -531,6 +567,11 @@ am_start_exec_OBJECTS = start_exec-start.$(OBJEXT)
 start_exec_OBJECTS = $(am_start_exec_OBJECTS)
 start_exec_LDADD = $(LDADD)
 start_exec_DEPENDENCIES =
+am_start_eltorito_exec_OBJECTS = \
+       start_eltorito_exec-start_eltorito.$(OBJEXT)
+start_eltorito_exec_OBJECTS = $(am_start_eltorito_exec_OBJECTS)
+start_eltorito_exec_LDADD = $(LDADD)
+start_eltorito_exec_DEPENDENCIES =
 am_vstafs_stage1_5_exec_OBJECTS = vstafs_stage1_5_exec-start.$(OBJEXT) \
        vstafs_stage1_5_exec-asm.$(OBJEXT) \
        vstafs_stage1_5_exec-common.$(OBJEXT) \
@@ -570,6 +611,7 @@ am__depfiles_maybe = depfiles
 @AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_ext2fs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_fat.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_ffs.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_iso9660.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_jfs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_minix.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/diskless_exec-fsys_reiserfs.Po \
@@ -601,6 +643,12 @@ am__depfiles_maybe = depfiles
 @AMDEP_TRUE@   ./$(DEPDIR)/ffs_stage1_5_exec-disk_io.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/ffs_stage1_5_exec-fsys_ffs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/ffs_stage1_5_exec-stage1_5.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/iso9660_stage1_5_exec-bios.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/iso9660_stage1_5_exec-char_io.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/iso9660_stage1_5_exec-common.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/jfs_stage1_5_exec-bios.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/jfs_stage1_5_exec-char_io.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/jfs_stage1_5_exec-common.Po \
@@ -616,6 +664,7 @@ am__depfiles_maybe = depfiles
 @AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_ext2fs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_fat.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_ffs.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_iso9660.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_jfs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_minix.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/libgrub_a-fsys_reiserfs.Po \
@@ -644,6 +693,7 @@ am__depfiles_maybe = depfiles
 @AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_ext2fs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_fat.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_ffs.Po \
+@AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_jfs.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_minix.Po \
 @AMDEP_TRUE@   ./$(DEPDIR)/pre_stage2_exec-fsys_reiserfs.Po \
@@ -682,17 +732,18 @@ CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 DIST_SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) \
        $(e2fs_stage1_5_exec_SOURCES) $(fat_stage1_5_exec_SOURCES) \
-       $(ffs_stage1_5_exec_SOURCES) $(jfs_stage1_5_exec_SOURCES) \
-       $(minix_stage1_5_exec_SOURCES) $(nbloader_exec_SOURCES) \
-       $(pre_stage2_exec_SOURCES) $(pxeloader_exec_SOURCES) \
-       $(reiserfs_stage1_5_exec_SOURCES) $(start_exec_SOURCES) \
+       $(ffs_stage1_5_exec_SOURCES) $(iso9660_stage1_5_exec_SOURCES) \
+       $(jfs_stage1_5_exec_SOURCES) $(minix_stage1_5_exec_SOURCES) \
+       $(nbloader_exec_SOURCES) $(pre_stage2_exec_SOURCES) \
+       $(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) \
+       $(start_exec_SOURCES) $(start_eltorito_exec_SOURCES) \
        $(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
 DATA = $(noinst_DATA) $(pkgdata_DATA)
 
 HEADERS = $(noinst_HEADERS)
 
 DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in
-SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) $(e2fs_stage1_5_exec_SOURCES) $(fat_stage1_5_exec_SOURCES) $(ffs_stage1_5_exec_SOURCES) $(jfs_stage1_5_exec_SOURCES) $(minix_stage1_5_exec_SOURCES) $(nbloader_exec_SOURCES) $(pre_stage2_exec_SOURCES) $(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) $(start_exec_SOURCES) $(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
+SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) $(e2fs_stage1_5_exec_SOURCES) $(fat_stage1_5_exec_SOURCES) $(ffs_stage1_5_exec_SOURCES) $(iso9660_stage1_5_exec_SOURCES) $(jfs_stage1_5_exec_SOURCES) $(minix_stage1_5_exec_SOURCES) $(nbloader_exec_SOURCES) $(pre_stage2_exec_SOURCES) $(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) $(start_exec_SOURCES) $(start_eltorito_exec_SOURCES) $(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
 
 all: $(BUILT_SOURCES)
        $(MAKE) $(AM_MAKEFLAGS) all-am
@@ -728,6 +779,9 @@ fat_stage1_5.exec$(EXEEXT): $(fat_stage1_5_exec_OBJECTS) $(fat_stage1_5_exec_DEP
 ffs_stage1_5.exec$(EXEEXT): $(ffs_stage1_5_exec_OBJECTS) $(ffs_stage1_5_exec_DEPENDENCIES) 
        @rm -f ffs_stage1_5.exec$(EXEEXT)
        $(LINK) $(ffs_stage1_5_exec_LDFLAGS) $(ffs_stage1_5_exec_OBJECTS) $(ffs_stage1_5_exec_LDADD) $(LIBS)
+iso9660_stage1_5.exec$(EXEEXT): $(iso9660_stage1_5_exec_OBJECTS) $(iso9660_stage1_5_exec_DEPENDENCIES) 
+       @rm -f iso9660_stage1_5.exec$(EXEEXT)
+       $(LINK) $(iso9660_stage1_5_exec_LDFLAGS) $(iso9660_stage1_5_exec_OBJECTS) $(iso9660_stage1_5_exec_LDADD) $(LIBS)
 jfs_stage1_5.exec$(EXEEXT): $(jfs_stage1_5_exec_OBJECTS) $(jfs_stage1_5_exec_DEPENDENCIES) 
        @rm -f jfs_stage1_5.exec$(EXEEXT)
        $(LINK) $(jfs_stage1_5_exec_LDFLAGS) $(jfs_stage1_5_exec_OBJECTS) $(jfs_stage1_5_exec_LDADD) $(LIBS)
@@ -749,6 +803,9 @@ reiserfs_stage1_5.exec$(EXEEXT): $(reiserfs_stage1_5_exec_OBJECTS) $(reiserfs_st
 start.exec$(EXEEXT): $(start_exec_OBJECTS) $(start_exec_DEPENDENCIES) 
        @rm -f start.exec$(EXEEXT)
        $(LINK) $(start_exec_LDFLAGS) $(start_exec_OBJECTS) $(start_exec_LDADD) $(LIBS)
+start_eltorito.exec$(EXEEXT): $(start_eltorito_exec_OBJECTS) $(start_eltorito_exec_DEPENDENCIES) 
+       @rm -f start_eltorito.exec$(EXEEXT)
+       $(LINK) $(start_eltorito_exec_LDFLAGS) $(start_eltorito_exec_OBJECTS) $(start_eltorito_exec_LDADD) $(LIBS)
 vstafs_stage1_5.exec$(EXEEXT): $(vstafs_stage1_5_exec_OBJECTS) $(vstafs_stage1_5_exec_DEPENDENCIES) 
        @rm -f vstafs_stage1_5.exec$(EXEEXT)
        $(LINK) $(vstafs_stage1_5_exec_LDFLAGS) $(vstafs_stage1_5_exec_OBJECTS) $(vstafs_stage1_5_exec_LDADD) $(LIBS)
@@ -773,6 +830,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_ext2fs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_fat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_ffs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_iso9660.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_jfs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_minix.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_reiserfs.Po@am__quote@
@@ -804,6 +862,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffs_stage1_5_exec-disk_io.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffs_stage1_5_exec-fsys_ffs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffs_stage1_5_exec-stage1_5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso9660_stage1_5_exec-bios.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso9660_stage1_5_exec-char_io.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso9660_stage1_5_exec-common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfs_stage1_5_exec-bios.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfs_stage1_5_exec-char_io.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfs_stage1_5_exec-common.Po@am__quote@
@@ -819,6 +883,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_ext2fs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_fat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_ffs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_iso9660.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_jfs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_minix.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_reiserfs.Po@am__quote@
@@ -847,6 +912,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_ext2fs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_fat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_ffs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_jfs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_minix.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_reiserfs.Po@am__quote@
@@ -930,6 +996,18 @@ ffs_stage1_5_exec-asm.o: asm.S
 ffs_stage1_5_exec-asm.obj: asm.S
        $(CCAS) $(ffs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o ffs_stage1_5_exec-asm.obj `if test -f 'asm.S'; then $(CYGPATH_W) 'asm.S'; else $(CYGPATH_W) '$(srcdir)/asm.S'; fi`
 
+iso9660_stage1_5_exec-start_eltorito.o: start_eltorito.S
+       $(CCAS) $(iso9660_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o iso9660_stage1_5_exec-start_eltorito.o `test -f 'start_eltorito.S' || echo '$(srcdir)/'`start_eltorito.S
+
+iso9660_stage1_5_exec-start_eltorito.obj: start_eltorito.S
+       $(CCAS) $(iso9660_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o iso9660_stage1_5_exec-start_eltorito.obj `if test -f 'start_eltorito.S'; then $(CYGPATH_W) 'start_eltorito.S'; else $(CYGPATH_W) '$(srcdir)/start_eltorito.S'; fi`
+
+iso9660_stage1_5_exec-asm.o: asm.S
+       $(CCAS) $(iso9660_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o iso9660_stage1_5_exec-asm.o `test -f 'asm.S' || echo '$(srcdir)/'`asm.S
+
+iso9660_stage1_5_exec-asm.obj: asm.S
+       $(CCAS) $(iso9660_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o iso9660_stage1_5_exec-asm.obj `if test -f 'asm.S'; then $(CYGPATH_W) 'asm.S'; else $(CYGPATH_W) '$(srcdir)/asm.S'; fi`
+
 jfs_stage1_5_exec-start.o: start.S
        $(CCAS) $(jfs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o jfs_stage1_5_exec-start.o `test -f 'start.S' || echo '$(srcdir)/'`start.S
 
@@ -990,6 +1068,12 @@ start_exec-start.o: start.S
 start_exec-start.obj: start.S
        $(CCAS) $(start_exec_CCASFLAGS) $(CCASFLAGS) -c -o start_exec-start.obj `if test -f 'start.S'; then $(CYGPATH_W) 'start.S'; else $(CYGPATH_W) '$(srcdir)/start.S'; fi`
 
+start_eltorito_exec-start_eltorito.o: start_eltorito.S
+       $(CCAS) $(start_eltorito_exec_CCASFLAGS) $(CCASFLAGS) -c -o start_eltorito_exec-start_eltorito.o `test -f 'start_eltorito.S' || echo '$(srcdir)/'`start_eltorito.S
+
+start_eltorito_exec-start_eltorito.obj: start_eltorito.S
+       $(CCAS) $(start_eltorito_exec_CCASFLAGS) $(CCASFLAGS) -c -o start_eltorito_exec-start_eltorito.obj `if test -f 'start_eltorito.S'; then $(CYGPATH_W) 'start_eltorito.S'; else $(CYGPATH_W) '$(srcdir)/start_eltorito.S'; fi`
+
 vstafs_stage1_5_exec-start.o: start.S
        $(CCAS) $(vstafs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o vstafs_stage1_5_exec-start.o `test -f 'start.S' || echo '$(srcdir)/'`start.S
 
@@ -1234,6 +1318,28 @@ libgrub_a-fsys_ffs.obj: fsys_ffs.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-fsys_ffs.obj `if test -f 'fsys_ffs.c'; then $(CYGPATH_W) 'fsys_ffs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_ffs.c'; fi`
 
+libgrub_a-fsys_iso9660.o: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-fsys_iso9660.o -MD -MP -MF "$(DEPDIR)/libgrub_a-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o libgrub_a-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/libgrub_a-fsys_iso9660.Tpo" "$(DEPDIR)/libgrub_a-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/libgrub_a-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='libgrub_a-fsys_iso9660.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/libgrub_a-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/libgrub_a-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c
+
+libgrub_a-fsys_iso9660.obj: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-fsys_iso9660.obj -MD -MP -MF "$(DEPDIR)/libgrub_a-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o libgrub_a-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/libgrub_a-fsys_iso9660.Tpo" "$(DEPDIR)/libgrub_a-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/libgrub_a-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='libgrub_a-fsys_iso9660.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/libgrub_a-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/libgrub_a-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`
+
 libgrub_a-fsys_jfs.o: fsys_jfs.c
 @am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-fsys_jfs.o -MD -MP -MF "$(DEPDIR)/libgrub_a-fsys_jfs.Tpo" \
 @am__fastdepCC_TRUE@     -c -o libgrub_a-fsys_jfs.o `test -f 'fsys_jfs.c' || echo '$(srcdir)/'`fsys_jfs.c; \
@@ -1718,6 +1824,28 @@ diskless_exec-fsys_ffs.obj: fsys_ffs.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-fsys_ffs.obj `if test -f 'fsys_ffs.c'; then $(CYGPATH_W) 'fsys_ffs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_ffs.c'; fi`
 
+diskless_exec-fsys_iso9660.o: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-fsys_iso9660.o -MD -MP -MF "$(DEPDIR)/diskless_exec-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o diskless_exec-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/diskless_exec-fsys_iso9660.Tpo" "$(DEPDIR)/diskless_exec-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/diskless_exec-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='diskless_exec-fsys_iso9660.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/diskless_exec-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/diskless_exec-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c
+
+diskless_exec-fsys_iso9660.obj: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-fsys_iso9660.obj -MD -MP -MF "$(DEPDIR)/diskless_exec-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o diskless_exec-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/diskless_exec-fsys_iso9660.Tpo" "$(DEPDIR)/diskless_exec-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/diskless_exec-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='diskless_exec-fsys_iso9660.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/diskless_exec-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/diskless_exec-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`
+
 diskless_exec-fsys_jfs.o: fsys_jfs.c
 @am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-fsys_jfs.o -MD -MP -MF "$(DEPDIR)/diskless_exec-fsys_jfs.Tpo" \
 @am__fastdepCC_TRUE@     -c -o diskless_exec-fsys_jfs.o `test -f 'fsys_jfs.c' || echo '$(srcdir)/'`fsys_jfs.c; \
@@ -2400,6 +2528,138 @@ ffs_stage1_5_exec-bios.obj: bios.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ffs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o ffs_stage1_5_exec-bios.obj `if test -f 'bios.c'; then $(CYGPATH_W) 'bios.c'; else $(CYGPATH_W) '$(srcdir)/bios.c'; fi`
 
+iso9660_stage1_5_exec-common.o: common.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-common.o -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-common.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-common.o `test -f 'common.c' || echo '$(srcdir)/'`common.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-common.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-common.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-common.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='common.c' object='iso9660_stage1_5_exec-common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-common.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-common.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-common.o `test -f 'common.c' || echo '$(srcdir)/'`common.c
+
+iso9660_stage1_5_exec-common.obj: common.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-common.obj -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-common.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-common.obj `if test -f 'common.c'; then $(CYGPATH_W) 'common.c'; else $(CYGPATH_W) '$(srcdir)/common.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-common.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-common.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-common.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='common.c' object='iso9660_stage1_5_exec-common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-common.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-common.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-common.obj `if test -f 'common.c'; then $(CYGPATH_W) 'common.c'; else $(CYGPATH_W) '$(srcdir)/common.c'; fi`
+
+iso9660_stage1_5_exec-char_io.o: char_io.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-char_io.o -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-char_io.o `test -f 'char_io.c' || echo '$(srcdir)/'`char_io.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='char_io.c' object='iso9660_stage1_5_exec-char_io.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-char_io.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-char_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-char_io.o `test -f 'char_io.c' || echo '$(srcdir)/'`char_io.c
+
+iso9660_stage1_5_exec-char_io.obj: char_io.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-char_io.obj -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-char_io.obj `if test -f 'char_io.c'; then $(CYGPATH_W) 'char_io.c'; else $(CYGPATH_W) '$(srcdir)/char_io.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-char_io.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='char_io.c' object='iso9660_stage1_5_exec-char_io.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-char_io.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-char_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-char_io.obj `if test -f 'char_io.c'; then $(CYGPATH_W) 'char_io.c'; else $(CYGPATH_W) '$(srcdir)/char_io.c'; fi`
+
+iso9660_stage1_5_exec-disk_io.o: disk_io.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-disk_io.o -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='disk_io.c' object='iso9660_stage1_5_exec-disk_io.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-disk_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c
+
+iso9660_stage1_5_exec-disk_io.obj: disk_io.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-disk_io.obj -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-disk_io.obj `if test -f 'disk_io.c'; then $(CYGPATH_W) 'disk_io.c'; else $(CYGPATH_W) '$(srcdir)/disk_io.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='disk_io.c' object='iso9660_stage1_5_exec-disk_io.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-disk_io.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-disk_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-disk_io.obj `if test -f 'disk_io.c'; then $(CYGPATH_W) 'disk_io.c'; else $(CYGPATH_W) '$(srcdir)/disk_io.c'; fi`
+
+iso9660_stage1_5_exec-stage1_5.o: stage1_5.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-stage1_5.o -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-stage1_5.o `test -f 'stage1_5.c' || echo '$(srcdir)/'`stage1_5.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='stage1_5.c' object='iso9660_stage1_5_exec-stage1_5.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-stage1_5.o `test -f 'stage1_5.c' || echo '$(srcdir)/'`stage1_5.c
+
+iso9660_stage1_5_exec-stage1_5.obj: stage1_5.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-stage1_5.obj -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-stage1_5.obj `if test -f 'stage1_5.c'; then $(CYGPATH_W) 'stage1_5.c'; else $(CYGPATH_W) '$(srcdir)/stage1_5.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='stage1_5.c' object='iso9660_stage1_5_exec-stage1_5.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-stage1_5.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-stage1_5.obj `if test -f 'stage1_5.c'; then $(CYGPATH_W) 'stage1_5.c'; else $(CYGPATH_W) '$(srcdir)/stage1_5.c'; fi`
+
+iso9660_stage1_5_exec-fsys_iso9660.o: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-fsys_iso9660.o -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='iso9660_stage1_5_exec-fsys_iso9660.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c
+
+iso9660_stage1_5_exec-fsys_iso9660.obj: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-fsys_iso9660.obj -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='iso9660_stage1_5_exec-fsys_iso9660.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`
+
+iso9660_stage1_5_exec-bios.o: bios.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-bios.o -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-bios.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-bios.o `test -f 'bios.c' || echo '$(srcdir)/'`bios.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-bios.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-bios.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-bios.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='bios.c' object='iso9660_stage1_5_exec-bios.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-bios.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-bios.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-bios.o `test -f 'bios.c' || echo '$(srcdir)/'`bios.c
+
+iso9660_stage1_5_exec-bios.obj: bios.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -MT iso9660_stage1_5_exec-bios.obj -MD -MP -MF "$(DEPDIR)/iso9660_stage1_5_exec-bios.Tpo" \
+@am__fastdepCC_TRUE@     -c -o iso9660_stage1_5_exec-bios.obj `if test -f 'bios.c'; then $(CYGPATH_W) 'bios.c'; else $(CYGPATH_W) '$(srcdir)/bios.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/iso9660_stage1_5_exec-bios.Tpo" "$(DEPDIR)/iso9660_stage1_5_exec-bios.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/iso9660_stage1_5_exec-bios.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='bios.c' object='iso9660_stage1_5_exec-bios.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/iso9660_stage1_5_exec-bios.Po' tmpdepfile='$(DEPDIR)/iso9660_stage1_5_exec-bios.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iso9660_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o iso9660_stage1_5_exec-bios.obj `if test -f 'bios.c'; then $(CYGPATH_W) 'bios.c'; else $(CYGPATH_W) '$(srcdir)/bios.c'; fi`
+
 jfs_stage1_5_exec-common.o: common.c
 @am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT jfs_stage1_5_exec-common.o -MD -MP -MF "$(DEPDIR)/jfs_stage1_5_exec-common.Tpo" \
 @am__fastdepCC_TRUE@     -c -o jfs_stage1_5_exec-common.o `test -f 'common.c' || echo '$(srcdir)/'`common.c; \
@@ -2906,6 +3166,28 @@ pre_stage2_exec-fsys_ffs.obj: fsys_ffs.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-fsys_ffs.obj `if test -f 'fsys_ffs.c'; then $(CYGPATH_W) 'fsys_ffs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_ffs.c'; fi`
 
+pre_stage2_exec-fsys_iso9660.o: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-fsys_iso9660.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o pre_stage2_exec-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Tpo" "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='pre_stage2_exec-fsys_iso9660.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-fsys_iso9660.o `test -f 'fsys_iso9660.c' || echo '$(srcdir)/'`fsys_iso9660.c
+
+pre_stage2_exec-fsys_iso9660.obj: fsys_iso9660.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-fsys_iso9660.obj -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Tpo" \
+@am__fastdepCC_TRUE@     -c -o pre_stage2_exec-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Tpo" "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Po"; \
+@am__fastdepCC_TRUE@   else rm -f "$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@   fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='fsys_iso9660.c' object='pre_stage2_exec-fsys_iso9660.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      depfile='$(DEPDIR)/pre_stage2_exec-fsys_iso9660.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-fsys_iso9660.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-fsys_iso9660.obj `if test -f 'fsys_iso9660.c'; then $(CYGPATH_W) 'fsys_iso9660.c'; else $(CYGPATH_W) '$(srcdir)/fsys_iso9660.c'; fi`
+
 pre_stage2_exec-fsys_jfs.o: fsys_jfs.c
 @am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-fsys_jfs.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-fsys_jfs.Tpo" \
 @am__fastdepCC_TRUE@     -c -o pre_stage2_exec-fsys_jfs.o `test -f 'fsys_jfs.c' || echo '$(srcdir)/'`fsys_jfs.c; \
@@ -3875,6 +4157,12 @@ stage2: pre_stage2 start
        -rm -f stage2
        cat start pre_stage2 > stage2
 
+start_eltorito_exec-start.$(OBJEXT): stage2_size.h
+
+stage2_eltorito: pre_stage2 start_eltorito
+       -rm -f stage2_eltorito
+       cat start_eltorito pre_stage2 > stage2_eltorito
+
 diskless_size.h: diskless
        -rm -f $@
        set dummy `ls -l $^`; \
index 248490dd052478de18e97134af3a3627ba95cfc6..2dd07088e928c719d44c1a41eda78e5635347fe2 100644 (file)
@@ -938,9 +938,9 @@ realcseg:
 
 
 /*
- *   int biosdisk_int13_extensions (int ah, int drive, void *dap)
+ *   int biosdisk_int13_extensions (int ax, int drive, void *dap)
  *
- *   Call IBM/MS INT13 Extensions (int 13 %ah=AH) for DRIVE. DAP
+ *   Call IBM/MS INT13 Extensions (int 13 %ax=AX) for DRIVE. DAP
  *   is passed for disk address packet. If an error occurs, return
  *   non-zero, otherwise zero.
  */
@@ -950,6 +950,7 @@ ENTRY(biosdisk_int13_extensions)
        movl    %esp, %ebp
 
        pushl   %esi
+       pushl   %ebx
 
        /* compute the address of disk_address_packet */
        movl    0x10(%ebp), %eax
@@ -960,13 +961,13 @@ ENTRY(biosdisk_int13_extensions)
 
        /* drive */
        movb    0xc(%ebp), %dl
-       /* ah */
-       movb    0x8(%ebp), %dh
+       /* ax */
+       movw    0x8(%ebp), %bx
        /* enter real mode */
        call    EXT_C(prot_to_real)
        
        .code16
-       movb    %dh, %ah
+       movw    %bx, %ax
        movw    %cx, %ds
        int     $0x13           /* do the operation */
        movb    %ah, %dl        /* save return value */
@@ -979,6 +980,7 @@ ENTRY(biosdisk_int13_extensions)
 
        movb    %dl, %al        /* return value in %eax */
 
+       popl    %ebx
        popl    %esi
        popl    %ebp
 
@@ -1107,52 +1109,6 @@ ENTRY(check_int13_extensions)
        ret
 
 
-/*
- *   int get_diskinfo_int13_extensions (int drive, void *drp)
- *
- *   Return the geometry of DRIVE in a drive parameters, DRP. If an error
- *   occurs, then return non-zero, otherwise zero.
- */
-
-ENTRY(get_diskinfo_int13_extensions)
-       pushl   %ebp
-       movl    %esp, %ebp
-
-       pushl   %ebx
-       pushl   %esi
-
-       /* compute the address of drive parameters */
-       movl    0xc(%ebp), %eax
-       movw    %ax, %si
-       xorw    %ax, %ax
-       shrl    $4, %eax
-       movw    %ax, %bx        /* save the segment into %bx */
-       /* drive */
-       movb    0x8(%ebp), %dl
-       /* enter real mode */
-       call    EXT_C(prot_to_real)
-
-       .code16
-       movb    $0x48, %ah
-       movw    %bx, %ds
-       int     $0x13           /* do the operation */
-       movb    %ah, %bl        /* save return value in %bl */
-       /* clear the data segment */
-       xorw    %ax, %ax
-       movw    %ax, %ds
-       /* back to protected mode */
-       DATA32  call    EXT_C(real_to_prot)
-       .code32
-
-       movb    %bl, %al        /* return value in %eax */
-
-       popl    %esi
-       popl    %ebx
-       popl    %ebp
-       
-       ret
-
-
 /*
  *   int get_diskinfo_standard (int drive, unsigned long *cylinders, 
  *                              unsigned long *heads, unsigned long *sectors)
index 558034d373ed71f88ecba06bebcdbcbaeda4f7ce..2d85e40b9d881373103d590fa765a633b11799f3 100644 (file)
@@ -1,7 +1,7 @@
 /* bios.c - implement C part of low-level BIOS disk input and output */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2003  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2003,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 \f
 /* These are defined in asm.S, and never be used elsewhere, so declare the
    prototypes here.  */
-extern int biosdisk_int13_extensions (int ah, int drive, void *dap);
+extern int biosdisk_int13_extensions (int ax, int drive, void *dap);
 extern int biosdisk_standard (int ah, int drive,
                              int coff, int hoff, int soff,
                              int nsec, int segment);
 extern int check_int13_extensions (int drive);
-extern int get_diskinfo_int13_extensions (int drive, void *drp);
 extern int get_diskinfo_standard (int drive,
                                  unsigned long *cylinders,
                                  unsigned long *heads,
@@ -61,7 +60,7 @@ biosdisk (int read, int drive, struct geometry *geometry,
        unsigned short blocks;
        unsigned long buffer;
        unsigned long long block;
-      } dap;
+      } __attribute__ ((packed)) dap;
 
       /* XXX: Don't check the geometry by default, because some buggy
         BIOSes don't return the number of total sectors correctly,
@@ -81,12 +80,15 @@ biosdisk (int read, int drive, struct geometry *geometry,
         SEGMENT:ADDRESS.  */
       dap.buffer = segment << 16;
       
-      err = biosdisk_int13_extensions (read + 0x42, drive, &dap);
+      err = biosdisk_int13_extensions ((read + 0x42) << 8, drive, &dap);
 
 /* #undef NO_INT13_FALLBACK */
 #ifndef NO_INT13_FALLBACK
       if (err)
        {
+         if (geometry->flags & BIOSDISK_FLAG_CDROM)
+           return err;
+         
          geometry->flags &= ~BIOSDISK_FLAG_LBA_EXTENSION;
          geometry->total_sectors = (geometry->cylinders
                                     * geometry->heads
@@ -119,6 +121,63 @@ biosdisk (int read, int drive, struct geometry *geometry,
   return err;
 }
 
+/* Check bootable CD-ROM emulation status.  */
+static int
+get_cdinfo (int drive, struct geometry *geometry)
+{
+  int err;
+  struct iso_spec_packet
+  {
+    unsigned char size;
+    unsigned char media_type;
+    unsigned char drive_no;
+    unsigned char controller_no;
+    unsigned long image_lba;
+    unsigned short device_spec;
+    unsigned short cache_seg;
+    unsigned short load_seg;
+    unsigned short length_sec512;
+    unsigned char cylinders;
+    unsigned char sectors;
+    unsigned char heads;
+    
+    unsigned char dummy[16];
+  } __attribute__ ((packed)) cdrp;
+  
+  grub_memset (&cdrp, 0, sizeof (cdrp));
+  cdrp.size = sizeof (cdrp) - sizeof (cdrp.dummy);
+  err = biosdisk_int13_extensions (0x4B01, drive, &cdrp);
+  if (! err && cdrp.drive_no == drive)
+    {
+      if ((cdrp.media_type & 0x0F) == 0)
+        {
+          /* No emulation bootable CD-ROM */
+          geometry->flags = BIOSDISK_FLAG_LBA_EXTENSION | BIOSDISK_FLAG_CDROM;
+          geometry->cylinders = 0;
+          geometry->heads = 1;
+          geometry->sectors = 15;
+          geometry->sector_size = 2048;
+          geometry->total_sectors = MAXINT;
+          return 1;
+        }
+      else
+        {
+         /* Floppy or hard-disk emulation */
+          geometry->cylinders
+           = ((unsigned int) cdrp.cylinders
+              + (((unsigned int) (cdrp.sectors & 0xC0)) << 2));
+          geometry->heads = cdrp.heads;
+          geometry->sectors = cdrp.sectors & 0x3F;
+          geometry->sector_size = SECTOR_SIZE;
+          geometry->total_sectors = (geometry->cylinders
+                                    * geometry->heads
+                                    * geometry->sectors);
+          return -1;
+        }
+    }
+  return 0;
+}
+
 /* Return the geometry of DRIVE in GEOMETRY. If an error occurs, return
    non-zero, otherwise zero.  */
 int
@@ -131,11 +190,19 @@ get_diskinfo (int drive, struct geometry *geometry)
   
   if (drive & 0x80)
     {
-      /* hard disk */
+      /* hard disk or CD-ROM */
       int version;
       unsigned long total_sectors = 0;
       
       version = check_int13_extensions (drive);
+
+      if (drive >= 0x88 || version)
+       {
+         /* Possible CD-ROM - check the status.  */
+         if (get_cdinfo (drive, geometry))
+           return 0;
+       }
+      
       if (version)
        {
          struct drive_parameters
@@ -177,7 +244,7 @@ get_diskinfo (int drive, struct geometry *geometry)
             bytes. */
          drp.size = sizeof (drp) - sizeof (drp.dummy);
          
-         err = get_diskinfo_int13_extensions (drive, &drp);
+         err = biosdisk_int13_extensions (0x4800, drive, &drp);
          if (! err)
            {
              /* Set the LBA flag.  */
@@ -216,6 +283,7 @@ get_diskinfo (int drive, struct geometry *geometry)
                           * geometry->sectors);
        }
       geometry->total_sectors = total_sectors;
+      geometry->sector_size = SECTOR_SIZE;
     }
   else
     {
@@ -242,6 +310,7 @@ get_diskinfo (int drive, struct geometry *geometry)
       geometry->total_sectors = (geometry->cylinders
                                 * geometry->heads
                                 * geometry->sectors);
+      geometry->sector_size = SECTOR_SIZE;
     }
 
   return 0;
index ca8e4e4a73c48568d456dd7ef03302dd834b6728..9abacb2726a6541289aac88f78feee1a13371767 100644 (file)
@@ -1720,7 +1720,7 @@ install_func (char *arg, int flags)
   /* XXX: Probably SECTOR_SIZE is reasonable.  */
   char *config_filename = stage2_second_buffer + SECTOR_SIZE;
   char *dummy = config_filename + SECTOR_SIZE;
-  int new_drive = 0xFF;
+  int new_drive = GRUB_INVALID_DRIVE;
   int dest_drive, dest_partition, dest_sector;
   int src_drive, src_partition, src_part_start;
   int i;
@@ -2051,7 +2051,7 @@ install_func (char *arg, int flags)
              /* If the drive where the Stage 2 resides is the same as
                 the one where the Stage 1.5 resides, do not embed the
                 drive number.  */
-             current_drive = 0xFF;
+             current_drive = GRUB_INVALID_DRIVE;
            }
 
          device = (current_drive << 24) | current_partition;
@@ -3748,6 +3748,7 @@ setup_func (char *arg, int flags)
     {"ext2fs",   "/e2fs_stage1_5"},
     {"fat",      "/fat_stage1_5"},
     {"ffs",      "/ffs_stage1_5"},
+    {"iso9660",  "/iso9660_stage1_5"},
     {"jfs",      "/jfs_stage1_5"},
     {"minix",    "/minix_stage1_5"},
     {"reiserfs", "/reiserfs_stage1_5"},
index 307dd176deb61061831e5b97a31d97050c3a7c87..f07613ba80297456fc18a39afea86e3db54e9f9c 100644 (file)
@@ -1265,3 +1265,9 @@ grub_strcpy (char *dest, const char *src)
   return dest;
 }
 #endif /* ! STAGE1_5 */
+
+#ifndef GRUB_UTIL
+# undef memcpy
+/* GCC emits references to memcpy() for struct copies etc.  */
+void *memcpy (void *dest, const void *src, int n)  __attribute__ ((alias ("grub_memmove")));
+#endif
index 50529afbb862b9a410f606804183a5488fd5afba..d6ea1281cc6d940cff1999127ff57501d790b053 100644 (file)
@@ -1,7 +1,7 @@
 /* cmdline.c - the device-independent GRUB text command line */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -101,7 +101,7 @@ init_cmdline (void)
   /* Initialization.  */
   saved_drive = boot_drive;
   saved_partition = install_partition;
-  current_drive = 0xFF;
+  current_drive = GRUB_INVALID_DRIVE;
   errnum = 0;
   count_lines = -1;
   
index 2e047c94afb421b0a8e4c983b53fc22400a4b43c..09f9e31fda2da03612911cca2f9025c6a4638459 100644 (file)
@@ -1,7 +1,7 @@
 /* common.c - miscellaneous shared variables and routines */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -32,6 +32,7 @@
 struct multiboot_info mbi;
 unsigned long saved_drive;
 unsigned long saved_partition;
+unsigned long cdrom_drive;
 #ifndef STAGE1_5
 unsigned long saved_mem_upper;
 
@@ -319,6 +320,18 @@ init_bios_info (void)
   saved_drive = boot_drive;
   saved_partition = install_partition;
 
+  /* Set cdrom drive.  */
+  {
+    struct geometry geom;
+    
+    /* Get the geometry.  */
+    if (get_diskinfo (boot_drive, &geom)
+       || ! (geom.flags & BIOSDISK_FLAG_CDROM))
+      cdrom_drive = GRUB_INVALID_DRIVE;
+    else
+      cdrom_drive = boot_drive;
+  }
+  
   /* Start main routine here.  */
   cmain ();
 }
index b75c18c4815da0cbed2ac0d6f2fd44ea96900abf..745f3f6600ded4fbf3ef9e9a99be16ae37568ca8 100644 (file)
@@ -1,7 +1,7 @@
 /* disk_io.c - implement abstract BIOS disk input and output */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002,2003  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -72,6 +72,9 @@ struct fsys_entry fsys_table[NUM_FSYS + 1] =
 # ifdef FSYS_XFS
   {"xfs", xfs_mount, xfs_read, xfs_dir, 0, 0},
 # endif
+#ifdef FSYS_ISO9660
+  { "iso9660", iso9660_mount, iso9660_read, iso9660_dir, 0, 0},
+#endif
   /* XX FFS should come last as it's superblock is commonly crossing tracks
      on floppies from track 1 to 2, while others only use 1.  */
 # ifdef FSYS_FFS
@@ -83,7 +86,7 @@ struct fsys_entry fsys_table[NUM_FSYS + 1] =
 
 /* These have the same format as "boot_drive" and "install_partition", but
    are meant to be working values. */
-unsigned long current_drive = 0xFF;
+unsigned long current_drive = GRUB_INVALID_DRIVE;
 unsigned long current_partition;
 
 #ifndef STAGE1_5
@@ -121,17 +124,28 @@ struct geometry buf_geom;
 int filepos;
 int filemax;
 
+static inline unsigned long
+log2 (unsigned long word)
+{
+  asm volatile ("bsfl %1,%0"
+               : "=r" (word)
+               : "r" (word));
+  return word;
+}
+
 int
 rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
 {
-  int slen = (byte_offset + byte_len + SECTOR_SIZE - 1) >> SECTOR_BITS;
+  int slen, sectors_per_vtrack;
+  int sector_size_bits = log2 (buf_geom.sector_size);
 
   if (byte_len <= 0)
     return 1;
 
   while (byte_len > 0 && !errnum)
     {
-      int soff, num_sect, bufaddr, track, size = byte_len;
+      int soff, num_sect, track, size = byte_len;
+      char *bufaddr;
 
       /*
        *  Check track buffer.  If it isn't valid or it is from the
@@ -146,6 +160,7 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
            }
          buf_drive = drive;
          buf_track = -1;
+         sector_size_bits = log2 (buf_geom.sector_size);
        }
 
       /* Make sure that SECTOR is valid.  */
@@ -155,15 +170,25 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
          return 0;
        }
       
-      /*  Get first sector of track  */
-      soff = sector % buf_geom.sectors;
+      slen = ((byte_offset + byte_len + buf_geom.sector_size - 1)
+             >> sector_size_bits);
+      
+      /* Eliminate a buffer overflow.  */
+      if ((buf_geom.sectors << sector_size_bits) > BUFFERLEN)
+       sectors_per_vtrack = (BUFFERLEN >> sector_size_bits);
+      else
+       sectors_per_vtrack = buf_geom.sectors;
+      
+      /* Get the first sector of track.  */
+      soff = sector % sectors_per_vtrack;
       track = sector - soff;
-      num_sect = buf_geom.sectors - soff;
-      bufaddr = BUFFERADDR + (soff * SECTOR_SIZE) + byte_offset;
+      num_sect = sectors_per_vtrack - soff;
+      bufaddr = ((char *) BUFFERADDR
+                + (soff << sector_size_bits) + byte_offset);
 
       if (track != buf_track)
        {
-         int bios_err, read_start = track, read_len = buf_geom.sectors;
+         int bios_err, read_start = track, read_len = sectors_per_vtrack;
 
          /*
           *  If there's more than one read in this entire loop, then
@@ -174,7 +199,7 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
            {
              read_start = sector;
              read_len = num_sect;
-             bufaddr = BUFFERADDR + byte_offset;
+             bufaddr = (char *) BUFFERADDR + byte_offset;
            }
 
          bios_err = biosdisk (BIOSDISK_READ, drive, &buf_geom,
@@ -196,7 +221,7 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
                                   sector, slen, BUFFERSEG))
                    errnum = ERR_READ;
 
-                 bufaddr = BUFFERADDR + byte_offset;
+                 bufaddr = (char *) BUFFERADDR + byte_offset;
                }
            }
          else
@@ -213,7 +238,8 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
                {
                  /* We already read the sector 1, copy it to sector 0 */
                  memmove ((char *) BUFFERADDR, 
-                          (char *) BUFFERADDR + SECTOR_SIZE, SECTOR_SIZE);
+                          (char *) BUFFERADDR + buf_geom.sector_size,
+                          buf_geom.sector_size);
                }
              else
                {
@@ -224,8 +250,8 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
            }
        }
          
-      if (size > ((num_sect * SECTOR_SIZE) - byte_offset))
-       size = (num_sect * SECTOR_SIZE) - byte_offset;
+      if (size > ((num_sect << sector_size_bits) - byte_offset))
+       size = (num_sect << sector_size_bits) - byte_offset;
 
       /*
        *  Instrumentation to tell which sectors were read and used.
@@ -233,28 +259,27 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
       if (disk_read_func)
        {
          int sector_num = sector;
-         int length = SECTOR_SIZE - byte_offset;
+         int length = buf_geom.sector_size - byte_offset;
          if (length > size)
            length = size;
          (*disk_read_func) (sector_num++, byte_offset, length);
          length = size - length;
          if (length > 0)
            {
-             while (length > SECTOR_SIZE)
+             while (length > buf_geom.sector_size)
                {
-                 (*disk_read_func) (sector_num++, 0, SECTOR_SIZE);
-                 length -= SECTOR_SIZE;
+                 (*disk_read_func) (sector_num++, 0, buf_geom.sector_size);
+                 length -= buf_geom.sector_size;
                }
              (*disk_read_func) (sector_num, 0, length);
            }
        }
 
-      memmove (buf, (char *) bufaddr, size);
+      grub_memmove (buf, bufaddr, size);
 
       buf += size;
       byte_len -= size;
       sector += num_sect;
-      slen -= num_sect;
       byte_offset = 0;
     }
 
@@ -371,7 +396,8 @@ sane_partition (void)
     return 1;
   
   if (!(current_partition & 0xFF000000uL)
-      && (current_drive & 0xFFFFFF7F) < 8
+      && ((current_drive & 0xFFFFFF7F) < 8
+         || current_drive == cdrom_drive)
       && (current_partition & 0xFF) == 0xFF
       && ((current_partition & 0xFF00) == 0xFF00
          || (current_partition & 0xFF00) < 0x800)
@@ -918,8 +944,8 @@ set_device (char *device)
   int drive = (dev >> 24) & 0xFF;
   int partition = dev & 0xFFFFFF;
 
-  /* If DRIVE is disabled (0xFF), use SAVED_DRIVE instead.  */
-  if (drive == 0xFF)
+  /* If DRIVE is disabled, use SAVED_DRIVE instead.  */
+  if (drive == GRUB_INVALID_DRIVE)
     current_drive = saved_drive;
   else
     current_drive = drive;
@@ -949,10 +975,12 @@ set_device (char *device)
        {
          char ch = *device;
 #ifdef SUPPORT_NETBOOT
-         if (*device == 'f' || *device == 'h' ||
-             (*device == 'n' && network_ready))
+         if (*device == 'f' || *device == 'h'
+             || (*device == 'n' && network_ready)
+             || (*device == 'c' && cdrom_drive != GRUB_INVALID_DRIVE))
 #else
-         if (*device == 'f' || *device == 'h')
+         if (*device == 'f' || *device == 'h'
+             || (*device == 'c' && cdrom_drive != GRUB_INVALID_DRIVE))
 #endif /* SUPPORT_NETBOOT */
            {
              /* user has given '([fhn]', check for resp. add 'd' and
@@ -968,26 +996,31 @@ set_device (char *device)
                return device + 2;
            }
 
+         if ((*device == 'f'
+              || *device == 'h'
 #ifdef SUPPORT_NETBOOT
-         if ((*device == 'f' || *device == 'h' ||
-              (*device == 'n' && network_ready))
-#else
-         if ((*device == 'f' || *device == 'h')
-#endif /* SUPPORT_NETBOOT */
+              || (*device == 'n' && network_ready)
+#endif
+              || (*device == 'c' && cdrom_drive != GRUB_INVALID_DRIVE))
              && (device += 2, (*(device - 1) != 'd')))
            errnum = ERR_NUMBER_PARSING;
-
+         
 #ifdef SUPPORT_NETBOOT
          if (ch == 'n' && network_ready)
            current_drive = NETWORK_DRIVE;
          else
 #endif /* SUPPORT_NETBOOT */
            {
-             safe_parse_maxint (&device, (int *) &current_drive);
-             
-             disk_choice = 0;
-             if (ch == 'h')
-               current_drive += 0x80;
+             if (*device == 'c' && cdrom_drive != GRUB_INVALID_DRIVE)
+               current_drive = cdrom_drive;
+             else
+               {
+                 safe_parse_maxint (&device, (int *) &current_drive);
+                 
+                 disk_choice = 0;
+                 if (ch == 'h')
+                   current_drive += 0x80;
+               }
            }
        }
 
@@ -1145,7 +1178,7 @@ setup_part (char *filename)
 
   if (! (filename = set_device (filename)))
     {
-      current_drive = 0xFF;
+      current_drive = GRUB_INVALID_DRIVE;
       return 0;
     }
   
@@ -1162,7 +1195,7 @@ setup_part (char *filename)
     {
       if ((filename = set_device (filename)) == 0)
        {
-         current_drive = 0xFF;
+         current_drive = GRUB_INVALID_DRIVE;
          return 0;
        }
 # ifndef NO_BLOCK_FILES
@@ -1337,9 +1370,12 @@ print_completions (int is_filename, int is_completion)
              if (! is_completion)
                grub_printf (" Possible disks are: ");
 
+             if (!ptr
+                 || *(ptr-1) != 'd'
 #ifdef SUPPORT_NETBOOT
-             if (!ptr || *(ptr-1) != 'd' || *(ptr-2) != 'n')
+                 || *(ptr-2) != 'n'
 #endif /* SUPPORT_NETBOOT */
+                 || *(ptr-2) != 'c')
                {
                  for (i = (ptr && (*(ptr-1) == 'd' && *(ptr-2) == 'h') ? 1:0);
                       i < (ptr && (*(ptr-1) == 'd' && *(ptr-2) == 'f') ? 1:2);
@@ -1359,11 +1395,20 @@ print_completions (int is_filename, int is_completion)
                        }
                    }
                }
+
+             if (cdrom_drive != GRUB_INVALID_DRIVE
+                 && (disk_choice || cdrom_drive == current_drive)
+                 && (!ptr
+                     || *(ptr-1) == '('
+                     || (*(ptr-1) == 'd' && *(ptr-2) == 'c')))
+               print_a_completion ("cd");
+
 # ifdef SUPPORT_NETBOOT
-             if (network_ready &&
-                 (disk_choice || NETWORK_DRIVE == current_drive) &&
-                 (!ptr || *(ptr-1) == '(' ||
-                  (*(ptr-1) == 'd' && *(ptr-2) == 'n')))
+             if (network_ready
+                 && (disk_choice || NETWORK_DRIVE == current_drive)
+                 && (!ptr
+                     || *(ptr-1) == '('
+                     || (*(ptr-1) == 'd' && *(ptr-2) == 'n')))
                print_a_completion ("nd");
 # endif /* SUPPORT_NETBOOT */
 
index c9fbd1e7c561e7393e7ef8af833f7f0e35ba2470..801b3deffd79fcbb6c2413a9ef72e9509bb27cdc 100644 (file)
@@ -1,7 +1,7 @@
 /* filesys.h - abstract filesystem interface */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999, 2000, 2001  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -105,11 +105,20 @@ void tftp_close (void);
 #define FSYS_TFTP_NUM 0
 #endif
 
+#ifdef FSYS_ISO9660
+#define FSYS_ISO9660_NUM 1
+int iso9660_mount (void);
+int iso9660_read (char *buf, int len);
+int iso9660_dir (char *dirname);
+#else
+#define FSYS_ISO9660_NUM 0
+#endif
+
 #ifndef NUM_FSYS
 #define NUM_FSYS       \
   (FSYS_FFS_NUM + FSYS_FAT_NUM + FSYS_EXT2FS_NUM + FSYS_MINIX_NUM      \
    + FSYS_REISERFS_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM + FSYS_XFS_NUM \
-   + FSYS_TFTP_NUM)
+   + FSYS_TFTP_NUM + FSYS_ISO9660_NUM)
 #endif
 
 /* defines for the block filesystem info area */
diff --git a/stage2/fsys_iso9660.c b/stage2/fsys_iso9660.c
new file mode 100644 (file)
index 0000000..d83feed
--- /dev/null
@@ -0,0 +1,442 @@
+/*
+ *  ISO 9660 filesystem backend for GRUB (GRand Unified Bootloader)
+ *  including Rock Ridge Extensions support
+ *
+ *  Copyright (C) 1998, 1999  Kousuke Takai  <tak@kmc.kyoto-u.ac.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ *  References:
+ *     linux/fs/isofs/rock.[ch]
+ *     mkisofs-1.11.1/diag/isoinfo.c
+ *     mkisofs-1.11.1/iso9660.h
+ *             (all are written by Eric Youngdale)
+ *
+ *  Modifications by:
+ *     Leonid Lisovskiy   <lly@pisem.net>      2003
+ */
+
+#ifdef FSYS_ISO9660
+
+#include "shared.h"
+#include "filesys.h"
+#include "iso9660.h"
+
+/* iso9660 super-block data in memory */
+struct iso_sb_info {
+  unsigned long vol_sector;
+
+};
+
+/* iso fs inode data in memory */
+struct iso_inode_info {
+  unsigned long file_start;
+};
+
+#define ISO_SUPER      \
+    ((struct iso_sb_info *)(FSYS_BUF))
+#define INODE          \
+    ((struct iso_inode_info *)(FSYS_BUF+sizeof(struct iso_sb_info)))
+#define PRIMDESC        ((struct iso_primary_descriptor *)(FSYS_BUF + 2048))
+#define DIRREC          ((struct iso_directory_record *)(FSYS_BUF + 4096))
+#define RRCONT_BUF      ((unsigned char *)(FSYS_BUF + 6144))
+#define NAME_BUF        ((unsigned char *)(FSYS_BUF + 8192))
+
+
+static inline unsigned long
+log2 (unsigned long word)
+{
+  asm volatile ("bsfl %1,%0"
+               :          "=r" (word)
+               :          "r" (word));
+  return word;
+}
+
+static int
+iso9660_devread (int sector, int byte_offset, int byte_len, char *buf)
+{
+  unsigned short sector_size_lg2 = log2(buf_geom.sector_size);
+
+  /*
+   * We have to use own devread() function since BIOS return wrong geometry
+   */
+  if (sector < 0)
+    {
+      errnum = ERR_OUTSIDE_PART;
+      return 0;
+    }
+  if (byte_len <= 0)
+    return 1;
+
+  sector += (byte_offset >> sector_size_lg2);
+  byte_offset &= (buf_geom.sector_size - 1);
+  asm volatile ("shl%L0 %1,%0"
+               : "=r"(sector)
+               : "Ic"((int8_t)(ISO_SECTOR_BITS - sector_size_lg2)),
+               "0"(sector));
+
+#if !defined(STAGE1_5)
+  if (disk_read_hook && debug)
+    printf ("<%d, %d, %d>", sector, byte_offset, byte_len);
+#endif /* !STAGE1_5 */
+
+  return rawread(current_drive, part_start + sector, byte_offset, byte_len, buf);
+}
+
+int
+iso9660_mount (void)
+{
+  unsigned int sector;
+
+  /*
+   *  Because there is no defined slice type ID for ISO-9660 filesystem,
+   *  this test will pass only either (1) if entire disk is used, or
+   *  (2) if current partition is BSD style sub-partition whose ID is
+   *  ISO-9660.
+   */
+  if ((current_partition != 0xFFFFFF)
+      && !IS_PC_SLICE_TYPE_BSD_WITH_FS(current_slice, FS_ISO9660))
+    return 0;
+
+  /*
+   *  Currently, only FIRST session of MultiSession disks are supported !!!
+   */
+  for (sector = 16 ; sector < 32 ; sector++)
+    {
+      if (!iso9660_devread(sector, 0, sizeof(*PRIMDESC), (char *)PRIMDESC)) 
+       break;
+      /* check ISO_VD_PRIMARY and ISO_STANDARD_ID */
+      if (PRIMDESC->type.l == ISO_VD_PRIMARY
+         && !__builtin_memcmp(PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id)))
+       {
+         ISO_SUPER->vol_sector = sector;
+         INODE->file_start = 0;
+         fsmax = PRIMDESC->volume_space_size.l;
+         return 1;
+       }
+    }
+
+  return 0;
+}
+
+int
+iso9660_dir (char *dirname)
+{
+  struct iso_directory_record *idr;
+  RR_ptr_t rr_ptr;
+  struct rock_ridge *ce_ptr;
+  unsigned int pathlen;
+  int size;
+  unsigned int extent;
+  unsigned char file_type;
+  unsigned int rr_len;
+  unsigned char rr_flag;
+
+  idr = &PRIMDESC->root_directory_record;
+  INODE->file_start = 0;
+
+  do
+    {
+      while (*dirname == '/')  /* skip leading slashes */
+       dirname++;
+      /* pathlen = strcspn(dirname, "/\n\t "); */
+      for (pathlen = 0 ;
+          dirname[pathlen]
+            && !isspace(dirname[pathlen]) && dirname[pathlen] != '/' ;
+          pathlen++)
+       ;
+
+      size = idr->size.l;
+      extent = idr->extent.l;
+
+      while (size > 0)
+       {
+         if (!iso9660_devread(extent, 0, ISO_SECTOR_SIZE, (char *)DIRREC))
+           {
+             errnum = ERR_FSYS_CORRUPT;
+             return 0;
+           }
+         extent++;
+
+         idr = (struct iso_directory_record *)DIRREC;
+         for (; idr->length.l > 0;
+              idr = (struct iso_directory_record *)((char *)idr + idr->length.l) )
+           {
+             const char *name = idr->name;
+             unsigned int name_len = idr->name_len.l;
+
+             file_type = (idr->flags.l & 2) ? ISO_DIRECTORY : ISO_REGULAR;
+             if (name_len == 1)
+               {
+                 if ((name[0] == 0) || /* self */
+                     (name[0] == 1))   /* parent */
+                   continue;
+               }
+             if (name_len > 2 && CHECK2(name + name_len - 2, ';', '1'))
+               {
+                 name_len -= 2;        /* truncate trailing file version */
+                 if (name_len > 1 && name[name_len - 1] == '.')
+                   name_len--;         /* truncate trailing dot */
+               }
+
+             /*
+              *  Parse Rock-Ridge extension
+              */
+             rr_len = (idr->length.l - idr->name_len.l
+                       - sizeof(struct iso_directory_record)
+                       + sizeof(idr->name));
+             rr_ptr.ptr = ((unsigned char *)idr + idr->name_len.l
+                           + sizeof(struct iso_directory_record)
+                           - sizeof(idr->name));
+             if (rr_ptr.i & 1)
+               rr_ptr.i++, rr_len--;
+             ce_ptr = NULL;
+             rr_flag = RR_FLAG_NM | RR_FLAG_PX /*| RR_FLAG_SL*/;
+
+             while (rr_len >= 4)
+               {
+                 if (rr_ptr.rr->version != 1)
+                   {
+#ifndef STAGE1_5
+                     if (debug)
+                       printf(
+                              "Non-supported version (%d) RockRidge chunk "
+                              "`%c%c'\n", rr_ptr.rr->version,
+                              rr_ptr.rr->signature & 0xFF,
+                              rr_ptr.rr->signature >> 8);
+#endif
+                   }
+                 else
+                   {
+                     switch (rr_ptr.rr->signature)
+                       {
+                       case RRMAGIC('R', 'R'):
+                         if ( rr_ptr.rr->len >= (4+sizeof(struct RR)))
+                           rr_flag &= rr_ptr.rr->u.rr.flags.l;
+                         break;
+                       case RRMAGIC('N', 'M'):
+                         name = rr_ptr.rr->u.nm.name;
+                         name_len = rr_ptr.rr->len - (4+sizeof(struct NM));
+                         rr_flag &= ~RR_FLAG_NM;
+                         break;
+                       case RRMAGIC('P', 'X'):
+                         if (rr_ptr.rr->len >= (4+sizeof(struct PX)))
+                           {
+                             file_type = ((rr_ptr.rr->u.px.mode.l & POSIX_S_IFMT)
+                                          == POSIX_S_IFREG
+                                          ? ISO_REGULAR
+                                          : ((rr_ptr.rr->u.px.mode.l & POSIX_S_IFMT)
+                                             == POSIX_S_IFDIR
+                                             ? ISO_DIRECTORY : ISO_OTHER));
+                             rr_flag &= ~RR_FLAG_PX;
+                           }
+                         break;
+                       case RRMAGIC('C', 'E'):
+                         if (rr_ptr.rr->len >= (4+sizeof(struct CE)))
+                           ce_ptr = rr_ptr.rr;
+                         break;
+#if 0          // RockRidge symlinks are not supported yet
+                       case RRMAGIC('S', 'L'):
+                         {
+                           int slen;
+                           unsigned char rootflag, prevflag;
+                           char *rpnt = NAME_BUF+1024;
+                           struct SL_component *slp;
+
+                           slen = rr_ptr.rr->len - (4+1);
+                           slp = &rr_ptr.rr->u.sl.link;
+                           while (slen > 1)
+                             {
+                               rootflag = 0;
+                               switch (slp->flags.l)
+                                 {
+                                 case 0:
+                                   memcpy(rpnt, slp->text, slp->len);
+                                   rpnt += slp->len;
+                                   break;
+                                 case 4:
+                                   *rpnt++ = '.';
+                                   /* fallthru */
+                                 case 2:
+                                   *rpnt++ = '.';
+                                   break;
+                                 case 8:
+                                   rootflag = 1;
+                                   *rpnt++ = '/';
+                                   break;
+                                 default:
+                                   printf("Symlink component flag not implemented (%d)\n",
+                                          slp->flags.l);
+                                   slen = 0;
+                                   break;
+                                 }
+                               slen -= slp->len + 2;
+                               prevflag = slp->flags.l;
+                               slp = (struct SL_component *) ((char *) slp + slp->len + 2);
+
+                               if (slen < 2)
+                                 {
+                                   /*
+                                    * If there is another SL record, and this component
+                                    * record isn't continued, then add a slash.
+                                    */
+                                   if ((!rootflag) && (rr_ptr.rr->u.sl.flags.l & 1) && !(prevflag & 1))
+                                     *rpnt++='/';
+                                   break;
+                                 }
+
+                               /*
+                                * If this component record isn't continued, then append a '/'.
+                                */
+                               if (!rootflag && !(prevflag & 1))
+                                 *rpnt++ = '/';
+                             }
+                           *rpnt++ = '\0';
+                           grub_putstr(NAME_BUF+1024);// debug print!
+                         }
+                         rr_flag &= ~RR_FLAG_SL;
+                         break;
+#endif
+                       default:
+                         break;
+                       }
+                   }
+                 if (!rr_flag)
+                   /*
+                    * There is no more extension we expects...
+                    */
+                   break;
+
+                 rr_len -= rr_ptr.rr->len;
+                 rr_ptr.ptr += rr_ptr.rr->len;
+                 if (rr_len < 4 && ce_ptr != NULL)
+                   {
+                     /* preserve name before loading new extent. */
+                     if( RRCONT_BUF <= (unsigned char *)name
+                         && (unsigned char *)name < RRCONT_BUF + ISO_SECTOR_SIZE )
+                       {
+                         memcpy(NAME_BUF, name, name_len);
+                         name = NAME_BUF;
+                       }
+                     rr_ptr.ptr = RRCONT_BUF + ce_ptr->u.ce.offset.l;
+                     rr_len = ce_ptr->u.ce.size.l;
+                     if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, RRCONT_BUF))
+                       {
+                         errnum = 0;   /* this is not fatal. */
+                         break;
+                       }
+                     ce_ptr = NULL;
+                   }
+               } /* rr_len >= 4 */
+
+             filemax = MAXINT;
+             if (name_len >= pathlen
+                 && !__builtin_memcmp(name, dirname, pathlen))
+               {
+                 if (dirname[pathlen] == '/' || !print_possibilities)
+                   {
+                     /*
+                      *  DIRNAME is directory component of pathname,
+                      *  or we are to open a file.
+                      */
+                     if (pathlen == name_len)
+                       {
+                         if (dirname[pathlen] == '/')
+                           {
+                             if (file_type != ISO_DIRECTORY)
+                               {
+                                 errnum = ERR_BAD_FILETYPE;
+                                 return 0;
+                               }
+                             goto next_dir_level;
+                           }
+                         if (file_type != ISO_REGULAR)
+                           {
+                             errnum = ERR_BAD_FILETYPE;
+                             return 0;
+                           }
+                         INODE->file_start = idr->extent.l;
+                         filepos = 0;
+                         filemax = idr->size.l;
+                         return 1;
+                       }
+                   }
+                 else  /* Completion */
+                   {
+#ifndef STAGE1_5
+                     if (print_possibilities > 0)
+                       print_possibilities = -print_possibilities;
+                     memcpy(NAME_BUF, name, name_len);
+                     NAME_BUF[name_len] = '\0';
+                     print_a_completion (NAME_BUF);
+#endif
+                   }
+               }
+           } /* for */
+
+         size -= ISO_SECTOR_SIZE;
+       } /* size>0 */
+
+      if (dirname[pathlen] == '/' || print_possibilities >= 0)
+       {
+         errnum = ERR_FILE_NOT_FOUND;
+         return 0;
+       }
+
+    next_dir_level:
+      dirname += pathlen;
+
+    } while (*dirname == '/');
+
+  return 1;
+}
+
+int
+iso9660_read (char *buf, int len)
+{
+  int sector, blkoffset, size, ret;
+
+  if (INODE->file_start == 0)
+    return 0;
+
+  ret = 0;
+  blkoffset = filepos & (ISO_SECTOR_SIZE - 1);
+  sector = filepos >> ISO_SECTOR_BITS;
+  while (len > 0)
+    {
+      size = ISO_SECTOR_SIZE - blkoffset;
+      if (size > len)
+        size = len;
+
+      disk_read_func = disk_read_hook;
+
+      if (!iso9660_devread(INODE->file_start + sector, blkoffset, size, buf))
+       return 0;
+
+      disk_read_func = NULL;
+
+      len -= size;
+      buf += size;
+      ret += size;
+      filepos += size;
+      sector++;
+      blkoffset = 0;
+    }
+
+  return ret;
+}
+
+#endif /* FSYS_ISO9660 */
diff --git a/stage2/iso9660.h b/stage2/iso9660.h
new file mode 100644 (file)
index 0000000..4a6a8cc
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ *  ISO 9660 filesystem backend for GRUB (GRand Unified Bootloader)
+ *  including Rock Ridge Extensions support
+ *
+ *  Copyright (C) 1998, 1999  Kousuke Takai  <tak@kmc.kyoto-u.ac.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ *  References:
+ *     linux/fs/isofs/rock.[ch]
+ *     mkisofs-1.11.1/diag/isoinfo.c
+ *     mkisofs-1.11.1/iso9660.h
+ *             (all are written by Eric Youngdale)
+ */
+
+#ifndef _ISO9660_H_
+#define _ISO9660_H_
+
+#define ISO_SECTOR_BITS              (11)
+#define ISO_SECTOR_SIZE              (1<<ISO_SECTOR_BITS)
+
+#define        ISO_REGULAR     1       /* regular file */
+#define        ISO_DIRECTORY   2       /* directory    */
+#define        ISO_OTHER       0       /* other file (with Rock Ridge) */
+
+#define        RR_FLAG_PX      0x01    /* have POSIX file attributes */
+#define RR_FLAG_PN     0x02    /* POSIX devices */
+#define RR_FLAG_SL     0x04    /* Symbolic link */
+#define        RR_FLAG_NM      0x08    /* have alternate file name   */
+#define RR_FLAG_CL     0x10    /* Child link */
+#define RR_FLAG_PL     0x20    /* Parent link */
+#define RR_FLAG_RE     0x40    /* Relocation directory */
+#define RR_FLAG_TF     0x80    /* Timestamps */
+
+/* POSIX file attributes for Rock Ridge extensions */
+#define        POSIX_S_IFMT    0xF000
+#define        POSIX_S_IFREG   0x8000
+#define        POSIX_S_IFDIR   0x4000
+
+/* volume descriptor types */
+#define ISO_VD_PRIMARY 1
+#define ISO_VD_END 255
+
+#define ISO_STANDARD_ID "CD001"
+
+#ifndef ASM_FILE
+
+#ifndef        __BIT_TYPES_DEFINED__
+typedef                 int     int8_t __attribute__((mode(QI)));
+typedef unsigned int   u_int8_t        __attribute__((mode(QI)));
+typedef                 int    int16_t __attribute__((mode(HI)));
+typedef unsigned int  u_int16_t        __attribute__((mode(HI)));
+typedef                 int    int32_t __attribute__((mode(SI)));
+typedef unsigned int  u_int32_t        __attribute__((mode(SI)));
+#endif
+
+typedef        union {
+  u_int8_t l,b;
+}      iso_8bit_t;
+
+typedef        struct __iso_16bit {
+  u_int16_t l, b;
+} iso_16bit_t __attribute__ ((packed));
+
+typedef        struct __iso_32bit {
+  u_int32_t l, b;
+} iso_32bit_t __attribute__ ((packed));
+
+typedef u_int8_t               iso_date_t[7];
+
+struct iso_directory_record {
+  iso_8bit_t   length;
+  iso_8bit_t   ext_attr_length;
+  iso_32bit_t  extent;
+  iso_32bit_t  size;
+  iso_date_t   date;
+  iso_8bit_t   flags;
+  iso_8bit_t   file_unit_size;
+  iso_8bit_t   interleave;
+  iso_16bit_t  volume_seq_number;
+  iso_8bit_t   name_len;
+  u_int8_t     name[1];
+} __attribute__ ((packed));
+
+struct iso_primary_descriptor {
+  iso_8bit_t   type;
+  u_int8_t     id[5];
+  iso_8bit_t   version;
+  u_int8_t     _unused1[1];
+  u_int8_t     system_id[32];
+  u_int8_t     volume_id[32];
+  u_int8_t     _unused2[8];
+  iso_32bit_t  volume_space_size;
+  u_int8_t     _unused3[32];
+  iso_16bit_t  volume_set_size;
+  iso_16bit_t  volume_seq_number;
+  iso_16bit_t  logical_block_size;
+  iso_32bit_t  path_table_size;
+  u_int8_t     type_l_path_table[4];
+  u_int8_t     opt_type_l_path_table[4];
+  u_int8_t     type_m_path_table[4];
+  u_int8_t     opt_type_m_path_table[4];
+  struct iso_directory_record root_directory_record;
+  u_int8_t     volume_set_id[128];
+  u_int8_t     publisher_id[128];
+  u_int8_t     preparer_id[128];
+  u_int8_t     application_id[128];
+  u_int8_t     copyright_file_id[37];
+  u_int8_t     abstract_file_id[37];
+  u_int8_t     bibliographic_file_id[37];
+  u_int8_t     creation_date[17];
+  u_int8_t     modification_date[17];
+  u_int8_t     expiration_date[17];
+  u_int8_t     effective_date[17];
+  iso_8bit_t   file_structure_version;
+  u_int8_t     _unused4[1];
+  u_int8_t     application_data[512];
+  u_int8_t     _unused5[653];
+} __attribute__ ((packed));
+
+struct rock_ridge {
+  u_int16_t    signature;
+  u_int8_t     len;
+  u_int8_t     version;
+  union {
+    struct SP {
+      u_int16_t        magic;
+      u_int8_t skip;
+    } sp;
+    struct CE {
+      iso_32bit_t      extent;
+      iso_32bit_t      offset;
+      iso_32bit_t      size;
+    } ce;
+    struct ER {
+      u_int8_t len_id;
+      u_int8_t len_des;
+      u_int8_t len_src;
+      u_int8_t ext_ver;
+      u_int8_t data[0];
+    } er;
+    struct RR {
+      iso_8bit_t       flags;
+    } rr;
+    struct PX {
+      iso_32bit_t      mode;
+      iso_32bit_t      nlink;
+      iso_32bit_t      uid;
+      iso_32bit_t      gid;
+    } px;
+    struct PN {
+      iso_32bit_t      dev_high;
+      iso_32bit_t      dev_low;
+    } pn;
+    struct SL {
+      iso_8bit_t flags;
+      struct SL_component {
+       iso_8bit_t      flags;
+       u_int8_t                len;
+       u_int8_t                text[0];
+      } link;
+    } sl;
+    struct NM {
+      iso_8bit_t       flags;
+      u_int8_t name[0];
+    } nm;
+    struct CL {
+      iso_32bit_t      location;
+    } cl;
+    struct PL {
+      iso_32bit_t      location;
+    } pl;
+    struct TF {
+      iso_8bit_t       flags;
+      iso_date_t       times[0];
+    } tf;
+  } u;
+} __attribute__ ((packed));
+
+typedef        union RR_ptr {
+  struct rock_ridge *rr;
+  char           *ptr;
+  int             i;
+} RR_ptr_t;
+
+#define        RRMAGIC(c1, c2) ((c1)|(c2) << 8)
+
+#define        CHECK2(ptr, c1, c2) \
+       (*(unsigned short *)(ptr) == (((c1) | (c2) << 8) & 0xFFFF))
+
+#endif /* !ASM_FILE */
+
+#endif /* _ISO9660_H_ */
index 3965c740badfd9d2dbf4f917a00377adc25aabfd..174a5fb72d5fff774c10670c8934f3ec8b6da7bd 100644 (file)
@@ -73,10 +73,11 @@ extern char *grub_scratch_mem;
 /*
  *  BIOS disk defines
  */
-#define BIOSDISK_READ              0x0
-#define BIOSDISK_WRITE             0x1
-#define BIOSDISK_ERROR_GEOMETRY     0x100
-#define BIOSDISK_FLAG_LBA_EXTENSION 0x1
+#define BIOSDISK_READ                  0x0
+#define BIOSDISK_WRITE                 0x1
+#define BIOSDISK_ERROR_GEOMETRY                0x100
+#define BIOSDISK_FLAG_LBA_EXTENSION    0x1
+#define BIOSDISK_FLAG_CDROM            0x2
 
 /*
  *  This is the filesystem (not raw device) buffer.
@@ -205,6 +206,7 @@ extern char *grub_scratch_mem;
 #define STAGE2_ID_VSTAFS_STAGE1_5      6
 #define STAGE2_ID_JFS_STAGE1_5         7
 #define STAGE2_ID_XFS_STAGE1_5         8
+#define STAGE2_ID_ISO9660_STAGE1_5     9
 
 #ifndef STAGE1_5
 # define STAGE2_ID     STAGE2_ID_STAGE2
@@ -225,6 +227,8 @@ extern char *grub_scratch_mem;
 #  define STAGE2_ID    STAGE2_ID_JFS_STAGE1_5
 # elif defined(FSYS_XFS)
 #  define STAGE2_ID    STAGE2_ID_XFS_STAGE1_5
+# elif defined(FSYS_ISO9660)
+#  define STAGE2_ID    STAGE2_ID_ISO9660_STAGE1_5
 # else
 #  error "unknown Stage 2"
 # endif
@@ -634,6 +638,8 @@ struct geometry
   unsigned long sectors;
   /* The total number of sectors */
   unsigned long total_sectors;
+  /* Device sector size */
+  unsigned long sector_size;
   /* Flags */
   unsigned long flags;
 };
@@ -658,6 +664,7 @@ extern int filemax;
 extern struct multiboot_info mbi;
 extern unsigned long saved_drive;
 extern unsigned long saved_partition;
+extern unsigned long cdrom_drive;
 #ifndef STAGE1_5
 extern unsigned long saved_mem_upper;
 extern unsigned long extended_memory;
index fc51125bf4edc8319b42a54d218978dd2c68d5fb..cd497aa649cce4f939a62e42382a607118cd49db 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+ *  Copyright (C) 2000,2001,2002,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -661,7 +661,7 @@ restart:
 
                      saved_drive = boot_drive;
                      saved_partition = install_partition;
-                     current_drive = 0xFF;
+                     current_drive = GRUB_INVALID_DRIVE;
 
                      if (! get_cmdline (PACKAGE " edit> ", new_heap,
                                         NEW_HEAPSIZE + 1, 0, 1))
diff --git a/stage2/start_eltorito.S b/stage2/start_eltorito.S
new file mode 100644 (file)
index 0000000..99a7109
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 1994-2002  H. Peter Anvin
+ *  Copyright (C) 1999,2000,2001,2004  Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+       
+/*
+ Most of this file was originally "isolinux.asm" from SYSLINUX package.
+ It has been very heavily modified.
+*/
+
+#define ASM_FILE
+#include "stage1.h"
+#include "shared.h"
+#include "iso9660.h"
+
+#ifndef STAGE1_5
+#include "stage2_size.h"
+#endif
+
+
+       /* Absolute addresses
+          This makes the assembler generate the address without support
+          from the linker. (ELF can't relocate 16-bit addresses!) */
+#define ABS(x)                 (x-_start+BOOTSEC_LOCATION)
+
+#ifdef STAGE1_5
+# define STAGE_ADDR            0x2000
+#else
+# define STAGE_ADDR            0x8000
+#endif /* STAGE1_5 */
+
+       /* Print message string */
+#define MSG(x)                 mov $ABS(x), %si; call message;
+
+       .file   "start_eltorito.S"
+
+       .text
+
+       /* Tell GAS to generate 16-bit instructions so that this code works
+          in real mode. */
+       .code16
+
+       .globl  start, _start
+
+/*
+ * Primary entry point.         Because BIOSes are buggy, we only load the first
+ * CD-ROM sector (2K) of the file, so the number one priority is actually
+ * loading the rest.
+ */
+start:
+_start:
+       cli
+       ljmp    $0, $ABS(real_start)
+
+       . = _start + 8                      /* Pad to file offset 8 */
+
+               /* This table gets filled in by mkisofs using the
+                  -boot-info-table option */
+bi_pvd:                .long 0xDEADBEEF            /* LBA of primary volume descript */
+bi_file:       .long 0xDEADBEEF            /* LBA of boot file */
+bi_length:     .long 0xDEADBEEF            /* Length of boot file */
+bi_csum:       .long 0xDEADBEEF            /* Checksum of boot file */
+bi_reserved:   .space (10*4)               /* Reserved */
+
+real_start:
+       xor     %ax, %ax
+       mov     %ax, %ss
+       mov     %ax, %ds
+       mov     %ax, %es
+       mov     %ax, %fs
+       mov     %ax, %gs
+       mov     $STAGE1_STACKSEG, %sp       /* set up the REAL stack */
+       sti
+       cld
+
+       /* save drive reference first thing! */
+       mov     %dl, ABS(BootDrive)
+
+       /* print a notification message on the screen */
+       MSG(notification_string)
+
+load_image:
+       /* Set up boot file sector, size, load address */
+       mov     ABS(bi_length), %eax
+       add     $(ISO_SECTOR_SIZE-1), %eax
+       shr     $ISO_SECTOR_BITS, %eax      /* dwords->sectors */
+       mov     %ax, %bp                    /* boot file sectors */
+       mov     $(STAGE_ADDR >> 4), %bx
+       mov     %bx, %es
+       xor     %bx, %bx
+       mov     ABS(bi_file), %eax
+       call    getlinsec
+       mov     %ds, %ax
+       mov     %ax, %es
+
+       MSG(notification_done)
+bootit:
+       /* save the sector number of the second sector in %ebp */
+       mov     $ABS(firstlist - BOOTSEC_LISTSIZE), %si
+       mov     (%si), %ebp
+       mov     ABS(BootDrive), %dl         /* this makes sure %dl is our "boot" drive */
+       ljmp    $0, $(STAGE_ADDR+SECTOR_SIZE)  /* jump to main() in asm.S */
+
+/* go here when you need to stop the machine hard after an error condition */
+stop:  jmp     stop
+
+
+/*
+ * Get linear sectors - EBIOS LBA addressing, 2048-byte sectors.
+ *
+ * Note that we can't always do this as a single request, because at least
+ * Phoenix BIOSes has a 127-sector limit.  To be on the safe side, stick
+ * to 16 sectors (32K) per request.
+ *
+ * Input:
+ *      EAX     - Linear sector number
+ *      ES:BX   - Target buffer
+ *      BP      - Sector count
+ */
+getlinsec:
+       mov     $ABS(dapa), %si            /* Load up the DAPA */
+       mov     %bx, 4(%si)
+       mov     %es, %bx
+       mov     %bx, 6(%si)
+       mov     %eax, 8(%si)
+1:
+       push    %bp
+       push    %si
+       cmp     ABS(MaxTransfer), %bp
+       jbe     2f
+       mov     ABS(MaxTransfer), %bp
+2:
+       mov     %bp, 2(%si)
+       mov     ABS(BootDrive), %dl
+       mov     $0x42, %ah                  /* Extended Read */
+       call    xint13
+       pop     %si
+       pop     %bp
+       movzwl  2(%si), %eax                /* Sectors we read */
+       add     %eax, 8(%si)                /* Advance sector pointer */
+       sub     %ax, %bp                    /* Sectors left */
+       shl     $(ISO_SECTOR_BITS-4), %ax   /* 2048-byte sectors -> segment */
+       add     %ax, 6(%si)                 /* Advance buffer pointer */
+
+       pushal
+       MSG(notification_step)
+       popal
+       cmp     $0, %bp
+       ja      1b
+       mov     8(%si), %eax                /* Return next sector */
+       ret
+
+/*
+ * INT 13h with retry
+ */
+xint13:
+       movb    $6, ABS(RetryCount)
+       pushal
+.try:
+       int     $0x13
+       jc      1f
+       add     $(8*4), %sp                 /* Clean up stack */
+       ret
+1:
+       mov     %ah, %dl                    /* Save error code */
+       decb    ABS(RetryCount)
+       jz      .real_error
+       mov     ABS(RetryCount), %al
+       mov     ABS(dapa+2), %ah            /* Sector transfer count */
+       cmp     $2, %al                     /* Only 2 attempts left */
+       ja      2f
+       mov     $1, %ah                     /* Drop transfer size to 1 */
+       jmp     .setmaxtr
+2:
+       cmp     $3, %al
+       ja      3f                          /* First time, just try again */
+       shr     $1, %ah                     /* Otherwise, try to reduce */
+       adc     $0, %ah                     /* the max transfer size, but not */
+.setmaxtr:
+       mov     %ah, ABS(MaxTransfer)
+       mov     %ah, ABS(dapa+2)
+3:
+       popal
+       jmp     .try
+
+.real_error:
+       MSG(read_error_string)
+       mov     %dl, %al
+       call    printhex2
+       popal
+       jmp     stop
+
+
+
+/*
+ * message: write the string pointed to by %si
+ *
+ *   WARNING: trashes %si, %ax, and %bx
+ */
+
+       /*
+        * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
+        *      %ah = 0xe       %al = character
+        *      %bh = page      %bl = foreground color (graphics modes)
+        */
+1:
+       mov     $0x0001, %bx
+       mov     $0x0E, %ah
+       int     $0x10           /* display a byte */
+
+message:
+       lodsb
+       or      %al, %al
+       jne     1b              /* if not end of string, jmp to display */
+       ret
+
+/*
+ * printhex[248]: Write a hex number in (AL, AX, EAX) to the console
+ */
+printhex2:
+       pushal
+       rol     $24, %eax
+       mov     $2, %cx
+       jmp     1f
+printhex4:
+       pushal
+       rol     $16, %eax
+       mov     $4, %cx
+       jmp     1f
+printhex8:
+       pushal
+       mov     $8, %cx
+1:
+       rol     $4, %eax
+       push    %eax
+       and     $0x0F, %al
+       cmp     $10, %al
+       jae     .high
+.low:  add     $('0'), %al
+       jmp     2f
+.high: add     $('A'-10), %al
+2:
+       mov     $0x0001, %bx
+       mov     $0x0E, %ah
+       int     $0x10           /* display a char */
+       pop     %eax
+       loop    1b
+       popal
+       ret
+
+/**************************************************************************/
+#ifdef STAGE1_5
+notification_string:   .string "Loading stage1.5 "
+#else
+notification_string:   .string "Loading stage2 "
+#endif
+
+notification_step:     .string "."
+notification_done:     .string "\r\n"
+
+read_error_string:     .string "Read error 0x"
+
+/*
+ * EBIOS disk address packet
+ */
+               .align 8
+dapa:          .byte 16                   /* Packet size */
+               .byte 0                    /* reserved */
+               .word 0                    /* +2 Block count */
+               .word 0                    /* +4 Offset of buffer */
+               .word 0                    /* +6 Segment of buffer */
+               .long 0                    /* +8 LBA (LSW) */
+               .long 0                    /* +C LBA (MSW) */
+
+VARIABLE(BootDrive)
+       .byte 0xFF
+VARIABLE(MaxTransfer)
+       .word 16                           /* Max sectors per transfer (32Kb) */
+VARIABLE(RetryCount)
+       .byte 0
+
+
+/*
+ *  This area is an empty space between the main body of code below which
+ *  grows up (fixed after compilation, but between releases it may change
+ *  in size easily), and the lists of sectors to read, which grows down
+ *  from a fixed top location.
+ */
+
+       .word 0
+       .word 0
+
+       . = _start + SECTOR_SIZE - BOOTSEC_LISTSIZE
+
+       /* fill the first data listing with the default */
+blocklist_default_start:/* this is the sector start parameter, in logical
+                          sectors from the start of the disk, sector 0 */
+       .long 0
+
+blocklist_default_len: /* this is the number of sectors to read */
+#ifdef STAGE1_5
+       .word 0
+#else
+       .word (STAGE2_SIZE + ISO_SECTOR_SIZE - 1) >> ISO_SECTOR_BITS
+#endif
+blocklist_default_seg: /* this is the segment of the starting address
+                          to load the data into */
+       .word (STAGE_ADDR + SECTOR_SIZE) >> 4
+
+firstlist:     /* this label has to be after the list data!!! */