diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-09-21 15:18:43 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-09-21 15:18:43 +0000 |
commit | b57872c7d780660aadec0dbedda2828ca3f4e5e8 (patch) | |
tree | 37ebddf1cbcc1967a74c1993f718a3fdfbd1c54d | |
parent | f2cd94361f47982af90208a51eb9d6d23c1ec1ea (diff) | |
parent | e2806f072d0c026b7ef38d043cb8321709d18bbd (diff) | |
download | xen-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-- | .rootkeys | 3 | ||||
-rw-r--r-- | tools/misc/miniterm/Makefile | 7 | ||||
-rw-r--r-- | tools/misc/miniterm/README | 13 | ||||
-rw-r--r-- | tools/misc/miniterm/miniterm.c | 182 |
4 files changed, 205 insertions, 0 deletions
@@ -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; +} |