[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC 6/9] xen, libxc: Request page fault injection via libxc



>>> On 02.07.14 at 18:06, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
> On 07/02/2014 06:51 PM, Jan Beulich wrote:
>>>>> On 02.07.14 at 15:33, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
>>> Added new XEN_DOMCTL_set_pagefault_info hypercall, used by libxc's
>>> new xc_domain_set_pagefault_info() function to set per-domain page
>>> fault injection information. This information is then used to call
>>> hvm_inject_page_fault() at the first VMENTRY where the guest status
>>> matches and there are no other pending traps.
>> 
>> So the first question that strikes me here: What good can it do to be
>> able to inject arbitrary page faults, possibly at times where the guest
>> OS is absolutely not expecting them?
> 
> The guest, as Andrew Cooper said, is waiting for a mem_event reply.
> 
>>> @@ -430,6 +431,9 @@ static void vmx_vmcs_save(struct vcpu *v, struct 
> hvm_hw_cpu *c)
>>>      __vmread(GUEST_SYSENTER_CS, &c->sysenter_cs);
>>>      __vmread(GUEST_SYSENTER_ESP, &c->sysenter_esp);
>>>      __vmread(GUEST_SYSENTER_EIP, &c->sysenter_eip);
>>> +    __vmread(GUEST_CS_AR_BYTES, &cs_arbytes);
>>> +
>>> +    c->cs_arbytes = (uint32_t)cs_arbytes;
>> 
>> This again looks like an unrelated change without any explanation.
> 
> It's used here, to check if we're in user mode before injecting the page
> fault:

Okay.

>  92 +static void check_pf_injection(void)
>  93 +{
>  94 +    struct vcpu *curr = current;
>  95 +    struct domain *d = curr->domain;
>  96 +    struct hvm_hw_cpu ctxt;
>  97 +    uint32_t cs_dpl;
>  98 +
>  99 +    if ( !is_hvm_domain(d) || d->fault_info.virtual_address == 0 )
> 100 +        return;
> 101 +
> 102 +    memset(&ctxt, 0, sizeof(struct hvm_hw_cpu));
> 103 +    hvm_funcs.save_cpu_ctxt(curr, &ctxt);
> 104 +
> 105 +    cs_dpl = (ctxt.cs_arbytes >> 5) & 3;
> 106 +
> 107 +    if ( cs_dpl == 3 /* Guest is in user mode */

Which is yet another example of trying to determine the CPL by
looking at CS.DPL - SS.DPL is the canonical value for that.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.