1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef __TSM_MR_H 4 #define __TSM_MR_H 5 6 #include <crypto/hash_info.h> 7 8 /** 9 * struct tsm_measurement_register - describes an architectural measurement 10 * register (MR) 11 * @mr_name: name of the MR 12 * @mr_value: buffer containing the current value of the MR 13 * @mr_size: size of the MR - typically the digest size of @mr_hash 14 * @mr_flags: bitwise OR of one or more flags, detailed below 15 * @mr_hash: optional hash identifier defined in include/uapi/linux/hash_info.h. 16 * 17 * A CC guest driver encloses an array of this structure in struct 18 * tsm_measurements to detail the measurement facility supported by the 19 * underlying CC hardware. 20 * 21 * @mr_name and @mr_value must stay valid until this structure is no longer in 22 * use. 23 * 24 * @mr_flags is the bitwise-OR of zero or more of the flags below. 25 * 26 * * %TSM_MR_F_READABLE - the sysfs attribute corresponding to this MR is readable. 27 * * %TSM_MR_F_WRITABLE - the sysfs attribute corresponding to this MR is writable. 28 * The semantics is typically to extend the MR but could vary depending on the 29 * architecture and the MR. 30 * * %TSM_MR_F_LIVE - this MR's value may differ from the last value written, so 31 * must be read back from the underlying CC hardware/firmware. 32 * * %TSM_MR_F_RTMR - bitwise-OR of %TSM_MR_F_LIVE and %TSM_MR_F_WRITABLE. 33 * * %TSM_MR_F_NOHASH - this MR does NOT have an associated hash algorithm. 34 * @mr_hash will be ignored when this flag is set. 35 */ 36 struct tsm_measurement_register { 37 const char *mr_name; 38 void *mr_value; 39 u32 mr_size; 40 u32 mr_flags; 41 enum hash_algo mr_hash; 42 }; 43 44 #define TSM_MR_F_NOHASH 1 45 #define TSM_MR_F_WRITABLE 2 46 #define TSM_MR_F_READABLE 4 47 #define TSM_MR_F_LIVE 8 48 #define TSM_MR_F_RTMR (TSM_MR_F_LIVE | TSM_MR_F_WRITABLE) 49 50 #define TSM_MR_(mr, hash) \ 51 .mr_name = #mr, .mr_size = hash##_DIGEST_SIZE, \ 52 .mr_hash = HASH_ALGO_##hash, .mr_flags = TSM_MR_F_READABLE 53 54 /** 55 * struct tsm_measurements - defines the CC architecture specific measurement 56 * facility and methods for updating measurement registers (MRs) 57 * @mrs: Array of MR definitions. 58 * @nr_mrs: Number of elements in @mrs. 59 * @refresh: Callback function to load/sync all MRs from TVM hardware/firmware 60 * into the kernel cache. 61 * @write: Callback function to write to the MR specified by the parameter @mr. 62 * Typically, writing to an MR extends the input buffer to that MR. 63 * 64 * The @refresh callback is invoked when an MR with %TSM_MR_F_LIVE set is being 65 * read and the cache is stale. It must reload all MRs with %TSM_MR_F_LIVE set. 66 * The function parameter @tm is a pointer pointing back to this structure. 67 * 68 * The @write callback is invoked whenever an MR is being written. It takes two 69 * additional parameters besides @tm: 70 * 71 * * @mr - points to the MR (an element of @tm->mrs) being written. 72 * * @data - contains the bytes to write and whose size is @mr->mr_size. 73 * 74 * Both @refresh and @write should return 0 on success and an appropriate error 75 * code on failure. 76 */ 77 struct tsm_measurements { 78 const struct tsm_measurement_register *mrs; 79 size_t nr_mrs; 80 int (*refresh)(const struct tsm_measurements *tm); 81 int (*write)(const struct tsm_measurements *tm, 82 const struct tsm_measurement_register *mr, const u8 *data); 83 }; 84 85 const struct attribute_group * 86 tsm_mr_create_attribute_group(const struct tsm_measurements *tm); 87 void tsm_mr_free_attribute_group(const struct attribute_group *attr_grp); 88 89 #endif 90