[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN v2] Xen: Ensure "xenheap_bits - PAGE_SHIFT" can be used to shift "unsigned long"
On 02.12.2022 10:30, Ayan Kumar Halder wrote: > Hi Jan, > > On 02/12/2022 08:31, Jan Beulich wrote: >> On 01.12.2022 19:11, Ayan Kumar Halder wrote: >>> Machine frame number (mfn) is used to represent the hardware page address. >>> This is an unsigned long variable. We need to check if it can hold the >>> complete >>> range of hardware page addresses. To ensure this we check that the count of >>> bits >>> represented by 'unsigned long' added to the bit index of page size, should >>> be >>> less than the count of bits required to represent the maximum physical >>> address. >> I'm afraid I can't connect the description with ... >> >>> --- a/xen/common/page_alloc.c >>> +++ b/xen/common/page_alloc.c >>> @@ -2245,7 +2245,7 @@ void __init xenheap_max_mfn(unsigned long mfn) >>> { >>> ASSERT(!first_node_initialised); >>> ASSERT(!xenheap_bits); >>> - BUILD_BUG_ON(PADDR_BITS >= BITS_PER_LONG); >>> + BUILD_BUG_ON((PADDR_BITS - PAGE_SHIFT) >= BITS_PER_LONG); >> ... the actual change made. Julien, when replying to v1, already gave >> a clear hint what is relevant: The use of (xenheap_bits - PAGE_SHIFT) >> in right hand operands of shift operators. As relevant is of course >> the absence of uses directly as shift counts, which otherwise could >> still be UB (and which iirc is why the adjustment by PAGE_SHIFT was >> left out in the original check). > > I could see the following uses of xenheap_bits in page_alloc.c > > 1. init_node_heap() > > (!xenheap_bits || > !((mfn + nr - 1) >> (xenheap_bits - PAGE_SHIFT))) ) > > (!xenheap_bits || > !((mfn + needed - 1) >> (xenheap_bits - PAGE_SHIFT))) ) > > 2. In alloc_xenheap_pages() > > if ( xenheap_bits && (memflags >> _MEMF_bits) > xenheap_bits ) > memflags &= ~MEMF_bits(~0U); > if ( !(memflags >> _MEMF_bits) ) > memflags |= MEMF_bits(xenheap_bits); > > From what I see, whenever "xenheap_bits" is used as a right hand > operand of shift operator, it is always used as "(xenheap_bits - > PAGE_SHIFT)". > > So, is it correct to say this :- > > Ensure (xenheap_bits - PAGE_SHIFT) can be used as a rhs operand of a > shift operator > > We want to ensure that "xenheap_bits - PAGE_SHIFT" is strictly less than > the number of bits to represent unsigned long as it is used a rhs > operand to shift mfn. Yes. Plus, as said, it is also important to note that the value is never used to shift an address (rather than a frame number), and going forward then also shouldn't be (perhaps unless further precautions are taken). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |