Re: [PATCH 3/9] x86/virt/tdx: Support global metadata read for all element sizes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



<snip>

-static int read_sys_metadata_field16(u64 field_id,
-				     int offset,
-				     void *stbuf)
+/*
+ * Read one global metadata field and store the data to a location of a
+ * given buffer specified by the offset and size (in bytes).
+ */
+static int stbuf_read_sysmd_field(u64 field_id, void *stbuf, int offset,

read_system_metadat_field or read_sys_metadata_field or simply
read_metadata_field

+				  int bytes)
s/bytes/size
  {
-	u16 *st_member = stbuf + offset;
+	void *st_member = stbuf + offset;

Again, this could be renamed to just 'member', what value does the 'st' prefix bring?

  	u64 tmp;
  	int ret;
- if (WARN_ON_ONCE(MD_FIELD_ID_ELE_SIZE_CODE(field_id) !=
-			MD_FIELD_ID_ELE_SIZE_16BIT))
+	if (WARN_ON_ONCE(MD_FIELD_BYTES(field_id) != bytes))
  		return -EINVAL;
ret = read_sys_metadata_field(field_id, &tmp);
  	if (ret)
  		return ret;
- *st_member = tmp;
+	memcpy(st_member, &tmp, bytes);
return 0;
  }
@@ -294,11 +296,13 @@ static int read_sys_metadata_field16(u64 field_id,
  struct field_mapping {
  	u64 field_id;
  	int offset;
+	int size;
  };
-#define TD_SYSINFO_MAP(_field_id, _struct, _member) \
-	{ .field_id = MD_FIELD_ID_##_field_id,		\
-	  .offset   = offsetof(_struct, _member) }
+#define TD_SYSINFO_MAP(_field_id, _struct, _member)		\
+	{ .field_id = MD_FIELD_ID_##_field_id,			\
+	  .offset   = offsetof(_struct, _member),		\
+	  .size	    = sizeof(typeof(((_struct *)0)->_member)) }
#define TD_SYSINFO_MAP_TDMR_INFO(_field_id, _member) \
  	TD_SYSINFO_MAP(_field_id, struct tdx_tdmr_sysinfo, _member)
@@ -319,9 +323,8 @@ static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinfo *tdmr_sysinfo)
/* Populate 'tdmr_sysinfo' fields using the mapping structure above: */
  	for (i = 0; i < ARRAY_SIZE(fields); i++) {
-		ret = read_sys_metadata_field16(fields[i].field_id,
-						fields[i].offset,
-						tdmr_sysinfo);
+		ret = stbuf_read_sysmd_field(fields[i].field_id, tdmr_sysinfo,
+				fields[i].offset, fields[i].size);
  		if (ret)
  			return ret;
  	}
diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h
index b701f69485d3..812943516946 100644
--- a/arch/x86/virt/vmx/tdx/tdx.h
+++ b/arch/x86/virt/vmx/tdx/tdx.h
@@ -53,7 +53,8 @@
  #define MD_FIELD_ID_ELE_SIZE_CODE(_field_id)	\
  		(((_field_id) & GENMASK_ULL(33, 32)) >> 32)
-#define MD_FIELD_ID_ELE_SIZE_16BIT 1
+#define MD_FIELD_BYTES(_field_id)	\

Just name it MD_FIELD_SIZE, even the MD_FIELD_ID member is called ELEMENT_SIZE_CODE, rather than ELEMENT_BYTES_CODE or some such.

+		(1 << MD_FIELD_ID_ELE_SIZE_CODE(_field_id))
struct tdmr_reserved_area {
  	u64 offset;




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux