aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-09-21 15:18:43 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-09-21 15:18:43 +0000
commitb57872c7d780660aadec0dbedda2828ca3f4e5e8 (patch)
tree37ebddf1cbcc1967a74c1993f718a3fdfbd1c54d
parentf2cd94361f47982af90208a51eb9d6d23c1ec1ea (diff)
parente2806f072d0c026b7ef38d043cb8321709d18bbd (diff)
downloadxen-b57872c7d780660aadec0dbedda2828ca3f4e5e8.tar.gz
xen-b57872c7d780660aadec0dbedda2828ca3f4e5e8.tar.bz2
xen-b57872c7d780660aadec0dbedda2828ca3f4e5e8.zip
bitkeeper revision 1.454 (3f6dc153OAZcogYZVA5gcyMkhECK0Q)
Merge scramble.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk into scramble.cl.cam.ac.uk:/local/scratch/kaf24/xeno
-rw-r--r--.rootkeys3
-rw-r--r--tools/misc/miniterm/Makefile7
-rw-r--r--tools/misc/miniterm/README13
-rw-r--r--tools/misc/miniterm/miniterm.c182
4 files changed, 205 insertions, 0 deletions
diff --git a/.rootkeys b/.rootkeys
index 21a45f01cb..6c90e91b4a 100644
--- a/.rootkeys
+++ b/.rootkeys
@@ -142,6 +142,9 @@
3eb781fd0Eo9K1jEFCSAVzO51i_ngg tools/internal/xi_stop.c
3f108ae2to5nHRRXfvUK7oxgjcW_yA tools/internal/xi_usage.c
3eb781fd7211MZsLxJSiuy7W4KnJXg tools/internal/xi_vifinit
+3f6dc136ZKOjd8PIqLbFBl_v-rnkGg tools/misc/miniterm/Makefile
+3f6dc140C8tAeBfroAF24VrmCS4v_w tools/misc/miniterm/README
+3f6dc142IHaf6XIcAYGmhV9nNSIHFQ tools/misc/miniterm/miniterm.c
3f1668d4-FUY6Enc7MB3GcwUtfJ5HA tools/misc/mkdevnodes
3f5ef5a2ir1kVAthS14Dc5QIRCEFWg tools/misc/xen-clone
3f5ef5a2dTZP0nnsFoeq2jRf3mWDDg tools/misc/xen-clone.README
diff --git a/tools/misc/miniterm/Makefile b/tools/misc/miniterm/Makefile
new file mode 100644
index 0000000000..945ce33593
--- /dev/null
+++ b/tools/misc/miniterm/Makefile
@@ -0,0 +1,7 @@
+CC = gcc
+CFLAGS = -O3 -march=i686 -Wall
+
+all: miniterm
+
+clean:
+ rm -f *.o miniterm *~ \ No newline at end of file
diff --git a/tools/misc/miniterm/README b/tools/misc/miniterm/README
new file mode 100644
index 0000000000..2ca4501e9f
--- /dev/null
+++ b/tools/misc/miniterm/README
@@ -0,0 +1,13 @@
+This is a modified version of the miniterm program distributed as part
+of the Linux Programmer's Guide (LPG) by Sven Goldt.
+
+It is intended to be used as a dumb raw terminal for debugging Xen
+machines over the serial line.
+
+By default it will connect to COM1 (/dev/ttyS0) at 115200 baud.
+These options can be modified as follows:
+ miniterm [-b<baudrate>] [-d<devicename>]
+
+'ctrl-b' quits miniterm.
+
+ -- Keir Fraser (21/9/2003) \ No newline at end of file
diff --git a/tools/misc/miniterm/miniterm.c b/tools/misc/miniterm/miniterm.c
new file mode 100644
index 0000000000..0dc4143b4e
--- /dev/null
+++ b/tools/misc/miniterm/miniterm.c
@@ -0,0 +1,182 @@
+/******************************************************************************
+ * miniterm.c
+ *
+ * Adapted from the example program distributed with the Linux Programmer's
+ * Guide (LPG). This has been robustified and tweaked to work as a debugging
+ * terminal for Xen-based machines.
+ *
+ * Modifications are released under GPL and copyright (c) 2003, K A Fraser
+ * The original copyright message and license is fully intact below.
+ */
+
+/*
+ * AUTHOR: Sven Goldt (goldt@math.tu-berlin.de)
+ *
+ * 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 the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <termios.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#define DEFAULT_BAUDRATE 115200
+#define DEFAULT_SERDEVICE "/dev/ttyS0"
+#define ENDMINITERM 2 /* ctrl-b to quit miniterm */
+
+volatile int stop = 0;
+
+void child_handler(int s)
+{
+ stop = 1;
+}
+
+int cook_baud(int baud)
+{
+ int cooked_baud = 0;
+ switch ( baud )
+ {
+ case 50: cooked_baud = B50; break;
+ case 75: cooked_baud = B75; break;
+ case 110: cooked_baud = B110; break;
+ case 134: cooked_baud = B134; break;
+ case 150: cooked_baud = B150; break;
+ case 200: cooked_baud = B200; break;
+ case 300: cooked_baud = B300; break;
+ case 600: cooked_baud = B600; break;
+ case 1200: cooked_baud = B1200; break;
+ case 1800: cooked_baud = B1800; break;
+ case 2400: cooked_baud = B2400; break;
+ case 4800: cooked_baud = B4800; break;
+ case 9600: cooked_baud = B9600; break;
+ case 19200: cooked_baud = B19200; break;
+ case 38400: cooked_baud = B38400; break;
+ case 57600: cooked_baud = B57600; break;
+ case 115200: cooked_baud = B115200; break;
+ }
+ return cooked_baud;
+}
+
+int main(int argc, char **argv)
+{
+ int fd, c, cooked_baud = cook_baud(DEFAULT_BAUDRATE);
+ char *sername = DEFAULT_SERDEVICE;
+ struct termios oldsertio, newsertio, oldstdtio, newstdtio;
+ struct sigaction sa;
+
+ while ( --argc != 0 )
+ {
+ char *p = argv[argc];
+ if ( *p++ != '-' )
+ goto usage;
+ if ( *p == 'b' )
+ {
+ p++;
+ if ( (cooked_baud = cook_baud(atoi(p))) == 0 )
+ {
+ fprintf(stderr, "Bad baud rate '%d'\n", atoi(p));
+ goto usage;
+ }
+ }
+ else if ( *p == 'd' )
+ {
+ sername = ++p;
+ if ( *sername == '\0' )
+ goto usage;
+ }
+ else
+ goto usage;
+ }
+
+ /* Not a controlling tty: CTRL-C shouldn't kill us. */
+ fd = open(sername, O_RDWR | O_NOCTTY);
+ if ( fd < 0 )
+ {
+ perror(sername);
+ exit(-1);
+ }
+
+ tcgetattr(fd, &oldsertio); /* save current modem settings */
+
+ /*
+ * 8 data, no parity, 1 stop bit. Ignore modem control lines. Enable
+ * receive. Set appropriate baud rate. NO HARDWARE FLOW CONTROL!
+ */
+ newsertio.c_cflag = cooked_baud | CS8 | CLOCAL | CREAD;
+
+ /* Raw input. Ignore errors and breaks. */
+ newsertio.c_iflag = IGNBRK | IGNPAR;
+
+ /* Raw output. */
+ newsertio.c_oflag = 0;
+
+ /* No echo and no signals. */
+ newsertio.c_lflag = 0;
+
+ /* blocking read until 1 char arrives */
+ newsertio.c_cc[VMIN]=1;
+ newsertio.c_cc[VTIME]=0;
+
+ /* now clean the modem line and activate the settings for modem */
+ tcflush(fd, TCIFLUSH);
+ tcsetattr(fd,TCSANOW,&newsertio);
+
+ /* next stop echo and buffering for stdin */
+ tcgetattr(0,&oldstdtio);
+ tcgetattr(0,&newstdtio); /* get working stdtio */
+ newstdtio.c_lflag &= ~(ICANON | ECHO);
+ tcsetattr(0,TCSANOW,&newstdtio);
+
+ /* Terminal settings done: now enter the main I/O loops. */
+ switch ( fork() )
+ {
+ case 0:
+ close(1); /* stdout not needed */
+ for ( c = getchar(); c != ENDMINITERM ; c = getchar() )
+ write(fd,&c,1);
+ tcsetattr(fd,TCSANOW,&oldsertio);
+ tcsetattr(0,TCSANOW,&oldstdtio);
+ close(fd);
+ exit(0); /* will send a SIGCHLD to the parent */
+ break;
+ case -1:
+ perror("fork");
+ tcsetattr(fd,TCSANOW,&oldsertio);
+ close(fd);
+ exit(-1);
+ default:
+ printf("** ctrl-b quits miniterm **\n");
+ close(0); /* stdin not needed */
+ sa.sa_handler = child_handler;
+ sa.sa_flags = 0;
+ sigaction(SIGCHLD,&sa,NULL); /* handle dying child */
+ while ( !stop )
+ {
+ read(fd,&c,1); /* modem */
+ write(1,&c,1); /* stdout */
+ }
+ wait(NULL); /* wait for child to die or it will become a zombie */
+ break;
+ }
+
+ return 0;
+
+ usage:
+ printf("miniterm [-b<baudrate>] [-d<devicename>]\n");
+ printf("Default baud rate: %d\n", DEFAULT_BAUDRATE);
+ printf("Default device: %s\n", DEFAULT_SERDEVICE);
+ return 1;
+}