aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2013-01-17 07:31:45 -0500
committerCatalin Marinas <catalin.marinas@arm.com>2013-02-11 13:24:18 -0500
commitec45d1cfd3cb65121fc52f39efc17d832f4f7b91 (patch)
treef588db6111ee97aeddd69e05646cd49c31b353a0
parent3a0310eb369aae985d6409d8ff1340146578e5c1 (diff)
arm64: mm: update CONTEXTIDR register to contain PID of current process
This patch is a port of 575320d62 ("ARM: 7445/1: mm: update CONTEXTIDR register to contain PID of current process") from ARM that introduces a new Kconfig option which, when enabled, causes the kernel to write the PID of the current task into the CONTEXTIDR register on context switch. This is useful when analysing hardware trace, since writes to this register can be configured to emit an event into the trace stream. Signed-off-by: Will Deacon <will.deacon@arm.com> [catalin.marinas@arm.com: contextidr_thread_switch() moved to mmu_context.h] Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
-rw-r--r--arch/arm64/Kconfig.debug8
-rw-r--r--arch/arm64/include/asm/mmu_context.h15
-rw-r--r--arch/arm64/kernel/process.c4
3 files changed, 26 insertions, 1 deletions
diff --git a/arch/arm64/Kconfig.debug b/arch/arm64/Kconfig.debug
index 79871cd78da8..51493430f142 100644
--- a/arch/arm64/Kconfig.debug
+++ b/arch/arm64/Kconfig.debug
@@ -33,4 +33,12 @@ config EARLY_PRINTK
33 is assumed that the early console device has been initialised 33 is assumed that the early console device has been initialised
34 by the boot loader prior to starting the Linux kernel. 34 by the boot loader prior to starting the Linux kernel.
35 35
36config PID_IN_CONTEXTIDR
37 bool "Write the current PID to the CONTEXTIDR register"
38 help
39 Enabling this option causes the kernel to write the current PID to
40 the CONTEXTIDR register, at the expense of some additional
41 instructions during context switch. Say Y here only if you are
42 planning to use hardware trace tools with this kernel.
43
36endmenu 44endmenu
diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h
index f68465dee026..e2bc385adb6b 100644
--- a/arch/arm64/include/asm/mmu_context.h
+++ b/arch/arm64/include/asm/mmu_context.h
@@ -35,6 +35,21 @@ extern unsigned int cpu_last_asid;
35void __init_new_context(struct task_struct *tsk, struct mm_struct *mm); 35void __init_new_context(struct task_struct *tsk, struct mm_struct *mm);
36void __new_context(struct mm_struct *mm); 36void __new_context(struct mm_struct *mm);
37 37
38#ifdef CONFIG_PID_IN_CONTEXTIDR
39static inline void contextidr_thread_switch(struct task_struct *next)
40{
41 asm(
42 " msr contextidr_el1, %0\n"
43 " isb"
44 :
45 : "r" (task_pid_nr(next)));
46}
47#else
48static inline void contextidr_thread_switch(struct task_struct *next)
49{
50}
51#endif
52
38/* 53/*
39 * Set TTBR0 to empty_zero_page. No translations will be possible via TTBR0. 54 * Set TTBR0 to empty_zero_page. No translations will be possible via TTBR0.
40 */ 55 */
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index cb0956bc96ed..a8fbd7eaa2ed 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -45,9 +45,10 @@
45 45
46#include <asm/compat.h> 46#include <asm/compat.h>
47#include <asm/cacheflush.h> 47#include <asm/cacheflush.h>
48#include <asm/fpsimd.h>
49#include <asm/mmu_context.h>
48#include <asm/processor.h> 50#include <asm/processor.h>
49#include <asm/stacktrace.h> 51#include <asm/stacktrace.h>
50#include <asm/fpsimd.h>
51 52
52static void setup_restart(void) 53static void setup_restart(void)
53{ 54{
@@ -319,6 +320,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
319 /* the actual thread switch */ 320 /* the actual thread switch */
320 last = cpu_switch_to(prev, next); 321 last = cpu_switch_to(prev, next);
321 322
323 contextidr_thread_switch(next);
322 return last; 324 return last;
323} 325}
324 326