Browse Source

[pxe] Modularise PXE API provision

Use the linker table infrastructure to dispatch PXE API calls to the
relevant function.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 12 years ago
parent
commit
fa410e0a41

+ 47
- 2
src/arch/i386/include/pxe.h View File

6
 #include "pxe_types.h"
6
 #include "pxe_types.h"
7
 #include "pxe_api.h"
7
 #include "pxe_api.h"
8
 #include <ipxe/device.h>
8
 #include <ipxe/device.h>
9
+#include <ipxe/tables.h>
9
 
10
 
10
-/* Parameter block for pxenv_unknown() */
11
+/** PXE API invalid function code */
12
+#define PXENV_UNKNOWN 0xffff
13
+
14
+/** Parameter block for pxenv_unknown() */
11
 struct s_PXENV_UNKNOWN {
15
 struct s_PXENV_UNKNOWN {
12
 	PXENV_STATUS_t Status;			/**< PXE status code */
16
 	PXENV_STATUS_t Status;			/**< PXE status code */
13
 } __attribute__ (( packed ));
17
 } __attribute__ (( packed ));
72
 
76
 
73
 typedef union u_PXENV_ANY PXENV_ANY_t;
77
 typedef union u_PXENV_ANY PXENV_ANY_t;
74
 
78
 
79
+/** A PXE API call */
80
+struct pxe_api_call {
81
+	/** Entry point
82
+	 *
83
+	 * @v params		PXE API call parameters
84
+	 * @ret exit		PXE API call exit code
85
+	 */
86
+	PXENV_EXIT_t ( * entry ) ( union u_PXENV_ANY *params );
87
+	/** Length of parameters */
88
+	uint16_t params_len;
89
+	/** Opcode */
90
+	uint16_t opcode;
91
+};
92
+
93
+/** PXE API call table */
94
+#define PXE_API_CALLS __table ( struct pxe_api_call, "pxe_api_calls" )
95
+
96
+/** Declare a PXE API call */
97
+#define __pxe_api_call __table_entry ( PXE_API_CALLS, 01 )
98
+
99
+/**
100
+ * Define a PXE API call
101
+ *
102
+ * @v _opcode		Opcode
103
+ * @v _entry		Entry point
104
+ * @v _params_type	Type of parameter structure
105
+ * @ret call		PXE API call
106
+ */
107
+#define PXE_API_CALL( _opcode, _entry, _params_type ) {			      \
108
+	.entry = ( ( ( ( PXENV_EXIT_t ( * ) ( _params_type *params ) ) NULL ) \
109
+		    == ( ( typeof ( _entry ) * ) NULL ) )		      \
110
+		   ? ( ( PXENV_EXIT_t ( * )				      \
111
+			 ( union u_PXENV_ANY *params ) ) _entry )	      \
112
+		   : ( ( PXENV_EXIT_t ( * )				      \
113
+			 ( union u_PXENV_ANY *params ) ) _entry ) ),	      \
114
+	.params_len = sizeof ( _params_type ),				      \
115
+	.opcode = _opcode,						      \
116
+	}
117
+
75
 /** An UNDI expansion ROM header */
118
 /** An UNDI expansion ROM header */
76
 struct undi_rom_header {
119
 struct undi_rom_header {
77
 	/** Signature
120
 	/** Signature
144
 #define PCIR_SIGNATURE \
187
 #define PCIR_SIGNATURE \
145
 	( ( 'P' << 0 ) + ( 'C' << 8 ) + ( 'I' << 16 ) + ( 'R' << 24 ) )
188
 	( ( 'P' << 0 ) + ( 'C' << 8 ) + ( 'I' << 16 ) + ( 'R' << 24 ) )
146
 
189
 
147
-
148
 extern struct net_device *pxe_netdev;
190
 extern struct net_device *pxe_netdev;
149
 
191
 
150
 extern void pxe_set_netdev ( struct net_device *netdev );
192
 extern void pxe_set_netdev ( struct net_device *netdev );
193
+extern PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE
194
+					   *tftp_read_file );
195
+extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader );
151
 
196
 
152
 #endif /* PXE_H */
197
 #endif /* PXE_H */

+ 0
- 118
src/arch/i386/include/pxe_api.h View File

252
 
252
 
253
 typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t;
253
 typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t;
254
 
254
 
255
-extern PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK
256
-					 *unload_stack );
257
-
258
 /** @} */ /* pxenv_unload_stack */
255
 /** @} */ /* pxenv_unload_stack */
259
 
256
 
260
 /** @defgroup pxenv_get_cached_info PXENV_GET_CACHED_INFO
257
 /** @defgroup pxenv_get_cached_info PXENV_GET_CACHED_INFO
403
 
400
 
404
 typedef struct bootph BOOTPLAYER_t;
401
 typedef struct bootph BOOTPLAYER_t;
405
 
402
 
406
-extern PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO
407
-					    *get_cached_info );
408
-
409
 /** @} */ /* pxenv_get_cached_info */
403
 /** @} */ /* pxenv_get_cached_info */
410
 
404
 
411
 /** @defgroup pxenv_restart_tftp PXENV_RESTART_TFTP
405
 /** @defgroup pxenv_restart_tftp PXENV_RESTART_TFTP
423
 
417
 
424
 typedef struct s_PXENV_RESTART_TFTP PXENV_RESTART_TFTP_t;
418
 typedef struct s_PXENV_RESTART_TFTP PXENV_RESTART_TFTP_t;
425
 
419
 
426
-extern PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE
427
-					 *restart_tftp );
428
-
429
 /** @} */ /* pxenv_restart_tftp */
420
 /** @} */ /* pxenv_restart_tftp */
430
 
421
 
431
 /** @defgroup pxenv_start_undi PXENV_START_UNDI
422
 /** @defgroup pxenv_start_undi PXENV_START_UNDI
496
 
487
 
497
 typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t;
488
 typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t;
498
 
489
 
499
-extern PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi );
500
-
501
 /** @} */ /* pxenv_start_undi */
490
 /** @} */ /* pxenv_start_undi */
502
 
491
 
503
 /** @defgroup pxenv_stop_undi PXENV_STOP_UNDI
492
 /** @defgroup pxenv_stop_undi PXENV_STOP_UNDI
517
 
506
 
518
 typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t;
507
 typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t;
519
 
508
 
520
-extern PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi );
521
-
522
 /** @} */ /* pxenv_stop_undi */
509
 /** @} */ /* pxenv_stop_undi */
523
 
510
 
524
 /** @defgroup pxenv_start_base PXENV_START_BASE
511
 /** @defgroup pxenv_start_base PXENV_START_BASE
538
 
525
 
539
 typedef struct s_PXENV_START_BASE PXENV_START_BASE_t;
526
 typedef struct s_PXENV_START_BASE PXENV_START_BASE_t;
540
 
527
 
541
-extern PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base );
542
-
543
 /** @} */ /* pxenv_start_base */
528
 /** @} */ /* pxenv_start_base */
544
 
529
 
545
 /** @defgroup pxenv_stop_base PXENV_STOP_BASE
530
 /** @defgroup pxenv_stop_base PXENV_STOP_BASE
559
 
544
 
560
 typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t;
545
 typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t;
561
 
546
 
562
-extern PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base );
563
-
564
 /** @} */ /* pxenv_stop_base */
547
 /** @} */ /* pxenv_stop_base */
565
 
548
 
566
 /** @} */ /* pxe_preboot_api */
549
 /** @} */ /* pxe_preboot_api */
600
 
583
 
601
 typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t;
584
 typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t;
602
 
585
 
603
-extern PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open );
604
-
605
 /** @} */ /* pxenv_tftp_open */
586
 /** @} */ /* pxenv_tftp_open */
606
 
587
 
607
 /** @defgroup pxenv_tftp_close PXENV_TFTP_CLOSE
588
 /** @defgroup pxenv_tftp_close PXENV_TFTP_CLOSE
621
 
602
 
622
 typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t;
603
 typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t;
623
 
604
 
624
-extern PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close );
625
-
626
 /** @} */ /* pxenv_tftp_close */
605
 /** @} */ /* pxenv_tftp_close */
627
 
606
 
628
 /** @defgroup pxenv_tftp_read PXENV_TFTP_READ
607
 /** @defgroup pxenv_tftp_read PXENV_TFTP_READ
645
 
624
 
646
 typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t;
625
 typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t;
647
 
626
 
648
-extern PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read );
649
-
650
 /** @} */ /* pxenv_tftp_read */
627
 /** @} */ /* pxenv_tftp_read */
651
 
628
 
652
 /** @defgroup pxenv_tftp_read_file PXENV_TFTP_READ_FILE
629
 /** @defgroup pxenv_tftp_read_file PXENV_TFTP_READ_FILE
690
 
667
 
691
 typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t;
668
 typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t;
692
 
669
 
693
-extern PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE
694
-					   *tftp_read_file );
695
-
696
 /** @} */ /* pxenv_tftp_read_file */
670
 /** @} */ /* pxenv_tftp_read_file */
697
 
671
 
698
 /** @defgroup pxenv_tftp_get_fsize PXENV_TFTP_GET_FSIZE
672
 /** @defgroup pxenv_tftp_get_fsize PXENV_TFTP_GET_FSIZE
716
 
690
 
717
 typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t;
691
 typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t;
718
 
692
 
719
-extern PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE
720
-					   *get_fsize );
721
-
722
 /** @} */ /* pxenv_tftp_get_fsize */
693
 /** @} */ /* pxenv_tftp_get_fsize */
723
 
694
 
724
 /** @} */ /* pxe_tftp_api */
695
 /** @} */ /* pxe_tftp_api */
748
 
719
 
749
 typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t;
720
 typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t;
750
 
721
 
751
-extern PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *udp_open );
752
-
753
 /** @} */ /* pxenv_udp_open */
722
 /** @} */ /* pxenv_udp_open */
754
 
723
 
755
 /** @defgroup pxenv_udp_close PXENV_UDP_CLOSE
724
 /** @defgroup pxenv_udp_close PXENV_UDP_CLOSE
769
 
738
 
770
 typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t;
739
 typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t;
771
 
740
 
772
-extern PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *udp_close );
773
-
774
 /** @} */ /* pxenv_udp_close */
741
 /** @} */ /* pxenv_udp_close */
775
 
742
 
776
 /** @defgroup pxenv_udp_write PXENV_UDP_WRITE
743
 /** @defgroup pxenv_udp_write PXENV_UDP_WRITE
796
 
763
 
797
 typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t;
764
 typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t;
798
 
765
 
799
-extern PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *udp_write );
800
-
801
 /** @} */ /* pxenv_udp_write */
766
 /** @} */ /* pxenv_udp_write */
802
 
767
 
803
 /** @defgroup pxenv_udp_read PXENV_UDP_READ
768
 /** @defgroup pxenv_udp_read PXENV_UDP_READ
823
 
788
 
824
 typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t;
789
 typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t;
825
 
790
 
826
-extern PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *udp_read );
827
-
828
 /** @} */ /* pxenv_udp_read */
791
 /** @} */ /* pxenv_udp_read */
829
 
792
 
830
 /** @} */ /* pxe_udp_api */
793
 /** @} */ /* pxe_udp_api */
860
 
823
 
861
 typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t;
824
 typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t;
862
 
825
 
