Contributors: 16
Author Tokens Token Proportion Commits Commit Proportion
Heiko Carstens 570 69.60% 18 48.65%
Martin Schwidefsky 80 9.77% 3 8.11%
David Howells 44 5.37% 1 2.70%
David Hildenbrand 33 4.03% 1 2.70%
Alexander Gordeev 30 3.66% 1 2.70%
Thomas Richter 20 2.44% 2 5.41%
Christian Bornträger 17 2.08% 1 2.70%
Vasily Gorbik 7 0.85% 2 5.41%
Janis Schoetterl-Glausch 6 0.73% 1 2.70%
Michael Holzheu 3 0.37% 1 2.70%
Linus Torvalds (pre-git) 2 0.24% 1 2.70%
Guenter Roeck 2 0.24% 1 2.70%
Linus Torvalds 2 0.24% 1 2.70%
Masahiro Yamada 1 0.12% 1 2.70%
Greg Kroah-Hartman 1 0.12% 1 2.70%
Hans-Joachim Picht 1 0.12% 1 2.70%
Total 819 37


/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright IBM Corp. 1999, 2009
 *
 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
 */

#ifndef __ASM_S390_CTLREG_H
#define __ASM_S390_CTLREG_H

#include <linux/bits.h>

#define CR0_TRANSACTIONAL_EXECUTION_BIT		(63 - 8)
#define CR0_CLOCK_COMPARATOR_SIGN_BIT		(63 - 10)
#define CR0_CRYPTOGRAPHY_COUNTER_BIT		(63 - 13)
#define CR0_PAI_EXTENSION_BIT			(63 - 14)
#define CR0_CPUMF_EXTRACTION_AUTH_BIT		(63 - 15)
#define CR0_WARNING_TRACK_BIT			(63 - 30)
#define CR0_LOW_ADDRESS_PROTECTION_BIT		(63 - 35)
#define CR0_FETCH_PROTECTION_OVERRIDE_BIT	(63 - 38)
#define CR0_STORAGE_PROTECTION_OVERRIDE_BIT	(63 - 39)
#define CR0_EDAT_BIT				(63 - 40)
#define CR0_INSTRUCTION_EXEC_PROTECTION_BIT	(63 - 43)
#define CR0_VECTOR_BIT				(63 - 46)
#define CR0_MALFUNCTION_ALERT_SUBMASK_BIT	(63 - 48)
#define CR0_EMERGENCY_SIGNAL_SUBMASK_BIT	(63 - 49)
#define CR0_EXTERNAL_CALL_SUBMASK_BIT		(63 - 50)
#define CR0_CLOCK_COMPARATOR_SUBMASK_BIT	(63 - 52)
#define CR0_CPU_TIMER_SUBMASK_BIT		(63 - 53)
#define CR0_SERVICE_SIGNAL_SUBMASK_BIT		(63 - 54)
#define CR0_UNUSED_56_BIT			(63 - 56)
#define CR0_INTERRUPT_KEY_SUBMASK_BIT		(63 - 57)
#define CR0_MEASUREMENT_ALERT_SUBMASK_BIT	(63 - 58)
#define CR0_ETR_SUBMASK_BIT			(63 - 59)
#define CR0_IUCV_BIT				(63 - 62)

