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; 1713a7760fSPekka Enberg 18*d7c0e6caSPekka Enberg fprintf(stderr, "%c", *p); 19*d7c0e6caSPekka Enberg fflush(stderr); 2013a7760fSPekka Enberg 2113a7760fSPekka Enberg return true; 2213a7760fSPekka Enberg } 2313a7760fSPekka Enberg 2413a7760fSPekka Enberg static struct ioport_operations early_serial_txr_ops = { 2513a7760fSPekka Enberg .io_out = early_serial_txr_out, 2613a7760fSPekka Enberg }; 2713a7760fSPekka Enberg 2813a7760fSPekka Enberg static bool early_serial_lsr_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) 2913a7760fSPekka Enberg { 3013a7760fSPekka Enberg uint8_t *p = data; 3113a7760fSPekka Enberg 323f55f3acSPekka Enberg *p = XMTRDY; 3313a7760fSPekka Enberg 3413a7760fSPekka Enberg return true; 3513a7760fSPekka Enberg } 3613a7760fSPekka Enberg 3713a7760fSPekka Enberg static struct ioport_operations early_serial_lsr_ops = { 3813a7760fSPekka Enberg .io_in = early_serial_lsr_in, 3913a7760fSPekka Enberg }; 4013a7760fSPekka Enberg 4113a7760fSPekka Enberg void early_printk__init(void) 4213a7760fSPekka Enberg { 433f55f3acSPekka Enberg ioport__register(early_serial_base + TXR, &early_serial_txr_ops); 443f55f3acSPekka Enberg ioport__register(early_serial_base + LSR, &early_serial_lsr_ops); 4513a7760fSPekka Enberg } 46