863
-extern PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP
864
-					 *undi_startup );
865
-
866
 /** @} */ /* pxenv_undi_startup */
826
 /** @} */ /* pxenv_undi_startup */
867
 
827
 
868
 /** @defgroup pxenv_undi_cleanup PXENV_UNDI_CLEANUP
828
 /** @defgroup pxenv_undi_cleanup PXENV_UNDI_CLEANUP
882
 
842
 
883
 typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t;
843
 typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t;
884
 
844
 
885
-extern PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP
886
-					 *undi_cleanup );
887
-
888
 /** @} */ /* pxenv_undi_cleanup */
845
 /** @} */ /* pxenv_undi_cleanup */
889
 
846
 
890
 /** @defgroup pxenv_undi_initialize PXENV_UNDI_INITIALIZE
847
 /** @defgroup pxenv_undi_initialize PXENV_UNDI_INITIALIZE
913
 
870
 
914
 typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t;
871
 typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t;
915
 
872
 
916
-extern PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE
917
-					    *undi_initialize );
918
-
919
 /** @} */ /* pxenv_undi_initialize */
873
 /** @} */ /* pxenv_undi_initialize */
920
 
874
 
921
 /** @defgroup pxenv_undi_reset_adapter PXENV_UNDI_RESET_ADAPTER
875
 /** @defgroup pxenv_undi_reset_adapter PXENV_UNDI_RESET_ADAPTER
950
 
904
 
951
 typedef struct s_PXENV_UNDI_RESET PXENV_UNDI_RESET_t;
905
 typedef struct s_PXENV_UNDI_RESET PXENV_UNDI_RESET_t;
952
 
906
 
953
-extern PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET
954
-					       *undi_reset_adapter );
955
-
956
 /** @} */ /* pxenv_undi_reset_adapter */
907
 /** @} */ /* pxenv_undi_reset_adapter */
957
 
908
 
958
 /** @defgroup pxenv_undi_shutdown PXENV_UNDI_SHUTDOWN
909
 /** @defgroup pxenv_undi_shutdown PXENV_UNDI_SHUTDOWN
972
 
923
 
973
 typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t;
924
 typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t;
974
 
925
 
975
-extern PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN
976
-					  *undi_shutdown );
977
-
978
 /** @} */ /* pxenv_undi_shutdown */
926
 /** @} */ /* pxenv_undi_shutdown */
979
 
927
 
980
 /** @defgroup pxenv_undi_open PXENV_UNDI_OPEN
928
 /** @defgroup pxenv_undi_open PXENV_UNDI_OPEN
1024
 
972
 
1025
 typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t;
973
 typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t;
1026
 
974
 
1027
-extern PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open );
1028
-
1029
 /** @} */ /* pxenv_undi_open */
975
 /** @} */ /* pxenv_undi_open */
1030
 
976
 
1031
 /** @defgroup pxenv_undi_close PXENV_UNDI_CLOSE
977
 /** @defgroup pxenv_undi_close PXENV_UNDI_CLOSE
1045
 
991
 
1046
 typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t;
992
 typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t;
1047
 
993
 
1048
-extern PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close );
1049
-
1050
 /** @} */ /* pxenv_undi_close */
994
 /** @} */ /* pxenv_undi_close */
1051
 
995
 
1052
 /** @defgroup pxenv_undi_transmit PXENV_UNDI_TRANSMIT
996
 /** @defgroup pxenv_undi_transmit PXENV_UNDI_TRANSMIT
1122
 
1066
 
1123
 typedef struct s_PXENV_UNDI_TRANSMIT PXENV_UNDI_TRANSMIT_t;
1067
 typedef struct s_PXENV_UNDI_TRANSMIT PXENV_UNDI_TRANSMIT_t;
1124
 
1068
 
1125
-extern PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT
1126
-					  *undi_transmit );
1127
-
1128
 /** @} */ /* pxenv_undi_transmit */
1069
 /** @} */ /* pxenv_undi_transmit */
1129
 
1070
 
1130
 /** @defgroup pxenv_undi_set_mcast_address PXENV_UNDI_SET_MCAST_ADDRESS
1071
 /** @defgroup pxenv_undi_set_mcast_address PXENV_UNDI_SET_MCAST_ADDRESS
1146
 
1087
 
1147
 typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS PXENV_UNDI_SET_MCAST_ADDRESS_t;
1088
 typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS PXENV_UNDI_SET_MCAST_ADDRESS_t;
1148
 
1089
 
1149
-extern PXENV_EXIT_t pxenv_undi_set_mcast_address (
1150
-	       struct s_PXENV_UNDI_SET_MCAST_ADDRESS *undi_set_mcast_address );
1151
-
1152
 /** @} */ /* pxenv_undi_set_mcast_address */
1090
 /** @} */ /* pxenv_undi_set_mcast_address */
1153
 
1091
 
1154
 /** @defgroup pxenv_undi_set_station_address PXENV_UNDI_SET_STATION_ADDRESS
1092
 /** @defgroup pxenv_undi_set_station_address PXENV_UNDI_SET_STATION_ADDRESS
1169
 
1107
 
1170
 typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS PXENV_UNDI_SET_STATION_ADDRESS_t;
1108
 typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS PXENV_UNDI_SET_STATION_ADDRESS_t;
1171
 
1109
 
1172
-extern PXENV_EXIT_t pxenv_undi_set_station_address (
1173
-	   struct s_PXENV_UNDI_SET_STATION_ADDRESS *undi_set_station_address );
1174
-
1175
 /** @} */ /* pxenv_undi_set_station_address */
1110
 /** @} */ /* pxenv_undi_set_station_address */
1176
 
1111
 
1177
 /** @defgroup pxenv_undi_set_packet_filter PXENV_UNDI_SET_PACKET_FILTER
1112
 /** @defgroup pxenv_undi_set_packet_filter PXENV_UNDI_SET_PACKET_FILTER
1202
 
1137
 
1203
 typedef struct s_PXENV_UNDI_SET_PACKET_FILTER PXENV_UNDI_SET_PACKET_FILTER_t;
1138
 typedef struct s_PXENV_UNDI_SET_PACKET_FILTER PXENV_UNDI_SET_PACKET_FILTER_t;
1204
 
1139
 
1205
-extern PXENV_EXIT_t pxenv_undi_set_packet_filter (
1206
-	       struct s_PXENV_UNDI_SET_PACKET_FILTER *undi_set_packet_filter );
1207
-
1208
 /** @} */ /* pxenv_undi_set_packet_filter */
1140
 /** @} */ /* pxenv_undi_set_packet_filter */
1209
 
1141
 
1210
 /** @defgroup pxenv_undi_get_information PXENV_UNDI_GET_INFORMATION
1142
 /** @defgroup pxenv_undi_get_information PXENV_UNDI_GET_INFORMATION
1248
 
1180
 
1249
 typedef struct s_PXENV_UNDI_GET_INFORMATION PXENV_UNDI_GET_INFORMATION_t;
1181
 typedef struct s_PXENV_UNDI_GET_INFORMATION PXENV_UNDI_GET_INFORMATION_t;
1250
 
1182
 
1251
-extern PXENV_EXIT_t pxenv_undi_get_information (
1252
-		   struct s_PXENV_UNDI_GET_INFORMATION *undi_get_information );
1253
-
1254
 /** @} */ /* pxenv_undi_get_information */
1183
 /** @} */ /* pxenv_undi_get_information */
1255
 
1184
 
1256
 /** @defgroup pxenv_undi_get_statistics PXENV_UNDI_GET_STATISTICS
1185
 /** @defgroup pxenv_undi_get_statistics PXENV_UNDI_GET_STATISTICS
1274
 
1203
 
1275
 typedef struct s_PXENV_UNDI_GET_STATISTICS PXENV_UNDI_GET_STATISTICS_t;
1204
 typedef struct s_PXENV_UNDI_GET_STATISTICS PXENV_UNDI_GET_STATISTICS_t;
1276
 
1205
 
1277
-extern PXENV_EXIT_t pxenv_undi_get_statistics (
1278
-		     struct s_PXENV_UNDI_GET_STATISTICS *undi_get_statistics );
1279
-
1280
 /** @} */ /* pxenv_undi_get_statistics */
1206
 /** @} */ /* pxenv_undi_get_statistics */
1281
 
1207
 
1282
 /** @defgroup pxenv_undi_clear_statistics PXENV_UNDI_CLEAR_STATISTICS
1208
 /** @defgroup pxenv_undi_clear_statistics PXENV_UNDI_CLEAR_STATISTICS
1296
 
1222
 
1297
 typedef struct s_PXENV_UNDI_CLEAR_STATISTICS PXENV_UNDI_CLEAR_STATISTICS_t;
1223
 typedef struct s_PXENV_UNDI_CLEAR_STATISTICS PXENV_UNDI_CLEAR_STATISTICS_t;
1298
 
1224
 
1299
-extern PXENV_EXIT_t pxenv_undi_clear_statistics (
1300
-		 struct s_PXENV_UNDI_CLEAR_STATISTICS *undi_clear_statistics );
1301
-
1302
 /** @} */ /* pxenv_undi_clear_statistics */
1225
 /** @} */ /* pxenv_undi_clear_statistics */
1303
 
1226
 
1304
 /** @defgroup pxenv_undi_initiate_diags PXENV_UNDI_INITIATE_DIAGS
1227
 /** @defgroup pxenv_undi_initiate_diags PXENV_UNDI_INITIATE_DIAGS
1318
 
1241
 
1319
 typedef struct s_PXENV_UNDI_INITIATE_DIAGS PXENV_UNDI_INITIATE_DIAGS_t;
1242
 typedef struct s_PXENV_UNDI_INITIATE_DIAGS PXENV_UNDI_INITIATE_DIAGS_t;
1320
 
1243
 
1321
-extern PXENV_EXIT_t pxenv_undi_initiate_diags (
1322
-		     struct s_PXENV_UNDI_INITIATE_DIAGS *undi_initiate_diags );
1323
-
1324
 /** @} */ /* pxenv_undi_initiate_diags */
1244
 /** @} */ /* pxenv_undi_initiate_diags */
1325
 
1245
 
1326
 /** @defgroup pxenv_undi_force_interrupt PXENV_UNDI_FORCE_INTERRUPT
1246
 /** @defgroup pxenv_undi_force_interrupt PXENV_UNDI_FORCE_INTERRUPT
1340
 
1260
 
1341
 typedef struct s_PXENV_UNDI_FORCE_INTERRUPT PXENV_UNDI_FORCE_INTERRUPT_t;
1261
 typedef struct s_PXENV_UNDI_FORCE_INTERRUPT PXENV_UNDI_FORCE_INTERRUPT_t;
1342
 
1262
 
1343
-extern PXENV_EXIT_t pxenv_undi_force_interrupt (
1344
-		   struct s_PXENV_UNDI_FORCE_INTERRUPT *undi_force_interrupt );
1345
-
1346
 /** @} */ /* pxenv_undi_force_interrupt */
1263
 /** @} */ /* pxenv_undi_force_interrupt */
1347
 
1264
 
