[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE
From: |
Stefan Berger |
Subject: |
[Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE |
Date: |
Sat, 16 Dec 2017 12:41:42 -0500 |
From: Marc-André Lureau <address@hidden>
A property to lookup a tpm backend.
Signed-off-by: Marc-André Lureau <address@hidden>
Reviewed-by: Stefan Berger <address@hidden>
Signed-off-by: Stefan Berger <address@hidden>
---
hw/core/qdev-properties-system.c | 64 ++++++++++++++++++++++++++++++++++++++++
include/hw/qdev-properties.h | 3 ++
2 files changed, 67 insertions(+)
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index ec10da7..c173646 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -21,6 +21,7 @@
#include "net/hub.h"
#include "qapi/visitor.h"
#include "chardev/char-fe.h"
+#include "sysemu/tpm_backend.h"
#include "sysemu/iothread.h"
static void get_pointer(Object *obj, Visitor *v, Property *prop,
@@ -236,6 +237,69 @@ const PropertyInfo qdev_prop_chr = {
.release = release_chr,
};
+/* --- character device --- */
+
+static void get_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
+ Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ TPMBackend **be = qdev_get_prop_ptr(dev, opaque);
+ char *p;
+
+ p = g_strdup(*be ? (*be)->id : "");
+ visit_type_str(v, name, &p, errp);
+ g_free(p);
+}
+
+static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
+ Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Error *local_err = NULL;
+ Property *prop = opaque;
+ TPMBackend *s, **be = qdev_get_prop_ptr(dev, prop);
+ char *str;
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_str(v, name, &str, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ s = qemu_find_tpm_be(str);
+ if (s == NULL) {
+ error_setg(errp, "Property '%s.%s' can't find value '%s'",
+ object_get_typename(obj), prop->name, str);
+ } else if (tpm_backend_init(s, TPM_IF(obj), errp) == 0) {
+ *be = s; /* weak reference, avoid cyclic ref */
+ }
+ g_free(str);
+}
+
+static void release_tpm(Object *obj, const char *name, void *opaque)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ TPMBackend **be = qdev_get_prop_ptr(dev, prop);
+
+ if (*be) {
+ tpm_backend_reset(*be);
+ }
+}
+
+const PropertyInfo qdev_prop_tpm = {
+ .name = "str",
+ .description = "ID of a tpm to use as a backend",
+ .get = get_tpm,
+ .set = set_tpm,
+ .release = release_tpm,
+};
+
/* --- netdev device --- */
static void get_netdev(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index e2321f1..4d24cdf 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -17,6 +17,7 @@ extern const PropertyInfo qdev_prop_int64;
extern const PropertyInfo qdev_prop_size;
extern const PropertyInfo qdev_prop_string;
extern const PropertyInfo qdev_prop_chr;
+extern const PropertyInfo qdev_prop_tpm;
extern const PropertyInfo qdev_prop_ptr;
extern const PropertyInfo qdev_prop_macaddr;
extern const PropertyInfo qdev_prop_on_off_auto;
@@ -186,6 +187,8 @@ extern const PropertyInfo qdev_prop_link;
#define DEFINE_PROP_CHR(_n, _s, _f) \
DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharBackend)
+#define DEFINE_PROP_TPMBE(_n, _s, _f) \
+ DEFINE_PROP(_n, _s, _f, qdev_prop_tpm, TPMBackend *)
#define DEFINE_PROP_STRING(_n, _s, _f) \
DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
#define DEFINE_PROP_NETDEV(_n, _s, _f) \
--
2.5.5
- [Qemu-devel] [PULL v1 15/32] tpm-passthrough: workaround a possible race, (continued)
- [Qemu-devel] [PULL v1 15/32] tpm-passthrough: workaround a possible race, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 14/32] tpm-passthrough: simplify create(), Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 17/32] tpm: rename qemu_find_tpm() -> qemu_find_tpm_be(), Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 18/32] tpm: lookup the the TPM interface instead of TIS device, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 16/32] tpm-tis: simplify header inclusion, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 20/32] tpm: add tpm_cmd_get_size() to tpm_util, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 19/32] tpm: add TPM interface to lookup TPM version, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 21/32] acpi: change TPM TIS data conditions, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 22/32] tpm-emulator: add a FIXME comment about blocking cancel, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 23/32] tpm-tis: remove redundant 'tpm_tis:' in error messages, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE,
Stefan Berger <=
- [Qemu-devel] [PULL v1 24/32] tpm-tis: check that at most one TPM device exists, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 26/32] tpm-tis: use DEFINE_PROP_TPMBE, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 27/32] tpm: remove tpm_register_model(), Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 30/32] tpm: tpm_passthrough: Read the buffer size from the host device, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 28/32] tpm: Move getting TPM buffer size to backends, Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 29/32] tpm: pull tpm_util_request() out of tpm_util_test(), Stefan Berger, 2017/12/16
- [Qemu-devel] [PULL v1 31/32] tpm: tpm_emulator: get and set buffer size of device, Stefan Berger, 2017/12/16