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; 17f2d8dc88SCyrill Gorcunov int i; 1813a7760fSPekka Enberg 19f2d8dc88SCyrill Gorcunov while (count--) { 20f2d8dc88SCyrill Gorcunov for (i = 0; i < size; i++) 21f2d8dc88SCyrill Gorcunov fprintf(stderr, "%c", *p++); 225b9d0b58SAsias He } 23d7c0e6caSPekka Enberg fflush(stderr); 2413a7760fSPekka Enberg 2513a7760fSPekka Enberg return true; 2613a7760fSPekka Enberg } 2713a7760fSPekka Enberg 2825af6674SPekka Enberg static bool early_serial_rxr_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) 2925af6674SPekka Enberg { 3025af6674SPekka Enberg return true; 3125af6674SPekka Enberg } 3225af6674SPekka Enberg 3325af6674SPekka Enberg static struct ioport_operations early_serial_txr_rxr_ops = { 3413a7760fSPekka Enberg .io_out = early_serial_txr_out, 3525af6674SPekka Enberg .io_in = early_serial_rxr_in, 3613a7760fSPekka Enberg }; 3713a7760fSPekka Enberg 3813a7760fSPekka Enberg static bool early_serial_lsr_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) 3913a7760fSPekka Enberg { 4013a7760fSPekka Enberg uint8_t *p = data; 4113a7760fSPekka Enberg 423f55f3acSPekka Enberg *p = XMTRDY; 4313a7760fSPekka Enberg 4413a7760fSPekka Enberg return true; 4513a7760fSPekka Enberg } 4613a7760fSPekka Enberg 4713a7760fSPekka Enberg static struct ioport_operations early_serial_lsr_ops = { 4813a7760fSPekka Enberg .io_in = early_serial_lsr_in, 4913a7760fSPekka Enberg }; 5013a7760fSPekka Enberg 5113a7760fSPekka Enberg void early_printk__init(void) 5213a7760fSPekka Enberg { 53*3e553514SPekka Enberg ioport__register(early_serial_base + TXR, &early_serial_txr_rxr_ops, 1); 54*3e553514SPekka Enberg ioport__register(early_serial_base + LSR, &early_serial_lsr_ops, 1); 5513a7760fSPekka Enberg } 56