X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fserial.c;h=4f79c84163ec7b243e23767848fafcffc3046c89;hp=68ef2754ed8b561c384a1498db8684e54b2bc001;hb=01e2bfdc462dbbe8d62b71c7e99e198c27844f0f;hpb=72a450936e2da159d5febe1e96475493badd9070 diff --git a/palacios/src/geekos/serial.c b/palacios/src/geekos/serial.c index 68ef275..4f79c84 100644 --- a/palacios/src/geekos/serial.c +++ b/palacios/src/geekos/serial.c @@ -2,11 +2,13 @@ #include #include #include +#include unsigned short serial_io_addr = 0; +uint_t serial_print_level; static void Serial_Interrupt_Handler(struct Interrupt_State * state) { @@ -38,12 +40,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,6 +65,8 @@ void InitSerialAddr(unsigned short io_addr) { } + + inline static void SerialPutChar(unsigned char c) { // static unsigned short io_adr; @@ -138,3 +137,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); +}