# 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
|