|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 1/2] xen: Switch parameter in get_page_from_gfn to use typesafe gfn
Hi,
On 29/08/2019 17:41, Jan Beulich wrote:
> On 19.08.2019 16:26, Julien Grall wrote:
>> No functional change intended.
>>
>> Only reasonable clean-ups are done in this patch. The rest will use _gfn
>> for the time being.
>>
>> The code in get_page_from_gfn is slightly reworked to also handle a bad
>> behavior because it is not safe to use mfn_to_page(...) because
>> mfn_valid(...) succeeds.
>
> I guess the 2nd "because" is meant to be "before", but even then I
> don't think I can easily agree: mfn_to_page() is just calculations,
> no dereference.
Regardless the s/because/before/. Do you disagree on the wording or the
change? If the former, I just paraphrased what Andrew wrote in the
previous version:
"This unfortunately propagates some bad behaviour, because it is not
safe to use mfn_to_page(mfn); before mfn_valid(mfn) succeeds. (In
practice it works because mfn_to_page() is just pointer arithmetic.)"
This is x86 code, so please agree with Andrew on the approach/wording.
>
>> --- a/xen/arch/x86/hvm/domain.c
>> +++ b/xen/arch/x86/hvm/domain.c
>> @@ -296,8 +296,10 @@ int arch_set_info_hvm_guest(struct vcpu *v, const
>> vcpu_hvm_context_t *ctx)
>> if ( hvm_paging_enabled(v) && !paging_mode_hap(v->domain) )
>> {
>> /* Shadow-mode CR3 change. Check PDBR and update refcounts. */
>> - struct page_info *page = get_page_from_gfn(v->domain,
>> - v->arch.hvm.guest_cr[3] >> PAGE_SHIFT,
>> + struct page_info *page;
>> +
>> + page = get_page_from_gfn(v->domain,
>> + gaddr_to_gfn(v->arch.hvm.guest_cr[3]),
>> NULL, P2M_ALLOC);
>
> Iirc I've said so before: I consider use of gaddr_to_gfn() here more
> misleading than a plain shift by PAGE_SHIFT. Neither is really correct,
> but in no event does CR3 as a whole hold an address. (Same elsewhere
> then, and sadly in quite a few places.)
Well, this code has not changed since v3 and you acked it... I only
dropped the ack here because the previous version was sent 9 months ago.
I also can't see such comment made on any version of this series.
Anyway, I am more than happy to switch to _gfn((v->arch.hvm.guest_cr[3]
>> PAGE_SHIFT)) if you prefer it.
>
>> --- a/xen/common/event_fifo.c
>> +++ b/xen/common/event_fifo.c
>> @@ -361,7 +361,7 @@ static const struct evtchn_port_ops evtchn_port_ops_fifo
>> =
>> .print_state = evtchn_fifo_print_state,
>> };
>>
>> -static int map_guest_page(struct domain *d, uint64_t gfn, void **virt)
>> +static int map_guest_page(struct domain *d, gfn_t gfn, void **virt)
>> {
>> struct page_info *p;
>>
>> @@ -422,7 +422,7 @@ static int setup_control_block(struct vcpu *v)
>> return 0;
>> }
>>
>> -static int map_control_block(struct vcpu *v, uint64_t gfn, uint32_t offset)
>> +static int map_control_block(struct vcpu *v, gfn_t gfn, uint32_t offset)
>> {
>> void *virt;
>> unsigned int i;
>
> Just as a remark (no action expected) - this makes a truncation issue
> pretty apparent: On 32-bit platforms the upper 32 bits of a passed in
> GFN get ignored. Correct (imo) behavior would be to reject the upper
> bits being non-zero.
This is not only here but on pretty much all the hypercalls taking a gfn
(on Arm it is 64-bit regardless the bitness).
I agree this is not nice, but I am afraid this is likely another can of
worm that I am not to open it yet.
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |