diff -r 7c44921abfde -r 5793f5c2d67d tools/vtpm_manager/vtpmmgrtalk/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/vtpm_manager/vtpmmgrtalk/Makefile Tue Jul 20 15:26:31 2010 -0400 @@ -0,0 +1,17 @@ +XEN_ROOT = ../../.. +TOOLS_INSTALL_DIR = $(DESTDIR)/usr/bin + +BIN=vtpmmgrtalk +OBJS=vtpmmgrtalk.o +CFLAGS=-Wall -O2 + +all: ${BIN} + +${BIN}: ${OBJS} + gcc -o $@ $< + +install: all + install -m 0755 ${BIN} ${TOOLS_INSTALL_DIR} + +clean: + -rm ${BIN} ${OBJS} diff -r 7c44921abfde -r 5793f5c2d67d tools/vtpm_manager/vtpmmgrtalk/vtpmmgrtalk.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/vtpm_manager/vtpmmgrtalk/vtpmmgrtalk.c Tue Jul 20 15:26:31 2010 -0400 @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "../manager/vtpm_manager.h" + +int main(int argc, char** argv) { + int wfd, rfd; + uint8_t buf[COMMAND_BUFFER_SIZE]; + ssize_t size; + int i, c; + int rc = 0; + + const char* wfile = VTPM_RX_HP_FNAME; + const char* rfile = VTPM_TX_HP_FNAME; + + /* Open for writing in non-blocking mode and exit if + * the manager is not waiting on the other side */ + if((wfd = open(wfile, O_WRONLY | O_NONBLOCK)) < 0) { + fprintf(stderr, "Error opening %s for writing : %s\n", wfile,strerror(errno)); + return 1; + } + /* Set the pipe back to blocking mode */ + fcntl(wfd, F_SETFL, 0); + + /* Open the read pipe */ + if((rfd = open(rfile, O_RDONLY)) < 0) { + close(wfd); + fprintf(stderr, "Error opening %s for reading : %s\n", rfile,strerror(errno)); + return 1; + } + + /*Grab the ASCII hex input from stdin and convert to binary */ + for(i = 0; i < COMMAND_BUFFER_SIZE; ++i) { + c = scanf("%02hhX", buf + i); + if(c == EOF) { + break; + } else if ( c != 1) { + fprintf(stderr, "Malformed Input! Use ASCII hex!\n"); + rc = 1; + goto quit; + } + } + size = i; + + /* Send request to the manager only if a request was actually given */ + if(size > 0) { + /* Lock the pipes for reading/writing */ + if(flock(wfd, LOCK_EX)) { + fprintf(stderr, "Unable to lock %s : %s\n", wfile, strerror(errno)); + rc = 1; + goto quit; + } + if(flock(rfd, LOCK_EX)) { + fprintf(stderr, "Unable to lock %s : %s\n", wfile, strerror(errno)); + rc = 1; + goto quit; + } + + /* Write the binary data to the pipe */ + if(write(wfd, buf, size) != size) { + fprintf(stderr, "Error writing to %s : %s\n", wfile, strerror(errno)); + rc = 1; + goto quit; + } + + /* Read the response from the manager */ + size = read(rfd, buf, COMMAND_BUFFER_SIZE); + if(size < 0) { + fprintf(stderr, "Error reading %s : %s\n", rfile, strerror(errno)); + rc = 1; + goto quit; + } + /* Output the hex */ + for(i = 0; i < size; ++i) { + printf("%02X", buf[i]); + } + fprintf(stderr,"\n"); + + /* Unlock the pipes */ + flock(rfd, LOCK_UN); + flock(wfd, LOCK_UN); + } + + rc = 0; +quit: + close(rfd); + close(wfd); + return rc; +} diff -r 7c44921abfde -r 5793f5c2d67d tools/vtpm_manager/Makefile --- a/tools/vtpm_manager/Makefile Thu Jul 01 14:17:13 2010 -0400 +++ b/tools/vtpm_manager/Makefile Tue Jul 20 15:26:31 2010 -0400 @@ -3,7 +3,7 @@ # Base definitions and rules include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk -SUBDIRS = crypto tcs util manager migration +SUBDIRS = crypto tcs util manager migration vtpmmgrtalk OPENSSL_HEADER = /usr/include/openssl/crypto.h .PHONY: all clean install diff -r 5793f5c2d67d -r c54dd4a9e114 tools/hotplug/Linux/vtpm --- a/tools/hotplug/Linux/vtpm Tue Jul 20 15:26:31 2010 -0400 +++ b/tools/hotplug/Linux/vtpm Tue Jul 20 15:28:22 2010 -0400 @@ -1,22 +1,18 @@ #!/bin/bash +export PATH=$PATH:/usr/sbin:/sbin + dir=$(dirname "$0") . "$dir/vtpm-hotplug-common.sh" -vtpm_fatal_error=0 - case "$command" in add) vtpm_create_instance + success ;; remove) vtpm_remove_instance + success ;; esac -if [ $vtpm_fatal_error -eq 0 ]; then - log debug "Successful vTPM operation '$command'." - success -else - fatal "Error while executing vTPM operation '$command'." -fi diff -r 5793f5c2d67d -r c54dd4a9e114 tools/hotplug/Linux/vtpm-common.sh --- a/tools/hotplug/Linux/vtpm-common.sh Tue Jul 20 15:26:31 2010 -0400 +++ b/tools/hotplug/Linux/vtpm-common.sh Tue Jul 20 15:28:22 2010 -0400 @@ -98,7 +98,7 @@ avail=0 else instances=$(cat $VTPMDB | \ - awk \ + gawk \ '{ \ if (1 != index($1,"#")) { \ printf("%s ",$2); \ @@ -120,7 +120,7 @@ function vtpmdb_get_free_instancenum () { local ctr instances don found instances=$(cat $VTPMDB | \ - awk \ + gawk \ '{ \ if (1 != index($1,"#")) { \ printf("%s ",$2); \ @@ -174,7 +174,7 @@ inst=$2 res=$(cat $VTPMDB | \ - awk -vvmname=$vmname \ + gawk -vvmname=$vmname \ -vinst=$inst \ '{ \ if ( 1 == index($1,"#")) {\ @@ -209,7 +209,7 @@ VTPMDB_TMP="$VTPMDB".tmp $(cat $VTPMDB | \ - awk -vvmname=$vmname \ + gawk -vvmname=$vmname \ '{ \ if ( $1 != vmname ) { \ print $0; \ @@ -276,12 +276,10 @@ vtpm_create $instance - if [ $vtpm_fatal_error -eq 0 ]; then - if [ "$uuid" != "" ]; then - vtpmdb_add_instance $uuid $instance - else - vtpmdb_add_instance $domname $instance - fi + if [ "$uuid" != "" ]; then + vtpmdb_add_instance $uuid $instance + else + vtpmdb_add_instance $domname $instance fi else if [ "$reason" == "resume" ]; then @@ -290,7 +288,6 @@ vtpm_start $instance fi fi - release_lock vtpmdb xenstore_write $XENBUS_PATH/instance $instance @@ -322,8 +319,8 @@ if [ "$instance" != "0" ]; then vtpm_suspend $instance fi + release_lock vtpmdb - release_lock vtpmdb } @@ -350,13 +347,13 @@ function vtpm_isLocalAddress() { local addr res addr=$(ping $1 -c 1 | \ - awk '{ print substr($3,2,length($3)-2); exit }') + gawk '{ print substr($3,2,length($3)-2); exit }') if [ "$addr" == "" ]; then echo "-1" return fi res=$(ifconfig | grep "inet addr" | \ - awk -vaddr=$addr \ + gawk -vaddr=$addr \ '{ \ if ( addr == substr($2, 6)) {\ print "1"; \ diff -r 5793f5c2d67d -r c54dd4a9e114 tools/hotplug/Linux/vtpm-delete --- a/tools/hotplug/Linux/vtpm-delete Tue Jul 20 15:26:31 2010 -0400 +++ b/tools/hotplug/Linux/vtpm-delete Tue Jul 20 15:28:22 2010 -0400 @@ -5,6 +5,8 @@ # or # vtpm-delete --vmname +export PATH=$PATH:/usr/sbin:/sbin + dir=$(dirname "$0") . "$dir/vtpm-common.sh" diff -r 5793f5c2d67d -r c54dd4a9e114 tools/hotplug/Linux/vtpm-impl --- a/tools/hotplug/Linux/vtpm-impl Tue Jul 20 15:26:31 2010 -0400 +++ b/tools/hotplug/Linux/vtpm-impl Tue Jul 20 15:28:22 2010 -0400 @@ -32,14 +32,16 @@ # OF THE POSSIBILITY OF SUCH DAMAGE. # =================================================================== -# | SRC | TAG | CMD SIZE | ORD |mtype|strt -TPM_CMD_OPEN=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x01 -TPM_CMD_RESM=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x02 -TPM_CMD_CLOS=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x02 -TPM_CMD_DELE=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x03 +export PATH=$PATH:/usr/sbin:/sbin -TPM_TYPE_PVM=\\x01 -TPM_TYPE_HVM=\\x02 +# | SRC |TAG| CMD SZ|| ORD |mtype|strt +TPM_CMD_OPEN="0000000001C100000011010000010101" +TPM_CMD_RESM="0000000001C100000011010000010102" +TPM_CMD_CLOS="0000000001C10000000E01000002" +TPM_CMD_DELE="0000000001C10000000E01000003" + +TPM_TYPE_PVM=01 +TPM_TYPE_HVM=02 TPM_SUCCESS=00000000 @@ -70,24 +72,19 @@ local inst=$2; local inst_bin=$(hex32_to_bin $inst); - claim_lock vtpm_mgr + local resp_hex + #send cmd to vtpm_manager and get response + if ! resp_hex=`echo "$cmd$(str_to_hex32 $inst)" | vtpmmgrtalk `; then + release_lock vtpmdb + fatal "Error communicating with vTPM Manager" + fi - #send cmd to vtpm_manager - printf "$cmd$inst_bin" > $TX_VTPM_MANAGER - - #recv response - set +e - local resp_hex=`dd skip=10 bs=1 count=4 if=$RX_VTPM_MANAGER 2> /dev/null | xxd -ps` - set -e - - release_lock vtpm_mgr + resp_hex=`echo $resp_hex | cut -b 21-` #return whether the command was successful - if [ $resp_hex -ne $TPM_SUCCESS ]; then - vtpm_fatal_error=1 - false - else - true + if [ "$resp_hex" != "$TPM_SUCCESS" ]; then + release_lock vtpmdb + fatal "vTPM Manager returned failure code $resp_hex" fi } @@ -142,13 +139,8 @@ function vtpm_delete() { local inst=$1 - if $(vtpm_manager_cmd $TPM_CMD_DELE $inst); then - rm -f /var/vtpm/vtpm_dm_$1.data - true - else - vtpm_fatal_error=1 - false - fi + $(vtpm_manager_cmd $TPM_CMD_DELE $inst) + rm -f /var/vtpm/vtpm_dm_$1.data } # Perform a migration step. This function differentiates between migration