[syslinux:firmware] firmware: Add . ipappend_strings function pointer

syslinux-bot for Matt Fleming matt.fleming at intel.com
Fri Nov 9 09:06:12 PST 2012


Commit-ID:  73ecc07646aa9577da929e79412989f600005b40
Gitweb:     http://www.syslinux.org/commit/73ecc07646aa9577da929e79412989f600005b40
Author:     Matt Fleming <matt.fleming at intel.com>
AuthorDate: Fri, 20 Jan 2012 14:04:14 +0000
Committer:  Matt Fleming <matt.fleming at intel.com>
CommitDate: Thu, 2 Feb 2012 16:12:22 +0000

firmware: Add .ipappend_strings function pointer

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 at intel.com>

---
 com32/elflink/ldlinux/ipappend.c  |   22 ++++++----------------
 com32/include/syslinux/firmware.h |    1 +
 core/bios.c                       |   25 +++++++++++++++++++++++++
 efi/main.c                        |   11 +++++++++--
 4 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/com32/elflink/ldlinux/ipappend.c b/com32/elflink/ldlinux/ipappend.c
index cbd02b1..45e2c3a 100644
--- a/com32/elflink/ldlinux/ipappend.c
+++ b/com32/elflink/ldlinux/ipappend.c
@@ -31,28 +31,18 @@
  * 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;
     }
 }
diff --git a/com32/include/syslinux/firmware.h b/com32/include/syslinux/firmware.h
index 5938a65..d52e34a 100644
--- a/com32/include/syslinux/firmware.h
+++ b/com32/include/syslinux/firmware.h
@@ -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;
diff --git a/core/bios.c b/core/bios.c
index 6aaf8c4..8725eda 100644
--- a/core/bios.c
+++ b/core/bios.c
@@ -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,
 };
diff --git a/efi/main.c b/efi/main.c
index c7354e1..c3d609d 100644
--- a/efi/main.c
+++ b/efi/main.c
@@ -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)


More information about the Syslinux-commits mailing list