Are you sure you're looking to "catch" the page fault in the right place?
It's been a long time since I've done anything with the shadow code,
but last time I checked, if the guest walk is valid, the code will
just fix it up in guest_walk (i.e., change your read-only shadow entry
to read-write to match the guest PTE), and after finding nothing else
wrong, just return. You may do better looking at how either the
logdirty code works.
-George
On Thu, Dec 9, 2010 at 7:26 PM, Cutter 409 <cutter409@xxxxxxxxx> wrote:
> Hello,
>
> I'm trying to do something similar to what Ether does, using Xen 3.4.2
> My function to write a not present shadow entry doesn't seem to work. I
> never catch a page fault for an address that I've marked not present.
>
> The function in question should take a virtual address and write a shadow
> entry for it, marking it either present or not present.
> If it's not present I should be able to detect when the guest accesses it.
>
> static int sh_set_present(struct vcpu *v, unsigned long vaddr, int present,
> int need_lock) {
> shadow_l1e_t sl1e;
> walk_t gw;
> shadow_l1e_t *ptr_sl1e;
>
> gfn_t gfn = _gfn(0);
> mfn_t gmfn, sl1mfn = _mfn(0);
> p2m_type_t p2mt;
>
> int result = 0;
>
> if(need_lock)
> shadow_lock(v->domain);
>
> // Returns 0 for success
> if(unlikely(sh_walk_guest_tables(v, vaddr, &gw, p2mt) != 0)) {
> printk("Unable to walk guest tables\n") ;
> goto done;
> }
>
> /* What mfn is the guest trying to access? */
> gfn = guest_l1e_get_gfn(gw.l1e);
> gmfn = gfn_to_mfn_guest(v->domain, gfn, &p2mt);
>
>
> // Create the shadow entry
> ptr_sl1e = shadow_get_and_create_l1e(v, &gw, &sl1mfn, ft_demand_read);
>
> // Calculate the shadow entry
> l1e_propagate_from_guest(v, gw.l1e, gmfn, &sl1e, ft_demand_read, p2mt);
>
> if (present) {
> sl1e = shadow_l1e_add_flags(sl1e, _PAGE_PRESENT);
> } else {
> // I don't think we should have to do this part..
> sl1e = shadow_l1e_remove_flags(sl1e, _PAGE_PRESENT);
> }
>
> // Write the shadow entry
> printk("shadow_set_l1e: %X\n", shadow_set_l1e(v, ptr_sl1e, sl1e,
> sl1mfn));
>
> /* printk("Set %lX as", vaddr);
> if(!present)
> printk(" NOT");
> printk(" present\n");*/
>
> result = 1;
>
> done:
> if(need_lock)
> shadow_unlock(v->domain);
>
> return result;
> }
>
> I do have ept disabled. Can anyone give me any ideas about what could be
> wrong, or how to go about debugging this? I'm not extremely familiar with
> the shadow page table.
>
> Thanks!
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|