This series add loongarch kvm support, mainly implement some interfaces used by kvm such as kvm_arch_get/set_regs, kvm_arch_handle_exit, kvm_loongarch_set_interrupt, etc. Currently, we are able to boot LoongArch KVM Linux Guests. In loongarch VM, mmio devices and iocsr devices are emulated in user space such as APIC, IPI, pci devices, etc, other hardwares such as MMU, timer and csr are emulated in kernel. It is based on temporarily unaccepted linux kvm: https://github.com/loongson/linux-loongarch-kvm And We will remove the RFC flag until the linux kvm patches are merged. The running environment of LoongArch virt machine: 1. Get the linux source by the above mentioned link. git checkout kvm-loongarch make ARCH=loongarch CROSS_COMPILE=loongarch64-unknown-linux-gnu- loongson3_defconfig make ARCH=loongarch CROSS_COMPILE=loongarch64-unknown-linux-gnu- 2. Get the qemu source: https://github.com/loongson/qemu git checkout kvm-loongarch ./configure --target-list="loongarch64-softmmu" --enable-kvm make 3. Get uefi bios of LoongArch virt machine: Link: https://github.com/tianocore/edk2-platforms/tree/master/Platform/Loongson/LoongArchQemuPkg#readme 4. Also you can access the binary files we have already build: https://github.com/yangxiaojuan-loongson/qemu-binary The command to boot loongarch virt machine: $ qemu-system-loongarch64 -machine virt -m 4G -cpu la464 \ -smp 1 -bios QEMU_EFI.fd -kernel vmlinuz.efi -initrd ramdisk \ -serial stdio -monitor telnet:localhost:4495,server,nowait \ -append "root=/dev/ram rdinit=/sbin/init console=ttyS0,115200" \ --nographic Changes for RFC v3: 1. Move the init mp_state to KVM_MP_STATE_RUNNABLE function into kvm.c. 2. Fix some unstandard code problems in kvm_get/set_regs_ioctl, such as sort loongarch to keep alphabetic ordering in meson.build, gpr[0] should be always 0, remove unnecessary inline statement, etc. 3. Rename the counter_value variable to kvm_state_counter in cpu_env, and add comments for it to explain the meaning. Changes for RFC v2: 1. Mark the "Add KVM headers for loongarch" patch as a placeholder, as we will use the update-linux-headers.sh to generate the kvm headers when the linux loongarch KVM patch series are accepted. 2. Remove the DPRINTF macro in kvm.c and use trace events to replace it, we add some trace functions such as trace_kvm_handle_exit, trace_kvm_set_intr, trace_kvm_failed_get_csr, etc. 3. Remove the unused functions in kvm_stub.c and move stub function into the suitable patch. Tianrui Zhao (9): linux-headers: Add KVM headers for loongarch target/loongarch: Define some kvm_arch interfaces target/loongarch: Supplement vcpu env initial when vcpu reset target/loongarch: Implement kvm get/set registers target/loongarch: Implement kvm_arch_init function target/loongarch: Implement kvm_arch_init_vcpu target/loongarch: Implement kvm_arch_handle_exit target/loongarch: Implement set vcpu intr for kvm target/loongarch: Add loongarch kvm into meson build linux-headers/asm-loongarch/kvm.h | 99 ++++++ linux-headers/linux/kvm.h | 9 + meson.build | 3 + target/loongarch/cpu.c | 23 +- target/loongarch/cpu.h | 5 + target/loongarch/kvm-stub.c | 11 + target/loongarch/kvm.c | 546 ++++++++++++++++++++++++++++++ target/loongarch/kvm_loongarch.h | 13 + target/loongarch/meson.build | 1 + target/loongarch/trace-events | 15 + target/loongarch/trace.h | 1 + 11 files changed, 721 insertions(+), 5 deletions(-) create mode 100644 linux-headers/asm-loongarch/kvm.h create mode 100644 target/loongarch/kvm-stub.c create mode 100644 target/loongarch/kvm.c create mode 100644 target/loongarch/kvm_loongarch.h create mode 100644 target/loongarch/trace-events create mode 100644 target/loongarch/trace.h -- 2.31.1