firmware: Add .ipappend_strings function pointer
authorMatt Fleming <matt.fleming@intel.com>
Fri, 20 Jan 2012 14:04:14 +0000 (14:04 +0000)
committerMatt Fleming <matt.fleming@intel.com>
Thu, 2 Feb 2012 16:12:22 +0000 (16:12 +0000)
We need a firmware-independent way of getting the ipappend strings so
add a function pointer to 'struct firmware'. The BIOS backend uses the
old __intcall() method whereas the EFI backend accesses 'IPAppends'
and 'numIPAppends' directly. Note that the EFI backend currently
always returns 0 for 'numIPAppends' because it does not support PXE.

Also, while I'm here I fixed the types of 'numIPAppends' and
'IPAppends' for EFI. For some reason the data types were the wrong way
around.

Signed-off-by: Matt Fleming <matt.fleming@intel.com>
com32/elflink/ldlinux/ipappend.c
com32/include/syslinux/firmware.h
core/bios.c
efi/main.c

index cbd02b1..45e2c3a 100644 (file)
  * Get ipappend strings
  */
 
+#include <syslinux/firmware.h>
 #include <syslinux/config.h>
-#include <klibc/compiler.h>
-#include <com32.h>
 
 struct syslinux_ipappend_strings __syslinux_ipappend_strings;
-static const char *syslinux_ipappend_string_list[32];
 
 void __syslinux_get_ipappend_strings(void)
 {
-    static com32sys_t reg;
-    int i;
+    char *list;
+    int count;
 
-    reg.eax.w[0] = 0x000f;
-    __intcall(0x22, &reg, &reg);
-
-    if (!(reg.eflags.l & EFLAGS_CF)) {
-       __syslinux_ipappend_strings.count = reg.ecx.w[0];
-       __syslinux_ipappend_strings.ptr = syslinux_ipappend_string_list;
-       for (i = 0; i < reg.ecx.w[0]; i++) {
-           syslinux_ipappend_string_list[i] =
-               MK_PTR(reg.es,
-                      *(uint16_t *) MK_PTR(reg.es, reg.ebx.w[0] + i * 2));
-       }
+    if (firmware->ipappend_strings(&list, &count)) {
+       __syslinux_ipappend_strings.count = count;
+       __syslinux_ipappend_strings.ptr = list;
     }
 }
index 5938a65..d52e34a 100644 (file)
@@ -29,6 +29,7 @@ struct firmware {
        struct input_ops *i_ops;
        char *(*get_config_file_name)(void);
        void (*get_serial_console_info)(uint16_t *, uint16_t *, uint16_t *);
+       bool (*ipappend_strings)(char **, int *);
 };
 
 extern struct firmware *firmware;
index 6aaf8c4..8725eda 100644 (file)
@@ -36,6 +36,30 @@ struct input_ops bios_input_ops = {
        .getchar = bios_getchar,
 };
 
+static const char *syslinux_ipappend_string_list[32];
+bool bios_ipappend_strings(char **list, int *count)
+{
+    static com32sys_t reg;
+    int i;
+
+    reg.eax.w[0] = 0x000f;
+    __intcall(0x22, &reg, &reg);
+
+    if (reg.eflags.l & EFLAGS_CF)
+       return false;
+
+    for (i = 0; i < reg.ecx.w[0]; i++) {
+       syslinux_ipappend_string_list[i] =
+           MK_PTR(reg.es,
+                  *(uint16_t *) MK_PTR(reg.es, reg.ebx.w[0] + i * 2));
+    }
+
+    *list = syslinux_ipappend_string_list;
+    *count = reg.ecx.w[0];
+
+    return true;
+}
+
 extern char *bios_get_config_file_name(void);
 extern void bios_get_serial_console_info(uint16_t *, uint16_t *, uint16_t *);
 
@@ -47,6 +71,7 @@ struct firmware bios_fw = {
        .disk_init = bios_disk_init,
        .o_ops = &bios_output_ops,
        .i_ops = &bios_input_ops,
+       .ipappend_strings = bios_ipappend_strings,
        .get_config_file_name = bios_get_config_file_name,
        .get_serial_console_info = bios_get_serial_console_info,
 };
index c7354e1..c3d609d 100644 (file)
@@ -78,8 +78,8 @@ void pxenv(void)
 {
 }
 
-uint16_t IPAppends = 0;
-char numIPAppends[2];
+uint16_t numIPAppends = 0;
+char *IPAppends = NULL;
 uint16_t BIOS_fbm = 1;
 far_ptr_t InitStack;
 uint16_t APIVer;
@@ -253,6 +253,12 @@ char *efi_get_config_file_name(void)
        return ConfigName;
 }
 
+bool efi_ipappend_strings(char **list, int *count)
+{
+       *count = numIPAppends;
+       *list = (char *)IPAppends;
+}
+
 extern struct disk *efi_disk_init(com32sys_t *);
 extern void serialcfg(uint16_t *, uint16_t *, uint16_t *);
 
@@ -264,6 +270,7 @@ struct firmware efi_fw = {
        .i_ops = &efi_iops,
        .get_config_file_name = efi_get_config_file_name,
        .get_serial_console_info = serialcfg,
+       .ipappend_strings = efi_ipappend_strings,
 };
 
 static inline void syslinux_register_efi(void)