svn commit: r332085 - head/stand/common

Benno Rice benno at FreeBSD.org
Thu Apr 5 19:45:32 UTC 2018


Author: benno
Date: Thu Apr  5 19:45:30 2018
New Revision: 332085
URL: https://svnweb.freebsd.org/changeset/base/332085

Log:
  Add an ISO9660 "partition table" type to loader.
  
  When booted via isoboot(8) loader will be handed a disk that simply contains
  an ISO9660 image. Currently this confuses it greatly. Teach it how to spot
  that it's in this situation and that ISO9660 has one "partition" covering
  the whole disk.
  
  Reviewed by:	imp
  Sponsored by:	iXsystems, Inc.
  Differential Revision:	https://reviews.freebsd.org/D14915

Modified:
  head/stand/common/disk.c
  head/stand/common/part.c
  head/stand/common/part.h

Modified: head/stand/common/disk.c
==============================================================================
--- head/stand/common/disk.c	Thu Apr  5 19:40:46 2018	(r332084)
+++ head/stand/common/disk.c	Thu Apr  5 19:45:30 2018	(r332085)
@@ -270,6 +270,9 @@ disk_open(struct disk_devdesc *dev, uint64_t mediasize
 			dev->d_offset = part.start;
 			od->entrysize = part.end - part.start + 1;
 		}
+	} else if (ptable_gettype(od->table) == PTABLE_ISO9660) {
+		dev->d_offset = 0;
+		od->entrysize = mediasize;
 	} else if (slice >= 0) {
 		/* Try to get information about partition */
 		if (slice == 0)

Modified: head/stand/common/part.c
==============================================================================
--- head/stand/common/part.c	Thu Apr  5 19:40:46 2018	(r332084)
+++ head/stand/common/part.c	Thu Apr  5 19:45:30 2018	(r332085)
@@ -37,6 +37,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/queue.h>
 #include <sys/vtoc.h>
 
+#include <fs/cd9660/iso.h>
+
 #include <crc32.h>
 #include <part.h>
 #include <uuid.h>
@@ -97,6 +99,7 @@ static struct parttypes {
 	{ PART_LINUX,		"Linux" },
 	{ PART_LINUX_SWAP,	"Linux swap" },
 	{ PART_DOS,		"DOS/Windows" },
+	{ PART_ISO9660,		"ISO9660" },
 };
 
 const char *
@@ -603,6 +606,45 @@ out:
 }
 #endif /* LOADER_VTOC8_SUPPORT */
 
+#define cdb2devb(bno)   ((bno) * ISO_DEFAULT_BLOCK_SIZE / table->sectorsize)
+
+static struct ptable *
+ptable_iso9660read(struct ptable *table, void *dev, diskread_t dread)
+{
+	uint8_t *buf;
+	struct iso_primary_descriptor *vd;
+	struct pentry *entry;
+
+	buf = malloc(table->sectorsize);
+	if (buf == NULL)
+		return (table);
+		
+	if (dread(dev, buf, 1, cdb2devb(16)) != 0) {
+		DEBUG("read failed");
+		ptable_close(table);
+		table = NULL;
+		goto out;
+	}
+	vd = (struct iso_primary_descriptor *)buf;
+	if (bcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0)
+		goto out;
+
+	entry = malloc(sizeof(*entry));
+	if (entry == NULL)
+		goto out;
+	entry->part.start = 0;
+	entry->part.end = table->sectors;
+	entry->part.type = PART_ISO9660;
+	entry->part.index = 0;
+	STAILQ_INSERT_TAIL(&table->entries, entry, entry);
+
+	table->type = PTABLE_ISO9660;
+
+out:
+	free(buf);
+	return (table);
+}
+
 struct ptable *
 ptable_open(void *dev, uint64_t sectors, uint16_t sectorsize,
     diskread_t *dread)
@@ -633,6 +675,11 @@ ptable_open(void *dev, uint64_t sectors, uint16_t sect
 	table->sectorsize = sectorsize;
 	table->type = PTABLE_NONE;
 	STAILQ_INIT(&table->entries);
+
+	if (ptable_iso9660read(table, dev, dread) != NULL) {
+		if (table->type == PTABLE_ISO9660)
+			goto out;
+	}
 
 #ifdef LOADER_VTOC8_SUPPORT
 	if (be16dec(buf + offsetof(struct vtoc8, magic)) == VTOC_MAGIC) {

Modified: head/stand/common/part.h
==============================================================================
--- head/stand/common/part.h	Thu Apr  5 19:40:46 2018	(r332084)
+++ head/stand/common/part.h	Thu Apr  5 19:45:30 2018	(r332085)
@@ -36,7 +36,8 @@ enum ptable_type {
 	PTABLE_BSD,
 	PTABLE_MBR,
 	PTABLE_GPT,
-	PTABLE_VTOC8
+	PTABLE_VTOC8,
+	PTABLE_ISO9660
 };
 
 enum partition_type {
@@ -52,6 +53,7 @@ enum partition_type {
 	PART_LINUX,
 	PART_LINUX_SWAP,
 	PART_DOS,
+	PART_ISO9660
 };
 
 struct ptable_entry {


More information about the svn-src-head mailing list