[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merged.
# HG changeset patch # User emellor@xxxxxxxxxxxxxxxxxxxxxx # Node ID d088ce2d3528e4014c5f8aca8a261229f2d5465c # Parent 9e19dcb05f56ca7cc91ccd0dff847da5f21d868a # Parent fab6deef7e87a8b980de81311f34d91fcf550a6c Merged. diff -r 9e19dcb05f56 -r d088ce2d3528 docs/src/interface.tex --- a/docs/src/interface.tex Fri Mar 3 14:56:03 2006 +++ b/docs/src/interface.tex Fri Mar 3 14:56:34 2006 @@ -1059,6 +1059,21 @@ \item[domain] the name of the frontend \end{description} \end{description} + + \item[vtpm/] a directory containin vtpm backends + \begin{description} + \item[$<$domid$>$/] a directory containing vtpm's for domid + \begin{description} + \item[$<$vtpm number$>$/] a directory for each vtpm + \item[frontend-id] the domain id of the frontend + \item[frontend] the path to the frontend + \item[instance] the instance of the virtual TPM that is used + \item[pref{\textunderscore}instance] the instance number as given in the VM configuration file; + may be different from {\bf instance} + \item[domain] the name of the domain of the frontend + \end{description} + \end{description} + \end{description} \item[device/] a directory containing the frontend devices for the @@ -1094,6 +1109,18 @@ \item[event-channel] the event channel used for the two ring queues \end{description} \end{description} + + \item[vtpm/] a directory containing the vtpm frontend device for the + domain + \begin{description} + \item[$<$id$>$] a directory for vtpm id frontend device for the domain + \begin{description} + \item[backend-id] the backend domain id + \item[backend] a path to the backend's store entry + \item[ring-ref] the grant table reference for the tx/rx ring + \item[event-channel] the event channel used for the ring + \end{description} + \end{description} \item[device-misc/] miscellanous information for devices \begin{description} @@ -1450,6 +1477,76 @@ value of {\tt first\_sect}. \end{description} +\section{Virtual TPM} + +Virtual TPM (VTPM) support provides TPM functionality to each virtual +machine that requests this functionality in its configuration file. +The interface enables domains to access therr own private TPM like it +was a hardware TPM built into the machine. + +The virtual TPM interface is implemented as a split driver, +similar to the network and block interfaces described above. +The user domain hosting the frontend exports a character device /dev/tpm0 +to user-level applications for communicating with the virtual TPM. +This is the same device interface that is also offered if a hardware TPM +is available in the system. The backend provides a single interface +/dev/vtpm where the virtual TPM is waiting for commands from all domains +that have located their backend in a given domain. + +\subsection{Data Transfer} + +A single shared memory ring is used between the frontend and backend +drivers. TPM requests and responses are sent in pages where a pointer +to those pages and other information is placed into the ring such that +the backend can map the pages into its memory space using the grant +table mechanism. + +The backend driver has been implemented to only accept well-formed +TPM requests. To meet this requirement, the length inidicator in the +TPM request must correctly indicate the length of the request. +Otherwise an error message is automatically sent back by the device driver. + +The virtual TPM implementation listenes for TPM request on /dev/vtpm. Since +it must be able to apply the TPM request packet to the virtual TPM instance +associated with the virtual machine, a 4-byte virtual TPM instance +identifier is prepended to each packet by the backend driver (in network +byte order) for internal routing of the request. + +\subsection{Virtual TPM ring interface} + +The TPM protocol is a strict request/response protocol and therefore +only one ring is used to send requests from the frontend to the backend +and responses on the reverse path. + +The request/response structure is defined as follows: + +\scriptsize +\begin{verbatim} +typedef struct { + unsigned long addr; /* Machine address of packet. */ + grant_ref_t ref; /* grant table access reference. */ + uint16_t unused; /* unused */ + uint16_t size; /* Packet size in bytes. */ +} tpmif_tx_request_t; +\end{verbatim} +\normalsize + +The fields are as follows: + +\begin{description} +\item[addr] The machine address of the page asscoiated with the TPM + request/response; a request/response may span multiple + pages +\item[ref] The grant table reference associated with the address. +\item[size] The size of the remaining packet; up to + PAGE{\textunderscore}SIZE bytes can be found in the + page referenced by 'addr' +\end{description} + +The frontend initially allocates several pages whose addresses +are stored in the ring. Only these pages are used for exchange of +requests and responses. + \chapter{Further Information} diff -r 9e19dcb05f56 -r d088ce2d3528 linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Fri Mar 3 14:56:03 2006 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Fri Mar 3 14:56:34 2006 @@ -61,8 +61,8 @@ int ret; op.cmd = PHYSDEVOP_APIC_READ; - op.u.apic_op.apic = mp_ioapics[apic].mpc_apicid; - op.u.apic_op.offset = reg; + op.u.apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr; + op.u.apic_op.reg = reg; ret = HYPERVISOR_physdev_op(&op); if (ret) return ret; @@ -74,8 +74,8 @@ physdev_op_t op; op.cmd = PHYSDEVOP_APIC_WRITE; - op.u.apic_op.apic = mp_ioapics[apic].mpc_apicid; - op.u.apic_op.offset = reg; + op.u.apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr; + op.u.apic_op.reg = reg; op.u.apic_op.value = value; HYPERVISOR_physdev_op(&op); } diff -r 9e19dcb05f56 -r d088ce2d3528 linux-2.6-xen-sparse/arch/x86_64/kernel/io_apic-xen.c --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/io_apic-xen.c Fri Mar 3 14:56:03 2006 +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/io_apic-xen.c Fri Mar 3 14:56:34 2006 @@ -108,8 +108,8 @@ int ret; op.cmd = PHYSDEVOP_APIC_READ; - op.u.apic_op.apic = mp_ioapics[apic].mpc_apicid; - op.u.apic_op.offset = reg; + op.u.apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr; + op.u.apic_op.reg = reg; ret = HYPERVISOR_physdev_op(&op); if (ret) return ret; @@ -121,8 +121,8 @@ physdev_op_t op; op.cmd = PHYSDEVOP_APIC_WRITE; - op.u.apic_op.apic = mp_ioapics[apic].mpc_apicid; - op.u.apic_op.offset = reg; + op.u.apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr; + op.u.apic_op.reg = reg; op.u.apic_op.value = value; HYPERVISOR_physdev_op(&op); } diff -r 9e19dcb05f56 -r d088ce2d3528 linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Fri Mar 3 14:56:03 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Fri Mar 3 14:56:34 2006 @@ -19,8 +19,7 @@ LIST_HEAD(tpmif_list); -tpmif_t * -alloc_tpmif(domid_t domid, long int instance) +static tpmif_t *alloc_tpmif(domid_t domid, long int instance) { struct page *page; tpmif_t *tpmif; @@ -45,16 +44,14 @@ return tpmif; } -void -free_tpmif(tpmif_t * tpmif) +static void free_tpmif(tpmif_t * 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_find(domid_t domid, long int instance) { tpmif_t *tpmif; @@ -72,8 +69,7 @@ return alloc_tpmif(domid, instance); } -static int -map_frontend_page(tpmif_t *tpmif, unsigned long shared_page) +static int map_frontend_page(tpmif_t *tpmif, unsigned long shared_page) { int ret; struct gnttab_map_grant_ref op = { @@ -99,8 +95,7 @@ return 0; } -static void -unmap_frontend_page(tpmif_t *tpmif) +static void unmap_frontend_page(tpmif_t *tpmif) { struct gnttab_unmap_grant_ref op; int ret; @@ -115,14 +110,14 @@ BUG_ON(ret); } -int -tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn) +int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn) { int err; evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain, .u.bind_interdomain.remote_dom = tpmif->domid, - .u.bind_interdomain.remote_port = evtchn }; + .u.bind_interdomain.remote_port = evtchn, + }; if (tpmif->irq) { return 0; @@ -156,8 +151,7 @@ return 0; } -static void -__tpmif_disconnect_complete(void *arg) +static void __tpmif_disconnect_complete(void *arg) { tpmif_t *tpmif = (tpmif_t *) arg; @@ -172,22 +166,19 @@ 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); } -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); } -void __init -tpmif_interface_exit(void) +void __init tpmif_interface_exit(void) { kmem_cache_destroy(tpmif_cachep); } diff -r 9e19dcb05f56 -r d088ce2d3528 linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Fri Mar 3 14:56:03 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Fri Mar 3 14:56:34 2006 @@ -22,16 +22,22 @@ #include <xen/xenbus.h> #include <xen/interface/grant_table.h> - /* local data structures */ struct data_exchange { struct list_head pending_pak; struct list_head current_pak; unsigned int copied_so_far; u8 has_opener; - rwlock_t pak_lock; // protects all of the previous fields + rwlock_t pak_lock; // protects all of the previous fields wait_queue_head_t wait_queue; }; + +struct vtpm_resp_hdr { + uint32_t instance_no; + uint16_t tag_no; + uint32_t len_no; + uint32_t ordinal_no; +} __attribute__ ((packed)); struct packet { struct list_head next; @@ -50,36 +56,30 @@ PACKET_FLAG_CHECK_RESPONSESTATUS = 2, }; +/* local variables */ static struct data_exchange dataex; /* local function prototypes */ +static int _packet_write(struct packet *pak, + const char *data, size_t size, int userbuffer); +static void processing_timeout(unsigned long ptr); +static int packet_read_shmem(struct packet *pak, + tpmif_t * tpmif, + u32 offset, + char *buffer, int isuserbuffer, u32 left); static int vtpm_queue_packet(struct packet *pak); -static int _packet_write(struct packet *pak, - const char *data, size_t size, - int userbuffer); -static void processing_timeout(unsigned long ptr); -static int packet_read_shmem(struct packet *pak, - tpmif_t *tpmif, - u32 offset, - char *buffer, - int isuserbuffer, - u32 left); - #define MIN(x,y) (x) < (y) ? (x) : (y) - /*************************************************************** - Buffer copying + Buffer copying fo user and kernel space buffes. ***************************************************************/ -static inline int -copy_from_buffer(void *to, - const void *from, - unsigned long size, - int userbuffer) -{ - if (userbuffer) { - if (copy_from_user(to, from, size)) +static inline int copy_from_buffer(void *to, + const void *from, unsigned long size, + int isuserbuffer) +{ + if (isuserbuffer) { + if (copy_from_user(to, (void __user *)from, size)) return -EFAULT; } else { memcpy(to, from, size); @@ -87,21 +87,36 @@ return 0; } +static inline int copy_to_buffer(void *to, + const void *from, unsigned long size, + int isuserbuffer) +{ + if (isuserbuffer) { + if (copy_to_user((void __user *)to, from, size)) + return -EFAULT; + } else { + memcpy(to, from, size); + } + return 0; +} + /*************************************************************** Packet-related functions ***************************************************************/ -static struct packet * -packet_find_instance(struct list_head *head, u32 tpm_instance) +static struct packet *packet_find_instance(struct list_head *head, + u32 tpm_instance) { struct packet *pak; struct list_head *p; + /* * traverse the list of packets and return the first * one with the given instance number */ list_for_each(p, head) { pak = list_entry(p, struct packet, next); + if (pak->tpm_instance == tpm_instance) { return pak; } @@ -109,17 +124,18 @@ return NULL; } -static struct packet * -packet_find_packet(struct list_head *head, void *packet) +static struct packet *packet_find_packet(struct list_head *head, void *packet) { struct packet *pak; struct list_head *p; + /* * traverse the list of packets and return the first * one with the given instance number */ list_for_each(p, head) { pak = list_entry(p, struct packet, next); + if (pak == packet) { return pak; } @@ -127,22 +143,20 @@ return NULL; } -static struct packet * -packet_alloc(tpmif_t *tpmif, u32 size, u8 req_tag, u8 flags) +static struct packet *packet_alloc(tpmif_t * tpmif, + u32 size, u8 req_tag, u8 flags) { struct packet *pak = NULL; - pak = kmalloc(sizeof(struct packet), - GFP_KERNEL); + pak = kzalloc(sizeof (struct packet), GFP_KERNEL); if (NULL != pak) { - memset(pak, 0x0, sizeof(*pak)); if (tpmif) { pak->tpmif = tpmif; pak->tpm_instance = tpmif->tpm_instance; } - pak->data_len = size; - pak->req_tag = req_tag; + pak->data_len = size; + pak->req_tag = req_tag; pak->last_read = 0; - pak->flags = flags; + pak->flags = flags; /* * cannot do tpmif_get(tpmif); bad things happen @@ -155,16 +169,16 @@ return pak; } -static void inline -packet_reset(struct packet *pak) +static void inline packet_reset(struct packet *pak) { pak->last_read = 0; } -static void inline -packet_free(struct packet *pak) -{ - del_singleshot_timer_sync(&pak->processing_timer); +static void packet_free(struct packet *pak) +{ + if (timer_pending(&pak->processing_timer)) { + BUG(); + } kfree(pak->data_buffer); /* * cannot do tpmif_put(pak->tpmif); bad things happen @@ -173,13 +187,13 @@ kfree(pak); } -static int -packet_set(struct packet *pak, - const unsigned char *buffer, u32 size) +static int packet_set(struct packet *pak, + const unsigned char *buffer, u32 size) { int rc = 0; unsigned char *buf = kmalloc(size, GFP_KERNEL); - if (NULL != buf) { + + if (buf) { pak->data_buffer = buf; memcpy(buf, buffer, size); pak->data_len = size; @@ -189,27 +203,21 @@ return rc; } - /* * Write data to the shared memory and send it to the FE. */ -static int -packet_write(struct packet *pak, - const char *data, size_t size, - int userbuffer) +static int packet_write(struct packet *pak, + const char *data, size_t size, int isuserbuffer) { int rc = 0; - DPRINTK("Supposed to send %d bytes to front-end!\n", - size); - - if (0 != (pak->flags & PACKET_FLAG_CHECK_RESPONSESTATUS)) { + if ((pak->flags & PACKET_FLAG_CHECK_RESPONSESTATUS)) { #ifdef CONFIG_XEN_TPMDEV_CLOSE_IF_VTPM_FAILS u32 res; + if (copy_from_buffer(&res, - &data[2+4], - sizeof(res), - userbuffer)) { + &data[2 + 4], sizeof (res), + isuserbuffer)) { return -EFAULT; } @@ -230,17 +238,14 @@ /* Don't send a respone to this packet. Just acknowledge it. */ rc = size; } else { - rc = _packet_write(pak, data, size, userbuffer); + rc = _packet_write(pak, data, size, isuserbuffer); } return rc; } - -static int -_packet_write(struct packet *pak, - const char *data, size_t size, - int userbuffer) +int _packet_write(struct packet *pak, + const char *data, size_t size, int isuserbuffer) { /* * Write into the shared memory pages directly @@ -254,7 +259,7 @@ if (tpmif == NULL) { return -EFAULT; - } + } if (tpmif->status == DISCONNECTED) { return size; @@ -273,16 +278,13 @@ return 0; } - map_op.host_addr = MMAP_VADDR(tpmif, i); - map_op.flags = GNTMAP_host_map; - map_op.ref = tx->ref; - map_op.dom = tpmif->domid; - - if(unlikely( - HYPERVISOR_grant_table_op( - GNTTABOP_map_grant_ref, - &map_op, - 1))) { + map_op.host_addr = MMAP_VADDR(tpmif, i); + map_op.flags = GNTMAP_host_map; + map_op.ref = tx->ref; + map_op.dom = tpmif->domid; + + if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, + &map_op, 1))) { BUG(); } @@ -292,28 +294,27 @@ DPRINTK(" Grant table operation failure !\n"); return 0; } - set_phys_to_machine(__pa(MMAP_VADDR(tpmif,i)) >> PAGE_SHIFT, - FOREIGN_FRAME(map_op.dev_bus_addr >> PAGE_SHIFT)); + set_phys_to_machine(__pa(MMAP_VADDR(tpmif, i)) >> PAGE_SHIFT, + FOREIGN_FRAME(map_op. + dev_bus_addr >> PAGE_SHIFT)); tocopy = MIN(size - offset, PAGE_SIZE); - if (copy_from_buffer((void *)(MMAP_VADDR(tpmif,i)| - (tx->addr & ~PAGE_MASK)), - &data[offset], - tocopy, - userbuffer)) { + if (copy_from_buffer((void *)(MMAP_VADDR(tpmif, i) | + (tx->addr & ~PAGE_MASK)), + &data[offset], tocopy, isuserbuffer)) { tpmif_put(tpmif); return -EFAULT; } tx->size = tocopy; - unmap_op.host_addr = MMAP_VADDR(tpmif, i); - unmap_op.handle = handle; + unmap_op.host_addr = MMAP_VADDR(tpmif, i); + unmap_op.handle = handle; unmap_op.dev_bus_addr = 0; - if(unlikely(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, - &unmap_op, - 1))) { + if (unlikely + (HYPERVISOR_grant_table_op + (GNTTABOP_unmap_grant_ref, &unmap_op, 1))) { BUG(); } @@ -322,8 +323,7 @@ } rc = offset; - DPRINTK("Notifying frontend via irq %d\n", - tpmif->irq); + DPRINTK("Notifying frontend via irq %d\n", tpmif->irq); notify_remote_via_irq(tpmif->irq); return rc; @@ -334,26 +334,19 @@ * provided buffer. Advance the read_last indicator which tells * how many bytes have already been read. */ -static int -packet_read(struct packet *pak, size_t numbytes, - char *buffer, size_t buffersize, - int userbuffer) +static int packet_read(struct packet *pak, size_t numbytes, + char *buffer, size_t buffersize, int isuserbuffer) { tpmif_t *tpmif = pak->tpmif; - /* - * I am supposed to read 'numbytes' of data from the - * buffer. - * The first 4 bytes that are read are the instance number in - * network byte order, after that comes the data from the - * shared memory buffer. + + /* + * Read 'numbytes' of data from the buffer. The first 4 + * bytes are the instance number in network byte order, + * after that come the data from the shared memory buffer. */ u32 to_copy; u32 offset = 0; u32 room_left = buffersize; - /* - * Ensure that we see the request when we copy it. - */ - mb(); if (pak->last_read < 4) { /* @@ -361,18 +354,13 @@ */ u32 instance_no = htonl(pak->tpm_instance); u32 last_read = pak->last_read; + to_copy = MIN(4 - last_read, numbytes); - if (userbuffer) { - if (copy_to_user(&buffer[0], - &(((u8 *)&instance_no)[last_read]), - to_copy)) { - return -EFAULT; - } - } else { - memcpy(&buffer[0], - &(((u8 *)&instance_no)[last_read]), - to_copy); + if (copy_to_buffer(&buffer[0], + &(((u8 *) & instance_no)[last_read]), + to_copy, isuserbuffer)) { + return -EFAULT; } pak->last_read += to_copy; @@ -388,39 +376,30 @@ if (pak->data_buffer) { u32 to_copy = MIN(pak->data_len - offset, room_left); u32 last_read = pak->last_read - 4; - if (userbuffer) { - if (copy_to_user(&buffer[offset], - &pak->data_buffer[last_read], - to_copy)) { - return -EFAULT; - } - } else { - memcpy(&buffer[offset], - &pak->data_buffer[last_read], - to_copy); + + if (copy_to_buffer(&buffer[offset], + &pak->data_buffer[last_read], + to_copy, isuserbuffer)) { + return -EFAULT; } pak->last_read += to_copy; offset += to_copy; } else { offset = packet_read_shmem(pak, - tpmif, - offset, - buffer, - userbuffer, - room_left); + tpmif, + offset, + buffer, + isuserbuffer, room_left); } } return offset; } - -static int -packet_read_shmem(struct packet *pak, - tpmif_t *tpmif, - u32 offset, - char *buffer, - int isuserbuffer, - u32 room_left) { +static int packet_read_shmem(struct packet *pak, + tpmif_t * tpmif, + u32 offset, char *buffer, int isuserbuffer, + u32 room_left) +{ u32 last_read = pak->last_read - 4; u32 i = (last_read / PAGE_SIZE); u32 pg_offset = last_read & (PAGE_SIZE - 1); @@ -428,6 +407,7 @@ grant_handle_t handle; tpmif_tx_request_t *tx; + tx = &tpmif->tx->ring[0].req; /* * Start copying data at the page with index 'index' @@ -443,13 +423,12 @@ tx = &tpmif->tx->ring[i].req; map_op.host_addr = MMAP_VADDR(tpmif, i); - map_op.flags = GNTMAP_host_map; - map_op.ref = tx->ref; - map_op.dom = tpmif->domid; - - if(unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, - &map_op, - 1))) { + map_op.flags = GNTMAP_host_map; + map_op.ref = tx->ref; + map_op.dom = tpmif->domid; + + if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, + &map_op, 1))) { BUG(); } @@ -462,41 +441,33 @@ if (to_copy > tx->size) { /* - * This is the case when the user wants to read more - * than what we have. So we just give him what we - * have. + * User requests more than what's available */ to_copy = MIN(tx->size, to_copy); } DPRINTK("Copying from mapped memory at %08lx\n", - (unsigned long)(MMAP_VADDR(tpmif,i) | - (tx->addr & ~PAGE_MASK))); - - src = (void *)(MMAP_VADDR(tpmif,i) | ((tx->addr & ~PAGE_MASK) + pg_offset)); - if (isuserbuffer) { - if (copy_to_user(&buffer[offset], - src, - to_copy)) { - return -EFAULT; - } - } else { - memcpy(&buffer[offset], - src, - to_copy); - } - + (unsigned long)(MMAP_VADDR(tpmif, i) | + (tx->addr & ~PAGE_MASK))); + + src = (void *)(MMAP_VADDR(tpmif, i) | + ((tx->addr & ~PAGE_MASK) + pg_offset)); + if (copy_to_buffer(&buffer[offset], + src, to_copy, isuserbuffer)) { + return -EFAULT; + } DPRINTK("Data from TPM-FE of domain %d are %d %d %d %d\n", - tpmif->domid, buffer[offset], buffer[offset+1],buffer[offset+2],buffer[offset+3]); - - unmap_op.host_addr = MMAP_VADDR(tpmif, i); - unmap_op.handle = handle; + tpmif->domid, buffer[offset], buffer[offset + 1], + buffer[offset + 2], buffer[offset + 3]); + + unmap_op.host_addr = MMAP_VADDR(tpmif, i); + unmap_op.handle = handle; unmap_op.dev_bus_addr = 0; - if(unlikely(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, - &unmap_op, - 1))) { + if (unlikely + (HYPERVISOR_grant_table_op + (GNTTABOP_unmap_grant_ref, &unmap_op, 1))) { BUG(); } @@ -507,21 +478,19 @@ to_copy = MIN(PAGE_SIZE, room_left); i++; - } /* while (to_copy > 0) */ + } /* while (to_copy > 0) */ /* * Adjust the last_read pointer */ pak->last_read = last_read + 4; return offset; } - /* ============================================================ * The file layer for reading data from this device * ============================================================ */ -static int -vtpm_op_open(struct inode *inode, struct file *f) +static int vtpm_op_open(struct inode *inode, struct file *f) { int rc = 0; unsigned long flags; @@ -536,9 +505,8 @@ return rc; } -static ssize_t -vtpm_op_read(struct file *file, - char __user * data, size_t size, loff_t * offset) +static ssize_t vtpm_op_read(struct file *file, + char __user * data, size_t size, loff_t * offset) { int ret_size = -ENODATA; struct packet *pak = NULL; @@ -549,7 +517,7 @@ if (list_empty(&dataex.pending_pak)) { write_unlock_irqrestore(&dataex.pak_lock, flags); wait_event_interruptible(dataex.wait_queue, - !list_empty(&dataex.pending_pak)); + !list_empty(&dataex.pending_pak)); write_lock_irqsave(&dataex.pak_lock, flags); } @@ -561,7 +529,7 @@ DPRINTK("size given by app: %d, available: %d\n", size, left); - ret_size = MIN(size,left); + ret_size = MIN(size, left); ret_size = packet_read(pak, ret_size, data, size, 1); if (ret_size < 0) { @@ -574,7 +542,8 @@ DPRINTK("All data from this packet given to app.\n"); /* All data given to app */ - del_singleshot_timer_sync(&pak->processing_timer); + del_singleshot_timer_sync(&pak-> + processing_timer); list_del(&pak->next); list_add_tail(&pak->next, &dataex.current_pak); /* @@ -582,7 +551,7 @@ * the more time we give the TPM to process the request. */ mod_timer(&pak->processing_timer, - jiffies + (num_frontends * 60 * HZ)); + jiffies + (num_frontends * 60 * HZ)); dataex.copied_so_far = 0; } } @@ -597,16 +566,15 @@ /* * Write operation - only works after a previous read operation! */ -static ssize_t -vtpm_op_write(struct file *file, const char __user * data, size_t size, - loff_t * offset) +static ssize_t vtpm_op_write(struct file *file, + const char __user * data, size_t size, + loff_t * offset) { struct packet *pak; int rc = 0; unsigned int off = 4; unsigned long flags; - u32 instance_no = 0; - u32 len_no = 0; + struct vtpm_resp_hdr vrh; /* * Minimum required packet size is: @@ -616,45 +584,38 @@ * 4 bytes for the ordinal * sum: 14 bytes */ - if ( size < off + 10 ) { + if (size < sizeof (vrh)) return -EFAULT; - } - - if (copy_from_user(&instance_no, - (void __user *)&data[0], - 4)) { + + if (copy_from_user(&vrh, data, sizeof (vrh))) return -EFAULT; - } - - if (copy_from_user(&len_no, - (void __user *)&data[off+2], - 4) || - (off + ntohl(len_no) != size)) { + + /* malformed packet? */ + if ((off + ntohl(vrh.len_no)) != size) return -EFAULT; - } write_lock_irqsave(&dataex.pak_lock, flags); - pak = packet_find_instance(&dataex.current_pak, ntohl(instance_no)); + pak = packet_find_instance(&dataex.current_pak, + ntohl(vrh.instance_no)); if (pak == NULL) { write_unlock_irqrestore(&dataex.pak_lock, flags); - printk(KERN_ALERT "No associated packet!\n"); + printk(KERN_ALERT "No associated packet! (inst=%d)\n", + ntohl(vrh.instance_no)); return -EFAULT; - } else { - del_singleshot_timer_sync(&pak->processing_timer); - list_del(&pak->next); - } + } + + del_singleshot_timer_sync(&pak->processing_timer); + list_del(&pak->next); write_unlock_irqrestore(&dataex.pak_lock, flags); /* - * The first 'offset' bytes must be the instance number. - * I will just pull that from the packet. + * The first 'offset' bytes must be the instance number - skip them. */ size -= off; - data = &data[off]; - - rc = packet_write(pak, data, size, 1); + + rc = packet_write(pak, &data[off], size, 1); if (rc > 0) { /* I neglected the first 4 bytes */ @@ -664,10 +625,10 @@ return rc; } -static int -vtpm_op_release(struct inode *inode, struct file *file) +static int vtpm_op_release(struct inode *inode, struct file *file) { unsigned long flags; + vtpm_release_packets(NULL, 1); write_lock_irqsave(&dataex.pak_lock, flags); dataex.has_opener = 0; @@ -675,10 +636,11 @@ return 0; } -static unsigned int -vtpm_op_poll(struct file *file, struct poll_table_struct *pts) +static unsigned int vtpm_op_poll(struct file *file, + struct poll_table_struct *pts) { unsigned int flags = POLLOUT | POLLWRNORM; + poll_wait(file, &dataex.wait_queue, pts); if (!list_empty(&dataex.pending_pak)) { flags |= POLLIN | POLLRDNORM; @@ -696,54 +658,47 @@ .poll = vtpm_op_poll, }; -static struct miscdevice ibmvtpms_miscdevice = { +static struct miscdevice vtpms_miscdevice = { .minor = 225, .name = "vtpm", .fops = &vtpm_ops, }; - /*************************************************************** Virtual TPM functions and data stuctures ***************************************************************/ static u8 create_cmd[] = { - 1,193, /* 0: TPM_TAG_RQU_COMMAMD */ - 0,0,0,19, /* 2: length */ - 0,0,0,0x1, /* 6: VTPM_ORD_OPEN */ - 0, /* 10: VTPM type */ - 0,0,0,0, /* 11: domain id */ - 0,0,0,0 /* 15: instance id */ + 1, 193, /* 0: TPM_TAG_RQU_COMMAMD */ + 0, 0, 0, 19, /* 2: length */ + 0, 0, 0, 0x1, /* 6: VTPM_ORD_OPEN */ + 0, /* 10: VTPM type */ + 0, 0, 0, 0, /* 11: domain id */ + 0, 0, 0, 0 /* 15: instance id */ }; -static u8 destroy_cmd[] = { - 1,193, /* 0: TPM_TAG_RQU_COMMAMD */ - 0,0,0,14, /* 2: length */ - 0,0,0,0x2, /* 6: VTPM_ORD_CLOSE */ - 0,0,0,0 /* 10: instance id */ -}; - -int tpmif_vtpm_open(tpmif_t *tpmif, domid_t domid, u32 instance) +int tpmif_vtpm_open(tpmif_t * tpmif, domid_t domid, u32 instance) { int rc = 0; struct packet *pak; pak = packet_alloc(tpmif, - sizeof(create_cmd), - create_cmd[0], - PACKET_FLAG_DISCARD_RESPONSE| - PACKET_FLAG_CHECK_RESPONSESTATUS); + sizeof (create_cmd), + create_cmd[1], + PACKET_FLAG_DISCARD_RESPONSE | + PACKET_FLAG_CHECK_RESPONSESTATUS); if (pak) { - u8 buf[sizeof(create_cmd)]; - u32 domid_no = htonl((u32)domid); + u8 buf[sizeof (create_cmd)]; + u32 domid_no = htonl((u32) domid); u32 instance_no = htonl(instance); - memcpy(buf, create_cmd, sizeof(create_cmd)); - - memcpy(&buf[11], &domid_no, sizeof(u32)); - memcpy(&buf[15], &instance_no, sizeof(u32)); + + memcpy(buf, create_cmd, sizeof (create_cmd)); + + memcpy(&buf[11], &domid_no, sizeof (u32)); + memcpy(&buf[15], &instance_no, sizeof (u32)); /* copy the buffer into the packet */ - rc = packet_set(pak, buf, sizeof(buf)); + rc = packet_set(pak, buf, sizeof (buf)); if (rc == 0) { pak->tpm_instance = 0; @@ -759,23 +714,30 @@ return rc; } +static u8 destroy_cmd[] = { + 1, 193, /* 0: TPM_TAG_RQU_COMMAMD */ + 0, 0, 0, 14, /* 2: length */ + 0, 0, 0, 0x2, /* 6: VTPM_ORD_CLOSE */ + 0, 0, 0, 0 /* 10: instance id */ +}; + int tpmif_vtpm_close(u32 instid) { int rc = 0; struct packet *pak; pak = packet_alloc(NULL, - sizeof(create_cmd), - create_cmd[0], - PACKET_FLAG_DISCARD_RESPONSE); + sizeof (destroy_cmd), + destroy_cmd[1], PACKET_FLAG_DISCARD_RESPONSE); if (pak) { - u8 buf[sizeof(destroy_cmd)]; + u8 buf[sizeof (destroy_cmd)]; u32 instid_no = htonl(instid); - memcpy(buf, destroy_cmd, sizeof(destroy_cmd)); - memcpy(&buf[10], &instid_no, sizeof(u32)); + + memcpy(buf, destroy_cmd, sizeof (destroy_cmd)); + memcpy(&buf[10], &instid_no, sizeof (u32)); /* copy the buffer into the packet */ - rc = packet_set(pak, buf, sizeof(buf)); + rc = packet_set(pak, buf, sizeof (buf)); if (rc == 0) { pak->tpm_instance = 0; @@ -791,23 +753,22 @@ return rc; } - /*************************************************************** Utility functions ***************************************************************/ -static int -tpm_send_fail_message(struct packet *pak, u8 req_tag) +static int tpm_send_fail_message(struct packet *pak, u8 req_tag) { int rc; static const unsigned char tpm_error_message_fail[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x09 /* TPM_FAIL */ + 0x00, 0x00, 0x00, 0x09 /* TPM_FAIL */ }; - unsigned char buffer[sizeof(tpm_error_message_fail)]; - - memcpy(buffer, tpm_error_message_fail, sizeof(tpm_error_message_fail)); + unsigned char buffer[sizeof (tpm_error_message_fail)]; + + memcpy(buffer, tpm_error_message_fail, + sizeof (tpm_error_message_fail)); /* * Insert the right response tag depending on the given tag * All response tags are '+3' to the request tag. @@ -817,23 +778,24 @@ /* * Write the data to shared memory and notify the front-end */ - rc = packet_write(pak, buffer, sizeof(buffer), 0); + rc = packet_write(pak, buffer, sizeof (buffer), 0); return rc; } - -static void -_vtpm_release_packets(struct list_head *head, tpmif_t *tpmif, - int send_msgs) +static void _vtpm_release_packets(struct list_head *head, + tpmif_t * tpmif, int send_msgs) { struct packet *pak; - struct list_head *pos, *tmp; + struct list_head *pos, + *tmp; list_for_each_safe(pos, tmp, head) { pak = list_entry(pos, struct packet, next); + if (tpmif == NULL || pak->tpmif == tpmif) { int can_send = 0; + del_singleshot_timer_sync(&pak->processing_timer); list_del(&pak->next); @@ -849,9 +811,7 @@ } } - -int -vtpm_release_packets(tpmif_t *tpmif, int send_msgs) +int vtpm_release_packets(tpmif_t * tpmif, int send_msgs) { unsigned long flags; @@ -860,23 +820,22 @@ _vtpm_release_packets(&dataex.pending_pak, tpmif, send_msgs); _vtpm_release_packets(&dataex.current_pak, tpmif, send_msgs); - write_unlock_irqrestore(&dataex.pak_lock, - flags); + write_unlock_irqrestore(&dataex.pak_lock, flags); return 0; } - static int vtpm_queue_packet(struct packet *pak) { int rc = 0; + if (dataex.has_opener) { unsigned long flags; + write_lock_irqsave(&dataex.pak_lock, flags); list_add_tail(&pak->next, &dataex.pending_pak); /* give the TPM some time to pick up the request */ mod_timer(&pak->processing_timer, jiffies + (30 * HZ)); - write_unlock_irqrestore(&dataex.pak_lock, - flags); + write_unlock_irqrestore(&dataex.pak_lock, flags); wake_up_interruptible(&dataex.wait_queue); } else { @@ -885,24 +844,22 @@ return rc; } - -static int vtpm_receive(tpmif_t *tpmif, u32 size) +static int vtpm_receive(tpmif_t * tpmif, u32 size) { int rc = 0; unsigned char buffer[10]; __be32 *native_size; - - struct packet *pak = packet_alloc(tpmif, size, buffer[4], 0); - if (NULL == pak) { + struct packet *pak = packet_alloc(tpmif, size, 0, 0); + + if (!pak) return -ENOMEM; - } /* * Read 10 bytes from the received buffer to test its * content for validity. */ - if (sizeof(buffer) != packet_read(pak, - sizeof(buffer), buffer, - sizeof(buffer), 0)) { + if (sizeof (buffer) != packet_read(pak, + sizeof (buffer), buffer, + sizeof (buffer), 0)) { goto failexit; } /* @@ -911,7 +868,7 @@ */ packet_reset(pak); - native_size = (__force __be32 *)(&buffer[4+2]); + native_size = (__force __be32 *) (&buffer[4 + 2]); /* * Verify that the size of the packet is correct * as indicated and that there's actually someone reading packets. @@ -920,25 +877,23 @@ */ if (size < 10 || be32_to_cpu(*native_size) != size || - 0 == dataex.has_opener || - tpmif->status != CONNECTED) { - rc = -EINVAL; - goto failexit; + 0 == dataex.has_opener || tpmif->status != CONNECTED) { + rc = -EINVAL; + goto failexit; } else { - if ((rc = vtpm_queue_packet(pak)) < 0) { + rc = vtpm_queue_packet(pak); + if (rc < 0) goto failexit; - } } return 0; -failexit: + failexit: if (pak) { - tpm_send_fail_message(pak, buffer[4+1]); + tpm_send_fail_message(pak, buffer[4 + 1]); packet_free(pak); } return rc; } - /* * Timeout function that gets invoked when a packet has not been processed @@ -951,22 +906,23 @@ { struct packet *pak = (struct packet *)ptr; unsigned long flags; + write_lock_irqsave(&dataex.pak_lock, flags); /* * The packet needs to be searched whether it * is still on the list. */ if (pak == packet_find_packet(&dataex.pending_pak, pak) || - pak == packet_find_packet(&dataex.current_pak, pak) ) { + pak == packet_find_packet(&dataex.current_pak, pak)) { list_del(&pak->next); - tpm_send_fail_message(pak, pak->req_tag); + if ((pak->flags & PACKET_FLAG_DISCARD_RESPONSE) == 0) { + tpm_send_fail_message(pak, pak->req_tag); + } packet_free(pak); } write_unlock_irqrestore(&dataex.pak_lock, flags); } - - static void tpm_tx_action(unsigned long unused); static DECLARE_TASKLET(tpm_tx_tasklet, tpm_tx_action, 0); @@ -974,21 +930,18 @@ static struct list_head tpm_schedule_list; static spinlock_t tpm_schedule_list_lock; -static inline void -maybe_schedule_tx_action(void) +static inline void maybe_schedule_tx_action(void) { smp_mb(); tasklet_schedule(&tpm_tx_tasklet); } -static inline int -__on_tpm_schedule_list(tpmif_t * tpmif) +static inline int __on_tpm_schedule_list(tpmif_t * tpmif) { return tpmif->list.next != NULL; } -static void -remove_from_tpm_schedule_list(tpmif_t * tpmif) +static void remove_from_tpm_schedule_list(tpmif_t * tpmif) { spin_lock_irq(&tpm_schedule_list_lock); if (likely(__on_tpm_schedule_list(tpmif))) { @@ -999,8 +952,7 @@ spin_unlock_irq(&tpm_schedule_list_lock); } -static void -add_to_tpm_schedule_list_tail(tpmif_t * tpmif) +static void add_to_tpm_schedule_list_tail(tpmif_t * tpmif) { if (__on_tpm_schedule_list(tpmif)) return; @@ -1013,22 +965,18 @@ spin_unlock_irq(&tpm_schedule_list_lock); } -void -tpmif_schedule_work(tpmif_t * tpmif) +void tpmif_schedule_work(tpmif_t * tpmif) { add_to_tpm_schedule_list_tail(tpmif); maybe_schedule_tx_action(); } -void -tpmif_deschedule_work(tpmif_t * tpmif) +void tpmif_deschedule_work(tpmif_t * tpmif) { remove_from_tpm_schedule_list(tpmif); } - -static void -tpm_tx_action(unsigned long unused) +static void tpm_tx_action(unsigned long unused) { struct list_head *ent; tpmif_t *tpmif; @@ -1042,10 +990,6 @@ tpmif = list_entry(ent, tpmif_t, list); tpmif_get(tpmif); remove_from_tpm_schedule_list(tpmif); - /* - * Ensure that we see the request when we read from it. - */ - mb(); tx = &tpmif->tx->ring[0].req; @@ -1056,22 +1000,22 @@ } } -irqreturn_t -tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs) -{ - tpmif_t *tpmif = dev_id; +irqreturn_t tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs) +{ + tpmif_t *tpmif = (tpmif_t *) dev_id; + add_to_tpm_schedule_list_tail(tpmif); maybe_schedule_tx_action(); return IRQ_HANDLED; } -static int __init -tpmback_init(void) +static int __init tpmback_init(void) { int rc; - if ((rc = misc_register(&ibmvtpms_miscdevice)) != 0) { - printk(KERN_ALERT "Could not register misc device for TPM BE.\n"); + if ((rc = misc_register(&vtpms_miscdevice)) != 0) { + printk(KERN_ALERT + "Could not register misc device for TPM BE.\n"); return rc; } @@ -1094,13 +1038,11 @@ module_init(tpmback_init); -static void __exit -tpmback_exit(void) -{ - +static void __exit tpmback_exit(void) +{ tpmif_xenbus_exit(); tpmif_interface_exit(); - misc_deregister(&ibmvtpms_miscdevice); + misc_deregister(&vtpms_miscdevice); } module_exit(tpmback_exit); diff -r 9e19dcb05f56 -r d088ce2d3528 linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Fri Mar 3 14:56:03 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Fri Mar 3 14:56:34 2006 @@ -602,7 +602,6 @@ tx = &tp->tx->ring[i].req; - tx->id = i; tx->addr = virt_to_machine(txb->data); tx->size = txb->len; diff -r 9e19dcb05f56 -r d088ce2d3528 tools/debugger/gdb/gdbbuild --- a/tools/debugger/gdb/gdbbuild Fri Mar 3 14:56:03 2006 +++ b/tools/debugger/gdb/gdbbuild Fri Mar 3 14:56:34 2006 @@ -1,7 +1,9 @@ #!/bin/sh +[ "$GDB_MIRROR" ] || GDB_MIRROR="ftp://ftp.gnu.org/gnu/gdb/" + rm -rf gdb-6.2.1 gdb-6.2.1-linux-i386-xen -[ -a gdb-6.2.1.tar.bz2 ] || wget -c ftp://ftp.gnu.org/gnu/gdb/gdb-6.2.1.tar.bz2 +[ -a gdb-6.2.1.tar.bz2 ] || wget -c "$GDB_MIRROR/gdb-6.2.1.tar.bz2" tar xjf gdb-6.2.1.tar.bz2 cd gdb-6.2.1-xen-sparse @@ -12,8 +14,10 @@ cd gdb-6.2.1-linux-i386-xen ../gdb-6.2.1/configure -# some people don't have gmake -if which gmake ; then +# Use $MAKE if set, else use gmake if present, otherwise use make +if [ "$MAKE" ]; then + $MAKE +elif which gmake ; then gmake -j4 else make -j4 diff -r 9e19dcb05f56 -r d088ce2d3528 tools/firmware/hvmloader/Makefile --- a/tools/firmware/hvmloader/Makefile Fri Mar 3 14:56:03 2006 +++ b/tools/firmware/hvmloader/Makefile Fri Mar 3 14:56:34 2006 @@ -17,6 +17,9 @@ # this program; if not, write to the Free Software Foundation, Inc., 59 Temple # Place - Suite 330, Boston, MA 02111-1307 USA. # + +# External CFLAGS can do more harm than good. +CFLAGS := XEN_ROOT = ../../.. include $(XEN_ROOT)/Config.mk diff -r 9e19dcb05f56 -r d088ce2d3528 tools/firmware/vmxassist/Makefile --- a/tools/firmware/vmxassist/Makefile Fri Mar 3 14:56:03 2006 +++ b/tools/firmware/vmxassist/Makefile Fri Mar 3 14:56:34 2006 @@ -17,6 +17,9 @@ # this program; if not, write to the Free Software Foundation, Inc., 59 Temple # Place - Suite 330, Boston, MA 02111-1307 USA. # + +# External CFLAGS can do more harm than good. +CFLAGS := XEN_ROOT = ../../.. include $(XEN_ROOT)/Config.mk diff -r 9e19dcb05f56 -r d088ce2d3528 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Fri Mar 3 14:56:03 2006 +++ b/tools/python/xen/xend/image.py Fri Mar 3 14:56:34 2006 @@ -274,6 +274,10 @@ uname = sxp.child_value(info, 'uname') typedev = sxp.child_value(info, 'dev') (_, vbdparam) = string.split(uname, ':', 1) + + if 'file:' in uname and not os.path.isfile(vbdparam): + raise VmError('Disk image does not exist: %s' % vbdparam) + if 'ioemu:' in typedev: (emtype, vbddev) = string.split(typedev, ':', 1) else: diff -r 9e19dcb05f56 -r d088ce2d3528 tools/python/xen/xend/server/blkif.py --- a/tools/python/xen/xend/server/blkif.py Fri Mar 3 14:56:03 2006 +++ b/tools/python/xen/xend/server/blkif.py Fri Mar 3 14:56:34 2006 @@ -42,10 +42,6 @@ """@see DevController.getDeviceDetails""" dev = sxp.child_value(config, 'dev') - if 'ioemu:' in dev: - return (None,{},{}) - - devid = blkif.blkdev_name_to_number(dev) (typ, params) = string.split(sxp.child_value(config, 'uname'), ':', 1) back = { 'dev' : dev, @@ -54,7 +50,13 @@ 'mode' : sxp.child_value(config, 'mode', 'r') } - front = { 'virtual-device' : "%i" % devid } + if 'ioemu:' in dev: + (dummy, dev1) = string.split(dev, ':', 1) + devid = blkif.blkdev_name_to_number(dev1) + front = {} + else: + devid = blkif.blkdev_name_to_number(dev) + front = { 'virtual-device' : "%i" % devid } return (devid, back, front) diff -r 9e19dcb05f56 -r d088ce2d3528 tools/vtpm_manager/manager/dmictl.c --- a/tools/vtpm_manager/manager/dmictl.c Fri Mar 3 14:56:03 2006 +++ b/tools/vtpm_manager/manager/dmictl.c Fri Mar 3 14:56:34 2006 @@ -74,7 +74,13 @@ close(dmi_res->guest_tx_fh); dmi_res->guest_tx_fh = -1; close(dmi_res->vtpm_tx_fh); dmi_res->vtpm_tx_fh = -1; - + vtpm_globals->connected_dmis--; + + if (vtpm_globals->connected_dmis == 0) { + // No more DMI's connected. Close fifo to prevent a broken pipe. + close(vtpm_globals->guest_rx_fh); + vtpm_globals->guest_rx_fh = -1; + } #ifndef MANUAL_DM_LAUNCH if (dmi_res->dmi_id != VTPM_CTL_DM) { if (dmi_res->dmi_pid != 0) { @@ -118,6 +124,7 @@ status = TPM_BAD_PARAMETER; goto abort_egress; } else { + vtpm_globals->connected_dmis++; // Put this here so we don't count Dom0 BSG_UnpackList( param_buf->bytes, 3, BSG_TYPE_BYTE, &type, BSG_TYPE_UINT32, &domain_id, diff -r 9e19dcb05f56 -r d088ce2d3528 tools/vtpm_manager/manager/securestorage.c --- a/tools/vtpm_manager/manager/securestorage.c Fri Mar 3 14:56:03 2006 +++ b/tools/vtpm_manager/manager/securestorage.c Fri Mar 3 14:56:34 2006 @@ -307,8 +307,8 @@ TPM_RESULT status=TPM_SUCCESS; int fh, dmis=-1; - BYTE *flat_boot_key, *flat_dmis, *flat_enc; - buffer_t clear_flat_global, enc_flat_global; + BYTE *flat_boot_key=NULL, *flat_dmis=NULL, *flat_enc=NULL; + buffer_t clear_flat_global=NULL_BUF, enc_flat_global=NULL_BUF; UINT32 storageKeySize = buffer_len(&vtpm_globals->storageKeyWrap); UINT32 bootKeySize = buffer_len(&vtpm_globals->bootKeyWrap); struct pack_buf_t storage_key_pack = {storageKeySize, vtpm_globals->storageKeyWrap.bytes}; @@ -328,12 +328,9 @@ sizeof(UINT32) +// storagekeysize storageKeySize, NULL) ); // storage key - flat_dmis_size = (hashtable_count(vtpm_globals->dmi_map) - 1) * // num DMIS (-1 for Dom0) - (sizeof(UINT32) + 2*sizeof(TPM_DIGEST)); // Per DMI info flat_boot_key = (BYTE *) malloc( boot_key_size ); flat_enc = (BYTE *) malloc( sizeof(UINT32) ); - flat_dmis = (BYTE *) malloc( flat_dmis_size ); boot_key_size = BSG_PackList(flat_boot_key, 1, BSG_TPM_SIZE32_DATA, &boot_key_pack); @@ -349,8 +346,12 @@ BSG_PackConst(buffer_len(&enc_flat_global), 4, flat_enc); - // Per DMI values to be saved + // Per DMI values to be saved (if any exit) if (hashtable_count(vtpm_globals->dmi_map) > 0) { + + flat_dmis_size = (hashtable_count(vtpm_globals->dmi_map) - 1) * // num DMIS (-1 for Dom0) + (sizeof(UINT32) + 2*sizeof(TPM_DIGEST)); // Per DMI info + flat_dmis = (BYTE *) malloc( flat_dmis_size ); dmi_itr = hashtable_iterator(vtpm_globals->dmi_map); do { diff -r 9e19dcb05f56 -r d088ce2d3528 tools/vtpm_manager/manager/vtpm_manager.c --- a/tools/vtpm_manager/manager/vtpm_manager.c Fri Mar 3 14:56:03 2006 +++ b/tools/vtpm_manager/manager/vtpm_manager.c Fri Mar 3 14:56:34 2006 @@ -754,6 +754,7 @@ #ifndef VTPM_MULTI_VM vtpm_globals->vtpm_rx_fh = -1; vtpm_globals->guest_rx_fh = -1; + vtpm_globals->connected_dmis = 0; #endif if ((vtpm_globals->dmi_map = create_hashtable(10, hashfunc32, equals32)) == NULL){ status = TPM_FAIL; diff -r 9e19dcb05f56 -r d088ce2d3528 tools/vtpm_manager/manager/vtpmpriv.h --- a/tools/vtpm_manager/manager/vtpmpriv.h Fri Mar 3 14:56:03 2006 +++ b/tools/vtpm_manager/manager/vtpmpriv.h Fri Mar 3 14:56:34 2006 @@ -98,6 +98,7 @@ #ifndef VTPM_MULTI_VM int vtpm_rx_fh; int guest_rx_fh; + int connected_dmis; // Used to close guest_rx when no dmis are connected pid_t master_pid; #endif diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/ia64/xen/xensetup.c --- a/xen/arch/ia64/xen/xensetup.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/ia64/xen/xensetup.c Fri Mar 3 14:56:34 2006 @@ -12,7 +12,7 @@ #include <xen/sched.h> #include <xen/mm.h> #include <public/version.h> -//#include <xen/delay.h> +#include <xen/gdbstub.h> #include <xen/compile.h> #include <xen/console.h> #include <xen/serial.h> @@ -359,6 +359,8 @@ printk("Brought up %ld CPUs\n", (long)num_online_cpus()); smp_cpus_done(max_cpus); #endif + + initialise_gdb(); /* could be moved earlier */ do_initcalls(); printk("About to call sort_main_extable()\n"); diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/x86/hvm/vioapic.c --- a/xen/arch/x86/hvm/vioapic.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/x86/hvm/vioapic.c Fri Mar 3 14:56:34 2006 @@ -52,20 +52,6 @@ s->flags &= ~IOAPIC_ENABLE_FLAG; } -static void ioapic_dump_redir(hvm_vioapic_t *s, uint8_t entry) -{ - RedirStatus redir = s->redirtbl[entry]; - - printk("ioapic_dump_redir entry %x vector %x " - "deliver_mod %x destmode %x delivestatus %x " - "polarity %x remote_irr %x trigmod %x mask %x dest_id %x\n", - entry, redir.RedirForm.vector, redir.RedirForm.deliver_mode, - redir.RedirForm.destmode, redir.RedirForm.delivestatus, - redir.RedirForm.polarity, redir.RedirForm.remoteirr, - redir.RedirForm.trigmod, redir.RedirForm.mask, - redir.RedirForm.dest_id); -} - #ifdef HVM_DOMAIN_SAVE_RESTORE void ioapic_save(QEMUFile* f, void* opaque) { @@ -534,7 +520,19 @@ if (!IOAPICEnabled(s) || s->redirtbl[irq].RedirForm.mask) return; - ioapic_dump_redir(s, irq); + HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "hvm_vioapic_set_irq entry %x " + "vector %x deliver_mod %x destmode %x delivestatus %x " + "polarity %x remote_irr %x trigmod %x mask %x dest_id %x\n", + irq, + s->redirtbl[irq].RedirForm.vector, + s->redirtbl[irq].RedirForm.deliver_mode, + s->redirtbl[irq].RedirForm.destmode, + s->redirtbl[irq].RedirForm.delivestatus, + s->redirtbl[irq].RedirForm.polarity, + s->redirtbl[irq].RedirForm.remoteirr, + s->redirtbl[irq].RedirForm.trigmod, + s->redirtbl[irq].RedirForm.mask, + s->redirtbl[irq].RedirForm.dest_id); if (irq >= 0 && irq < IOAPIC_NUM_PINS) { uint32_t bit = 1 << irq; diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/x86/io_apic.c --- a/xen/arch/x86/io_apic.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/x86/io_apic.c Fri Mar 3 14:56:34 2006 @@ -1548,8 +1548,9 @@ */ apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); init_8259A(1); - timer_ack = 1; - enable_8259A_irq(0); + /* XEN: Ripped out the legacy missed-tick logic, so below is not needed. */ + /*timer_ack = 1;*/ + /*enable_8259A_irq(0);*/ pin1 = find_isa_irq_pin(0, mp_INT); apic1 = find_isa_irq_apic(0, mp_INT); @@ -1617,7 +1618,7 @@ printk(KERN_INFO "...trying to set up timer as ExtINT IRQ..."); - timer_ack = 0; + /*timer_ack = 0;*/ init_8259A(0); make_8259A_irq(0); apic_write_around(APIC_LVT0, APIC_DM_EXTINT); @@ -1631,16 +1632,6 @@ printk(" failed :(.\n"); panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a " "report. Then try booting with the 'noapic' option"); -} - -#define NR_IOAPIC_BIOSIDS 256 -static u8 ioapic_biosid_to_apic_enum[NR_IOAPIC_BIOSIDS]; -static void store_ioapic_biosid_mapping(void) -{ - u8 apic; - memset(ioapic_biosid_to_apic_enum, ~0, NR_IOAPIC_BIOSIDS); - for ( apic = 0; apic < nr_ioapics; apic++ ) - ioapic_biosid_to_apic_enum[mp_ioapics[apic].mpc_apicid] = apic; } /* @@ -1654,8 +1645,6 @@ void __init setup_IO_APIC(void) { - store_ioapic_biosid_mapping(); - enable_IO_APIC(); if (acpi_ioapic) @@ -1839,50 +1828,45 @@ #endif /*CONFIG_ACPI_BOOT*/ - -int ioapic_guest_read(int apicid, int address, u32 *pval) -{ - u32 val; - int apicenum; - union IO_APIC_reg_00 reg_00; +static int ioapic_physbase_to_id(unsigned long physbase) +{ + int apic; + for ( apic = 0; apic < nr_ioapics; apic++ ) + if ( mp_ioapics[apic].mpc_apicaddr == physbase ) + return apic; + return -EINVAL; +} + +int ioapic_guest_read(unsigned long physbase, unsigned int reg, u32 *pval) +{ + int apic; unsigned long flags; - if ( (apicid >= NR_IOAPIC_BIOSIDS) || - ((apicenum = ioapic_biosid_to_apic_enum[apicid]) >= nr_ioapics) ) - return -EINVAL; + if ( (apic = ioapic_physbase_to_id(physbase)) < 0 ) + return apic; spin_lock_irqsave(&ioapic_lock, flags); - val = io_apic_read(apicenum, address); + *pval = io_apic_read(apic, reg); spin_unlock_irqrestore(&ioapic_lock, flags); - /* Rewrite APIC ID to what the BIOS originally specified. */ - if ( address == 0 ) - { - reg_00.raw = val; - reg_00.bits.ID = apicid; - val = reg_00.raw; - } - - *pval = val; return 0; } -int ioapic_guest_write(int apicid, int address, u32 val) -{ - int apicenum, pin, irq; +int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val) +{ + int apic, pin, irq; struct IO_APIC_route_entry rte = { 0 }; struct irq_pin_list *entry; unsigned long flags; - if ( (apicid >= NR_IOAPIC_BIOSIDS) || - ((apicenum = ioapic_biosid_to_apic_enum[apicid]) >= nr_ioapics) ) - return -EINVAL; + if ( (apic = ioapic_physbase_to_id(physbase)) < 0 ) + return apic; /* Only write to the first half of a route entry. */ - if ( (address < 0x10) || (address & 1) ) + if ( (reg < 0x10) || (reg & 1) ) return 0; - pin = (address - 0x10) >> 1; + pin = (reg - 0x10) >> 1; *(u32 *)&rte = val; rte.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS); @@ -1898,7 +1882,7 @@ if ( rte.delivery_mode > dest_LowestPrio ) { printk("ERROR: Attempt to write weird IOAPIC destination mode!\n"); - printk(" APIC=%d/%d, lo-reg=%x\n", apicid, pin, val); + printk(" APIC=%d/%d, lo-reg=%x\n", apic, pin, val); return -EINVAL; } @@ -1923,19 +1907,19 @@ /* Record the pin<->irq mapping. */ for ( entry = &irq_2_pin[irq]; ; entry = &irq_2_pin[entry->next] ) { - if ( (entry->apic == apicenum) && (entry->pin == pin) ) + if ( (entry->apic == apic) && (entry->pin == pin) ) break; if ( !entry->next ) { - add_pin_to_irq(irq, apicenum, pin); + add_pin_to_irq(irq, apic, pin); break; } } } spin_lock_irqsave(&ioapic_lock, flags); - io_apic_write(apicenum, 0x10 + 2 * pin, *(((int *)&rte) + 0)); - io_apic_write(apicenum, 0x11 + 2 * pin, *(((int *)&rte) + 1)); + io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0)); + io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1)); spin_unlock_irqrestore(&ioapic_lock, flags); return 0; diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/x86/physdev.c --- a/xen/arch/x86/physdev.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/x86/physdev.c Fri Mar 3 14:56:34 2006 @@ -11,8 +11,12 @@ #include <public/xen.h> #include <public/physdev.h> -extern int ioapic_guest_read(int apicid, int address, u32 *pval); -extern int ioapic_guest_write(int apicid, int address, u32 pval); +extern int +ioapic_guest_read( + unsigned long physbase, unsigned int reg, u32 *pval); +extern int +ioapic_guest_write( + unsigned long physbase, unsigned int reg, u32 pval); /* * Demuxing hypercall. @@ -49,7 +53,9 @@ if ( !IS_PRIV(current->domain) ) break; ret = ioapic_guest_read( - op.u.apic_op.apic, op.u.apic_op.offset, &op.u.apic_op.value); + op.u.apic_op.apic_physbase, + op.u.apic_op.reg, + &op.u.apic_op.value); break; case PHYSDEVOP_APIC_WRITE: @@ -57,7 +63,9 @@ if ( !IS_PRIV(current->domain) ) break; ret = ioapic_guest_write( - op.u.apic_op.apic, op.u.apic_op.offset, op.u.apic_op.value); + op.u.apic_op.apic_physbase, + op.u.apic_op.reg, + op.u.apic_op.value); break; case PHYSDEVOP_ASSIGN_VECTOR: diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/x86/setup.c --- a/xen/arch/x86/setup.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/x86/setup.c Fri Mar 3 14:56:34 2006 @@ -13,6 +13,7 @@ #include <xen/multiboot.h> #include <xen/domain_page.h> #include <xen/compile.h> +#include <xen/gdbstub.h> #include <public/version.h> #include <asm/bitops.h> #include <asm/smp.h> @@ -479,6 +480,8 @@ printk("Brought up %ld CPUs\n", (long)num_online_cpus()); smp_cpus_done(max_cpus); + initialise_gdb(); /* could be moved earlier */ + do_initcalls(); schedulers_start(); diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/x86/time.c --- a/xen/arch/x86/time.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/x86/time.c Fri Mar 3 14:56:34 2006 @@ -41,7 +41,6 @@ unsigned long cpu_khz; /* CPU clock frequency in kHz. */ unsigned long hpet_address; spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; -int timer_ack = 0; unsigned long volatile jiffies; static u32 wc_sec, wc_nsec; /* UTC time at last 'time update'. */ static spinlock_t wc_lock = SPIN_LOCK_UNLOCKED; @@ -148,16 +147,6 @@ { ASSERT(local_irq_is_enabled()); - if ( timer_ack ) - { - extern spinlock_t i8259A_lock; - spin_lock_irq(&i8259A_lock); - outb(0x0c, 0x20); - /* Ack the IRQ; AEOI will end it automatically. */ - inb(0x20); - spin_unlock_irq(&i8259A_lock); - } - /* Update jiffies counter. */ (*(unsigned long *)&jiffies)++; diff -r 9e19dcb05f56 -r d088ce2d3528 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Fri Mar 3 14:56:03 2006 +++ b/xen/arch/x86/traps.c Fri Mar 3 14:56:34 2006 @@ -1410,7 +1410,13 @@ struct trap_info *dst = current->arch.guest_context.trap_ctxt; long rc = 0; - LOCK_BIGLOCK(current->domain); + /* If no table is presented then clear the entire virtual IDT. */ + if ( traps == NULL ) + { + memset(dst, 0, 256 * sizeof(*dst)); + init_int80_direct_trap(current); + return 0; + } for ( ; ; ) { @@ -1439,8 +1445,6 @@ traps++; } - - UNLOCK_BIGLOCK(current->domain); return rc; } diff -r 9e19dcb05f56 -r d088ce2d3528 xen/common/gdbstub.c --- a/xen/common/gdbstub.c Fri Mar 3 14:56:03 2006 +++ b/xen/common/gdbstub.c Fri Mar 3 14:56:34 2006 @@ -376,7 +376,6 @@ break; case 'g': /* Read registers */ gdb_arch_read_reg_array(regs, ctx); - ASSERT(!local_irq_is_enabled()); break; case 'G': /* Write registers */ gdb_arch_write_reg_array(regs, ctx->in_buf + 1, ctx); @@ -395,7 +394,6 @@ return 0; } gdb_cmd_read_mem(addr, length, ctx); - ASSERT(!local_irq_is_enabled()); break; case 'M': /* Write memory */ addr = simple_strtoul(ctx->in_buf + 1, &ptr, 16); @@ -477,7 +475,7 @@ { int resume = 0; int r; - unsigned flags; + unsigned long flags; if ( gdb_ctx->serhnd < 0 ) { @@ -506,7 +504,7 @@ if ( !gdb_ctx->connected ) { - printk("GDB connection activated\n"); + printk("GDB connection activated.\n"); gdb_arch_print_state(regs); gdb_ctx->connected = 1; } @@ -522,7 +520,7 @@ /* Shouldn't really do this, but otherwise we stop for no obvious reason, which is Bad */ - printk("Waiting for GDB to attach to Gdb\n"); + printk("Waiting for GDB to attach...\n"); gdb_arch_enter(regs); gdb_ctx->signum = gdb_arch_signal_num(regs, cookie); @@ -535,9 +533,7 @@ while ( resume == 0 ) { - ASSERT(!local_irq_is_enabled()); r = receive_command(gdb_ctx); - ASSERT(!local_irq_is_enabled()); if ( r < 0 ) { dbg_printk("GDB disappeared, trying to resume Xen...\n"); @@ -545,9 +541,7 @@ } else { - ASSERT(!local_irq_is_enabled()); resume = process_command(regs, gdb_ctx); - ASSERT(!local_irq_is_enabled()); } } @@ -561,27 +555,13 @@ return 0; } -/* - * initialization - * XXX TODO - * This should be an explicit call from architecture code. - * initcall is far too late for some early debugging, and only the - * architecture code knows when this call can be made. - */ -static int -initialize_gdb(void) -{ - if ( !strcmp(opt_gdb, "none") ) - return 0; +void +initialise_gdb(void) +{ gdb_ctx->serhnd = serial_parse_handle(opt_gdb); - if ( gdb_ctx->serhnd == -1 ) - panic("Can't parse %s as GDB serial info.\n", opt_gdb); - - printk("Gdb initialised.\n"); - return 0; -} - -__initcall(initialize_gdb); + if ( gdb_ctx->serhnd != -1 ) + printk("GDB stub initialised.\n"); +} /* * Local variables: diff -r 9e19dcb05f56 -r d088ce2d3528 xen/include/asm-x86/time.h --- a/xen/include/asm-x86/time.h Fri Mar 3 14:56:03 2006 +++ b/xen/include/asm-x86/time.h Fri Mar 3 14:56:34 2006 @@ -3,8 +3,6 @@ #define __X86_TIME_H__ #include <asm/msr.h> - -extern int timer_ack; extern void calibrate_tsc_bp(void); extern void calibrate_tsc_ap(void); diff -r 9e19dcb05f56 -r d088ce2d3528 xen/include/public/io/tpmif.h --- a/xen/include/public/io/tpmif.h Fri Mar 3 14:56:03 2006 +++ b/xen/include/public/io/tpmif.h Fri Mar 3 14:56:34 2006 @@ -21,7 +21,7 @@ typedef struct { unsigned long addr; /* Machine address of packet. */ grant_ref_t ref; /* grant table access reference */ - uint16_t id; /* Echoed in response message. */ + uint16_t unused; uint16_t size; /* Packet size in bytes. */ } tpmif_tx_request_t; diff -r 9e19dcb05f56 -r d088ce2d3528 xen/include/public/physdev.h --- a/xen/include/public/physdev.h Fri Mar 3 14:56:03 2006 +++ b/xen/include/public/physdev.h Fri Mar 3 14:56:34 2006 @@ -33,8 +33,8 @@ typedef struct physdevop_apic { /* IN */ - uint32_t apic; - uint32_t offset; + unsigned long apic_physbase; + uint32_t reg; /* IN or OUT */ uint32_t value; } physdevop_apic_t; diff -r 9e19dcb05f56 -r d088ce2d3528 xen/include/xen/gdbstub.h --- a/xen/include/xen/gdbstub.h Fri Mar 3 14:56:03 2006 +++ b/xen/include/xen/gdbstub.h Fri Mar 3 14:56:34 2006 @@ -20,6 +20,8 @@ #ifndef __XEN_GDBSTUB_H__ #define __XEN_GDBSTUB_H__ + +#ifdef CRASH_DEBUG /* value <-> char (de)serialzers for arch specific gdb backends */ char hex2char(unsigned long x); @@ -84,6 +86,14 @@ #define SIGALRM 14 #define SIGTERM 15 +void initialise_gdb(void); + +#else + +#define initialise_gdb() ((void)0) + +#endif + #endif /* __XEN_GDBSTUB_H__ */ /* _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |