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

Commit 050349b5 authored by Harald Freudenberger's avatar Harald Freudenberger Committed by Martin Schwidefsky
Browse files

s390/zcrypt: externalize AP config info query



KVM has a need to fetch the crypto configuration information
as it is returned by the PQAP(QCI) instruction. This patch
introduces a new API ap_query_configuration() which provides
this info in a handy way for the caller.

Signed-off-by: default avatarHarald Freudenberger <freude@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent e7fc5146
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -61,4 +61,30 @@ struct ap_queue_status ap_test_queue(ap_qid_t qid,
				     int tbit,
				     unsigned long *info);

struct ap_config_info {
	unsigned int apsc	 : 1;	/* S bit */
	unsigned int apxa	 : 1;	/* N bit */
	unsigned int qact	 : 1;	/* C bit */
	unsigned int rc8a	 : 1;	/* R bit */
	unsigned char _reserved1 : 4;
	unsigned char _reserved2[3];
	unsigned char Na;		/* max # of APs - 1 */
	unsigned char Nd;		/* max # of Domains - 1 */
	unsigned char _reserved3[10];
	unsigned int apm[8];		/* AP ID mask */
	unsigned int aqm[8];		/* AP queue mask */
	unsigned int adm[8];		/* AP domain mask */
	unsigned char _reserved4[16];
} __aligned(8);

/*
 * ap_query_configuration(): Fetch cryptographic config info
 *
 * Returns the ap configuration info fetched via PQAP(QCI).
 * On success 0 is returned, on failure a negative errno
 * is returned, e.g. if the PQAP(QCI) instruction is not
 * available, the return value will be -EOPNOTSUPP.
 */
int ap_query_configuration(struct ap_config_info *info);

#endif /* _ASM_S390_AP_H_ */
+16 −5
Original line number Diff line number Diff line
@@ -194,12 +194,23 @@ struct ap_queue_status ap_test_queue(ap_qid_t qid,
}
EXPORT_SYMBOL(ap_test_queue);

static inline int ap_query_configuration(void)
/*
 * ap_query_configuration(): Fetch cryptographic config info
 *
 * Returns the ap configuration info fetched via PQAP(QCI).
 * On success 0 is returned, on failure a negative errno
 * is returned, e.g. if the PQAP(QCI) instruction is not
 * available, the return value will be -EOPNOTSUPP.
 */
int ap_query_configuration(struct ap_config_info *info)
{
	if (!ap_configuration)
	if (!ap_configuration_available())
		return -EOPNOTSUPP;
	return ap_qci(ap_configuration);
	if (!info)
		return -EINVAL;
	return ap_qci(info);
}
EXPORT_SYMBOL(ap_query_configuration);

/**
 * ap_init_configuration(): Allocate and query configuration array.
@@ -212,7 +223,7 @@ static void ap_init_configuration(void)
	ap_configuration = kzalloc(sizeof(*ap_configuration), GFP_KERNEL);
	if (!ap_configuration)
		return;
	if (ap_query_configuration() != 0) {
	if (ap_query_configuration(ap_configuration) != 0) {
		kfree(ap_configuration);
		ap_configuration = NULL;
		return;
@@ -1009,7 +1020,7 @@ static void ap_scan_bus(struct work_struct *unused)

	AP_DBF(DBF_DEBUG, "ap_scan_bus running\n");

	ap_query_configuration();
	ap_query_configuration(ap_configuration);
	if (ap_select_domain() != 0)
		goto out;

+0 −11
Original line number Diff line number Diff line
@@ -204,17 +204,6 @@ struct ap_message {
			struct ap_message *);
};

struct ap_config_info {
	unsigned int special_command:1;
	unsigned int ap_extended:1;
	unsigned char reserved1:6;
	unsigned char reserved2[15];
	unsigned int apm[8];		/* AP ID mask */
	unsigned int aqm[8];		/* AP queue mask */
	unsigned int adm[8];		/* AP domain mask */
	unsigned char reserved4[16];
} __packed;

/**
 * ap_init_message() - Initialize ap_message.
 * Initialize a message before using. Otherwise this might result in