mirror of https://gitee.com/openkylin/qemu.git
qdev: add DEFINE_PROP_TPMBE
A property to lookup a tpm backend. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
This commit is contained in:
parent
51a837e908
commit
493b783035
|
@ -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)
|
||||
|
|
|
@ -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) \
|
||||
|
|
Loading…
Reference in New Issue