113a7760fSPekka Enberg #include "kvm/early_printk.h" 213a7760fSPekka Enberg 313a7760fSPekka Enberg #include "kvm/ioport.h" 413a7760fSPekka Enberg 513a7760fSPekka Enberg #include <stdio.h> 613a7760fSPekka Enberg 73f55f3acSPekka Enberg static int early_serial_base = 0x3f8; /* ttyS0 */ 83f55f3acSPekka Enberg 93f55f3acSPekka Enberg #define XMTRDY 0x20 103f55f3acSPekka Enberg 113f55f3acSPekka Enberg #define TXR 0 /* Transmit register (WRITE) */ 123f55f3acSPekka Enberg #define LSR 5 /* Line Status */ 133f55f3acSPekka Enberg 1413a7760fSPekka Enberg static bool early_serial_txr_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) 1513a7760fSPekka Enberg { 1613a7760fSPekka Enberg char *p = data; 17*f2d8dc88SCyrill Gorcunov int i; 1813a7760fSPekka Enberg 19*f2d8dc88SCyrill Gorcunov while (count--) { 20*f2d8dc88SCyrill Gorcunov for (i = 0; i < size; i++) 21*f2d8dc88SCyrill Gorcunov fprintf(stderr, "%c", *p++); 225b9d0b58SAsias He } 23d7c0e6caSPekka Enberg fflush(stderr); 2413a7760fSPekka Enberg 2513a7760fSPekka Enberg return true; 2613a7760fSPekka Enberg } 2713a7760fSPekka Enberg 2813a7760fSPekka Enberg static struct ioport_operations early_serial_txr_ops = { 2913a7760fSPekka Enberg .io_out = early_serial_txr_out, 3013a7760fSPekka Enberg }; 3113a7760fSPekka Enberg 3213a7760fSPekka Enberg static bool early_serial_lsr_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) 3313a7760fSPekka Enberg { 3413a7760fSPekka Enberg uint8_t *p = data; 3513a7760fSPekka Enberg 363f55f3acSPekka Enberg *p = XMTRDY; 3713a7760fSPekka Enberg 3813a7760fSPekka Enberg return true; 3913a7760fSPekka Enberg } 4013a7760fSPekka Enberg 4113a7760fSPekka Enberg static struct ioport_operations early_serial_lsr_ops = { 4213a7760fSPekka Enberg .io_in = early_serial_lsr_in, 4313a7760fSPekka Enberg }; 4413a7760fSPekka Enberg 4513a7760fSPekka Enberg void early_printk__init(void) 4613a7760fSPekka Enberg { 473f55f3acSPekka Enberg ioport__register(early_serial_base + TXR, &early_serial_txr_ops); 483f55f3acSPekka Enberg ioport__register(early_serial_base + LSR, &early_serial_lsr_ops); 4913a7760fSPekka Enberg } 50