x86/decompressor: Factor out kernel decompression and relocation
From: Ard Biesheuvel <ardb@kernel.org> [ Commit 83381519352d6b5b3e429bf72aaab907480cb6b6 upstream ] Factor out the decompressor sequence that invokes the decompressor, parses the ELF and applies the relocations so that it can be called directly from the EFI stub. 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-21-ardb@kernel.org Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
350265a753
commit
5a664585a7
@ -330,11 +330,33 @@ static size_t parse_elf(void *output)
|
||||
return ehdr.e_entry - LOAD_PHYSICAL_ADDR;
|
||||
}
|
||||
|
||||
const unsigned long kernel_total_size = VO__end - VO__text;
|
||||
|
||||
static u8 boot_heap[BOOT_HEAP_SIZE] __aligned(4);
|
||||
|
||||
extern unsigned char input_data[];
|
||||
extern unsigned int input_len, output_len;
|
||||
|
||||
unsigned long decompress_kernel(unsigned char *outbuf, unsigned long virt_addr,
|
||||
void (*error)(char *x))
|
||||
{
|
||||
unsigned long entry;
|
||||
|
||||
if (!free_mem_ptr) {
|
||||
free_mem_ptr = (unsigned long)boot_heap;
|
||||
free_mem_end_ptr = (unsigned long)boot_heap + sizeof(boot_heap);
|
||||
}
|
||||
|
||||
if (__decompress(input_data, input_len, NULL, NULL, outbuf, output_len,
|
||||
NULL, error) < 0)
|
||||
return ULONG_MAX;
|
||||
|
||||
entry = parse_elf(outbuf);
|
||||
handle_relocations(outbuf, output_len, virt_addr);
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
/*
|
||||
* The compressed kernel image (ZO), has been moved so that its position
|
||||
* is against the end of the buffer used to hold the uncompressed kernel
|
||||
@ -354,7 +376,6 @@ extern unsigned int input_len, output_len;
|
||||
*/
|
||||
asmlinkage __visible void *extract_kernel(void *rmode, unsigned char *output)
|
||||
{
|
||||
const unsigned long kernel_total_size = VO__end - VO__text;
|
||||
unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
|
||||
memptr heap = (memptr)boot_heap;
|
||||
unsigned long needed_size;
|
||||
@ -457,10 +478,8 @@ asmlinkage __visible void *extract_kernel(void *rmode, unsigned char *output)
|
||||
#endif
|
||||
|
||||
debug_putstr("\nDecompressing Linux... ");
|
||||
__decompress(input_data, input_len, NULL, NULL, output, output_len,
|
||||
NULL, error);
|
||||
entry_offset = parse_elf(output);
|
||||
handle_relocations(output, output_len, virt_addr);
|
||||
|
||||
entry_offset = decompress_kernel(output, virt_addr, error);
|
||||
|
||||
debug_putstr("done.\nBooting the kernel (entry_offset: 0x");
|
||||
debug_puthex(entry_offset);
|
||||
|
@ -79,4 +79,12 @@
|
||||
# define BOOT_STACK_SIZE 0x1000
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned int output_len;
|
||||
extern const unsigned long kernel_total_size;
|
||||
|
||||
unsigned long decompress_kernel(unsigned char *outbuf, unsigned long virt_addr,
|
||||
void (*error)(char *x));
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_BOOT_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user