/* * mknbi.h - mknbi constants and type definitions * * Copyright (C) 1995-2003 Gero Kuhlmann * Copyright (C) 1996-2003 Gero Kuhlmann * and Markus Gutschke * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: mknbi.h,v 1.8 2003/01/25 23:29:44 gkminix Exp $ */ #ifndef _MKNBI_H_LINUX_ #define _MKNBI_H_LINUX_ /* * Include version information */ #include /* * Everything in this file has to be in packed structures. */ #ifdef USE_PRAGMA_PACK #pragma pack(1) #endif #ifdef USE_PRAGMA_ALIGN #pragma options align=packed #endif /* * The RAM looks like this after the boot image has been loaded by the * Boot-ROM: * * 0x030000-0x0301FF 0.5kB linux boot sector (aka INITSEG) * 0x030200-0x0341FF 16kB linux kernel setup (aka SETUPSEG) * 0x034200-0x0349FF 2kB default command line * 0x034A00-0x034BFF 0.5kB load header * 0x034C00-0x038BFF 16kB primary boot loader * 0x100000-0xxxxxxx xkB linux kernel (aka SYSSEG) * * Note that the kernel has to start at 0x100000, as the kernel decompression * routine depends on this. */ #define DEF_HEADERSEG 0x034A0L /* boot header load segment */ #define DEF_SYSSEG 0x10000L /* kernel load segment */ #define DEF_INITSEG 0x03000L /* boot sector load segment */ #define INITLSIZE 512L /* max load size of boot sector */ #define INITMSIZE 512L /* max memory size of boot sector */ #define DEF_SETUPSEG 0x03020L /* kernel setup load segment */ #define SETUPLSIZE 12288L /* max load size of kernel setup */ #define SETUPMSIZE 16384L /* max memory size of kernel setup */ #define DEF_CMDLSEG 0x03420L /* command line load segment */ #define CMDLLSIZE 2048L /* max load size of command line */ #define CMDLMSIZE 2048L /* max memory size of command line */ #define DEF_BOOTLSEG 0x034C0L /* primary loader load segment */ #define BOOTLLSIZE 8192L /* max load size of primary loader */ #define BOOTLMSIZE 16384L /* max memory size of primary loader */ /* * Default values for command line etc. */ #define SECTSIZE 512L /* Size of one sector */ #define BOOT_SIGNATURE 0xaa55 /* boot signature */ #define BOOT_SIG_OFF 510 /* boot signature offset */ #define BOOT_SETUP_SEGS 497 /* offset to setup sect num */ #define MAX_ADDR_SIZE 15 /* Max size of addr strings */ #define DFLT_CMDL "auto rw" /* Default kernel cmd line */ #define DFLT_IMAGE "/vmlinuz" /* Name of default krnl image */ #define DFLT_DIR "kernel" /* Name of default NFS dir */ #define DFLT_ADDRS "kernel" /* Default address resolution */ #define DFLT_DEV "root=/dev/nfs" /* root device for kernel */ #define KERNEL_ADDRS "::::::any" /* Default kernel addresses */ #define NFS_ROOT "nfsroot=" /* nfsroot option for kernel */ #define NFS_ADDRS "nfsaddrs=" /* nfsaddrs option for kernel */ #define NFS_IP "ip=" /* ip option for kernel */ #define VGA_ARG "vga=" /* VGA mode argument */ /* * The boot image has the following header in it's first sector */ struct load_header { struct i_long magic PACKED; /* magic number */ __u8 hlength PACKED; /* length of header */ __u8 hflags1 PACKED; /* header flags */ __u8 hflags2 PACKED; __u8 hflags3 PACKED; struct i_addr locn PACKED; /* location of this header */ struct i_addr execute PACKED; /* execution address */ __u8 dummy[494]; /* up to full sector */ __u16 bootsig PACKED; /* boot signature */ }; #define HEADER_MAGIC 0x1B031336 /* Magic no for load header */ /* * In the header sector the load records are located, which actually tell * which part of the following image has to go where in memory */ union vendor_data { __u8 rdflags PACKED; /* flags for rd loading */ __u8 krnflags PACKED; /* kernel flags */ }; struct load_record { __u8 rlength PACKED; /* length of record */ __u8 rtag1 PACKED; /* record tags */ __u8 rtag2 PACKED; __u8 rflags PACKED; /* record flags */ struct i_long address PACKED; /* abs addr for part in mem */ struct i_long ilength PACKED; /* len of part in boot image */ struct i_long mlength PACKED; /* memory needed for part */ union vendor_data vendor_data PACKED; /* optional vendor data */ }; #define FLAG_B0 1 #define FLAG_B1 2 #define FLAG_EOF 4 /* * Number of each load record. Don't change the loading order of the * modules by changing these numbers, because the whole kernel gets * loaded in one big chunk, while the records really split the kernel * image in memory. These values have to be identical with those in * the include file of the boot loader assembler module. * * These numbers must be in the same order that the respective "initrec" * calls happen! */ #define BOOTLNUM 0 /* primary boot loader */ #define CMDLNUM 1 /* command line */ #define INITNUM 2 /* floppy boot sector */ #define SETUPNUM 3 /* kernel setup */ #define KERNELNUM 4 /* kernel image */ #define RAMDISKNUM 5 /* ramdisk image */ #define NUM_RECORDS 6 #define VENDOR_ID "GK-mknbi-linux" /* Vendor ID */ #define VENDOR_OFF 16 /* Offset for vendor tags */ /* * We need to take a look at the kernel setup header in order to determine * whether the kernel image needs to be loaded into high memory. */ struct setup_header { __u8 jump[2] PACKED; __u8 magic[4] PACKED; /* "HdrS" */ __u16 version PACKED; /* >= 0x0201 for initrd */ __u8 realmode_swtch[4] PACKED; __u16 start_sys_seg PACKED; __u16 kernel_version PACKED; __u8 type_of_loader PACKED; __u8 loadflags PACKED; __u16 setup_move_size PACKED; struct i_long code32_start PACKED; struct i_long ramdisk_image PACKED; struct i_long ramdisk_size PACKED; struct i_long bootsect_kludge PACKED; __u16 heap_end_ptr PACKED; __u16 pad1 PACKED; struct i_long cmd_line_ptr PACKED; struct i_long initrd_addr_max PACKED; }; #define SETUP_MAGIC "HdrS" #define SETUP_VERSION 0x0201 #define SETUP_LILO 0x00 #define SETUP_LOADLIN 0x10 #define SETUP_BOOTSECT 0x20 #define SETUP_SYSLX 0x30 #define SETUP_NETBOOT 0x41 #define SETUP_HIGH 0x01 #define SETUP_USEHEAP 0x80 /* * Ramdisk images can be loaded in three different ways: * * RD_AUTO -- The ramdisk image is loaded at either 0x100000 or right * behind the kernel image; at run-time it will be moved * to the end of physical memory or right before 0x1000000. * This technique guarantees maximum compatibility with * broken BIOS versions without making assumptions on the * way, the BOOT-Prom determined the end of memory. The * drawback is, that moving the image costs some extra time. * RD_EOM -- The ramdisk image is loaded right before the end of * physical memory. It is the BOOT-Proms responsibility to do * this reliably. This might cause problems with some ancient * BIOS versions, if the computer is equipped with more then * 16M of main memory. * RD_FIXED -- The user provided a fixed load address for the ramdisk * image. This entails possible compatibility restrictions * when moving the image from one client to another. OTOH, * it could be the final solution if everything else fails... */ #define RD_AUTO 0 #define RD_EOM 1 #define RD_FIXED 2 /* * Flags for the protected mode kernel: * * KRN_USE_IP -- Newer kernels (above 2.2.x) use "ip=" instead of * "nfsaddrs=" on the command line. They should also * never remove this option if "kernel" is given as * the argument. We use this flag to tell the boot * loader. * KRN_NFS_IP -- Kernel versions 2.4.x and above need the address * of the NFS server at the beginning of the nfsroot * command line option * KRN_LOW -- Flag for loading the kernel into low memory */ #define KRN_USE_IP 0x01 #define KRN_NFS_IP 0x02 #define KRN_LOW 0x04 /* * Special VGA mode values */ #define VGA_NORMAL -1 #define VGA_EXTENDED -2 #define VGA_ASK -3 #define VGA_DEFAULT -4 #define VGA_MIN -3 /* Minimum value */ #define VGA_MAX 0x7FFF /* Maximum value */ /* * Turnoff structure packing and return to normal data alignment. */ #ifdef USE_PRAGMA #pragma pack() #endif #ifdef USE_PRAGMA_ALIGN #pragma options align=reset #endif /* * Data area which contains the boot loader module */ extern __u8 first_data[]; extern unsigned int first_data_size; extern __u8 firstd_data[]; extern unsigned int firstd_data_size; #endif