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

Commit 9e293b5a authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

Merge tag 'nmiforkvm' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into features

Pull kvm patches from Christian Borntraeger:
"s390,kvm: provide plumbing for machines checks when running guests"

This provides the basic plumbing for handling machine checks when
running guests
parents 795c9a51 da72ca4d
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -107,6 +107,20 @@ struct esca_block {
	struct esca_entry cpu[KVM_S390_ESCA_CPU_SLOTS];
} __packed;

/*
 * This struct is used to store some machine check info from lowcore
 * for machine checks that happen while the guest is running.
 * This info in host's lowcore might be overwritten by a second machine
 * check from host when host is in the machine check's high-level handling.
 * The size is 24 bytes.
 */
struct mcck_volatile_info {
	__u64 mcic;
	__u64 failing_storage_address;
	__u32 ext_damage_code;
	__u32 reserved;
};

#define CPUSTAT_STOPPED    0x80000000
#define CPUSTAT_WAIT       0x10000000
#define CPUSTAT_ECALL_PEND 0x08000000
@@ -264,7 +278,8 @@ struct kvm_s390_itdb {

struct sie_page {
	struct kvm_s390_sie_block sie_block;
	__u8 reserved200[1024];		/* 0x0200 */
	struct mcck_volatile_info mcck_info;	/* 0x0200 */
	__u8 reserved218[1000];		/* 0x0218 */
	struct kvm_s390_itdb itdb;	/* 0x0600 */
	__u8 reserved700[2304];		/* 0x0700 */
} __packed;
+7 −0
Original line number Diff line number Diff line
@@ -14,7 +14,14 @@
#include <linux/const.h>
#include <linux/types.h>

#define MCIC_SUBCLASS_MASK	(1ULL<<63 | 1ULL<<62 | 1ULL<<61 | \
				1ULL<<59 | 1ULL<<58 | 1ULL<<56 | \
				1ULL<<55 | 1ULL<<54 | 1ULL<<53 | \
				1ULL<<52 | 1ULL<<47 | 1ULL<<46 | \
				1ULL<<45 | 1ULL<<44)
#define MCCK_CODE_SYSTEM_DAMAGE		_BITUL(63)
#define MCCK_CODE_EXT_DAMAGE		_BITUL(63 - 5)
#define MCCK_CODE_CP			_BITUL(63 - 9)
#define MCCK_CODE_CPU_TIMER_VALID	_BITUL(63 - 46)
#define MCCK_CODE_PSW_MWP_VALID		_BITUL(63 - 20)
#define MCCK_CODE_PSW_IA_VALID		_BITUL(63 - 23)
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#define CIF_FPU			4	/* restore FPU registers */
#define CIF_IGNORE_IRQ		5	/* ignore interrupt (for udelay) */
#define CIF_ENABLED_WAIT	6	/* in enabled wait state */
#define CIF_MCCK_GUEST		7	/* machine check happening in guest */

#define _CIF_MCCK_PENDING	_BITUL(CIF_MCCK_PENDING)
#define _CIF_ASCE_PRIMARY	_BITUL(CIF_ASCE_PRIMARY)
@@ -28,6 +29,7 @@
#define _CIF_FPU		_BITUL(CIF_FPU)
#define _CIF_IGNORE_IRQ		_BITUL(CIF_IGNORE_IRQ)
#define _CIF_ENABLED_WAIT	_BITUL(CIF_ENABLED_WAIT)
#define _CIF_MCCK_GUEST		_BITUL(CIF_MCCK_GUEST)

#ifndef __ASSEMBLY__

+3 −0
Original line number Diff line number Diff line
@@ -58,6 +58,9 @@ int main(void)
	OFFSET(__SF_BACKCHAIN, stack_frame, back_chain);
	OFFSET(__SF_GPRS, stack_frame, gprs);
	OFFSET(__SF_EMPTY, stack_frame, empty1);
	OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[0]);
	OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[1]);
	OFFSET(__SF_SIE_REASON, stack_frame, empty1[2]);
	BLANK();
	/* timeval/timezone offsets for use by vdso */
	OFFSET(__VDSO_UPD_COUNT, vdso_data, tb_update_count);
+12 −1
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ ENTRY(sie64a)
	jnz	.Lsie_skip
	TSTMSK	__LC_CPU_FLAGS,_CIF_FPU
	jo	.Lsie_skip			# exit if fp/vx regs changed
.Lsie_entry:
	sie	0(%r14)
.Lsie_skip:
	ni	__SIE_PROG0C+3(%r14),0xfe	# no longer in SIE
@@ -1122,7 +1123,13 @@ cleanup_critical:
	.quad	.Lsie_done

.Lcleanup_sie:
	lg	%r9,__SF_EMPTY(%r15)		# get control block pointer
	cghi    %r11,__LC_SAVE_AREA_ASYNC 	#Is this in normal interrupt?
	je      1f
	slg     %r9,BASED(.Lsie_crit_mcck_start)
	clg     %r9,BASED(.Lsie_crit_mcck_length)
	jh      1f
	oi      __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST
1:	lg	%r9,__SF_EMPTY(%r15)		# get control block pointer
	ni	__SIE_PROG0C+3(%r9),0xfe	# no longer in SIE
	lctlg	%c1,%c1,__LC_USER_ASCE		# load primary asce
	larl	%r9,sie_exit			# skip forward to sie_exit
@@ -1307,6 +1314,10 @@ cleanup_critical:
	.quad	.Lsie_gmap
.Lsie_critical_length:
	.quad	.Lsie_done - .Lsie_gmap
.Lsie_crit_mcck_start:
	.quad   .Lsie_entry
.Lsie_crit_mcck_length:
	.quad   .Lsie_skip - .Lsie_entry
#endif

	.section .rodata, "a"
Loading