aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-01-20 15:35:49 +0000
committerMatt Fleming <matt.fleming@intel.com>2012-02-02 16:11:31 +0000
commit941c77f996f6548a4522c03155b6f40cbce04777 (patch)
treea8fb478d1cc50f982af9432f627dc4ebe5012f5b
parent10f713ac7fd3951200850490e8068547fe1da528 (diff)
downloadsyslinux-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.h1
-rw-r--r--com32/lib/syslinux/firmware.c2
-rw-r--r--com32/lib/syslinux/serial.c21
-rw-r--r--core/conio.c13
-rw-r--r--efi/main.c3
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, &reg, &reg);
- __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(&regs->eax.w[0], &regs->ecx.w[0], &regs->ebx.w[0]);
}
static void write_serial_displaymask(char data)
diff --git a/efi/main.c b/efi/main.c
index 5b42258c..c7354e15 100644
--- a/efi/main.c
+++ b/efi/main.c
@@ -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)