[Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE

Stefan Berger posted 32 patches 7 years, 10 months ago
[Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE
Posted by Stefan Berger 7 years, 10 months ago
From: Marc-André Lureau <marcandre.lureau@redhat.com>

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>
---
 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


Re: [Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE
Posted by Laurent Vivier 7 years, 10 months ago
On 16/12/2017 18:41, Stefan Berger wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> 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>
> ---
>  hw/core/qdev-properties-system.c | 64 ++++++++++++++++++++++++++++++++++++++++
>  include/hw/qdev-properties.h     |  3 ++
>  2 files changed, 67 insertions(+)

This one breaks my build:

...
  LINK    ppc64-softmmu/qemu-system-ppc64
../hw/core/qdev-properties-system.o: In function `release_tpm':
/home/lvivier/qemu/hw/core/qdev-properties-system.c:291: undefined
reference to `tpm_backend_reset'
../hw/core/qdev-properties-system.o: In function `set_tpm':
/home/lvivier/qemu/hw/core/qdev-properties-system.c:274: undefined
reference to `qemu_find_tpm_be'
/home/lvivier/qemu/hw/core/qdev-properties-system.c:278: undefined
reference to `tpm_backend_init'
collect2: error: ld returned 1 exit status

The following #ifdef fixes the problem for me:

diff --git a/hw/core/qdev-properties-system.c
b/hw/core/qdev-properties-system.c
index c173646..b6eca3b 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -239,6 +239,7 @@ const PropertyInfo qdev_prop_chr = {

 /* --- character device --- */

+#if defined(CONFIG_TPM)
 static void get_tpm(Object *obj, Visitor *v, const char *name, void
*opaque,
                     Error **errp)
 {
@@ -299,6 +300,7 @@ const PropertyInfo qdev_prop_tpm = {
     .set   = set_tpm,
     .release = release_tpm,
 };
+#endif

 /* --- netdev device --- */
 static void get_netdev(Object *obj, Visitor *v, const char *name,

Thanks,
Laurent

Re: [Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE
Posted by Cornelia Huck 7 years, 10 months ago
On Mon, 18 Dec 2017 16:10:50 +0100
Laurent Vivier <lvivier@redhat.com> wrote:

> On 16/12/2017 18:41, Stefan Berger wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> > 
> > 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>
> > ---
> >  hw/core/qdev-properties-system.c | 64 ++++++++++++++++++++++++++++++++++++++++
> >  include/hw/qdev-properties.h     |  3 ++
> >  2 files changed, 67 insertions(+)  
> 
> This one breaks my build:
> 
> ...
>   LINK    ppc64-softmmu/qemu-system-ppc64
> ../hw/core/qdev-properties-system.o: In function `release_tpm':
> /home/lvivier/qemu/hw/core/qdev-properties-system.c:291: undefined
> reference to `tpm_backend_reset'
> ../hw/core/qdev-properties-system.o: In function `set_tpm':
> /home/lvivier/qemu/hw/core/qdev-properties-system.c:274: undefined
> reference to `qemu_find_tpm_be'
> /home/lvivier/qemu/hw/core/qdev-properties-system.c:278: undefined
> reference to `tpm_backend_init'
> collect2: error: ld returned 1 exit status
> 
> The following #ifdef fixes the problem for me:
> 
> diff --git a/hw/core/qdev-properties-system.c
> b/hw/core/qdev-properties-system.c
> index c173646..b6eca3b 100644
> --- a/hw/core/qdev-properties-system.c
> +++ b/hw/core/qdev-properties-system.c
> @@ -239,6 +239,7 @@ const PropertyInfo qdev_prop_chr = {
> 
>  /* --- character device --- */
> 
> +#if defined(CONFIG_TPM)
>  static void get_tpm(Object *obj, Visitor *v, const char *name, void
> *opaque,
>                      Error **errp)
>  {
> @@ -299,6 +300,7 @@ const PropertyInfo qdev_prop_tpm = {
>      .set   = set_tpm,
>      .release = release_tpm,
>  };
> +#endif
> 
>  /* --- netdev device --- */
>  static void get_netdev(Object *obj, Visitor *v, const char *name,
> 
> Thanks,
> Laurent
> 

This seems to be a popular error today :)

https://lists.nongnu.org/archive/html/qemu-devel/2017-12/msg03511.html

Re: [Qemu-devel] [PULL v1 25/32] qdev: add DEFINE_PROP_TPMBE
Posted by Laurent Vivier 7 years, 10 months ago
On 18/12/2017 16:30, Cornelia Huck wrote:
> On Mon, 18 Dec 2017 16:10:50 +0100
> Laurent Vivier <lvivier@redhat.com> wrote:
> 
>> On 16/12/2017 18:41, Stefan Berger wrote:
>>> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>>>
>>> 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>
>>> ---
>>>  hw/core/qdev-properties-system.c | 64 ++++++++++++++++++++++++++++++++++++++++
>>>  include/hw/qdev-properties.h     |  3 ++
>>>  2 files changed, 67 insertions(+)  
>>
>> This one breaks my build:
>>
>> ...
>>   LINK    ppc64-softmmu/qemu-system-ppc64
>> ../hw/core/qdev-properties-system.o: In function `release_tpm':
>> /home/lvivier/qemu/hw/core/qdev-properties-system.c:291: undefined
>> reference to `tpm_backend_reset'
>> ../hw/core/qdev-properties-system.o: In function `set_tpm':
>> /home/lvivier/qemu/hw/core/qdev-properties-system.c:274: undefined
>> reference to `qemu_find_tpm_be'
>> /home/lvivier/qemu/hw/core/qdev-properties-system.c:278: undefined
>> reference to `tpm_backend_init'
>> collect2: error: ld returned 1 exit status
>>
>> The following #ifdef fixes the problem for me:
>>
>> diff --git a/hw/core/qdev-properties-system.c
>> b/hw/core/qdev-properties-system.c
>> index c173646..b6eca3b 100644
>> --- a/hw/core/qdev-properties-system.c
>> +++ b/hw/core/qdev-properties-system.c
>> @@ -239,6 +239,7 @@ const PropertyInfo qdev_prop_chr = {
>>
>>  /* --- character device --- */
>>
>> +#if defined(CONFIG_TPM)
>>  static void get_tpm(Object *obj, Visitor *v, const char *name, void
>> *opaque,
>>                      Error **errp)
>>  {
>> @@ -299,6 +300,7 @@ const PropertyInfo qdev_prop_tpm = {
>>      .set   = set_tpm,
>>      .release = release_tpm,
>>  };
>> +#endif
>>
>>  /* --- netdev device --- */
>>  static void get_netdev(Object *obj, Visitor *v, const char *name,
>>
>> Thanks,
>> Laurent
>>
> 
> This seems to be a popular error today :)
> 
> https://lists.nongnu.org/archive/html/qemu-devel/2017-12/msg03511.html
> 

Thank you Cornelia, I was hoping someone already posted a patch.
You win ;)

Laurent