Messages in this thread Patch in this message | | | From | Changbin Du <> | Subject | [PATCH] x86/mm: determine whether the fault address is canonical | Date | Fri, 4 Oct 2019 21:45:01 +0800 |
| |
We know the answer, so don't ask the user.
Signed-off-by: Changbin Du <changbin.du@gmail.com> --- arch/x86/mm/extable.c | 5 ++++- arch/x86/mm/mm_internal.h | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c index 4d75bc656f97..5196e586756f 100644 --- a/arch/x86/mm/extable.c +++ b/arch/x86/mm/extable.c @@ -8,6 +8,8 @@ #include <asm/traps.h> #include <asm/kdebug.h> +#include "mm_internal.h" + typedef bool (*ex_handler_t)(const struct exception_table_entry *, struct pt_regs *, int, unsigned long, unsigned long); @@ -123,7 +125,8 @@ __visible bool ex_handler_uaccess(const struct exception_table_entry *fixup, unsigned long error_code, unsigned long fault_addr) { - WARN_ONCE(trapnr == X86_TRAP_GP, "General protection fault in user access. Non-canonical address?"); + WARN_ONCE(trapnr == X86_TRAP_GP, "General protection fault at %s address in user access.", + is_canonical_addr(fault_addr) ? "canonical" : "non-canonical"); regs->ip = ex_fixup_addr(fixup); return true; } diff --git a/arch/x86/mm/mm_internal.h b/arch/x86/mm/mm_internal.h index eeae142062ed..4c8a0fdd1c64 100644 --- a/arch/x86/mm/mm_internal.h +++ b/arch/x86/mm/mm_internal.h @@ -2,6 +2,17 @@ #ifndef __X86_MM_INTERNAL_H #define __X86_MM_INTERNAL_H +static inline bool is_canonical_addr(u64 addr) +{ +#ifdef CONFIG_X86_64 + int shift = 64 - boot_cpu_data.x86_phys_bits; + + return ((int64_t)addr << shift >> shift) == addr; +#else + return true; +#endif +} + void *alloc_low_pages(unsigned int num); static inline void *alloc_low_page(void) { -- 2.20.1
| |