cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

zcrypt_error.h (4960B)


      1/* SPDX-License-Identifier: GPL-2.0+ */
      2/*
      3 *  Copyright IBM Corp. 2001, 2006
      4 *  Author(s): Robert Burroughs
      5 *	       Eric Rossman (edrossma@us.ibm.com)
      6 *
      7 *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
      8 *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
      9 */
     10
     11#ifndef _ZCRYPT_ERROR_H_
     12#define _ZCRYPT_ERROR_H_
     13
     14#include <linux/atomic.h>
     15#include "zcrypt_debug.h"
     16#include "zcrypt_api.h"
     17#include "zcrypt_msgtype6.h"
     18
     19/**
     20 * Reply Messages
     21 *
     22 * Error reply messages are of two types:
     23 *    82:  Error (see below)
     24 *    88:  Error (see below)
     25 * Both type 82 and type 88 have the same structure in the header.
     26 *
     27 * Request reply messages are of three known types:
     28 *    80:  Reply from a Type 50 Request (see CEX2A-RELATED STRUCTS)
     29 *    84:  Reply from a Type 4 Request (see PCICA-RELATED STRUCTS)
     30 *    86:  Reply from a Type 6 Request (see PCICC/PCIXCC/CEX2C-RELATED STRUCTS)
     31 *
     32 */
     33struct error_hdr {
     34	unsigned char reserved1;	/* 0x00			*/
     35	unsigned char type;		/* 0x82 or 0x88		*/
     36	unsigned char reserved2[2];	/* 0x0000		*/
     37	unsigned char reply_code;	/* reply code		*/
     38	unsigned char reserved3[3];	/* 0x000000		*/
     39};
     40
     41#define TYPE82_RSP_CODE 0x82
     42#define TYPE88_RSP_CODE 0x88
     43
     44#define REP82_ERROR_MACHINE_FAILURE	    0x10
     45#define REP82_ERROR_PREEMPT_FAILURE	    0x12
     46#define REP82_ERROR_CHECKPT_FAILURE	    0x14
     47#define REP82_ERROR_MESSAGE_TYPE	    0x20
     48#define REP82_ERROR_INVALID_COMM_CD	    0x21 /* Type 84	*/
     49#define REP82_ERROR_INVALID_MSG_LEN	    0x23
     50#define REP82_ERROR_RESERVD_FIELD	    0x24 /* was 0x50	*/
     51#define REP82_ERROR_FORMAT_FIELD	    0x29
     52#define REP82_ERROR_INVALID_COMMAND	    0x30
     53#define REP82_ERROR_MALFORMED_MSG	    0x40
     54#define REP82_ERROR_INVALID_SPECIAL_CMD	    0x41
     55#define REP82_ERROR_RESERVED_FIELDO	    0x50 /* old value	*/
     56#define REP82_ERROR_WORD_ALIGNMENT	    0x60
     57#define REP82_ERROR_MESSAGE_LENGTH	    0x80
     58#define REP82_ERROR_OPERAND_INVALID	    0x82
     59#define REP82_ERROR_OPERAND_SIZE	    0x84
     60#define REP82_ERROR_EVEN_MOD_IN_OPND	    0x85
     61#define REP82_ERROR_RESERVED_FIELD	    0x88
     62#define REP82_ERROR_INVALID_DOMAIN_PENDING  0x8A
     63#define REP82_ERROR_FILTERED_BY_HYPERVISOR  0x8B
     64#define REP82_ERROR_TRANSPORT_FAIL	    0x90
     65#define REP82_ERROR_PACKET_TRUNCATED	    0xA0
     66#define REP82_ERROR_ZERO_BUFFER_LEN	    0xB0
     67
     68#define REP88_ERROR_MODULE_FAILURE	    0x10
     69#define REP88_ERROR_MESSAGE_TYPE	    0x20
     70#define REP88_ERROR_MESSAGE_MALFORMD	    0x22
     71#define REP88_ERROR_MESSAGE_LENGTH	    0x23
     72#define REP88_ERROR_RESERVED_FIELD	    0x24
     73#define REP88_ERROR_KEY_TYPE		    0x34
     74#define REP88_ERROR_INVALID_KEY	    0x82 /* CEX2A	*/
     75#define REP88_ERROR_OPERAND		    0x84 /* CEX2A	*/
     76#define REP88_ERROR_OPERAND_EVEN_MOD	    0x85 /* CEX2A	*/
     77
     78static inline int convert_error(struct zcrypt_queue *zq,
     79				struct ap_message *reply)
     80{
     81	struct error_hdr *ehdr = reply->msg;
     82	int card = AP_QID_CARD(zq->queue->qid);
     83	int queue = AP_QID_QUEUE(zq->queue->qid);
     84
     85	switch (ehdr->reply_code) {
     86	case REP82_ERROR_INVALID_MSG_LEN:	 /* 0x23 */
     87	case REP82_ERROR_RESERVD_FIELD:		 /* 0x24 */
     88	case REP82_ERROR_FORMAT_FIELD:		 /* 0x29 */
     89	case REP82_ERROR_MALFORMED_MSG:		 /* 0x40 */
     90	case REP82_ERROR_INVALID_SPECIAL_CMD:	 /* 0x41 */
     91	case REP82_ERROR_MESSAGE_LENGTH:	 /* 0x80 */
     92	case REP82_ERROR_OPERAND_INVALID:	 /* 0x82 */
     93	case REP82_ERROR_OPERAND_SIZE:		 /* 0x84 */
     94	case REP82_ERROR_EVEN_MOD_IN_OPND:	 /* 0x85 */
     95	case REP82_ERROR_INVALID_DOMAIN_PENDING: /* 0x8A */
     96	case REP82_ERROR_FILTERED_BY_HYPERVISOR: /* 0x8B */
     97	case REP82_ERROR_PACKET_TRUNCATED:	 /* 0xA0 */
     98	case REP88_ERROR_MESSAGE_MALFORMD:	 /* 0x22 */
     99	case REP88_ERROR_KEY_TYPE:		 /* 0x34 */
    100		/* RY indicates malformed request */
    101		ZCRYPT_DBF_WARN("%s dev=%02x.%04x RY=0x%02x => rc=EINVAL\n",
    102				__func__, card, queue, ehdr->reply_code);
    103		return -EINVAL;
    104	case REP82_ERROR_MACHINE_FAILURE:	 /* 0x10 */
    105	case REP82_ERROR_MESSAGE_TYPE:		 /* 0x20 */
    106	case REP82_ERROR_TRANSPORT_FAIL:	 /* 0x90 */
    107		/*
    108		 * Msg to wrong type or card/infrastructure failure.
    109		 * Trigger rescan of the ap bus, trigger retry request.
    110		 */
    111		atomic_set(&zcrypt_rescan_req, 1);
    112		/* For type 86 response show the apfs value (failure reason) */
    113		if (ehdr->reply_code == REP82_ERROR_TRANSPORT_FAIL &&
    114		    ehdr->type == TYPE86_RSP_CODE) {
    115			struct {
    116				struct type86_hdr hdr;
    117				struct type86_fmt2_ext fmt2;
    118			} __packed * head = reply->msg;
    119			unsigned int apfs = *((u32 *)head->fmt2.apfs);
    120
    121			ZCRYPT_DBF_WARN(
    122				"%s dev=%02x.%04x RY=0x%02x apfs=0x%x => bus rescan, rc=EAGAIN\n",
    123				__func__, card, queue, ehdr->reply_code, apfs);
    124		} else {
    125			ZCRYPT_DBF_WARN("%s dev=%02x.%04x RY=0x%02x => bus rescan, rc=EAGAIN\n",
    126					__func__, card, queue,
    127					ehdr->reply_code);
    128		}
    129		return -EAGAIN;
    130	default:
    131		/* Assume request is valid and a retry will be worth it */
    132		ZCRYPT_DBF_WARN("%s dev=%02x.%04x RY=0x%02x => rc=EAGAIN\n",
    133				__func__, card, queue, ehdr->reply_code);
    134		return -EAGAIN;
    135	}
    136}
    137
    138#endif /* _ZCRYPT_ERROR_H_ */