diff options
Diffstat (limited to 'arch/s390/include/asm/system.h')
| -rw-r--r-- | arch/s390/include/asm/system.h | 24 | 
1 files changed, 18 insertions, 6 deletions
diff --git a/arch/s390/include/asm/system.h b/arch/s390/include/asm/system.h index 819e7d99ca0c..024ef42ed6d7 100644 --- a/arch/s390/include/asm/system.h +++ b/arch/s390/include/asm/system.h @@ -12,6 +12,7 @@  #define __ASM_SYSTEM_H  #include <linux/kernel.h> +#include <linux/errno.h>  #include <asm/types.h>  #include <asm/ptrace.h>  #include <asm/setup.h> @@ -98,13 +99,9 @@ static inline void restore_access_regs(unsigned int *acrs)  	prev = __switch_to(prev,next);					     \  } while (0) -#ifdef CONFIG_VIRT_CPU_ACCOUNTING  extern void account_vtime(struct task_struct *);  extern void account_tick_vtime(struct task_struct *);  extern void account_system_vtime(struct task_struct *); -#else -#define account_vtime(x) do { /* empty */ } while (0) -#endif  #ifdef CONFIG_PFAULT  extern void pfault_irq_init(void); @@ -413,8 +410,6 @@ __set_psw_mask(unsigned long mask)  #define local_mcck_enable()  __set_psw_mask(psw_kernel_bits)  #define local_mcck_disable() __set_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK) -int stfle(unsigned long long *list, int doublewords); -  #ifdef CONFIG_SMP  extern void smp_ctl_set_bit(int cr, int bit); @@ -438,6 +433,23 @@ static inline unsigned int stfl(void)  	return S390_lowcore.stfl_fac_list;  } +static inline int __stfle(unsigned long long *list, int doublewords) +{ +	typedef struct { unsigned long long _[doublewords]; } addrtype; +	register unsigned long __nr asm("0") = doublewords - 1; + +	asm volatile(".insn s,0xb2b00000,%0" /* stfle */ +		     : "=m" (*(addrtype *) list), "+d" (__nr) : : "cc"); +	return __nr + 1; +} + +static inline int stfle(unsigned long long *list, int doublewords) +{ +	if (!(stfl() & (1UL << 24))) +		return -EOPNOTSUPP; +	return __stfle(list, doublewords); +} +  static inline unsigned short stap(void)  {  	unsigned short cpu_address;  | 
