x86: Share definition of __is_canonical_address()
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 31 Jan 2022 07:24:50 +0000 (09:24 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 2 Feb 2022 12:11:42 +0000 (13:11 +0100)
Reduce code duplication by moving canonical address code to a common header
file.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220131072453.2839535-3-adrian.hunter@intel.com
arch/x86/events/intel/pt.c
arch/x86/include/asm/page.h
arch/x86/kvm/emulate.c
arch/x86/kvm/x86.c
arch/x86/kvm/x86.h
arch/x86/mm/maccess.c

index 0ebcf9a56f97a6bc645e7b76b54e381a3098fb28..93676a5b66dba0ac9fe7460d3428ebf4d531cbdf 100644 (file)
@@ -1350,20 +1350,10 @@ static void pt_addr_filters_fini(struct perf_event *event)
 }
 
 #ifdef CONFIG_X86_64
-static u64 canonical_address(u64 vaddr, u8 vaddr_bits)
-{
-       return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
-}
-
-static u64 is_canonical_address(u64 vaddr, u8 vaddr_bits)
-{
-       return canonical_address(vaddr, vaddr_bits) == vaddr;
-}
-
 /* Clamp to a canonical address greater-than-or-equal-to the address given */
 static u64 clamp_to_ge_canonical_addr(u64 vaddr, u8 vaddr_bits)
 {
-       return is_canonical_address(vaddr, vaddr_bits) ?
+       return __is_canonical_address(vaddr, vaddr_bits) ?
               vaddr :
               -BIT_ULL(vaddr_bits - 1);
 }
@@ -1371,7 +1361,7 @@ static u64 clamp_to_ge_canonical_addr(u64 vaddr, u8 vaddr_bits)
 /* Clamp to a canonical address less-than-or-equal-to the address given */
 static u64 clamp_to_le_canonical_addr(u64 vaddr, u8 vaddr_bits)
 {
-       return is_canonical_address(vaddr, vaddr_bits) ?
+       return __is_canonical_address(vaddr, vaddr_bits) ?
               vaddr :
               BIT_ULL(vaddr_bits - 1) - 1;
 }
index 4d5810c8fab74fbf945b7237fdc91fe8034cc2f6..9cc82f305f4bf0862f7b8de0f4c1799e3ee41104 100644 (file)
@@ -71,6 +71,16 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
 extern bool __virt_addr_valid(unsigned long kaddr);
 #define virt_addr_valid(kaddr) __virt_addr_valid((unsigned long) (kaddr))
 
+static __always_inline u64 __canonical_address(u64 vaddr, u8 vaddr_bits)
+{
+       return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
+}
+
+static __always_inline u64 __is_canonical_address(u64 vaddr, u8 vaddr_bits)
+{
+       return __canonical_address(vaddr, vaddr_bits) == vaddr;
+}
+
 #endif /* __ASSEMBLY__ */
 
 #include <asm-generic/memory_model.h>
index 5719d8cfdbd90aff763e306da68262429847f13f..40da8c7f3019ecd8d6ac752d9e4d43ed47d013e0 100644 (file)
@@ -665,7 +665,7 @@ static inline u8 ctxt_virt_addr_bits(struct x86_emulate_ctxt *ctxt)
 static inline bool emul_is_noncanonical_address(u64 la,
                                                struct x86_emulate_ctxt *ctxt)
 {
-       return get_canonical(la, ctxt_virt_addr_bits(ctxt)) != la;
+       return !__is_canonical_address(la, ctxt_virt_addr_bits(ctxt));
 }
 
 /*
@@ -715,7 +715,7 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
        case X86EMUL_MODE_PROT64:
                *linear = la;
                va_bits = ctxt_virt_addr_bits(ctxt);
-               if (get_canonical(la, va_bits) != la)
+               if (!__is_canonical_address(la, va_bits))
                        goto bad;
 
                *max_size = min_t(u64, ~0u, (1ull << va_bits) - la);
index 74b53a16f38a72062a123dd6ce04abd84a8c7264..197209f456a64251b49e21fae00b524531faacc6 100644 (file)
@@ -1735,7 +1735,7 @@ static int __kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data,
                 * value, and that something deterministic happens if the guest
                 * invokes 64-bit SYSENTER.
                 */
-               data = get_canonical(data, vcpu_virt_addr_bits(vcpu));
+               data = __canonical_address(data, vcpu_virt_addr_bits(vcpu));
                break;
        case MSR_TSC_AUX:
                if (!kvm_is_supported_user_return_msr(MSR_TSC_AUX))
index 635b75f9e14540aff2aceb6e4b1c5c3221c444ab..fc4b68ab8d71d57bff061127f65126bb6c15b09a 100644 (file)
@@ -211,14 +211,9 @@ static inline u8 vcpu_virt_addr_bits(struct kvm_vcpu *vcpu)
        return kvm_read_cr4_bits(vcpu, X86_CR4_LA57) ? 57 : 48;
 }
 
-static inline u64 get_canonical(u64 la, u8 vaddr_bits)
-{
-       return ((int64_t)la << (64 - vaddr_bits)) >> (64 - vaddr_bits);
-}
-
 static inline bool is_noncanonical_address(u64 la, struct kvm_vcpu *vcpu)
 {
-       return get_canonical(la, vcpu_virt_addr_bits(vcpu)) != la;
+       return !__is_canonical_address(la, vcpu_virt_addr_bits(vcpu));
 }
 
 static inline void vcpu_cache_mmio_info(struct kvm_vcpu *vcpu,
index 92ec176a729375b993d8c3a2393c7b1489f1b5cd..5a53c2cc169cc9dd49378a6edede18cb756c8b0d 100644 (file)
@@ -4,11 +4,6 @@
 #include <linux/kernel.h>
 
 #ifdef CONFIG_X86_64
-static __always_inline u64 canonical_address(u64 vaddr, u8 vaddr_bits)
-{
-       return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
-}
-
 bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)
 {
        unsigned long vaddr = (unsigned long)unsafe_src;
@@ -19,7 +14,7 @@ bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)
         * we also need to include the userspace guard page.
         */
        return vaddr >= TASK_SIZE_MAX + PAGE_SIZE &&
-              canonical_address(vaddr, boot_cpu_data.x86_virt_bits) == vaddr;
+              __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits);
 }
 #else
 bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)