lkml.org 
[lkml]   [2023]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 03/30] LoongArch: KVM: Implement kvm hardware enable, disable interface
    Date
    Implement kvm hardware enable, disable interface, setting
    the guest config register to enable virtualization features
    when called the interface.

    Reviewed-by: Bibo Mao <maobibo@loongson.cn>
    Signed-off-by: Tianrui Zhao <zhaotianrui@loongson.cn>
    ---
    arch/loongarch/kvm/main.c | 62 +++++++++++++++++++++++++++++++++++++++
    1 file changed, 62 insertions(+)

    diff --git a/arch/loongarch/kvm/main.c b/arch/loongarch/kvm/main.c
    index c204853b8c44..46a042735d34 100644
    --- a/arch/loongarch/kvm/main.c
    +++ b/arch/loongarch/kvm/main.c
    @@ -195,6 +195,68 @@ static void _kvm_init_gcsr_flag(void)
    set_gcsr_sw_flag(LOONGARCH_CSR_PERFCNTR3);
    }

    +void kvm_init_vmcs(struct kvm *kvm)
    +{
    + kvm->arch.vmcs = vmcs;
    +}
    +
    +long kvm_arch_dev_ioctl(struct file *filp,
    + unsigned int ioctl, unsigned long arg)
    +{
    + return -ENOIOCTLCMD;
    +}
    +
    +int kvm_arch_hardware_enable(void)
    +{
    + unsigned long env, gcfg = 0;
    +
    + env = read_csr_gcfg();
    + /* First init gtlbc, gcfg, gstat, gintc. All guest use the same config */
    + clear_csr_gtlbc(CSR_GTLBC_USETGID | CSR_GTLBC_TOTI);
    + write_csr_gcfg(0);
    + write_csr_gstat(0);
    + write_csr_gintc(0);
    +
    + /*
    + * Enable virtualization features granting guest direct control of
    + * certain features:
    + * GCI=2: Trap on init or unimplement cache instruction.
    + * TORU=0: Trap on Root Unimplement.
    + * CACTRL=1: Root control cache.
    + * TOP=0: Trap on Previlege.
    + * TOE=0: Trap on Exception.
    + * TIT=0: Trap on Timer.
    + */
    + if (env & CSR_GCFG_GCIP_ALL)
    + gcfg |= CSR_GCFG_GCI_SECURE;
    + if (env & CSR_GCFG_MATC_ROOT)
    + gcfg |= CSR_GCFG_MATC_ROOT;
    +
    + gcfg |= CSR_GCFG_TIT;
    + write_csr_gcfg(gcfg);
    +
    + kvm_flush_tlb_all();
    +
    + /* Enable using TGID */
    + set_csr_gtlbc(CSR_GTLBC_USETGID);
    + kvm_debug("gtlbc:%lx gintc:%lx gstat:%lx gcfg:%lx",
    + read_csr_gtlbc(), read_csr_gintc(),
    + read_csr_gstat(), read_csr_gcfg());
    +
    + return 0;
    +}
    +
    +void kvm_arch_hardware_disable(void)
    +{
    + clear_csr_gtlbc(CSR_GTLBC_USETGID | CSR_GTLBC_TOTI);
    + write_csr_gcfg(0);
    + write_csr_gstat(0);
    + write_csr_gintc(0);
    +
    + /* Flush any remaining guest TLB entries */
    + kvm_flush_tlb_all();
    +}
    +
    static int kvm_loongarch_env_init(void)
    {
    struct kvm_context *context;
    --
    2.39.1
    \
     
     \ /
      Last update: 2023-08-17 15:02    [W:7.520 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site