Skip to content

Commit cb83cec

Browse files
ardbiesheuvelbp3tk0v
authored andcommitted
x86/decompressor: Pass pgtable address to trampoline directly
The only remaining use of the trampoline address by the trampoline itself is deriving the page table address from it, and this involves adding an offset of 0x0. So simplify this, and pass the new CR3 value directly. This makes the fact that the page table happens to be at the start of the trampoline allocation an implementation detail of the caller. 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-15-ardb@kernel.org
1 parent f97b67a commit cb83cec

File tree

3 files changed

+8
-11
lines changed

3 files changed

+8
-11
lines changed

arch/x86/boot/compressed/head_64.S

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,9 @@ SYM_FUNC_END(.Lrelocated)
521521
* running in 64-bit mode.
522522
*
523523
* Return address is at the top of the stack (might be above 4G).
524-
* The first argument (EDI) contains the 32-bit addressable base of the
525-
* trampoline memory.
524+
* The first argument (EDI) contains the address of the temporary PGD level
525+
* page table in 32-bit addressable memory which will be programmed into
526+
* register CR3.
526527
*/
527528
.section ".rodata", "a", @progbits
528529
SYM_CODE_START(trampoline_32bit_src)
@@ -575,8 +576,7 @@ SYM_CODE_START(trampoline_32bit_src)
575576
movl %eax, %cr0
576577

577578
/* Point CR3 to the trampoline's new top level page table */
578-
leal TRAMPOLINE_32BIT_PGTABLE_OFFSET(%edi), %eax
579-
movl %eax, %cr3
579+
movl %edi, %cr3
580580

581581
/* Set EFER.LME=1 as a precaution in case hypervsior pulls the rug */
582582
movl $MSR_EFER, %ecx

arch/x86/boot/compressed/pgtable.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
#define TRAMPOLINE_32BIT_SIZE (2 * PAGE_SIZE)
55

6-
#define TRAMPOLINE_32BIT_PGTABLE_OFFSET 0
7-
86
#define TRAMPOLINE_32BIT_CODE_OFFSET PAGE_SIZE
97
#define TRAMPOLINE_32BIT_CODE_SIZE 0xA0
108

arch/x86/boot/compressed/pgtable_64.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ static unsigned long find_trampoline_placement(void)
103103

104104
asmlinkage void configure_5level_paging(struct boot_params *bp)
105105
{
106-
void (*toggle_la57)(void *trampoline);
106+
void (*toggle_la57)(void *cr3);
107107
bool l5_required = false;
108108

109109
/* Initialize boot_params. Required for cmdline_find_option_bool(). */
@@ -174,7 +174,7 @@ asmlinkage void configure_5level_paging(struct boot_params *bp)
174174
* For 4- to 5-level paging transition, set up current CR3 as
175175
* the first and the only entry in a new top-level page table.
176176
*/
177-
trampoline_32bit[TRAMPOLINE_32BIT_PGTABLE_OFFSET] = __native_read_cr3() | _PAGE_TABLE_NOENC;
177+
*trampoline_32bit = __native_read_cr3() | _PAGE_TABLE_NOENC;
178178
} else {
179179
unsigned long src;
180180

@@ -187,8 +187,7 @@ asmlinkage void configure_5level_paging(struct boot_params *bp)
187187
* may be above 4G.
188188
*/
189189
src = *(unsigned long *)__native_read_cr3() & PAGE_MASK;
190-
memcpy(trampoline_32bit + TRAMPOLINE_32BIT_PGTABLE_OFFSET / sizeof(unsigned long),
191-
(void *)src, PAGE_SIZE);
190+
memcpy(trampoline_32bit, (void *)src, PAGE_SIZE);
192191
}
193192

194193
toggle_la57(trampoline_32bit);
@@ -198,7 +197,7 @@ void cleanup_trampoline(void *pgtable)
198197
{
199198
void *trampoline_pgtable;
200199

201-
trampoline_pgtable = trampoline_32bit + TRAMPOLINE_32BIT_PGTABLE_OFFSET / sizeof(unsigned long);
200+
trampoline_pgtable = trampoline_32bit;
202201

203202
/*
204203
* Move the top level page table out of trampoline memory,

0 commit comments

Comments
 (0)