aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-01-20 14:04:14 +0000
committerMatt Fleming <matt.fleming@intel.com>2012-02-02 16:12:22 +0000
commit73ecc07646aa9577da929e79412989f600005b40 (patch)
treedb78243a5c376257606e8dee01c36a365b62a19d
parent13aff40f7b7a9644568c6144c3893c77d62492bd (diff)
downloadsyslinux-73ecc07646aa9577da929e79412989f600005b40.tar.gz
syslinux-73ecc07646aa9577da929e79412989f600005b40.tar.xz
syslinux-73ecc07646aa9577da929e79412989f600005b40.zip
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@intel.com>
-rw-r--r--com32/elflink/ldlinux/ipappend.c22
-rw-r--r--com32/include/syslinux/firmware.h1
-rw-r--r--core/bios.c25
-rw-r--r--efi/main.c11
4 files changed, 41 insertions, 18 deletions
diff --git a/com32/elflink/ldlinux/ipappend.c b/com32/elflink/ldlinux/ipappend.c
index cbd02b15..45e2c3a7 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 5938a652..d52e34a0 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 6aaf8c49..8725edad 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 c7354e15..c3d609d1 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)