[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merge.
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |