qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

kvm.c (12900B)


      1 /*
      2  * RISC-V implementation of KVM hooks
      3  *
      4  * Copyright (c) 2020 Huawei Technologies Co., Ltd
      5  *
      6  * This program is free software; you can redistribute it and/or modify it
      7  * under the terms and conditions of the GNU General Public License,
      8  * version 2 or later, as published by the Free Software Foundation.
      9  *
     10  * This program is distributed in the hope it will be useful, but WITHOUT
     11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
     13  * more details.
     14  *
     15  * You should have received a copy of the GNU General Public License along with
     16  * this program.  If not, see <http://www.gnu.org/licenses/>.
     17  */
     18 
     19 #include "qemu/osdep.h"
     20 #include <sys/ioctl.h>
     21 
     22 #include <linux/kvm.h>
     23 
     24 #include "qemu/timer.h"
     25 #include "qemu/error-report.h"
     26 #include "qemu/main-loop.h"
     27 #include "sysemu/sysemu.h"
     28 #include "sysemu/kvm.h"
     29 #include "sysemu/kvm_int.h"
     30 #include "cpu.h"
     31 #include "trace.h"
     32 #include "hw/pci/pci.h"
     33 #include "exec/memattrs.h"
     34 #include "exec/address-spaces.h"
     35 #include "hw/boards.h"
     36 #include "hw/irq.h"
     37 #include "qemu/log.h"
     38 #include "hw/loader.h"
     39 #include "kvm_riscv.h"
     40 #include "sbi_ecall_interface.h"
     41 #include "chardev/char-fe.h"
     42 #include "migration/migration.h"
     43 #include "sysemu/runstate.h"
     44 
     45 static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type,
     46                                  uint64_t idx)
     47 {
     48     uint64_t id = KVM_REG_RISCV | type | idx;
     49 
     50     switch (riscv_cpu_mxl(env)) {
     51     case MXL_RV32:
     52         id |= KVM_REG_SIZE_U32;
     53         break;
     54     case MXL_RV64:
     55         id |= KVM_REG_SIZE_U64;
     56         break;
     57     default:
     58         g_assert_not_reached();
     59     }
     60     return id;
     61 }
     62 
     63 #define RISCV_CORE_REG(env, name)  kvm_riscv_reg_id(env, KVM_REG_RISCV_CORE, \
     64                  KVM_REG_RISCV_CORE_REG(name))
     65 
     66 #define RISCV_CSR_REG(env, name)  kvm_riscv_reg_id(env, KVM_REG_RISCV_CSR, \
     67                  KVM_REG_RISCV_CSR_REG(name))
     68 
     69 #define RISCV_TIMER_REG(env, name)  kvm_riscv_reg_id(env, KVM_REG_RISCV_TIMER, \
     70                  KVM_REG_RISCV_TIMER_REG(name))
     71 
     72 #define RISCV_FP_F_REG(env, idx)  kvm_riscv_reg_id(env, KVM_REG_RISCV_FP_F, idx)
     73 
     74 #define RISCV_FP_D_REG(env, idx)  kvm_riscv_reg_id(env, KVM_REG_RISCV_FP_D, idx)
     75 
     76 #define KVM_RISCV_GET_CSR(cs, env, csr, reg) \
     77     do { \
     78         int ret = kvm_get_one_reg(cs, RISCV_CSR_REG(env, csr), &reg); \
     79         if (ret) { \
     80             return ret; \
     81         } \
     82     } while (0)
     83 
     84 #define KVM_RISCV_SET_CSR(cs, env, csr, reg) \
     85     do { \
     86         int ret = kvm_set_one_reg(cs, RISCV_CSR_REG(env, csr), &reg); \
     87         if (ret) { \
     88             return ret; \
     89         } \
     90     } while (0)
     91 
     92 #define KVM_RISCV_GET_TIMER(cs, env, name, reg) \
     93     do { \
     94         int ret = kvm_get_one_reg(cs, RISCV_TIMER_REG(env, name), &reg); \
     95         if (ret) { \
     96             abort(); \
     97         } \
     98     } while (0)
     99 
    100 #define KVM_RISCV_SET_TIMER(cs, env, name, reg) \
    101     do { \
    102         int ret = kvm_set_one_reg(cs, RISCV_TIMER_REG(env, time), &reg); \
    103         if (ret) { \
    104             abort(); \
    105         } \
    106     } while (0)
    107 
    108 static int kvm_riscv_get_regs_core(CPUState *cs)
    109 {
    110     int ret = 0;
    111     int i;
    112     target_ulong reg;
    113     CPURISCVState *env = &RISCV_CPU(cs)->env;
    114 
    115     ret = kvm_get_one_reg(cs, RISCV_CORE_REG(env, regs.pc), &reg);
    116     if (ret) {
    117         return ret;
    118     }
    119     env->pc = reg;
    120 
    121     for (i = 1; i < 32; i++) {
    122         uint64_t id = kvm_riscv_reg_id(env, KVM_REG_RISCV_CORE, i);
    123         ret = kvm_get_one_reg(cs, id, &reg);
    124         if (ret) {
    125             return ret;
    126         }
    127         env->gpr[i] = reg;
    128     }
    129 
    130     return ret;
    131 }
    132 
    133 static int kvm_riscv_put_regs_core(CPUState *cs)
    134 {
    135     int ret = 0;
    136     int i;
    137     target_ulong reg;
    138     CPURISCVState *env = &RISCV_CPU(cs)->env;
    139 
    140     reg = env->pc;
    141     ret = kvm_set_one_reg(cs, RISCV_CORE_REG(env, regs.pc), &reg);
    142     if (ret) {
    143         return ret;
    144     }
    145 
    146     for (i = 1; i < 32; i++) {
    147         uint64_t id = kvm_riscv_reg_id(env, KVM_REG_RISCV_CORE, i);
    148         reg = env->gpr[i];
    149         ret = kvm_set_one_reg(cs, id, &reg);
    150         if (ret) {
    151             return ret;
    152         }
    153     }
    154 
    155     return ret;
    156 }
    157 
    158 static int kvm_riscv_get_regs_csr(CPUState *cs)
    159 {
    160     int ret = 0;
    161     CPURISCVState *env = &RISCV_CPU(cs)->env;
    162 
    163     KVM_RISCV_GET_CSR(cs, env, sstatus, env->mstatus);
    164     KVM_RISCV_GET_CSR(cs, env, sie, env->mie);
    165     KVM_RISCV_GET_CSR(cs, env, stvec, env->stvec);
    166     KVM_RISCV_GET_CSR(cs, env, sscratch, env->sscratch);
    167     KVM_RISCV_GET_CSR(cs, env, sepc, env->sepc);
    168     KVM_RISCV_GET_CSR(cs, env, scause, env->scause);
    169     KVM_RISCV_GET_CSR(cs, env, stval, env->stval);
    170     KVM_RISCV_GET_CSR(cs, env, sip, env->mip);
    171     KVM_RISCV_GET_CSR(cs, env, satp, env->satp);
    172     return ret;
    173 }
    174 
    175 static int kvm_riscv_put_regs_csr(CPUState *cs)
    176 {
    177     int ret = 0;
    178     CPURISCVState *env = &RISCV_CPU(cs)->env;
    179 
    180     KVM_RISCV_SET_CSR(cs, env, sstatus, env->mstatus);
    181     KVM_RISCV_SET_CSR(cs, env, sie, env->mie);
    182     KVM_RISCV_SET_CSR(cs, env, stvec, env->stvec);
    183     KVM_RISCV_SET_CSR(cs, env, sscratch, env->sscratch);
    184     KVM_RISCV_SET_CSR(cs, env, sepc, env->sepc);
    185     KVM_RISCV_SET_CSR(cs, env, scause, env->scause);
    186     KVM_RISCV_SET_CSR(cs, env, stval, env->stval);
    187     KVM_RISCV_SET_CSR(cs, env, sip, env->mip);
    188     KVM_RISCV_SET_CSR(cs, env, satp, env->satp);
    189 
    190     return ret;
    191 }
    192 
    193 static int kvm_riscv_get_regs_fp(CPUState *cs)
    194 {
    195     int ret = 0;
    196     int i;
    197     CPURISCVState *env = &RISCV_CPU(cs)->env;
    198 
    199     if (riscv_has_ext(env, RVD)) {
    200         uint64_t reg;
    201         for (i = 0; i < 32; i++) {
    202             ret = kvm_get_one_reg(cs, RISCV_FP_D_REG(env, i), &reg);
    203             if (ret) {
    204                 return ret;
    205             }
    206             env->fpr[i] = reg;
    207         }
    208         return ret;
    209     }
    210 
    211     if (riscv_has_ext(env, RVF)) {
    212         uint32_t reg;
    213         for (i = 0; i < 32; i++) {
    214             ret = kvm_get_one_reg(cs, RISCV_FP_F_REG(env, i), &reg);
    215             if (ret) {
    216                 return ret;
    217             }
    218             env->fpr[i] = reg;
    219         }
    220         return ret;
    221     }
    222 
    223     return ret;
    224 }
    225 
    226 static int kvm_riscv_put_regs_fp(CPUState *cs)
    227 {
    228     int ret = 0;
    229     int i;
    230     CPURISCVState *env = &RISCV_CPU(cs)->env;
    231 
    232     if (riscv_has_ext(env, RVD)) {
    233         uint64_t reg;
    234         for (i = 0; i < 32; i++) {
    235             reg = env->fpr[i];
    236             ret = kvm_set_one_reg(cs, RISCV_FP_D_REG(env, i), &reg);
    237             if (ret) {
    238                 return ret;
    239             }
    240         }
    241         return ret;
    242     }
    243 
    244     if (riscv_has_ext(env, RVF)) {
    245         uint32_t reg;
    246         for (i = 0; i < 32; i++) {
    247             reg = env->fpr[i];
    248             ret = kvm_set_one_reg(cs, RISCV_FP_F_REG(env, i), &reg);
    249             if (ret) {
    250                 return ret;
    251             }
    252         }
    253         return ret;
    254     }
    255 
    256     return ret;
    257 }
    258 
    259 static void kvm_riscv_get_regs_timer(CPUState *cs)
    260 {
    261     CPURISCVState *env = &RISCV_CPU(cs)->env;
    262 
    263     if (env->kvm_timer_dirty) {
    264         return;
    265     }
    266 
    267     KVM_RISCV_GET_TIMER(cs, env, time, env->kvm_timer_time);
    268     KVM_RISCV_GET_TIMER(cs, env, compare, env->kvm_timer_compare);
    269     KVM_RISCV_GET_TIMER(cs, env, state, env->kvm_timer_state);
    270     KVM_RISCV_GET_TIMER(cs, env, frequency, env->kvm_timer_frequency);
    271 
    272     env->kvm_timer_dirty = true;
    273 }
    274 
    275 static void kvm_riscv_put_regs_timer(CPUState *cs)
    276 {
    277     uint64_t reg;
    278     CPURISCVState *env = &RISCV_CPU(cs)->env;
    279 
    280     if (!env->kvm_timer_dirty) {
    281         return;
    282     }
    283 
    284     KVM_RISCV_SET_TIMER(cs, env, time, env->kvm_timer_time);
    285     KVM_RISCV_SET_TIMER(cs, env, compare, env->kvm_timer_compare);
    286 
    287     /*
    288      * To set register of RISCV_TIMER_REG(state) will occur a error from KVM
    289      * on env->kvm_timer_state == 0, It's better to adapt in KVM, but it
    290      * doesn't matter that adaping in QEMU now.
    291      * TODO If KVM changes, adapt here.
    292      */
    293     if (env->kvm_timer_state) {
    294         KVM_RISCV_SET_TIMER(cs, env, state, env->kvm_timer_state);
    295     }
    296 
    297     /*
    298      * For now, migration will not work between Hosts with different timer
    299      * frequency. Therefore, we should check whether they are the same here
    300      * during the migration.
    301      */
    302     if (migration_is_running(migrate_get_current()->state)) {
    303         KVM_RISCV_GET_TIMER(cs, env, frequency, reg);
    304         if (reg != env->kvm_timer_frequency) {
    305             error_report("Dst Hosts timer frequency != Src Hosts");
    306         }
    307     }
    308 
    309     env->kvm_timer_dirty = false;
    310 }
    311 
    312 const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
    313     KVM_CAP_LAST_INFO
    314 };
    315 
    316 int kvm_arch_get_registers(CPUState *cs)
    317 {
    318     int ret = 0;
    319 
    320     ret = kvm_riscv_get_regs_core(cs);
    321     if (ret) {
    322         return ret;
    323     }
    324 
    325     ret = kvm_riscv_get_regs_csr(cs);
    326     if (ret) {
    327         return ret;
    328     }
    329 
    330     ret = kvm_riscv_get_regs_fp(cs);
    331     if (ret) {
    332         return ret;
    333     }
    334 
    335     return ret;
    336 }
    337 
    338 int kvm_arch_put_registers(CPUState *cs, int level)
    339 {
    340     int ret = 0;
    341 
    342     ret = kvm_riscv_put_regs_core(cs);
    343     if (ret) {
    344         return ret;
    345     }
    346 
    347     ret = kvm_riscv_put_regs_csr(cs);
    348     if (ret) {
    349         return ret;
    350     }
    351 
    352     ret = kvm_riscv_put_regs_fp(cs);
    353     if (ret) {
    354         return ret;
    355     }
    356 
    357     return ret;
    358 }
    359 
    360 int kvm_arch_release_virq_post(int virq)
    361 {
    362     return 0;
    363 }
    364 
    365 int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
    366                              uint64_t address, uint32_t data, PCIDevice *dev)
    367 {
    368     return 0;
    369 }
    370 
    371 int kvm_arch_destroy_vcpu(CPUState *cs)
    372 {
    373     return 0;
    374 }
    375 
    376 unsigned long kvm_arch_vcpu_id(CPUState *cpu)
    377 {
    378     return cpu->cpu_index;
    379 }
    380 
    381 static void kvm_riscv_vm_state_change(void *opaque, bool running,
    382                                       RunState state)
    383 {
    384     CPUState *cs = opaque;
    385 
    386     if (running) {
    387         kvm_riscv_put_regs_timer(cs);
    388     } else {
    389         kvm_riscv_get_regs_timer(cs);
    390     }
    391 }
    392 
    393 void kvm_arch_init_irq_routing(KVMState *s)
    394 {
    395 }
    396 
    397 int kvm_arch_init_vcpu(CPUState *cs)
    398 {
    399     int ret = 0;
    400     target_ulong isa;
    401     RISCVCPU *cpu = RISCV_CPU(cs);
    402     CPURISCVState *env = &cpu->env;
    403     uint64_t id;
    404 
    405     qemu_add_vm_change_state_handler(kvm_riscv_vm_state_change, cs);
    406 
    407     id = kvm_riscv_reg_id(env, KVM_REG_RISCV_CONFIG,
    408                           KVM_REG_RISCV_CONFIG_REG(isa));
    409     ret = kvm_get_one_reg(cs, id, &isa);
    410     if (ret) {
    411         return ret;
    412     }
    413     env->misa_ext = isa;
    414 
    415     return ret;
    416 }
    417 
    418 int kvm_arch_msi_data_to_gsi(uint32_t data)
    419 {
    420     abort();
    421 }
    422 
    423 int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
    424                                 int vector, PCIDevice *dev)
    425 {
    426     return 0;
    427 }
    428 
    429 int kvm_arch_init(MachineState *ms, KVMState *s)
    430 {
    431     return 0;
    432 }
    433 
    434 int kvm_arch_irqchip_create(KVMState *s)
    435 {
    436     return 0;
    437 }
    438 
    439 int kvm_arch_process_async_events(CPUState *cs)
    440 {
    441     return 0;
    442 }
    443 
    444 void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
    445 {
    446 }
    447 
    448 MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
    449 {
    450     return MEMTXATTRS_UNSPECIFIED;
    451 }
    452 
    453 bool kvm_arch_stop_on_emulation_error(CPUState *cs)
    454 {
    455     return true;
    456 }
    457 
    458 static int kvm_riscv_handle_sbi(CPUState *cs, struct kvm_run *run)
    459 {
    460     int ret = 0;
    461     unsigned char ch;
    462     switch (run->riscv_sbi.extension_id) {
    463     case SBI_EXT_0_1_CONSOLE_PUTCHAR:
    464         ch = run->riscv_sbi.args[0];
    465         qemu_chr_fe_write(serial_hd(0)->be, &ch, sizeof(ch));
    466         break;
    467     case SBI_EXT_0_1_CONSOLE_GETCHAR:
    468         ret = qemu_chr_fe_read_all(serial_hd(0)->be, &ch, sizeof(ch));
    469         if (ret == sizeof(ch)) {
    470             run->riscv_sbi.args[0] = ch;
    471         } else {
    472             run->riscv_sbi.args[0] = -1;
    473         }
    474         break;
    475     default:
    476         qemu_log_mask(LOG_UNIMP,
    477                       "%s: un-handled SBI EXIT, specific reasons is %lu\n",
    478                       __func__, run->riscv_sbi.extension_id);
    479         ret = -1;
    480         break;
    481     }
    482     return ret;
    483 }
    484 
    485 int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
    486 {
    487     int ret = 0;
    488     switch (run->exit_reason) {
    489     case KVM_EXIT_RISCV_SBI:
    490         ret = kvm_riscv_handle_sbi(cs, run);
    491         break;
    492     default:
    493         qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
    494                       __func__, run->exit_reason);
    495         ret = -1;
    496         break;
    497     }
    498     return ret;
    499 }
    500 
    501 void kvm_riscv_reset_vcpu(RISCVCPU *cpu)
    502 {
    503     CPURISCVState *env = &cpu->env;
    504 
    505     if (!kvm_enabled()) {
    506         return;
    507     }
    508     env->pc = cpu->env.kernel_addr;
    509     env->gpr[10] = kvm_arch_vcpu_id(CPU(cpu)); /* a0 */
    510     env->gpr[11] = cpu->env.fdt_addr;          /* a1 */
    511     env->satp = 0;
    512 }
    513 
    514 void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level)
    515 {
    516     int ret;
    517     unsigned virq = level ? KVM_INTERRUPT_SET : KVM_INTERRUPT_UNSET;
    518 
    519     if (irq != IRQ_S_EXT) {
    520         perror("kvm riscv set irq != IRQ_S_EXT\n");
    521         abort();
    522     }
    523 
    524     ret = kvm_vcpu_ioctl(CPU(cpu), KVM_INTERRUPT, &virq);
    525     if (ret < 0) {
    526         perror("Set irq failed");
    527         abort();
    528     }
    529 }
    530 
    531 bool kvm_arch_cpu_check_are_resettable(void)
    532 {
    533     return true;
    534 }
    535 
    536 void kvm_arch_accel_class_init(ObjectClass *oc)
    537 {
    538 }