mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
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
This commit is contained in:
parent
7acb51f681
commit
48990fce8e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=332085
|
@ -270,6 +270,9 @@ disk_open(struct disk_devdesc *dev, uint64_t mediasize, u_int sectorsize)
|
|||
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)
|
||||
|
|
|
@ -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 @@ ptable_vtoc8read(struct ptable *table, void *dev, diskread_t dread)
|
|||
}
|
||||
#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)
|
||||
|
@ -634,6 +676,11 @@ ptable_open(void *dev, uint64_t sectors, uint16_t 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) {
|
||||
if (ptable_vtoc8read(table, dev, dread) == NULL) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue