aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/tpmfront.c
diff options
context:
space:
mode:
authorDaniel De Graaf <dgdegra@tycho.nsa.gov>2013-03-21 16:11:19 -0400
committerIan Campbell <ian.campbell@citrix.com>2013-04-12 14:28:17 +0100
commite66cb3294f3aa815ae6741b7030dfeb2ea801284 (patch)
tree28a7d03ae1d5ce618afe12589f1a36e76243b678 /extras/mini-os/tpmfront.c
parentf494d9f3c37542435239236085be25c820912304 (diff)
downloadxen-e66cb3294f3aa815ae6741b7030dfeb2ea801284.tar.gz
xen-e66cb3294f3aa815ae6741b7030dfeb2ea801284.tar.bz2
xen-e66cb3294f3aa815ae6741b7030dfeb2ea801284.zip
mini-os/tpm{back, front}: Allow device repoens
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@tycho.nsa.gov>
Diffstat (limited to 'extras/mini-os/tpmfront.c')
-rw-r--r--extras/mini-os/tpmfront.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/extras/mini-os/tpmfront.c b/extras/mini-os/tpmfront.c
index 9f930b5c6f..95d86f6fcc 100644
--- a/extras/mini-os/tpmfront.c
+++ b/extras/mini-os/tpmfront.c
@@ -156,6 +156,9 @@ static int wait_for_backend_closed(xenbus_event_queue* events, char* path)
case XenbusStateClosed:
TPMFRONT_LOG("Backend Closed\n");
return 0;
+ case XenbusStateInitWait:
+ TPMFRONT_LOG("Backend Closed (waiting for reconnect)\n");
+ return 0;
default:
xenbus_wait_for_watch(events);
}
@@ -339,10 +342,10 @@ void shutdown_tpmfront(struct tpmfront_dev* dev)
TPMFRONT_LOG("Shutting down tpmfront\n");
/* disconnect */
if(dev->state == XenbusStateConnected) {
- dev->state = XenbusStateClosing;
- //FIXME: Transaction for this?
/* Tell backend we are closing */
+ dev->state = XenbusStateClosing;
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);
}
@@ -366,6 +369,13 @@ void shutdown_tpmfront(struct tpmfront_dev* dev)
/* Wait for the backend to close and unmap shared pages, ignore any errors */
wait_for_backend_state_changed(dev, XenbusStateClosed);
+ /* Prepare for a later reopen (possibly by a kexec'd kernel) */
+ dev->state = XenbusStateInitialising;
+ 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);
+ }
+
/* Close event channel and unmap shared page */
mask_evtchn(dev->evtchn);
unbind_evtchn(dev->evtchn);