#define CR0_TRANSACTIONAL_EXECUTION		BIT(CR0_TRANSACTIONAL_EXECUTION_BIT)
#define CR0_CLOCK_COMPARATOR_SIGN		BIT(CR0_CLOCK_COMPARATOR_SIGN_BIT)
#define CR0_CRYPTOGRAPHY_COUNTER		BIT(CR0_CRYPTOGRAPHY_COUNTER_BIT)
#define CR0_PAI_EXTENSION			BIT(CR0_PAI_EXTENSION_BIT)
#define CR0_CPUMF_EXTRACTION_AUTH		BIT(CR0_CPUMF_EXTRACTION_AUTH_BIT)
#define CR0_WARNING_TRACK			BIT(CR0_WARNING_TRACK_BIT)
#define CR0_LOW_ADDRESS_PROTECTION		BIT(CR0_LOW_ADDRESS_PROTECTION_BIT)
#define CR0_FETCH_PROTECTION_OVERRIDE		BIT(CR0_FETCH_PROTECTION_OVERRIDE_BIT)
#define CR0_STORAGE_PROTECTION_OVERRIDE		BIT(CR0_STORAGE_PROTECTION_OVERRIDE_BIT)
#define CR0_EDAT				BIT(CR0_EDAT_BIT)
#define CR0_INSTRUCTION_EXEC_PROTECTION		BIT(CR0_INSTRUCTION_EXEC_PROTECTION_BIT)
#define CR0_VECTOR				BIT(CR0_VECTOR_BIT)
#define CR0_MALFUNCTION_ALERT_SUBMASK		BIT(CR0_MALFUNCTION_ALERT_SUBMASK_BIT)
#define CR0_EMERGENCY_SIGNAL_SUBMASK		BIT(CR0_EMERGENCY_SIGNAL_SUBMASK_BIT)
#define CR0_EXTERNAL_CALL_SUBMASK		BIT(CR0_EXTERNAL_CALL_SUBMASK_BIT)
#define CR0_CLOCK_COMPARATOR_SUBMASK		BIT(CR0_CLOCK_COMPARATOR_SUBMASK_BIT)
#define CR0_CPU_TIMER_SUBMASK			BIT(CR0_CPU_TIMER_SUBMASK_BIT)
#define CR0_SERVICE_SIGNAL_SUBMASK		BIT(CR0_SERVICE_SIGNAL_SUBMASK_BIT)
#define CR0_UNUSED_56				BIT(CR0_UNUSED_56_BIT)
#define CR0_INTERRUPT_KEY_SUBMASK		BIT(CR0_INTERRUPT_KEY_SUBMASK_BIT)
#define CR0_MEASUREMENT_ALERT_SUBMASK		BIT(CR0_MEASUREMENT_ALERT_SUBMASK_BIT)
#define CR0_ETR_SUBMASK				BIT(CR0_ETR_SUBMASK_BIT)
#define CR0_IUCV				BIT(CR0_IUCV_BIT)

#define CR2_MIO_ADDRESSING_BIT			(63 - 58)
#define CR2_GUARDED_STORAGE_BIT			(63 - 59)

#define CR2_MIO_ADDRESSING			BIT(CR2_MIO_ADDRESSING_BIT)
#define CR2_GUARDED_STORAGE			BIT(CR2_GUARDED_STORAGE_BIT)

#define CR14_UNUSED_32_BIT			(63 - 32)
#define CR14_UNUSED_33_BIT			(63 - 33)
#define CR14_CHANNEL_REPORT_SUBMASK_BIT		(63 - 35)
#define CR14_RECOVERY_SUBMASK_BIT		(63 - 36)
#define CR14_DEGRADATION_SUBMASK_BIT		(63 - 37)
#define CR14_EXTERNAL_DAMAGE_SUBMASK_BIT	(63 - 38)
#define CR14_WARNING_SUBMASK_BIT		(63 - 39)

#define CR14_UNUSED_32				BIT(CR14_UNUSED_32_BIT)
#define CR14_UNUSED_33				BIT(CR14_UNUSED_33_BIT)
#define CR14_CHANNEL_REPORT_SUBMASK		BIT(CR14_CHANNEL_REPORT_SUBMASK_BIT)
#define CR14_RECOVERY_SUBMASK			BIT(CR14_RECOVERY_SUBMASK_BIT)
#define CR14_DEGRADATION_SUBMASK		BIT(CR14_DEGRADATION_SUBMASK_BIT)
#define CR14_EXTERNAL_DAMAGE_SUBMASK		BIT(CR14_EXTERNAL_DAMAGE_SUBMASK_BIT)
#define CR14_WARNING_SUBMASK			BIT(CR14_WARNING_SUBMASK_BIT)

#ifndef __ASSEMBLY__

#include <linux/bug.h>

struct ctlreg {
	unsigned long val;
};

#define __local_ctl_load(low, high, array) do {				\
	struct addrtype {						\
		char _[sizeof(array)];					\
	};								\
	int _high = high;						\
	int _low = low;							\
	int _esize;							\
									\
	_esize = (_high - _low + 1) * sizeof(struct ctlreg);		\
	BUILD_BUG_ON(sizeof(struct addrtype) != _esize);		\
	typecheck(struct ctlreg, array[0]);				\
	asm volatile(							\
		"	lctlg	%[_low],%[_high],%[_arr]\n"		\
		:							\
		: [_arr] "Q" (*(struct addrtype *)(&array)),		\
		  [_low] "i" (low), [_high] "i" (high)			\
		: "memory");						\
} while (0)

#define __local_ctl_store(low, high, array) do {			\
	struct addrtype {						\
		char _[sizeof(array)];					\
	};								\
	int _high = high;						\
	int _low = low;							\
	int _esize;							\
									\
	_esize = (_high - _low + 1) * sizeof(struct ctlreg);		\
	BUILD_BUG_ON(sizeof(struct addrtype) != _esize);		\
	typecheck(struct ctlreg, array[0]);				\
	asm volatile(							\
		"	stctg	%[_low],%[_high],%[_arr]\n"		\
		: [_arr] "=Q" (*(struct addrtype *)(&array))		\
		: [_low] "i" (low), [_high] "i" (high));		\
} while (0)

static __always_inline void local_ctl_load(unsigned int cr, struct ctlreg *reg)
{
	asm volatile(
		"	lctlg	%[cr],%[cr],%[reg]\n"
		:
		: [reg] "Q" (*reg), [cr] "i" (cr)
		: "memory");
}

static __always_inline void local_ctl_store(unsigned int cr, struct ctlreg *reg)
{
	asm volatile(
		"	stctg	%[cr],%[cr],%[reg]\n"
		: [reg] "=Q" (*reg)
		: [cr] "i" (cr));
}

static __always_inline struct ctlreg local_ctl_set_bit(unsigned int cr, unsigned int bit)
{
	struct ctlreg new, old;

	local_ctl_store(cr, &old);
	new = old;
	new.val |= 1UL << bit;
	local_ctl_load(cr, &new);
	return old;
}

static __always_inline struct ctlreg local_ctl_clear_bit(unsigned int cr, unsigned int bit)
{
	struct ctlreg new, old;

	local_ctl_store(cr, &old);
	new = old;
	new.val &= ~(1UL << bit);
	local_ctl_load(cr, &new);
	return old;
}

struct lowcore;

void system_ctlreg_lock(void);
void system_ctlreg_unlock(void);
void system_ctlreg_init_save_area(struct lowcore *lc);
void system_ctlreg_modify(unsigned int cr, unsigned long data, int request);

enum {
	CTLREG_SET_BIT,
	CTLREG_CLEAR_BIT,
	CTLREG_LOAD,
};

static inline void system_ctl_set_bit(unsigned int cr, unsigned int bit)
{
	system_ctlreg_modify(cr, bit, CTLREG_SET_BIT);
}

static inline void system_ctl_clear_bit(unsigned int cr, unsigned int bit)
{
	system_ctlreg_modify(cr, bit, CTLREG_CLEAR_BIT);
}

static inline void system_ctl_load(unsigned int cr, struct ctlreg *reg)
{
	system_ctlreg_modify(cr, reg->val, CTLREG_LOAD);
}

union ctlreg0 {
	unsigned long val;
	struct ctlreg reg;
	struct {
		unsigned long	   : 8;
		unsigned long tcx  : 1;	/* Transactional-Execution control */
		unsigned long pifo : 1;	/* Transactional-Execution Program-
					   Interruption-Filtering Override */
		unsigned long	   : 3;
		unsigned long ccc  : 1; /* Cryptography counter control */
		unsigned long pec  : 1; /* PAI extension control */
		unsigned long	   : 17;
		unsigned long	   : 3;
		unsigned long lap  : 1; /* Low-address-protection control */
		unsigned long	   : 4;
		unsigned long edat : 1; /* Enhanced-DAT-enablement control */
		unsigned long	   : 2;
		unsigned long iep  : 1; /* Instruction-Execution-Protection */
		unsigned long	   : 1;
		unsigned long afp  : 1; /* AFP-register control */
		unsigned long vx   : 1; /* Vector enablement control */
		unsigned long	   : 7;
		unsigned long sssm : 1; /* Service signal subclass mask */
		unsigned long	   : 9;
	};
};

union ctlreg2 {
	unsigned long val;
	struct ctlreg reg;
	struct {
		unsigned long	    : 33;
		unsigned long ducto : 25;
		unsigned long	    : 1;
		unsigned long gse   : 1;
		unsigned long	    : 1;
		unsigned long tds   : 1;
		unsigned long tdc   : 2;
	};
};

union ctlreg5 {
	unsigned long val;
	struct ctlreg reg;
	struct {
		unsigned long	    : 33;
		unsigned long pasteo: 25;
		unsigned long	    : 6;
	};
};

union ctlreg15 {
	unsigned long val;
	struct ctlreg reg;
	struct {
		unsigned long lsea  : 61;
		unsigned long	    : 3;
	};
};

#endif /* __ASSEMBLY__ */
#endif /* __ASM_S390_CTLREG_H */