Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp5984695rdb; Sun, 17 Sep 2023 23:29:29 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFuBR8V456m3Dz/OWVUL6p9d/GOh1piXZc3D1Ud938HwJizBDaFR/M5x5awa3So3vfch2cY X-Received: by 2002:a05:6870:9629:b0:1d1:3a58:14a5 with SMTP id d41-20020a056870962900b001d13a5814a5mr9395872oaq.25.1695018568874; Sun, 17 Sep 2023 23:29:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695018568; cv=none; d=google.com; s=arc-20160816; b=yzrzZHRvNTm7q9+TDuUfVD+eafAO72HsQmFrprs80UQZikR7G8oIGLoJIQeD76p1OS sY8PtEY58dn9v4qtPfJbPMTMxrtkSJbMiyLsHnrqK0ltS1tGSr0diTSYVKN8EwBYKLAF sqH/APVd+bJcrxWrT2Qr6G2QdbUyeHOSWiNMDd+DYLDN1OlPAUaL35WA04ktS21gwZJC UQJ1ghjLmpSMuaVA6Q8HJ6wPDVHkWoi0V3FR2+4CJuPJYjC/xA0FlWi6xxejNzxTgAdv KKGR0kUKrRg6Qv1e2xYuwp1tIB9ZRhvnDI3ONz4ClgJ4MljWtP4Q13Sor8FMZDDl0nZK cpgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-language:content-transfer-encoding :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=WRuKM+WUIu+oMKVu+mVzzT6cGqtJ586MR7o6aW9i9+g=; fh=Ptk96Gsg/JRdkbGqFtqUh8lSmpX0OWY47f5l/BgQFhU=; b=QTz8bzQ1V6Jl80JlY3jotRtHn9pKFLS4Pmva8H3cdcKqVz/3aZjEdwNSBoq4MmkB5w 11Cih0/TCiaZ3YwevS2iH8DzuGKs5yjQKZI7Z4ydttP6uBwA4k7ol+e5tx041hjKFraw 6/Pb5DjrQVbvl7IwksygM3EM7aaRKJUc1wMu6nVLmrdgodypV9ZjKxVg8gJtfPemRR7y mW4yYU7IXXss6ibKEk5Lg/GvnfZLZMfQGQVSURFzBUcWt7FN2QWQ4lKKxjK+A3Ca8q2W YpZHNM2dsNzPW7CsQj1gnAYM78+T5AyCjvgEfp+4pqSi4tLstYwRKtgEclbSScemyTOQ XCkA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id h6-20020a17090ac38600b0026b22aaf29bsi9895342pjt.146.2023.09.17.23.29.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 Sep 2023 23:29:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id B358B81A1B9F; Sun, 17 Sep 2023 23:29:23 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239842AbjIRG2u (ORCPT + 99 others); Mon, 18 Sep 2023 02:28:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36158 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239905AbjIRG21 (ORCPT ); Mon, 18 Sep 2023 02:28:27 -0400 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D87B811A; Sun, 17 Sep 2023 23:28:15 -0700 (PDT) Received: from loongson.cn (unknown [10.40.46.158]) by gateway (Coremail) with SMTP id _____8Axuer+7QdlQYYpAA--.4088S3; Mon, 18 Sep 2023 14:28:14 +0800 (CST) Received: from [192.168.124.126] (unknown [10.40.46.158]) by localhost.localdomain (Coremail) with SMTP id AQAAf8BxL9367QdlPCsKAA--.22483S3; Mon, 18 Sep 2023 14:28:13 +0800 (CST) Subject: Re: [PATCH v21 01/29] LoongArch: KVM: Add kvm related header files To: Huacai Chen Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Paolo Bonzini , WANG Xuerui , Greg Kroah-Hartman , loongarch@lists.linux.dev, Jens Axboe , Mark Brown , Alex Deucher , Oliver Upton , maobibo@loongson.cn, Xi Ruoyao References: <20230915014949.1222777-1-zhaotianrui@loongson.cn> <20230915014949.1222777-2-zhaotianrui@loongson.cn> From: zhaotianrui Message-ID: <75531403-a08d-bd81-6847-34311e2c6b57@loongson.cn> Date: Mon, 18 Sep 2023 14:28:10 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID: AQAAf8BxL9367QdlPCsKAA--.22483S3 X-CM-SenderInfo: p2kd03xldq233l6o00pqjv00gofq/ X-Coremail-Antispam: 1Uk129KBj9fXoW3KryfAw18Zr1UAF18ArWfXrc_yoW8Wr17Xo W7JF4xXF48Gr1UAw4UG34qqa4Yv34rGw4UArW5Cr95Gr17ta47Cr4jgw15XF43WF1UKr43 Casrt3WkZayavwn5l-sFpf9Il3svdjkaLaAFLSUrUUUUeb8apTn2vfkv8UJUUUU8wcxFpf 9Il3svdxBIdaVrn0xqx4xG64xvF2IEw4CE5I8CrVC2j2Jv73VFW2AGmfu7bjvjm3AaLaJ3 UjIYCTnIWjp_UUUO57kC6x804xWl14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI 8IcIk0rVWrJVCq3wAFIxvE14AKwVWUXVWUAwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xG Y2AK021l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14 v26r4j6F4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAF wI0_Gr1j6F4UJwAaw2AFwI0_JF0_Jw1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2 xF0cIa020Ex4CE44I27wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_ Jw0_WrylYx0Ex4A2jsIE14v26F4j6r4UJwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IY64 vIr41lc7I2V7IY0VAS07AlzVAYIcxG8wCY1x0262kKe7AKxVWUAVWUtwCF04k20xvY0x0E wIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwCFI7km07C267AKxVWUAVWUtwC20s026c02F4 0E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFyl IxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxV AFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26F4j 6r4UJwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjxU28 nYUUUUU X-Spam-Status: No, score=-2.2 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Sun, 17 Sep 2023 23:29:24 -0700 (PDT) 在 2023/9/18 上午9:36, Huacai Chen 写道: > Hi, Tianrui, > > On Mon, Sep 18, 2023 at 9:32 AM zhaotianrui wrote: >> >> 在 2023/9/16 下午4:48, Huacai Chen 写道: >>> Hi, Tianrui, >>> >>> On Fri, Sep 15, 2023 at 9:50 AM Tianrui Zhao wrote: >>>> Add LoongArch KVM related header files, including kvm.h, >>>> kvm_host.h, kvm_types.h. All of those are about LoongArch >>>> virtualization features and kvm interfaces. >>>> >>>> Reviewed-by: Bibo Mao >>>> Signed-off-by: Tianrui Zhao >>>> --- >>>> arch/loongarch/include/asm/kvm_host.h | 245 +++++++++++++++++++++++++ >>>> arch/loongarch/include/asm/kvm_types.h | 11 ++ >>>> arch/loongarch/include/uapi/asm/kvm.h | 108 +++++++++++ >>>> include/uapi/linux/kvm.h | 9 + >>>> 4 files changed, 373 insertions(+) >>>> create mode 100644 arch/loongarch/include/asm/kvm_host.h >>>> create mode 100644 arch/loongarch/include/asm/kvm_types.h >>>> create mode 100644 arch/loongarch/include/uapi/asm/kvm.h >>>> >>>> diff --git a/arch/loongarch/include/asm/kvm_host.h b/arch/loongarch/include/asm/kvm_host.h >>>> new file mode 100644 >>>> index 0000000000..00e0c1876b >>>> --- /dev/null >>>> +++ b/arch/loongarch/include/asm/kvm_host.h >>>> @@ -0,0 +1,245 @@ >>>> +/* SPDX-License-Identifier: GPL-2.0 */ >>>> +/* >>>> + * Copyright (C) 2020-2023 Loongson Technology Corporation Limited >>>> + */ >>>> + >>>> +#ifndef __ASM_LOONGARCH_KVM_HOST_H__ >>>> +#define __ASM_LOONGARCH_KVM_HOST_H__ >>>> + >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> + >>>> +#include >>>> +#include >>>> +#include >>>> + >>>> +/* Loongarch KVM register ids */ >>>> +#define KVM_GET_IOC_CSRIDX(id) ((id & KVM_CSR_IDX_MASK) >> LOONGARCH_REG_SHIFT) >>>> +#define KVM_GET_IOC_CPUCFG_IDX(id) ((id & KVM_CPUCFG_IDX_MASK) >> LOONGARCH_REG_SHIFT) >>>> + >>>> +#define KVM_MAX_VCPUS 256 >>>> +#define KVM_MAX_CPUCFG_REGS 21 >>>> +/* memory slots that does not exposed to userspace */ >>>> +#define KVM_PRIVATE_MEM_SLOTS 0 >>>> + >>>> +#define KVM_HALT_POLL_NS_DEFAULT 500000 >>>> + >>>> +struct kvm_vm_stat { >>>> + struct kvm_vm_stat_generic generic; >>>> + u64 pages; >>>> + u64 hugepages; >>>> +}; >>>> + >>>> +struct kvm_vcpu_stat { >>>> + struct kvm_vcpu_stat_generic generic; >>>> + u64 idle_exits; >>>> + u64 signal_exits; >>>> + u64 int_exits; >>>> + u64 cpucfg_exits; >>>> +}; >>>> + >>>> +struct kvm_arch_memory_slot { >>>> +}; >>>> + >>>> +struct kvm_context { >>>> + unsigned long vpid_cache; >>>> + struct kvm_vcpu *last_vcpu; >>>> +}; >>>> + >>>> +struct kvm_world_switch { >>>> + int (*guest_eentry)(void); >>>> + int (*enter_guest)(struct kvm_run *run, struct kvm_vcpu *vcpu); >>>> + unsigned long page_order; >>>> +}; >>>> + >>>> +#define MAX_PGTABLE_LEVELS 4 >>>> +struct kvm_arch { >>>> + /* Guest physical mm */ >>>> + kvm_pte_t *pgd; >>>> + unsigned long gpa_size; >>>> + unsigned long invalid_ptes[MAX_PGTABLE_LEVELS]; >>>> + unsigned int pte_shifts[MAX_PGTABLE_LEVELS]; >>>> + unsigned int root_level; >>>> + >>>> + s64 time_offset; >>>> + struct kvm_context __percpu *vmcs; >>>> +}; >>>> + >>>> +#define CSR_MAX_NUMS 0x800 >>>> + >>>> +struct loongarch_csrs { >>>> + unsigned long csrs[CSR_MAX_NUMS]; >>>> +}; >>>> + >>>> +/* Resume Flags */ >>>> +#define RESUME_HOST 0 >>>> +#define RESUME_GUEST 1 >>>> + >>>> +enum emulation_result { >>>> + EMULATE_DONE, /* no further processing */ >>>> + EMULATE_DO_MMIO, /* kvm_run filled with MMIO request */ >>>> + EMULATE_FAIL, /* can't emulate this instruction */ >>>> + EMULATE_EXCEPT, /* A guest exception has been generated */ >>>> + EMULATE_DO_IOCSR, /* handle IOCSR request */ >>>> +}; >>>> + >>>> +#define KVM_LARCH_FPU (0x1 << 0) >>>> +#define KVM_LARCH_CSR (0x1 << 1) >>>> +#define KVM_LARCH_HWCSR_USABLE (0x1 << 2) >>>> + >>>> +struct kvm_vcpu_arch { >>>> + /* >>>> + * Switch pointer-to-function type to unsigned long >>>> + * for loading the value into register directly. >>>> + */ >>>> + unsigned long host_eentry; >>>> + unsigned long guest_eentry; >>>> + >>>> + /* Pointers stored here for easy accessing from assembly code */ >>>> + int (*handle_exit)(struct kvm_run *run, struct kvm_vcpu *vcpu); >>>> + >>>> + /* Host registers preserved across guest mode execution */ >>>> + unsigned long host_sp; >>>> + unsigned long host_tp; >>>> + unsigned long host_pgd; >>>> + >>>> + /* Host CSRs are used when handling exits from guest */ >>>> + unsigned long badi; >>>> + unsigned long badv; >>>> + unsigned long host_ecfg; >>>> + unsigned long host_estat; >>>> + unsigned long host_percpu; >>>> + >>>> + /* GPRs */ >>>> + unsigned long gprs[32]; >>>> + unsigned long pc; >>>> + >>>> + /* Which auxiliary state is loaded (KVM_LARCH_*) */ >>>> + unsigned int aux_inuse; >>>> + /* FPU state */ >>>> + struct loongarch_fpu fpu FPU_ALIGN; >>>> + >>>> + /* CSR state */ >>>> + struct loongarch_csrs *csr; >>>> + >>>> + /* GPR used as IO source/target */ >>>> + u32 io_gpr; >>>> + >>>> + struct hrtimer swtimer; >>>> + /* KVM register to control count timer */ >>>> + u32 count_ctl; >>>> + >>>> + /* Bitmask of intr that are pending */ >>>> + unsigned long irq_pending; >>>> + /* Bitmask of pending intr to be cleared */ >>>> + unsigned long irq_clear; >>>> + >>>> + /* Bitmask of exceptions that are pending */ >>>> + unsigned long exception_pending; >>>> + unsigned int subcode; >>>> + >>>> + /* Cache for pages needed inside spinlock regions */ >>>> + struct kvm_mmu_memory_cache mmu_page_cache; >>>> + >>>> + /* vcpu's vpid */ >>>> + u64 vpid; >>>> + >>>> + /* Frequency of stable timer in Hz */ >>>> + u64 timer_mhz; >>>> + ktime_t expire; >>>> + >>>> + u64 core_ext_ioisr[4]; >>>> + >>>> + /* Last CPU the vCPU state was loaded on */ >>>> + int last_sched_cpu; >>>> + /* mp state */ >>>> + struct kvm_mp_state mp_state; >>>> + /* cpucfg */ >>>> + u32 cpucfg[KVM_MAX_CPUCFG_REGS]; >>>> +}; >>>> + >>>> +static inline unsigned long readl_sw_gcsr(struct loongarch_csrs *csr, int reg) >>>> +{ >>>> + return csr->csrs[reg]; >>>> +} >>>> + >>>> +static inline void writel_sw_gcsr(struct loongarch_csrs *csr, int reg, unsigned long val) >>>> +{ >>>> + csr->csrs[reg] = val; >>>> +} >>>> + >>>> +/* Helpers */ >>>> +static inline bool kvm_guest_has_fpu(struct kvm_vcpu_arch *arch) >>>> +{ >>>> + return cpu_has_fpu; >>>> +} >>>> + >>>> +void kvm_init_fault(void); >>>> + >>>> +/* Debug: dump vcpu state */ >>>> +int kvm_arch_vcpu_dump_regs(struct kvm_vcpu *vcpu); >>>> + >>>> +/* MMU handling */ >>>> +int kvm_handle_mm_fault(struct kvm_vcpu *vcpu, unsigned long badv, bool write); >>>> +void kvm_flush_tlb_all(void); >>>> + >>>> +#define KVM_ARCH_WANT_MMU_NOTIFIER >>>> +int kvm_unmap_hva_range(struct kvm *kvm, >>>> + unsigned long start, unsigned long end, bool blockable); >>>> +void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); >>>> +int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end); >>>> +int kvm_test_age_hva(struct kvm *kvm, unsigned long hva); >>>> + >>>> +static inline void update_pc(struct kvm_vcpu_arch *arch) >>>> +{ >>>> + arch->pc += 4; >>>> +} >>>> + >>>> +/** >>>> + * kvm_is_ifetch_fault() - Find whether a TLBL exception is due to ifetch fault. >>>> + * @vcpu: Virtual CPU. >>>> + * >>>> + * Returns: Whether the TLBL exception was likely due to an instruction >>>> + * fetch fault rather than a data load fault. >>>> + */ >>>> +static inline bool kvm_is_ifetch_fault(struct kvm_vcpu_arch *arch) >>>> +{ >>>> + return arch->pc == arch->badv; >>>> +} >>>> + >>>> +/* Misc */ >>>> +static inline void kvm_arch_hardware_unsetup(void) {} >>>> +static inline void kvm_arch_sync_events(struct kvm *kvm) {} >>>> +static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} >>>> +static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} >>>> +static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {} >>>> +static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} >>>> +static inline void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu) {} >>>> +static inline void kvm_arch_free_memslot(struct kvm *kvm, >>>> + struct kvm_memory_slot *slot) {} >>>> +void kvm_check_vpid(struct kvm_vcpu *vcpu); >>>> +enum hrtimer_restart kvm_swtimer_wakeup(struct hrtimer *timer); >>>> +int kvm_flush_tlb_gpa(struct kvm_vcpu *vcpu, unsigned long gpa); >>>> +void kvm_arch_flush_remote_tlbs_memslot(struct kvm *kvm, >>>> + const struct kvm_memory_slot *memslot); >>>> +void kvm_init_vmcs(struct kvm *kvm); >>>> +void kvm_vector_entry(void); >>>> +int kvm_enter_guest(struct kvm_run *run, struct kvm_vcpu *vcpu); >>>> +extern const unsigned long kvm_vector_size; >>>> +extern const unsigned long kvm_enter_guest_size; >>>> +extern unsigned long vpid_mask; >>>> +extern struct kvm_world_switch *kvm_loongarch_ops; >>>> + >>>> +#define SW_GCSR (1 << 0) >>>> +#define HW_GCSR (1 << 1) >>>> +#define INVALID_GCSR (1 << 2) >>>> +int get_gcsr_flag(int csr); >>>> +extern void set_hw_gcsr(int csr_id, unsigned long val); >>>> +#endif /* __ASM_LOONGARCH_KVM_HOST_H__ */ >>>> diff --git a/arch/loongarch/include/asm/kvm_types.h b/arch/loongarch/include/asm/kvm_types.h >>>> new file mode 100644 >>>> index 0000000000..2fe1d4bdff >>>> --- /dev/null >>>> +++ b/arch/loongarch/include/asm/kvm_types.h >>>> @@ -0,0 +1,11 @@ >>>> +/* SPDX-License-Identifier: GPL-2.0 */ >>>> +/* >>>> + * Copyright (C) 2020-2023 Loongson Technology Corporation Limited >>>> + */ >>>> + >>>> +#ifndef _ASM_LOONGARCH_KVM_TYPES_H >>>> +#define _ASM_LOONGARCH_KVM_TYPES_H >>>> + >>>> +#define KVM_ARCH_NR_OBJS_PER_MEMORY_CACHE 40 >>>> + >>>> +#endif /* _ASM_LOONGARCH_KVM_TYPES_H */ >>>> diff --git a/arch/loongarch/include/uapi/asm/kvm.h b/arch/loongarch/include/uapi/asm/kvm.h >>>> new file mode 100644 >>>> index 0000000000..fafda487d6 >>>> --- /dev/null >>>> +++ b/arch/loongarch/include/uapi/asm/kvm.h >>>> @@ -0,0 +1,108 @@ >>>> +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ >>>> +/* >>>> + * Copyright (C) 2020-2023 Loongson Technology Corporation Limited >>>> + */ >>>> + >>>> +#ifndef __UAPI_ASM_LOONGARCH_KVM_H >>>> +#define __UAPI_ASM_LOONGARCH_KVM_H >>>> + >>>> +#include >>>> + >>>> +/* >>>> + * KVM Loongarch specific structures and definitions. >>>> + * >>>> + * Some parts derived from the x86 version of this file. >>>> + */ >>>> + >>>> +#define __KVM_HAVE_READONLY_MEM >>>> + >>>> +#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 >>>> +#define KVM_DIRTY_LOG_PAGE_OFFSET 64 >>>> + >>>> +/* >>>> + * for KVM_GET_REGS and KVM_SET_REGS >>>> + */ >>>> +struct kvm_regs { >>>> + /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ >>>> + __u64 gpr[32]; >>>> + __u64 pc; >>>> +}; >>>> + >>>> +/* >>>> + * for KVM_GET_FPU and KVM_SET_FPU >>>> + */ >>>> +struct kvm_fpu { >>>> + __u32 fcsr; >>>> + __u64 fcc; /* 8x8 */ >>>> + struct kvm_fpureg { >>>> + __u64 val64[4]; >>>> + } fpr[32]; >>>> +}; >>>> + >>>> +/* >>>> + * For LoongArch, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access various >>>> + * registers. The id field is broken down as follows: >>>> + * >>>> + * bits[63..52] - As per linux/kvm.h >>>> + * bits[51..32] - Must be zero. >>>> + * bits[31..16] - Register set. >>>> + * >>>> + * Register set = 0: GP registers from kvm_regs (see definitions below). >>>> + * >>>> + * Register set = 1: CSR registers. >>>> + * >>>> + * Register set = 2: KVM specific registers (see definitions below). >>>> + * >>>> + * Register set = 3: FPU / SIMD registers (see definitions below). >>>> + * >>>> + * Other sets registers may be added in the future. Each set would >>>> + * have its own identifier in bits[31..16]. >>>> + */ >>>> + >>>> +#define KVM_REG_LOONGARCH_GPR (KVM_REG_LOONGARCH | 0x00000ULL) >>>> +#define KVM_REG_LOONGARCH_CSR (KVM_REG_LOONGARCH | 0x10000ULL) >>>> +#define KVM_REG_LOONGARCH_KVM (KVM_REG_LOONGARCH | 0x20000ULL) >>>> +#define KVM_REG_LOONGARCH_FPU (KVM_REG_LOONGARCH | 0x30000ULL) >>> How about rename to KVM_REG_LOONGARCH_FPSIMD? >>> >>> Huacai >> It will broke uapi used by user space software, it may cause >> incompatible issue, so I think it is better to keep the original name. > In your comments above it is not only FPU but FPU&SIMD, and this code > hasn't been upstream yet, how to break UAPI? We want to apply this patch series to our other project when it is upstream, so we need update the previous codes and it may break the uapi. What do you think of it? Thanks Tianrui Zhao > > Huacai > >> Thanks >> Tianrui Zhao >>>> +#define KVM_REG_LOONGARCH_CPUCFG (KVM_REG_LOONGARCH | 0x40000ULL) >>>> +#define KVM_REG_LOONGARCH_MASK (KVM_REG_LOONGARCH | 0x70000ULL) >>>> +#define KVM_CSR_IDX_MASK 0x7fff >>>> +#define KVM_CPUCFG_IDX_MASK 0x7fff >>>> + >>>> +/* >>>> + * KVM_REG_LOONGARCH_KVM - KVM specific control registers. >>>> + */ >>>> + >>>> +#define KVM_REG_LOONGARCH_COUNTER (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 3) >>>> +#define KVM_REG_LOONGARCH_VCPU_RESET (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 4) >>>> + >>>> +#define LOONGARCH_REG_SHIFT 3 >>>> +#define LOONGARCH_REG_64(TYPE, REG) (TYPE | KVM_REG_SIZE_U64 | (REG << LOONGARCH_REG_SHIFT)) >>>> +#define KVM_IOC_CSRID(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CSR, REG) >>>> +#define KVM_IOC_CPUCFG(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CPUCFG, REG) >>>> + >>>> +struct kvm_debug_exit_arch { >>>> +}; >>>> + >>>> +/* for KVM_SET_GUEST_DEBUG */ >>>> +struct kvm_guest_debug_arch { >>>> +}; >>>> + >>>> +/* definition of registers in kvm_run */ >>>> +struct kvm_sync_regs { >>>> +}; >>>> + >>>> +/* dummy definition */ >>>> +struct kvm_sregs { >>>> +}; >>>> + >>>> +struct kvm_iocsr_entry { >>>> + __u32 addr; >>>> + __u32 pad; >>>> + __u64 data; >>>> +}; >>>> + >>>> +#define KVM_NR_IRQCHIPS 1 >>>> +#define KVM_IRQCHIP_NUM_PINS 64 >>>> +#define KVM_MAX_CORES 256 >>>> + >>>> +#endif /* __UAPI_ASM_LOONGARCH_KVM_H */ >>>> diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h >>>> index 13065dd961..863f84619a 100644 >>>> --- a/include/uapi/linux/kvm.h >>>> +++ b/include/uapi/linux/kvm.h >>>> @@ -264,6 +264,7 @@ struct kvm_xen_exit { >>>> #define KVM_EXIT_RISCV_SBI 35 >>>> #define KVM_EXIT_RISCV_CSR 36 >>>> #define KVM_EXIT_NOTIFY 37 >>>> +#define KVM_EXIT_LOONGARCH_IOCSR 38 >>>> >>>> /* For KVM_EXIT_INTERNAL_ERROR */ >>>> /* Emulate instruction failed. */ >>>> @@ -336,6 +337,13 @@ struct kvm_run { >>>> __u32 len; >>>> __u8 is_write; >>>> } mmio; >>>> + /* KVM_EXIT_LOONGARCH_IOCSR */ >>>> + struct { >>>> + __u64 phys_addr; >>>> + __u8 data[8]; >>>> + __u32 len; >>>> + __u8 is_write; >>>> + } iocsr_io; >>>> /* KVM_EXIT_HYPERCALL */ >>>> struct { >>>> __u64 nr; >>>> @@ -1362,6 +1370,7 @@ struct kvm_dirty_tlb { >>>> #define KVM_REG_ARM64 0x6000000000000000ULL >>>> #define KVM_REG_MIPS 0x7000000000000000ULL >>>> #define KVM_REG_RISCV 0x8000000000000000ULL >>>> +#define KVM_REG_LOONGARCH 0x9000000000000000ULL >>>> >>>> #define KVM_REG_SIZE_SHIFT 52 >>>> #define KVM_REG_SIZE_MASK 0x00f0000000000000ULL >>>> -- >>>> 2.39.1 >>>> >>