summaryrefslogtreecommitdiffstats
path: root/sys/boot/pc98/boot2
diff options
context:
space:
mode:
authorkato <kato@FreeBSD.org>2000-03-30 09:25:03 +0000
committerkato <kato@FreeBSD.org>2000-03-30 09:25:03 +0000
commit1f650b7e9c5ce933f490875afbf664cf92e45654 (patch)
treec94f3b3ec6138a776d04edac32f06bffbe8dcfd5 /sys/boot/pc98/boot2
parent98310ba5f09bd7670d7c93bd1048da71ab0badc9 (diff)
downloadFreeBSD-src-1f650b7e9c5ce933f490875afbf664cf92e45654.zip
FreeBSD-src-1f650b7e9c5ce933f490875afbf664cf92e45654.tar.gz
Separated serial boot block interface routine into NS16550 stuff and
i8251 stuff.
Diffstat (limited to 'sys/boot/pc98/boot2')
-rw-r--r--sys/boot/pc98/boot2/serial.S148
-rw-r--r--sys/boot/pc98/boot2/serial_16550.S181
-rw-r--r--sys/boot/pc98/boot2/serial_8251.S198
3 files changed, 381 insertions, 146 deletions
diff --git a/sys/boot/pc98/boot2/serial.S b/sys/boot/pc98/boot2/serial.S
index 1668815..ea7b98a 100644
--- a/sys/boot/pc98/boot2/serial.S
+++ b/sys/boot/pc98/boot2/serial.S
@@ -50,152 +50,8 @@ NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/*
- * Serial bootblock interface routines
- * Copyright (c) 1994, J"org Wunsch
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- */
-
#if COMCONSOLE == 0x238
-#include "../../../i386/boot/biosboot/serial.S"
+#include "serial_16550.S"
#else
-/*
- * modified for PC-98 by KATO T. of Nagoya University
- */
-
- .file "serial.S"
-
-#include <isa/sioreg.h>
-#include "asm.h"
-
- .text
-
-/*
- * The serial port interface routines implement a simple polled i/o
- * interface to a standard serial port. Due to the space restrictions
- * for the boot blocks, no BIOS support is used (since BIOS requires
- * expensive real/protected mode switches), instead the rudimentary
- * BIOS support is duplicated here.
- *
- * The base address for the i/o port is passed from the Makefile in
- * the COMCONSOLE preprocessor macro. Console parameters are currently
- * hard-coded to 9600 Bd, 8 bit. This can be changed in the
- * init_serial() function.
- */
-
-/*
- * void serial_putc(char ch)
- * send ch to serial port
- *
- */
-
-ENTRY(serial_putc)
- mov $COMCONSOLE + 2, %edx # line status reg
-1: inb %dx, %al
- testb $0x01, %al
- jz 1b # TX buffer not empty
-
- movb 0x4(%esp), %al
-
- sub $2, %edx # TX output reg
- outb %al, %dx # send this one
-
- ret
-
-/*
- * int serial_getc(void)
- * read a character from serial port
- */
-
-ENTRY(serial_getc)
- mov $COMCONSOLE + 2, %edx # line status reg
-1:
- inb %dx, %al
- testb $0x02, %al
- jz 1b # no RX char available
-
- xorb %eax, %eax
- subb $2, %edx # RX buffer reg
- inb %dx, %al # fetch (first) character
-
- cmp $0x7F, %eax # make DEL...
- jne 2f
- movb $0x08, %eax # look like BS
-2:
- ret
-
-/*
- * int serial_ischar(void)
- * if there is a character pending, return true; otherwise return 0
- */
-ENTRY(serial_ischar)
- xorl %eax, %eax
- movl $COMCONSOLE + 2, %edx # line status reg
- inb %dx, %al
- andb $0x02, %al # RX char available?
-
- ret
-
-/*
- * void init_serial(void)
- * initialize the serial console port to 9600 Bd, 8 bpc
- */
-ENTRY(init_serial)
- /* set 8253 */
- movb 0xb6, %al
- outb %al, $0x77
- movl $COMCONSOLE_CLK, %eax
- outb %al, $0x75
- inb $0x5f, %al
- movb %ah, %al
- outb %al, $0x75
-
- /* inhibit com int */
- inb $0x35, %al
- andb $0xf8, %al
- movb %al, %ah
- inb $0x5f, %al
- movb %ah, %al
- outb %al, $0x35
-
- inb $0x02, %al
- orb $0x10, %al
- outb %al, $0x02
-
- /* dummy command */
- xorb %al,%al
- movl $COMCONSOLE + 2, %edx
- outb %al, %dx
- inb $0x5f, %al
- xorb %al,%al
- outb %al, %dx
- inb $0x5f, %al
- xorb %al,%al
- outb %al, %dx
- inb $0x5f, %al
-
- /* RESET 8251 */
- movb $0x40, %al
- outb %al, %dx
-
- movb $COMCONSOLE_MODE , %al
- andb $0xfc, %al
- orb $0x02, %al /* factor = 1/16 */
- outb %al, %dx
- inb $0x5f, %al
-
- /* start RS-232C */
- movb $0x37, %al
- outb %al, %dx
-
- ret
+#include "serial_8251.S"
#endif
diff --git a/sys/boot/pc98/boot2/serial_16550.S b/sys/boot/pc98/boot2/serial_16550.S
new file mode 100644
index 0000000..8473d00
--- /dev/null
+++ b/sys/boot/pc98/boot2/serial_16550.S
@@ -0,0 +1,181 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1992, 1991 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ *
+ * from: Mach, Revision 2.2 92/04/04 11:34:26 rpd
+ * $FreeBSD$
+ */
+
+/*
+ Copyright 1988, 1989, 1990, 1991, 1992
+ by Intel Corporation, Santa Clara, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appears in all
+copies and that both the copyright notice and this permission notice
+appear in supporting documentation, and that the name of Intel
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+
+INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
+NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/*
+ * Serial bootblock interface routines
+ * Copyright (c) 1994, J"org Wunsch
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ */
+
+ .file "serial.S"
+
+#include <isa/sioreg.h>
+#include "asm.h"
+
+ .text
+
+/*
+ * The serial port interface routines implement a simple polled i/o
+ * interface to a standard serial port. Due to the space restrictions
+ * for the boot blocks, no BIOS support is used (since BIOS requires
+ * expensive real/protected mode switches), instead the rudimentary
+ * BIOS support is duplicated here.
+ *
+ * The base address and speed for the i/o port are passed from the
+ * Makefile in the COMCONSOLE and CONSPEED preprocessor macros. The
+ * line control parameters are currently hard-coded to 8 bits, no
+ * parity, 1 stop bit (8N1). This can be changed in init_serial().
+ */
+
+/*
+ * void serial_putc(int ch);
+ * Write character `ch' to port COMCONSOLE.
+ */
+ENTRY(serial_putc)
+ movl $10000, %ecx # timeout
+ movl $COMCONSOLE + 5, %edx # line status reg
+1:
+ decl %ecx
+ je 2f
+ inb %dx, %al
+ testb $0x20, %al
+ je 1b # TX buffer not empty
+
+ movb 4(%esp), %al
+
+ subl $5, %edx # TX output reg
+ outb %al, %dx # send this one
+
+2:
+ ret
+
+/*
+ * int serial_getc(void);
+ * Read a character from port COMCONSOLE.
+ */
+ENTRY(serial_getc)
+ mov $COMCONSOLE + 5, %edx # line status reg
+1:
+ inb %dx, %al
+ testb $0x01, %al
+ je 1b # no rx char available
+
+ xorl %eax, %eax
+ subl $5, %edx # rx buffer reg
+ inb %dx, %al # fetch (first) character
+
+ andb $0x7F, %al # remove any parity bits we get
+ cmpb $0x7F, %al # make DEL...
+ jne 2f
+ movb $0x08, %al # look like BS
+2:
+ ret
+
+/*
+ * int serial_ischar(void);
+ * If there is a character in the input buffer of port COMCONSOLE,
+ * return nonzero; otherwise return 0.
+ */
+ENTRY(serial_ischar)
+ xorl %eax, %eax
+ movl $COMCONSOLE + 5, %edx # line status reg
+ inb %dx, %al
+ andb $0x01, %al # rx char available?
+ ret
+
+/*
+ * void init_serial(void);
+ * Initialize port COMCONSOLE to speed CONSPEED, line settings 8N1.
+ */
+ENTRY(init_serial)
+ movl $COMCONSOLE + 3, %edx # line control reg
+ movb $0x80, %al
+ outb %al, %dx # enable DLAB
+
+ subl $3, %edx # divisor latch, low byte
+ movb $COMBRD(CONSPEED) & 0xff, %al
+ outb %al, %dx
+ incl %edx # divisor latch, high byte
+ movb $COMBRD(CONSPEED) >> 8, %al
+ outb %al, %dx
+
+ incl %edx # fifo control register (if any)
+ xorl %eax,%eax
+ outb %al, %dx # disable fifo to reduce worst-case busy-wait
+
+ incl %edx # line control reg
+ movb $0x03, %al
+ outb %al, %dx # 8N1
+
+ incl %edx # modem control reg
+ outb %al, %dx # enable DTR/RTS
+
+ /* Flush the input buffer. */
+ incl %edx # line status reg
+1:
+ subl $5, %edx # rx buffer reg
+ inb %dx, %al # throw away (unconditionally the first time)
+ addl $5, %edx # line status reg
+ inb %dx, %al
+ testb $0x01, %al
+ jne 1b # more
+
+ ret
diff --git a/sys/boot/pc98/boot2/serial_8251.S b/sys/boot/pc98/boot2/serial_8251.S
new file mode 100644
index 0000000..217dbdb
--- /dev/null
+++ b/sys/boot/pc98/boot2/serial_8251.S
@@ -0,0 +1,198 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1992, 1991 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ *
+ * from: Mach, Revision 2.2 92/04/04 11:34:26 rpd
+ * $FreeBSD$
+ */
+
+/*
+ Copyright 1988, 1989, 1990, 1991, 1992
+ by Intel Corporation, Santa Clara, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appears in all
+copies and that both the copyright notice and this permission notice
+appear in supporting documentation, and that the name of Intel
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+
+INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
+NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/*
+ * Serial bootblock interface routines
+ * Copyright (c) 1994, J"org Wunsch
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ */
+
+/*
+ * modified for PC-98 by KATO T. of Nagoya University
+ */
+
+ .file "serial.S"
+
+#include <isa/sioreg.h>
+#include "asm.h"
+
+ .text
+
+/*
+ * The serial port interface routines implement a simple polled i/o
+ * interface to a standard serial port. Due to the space restrictions
+ * for the boot blocks, no BIOS support is used (since BIOS requires
+ * expensive real/protected mode switches), instead the rudimentary
+ * BIOS support is duplicated here.
+ *
+ * The base address for the i/o port is passed from the Makefile in
+ * the COMCONSOLE preprocessor macro. Console parameters are currently
+ * hard-coded to 9600 Bd, 8 bit. This can be changed in the
+ * init_serial() function.
+ */
+
+/*
+ * void serial_putc(char ch)
+ * send ch to serial port
+ *
+ */
+
+ENTRY(serial_putc)
+ mov $COMCONSOLE + 2, %edx # line status reg
+1: inb %dx, %al
+ testb $0x01, %al
+ jz 1b # TX buffer not empty
+
+ movb 0x4(%esp), %al
+
+ sub $2, %edx # TX output reg
+ outb %al, %dx # send this one
+
+ ret
+
+/*
+ * int serial_getc(void)
+ * read a character from serial port
+ */
+
+ENTRY(serial_getc)
+ mov $COMCONSOLE + 2, %edx # line status reg
+1:
+ inb %dx, %al
+ testb $0x02, %al
+ jz 1b # no RX char available
+
+ xorb %eax, %eax
+ subb $2, %edx # RX buffer reg
+ inb %dx, %al # fetch (first) character
+
+ cmp $0x7F, %eax # make DEL...
+ jne 2f
+ movb $0x08, %eax # look like BS
+2:
+ ret
+
+/*
+ * int serial_ischar(void)
+ * if there is a character pending, return true; otherwise return 0
+ */
+ENTRY(serial_ischar)
+ xorl %eax, %eax
+ movl $COMCONSOLE + 2, %edx # line status reg
+ inb %dx, %al
+ andb $0x02, %al # RX char available?
+
+ ret
+
+/*
+ * void init_serial(void)
+ * initialize the serial console port to 9600 Bd, 8 bpc
+ */
+ENTRY(init_serial)
+ /* set 8253 */
+ movb 0xb6, %al
+ outb %al, $0x77
+ movl $COMCONSOLE_CLK, %eax
+ outb %al, $0x75
+ inb $0x5f, %al
+ movb %ah, %al
+ outb %al, $0x75
+
+ /* inhibit com int */
+ inb $0x35, %al
+ andb $0xf8, %al
+ movb %al, %ah
+ inb $0x5f, %al
+ movb %ah, %al
+ outb %al, $0x35
+
+ inb $0x02, %al
+ orb $0x10, %al
+ outb %al, $0x02
+
+ /* dummy command */
+ xorb %al,%al
+ movl $COMCONSOLE + 2, %edx
+ outb %al, %dx
+ inb $0x5f, %al
+ xorb %al,%al
+ outb %al, %dx
+ inb $0x5f, %al
+ xorb %al,%al
+ outb %al, %dx
+ inb $0x5f, %al
+
+ /* RESET 8251 */
+ movb $0x40, %al
+ outb %al, %dx
+
+ movb $COMCONSOLE_MODE , %al
+ andb $0xfc, %al
+ orb $0x02, %al /* factor = 1/16 */
+ outb %al, %dx
+ inb $0x5f, %al
+
+ /* start RS-232C */
+ movb $0x37, %al
+ outb %al, %dx
+
+ ret
+
OpenPOWER on IntegriCloud