From 029c7c4178d0122164770bf4a534aeb94d6c7698 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 22 May 2025 13:41:21 +0100 Subject: [PATCH] [initrd] Rename bzimage_align() to initrd_align() Alignment of initrd lengths is applicable to all Linux kernels, not just those in the x86 bzImage format. Signed-off-by: Michael Brown --- src/arch/x86/image/bzimage.c | 17 +++-------------- src/image/initrd.c | 18 +++++------------- src/include/ipxe/cpio.h | 3 --- src/include/ipxe/initrd.h | 15 +++++++++++++++ src/interface/efi/efi_file.c | 1 + 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/arch/x86/image/bzimage.c b/src/arch/x86/image/bzimage.c index 63de82c63..08e0d0873 100644 --- a/src/arch/x86/image/bzimage.c +++ b/src/arch/x86/image/bzimage.c @@ -316,17 +316,6 @@ static void bzimage_set_cmdline ( struct image *image, image->name, rm_cmdline ); } -/** - * Align initrd length - * - * @v len Length - * @ret len Length rounded up to INITRD_ALIGN - */ -static inline size_t bzimage_align ( size_t len ) { - - return ( ( len + INITRD_ALIGN - 1 ) & ~( INITRD_ALIGN - 1 ) ); -} - /** * Load initrd * @@ -407,7 +396,7 @@ static int bzimage_check_initrds ( struct image *image, /* Calculate length */ len += bzimage_load_initrd ( image, initrd, NULL ); - len = bzimage_align ( len ); + len = initrd_align ( len ); DBGC ( image, "bzImage %s initrd %s from [%#08lx,%#08lx)%s%s\n", image->name, initrd->name, virt_to_phys ( initrd->data ), @@ -467,7 +456,7 @@ static void bzimage_load_initrds ( struct image *image, for_each_image ( initrd ) { if ( virt_to_phys ( initrd->data ) >= top ) { top = ( virt_to_phys ( initrd->data ) + - bzimage_align ( initrd->len ) ); + initrd_align ( initrd->len ) ); } } @@ -491,7 +480,7 @@ static void bzimage_load_initrds ( struct image *image, if ( other == initrd ) offset = 0; offset += bzimage_load_initrd ( image, other, NULL ); - offset = bzimage_align ( offset ); + offset = initrd_align ( offset ); } /* Load initrd at this address */ diff --git a/src/image/initrd.c b/src/image/initrd.c index 386414795..5e8735518 100644 --- a/src/image/initrd.c +++ b/src/image/initrd.c @@ -51,7 +51,6 @@ static void initrd_squash_high ( physaddr_t top ) { struct image *initrd; struct image *highest; void *data; - size_t len; /* Squash up any initrds already within or below the region */ while ( 1 ) { @@ -70,9 +69,7 @@ static void initrd_squash_high ( physaddr_t top ) { break; /* Move this image to its final position */ - len = ( ( highest->len + INITRD_ALIGN - 1 ) & - ~( INITRD_ALIGN - 1 ) ); - current -= len; + current -= initrd_align ( highest->len ); DBGC ( &images, "INITRD squashing %s [%#08lx,%#08lx)->" "[%#08lx,%#08lx)\n", highest->name, virt_to_phys ( highest->data ), @@ -86,9 +83,7 @@ static void initrd_squash_high ( physaddr_t top ) { /* Copy any remaining initrds (e.g. embedded images) to the region */ for_each_image ( initrd ) { if ( virt_to_phys ( initrd->data ) >= top ) { - len = ( ( initrd->len + INITRD_ALIGN - 1 ) & - ~( INITRD_ALIGN - 1 ) ); - current -= len; + current -= initrd_align ( initrd->len ); DBGC ( &images, "INITRD copying %s [%#08lx,%#08lx)->" "[%#08lx,%#08lx)\n", initrd->name, virt_to_phys ( initrd->data ), @@ -139,8 +134,8 @@ static void initrd_swap ( struct image *low, struct image *high ) { ( virt_to_phys ( high->data ) + high->len ), high->name ); /* Calculate padded lengths */ - low_len = ( ( low->len + INITRD_ALIGN - 1 ) & ~( INITRD_ALIGN - 1 ) ); - high_len = ( ( high->len + INITRD_ALIGN - 1 ) & ~( INITRD_ALIGN - 1 )); + low_len = initrd_align ( low->len ); + high_len = initrd_align ( high->len ); len = ( low_len + high_len ); data = low->rwdata; assert ( high->data == ( data + low_len ) ); @@ -165,15 +160,12 @@ static int initrd_swap_any ( void ) { struct image *low; struct image *high; const void *adjacent; - size_t padded_len; /* Find any pair of initrds that can be swapped */ for_each_image ( low ) { /* Calculate location of adjacent image (if any) */ - padded_len = ( ( low->len + INITRD_ALIGN - 1 ) & - ~( INITRD_ALIGN - 1 ) ); - adjacent = ( low->data + padded_len ); + adjacent = ( low->data + initrd_align ( low->len ) ); /* Search for adjacent image */ for_each_image ( high ) { diff --git a/src/include/ipxe/cpio.h b/src/include/ipxe/cpio.h index c45c12b11..744dbd269 100644 --- a/src/include/ipxe/cpio.h +++ b/src/include/ipxe/cpio.h @@ -60,9 +60,6 @@ struct cpio_header { /** CPIO header length alignment */ #define CPIO_ALIGN 4 -/** Alignment for CPIO archives within an initrd */ -#define INITRD_ALIGN 4096 - /** * Get CPIO image name * diff --git a/src/include/ipxe/initrd.h b/src/include/ipxe/initrd.h index 0b0ba0967..10533b53b 100644 --- a/src/include/ipxe/initrd.h +++ b/src/include/ipxe/initrd.h @@ -14,4 +14,19 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); extern void initrd_reshuffle ( physaddr_t bottom ); extern int initrd_reshuffle_check ( size_t len, physaddr_t bottom ); +/** Initial ramdisk chunk alignment */ +#define INITRD_ALIGN 4096 + +/** + * Align initrd length + * + * @v len Length + * @ret len Aligned length + */ +static inline __attribute__ (( always_inline )) size_t +initrd_align ( size_t len ) { + + return ( ( len + INITRD_ALIGN - 1 ) & ~( INITRD_ALIGN - 1 ) ); +} + #endif /* _IPXE_INITRD_H */ diff --git a/src/interface/efi/efi_file.c b/src/interface/efi/efi_file.c index 79330641d..1909dea10 100644 --- a/src/interface/efi/efi_file.c +++ b/src/interface/efi/efi_file.c @@ -39,6 +39,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include +#include #include #include #include