tpm: move qdev_prop_tpm to hw/tpm/
Building with --disable-tpm yields
../hw/core/qdev-properties-system.o: In function `set_tpm':
/home/cohuck/git/qemu/hw/core/qdev-properties-system.c:274: undefined reference to `qemu_find_tpm_be'
/home/cohuck/git/qemu/hw/core/qdev-properties-system.c:278: undefined reference to `tpm_backend_init'
../hw/core/qdev-properties-system.o: In function `release_tpm':
/home/cohuck/git/qemu/hw/core/qdev-properties-system.c:291: undefined reference to `tpm_backend_reset'
Move the implementation of DEFINE_PROP_TPMBE to hw/tpm/ so that it is
only built when tpm is actually configured, and build tpm_util in every
case.
Fixes: 493b783035 ("qdev: add DEFINE_PROP_TPMBE")
Reported-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
			
			
This commit is contained in:
		
							parent
							
								
									eaefea537b
								
							
						
					
					
						commit
						89be9e99c8
					
				| 
						 | 
				
			
			@ -21,7 +21,6 @@
 | 
			
		|||
#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,
 | 
			
		||||
| 
						 | 
				
			
			@ -237,69 +236,6 @@ 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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
common-obj-y += tpm_util.o
 | 
			
		||||
common-obj-$(CONFIG_TPM_TIS) += tpm_tis.o
 | 
			
		||||
common-obj-$(CONFIG_TPM_PASSTHROUGH) += tpm_passthrough.o tpm_util.o
 | 
			
		||||
common-obj-$(CONFIG_TPM_EMULATOR) += tpm_emulator.o tpm_util.o
 | 
			
		||||
common-obj-$(CONFIG_TPM_PASSTHROUGH) += tpm_passthrough.o
 | 
			
		||||
common-obj-$(CONFIG_TPM_EMULATOR) += tpm_emulator.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,9 +21,13 @@
 | 
			
		|||
 | 
			
		||||
#include "qemu/osdep.h"
 | 
			
		||||
#include "qemu/error-report.h"
 | 
			
		||||
#include "qapi/error.h"
 | 
			
		||||
#include "qapi/visitor.h"
 | 
			
		||||
#include "tpm_util.h"
 | 
			
		||||
#include "tpm_int.h"
 | 
			
		||||
#include "exec/memory.h"
 | 
			
		||||
#include "sysemu/tpm_backend.h"
 | 
			
		||||
#include "hw/qdev.h"
 | 
			
		||||
 | 
			
		||||
#define DEBUG_TPM 0
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +37,69 @@
 | 
			
		|||
    } \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/* tpm backend property */
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Write an error message in the given output buffer.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,4 +39,7 @@ static inline uint32_t tpm_cmd_get_size(const void *b)
 | 
			
		|||
int tpm_util_get_buffer_size(int tpm_fd, TPMVersion tpm_version,
 | 
			
		||||
                             size_t *buffersize);
 | 
			
		||||
 | 
			
		||||
#define DEFINE_PROP_TPMBE(_n, _s, _f)                     \
 | 
			
		||||
    DEFINE_PROP(_n, _s, _f, qdev_prop_tpm, TPMBackend *)
 | 
			
		||||
 | 
			
		||||
#endif /* TPM_TPM_UTIL_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -187,8 +187,6 @@ 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