Hello! I have some problems setting up a custom GDT (I need one where the code is readable). Anyway, I try to switch to my own GDT as follows: unsigned long frames[16]; volatile unsigned long va = (unsigned long)GDT; volatile unsigned long pa = to_phys(va); volatile unsigned long ma = phys_to_machine(pa) & ~_PAGE_RW | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY; /* Make it read-only */ HYPERVISOR_update_va_mapping(va, (pte_t){ ma }, 0); frames[0] = ma; int ret = HYPERVISOR_set_gdt(frames, 16); (The GDT Is just copied from Linux'' right now). When doing this, I always get -EINVAL from set_gdt, which I suspect is because HYPERVISOR_update_va_mapping for some reason does not succeed in setting the page read-only. I''ve checked the Linux implementation, and it does basically the same thing (pte_wrprotect() on the machine-address before calling update_va_mapping). Does anyone see what is wrong here? // Simon _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Kagstrom wrote:>Hello! > >I have some problems setting up a custom GDT (I need one where the >code is readable). Anyway, I try to switch to my own GDT as follows: > > unsigned long frames[16]; > > volatile unsigned long va = (unsigned long)GDT; > volatile unsigned long pa = to_phys(va); > volatile unsigned long ma = phys_to_machine(pa) & ~_PAGE_RW | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY; > > /* Make it read-only */ > HYPERVISOR_update_va_mapping(va, (pte_t){ ma }, 0); > frames[0] = ma; > > int ret = HYPERVISOR_set_gdt(frames, 16); > > >(The GDT Is just copied from Linux'' right now). When doing this, I >always get -EINVAL from set_gdt, which I suspect is because >HYPERVISOR_update_va_mapping for some reason does not succeed in >setting the page read-only. > >I''ve checked the Linux implementation, and it does basically the same >thing (pte_wrprotect() on the machine-address before calling >update_va_mapping). Does anyone see what is wrong here? > >// Simon > >_______________________________________________ >Xen-devel mailing list >Xen-devel@lists.xensource.com >http://lists.xensource.com/xen-devel > >The machine address you pass to Xen is a page table entry. Xen want a machine frame number. frames[0] = ma >> PAGE_SHIFT; should fix you problem. Mathieu _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
On 9 Jun 2006, at 12:03, Simon Kagstrom wrote:> (The GDT Is just copied from Linux'' right now). When doing this, I > always get -EINVAL from set_gdt, which I suspect is because > HYPERVISOR_update_va_mapping for some reason does not succeed in > setting the page read-only. > > I''ve checked the Linux implementation, and it does basically the same > thing (pte_wrprotect() on the machine-address before calling > update_va_mapping). Does anyone see what is wrong here?Is your GDT page-aligned and -padded. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
At Fri, 09 Jun 2006 13:07:02 +0200, Mathieu Ropert wrote:> > Simon Kagstrom wrote: > > >Hello! > > > >I have some problems setting up a custom GDT (I need one where the > >code is readable). Anyway, I try to switch to my own GDT as follows: > > > > unsigned long frames[16]; > > > > volatile unsigned long va = (unsigned long)GDT; > > volatile unsigned long pa = to_phys(va); > > volatile unsigned long ma = phys_to_machine(pa) & ~_PAGE_RW | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY; > > > > /* Make it read-only */ > > HYPERVISOR_update_va_mapping(va, (pte_t){ ma }, 0); > > frames[0] = ma; > > The machine address you pass to Xen is a page table entry. Xen want a > machine frame number. > > frames[0] = ma >> PAGE_SHIFT; > > should fix you problem.Ah, thank you! This fixed the problem! I see now that Linux uses virt_to_mfn() - I should have looked at that one... // Simon _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel