summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCatalin Marinas <catalin.marinas@arm.com>2016-02-18 15:50:04 +0000
committerJeff Vander Stoep <jeffv@google.com>2016-09-22 13:38:22 -0700
commitc39e2026d6c2daef475d66cc0656769f93b42fc4 (patch)
tree62cac1923dc7ecc59071374053d8bf4c2e97cafc
parent612055f383a023e12042f75d6d951e76ee4c5748 (diff)
UPSTREAM: arm64: Remove the get_thread_info() function
This function was introduced by previous commits implementing UAO. However, it can be replaced with task_thread_info() in uao_thread_switch() or get_fs() in do_page_fault() (the latter being called only on the current context, so no need for using the saved pt_regs). Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Bug: 30369029 Patchset: kaslr-arm64-4.4 (cherry picked from commit e950631e84e7e38892ffbeee5e1816b270026b0e) Signed-off-by: Jeff Vander Stoep <jeffv@google.com> Change-Id: Ic6e9b6af7314fa83d9b0773ae3fac5a2ff34e67a
-rw-r--r--arch/arm64/include/asm/thread_info.h6
-rw-r--r--arch/arm64/kernel/process.c15
-rw-r--r--arch/arm64/mm/fault.c2
3 files changed, 7 insertions, 16 deletions
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index eba8db6838af..abd64bd1f6d9 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -85,12 +85,6 @@ static inline struct thread_info *current_thread_info(void)
return (struct thread_info *)sp_el0;
}
-/* Access struct thread_info of another thread */
-static inline struct thread_info *get_thread_info(unsigned long thread_stack)
-{
- return (struct thread_info *)(thread_stack & ~(THREAD_SIZE - 1));
-}
-
#define thread_saved_pc(tsk) \
((unsigned long)(tsk->thread.cpu_context.pc))
#define thread_saved_sp(tsk) \
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 4431e8364881..6f3fb46170bf 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -381,15 +381,12 @@ static void tls_thread_switch(struct task_struct *next)
/* Restore the UAO state depending on next's addr_limit */
static void uao_thread_switch(struct task_struct *next)
{
- unsigned long next_sp = next->thread.cpu_context.sp;
-
- if (IS_ENABLED(CONFIG_ARM64_UAO) &&
- get_thread_info(next_sp)->addr_limit == KERNEL_DS)
- asm(ALTERNATIVE("nop", SET_PSTATE_UAO(1), ARM64_HAS_UAO,
- CONFIG_ARM64_UAO));
- else
- asm(ALTERNATIVE("nop", SET_PSTATE_UAO(0), ARM64_HAS_UAO,
- CONFIG_ARM64_UAO));
+ if (IS_ENABLED(CONFIG_ARM64_UAO)) {
+ if (task_thread_info(next)->addr_limit == KERNEL_DS)
+ asm(ALTERNATIVE("nop", SET_PSTATE_UAO(1), ARM64_HAS_UAO));
+ else
+ asm(ALTERNATIVE("nop", SET_PSTATE_UAO(0), ARM64_HAS_UAO));
+ }
}
/*
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index d0762a729d01..a8eafeceb08a 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -234,7 +234,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
}
if (permission_fault(esr) && (addr < USER_DS)) {
- if (get_thread_info(regs->sp)->addr_limit == KERNEL_DS)
+ if (get_fs() == KERNEL_DS)
panic("Accessing user space memory with fs=KERNEL_DS");
if (!search_exception_tables(regs->pc))