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

Commit 2b253857 authored by Marcelo Tosatti's avatar Marcelo Tosatti Committed by Marcelo Tosatti
Browse files

Merge tag 'kvm-s390-next-20150306' of...

Merge tag 'kvm-s390-next-20150306' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into queue

KVM: s390: Features and Fixes for 4.1 (kvm/next)

1. Several Fixes and enhancements
---------------------------------
- These 3 patches have cc stable:
b75f4c9a KVM: s390: Zero out current VMDB of STSI before including level3 data.
261520dc KVM: s390: fix handling of write errors in the tpi handler
15462e37 KVM: s390: reinjection of irqs can fail in the tpi handler

2. SIMD support the kernel part (introduced with z13)
-----------------------------------------------------
- two KVM-generic changes in kvm.h:
1. New capability that can be enabled: KVM_CAP_S390_VECTOR_REGISTERS
2. increased padding size for sync regs in struct kvm_run to clarify that
   sync regs can be larger than 1k. This is fine as this is the last
   element in the structure.
parents 1662e862 13211ea7
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -3248,3 +3248,13 @@ All other orders will be handled completely in user space.
Only privileged operation exceptions will be checked for in the kernel (or even
in the hardware prior to interception). If this capability is not enabled, the
old way of handling SIGP orders is used (partially in kernel and user space).

7.3 KVM_CAP_S390_VECTOR_REGISTERS

Architectures: s390
Parameters: none
Returns: 0 on success, negative value on error

Allows use of the vector registers introduced with z13 processor, and
provides for the synchronization between host and user space.  Will
return -EINVAL if the machine does not support vectors.
+14 −2
Original line number Diff line number Diff line
@@ -172,7 +172,9 @@ struct kvm_s390_sie_block {
	__u32	fac;			/* 0x01a0 */
	__u8	reserved1a4[20];	/* 0x01a4 */
	__u64	cbrlo;			/* 0x01b8 */
	__u8	reserved1c0[30];	/* 0x01c0 */
	__u8	reserved1c0[8];		/* 0x01c0 */
	__u32	ecd;			/* 0x01c8 */
	__u8	reserved1cc[18];	/* 0x01cc */
	__u64	pp;			/* 0x01de */
	__u8	reserved1e6[2];		/* 0x01e6 */
	__u64	itdba;			/* 0x01e8 */
@@ -183,11 +185,17 @@ struct kvm_s390_itdb {
	__u8	data[256];
} __packed;

struct kvm_s390_vregs {
	__vector128 vrs[32];
	__u8	reserved200[512];	/* for future vector expansion */
} __packed;

struct sie_page {
	struct kvm_s390_sie_block sie_block;
	__u8 reserved200[1024];		/* 0x0200 */
	struct kvm_s390_itdb itdb;	/* 0x0600 */
	__u8 reserved700[2304];		/* 0x0700 */
	__u8 reserved700[1280];		/* 0x0700 */
	struct kvm_s390_vregs vregs;	/* 0x0c00 */
} __packed;

struct kvm_vcpu_stat {
@@ -238,6 +246,7 @@ struct kvm_vcpu_stat {
	u32 instruction_sigp_stop;
	u32 instruction_sigp_stop_store_status;
	u32 instruction_sigp_store_status;
	u32 instruction_sigp_store_adtl_status;
	u32 instruction_sigp_arch;
	u32 instruction_sigp_prefix;
	u32 instruction_sigp_restart;
@@ -270,6 +279,7 @@ struct kvm_vcpu_stat {
#define PGM_SPECIAL_OPERATION		0x13
#define PGM_OPERAND			0x15
#define PGM_TRACE_TABEL			0x16
#define PGM_VECTOR_PROCESSING		0x1b
#define PGM_SPACE_SWITCH		0x1c
#define PGM_HFP_SQUARE_ROOT		0x1d
#define PGM_PC_TRANSLATION_SPEC		0x1f
@@ -465,6 +475,7 @@ struct kvm_vcpu_arch {
	s390_fp_regs      host_fpregs;
	unsigned int      host_acrs[NUM_ACRS];
	s390_fp_regs      guest_fpregs;
	struct kvm_s390_vregs	*host_vregs;
	struct kvm_s390_local_interrupt local_int;
	struct hrtimer    ckc_timer;
	struct kvm_s390_pgm_info pgm;
@@ -551,6 +562,7 @@ struct kvm_arch{
	int css_support;
	int use_irqchip;
	int use_cmma;
	int use_vectors;
	int user_cpu_state_ctrl;
	int user_sigp;
	struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
+4 −0
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@ struct kvm_guest_debug_arch {
#define KVM_SYNC_CRS    (1UL << 3)
#define KVM_SYNC_ARCH0  (1UL << 4)
#define KVM_SYNC_PFAULT (1UL << 5)
#define KVM_SYNC_VRS    (1UL << 6)
/* definition of registers in kvm_run */
struct kvm_sync_regs {
	__u64 prefix;	/* prefix register */
@@ -164,6 +165,9 @@ struct kvm_sync_regs {
	__u64 pft;	/* pfault token [PFAULT] */
	__u64 pfs;	/* pfault select [PFAULT] */
	__u64 pfc;	/* pfault compare [PFAULT] */
	__u64 vrs[32][2];	/* vector registers */
	__u8  reserved[512];	/* for future vector expansion */
	__u32 fpc;	/* only valid with vector registers */
};

#define KVM_REG_S390_TODPR	(KVM_REG_S390 | KVM_REG_SIZE_U32 | 0x1)
+2 −2
Original line number Diff line number Diff line
@@ -230,7 +230,7 @@
 * and returns a key, which can be used to find a mnemonic name
 * of the instruction in the icpt_insn_codes table.
 */
#define icpt_insn_decoder(insn)			\
#define icpt_insn_decoder(insn) (		\
	INSN_DECODE_IPA0(0x01, insn, 48, 0xff)	\
	INSN_DECODE_IPA0(0xaa, insn, 48, 0x0f)	\
	INSN_DECODE_IPA0(0xb2, insn, 48, 0xff)	\
@@ -239,6 +239,6 @@
	INSN_DECODE_IPA0(0xe5, insn, 48, 0xff)	\
	INSN_DECODE_IPA0(0xeb, insn, 16, 0xff)	\
	INSN_DECODE_IPA0(0xc8, insn, 48, 0x0f)	\
	INSN_DECODE(insn)
	INSN_DECODE(insn))

#endif /* _UAPI_ASM_S390_SIE_H */
+1 −0
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@ int main(void)
#else /* CONFIG_32BIT */
	DEFINE(__LC_DATA_EXC_CODE, offsetof(struct _lowcore, data_exc_code));
	DEFINE(__LC_MCCK_FAIL_STOR_ADDR, offsetof(struct _lowcore, failing_storage_address));
	DEFINE(__LC_VX_SAVE_AREA_ADDR, offsetof(struct _lowcore, vector_save_area_addr));
	DEFINE(__LC_EXT_PARAMS2, offsetof(struct _lowcore, ext_params2));
	DEFINE(SAVE_AREA_BASE, offsetof(struct _lowcore, floating_pt_save_area));
	DEFINE(__LC_PASTE, offsetof(struct _lowcore, paste));
Loading