1348
 /** @defgroup pxenv_undi_get_mcast_address PXENV_UNDI_GET_MCAST_ADDRESS
1265
 /** @defgroup pxenv_undi_get_mcast_address PXENV_UNDI_GET_MCAST_ADDRESS
1364
 
1281
 
1365
 typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS PXENV_UNDI_GET_MCAST_ADDRESS_t;
1282
 typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS PXENV_UNDI_GET_MCAST_ADDRESS_t;
1366
 
1283
 
1367
-extern PXENV_EXIT_t pxenv_undi_get_mcast_address (
1368
-	       struct s_PXENV_UNDI_GET_MCAST_ADDRESS *undi_get_mcast_address );
1369
-
1370
 /** @} */ /* pxenv_undi_get_mcast_address */
1284
 /** @} */ /* pxenv_undi_get_mcast_address */
1371
 
1285
 
1372
 /** @defgroup pxenv_undi_get_nic_type PXENV_UNDI_GET_NIC_TYPE
1286
 /** @defgroup pxenv_undi_get_nic_type PXENV_UNDI_GET_NIC_TYPE
1427
 
1341
 
1428
 typedef struct s_PXENV_UNDI_GET_NIC_TYPE PXENV_UNDI_GET_NIC_TYPE_t;
1342
 typedef struct s_PXENV_UNDI_GET_NIC_TYPE PXENV_UNDI_GET_NIC_TYPE_t;
1429
 
1343
 
1430
-extern PXENV_EXIT_t pxenv_undi_get_nic_type ( 
1431
-			 struct s_PXENV_UNDI_GET_NIC_TYPE *undi_get_nic_type );
1432
-
1433
 /** @} */ /* pxenv_undi_get_nic_type */
1344
 /** @} */ /* pxenv_undi_get_nic_type */
1434
 
1345
 
1435
 /** @defgroup pxenv_undi_get_iface_info PXENV_UNDI_GET_IFACE_INFO
1346
 /** @defgroup pxenv_undi_get_iface_info PXENV_UNDI_GET_IFACE_INFO
1488
 
1399
 
1489
 typedef struct s_PXENV_UNDI_GET_IFACE_INFO PXENV_UNDI_GET_IFACE_INFO_t;
1400
 typedef struct s_PXENV_UNDI_GET_IFACE_INFO PXENV_UNDI_GET_IFACE_INFO_t;
1490
 
1401
 
1491
-extern PXENV_EXIT_t pxenv_undi_get_iface_info (
1492
-		     struct s_PXENV_UNDI_GET_IFACE_INFO *undi_get_iface_info );
1493
-
1494
 /** @} */ /* pxenv_undi_get_iface_info */
1402
 /** @} */ /* pxenv_undi_get_iface_info */
1495
 
1403
 
1496
 /** @defgroup pxenv_undi_get_state PXENV_UNDI_GET_STATE
1404
 /** @defgroup pxenv_undi_get_state PXENV_UNDI_GET_STATE
1524
 
1432
 
1525
 typedef struct s_PXENV_UNDI_GET_STATE PXENV_UNDI_GET_STATE_t;
1433
 typedef struct s_PXENV_UNDI_GET_STATE PXENV_UNDI_GET_STATE_t;
1526
 
1434
 
1527
-extern PXENV_EXIT_t pxenv_undi_get_state ( struct s_PXENV_UNDI_GET_STATE
1528
-					   *undi_get_state );
1529
-
1530
 /** @} */ /* pxenv_undi_get_state */
1435
 /** @} */ /* pxenv_undi_get_state */
1531
 
1436
 
1532
 /** @defgroup pxenv_undi_isr PXENV_UNDI_ISR
1437
 /** @defgroup pxenv_undi_isr PXENV_UNDI_ISR
1595
 
1500
 
1596
 typedef struct s_PXENV_UNDI_ISR PXENV_UNDI_ISR_t;
1501
 typedef struct s_PXENV_UNDI_ISR PXENV_UNDI_ISR_t;
1597
 
1502
 
1598
-extern PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr );
1599
-
1600
 /** @} */ /* pxenv_undi_isr */
1503
 /** @} */ /* pxenv_undi_isr */
1601
 
1504
 
1602
 /** @} */ /* pxe_undi_api */
1505
 /** @} */ /* pxe_undi_api */
1628
 
1531
 
1629
 typedef struct s_PXENV_FILE_OPEN PXENV_FILE_OPEN_t;
1532
 typedef struct s_PXENV_FILE_OPEN PXENV_FILE_OPEN_t;
1630
 
1533
 
1631
-extern PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open );
1632
-
1633
 /** @} */ /* pxenv_file_open */
1534
 /** @} */ /* pxenv_file_open */
1634
 
1535
 
1635
 /** @defgroup pxenv_file_close PXENV_FILE_CLOSE
1536
 /** @defgroup pxenv_file_close PXENV_FILE_CLOSE
1650
 
1551
 
1651
 typedef struct s_PXENV_FILE_CLOSE PXENV_FILE_CLOSE_t;
1552
 typedef struct s_PXENV_FILE_CLOSE PXENV_FILE_CLOSE_t;
1652
 
1553
 
1653
-extern PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE
1654
-				       *file_close );
1655
-
1656
 /** @} */ /* pxenv_file_close */
1554
 /** @} */ /* pxenv_file_close */
1657
 
1555
 
1658
 /** @defgroup pxenv_file_select PXENV_FILE_SELECT
1556
 /** @defgroup pxenv_file_select PXENV_FILE_SELECT
1677
 
1575
 
1678
 typedef struct s_PXENV_FILE_SELECT PXENV_FILE_SELECT_t;
1576
 typedef struct s_PXENV_FILE_SELECT PXENV_FILE_SELECT_t;
1679
 
1577
 
1680
-extern PXENV_EXIT_t pxenv_file_select ( struct s_PXENV_FILE_SELECT
1681
-					*file_select );
1682
-
1683
 /** @} */ /* pxenv_file_select */
1578
 /** @} */ /* pxenv_file_select */
1684
 
1579
 
1685
 /** @defgroup pxenv_file_read PXENV_FILE_READ
1580
 /** @defgroup pxenv_file_read PXENV_FILE_READ
1702
 
1597
 
1703
 typedef struct s_PXENV_FILE_READ PXENV_FILE_READ_t;
1598
 typedef struct s_PXENV_FILE_READ PXENV_FILE_READ_t;
1704
 
1599
 
1705
-extern PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read );
1706
-
1707
 /** @} */ /* pxenv_file_read */
1600
 /** @} */ /* pxenv_file_read */
1708
 
1601
 
1709
 /** @defgroup pxenv_get_file_size PXENV_GET_FILE_SIZE
1602
 /** @defgroup pxenv_get_file_size PXENV_GET_FILE_SIZE
1725
 
1618
 
1726
 typedef struct s_PXENV_GET_FILE_SIZE PXENV_GET_FILE_SIZE_t;
1619
 typedef struct s_PXENV_GET_FILE_SIZE PXENV_GET_FILE_SIZE_t;
1727
 
1620
 
1728
-extern PXENV_EXIT_t pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE
1729
-					  *get_file_size );
1730
-
1731
 /** @} */ /* pxenv_get_file_size */
1621
 /** @} */ /* pxenv_get_file_size */
1732
 
1622
 
1733
 /** @defgroup pxenv_file_exec PXENV_FILE_EXEC
1623
 /** @defgroup pxenv_file_exec PXENV_FILE_EXEC
1748
 
1638
 
1749
 typedef struct s_PXENV_FILE_EXEC PXENV_FILE_EXEC_t;
1639
 typedef struct s_PXENV_FILE_EXEC PXENV_FILE_EXEC_t;
1750
 
1640
 
1751
-extern PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec );
1752
-
1753
 /** @} */ /* pxenv_file_exec */
1641
 /** @} */ /* pxenv_file_exec */
1754
 
1642
 
1755
 /** @defgroup pxenv_file_api_check PXENV_FILE_API_CHECK
1643
 /** @defgroup pxenv_file_api_check PXENV_FILE_API_CHECK
1774
 
1662
 
1775
 typedef struct s_PXENV_FILE_API_CHECK PXENV_FILE_API_CHECK_t;
1663
 typedef struct s_PXENV_FILE_API_CHECK PXENV_FILE_API_CHECK_t;
1776
 
1664
 
1777
-extern PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check );
1778
-
1779
 /** @} */ /* pxenv_file_api_check */
1665
 /** @} */ /* pxenv_file_api_check */
1780
 
1666
 
1781
 /** @defgroup pxenv_file_exit_hook PXENV_FILE_EXIT_HOOK
1667
 /** @defgroup pxenv_file_exit_hook PXENV_FILE_EXIT_HOOK
1796
 
1682
 
1797
 typedef struct s_PXENV_FILE_EXIT_HOOK PXENV_FILE_EXIT_HOOK_t;
1683
 typedef struct s_PXENV_FILE_EXIT_HOOK PXENV_FILE_EXIT_HOOK_t;
1798
 
1684
 
1799
-extern PXENV_EXIT_t pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK *file_exit_hook );
1800
-
1801
 /** @} */ /* pxenv_file_exit_hook */
1685
 /** @} */ /* pxenv_file_exit_hook */
1802
 
1686
 
1803
 /** @} */ /* pxe_file_api */
1687
 /** @} */ /* pxe_file_api */
1847
 
1731
 
1848
 typedef struct s_UNDI_LOADER UNDI_LOADER_t;
1732
 typedef struct s_UNDI_LOADER UNDI_LOADER_t;
1849
 
1733
 
1850
-extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader );
1851
-
1852
 /** @} */ /* pxe_loader_api */
1734
 /** @} */ /* pxe_loader_api */
1853
 
1735
 
1854
 /** @} */ /* pxe */
1736
 /** @} */ /* pxe */

+ 41
- 273
src/arch/i386/interface/pxe/pxe_call.c View File

41
 /** INT 1A hooked flag */
41
 /** INT 1A hooked flag */
42
 static int int_1a_hooked = 0;
42
 static int int_1a_hooked = 0;
43
 
43
 
