forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
s390/zcrypt: CEX8S exploitation support
This patch adds CEX8 exploitation support for the AP bus code, the zcrypt device driver zoo and the vfio device driver. Signed-off-by: Harald Freudenberger <[email protected]> Reviewed-by: Jürgen Christ <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
- Loading branch information
Showing
5 changed files
with
61 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Copyright IBM Corp. 2012, 2019 | ||
* Copyright IBM Corp. 2012, 2022 | ||
* Author(s): Holger Dengler <[email protected]> | ||
*/ | ||
|
||
|
@@ -36,8 +36,8 @@ | |
#define CEX4_CLEANUP_TIME (900*HZ) | ||
|
||
MODULE_AUTHOR("IBM Corporation"); | ||
MODULE_DESCRIPTION("CEX4/CEX5/CEX6/CEX7 Cryptographic Card device driver, " \ | ||
"Copyright IBM Corp. 2019"); | ||
MODULE_DESCRIPTION("CEX[45678] Cryptographic Card device driver, " \ | ||
"Copyright IBM Corp. 2022"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
static struct ap_device_id zcrypt_cex4_card_ids[] = { | ||
|
@@ -49,6 +49,8 @@ static struct ap_device_id zcrypt_cex4_card_ids[] = { | |
.match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE }, | ||
{ .dev_type = AP_DEVICE_TYPE_CEX7, | ||
.match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE }, | ||
{ .dev_type = AP_DEVICE_TYPE_CEX8, | ||
.match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE }, | ||
{ /* end of list */ }, | ||
}; | ||
|
||
|
@@ -63,6 +65,8 @@ static struct ap_device_id zcrypt_cex4_queue_ids[] = { | |
.match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, | ||
{ .dev_type = AP_DEVICE_TYPE_CEX7, | ||
.match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, | ||
{ .dev_type = AP_DEVICE_TYPE_CEX8, | ||
.match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, | ||
{ /* end of list */ }, | ||
}; | ||
|
||
|
@@ -395,7 +399,7 @@ static const struct attribute_group ep11_queue_attr_grp = { | |
}; | ||
|
||
/* | ||
* Probe function for CEX4/CEX5/CEX6/CEX7 card device. It always | ||
* Probe function for CEX[45678] card device. It always | ||
* accepts the AP device since the bus_match already checked | ||
* the hardware type. | ||
* @ap_dev: pointer to the AP device. | ||
|
@@ -414,6 +418,8 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
6, 9, 20, 17, 65, 438, 0, 0}; | ||
static const int CEX7A_SPEED_IDX[NUM_OPS] = { | ||
6, 8, 17, 15, 54, 362, 0, 0}; | ||
static const int CEX8A_SPEED_IDX[NUM_OPS] = { | ||
6, 8, 17, 15, 54, 362, 0, 0}; | ||
|
||
static const int CEX4C_SPEED_IDX[NUM_OPS] = { | ||
59, 69, 308, 83, 278, 2204, 209, 40}; | ||
|
@@ -423,6 +429,8 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
16, 20, 32, 27, 77, 455, 24, 9}; | ||
static const int CEX7C_SPEED_IDX[NUM_OPS] = { | ||
14, 16, 26, 23, 64, 376, 23, 8}; | ||
static const int CEX8C_SPEED_IDX[NUM_OPS] = { | ||
14, 16, 26, 23, 64, 376, 23, 8}; | ||
|
||
static const int CEX4P_SPEED_IDX[NUM_OPS] = { | ||
0, 0, 0, 0, 0, 0, 0, 50}; | ||
|
@@ -432,6 +440,8 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
0, 0, 0, 0, 0, 0, 0, 9}; | ||
static const int CEX7P_SPEED_IDX[NUM_OPS] = { | ||
0, 0, 0, 0, 0, 0, 0, 8}; | ||
static const int CEX8P_SPEED_IDX[NUM_OPS] = { | ||
0, 0, 0, 0, 0, 0, 0, 8}; | ||
|
||
struct ap_card *ac = to_ap_card(&ap_dev->device); | ||
struct zcrypt_card *zc; | ||
|
@@ -455,13 +465,20 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
zc->type_string = "CEX6A"; | ||
zc->user_space_type = ZCRYPT_CEX6; | ||
zc->speed_rating = CEX6A_SPEED_IDX; | ||
} else { | ||
} else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX7) { | ||
zc->type_string = "CEX7A"; | ||
zc->speed_rating = CEX7A_SPEED_IDX; | ||
/* wrong user space type, just for compatibility | ||
* with the ZCRYPT_STATUS_MASK ioctl. | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX6; | ||
} else { | ||
zc->type_string = "CEX8A"; | ||
zc->speed_rating = CEX8A_SPEED_IDX; | ||
/* wrong user space type, just for compatibility | ||
* with the ZCRYPT_STATUS_MASK ioctl. | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX6; | ||
zc->speed_rating = CEX7A_SPEED_IDX; | ||
} | ||
zc->min_mod_size = CEX4A_MIN_MOD_SIZE; | ||
if (ap_test_bit(&ac->functions, AP_FUNC_MEX4K) && | ||
|
@@ -477,32 +494,39 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
} else if (ap_test_bit(&ac->functions, AP_FUNC_COPRO)) { | ||
if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX4) { | ||
zc->type_string = "CEX4C"; | ||
/* wrong user space type, must be CEX4 | ||
zc->speed_rating = CEX4C_SPEED_IDX; | ||
/* wrong user space type, must be CEX3C | ||
* just keep it for cca compatibility | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX3C; | ||
zc->speed_rating = CEX4C_SPEED_IDX; | ||
} else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) { | ||
zc->type_string = "CEX5C"; | ||
/* wrong user space type, must be CEX5 | ||
zc->speed_rating = CEX5C_SPEED_IDX; | ||
/* wrong user space type, must be CEX3C | ||
* just keep it for cca compatibility | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX3C; | ||
zc->speed_rating = CEX5C_SPEED_IDX; | ||
} else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX6) { | ||
zc->type_string = "CEX6C"; | ||
/* wrong user space type, must be CEX6 | ||
zc->speed_rating = CEX6C_SPEED_IDX; | ||
/* wrong user space type, must be CEX3C | ||
* just keep it for cca compatibility | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX3C; | ||
zc->speed_rating = CEX6C_SPEED_IDX; | ||
} else { | ||
} else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX7) { | ||
zc->type_string = "CEX7C"; | ||
/* wrong user space type, must be CEX7 | ||
zc->speed_rating = CEX7C_SPEED_IDX; | ||
/* wrong user space type, must be CEX3C | ||
* just keep it for cca compatibility | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX3C; | ||
} else { | ||
zc->type_string = "CEX8C"; | ||
zc->speed_rating = CEX8C_SPEED_IDX; | ||
/* wrong user space type, must be CEX3C | ||
* just keep it for cca compatibility | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX3C; | ||
zc->speed_rating = CEX7C_SPEED_IDX; | ||
} | ||
zc->min_mod_size = CEX4C_MIN_MOD_SIZE; | ||
zc->max_mod_size = CEX4C_MAX_MOD_SIZE; | ||
|
@@ -520,13 +544,20 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
zc->type_string = "CEX6P"; | ||
zc->user_space_type = ZCRYPT_CEX6; | ||
zc->speed_rating = CEX6P_SPEED_IDX; | ||
} else { | ||
} else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX7) { | ||
zc->type_string = "CEX7P"; | ||
zc->speed_rating = CEX7P_SPEED_IDX; | ||
/* wrong user space type, just for compatibility | ||
* with the ZCRYPT_STATUS_MASK ioctl. | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX6; | ||
} else { | ||
zc->type_string = "CEX8P"; | ||
zc->speed_rating = CEX8P_SPEED_IDX; | ||
/* wrong user space type, just for compatibility | ||
* with the ZCRYPT_STATUS_MASK ioctl. | ||
*/ | ||
zc->user_space_type = ZCRYPT_CEX6; | ||
zc->speed_rating = CEX7P_SPEED_IDX; | ||
} | ||
zc->min_mod_size = CEX4C_MIN_MOD_SIZE; | ||
zc->max_mod_size = CEX4C_MAX_MOD_SIZE; | ||
|
@@ -563,7 +594,7 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) | |
} | ||
|
||
/* | ||
* This is called to remove the CEX4/CEX5/CEX6/CEX7 card driver | ||
* This is called to remove the CEX[45678] card driver | ||
* information if an AP card device is removed. | ||
*/ | ||
static void zcrypt_cex4_card_remove(struct ap_device *ap_dev) | ||
|
@@ -587,7 +618,7 @@ static struct ap_driver zcrypt_cex4_card_driver = { | |
}; | ||
|
||
/* | ||
* Probe function for CEX4/CEX5/CEX6/CEX7 queue device. It always | ||
* Probe function for CEX[45678] queue device. It always | ||
* accepts the AP device since the bus_match already checked | ||
* the hardware type. | ||
* @ap_dev: pointer to the AP device. | ||
|
@@ -653,7 +684,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev) | |
} | ||
|
||
/* | ||
* This is called to remove the CEX4/CEX5/CEX6/CEX7 queue driver | ||
* This is called to remove the CEX[45678] queue driver | ||
* information if an AP queue device is removed. | ||
*/ | ||
static void zcrypt_cex4_queue_remove(struct ap_device *ap_dev) | ||
|