aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2013-05-31 08:05:57 -0700
committerH. Peter Anvin <hpa@zytor.com>2013-05-31 08:08:36 -0700
commitc4fa33189f1d725fcd7c7457e45f37e970f5cdac (patch)
treedd731a228b6023f4ff1e20a728d9e60634ed20a6
parentbe5a345d385d14bb740df7075c78dec5dcfbfc2a (diff)
downloadsyslinux-c4fa33189f1d725fcd7c7457e45f37e970f5cdac.tar.gz
syslinux-c4fa33189f1d725fcd7c7457e45f37e970f5cdac.tar.xz
syslinux-c4fa33189f1d725fcd7c7457e45f37e970f5cdac.zip
serial: Clean up and abstract handling of serial ports
The special handling of serial ports 0-3 meaning "look in a BIOS table" is at least officially BIOS-specific, so create an inline function and move it to bios.h. While we are at it, make the function look slightly less like converted assembly. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--com32/elflink/ldlinux/readconfig.c16
-rw-r--r--core/include/bios.h17
2 files changed, 18 insertions, 15 deletions
diff --git a/com32/elflink/ldlinux/readconfig.c b/com32/elflink/ldlinux/readconfig.c
index 7ac216b0..7701acfe 100644
--- a/com32/elflink/ldlinux/readconfig.c
+++ b/com32/elflink/ldlinux/readconfig.c
@@ -1,7 +1,7 @@
/* ----------------------------------------------------------------------- *
*
* Copyright 2004-2009 H. Peter Anvin - All Rights Reserved
- * Copyright 2009 Intel Corporation; author: H. Peter Anvin
+ * Copyright 2009-2013 Intel Corporation; author: H. Peter Anvin
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -759,7 +759,6 @@ static uint8_t SerialNotice = 1;
#define DEFAULT_BAUD 9600
#define BAUD_DIVISOR 115200
-#define serial_base 0x0400
extern void sirq_cleanup_nowipe(void);
extern void sirq_install(void);
@@ -1279,18 +1278,7 @@ do_include:
baud = BAUD_DIVISOR / baud;
baud &= 0xffff;
BaudDivisor = baud;
-
- /*
- * If port > 3 then port is I/O addr
- */
- if (port <= 3) {
- /* Get the I/O port from the BIOS */
- port <<= 1;
- port = *(volatile uint16_t *)(serial_base + port);
- }
-
-
- SerialPort = port;
+ SerialPort = get_serial_port(port);
/*
* Begin code to actually set up the serial port
diff --git a/core/include/bios.h b/core/include/bios.h
index 889443ab..6c3c8154 100644
--- a/core/include/bios.h
+++ b/core/include/bios.h
@@ -30,7 +30,7 @@
#define fdctab1 fdctab
#define fdctab2 (fdctab + 2)
-#define serial_base 0x0400 /* Base address for 4 serial ports */
+#define SERIAL_BASE 0x0400 /* Base address for 4 serial ports */
#define BIOS_fbm 0x0413 /* Free Base Memory (kilobytes) */
#define BIOS_page 0x0462 /* Current video page */
#define BIOS_timer 0x046C /* Timer ticks */
@@ -96,4 +96,19 @@ extern char *SerialTail;
extern void bios_init(void);
extern void bios_cleanup_hardware(void);
+static inline uint16_t get_serial_port(uint16_t port)
+{
+ /* Magic array in BIOS memory, contains four entries */
+ const uint16_t * const serial_ports = (const uint16_t *)SERIAL_BASE;
+
+ /*
+ * If port > 3 then the port is simply the I/O base address
+ */
+ if (port > 3)
+ return port;
+
+ /* Get the I/O port from the BIOS */
+ return serial_ports[port];
+}
+
#endif /* _BIOS_H */