> > This is just a matter of aesthetic, but probably something like the
> > following would be clearer?
> >
> > if (entry->vaddr_base && entry->paddr_index == address_index) {
> > if (!test_bit(address_offset>>XC_PAGE_SHIFT,
> entry->valid_mapping)) {
> > /* your code + remap bucket */
> > }
> > } else {
> > qemu_remap_bucket(entry, address_index);
> > }
> >
>
> Yes that should work, although I think I'm too tired now for Boolean
> algebra :)
>
> Is my calculation of the pfn correct? I think I don't need to fuss
> around with decoding from the bucket index and bucket offset if I'm
just
> doing a trial map of one page, so using phys_addr directory is correct
> right?
>
Is this what you had in mind?
diff --git a/hw/xen_machine_fv.c b/hw/xen_machine_fv.c
index d02e23f..3c9fc0f 100644
--- a/hw/xen_machine_fv.c
+++ b/hw/xen_machine_fv.c
@@ -151,8 +151,30 @@ uint8_t *qemu_map_cache(target_phys_addr_t
phys_addr, uint8_t lock)
pentry->next = entry;
qemu_remap_bucket(entry, address_index);
} else if (!entry->lock) {
- if (!entry->vaddr_base || entry->paddr_index != address_index
|| !test_bit(address_offset>>XC_PAGE_SHIFT, entry->valid_mapping))
+ if (entry->vaddr_base && entry->paddr_index == address_index)
+ {
+ if (!test_bit(address_offset>>XC_PAGE_SHIFT,
entry->valid_mapping))
+ {
+ /* The page was invalid previously. Test if it is valid
now and only remap if so */
+ xen_pfn_t pfn;
+ int err;
+ void *tmp_vaddr;
+
+ pfn = phys_addr >> XC_PAGE_SHIFT;
+ tmp_vaddr = xc_map_foreign_bulk(xc_handle, domid,
PROT_READ|PROT_WRITE, &pfn, &err, 1);
+ if (tmp_vaddr)
+ munmap(tmp_vaddr, PAGE_SIZE);
+
+ if (!tmp_vaddr || err)
+ {
+ last_address_index = ~0UL;
+ return NULL;
+ }
+ qemu_remap_bucket(entry, address_index);
+ }
+ } else {
qemu_remap_bucket(entry, address_index);
+ }
}
if (!test_bit(address_offset>>XC_PAGE_SHIFT, entry->valid_mapping))
{
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|