[PATCH kvmtool 2/2] mips: Do not emulate a serial device

Alexandru Elisei alexandru.elisei at arm.com
Wed May 25 09:57:04 PDT 2022


Commit 45b4968e0de1 ("hw/serial: ARM/arm64: Use MMIO at higher addresses")
changed how the address for the UART is computed by using KVM_IOPORT_AREA.
The symbol is not defined for MIPS, which results in the following
compilation error:

hw/serial.c:21:27: error: ‘KVM_IOPORT_AREA’ undeclared here (not in a function); did you mean ‘KVM_MIPS_IOPORT_AREA’?
   21 | #define serial_iobase_0  (KVM_IOPORT_AREA + 0x3f8)
      |                           ^~~~~~~~~~~~~~~
hw/serial.c:29:27: note: in expansion of macro ‘serial_iobase_0’
   29 | #define serial_iobase(nr) serial_iobase_##nr
      |                           ^~~~~~~~~~~~~~
hw/serial.c:92:15: note: in expansion of macro ‘serial_iobase’
   92 |   .iobase   = serial_iobase(0),
      |               ^~~~~~~~~~~~~

Before the commit, the serial was placed at addresses 0x3f8, 0x2f8,
0x3e8 and 0x2e8. However, MIPS puts the RAM at those addresses, up to
KVM_MMIO_START, which is 0x10000000. Meaning that serial device
emulation never worked, as those addresses were part of a valid memslot
representing memory. This has been the case since commit 7281a8db199b
("kvm tools, mips: Add MIPS support") from 2014.

A quick examination of the MIPS code reveals that the architecture relies
on hypercalls from the guest and the virtio console for input and output.
Since nobody complained about the missing serial device, assume that it is
indeed not needed and do not compile it for MIPS.

Signed-off-by: Alexandru Elisei <alexandru.elisei at arm.com>
---
 Makefile   | 7 +++++--
 mips/kvm.c | 5 +++++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 9e67c7637b1e..6464446a9f24 100644
--- a/Makefile
+++ b/Makefile
@@ -56,7 +56,6 @@ OBJS	+= disk/core.o
 OBJS	+= framebuffer.o
 OBJS	+= guest_compat.o
 OBJS	+= hw/rtc.o
-OBJS	+= hw/serial.o
 OBJS	+= irq.o
 OBJS	+= kvm-cpu.o
 OBJS	+= kvm.o
@@ -127,6 +126,7 @@ endif
 ifeq ($(ARCH),x86)
 	DEFINES += -DCONFIG_X86
 	OBJS	+= hw/i8042.o
+	OBJS	+= hw/serial.o
 	OBJS	+= x86/boot.o
 	OBJS	+= x86/cpuid.o
 	OBJS	+= x86/interrupt.o
@@ -144,6 +144,7 @@ endif
 # POWER/ppc:  Actually only support ppc64 currently.
 ifeq ($(ARCH), powerpc)
 	DEFINES += -DCONFIG_PPC
+	OBJS	+= hw/serial.o
 	OBJS	+= powerpc/boot.o
 	OBJS	+= powerpc/ioport.o
 	OBJS	+= powerpc/kvm.o
@@ -161,7 +162,8 @@ endif
 
 # ARM
 OBJS_ARM_COMMON		:= arm/fdt.o arm/gic.o arm/gicv2m.o arm/ioport.o \
-			   arm/kvm.o arm/kvm-cpu.o arm/pci.o arm/timer.o
+			   arm/kvm.o arm/kvm-cpu.o arm/pci.o arm/timer.o \
+			   hw/serial.o
 HDRS_ARM_COMMON		:= arm/include
 ifeq ($(ARCH), arm)
 	DEFINES		+= -DCONFIG_ARM
@@ -203,6 +205,7 @@ endif
 ifeq ($(ARCH),riscv)
 	DEFINES		+= -DCONFIG_RISCV
 	ARCH_INCLUDE	:= riscv/include
+	OBJS		+= hw/serial.o
 	OBJS		+= riscv/fdt.o
 	OBJS		+= riscv/ioport.o
 	OBJS		+= riscv/irq.o
diff --git a/mips/kvm.c b/mips/kvm.c
index 3470dbb2e433..e668cbbefb25 100644
--- a/mips/kvm.c
+++ b/mips/kvm.c
@@ -1,3 +1,4 @@
+#include "kvm/8250-serial.h"
 #include "kvm/kvm.h"
 #include "kvm/ioport.h"
 #include "kvm/virtio-console.h"
@@ -359,3 +360,7 @@ bool kvm__arch_load_kernel_image(struct kvm *kvm, int fd_kernel, int fd_initrd,
 void ioport__map_irq(u8 *irq)
 {
 }
+
+void serial8250__inject_sysrq(struct kvm *kvm, char sysrq)
+{
+}
-- 
2.36.1




More information about the linux-arm-kernel mailing list