X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fserial.c;h=2f49f6d7568dec8cca623bf18a4f678925638bdc;hb=101529b6eae500272347287df43ec51aa003d0aa;hp=68ef2754ed8b561c384a1498db8684e54b2bc001;hpb=626595465a2c6987606a6bc697df65130ad8c2d3;p=palacios.git diff --git a/palacios/src/geekos/serial.c b/palacios/src/geekos/serial.c index 68ef275..2f49f6d 100644 --- a/palacios/src/geekos/serial.c +++ b/palacios/src/geekos/serial.c @@ -1,13 +1,18 @@ +/* (c) 2008, Peter Dinda */ +/* (c) 2008, Jack Lange */ +/* (c) 2008, The V3VEE Project */ + #include #include #include #include +#include unsigned short serial_io_addr = 0; - +uint_t serial_print_level; static void Serial_Interrupt_Handler(struct Interrupt_State * state) { char rcv_byte; @@ -38,12 +43,7 @@ static void Serial_Interrupt_Handler(struct Interrupt_State * state) { End_IRQ(state); } -void InitSerial() { - Print("Initialzing Serial\n"); - Install_IRQ(COM1_IRQ, Serial_Interrupt_Handler); - Enable_IRQ(COM1_IRQ); - InitSerialAddr(DEFAULT_SERIAL_ADDR); -} + void InitSerialAddr(unsigned short io_addr) { serial_io_addr = io_addr; @@ -68,7 +68,9 @@ void InitSerialAddr(unsigned short io_addr) { } -inline static void SerialPutChar(unsigned char c) { + + +void SerialPutChar(unsigned char c) { // static unsigned short io_adr; if (serial_io_addr==0) { @@ -138,3 +140,67 @@ void SerialMemDump(unsigned char *start, int n) SerialPrint("\n"); } } + + +static struct Output_Sink serial_output_sink; +static void Serial_Emit(struct Output_Sink * o, int ch) { + SerialPutChar((unsigned char)ch); +} +static void Serial_Finish(struct Output_Sink * o) { return; } + + +static void __inline__ SerialPrintInternal(const char * format, va_list ap) { + Format_Output(&serial_output_sink, format, ap); +} + + +void SerialPrint(const char * format, ...) { + va_list args; + bool iflag = Begin_Int_Atomic(); + + va_start(args, format); + SerialPrintInternal(format, args); + va_end(args); + + End_Int_Atomic(iflag); +} + +void SerialPrintList(const char * format, va_list ap) { + bool iflag = Begin_Int_Atomic(); + SerialPrintInternal(format, ap); + End_Int_Atomic(iflag); + +} + + + + +void SerialPrintLevel(int level, const char * format, ...) { + if (level > serial_print_level) { + va_list args; + bool iflag = Begin_Int_Atomic(); + + va_start(args, format); + SerialPrintInternal(format, args); + va_end(args); + + End_Int_Atomic(iflag); + } +} + + + + +void Init_Serial() { + + serial_print_level = SERIAL_PRINT_DEBUG_LEVEL; + + Print("Initialzing Serial\n"); + + serial_output_sink.Emit = &Serial_Emit; + serial_output_sink.Finish = &Serial_Finish; + + Install_IRQ(COM1_IRQ, Serial_Interrupt_Handler); + Enable_IRQ(COM1_IRQ); + InitSerialAddr(DEFAULT_SERIAL_ADDR); +}