diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2010-06-17 11:41:15 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-06-17 11:41:15 -0700 |
commit | ab4a10a3b558f835486efc5dd9e4eeb47a863eb7 (patch) | |
tree | c20fefc9ebdc3d71f77d875c6e81ebd59099c347 /memdisk | |
parent | 51735fc532ba1ed079a30ba9734936bf2670c87b (diff) | |
parent | 3a2d5f8b3a75961e621c83890a592db24dd960a6 (diff) | |
download | syslinux-ab4a10a3b558f835486efc5dd9e4eeb47a863eb7.tar.gz |
Merge remote branch 'sha0/mdiskchk_enh2' into pathbased
Diffstat (limited to 'memdisk')
-rw-r--r-- | memdisk/acpi.h | 3 | ||||
-rw-r--r-- | memdisk/eltorito.h | 28 | ||||
-rw-r--r-- | memdisk/memdisk.h | 4 | ||||
-rw-r--r-- | memdisk/memdisk.inc | 8 | ||||
-rw-r--r-- | memdisk/mstructs.h | 183 | ||||
-rw-r--r-- | memdisk/setup.c | 199 |
6 files changed, 245 insertions, 180 deletions
diff --git a/memdisk/acpi.h b/memdisk/acpi.h index 630c5f57..732d116a 100644 --- a/memdisk/acpi.h +++ b/memdisk/acpi.h @@ -31,6 +31,7 @@ * This is the structure common to the start of all ACPI system * description tables. */ +MEMDISK_PACKED_PREFIX struct acpi_description_header { /** ACPI signature (4 ASCII characters) */ char signature[4]; @@ -50,5 +51,5 @@ struct acpi_description_header { char asl_compiler_id[4]; /** ASL compiler revision number */ uint32_t asl_compiler_revision; -} __attribute__ (( packed )); +} MEMDISK_PACKED_POSTFIX; diff --git a/memdisk/eltorito.h b/memdisk/eltorito.h index 7d46e1d9..27b570da 100644 --- a/memdisk/eltorito.h +++ b/memdisk/eltorito.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2009 Shao Miller - All Rights Reserved + * Copyright 2009-2010 Shao Miller - All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,17 +18,8 @@ #include <stdint.h> -/* - * Uncomment for El Torito debugging - * - * #define DBG_ELTORITO 1 - */ - -#ifdef DBG_ELTORITO -extern void eltorito_dump(uint32_t); -#endif - /* EDD-4 Bootable Optical Disc Drive Boot Volume Descriptor */ +MEMDISK_PACKED_PREFIX struct edd4_bvd { uint8_t boot_rec_ind; /* Boot Record Indicator */ uint8_t iso9660_id[5]; /* ISO9660 ID */ @@ -37,8 +28,9 @@ struct edd4_bvd { uint8_t res1[32]; /* Reserved */ uint32_t boot_cat; /* Boot catalog sector */ uint8_t res2[1973]; /* Reserved */ -} __attribute__ ((packed)); +} MEMDISK_PACKED_POSTFIX; +MEMDISK_PACKED_PREFIX struct validation_entry { uint8_t header_id; /* Header ID */ uint8_t platform_id; /* Platform ID */ @@ -47,8 +39,9 @@ struct validation_entry { uint16_t checksum; /* Sums with whole record to zero */ uint8_t key55; /* Key byte 0x55 */ uint8_t keyAA; /* Key byte 0xAA */ -} __attribute__ ((packed)); +} MEMDISK_PACKED_POSTFIX; +MEMDISK_PACKED_PREFIX struct initial_entry { uint8_t header_id; /* Header ID */ uint8_t media_type; /* Media type */ @@ -58,15 +51,17 @@ struct initial_entry { uint16_t sect_count; /* Emulated sectors to load */ uint32_t load_block; /* Starting sector of image */ uint8_t res2[4]; /* Reserved */ -} __attribute__ ((packed)); +} MEMDISK_PACKED_POSTFIX; /* EDD-4 Bootable Optical Disc Drive Boot Catalog (fixed-size portions) */ +MEMDISK_PACKED_PREFIX struct edd4_bootcat { struct validation_entry validation_entry; struct initial_entry initial_entry; -} __attribute__ ((packed)); +} MEMDISK_PACKED_POSTFIX; /* EDD-4 CD Specification Packet */ +MEMDISK_PACKED_PREFIX struct edd4_cd_pkt { uint8_t size; /* Packet size */ uint8_t type; /* Boot media type (flags) */ @@ -80,4 +75,5 @@ struct edd4_cd_pkt { uint8_t geom1; /* Cylinders bits 0 thru 7 */ uint8_t geom2; /* Sects/track 0 thru 5, cyls 8, 9 */ uint8_t geom3; /* Heads */ -} __attribute__ ((packed)); +} MEMDISK_PACKED_POSTFIX; + diff --git a/memdisk/memdisk.h b/memdisk/memdisk.h index b6b277a8..af40823a 100644 --- a/memdisk/memdisk.h +++ b/memdisk/memdisk.h @@ -134,4 +134,8 @@ extern int check_zip(void *indata, uint32_t size, uint32_t * zbytes_p, extern void *unzip(void *indata, uint32_t zbytes, uint32_t dbytes, uint32_t orig_crc, void *target); +/* Structure packing can be different for different compilers */ +#define MEMDISK_PACKED_PREFIX +#define MEMDISK_PACKED_POSTFIX __attribute__ (( packed )) + #endif diff --git a/memdisk/memdisk.inc b/memdisk/memdisk.inc index e1a0901b..90e6ef9f 100644 --- a/memdisk/memdisk.inc +++ b/memdisk/memdisk.inc @@ -119,7 +119,7 @@ ; must be first in the binary Pointers: dw Int13Start dw Int15Start - dw PatchArea + dw MemDisk_Info ; Portions are patched by installer dw TotalSize dw IretPtr @@ -1076,12 +1076,11 @@ mBFT: ; Note that the above ends on a DWORD boundary. ; The MDI has always started at such a boundary. +; Portions of the MDI are patched by the installer MemDisk_Info equ $ ; Pointed to by installation check MDI_Bytes dw MDI_Len ; Total bytes in MDI structure MDI_Version db VERSION_MINOR, VERSION_MAJOR ; MEMDISK version -PatchArea equ $ ; This gets filled in by the installer - DiskBuf dd 0 ; Linear address of high memory disk DiskSize dd 0 ; Size of disk in blocks CommandLine dw 0, 0 ; Far pointer to saved command line @@ -1171,7 +1170,8 @@ CD_PKT: %endif ; EDD - ; End patch area +; End patch area + alignb 4, db 0 Stack dd 0 ; Saved SS:ESP on invocation dw 0 diff --git a/memdisk/mstructs.h b/memdisk/mstructs.h new file mode 100644 index 00000000..e060aceb --- /dev/null +++ b/memdisk/mstructs.h @@ -0,0 +1,183 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2001-2009 H. Peter Anvin - All Rights Reserved + * Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin + * Portions copyright 2009-2010 Shao Miller + * [El Torito code, mBFT, "safe hook"] + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* These structures are common to MEMDISK and MDISKCHK.COM */ + +#include <stdint.h> + +struct seg_off { + uint16_t offset; + uint16_t segment; +}; + +typedef union { + struct seg_off seg_off; + uint32_t uint32; +} real_addr_t; + +/* Forward declaration */ +struct mBFT; + +MEMDISK_PACKED_PREFIX +struct safe_hook { + uint8_t jump[3]; /* Max. three bytes for jump */ + uint8_t signature[8]; /* "$INT13SF" */ + uint8_t vendor[8]; /* "MEMDISK " */ + real_addr_t old_hook; /* SEG:OFF for previous INT 13h hook */ + uint32_t flags; /* "Safe hook" flags */ + /* The next field is a MEMDISK extension to the "safe hook" structure */ + union { + uint32_t offset; /* Offset from hook to the mBFT; refilled */ + struct mBFT *ptr; /* by setup() with the physical address */ + } mBFT; +} MEMDISK_PACKED_POSTFIX; + +struct memdisk_header { + uint16_t int13_offs; + uint16_t int15_offs; + uint16_t patch_offs; + uint16_t total_size; + uint16_t iret_offs; + struct safe_hook safe_hook; +}; + +MEMDISK_PACKED_PREFIX +/* EDD disk parameter table */ +struct edd_dpt { + uint16_t len; /* Length of table */ + uint16_t flags; /* Information flags */ + uint32_t c; /* Physical cylinders (count!) */ + uint32_t h; /* Physical heads (count!) */ + uint32_t s; /* Physical sectors/track (count!) */ + uint64_t sectors; /* Total sectors */ + uint16_t bytespersec; /* Bytes/sector */ + real_addr_t dpte; /* DPTE pointer */ + uint16_t dpikey; /* Device Path Info magic */ + uint8_t dpilen; /* Device Path Info length */ + uint8_t res1; /* Reserved */ + uint16_t res2; /* Reserved */ + uint8_t bustype[4]; /* Host bus type */ + uint8_t inttype[8]; /* Interface type */ + uint64_t intpath; /* Interface path */ + uint64_t devpath[2]; /* Device path (double QuadWord!) */ + uint8_t res3; /* Reserved */ + uint8_t chksum; /* DPI checksum */ +} MEMDISK_PACKED_POSTFIX; + +/* Requirement for struct edd4_cd_pkt */ +#include "../memdisk/eltorito.h" + +/* Official MEMDISK Info structure ("MDI") */ +MEMDISK_PACKED_PREFIX +struct mdi { + const uint16_t bytes; + const uint8_t version_minor; + const uint8_t version_major; + + uint32_t diskbuf; + uint32_t disksize; + real_addr_t cmdline; + + real_addr_t oldint13; + real_addr_t oldint15; + + uint16_t olddosmem; + uint8_t bootloaderid; + uint8_t _pad1; + + uint16_t dpt_ptr; +} MEMDISK_PACKED_POSTFIX; + +/* Requirement for struct acpi_description_header */ +#include "../memdisk/acpi.h" + +MEMDISK_PACKED_PREFIX +struct mBFT { + struct acpi_description_header acpi; + union { + struct safe_hook *ptr; + uint32_t phys_addr; + } safe_hook; /* "Safe hook" physical address */ + struct mdi mdi; +} MEMDISK_PACKED_POSTFIX; + +/* The Disk Parameter Table may be required */ +typedef union { + struct hd_dpt { + uint16_t max_cyl; /* Max cylinder */ + uint8_t max_head; /* Max head */ + uint8_t junk1[5]; /* Obsolete junk, leave at zero */ + uint8_t ctrl; /* Control byte */ + uint8_t junk2[7]; /* More obsolete junk */ + } hd; + struct fd_dpt { + uint8_t specify1; /* "First specify byte" */ + uint8_t specify2; /* "Second specify byte" */ + uint8_t delay; /* Delay until motor turn off */ + uint8_t sectors; /* Sectors/track */ + + uint8_t bps; /* Bytes/sector (02h = 512) */ + uint8_t isgap; /* Length of intersector gap */ + uint8_t dlen; /* Data length (0FFh) */ + uint8_t fgap; /* Formatting gap */ + + uint8_t ffill; /* Format fill byte */ + uint8_t settle; /* Head settle time (ms) */ + uint8_t mstart; /* Motor start time */ + uint8_t maxtrack; /* Maximum track number */ + + uint8_t rate; /* Data transfer rate */ + uint8_t cmos; /* CMOS type */ + uint8_t pad[2]; + + uint32_t old_fd_dpt; /* Extension: pointer to old INT 1Eh */ + } fd; +} dpt_t; + +MEMDISK_PACKED_PREFIX +struct patch_area { + struct mdi mdi; + + uint8_t driveshiftlimit; /* Do not shift drives above this region */ + uint8_t _pad2; /* Pad to DWORD */ + uint16_t _pad3; /* Pad to QWORD */ + + uint16_t memint1588; + + uint16_t cylinders; + uint16_t heads; + uint32_t sectors; + + uint32_t mem1mb; + uint32_t mem16mb; + + uint8_t driveno; + uint8_t drivetype; + uint8_t drivecnt; + uint8_t configflags; + +#define CONFIG_READONLY 0x01 +#define CONFIG_RAW 0x02 +#define CONFIG_SAFEINT 0x04 +#define CONFIG_BIGRAW 0x08 /* MUST be 8! */ +#define CONFIG_MODEMASK 0x0e + + uint16_t mystack; + uint16_t statusptr; + + dpt_t dpt; + struct edd_dpt edd_dpt; + struct edd4_cd_pkt cd_pkt; /* Only really in a memdisk_iso_* hook */ +} MEMDISK_PACKED_POSTFIX; diff --git a/memdisk/setup.c b/memdisk/setup.c index db1c4bcf..ffaa2c66 100644 --- a/memdisk/setup.c +++ b/memdisk/setup.c @@ -14,11 +14,9 @@ * ----------------------------------------------------------------------- */ #include <stdint.h> -#include "acpi.h" #include "bda.h" #include "dskprobe.h" #include "e820.h" -#include "eltorito.h" #include "conio.h" #include "version.h" #include "memdisk.h" @@ -41,131 +39,8 @@ extern const char _binary_memdisk_iso_2048_bin_start[]; extern const char _binary_memdisk_iso_2048_bin_end[]; extern const char _binary_memdisk_iso_2048_bin_size[]; -struct memdisk_header { - uint16_t int13_offs; - uint16_t int15_offs; - uint16_t patch_offs; - uint16_t total_size; - uint16_t iret_offs; -}; - -struct safe_hook { - uint8_t jump[3]; /* Max. three bytes for jump */ - uint8_t signature[8]; /* "$INT13SF" */ - uint8_t vendor[8]; /* "MEMDISK " */ - uint32_t old_hook; /* SEG:OFF for previous INT 13h hook */ - uint32_t flags; /* "Safe hook" flags */ - /* The next field is a MEMDISK extension to the "safe hook" structure */ - uint32_t mBFT; /* Offset from hook to the mBFT; refilled - * by setup() with the physical address - */ -} __attribute__((packed)); - -/* The Disk Parameter Table may be required */ -typedef union { - struct hd_dpt { - uint16_t max_cyl; /* Max cylinder */ - uint8_t max_head; /* Max head */ - uint8_t junk1[5]; /* Obsolete junk, leave at zero */ - uint8_t ctrl; /* Control byte */ - uint8_t junk2[7]; /* More obsolete junk */ - } hd; - struct fd_dpt { - uint8_t specify1; /* "First specify byte" */ - uint8_t specify2; /* "Second specify byte" */ - uint8_t delay; /* Delay until motor turn off */ - uint8_t sectors; /* Sectors/track */ - - uint8_t bps; /* Bytes/sector (02h = 512) */ - uint8_t isgap; /* Length of intersector gap */ - uint8_t dlen; /* Data length (0FFh) */ - uint8_t fgap; /* Formatting gap */ - - uint8_t ffill; /* Format fill byte */ - uint8_t settle; /* Head settle time (ms) */ - uint8_t mstart; /* Motor start time */ - uint8_t maxtrack; /* Maximum track number */ - - uint8_t rate; /* Data transfer rate */ - uint8_t cmos; /* CMOS type */ - uint8_t pad[2]; - - uint32_t old_fd_dpt; /* Extension: pointer to old INT 1Eh */ - } fd; -} dpt_t; - -/* EDD disk parameter table */ -struct edd_dpt { - uint16_t len; /* Length of table */ - uint16_t flags; /* Information flags */ - uint32_t c; /* Physical cylinders (count!) */ - uint32_t h; /* Physical heads (count!) */ - uint32_t s; /* Physical sectors/track (count!) */ - uint64_t sectors; /* Total sectors */ - uint16_t bytespersec; /* Bytes/sector */ - uint16_t dpte_off, dpte_seg; /* DPTE pointer */ - uint16_t dpikey; /* Device Path Info magic */ - uint8_t dpilen; /* Device Path Info length */ - uint8_t res1; /* Reserved */ - uint16_t res2; /* Reserved */ - uint8_t bustype[4]; /* Host bus type */ - uint8_t inttype[8]; /* Interface type */ - uint64_t intpath; /* Interface path */ - uint64_t devpath[2]; /* Device path (double QuadWord!) */ - uint8_t res3; /* Reserved */ - uint8_t chksum; /* DPI checksum */ -} __attribute__((packed)); - -struct mBFT { - struct acpi_description_header acpi; - uint32_t safe_hook; /* "Safe hook" physical address */ -} __attribute__((packed)); - -struct patch_area { - uint32_t diskbuf; - uint32_t disksize; - uint16_t cmdline_off, cmdline_seg; - - uint32_t oldint13; - uint32_t oldint15; - - uint16_t olddosmem; - uint8_t bootloaderid; - uint8_t _pad1; - - uint16_t dpt_ptr; - /* End of the official MemDisk_Info */ - uint8_t driveshiftlimit; /* Do not shift drives above this region */ - uint8_t _pad2; /* Pad to DWORD */ - uint16_t _pad3; /* Pad to QWORD */ - - uint16_t memint1588; - - uint16_t cylinders; - uint16_t heads; - uint32_t sectors; - - uint32_t mem1mb; - uint32_t mem16mb; - - uint8_t driveno; - uint8_t drivetype; - uint8_t drivecnt; - uint8_t configflags; - -#define CONFIG_READONLY 0x01 -#define CONFIG_RAW 0x02 -#define CONFIG_SAFEINT 0x04 -#define CONFIG_BIGRAW 0x08 /* MUST be 8! */ -#define CONFIG_MODEMASK 0x0e - - uint16_t mystack; - uint16_t statusptr; - - dpt_t dpt; - struct edd_dpt edd_dpt; - struct edd4_cd_pkt cd_pkt; /* Only really in a memdisk_iso_* hook */ -} __attribute__((packed)); +/* Pull in structures common to MEMDISK and MDISKCHK.COM */ +#include "mstructs.h" /* An EDD disk packet */ struct edd_dsk_pkt { @@ -177,6 +52,13 @@ struct edd_dsk_pkt { uint64_t buf64; /* 64-bit buf pointer */ } __attribute__ ((packed)); +/* Change to 1 for El Torito debugging */ +#define DBG_ELTORITO 0 + +#if DBG_ELTORITO +extern void eltorito_dump(uint32_t); +#endif + /* * Routine to seek for a command-line item and return a pointer * to the data portion, if present @@ -454,7 +336,7 @@ static const struct geometry *get_disk_image_geometry(uint32_t where, hd_geometry.offset = offset; if ((p = getcmditem("iso")) != CMD_NOTFOUND) { -#ifdef DBG_ELTORITO +#if DBG_ELTORITO eltorito_dump(where); #endif struct edd4_bvd *bvd = (struct edd4_bvd *)(where + 17 * 2048); @@ -835,7 +717,6 @@ void setup(const struct real_mode_args *rm_args_ptr) unsigned int bin_size; char *memdisk_hook; struct memdisk_header *hptr; - struct safe_hook *safe_hook; struct patch_area *pptr; uint16_t driverseg; uint32_t driverptr, driveraddr; @@ -919,11 +800,10 @@ void setup(const struct real_mode_args *rm_args_ptr) /* Figure out where it needs to go */ hptr = (struct memdisk_header *)memdisk_hook; - safe_hook = (struct safe_hook *)(memdisk_hook + hptr->int13_offs); pptr = (struct patch_area *)(memdisk_hook + hptr->patch_offs); dosmem_k = rdz_16(BIOS_BASEMEM); - pptr->olddosmem = dosmem_k; + pptr->mdi.olddosmem = dosmem_k; stddosmem = dosmem_k << 10; /* If INT 15 E820 and INT 12 disagree, go with the most conservative */ if (stddosmem > dos_mem) @@ -934,11 +814,11 @@ void setup(const struct real_mode_args *rm_args_ptr) pptr->cylinders = geometry->c; /* Possible precision loss */ pptr->heads = geometry->h; pptr->sectors = geometry->s; - pptr->disksize = geometry->sectors; - pptr->diskbuf = ramdisk_image + geometry->offset; + pptr->mdi.disksize = geometry->sectors; + pptr->mdi.diskbuf = ramdisk_image + geometry->offset; pptr->statusptr = (geometry->driveno & 0x80) ? 0x474 : 0x441; - pptr->bootloaderid = shdr->type_of_loader; + pptr->mdi.bootloaderid = shdr->type_of_loader; pptr->configflags = CONFIG_SAFEINT; /* Default */ /* Set config flags */ @@ -1040,7 +920,7 @@ void setup(const struct real_mode_args *rm_args_ptr) pptr->edd_dpt.flags |= 0x0014; } - pptr->edd_dpt.devpath[0] = pptr->diskbuf; + pptr->edd_dpt.devpath[0] = pptr->mdi.diskbuf; pptr->edd_dpt.chksum = -checksum_buf(&pptr->edd_dpt.dpikey, 73 - 30); } @@ -1109,8 +989,8 @@ void setup(const struct real_mode_args *rm_args_ptr) /* Anything beyond the end is for the stack */ pptr->mystack = (uint16_t) (stddosmem - driveraddr); - pptr->oldint13 = rdz_32(BIOS_INT13); - pptr->oldint15 = rdz_32(BIOS_INT15); + pptr->mdi.oldint13.uint32 = rdz_32(BIOS_INT13); + pptr->mdi.oldint15.uint32 = rdz_32(BIOS_INT15); /* Adjust the E820 table: if there are null ranges (type 0) at the end, change them to type end of list (-1). @@ -1125,7 +1005,7 @@ void setup(const struct real_mode_args *rm_args_ptr) bios_drives = 0; pptr->drivecnt = 0; no_bpt = 1; - pptr->oldint13 = driverptr + hptr->iret_offs; + pptr->mdi.oldint13.uint32 = driverptr + hptr->iret_offs; wrz_8(BIOS_EQUIP, rdz_8(BIOS_EQUIP) & ~0xc1); wrz_8(BIOS_HD_COUNT, 0); } else if (getcmditem("nopass") != CMD_NOTFOUND) { @@ -1173,9 +1053,6 @@ void setup(const struct real_mode_args *rm_args_ptr) } } - /* Note the previous INT 13h hook in the "safe hook" structure */ - safe_hook->old_hook = pptr->oldint13; - /* Add ourselves to the drive count */ pptr->drivecnt++; @@ -1191,8 +1068,8 @@ void setup(const struct real_mode_args *rm_args_ptr) pptr->driveshiftlimit); /* Pointer to the command line */ - pptr->cmdline_off = bin_size + (nranges + 1) * sizeof(ranges[0]); - pptr->cmdline_seg = driverseg; + pptr->mdi.cmdline.seg_off.offset = bin_size + (nranges + 1) * sizeof(ranges[0]); + pptr->mdi.cmdline.seg_off.segment = driverseg; /* Copy driver followed by E820 table followed by command line */ { @@ -1200,7 +1077,6 @@ void setup(const struct real_mode_args *rm_args_ptr) /* Adjust these pointers to point to the installed image */ /* Careful about the order here... the image isn't copied yet! */ - safe_hook = (struct safe_hook *)(dpp + hptr->int13_offs); pptr = (struct patch_area *)(dpp + hptr->patch_offs); hptr = (struct memdisk_header *)dpp; @@ -1210,8 +1086,12 @@ void setup(const struct real_mode_args *rm_args_ptr) dpp = mempcpy(dpp, shdr->cmdline, cmdline_len); } + /* Note the previous INT 13h hook in the "safe hook" structure */ + hptr->safe_hook.old_hook.uint32 = pptr->mdi.oldint13.uint32; + /* Re-fill the "safe hook" mBFT field with the physical address */ - safe_hook->mBFT += (uint32_t)hptr; + hptr->safe_hook.mBFT.ptr = + (struct mBFT *)(((const char *)hptr) + hptr->safe_hook.mBFT.offset); /* Update various BIOS magic data areas (gotta love this shit) */ @@ -1242,21 +1122,20 @@ void setup(const struct real_mode_args *rm_args_ptr) if (getcmditem("dpt") != CMD_NOTFOUND || ((nflop == 1 || no_bpt) && getcmditem("nodpt") == CMD_NOTFOUND)) { /* Do install a replacement DPT into INT 1Eh */ - pptr->dpt_ptr = hptr->patch_offs + offsetof(struct patch_area, dpt); + pptr->mdi.dpt_ptr = + hptr->patch_offs + offsetof(struct patch_area, dpt); } } /* Complete the mBFT */ - { - struct mBFT *mBFT = (struct mBFT *)safe_hook->mBFT; - - mBFT->acpi.signature[0] = 'm'; /* "mBFT" */ - mBFT->acpi.signature[1] = 'B'; - mBFT->acpi.signature[2] = 'F'; - mBFT->acpi.signature[3] = 'T'; - mBFT->safe_hook = (uint32_t)safe_hook; - mBFT->acpi.checksum = -checksum_buf(mBFT, mBFT->acpi.length); - } + hptr->safe_hook.mBFT.ptr->acpi.signature[0] = 'm'; /* "mBFT" */ + hptr->safe_hook.mBFT.ptr->acpi.signature[1] = 'B'; + hptr->safe_hook.mBFT.ptr->acpi.signature[2] = 'F'; + hptr->safe_hook.mBFT.ptr->acpi.signature[3] = 'T'; + hptr->safe_hook.mBFT.ptr->safe_hook.ptr = &hptr->safe_hook; + hptr->safe_hook.mBFT.ptr->acpi.checksum = + -checksum_buf(hptr->safe_hook.mBFT.ptr, + hptr->safe_hook.mBFT.ptr->acpi.length); /* Install the interrupt handlers */ printf("old: int13 = %08x int15 = %08x int1e = %08x\n", @@ -1264,8 +1143,8 @@ void setup(const struct real_mode_args *rm_args_ptr) wrz_32(BIOS_INT13, driverptr + hptr->int13_offs); wrz_32(BIOS_INT15, driverptr + hptr->int15_offs); - if (pptr->dpt_ptr) - wrz_32(BIOS_INT1E, driverptr + pptr->dpt_ptr); + if (pptr->mdi.dpt_ptr) + wrz_32(BIOS_INT1E, driverptr + pptr->mdi.dpt_ptr); printf("new: int13 = %08x int15 = %08x int1e = %08x\n", rdz_32(BIOS_INT13), rdz_32(BIOS_INT15), rdz_32(BIOS_INT1E)); @@ -1291,7 +1170,8 @@ void setup(const struct real_mode_args *rm_args_ptr) /* Reboot into the new "disk" */ puts("Loading boot sector... "); - memcpy((void *)boot_base, (char *)pptr->diskbuf + geometry->boot_lba * 512, + memcpy((void *)boot_base, + (char *)pptr->mdi.diskbuf + geometry->boot_lba * 512, boot_len); if (getcmditem("pause") != CMD_NOTFOUND) { @@ -1306,3 +1186,4 @@ void setup(const struct real_mode_args *rm_args_ptr) shdr->esdi = pnp_install_check(); shdr->edx = geometry->driveno; } + |