[syslinux:elflink] serial: Clean up and abstract handling of serial ports

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Fri May 31 08:09:11 PDT 2013


Commit-ID:  c4fa33189f1d725fcd7c7457e45f37e970f5cdac
Gitweb:     http://www.syslinux.org/commit/c4fa33189f1d725fcd7c7457e45f37e970f5cdac
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Fri, 31 May 2013 08:05:57 -0700
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Fri, 31 May 2013 08:08:36 -0700

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 at linux.intel.com>

---
 com32/elflink/ldlinux/readconfig.c | 16 ++--------------
 core/include/bios.h                | 17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/com32/elflink/ldlinux/readconfig.c b/com32/elflink/ldlinux/readconfig.c
index 7ac216b..7701acf 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 889443a..6c3c815 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 */


More information about the Syslinux-commits mailing list