176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2001-2009 H. Peter Anvin - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Portions copyright 2009-2010 Shao Miller 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * [El Torito code, mBFT, "safe hook"] 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Boston MA 02111-1307, USA; either version 2 of the License, or 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version; incorporated herein by reference. 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */ 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* These structures are common to MEMDISK and MDISKCHK.COM */ 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "compiler.h" 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct seg_off { 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t offset; 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t segment; 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef union { 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct seg_off seg_off; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t uint32; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} real_addr_t; 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Forward declaration */ 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct mBFT; 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMEMDISK_PACKED_PREFIX 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct safe_hook { 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t jump[3]; /* Max. three bytes for jump */ 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t signature[8]; /* "$INT13SF" */ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t vendor[8]; /* "MEMDISK " */ 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman real_addr_t old_hook; /* SEG:OFF for previous INT 13h hook */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t flags; /* "Safe hook" flags */ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* The next field is a MEMDISK extension to the "safe hook" structure */ 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t mbft; 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} MEMDISK_PACKED_POSTFIX; 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct memdisk_header { 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t int13_offs; 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t int15_offs; 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t patch_offs; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t total_size; 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t iret_offs; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct safe_hook safe_hook; 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMEMDISK_PACKED_PREFIX 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* EDD disk parameter table */ 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct edd_dpt { 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t len; /* Length of table */ 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* Information flags */ 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t c; /* Physical cylinders (count!) */ 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t h; /* Physical heads (count!) */ 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t s; /* Physical sectors/track (count!) */ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t sectors; /* Total sectors */ 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t bytespersec; /* Bytes/sector */ 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman real_addr_t dpte; /* DPTE pointer */ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t dpikey; /* Device Path Info magic */ 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t dpilen; /* Device Path Info length */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t res1; /* Reserved */ 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t res2; /* Reserved */ 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t bustype[4]; /* Host bus type */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t inttype[8]; /* Interface type */ 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t intpath; /* Interface path */ 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t devpath[2]; /* Device path (double QuadWord!) */ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t res3; /* Reserved */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t chksum; /* DPI checksum */ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} MEMDISK_PACKED_POSTFIX; 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Requirement for struct edd4_cd_pkt */ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "../memdisk/eltorito.h" 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Official MEMDISK Info structure ("MDI") */ 8176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMEMDISK_PACKED_PREFIX 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct mdi { 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const uint16_t bytes; 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const uint8_t version_minor; 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const uint8_t version_major; 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t diskbuf; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t disksize; 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman real_addr_t cmdline; 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman real_addr_t oldint13; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman real_addr_t oldint15; 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t olddosmem; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t bootloaderid; 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t sector_shift; 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t dpt_ptr; 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} MEMDISK_PACKED_POSTFIX; 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Requirement for struct acpi_description_header */ 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "../memdisk/acpi.h" 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMEMDISK_PACKED_PREFIX 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct mBFT { 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct acpi_description_header acpi; 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t safe_hook; /* "Safe hook" physical address */ 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct mdi mdi; 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} MEMDISK_PACKED_POSTFIX; 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* The Disk Parameter Table may be required */ 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef union { 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct hd_dpt { 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t max_cyl; /* Max cylinder */ 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t max_head; /* Max head */ 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t junk1[5]; /* Obsolete junk, leave at zero */ 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t ctrl; /* Control byte */ 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t junk2[7]; /* More obsolete junk */ 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } hd; 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct fd_dpt { 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t specify1; /* "First specify byte" */ 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t specify2; /* "Second specify byte" */ 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t delay; /* Delay until motor turn off */ 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t bps; /* Bytes/sector (02h = 512) */ 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t sectors; /* Sectors/track */ 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t isgap; /* Length of intersector gap */ 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t dlen; /* Data length (0FFh) */ 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t fgap; /* Formatting gap */ 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t ffill; /* Format fill byte */ 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t settle; /* Head settle time (ms) */ 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t mstart; /* Motor start time */ 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t maxtrack; /* Maximum track number */ 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t rate; /* Data transfer rate */ 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t cmos; /* CMOS type */ 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t pad[2]; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t old_fd_dpt; /* Extension: pointer to old INT 1Eh */ 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } fd; 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} dpt_t; 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMEMDISK_PACKED_PREFIX 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct patch_area { 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct mdi mdi; 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t driveshiftlimit; /* Do not shift drives above this region */ 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t _pad2; /* Pad to DWORD */ 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t _pad3; /* Pad to QWORD */ 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t memint1588; 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t cylinders; 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t heads; 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t sectors; 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t mem1mb; 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t mem16mb; 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t driveno; 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t drivetype; 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t drivecnt; 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t configflags; 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CONFIG_READONLY 0x01 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CONFIG_RAW 0x02 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CONFIG_SAFEINT 0x04 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CONFIG_BIGRAW 0x08 /* MUST be 8! */ 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CONFIG_MODEMASK 0x0e 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t mystack; 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t statusptr; 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dpt_t dpt; 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct edd_dpt edd_dpt; 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct edd4_cd_pkt cd_pkt; /* Only really in a memdisk_iso_* hook */ 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} MEMDISK_PACKED_POSTFIX; 179