svn commit: r332983 - in stable/11/usr.sbin/makefs: . cd9660

Benno Rice benno at FreeBSD.org
Wed Apr 25 01:59:17 UTC 2018


Author: benno
Date: Wed Apr 25 01:59:15 2018
New Revision: 332983
URL: https://svnweb.freebsd.org/changeset/base/332983

Log:
  MFC r331463 (partial), r331467, r331468, r331843
  
  r331463, r331467, and r331468 are all replaced by r331843 but are included for
  completeness' sake. r331463 also contained a change to
  release/amd64/mkisoimages.sh which I've left out since those changes were
  also obsoleted by a later commit which will be merged later.
  
  r331843:
  
   Synchronise with NetBSD's version of EFI handling for El Torito images.
  
  Sponsored by:	iXsystems, Inc.

Modified:
  stable/11/usr.sbin/makefs/cd9660.c
  stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.c
  stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.h
  stable/11/usr.sbin/makefs/makefs.8
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/usr.sbin/makefs/cd9660.c
==============================================================================
--- stable/11/usr.sbin/makefs/cd9660.c	Wed Apr 25 01:54:24 2018	(r332982)
+++ stable/11/usr.sbin/makefs/cd9660.c	Wed Apr 25 01:59:15 2018	(r332983)
@@ -312,6 +312,7 @@ cd9660_prep_opts(fsinfo_t *fsopts)
 		OPT_STR('\0', "no-boot", "No boot support"),
 		OPT_STR('\0', "hard-disk-boot", "Boot from hard disk"),
 		OPT_STR('\0', "boot-load-segment", "Boot load segment"),
+		OPT_STR('\0', "platformid", "Section Header Platform ID"),
 
 		{ .name = NULL }
 	};
@@ -447,7 +448,8 @@ cd9660_parse_opts(const char *option, fsinfo_t *fsopts
 			/* RRIP */
 			cd9660_eltorito_add_boot_option(diskStructure, name, 0);
 			rv = 1;
-		} else if (strcmp(name, "boot-load-segment") == 0) {
+		} else if (strcmp(name, "boot-load-segment") == 0 ||
+		    strcmp(name, "platformid") == 0) {
 			if (buf[0] == '\0') {
 				warnx("Option `%s' doesn't contain a value",
 				    name);

Modified: stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.c
==============================================================================
--- stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.c	Wed Apr 25 01:54:24 2018	(r332982)
+++ stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.c	Wed Apr 25 01:59:15 2018	(r332983)
@@ -1,4 +1,4 @@
-/*	$NetBSD: cd9660_eltorito.c,v 1.17 2011/06/23 02:35:56 enami Exp $	*/
+/*	$NetBSD: cd9660_eltorito.c,v 1.23 2018/03/28 06:48:55 nonaka Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-NetBSD
@@ -47,16 +47,19 @@ __FBSDID("$FreeBSD$");
 #define	ELTORITO_DPRINTF(__x)
 #endif
 
+#include <util.h>
+
 static struct boot_catalog_entry *cd9660_init_boot_catalog_entry(void);
 static struct boot_catalog_entry *cd9660_boot_setup_validation_entry(char);
 static struct boot_catalog_entry *cd9660_boot_setup_default_entry(
     struct cd9660_boot_image *);
 static struct boot_catalog_entry *cd9660_boot_setup_section_head(char);
-static struct boot_catalog_entry *cd9660_boot_setup_validation_entry(char);
 #if 0
 static u_char cd9660_boot_get_system_type(struct cd9660_boot_image *);
 #endif
 
+static struct cd9660_boot_image *default_boot_image;
+
 int
 cd9660_add_boot_disk(iso9660_disk *diskStructure, const char *boot_info)
 {
@@ -171,9 +174,15 @@ cd9660_add_boot_disk(iso9660_disk *diskStructure, cons
 
 	new_image->serialno = diskStructure->image_serialno++;
 
+	new_image->platform_id = new_image->system;
+
 	/* TODO : Need to do anything about the boot image in the tree? */
 	diskStructure->is_bootable = 1;
 
+	/* First boot image is initial/default entry. */
+	if (default_boot_image == NULL)
+		default_boot_image = new_image;
+
 	return 1;
 }
 
@@ -207,6 +216,13 @@ cd9660_eltorito_add_boot_option(iso9660_disk *diskStru
 			warn("%s: strtoul", __func__);
 			return 0;
 		}
+	} else if (strcmp(option_string, "platformid") == 0) {
+		if (strcmp(value, "efi") == 0)
+			image->platform_id = ET_SYS_EFI;
+		else {
+			warn("%s: unknown platform: %s", __func__, value);
+			return 0;
+		}
 	} else {
 		return 0;
 	}
@@ -229,6 +245,7 @@ cd9660_boot_setup_validation_entry(char sys)
 	int i;
 	entry = cd9660_init_boot_catalog_entry();
 
