xref: /kvmtool/hw/serial.c (revision 5b9d0b58c0f05b7ea1cb3b9c87e67f84a8b9932d)
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*5b9d0b58SAsias He 	uint32_t i;
1813a7760fSPekka Enberg 
19*5b9d0b58SAsias He 	for (i = 0; i < count; i++) {
20d7c0e6caSPekka Enberg 		fprintf(stderr, "%c", *p);
21*5b9d0b58SAsias He 		p += size;
22*5b9d0b58SAsias 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