efi_loader: EFI_PXE_BASE_CODE_PROTOCOL stub

U-Boot implements the EFI_PXE_BASE_CODE_PROTOCOL because GRUB uses the mode
information for booting via PXE. All function pointers in the protocol were
NULL up to now which will cause immediate crashes when the services of the
protocol are called.

Create function stubs for all services of the protocol returning
EFI_UNSUPPORTED.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
diff --git a/include/efi_api.h b/include/efi_api.h
index e5634dc..4377819 100644
--- a/include/efi_api.h
+++ b/include/efi_api.h
@@ -1287,6 +1287,9 @@
 	EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
 		 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 
+#define EFI_PXE_BASE_CODE_PROTOCOL_REVISION 0x00010000
+#define EFI_PXE_BASE_CODE_MAX_IPCNT 8
+
 struct efi_pxe_packet {
 	u8 packet[1472];
 };
@@ -1321,20 +1324,131 @@
 	struct efi_pxe_packet pxe_reply;
 };
 
-struct efi_pxe {
-	u64 rev;
-	void (EFIAPI *start)(void);
-	void (EFIAPI *stop)(void);
-	void (EFIAPI *dhcp)(void);
-	void (EFIAPI *discover)(void);
-	void (EFIAPI *mftp)(void);
-	void (EFIAPI *udpwrite)(void);
-	void (EFIAPI *udpread)(void);
-	void (EFIAPI *setipfilter)(void);
-	void (EFIAPI *arp)(void);
-	void (EFIAPI *setparams)(void);
-	void (EFIAPI *setstationip)(void);
-	void (EFIAPI *setpackets)(void);
+struct efi_pxe_base_code_srvlist {
+	u16 type;
+	u8 accept_any_response;
+	u8 reserved;
+	struct efi_ip_address ip_addr;
+};
+
+struct efi_pxe_base_code_discover_info {
+	u8 use_m_cast;
+	u8 use_b_cast;
+	u8 use_u_cast;
+	u8 must_use_list;
+	struct efi_ip_address server_m_cast_ip;
+	u16 ip_cnt;
+	struct efi_pxe_base_code_srvlist srv_list[];
+};
+
+struct efi_pxe_base_code_mtftp_info {
+	struct efi_ip_address m_cast_ip;
+	u16 cport;
+	u16 sport;
+	u16 listen_timeout;
+	u16 transit_timeout;
+};
+
+struct efi_pxe_base_code_filter {
+	u8 filters;
+	u8 ip_cnt;
+	u16 reserved;
+	struct efi_ip_address ip_list[EFI_PXE_BASE_CODE_MAX_IPCNT];
+};
+
+struct efi_pxe_base_code_dhcpv4_packet {
+	u8 bootp_op_code;
+	u8 bootp_hw_type;
+	u8 bootp_addr_len;
+	u8 bootp_gate_hops;
+	u32 bootp_ident;
+	u16 bootp_seconds;
+	u16 bootp_flags;
+	u8 bootp_ci_addr[4];
+	u8 bootp_yi_addr[4];
+	u8 bootp_si_addr[4];
+	u8 bootp_gi_addr[4];
+	u8 bootp_hw_addr[16];
+	u8 bootp_srv_name[64];
+	u8 bootp_boot_file[128];
+	u32 dhcp_magick;
+	u8 dhcp_options[56];
+};
+
+struct efi_pxe_base_code_dhcpv6_packet {
+	u8 message_type;
+	u8 transaction_id[3];
+	u8 dhcp_options[1024];
+};
+
+typedef union {
+	u8 raw[1472];
+	struct efi_pxe_base_code_dhcpv4_packet dhcpv4;
+	struct efi_pxe_base_code_dhcpv6_packet dhcpv6;
+} EFI_PXE_BASE_CODE_PACKET;
+
+struct efi_pxe_base_code_protocol {
+	u64 revision;
+	efi_status_t (EFIAPI *start)(struct efi_pxe_base_code_protocol *this,
+				     u8 use_ipv6);
+	efi_status_t (EFIAPI *stop)(struct efi_pxe_base_code_protocol *this);
+	efi_status_t (EFIAPI *dhcp)(struct efi_pxe_base_code_protocol *this,
+				    u8 sort_offers);
+	efi_status_t (EFIAPI *discover)(
+				struct efi_pxe_base_code_protocol *this,
+				u16 type, u16 *layer, u8 bis,
+				struct efi_pxe_base_code_discover_info *info);
+	efi_status_t (EFIAPI *mtftp)(
+				struct efi_pxe_base_code_protocol *this,
+				u32 operation, void *buffer_ptr,
+				u8 overwrite, efi_uintn_t *buffer_size,
+				struct efi_ip_address server_ip, char *filename,
+				struct efi_pxe_base_code_mtftp_info *info,
+				u8 dont_use_buffer);
+	efi_status_t (EFIAPI *udp_write)(
+				struct efi_pxe_base_code_protocol *this,
+				u16 op_flags, struct efi_ip_address *dest_ip,
+				u16 *dest_port,
+				struct efi_ip_address *gateway_ip,
+				struct efi_ip_address *src_ip, u16 *src_port,
+				efi_uintn_t *header_size, void *header_ptr,
+				efi_uintn_t *buffer_size, void *buffer_ptr);
+	efi_status_t (EFIAPI *udp_read)(
+				struct efi_pxe_base_code_protocol *this,
+				u16 op_flags, struct efi_ip_address *dest_ip,
+				u16 *dest_port, struct efi_ip_address *src_ip,
+				u16 *src_port, efi_uintn_t *header_size,
+				void *header_ptr, efi_uintn_t *buffer_size,
+				void *buffer_ptr);
+	efi_status_t (EFIAPI *set_ip_filter)(
+				struct efi_pxe_base_code_protocol *this,
+				struct efi_pxe_base_code_filter *new_filter);
+	efi_status_t (EFIAPI *arp)(struct efi_pxe_base_code_protocol *this,
+				   struct efi_ip_address *ip_addr,
+				   struct efi_mac_address *mac_addr);
+	efi_status_t (EFIAPI *set_parameters)(
+				struct efi_pxe_base_code_protocol *this,
+				u8 *new_auto_arp, u8 *new_send_guid,
+				u8 *new_ttl, u8 *new_tos,
+				u8 *new_make_callback);
+	efi_status_t (EFIAPI *set_station_ip)(
+				struct efi_pxe_base_code_protocol *this,
+				struct efi_ip_address *new_station_ip,
+				struct efi_ip_address *new_subnet_mask);
+	efi_status_t (EFIAPI *set_packets)(
+				struct efi_pxe_base_code_protocol *this,
+				u8 *new_dhcp_discover_valid,
+				u8 *new_dhcp_ack_received,
+				u8 *new_proxy_offer_received,
+				u8 *new_pxe_discover_valid,
+				u8 *new_pxe_reply_received,
+				u8 *new_pxe_bis_reply_received,
+				EFI_PXE_BASE_CODE_PACKET *new_dchp_discover,
+				EFI_PXE_BASE_CODE_PACKET *new_dhcp_acc,
+				EFI_PXE_BASE_CODE_PACKET *new_proxy_offer,
+				EFI_PXE_BASE_CODE_PACKET *new_pxe_discover,
+				EFI_PXE_BASE_CODE_PACKET *new_pxe_reply,
+				EFI_PXE_BASE_CODE_PACKET *new_pxe_bis_reply);
 	struct efi_pxe_mode *mode;
 };