44
-/** A function pointer to hold any PXE API call
45
- *
46
- * Used by pxe_api_call() to avoid large swathes of duplicated code.
47
- */
48
-union pxenv_call {
49
-	PXENV_EXIT_t ( * any ) ( union u_PXENV_ANY * );
50
-	PXENV_EXIT_t ( * unknown ) ( struct s_PXENV_UNKNOWN * );
51
-	PXENV_EXIT_t ( * unload_stack ) ( struct s_PXENV_UNLOAD_STACK * );
52
-	PXENV_EXIT_t ( * get_cached_info )
53
-			( struct s_PXENV_GET_CACHED_INFO * );
54
-	PXENV_EXIT_t ( * restart_tftp ) ( struct s_PXENV_TFTP_READ_FILE * );
55
-	PXENV_EXIT_t ( * start_undi ) ( struct s_PXENV_START_UNDI * );
56
-	PXENV_EXIT_t ( * stop_undi ) ( struct s_PXENV_STOP_UNDI * );
57
-	PXENV_EXIT_t ( * start_base ) ( struct s_PXENV_START_BASE * );
58
-	PXENV_EXIT_t ( * stop_base ) ( struct s_PXENV_STOP_BASE * );
59
-	PXENV_EXIT_t ( * tftp_open ) ( struct s_PXENV_TFTP_OPEN * );
60
-	PXENV_EXIT_t ( * tftp_close ) ( struct s_PXENV_TFTP_CLOSE * );
61
-	PXENV_EXIT_t ( * tftp_read ) ( struct s_PXENV_TFTP_READ * );
62
-	PXENV_EXIT_t ( * tftp_read_file ) ( struct s_PXENV_TFTP_READ_FILE * );
63
-	PXENV_EXIT_t ( * tftp_get_fsize ) ( struct s_PXENV_TFTP_GET_FSIZE * );
64
-	PXENV_EXIT_t ( * udp_open ) ( struct s_PXENV_UDP_OPEN * );
65
-	PXENV_EXIT_t ( * udp_close ) ( struct s_PXENV_UDP_CLOSE * );
66
-	PXENV_EXIT_t ( * udp_write ) ( struct s_PXENV_UDP_WRITE * );
67
-	PXENV_EXIT_t ( * udp_read ) ( struct s_PXENV_UDP_READ * );
68
-	PXENV_EXIT_t ( * undi_startup ) ( struct s_PXENV_UNDI_STARTUP * );
69
-	PXENV_EXIT_t ( * undi_cleanup ) ( struct s_PXENV_UNDI_CLEANUP * );
70
-	PXENV_EXIT_t ( * undi_initialize )
71
-			( struct s_PXENV_UNDI_INITIALIZE * );
72
-	PXENV_EXIT_t ( * undi_reset_adapter ) ( struct s_PXENV_UNDI_RESET * );
73
-	PXENV_EXIT_t ( * undi_shutdown ) ( struct s_PXENV_UNDI_SHUTDOWN * );
74
-	PXENV_EXIT_t ( * undi_open ) ( struct s_PXENV_UNDI_OPEN * );
75
-	PXENV_EXIT_t ( * undi_close ) ( struct s_PXENV_UNDI_CLOSE * );
76
-	PXENV_EXIT_t ( * undi_transmit ) ( struct s_PXENV_UNDI_TRANSMIT * );
77
-	PXENV_EXIT_t ( * undi_set_mcast_address )
78
-			( struct s_PXENV_UNDI_SET_MCAST_ADDRESS * );
79
-	PXENV_EXIT_t ( * undi_set_station_address )
80
-			( struct s_PXENV_UNDI_SET_STATION_ADDRESS * );
81
-	PXENV_EXIT_t ( * undi_set_packet_filter )
82
-			( struct s_PXENV_UNDI_SET_PACKET_FILTER * );
83
-	PXENV_EXIT_t ( * undi_get_information )
84
-			( struct s_PXENV_UNDI_GET_INFORMATION * );
85
-	PXENV_EXIT_t ( * undi_get_statistics )
86
-			( struct s_PXENV_UNDI_GET_STATISTICS * );
87
-	PXENV_EXIT_t ( * undi_clear_statistics )
88
-			( struct s_PXENV_UNDI_CLEAR_STATISTICS * );
89
-	PXENV_EXIT_t ( * undi_initiate_diags )
90
-			( struct s_PXENV_UNDI_INITIATE_DIAGS * );
91
-	PXENV_EXIT_t ( * undi_force_interrupt )
92
-			( struct s_PXENV_UNDI_FORCE_INTERRUPT * );
93
-	PXENV_EXIT_t ( * undi_get_mcast_address )
94
-			( struct s_PXENV_UNDI_GET_MCAST_ADDRESS * );
95
-	PXENV_EXIT_t ( * undi_get_nic_type )
96
-			( struct s_PXENV_UNDI_GET_NIC_TYPE * );
97
-	PXENV_EXIT_t ( * undi_get_iface_info )
98
-			( struct s_PXENV_UNDI_GET_IFACE_INFO * );
99
-	PXENV_EXIT_t ( * undi_get_state ) ( struct s_PXENV_UNDI_GET_STATE * );
100
-	PXENV_EXIT_t ( * undi_isr ) ( struct s_PXENV_UNDI_ISR * );
101
-	PXENV_EXIT_t ( * file_open ) ( struct s_PXENV_FILE_OPEN * );
102
-	PXENV_EXIT_t ( * file_close ) ( struct s_PXENV_FILE_CLOSE * );
103
-	PXENV_EXIT_t ( * file_select ) ( struct s_PXENV_FILE_SELECT * );
104
-	PXENV_EXIT_t ( * file_read ) ( struct s_PXENV_FILE_READ * );
105
-	PXENV_EXIT_t ( * get_file_size ) ( struct s_PXENV_GET_FILE_SIZE * );
106
-	PXENV_EXIT_t ( * file_exec ) ( struct s_PXENV_FILE_EXEC * );
107
-	PXENV_EXIT_t ( * file_api_check ) ( struct s_PXENV_FILE_API_CHECK * );
108
-	PXENV_EXIT_t ( * file_exit_hook ) ( struct s_PXENV_FILE_EXIT_HOOK * );
109
-};
110
-
111
 /**
44
 /**
112
  * Handle an unknown PXE API call
45
  * Handle an unknown PXE API call
113
  *
46
  *
120
 	return PXENV_EXIT_FAILURE;
53
 	return PXENV_EXIT_FAILURE;
121
 }
54
 }
122
 
55
 
56
+/** Unknown PXE API call list */
57
+struct pxe_api_call pxenv_unknown_api __pxe_api_call =
58
+	PXE_API_CALL ( PXENV_UNKNOWN, pxenv_unknown, struct s_PXENV_UNKNOWN );
59
+
60
+/**
61
+ * Locate PXE API call
62
+ *
63
+ * @v opcode		Opcode
64
+ * @ret call		PXE API call, or NULL
65
+ */
66
+static struct pxe_api_call * find_pxe_api_call ( uint16_t opcode ) {
67
+	struct pxe_api_call *call;
68
+
69
+	for_each_table_entry ( call, PXE_API_CALLS ) {
70
+		if ( call->opcode == opcode )
71
+			return call;
72
+	}
73
+	return NULL;
74
+}
75
+
123
 /**
76
 /**
124
  * Dispatch PXE API call
77
  * Dispatch PXE API call
125
  *
78
  *
128
  * @ret ax		PXE exit code
81
  * @ret ax		PXE exit code
129
  */
82
  */
