|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/4] stubdom/vtpm: Add reconfiguration support
Allow the vtpm device to be disconnected and reconnected so that a
bootloader (like pv-grub) can submit measurements and return the vtpm
device to its initial state before booting the target kernel.
Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
extras/mini-os/include/tpmfront.h | 2 +-
extras/mini-os/lib/sys.c | 2 +-
extras/mini-os/tpmback.c | 5 +++++
extras/mini-os/tpmfront.c | 15 +++++++++------
stubdom/vtpm/vtpm.c | 2 +-
5 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/extras/mini-os/include/tpmfront.h
b/extras/mini-os/include/tpmfront.h
index a0c7c4d..913faa4 100644
--- a/extras/mini-os/include/tpmfront.h
+++ b/extras/mini-os/include/tpmfront.h
@@ -61,7 +61,7 @@ struct tpmfront_dev {
/*Initialize frontend */
struct tpmfront_dev* init_tpmfront(const char* nodename);
/*Shutdown frontend */
-void shutdown_tpmfront(struct tpmfront_dev* dev);
+void shutdown_tpmfront(struct tpmfront_dev* dev, int for_reconfig);
/* Send a tpm command to the backend and wait for the response
*
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index 3cc3340..03da4f0 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -459,7 +459,7 @@ int close(int fd)
#endif
#ifdef CONFIG_TPMFRONT
case FTYPE_TPMFRONT:
- shutdown_tpmfront(files[fd].tpmfront.dev);
+ shutdown_tpmfront(files[fd].tpmfront.dev, 0);
files[fd].type = FTYPE_NONE;
return 0;
#endif
diff --git a/extras/mini-os/tpmback.c b/extras/mini-os/tpmback.c
index 2d31061..ea42235 100644
--- a/extras/mini-os/tpmback.c
+++ b/extras/mini-os/tpmback.c
@@ -664,6 +664,7 @@ static int frontend_changed(tpmif_t* tpmif)
switch (state) {
case XenbusStateInitialising:
case XenbusStateInitialised:
+ case XenbusStateReconfigured:
break;
case XenbusStateConnected:
@@ -678,6 +679,10 @@ static int frontend_changed(tpmif_t* tpmif)
tpmif_change_state(tpmif, XenbusStateClosing);
break;
+ case XenbusStateReconfiguring:
+ disconnect_fe(tpmif);
+ break;
+
case XenbusStateUnknown: /* keep it here */
case XenbusStateClosed:
free_tpmif(tpmif);
diff --git a/extras/mini-os/tpmfront.c b/extras/mini-os/tpmfront.c
index c1cbab3..b725ba0 100644
--- a/extras/mini-os/tpmfront.c
+++ b/extras/mini-os/tpmfront.c
@@ -344,10 +344,10 @@ struct tpmfront_dev* init_tpmfront(const char* _nodename)
return dev;
error:
- shutdown_tpmfront(dev);
+ shutdown_tpmfront(dev, 0);
return NULL;
}
-void shutdown_tpmfront(struct tpmfront_dev* dev)
+void shutdown_tpmfront(struct tpmfront_dev* dev, int for_reconfig)
{
char* err;
char path[512];
@@ -357,8 +357,7 @@ void shutdown_tpmfront(struct tpmfront_dev* dev)
TPMFRONT_LOG("Shutting down tpmfront%s\n", for_reconfig ? " for
reconfigure" : "");
/* disconnect */
if(dev->state == XenbusStateConnected) {
- dev->state = XenbusStateClosing;
- //FIXME: Transaction for this?
+ dev->state = for_reconfig ? XenbusStateReconfiguring :
XenbusStateClosing;
/* Tell backend we are closing */
if((err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%u", (unsigned
int) dev->state))) {
free(err);
@@ -374,15 +373,19 @@ void shutdown_tpmfront(struct tpmfront_dev* dev)
free(err);
}
+ if (for_reconfig)
+ wait_for_backend_state_changed(dev, XenbusStateReconfigured);
+
/* Tell backend we are closed */
- dev->state = XenbusStateClosed;
+ dev->state = for_reconfig ? XenbusStateInitialising : XenbusStateClosed;
if((err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%u", (unsigned
int) dev->state))) {
TPMFRONT_ERR("Unable to write to %s, error was %s", dev->nodename,
err);
free(err);
}
/* Wait for the backend to close and unmap shared pages, ignore any
errors */
- wait_for_backend_state_changed(dev, XenbusStateClosed);
+ if (!for_reconfig)
+ wait_for_backend_state_changed(dev, XenbusStateClosed);
/* Close event channel and unmap shared page */
mask_evtchn(dev->evtchn);
diff --git a/stubdom/vtpm/vtpm.c b/stubdom/vtpm/vtpm.c
index 71aef78..c33e078 100644
--- a/stubdom/vtpm/vtpm.c
+++ b/stubdom/vtpm/vtpm.c
@@ -394,7 +394,7 @@ abort_postvtpmblk:
abort_postrng:
/* Close devices */
- shutdown_tpmfront(tpmfront_dev);
+ shutdown_tpmfront(tpmfront_dev, 0);
abort_posttpmfront:
shutdown_tpmback();
--
1.7.11.7
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |