Re: bisected boot regression post 2.6.25-rc3.. please revert

From: Jeremy Fitzhardinge
Date: Mon Mar 03 2008 - 18:01:31 EST


Segher Boessenkool wrote:
so (on 32-bit) ~_PAGE_PSE is ~0x80L is 0xffffff7f, which when cast to
64-bit is 0x00000000ffffff7f,

Actually, it is signed, so this isn't true. Comments about unsafeness
still apply.

It turns out that PAGE_SIZE is unsigned. So this gives us for

(~PAGE_MASK & ~_PAGE_USER & ~_PAGE_PSE & ~_PAGE_NX)

the types UL, L, L, ULL resp.

The associativity of & is left-to-right, so this in turn becomes

UL, L, ULL

UL, ULL

ULL

and that cast from UL to ULL doesn't sign-extend.

I went through and made a bunch of these flags signed so that they would sign-extend properly in 32 vs 64 bit. We could make them unconditionally 64-bit, but I'm worried that will have unforeseen consequences too.

In this case, PAGE_MASK should probably be signed too, so the sign extension happens properly.

Alternatively, they could be cast to pteval_t and/or phys_addr_t so that they will have an inherent size which matches the pagetable format (using _AT() rather than _AC()).

J
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/