113a7760fSPekka Enberg #include "kvm/early_printk.h" 213a7760fSPekka Enberg 313a7760fSPekka Enberg #include "kvm/ioport.h" 413a7760fSPekka Enberg 513a7760fSPekka Enberg #include <stdio.h> 613a7760fSPekka Enberg 7*3f55f3acSPekka Enberg static int early_serial_base = 0x3f8; /* ttyS0 */ 8*3f55f3acSPekka Enberg 9*3f55f3acSPekka Enberg #define XMTRDY 0x20 10*3f55f3acSPekka Enberg 11*3f55f3acSPekka Enberg #define TXR 0 /* Transmit register (WRITE) */ 12*3f55f3acSPekka Enberg #define LSR 5 /* Line Status */ 13*3f55f3acSPekka 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 1813a7760fSPekka Enberg printf("%c", *p); 1913a7760fSPekka Enberg 2013a7760fSPekka Enberg return true; 2113a7760fSPekka Enberg } 2213a7760fSPekka Enberg 2313a7760fSPekka Enberg static struct ioport_operations early_serial_txr_ops = { 2413a7760fSPekka Enberg .io_out = early_serial_txr_out, 2513a7760fSPekka Enberg }; 2613a7760fSPekka Enberg 2713a7760fSPekka Enberg static bool early_serial_lsr_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) 2813a7760fSPekka Enberg { 2913a7760fSPekka Enberg uint8_t *p = data; 3013a7760fSPekka Enberg 31*3f55f3acSPekka Enberg *p = XMTRDY; 3213a7760fSPekka Enberg 3313a7760fSPekka Enberg return true; 3413a7760fSPekka Enberg } 3513a7760fSPekka Enberg 3613a7760fSPekka Enberg static struct ioport_operations early_serial_lsr_ops = { 3713a7760fSPekka Enberg .io_in = early_serial_lsr_in, 3813a7760fSPekka Enberg }; 3913a7760fSPekka Enberg 4013a7760fSPekka Enberg void early_printk__init(void) 4113a7760fSPekka Enberg { 42*3f55f3acSPekka Enberg ioport__register(early_serial_base + TXR, &early_serial_txr_ops); 43*3f55f3acSPekka Enberg ioport__register(early_serial_base + LSR, &early_serial_lsr_ops); 4413a7760fSPekka Enberg } 45