summaryrefslogtreecommitdiff
path: root/cdrkit/cdrkit-1.1.9-efi-boot.patch
blob: 45f910b03e666cfe2158329d789332cb8ed2b73e (plain)
    1 diff --git a/doc/icedax/tracknames.pl b/doc/icedax/tracknames.pl
    2 old mode 100755
    3 new mode 100644
    4 index 09f0fcf..801b89e
    5 --- a/doc/icedax/tracknames.pl
    6 +++ b/doc/icedax/tracknames.pl
    7 @@ -1,4 +1,4 @@
    8 -#!/usr/local/bin/perl 
    9 +#!/usr/bin/perl 
   10  # A quick perl hack to get rename files pulled in with icedax.
   11  # by billo@billo.com
   12  #
   13 diff --git a/genisoimage/eltorito.c b/genisoimage/eltorito.c
   14 index b97bdf1..5d7c2d1 100644
   15 --- a/genisoimage/eltorito.c
   16 +++ b/genisoimage/eltorito.c
   17 @@ -59,7 +59,7 @@ static	void	get_torito_desc(struct eltorito_boot_descriptor *boot_desc);
   18  static	void	fill_boot_desc(struct eltorito_defaultboot_entry *boot_desc_entry,
   19  										struct eltorito_boot_entry_info *boot_entry);
   20  void	get_boot_entry(void);
   21 -void	new_boot_entry(void);
   22 +void	new_boot_entry();
   23  static	int	tvd_write(FILE *outfile);
   24  
   25  
   26 @@ -283,6 +283,7 @@ get_torito_desc(struct eltorito_boot_descriptor *boot_desc)
   27  	int			i;
   28  	int			offset;
   29  	struct eltorito_defaultboot_entry boot_desc_record;
   30 +	struct eltorito_sectionheader_entry section_header;
   31  
   32  	memset(boot_desc, 0, sizeof (*boot_desc));
   33  	boot_desc->type[0] = 0;
   34 @@ -317,7 +318,7 @@ get_torito_desc(struct eltorito_boot_descriptor *boot_desc)
   35  	 */
   36  	memset(&valid_desc, 0, sizeof (valid_desc));
   37  	valid_desc.headerid[0] = 1;
   38 -	valid_desc.arch[0] = EL_TORITO_ARCH_x86;
   39 +	valid_desc.arch[0] = first_boot_entry->arch;
   40  
   41  	/*
   42  	 * we'll shove start of publisher id into id field,
   43 @@ -347,10 +348,53 @@ get_torito_desc(struct eltorito_boot_descriptor *boot_desc)
   44  	/* now write it to the virtual boot catalog */
   45  	memcpy(de2->table, &valid_desc, 32);
   46  
   47 -	for (current_boot_entry = first_boot_entry, offset = sizeof (valid_desc);
   48 -		current_boot_entry != NULL;
   49 -		current_boot_entry = current_boot_entry->next,
   50 -		offset += sizeof (boot_desc_record)) {
   51 +	/* Fill the first entry, since it's special and already has the
   52 +	 * matching header via the validation header... */
   53 +	offset = sizeof (valid_desc);
   54 +	current_boot_entry = first_boot_entry;
   55 +
   56 +	if (offset >= SECTOR_SIZE) {
   57 +#ifdef	USE_LIBSCHILY
   58 +		comerrno(EX_BAD, "Too many El Torito boot entries\n");
   59 +#else
   60 +		fprintf(stderr,	"Too many El Torito boot entries\n");
   61 +		exit(1);
   62 +#endif
   63 +	}
   64 +	fill_boot_desc(&boot_desc_record, current_boot_entry);
   65 +	memcpy(de2->table + offset, &boot_desc_record,
   66 +				sizeof (boot_desc_record));
   67 +
   68 +	offset += sizeof(boot_desc_record);
   69 +
   70 +	for (current_boot_entry = current_boot_entry->next;
   71 +			current_boot_entry != NULL;
   72 +			current_boot_entry = current_boot_entry->next) {
   73 +		struct eltorito_sectionheader_entry section_header;
   74 +
   75 +		if (offset >= SECTOR_SIZE) {
   76 +#ifdef	USE_LIBSCHILY
   77 +			comerrno(EX_BAD,
   78 +			"Too many El Torito boot entries\n");
   79 +#else
   80 +			fprintf(stderr,
   81 +			"Too many El Torito boot entries\n");
   82 +			exit(1);
   83 +#endif
   84 +		}
   85 +
   86 +		memset(&section_header, '\0', sizeof(section_header));
   87 +		if (current_boot_entry->next)
   88 +			section_header.headerid[0] = EL_TORITO_SECTION_HEADER;
   89 +		else
   90 +			section_header.headerid[0] = EL_TORITO_LAST_SECTION_HEADER;
   91 +
   92 +		section_header.arch[0] = current_boot_entry->arch;
   93 +		set_721(section_header.num_entries, 1);
   94 +
   95 +		memcpy(de2->table + offset, &section_header,
   96 +					sizeof(section_header));
   97 +		offset += sizeof(section_header);
   98  
   99  		if (offset >= SECTOR_SIZE) {
  100  #ifdef	USE_LIBSCHILY
  101 @@ -365,6 +409,8 @@ get_torito_desc(struct eltorito_boot_descriptor *boot_desc)
  102  		fill_boot_desc(&boot_desc_record, current_boot_entry);
  103  		memcpy(de2->table + offset, &boot_desc_record,
  104  					sizeof (boot_desc_record));
  105 +		offset += sizeof (boot_desc_record);
  106 +
  107  	}
  108  }/* get_torito_desc(... */
  109  
  110 diff --git a/genisoimage/genisoimage.c b/genisoimage/genisoimage.c
  111 index a5b0b46..8add1ac 100644
  112 --- a/genisoimage/genisoimage.c
  113 +++ b/genisoimage/genisoimage.c
  114 @@ -47,6 +47,7 @@
  115  
  116  #include <mconfig.h>
  117  #include "genisoimage.h"
  118 +#include "iso9660.h"
  119  #include <errno.h>
  120  #include <timedefs.h>
  121  #include <fctldefs.h>
  122 @@ -523,6 +524,8 @@ static const struct ld_option ld_options[] =
  123  	'\0', NULL, "Set debug flag", ONE_DASH},
  124  	{{"eltorito-boot", required_argument, NULL, 'b'},
  125  	'b', "FILE", "Set El Torito boot image name", ONE_DASH},
  126 +	{{"efi-boot", required_argument, NULL, 'e'},
  127 +	'e', "FILE", "Set EFI boot image name", ONE_DASH},
  128  	{{"eltorito-alt-boot", no_argument, NULL, OPTION_ALT_BOOT},
  129  	'\0', NULL, "Start specifying alternative El Torito boot parameters", ONE_DASH},
  130  	{{"sparc-boot", required_argument, NULL, 'B'},
  131 @@ -1502,6 +1505,7 @@ int main(int argc, char *argv[])
  132  			all_files = 0;
  133  			break;
  134  		case 'b':
  135 +		case 'e':
  136  			do_sort++;		/* We sort bootcat/botimage */
  137  			use_eltorito++;
  138  			boot_image = optarg;	/* pathname of the boot image */
  139 @@ -1517,6 +1521,10 @@ int main(int argc, char *argv[])
  140  #endif
  141  			}
  142  			get_boot_entry();
  143 +			if (c == 'e')
  144 +				current_boot_entry->arch = EL_TORITO_ARCH_EFI;
  145 +			else
  146 +				current_boot_entry->arch = EL_TORITO_ARCH_x86;
  147  			current_boot_entry->boot_image = boot_image;
  148  			break;
  149  		case OPTION_ALT_BOOT:
  150 diff --git a/genisoimage/genisoimage.h b/genisoimage/genisoimage.h
  151 index bbedfb0..76e5e21 100644
  152 --- a/genisoimage/genisoimage.h
  153 +++ b/genisoimage/genisoimage.h
  154 @@ -293,6 +293,7 @@ struct deferred_write {
  155  struct eltorito_boot_entry_info {
  156  	struct eltorito_boot_entry_info *next;
  157  	char		*boot_image;
  158 +	char		arch;
  159  	int		not_bootable;
  160  	int		no_emul_boot;
  161  	int		hard_disk_boot;
  162 diff --git a/genisoimage/iso9660.h b/genisoimage/iso9660.h
  163 index c74c2a9..c8b7a05 100644
  164 --- a/genisoimage/iso9660.h
  165 +++ b/genisoimage/iso9660.h
  166 @@ -62,10 +62,14 @@ struct iso_volume_descriptor {
  167  #define	EL_TORITO_ARCH_x86	0
  168  #define	EL_TORITO_ARCH_PPC	1
  169  #define	EL_TORITO_ARCH_MAC	2
  170 +#define	EL_TORITO_ARCH_EFI	0xef
  171  
  172  #define	EL_TORITO_BOOTABLE	0x88
  173  #define	EL_TORITO_NOT_BOOTABLE	0
  174  
  175 +#define	EL_TORITO_SECTION_HEADER	0x90
  176 +#define	EL_TORITO_LAST_SECTION_HEADER	0x91
  177 +
  178  #define	EL_TORITO_MEDIA_NOEMUL	0
  179  #define	EL_TORITO_MEDIA_12FLOP	1
  180  #define	EL_TORITO_MEDIA_144FLOP	2
  181 @@ -173,7 +177,7 @@ struct eltorito_validation_entry {
  182  struct eltorito_defaultboot_entry {
  183  	char boot_id			[ISODCL(1,    1)]; /* 711 */
  184  	char boot_media			[ISODCL(2,    2)];
  185 -	char loadseg			[ISODCL(3,    4)]; /* 711 */
  186 +	char loadseg			[ISODCL(3,    4)]; /* 712 */
  187  	char sys_type			[ISODCL(5,    5)];
  188  	char pad1			[ISODCL(6,    6)];
  189  	char nsect			[ISODCL(7,    8)];
  190 @@ -181,6 +185,14 @@ struct eltorito_defaultboot_entry {
  191  	char pad2			[ISODCL(13,  32)];
  192  };
  193  
  194 +/* El Torito Section Header Entry in boot catalog */
  195 +struct eltorito_sectionheader_entry {
  196 +	char headerid			[ISODCL(1,    1)]; /* 711 */
  197 +	char arch			[ISODCL(2,    2)];
  198 +	char num_entries		[ISODCL(3,    4)]; /* 711 */
  199 +	char id				[ISODCL(5,   32)];
  200 +};
  201 +
  202  /*
  203   * XXX JS: The next two structures have odd lengths!
  204   * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length.

Generated by cgit