[e16e8f2] | 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; |
---|