lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAAhV-H5TNk-pxVthnau=GgfB=5K9fUQsFnKKKH=VqLaLmENFtA@mail.gmail.com>
Date: Sat, 15 Nov 2025 12:08:28 +0800
From: Huacai Chen <chenhuacai@...nel.org>
To: Bibo Mao <maobibo@...ngson.cn>
Cc: Paolo Bonzini <pbonzini@...hat.com>, Sean Christopherson <seanjc@...gle.com>, 
	Tianrui Zhao <zhaotianrui@...ngson.cn>, Shuah Khan <shuah@...nel.org>, linux-kernel@...r.kernel.org, 
	kvm@...r.kernel.org, loongarch@...ts.linux.dev, 
	linux-kselftest@...r.kernel.org
Subject: Re: [PATCH v2 3/7] KVM: LoongArch: selftests: Add basic interfaces

Hi, Bibo,

On Tue, Nov 4, 2025 at 7:37 PM Bibo Mao <maobibo@...ngson.cn> wrote:
>
> Add some basic function interfaces such as CSR register access,
> local irq enable or disable APIs.
This is "basic interfaces", so better to be before Patch-2 (or keep
the order but change the subject)?

Huacai

>
> Signed-off-by: Bibo Mao <maobibo@...ngson.cn>
> ---
>  .../kvm/include/loongarch/processor.h         | 52 +++++++++++++++++++
>  .../selftests/kvm/lib/loongarch/processor.c   |  5 ++
>  2 files changed, 57 insertions(+)
>
> diff --git a/tools/testing/selftests/kvm/include/loongarch/processor.h b/tools/testing/selftests/kvm/include/loongarch/processor.h
> index a18ac7bff303..b027f8f4dac7 100644
> --- a/tools/testing/selftests/kvm/include/loongarch/processor.h
> +++ b/tools/testing/selftests/kvm/include/loongarch/processor.h
> @@ -118,6 +118,28 @@
>  #define  CSR_TLBREHI_PS_SHIFT          0
>  #define  CSR_TLBREHI_PS                        (0x3fUL << CSR_TLBREHI_PS_SHIFT)
>
> +#define csr_read(csr)                          \
> +({                                             \
> +       register unsigned long __v;             \
> +       __asm__ __volatile__(                   \
> +               "csrrd %[val], %[reg]\n\t"      \
> +               : [val] "=r" (__v)              \
> +               : [reg] "i" (csr)               \
> +               : "memory");                    \
> +       __v;                                    \
> +})
> +
> +#define csr_write(v, csr)                      \
> +({                                             \
> +       register unsigned long __v = v;         \
> +       __asm__ __volatile__ (                  \
> +               "csrwr %[val], %[reg]\n\t"      \
> +               : [val] "+r" (__v)              \
> +               : [reg] "i" (csr)               \
> +               : "memory");                    \
> +       __v;                                    \
> +})
> +
>  #define EXREGS_GPRS                    (32)
>
>  #ifndef __ASSEMBLER__
> @@ -147,6 +169,36 @@ struct handlers {
>  void vm_init_descriptor_tables(struct kvm_vm *vm);
>  void vm_install_exception_handler(struct kvm_vm *vm, int vector, handler_fn handler);
>
> +static inline void local_irq_enable(void)
> +{
> +       unsigned int flags = CSR_CRMD_IE;
> +
> +       register unsigned int mask asm("$t0") = CSR_CRMD_IE;
> +
> +       __asm__ __volatile__(
> +               "csrxchg %[val], %[mask], %[reg]\n\t"
> +               : [val] "+r" (flags)
> +               : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
> +               : "memory");
> +}
> +
> +static inline void local_irq_disable(void)
> +{
> +       unsigned int flags = 0;
> +
> +       register unsigned int mask asm("$t0") = CSR_CRMD_IE;
> +
> +       __asm__ __volatile__(
> +               "csrxchg %[val], %[mask], %[reg]\n\t"
> +               : [val] "+r" (flags)
> +               : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
> +               : "memory");
> +}
> +
> +static inline void cpu_relax(void)
> +{
> +       asm volatile("nop" ::: "memory");
> +}
>  #else
>  #define PC_OFFSET_EXREGS               ((EXREGS_GPRS + 0) * 8)
>  #define ESTAT_OFFSET_EXREGS            ((EXREGS_GPRS + 1) * 8)
> diff --git a/tools/testing/selftests/kvm/lib/loongarch/processor.c b/tools/testing/selftests/kvm/lib/loongarch/processor.c
> index be537c5ff74e..20ba476ccb72 100644
> --- a/tools/testing/selftests/kvm/lib/loongarch/processor.c
> +++ b/tools/testing/selftests/kvm/lib/loongarch/processor.c
> @@ -373,3 +373,8 @@ void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code)
>         regs.pc = (uint64_t)guest_code;
>         vcpu_regs_set(vcpu, &regs);
>  }
> +
> +uint32_t guest_get_vcpuid(void)
> +{
> +       return csr_read(LOONGARCH_CSR_CPUID);
> +}
> --
> 2.39.3
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