diff options
Diffstat (limited to 'arch/s390/include/asm/processor.h')
| -rw-r--r-- | arch/s390/include/asm/processor.h | 46 | 
1 files changed, 42 insertions, 4 deletions
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index e98d9650764b..dc17896a001a 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h @@ -99,7 +99,6 @@ void cpu_detect_mhz_feature(void);  extern const struct seq_operations cpuinfo_op;  extern void execve_tail(void); -extern void __bpon(void);  unsigned long vdso_size(void);  /* @@ -119,6 +118,41 @@ unsigned long vdso_size(void);  #define HAVE_ARCH_PICK_MMAP_LAYOUT +#define __stackleak_poison __stackleak_poison +static __always_inline void __stackleak_poison(unsigned long erase_low, +					       unsigned long erase_high, +					       unsigned long poison) +{ +	unsigned long tmp, count; + +	count = erase_high - erase_low; +	if (!count) +		return; +	asm volatile( +		"	cghi	%[count],8\n" +		"	je	2f\n" +		"	aghi	%[count],-(8+1)\n" +		"	srlg	%[tmp],%[count],8\n" +		"	ltgr	%[tmp],%[tmp]\n" +		"	jz	1f\n" +		"0:	stg	%[poison],0(%[addr])\n" +		"	mvc	8(256-8,%[addr]),0(%[addr])\n" +		"	la	%[addr],256(%[addr])\n" +		"	brctg	%[tmp],0b\n" +		"1:	stg	%[poison],0(%[addr])\n" +		"	larl	%[tmp],3f\n" +		"	ex	%[count],0(%[tmp])\n" +		"	j	4f\n" +		"2:	stg	%[poison],0(%[addr])\n" +		"	j	4f\n" +		"3:	mvc	8(1,%[addr]),0(%[addr])\n" +		"4:\n" +		: [addr] "+&a" (erase_low), [count] "+&d" (count), [tmp] "=&a" (tmp) +		: [poison] "d" (poison) +		: "memory", "cc" +		); +} +  /*   * Thread structure   */ @@ -227,6 +261,13 @@ static __always_inline unsigned long __current_stack_pointer(void)  	return sp;  } +static __always_inline bool on_thread_stack(void) +{ +	unsigned long ksp = S390_lowcore.kernel_stack; + +	return !((ksp ^ current_stack_pointer) & ~(THREAD_SIZE - 1)); +} +  static __always_inline unsigned short stap(void)  {  	unsigned short cpu_address; @@ -329,9 +370,6 @@ static __always_inline void __noreturn disabled_wait(void)  #define ARCH_LOW_ADDRESS_LIMIT	0x7fffffffUL -extern int s390_isolate_bp(void); -extern int s390_isolate_bp_guest(void); -  static __always_inline bool regs_irqs_disabled(struct pt_regs *regs)  {  	return arch_irqs_disabled_flags(regs->psw.mask);  |