oskit/oskit-20020317/kern/arm32/shark/base_console_init.c

143 lines
4.4 KiB
C
Executable File

/*
* Copyright (c) 1999 University of Utah and the Flux Group.
* All rights reserved.
*
* This file is part of the Flux OSKit. The OSKit is free software, also known
* as "open source;" you can redistribute it and/or modify it under the terms
* of the GNU General Public License (GPL), version 2, as published by the Free
* Software Foundation (FSF). To explore alternate licensing terms, contact
* the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
*
* The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GPL for more details. You should have
* received a copy of the GPL along with the OSKit; see the file COPYING. If
* not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
*/
#include <oskit/arm32/ofw/ofw.h>
#include <oskit/arm32/ofw/ofw_console.h>
#include <oskit/arm32/shark/base_console.h>
#include <oskit/arm32/shark/com_console.h>
#include <oskit/arm32/shark/direct_console.h>
#include <oskit/arm32/shark/gdb_console.h>
#include <oskit/arm32/proc_reg.h>
#include <oskit/arm32/reset.h>
#include <oskit/arm32/gdb.h>
#include <oskit/gdb_serial.h> /* for gdb_serial_exit */
#include <oskit/c/stdio.h>
#include <oskit/c/unistd.h>
#include <oskit/c/stdlib.h>
#include <oskit/c/termios.h>
#include <oskit/tty.h>
#include <oskit/base_critical.h>
#include <oskit/config.h>
oskit_stream_t *console; /* Currently selected console */
/* This is set if RB_SERIAL is passed by the FreeBSD bootblocks */
int serial_console = 1; /* set to 1 to use serial comsole, */
/* 0 to use keyboard */
/* This is set by giving "-d" to the FreeBSD bootblocks */
int enable_gdb = 0; /* set to 1 for kernel debugging */
static void our_exit(int rc);
/* A common symbol that is overridden */
void (*oskit_libc_exit)(int) = our_exit;
/*
* This overrides the _exit() function in libc.
* If the serial console (or remote GDB) is being used, it waits
* until all the data has cleared out of the FIFOs; if the VGA
* display is being used (normal console), then it waits for a keypress.
* When it is done, it calls pc_reset() to reboot the computer.
*/
static void
our_exit(int rc)
{
if (enable_gdb) {
/* Detach from the remote GDB. */
gdb_serial_exit(rc);
}
printf("_exit(%d) called; rebooting...\n", rc);
disable_interrupts();
arm32_reset();
console_getchar();
}
/*
* This function parses the multiboot command line and
* initializes the serial lines.
*/
void
base_console_init(int argc, char **argv)
{
int i, rc;
char *p;
int cons_com_port = 1; /* first serial (or screen) console */
int gdb_com_port = 1; /* only one serial line */
/*
* XXX: "-f" is a Utah-specific hack to allow FreeBSD bootblocks
* to tell the kernel to run at 115200 instead of the default 9600.
* Note: if -f is passed w/o -h, will use the keyboard.
* This is done so that "-f" can be hardcoded, and just
* change -h to select serial/keyboard.
*/
/* Initialize our configuration options from environment variables */
if ((p = getenv("BAUD")) != NULL) {
base_cooked_termios.c_ispeed = atoi(p);
base_cooked_termios.c_ospeed = atoi(p);
base_raw_termios.c_ispeed = atoi(p);
base_raw_termios.c_ospeed = atoi(p);
}
/* Deal with any boot flags that we care about */
for (i = 0; i < argc; i++) {
if (strcmp(argv[i], "-f") == 0) {
base_cooked_termios.c_ispeed = B115200;
base_cooked_termios.c_ospeed = B115200;
base_raw_termios.c_ispeed = B115200; /* gdb */
base_raw_termios.c_ospeed = B115200;
} else if (strcmp(argv[i], "-h") == 0) {
serial_console = 1;
} else if (strcmp(argv[i], "-d") == 0) {
/* enable gdb/gdb */
enable_gdb = 1;
base_raw_termios.c_ispeed = B115200; /* gdb */
base_raw_termios.c_ospeed = B115200;
}
}
if (serial_console) {
rc = com_console_init(cons_com_port, &base_cooked_termios,
&console);
if (enable_gdb) {
oskit_stream_t *dummy;
rc = gdb_console_init(gdb_com_port, &base_raw_termios,
&dummy);
if (gdb_com_port == cons_com_port) {
console = dummy;
}
}
}
else {
if (enable_gdb) {
oskit_stream_t *dummy;
rc = gdb_console_init(gdb_com_port, &base_raw_termios,
&dummy);
}
rc = direct_console_init(&console);
}
/* Drop into GDB if enabled */
if (enable_gdb) {
extern int main(int argc, char **argv);
gdb_set_bkpt(main);
}
}