Ard Biesheuvel 264b82fdb4 x86/decompressor: Don't rely on upper 32 bits of GPRs being preserved
The 4-to-5 level mode switch trampoline disables long mode and paging in
order to be able to flick the LA57 bit. According to section 3.4.1.1 of
the x86 architecture manual [0], 64-bit GPRs might not retain the upper
32 bits of their contents across such a mode switch.

Given that RBP, RBX and RSI are live at this point, preserve them on the
stack, along with the return address that might be above 4G as well.

[0] Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1: Basic Architecture

  "Because the upper 32 bits of 64-bit general-purpose registers are
   undefined in 32-bit modes, the upper 32 bits of any general-purpose
   register are not preserved when switching from 64-bit mode to a 32-bit
   mode (to protected mode or compatibility mode). Software must not
   depend on these bits to maintain a value after a 64-bit to 32-bit
   mode switch."

Fixes: 194a9749c73d650c ("x86/boot/compressed/64: Handle 5-level paging boot if kernel is above 4G")
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20230807162720.545787-2-ardb@kernel.org
2023-08-07 19:02:06 +02:00
..
2023-07-20 23:03:50 +02:00
2023-08-04 17:16:14 -07:00
2023-08-04 17:16:14 -07:00
2023-06-27 14:14:30 -07:00
2023-06-28 20:35:21 -07:00
2023-07-01 11:40:01 -07:00
2023-06-27 21:24:18 -07:00
2023-04-08 13:45:37 -07:00
2023-06-29 11:00:17 -07:00
2023-07-13 13:39:36 -07:00
2022-07-25 10:32:32 +02:00
2023-06-30 10:33:17 -07:00
2023-05-15 20:03:08 +02:00