130
 __asmcall void pxe_api_call ( struct i386_all_regs *ix86 ) {
83
 __asmcall void pxe_api_call ( struct i386_all_regs *ix86 ) {
131
-	int opcode = ix86->regs.bx;
132
-	userptr_t parameters = real_to_user ( ix86->segs.es, ix86->regs.di );
133
-	size_t param_len;
134
-	union u_PXENV_ANY pxenv_any;
135
-	union pxenv_call pxenv_call;
84
+	uint16_t opcode = ix86->regs.bx;
85
+	userptr_t uparams = real_to_user ( ix86->segs.es, ix86->regs.di );
86
+	struct pxe_api_call *call;
87
+	union u_PXENV_ANY params;
136
 	PXENV_EXIT_t ret;
88
 	PXENV_EXIT_t ret;
137
 
89
 
138
-	switch ( opcode ) {
139
-	case PXENV_UNLOAD_STACK:
140
-		pxenv_call.unload_stack = pxenv_unload_stack;
141
-		param_len = sizeof ( pxenv_any.unload_stack );
142
-		break;
143
-	case PXENV_GET_CACHED_INFO:
144
-		pxenv_call.get_cached_info = pxenv_get_cached_info;
145
-		param_len = sizeof ( pxenv_any.get_cached_info );
146
-		break;
147
-	case PXENV_RESTART_TFTP:
148
-		pxenv_call.restart_tftp = pxenv_restart_tftp;
149
-		param_len = sizeof ( pxenv_any.restart_tftp );
150
-		break;
151
-	case PXENV_START_UNDI:
152
-		pxenv_call.start_undi = pxenv_start_undi;
153
-		param_len = sizeof ( pxenv_any.start_undi );
154
-		break;
155
-	case PXENV_STOP_UNDI:
156
-		pxenv_call.stop_undi = pxenv_stop_undi;
157
-		param_len = sizeof ( pxenv_any.stop_undi );
158
-		break;
159
-	case PXENV_START_BASE:
160
-		pxenv_call.start_base = pxenv_start_base;
161
-		param_len = sizeof ( pxenv_any.start_base );
162
-		break;
163
-	case PXENV_STOP_BASE:
164
-		pxenv_call.stop_base = pxenv_stop_base;
165
-		param_len = sizeof ( pxenv_any.stop_base );
166
-		break;
167
-	case PXENV_TFTP_OPEN:
168
-		pxenv_call.tftp_open = pxenv_tftp_open;
169
-		param_len = sizeof ( pxenv_any.tftp_open );
170
-		break;
171
-	case PXENV_TFTP_CLOSE:
172
-		pxenv_call.tftp_close = pxenv_tftp_close;
173
-		param_len = sizeof ( pxenv_any.tftp_close );
174
-		break;
175
-	case PXENV_TFTP_READ:
176
-		pxenv_call.tftp_read = pxenv_tftp_read;
177
-		param_len = sizeof ( pxenv_any.tftp_read );
178
-		break;
179
-	case PXENV_TFTP_READ_FILE:
180
-		pxenv_call.tftp_read_file = pxenv_tftp_read_file;
181
-		param_len = sizeof ( pxenv_any.tftp_read_file );
182
-		break;
183
-	case PXENV_TFTP_GET_FSIZE:
184
-		pxenv_call.tftp_get_fsize = pxenv_tftp_get_fsize;
185
-		param_len = sizeof ( pxenv_any.tftp_get_fsize );
186
-		break;
187
-	case PXENV_UDP_OPEN:
188
-		pxenv_call.udp_open = pxenv_udp_open;
189
-		param_len = sizeof ( pxenv_any.udp_open );
190
-		break;
191
-	case PXENV_UDP_CLOSE:
192
-		pxenv_call.udp_close = pxenv_udp_close;
193
-		param_len = sizeof ( pxenv_any.udp_close );
194
-		break;
195
-	case PXENV_UDP_WRITE:
196
-		pxenv_call.udp_write = pxenv_udp_write;
197
-		param_len = sizeof ( pxenv_any.udp_write );
198
-		break;
199
-	case PXENV_UDP_READ:
200
-		pxenv_call.udp_read = pxenv_udp_read;
201
-		param_len = sizeof ( pxenv_any.udp_read );
202
-		break;
203
-	case PXENV_UNDI_STARTUP:
204
-		pxenv_call.undi_startup = pxenv_undi_startup;
205
-		param_len = sizeof ( pxenv_any.undi_startup );
206
-		break;
207
-	case PXENV_UNDI_CLEANUP:
208
-		pxenv_call.undi_cleanup = pxenv_undi_cleanup;
209
-		param_len = sizeof ( pxenv_any.undi_cleanup );
210
-		break;
211
-	case PXENV_UNDI_INITIALIZE:
212
-		pxenv_call.undi_initialize = pxenv_undi_initialize;
213
-		param_len = sizeof ( pxenv_any.undi_initialize );
214
-		break;
215
-	case PXENV_UNDI_RESET_ADAPTER:
216
-		pxenv_call.undi_reset_adapter = pxenv_undi_reset_adapter;
217
-		param_len = sizeof ( pxenv_any.undi_reset_adapter );
218
-		break;
219
-	case PXENV_UNDI_SHUTDOWN:
220
-		pxenv_call.undi_shutdown = pxenv_undi_shutdown;
221
-		param_len = sizeof ( pxenv_any.undi_shutdown );
222
-		break;
223
-	case PXENV_UNDI_OPEN:
224
-		pxenv_call.undi_open = pxenv_undi_open;
225
-		param_len = sizeof ( pxenv_any.undi_open );
226
-		break;
227
-	case PXENV_UNDI_CLOSE:
228
-		pxenv_call.undi_close = pxenv_undi_close;
229
-		param_len = sizeof ( pxenv_any.undi_close );
230
-		break;
231
-	case PXENV_UNDI_TRANSMIT:
232
-		pxenv_call.undi_transmit = pxenv_undi_transmit;
233
-		param_len = sizeof ( pxenv_any.undi_transmit );
234
-		break;
235
-	case PXENV_UNDI_SET_MCAST_ADDRESS:
236
-		pxenv_call.undi_set_mcast_address =
237
-			pxenv_undi_set_mcast_address;
238
-		param_len = sizeof ( pxenv_any.undi_set_mcast_address );
239
-		break;
240
-	case PXENV_UNDI_SET_STATION_ADDRESS:
241
-		pxenv_call.undi_set_station_address =
242
-			pxenv_undi_set_station_address;
243
-		param_len = sizeof ( pxenv_any.undi_set_station_address );
244
-		break;
245
-	case PXENV_UNDI_SET_PACKET_FILTER:
246
-		pxenv_call.undi_set_packet_filter =
247
-			pxenv_undi_set_packet_filter;
248
-		param_len = sizeof ( pxenv_any.undi_set_packet_filter );
249
-		break;
250
-	case PXENV_UNDI_GET_INFORMATION:
251
-		pxenv_call.undi_get_information = pxenv_undi_get_information;
252
-		param_len = sizeof ( pxenv_any.undi_get_information );
253
-		break;
254
-	case PXENV_UNDI_GET_STATISTICS:
255
-		pxenv_call.undi_get_statistics = pxenv_undi_get_statistics;
256
-		param_len = sizeof ( pxenv_any.undi_get_statistics );
257
-		break;
258
-	case PXENV_UNDI_CLEAR_STATISTICS:
259
-		pxenv_call.undi_clear_statistics = pxenv_undi_clear_statistics;
260
-		param_len = sizeof ( pxenv_any.undi_clear_statistics );
261
-		break;
262
-	case PXENV_UNDI_INITIATE_DIAGS:
263
-		pxenv_call.undi_initiate_diags = pxenv_undi_initiate_diags;
264
-		param_len = sizeof ( pxenv_any.undi_initiate_diags );
265
-		break;
266
-	case PXENV_UNDI_FORCE_INTERRUPT:
267
-		pxenv_call.undi_force_interrupt = pxenv_undi_force_interrupt;
268
-		param_len = sizeof ( pxenv_any.undi_force_interrupt );
269
-		break;
270
-	case PXENV_UNDI_GET_MCAST_ADDRESS:
271
-		pxenv_call.undi_get_mcast_address =
272
-			pxenv_undi_get_mcast_address;
273
-		param_len = sizeof ( pxenv_any.undi_get_mcast_address );
274
-		break;
275
-	case PXENV_UNDI_GET_NIC_TYPE:
276
-		pxenv_call.undi_get_nic_type = pxenv_undi_get_nic_type;
277
-		param_len = sizeof ( pxenv_any.undi_get_nic_type );
278
-		break;
279
-	case PXENV_UNDI_GET_IFACE_INFO:
280
-		pxenv_call.undi_get_iface_info = pxenv_undi_get_iface_info;
281
-		param_len = sizeof ( pxenv_any.undi_get_iface_info );
282
-		break;
283
-	case PXENV_UNDI_ISR:
284
-		pxenv_call.undi_isr = pxenv_undi_isr;
285
-		param_len = sizeof ( pxenv_any.undi_isr );
286
-		break;
287
-	case PXENV_FILE_OPEN:
288
-		pxenv_call.file_open = pxenv_file_open;
289
-		param_len = sizeof ( pxenv_any.file_open );
290
-		break;
291
-	case PXENV_FILE_CLOSE:
292
-		pxenv_call.file_close = pxenv_file_close;
293
-		param_len = sizeof ( pxenv_any.file_close );
294
-		break;
295
-	case PXENV_FILE_SELECT:
296
-		pxenv_call.file_select = pxenv_file_select;
297
-		param_len = sizeof ( pxenv_any.file_select );
298
-		break;
299
-	case PXENV_FILE_READ:
300
-		pxenv_call.file_read = pxenv_file_read;
301
-		param_len = sizeof ( pxenv_any.file_read );
302
-		break;
303
-	case PXENV_GET_FILE_SIZE:
304
-		pxenv_call.get_file_size = pxenv_get_file_size;
305
-		param_len = sizeof ( pxenv_any.get_file_size );
306
-		break;
307
-	case PXENV_FILE_EXEC:
308
-		pxenv_call.file_exec = pxenv_file_exec;
309
-		param_len = sizeof ( pxenv_any.file_exec );
310
-		break;
311
-	case PXENV_FILE_API_CHECK:
312
-		pxenv_call.file_api_check = pxenv_file_api_check;
313
-		param_len = sizeof ( pxenv_any.file_api_check );
314
-		break;
315
-	case PXENV_FILE_EXIT_HOOK:
316
-		pxenv_call.file_exit_hook = pxenv_file_exit_hook;
317
-		param_len = sizeof ( pxenv_any.file_exit_hook );
318
-		break;
319
-	default:
320
-		DBG ( "PXENV_UNKNOWN_%hx", opcode );
321
-		pxenv_call.unknown = pxenv_unknown;
322
-		param_len = sizeof ( pxenv_any.unknown );
323
-		break;
90
+	/* Locate API call */
91
+	call = find_pxe_api_call ( opcode );
92
+	if ( ! call ) {
93
+		DBGC ( &pxe_netdev, "PXENV_UNKNOWN_%04x\n", opcode );
94
+		call = &pxenv_unknown_api;
324
 	}
95
 	}
325
 
96
 
326
 	/* Copy parameter block from caller */
97
 	/* Copy parameter block from caller */
327
-	copy_from_user ( &pxenv_any, parameters, 0, param_len );
98
+	copy_from_user ( &params, uparams, 0, call->params_len );
328
 
99
 
329
 	/* Set default status in case child routine fails to do so */
100
 	/* Set default status in case child routine fails to do so */
330
-	pxenv_any.Status = PXENV_STATUS_FAILURE;
101
+	params.Status = PXENV_STATUS_FAILURE;
331
 
102
 
332
 	/* Hand off to relevant API routine */
103
 	/* Hand off to relevant API routine */
333
-	DBG ( "[" );
334
-	ret = pxenv_call.any ( &pxenv_any );
335
-	if ( pxenv_any.Status != PXENV_STATUS_SUCCESS ) {
336
-		DBG ( " %02x", pxenv_any.Status );
337
-	}
338
-	if ( ret != PXENV_EXIT_SUCCESS ) {
339
-		DBG ( ret == PXENV_EXIT_FAILURE ? " err" : " ??" );
340
-	}
341
-	DBG ( "]" );
342
-	
104
+	ret = call->entry ( &params );
105
+
343
 	/* Copy modified parameter block back to caller and return */
106
 	/* Copy modified parameter block back to caller and return */
344
-	copy_to_user ( parameters, 0, &pxenv_any, param_len );
107
+	copy_to_user ( uparams, 0, &params, call->params_len );
345
 	ix86->regs.ax = ret;
108
 	ix86->regs.ax = ret;
346
 }
109
 }
347
 
110
 
351
  * @v ix86		Registers for PXE call
114
  * @v ix86		Registers for PXE call
352
  * @ret present		Zero (PXE stack present)
115
  * @ret present		Zero (PXE stack present)
353
  */
116
  */
354
-int pxe_api_call_weak ( struct i386_all_regs *ix86 )
355
-{
117
+int pxe_api_call_weak ( struct i386_all_regs *ix86 ) {
356
 	pxe_api_call ( ix86 );
118
 	pxe_api_call ( ix86 );
357
 	return 0;
119
 	return 0;
358
 }
120
 }
519
 
281
 
520
 	return rc;
282
 	return rc;
521
 }
283
 }
284
+
285
+REQUIRE_OBJECT ( pxe_preboot );
286
+REQUIRE_OBJECT ( pxe_undi );
287
+REQUIRE_OBJECT ( pxe_udp );
288
+REQUIRE_OBJECT ( pxe_tftp );
289
+REQUIRE_OBJECT ( pxe_file );

+ 31
- 10
src/arch/i386/interface/pxe/pxe_file.c View File

49
  * @ret s_PXENV_FILE_OPEN::FileHandle	Handle of opened file
49
  * @ret s_PXENV_FILE_OPEN::FileHandle	Handle of opened file
50
  *
50
  *
51
  */
51
  */
