Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec45d1cf authored by Will Deacon's avatar Will Deacon Committed by Catalin Marinas
Browse files

arm64: mm: update CONTEXTIDR register to contain PID of current process



This patch is a port of 575320d6 ("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: default avatarWill Deacon <will.deacon@arm.com>
[catalin.marinas@arm.com: contextidr_thread_switch() moved to mmu_context.h]
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 3a0310eb
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -33,4 +33,12 @@ config EARLY_PRINTK
	  is assumed that the early console device has been initialised
	  by the boot loader prior to starting the Linux kernel.

config PID_IN_CONTEXTIDR
	bool "Write the current PID to the CONTEXTIDR register"
	help
	  Enabling this option causes the kernel to write the current PID to
	  the CONTEXTIDR register, at the expense of some additional
	  instructions during context switch. Say Y here only if you are
	  planning to use hardware trace tools with this kernel.

endmenu
+15 −0
Original line number Diff line number Diff line
@@ -35,6 +35,21 @@ extern unsigned int cpu_last_asid;
void __init_new_context(struct task_struct *tsk, struct mm_struct *mm);
void __new_context(struct mm_struct *mm);

#ifdef CONFIG_PID_IN_CONTEXTIDR
static inline void contextidr_thread_switch(struct task_struct *next)
{
	asm(
	"	msr	contextidr_el1, %0\n"
	"	isb"
	:
	: "r" (task_pid_nr(next)));
}
#else
static inline void contextidr_thread_switch(struct task_struct *next)
{
}
#endif

/*
 * Set TTBR0 to empty_zero_page. No translations will be possible via TTBR0.
 */
+3 −1
Original line number Diff line number Diff line
@@ -45,9 +45,10 @@

#include <asm/compat.h>
#include <asm/cacheflush.h>
#include <asm/fpsimd.h>
#include <asm/mmu_context.h>
#include <asm/processor.h>
#include <asm/stacktrace.h>
#include <asm/fpsimd.h>

static void setup_restart(void)
{
@@ -319,6 +320,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
	/* the actual thread switch */
	last = cpu_switch_to(prev, next);

	contextidr_thread_switch(next);
	return last;
}