# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1194533401 0
# Node ID c0bdfda5183d5e9dca5c9bc7a68a6cf40e3f6c58
# Parent cb6675149af80766d1e0ee624b64a552dd1351bf
hvm: Clean up buf_ioreq handling.
Also, disable stdvga caching on hvm save/restore, as the shadow vga
state is not preserved.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
tools/ioemu/target-i386-dm/helper2.c | 17 +++++++++--------
xen/arch/ia64/vmx/mmio.c | 3 ++-
xen/arch/ia64/vmx/save.c | 6 ++----
xen/arch/x86/hvm/intercept.c | 18 ++++++++++--------
xen/arch/x86/hvm/save.c | 12 +++++++-----
xen/arch/x86/hvm/stdvga.c | 4 +++-
xen/common/hvm/save.c | 4 ++--
xen/include/public/hvm/ioreq.h | 11 ++++++-----
xen/include/xen/hvm/save.h | 4 ++--
9 files changed, 43 insertions(+), 36 deletions(-)
diff -r cb6675149af8 -r c0bdfda5183d tools/ioemu/target-i386-dm/helper2.c
--- a/tools/ioemu/target-i386-dm/helper2.c Thu Nov 08 13:14:03 2007 +0000
+++ b/tools/ioemu/target-i386-dm/helper2.c Thu Nov 08 14:50:01 2007 +0000
@@ -541,27 +541,28 @@ void __handle_buffered_iopage(CPUState *
{
buf_ioreq_t *buf_req = NULL;
ioreq_t req;
- int qw = 0;
+ int qw;
if (!buffered_io_page)
return;
while (buffered_io_page->read_pointer !=
buffered_io_page->write_pointer) {
- memset(&req, 0, sizeof(req));
- buf_req = &buffered_io_page->buf_ioreq[buffered_io_page->read_pointer %
- IOREQ_BUFFER_SLOT_NUM];
+ buf_req = &buffered_io_page->buf_ioreq[
+ buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM];
req.size = 1UL << buf_req->size;
req.count = 1;
req.addr = buf_req->addr;
req.data = buf_req->data;
req.state = STATE_IOREQ_READY;
- req.dir = buf_req->dir;
+ req.dir = buf_req->dir;
+ req.df = buf_req->df;
req.type = buf_req->type;
- qw = req.size == 8;
+ req.data_is_ptr = 0;
+ qw = (req.size == 8);
if (qw) {
- buf_req =
&buffered_io_page->buf_ioreq[(buffered_io_page->read_pointer+1) %
- IOREQ_BUFFER_SLOT_NUM];
+ buf_req = &buffered_io_page->buf_ioreq[
+ (buffered_io_page->read_pointer+1) % IOREQ_BUFFER_SLOT_NUM];
req.data |= ((uint64_t)buf_req->data) << 32;
}
diff -r cb6675149af8 -r c0bdfda5183d xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/arch/ia64/vmx/mmio.c Thu Nov 08 14:50:01 2007 +0000
@@ -65,7 +65,7 @@ static int hvm_buffered_io_intercept(ior
/* ignore READ ioreq_t and anything buffered io can't deal with */
if (p->dir == IOREQ_READ || p->addr > 0xFFFFFUL ||
- p->data_is_ptr || p->df || p->count != 1)
+ p->data_is_ptr || p->count != 1)
return 0;
for (i = 0; i < HVM_BUFFERED_IO_RANGE_NR; i++) {
@@ -80,6 +80,7 @@ static int hvm_buffered_io_intercept(ior
bp.type = p->type;
bp.dir = p->dir;
+ bp.df = p->df;
switch (p->size) {
case 1:
bp.size = 0;
diff -r cb6675149af8 -r c0bdfda5183d xen/arch/ia64/vmx/save.c
--- a/xen/arch/ia64/vmx/save.c Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/arch/ia64/vmx/save.c Thu Nov 08 14:50:01 2007 +0000
@@ -23,8 +23,7 @@
#include <xen/types.h>
#include <xen/hvm/save.h>
-void
-arch_hvm_save(struct hvm_save_header *hdr)
+void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr)
{
unsigned int i;
@@ -32,8 +31,7 @@ arch_hvm_save(struct hvm_save_header *hd
hdr->cpuid[i] = ia64_get_cpuid(i);
}
-int
-arch_hvm_load(struct hvm_save_header *hdr)
+int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr)
{
unsigned int i;
if (hdr->magic != HVM_FILE_MAGIC) {
diff -r cb6675149af8 -r c0bdfda5183d xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/arch/x86/hvm/intercept.c Thu Nov 08 14:50:01 2007 +0000
@@ -163,18 +163,20 @@ int hvm_buffered_io_send(ioreq_t *p)
/* Ensure buffered_iopage fits in a page */
BUILD_BUG_ON(sizeof(buffered_iopage_t) > PAGE_SIZE);
- /* Return 0 for the cases we can't deal with. */
- if ( (p->addr > 0xffffful) || p->data_is_ptr || p->df || (p->count != 1) )
- {
- gdprintk(XENLOG_DEBUG, "slow ioreq. type:%d size:%"PRIu64" addr:0x%"
- PRIx64" dir:%d ptr:%d df:%d count:%"PRIu64"\n",
- p->type, p->size, p->addr, !!p->dir,
- !!p->data_is_ptr, !!p->df, p->count);
+ /*
+ * Return 0 for the cases we can't deal with:
+ * - 'addr' is only a 20-bit field, so we cannot address beyond 1MB
+ * - we cannot buffer accesses to guest memory buffers, as the guest
+ * may expect the memory buffer to be synchronously accessed
+ * - the count field is usually used with data_is_ptr and since we don't
+ * support data_is_ptr we do not waste space for the count field either
+ */
+ if ( (p->addr > 0xffffful) || p->data_is_ptr || (p->count != 1) )
return 0;
- }
bp.type = p->type;
bp.dir = p->dir;
+ bp.df = p->df;
switch ( p->size )
{
case 1:
diff -r cb6675149af8 -r c0bdfda5183d xen/arch/x86/hvm/save.c
--- a/xen/arch/x86/hvm/save.c Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/arch/x86/hvm/save.c Thu Nov 08 14:50:01 2007 +0000
@@ -24,8 +24,7 @@
#include <asm/hvm/support.h>
#include <public/hvm/save.h>
-void
-arch_hvm_save(struct hvm_save_header *hdr)
+void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr)
{
uint32_t eax, ebx, ecx, edx;
@@ -36,10 +35,10 @@ arch_hvm_save(struct hvm_save_header *hd
hdr->pad0 = 0;
}
-int
-arch_hvm_load(struct hvm_save_header *hdr)
+int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr)
{
uint32_t eax, ebx, ecx, edx;
+
if ( hdr->magic != HVM_FILE_MAGIC )
{
gdprintk(XENLOG_ERR,
@@ -55,10 +54,13 @@ arch_hvm_load(struct hvm_save_header *hd
}
cpuid(1, &eax, &ebx, &ecx, &edx);
- /*TODO: need to define how big a difference is acceptable */
+ /* TODO: need to define how big a difference is acceptable? */
if ( hdr->cpuid != eax )
gdprintk(XENLOG_WARNING, "HVM restore: saved CPUID (%#"PRIx32") "
"does not match host (%#"PRIx32").\n", hdr->cpuid, eax);
+
+ /* VGA state is not saved/restored, so we nobble the cache. */
+ d->arch.hvm_domain.stdvga.cache = 0;
return 0;
}
diff -r cb6675149af8 -r c0bdfda5183d xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/arch/x86/hvm/stdvga.c Thu Nov 08 14:50:01 2007 +0000
@@ -220,7 +220,9 @@ static void stdvga_outb(uint64_t addr, u
gdprintk(XENLOG_INFO, "entering stdvga and caching modes\n");
}
else if ( prev_stdvga && !s->stdvga )
+ {
gdprintk(XENLOG_INFO, "leaving stdvga\n");
+ }
}
static void stdvga_outv(uint64_t addr, uint64_t data, uint32_t size)
@@ -636,7 +638,7 @@ int stdvga_intercept_mmio(ioreq_t *p)
buf = mmio_op(s, p);
break;
default:
- gdprintk(XENLOG_ERR, "unsupported mmio request type:%d "
+ gdprintk(XENLOG_WARNING, "unsupported mmio request type:%d "
"addr:0x%04x data:0x%04x size:%d count:%d state:%d "
"isptr:%d dir:%d df:%d\n",
p->type, (int)p->addr, (int)p->data, (int)p->size,
diff -r cb6675149af8 -r c0bdfda5183d xen/common/hvm/save.c
--- a/xen/common/hvm/save.c Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/common/hvm/save.c Thu Nov 08 14:50:01 2007 +0000
@@ -94,7 +94,7 @@ int hvm_save(struct domain *d, hvm_domai
else
hdr.changeset = -1ULL; /* Unknown */
- arch_hvm_save(&hdr);
+ arch_hvm_save(d, &hdr);
if ( hvm_save_entry(HEADER, 0, h, &hdr) != 0 )
{
@@ -144,7 +144,7 @@ int hvm_load(struct domain *d, hvm_domai
if ( hvm_load_entry(HEADER, h, &hdr) != 0 )
return -1;
- if ( arch_hvm_load(&hdr) )
+ if ( arch_hvm_load(d, &hdr) )
return -1;
c = strrchr(xen_changeset(), ':');
diff -r cb6675149af8 -r c0bdfda5183d xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/include/public/hvm/ioreq.h Thu Nov 08 14:50:01 2007 +0000
@@ -78,11 +78,12 @@ typedef struct shared_iopage shared_iopa
typedef struct shared_iopage shared_iopage_t;
struct buf_ioreq {
- uint8_t type; /* I/O type */
- uint8_t dir:1; /* 1=read, 0=write */
- uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
- uint32_t addr:20;/* physical address */
- uint32_t data; /* data */
+ uint8_t type; /* I/O type */
+ uint8_t df:1; /* EFLAGS.DF */
+ uint8_t dir:1; /* 1=read, 0=write */
+ uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
+ uint32_t addr:20;/* physical address */
+ uint32_t data; /* data */
};
typedef struct buf_ioreq buf_ioreq_t;
diff -r cb6675149af8 -r c0bdfda5183d xen/include/xen/hvm/save.h
--- a/xen/include/xen/hvm/save.h Thu Nov 08 13:14:03 2007 +0000
+++ b/xen/include/xen/hvm/save.h Thu Nov 08 14:50:01 2007 +0000
@@ -155,7 +155,7 @@ int hvm_load(struct domain *d, hvm_domai
/* Arch-specific definitions. */
struct hvm_save_header;
-void arch_hvm_save(struct hvm_save_header *hdr);
-int arch_hvm_load(struct hvm_save_header *hdr);
+void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr);
+int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr);
#endif /* __XEN_HVM_SAVE_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|