From 809933d9f7ef11b6cc6de38f2015b66c2d98a8b2 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 23 May 2005 23:32:56 +0000 Subject: Split PXE code into preboot, udp, tftp, undi and loader units. PXE code now compiles without errors (though it won't actually work). --- src/include/pxe.h | 27 ++++++-- src/include/pxe_api.h | 173 ++++++++++++++++++++++++----------------------- src/include/pxe_export.h | 61 ----------------- src/include/pxe_types.h | 2 +- 4 files changed, 110 insertions(+), 153 deletions(-) delete mode 100644 src/include/pxe_export.h (limited to 'src/include') diff --git a/src/include/pxe.h b/src/include/pxe.h index d4c683fcc..3264df0c0 100644 --- a/src/include/pxe.h +++ b/src/include/pxe.h @@ -3,6 +3,7 @@ #include "pxe_types.h" #include "pxe_api.h" +#include "etherboot.h" /* Union used for PXE API calls; we don't know the type of the * structure until we interpret the opcode. Also, Status is available @@ -14,7 +15,7 @@ union u_PXENV_ANY { PXENV_STATUS_t Status; struct s_PXENV_UNLOAD_STACK unload_stack; struct s_PXENV_GET_CACHED_INFO get_cached_info; - struct s_PXENV_RESTART_TFTP restart_tftp; + struct s_PXENV_TFTP_READ_FILE restart_tftp; struct s_PXENV_START_UNDI start_undi; struct s_PXENV_STOP_UNDI stop_undi; struct s_PXENV_START_BASE start_base; @@ -31,7 +32,7 @@ union u_PXENV_ANY { struct s_PXENV_UNDI_STARTUP undi_startup; struct s_PXENV_UNDI_CLEANUP undi_cleanup; struct s_PXENV_UNDI_INITIALIZE undi_initialize; - struct s_PXENV_UNDI_RESET_ADAPTER undi_reset_adapter; + struct s_PXENV_UNDI_RESET undi_reset_adapter; struct s_PXENV_UNDI_SHUTDOWN undi_shutdown; struct s_PXENV_UNDI_OPEN undi_open; struct s_PXENV_UNDI_CLOSE undi_close; @@ -62,16 +63,26 @@ typedef enum { READY } pxe_stack_state_t; +#define ENSURE_CAN_UNLOAD(structure) if ( ! ensure_pxe_state(CAN_UNLOAD) ) { \ + structure->Status = PXENV_STATUS_UNDI_INVALID_STATE; \ + return PXENV_EXIT_FAILURE; } +#define ENSURE_MIDWAY(structure) if ( ! ensure_pxe_state(MIDWAY) ) { \ + structure->Status = PXENV_STATUS_UNDI_INVALID_STATE; \ + return PXENV_EXIT_FAILURE; } +#define ENSURE_READY(structure) if ( ! ensure_pxe_state(READY) ) { \ + structure->Status = PXENV_STATUS_UNDI_INVALID_STATE; \ + return PXENV_EXIT_FAILURE; } + /* Data structures installed as part of a PXE stack. Architectures * will have extra information to append to the end of this. */ #define PXE_TFTP_MAGIC_COOKIE ( ( 'P'<<24 ) | ( 'x'<<16 ) | ( 'T'<<8 ) | 'f' ) -typedef struct { - pxe_t pxe __attribute__ ((aligned(16))); - pxenv_t pxenv __attribute__ ((aligned(16))); +typedef struct pxe_stack { + struct s_PXE pxe __attribute__ ((aligned(16))); + struct s_PXENV pxenv __attribute__ ((aligned(16))); pxe_stack_state_t state; union { - BOOTPLAYER cached_info; + BOOTPLAYER_t cached_info; char packet[ETH_FRAME_LEN]; struct { uint32_t magic_cookie; @@ -88,6 +99,10 @@ typedef struct { struct {} arch_data __attribute__ ((aligned(16))); } pxe_stack_t; +extern int ensure_pxe_state ( pxe_stack_state_t wanted ); + +extern pxe_stack_t *pxe_stack; + extern PXENV_EXIT_t pxe_api_call ( int opcode, union u_PXENV_ANY *any ); #endif /* PXE_H */ diff --git a/src/include/pxe_api.h b/src/include/pxe_api.h index 91eda5bf5..60d5b30a7 100644 --- a/src/include/pxe_api.h +++ b/src/include/pxe_api.h @@ -200,89 +200,6 @@ typedef struct s_PXE PXE_t; /** @} */ /* pxe_api_call */ -/** @defgroup pxe_loader_api PXE Loader API - * - * The UNDI ROM loader API - * - * @{ - */ - -/** The UNDI ROM ID structure */ -struct s_UNDI_ROM_ID { - /** Signature - * - * Contains the bytes 'U', 'N', 'D', 'I'. - */ - UINT32_t Signature; - UINT8_t StructLength; /**< Length of this structure */ - /** Checksum - * - * The byte checksum of this structure (using the length in - * #StructLength) must be zero. - */ - UINT8_t StructCksum; - /** Revision of this structure - * - * For PXE version 2.1, this field must be zero. - */ - UINT8_t StructRev; - /** UNDI revision - * - * UNDI revision, least significant byte first. For UNDI - * version 2.1.0, this field will contain { 0x00, 0x01, 0x02 }. - */ - UINT8_t UNDIRev[3]; - /** UNDI loader routine entry point - * - * This is the entry point for calling undi_loader(). - */ - UINT16_t UNDILoader; - /** Minimum required stack segment size */ - UINT16_t StackSize; - /** Minimum required data segment size */ - UINT16_t DataSize; - /** Minimum required code segment size */ - UINT16_t CodeSize; -} PACKED; - -typedef struct s_UNDI_ROM_ID UNDI_ROM_ID_t; - -/** Parameter block for undi_loader() */ -struct s_UNDI_LOADER { - /** struct s_UNDI_LOADER starts with a struct s_PXENV_START_UNDI */ - union undi_loader_start_undi { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Parameters to pass to pxenv_start_undi() */ - struct s_PXENV_START_UNDI start_undi; - } u; - /** UNDI data segment - * - * @note The PXE specification defines the type of this field - * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are - * equivalent anyway; for other architectures #SEGSEL_t makes - * more sense. - */ - SEGSEL_t undi_ds; - /** UNDI code segment - * - * @note The PXE specification defines the type of this field - * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are - * equivalent anyway; for other architectures #SEGSEL_t makes - * more sense. - */ - SEGSEL_t undi_cs; - /** Address of the !PXE structure (a struct s_PXE) */ - SEGOFF16_t pxe_ptr; - /** Address of the PXENV+ structure (a struct s_PXENV) */ - SEGOFF16_t pxenv_ptr; -} PACKED; - -typedef struct s_UNDI_LOADER UNDI_LOADER_t; - -extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader ); - -/** @} */ /* pxe_loader_api */ - /** @defgroup pxe_preboot_api PXE Preboot API * * General high-level functions: #PXENV_UNLOAD_STACK, #PXENV_START_UNDI etc. @@ -364,6 +281,9 @@ typedef struct s_PXENV_GET_CACHED_INFO PXENV_GET_CACHED_INFO_t; #define VM_RFC1048 0x63825363L /**< DHCP magic cookie */ +/** Maximum length of DHCP options */ +#define BOOTP_DHCPVEND 1024 + /** Format of buffer filled in by pxenv_get_cached_info() * * This somewhat convoluted data structure simply describes the layout @@ -986,13 +906,13 @@ struct s_PXENV_UNDI_MCAST_ADDRESS { typedef struct s_PXENV_UNDI_MCAST_ADDRESS PXENV_UNDI_MCAST_ADDRESS_t; /** Parameter block for pxenv_undi_reset_adapter() */ -struct s_PXENV_UNDI_RESET_ADAPTER { +struct s_PXENV_UNDI_RESET { PXENV_STATUS_t Status; /**< PXE status code */ /** Multicast MAC addresses */ struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; } PACKED; -typedef struct s_PXENV_UNDI_RESET_ADAPTER PXENV_UNDI_RESET_ADAPTER_t; +typedef struct s_PXENV_UNDI_RESET PXENV_UNDI_RESET_t; extern PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET *undi_reset_adapter ); @@ -1626,6 +1546,89 @@ extern PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ); /** @} */ /* pxe_undi_api */ +/** @defgroup pxe_loader_api PXE Loader API + * + * The UNDI ROM loader API + * + * @{ + */ + +/** The UNDI ROM ID structure */ +struct s_UNDI_ROM_ID { + /** Signature + * + * Contains the bytes 'U', 'N', 'D', 'I'. + */ + UINT32_t Signature; + UINT8_t StructLength; /**< Length of this structure */ + /** Checksum + * + * The byte checksum of this structure (using the length in + * #StructLength) must be zero. + */ + UINT8_t StructCksum; + /** Revision of this structure + * + * For PXE version 2.1, this field must be zero. + */ + UINT8_t StructRev; + /** UNDI revision + * + * UNDI revision, least significant byte first. For UNDI + * version 2.1.0, this field will contain { 0x00, 0x01, 0x02 }. + */ + UINT8_t UNDIRev[3]; + /** UNDI loader routine entry point + * + * This is the entry point for calling undi_loader(). + */ + UINT16_t UNDILoader; + /** Minimum required stack segment size */ + UINT16_t StackSize; + /** Minimum required data segment size */ + UINT16_t DataSize; + /** Minimum required code segment size */ + UINT16_t CodeSize; +} PACKED; + +typedef struct s_UNDI_ROM_ID UNDI_ROM_ID_t; + +/** Parameter block for undi_loader() */ +struct s_UNDI_LOADER { + /** struct s_UNDI_LOADER starts with a struct s_PXENV_START_UNDI */ + union undi_loader_start_undi { + PXENV_STATUS_t Status; /**< PXE status code */ + /** Parameters to pass to pxenv_start_undi() */ + struct s_PXENV_START_UNDI start_undi; + } u; + /** UNDI data segment + * + * @note The PXE specification defines the type of this field + * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are + * equivalent anyway; for other architectures #SEGSEL_t makes + * more sense. + */ + SEGSEL_t undi_ds; + /** UNDI code segment + * + * @note The PXE specification defines the type of this field + * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are + * equivalent anyway; for other architectures #SEGSEL_t makes + * more sense. + */ + SEGSEL_t undi_cs; + /** Address of the !PXE structure (a struct s_PXE) */ + SEGOFF16_t pxe_ptr; + /** Address of the PXENV+ structure (a struct s_PXENV) */ + SEGOFF16_t pxenv_ptr; +} PACKED; + +typedef struct s_UNDI_LOADER UNDI_LOADER_t; + +extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader ); + +/** @} */ /* pxe_loader_api */ + /** @} */ /* pxe */ #endif /* PXE_API_H */ diff --git a/src/include/pxe_export.h b/src/include/pxe_export.h deleted file mode 100644 index 3d39e73cf..000000000 --- a/src/include/pxe_export.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Header for pxe_export.c - */ - -#ifndef PXE_EXPORT_H -#define PXE_EXPORT_H - -#include "pxe.h" - -/* Function prototypes */ -extern int ensure_pxe_state ( pxe_stack_state_t wanted ); - -extern PXENV_EXIT_t pxenv_start_undi ( t_PXENV_START_UNDI * ); -extern PXENV_EXIT_t pxenv_undi_startup ( t_PXENV_UNDI_STARTUP * ); -extern PXENV_EXIT_t pxenv_undi_cleanup ( t_PXENV_UNDI_CLEANUP * ); -extern PXENV_EXIT_t pxenv_undi_initialize ( t_PXENV_UNDI_INITIALIZE * ); -extern PXENV_EXIT_t pxenv_undi_reset_adapter ( t_PXENV_UNDI_RESET_ADAPTER * ); -extern PXENV_EXIT_t pxenv_undi_shutdown ( t_PXENV_UNDI_SHUTDOWN * ); -extern PXENV_EXIT_t pxenv_undi_open ( t_PXENV_UNDI_OPEN * ); -extern PXENV_EXIT_t pxenv_undi_close ( t_PXENV_UNDI_CLOSE * ); -extern PXENV_EXIT_t pxenv_undi_transmit ( t_PXENV_UNDI_TRANSMIT * ); -extern PXENV_EXIT_t pxenv_undi_set_mcast_address ( - t_PXENV_UNDI_SET_MCAST_ADDRESS * ); -extern PXENV_EXIT_t pxenv_undi_set_station_address ( - t_PXENV_UNDI_SET_STATION_ADDRESS * ); -extern PXENV_EXIT_t pxenv_undi_set_packet_filter ( - t_PXENV_UNDI_SET_PACKET_FILTER * ); -extern PXENV_EXIT_t pxenv_undi_get_information ( - t_PXENV_UNDI_GET_INFORMATION * ); -extern PXENV_EXIT_t pxenv_undi_get_statistics ( t_PXENV_UNDI_GET_STATISTICS* ); -extern PXENV_EXIT_t pxenv_undi_clear_statistics ( - t_PXENV_UNDI_CLEAR_STATISTICS * ); -extern PXENV_EXIT_t pxenv_undi_initiate_diags ( t_PXENV_UNDI_INITIATE_DIAGS* ); -extern PXENV_EXIT_t pxenv_undi_force_interrupt ( - t_PXENV_UNDI_FORCE_INTERRUPT * ); -extern PXENV_EXIT_t pxenv_undi_get_mcast_address ( - t_PXENV_UNDI_GET_MCAST_ADDRESS * ); -extern PXENV_EXIT_t pxenv_undi_get_nic_type ( t_PXENV_UNDI_GET_NIC_TYPE * ); -extern PXENV_EXIT_t pxenv_undi_get_iface_info ( t_PXENV_UNDI_GET_IFACE_INFO *); -extern PXENV_EXIT_t pxenv_undi_isr ( t_PXENV_UNDI_ISR * ); -extern PXENV_EXIT_t pxenv_stop_undi ( t_PXENV_STOP_UNDI * ); -extern PXENV_EXIT_t pxenv_tftp_open ( t_PXENV_TFTP_OPEN * ); -extern PXENV_EXIT_t pxenv_tftp_close ( t_PXENV_TFTP_CLOSE * ); -extern PXENV_EXIT_t pxenv_tftp_read ( t_PXENV_TFTP_READ * ); -extern PXENV_EXIT_t pxenv_tftp_read_file ( t_PXENV_TFTP_READ_FILE * ); -extern PXENV_EXIT_t pxenv_tftp_get_fsize ( t_PXENV_TFTP_GET_FSIZE * ); -extern PXENV_EXIT_t pxenv_udp_open ( t_PXENV_UDP_OPEN * ); -extern PXENV_EXIT_t pxenv_udp_close ( t_PXENV_UDP_CLOSE * ); -extern PXENV_EXIT_t pxenv_udp_read ( t_PXENV_UDP_READ * ); -extern PXENV_EXIT_t pxenv_udp_write ( t_PXENV_UDP_WRITE * ); -extern PXENV_EXIT_t pxenv_unload_stack ( t_PXENV_UNLOAD_STACK * ); -extern PXENV_EXIT_t pxenv_get_cached_info ( t_PXENV_GET_CACHED_INFO * ); -extern PXENV_EXIT_t pxenv_restart_tftp ( t_PXENV_RESTART_TFTP * ); -extern PXENV_EXIT_t pxenv_start_base ( t_PXENV_START_BASE * ); -extern PXENV_EXIT_t pxenv_stop_base ( t_PXENV_STOP_BASE * ); - -extern PXENV_EXIT_t pxe_api_call ( int opcode, t_PXENV_ANY *params ); - -/* Static variables */ -extern pxe_stack_t *pxe_stack; - -#endif /* PXE_EXPORT_H */ diff --git a/src/include/pxe_types.h b/src/include/pxe_types.h index 9b2430185..80e6aa17c 100644 --- a/src/include/pxe_types.h +++ b/src/include/pxe_types.h @@ -117,7 +117,7 @@ typedef struct s_SEGDESC { SEGSEL_t segment_address; /**< Segment selector */ ADDR32_t physical_address; /**< Segment base address */ OFF16_t seg_size; /**< Size of the segment */ -} PACKED __SEGDESC_t; +} PACKED SEGDESC_t; /** @} */ /* pxe_types */ -- cgit v1.2.3-55-g7522