root/usr/src/boot/i386/libi386/linux.h
/*
 * This file and its contents are supplied under the terms of the
 * Common Development and Distribution License ("CDDL"), version 1.0.
 * You may only use this file in accordance with the terms of version
 * 1.0 of the CDDL.
 *
 * A full copy of the text of the CDDL should have accompanied this
 * source.  A copy of the CDDL is also available via the Internet at
 * http://www.illumos.org/license/CDDL.
 */

/*
 * Copyright 2015 Toomas Soome <tsoome@me.com>
 */

#ifndef _LINUX_H
#define _LINUX_H

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ASM_FILE
/* For the Linux/i386 boot protocol version 2.10.  */
struct linux_kernel_header
{
  uint8_t code1[0x0020];
  uint16_t cl_magic;               /* Magic number 0xA33F */
  uint16_t cl_offset;              /* The offset of command line */
  uint8_t code2[0x01F1 - 0x0020 - 2 - 2];
  uint8_t setup_sects;             /* The size of the setup in sectors */
  uint16_t root_flags;             /* If the root is mounted readonly */
  uint16_t syssize;                /* obsolete */
  uint16_t swap_dev;               /* obsolete */
  uint16_t ram_size;               /* obsolete */
  uint16_t vid_mode;               /* Video mode control */
  uint16_t root_dev;               /* Default root device number */
  uint16_t boot_flag;              /* 0xAA55 magic number */
  uint16_t jump;                   /* Jump instruction */
  uint32_t header;                 /* Magic signature "HdrS" */
  uint16_t version;                /* Boot protocol version supported */
  uint32_t realmode_swtch;         /* Boot loader hook */
  uint16_t start_sys;              /* The load-low segment (obsolete) */
  uint16_t kernel_version;         /* Points to kernel version string */
  uint8_t type_of_loader;          /* Boot loader identifier */
  uint8_t loadflags;               /* Boot protocol option flags */
  uint16_t setup_move_size;        /* Move to high memory size */
  uint32_t code32_start;           /* Boot loader hook */
  uint32_t ramdisk_image;          /* initrd load address */
  uint32_t ramdisk_size;           /* initrd size */
  uint32_t bootsect_kludge;        /* obsolete */
  uint16_t heap_end_ptr;           /* Free memory after setup end */
  uint16_t pad1;                   /* Unused */
  uint32_t cmd_line_ptr;           /* Points to the kernel command line */
  uint32_t initrd_addr_max;        /* Highest address for initrd */
  uint32_t kernel_alignment;
  uint8_t relocatable;
  uint8_t min_alignment;
  uint8_t pad[2];
  uint32_t cmdline_size;
  uint32_t hardware_subarch;
  uint64_t hardware_subarch_data;
  uint32_t payload_offset;
  uint32_t payload_length;
  uint64_t setup_data;
  uint64_t pref_address;
  uint32_t init_size;
} __attribute__ ((packed));
#endif

#define LINUX_VID_MODE_NORMAL           0xFFFF
#define LINUX_VID_MODE_EXTENDED         0xFFFE
#define LINUX_VID_MODE_ASK              0xFFFD

#define BOOTSEC_SIGNATURE               0xAA55
#define LINUX_BOOT_LOADER_TYPE          0x72
#define LINUX_BZIMAGE_ADDR              0x100000
#define LINUX_CL_END_OFFSET             0x90FF
#define LINUX_CL_MAGIC                  0xA33F
#define LINUX_CL_OFFSET                 0x9000
#define LINUX_DEFAULT_SETUP_SECTS       4
#define LINUX_ESP                       0x9000
#define LINUX_FLAG_BIG_KERNEL           0x1
#define LINUX_FLAG_CAN_USE_HEAP         0x80
#define LINUX_HEAP_END_OFFSET           (0x9000 - 0x200)
#define LINUX_MAGIC_SIGNATURE           0x53726448
#define LINUX_MAX_SETUP_SECTS           64
#define LINUX_OLD_REAL_MODE_ADDR        0x90000
#define LINUX_SETUP_MOVE_SIZE           0x9100
#define LINUX_ZIMAGE_ADDR               0x10000
#define LINUX_INITRD_MAX_ADDRESS        0x38000000

#ifdef __cplusplus
}
#endif

#endif /* _LINUX_H */