diff options
author | Matt Fleming <matt.fleming@intel.com> | 2012-01-20 15:35:49 +0000 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2012-02-02 16:11:31 +0000 |
commit | 941c77f996f6548a4522c03155b6f40cbce04777 (patch) | |
tree | a8fb478d1cc50f982af9432f627dc4ebe5012f5b | |
parent | 10f713ac7fd3951200850490e8068547fe1da528 (diff) | |
download | syslinux-941c77f996f6548a4522c03155b6f40cbce04777.tar.gz syslinux-941c77f996f6548a4522c03155b6f40cbce04777.tar.xz syslinux-941c77f996f6548a4522c03155b6f40cbce04777.zip |
firmware: Add .get_serial_console_info
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
-rw-r--r-- | com32/include/syslinux/firmware.h | 1 | ||||
-rw-r--r-- | com32/lib/syslinux/firmware.c | 2 | ||||
-rw-r--r-- | com32/lib/syslinux/serial.c | 21 | ||||
-rw-r--r-- | core/conio.c | 13 | ||||
-rw-r--r-- | efi/main.c | 3 |
5 files changed, 32 insertions, 8 deletions
diff --git a/com32/include/syslinux/firmware.h b/com32/include/syslinux/firmware.h index 355cf045..5938a652 100644 --- a/com32/include/syslinux/firmware.h +++ b/com32/include/syslinux/firmware.h @@ -28,6 +28,7 @@ struct firmware { struct output_ops *o_ops; struct input_ops *i_ops; char *(*get_config_file_name)(void); + void (*get_serial_console_info)(uint16_t *, uint16_t *, uint16_t *); }; extern struct firmware *firmware; diff --git a/com32/lib/syslinux/firmware.c b/com32/lib/syslinux/firmware.c index af57a05b..f5765b6c 100644 --- a/com32/lib/syslinux/firmware.c +++ b/com32/lib/syslinux/firmware.c @@ -36,6 +36,7 @@ struct input_ops bios_input_ops = { }; extern char *bios_get_config_file_name(void); +extern void bios_get_serial_console_info(uint16_t *, uint16_t *, uint16_t *); struct firmware bios_fw = { .init = bios_init, @@ -46,6 +47,7 @@ struct firmware bios_fw = { .o_ops = &bios_output_ops, .i_ops = &bios_input_ops, .get_config_file_name = bios_get_config_file_name, + .get_serial_console_info = bios_get_serial_console_info, }; void syslinux_register_bios(void) diff --git a/com32/lib/syslinux/serial.c b/com32/lib/syslinux/serial.c index f06e8c8e..4c6c1995 100644 --- a/com32/lib/syslinux/serial.c +++ b/com32/lib/syslinux/serial.c @@ -32,13 +32,15 @@ */ #include <klibc/compiler.h> +#include <syslinux/firmware.h> #include <syslinux/config.h> #include <string.h> #include <com32.h> struct syslinux_serial_console_info __syslinux_serial_console_info; -void __constructor __syslinux_get_serial_console_info(void) +void bios_get_serial_console_info(uint16_t *iobase, uint16_t *divisor, + uint16_t *flowctl) { static com32sys_t reg; @@ -46,7 +48,18 @@ void __constructor __syslinux_get_serial_console_info(void) reg.eax.w[0] = 0x000b; __intcall(0x22, ®, ®); - __syslinux_serial_console_info.iobase = reg.edx.w[0]; - __syslinux_serial_console_info.divisor = reg.ecx.w[0]; - __syslinux_serial_console_info.flowctl = reg.ebx.w[0]; + *iobase = reg.edx.w[0]; + *divisor = reg.ecx.w[0]; + *flowctl = reg.ebx.w[0]; +} + +void __constructor __syslinux_get_serial_console_info(void) +{ + uint16_t iobase, divisor, flowctl; + + firmware->get_serial_console_info(&iobase, &divisor, &flowctl); + + __syslinux_serial_console_info.iobase = iobase; + __syslinux_serial_console_info.divisor = divisor; + __syslinux_serial_console_info.flowctl = flowctl; } diff --git a/core/conio.c b/core/conio.c index 860aabcb..e18f0c77 100644 --- a/core/conio.c +++ b/core/conio.c @@ -153,12 +153,12 @@ void pm_write_serial(com32sys_t *regs) write_serial(regs->eax.b[0]); } -void pm_serialcfg(com32sys_t *regs) +void serialcfg(uint16_t *iobase, uint16_t *divisor, uint16_t *flowctl) { uint8_t al, ah; - regs->eax.w[0] = SerialPort; - regs->ecx.w[0] = BaudDivisor; + *iobase = SerialPort; + *divisor = BaudDivisor; al = FlowOutput; ah = FlowInput; @@ -170,7 +170,12 @@ void pm_serialcfg(com32sys_t *regs) if (!DisplayCon) ah |= 0x80; - regs->ebx.w[0] = al | (ah << 8); + *flowctl = al | (ah << 8); +} + +void pm_serialcfg(com32sys_t *regs) +{ + serialcfg(®s->eax.w[0], ®s->ecx.w[0], ®s->ebx.w[0]); } static void write_serial_displaymask(char data) @@ -254,6 +254,8 @@ char *efi_get_config_file_name(void) } extern struct disk *efi_disk_init(com32sys_t *); +extern void serialcfg(uint16_t *, uint16_t *, uint16_t *); + struct firmware efi_fw = { .init = efi_init, .scan_memory = efi_scan_memory, @@ -261,6 +263,7 @@ struct firmware efi_fw = { .o_ops = &efi_ops, .i_ops = &efi_iops, .get_config_file_name = efi_get_config_file_name, + .get_serial_console_info = serialcfg, }; static inline void syslinux_register_efi(void) |