diff --git a/src/arch/i386/include/pxe.h b/src/arch/i386/include/pxe.h index 909c8d81..a6bb65c0 100644 --- a/src/arch/i386/include/pxe.h +++ b/src/arch/i386/include/pxe.h @@ -6,8 +6,12 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include "pxe_types.h" #include "pxe_api.h" #include +#include -/* Parameter block for pxenv_unknown() */ +/** PXE API invalid function code */ +#define PXENV_UNKNOWN 0xffff + +/** Parameter block for pxenv_unknown() */ struct s_PXENV_UNKNOWN { PXENV_STATUS_t Status; /**< PXE status code */ } __attribute__ (( packed )); @@ -72,6 +76,45 @@ union u_PXENV_ANY { typedef union u_PXENV_ANY PXENV_ANY_t; +/** A PXE API call */ +struct pxe_api_call { + /** Entry point + * + * @v params PXE API call parameters + * @ret exit PXE API call exit code + */ + PXENV_EXIT_t ( * entry ) ( union u_PXENV_ANY *params ); + /** Length of parameters */ + uint16_t params_len; + /** Opcode */ + uint16_t opcode; +}; + +/** PXE API call table */ +#define PXE_API_CALLS __table ( struct pxe_api_call, "pxe_api_calls" ) + +/** Declare a PXE API call */ +#define __pxe_api_call __table_entry ( PXE_API_CALLS, 01 ) + +/** + * Define a PXE API call + * + * @v _opcode Opcode + * @v _entry Entry point + * @v _params_type Type of parameter structure + * @ret call PXE API call + */ +#define PXE_API_CALL( _opcode, _entry, _params_type ) { \ + .entry = ( ( ( ( PXENV_EXIT_t ( * ) ( _params_type *params ) ) NULL ) \ + == ( ( typeof ( _entry ) * ) NULL ) ) \ + ? ( ( PXENV_EXIT_t ( * ) \ + ( union u_PXENV_ANY *params ) ) _entry ) \ + : ( ( PXENV_EXIT_t ( * ) \ + ( union u_PXENV_ANY *params ) ) _entry ) ), \ + .params_len = sizeof ( _params_type ), \ + .opcode = _opcode, \ + } + /** An UNDI expansion ROM header */ struct undi_rom_header { /** Signature @@ -144,9 +187,11 @@ struct pcir_header { #define PCIR_SIGNATURE \ ( ( 'P' << 0 ) + ( 'C' << 8 ) + ( 'I' << 16 ) + ( 'R' << 24 ) ) - extern struct net_device *pxe_netdev; extern void pxe_set_netdev ( struct net_device *netdev ); +extern PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE + *tftp_read_file ); +extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader ); #endif /* PXE_H */ diff --git a/src/arch/i386/include/pxe_api.h b/src/arch/i386/include/pxe_api.h index 9b40187e..f4013846 100644 --- a/src/arch/i386/include/pxe_api.h +++ b/src/arch/i386/include/pxe_api.h @@ -252,9 +252,6 @@ struct s_PXENV_UNLOAD_STACK { typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t; -extern PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK - *unload_stack ); - /** @} */ /* pxenv_unload_stack */ /** @defgroup pxenv_get_cached_info PXENV_GET_CACHED_INFO @@ -403,9 +400,6 @@ struct bootph { typedef struct bootph BOOTPLAYER_t; -extern PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO - *get_cached_info ); - /** @} */ /* pxenv_get_cached_info */ /** @defgroup pxenv_restart_tftp PXENV_RESTART_TFTP @@ -423,9 +417,6 @@ struct s_PXENV_TFTP_READ_FILE; typedef struct s_PXENV_RESTART_TFTP PXENV_RESTART_TFTP_t; -extern PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE - *restart_tftp ); - /** @} */ /* pxenv_restart_tftp */ /** @defgroup pxenv_start_undi PXENV_START_UNDI @@ -496,8 +487,6 @@ struct s_PXENV_START_UNDI { typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t; -extern PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi ); - /** @} */ /* pxenv_start_undi */ /** @defgroup pxenv_stop_undi PXENV_STOP_UNDI @@ -517,8 +506,6 @@ struct s_PXENV_STOP_UNDI { typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t; -extern PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ); - /** @} */ /* pxenv_stop_undi */ /** @defgroup pxenv_start_base PXENV_START_BASE @@ -538,8 +525,6 @@ struct s_PXENV_START_BASE { typedef struct s_PXENV_START_BASE PXENV_START_BASE_t; -extern PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base ); - /** @} */ /* pxenv_start_base */ /** @defgroup pxenv_stop_base PXENV_STOP_BASE @@ -559,8 +544,6 @@ struct s_PXENV_STOP_BASE { typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t; -extern PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base ); - /** @} */ /* pxenv_stop_base */ /** @} */ /* pxe_preboot_api */ @@ -600,8 +583,6 @@ struct s_PXENV_TFTP_OPEN { typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t; -extern PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open ); - /** @} */ /* pxenv_tftp_open */ /** @defgroup pxenv_tftp_close PXENV_TFTP_CLOSE @@ -621,8 +602,6 @@ struct s_PXENV_TFTP_CLOSE { typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t; -extern PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close ); - /** @} */ /* pxenv_tftp_close */ /** @defgroup pxenv_tftp_read PXENV_TFTP_READ @@ -645,8 +624,6 @@ struct s_PXENV_TFTP_READ { typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t; -extern PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read ); - /** @} */ /* pxenv_tftp_read */ /** @defgroup pxenv_tftp_read_file PXENV_TFTP_READ_FILE @@ -690,9 +667,6 @@ struct s_PXENV_TFTP_READ_FILE { typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t; -extern PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE - *tftp_read_file ); - /** @} */ /* pxenv_tftp_read_file */ /** @defgroup pxenv_tftp_get_fsize PXENV_TFTP_GET_FSIZE @@ -716,9 +690,6 @@ struct s_PXENV_TFTP_GET_FSIZE { typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t; -extern PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE - *get_fsize ); - /** @} */ /* pxenv_tftp_get_fsize */ /** @} */ /* pxe_tftp_api */ @@ -748,8 +719,6 @@ struct s_PXENV_UDP_OPEN { typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t; -extern PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *udp_open ); - /** @} */ /* pxenv_udp_open */ /** @defgroup pxenv_udp_close PXENV_UDP_CLOSE @@ -769,8 +738,6 @@ struct s_PXENV_UDP_CLOSE { typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t; -extern PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *udp_close ); - /** @} */ /* pxenv_udp_close */ /** @defgroup pxenv_udp_write PXENV_UDP_WRITE @@ -796,8 +763,6 @@ struct s_PXENV_UDP_WRITE { typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t; -extern PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *udp_write ); - /** @} */ /* pxenv_udp_write */ /** @defgroup pxenv_udp_read PXENV_UDP_READ @@ -823,8 +788,6 @@ struct s_PXENV_UDP_READ { typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t; -extern PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *udp_read ); - /** @} */ /* pxenv_udp_read */ /** @} */ /* pxe_udp_api */ @@ -860,9 +823,6 @@ struct s_PXENV_UNDI_STARTUP { typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t; -extern PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP - *undi_startup ); - /** @} */ /* pxenv_undi_startup */ /** @defgroup pxenv_undi_cleanup PXENV_UNDI_CLEANUP @@ -882,9 +842,6 @@ struct s_PXENV_UNDI_CLEANUP { typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t; -extern PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP - *undi_cleanup ); - /** @} */ /* pxenv_undi_cleanup */ /** @defgroup pxenv_undi_initialize PXENV_UNDI_INITIALIZE @@ -913,9 +870,6 @@ struct s_PXENV_UNDI_INITIALIZE { typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t; -extern PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE - *undi_initialize ); - /** @} */ /* pxenv_undi_initialize */ /** @defgroup pxenv_undi_reset_adapter PXENV_UNDI_RESET_ADAPTER @@ -950,9 +904,6 @@ struct s_PXENV_UNDI_RESET { 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 ); - /** @} */ /* pxenv_undi_reset_adapter */ /** @defgroup pxenv_undi_shutdown PXENV_UNDI_SHUTDOWN @@ -972,9 +923,6 @@ struct s_PXENV_UNDI_SHUTDOWN { typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t; -extern PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN - *undi_shutdown ); - /** @} */ /* pxenv_undi_shutdown */ /** @defgroup pxenv_undi_open PXENV_UNDI_OPEN @@ -1024,8 +972,6 @@ struct s_PXENV_UNDI_OPEN { typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t; -extern PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open ); - /** @} */ /* pxenv_undi_open */ /** @defgroup pxenv_undi_close PXENV_UNDI_CLOSE @@ -1045,8 +991,6 @@ struct s_PXENV_UNDI_CLOSE { typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t; -extern PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close ); - /** @} */ /* pxenv_undi_close */ /** @defgroup pxenv_undi_transmit PXENV_UNDI_TRANSMIT @@ -1122,9 +1066,6 @@ struct s_PXENV_UNDI_TRANSMIT { typedef struct s_PXENV_UNDI_TRANSMIT PXENV_UNDI_TRANSMIT_t; -extern PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT - *undi_transmit ); - /** @} */ /* pxenv_undi_transmit */ /** @defgroup pxenv_undi_set_mcast_address PXENV_UNDI_SET_MCAST_ADDRESS @@ -1146,9 +1087,6 @@ struct s_PXENV_UNDI_SET_MCAST_ADDRESS { typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS PXENV_UNDI_SET_MCAST_ADDRESS_t; -extern PXENV_EXIT_t pxenv_undi_set_mcast_address ( - struct s_PXENV_UNDI_SET_MCAST_ADDRESS *undi_set_mcast_address ); - /** @} */ /* pxenv_undi_set_mcast_address */ /** @defgroup pxenv_undi_set_station_address PXENV_UNDI_SET_STATION_ADDRESS @@ -1169,9 +1107,6 @@ struct s_PXENV_UNDI_SET_STATION_ADDRESS { typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS PXENV_UNDI_SET_STATION_ADDRESS_t; -extern PXENV_EXIT_t pxenv_undi_set_station_address ( - struct s_PXENV_UNDI_SET_STATION_ADDRESS *undi_set_station_address ); - /** @} */ /* pxenv_undi_set_station_address */ /** @defgroup pxenv_undi_set_packet_filter PXENV_UNDI_SET_PACKET_FILTER @@ -1202,9 +1137,6 @@ struct s_PXENV_UNDI_SET_PACKET_FILTER { typedef struct s_PXENV_UNDI_SET_PACKET_FILTER PXENV_UNDI_SET_PACKET_FILTER_t; -extern PXENV_EXIT_t pxenv_undi_set_packet_filter ( - struct s_PXENV_UNDI_SET_PACKET_FILTER *undi_set_packet_filter ); - /** @} */ /* pxenv_undi_set_packet_filter */ /** @defgroup pxenv_undi_get_information PXENV_UNDI_GET_INFORMATION @@ -1248,9 +1180,6 @@ struct s_PXENV_UNDI_GET_INFORMATION { typedef struct s_PXENV_UNDI_GET_INFORMATION PXENV_UNDI_GET_INFORMATION_t; -extern PXENV_EXIT_t pxenv_undi_get_information ( - struct s_PXENV_UNDI_GET_INFORMATION *undi_get_information ); - /** @} */ /* pxenv_undi_get_information */ /** @defgroup pxenv_undi_get_statistics PXENV_UNDI_GET_STATISTICS @@ -1274,9 +1203,6 @@ struct s_PXENV_UNDI_GET_STATISTICS { typedef struct s_PXENV_UNDI_GET_STATISTICS PXENV_UNDI_GET_STATISTICS_t; -extern PXENV_EXIT_t pxenv_undi_get_statistics ( - struct s_PXENV_UNDI_GET_STATISTICS *undi_get_statistics ); - /** @} */ /* pxenv_undi_get_statistics */ /** @defgroup pxenv_undi_clear_statistics PXENV_UNDI_CLEAR_STATISTICS @@ -1296,9 +1222,6 @@ struct s_PXENV_UNDI_CLEAR_STATISTICS { typedef struct s_PXENV_UNDI_CLEAR_STATISTICS PXENV_UNDI_CLEAR_STATISTICS_t; -extern PXENV_EXIT_t pxenv_undi_clear_statistics ( - struct s_PXENV_UNDI_CLEAR_STATISTICS *undi_clear_statistics ); - /** @} */ /* pxenv_undi_clear_statistics */ /** @defgroup pxenv_undi_initiate_diags PXENV_UNDI_INITIATE_DIAGS @@ -1318,9 +1241,6 @@ struct s_PXENV_UNDI_INITIATE_DIAGS { typedef struct s_PXENV_UNDI_INITIATE_DIAGS PXENV_UNDI_INITIATE_DIAGS_t; -extern PXENV_EXIT_t pxenv_undi_initiate_diags ( - struct s_PXENV_UNDI_INITIATE_DIAGS *undi_initiate_diags ); - /** @} */ /* pxenv_undi_initiate_diags */ /** @defgroup pxenv_undi_force_interrupt PXENV_UNDI_FORCE_INTERRUPT @@ -1340,9 +1260,6 @@ struct s_PXENV_UNDI_FORCE_INTERRUPT { typedef struct s_PXENV_UNDI_FORCE_INTERRUPT PXENV_UNDI_FORCE_INTERRUPT_t; -extern PXENV_EXIT_t pxenv_undi_force_interrupt ( - struct s_PXENV_UNDI_FORCE_INTERRUPT *undi_force_interrupt ); - /** @} */ /* pxenv_undi_force_interrupt */ /** @defgroup pxenv_undi_get_mcast_address PXENV_UNDI_GET_MCAST_ADDRESS @@ -1364,9 +1281,6 @@ struct s_PXENV_UNDI_GET_MCAST_ADDRESS { typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS PXENV_UNDI_GET_MCAST_ADDRESS_t; -extern PXENV_EXIT_t pxenv_undi_get_mcast_address ( - struct s_PXENV_UNDI_GET_MCAST_ADDRESS *undi_get_mcast_address ); - /** @} */ /* pxenv_undi_get_mcast_address */ /** @defgroup pxenv_undi_get_nic_type PXENV_UNDI_GET_NIC_TYPE @@ -1427,9 +1341,6 @@ struct s_PXENV_UNDI_GET_NIC_TYPE { typedef struct s_PXENV_UNDI_GET_NIC_TYPE PXENV_UNDI_GET_NIC_TYPE_t; -extern PXENV_EXIT_t pxenv_undi_get_nic_type ( - struct s_PXENV_UNDI_GET_NIC_TYPE *undi_get_nic_type ); - /** @} */ /* pxenv_undi_get_nic_type */ /** @defgroup pxenv_undi_get_iface_info PXENV_UNDI_GET_IFACE_INFO @@ -1488,9 +1399,6 @@ struct s_PXENV_UNDI_GET_IFACE_INFO { typedef struct s_PXENV_UNDI_GET_IFACE_INFO PXENV_UNDI_GET_IFACE_INFO_t; -extern PXENV_EXIT_t pxenv_undi_get_iface_info ( - struct s_PXENV_UNDI_GET_IFACE_INFO *undi_get_iface_info ); - /** @} */ /* pxenv_undi_get_iface_info */ /** @defgroup pxenv_undi_get_state PXENV_UNDI_GET_STATE @@ -1524,9 +1432,6 @@ struct s_PXENV_UNDI_GET_STATE { typedef struct s_PXENV_UNDI_GET_STATE PXENV_UNDI_GET_STATE_t; -extern PXENV_EXIT_t pxenv_undi_get_state ( struct s_PXENV_UNDI_GET_STATE - *undi_get_state ); - /** @} */ /* pxenv_undi_get_state */ /** @defgroup pxenv_undi_isr PXENV_UNDI_ISR @@ -1595,8 +1500,6 @@ struct s_PXENV_UNDI_ISR { typedef struct s_PXENV_UNDI_ISR PXENV_UNDI_ISR_t; -extern PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ); - /** @} */ /* pxenv_undi_isr */ /** @} */ /* pxe_undi_api */ @@ -1628,8 +1531,6 @@ struct s_PXENV_FILE_OPEN { typedef struct s_PXENV_FILE_OPEN PXENV_FILE_OPEN_t; -extern PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open ); - /** @} */ /* pxenv_file_open */ /** @defgroup pxenv_file_close PXENV_FILE_CLOSE @@ -1650,9 +1551,6 @@ struct s_PXENV_FILE_CLOSE { typedef struct s_PXENV_FILE_CLOSE PXENV_FILE_CLOSE_t; -extern PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE - *file_close ); - /** @} */ /* pxenv_file_close */ /** @defgroup pxenv_file_select PXENV_FILE_SELECT @@ -1677,9 +1575,6 @@ struct s_PXENV_FILE_SELECT { typedef struct s_PXENV_FILE_SELECT PXENV_FILE_SELECT_t; -extern PXENV_EXIT_t pxenv_file_select ( struct s_PXENV_FILE_SELECT - *file_select ); - /** @} */ /* pxenv_file_select */ /** @defgroup pxenv_file_read PXENV_FILE_READ @@ -1702,8 +1597,6 @@ struct s_PXENV_FILE_READ { typedef struct s_PXENV_FILE_READ PXENV_FILE_READ_t; -extern PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read ); - /** @} */ /* pxenv_file_read */ /** @defgroup pxenv_get_file_size PXENV_GET_FILE_SIZE @@ -1725,9 +1618,6 @@ struct s_PXENV_GET_FILE_SIZE { typedef struct s_PXENV_GET_FILE_SIZE PXENV_GET_FILE_SIZE_t; -extern PXENV_EXIT_t pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE - *get_file_size ); - /** @} */ /* pxenv_get_file_size */ /** @defgroup pxenv_file_exec PXENV_FILE_EXEC @@ -1748,8 +1638,6 @@ struct s_PXENV_FILE_EXEC { typedef struct s_PXENV_FILE_EXEC PXENV_FILE_EXEC_t; -extern PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec ); - /** @} */ /* pxenv_file_exec */ /** @defgroup pxenv_file_api_check PXENV_FILE_API_CHECK @@ -1774,8 +1662,6 @@ struct s_PXENV_FILE_API_CHECK { typedef struct s_PXENV_FILE_API_CHECK PXENV_FILE_API_CHECK_t; -extern PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check ); - /** @} */ /* pxenv_file_api_check */ /** @defgroup pxenv_file_exit_hook PXENV_FILE_EXIT_HOOK @@ -1796,8 +1682,6 @@ struct s_PXENV_FILE_EXIT_HOOK { typedef struct s_PXENV_FILE_EXIT_HOOK PXENV_FILE_EXIT_HOOK_t; -extern PXENV_EXIT_t pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK *file_exit_hook ); - /** @} */ /* pxenv_file_exit_hook */ /** @} */ /* pxe_file_api */ @@ -1847,8 +1731,6 @@ struct s_UNDI_LOADER { typedef struct s_UNDI_LOADER UNDI_LOADER_t; -extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader ); - /** @} */ /* pxe_loader_api */ /** @} */ /* pxe */ diff --git a/src/arch/i386/interface/pxe/pxe_call.c b/src/arch/i386/interface/pxe/pxe_call.c index f3208000..3e461d02 100644 --- a/src/arch/i386/interface/pxe/pxe_call.c +++ b/src/arch/i386/interface/pxe/pxe_call.c @@ -41,73 +41,6 @@ extern void pxe_int_1a ( void ); /** INT 1A hooked flag */ static int int_1a_hooked = 0; -/** A function pointer to hold any PXE API call - * - * Used by pxe_api_call() to avoid large swathes of duplicated code. - */ -union pxenv_call { - PXENV_EXIT_t ( * any ) ( union u_PXENV_ANY * ); - PXENV_EXIT_t ( * unknown ) ( struct s_PXENV_UNKNOWN * ); - PXENV_EXIT_t ( * unload_stack ) ( struct s_PXENV_UNLOAD_STACK * ); - PXENV_EXIT_t ( * get_cached_info ) - ( struct s_PXENV_GET_CACHED_INFO * ); - PXENV_EXIT_t ( * restart_tftp ) ( struct s_PXENV_TFTP_READ_FILE * ); - PXENV_EXIT_t ( * start_undi ) ( struct s_PXENV_START_UNDI * ); - PXENV_EXIT_t ( * stop_undi ) ( struct s_PXENV_STOP_UNDI * ); - PXENV_EXIT_t ( * start_base ) ( struct s_PXENV_START_BASE * ); - PXENV_EXIT_t ( * stop_base ) ( struct s_PXENV_STOP_BASE * ); - PXENV_EXIT_t ( * tftp_open ) ( struct s_PXENV_TFTP_OPEN * ); - PXENV_EXIT_t ( * tftp_close ) ( struct s_PXENV_TFTP_CLOSE * ); - PXENV_EXIT_t ( * tftp_read ) ( struct s_PXENV_TFTP_READ * ); - PXENV_EXIT_t ( * tftp_read_file ) ( struct s_PXENV_TFTP_READ_FILE * ); - PXENV_EXIT_t ( * tftp_get_fsize ) ( struct s_PXENV_TFTP_GET_FSIZE * ); - PXENV_EXIT_t ( * udp_open ) ( struct s_PXENV_UDP_OPEN * ); - PXENV_EXIT_t ( * udp_close ) ( struct s_PXENV_UDP_CLOSE * ); - PXENV_EXIT_t ( * udp_write ) ( struct s_PXENV_UDP_WRITE * ); - PXENV_EXIT_t ( * udp_read ) ( struct s_PXENV_UDP_READ * ); - PXENV_EXIT_t ( * undi_startup ) ( struct s_PXENV_UNDI_STARTUP * ); - PXENV_EXIT_t ( * undi_cleanup ) ( struct s_PXENV_UNDI_CLEANUP * ); - PXENV_EXIT_t ( * undi_initialize ) - ( struct s_PXENV_UNDI_INITIALIZE * ); - PXENV_EXIT_t ( * undi_reset_adapter ) ( struct s_PXENV_UNDI_RESET * ); - PXENV_EXIT_t ( * undi_shutdown ) ( struct s_PXENV_UNDI_SHUTDOWN * ); - PXENV_EXIT_t ( * undi_open ) ( struct s_PXENV_UNDI_OPEN * ); - PXENV_EXIT_t ( * undi_close ) ( struct s_PXENV_UNDI_CLOSE * ); - PXENV_EXIT_t ( * undi_transmit ) ( struct s_PXENV_UNDI_TRANSMIT * ); - PXENV_EXIT_t ( * undi_set_mcast_address ) - ( struct s_PXENV_UNDI_SET_MCAST_ADDRESS * ); - PXENV_EXIT_t ( * undi_set_station_address ) - ( struct s_PXENV_UNDI_SET_STATION_ADDRESS * ); - PXENV_EXIT_t ( * undi_set_packet_filter ) - ( struct s_PXENV_UNDI_SET_PACKET_FILTER * ); - PXENV_EXIT_t ( * undi_get_information ) - ( struct s_PXENV_UNDI_GET_INFORMATION * ); - PXENV_EXIT_t ( * undi_get_statistics ) - ( struct s_PXENV_UNDI_GET_STATISTICS * ); - PXENV_EXIT_t ( * undi_clear_statistics ) - ( struct s_PXENV_UNDI_CLEAR_STATISTICS * ); - PXENV_EXIT_t ( * undi_initiate_diags ) - ( struct s_PXENV_UNDI_INITIATE_DIAGS * ); - PXENV_EXIT_t ( * undi_force_interrupt ) - ( struct s_PXENV_UNDI_FORCE_INTERRUPT * ); - PXENV_EXIT_t ( * undi_get_mcast_address ) - ( struct s_PXENV_UNDI_GET_MCAST_ADDRESS * ); - PXENV_EXIT_t ( * undi_get_nic_type ) - ( struct s_PXENV_UNDI_GET_NIC_TYPE * ); - PXENV_EXIT_t ( * undi_get_iface_info ) - ( struct s_PXENV_UNDI_GET_IFACE_INFO * ); - PXENV_EXIT_t ( * undi_get_state ) ( struct s_PXENV_UNDI_GET_STATE * ); - PXENV_EXIT_t ( * undi_isr ) ( struct s_PXENV_UNDI_ISR * ); - PXENV_EXIT_t ( * file_open ) ( struct s_PXENV_FILE_OPEN * ); - PXENV_EXIT_t ( * file_close ) ( struct s_PXENV_FILE_CLOSE * ); - PXENV_EXIT_t ( * file_select ) ( struct s_PXENV_FILE_SELECT * ); - PXENV_EXIT_t ( * file_read ) ( struct s_PXENV_FILE_READ * ); - PXENV_EXIT_t ( * get_file_size ) ( struct s_PXENV_GET_FILE_SIZE * ); - PXENV_EXIT_t ( * file_exec ) ( struct s_PXENV_FILE_EXEC * ); - PXENV_EXIT_t ( * file_api_check ) ( struct s_PXENV_FILE_API_CHECK * ); - PXENV_EXIT_t ( * file_exit_hook ) ( struct s_PXENV_FILE_EXIT_HOOK * ); -}; - /** * Handle an unknown PXE API call * @@ -120,6 +53,26 @@ static PXENV_EXIT_t pxenv_unknown ( struct s_PXENV_UNKNOWN *pxenv_unknown ) { return PXENV_EXIT_FAILURE; } +/** Unknown PXE API call list */ +struct pxe_api_call pxenv_unknown_api __pxe_api_call = + PXE_API_CALL ( PXENV_UNKNOWN, pxenv_unknown, struct s_PXENV_UNKNOWN ); + +/** + * Locate PXE API call + * + * @v opcode Opcode + * @ret call PXE API call, or NULL + */ +static struct pxe_api_call * find_pxe_api_call ( uint16_t opcode ) { + struct pxe_api_call *call; + + for_each_table_entry ( call, PXE_API_CALLS ) { + if ( call->opcode == opcode ) + return call; + } + return NULL; +} + /** * Dispatch PXE API call * @@ -128,220 +81,30 @@ static PXENV_EXIT_t pxenv_unknown ( struct s_PXENV_UNKNOWN *pxenv_unknown ) { * @ret ax PXE exit code */ __asmcall void pxe_api_call ( struct i386_all_regs *ix86 ) { - int opcode = ix86->regs.bx; - userptr_t parameters = real_to_user ( ix86->segs.es, ix86->regs.di ); - size_t param_len; - union u_PXENV_ANY pxenv_any; - union pxenv_call pxenv_call; + uint16_t opcode = ix86->regs.bx; + userptr_t uparams = real_to_user ( ix86->segs.es, ix86->regs.di ); + struct pxe_api_call *call; + union u_PXENV_ANY params; PXENV_EXIT_t ret; - switch ( opcode ) { - case PXENV_UNLOAD_STACK: - pxenv_call.unload_stack = pxenv_unload_stack; - param_len = sizeof ( pxenv_any.unload_stack ); - break; - case PXENV_GET_CACHED_INFO: - pxenv_call.get_cached_info = pxenv_get_cached_info; - param_len = sizeof ( pxenv_any.get_cached_info ); - break; - case PXENV_RESTART_TFTP: - pxenv_call.restart_tftp = pxenv_restart_tftp; - param_len = sizeof ( pxenv_any.restart_tftp ); - break; - case PXENV_START_UNDI: - pxenv_call.start_undi = pxenv_start_undi; - param_len = sizeof ( pxenv_any.start_undi ); - break; - case PXENV_STOP_UNDI: - pxenv_call.stop_undi = pxenv_stop_undi; - param_len = sizeof ( pxenv_any.stop_undi ); - break; - case PXENV_START_BASE: - pxenv_call.start_base = pxenv_start_base; - param_len = sizeof ( pxenv_any.start_base ); - break; - case PXENV_STOP_BASE: - pxenv_call.stop_base = pxenv_stop_base; - param_len = sizeof ( pxenv_any.stop_base ); - break; - case PXENV_TFTP_OPEN: - pxenv_call.tftp_open = pxenv_tftp_open; - param_len = sizeof ( pxenv_any.tftp_open ); - break; - case PXENV_TFTP_CLOSE: - pxenv_call.tftp_close = pxenv_tftp_close; - param_len = sizeof ( pxenv_any.tftp_close ); - break; - case PXENV_TFTP_READ: - pxenv_call.tftp_read = pxenv_tftp_read; - param_len = sizeof ( pxenv_any.tftp_read ); - break; - case PXENV_TFTP_READ_FILE: - pxenv_call.tftp_read_file = pxenv_tftp_read_file; - param_len = sizeof ( pxenv_any.tftp_read_file ); - break; - case PXENV_TFTP_GET_FSIZE: - pxenv_call.tftp_get_fsize = pxenv_tftp_get_fsize; - param_len = sizeof ( pxenv_any.tftp_get_fsize ); - break; - case PXENV_UDP_OPEN: - pxenv_call.udp_open = pxenv_udp_open; - param_len = sizeof ( pxenv_any.udp_open ); - break; - case PXENV_UDP_CLOSE: - pxenv_call.udp_close = pxenv_udp_close; - param_len = sizeof ( pxenv_any.udp_close ); - break; - case PXENV_UDP_WRITE: - pxenv_call.udp_write = pxenv_udp_write; - param_len = sizeof ( pxenv_any.udp_write ); - break; - case PXENV_UDP_READ: - pxenv_call.udp_read = pxenv_udp_read; - param_len = sizeof ( pxenv_any.udp_read ); - break; - case PXENV_UNDI_STARTUP: - pxenv_call.undi_startup = pxenv_undi_startup; - param_len = sizeof ( pxenv_any.undi_startup ); - break; - case PXENV_UNDI_CLEANUP: - pxenv_call.undi_cleanup = pxenv_undi_cleanup; - param_len = sizeof ( pxenv_any.undi_cleanup ); - break; - case PXENV_UNDI_INITIALIZE: - pxenv_call.undi_initialize = pxenv_undi_initialize; - param_len = sizeof ( pxenv_any.undi_initialize ); - break; - case PXENV_UNDI_RESET_ADAPTER: - pxenv_call.undi_reset_adapter = pxenv_undi_reset_adapter; - param_len = sizeof ( pxenv_any.undi_reset_adapter ); - break; - case PXENV_UNDI_SHUTDOWN: - pxenv_call.undi_shutdown = pxenv_undi_shutdown; - param_len = sizeof ( pxenv_any.undi_shutdown ); - break; - case PXENV_UNDI_OPEN: - pxenv_call.undi_open = pxenv_undi_open; - param_len = sizeof ( pxenv_any.undi_open ); - break; - case PXENV_UNDI_CLOSE: - pxenv_call.undi_close = pxenv_undi_close; - param_len = sizeof ( pxenv_any.undi_close ); - break; - case PXENV_UNDI_TRANSMIT: - pxenv_call.undi_transmit = pxenv_undi_transmit; - param_len = sizeof ( pxenv_any.undi_transmit ); - break; - case PXENV_UNDI_SET_MCAST_ADDRESS: - pxenv_call.undi_set_mcast_address = - pxenv_undi_set_mcast_address; - param_len = sizeof ( pxenv_any.undi_set_mcast_address ); - break; - case PXENV_UNDI_SET_STATION_ADDRESS: - pxenv_call.undi_set_station_address = - pxenv_undi_set_station_address; - param_len = sizeof ( pxenv_any.undi_set_station_address ); - break; - case PXENV_UNDI_SET_PACKET_FILTER: - pxenv_call.undi_set_packet_filter = - pxenv_undi_set_packet_filter; - param_len = sizeof ( pxenv_any.undi_set_packet_filter ); - break; - case PXENV_UNDI_GET_INFORMATION: - pxenv_call.undi_get_information = pxenv_undi_get_information; - param_len = sizeof ( pxenv_any.undi_get_information ); - break; - case PXENV_UNDI_GET_STATISTICS: - pxenv_call.undi_get_statistics = pxenv_undi_get_statistics; - param_len = sizeof ( pxenv_any.undi_get_statistics ); - break; - case PXENV_UNDI_CLEAR_STATISTICS: - pxenv_call.undi_clear_statistics = pxenv_undi_clear_statistics; - param_len = sizeof ( pxenv_any.undi_clear_statistics ); - break; - case PXENV_UNDI_INITIATE_DIAGS: - pxenv_call.undi_initiate_diags = pxenv_undi_initiate_diags; - param_len = sizeof ( pxenv_any.undi_initiate_diags ); - break; - case PXENV_UNDI_FORCE_INTERRUPT: - pxenv_call.undi_force_interrupt = pxenv_undi_force_interrupt; - param_len = sizeof ( pxenv_any.undi_force_interrupt ); - break; - case PXENV_UNDI_GET_MCAST_ADDRESS: - pxenv_call.undi_get_mcast_address = - pxenv_undi_get_mcast_address; - param_len = sizeof ( pxenv_any.undi_get_mcast_address ); - break; - case PXENV_UNDI_GET_NIC_TYPE: - pxenv_call.undi_get_nic_type = pxenv_undi_get_nic_type; - param_len = sizeof ( pxenv_any.undi_get_nic_type ); - break; - case PXENV_UNDI_GET_IFACE_INFO: - pxenv_call.undi_get_iface_info = pxenv_undi_get_iface_info; - param_len = sizeof ( pxenv_any.undi_get_iface_info ); - break; - case PXENV_UNDI_ISR: - pxenv_call.undi_isr = pxenv_undi_isr; - param_len = sizeof ( pxenv_any.undi_isr ); - break; - case PXENV_FILE_OPEN: - pxenv_call.file_open = pxenv_file_open; - param_len = sizeof ( pxenv_any.file_open ); - break; - case PXENV_FILE_CLOSE: - pxenv_call.file_close = pxenv_file_close; - param_len = sizeof ( pxenv_any.file_close ); - break; - case PXENV_FILE_SELECT: - pxenv_call.file_select = pxenv_file_select; - param_len = sizeof ( pxenv_any.file_select ); - break; - case PXENV_FILE_READ: - pxenv_call.file_read = pxenv_file_read; - param_len = sizeof ( pxenv_any.file_read ); - break; - case PXENV_GET_FILE_SIZE: - pxenv_call.get_file_size = pxenv_get_file_size; - param_len = sizeof ( pxenv_any.get_file_size ); - break; - case PXENV_FILE_EXEC: - pxenv_call.file_exec = pxenv_file_exec; - param_len = sizeof ( pxenv_any.file_exec ); - break; - case PXENV_FILE_API_CHECK: - pxenv_call.file_api_check = pxenv_file_api_check; - param_len = sizeof ( pxenv_any.file_api_check ); - break; - case PXENV_FILE_EXIT_HOOK: - pxenv_call.file_exit_hook = pxenv_file_exit_hook; - param_len = sizeof ( pxenv_any.file_exit_hook ); - break; - default: - DBG ( "PXENV_UNKNOWN_%hx", opcode ); - pxenv_call.unknown = pxenv_unknown; - param_len = sizeof ( pxenv_any.unknown ); - break; + /* Locate API call */ + call = find_pxe_api_call ( opcode ); + if ( ! call ) { + DBGC ( &pxe_netdev, "PXENV_UNKNOWN_%04x\n", opcode ); + call = &pxenv_unknown_api; } /* Copy parameter block from caller */ - copy_from_user ( &pxenv_any, parameters, 0, param_len ); + copy_from_user ( ¶ms, uparams, 0, call->params_len ); /* Set default status in case child routine fails to do so */ - pxenv_any.Status = PXENV_STATUS_FAILURE; + params.Status = PXENV_STATUS_FAILURE; /* Hand off to relevant API routine */ - DBG ( "[" ); - ret = pxenv_call.any ( &pxenv_any ); - if ( pxenv_any.Status != PXENV_STATUS_SUCCESS ) { - DBG ( " %02x", pxenv_any.Status ); - } - if ( ret != PXENV_EXIT_SUCCESS ) { - DBG ( ret == PXENV_EXIT_FAILURE ? " err" : " ??" ); - } - DBG ( "]" ); - + ret = call->entry ( ¶ms ); + /* Copy modified parameter block back to caller and return */ - copy_to_user ( parameters, 0, &pxenv_any, param_len ); + copy_to_user ( uparams, 0, ¶ms, call->params_len ); ix86->regs.ax = ret; } @@ -351,8 +114,7 @@ __asmcall void pxe_api_call ( struct i386_all_regs *ix86 ) { * @v ix86 Registers for PXE call * @ret present Zero (PXE stack present) */ -int pxe_api_call_weak ( struct i386_all_regs *ix86 ) -{ +int pxe_api_call_weak ( struct i386_all_regs *ix86 ) { pxe_api_call ( ix86 ); return 0; } @@ -519,3 +281,9 @@ int pxe_start_nbp ( void ) { return rc; } + +REQUIRE_OBJECT ( pxe_preboot ); +REQUIRE_OBJECT ( pxe_undi ); +REQUIRE_OBJECT ( pxe_udp ); +REQUIRE_OBJECT ( pxe_tftp ); +REQUIRE_OBJECT ( pxe_file ); diff --git a/src/arch/i386/interface/pxe/pxe_file.c b/src/arch/i386/interface/pxe/pxe_file.c index 26762568..de1cd9be 100644 --- a/src/arch/i386/interface/pxe/pxe_file.c +++ b/src/arch/i386/interface/pxe/pxe_file.c @@ -49,7 +49,7 @@ FEATURE ( FEATURE_MISC, "PXEXT", DHCP_EB_FEATURE_PXE_EXT, 2 ); * @ret s_PXENV_FILE_OPEN::FileHandle Handle of opened file * */ -PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open ) { +static PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open ) { userptr_t filename; size_t filename_len; int fd; @@ -91,7 +91,7 @@ PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open ) { * @ret s_PXENV_FILE_CLOSE::Status PXE status code * */ -PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE *file_close ) { +static PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE *file_close ) { DBG ( "PXENV_FILE_CLOSE %d", file_close->FileHandle ); @@ -111,7 +111,8 @@ PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE *file_close ) { * @ret s_PXENV_FILE_SELECT::Ready Indication of readiness * */ -PXENV_EXIT_t pxenv_file_select ( struct s_PXENV_FILE_SELECT *file_select ) { +static PXENV_EXIT_t +pxenv_file_select ( struct s_PXENV_FILE_SELECT *file_select ) { fd_set fdset; int ready; @@ -143,7 +144,7 @@ PXENV_EXIT_t pxenv_file_select ( struct s_PXENV_FILE_SELECT *file_select ) { * @ret s_PXENV_FILE_READ::BufferSize Length of data read * */ -PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read ) { +static PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read ) { userptr_t buffer; ssize_t len; @@ -176,8 +177,8 @@ PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read ) { * @ret s_PXENV_GET_FILE_SIZE::Status PXE status code * @ret s_PXENV_GET_FILE_SIZE::FileSize Size of file */ -PXENV_EXIT_t pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE - *get_file_size ) { +static PXENV_EXIT_t +pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE *get_file_size ) { ssize_t filesize; DBG ( "PXENV_GET_FILE_SIZE %d", get_file_size->FileHandle ); @@ -205,7 +206,7 @@ PXENV_EXIT_t pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE * @ret s_PXENV_FILE_EXEC::Status PXE status code * */ -PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec ) { +static PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec ) { userptr_t command; size_t command_len; int rc; @@ -250,7 +251,8 @@ segoff_t __data16 ( pxe_exit_hook ) = { 0, 0 }; * @ret s_PXENV_FILE_API_CHECK::Flags Reserved * */ -PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check ) { +static PXENV_EXIT_t +pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check ) { DBG ( "PXENV_FILE_API_CHECK" ); if ( file_api_check->Magic != 0x91d447b2 ) { @@ -286,8 +288,8 @@ PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_chec * @ret s_PXENV_FILE_EXIT_HOOK::Status PXE status code * */ -PXENV_EXIT_t pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK - *file_exit_hook ) { +static PXENV_EXIT_t +pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK *file_exit_hook ) { DBG ( "PXENV_FILE_EXIT_HOOK" ); /* Check to see if we have a PXE exit hook */ @@ -304,3 +306,22 @@ PXENV_EXIT_t pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK return PXENV_EXIT_FAILURE; } +/** PXE file API */ +struct pxe_api_call pxe_file_api[] __pxe_api_call = { + PXE_API_CALL ( PXENV_FILE_OPEN, pxenv_file_open, + struct s_PXENV_FILE_OPEN ), + PXE_API_CALL ( PXENV_FILE_CLOSE, pxenv_file_close, + struct s_PXENV_FILE_CLOSE ), + PXE_API_CALL ( PXENV_FILE_SELECT, pxenv_file_select, + struct s_PXENV_FILE_SELECT ), + PXE_API_CALL ( PXENV_FILE_READ, pxenv_file_read, + struct s_PXENV_FILE_READ ), + PXE_API_CALL ( PXENV_GET_FILE_SIZE, pxenv_get_file_size, + struct s_PXENV_GET_FILE_SIZE ), + PXE_API_CALL ( PXENV_FILE_EXEC, pxenv_file_exec, + struct s_PXENV_FILE_EXEC ), + PXE_API_CALL ( PXENV_FILE_API_CHECK, pxenv_file_api_check, + struct s_PXENV_FILE_API_CHECK ), + PXE_API_CALL ( PXENV_FILE_EXIT_HOOK, pxenv_file_exit_hook, + struct s_PXENV_FILE_EXIT_HOOK ), +}; diff --git a/src/arch/i386/interface/pxe/pxe_preboot.c b/src/arch/i386/interface/pxe/pxe_preboot.c index 4a9f7ed5..839e4faf 100644 --- a/src/arch/i386/interface/pxe/pxe_preboot.c +++ b/src/arch/i386/interface/pxe/pxe_preboot.c @@ -130,7 +130,8 @@ static union pxe_cached_info __bss16_array ( cached_info, [NUM_CACHED_INFOS] ); * @ret ... * */ -PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK *unload_stack ) { +static PXENV_EXIT_t +pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK *unload_stack ) { DBGC ( &pxe_netdev, "PXENV_UNLOAD_STACK\n" ); unload_stack->Status = PXENV_STATUS_SUCCESS; @@ -141,8 +142,8 @@ PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK *unload_stack ) { * * Status: working */ -PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO - *get_cached_info ) { +static PXENV_EXIT_t +pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO *get_cached_info ) { struct pxe_dhcp_packet_creator *creator; union pxe_cached_info *info; unsigned int idx; @@ -244,8 +245,8 @@ PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO * * Status: working */ -PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE - *restart_tftp ) { +static PXENV_EXIT_t +pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE *restart_tftp ) { PXENV_EXIT_t tftp_exit; DBGC ( &pxe_netdev, "PXENV_RESTART_TFTP\n" ); @@ -267,7 +268,7 @@ PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE * * Status: working */ -PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi ) { +static PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi ) { unsigned int bus_type; unsigned int location; struct net_device *netdev; @@ -316,7 +317,7 @@ PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi ) { * * Status: working */ -PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ) { +static PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ) { DBGC ( &pxe_netdev, "PXENV_STOP_UNDI\n" ); /* Deactivate PXE */ @@ -341,7 +342,7 @@ PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ) { * * Status: won't implement (requires major structural changes) */ -PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base ) { +static PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base ) { DBGC ( &pxe_netdev, "PXENV_START_BASE\n" ); start_base->Status = PXENV_STATUS_UNSUPPORTED; @@ -352,7 +353,7 @@ PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base ) { * * Status: working */ -PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base ) { +static PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base ) { DBGC ( &pxe_netdev, "PXENV_STOP_BASE\n" ); /* The only time we will be called is when the NBP is trying @@ -363,3 +364,21 @@ PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base ) { stop_base->Status = PXENV_STATUS_SUCCESS; return PXENV_EXIT_SUCCESS; } + +/** PXE preboot API */ +struct pxe_api_call pxe_preboot_api[] __pxe_api_call = { + PXE_API_CALL ( PXENV_UNLOAD_STACK, pxenv_unload_stack, + struct s_PXENV_UNLOAD_STACK ), + PXE_API_CALL ( PXENV_GET_CACHED_INFO, pxenv_get_cached_info, + struct s_PXENV_GET_CACHED_INFO ), + PXE_API_CALL ( PXENV_RESTART_TFTP, pxenv_restart_tftp, + struct s_PXENV_TFTP_READ_FILE ), + PXE_API_CALL ( PXENV_START_UNDI, pxenv_start_undi, + struct s_PXENV_START_UNDI ), + PXE_API_CALL ( PXENV_STOP_UNDI, pxenv_stop_undi, + struct s_PXENV_STOP_UNDI ), + PXE_API_CALL ( PXENV_START_BASE, pxenv_start_base, + struct s_PXENV_START_BASE ), + PXE_API_CALL ( PXENV_STOP_BASE, pxenv_stop_base, + struct s_PXENV_STOP_BASE ), +}; diff --git a/src/arch/i386/interface/pxe/pxe_tftp.c b/src/arch/i386/interface/pxe/pxe_tftp.c index 7f0af7a6..2249fc83 100644 --- a/src/arch/i386/interface/pxe/pxe_tftp.c +++ b/src/arch/i386/interface/pxe/pxe_tftp.c @@ -233,7 +233,7 @@ static int pxe_tftp_open ( uint32_t ipaddress, unsigned int port, * view of the PXE API, it is conceptually impossible to issue any * other PXE API call "if an MTFTP connection is active". */ -PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open ) { +static PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open ) { int rc; DBG ( "PXENV_TFTP_OPEN" ); @@ -285,7 +285,7 @@ PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open ) { * call this function with a 32-bit stack segment. (See the relevant * @ref pxe_x86_pmode16 "implementation note" for more details.) */ -PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close ) { +static PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close ) { DBG ( "PXENV_TFTP_CLOSE" ); pxe_tftp_close ( &pxe_tftp, 0 ); @@ -354,7 +354,7 @@ PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close ) { * call this function with a 32-bit stack segment. (See the relevant * @ref pxe_x86_pmode16 "implementation note" for more details.) */ -PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read ) { +static PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read ) { int rc; DBG ( "PXENV_TFTP_READ to %04x:%04x", @@ -531,8 +531,8 @@ PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE * a file from a TFTP server listening on the standard TFTP port. * "Consistency" is not a word in Intel's vocabulary. */ -PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE - *tftp_get_fsize ) { +static PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE + *tftp_get_fsize ) { int rc; DBG ( "PXENV_TFTP_GET_FSIZE" ); @@ -562,3 +562,17 @@ PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE tftp_get_fsize->Status = PXENV_STATUS ( rc ); return ( rc ? PXENV_EXIT_FAILURE : PXENV_EXIT_SUCCESS ); } + +/** PXE TFTP API */ +struct pxe_api_call pxe_tftp_api[] __pxe_api_call = { + PXE_API_CALL ( PXENV_TFTP_OPEN, pxenv_tftp_open, + struct s_PXENV_TFTP_OPEN ), + PXE_API_CALL ( PXENV_TFTP_CLOSE, pxenv_tftp_close, + struct s_PXENV_TFTP_CLOSE ), + PXE_API_CALL ( PXENV_TFTP_READ, pxenv_tftp_read, + struct s_PXENV_TFTP_READ ), + PXE_API_CALL ( PXENV_TFTP_READ_FILE, pxenv_tftp_read_file, + struct s_PXENV_TFTP_READ_FILE ), + PXE_API_CALL ( PXENV_TFTP_GET_FSIZE, pxenv_tftp_get_fsize, + struct s_PXENV_TFTP_GET_FSIZE ), +}; diff --git a/src/arch/i386/interface/pxe/pxe_udp.c b/src/arch/i386/interface/pxe/pxe_udp.c index 22af4ca0..a127f453 100644 --- a/src/arch/i386/interface/pxe/pxe_udp.c +++ b/src/arch/i386/interface/pxe/pxe_udp.c @@ -159,7 +159,7 @@ static struct pxe_udp_connection pxe_udp = { * parameter. * */ -PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *pxenv_udp_open ) { +static PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *pxenv_udp_open ) { int rc; DBG ( "PXENV_UDP_OPEN" ); @@ -202,7 +202,8 @@ PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *pxenv_udp_open ) { * @ref pxe_x86_pmode16 "implementation note" for more details.) * */ -PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *pxenv_udp_close ) { +static PXENV_EXIT_t +pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *pxenv_udp_close ) { DBG ( "PXENV_UDP_CLOSE\n" ); /* Close UDP connection */ @@ -253,7 +254,8 @@ PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *pxenv_udp_close ) { * parameter. * */ -PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *pxenv_udp_write ) { +static PXENV_EXIT_t +pxenv_udp_write ( struct s_PXENV_UDP_WRITE *pxenv_udp_write ) { struct sockaddr_in dest; struct xfer_metadata meta = { .src = ( struct sockaddr * ) &pxe_udp.local, @@ -359,7 +361,7 @@ PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *pxenv_udp_write ) { * expects us to do so, and will fail if we don't. * */ -PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *pxenv_udp_read ) { +static PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *pxenv_udp_read ) { struct in_addr dest_ip_wanted = { .s_addr = pxenv_udp_read->dest_ip }; struct in_addr dest_ip; uint16_t d_port_wanted = pxenv_udp_read->d_port; @@ -405,3 +407,15 @@ PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *pxenv_udp_read ) { pxenv_udp_read->Status = PXENV_STATUS_FAILURE; return PXENV_EXIT_FAILURE; } + +/** PXE UDP API */ +struct pxe_api_call pxe_udp_api[] __pxe_api_call = { + PXE_API_CALL ( PXENV_UDP_OPEN, pxenv_udp_open, + struct s_PXENV_UDP_OPEN ), + PXE_API_CALL ( PXENV_UDP_CLOSE, pxenv_udp_close, + struct s_PXENV_UDP_CLOSE ), + PXE_API_CALL ( PXENV_UDP_WRITE, pxenv_udp_write, + struct s_PXENV_UDP_WRITE ), + PXE_API_CALL ( PXENV_UDP_READ, pxenv_udp_read, + struct s_PXENV_UDP_READ ), +}; diff --git a/src/arch/i386/interface/pxe/pxe_undi.c b/src/arch/i386/interface/pxe/pxe_undi.c index 9eeb32eb..d605c82f 100644 --- a/src/arch/i386/interface/pxe/pxe_undi.c +++ b/src/arch/i386/interface/pxe/pxe_undi.c @@ -121,7 +121,8 @@ static void pxe_dump_mcast_list ( struct s_PXENV_UNDI_MCAST_ADDRESS *mcast ) { * * Status: working */ -PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP *undi_startup ) { +static PXENV_EXIT_t +pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP *undi_startup ) { DBGC ( &pxe_netdev, "PXENV_UNDI_STARTUP\n" ); /* Sanity check */ @@ -140,7 +141,8 @@ PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP *undi_startup ) { * * Status: working */ -PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP *undi_cleanup ) { +static PXENV_EXIT_t +pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP *undi_cleanup ) { DBGC ( &pxe_netdev, "PXENV_UNDI_CLEANUP\n" ); /* Sanity check */ @@ -162,8 +164,8 @@ PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP *undi_cleanup ) { * * Status: working */ -PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE - *undi_initialize ) { +static PXENV_EXIT_t +pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE *undi_initialize ) { DBGC ( &pxe_netdev, "PXENV_UNDI_INITIALIZE protocolini %08x\n", undi_initialize->ProtocolIni ); @@ -183,8 +185,8 @@ PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE * * Status: working */ -PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET - *undi_reset_adapter ) { +static PXENV_EXIT_t +pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET *undi_reset_adapter ) { int rc; DBGC ( &pxe_netdev, "PXENV_UNDI_RESET_ADAPTER" ); @@ -216,8 +218,8 @@ PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET * * Status: working */ -PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN - *undi_shutdown ) { +static PXENV_EXIT_t +pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN *undi_shutdown ) { DBGC ( &pxe_netdev, "PXENV_UNDI_SHUTDOWN\n" ); /* Sanity check */ @@ -239,7 +241,7 @@ PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN * * Status: working */ -PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open ) { +static PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open ) { int rc; DBGC ( &pxe_netdev, "PXENV_UNDI_OPEN flag %04x filter %04x", @@ -271,7 +273,7 @@ PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open ) { * * Status: working */ -PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close ) { +static PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close ) { DBGC ( &pxe_netdev, "PXENV_UNDI_CLOSE\n" ); /* Sanity check */ @@ -293,8 +295,8 @@ PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close ) { * * Status: working */ -PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT - *undi_transmit ) { +static PXENV_EXIT_t +pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT *undi_transmit ) { struct s_PXENV_UNDI_TBD tbd; struct DataBlk *datablk; struct io_buffer *iobuf; @@ -426,7 +428,7 @@ PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT * * Status: working (for NICs that support receive-all-multicast) */ -PXENV_EXIT_t +static PXENV_EXIT_t pxenv_undi_set_mcast_address ( struct s_PXENV_UNDI_SET_MCAST_ADDRESS *undi_set_mcast_address ) { DBGC ( &pxe_netdev, "PXENV_UNDI_SET_MCAST_ADDRESS" ); @@ -450,7 +452,7 @@ pxenv_undi_set_mcast_address ( struct s_PXENV_UNDI_SET_MCAST_ADDRESS * * Status: working */ -PXENV_EXIT_t +static PXENV_EXIT_t pxenv_undi_set_station_address ( struct s_PXENV_UNDI_SET_STATION_ADDRESS *undi_set_station_address ) { struct ll_protocol *ll_protocol; @@ -493,7 +495,7 @@ pxenv_undi_set_station_address ( struct s_PXENV_UNDI_SET_STATION_ADDRESS * Status: won't implement (would require driver API changes for no * real benefit) */ -PXENV_EXIT_t +static PXENV_EXIT_t pxenv_undi_set_packet_filter ( struct s_PXENV_UNDI_SET_PACKET_FILTER *undi_set_packet_filter ) { @@ -522,8 +524,9 @@ pxenv_undi_set_packet_filter ( struct s_PXENV_UNDI_SET_PACKET_FILTER * * Status: working */ -PXENV_EXIT_t pxenv_undi_get_information ( struct s_PXENV_UNDI_GET_INFORMATION - *undi_get_information ) { +static PXENV_EXIT_t +pxenv_undi_get_information ( struct s_PXENV_UNDI_GET_INFORMATION + *undi_get_information ) { struct device *dev; struct ll_protocol *ll_protocol; @@ -574,8 +577,9 @@ PXENV_EXIT_t pxenv_undi_get_information ( struct s_PXENV_UNDI_GET_INFORMATION * * Status: working */ -PXENV_EXIT_t pxenv_undi_get_statistics ( struct s_PXENV_UNDI_GET_STATISTICS - *undi_get_statistics ) { +static PXENV_EXIT_t +pxenv_undi_get_statistics ( struct s_PXENV_UNDI_GET_STATISTICS + *undi_get_statistics ) { /* Sanity check */ if ( ! pxe_netdev ) { @@ -606,8 +610,9 @@ PXENV_EXIT_t pxenv_undi_get_statistics ( struct s_PXENV_UNDI_GET_STATISTICS * * Status: working */ -PXENV_EXIT_t pxenv_undi_clear_statistics ( struct s_PXENV_UNDI_CLEAR_STATISTICS - *undi_clear_statistics ) { +static PXENV_EXIT_t +pxenv_undi_clear_statistics ( struct s_PXENV_UNDI_CLEAR_STATISTICS + *undi_clear_statistics ) { DBGC ( &pxe_netdev, "PXENV_UNDI_CLEAR_STATISTICS\n" ); /* Sanity check */ @@ -631,8 +636,9 @@ PXENV_EXIT_t pxenv_undi_clear_statistics ( struct s_PXENV_UNDI_CLEAR_STATISTICS * Status: won't implement (would require driver API changes for no * real benefit) */ -PXENV_EXIT_t pxenv_undi_initiate_diags ( struct s_PXENV_UNDI_INITIATE_DIAGS - *undi_initiate_diags ) { +static PXENV_EXIT_t +pxenv_undi_initiate_diags ( struct s_PXENV_UNDI_INITIATE_DIAGS + *undi_initiate_diags ) { DBGC ( &pxe_netdev, "PXENV_UNDI_INITIATE_DIAGS failed: unsupported\n" ); /* Sanity check */ @@ -652,8 +658,9 @@ PXENV_EXIT_t pxenv_undi_initiate_diags ( struct s_PXENV_UNDI_INITIATE_DIAGS * Status: won't implement (would require driver API changes for no * perceptible benefit) */ -PXENV_EXIT_t pxenv_undi_force_interrupt ( struct s_PXENV_UNDI_FORCE_INTERRUPT - *undi_force_interrupt ) { +static PXENV_EXIT_t +pxenv_undi_force_interrupt ( struct s_PXENV_UNDI_FORCE_INTERRUPT + *undi_force_interrupt ) { DBGC ( &pxe_netdev, "PXENV_UNDI_FORCE_INTERRUPT failed: unsupported\n" ); @@ -673,7 +680,7 @@ PXENV_EXIT_t pxenv_undi_force_interrupt ( struct s_PXENV_UNDI_FORCE_INTERRUPT * * Status: working */ -PXENV_EXIT_t +static PXENV_EXIT_t pxenv_undi_get_mcast_address ( struct s_PXENV_UNDI_GET_MCAST_ADDRESS *undi_get_mcast_address ) { struct ll_protocol *ll_protocol; @@ -711,8 +718,8 @@ pxenv_undi_get_mcast_address ( struct s_PXENV_UNDI_GET_MCAST_ADDRESS * * Status: working */ -PXENV_EXIT_t pxenv_undi_get_nic_type ( struct s_PXENV_UNDI_GET_NIC_TYPE - *undi_get_nic_type ) { +static PXENV_EXIT_t pxenv_undi_get_nic_type ( struct s_PXENV_UNDI_GET_NIC_TYPE + *undi_get_nic_type ) { struct device *dev; /* Sanity check */ @@ -782,8 +789,9 @@ PXENV_EXIT_t pxenv_undi_get_nic_type ( struct s_PXENV_UNDI_GET_NIC_TYPE * * Status: working */ -PXENV_EXIT_t pxenv_undi_get_iface_info ( struct s_PXENV_UNDI_GET_IFACE_INFO - *undi_get_iface_info ) { +static PXENV_EXIT_t +pxenv_undi_get_iface_info ( struct s_PXENV_UNDI_GET_IFACE_INFO + *undi_get_iface_info ) { /* Sanity check */ if ( ! pxe_netdev ) { @@ -819,29 +827,14 @@ PXENV_EXIT_t pxenv_undi_get_iface_info ( struct s_PXENV_UNDI_GET_IFACE_INFO /* PXENV_UNDI_GET_STATE * - * Status: impossible + * Status: impossible due to opcode collision */ -PXENV_EXIT_t pxenv_undi_get_state ( struct s_PXENV_UNDI_GET_STATE - *undi_get_state ) { - DBGC ( &pxe_netdev, "PXENV_UNDI_GET_STATE failed: unsupported\n" ); - - /* Sanity check */ - if ( ! pxe_netdev ) { - DBGC ( &pxe_netdev, "PXENV_UNDI_GET_STATE called with " - "no network device\n" ); - undi_get_state->Status = PXENV_STATUS_UNDI_INVALID_STATE; - return PXENV_EXIT_FAILURE; - } - - undi_get_state->Status = PXENV_STATUS_UNSUPPORTED; - return PXENV_EXIT_FAILURE; -}; /* PXENV_UNDI_ISR * * Status: working */ -PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) { +static PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) { struct io_buffer *iobuf; size_t len; struct ll_protocol *ll_protocol; @@ -1025,3 +1018,51 @@ PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) { undi_isr->Status = PXENV_STATUS_SUCCESS; return PXENV_EXIT_SUCCESS; } + +/** PXE UNDI API */ +struct pxe_api_call pxe_undi_api[] __pxe_api_call = { + PXE_API_CALL ( PXENV_UNDI_STARTUP, pxenv_undi_startup, + struct s_PXENV_UNDI_STARTUP ), + PXE_API_CALL ( PXENV_UNDI_CLEANUP, pxenv_undi_cleanup, + struct s_PXENV_UNDI_CLEANUP ), + PXE_API_CALL ( PXENV_UNDI_INITIALIZE, pxenv_undi_initialize, + struct s_PXENV_UNDI_INITIALIZE ), + PXE_API_CALL ( PXENV_UNDI_RESET_ADAPTER, pxenv_undi_reset_adapter, + struct s_PXENV_UNDI_RESET ), + PXE_API_CALL ( PXENV_UNDI_SHUTDOWN, pxenv_undi_shutdown, + struct s_PXENV_UNDI_SHUTDOWN ), + PXE_API_CALL ( PXENV_UNDI_OPEN, pxenv_undi_open, + struct s_PXENV_UNDI_OPEN ), + PXE_API_CALL ( PXENV_UNDI_CLOSE, pxenv_undi_close, + struct s_PXENV_UNDI_CLOSE ), + PXE_API_CALL ( PXENV_UNDI_TRANSMIT, pxenv_undi_transmit, + struct s_PXENV_UNDI_TRANSMIT ), + PXE_API_CALL ( PXENV_UNDI_SET_MCAST_ADDRESS, + pxenv_undi_set_mcast_address, + struct s_PXENV_UNDI_SET_MCAST_ADDRESS ), + PXE_API_CALL ( PXENV_UNDI_SET_STATION_ADDRESS, + pxenv_undi_set_station_address, + struct s_PXENV_UNDI_SET_STATION_ADDRESS ), + PXE_API_CALL ( PXENV_UNDI_SET_PACKET_FILTER, + pxenv_undi_set_packet_filter, + struct s_PXENV_UNDI_SET_PACKET_FILTER ), + PXE_API_CALL ( PXENV_UNDI_GET_INFORMATION, pxenv_undi_get_information, + struct s_PXENV_UNDI_GET_INFORMATION ), + PXE_API_CALL ( PXENV_UNDI_GET_STATISTICS, pxenv_undi_get_statistics, + struct s_PXENV_UNDI_GET_STATISTICS ), + PXE_API_CALL ( PXENV_UNDI_CLEAR_STATISTICS, pxenv_undi_clear_statistics, + struct s_PXENV_UNDI_CLEAR_STATISTICS ), + PXE_API_CALL ( PXENV_UNDI_INITIATE_DIAGS, pxenv_undi_initiate_diags, + struct s_PXENV_UNDI_INITIATE_DIAGS ), + PXE_API_CALL ( PXENV_UNDI_FORCE_INTERRUPT, pxenv_undi_force_interrupt, + struct s_PXENV_UNDI_FORCE_INTERRUPT ), + PXE_API_CALL ( PXENV_UNDI_GET_MCAST_ADDRESS, + pxenv_undi_get_mcast_address, + struct s_PXENV_UNDI_GET_MCAST_ADDRESS ), + PXE_API_CALL ( PXENV_UNDI_GET_NIC_TYPE, pxenv_undi_get_nic_type, + struct s_PXENV_UNDI_GET_NIC_TYPE ), + PXE_API_CALL ( PXENV_UNDI_GET_IFACE_INFO, pxenv_undi_get_iface_info, + struct s_PXENV_UNDI_GET_IFACE_INFO ), + PXE_API_CALL ( PXENV_UNDI_ISR, pxenv_undi_isr, + struct s_PXENV_UNDI_ISR ), +};