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

Re: [Xen-devel] [PATCH RFC V3 4/5] xen, libxc: Request page fault injection via libxc



On 07/24/2014 06:27 PM, Jan Beulich wrote:
>>>> On 23.07.14 at 14:34, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
>> +static void check_pf_injection(void)
>> +{
>> +    struct vcpu *curr = current;
>> +    struct domain *d = curr->domain;
>> +    struct hvm_hw_cpu ctxt;
>> +    struct segment_register seg;
>> +    int errcode = PFEC_user_mode;
>> +
>> +    if ( !is_hvm_domain(d)
>> +         || d->arch.hvm_domain.fault_info.virtual_address == 0 )
>> +        return;
>> +
>> +    hvm_funcs.save_cpu_ctxt(curr, &ctxt);
> 
> Isn't this a little heavy handed?

It did seem that way to me too, but I couldn't find another way to get
to ctxt.pending_event and CR3 at this point in the code. Is there an
alternative I'm not aware of?

>> +    hvm_get_segment_register(curr, x86_seg_ss, &seg);
>> +
>> +    if ( seg.attr.fields.dpl == 3 /* Guest is in user mode */
> 
> Did you verify that this covers VM86 mode too?

Assuming CPL is SS.DPL (I've been previously been using CS.DPL), it did
work in our tests, yes.

>> +         && !ctxt.pending_event
>> +         && ctxt.cr3 == d->arch.hvm_domain.fault_info.address_space )
>> +    {
>> +        /* Cache */
> 
> Cache? Did you mean "Latch" or some such perhaps?
> 
>> +        uint64_t virtual_address = 
>> d->arch.hvm_domain.fault_info.virtual_address;
>> +        uint32_t write_access = d->arch.hvm_domain.fault_info.write_access;

I meant "cache", as in "I'm caching
d->arch.hvm_domain.fault_info.virtual_address into virtual_address"
before resetting it, but the comment is not only unimportant but
obviously confusing, so I'll take it out.

>> +        /* Reset */
>> +        d->arch.hvm_domain.fault_info.address_space = 0;
>> +        d->arch.hvm_domain.fault_info.virtual_address = 0;
>> +        d->arch.hvm_domain.fault_info.write_access = 0;
>> +
>> +        if ( write_access )
>> +            errcode |= PFEC_write_access;
>> +
>> +        hvm_inject_page_fault(errcode, virtual_address);
>> +    }
>> +}
> 
> Even together with its call site it's remaining unclear without knowing
> almost all of the rest of your code why this function would inject
> only two types of page faults (and I'm still not finally sure this is
> intended/correct). A comment would certainly help, short of a
> more descriptive name for the function (which I suppose would get
> unreasonably long).

The function, as previously suggested, will be split into the check part
and the injection part.

What our code does in this case has been briefly described here:
http://lists.xen.org/archives/html/xen-devel/2014-07/msg03013.html

>> @@ -1012,6 +1024,7 @@ struct xen_domctl {
>>  #define XEN_DOMCTL_gdbsx_pausevcpu             1001
>>  #define XEN_DOMCTL_gdbsx_unpausevcpu           1002
>>  #define XEN_DOMCTL_gdbsx_domstatus             1003
>> +#define XEN_DOMCTL_set_pagefault_info          1004
> 
> That doesn't look like the range you want to extend.

Could you please elaborate? Thank you.


Thanks,
Razvan Cojocaru

_______________________________________________
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®.