Commit 4ad78b86 authored by Collin Walling's avatar Collin Walling Committed by Martin Schwidefsky
Browse files

s390/setup: set control program code via diag 318



The s390x diagnose 318 instruction sets the control program name code (CPNC)
and control program version code (CPVC) to provide useful information
regarding the OS during debugging. The CPNC is explicitly set to 4 to
indicate a Linux/KVM environment.

The CPVC is a 7-byte value containing:

 - 3-byte Linux version code, currently set to 0
 - 3-byte unique value, currently set to 0
 - 1-byte trailing null

Signed-off-by: default avatarCollin Walling <walling@linux.ibm.com>
Acked-by: default avatarJanosch Frank <frankja@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Message-Id: <1544135405-22385-2-git-send-email-walling@linux.ibm.com>
[set version code to 0 until the structure is fully defined]
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 58661489
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ enum diag_stat_enum {
	DIAG_STAT_X2FC,
	DIAG_STAT_X304,
	DIAG_STAT_X308,
	DIAG_STAT_X318,
	DIAG_STAT_X500,
	NR_DIAG_STAT
};
@@ -293,6 +294,17 @@ struct diag26c_mac_resp {
	u8	res[2];
} __aligned(8);

#define CPNC_LINUX		0x4
union diag318_info {
	unsigned long val;
	struct {
		unsigned int cpnc : 8;
		unsigned int cpvc_linux : 24;
		unsigned char cpvc_distro[3];
		unsigned char zero;
	};
};

int diag204(unsigned long subcode, unsigned long size, void *addr);
int diag224(void *ptr);
int diag26c(void *req, void *resp, enum diag26c_sc subcode);
+1 −0
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ struct sclp_info {
	unsigned char has_skey : 1;
	unsigned char has_kss : 1;
	unsigned char has_gisaf : 1;
	unsigned char has_diag318 : 1;
	unsigned int ibc;
	unsigned int mtid;
	unsigned int mtid_cp;
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ static const struct diag_desc diag_map[NR_DIAG_STAT] = {
	[DIAG_STAT_X2FC] = { .code = 0x2fc, .name = "Guest Performance Data" },
	[DIAG_STAT_X304] = { .code = 0x304, .name = "Partition-Resource Service" },
	[DIAG_STAT_X308] = { .code = 0x308, .name = "List-Directed IPL" },
	[DIAG_STAT_X318] = { .code = 0x318, .name = "CP Name and Version Codes" },
	[DIAG_STAT_X500] = { .code = 0x500, .name = "Virtio Service" },
};

+21 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include <linux/memory.h>
#include <linux/compat.h>
#include <linux/start_kernel.h>
#include <linux/version.h>

#include <asm/ipl.h>
#include <asm/facility.h>
@@ -989,6 +990,25 @@ static void __init setup_task_size(void)
	arch_task_struct_size = task_size;
}

/*
 * Issue diagnose 318 to set the control program name and
 * version codes.
 */
static void __init setup_control_program_code(void)
{
	union diag318_info diag318_info = {
		.cpnc = CPNC_LINUX,
		.cpvc_linux = 0,
		.cpvc_distro = {0},
	};

	if (!sclp.has_diag318)
		return;

	diag_stat_inc(DIAG_STAT_X318);
	asm volatile("diag %0,0,0x318\n" : : "d" (diag318_info.val));
}

/*
 * Setup function called from init/main.c just after the banner
 * was printed.
@@ -1031,6 +1051,7 @@ void __init setup_arch(char **cmdline_p)
	os_info_init();
	setup_ipl();
	setup_task_size();
	setup_control_program_code();

	/* Do some memory reservations *before* memory is added to memblock */
	reserve_memory_end();
+3 −1
Original line number Diff line number Diff line
@@ -195,7 +195,9 @@ struct read_info_sccb {
	u16	hcpua;			/* 120-121 */
	u8	_pad_122[124 - 122];	/* 122-123 */
	u32	hmfai;			/* 124-127 */
	u8	_pad_128[4096 - 128];	/* 128-4095 */
	u8	_pad_128[134 - 128];	/* 128-133 */
	u8	byte_134;			/* 134 */
	u8	_pad_135[4096 - 135];	/* 135-4095 */
} __packed __aligned(PAGE_SIZE);

struct read_storage_sccb {
Loading