xref: /kvmtool/hw/serial.c (revision 13a7760f97195e83997c4aab20afbd851459e7c3)
1*13a7760fSPekka Enberg #include "kvm/early_printk.h"
2*13a7760fSPekka Enberg 
3*13a7760fSPekka Enberg #include "kvm/ioport.h"
4*13a7760fSPekka Enberg 
5*13a7760fSPekka Enberg #include <stdio.h>
6*13a7760fSPekka Enberg 
7*13a7760fSPekka Enberg static bool early_serial_txr_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
8*13a7760fSPekka Enberg {
9*13a7760fSPekka Enberg 	char *p = data;
10*13a7760fSPekka Enberg 
11*13a7760fSPekka Enberg 	printf("%c", *p);
12*13a7760fSPekka Enberg 
13*13a7760fSPekka Enberg 	return true;
14*13a7760fSPekka Enberg }
15*13a7760fSPekka Enberg 
16*13a7760fSPekka Enberg static struct ioport_operations early_serial_txr_ops = {
17*13a7760fSPekka Enberg 	.io_out		= early_serial_txr_out,
18*13a7760fSPekka Enberg };
19*13a7760fSPekka Enberg 
20*13a7760fSPekka Enberg static bool early_serial_lsr_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
21*13a7760fSPekka Enberg {
22*13a7760fSPekka Enberg 	uint8_t *p = data;
23*13a7760fSPekka Enberg 
24*13a7760fSPekka Enberg 	*p	= 0x20;	/* xmtrdy */
25*13a7760fSPekka Enberg 
26*13a7760fSPekka Enberg 	return true;
27*13a7760fSPekka Enberg }
28*13a7760fSPekka Enberg 
29*13a7760fSPekka Enberg static struct ioport_operations early_serial_lsr_ops = {
30*13a7760fSPekka Enberg 	.io_in		= early_serial_lsr_in,
31*13a7760fSPekka Enberg };
32*13a7760fSPekka Enberg 
33*13a7760fSPekka Enberg void early_printk__init(void)
34*13a7760fSPekka Enberg {
35*13a7760fSPekka Enberg 	ioport__register(0x03F8, &early_serial_txr_ops);
36*13a7760fSPekka Enberg 	ioport__register(0x03FD, &early_serial_lsr_ops);
37*13a7760fSPekka Enberg }
38