|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V4 4/5] xen, libxc: Request page fault injection via libxc
>>> On 05.09.14 at 12:01, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
> + /*
> + * Inject per-domain pending hw/sw trap (this will most likely
> + * be a page fault injected by memory introspection code).
> + */
> + else if ( d->arch.hvm_domain.inject_trap.vector != -1 &&
> + hvm_can_inject_domain_pf(v) )
Now these two don't fit together: The first check for _any_
vector, while the latter considers just #PF.
> + {
> + hvm_inject_trap(&d->arch.hvm_domain.inject_trap);
> + d->arch.hvm_domain.inject_trap.vector = -1;
> + }
And this is clearly lacking serialization (or a comment saying why
serialization isn't needed here).
> @@ -6086,19 +6123,51 @@ long do_hvm_op(unsigned long op,
> XEN_GUEST_HANDLE_PARAM(void) arg)
> goto param_fail8;
>
> rc = -ENOENT;
> - if ( tr.vcpuid >= d->max_vcpus || (v = d->vcpu[tr.vcpuid]) == NULL )
> - goto param_fail8;
> -
> - if ( v->arch.hvm_vcpu.inject_trap.vector != -1 )
> - rc = -EBUSY;
> - else
> +
> + if ( tr.vcpuid == (uint32_t)~0 ) /* Any VCPU. */
> {
> - v->arch.hvm_vcpu.inject_trap.vector = tr.vector;
> - v->arch.hvm_vcpu.inject_trap.type = tr.type;
> - v->arch.hvm_vcpu.inject_trap.error_code = tr.error_code;
> - v->arch.hvm_vcpu.inject_trap.insn_len = tr.insn_len;
> - v->arch.hvm_vcpu.inject_trap.cr2 = tr.cr2;
> - rc = 0;
> + unsigned int i;
> +
> + for ( i = 0; i < d->max_vcpus; i++ )
> + if ( (v = d->vcpu[i]) != NULL &&
> + v->arch.hvm_vcpu.inject_trap.vector != -1 )
> + {
> + rc = -EBUSY;
> + break;
> + }
> +
> + if ( d->arch.hvm_domain.inject_trap.vector != -1 )
> + rc = -EBUSY;
> +
> + if ( rc != -EBUSY )
> + {
> + d->arch.hvm_domain.inject_trap.vector = tr.vector;
> + d->arch.hvm_domain.inject_trap.type = tr.type;
> + d->arch.hvm_domain.inject_trap.error_code = tr.error_code;
> + d->arch.hvm_domain.inject_trap.insn_len = tr.insn_len;
> + d->arch.hvm_domain.inject_trap.cr2 = tr.cr2;
> + d->arch.hvm_domain.inject_trap.cr3 = tr.cr3;
> + rc = 0;
> + }
> + }
> + else /* Specific VCPU. */
> + {
> + if ( tr.vcpuid >= d->max_vcpus || (v = d->vcpu[tr.vcpuid]) ==
> NULL )
> + goto param_fail8;
> +
> + if ( v->arch.hvm_vcpu.inject_trap.vector != -1 ||
> + d->arch.hvm_domain.inject_trap.vector != -1 )
> + rc = -EBUSY;
> + else
> + {
> + v->arch.hvm_vcpu.inject_trap.vector = tr.vector;
> + v->arch.hvm_vcpu.inject_trap.type = tr.type;
> + v->arch.hvm_vcpu.inject_trap.error_code = tr.error_code;
> + v->arch.hvm_vcpu.inject_trap.insn_len = tr.insn_len;
> + v->arch.hvm_vcpu.inject_trap.cr2 = tr.cr2;
> + v->arch.hvm_vcpu.inject_trap.cr3 = tr.cr3;
> + rc = 0;
> + }
> }
As does - afaict - this code.
> --- a/xen/include/public/hvm/hvm_op.h
> +++ b/xen/include/public/hvm/hvm_op.h
> @@ -197,6 +197,13 @@ struct xen_hvm_inject_trap {
> uint32_t insn_len;
> /* CR2 for page faults */
> uint64_aligned_t cr2;
> + /*
> + * Only used if vcpuid == ~0 (wildcard for any VCPU).
> + * In that case, injection data is set per-domain, and any VCPU
> + * running a process with matching CR3 in user mode will inject
> + * the trap.
> + */
> + uint64_aligned_t cr3;
The comment should say "Currently only used ...", and the code
should then check this (returning the usual -EOPNOTSUPP). Or
alternatively implement it right away (which may be the better
route taking into consideration the first of the comments above).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |