xref: /qemu/target/riscv/kvm/kvm-cpu.c (revision 0a312b85cb433386804a2ca79f4a1f7ab75f64a7)
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