| #ifndef PXE_H | |
| #define PXE_H | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| #include "pxe_types.h" | |
| #include "pxe_error.h" | |
| #include "pxe_api.h" | |
| #include <ipxe/device.h> | |
| #include <ipxe/tables.h> | |
| /** 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 )); | |
| typedef struct s_PXENV_UNKNOWN PXENV_UNKNOWN_t; | |
| /* Union used for PXE API calls; we don't know the type of the | |
| * structure until we interpret the opcode. Also, Status is available | |
| * in the same location for any opcode, and it's convenient to have | |
| * non-specific access to it. | |
| */ | |
| union u_PXENV_ANY { | |
| /* Make it easy to read status for any operation */ | |
| PXENV_STATUS_t Status; | |
| struct s_PXENV_UNKNOWN unknown; | |
| struct s_PXENV_UNLOAD_STACK unload_stack; | |
| struct s_PXENV_GET_CACHED_INFO get_cached_info; | |
| 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; | |
| struct s_PXENV_STOP_BASE stop_base; | |
| struct s_PXENV_TFTP_OPEN tftp_open; | |
| struct s_PXENV_TFTP_CLOSE tftp_close; | |
| struct s_PXENV_TFTP_READ tftp_read; | |
| struct s_PXENV_TFTP_READ_FILE tftp_read_file; | |
| struct s_PXENV_TFTP_GET_FSIZE tftp_get_fsize; | |
| struct s_PXENV_UDP_OPEN udp_open; | |
| struct s_PXENV_UDP_CLOSE udp_close; | |
| struct s_PXENV_UDP_WRITE udp_write; | |
| struct s_PXENV_UDP_READ udp_read; | |
| 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 undi_reset_adapter; | |
| struct s_PXENV_UNDI_SHUTDOWN undi_shutdown; | |
| struct s_PXENV_UNDI_OPEN undi_open; | |
| struct s_PXENV_UNDI_CLOSE undi_close; | |
| struct s_PXENV_UNDI_TRANSMIT undi_transmit; | |
| struct s_PXENV_UNDI_SET_MCAST_ADDRESS undi_set_mcast_address; | |
| struct s_PXENV_UNDI_SET_STATION_ADDRESS undi_set_station_address; | |
| struct s_PXENV_UNDI_SET_PACKET_FILTER undi_set_packet_filter; | |
| struct s_PXENV_UNDI_GET_INFORMATION undi_get_information; | |
| struct s_PXENV_UNDI_GET_STATISTICS undi_get_statistics; | |
| struct s_PXENV_UNDI_CLEAR_STATISTICS undi_clear_statistics; | |
| struct s_PXENV_UNDI_INITIATE_DIAGS undi_initiate_diags; | |
| struct s_PXENV_UNDI_FORCE_INTERRUPT undi_force_interrupt; | |
| struct s_PXENV_UNDI_GET_MCAST_ADDRESS undi_get_mcast_address; | |
| struct s_PXENV_UNDI_GET_NIC_TYPE undi_get_nic_type; | |
| struct s_PXENV_UNDI_GET_IFACE_INFO undi_get_iface_info; | |
| struct s_PXENV_UNDI_GET_STATE undi_get_state; | |
| struct s_PXENV_UNDI_ISR undi_isr; | |
| struct s_PXENV_FILE_OPEN file_open; | |
| struct s_PXENV_FILE_CLOSE file_close; | |
| struct s_PXENV_FILE_SELECT file_select; | |
| struct s_PXENV_FILE_READ file_read; | |
| struct s_PXENV_GET_FILE_SIZE get_file_size; | |
| struct s_PXENV_FILE_EXEC file_exec; | |
| struct s_PXENV_FILE_API_CHECK file_api_check; | |
| struct s_PXENV_FILE_EXIT_HOOK file_exit_hook; | |
| }; | |
| 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 | |
| * | |
| * Must be equal to @c ROM_SIGNATURE | |
| */ | |
| UINT16_t Signature; | |
| /** ROM length in 512-byte blocks */ | |
| UINT8_t ROMLength; | |
| /** Unused */ | |
| UINT8_t unused[0x13]; | |
| /** Offset of the PXE ROM ID structure */ | |
| UINT16_t PXEROMID; | |
| /** Offset of the PCI ROM structure */ | |
| UINT16_t PCIRHeader; | |
| } __attribute__ (( packed )); | |
| /** Signature for an expansion ROM */ | |
| #define ROM_SIGNATURE 0xaa55 | |
| /** An UNDI ROM ID structure */ | |
| struct undi_rom_id { | |
| /** Signature | |
| * | |
| * Must be equal to @c UNDI_ROM_ID_SIGNATURE | |
| */ | |
| UINT32_t Signature; | |
| /** Length of structure */ | |
| UINT8_t StructLength; | |
| /** Checksum */ | |
| UINT8_t StructCksum; | |
| /** Structure revision | |
| * | |
| * Must be zero. | |
| */ | |
| UINT8_t StructRev; | |
| /** UNDI revision | |
| * | |
| * Version 2.1.0 is encoded as the byte sequence 0x00, 0x01, 0x02. | |
| */ | |
| UINT8_t UNDIRev[3]; | |
| /** Offset to 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; | |
| } __attribute__ (( packed )); | |
| /** Signature for an UNDI ROM ID structure */ | |
| #define UNDI_ROM_ID_SIGNATURE \ | |
| ( ( 'U' << 0 ) + ( 'N' << 8 ) + ( 'D' << 16 ) + ( 'I' << 24 ) ) | |
| /** A PCI expansion header */ | |
| struct pcir_header { | |
| /** Signature | |
| * | |
| * Must be equal to @c PCIR_SIGNATURE | |
| */ | |
| uint32_t signature; | |
| /** PCI vendor ID */ | |
| uint16_t vendor_id; | |
| /** PCI device ID */ | |
| uint16_t device_id; | |
| } __attribute__ (( packed )); | |
| /** Signature for an UNDI ROM ID structure */ | |
| #define PCIR_SIGNATURE \ | |
| ( ( 'P' << 0 ) + ( 'C' << 8 ) + ( 'I' << 16 ) + ( 'R' << 24 ) ) | |
| extern struct net_device *pxe_netdev; | |
| extern const char *pxe_cmdline; | |
| extern void pxe_set_netdev ( struct net_device *netdev ); | |
| extern void pxe_fake_cached_info ( void ); | |
| 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 */ |