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:
		
				
					committed by
					
						 Stefan Berger
						Stefan Berger
					
				
			
			
				
	
			
			
			
						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)             \ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user