The info member

The startup_header boot header structure's info member is an array of startup_info* structures that provide a communications area between the IPL and the startup code.

When the IPL code detects system features (e.g., amount of memory installed, current time, information about the bus used on the system, etc.), it stores this information in the info array so that the startup code can retrieve it later. This design saves the startup code from repeating the same detection logic as the IPL. The startup_info* structures and enumerated types include:

startup_info_hdr, startup_info_types, startup_info_skip, startup_info_mem and startup_info_mem_extended, startup_info_disk, startup_info_time, startup_info_box, bootargs_entry, startup_trailer


The startup_header info member is declared as an array of longs. This declaration allocates a storage area, which contains a set of structures, each beginning with a startup_info_hdr header:

struct startup_info_hdr {
	_Uint16t			type;
	_Uint16t			size;
Member Type Description
type _Uint16t The startup_info_hdr's type member can be one of the values defined by the startup_info_types enumerated types (see #ipl_info__info_types below).
size _Uint16t Size of the current startup_info_* structure, in bytes.


enum startup_info_types {
    STARTUP_INFO_SKIP = 0,	/* If size 0 then end of list */
    STARTUP_INFO_USER = 0x8000	/* User reserved numbers start here */

The startup_info_hdr enumerated types include:

Ignore this field. If the corresponding size member is 0, this is the end of the info list.
A startup_info_mem or startup_info_mem_extended structure is present.
A startup_info_disk structure is present.
A startup_info_time structure is present.
A startup_info_box structure is present.


struct startup_info_skip {
    struct startup_info_hdr	hdr;

startup_info_mem and startup_info_mem_extended

These structures contain an address and size pair defining a chunk of memory that should be added to procnto's free memory pool.

The startup_info_mem structure is defined as follows:

struct startup_info_mem {
	struct startup_info_hdr	hdr;
	_Uint32t				addr;
	_Uint32t				size;
Member Type Description
startup_info_hdr struct Standard info array header structure
addr _Uint32t Memory block start address
size _Uint32t Memory block size, in bytes

The addr and size fields are 32 bits long, so memory is limited to 4 GB. For larger memory blocks, the startup_info_mem_extended structure is used:

struct startup_info_mem_extended {
	struct startup_info_mem	mem;
	_Uint32t			addr_hi;
	_Uint32t			size_hi;
Member Type Description
startup_info_mem struct The structure for memory blocks that are less than 4 GB
addr_hi _Uint32t High portion of the memory address (see below)
size_hi _Uint32t High portion of the memory size (see below).

For the extended structure, determine the address and size from the addr_hi and size_hi members and the encapsulated startup_info_mem structure as follows:

((paddr64_t) addr_hi << 32) | mem.addr
((paddr64_t) size_hi << 32) | mem.size

More than one startup_info_mem or startup_info_mem_extended structure may be present to accommodate systems that have free memory located in various blocks throughout the address space.

Both these structures are indentified by a type member of STARTUP_INFO_MEM in the startup_info_hdr structure; use the size field in the header to tell them apart.


The startup_info_disk structure contains information about any hard disks detected. It is defined as follows:

struct startup_info_disk {
	struct startup_info_hdr	hdr;
	_Uint8t					drive;
	_Uint8t					zero;
	_Uint16t				heads;
	_Uint16t				cylinders;
	_Uint16t				sectors;
	_Uint32t				blocks;

Contains information about any hard disks detected (on a systemwith an APIC). Its members are as follows:

Member Type Description
startup_info_hdr struct Standard info array header structure
drive _Uint8t Drive number
zero _Uint8t Reserved; must be zero
heads _Uint16t Number of heads present
cylinders _Uint16t Number of cylinders present
sectors _Uint16t Number of sectors present
blocks _Uint32t Total block size of device. Assuming 512 bytes per block, the total size is calculate by the formula heads × cylinders × sectors.


The startup_info_time structure contains a record of the system's most recent startup time.

struct startup_info_time {
    struct startup_info_hdr    hdr;
    _Uint32t	               time;
Member Type Description
startup_info_hdr struct Standard info array header structure
time _Uint32t The time member contains the current time as the number of seconds since 1970 01 01 00:00:00 GMT.


struct startup_info_box {
	struct startup_info_hdr	hdr;
	_Uint8t					boxtype;
	_Uint8t					bustype;
	_Uint8t					spare[2];
Member Type Description
startup_info_hdr struct Standard info array header structure
boxtype _Uint8t  
bustype _Uint8t  
spare[2] _Uint8t Reserved. Must be zero.


struct bootargs_entry {
	_Uint8t					size_lo;	/* Includes entire structure */
	_Uint8t					size_hi;
	_Int8t					argc;
	_Int8t					envc;
	_Uint32t				shdr_addr;
	char					args[1];	/* variable length */
Member Type Description
size_lo _Uint8t  
size_hi _Uint8t  
argc _Int8t  
envc _Int8t  
shdr_addr _Uint32t  
args[1] char  


The startup_trailer structure contains a checksum for the startup_header structure, calculated from the start of the header to the start of the trailer (this structure):

struct startup_trailer {
    unsigned long           cksum;
Member Type Description
cksum _Uint32t Checksum from start of header to start of trailer