lkml.org 
[lkml]   [2021]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v7 01/15] KVM: arm64: selftests: Add MMIO readl/writel support
    From
    Define the readl() and writel() functions for the guests to
    access (4-byte) the MMIO region.

    The routines, and their dependents, are inspired from the kernel's
    arch/arm64/include/asm/io.h and arch/arm64/include/asm/barrier.h.

    Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
    Reviewed-by: Oliver Upton <oupton@google.com>
    Reviewed-by: Andrew Jones <drjones@redhat.com>
    ---
    .../selftests/kvm/include/aarch64/processor.h | 46 ++++++++++++++++++-
    1 file changed, 45 insertions(+), 1 deletion(-)

    diff --git a/tools/testing/selftests/kvm/include/aarch64/processor.h b/tools/testing/selftests/kvm/include/aarch64/processor.h
    index c0273aefa63d..96578bd46a85 100644
    --- a/tools/testing/selftests/kvm/include/aarch64/processor.h
    +++ b/tools/testing/selftests/kvm/include/aarch64/processor.h
    @@ -9,6 +9,7 @@

    #include "kvm_util.h"
    #include <linux/stringify.h>
    +#include <linux/types.h>


    #define ARM64_CORE_REG(x) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \
    @@ -130,6 +131,49 @@ void vm_install_sync_handler(struct kvm_vm *vm,
    val; \
    })

    -#define isb() asm volatile("isb" : : : "memory")
    +#define isb() asm volatile("isb" : : : "memory")
    +#define dsb(opt) asm volatile("dsb " #opt : : : "memory")
    +#define dmb(opt) asm volatile("dmb " #opt : : : "memory")
    +
    +#define dma_wmb() dmb(oshst)
    +#define __iowmb() dma_wmb()
    +
    +#define dma_rmb() dmb(oshld)
    +
    +#define __iormb(v) \
    +({ \
    + unsigned long tmp; \
    + \
    + dma_rmb(); \
    + \
    + /* \
    + * Courtesy of arch/arm64/include/asm/io.h: \
    + * Create a dummy control dependency from the IO read to any \
    + * later instructions. This ensures that a subsequent call \
    + * to udelay() will be ordered due to the ISB in __delay(). \
    + */ \
    + asm volatile("eor %0, %1, %1\n" \
    + "cbnz %0, ." \
    + : "=r" (tmp) : "r" ((unsigned long)(v)) \
    + : "memory"); \
    +})
    +
    +static __always_inline void __raw_writel(u32 val, volatile void *addr)
    +{
    + asm volatile("str %w0, [%1]" : : "rZ" (val), "r" (addr));
    +}
    +
    +static __always_inline u32 __raw_readl(const volatile void *addr)
    +{
    + u32 val;
    + asm volatile("ldr %w0, [%1]" : "=r" (val) : "r" (addr));
    + return val;
    +}
    +
    +#define writel_relaxed(v,c) ((void)__raw_writel((__force u32)cpu_to_le32(v),(c)))
    +#define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32)__raw_readl(c)); __r; })
    +
    +#define writel(v,c) ({ __iowmb(); writel_relaxed((v),(c));})
    +#define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(__v); __v; })

    #endif /* SELFTEST_KVM_PROCESSOR_H */
    --
    2.33.0.309.g3052b89438-goog
    \
     
     \ /
      Last update: 2021-09-15 00:33    [W:4.023 / U:0.400 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site