summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openhackware/src/libpart/prep.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openhackware/src/libpart/prep.c')
-rw-r--r--qemu/roms/openhackware/src/libpart/prep.c216
1 files changed, 0 insertions, 216 deletions
diff --git a/qemu/roms/openhackware/src/libpart/prep.c b/qemu/roms/openhackware/src/libpart/prep.c
deleted file mode 100644
index b957bb902..000000000
--- a/qemu/roms/openhackware/src/libpart/prep.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * <prep.c>
- *
- * Open Hack'Ware PREP BIOS partition type management
- *
- * Copyright (c) 2004-2005 Jocelyn Mayer
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License V2
- * as published by the Free Software Foundation
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "bios.h"
-#include "libpart.h"
-
-/* PREP image management */
-typedef struct MSDOS_part_t MSDOS_part_t;
-struct MSDOS_part_t {
- uint8_t boot_ind;
- uint8_t start_head;
- uint8_t start_sect;
- uint8_t start_cyl;
- uint8_t sys_ind;
- uint8_t end_head;
- uint8_t end_sect;
- uint8_t end_cyl;
- uint32_t LBA_start;
- uint32_t LBA_end;
-} __attribute__ ((packed));
-
-part_t *PREP_find_partition (bloc_device_t *bd)
-{
- MSDOS_part_t *p;
- part_t *part;
- uint8_t *buffer;
- uint32_t boot_offset, boot_size;
- int i;
-
- part = NULL;
- buffer = malloc(0x200);
- bd_seek(bd, 0, 0);
- if (bd_read(bd, buffer, 0x200) < 0) {
- ERROR("Unable to read boot sector from boot device. Aborting...\n");
- goto error;
- }
- if (buffer[0x1FE] != 0x55 || buffer[0x1FF] != 0xAA) {
- ERROR("No MSDOS signature (%x %x %x %x)\n",
- buffer[0x000], buffer[0x001], buffer[0x1FE], buffer[0x1FF]);
- goto error;
- }
- for (i = 0; i < 4; i++) {
- p = (void *)(&buffer[0x1BE + (0x10 * i)]);
- DPRINTF("partition %d: %x is %sbootable - ", i, p->boot_ind,
- (p->boot_ind & 0x80) ? "" : "not ");
- DPRINTF("start %0x end %0x type %x\n",
- get_le32(&p->LBA_start), get_le32(&p->LBA_end), p->sys_ind);
-#if 0
- if (p->boot_ind != 0x80)
- continue;
-#endif
- switch (p->sys_ind) {
- case 0x07: /* HPFS/NTFS */
- goto register_nonboot;
- case 0x08: /* AIX */
- goto register_nonboot;
- case 0x09: /* AIX bootable */
- /* Not supported by now */
- break;
- case 0x0A: /* OS/2 boot manager */
- /* Not supported by now */
- break;
- case 0x41: /* PREP boot */
- part = malloc(sizeof(part_t));
- memset(part, 0, sizeof(part_t));
- part->bd = bd;
- part_set_blocsize(bd, part, 0x200);
- /* Convert start and size into LBA */
- if ((p->start_head != 0 || p->start_cyl != 0 ||
- p->start_sect != 0) && p->LBA_start == 0) {
- DPRINTF("start: use CHS\n");
- part->start = bd_CHS2sect(bd, p->start_cyl,
- p->start_head,
- p->start_sect);
- } else {
- DPRINTF("start: use LBA\n");
- part->start = get_le32(&p->LBA_start);
- }
- if ((p->end_head != 0 || p->end_cyl != 0 ||
- p->end_sect != 0) && p->LBA_end == 0) {
- DPRINTF("end: use CHS\n");
- part->size = bd_CHS2sect(bd, p->end_cyl,
- p->end_head, p->end_sect);
- } else {
- DPRINTF("end: use LBA\n");
- part->size = get_le32(&p->LBA_end);
- }
- /* XXX: seems that some (AIX !)
- * code the size here instead of partition end
- */
- if (part->size > part->start)
- part->size -= part->start;
- DPRINTF("LBA: start %0x size: %0x\n", part->start, part->size);
- /* Now, find and check boot record */
- part_seek(part, 0, 0);
- if (bd_read(bd, buffer, part->bloc_size) < 0) {
- ERROR("%s sector_read failed (%d)\n", __func__, i);
- freep(&part);
- goto error;
- }
-#if 0
- if (buffer[0x1FE] != 0x55 || buffer[0x1FF] != 0xAA) {
- ERROR("No MSDOS signature on PREP boot record\n");
- freep(&part);
- goto error;
- }
-#endif
- boot_offset = get_le32(buffer);
- boot_size = get_le32(buffer + 4);
- if ((boot_offset & 3) || /*(boot_size & 3) ||*/
- boot_offset == 0 || boot_size == 0) {
- DPRINTF("Suspicious PREP boot parameters: %08x %08x %08x %08x\n",
- part->start, part->start * 0x200, boot_offset, boot_size);
-#if 0
- freep(&part);
- goto error;
-#else
- /* IBM boot blocs respect the norm better than others... */
- part->start++;
- part_seek(part, 0, 0);
- if (bd_read(bd, buffer, part->bloc_size) < 0) {
- ERROR("%s sector_read failed (%d)\n", __func__, i);
- freep(&part);
- goto error;
- }
- boot_offset = get_le32(buffer);
- boot_size = get_le32(buffer + 4);
-#endif
- }
- DPRINTF("PREP boot parameters: %08x %08x %08x %08x\n",
- part->start, part->start * 0x200, boot_offset, boot_size);
- if (boot_size > (part->size * part->bloc_size)) {
- ERROR("PREP boot image greater than boot partition: %0x %0x\n",
- boot_size, part->size * part->bloc_size);
-#if 0
- freep(&part);
- goto error;
-#endif
- }
- part->boot_start.bloc = 0;
- part->boot_start.offset = 0;
- part->boot_size.bloc = boot_size / part->bloc_size;
- part->boot_size.offset = boot_size % part->bloc_size;
- part->boot_load = 0;
- part->boot_entry = boot_offset - part->bloc_size;
- part->flags = PART_TYPE_PREP | PART_FLAG_BOOT;
- part_register(bd, part, "PREP boot", i);
- fs_raw_set_bootfile(part, part->boot_start.bloc,
- part->boot_start.offset,
- part->boot_size.bloc,
- part->boot_size.offset);
- break;
- case 0x63: /* GNU Hurd */
- goto register_nonboot;
- case 0x83: /* Linux */
- goto register_nonboot;
- case 86 ... 87: /* NFTS volume set */
- /* Not supported by now */
- break;
- case 0x8E: /* Linux LVM */
- /* Not supported by now */
- break;
- case 0x96: /* AIX seems to use this to identify ISO 9660 'partitions' */
- break;
- case 0xA5: /* FreeBSD */
- goto register_nonboot;
- case 0xA6: /* OpenBSD */
- goto register_nonboot;
- case 0xA7: /* NeXTSTEP */
- goto register_nonboot;
- case 0xA8: /* Darwin UFS */
- goto register_nonboot;
- case 0xA9: /* NetBSD */
- goto register_nonboot;
- case 0xAB: /* Darwin boot */
- /* Not supported by now */
- break;
- case 0xBE: /* Solaris boot */
- /* Not supported by now */
- break;
- case 0xEB: /* BeOS fs */
- goto register_nonboot;
- case 0xFD: /* Linux RAID */
- /* Not supported by now */
- break;
- default:
- break;
- register_nonboot:
- break;
- }
- }
- error:
- free(buffer);
-
- return part;
-}