1 /* ----------------------------------------------------------------------- * 2 * 3 * Copyright 2001-2009 H. Peter Anvin - All Rights Reserved 4 * Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin 5 * Portions copyright 2009-2010 Shao Miller 6 * [El Torito code, mBFT, "safe hook"] 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 11 * Boston MA 02111-1307, USA; either version 2 of the License, or 12 * (at your option) any later version; incorporated herein by reference. 13 * 14 * ----------------------------------------------------------------------- */ 15 16 /* These structures are common to MEMDISK and MDISKCHK.COM */ 17 18 #include <stdint.h> 19 #include "compiler.h" 20 21 struct seg_off { 22 uint16_t offset; 23 uint16_t segment; 24 }; 25 26 typedef union { 27 struct seg_off seg_off; 28 uint32_t uint32; 29 } real_addr_t; 30 31 /* Forward declaration */ 32 struct mBFT; 33 34 MEMDISK_PACKED_PREFIX 35 struct safe_hook { 36 uint8_t jump[3]; /* Max. three bytes for jump */ 37 uint8_t signature[8]; /* "$INT13SF" */ 38 uint8_t vendor[8]; /* "MEMDISK " */ 39 real_addr_t old_hook; /* SEG:OFF for previous INT 13h hook */ 40 uint32_t flags; /* "Safe hook" flags */ 41 /* The next field is a MEMDISK extension to the "safe hook" structure */ 42 uint32_t mbft; 43 } MEMDISK_PACKED_POSTFIX; 44 45 struct memdisk_header { 46 uint16_t int13_offs; 47 uint16_t int15_offs; 48 uint16_t patch_offs; 49 uint16_t total_size; 50 uint16_t iret_offs; 51 struct safe_hook safe_hook; 52 }; 53 54 MEMDISK_PACKED_PREFIX 55 /* EDD disk parameter table */ 56 struct edd_dpt { 57 uint16_t len; /* Length of table */ 58 uint16_t flags; /* Information flags */ 59 uint32_t c; /* Physical cylinders (count!) */ 60 uint32_t h; /* Physical heads (count!) */ 61 uint32_t s; /* Physical sectors/track (count!) */ 62 uint64_t sectors; /* Total sectors */ 63 uint16_t bytespersec; /* Bytes/sector */ 64 real_addr_t dpte; /* DPTE pointer */ 65 uint16_t dpikey; /* Device Path Info magic */ 66 uint8_t dpilen; /* Device Path Info length */ 67 uint8_t res1; /* Reserved */ 68 uint16_t res2; /* Reserved */ 69 uint8_t bustype[4]; /* Host bus type */ 70 uint8_t inttype[8]; /* Interface type */ 71 uint64_t intpath; /* Interface path */ 72 uint64_t devpath[2]; /* Device path (double QuadWord!) */ 73 uint8_t res3; /* Reserved */ 74 uint8_t chksum; /* DPI checksum */ 75 } MEMDISK_PACKED_POSTFIX; 76 77 /* Requirement for struct edd4_cd_pkt */ 78 #include "../memdisk/eltorito.h" 79 80 /* Official MEMDISK Info structure ("MDI") */ 81 MEMDISK_PACKED_PREFIX 82 struct mdi { 83 const uint16_t bytes; 84 const uint8_t version_minor; 85 const uint8_t version_major; 86 87 uint32_t diskbuf; 88 uint32_t disksize; 89 real_addr_t cmdline; 90 91 real_addr_t oldint13; 92 real_addr_t oldint15; 93 94 uint16_t olddosmem; 95 uint8_t bootloaderid; 96 uint8_t sector_shift; 97 98 uint16_t dpt_ptr; 99 } MEMDISK_PACKED_POSTFIX; 100 101 /* Requirement for struct acpi_description_header */ 102 #include "../memdisk/acpi.h" 103 104 MEMDISK_PACKED_PREFIX 105 struct mBFT { 106 struct acpi_description_header acpi; 107 uint32_t safe_hook; /* "Safe hook" physical address */ 108 struct mdi mdi; 109 } MEMDISK_PACKED_POSTFIX; 110 111 /* The Disk Parameter Table may be required */ 112 typedef union { 113 struct hd_dpt { 114 uint16_t max_cyl; /* Max cylinder */ 115 uint8_t max_head; /* Max head */ 116 uint8_t junk1[5]; /* Obsolete junk, leave at zero */ 117 uint8_t ctrl; /* Control byte */ 118 uint8_t junk2[7]; /* More obsolete junk */ 119 } hd; 120 struct fd_dpt { 121 uint8_t specify1; /* "First specify byte" */ 122 uint8_t specify2; /* "Second specify byte" */ 123 uint8_t delay; /* Delay until motor turn off */ 124 uint8_t bps; /* Bytes/sector (02h = 512) */ 125 126 uint8_t sectors; /* Sectors/track */ 127 uint8_t isgap; /* Length of intersector gap */ 128 uint8_t dlen; /* Data length (0FFh) */ 129 uint8_t fgap; /* Formatting gap */ 130 131 uint8_t ffill; /* Format fill byte */ 132 uint8_t settle; /* Head settle time (ms) */ 133 uint8_t mstart; /* Motor start time */ 134 uint8_t maxtrack; /* Maximum track number */ 135 136 uint8_t rate; /* Data transfer rate */ 137 uint8_t cmos; /* CMOS type */ 138 uint8_t pad[2]; 139 140 uint32_t old_fd_dpt; /* Extension: pointer to old INT 1Eh */ 141 } fd; 142 } dpt_t; 143 144 MEMDISK_PACKED_PREFIX 145 struct patch_area { 146 struct mdi mdi; 147 148 uint8_t driveshiftlimit; /* Do not shift drives above this region */ 149 uint8_t _pad2; /* Pad to DWORD */ 150 uint16_t _pad3; /* Pad to QWORD */ 151 152 uint16_t memint1588; 153 154 uint16_t cylinders; 155 uint16_t heads; 156 uint32_t sectors; 157 158 uint32_t mem1mb; 159 uint32_t mem16mb; 160 161 uint8_t driveno; 162 uint8_t drivetype; 163 uint8_t drivecnt; 164 uint8_t configflags; 165 166 #define CONFIG_READONLY 0x01 167 #define CONFIG_RAW 0x02 168 #define CONFIG_SAFEINT 0x04 169 #define CONFIG_BIGRAW 0x08 /* MUST be 8! */ 170 #define CONFIG_MODEMASK 0x0e 171 172 uint16_t mystack; 173 uint16_t statusptr; 174 175 dpt_t dpt; 176 struct edd_dpt edd_dpt; 177 struct edd4_cd_pkt cd_pkt; /* Only really in a memdisk_iso_* hook */ 178 } MEMDISK_PACKED_POSTFIX; 179