diff options
author | Matt Fleming <matt.fleming@intel.com> | 2012-01-20 14:04:14 +0000 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2012-02-02 16:12:22 +0000 |
commit | 73ecc07646aa9577da929e79412989f600005b40 (patch) | |
tree | db78243a5c376257606e8dee01c36a365b62a19d | |
parent | 13aff40f7b7a9644568c6144c3893c77d62492bd (diff) | |
download | syslinux-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.c | 22 | ||||
-rw-r--r-- | com32/include/syslinux/firmware.h | 1 | ||||
-rw-r--r-- | core/bios.c | 25 | ||||
-rw-r--r-- | 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 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, ®, ®); - - 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, ®, ®); + + 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, }; @@ -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) |