191654e61SYifei Jiang /* 291654e61SYifei Jiang * RISC-V implementation of KVM hooks 391654e61SYifei Jiang * 491654e61SYifei Jiang * Copyright (c) 2020 Huawei Technologies Co., Ltd 591654e61SYifei Jiang * 691654e61SYifei Jiang * This program is free software; you can redistribute it and/or modify it 791654e61SYifei Jiang * under the terms and conditions of the GNU General Public License, 891654e61SYifei Jiang * version 2 or later, as published by the Free Software Foundation. 991654e61SYifei Jiang * 1091654e61SYifei Jiang * This program is distributed in the hope it will be useful, but WITHOUT 1191654e61SYifei Jiang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1291654e61SYifei Jiang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 1391654e61SYifei Jiang * more details. 1491654e61SYifei Jiang * 1591654e61SYifei Jiang * You should have received a copy of the GNU General Public License along with 1691654e61SYifei Jiang * this program. If not, see <http://www.gnu.org/licenses/>. 1791654e61SYifei Jiang */ 1891654e61SYifei Jiang 1991654e61SYifei Jiang #include "qemu/osdep.h" 2091654e61SYifei Jiang #include <sys/ioctl.h> 2191654e61SYifei Jiang 2291654e61SYifei Jiang #include <linux/kvm.h> 2391654e61SYifei Jiang 2491654e61SYifei Jiang #include "qemu-common.h" 2591654e61SYifei Jiang #include "qemu/timer.h" 2691654e61SYifei Jiang #include "qemu/error-report.h" 2791654e61SYifei Jiang #include "qemu/main-loop.h" 2891654e61SYifei Jiang #include "sysemu/sysemu.h" 2991654e61SYifei Jiang #include "sysemu/kvm.h" 3091654e61SYifei Jiang #include "sysemu/kvm_int.h" 3191654e61SYifei Jiang #include "cpu.h" 3291654e61SYifei Jiang #include "trace.h" 3391654e61SYifei Jiang #include "hw/pci/pci.h" 3491654e61SYifei Jiang #include "exec/memattrs.h" 3591654e61SYifei Jiang #include "exec/address-spaces.h" 3691654e61SYifei Jiang #include "hw/boards.h" 3791654e61SYifei Jiang #include "hw/irq.h" 3891654e61SYifei Jiang #include "qemu/log.h" 3991654e61SYifei Jiang #include "hw/loader.h" 4091654e61SYifei Jiang 41*0a312b85SYifei Jiang static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type, 42*0a312b85SYifei Jiang uint64_t idx) 43*0a312b85SYifei Jiang { 44*0a312b85SYifei Jiang uint64_t id = KVM_REG_RISCV | type | idx; 45*0a312b85SYifei Jiang 46*0a312b85SYifei Jiang switch (riscv_cpu_mxl(env)) { 47*0a312b85SYifei Jiang case MXL_RV32: 48*0a312b85SYifei Jiang id |= KVM_REG_SIZE_U32; 49*0a312b85SYifei Jiang break; 50*0a312b85SYifei Jiang case MXL_RV64: 51*0a312b85SYifei Jiang id |= KVM_REG_SIZE_U64; 52*0a312b85SYifei Jiang break; 53*0a312b85SYifei Jiang default: 54*0a312b85SYifei Jiang g_assert_not_reached(); 55*0a312b85SYifei Jiang } 56*0a312b85SYifei Jiang return id; 57*0a312b85SYifei Jiang } 58*0a312b85SYifei Jiang 5991654e61SYifei Jiang const KVMCapabilityInfo kvm_arch_required_capabilities[] = { 6091654e61SYifei Jiang KVM_CAP_LAST_INFO 6191654e61SYifei Jiang }; 6291654e61SYifei Jiang 6391654e61SYifei Jiang int kvm_arch_get_registers(CPUState *cs) 6491654e61SYifei Jiang { 6591654e61SYifei Jiang return 0; 6691654e61SYifei Jiang } 6791654e61SYifei Jiang 6891654e61SYifei Jiang int kvm_arch_put_registers(CPUState *cs, int level) 6991654e61SYifei Jiang { 7091654e61SYifei Jiang return 0; 7191654e61SYifei Jiang } 7291654e61SYifei Jiang 7391654e61SYifei Jiang int kvm_arch_release_virq_post(int virq) 7491654e61SYifei Jiang { 7591654e61SYifei Jiang return 0; 7691654e61SYifei Jiang } 7791654e61SYifei Jiang 7891654e61SYifei Jiang int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, 7991654e61SYifei Jiang uint64_t address, uint32_t data, PCIDevice *dev) 8091654e61SYifei Jiang { 8191654e61SYifei Jiang return 0; 8291654e61SYifei Jiang } 8391654e61SYifei Jiang 8491654e61SYifei Jiang int kvm_arch_destroy_vcpu(CPUState *cs) 8591654e61SYifei Jiang { 8691654e61SYifei Jiang return 0; 8791654e61SYifei Jiang } 8891654e61SYifei Jiang 8991654e61SYifei Jiang unsigned long kvm_arch_vcpu_id(CPUState *cpu) 9091654e61SYifei Jiang { 9191654e61SYifei Jiang return cpu->cpu_index; 9291654e61SYifei Jiang } 9391654e61SYifei Jiang 9491654e61SYifei Jiang void kvm_arch_init_irq_routing(KVMState *s) 9591654e61SYifei Jiang { 9691654e61SYifei Jiang } 9791654e61SYifei Jiang 9891654e61SYifei Jiang int kvm_arch_init_vcpu(CPUState *cs) 9991654e61SYifei Jiang { 100*0a312b85SYifei Jiang int ret = 0; 101*0a312b85SYifei Jiang target_ulong isa; 102*0a312b85SYifei Jiang RISCVCPU *cpu = RISCV_CPU(cs); 103*0a312b85SYifei Jiang CPURISCVState *env = &cpu->env; 104*0a312b85SYifei Jiang uint64_t id; 105*0a312b85SYifei Jiang 106*0a312b85SYifei Jiang id = kvm_riscv_reg_id(env, KVM_REG_RISCV_CONFIG, 107*0a312b85SYifei Jiang KVM_REG_RISCV_CONFIG_REG(isa)); 108*0a312b85SYifei Jiang ret = kvm_get_one_reg(cs, id, &isa); 109*0a312b85SYifei Jiang if (ret) { 110*0a312b85SYifei Jiang return ret; 111*0a312b85SYifei Jiang } 112*0a312b85SYifei Jiang env->misa_ext = isa; 113*0a312b85SYifei Jiang 114*0a312b85SYifei Jiang return ret; 11591654e61SYifei Jiang } 11691654e61SYifei Jiang 11791654e61SYifei Jiang int kvm_arch_msi_data_to_gsi(uint32_t data) 11891654e61SYifei Jiang { 11991654e61SYifei Jiang abort(); 12091654e61SYifei Jiang } 12191654e61SYifei Jiang 12291654e61SYifei Jiang int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route, 12391654e61SYifei Jiang int vector, PCIDevice *dev) 12491654e61SYifei Jiang { 12591654e61SYifei Jiang return 0; 12691654e61SYifei Jiang } 12791654e61SYifei Jiang 12891654e61SYifei Jiang int kvm_arch_init(MachineState *ms, KVMState *s) 12991654e61SYifei Jiang { 13091654e61SYifei Jiang return 0; 13191654e61SYifei Jiang } 13291654e61SYifei Jiang 13391654e61SYifei Jiang int kvm_arch_irqchip_create(KVMState *s) 13491654e61SYifei Jiang { 13591654e61SYifei Jiang return 0; 13691654e61SYifei Jiang } 13791654e61SYifei Jiang 13891654e61SYifei Jiang int kvm_arch_process_async_events(CPUState *cs) 13991654e61SYifei Jiang { 14091654e61SYifei Jiang return 0; 14191654e61SYifei Jiang } 14291654e61SYifei Jiang 14391654e61SYifei Jiang void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run) 14491654e61SYifei Jiang { 14591654e61SYifei Jiang } 14691654e61SYifei Jiang 14791654e61SYifei Jiang MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) 14891654e61SYifei Jiang { 14991654e61SYifei Jiang return MEMTXATTRS_UNSPECIFIED; 15091654e61SYifei Jiang } 15191654e61SYifei Jiang 15291654e61SYifei Jiang bool kvm_arch_stop_on_emulation_error(CPUState *cs) 15391654e61SYifei Jiang { 15491654e61SYifei Jiang return true; 15591654e61SYifei Jiang } 15691654e61SYifei Jiang 15791654e61SYifei Jiang int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) 15891654e61SYifei Jiang { 15991654e61SYifei Jiang return 0; 16091654e61SYifei Jiang } 16191654e61SYifei Jiang 16291654e61SYifei Jiang bool kvm_arch_cpu_check_are_resettable(void) 16391654e61SYifei Jiang { 16491654e61SYifei Jiang return true; 16591654e61SYifei Jiang } 166