summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/pxe.h27
-rw-r--r--src/include/pxe_api.h173
-rw-r--r--src/include/pxe_export.h61
-rw-r--r--src/include/pxe_types.h2
4 files changed, 110 insertions, 153 deletions
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 */