X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=misc%2Ftest_vm%2Fsrc%2Fgeekos%2Fserial.c;h=0729501f29381fc8fab390e1d37481655b587d38;hp=68ef2754ed8b561c384a1498db8684e54b2bc001;hb=b86b717be870723228190fcc9c8233a511d95073;hpb=bc98195a63d8cb1d109eeaa72f57f468c6c9581e diff --git a/misc/test_vm/src/geekos/serial.c b/misc/test_vm/src/geekos/serial.c index 68ef275..0729501 100644 --- a/misc/test_vm/src/geekos/serial.c +++ b/misc/test_vm/src/geekos/serial.c @@ -38,12 +38,6 @@ 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; @@ -138,3 +132,47 @@ 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 InitSerial() { + 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); +}