+	entry->entry_type = ET_ENTRY_VE;
 	ve = &entry->entry_data.VE;
 
 	ve->header_id[0] = 1;
@@ -263,6 +280,7 @@ cd9660_boot_setup_default_entry(struct cd9660_boot_ima
 	if (default_entry == NULL)
 		return NULL;
 
+	default_entry->entry_type = ET_ENTRY_IE;
 	ie = &default_entry->entry_data.IE;
 
 	ie->boot_indicator[0] = disk->bootable;
@@ -290,8 +308,12 @@ cd9660_boot_setup_section_head(char platform)
 	if (entry == NULL)
 		return NULL;
 
+	entry->entry_type = ET_ENTRY_SH;
 	sh = &entry->entry_data.SH;
-	/* More by default. The last one will manually be set to 0x91 */
+	/*
+	 * More by default.
+	 * The last one will manually be set to ET_SECTION_HEADER_LAST
+	 */
 	sh->header_indicator[0] = ET_SECTION_HEADER_MORE;
 	sh->platform_id[0] = platform;
 	sh->num_section_entries[0] = 0;
@@ -306,6 +328,7 @@ cd9660_boot_setup_section_entry(struct cd9660_boot_ima
 	if ((entry = cd9660_init_boot_catalog_entry()) == NULL)
 		return NULL;
 
+	entry->entry_type = ET_ENTRY_SE;
 	se = &entry->entry_data.SE;
 
 	se->boot_indicator[0] = ET_BOOTABLE;
@@ -338,12 +361,12 @@ cd9660_setup_boot(iso9660_disk *diskStructure, int fir
 	int used_sectors;
 	int num_entries = 0;
 	int catalog_sectors;
-	struct boot_catalog_entry *x86_head, *mac_head, *ppc_head,
+	struct boot_catalog_entry *x86_head, *mac_head, *ppc_head, *efi_head,
 		*valid_entry, *default_entry, *temp, *head, **headp, *next;
 	struct cd9660_boot_image *tmp_disk;
 
 	headp = NULL;
-	x86_head = mac_head = ppc_head = NULL;
+	x86_head = mac_head = ppc_head = efi_head = NULL;
 
 	/* If there are no boot disks, don't bother building boot information */
 	if (TAILQ_EMPTY(&diskStructure->boot_images))
@@ -387,14 +410,25 @@ cd9660_setup_boot(iso9660_disk *diskStructure, int fir
 	sector = first_sector + catalog_sectors;
 	TAILQ_FOREACH(tmp_disk, &diskStructure->boot_images, image_list) {
 		tmp_disk->sector = sector;
-		sector += tmp_disk->num_sectors;
+		sector += tmp_disk->num_sectors /
+		    (diskStructure->sectorSize / 512);
 	}
 
 	LIST_INSERT_HEAD(&diskStructure->boot_entries, valid_entry, ll_struct);
 
 	/* Step 1b: Initial/default entry */
 	/* TODO : PARAM */
-	tmp_disk = TAILQ_FIRST(&diskStructure->boot_images);
+	if (default_boot_image != NULL) {
+		struct cd9660_boot_image *tcbi;
+		TAILQ_FOREACH(tcbi, &diskStructure->boot_images, image_list) {
+			if (tcbi == default_boot_image) {
+				tmp_disk = tcbi;
+				break;
+			}
+		}
+	}
+	if (tmp_disk == NULL)
+		tmp_disk = TAILQ_FIRST(&diskStructure->boot_images);
 	default_entry = cd9660_boot_setup_default_entry(tmp_disk);
 	if (default_entry == NULL) {
 		warnx("Error: memory allocation failed in cd9660_setup_boot");
@@ -405,14 +439,18 @@ cd9660_setup_boot(iso9660_disk *diskStructure, int fir
 
 	/* Todo: multiple default entries? */
 
-	tmp_disk = TAILQ_NEXT(tmp_disk, image_list);
+	tmp_disk = TAILQ_FIRST(&diskStructure->boot_images);
 
+	head = NULL;
 	temp = default_entry;
 
 	/* If multiple boot images are given : */
-	while (tmp_disk != NULL) {
+	for (; tmp_disk != NULL; tmp_disk = TAILQ_NEXT(tmp_disk, image_list)) {
+		if (tmp_disk == default_boot_image)
+			continue;
+
 		/* Step 2: Section header */
-		switch (tmp_disk->system) {
+		switch (tmp_disk->platform_id) {
 		case ET_SYS_X86:
 			headp = &x86_head;
 			break;
@@ -422,6 +460,9 @@ cd9660_setup_boot(iso9660_disk *diskStructure, int fir
 		case ET_SYS_MAC:
 			headp = &mac_head;
 			break;
+		case ET_SYS_EFI:
+			headp = &efi_head;
+			break;
 		default:
 			warnx("%s: internal error: unknown system type",
 			    __func__);
@@ -430,7 +471,7 @@ cd9660_setup_boot(iso9660_disk *diskStructure, int fir
 
 		if (*headp == NULL) {
 			head =
-			    cd9660_boot_setup_section_head(tmp_disk->system);
+			  cd9660_boot_setup_section_head(tmp_disk->platform_id);
 			if (head == NULL) {
 				warnx("Error: memory allocation failed in "
 				      "cd9660_setup_boot");
@@ -455,9 +496,17 @@ cd9660_setup_boot(iso9660_disk *diskStructure, int fir
 			head = next;
 
 		LIST_INSERT_AFTER(head, temp, ll_struct);
-		tmp_disk = TAILQ_NEXT(tmp_disk, image_list);
 	}
 
+	/* Find the last Section Header entry and mark it as the last. */
+	head = NULL;
+	LIST_FOREACH(next, &diskStructure->boot_entries, ll_struct) {
+		if (next->entry_type == ET_ENTRY_SH)
+			head = next;
+	}
+	if (head != NULL)
+		head->entry_data.SH.header_indicator[0] = ET_SECTION_HEADER_LAST;
+
 	/* TODO: Remaining boot disks when implemented */
 
 	return first_sector + used_sectors;
@@ -558,13 +607,13 @@ cd9660_write_apm_partition_entry(FILE *fd, int idx, in
 
 	apm32 = 0;
 	/* pmLgDataStart */
-        fwrite(&apm32, sizeof(apm32), 1, fd);
+	fwrite(&apm32, sizeof(apm32), 1, fd);
 	/* pmDataCnt */ 
 	apm32 = htobe32(nsectors);
-        fwrite(&apm32, sizeof(apm32), 1, fd);
+	fwrite(&apm32, sizeof(apm32), 1, fd);
 	/* pmPartStatus */
 	apm32 = htobe32(part_status);
-        fwrite(&apm32, sizeof(apm32), 1, fd);
+	fwrite(&apm32, sizeof(apm32), 1, fd);
 
 	return 0;
 }
@@ -681,8 +730,9 @@ cd9660_write_boot(iso9660_disk *diskStructure, FILE *f
 			    t->num_sectors * (diskStructure->sectorSize / 512),
 			    512, "CD Boot", "Apple_Bootstrap");
 		}
+
 		/* Write ISO9660 descriptor, enclosing the whole disk */
-                cd9660_write_apm_partition_entry(fd, 2 + apm_partitions,
+		cd9660_write_apm_partition_entry(fd, 2 + apm_partitions,
 		    total_parts, 0, diskStructure->totalSectors *
 		    (diskStructure->sectorSize / 512), 512, "ISO9660",
 		    "CD_ROM_Mode_1");
@@ -690,4 +740,3 @@ cd9660_write_boot(iso9660_disk *diskStructure, FILE *f
 
 	return 0;
 }
-

Modified: stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.h
==============================================================================
--- stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.h	Wed Apr 25 01:54:24 2018	(r332982)
+++ stable/11/usr.sbin/makefs/cd9660/cd9660_eltorito.h	Wed Apr 25 01:59:15 2018	(r332983)
@@ -1,4 +1,4 @@
-/*	$NetBSD: cd9660_eltorito.h,v 1.5 2009/07/04 14:31:38 ahoka Exp $	*/
+/*	$NetBSD: cd9660_eltorito.h,v 1.6 2017/01/24 11:22:43 nonaka Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-NetBSD
@@ -44,6 +44,7 @@
 #define	ET_SYS_X86	0
 #define	ET_SYS_PPC	1
 #define	ET_SYS_MAC	2
+#define	ET_SYS_EFI	0xef	/* Platform ID at section header entry */
 
 #define ET_BOOT_ENTRY_SIZE 0x20
 
@@ -149,6 +150,7 @@ struct cd9660_boot_image {
 	u_char targetMode;
 	u_char system;
 	u_char bootable;
+	u_char platform_id;		/* for section header entry */
 	/*
 	 * If the boot image exists in the filesystem
 	 * already, this is a pointer to that node. For the sake

Modified: stable/11/usr.sbin/makefs/makefs.8
==============================================================================
--- stable/11/usr.sbin/makefs/makefs.8	Wed Apr 25 01:54:24 2018	(r332982)
+++ stable/11/usr.sbin/makefs/makefs.8	Wed Apr 25 01:59:15 2018	(r332983)
@@ -35,7 +35,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd April 6, 2017
+.Dd March 30, 2018
 .Dt MAKEFS 8
 .Os
 .Sh NAME
@@ -386,6 +386,8 @@ ElTorito image.
 Do not pad the image (apparently Linux needs the padding).
 .It Sy omit-trailing-period
 Omit trailing periods in filenames.
+.It Sy platformid
+Set platform ID of section header entry of the boot image.
 .It Sy preparer
 Preparer ID of the image.
 .It Sy publisher


More information about the svn-src-all mailing list