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_MEM, STARTUP_INFO_DISK, STARTUP_INFO_TIME, STARTUP_INFO_BOX, STARTUP_INFO_USER = 0x8000 /* User reserved numbers start here */ };
The startup_info_hdr enumerated types include:
struct startup_info_skip { struct startup_info_hdr hdr; };
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. 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 |