176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _BZIMAGE_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _BZIMAGE_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER );
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A bzImage header
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * As documented in Documentation/i386/boot.txt
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct bzimage_header {
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** The size of the setup in sectors
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * If this field contains 0, assume it contains 4.
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t setup_sects;
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** If set, the root is mounted readonly */
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t root_flags;
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** DO NOT USE - for bootsect.S use only */
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t syssize;
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** DO NOT USE - obsolete */
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t swap_dev;
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** DO NOT USE - for bootsect.S use only */
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t ram_size;
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Video mode control */
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t vid_mode;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Default root device number */
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t root_dev;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** 0xAA55 magic number */
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t boot_flag;
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Jump instruction */
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t jump;
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Magic signature "HdrS" */
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t header;
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Boot protocol version supported */
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t version;
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Boot loader hook (see below) */
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t realmode_swtch;
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** The load-low segment (0x1000) (obsolete) */
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t start_sys;
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Pointer to kernel version string */
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t kernel_version;
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Boot loader identifier */
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type_of_loader;
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Boot protocol option flags */
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t loadflags;
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Move to high memory size (used with hooks) */
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t setup_move_size;
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Boot loader hook (see below) */
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t code32_start;
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** initrd load address (set by boot loader) */
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t ramdisk_image;
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** initrd size (set by boot loader) */
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t ramdisk_size;
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** DO NOT USE - for bootsect.S use only */
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t bootsect_kludge;
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Free memory after setup end */
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t heap_end_ptr;
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Unused */
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t pad1;
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** 32-bit pointer to the kernel command line */
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t cmd_line_ptr;
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Highest legal initrd address */
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t initrd_addr_max;
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Physical addr alignment required for kernel	*/
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t kernel_alignment;
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Whether kernel is relocatable or not */
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t relocatable_kernel;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Unused */
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t pad2[3];
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Maximum size of the kernel command line */
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t cmdline_size;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Offset of bzImage header within kernel image */
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_HDR_OFFSET 0x1f1
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage boot flag value */
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_BOOT_FLAG 0xaa55
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage magic signature value */
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_SIGNATURE 0x53726448
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage boot loader identifier for Etherboot */
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_LOADER_TYPE_ETHERBOOT 0x40
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage boot loader identifier for gPXE
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * We advertise ourselves as Etherboot version 6.
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_LOADER_TYPE_GPXE ( BZI_LOADER_TYPE_ETHERBOOT | 0x06 )
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage "load high" flag */
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_LOAD_HIGH 0x01
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Load address for high-loaded kernels */
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_LOAD_HIGH_ADDR 0x100000
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Load address for low-loaded kernels */
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_LOAD_LOW_ADDR 0x10000
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage "kernel can use heap" flag */
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_CAN_USE_HEAP 0x80
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage special video mode "normal" */
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_VID_MODE_NORMAL 0xffff
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage special video mode "ext" */
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_VID_MODE_EXT 0xfffe
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage special video mode "ask" */
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_VID_MODE_ASK 0xfffd
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage maximum initrd address for versions < 2.03 */
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_INITRD_MAX 0x37ffffff
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage command-line structure used by older kernels */
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct bzimage_cmdline {
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Magic signature */
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t magic;
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Offset to command line */
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t offset;
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Offset of bzImage command-line structure within kernel image */
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_CMDLINE_OFFSET 0x20
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** bzImage command line present magic marker value */
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_CMDLINE_MAGIC 0xa33f
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Assumed size of real-mode portion (including .bss) */
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_ASSUMED_RM_SIZE 0x8000
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Amount of stack space to provide */
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_STACK_SIZE 0x1000
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum size of command line */
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BZI_CMDLINE_SIZE 0x100
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _BZIMAGE_H */
143