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