52
-PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open ) {
52
+static PXENV_EXIT_t pxenv_file_open ( struct s_PXENV_FILE_OPEN *file_open ) {
53
 	userptr_t filename;
53
 	userptr_t filename;
54
 	size_t filename_len;
54
 	size_t filename_len;
55
 	int fd;
55
 	int fd;
91
  * @ret s_PXENV_FILE_CLOSE::Status	PXE status code
91
  * @ret s_PXENV_FILE_CLOSE::Status	PXE status code
92
  *
92
  *
93
  */
93
  */
94
-PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE *file_close ) {
94
+static PXENV_EXIT_t pxenv_file_close ( struct s_PXENV_FILE_CLOSE *file_close ) {
95
 
95
 
96
 	DBG ( "PXENV_FILE_CLOSE %d", file_close->FileHandle );
96
 	DBG ( "PXENV_FILE_CLOSE %d", file_close->FileHandle );
97
 
97
 
111
  * @ret s_PXENV_FILE_SELECT::Ready	Indication of readiness
111
  * @ret s_PXENV_FILE_SELECT::Ready	Indication of readiness
112
  *
112
  *
113
  */
113
  */
114
-PXENV_EXIT_t pxenv_file_select ( struct s_PXENV_FILE_SELECT *file_select ) {
114
+static PXENV_EXIT_t
115
+pxenv_file_select ( struct s_PXENV_FILE_SELECT *file_select ) {
115
 	fd_set fdset;
116
 	fd_set fdset;
116
 	int ready;
117
 	int ready;
117
 
118
 
143
  * @ret s_PXENV_FILE_READ::BufferSize	Length of data read
144
  * @ret s_PXENV_FILE_READ::BufferSize	Length of data read
144
  *
145
  *
145
  */
146
  */
146
-PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read ) {
147
+static PXENV_EXIT_t pxenv_file_read ( struct s_PXENV_FILE_READ *file_read ) {
147
 	userptr_t buffer;
148
 	userptr_t buffer;
148
 	ssize_t len;
149
 	ssize_t len;
149
 
150
 
176
  * @ret s_PXENV_GET_FILE_SIZE::Status	PXE status code
177
  * @ret s_PXENV_GET_FILE_SIZE::Status	PXE status code
177
  * @ret s_PXENV_GET_FILE_SIZE::FileSize	Size of file
178
  * @ret s_PXENV_GET_FILE_SIZE::FileSize	Size of file
178
  */
179
  */
179
-PXENV_EXIT_t pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE
180
-				   *get_file_size ) {
180
+static PXENV_EXIT_t
181
+pxenv_get_file_size ( struct s_PXENV_GET_FILE_SIZE *get_file_size ) {
181
 	ssize_t filesize;
182
 	ssize_t filesize;
182
 
183
 
183
 	DBG ( "PXENV_GET_FILE_SIZE %d", get_file_size->FileHandle );
184
 	DBG ( "PXENV_GET_FILE_SIZE %d", get_file_size->FileHandle );
205
  * @ret s_PXENV_FILE_EXEC::Status	PXE status code
206
  * @ret s_PXENV_FILE_EXEC::Status	PXE status code
206
  *
207
  *
207
  */
208
  */
208
-PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec ) {
209
+static PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec ) {
209
 	userptr_t command;
210
 	userptr_t command;
210
 	size_t command_len;
211
 	size_t command_len;
211
 	int rc;
212
 	int rc;
250
  * @ret s_PXENV_FILE_API_CHECK::Flags	Reserved
251
  * @ret s_PXENV_FILE_API_CHECK::Flags	Reserved
251
  *
252
  *
252
  */
253
  */
253
-PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check ) {
254
+static PXENV_EXIT_t
255
+pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check ) {
254
 	DBG ( "PXENV_FILE_API_CHECK" );
256
 	DBG ( "PXENV_FILE_API_CHECK" );
255
 
257
 
256
 	if ( file_api_check->Magic != 0x91d447b2 ) {
258
 	if ( file_api_check->Magic != 0x91d447b2 ) {
286
  * @ret s_PXENV_FILE_EXIT_HOOK::Status	PXE status code
288
  * @ret s_PXENV_FILE_EXIT_HOOK::Status	PXE status code
287
  *
289
  *
288
  */
290
  */
289
-PXENV_EXIT_t pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK
290
-					*file_exit_hook ) {
291
+static PXENV_EXIT_t
292
+pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK *file_exit_hook ) {
291
 	DBG ( "PXENV_FILE_EXIT_HOOK" );
293
 	DBG ( "PXENV_FILE_EXIT_HOOK" );
292
 
294
 
293
 	/* Check to see if we have a PXE exit hook */
295
 	/* Check to see if we have a PXE exit hook */
304
 	return PXENV_EXIT_FAILURE;
306
 	return PXENV_EXIT_FAILURE;
305
 }
307
 }
306
 
308
 
309
+/** PXE file API */
310
+struct pxe_api_call pxe_file_api[] __pxe_api_call = {
311
+	PXE_API_CALL ( PXENV_FILE_OPEN, pxenv_file_open,
312
+		       struct s_PXENV_FILE_OPEN ),
313
+	PXE_API_CALL ( PXENV_FILE_CLOSE, pxenv_file_close,
314
+		       struct s_PXENV_FILE_CLOSE ),
315
+	PXE_API_CALL ( PXENV_FILE_SELECT, pxenv_file_select,
316
+		       struct s_PXENV_FILE_SELECT ),
317
+	PXE_API_CALL ( PXENV_FILE_READ, pxenv_file_read,
318
+		       struct s_PXENV_FILE_READ ),
319
+	PXE_API_CALL ( PXENV_GET_FILE_SIZE, pxenv_get_file_size,
320
+		       struct s_PXENV_GET_FILE_SIZE ),
321
+	PXE_API_CALL ( PXENV_FILE_EXEC, pxenv_file_exec,
322
+		       struct s_PXENV_FILE_EXEC ),
323
+	PXE_API_CALL ( PXENV_FILE_API_CHECK, pxenv_file_api_check,
324
+		       struct s_PXENV_FILE_API_CHECK ),
325
+	PXE_API_CALL ( PXENV_FILE_EXIT_HOOK, pxenv_file_exit_hook,
326
+		       struct s_PXENV_FILE_EXIT_HOOK ),
327
+};

+ 28
- 9
src/arch/i386/interface/pxe/pxe_preboot.c View File

130
  * @ret ...
130
  * @ret ...
131
  *
131
  *
132
  */
132
  */
133
-PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK *unload_stack ) {
133
+static PXENV_EXIT_t
134
+pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK *unload_stack ) {
134
 	DBGC ( &pxe_netdev, "PXENV_UNLOAD_STACK\n" );
135
 	DBGC ( &pxe_netdev, "PXENV_UNLOAD_STACK\n" );
135
 
136
 
136
 	unload_stack->Status = PXENV_STATUS_SUCCESS;
137
 	unload_stack->Status = PXENV_STATUS_SUCCESS;
141
  *
142
  *
142
  * Status: working
143
  * Status: working
143
  */
144
  */
144
-PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO
145
-				     *get_cached_info ) {
145
+static PXENV_EXIT_t
146
+pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO *get_cached_info ) {
146
 	struct pxe_dhcp_packet_creator *creator;
147
 	struct pxe_dhcp_packet_creator *creator;
147
 	union pxe_cached_info *info;
148
 	union pxe_cached_info *info;
148
 	unsigned int idx;
149
 	unsigned int idx;
244
  *
245
  *
245
  * Status: working
246
  * Status: working
246
  */
247
  */
247
-PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE
248
-				  *restart_tftp ) {
248
+static PXENV_EXIT_t
249
+pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE *restart_tftp ) {
249
 	PXENV_EXIT_t tftp_exit;
250
 	PXENV_EXIT_t tftp_exit;
250
 
251
 
251
 	DBGC ( &pxe_netdev, "PXENV_RESTART_TFTP\n" );
252
 	DBGC ( &pxe_netdev, "PXENV_RESTART_TFTP\n" );
267
  *
268
  *
268
  * Status: working
269
  * Status: working
269
  */
270
  */
270
-PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi ) {
271
+static PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi ) {
271
 	unsigned int bus_type;
272
 	unsigned int bus_type;
272
 	unsigned int location;
273
 	unsigned int location;
273
 	struct net_device *netdev;
274
 	struct net_device *netdev;
316
  *
317
  *
317
  * Status: working
318
  * Status: working
318
  */
319
  */
319
-PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ) {
320
+static PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ) {
320
 	DBGC ( &pxe_netdev, "PXENV_STOP_UNDI\n" );
321
 	DBGC ( &pxe_netdev, "PXENV_STOP_UNDI\n" );
321
 
322
 
322
 	/* Deactivate PXE */
323
 	/* Deactivate PXE */
341
  *
342
  *
342
  * Status: won't implement (requires major structural changes)
343
  * Status: won't implement (requires major structural changes)
343
  */
344
  */
344
-PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base ) {
345
+static PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base ) {
345
 	DBGC ( &pxe_netdev, "PXENV_START_BASE\n" );
346
 	DBGC ( &pxe_netdev, "PXENV_START_BASE\n" );
346
 
347
 
347
 	start_base->Status = PXENV_STATUS_UNSUPPORTED;
348
 	start_base->Status = PXENV_STATUS_UNSUPPORTED;
352
  *
353
  *
353
  * Status: working
354
  * Status: working
354
  */
355
  */
355
-PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base ) {
356
+static PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base ) {
356
 	DBGC ( &pxe_netdev, "PXENV_STOP_BASE\n" );
357
 	DBGC ( &pxe_netdev, "PXENV_STOP_BASE\n" );
357
 
358
 
358
 	/* The only time we will be called is when the NBP is trying
359
 	/* The only time we will be called is when the NBP is trying
363
 	stop_base->Status = PXENV_STATUS_SUCCESS;
364
 	stop_base->Status = PXENV_STATUS_SUCCESS;
364
 	return PXENV_EXIT_SUCCESS;
365
 	return PXENV_EXIT_SUCCESS;
365
 }
366
 }
367
+
368
+/** PXE preboot API */
369
+struct pxe_api_call pxe_preboot_api[] __pxe_api_call = {
370
+	PXE_API_CALL ( PXENV_UNLOAD_STACK, pxenv_unload_stack,
371
+		       struct s_PXENV_UNLOAD_STACK ),
372
+	PXE_API_CALL ( PXENV_GET_CACHED_INFO, pxenv_get_cached_info,
373
+		       struct s_PXENV_GET_CACHED_INFO ),
374
+	PXE_API_CALL ( PXENV_RESTART_TFTP, pxenv_restart_tftp,
375
+		       struct s_PXENV_TFTP_READ_FILE ),
376
+	PXE_API_CALL ( PXENV_START_UNDI, pxenv_start_undi,
377
+		       struct s_PXENV_START_UNDI ),
378
+	PXE_API_CALL ( PXENV_STOP_UNDI, pxenv_stop_undi,
379
+		       struct s_PXENV_STOP_UNDI ),
380
+	PXE_API_CALL ( PXENV_START_BASE, pxenv_start_base,
381
+		       struct s_PXENV_START_BASE ),
382
+	PXE_API_CALL ( PXENV_STOP_BASE, pxenv_stop_base,
383
+		       struct s_PXENV_STOP_BASE ),
384
+};

+ 19
- 5
src/arch/i386/interface/pxe/pxe_tftp.c View File

233
  * view of the PXE API, it is conceptually impossible to issue any
233
  * view of the PXE API, it is conceptually impossible to issue any
234
  * other PXE API call "if an MTFTP connection is active".
234
  * other PXE API call "if an MTFTP connection is active".
235
  */
235
  */
236
-PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open ) {
236
+static PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open ) {
237
 	int rc;
237
 	int rc;
238
 
238
 
239
 	DBG ( "PXENV_TFTP_OPEN" );
239
 	DBG ( "PXENV_TFTP_OPEN" );
285
  * call this function with a 32-bit stack segment.  (See the relevant
285
  * call this function with a 32-bit stack segment.  (See the relevant
286
  * @ref pxe_x86_pmode16 "implementation note" for more details.)
286
  * @ref pxe_x86_pmode16 "implementation note" for more details.)
287
  */
287
  */
288
-PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close ) {
288
+static PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close ) {
289
 	DBG ( "PXENV_TFTP_CLOSE" );
289
 	DBG ( "PXENV_TFTP_CLOSE" );
290
 
290
 
291
 	pxe_tftp_close ( &pxe_tftp, 0 );
291
 	pxe_tftp_close ( &pxe_tftp, 0 );
354
  * call this function with a 32-bit stack segment.  (See the relevant
354
  * call this function with a 32-bit stack segment.  (See the relevant
355
  * @ref pxe_x86_pmode16 "implementation note" for more details.)
355
  * @ref pxe_x86_pmode16 "implementation note" for more details.)
356
  */
356
  */
357
-PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read ) {
357
+static PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read ) {
358
 	int rc;
358
 	int rc;
359
 
359
 
360
 	DBG ( "PXENV_TFTP_READ to %04x:%04x",
360
 	DBG ( "PXENV_TFTP_READ to %04x:%04x",
531
  * a file from a TFTP server listening on the standard TFTP port.
531
  * a file from a TFTP server listening on the standard TFTP port.
532
  * "Consistency" is not a word in Intel's vocabulary.
532
  * "Consistency" is not a word in Intel's vocabulary.
533
  */
533
  */
534
-PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE
535
-				    *tftp_get_fsize ) {
534
+static PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE
535
+					   *tftp_get_fsize ) {
536
 	int rc;
536
 	int rc;
537
 
537
 
538
 	DBG ( "PXENV_TFTP_GET_FSIZE" );
538
 	DBG ( "PXENV_TFTP_GET_FSIZE" );
562
 	tftp_get_fsize->Status = PXENV_STATUS ( rc );
562
 	tftp_get_fsize->Status = PXENV_STATUS ( rc );
563
 	return ( rc ? PXENV_EXIT_FAILURE : PXENV_EXIT_SUCCESS );
563
 	return ( rc ? PXENV_EXIT_FAILURE : PXENV_EXIT_SUCCESS );
564
 }
564
 }
565
+
566
+/** PXE TFTP API */
567
+struct pxe_api_call pxe_tftp_api[] __pxe_api_call = {
568
+	PXE_API_CALL ( PXENV_TFTP_OPEN, pxenv_tftp_open,
569
+		       struct s_PXENV_TFTP_OPEN ),
570
+	PXE_API_CALL ( PXENV_TFTP_CLOSE, pxenv_tftp_close,
571
+		       struct s_PXENV_TFTP_CLOSE ),
572
+	PXE_API_CALL ( PXENV_TFTP_READ, pxenv_tftp_read,
573
+		       struct s_PXENV_TFTP_READ ),
574
+	PXE_API_CALL ( PXENV_TFTP_READ_FILE, pxenv_tftp_read_file,
575
+		       struct s_PXENV_TFTP_READ_FILE ),
576
+	PXE_API_CALL ( PXENV_TFTP_GET_FSIZE, pxenv_tftp_get_fsize,
577
+		       struct s_PXENV_TFTP_GET_FSIZE ),
578
+};

+ 18
- 4
src/arch/i386/interface/pxe/pxe_udp.c View File

159
  * parameter.
159
  * parameter.
160
  *
160
  *
161
  */
161
  */
162
-PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *pxenv_udp_open ) {
162
+static PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *pxenv_udp_open ) {
163
 	int rc;
163
 	int rc;
164
 
164
 
165
 	DBG ( "PXENV_UDP_OPEN" );
165
 	DBG ( "PXENV_UDP_OPEN" );
202
  * @ref pxe_x86_pmode16 "implementation note" for more details.)
202
  * @ref pxe_x86_pmode16 "implementation note" for more details.)
203
  *
203
  *
204
  */
204
  */
205
-PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *pxenv_udp_close ) {
205
+static PXENV_EXIT_t
206
+pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *pxenv_udp_close ) {
206
 	DBG ( "PXENV_UDP_CLOSE\n" );
207
 	DBG ( "PXENV_UDP_CLOSE\n" );
207
 
208
 
208
 	/* Close UDP connection */
209
 	/* Close UDP connection */
253
  * parameter.
254
  * parameter.
254
  *
255
  *
255
  */
256
  */
256
-PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *pxenv_udp_write ) {
257
+static PXENV_EXIT_t
258
+pxenv_udp_write ( struct s_PXENV_UDP_WRITE *pxenv_udp_write ) {
257
 	struct sockaddr_in dest;
259
 	struct sockaddr_in dest;
258
 	struct xfer_metadata meta = {
260
 	struct xfer_metadata meta = {
259
 		.src = ( struct sockaddr * ) &pxe_udp.local,
261
 		.src = ( struct sockaddr * ) &pxe_udp.local,
359
  * expects us to do so, and will fail if we don't.
361
  * expects us to do so, and will fail if we don't.
360
  *
362
  *
361
  */
363
  */
362
-PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *pxenv_udp_read ) {
364
+static PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *pxenv_udp_read ) {
363
 	struct in_addr dest_ip_wanted = { .s_addr = pxenv_udp_read->dest_ip };
365
 	struct in_addr dest_ip_wanted = { .s_addr = pxenv_udp_read->dest_ip };
364
 	struct in_addr dest_ip;
366
 	struct in_addr dest_ip;
365
 	uint16_t d_port_wanted = pxenv_udp_read->d_port;
367
 	uint16_t d_port_wanted = pxenv_udp_read->d_port;
405
 	pxenv_udp_read->Status = PXENV_STATUS_FAILURE;
407
 	pxenv_udp_read->Status = PXENV_STATUS_FAILURE;
406
 	return PXENV_EXIT_FAILURE;
408
 	return PXENV_EXIT_FAILURE;
407
 }
409
 }
410
+
411
+/** PXE UDP API */
412
+struct pxe_api_call pxe_udp_api[] __pxe_api_call = {
413
+	PXE_API_CALL ( PXENV_UDP_OPEN, pxenv_udp_open,
414
+		       struct s_PXENV_UDP_OPEN ),
415
+	PXE_API_CALL ( PXENV_UDP_CLOSE, pxenv_udp_close,
416
+		       struct s_PXENV_UDP_CLOSE ),
417
+	PXE_API_CALL ( PXENV_UDP_WRITE, pxenv_udp_write,
418
+		       struct s_PXENV_UDP_WRITE ),
419
+	PXE_API_CALL ( PXENV_UDP_READ, pxenv_udp_read,
420
+		       struct s_PXENV_UDP_READ ),
421
+};

+ 88
- 47
src/arch/i386/interface/pxe/pxe_undi.c View File

121
  *
121
  *
122
  * Status: working
122
  * Status: working
123
  */
123
  */
124
-PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP *undi_startup ) {
124
+static PXENV_EXIT_t
125
+pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP *undi_startup ) {
125
 	DBGC ( &pxe_netdev, "PXENV_UNDI_STARTUP\n" );
126
 	DBGC ( &pxe_netdev, "PXENV_UNDI_STARTUP\n" );
126
 
127
 
127
 	/* Sanity check */
128
 	/* Sanity check */
140
  *
141
  *
141
  * Status: working
142
  * Status: working
142
  */
143
  */
143
-PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP *undi_cleanup ) {
144
+static PXENV_EXIT_t
145
+pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP *undi_cleanup ) {
144
 	DBGC ( &pxe_netdev, "PXENV_UNDI_CLEANUP\n" );
146
 	DBGC ( &pxe_netdev, "PXENV_UNDI_CLEANUP\n" );
145
 
147
 
146
 	/* Sanity check */
148
 	/* Sanity check */
162
  *
164
  *
163
  * Status: working
165
  * Status: working
164
  */
166
  */
165
-PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE
166
-				     *undi_initialize ) {
167
+static PXENV_EXIT_t
168
+pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE *undi_initialize ) {
167
 	DBGC ( &pxe_netdev, "PXENV_UNDI_INITIALIZE protocolini %08x\n",
169
 	DBGC ( &pxe_netdev, "PXENV_UNDI_INITIALIZE protocolini %08x\n",
168
 	       undi_initialize->ProtocolIni );
170
 	       undi_initialize->ProtocolIni );
169
 
171
 
183
  *
185
  *
184
  * Status: working
186
  * Status: working
185
  */
187
  */
186
-PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET
187
-					*undi_reset_adapter ) {
188
+static PXENV_EXIT_t
189
+pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET *undi_reset_adapter ) {
188
 	int rc;
190
 	int rc;
189
 
191
 
190
 	DBGC ( &pxe_netdev, "PXENV_UNDI_RESET_ADAPTER" );
192
 	DBGC ( &pxe_netdev, "PXENV_UNDI_RESET_ADAPTER" );
216
  *
218
  *
217
  * Status: working
219
  * Status: working
218
  */
220
  */
219
-PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN
220
-				   *undi_shutdown ) {
221
+static PXENV_EXIT_t
222
+pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN *undi_shutdown ) {
221
 	DBGC ( &pxe_netdev, "PXENV_UNDI_SHUTDOWN\n" );
223
 	DBGC ( &pxe_netdev, "PXENV_UNDI_SHUTDOWN\n" );
222
 
224
 
223
 	/* Sanity check */
225
 	/* Sanity check */
239
  *
241
  *
240
  * Status: working
242
  * Status: working
241
  */
243
  */
242
-PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open ) {
244
+static PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open ) {
243
 	int rc;
245
 	int rc;
244
 
246
 
245
 	DBGC ( &pxe_netdev, "PXENV_UNDI_OPEN flag %04x filter %04x",
247
 	DBGC ( &pxe_netdev, "PXENV_UNDI_OPEN flag %04x filter %04x",
271
  *
273
  *
272
  * Status: working
274
  * Status: working
273
  */
275
  */
274
-PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close ) {
276
+static PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close ) {
275
 	DBGC ( &pxe_netdev, "PXENV_UNDI_CLOSE\n" );
277
 	DBGC ( &pxe_netdev, "PXENV_UNDI_CLOSE\n" );
276
 
278
 
277
 	/* Sanity check */
279
 	/* Sanity check */
293
  *
295
  *
294
  * Status: working
296
  * Status: working
295
  */
297
  */
296
-PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT
297
-				   *undi_transmit ) {
298
+static PXENV_EXIT_t
299
+pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT *undi_transmit ) {
298
 	struct s_PXENV_UNDI_TBD tbd;
300
 	struct s_PXENV_UNDI_TBD tbd;
299
 	struct DataBlk *datablk;
301
 	struct DataBlk *datablk;
300
 	struct io_buffer *iobuf;
302
 	struct io_buffer *iobuf;
426
  *
428
  *
427
  * Status: working (for NICs that support receive-all-multicast)
429
  * Status: working (for NICs that support receive-all-multicast)
428
  */
430
  */
429
-PXENV_EXIT_t
431
+static PXENV_EXIT_t
430
 pxenv_undi_set_mcast_address ( struct s_PXENV_UNDI_SET_MCAST_ADDRESS
432
 pxenv_undi_set_mcast_address ( struct s_PXENV_UNDI_SET_MCAST_ADDRESS
431
 			       *undi_set_mcast_address ) {
433
 			       *undi_set_mcast_address ) {
432
 	DBGC ( &pxe_netdev, "PXENV_UNDI_SET_MCAST_ADDRESS" );
434
 	DBGC ( &pxe_netdev, "PXENV_UNDI_SET_MCAST_ADDRESS" );
450
  *
452
  *
451
  * Status: working
453
  * Status: working
452
  */
454
  */
453
-PXENV_EXIT_t 
455
+static PXENV_EXIT_t
454
 pxenv_undi_set_station_address ( struct s_PXENV_UNDI_SET_STATION_ADDRESS
456
 pxenv_undi_set_station_address ( struct s_PXENV_UNDI_SET_STATION_ADDRESS
455
 				 *undi_set_station_address ) {
457
 				 *undi_set_station_address ) {
456
 	struct ll_protocol *ll_protocol;
458
 	struct ll_protocol *ll_protocol;
493
  * Status: won't implement (would require driver API changes for no
495
  * Status: won't implement (would require driver API changes for no
494
  * real benefit)
496
  * real benefit)
495
  */
497
  */
496
-PXENV_EXIT_t
498
+static PXENV_EXIT_t
497
 pxenv_undi_set_packet_filter ( struct s_PXENV_UNDI_SET_PACKET_FILTER
499
 pxenv_undi_set_packet_filter ( struct s_PXENV_UNDI_SET_PACKET_FILTER
498
 			       *undi_set_packet_filter ) {
500
 			       *undi_set_packet_filter ) {
499
 
501
 
522
  *
524
  *
523
  * Status: working
525
  * Status: working
524
  */
526
  */
525
-PXENV_EXIT_t pxenv_undi_get_information ( struct s_PXENV_UNDI_GET_INFORMATION
526
-					  *undi_get_information ) {
527
+static PXENV_EXIT_t
528
+pxenv_undi_get_information ( struct s_PXENV_UNDI_GET_INFORMATION
529
+			     *undi_get_information ) {
527
 	struct device *dev;
530
 	struct device *dev;
528
 	struct ll_protocol *ll_protocol;
531
 	struct ll_protocol *ll_protocol;
529
 
532
 
574
  *
577
  *
575
  * Status: working
578
  * Status: working
576
  */
579
  */
577
-PXENV_EXIT_t pxenv_undi_get_statistics ( struct s_PXENV_UNDI_GET_STATISTICS
578
-					 *undi_get_statistics ) {
580
+static PXENV_EXIT_t
581
+pxenv_undi_get_statistics ( struct s_PXENV_UNDI_GET_STATISTICS
582
+			    *undi_get_statistics ) {
579
 
583
 
580
 	/* Sanity check */
584
 	/* Sanity check */
581
 	if ( ! pxe_netdev ) {
585
 	if ( ! pxe_netdev ) {
606
  *
610
  *
607
  * Status: working
611
  * Status: working
608
  */
612
  */
609
-PXENV_EXIT_t pxenv_undi_clear_statistics ( struct s_PXENV_UNDI_CLEAR_STATISTICS
610
-					   *undi_clear_statistics ) {
613
+static PXENV_EXIT_t
614
+pxenv_undi_clear_statistics ( struct s_PXENV_UNDI_CLEAR_STATISTICS
615
+			      *undi_clear_statistics ) {
611
 	DBGC ( &pxe_netdev, "PXENV_UNDI_CLEAR_STATISTICS\n" );
616
 	DBGC ( &pxe_netdev, "PXENV_UNDI_CLEAR_STATISTICS\n" );
612
 
617
 
613
 	/* Sanity check */
618
 	/* Sanity check */
631
  * Status: won't implement (would require driver API changes for no
636
  * Status: won't implement (would require driver API changes for no
632
  * real benefit)
637
  * real benefit)
633
  */
638
  */
634
-PXENV_EXIT_t pxenv_undi_initiate_diags ( struct s_PXENV_UNDI_INITIATE_DIAGS
635
-					 *undi_initiate_diags ) {
639
+static PXENV_EXIT_t
640
+pxenv_undi_initiate_diags ( struct s_PXENV_UNDI_INITIATE_DIAGS
641
+			    *undi_initiate_diags ) {
636
 	DBGC ( &pxe_netdev, "PXENV_UNDI_INITIATE_DIAGS failed: unsupported\n" );
642
 	DBGC ( &pxe_netdev, "PXENV_UNDI_INITIATE_DIAGS failed: unsupported\n" );
637
 
643
 
638
 	/* Sanity check */
644
 	/* Sanity check */
652
  * Status: won't implement (would require driver API changes for no
658
  * Status: won't implement (would require driver API changes for no
653
  * perceptible benefit)
659
  * perceptible benefit)
654
  */
660
  */
655
-PXENV_EXIT_t pxenv_undi_force_interrupt ( struct s_PXENV_UNDI_FORCE_INTERRUPT
656
-					  *undi_force_interrupt ) {
661
+static PXENV_EXIT_t
662
+pxenv_undi_force_interrupt ( struct s_PXENV_UNDI_FORCE_INTERRUPT
663
+			     *undi_force_interrupt ) {
657
 	DBGC ( &pxe_netdev,
664
 	DBGC ( &pxe_netdev,
658
 	       "PXENV_UNDI_FORCE_INTERRUPT failed: unsupported\n" );
665
 	       "PXENV_UNDI_FORCE_INTERRUPT failed: unsupported\n" );
659
 
666
 
673
  *
680
  *
674
  * Status: working
681
  * Status: working
675
  */
682
  */
676
-PXENV_EXIT_t
683
+static PXENV_EXIT_t
677
 pxenv_undi_get_mcast_address ( struct s_PXENV_UNDI_GET_MCAST_ADDRESS
684
 pxenv_undi_get_mcast_address ( struct s_PXENV_UNDI_GET_MCAST_ADDRESS
678
 			       *undi_get_mcast_address ) {
685
 			       *undi_get_mcast_address ) {
679
 	struct ll_protocol *ll_protocol;
686
 	struct ll_protocol *ll_protocol;
711
  *
718
  *
712
  * Status: working
719
  * Status: working
713
  */
720
  */
714
-PXENV_EXIT_t pxenv_undi_get_nic_type ( struct s_PXENV_UNDI_GET_NIC_TYPE
715
-				       *undi_get_nic_type ) {
721
+static PXENV_EXIT_t pxenv_undi_get_nic_type ( struct s_PXENV_UNDI_GET_NIC_TYPE
722
+					      *undi_get_nic_type ) {
716
 	struct device *dev;
723
 	struct device *dev;
717
 
724
 
718
 	/* Sanity check */
725
 	/* Sanity check */
782
  *
789
  *
783
  * Status: working
790
  * Status: working
784
  */
791
  */
785
-PXENV_EXIT_t pxenv_undi_get_iface_info ( struct s_PXENV_UNDI_GET_IFACE_INFO
786
-					 *undi_get_iface_info ) {
792
+static PXENV_EXIT_t
793
+pxenv_undi_get_iface_info ( struct s_PXENV_UNDI_GET_IFACE_INFO
794
+			    *undi_get_iface_info ) {
787
 
795
 
788
 	/* Sanity check */
796
 	/* Sanity check */
789
 	if ( ! pxe_netdev ) {
797
 	if ( ! pxe_netdev ) {
819
 
827
 
820
 /* PXENV_UNDI_GET_STATE
828
 /* PXENV_UNDI_GET_STATE
821
  *
829
  *
822
- * Status: impossible
830
+ * Status: impossible due to opcode collision
823
  */
831
  */
824
-PXENV_EXIT_t pxenv_undi_get_state ( struct s_PXENV_UNDI_GET_STATE
825
-				    *undi_get_state ) {
826
-	DBGC ( &pxe_netdev, "PXENV_UNDI_GET_STATE failed: unsupported\n" );
827
-
828
-	/* Sanity check */
829
-	if ( ! pxe_netdev ) {
830
-		DBGC ( &pxe_netdev, "PXENV_UNDI_GET_STATE called with "
831
-		       "no network device\n" );
832
-		undi_get_state->Status = PXENV_STATUS_UNDI_INVALID_STATE;
833
-		return PXENV_EXIT_FAILURE;
834
-	}
835
-
836
-	undi_get_state->Status = PXENV_STATUS_UNSUPPORTED;
837
-	return PXENV_EXIT_FAILURE;
838
-};
839
 
832
 
840
 /* PXENV_UNDI_ISR
833
 /* PXENV_UNDI_ISR
841
  *
834
  *
842
  * Status: working
835
  * Status: working
843
  */
836
  */
844
-PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) {
837
+static PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) {
845
 	struct io_buffer *iobuf;
838
 	struct io_buffer *iobuf;
846
 	size_t len;
839
 	size_t len;
847
 	struct ll_protocol *ll_protocol;
840
 	struct ll_protocol *ll_protocol;
1025
 	undi_isr->Status = PXENV_STATUS_SUCCESS;
1018
 	undi_isr->Status = PXENV_STATUS_SUCCESS;
1026
 	return PXENV_EXIT_SUCCESS;
1019
 	return PXENV_EXIT_SUCCESS;
1027
 }
1020
 }
1021
+
1022
+/** PXE UNDI API */
1023
+struct pxe_api_call pxe_undi_api[] __pxe_api_call = {
1024
+	PXE_API_CALL ( PXENV_UNDI_STARTUP, pxenv_undi_startup,
1025
+		       struct s_PXENV_UNDI_STARTUP ),
1026
+	PXE_API_CALL ( PXENV_UNDI_CLEANUP, pxenv_undi_cleanup,
1027
+		       struct s_PXENV_UNDI_CLEANUP ),
1028
+	PXE_API_CALL ( PXENV_UNDI_INITIALIZE, pxenv_undi_initialize,
1029
+		       struct s_PXENV_UNDI_INITIALIZE ),
1030
+	PXE_API_CALL ( PXENV_UNDI_RESET_ADAPTER, pxenv_undi_reset_adapter,
1031
+		       struct s_PXENV_UNDI_RESET ),
1032
+	PXE_API_CALL ( PXENV_UNDI_SHUTDOWN, pxenv_undi_shutdown,
1033
+		       struct s_PXENV_UNDI_SHUTDOWN ),
1034
+	PXE_API_CALL ( PXENV_UNDI_OPEN, pxenv_undi_open,
1035
+		       struct s_PXENV_UNDI_OPEN ),
1036
+	PXE_API_CALL ( PXENV_UNDI_CLOSE, pxenv_undi_close,
1037
+		       struct s_PXENV_UNDI_CLOSE ),
1038
+	PXE_API_CALL ( PXENV_UNDI_TRANSMIT, pxenv_undi_transmit,
1039
+		       struct s_PXENV_UNDI_TRANSMIT ),
1040
+	PXE_API_CALL ( PXENV_UNDI_SET_MCAST_ADDRESS,
1041
+		       pxenv_undi_set_mcast_address,
1042
+		       struct s_PXENV_UNDI_SET_MCAST_ADDRESS ),
1043
+	PXE_API_CALL ( PXENV_UNDI_SET_STATION_ADDRESS,
1044
+		       pxenv_undi_set_station_address,
1045
+		       struct s_PXENV_UNDI_SET_STATION_ADDRESS ),
1046
+	PXE_API_CALL ( PXENV_UNDI_SET_PACKET_FILTER,
1047
+		       pxenv_undi_set_packet_filter,
1048
+		       struct s_PXENV_UNDI_SET_PACKET_FILTER ),
1049
+	PXE_API_CALL ( PXENV_UNDI_GET_INFORMATION, pxenv_undi_get_information,
1050
+		       struct s_PXENV_UNDI_GET_INFORMATION ),
1051
+	PXE_API_CALL ( PXENV_UNDI_GET_STATISTICS, pxenv_undi_get_statistics,
1052
+		       struct s_PXENV_UNDI_GET_STATISTICS ),
1053
+	PXE_API_CALL ( PXENV_UNDI_CLEAR_STATISTICS, pxenv_undi_clear_statistics,
1054
+		       struct s_PXENV_UNDI_CLEAR_STATISTICS ),
1055
+	PXE_API_CALL ( PXENV_UNDI_INITIATE_DIAGS, pxenv_undi_initiate_diags,
1056
+		       struct s_PXENV_UNDI_INITIATE_DIAGS ),
1057
+	PXE_API_CALL ( PXENV_UNDI_FORCE_INTERRUPT, pxenv_undi_force_interrupt,
1058
+		       struct s_PXENV_UNDI_FORCE_INTERRUPT ),
1059
+	PXE_API_CALL ( PXENV_UNDI_GET_MCAST_ADDRESS,
1060
+		       pxenv_undi_get_mcast_address,
1061
+		       struct s_PXENV_UNDI_GET_MCAST_ADDRESS ),
1062
+	PXE_API_CALL ( PXENV_UNDI_GET_NIC_TYPE, pxenv_undi_get_nic_type,
1063
+		       struct s_PXENV_UNDI_GET_NIC_TYPE ),
1064
+	PXE_API_CALL ( PXENV_UNDI_GET_IFACE_INFO, pxenv_undi_get_iface_info,
1065
+		       struct s_PXENV_UNDI_GET_IFACE_INFO ),
1066
+	PXE_API_CALL ( PXENV_UNDI_ISR, pxenv_undi_isr,
1067
+		       struct s_PXENV_UNDI_ISR ),
1068
+};

Loading…
Cancel
Save