On 11/03/2024 11:29 am, Jan Beulich wrote:
> On 11.03.2024 11:54, Roger Pau Monne wrote:
>> The current logic to detect when to switch to the next L1 table is 
>> incorrectly
>> using l2_table_offset() in order to notice when the last entry on the current
>> L1 table has been reached.
>>
>> It should instead use l1_table_offset() to check whether the index has 
>> wrapped
>> to point to the first entry, and so the next L1 table should be used.
>>
>> Fixes: 8676092a0f16 ('x86/livepatch: Fix livepatch application when CET is 
>> active')
>> Signed-off-by: Roger Pau Monné <roger....@citrix.com>
>> ---
>> This fixes the osstest livepatch related crash, we have been lucky so far 
>> that
>> the .text section didn't seem to have hit this.
> About half a megabyte more to go until .text could run into such an issue,
> I guess, just considering the core Xen image. Patches are presumably not
> large enough to stand a sufficient risk of hitting the issue.
>
> I think there's another latent problem though, related to this part of the
> comment ahead of the function:
>
>  * It is the callers responsibility to not pass s or e in the middle of
>  * superpages if changing the permission on the whole superpage is going to be
>  * a problem.
>
> This only suggests that for a pointer into the middle of a superpage the
> effect may be wider than intended. But with s misaligned modulo 2Mb the
> superpage part of the loop would keep v misaligned, and if the 2nd 2Mb
> range wasn't a superpage, part of the range wouldn't be touched at all.
> Right now with .text always 2Mb-aligned (and with there not being a
> superpage mapping across _srodata) there's no issue as long as superpages
> aren't used in patch loading. Yet recall that .text used to be only 1Mb
> aligned in older Xen versions, and this fact isn't entirely set in stone
> when !XEN_ALIGN_2M.

That comment was added at your request.

The start address is always going to a linker symbol in the main image,
or something allocated with MAP_SMALL_PAGES.

Xen's .text strictly is 2M aligned.  The boot time pagetable handling
doesn't otherwise.

But either way.  The two options are to either ASSERT() that v is 2M
aligned when finding PSE, or to realign it on each iteration.  I'd
prefer to go with the assert on the basis that I don't expect this
property to be violated in practice.

I also note that forcing page alignment on e is useless.  All it does is
force the caller to do pointless work.

~Andrew

Reply via email to