# HG changeset patch
# User emellor@ewan
# Node ID 55fc0ecc19c3a0dc8838a3b5f0405170246bd702
# Parent 9647be59212dbac04b4bade91195c161a967a9d1
# Parent 7a45b8ccef01803a6f4b3c265e149862d9e00a2d
Merge.
diff -r 9647be59212d -r 55fc0ecc19c3 .hgignore
--- a/.hgignore Wed Sep 21 14:23:26 2005
+++ b/.hgignore Wed Sep 21 14:25:58 2005
@@ -139,9 +139,10 @@
^tools/vnet/vnet-module/\..*\.cmd$
^tools/vnet/vnet-module/\.tmp_versions/.*$
^tools/vnet/vnet-module/vnet_module\.mod\..*$
-^tools/vtpm/vtpm*
-^tools/vtpm/tpm_emulator-*
-^tools/vtpm_manager/manager/vtpm_managerd
+^tools/vtpm/tpm_emulator/.*$
+^tools/vtpm/tpm_emulator-.*\.tar\.gz$
+^tools/vtpm/vtpm/.*$
+^tools/vtpm_manager/manager/vtpm_managerd$
^tools/xcutils/xc_restore$
^tools/xcutils/xc_save$
^tools/xenstat/xentop/xentop$
diff -r 9647be59212d -r 55fc0ecc19c3 linux-2.6-xen-sparse/arch/xen/Kconfig
--- a/linux-2.6-xen-sparse/arch/xen/Kconfig Wed Sep 21 14:23:26 2005
+++ b/linux-2.6-xen-sparse/arch/xen/Kconfig Wed Sep 21 14:25:58 2005
@@ -73,6 +73,8 @@
config XEN_TPMDEV_FRONTEND
bool "TPM-device frontend driver"
default n
+ select TCG_TPM
+ select TCG_XEN
help
The TPM-device frontend driver.
diff -r 9647be59212d -r 55fc0ecc19c3
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Wed Sep 21
14:23:26 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Wed Sep 21
14:25:58 2005
@@ -1,4 +1,4 @@
-/******************************************************************************
+
/******************************************************************************
* drivers/xen/tpmback/interface.c
*
* Vritual TPM interface management.
@@ -21,180 +21,175 @@
static kmem_cache_t *tpmif_cachep;
int num_frontends = 0;
+
LIST_HEAD(tpmif_list);
+tpmif_t *
+alloc_tpmif(domid_t domid, long int instance)
+{
+ struct page *page;
+ tpmif_t *tpmif;
-tpmif_t *alloc_tpmif(domid_t domid, long int instance)
-{
- struct page *page;
- tpmif_t *tpmif;
+ tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
+ if (!tpmif)
+ return ERR_PTR(-ENOMEM);
- tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
- if (!tpmif)
- return ERR_PTR(-ENOMEM);
+ memset(tpmif, 0, sizeof (*tpmif));
+ tpmif->domid = domid;
+ tpmif->status = DISCONNECTED;
+ tpmif->tpm_instance = instance;
+ atomic_set(&tpmif->refcnt, 1);
- memset(tpmif, 0, sizeof(*tpmif));
- tpmif->domid = domid;
- tpmif->status = DISCONNECTED;
- tpmif->tpm_instance = instance;
- atomic_set(&tpmif->refcnt, 1);
+ page = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE);
+ BUG_ON(page == NULL);
+ tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
- page = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE);
- BUG_ON(page == NULL);
- tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
+ list_add(&tpmif->tpmif_list, &tpmif_list);
+ num_frontends++;
- list_add(&tpmif->tpmif_list, &tpmif_list);
- num_frontends++;
-
- return tpmif;
+ return tpmif;
}
-
-void free_tpmif(tpmif_t *tpmif)
+void
+free_tpmif(tpmif_t * tpmif)
{
- num_frontends--;
- list_del(&tpmif->tpmif_list);
- kmem_cache_free(tpmif_cachep, tpmif);
+ num_frontends--;
+ list_del(&tpmif->tpmif_list);
+ kmem_cache_free(tpmif_cachep, tpmif);
}
+tpmif_t *
+tpmif_find(domid_t domid, long int instance)
+{
+ tpmif_t *tpmif;
-tpmif_t *tpmif_find(domid_t domid, long int instance)
-{
- tpmif_t *tpmif;
+ list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
+ if (tpmif->tpm_instance == instance) {
+ if (tpmif->domid == domid) {
+ tpmif_get(tpmif);
+ return tpmif;
+ } else {
+ return NULL;
+ }
+ }
+ }
- list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
- if (tpmif->tpm_instance == instance) {
- if (tpmif->domid == domid) {
- tpmif_get(tpmif);
- return tpmif;
- } else {
- return NULL;
- }
- }
- }
-
- return alloc_tpmif(domid, instance);
+ return alloc_tpmif(domid, instance);
}
+static int
+map_frontend_page(tpmif_t * tpmif, unsigned long localaddr,
+ unsigned long shared_page)
+{
+ struct gnttab_map_grant_ref op = {
+ .host_addr = localaddr,
+ .flags = GNTMAP_host_map,
+ .ref = shared_page,
+ .dom = tpmif->domid,
+ };
-static int map_frontend_page(tpmif_t *tpmif, unsigned long localaddr,
- unsigned long shared_page)
-{
- struct gnttab_map_grant_ref op = {
- .host_addr = localaddr,
- .flags = GNTMAP_host_map,
- .ref = shared_page,
- .dom = tpmif->domid,
- };
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
- BUG_ON( HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) );
+ if (op.handle < 0) {
+ DPRINTK(" Grant table operation failure !\n");
+ return op.handle;
+ }
- if (op.handle < 0) {
- DPRINTK(" Grant table operation failure !\n");
- return op.handle;
- }
-
- tpmif->shmem_ref = shared_page;
- tpmif->shmem_handle = op.handle;
- tpmif->shmem_vaddr = localaddr;
- return 0;
+ tpmif->shmem_ref = shared_page;
+ tpmif->shmem_handle = op.handle;
+ tpmif->shmem_vaddr = localaddr;
+ return 0;
}
+static void
+unmap_frontend_page(tpmif_t * tpmif)
+{
+ struct gnttab_unmap_grant_ref op;
-static void unmap_frontend_page(tpmif_t *tpmif)
-{
- struct gnttab_unmap_grant_ref op;
+ op.host_addr = tpmif->shmem_vaddr;
+ op.handle = tpmif->shmem_handle;
+ op.dev_bus_addr = 0;
- op.host_addr = tpmif->shmem_vaddr;
- op.handle = tpmif->shmem_handle;
- op.dev_bus_addr = 0;
-
- BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
}
+int
+tpmif_map(tpmif_t * tpmif, unsigned long shared_page, unsigned int evtchn)
+{
+ struct vm_struct *vma;
+ evtchn_op_t op = {.cmd = EVTCHNOP_bind_interdomain };
+ int err;
-int tpmif_map(tpmif_t *tpmif,
- unsigned long shared_page, unsigned int evtchn)
-{
- struct vm_struct *vma;
- evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
- int err;
+ BUG_ON(tpmif->remote_evtchn);
- BUG_ON(tpmif->remote_evtchn);
+ if ((vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL)
+ return -ENOMEM;
- if ( (vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL )
- return -ENOMEM;
+ err = map_frontend_page(tpmif, VMALLOC_VMADDR(vma->addr), shared_page);
+ if (err) {
+ vfree(vma->addr);
+ return err;
+ }
- err = map_frontend_page(tpmif,
- VMALLOC_VMADDR(vma->addr),
- shared_page);
- if (err) {
- vfree(vma->addr);
- return err;
- }
+ op.u.bind_interdomain.dom1 = DOMID_SELF;
+ op.u.bind_interdomain.dom2 = tpmif->domid;
+ op.u.bind_interdomain.port1 = 0;
+ op.u.bind_interdomain.port2 = evtchn;
+ err = HYPERVISOR_event_channel_op(&op);
+ if (err) {
+ unmap_frontend_page(tpmif);
+ vfree(vma->addr);
+ return err;
+ }
- op.u.bind_interdomain.dom1 = DOMID_SELF;
- op.u.bind_interdomain.dom2 = tpmif->domid;
- op.u.bind_interdomain.port1 = 0;
- op.u.bind_interdomain.port2 = evtchn;
- err = HYPERVISOR_event_channel_op(&op);
- if (err) {
- unmap_frontend_page(tpmif);
- vfree(vma->addr);
- return err;
- }
+ tpmif->evtchn = op.u.bind_interdomain.port1;
+ tpmif->remote_evtchn = evtchn;
- tpmif->evtchn = op.u.bind_interdomain.port1;
- tpmif->remote_evtchn = evtchn;
+ tpmif->tx = (tpmif_tx_interface_t *) vma->addr;
- tpmif->tx = (tpmif_tx_interface_t *) vma->addr;
+ bind_evtchn_to_irqhandler(tpmif->evtchn,
+ tpmif_be_int, 0, "tpmif-backend", tpmif);
+ tpmif->status = CONNECTED;
+ tpmif->shmem_ref = shared_page;
+ tpmif->active = 1;
- bind_evtchn_to_irqhandler(tpmif->evtchn,
- tpmif_be_int,
- 0,
- "tpmif-backend",
- tpmif);
- tpmif->status = CONNECTED;
- tpmif->shmem_ref = shared_page;
- tpmif->active = 1;
-
- return 0;
+ return 0;
}
+static void
+__tpmif_disconnect_complete(void *arg)
+{
+ evtchn_op_t op = {.cmd = EVTCHNOP_close };
+ tpmif_t *tpmif = (tpmif_t *) arg;
-static void __tpmif_disconnect_complete(void *arg)
-{
- evtchn_op_t op = { .cmd = EVTCHNOP_close };
- tpmif_t *tpmif = (tpmif_t *) arg;
+ op.u.close.port = tpmif->evtchn;
+ op.u.close.dom = DOMID_SELF;
+ HYPERVISOR_event_channel_op(&op);
+ op.u.close.port = tpmif->remote_evtchn;
+ op.u.close.dom = tpmif->domid;
+ HYPERVISOR_event_channel_op(&op);
- op.u.close.port = tpmif->evtchn;
- op.u.close.dom = DOMID_SELF;
- HYPERVISOR_event_channel_op(&op);
- op.u.close.port = tpmif->remote_evtchn;
- op.u.close.dom = tpmif->domid;
- HYPERVISOR_event_channel_op(&op);
+ if (tpmif->evtchn)
+ unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif);
- if (tpmif->evtchn)
- unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif);
+ if (tpmif->tx) {
+ unmap_frontend_page(tpmif);
+ vfree(tpmif->tx);
+ }
- if (tpmif->tx) {
- unmap_frontend_page(tpmif);
- vfree(tpmif->tx);
- }
-
- free_tpmif(tpmif);
+ free_tpmif(tpmif);
}
-
-void tpmif_disconnect_complete(tpmif_t * tpmif)
+void
+tpmif_disconnect_complete(tpmif_t * tpmif)
{
- INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif);
- schedule_work(&tpmif->work);
+ INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif);
+ schedule_work(&tpmif->work);
}
-
-void __init tpmif_interface_init(void)
+void __init
+tpmif_interface_init(void)
{
- tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof(tpmif_t),
- 0, 0, NULL, NULL);
+ tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t),
+ 0, 0, NULL, NULL);
}
diff -r 9647be59212d -r 55fc0ecc19c3
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Wed Sep 21
14:23:26 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Wed Sep 21
14:25:58 2005
@@ -257,18 +257,24 @@
tpm_allocate_buffers(tp);
- info->ring_ref = gnttab_claim_grant_reference(&gref_head);
- ASSERT(info->ring_ref != -ENOSPC);
- gnttab_grant_foreign_access_ref(info->ring_ref,
- backend_id,
- (virt_to_machine(tp->tx) >> PAGE_SHIFT),
- 0);
+ err = gnttab_grant_foreign_access(backend_id,
+ (virt_to_machine(tp->tx) >>
PAGE_SHIFT),
+ 0);
+
+ if (err == -ENOSPC) {
+ free_page((unsigned long)sring);
+ tp->tx = NULL;
+ xenbus_dev_error(dev, err, "allocating grant reference");
+ return err;
+ }
+ info->ring_ref = err;
op.u.alloc_unbound.dom = backend_id;
err = HYPERVISOR_event_channel_op(&op);
if (err) {
+ gnttab_end_foreign_access(info->ring_ref, 0);
free_page((unsigned long)sring);
- tp->tx = 0;
+ tp->tx = NULL;
xenbus_dev_error(dev, err, "allocating event channel");
return err;
}
@@ -282,6 +288,7 @@
tpmif_set_connected_state(tp,0);
if ( tp->tx != NULL ) {
+ gnttab_end_foreign_access(info->ring_ref, 0);
free_page((unsigned long)tp->tx);
tp->tx = NULL;
}
diff -r 9647be59212d -r 55fc0ecc19c3
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h
--- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h Wed Sep 21
14:23:26 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h Wed Sep 21
14:25:58 2005
@@ -2,7 +2,8 @@
#define TPM_FRONT_H
-struct tpm_private {
+struct tpm_private
+{
tpmif_tx_interface_t *tx;
unsigned int evtchn;
int connected;
@@ -29,7 +30,8 @@
};
-struct tx_buffer {
+struct tx_buffer
+{
unsigned int size; // available space in data
unsigned int len; // used space in data
unsigned char *data; // pointer to a page
diff -r 9647be59212d -r 55fc0ecc19c3 tools/examples/xmexample.vmx
--- a/tools/examples/xmexample.vmx Wed Sep 21 14:23:26 2005
+++ b/tools/examples/xmexample.vmx Wed Sep 21 14:25:58 2005
@@ -25,6 +25,10 @@
# A name for your domain. All domains must have different names.
name = "ExampleVMXDomain"
+
+#-----------------------------------------------------------------------------
+# the number of cpus guest platform has, default=1
+vcpus=1
# Which CPU to start domain on?
#cpu = -1 # leave to Xen to pick
diff -r 9647be59212d -r 55fc0ecc19c3 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Wed Sep 21 14:23:26 2005
+++ b/tools/ioemu/vl.c Wed Sep 21 14:25:58 2005
@@ -126,6 +126,7 @@
int vm_running;
int audio_enabled = 0;
int nic_pcnet = 1;
+int vcpus = 1;
int sb16_enabled = 1;
int adlib_enabled = 1;
int gus_enabled = 1;
@@ -2105,6 +2106,7 @@
"-snapshot write to temporary files instead of disk image
files\n"
"-m megs set virtual RAM size to megs MB [default=%d]\n"
"-nographic disable graphical output and redirect serial I/Os
to console\n"
+ "-vcpus set CPU number of guest platform\n"
#ifdef CONFIG_VNC
"-vnc port use vnc instead of sdl\n"
"-vncport port use a different port\n"
@@ -2235,6 +2237,7 @@
QEMU_OPTION_hdachs,
QEMU_OPTION_L,
QEMU_OPTION_no_code_copy,
+ QEMU_OPTION_vcpus,
QEMU_OPTION_pci,
QEMU_OPTION_nic_pcnet,
QEMU_OPTION_isa,
@@ -2307,6 +2310,7 @@
{ "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
{ "L", HAS_ARG, QEMU_OPTION_L },
{ "no-code-copy", 0, QEMU_OPTION_no_code_copy },
+ { "vcpus", 1, QEMU_OPTION_vcpus },
#ifdef TARGET_PPC
{ "prep", 0, QEMU_OPTION_prep },
{ "g", 1, QEMU_OPTION_g },
@@ -2646,6 +2650,9 @@
case QEMU_OPTION_S:
start_emulation = 0;
break;
+ case QEMU_OPTION_vcpus:
+ vcpus = atoi(optarg);
+ fprintf(logfile, "qemu: the number of cpus is %d\n", vcpus);
case QEMU_OPTION_pci:
pci_enabled = 1;
break;
diff -r 9647be59212d -r 55fc0ecc19c3 tools/libxc/xc_vmx_build.c
--- a/tools/libxc/xc_vmx_build.c Wed Sep 21 14:23:26 2005
+++ b/tools/libxc/xc_vmx_build.c Wed Sep 21 14:25:58 2005
@@ -626,6 +626,10 @@
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_data[i].evtchn_upcall_mask = 1;
+
+ shared_info->n_vcpu = vcpus;
+ printf(" VCPUS: %d\n", shared_info->n_vcpu);
+
munmap(shared_info, PAGE_SIZE);
/* Populate the event channel port in the shared page */
diff -r 9647be59212d -r 55fc0ecc19c3 tools/python/xen/util/process.py
--- a/tools/python/xen/util/process.py Wed Sep 21 14:23:26 2005
+++ b/tools/python/xen/util/process.py Wed Sep 21 14:25:58 2005
@@ -24,6 +24,8 @@
r = p.poll()
for (fd, event) in r:
if event == select.POLLHUP:
+ cout.close()
+ cerr.close()
return stdout
if fd == cout.fileno():
stdout = stdout + cout.readline()
diff -r 9647be59212d -r 55fc0ecc19c3 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Wed Sep 21 14:23:26 2005
+++ b/tools/python/xen/xend/image.py Wed Sep 21 14:25:58 2005
@@ -324,7 +324,7 @@
# xm config file
def parseDeviceModelArgs(self, imageConfig, deviceConfig):
dmargs = [ 'cdrom', 'boot', 'fda', 'fdb',
- 'localtime', 'serial', 'stdvga', 'isa' ]
+ 'localtime', 'serial', 'stdvga', 'isa', 'vcpus' ]
ret = []
for a in dmargs:
v = sxp.child_value(imageConfig, a)
diff -r 9647be59212d -r 55fc0ecc19c3 tools/python/xen/xend/server/blkif.py
--- a/tools/python/xen/xend/server/blkif.py Wed Sep 21 14:23:26 2005
+++ b/tools/python/xen/xend/server/blkif.py Wed Sep 21 14:25:58 2005
@@ -42,7 +42,7 @@
typedev = sxp.child_value(config, 'dev')
if re.match('^ioemu:', typedev):
- return
+ return (0,{},{})
devid = blkif.blkdev_name_to_number(sxp.child_value(config, 'dev'))
diff -r 9647be59212d -r 55fc0ecc19c3 tools/python/xen/xend/server/tpmif.py
--- a/tools/python/xen/xend/server/tpmif.py Wed Sep 21 14:23:26 2005
+++ b/tools/python/xen/xend/server/tpmif.py Wed Sep 21 14:25:58 2005
@@ -39,7 +39,7 @@
"""@see DevController.getDeviceDetails"""
devid = int(sxp.child_value(config, 'instance', '0'))
- log.error("The domain has a TPM with instance %d." % devid)
+ log.debug("The domain has a TPM with instance %d." % devid)
back = { 'instance' : "%i" % devid }
front = { 'handle' : "%i" % devid }
diff -r 9647be59212d -r 55fc0ecc19c3 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Wed Sep 21 14:23:26 2005
+++ b/tools/python/xen/xm/create.py Wed Sep 21 14:25:58 2005
@@ -496,7 +496,7 @@
def configure_vmx(opts, config_image, vals):
"""Create the config for VMX devices.
"""
- args = [ 'memmap', 'device_model', 'cdrom',
+ args = [ 'memmap', 'device_model', 'vcpus', 'cdrom',
'boot', 'fda', 'fdb', 'localtime', 'serial', 'macaddr', 'stdvga',
'isa', 'nographic', 'vnc', 'vncviewer', 'sdl', 'display']
for a in args:
diff -r 9647be59212d -r 55fc0ecc19c3 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c Wed Sep 21 14:23:26 2005
+++ b/xen/arch/x86/vmx.c Wed Sep 21 14:25:58 2005
@@ -377,12 +377,13 @@
static int vmx_do_page_fault(unsigned long va, struct cpu_user_regs *regs)
{
- unsigned long eip;
unsigned long gpa; /* FIXME: PAE */
int result;
-#if VMX_DEBUG
+#if 0 /* keep for debugging */
{
+ unsigned long eip;
+
__vmread(GUEST_RIP, &eip);
VMX_DBG_LOG(DBG_LEVEL_VMMU,
"vmx_do_page_fault = 0x%lx, eip = %lx, error_code = %lx",
@@ -429,9 +430,9 @@
clts();
setup_fpu(current);
- __vmread(CR0_READ_SHADOW, &cr0);
+ __vmread_vcpu(CR0_READ_SHADOW, &cr0);
if (!(cr0 & X86_CR0_TS)) {
- __vmread(GUEST_CR0, &cr0);
+ __vmread_vcpu(GUEST_CR0, &cr0);
cr0 &= ~X86_CR0_TS;
__vmwrite(GUEST_CR0, cr0);
}
@@ -1129,9 +1130,7 @@
__vmwrite(VM_ENTRY_CONTROLS, vm_entry_value);
}
}
- __vmread(GUEST_RIP, &eip);
- VMX_DBG_LOG(DBG_LEVEL_1,
- "Disabling CR0.PE at %%eip 0x%lx\n", eip);
+
if (vmx_assist(d, VMX_ASSIST_INVOKE)) {
set_bit(VMX_CPU_STATE_ASSIST_ENABLED, &d->arch.arch_vmx.cpu_state);
__vmread(GUEST_RIP, &eip);
@@ -1370,17 +1369,17 @@
clts();
setup_fpu(current);
- __vmread(GUEST_CR0, &value);
+ __vmread_vcpu(GUEST_CR0, &value);
value &= ~X86_CR0_TS; /* clear TS */
__vmwrite(GUEST_CR0, value);
- __vmread(CR0_READ_SHADOW, &value);
+ __vmread_vcpu(CR0_READ_SHADOW, &value);
value &= ~X86_CR0_TS; /* clear TS */
__vmwrite(CR0_READ_SHADOW, value);
break;
case TYPE_LMSW:
TRACE_VMEXIT(1,TYPE_LMSW);
- __vmread(CR0_READ_SHADOW, &value);
+ __vmread_vcpu(CR0_READ_SHADOW, &value);
value = (value & ~0xF) |
(((exit_qualification & LMSW_SOURCE_DATA) >> 16) & 0xF);
return vmx_set_cr0(value);
@@ -1456,16 +1455,12 @@
(unsigned long)regs->edx);
}
+volatile unsigned long do_hlt_count;
/*
* Need to use this exit to reschedule
*/
-static inline void vmx_vmexit_do_hlt(void)
-{
-#if VMX_DEBUG
- unsigned long eip;
- __vmread(GUEST_RIP, &eip);
-#endif
- VMX_DBG_LOG(DBG_LEVEL_1, "vmx_vmexit_do_hlt:eip=%lx", eip);
+void vmx_vmexit_do_hlt(void)
+{
raise_softirq(SCHEDULE_SOFTIRQ);
}
@@ -1516,13 +1511,9 @@
}
}
+volatile unsigned long do_mwait_count;
static inline void vmx_vmexit_do_mwait(void)
{
-#if VMX_DEBUG
- unsigned long eip;
- __vmread(GUEST_RIP, &eip);
-#endif
- VMX_DBG_LOG(DBG_LEVEL_1, "vmx_vmexit_do_mwait:eip=%lx", eip);
raise_softirq(SCHEDULE_SOFTIRQ);
}
@@ -1631,9 +1622,13 @@
return;
}
- __vmread(GUEST_RIP, &eip);
- TRACE_3D(TRC_VMX_VMEXIT, v->domain->domain_id, eip, exit_reason);
- TRACE_VMEXIT(0,exit_reason);
+#ifdef TRACE_BUFFER
+ {
+ __vmread(GUEST_RIP, &eip);
+ TRACE_3D(TRC_VMX_VMEXIT, v->domain->domain_id, eip, exit_reason);
+ TRACE_VMEXIT(0,exit_reason);
+ }
+#endif
switch (exit_reason) {
case EXIT_REASON_EXCEPTION_NMI:
diff -r 9647be59212d -r 55fc0ecc19c3 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c Wed Sep 21 14:23:26 2005
+++ b/xen/arch/x86/vmx_io.c Wed Sep 21 14:25:58 2005
@@ -891,7 +891,7 @@
struct vcpu *v = current;
highest_vector = find_highest_pending_irq(v, &intr_type);
- __vmread(CPU_BASED_VM_EXEC_CONTROL, &cpu_exec_control);
+ __vmread_vcpu(CPU_BASED_VM_EXEC_CONTROL, &cpu_exec_control);
if (highest_vector == -1) {
disable_irq_window(cpu_exec_control);
@@ -948,14 +948,6 @@
void vmx_do_resume(struct vcpu *d)
{
vmx_stts();
- if ( vmx_paging_enabled(d) )
- __vmwrite(GUEST_CR3, pagetable_get_paddr(d->arch.shadow_table));
- else
- // paging is not enabled in the guest
- __vmwrite(GUEST_CR3, pagetable_get_paddr(d->domain->arch.phys_table));
-
- __vmwrite(HOST_CR3, pagetable_get_paddr(d->arch.monitor_table));
- __vmwrite(HOST_RSP, (unsigned long)get_stack_bottom());
if (event_pending(d)) {
vmx_check_events(d);
diff -r 9647be59212d -r 55fc0ecc19c3 xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c Wed Sep 21 14:23:26 2005
+++ b/xen/arch/x86/vmx_vmcs.c Wed Sep 21 14:25:58 2005
@@ -67,9 +67,6 @@
error |= __vmwrite(PIN_BASED_VM_EXEC_CONTROL,
MONITOR_PIN_BASED_EXEC_CONTROLS);
-
- error |= __vmwrite(CPU_BASED_VM_EXEC_CONTROL,
- MONITOR_CPU_BASED_EXEC_CONTROLS);
error |= __vmwrite(VM_EXIT_CONTROLS, MONITOR_VM_EXIT_CONTROLS);
@@ -117,12 +114,6 @@
unsigned long fs_base;
unsigned long gs_base;
#endif
-
- /* control registers */
- unsigned long cr3;
- unsigned long cr0;
- unsigned long cr4;
- unsigned long dr7;
};
#define round_pgdown(_p) ((_p)&PAGE_MASK) /* coped from domain.c */
@@ -217,8 +208,32 @@
/* Update CR3, GDT, LDT, TR */
unsigned int error = 0;
unsigned long pfn = 0;
+ unsigned long cr0, cr4;
struct pfn_info *page;
struct cpu_user_regs *regs = guest_cpu_user_regs();
+
+ __asm__ __volatile__ ("mov %%cr0,%0" : "=r" (cr0) : );
+
+ error |= __vmwrite(GUEST_CR0, cr0);
+ cr0 &= ~X86_CR0_PG;
+ error |= __vmwrite(CR0_READ_SHADOW, cr0);
+ error |= __vmwrite(CPU_BASED_VM_EXEC_CONTROL,
+ MONITOR_CPU_BASED_EXEC_CONTROLS);
+
+ __asm__ __volatile__ ("mov %%cr4,%0" : "=r" (cr4) : );
+
+#ifdef __x86_64__
+ error |= __vmwrite(GUEST_CR4, cr4 & ~X86_CR4_PSE);
+#else
+ error |= __vmwrite(GUEST_CR4, cr4);
+#endif
+
+#ifdef __x86_64__
+ cr4 &= ~(X86_CR4_PGE | X86_CR4_VMXE | X86_CR4_PAE);
+#else
+ cr4 &= ~(X86_CR4_PGE | X86_CR4_VMXE);
+#endif
+ error |= __vmwrite(CR4_READ_SHADOW, cr4);
vmx_stts();
@@ -254,7 +269,7 @@
int error = 0;
union vmcs_arbytes arbytes;
unsigned long dr7;
- unsigned long eflags, shadow_cr;
+ unsigned long eflags;
/* MSR */
error |= __vmwrite(VM_EXIT_MSR_LOAD_ADDR, 0);
@@ -326,27 +341,7 @@
arbytes.fields.seg_type = 0xb; /* 32-bit TSS (busy) */
error |= __vmwrite(GUEST_TR_AR_BYTES, arbytes.bytes);
-
- error |= __vmwrite(GUEST_CR0, host_env->cr0); /* same CR0 */
-
- /* Initally PG, PE are not set*/
- shadow_cr = host_env->cr0;
- shadow_cr &= ~X86_CR0_PG;
- error |= __vmwrite(CR0_READ_SHADOW, shadow_cr);
/* CR3 is set in vmx_final_setup_guest */
-#ifdef __x86_64__
- error |= __vmwrite(GUEST_CR4, host_env->cr4 & ~X86_CR4_PSE);
-#else
- error |= __vmwrite(GUEST_CR4, host_env->cr4);
-#endif
- shadow_cr = host_env->cr4;
-
-#ifdef __x86_64__
- shadow_cr &= ~(X86_CR4_PGE | X86_CR4_VMXE | X86_CR4_PAE);
-#else
- shadow_cr &= ~(X86_CR4_PGE | X86_CR4_VMXE);
-#endif
- error |= __vmwrite(CR4_READ_SHADOW, shadow_cr);
error |= __vmwrite(GUEST_ES_BASE, host_env->ds_base);
error |= __vmwrite(GUEST_CS_BASE, host_env->cs_base);
@@ -403,12 +398,10 @@
host_env->cs_base = 0;
__asm__ __volatile__ ("mov %%cr0,%0" : "=r" (crn) : );
- host_env->cr0 = crn;
error |= __vmwrite(HOST_CR0, crn); /* same CR0 */
/* CR3 is set in vmx_final_setup_hostos */
__asm__ __volatile__ ("mov %%cr4,%0" : "=r" (crn) : );
- host_env->cr4 = crn;
error |= __vmwrite(HOST_CR4, crn);
error |= __vmwrite(HOST_RIP, (unsigned long) vmx_asm_vmexit_handler);
diff -r 9647be59212d -r 55fc0ecc19c3 xen/include/asm-x86/vmx.h
--- a/xen/include/asm-x86/vmx.h Wed Sep 21 14:23:26 2005
+++ b/xen/include/asm-x86/vmx.h Wed Sep 21 14:25:58 2005
@@ -314,6 +314,57 @@
return 0;
}
+
+static always_inline void __vmwrite_vcpu(unsigned long field, unsigned long
value)
+{
+ struct vcpu *v = current;
+
+ switch(field) {
+ case CR0_READ_SHADOW:
+ v->arch.arch_vmx.cpu_shadow_cr0 = value;
+ break;
+ case GUEST_CR0:
+ v->arch.arch_vmx.cpu_cr0 = value;
+ break;
+ case CPU_BASED_VM_EXEC_CONTROL:
+ v->arch.arch_vmx.cpu_based_exec_control = value;
+ break;
+ default:
+ printk("__vmwrite_cpu: invalid field %lx\n", field);
+ break;
+ }
+}
+
+static always_inline void __vmread_vcpu(unsigned long field, unsigned long
*value)
+{
+ struct vcpu *v = current;
+
+ switch(field) {
+ case CR0_READ_SHADOW:
+ *value = v->arch.arch_vmx.cpu_shadow_cr0;
+ break;
+ case GUEST_CR0:
+ *value = v->arch.arch_vmx.cpu_cr0;
+ break;
+ case CPU_BASED_VM_EXEC_CONTROL:
+ *value = v->arch.arch_vmx.cpu_based_exec_control;
+ break;
+ default:
+ printk("__vmread_cpu: invalid field %lx\n", field);
+ break;
+ }
+
+ /*
+ * __vmwrite() can be used for non-current vcpu, and it's possible that
+ * the vcpu field is not initialized at that case.
+ *
+ */
+ if (!*value) {
+ __vmread(field, value);
+ __vmwrite_vcpu(field, *value);
+ }
+}
+
static inline int __vmwrite (unsigned long field, unsigned long value)
{
unsigned long eflags;
@@ -326,6 +377,15 @@
__save_flags(eflags);
if (eflags & X86_EFLAGS_ZF || eflags & X86_EFLAGS_CF)
return -1;
+
+ switch(field) {
+ case CR0_READ_SHADOW:
+ case GUEST_CR0:
+ case CPU_BASED_VM_EXEC_CONTROL:
+ __vmwrite_vcpu(field, value);
+ break;
+ }
+
return 0;
}
@@ -379,11 +439,12 @@
{
unsigned long cr0;
- __vmread(GUEST_CR0, &cr0);
- if (!(cr0 & X86_CR0_TS))
+ __vmread_vcpu(GUEST_CR0, &cr0);
+ if (!(cr0 & X86_CR0_TS)) {
__vmwrite(GUEST_CR0, cr0 | X86_CR0_TS);
-
- __vmread(CR0_READ_SHADOW, &cr0);
+ }
+
+ __vmread_vcpu(CR0_READ_SHADOW, &cr0);
if (!(cr0 & X86_CR0_TS))
__vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_NM);
}
@@ -393,7 +454,7 @@
{
unsigned long cr0;
- __vmread(CR0_READ_SHADOW, &cr0);
+ __vmread_vcpu(CR0_READ_SHADOW, &cr0);
return (cr0 & X86_CR0_PE) && (cr0 & X86_CR0_PG);
}
diff -r 9647be59212d -r 55fc0ecc19c3 xen/include/asm-x86/vmx_vmcs.h
--- a/xen/include/asm-x86/vmx_vmcs.h Wed Sep 21 14:23:26 2005
+++ b/xen/include/asm-x86/vmx_vmcs.h Wed Sep 21 14:25:58 2005
@@ -74,9 +74,12 @@
struct arch_vmx_struct {
struct vmcs_struct *vmcs; /* VMCS pointer in virtual */
unsigned long flags; /* VMCS flags */
+ unsigned long cpu_cr0; /* copy of guest CR0 */
+ unsigned long cpu_shadow_cr0; /* copy of guest read shadow CR0 */
unsigned long cpu_cr2; /* save CR2 */
unsigned long cpu_cr3;
unsigned long cpu_state;
+ unsigned long cpu_based_exec_control;
struct msr_state msr_content;
void *io_bitmap_a, *io_bitmap_b;
};
diff -r 9647be59212d -r 55fc0ecc19c3 xen/include/public/io/tpmif.h
--- a/xen/include/public/io/tpmif.h Wed Sep 21 14:23:26 2005
+++ b/xen/include/public/io/tpmif.h Wed Sep 21 14:25:58 2005
@@ -20,8 +20,7 @@
unsigned long addr; /* Machine address of packet. */
int ref; /* grant table access reference */
u16 id; /* Echoed in response message. */
- u16 size:15; /* Packet size in bytes. */
- u16 mapped:1;
+ u16 size; /* Packet size in bytes. */
} tpmif_tx_request_t;
/*
@@ -30,13 +29,16 @@
*/
typedef u32 TPMIF_RING_IDX;
-#define TPMIF_TX_RING_SIZE 16
+#define TPMIF_TX_RING_SIZE 10
/* This structure must fit in a memory page. */
+
typedef struct {
- union {
- tpmif_tx_request_t req;
- } ring[TPMIF_TX_RING_SIZE];
+ tpmif_tx_request_t req;
+} tpmif_ring_t;
+
+typedef struct {
+ tpmif_ring_t ring[TPMIF_TX_RING_SIZE];
} tpmif_tx_interface_t;
#endif
diff -r 9647be59212d -r 55fc0ecc19c3 tools/vtpm/tpm_emulator-0.2b-x86_64.patch
--- /dev/null Wed Sep 21 14:23:26 2005
+++ b/tools/vtpm/tpm_emulator-0.2b-x86_64.patch Wed Sep 21 14:25:58 2005
@@ -0,0 +1,499 @@
+diff -uprN tpm_emulator-0.2/crypto/gmp_kernel_wrapper.c
tpm_emulator-0.2-x86_64/crypto/gmp_kernel_wrapper.c
+--- tpm_emulator-0.2/crypto/gmp_kernel_wrapper.c 2005-08-15
00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/crypto/gmp_kernel_wrapper.c 2005-09-19
14:10:29.000000000 -0700
+@@ -79,7 +79,7 @@ void __attribute__ ((regparm(0))) *kerne
+ {
+ void *ret = (void*)kmalloc(size, GFP_KERNEL);
+ if (!ret) panic(KERN_CRIT TPM_MODULE_NAME
+- "GMP: cannot allocate memory (size=%u)\n", size);
++ "GMP: cannot allocate memory (size=%Zu)\n", size);
+ return ret;
+ }
+
+@@ -88,7 +88,7 @@ void __attribute__ ((regparm(0))) *kerne
+ {
+ void *ret = (void*)kmalloc(new_size, GFP_KERNEL);
+ if (!ret) panic(KERN_CRIT TPM_MODULE_NAME "GMP: Cannot reallocate memory "
+- "(old_size=%u new_size=%u)\n", old_size, new_size);
++ "(old_size=%Zu new_size=%Zu)\n", old_size, new_size);
+ memcpy(ret, oldptr, old_size);
+ kfree(oldptr);
+ return ret;
+diff -uprN tpm_emulator-0.2/linux_module.c
tpm_emulator-0.2-x86_64/linux_module.c
+--- tpm_emulator-0.2/linux_module.c 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/linux_module.c 2005-09-19 14:10:29.000000000
-0700
+@@ -66,7 +66,7 @@ static int tpm_release(struct inode *ino
+
+ static ssize_t tpm_read(struct file *file, char *buf, size_t count, loff_t
*ppos)
+ {
+- debug("%s(%d)", __FUNCTION__, count);
++ debug("%s(%Zu)", __FUNCTION__, count);
+ down(&tpm_mutex);
+ if (tpm_response.data != NULL) {
+ count = min(count, (size_t)tpm_response.size - (size_t)*ppos);
+@@ -81,7 +81,7 @@ static ssize_t tpm_read(struct file *fil
+
+ static ssize_t tpm_write(struct file *file, const char *buf, size_t count,
loff_t *ppos)
+ {
+- debug("%s(%d)", __FUNCTION__, count);
++ debug("%s(%Zu)", __FUNCTION__, count);
+ down(&tpm_mutex);
+ *ppos = 0;
+ if (tpm_response.data != NULL) kfree(tpm_response.data);
+diff -uprN tpm_emulator-0.2/linux_module.h
tpm_emulator-0.2-x86_64/linux_module.h
+--- tpm_emulator-0.2/linux_module.h 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/linux_module.h 2005-09-19 14:10:29.000000000
-0700
+@@ -28,8 +28,10 @@
+
+ /* module settings */
+
++#ifndef STR
+ #define STR(s) __STR__(s)
+ #define __STR__(s) #s
++#endif
+ #include "tpm_version.h"
+
+ #define TPM_DEVICE_MINOR 224
+diff -uprN tpm_emulator-0.2/Makefile tpm_emulator-0.2-x86_64/Makefile
+--- tpm_emulator-0.2/Makefile 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/Makefile 2005-09-19 14:10:29.000000000 -0700
+@@ -7,6 +7,7 @@
+ KERNEL_RELEASE := $(shell uname -r)
+ KERNEL_BUILD := /lib/modules/$(KERNEL_RELEASE)/build
+ MOD_SUBDIR := misc
++COMPILE_ARCH ?= $(shell uname -m | sed -e s/i.86/x86_32/)
+
+ # module settings
+ MODULE_NAME := tpm_emulator
+@@ -17,8 +18,14 @@ VERSION_BUILD := $(shell date +"%s")
+ # enable/disable DEBUG messages
+ EXTRA_CFLAGS += -DDEBUG -g
+
++ifeq ($(COMPILE_ARCH),x86_64)
++LIBDIR = lib64
++else
++LIBDIR = lib
++endif
++
+ # GNU MP configuration
+-GMP_LIB := /usr/lib/libgmp.a
++GMP_LIB := /usr/$(LIBDIR)/libgmp.a
+ GMP_HEADER := /usr/include/gmp.h
+
+ # sources and objects
+diff -uprN tpm_emulator-0.2/README tpm_emulator-0.2-x86_64/README
+--- tpm_emulator-0.2/README 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/README 2005-09-19 14:21:43.000000000 -0700
+@@ -45,6 +45,12 @@ Example:
+ GMP_LIB := /usr/lib/libgmp.a
+ GMP_HEADER := /usr/include/gmp.h
+
++GNU MP Library on 64 bit Systems
++--------------------------------------------------------------------------
++Some 64-bit kernels have problems with importing the user-space gmp
++library (/usr/lib*/libgmp.a) into kernel space. These kernels will require
++that the gmp library be recompiled for kernel space with -mcmodel=kernel.
++
+ Installation
+ --------------------------------------------------------------------------
+ The compilation and installation process uses the build environment for
+diff -uprN tpm_emulator-0.2/tpm/tpm_credentials.c
tpm_emulator-0.2-x86_64/tpm/tpm_credentials.c
+--- tpm_emulator-0.2/tpm/tpm_credentials.c 2005-08-15 00:58:57.000000000
-0700
++++ tpm_emulator-0.2-x86_64/tpm/tpm_credentials.c 2005-09-19
14:10:29.000000000 -0700
+@@ -47,16 +47,16 @@ int tpm_compute_pubkey_checksum(TPM_NONC
+
+ TPM_RESULT tpm_get_pubek(TPM_PUBKEY *pubEndorsementKey)
+ {
+- UINT32 key_length;
++ size_t key_length;
+ if (!tpmData.permanent.data.endorsementKey.size) return TPM_NO_ENDORSEMENT;
+ /* setup TPM_PUBKEY structure */
+- key_length = tpmData.permanent.data.endorsementKey.size;
+- pubEndorsementKey->pubKey.keyLength = key_length >> 3;
++ pubEndorsementKey->pubKey.keyLength =
tpmData.permanent.data.endorsementKey.size >> 3;
+ pubEndorsementKey->pubKey.key =
tpm_malloc(pubEndorsementKey->pubKey.keyLength);
+ if (pubEndorsementKey->pubKey.key == NULL) return TPM_FAIL;
+ rsa_export_modulus(&tpmData.permanent.data.endorsementKey,
+- pubEndorsementKey->pubKey.key,
+- &pubEndorsementKey->pubKey.keyLength);
++ pubEndorsementKey->pubKey.key,
++ &key_length);
++ pubEndorsementKey->pubKey.keyLength = key_length;
+ pubEndorsementKey->algorithmParms.algorithmID = TPM_ALG_RSA;
+ pubEndorsementKey->algorithmParms.encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1;
+ pubEndorsementKey->algorithmParms.sigScheme = TPM_SS_NONE;
+@@ -169,6 +169,7 @@ TPM_RESULT TPM_OwnerReadInternalPub(TPM_
+ {
+ TPM_RESULT res;
+ TPM_KEY_DATA *srk = &tpmData.permanent.data.srk;
++ size_t key_length;
+ info("TPM_OwnerReadInternalPub()");
+ /* verify authorization */
+ res = tpm_verify_auth(auth1, tpmData.permanent.data.ownerAuth,
TPM_KH_OWNER);
+@@ -180,7 +181,8 @@ TPM_RESULT TPM_OwnerReadInternalPub(TPM_
+ publicPortion->pubKey.key = tpm_malloc(publicPortion->pubKey.keyLength);
+ if (publicPortion->pubKey.key == NULL) return TPM_FAIL;
+ rsa_export_modulus(&srk->key, publicPortion->pubKey.key,
+- &publicPortion->pubKey.keyLength);
++ &key_length);
++ publicPortion->pubKey.keyLength = key_length;
+ publicPortion->algorithmParms.algorithmID = TPM_ALG_RSA;
+ publicPortion->algorithmParms.encScheme = srk->encScheme;
+ publicPortion->algorithmParms.sigScheme = srk->sigScheme;
+diff -uprN tpm_emulator-0.2/tpm/tpm_crypto.c
tpm_emulator-0.2-x86_64/tpm/tpm_crypto.c
+--- tpm_emulator-0.2/tpm/tpm_crypto.c 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/tpm/tpm_crypto.c 2005-09-19 14:10:29.000000000
-0700
+@@ -182,7 +182,8 @@ TPM_RESULT TPM_CertifyKey(TPM_KEY_HANDLE
+ TPM_KEY_DATA *cert, *key;
+ sha1_ctx_t sha1_ctx;
+ BYTE *buf, *p;
+- UINT32 length;
++ UINT32 length32;
++ size_t length;
+ info("TPM_CertifyKey()");
+ /* get keys */
+ cert = tpm_get_key(certHandle);
+@@ -264,14 +265,15 @@ TPM_RESULT TPM_CertifyKey(TPM_KEY_HANDLE
+ /* compute the digest of the CERTIFY_INFO[2] structure and sign it */
+ length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
+ p = buf = tpm_malloc(length);
++ length32=(UINT32) length;
+ if (buf == NULL
+- || tpm_marshal_TPM_CERTIFY_INFO(&p, &length, certifyInfo)) {
++ || tpm_marshal_TPM_CERTIFY_INFO(&p, &length32, certifyInfo)) {
+ free_TPM_KEY_PARMS(certifyInfo->algorithmParms);
+ return TPM_FAIL;
+ }
+ length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
+ sha1_init(&sha1_ctx);
+- sha1_update(&sha1_ctx, buf, length);
++ sha1_update(&sha1_ctx, buf, (size_t) length);
+ sha1_final(&sha1_ctx, buf);
+ res = tpm_sign(cert, auth1, FALSE, buf, SHA1_DIGEST_LENGTH, outData,
outDataSize);
+ tpm_free(buf);
+@@ -292,7 +294,8 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
+ TPM_KEY_DATA *cert, *key;
+ sha1_ctx_t sha1_ctx;
+ BYTE *buf, *p;
+- UINT32 length;
++ size_t length;
++ UINT32 length32;
+ info("TPM_CertifyKey2()");
+ /* get keys */
+ cert = tpm_get_key(certHandle);
+@@ -362,8 +365,9 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
+ /* compute the digest of the CERTIFY_INFO[2] structure and sign it */
+ length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
+ p = buf = tpm_malloc(length);
++ length32 = (UINT32) length;
+ if (buf == NULL
+- || tpm_marshal_TPM_CERTIFY_INFO(&p, &length, certifyInfo)) {
++ || tpm_marshal_TPM_CERTIFY_INFO(&p, &length32, certifyInfo)) {
+ free_TPM_KEY_PARMS(certifyInfo->algorithmParms);
+ return TPM_FAIL;
+ }
+diff -uprN tpm_emulator-0.2/tpm/tpm_data.c
tpm_emulator-0.2-x86_64/tpm/tpm_data.c
+--- tpm_emulator-0.2/tpm/tpm_data.c 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/tpm/tpm_data.c 2005-09-19 14:10:29.000000000
-0700
+@@ -179,7 +179,7 @@ static int read_from_file(uint8_t **data
+ int tpm_store_permanent_data(void)
+ {
+ uint8_t *buf, *ptr;
+- size_t buf_length, len;
++ UINT32 buf_length, len;
+
+ /* marshal data */
+ buf_length = len = sizeof_TPM_STCLEAR_FLAGS(tpmData.stclear.flags)
+@@ -207,13 +207,14 @@ int tpm_store_permanent_data(void)
+ int tpm_restore_permanent_data(void)
+ {
+ uint8_t *buf, *ptr;
+- size_t buf_length, len;
++ size_t buf_length;
++ UINT32 len;
+ TPM_VERSION ver;
+
+ /* read data */
+ if (read_from_file(&buf, &buf_length)) return -1;
+ ptr = buf;
+- len = buf_length;
++ len = (uint32_t) buf_length;
+ /* unmarshal data */
+ if (tpm_unmarshal_TPM_VERSION(&ptr, &len, &ver)
+ || memcmp(&ver, &tpmData.permanent.data.version, sizeof(TPM_VERSION))
+diff -uprN tpm_emulator-0.2/tpm/tpm_marshalling.c
tpm_emulator-0.2-x86_64/tpm/tpm_marshalling.c
+--- tpm_emulator-0.2/tpm/tpm_marshalling.c 2005-08-15 00:58:57.000000000
-0700
++++ tpm_emulator-0.2-x86_64/tpm/tpm_marshalling.c 2005-09-19
14:10:29.000000000 -0700
+@@ -981,7 +981,7 @@ int tpm_unmarshal_TPM_STANY_FLAGS(BYTE *
+
+ int tpm_marshal_RSA(BYTE **ptr, UINT32 *length, rsa_private_key_t *v)
+ {
+- UINT32 m_len, e_len, q_len;
++ size_t m_len, e_len, q_len;
+ if (*length < sizeof_RSA((*v))) return -1;
+ if (v->size > 0) {
+ rsa_export_modulus(v, &(*ptr)[6], &m_len);
+diff -uprN tpm_emulator-0.2/tpm/tpm_owner.c
tpm_emulator-0.2-x86_64/tpm/tpm_owner.c
+--- tpm_emulator-0.2/tpm/tpm_owner.c 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/tpm/tpm_owner.c 2005-09-19 14:10:29.000000000
-0700
+@@ -108,7 +108,7 @@ TPM_RESULT TPM_TakeOwnership(TPM_PROTOCO
+ TPM_RESULT res;
+ rsa_private_key_t *ek = &tpmData.permanent.data.endorsementKey;
+ TPM_KEY_DATA *srk = &tpmData.permanent.data.srk;
+- UINT32 buf_size = ek->size >> 3;
++ size_t buf_size = ek->size >> 3, key_length;
+ BYTE buf[buf_size];
+
+ info("TPM_TakeOwnership()");
+@@ -172,7 +172,8 @@ TPM_RESULT TPM_TakeOwnership(TPM_PROTOCO
+ return TPM_FAIL;
+ }
+ rsa_export_modulus(&srk->key, srkPub->pubKey.key,
+- &srkPub->pubKey.keyLength);
++ &key_length);
++ srkPub->pubKey.keyLength = (UINT32) key_length;
+ /* setup tpmProof and set state to owned */
+ tpm_get_random_bytes(tpmData.permanent.data.tpmProof.nonce,
+ sizeof(tpmData.permanent.data.tpmProof.nonce));
+diff -uprN tpm_emulator-0.2/tpm/tpm_storage.c
tpm_emulator-0.2-x86_64/tpm/tpm_storage.c
+--- tpm_emulator-0.2/tpm/tpm_storage.c 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/tpm/tpm_storage.c 2005-09-19 14:10:29.000000000
-0700
+@@ -58,6 +58,7 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
+ BYTE *enc, UINT32 *enc_size)
+ {
+ UINT32 len;
++ size_t enc_size32 = *enc_size;
+ BYTE *buf, *ptr;
+ rsa_public_key_t pub_key;
+ int scheme;
+@@ -72,7 +73,7 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
+ if (buf == NULL
+ || tpm_marshal_TPM_SEALED_DATA(&ptr, &len, seal)
+ || rsa_encrypt(&pub_key, scheme, buf, sizeof_TPM_SEALED_DATA((*seal)),
+- enc, enc_size)) {
++ enc, &enc_size32)) {
+ tpm_free(buf);
+ rsa_release_public_key(&pub_key);
+ return -1;
+@@ -85,7 +86,8 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
+ int decrypt_sealed_data(TPM_KEY_DATA *key, BYTE *enc, UINT32 enc_size,
+ TPM_SEALED_DATA *seal, BYTE **buf)
+ {
+- UINT32 len;
++ size_t len;
++ UINT32 len32;
+ BYTE *ptr;
+ int scheme;
+ switch (key->encScheme) {
+@@ -96,8 +98,12 @@ int decrypt_sealed_data(TPM_KEY_DATA *ke
+ len = enc_size;
+ *buf = ptr = tpm_malloc(len);
+ if (*buf == NULL
+- || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len)
+- || tpm_unmarshal_TPM_SEALED_DATA(&ptr, &len, seal)) {
++ || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len) ){
++ tpm_free(*buf);
++ return -1;
++ }
++ len32 = len;
++ if (tpm_unmarshal_TPM_SEALED_DATA(&ptr, &len32, seal)) {
+ tpm_free(*buf);
+ return -1;
+ }
+@@ -237,11 +243,12 @@ TPM_RESULT TPM_Unseal(TPM_KEY_HANDLE par
+
+ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE keyHandle, UINT32 inDataSize,
+ BYTE *inData, TPM_AUTH *auth1,
+- UINT32 *outDataSize, BYTE **outData)
++ UINT32 *outDataSize32, BYTE **outData)
+ {
+ TPM_RESULT res;
+ TPM_KEY_DATA *key;
+ int scheme;
++ size_t outDataSize;
+ info("TPM_UnBind()");
+ /* get key */
+ key = tpm_get_key(keyHandle);
+@@ -258,8 +265,8 @@ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE key
+ /* the size of the input data muss be greater than zero */
+ if (inDataSize == 0) return TPM_BAD_PARAMETER;
+ /* decrypt data */
+- *outDataSize = inDataSize;
+- *outData = tpm_malloc(*outDataSize);
++ outDataSize = inDataSize;
++ *outData = tpm_malloc(outDataSize);
+ if (*outData == NULL) return TPM_FAIL;
+ switch (key->encScheme) {
+ case TPM_ES_RSAESOAEP_SHA1_MGF1: scheme = RSA_ES_OAEP_SHA1; break;
+@@ -267,20 +274,21 @@ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE key
+ default: tpm_free(*outData); return TPM_DECRYPT_ERROR;
+ }
+ if (rsa_decrypt(&key->key, scheme, inData, inDataSize,
+- *outData, outDataSize)) {
++ *outData, &outDataSize) ) {
+ tpm_free(*outData);
+ return TPM_DECRYPT_ERROR;
+ }
+ /* verify data if it is of type TPM_BOUND_DATA */
+ if (key->encScheme == TPM_ES_RSAESOAEP_SHA1_MGF1
+ || key->keyUsage != TPM_KEY_LEGACY) {
+- if (*outDataSize < 5 || memcmp(*outData, "\x01\x01\00\x00\x02", 5) != 0) {
++ if (outDataSize < 5 || memcmp(*outData, "\x01\x01\00\x00\x02", 5) != 0) {
+ tpm_free(*outData);
+ return TPM_DECRYPT_ERROR;
+ }
+- *outDataSize -= 5;
+- memmove(*outData, &(*outData)[5], *outDataSize);
+- }
++ outDataSize -= 5;
++ memmove(*outData, &(*outData)[5], outDataSize);
++ }
++ *outDataSize32 = (UINT32) outDataSize;
+ return TPM_SUCCESS;
+ }
+
+@@ -311,12 +319,13 @@ static int verify_key_digest(TPM_KEY *ke
+ }
+
+ int encrypt_private_key(TPM_KEY_DATA *key, TPM_STORE_ASYMKEY *store,
+- BYTE *enc, UINT32 *enc_size)
++ BYTE *enc, UINT32 *enc_size32)
+ {
+ UINT32 len;
+ BYTE *buf, *ptr;
+ rsa_public_key_t pub_key;
+ int scheme;
++ size_t enc_size;
+ switch (key->encScheme) {
+ case TPM_ES_RSAESOAEP_SHA1_MGF1: scheme = RSA_ES_OAEP_SHA1; break;
+ case TPM_ES_RSAESPKCSv15: scheme = RSA_ES_PKCSV15; break;
+@@ -328,11 +337,12 @@ int encrypt_private_key(TPM_KEY_DATA *ke
+ if (buf == NULL
+ || tpm_marshal_TPM_STORE_ASYMKEY(&ptr, &len, store)
+ || rsa_encrypt(&pub_key, scheme, buf,
sizeof_TPM_STORE_ASYMKEY((*store)),
+- enc, enc_size)) {
++ enc, &enc_size)) {
+ tpm_free(buf);
+ rsa_release_public_key(&pub_key);
+ return -1;
+ }
++ *enc_size32 = (UINT32) enc_size;
+ tpm_free(buf);
+ rsa_release_public_key(&pub_key);
+ return 0;
+@@ -341,7 +351,8 @@ int encrypt_private_key(TPM_KEY_DATA *ke
+ int decrypt_private_key(TPM_KEY_DATA *key, BYTE *enc, UINT32 enc_size,
+ TPM_STORE_ASYMKEY *store, BYTE **buf)
+ {
+- UINT32 len;
++ UINT32 len32;
++ size_t len;
+ BYTE *ptr;
+ int scheme;
+ switch (key->encScheme) {
+@@ -352,11 +363,16 @@ int decrypt_private_key(TPM_KEY_DATA *ke
+ len = enc_size;
+ *buf = ptr = tpm_malloc(len);
+ if (*buf == NULL
+- || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len)
+- || tpm_unmarshal_TPM_STORE_ASYMKEY(&ptr, &len, store)) {
++ || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len) ) {
++ tpm_free(*buf);
++ return -1;
++ }
++ len32 = (UINT32) len;
++ if (tpm_unmarshal_TPM_STORE_ASYMKEY(&ptr, &len32, store)) {
+ tpm_free(*buf);
+ return -1;
+ }
++
+ return 0;
+ }
+
+@@ -371,7 +387,7 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
+ TPM_SESSION_DATA *session;
+ TPM_STORE_ASYMKEY store;
+ rsa_private_key_t rsa;
+- UINT32 key_length;
++ size_t key_length;
+
+ info("TPM_CreateWrapKey()");
+ /* get parent key */
+@@ -428,11 +444,11 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
+ }
+ if (compute_key_digest(wrappedKey, &store.pubDataDigest)) return TPM_FAIL;
+ /* generate key and store it */
+- key_length = keyInfo->algorithmParms.parms.rsa.keyLength;
+- if (rsa_generate_key(&rsa, key_length)) return TPM_FAIL;
+- wrappedKey->pubKey.keyLength = key_length >> 3;
++ if (rsa_generate_key(&rsa, keyInfo->algorithmParms.parms.rsa.keyLength))
++ return TPM_FAIL;
++ wrappedKey->pubKey.keyLength = keyInfo->algorithmParms.parms.rsa.keyLength
>> 3;
+ wrappedKey->pubKey.key = tpm_malloc(wrappedKey->pubKey.keyLength);
+- store.privKey.keyLength = key_length >> 4;
++ store.privKey.keyLength = keyInfo->algorithmParms.parms.rsa.keyLength >> 4;
+ store.privKey.key = tpm_malloc(store.privKey.keyLength);
+ wrappedKey->encDataSize = parent->key.size >> 3;
+ wrappedKey->encData = tpm_malloc(wrappedKey->encDataSize);
+@@ -444,9 +460,11 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
+ tpm_free(wrappedKey->encData);
+ return TPM_FAIL;
+ }
+- rsa_export_modulus(&rsa, wrappedKey->pubKey.key,
+- &wrappedKey->pubKey.keyLength);
+- rsa_export_prime1(&rsa, store.privKey.key, &store.privKey.keyLength);
++ rsa_export_modulus(&rsa, wrappedKey->pubKey.key,
++ &key_length);
++ wrappedKey->pubKey.keyLength = (UINT32) key_length;
++ rsa_export_prime1(&rsa, store.privKey.key, &key_length);
++ store.privKey.keyLength = (UINT32) key_length;
+ rsa_release_private_key(&rsa);
+ /* encrypt private key data */
+ if (encrypt_private_key(parent, &store, wrappedKey->encData,
+@@ -560,6 +578,7 @@ TPM_RESULT TPM_LoadKey(TPM_KEY_HANDLE pa
+
+ int tpm_setup_key_parms(TPM_KEY_DATA *key, TPM_KEY_PARMS *parms)
+ {
++ size_t key_length;
+ parms->algorithmID = TPM_ALG_RSA;
+ parms->encScheme = key->encScheme;
+ parms->sigScheme = key->sigScheme;
+@@ -569,7 +588,8 @@ int tpm_setup_key_parms(TPM_KEY_DATA *ke
+ parms->parms.rsa.exponent = tpm_malloc(parms->parms.rsa.exponentSize);
+ if (parms->parms.rsa.exponent == NULL) return -1;
+ rsa_export_exponent(&key->key, parms->parms.rsa.exponent,
+- &parms->parms.rsa.exponentSize);
++ &key_length);
++ parms->parms.rsa.exponentSize = (UINT32) key_length;
+ parms->parmSize = 12 + parms->parms.rsa.exponentSize;
+ return 0;
+ }
+@@ -580,6 +600,7 @@ TPM_RESULT TPM_GetPubKey(TPM_KEY_HANDLE
+ TPM_RESULT res;
+ TPM_KEY_DATA *key;
+ TPM_DIGEST digest;
++ size_t key_length;
+ info("TPM_GetPubKey()");
+ /* get key */
+ if (keyHandle == TPM_KH_SRK) return TPM_BAD_PARAMETER;
+@@ -607,8 +628,8 @@ TPM_RESULT TPM_GetPubKey(TPM_KEY_HANDLE
+ pubKey->pubKey.keyLength = key->key.size >> 3;
+ pubKey->pubKey.key = tpm_malloc(pubKey->pubKey.keyLength);
+ if (pubKey->pubKey.key == NULL) return TPM_FAIL;
+- rsa_export_modulus(&key->key, pubKey->pubKey.key,
+- &pubKey->pubKey.keyLength);
++ rsa_export_modulus(&key->key, pubKey->pubKey.key, &key_length);
++ pubKey->pubKey.keyLength = (UINT32) key_length;
+ if (tpm_setup_key_parms(key, &pubKey->algorithmParms) != 0) {
+ tpm_free(pubKey->pubKey.key);
+ return TPM_FAIL;
+diff -uprN tpm_emulator-0.2/tpm_version.h tpm_emulator-0.2-x86_64/tpm_version.h
+--- tpm_emulator-0.2/tpm_version.h 2005-08-15 00:58:57.000000000 -0700
++++ tpm_emulator-0.2-x86_64/tpm_version.h 1969-12-31 16:00:00.000000000
-0800
+@@ -1,6 +0,0 @@
+-#ifndef _TPM_VERSION_H_
+-#define _TPM_VERSION_H_
+-#define VERSION_MAJOR 0
+-#define VERSION_MINOR 2
+-#define VERSION_BUILD 1123950310
+-#endif /* _TPM_VERSION_H_ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|