Commit 062e5279 authored by Heiko Carstens's avatar Heiko Carstens
Browse files

s390/mm: add debug user asce support



Verify on exit to user space that always
- the primary ASCE (cr1) is set to kernel ASCE
- the secondary ASCE (cr7) is set to user ASCE

If this is not the case: panic since something went terribly wrong.

Reviewed-by: default avatarSven Schnelle <svens@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 0290c9e3
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -5,3 +5,11 @@ config TRACE_IRQFLAGS_SUPPORT

config EARLY_PRINTK
	def_bool y

config DEBUG_USER_ASCE
	bool "Debug User ASCE"
	help
	  Check on exit to user space that address space control
	  elements are setup correctly.

	  If unsure, say N.
+1 −0
Original line number Diff line number Diff line
@@ -826,6 +826,7 @@ CONFIG_FTRACE_SYSCALLS=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_HIST_TRIGGERS=y
CONFIG_DEBUG_USER_ASCE=y
CONFIG_NOTIFIER_ERROR_INJECTION=m
CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m
CONFIG_FAULT_INJECTION=y
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@
#include <asm/extable.h>
#include <asm/facility.h>

void debug_user_asce(void);

static inline int __range_ok(unsigned long addr, unsigned long size)
{
	return 1;
+8 −0
Original line number Diff line number Diff line
@@ -90,6 +90,12 @@ _LPP_OFFSET = __LC_LPP
#endif
	.endm

	.macro	DEBUG_USER_ASCE
#ifdef CONFIG_DEBUG_USER_ASCE
	brasl	%r14,debug_user_asce
#endif
	.endm

	.macro	CHECK_VMAP_STACK savearea,oklabel
#ifdef CONFIG_VMAP_STACK
	lgr	%r14,%r15
@@ -428,6 +434,7 @@ ENTRY(system_call)
	jnz	.Lsysc_work
	TSTMSK	__TI_flags(%r12),_TIF_WORK
	jnz	.Lsysc_work			# check for work
	DEBUG_USER_ASCE
	lctlg	%c1,%c1,__LC_USER_ASCE
	BPEXIT	__TI_flags(%r12),_TIF_ISOLATE_BP
	TSTMSK	__LC_CPU_FLAGS, _CIF_FPU
@@ -793,6 +800,7 @@ ENTRY(io_int_handler)
	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r11)
	tm	__PT_PSW+1(%r11),0x01	# returning to user ?
	jno	.Lio_exit_kernel
	DEBUG_USER_ASCE
	lctlg	%c1,%c1,__LC_USER_ASCE
	BPEXIT	__TI_flags(%r12),_TIF_ISOLATE_BP
	stpt	__LC_EXIT_TIMER
+16 −0
Original line number Diff line number Diff line
@@ -16,6 +16,22 @@
#include <asm/mmu_context.h>
#include <asm/facility.h>

#ifdef CONFIG_DEBUG_USER_ASCE
void debug_user_asce(void)
{
	unsigned long cr1, cr7;

	__ctl_store(cr1, 1, 1);
	__ctl_store(cr7, 7, 7);
	if (cr1 == S390_lowcore.kernel_asce && cr7 == S390_lowcore.user_asce)
		return;
	panic("incorrect ASCE on kernel exit\n"
	      "cr1:    %016lx cr7:  %016lx\n"
	      "kernel: %016llx user: %016llx\n",
	      cr1, cr7, S390_lowcore.kernel_asce, S390_lowcore.user_asce);
}
#endif /*CONFIG_DEBUG_USER_ASCE */

#ifndef CONFIG_HAVE_MARCH_Z10_FEATURES
static DEFINE_STATIC_KEY_FALSE(have_mvcos);