Message ID | 20230131151354.25943-2-michal.orzel@amd.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xen/arm: Support compressed uImages | expand |
On 31/01/2023 15:13, Michal Orzel wrote: > In a follow-up patch, we will be calling kernel_decompress function from > within kernel_uimage_probe to support booting compressed images with > u-boot header. Therefore, move the kernel_uimage_probe definition after > kernel_decompress so that the latter is visible to the former. > > No functional change intended. > > Signed-off-by: Michal Orzel <michal.orzel@amd.com> Reviewed-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com> > --- > xen/arch/arm/kernel.c | 146 +++++++++++++++++++++--------------------- > 1 file changed, 73 insertions(+), 73 deletions(-) > > diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c > index 36081e73f140..068fbf88e492 100644 > --- a/xen/arch/arm/kernel.c > +++ b/xen/arch/arm/kernel.c > @@ -186,6 +186,79 @@ static void __init kernel_zimage_load(struct kernel_info *info) > iounmap(kernel); > } > > +static __init uint32_t output_length(char *image, unsigned long image_len) > +{ > + return *(uint32_t *)&image[image_len - 4]; > +} > + > +static __init int kernel_decompress(struct bootmodule *mod) > +{ > + char *output, *input; > + char magic[2]; > + int rc; > + unsigned int kernel_order_out; > + paddr_t output_size; > + struct page_info *pages; > + mfn_t mfn; > + int i; > + paddr_t addr = mod->start; > + paddr_t size = mod->size; > + > + if ( size < 2 ) > + return -EINVAL; > + > + copy_from_paddr(magic, addr, sizeof(magic)); > + > + /* only gzip is supported */ > + if ( !gzip_check(magic, size) ) > + return -EINVAL; > + > + input = ioremap_cache(addr, size); > + if ( input == NULL ) > + return -EFAULT; > + > + output_size = output_length(input, size); > + kernel_order_out = get_order_from_bytes(output_size); > + pages = alloc_domheap_pages(NULL, kernel_order_out, 0); > + if ( pages == NULL ) > + { > + iounmap(input); > + return -ENOMEM; > + } > + mfn = page_to_mfn(pages); > + output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR, VMAP_DEFAULT); > + > + rc = perform_gunzip(output, input, size); > + clean_dcache_va_range(output, output_size); > + iounmap(input); > + vunmap(output); > + > + if ( rc ) > + { > + free_domheap_pages(pages, kernel_order_out); > + return rc; > + } > + > + mod->start = page_to_maddr(pages); > + mod->size = output_size; > + > + /* > + * Need to free pages after output_size here because they won't be > + * freed by discard_initial_modules > + */ > + i = PFN_UP(output_size); > + for ( ; i < (1 << kernel_order_out); i++ ) > + free_domheap_page(pages + i); > + > + /* > + * Free the original kernel, update the pointers to the > + * decompressed kernel > + */ > + fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0); > + > + return 0; > +} > + > /* > * Uimage CPU Architecture Codes > */ > @@ -289,79 +362,6 @@ static int __init kernel_uimage_probe(struct kernel_info *info, > return 0; > } > > -static __init uint32_t output_length(char *image, unsigned long image_len) > -{ > - return *(uint32_t *)&image[image_len - 4]; > -} > - > -static __init int kernel_decompress(struct bootmodule *mod) > -{ > - char *output, *input; > - char magic[2]; > - int rc; > - unsigned int kernel_order_out; > - paddr_t output_size; > - struct page_info *pages; > - mfn_t mfn; > - int i; > - paddr_t addr = mod->start; > - paddr_t size = mod->size; > - > - if ( size < 2 ) > - return -EINVAL; > - > - copy_from_paddr(magic, addr, sizeof(magic)); > - > - /* only gzip is supported */ > - if ( !gzip_check(magic, size) ) > - return -EINVAL; > - > - input = ioremap_cache(addr, size); > - if ( input == NULL ) > - return -EFAULT; > - > - output_size = output_length(input, size); > - kernel_order_out = get_order_from_bytes(output_size); > - pages = alloc_domheap_pages(NULL, kernel_order_out, 0); > - if ( pages == NULL ) > - { > - iounmap(input); > - return -ENOMEM; > - } > - mfn = page_to_mfn(pages); > - output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR, VMAP_DEFAULT); > - > - rc = perform_gunzip(output, input, size); > - clean_dcache_va_range(output, output_size); > - iounmap(input); > - vunmap(output); > - > - if ( rc ) > - { > - free_domheap_pages(pages, kernel_order_out); > - return rc; > - } > - > - mod->start = page_to_maddr(pages); > - mod->size = output_size; > - > - /* > - * Need to free pages after output_size here because they won't be > - * freed by discard_initial_modules > - */ > - i = PFN_UP(output_size); > - for ( ; i < (1 << kernel_order_out); i++ ) > - free_domheap_page(pages + i); > - > - /* > - * Free the original kernel, update the pointers to the > - * decompressed kernel > - */ > - fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0); > - > - return 0; > -} > - > #ifdef CONFIG_ARM_64 > /* > * Check if the image is a 64-bit Image.
Hi Michal, On 31/01/2023 15:13, Michal Orzel wrote: > In a follow-up patch, we will be calling kernel_decompress function from > within kernel_uimage_probe to support booting compressed images with > u-boot header. Therefore, move the kernel_uimage_probe definition after > kernel_decompress so that the latter is visible to the former. > > No functional change intended. > > Signed-off-by: Michal Orzel <michal.orzel@amd.com> Acked-by: Julien Grall <jgrall@amazon.com> Cheers,
diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c index 36081e73f140..068fbf88e492 100644 --- a/xen/arch/arm/kernel.c +++ b/xen/arch/arm/kernel.c @@ -186,6 +186,79 @@ static void __init kernel_zimage_load(struct kernel_info *info) iounmap(kernel); } +static __init uint32_t output_length(char *image, unsigned long image_len) +{ + return *(uint32_t *)&image[image_len - 4]; +} + +static __init int kernel_decompress(struct bootmodule *mod) +{ + char *output, *input; + char magic[2]; + int rc; + unsigned int kernel_order_out; + paddr_t output_size; + struct page_info *pages; + mfn_t mfn; + int i; + paddr_t addr = mod->start; + paddr_t size = mod->size; + + if ( size < 2 ) + return -EINVAL; + + copy_from_paddr(magic, addr, sizeof(magic)); + + /* only gzip is supported */ + if ( !gzip_check(magic, size) ) + return -EINVAL; + + input = ioremap_cache(addr, size); + if ( input == NULL ) + return -EFAULT; + + output_size = output_length(input, size); + kernel_order_out = get_order_from_bytes(output_size); + pages = alloc_domheap_pages(NULL, kernel_order_out, 0); + if ( pages == NULL ) + { + iounmap(input); + return -ENOMEM; + } + mfn = page_to_mfn(pages); + output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR, VMAP_DEFAULT); + + rc = perform_gunzip(output, input, size); + clean_dcache_va_range(output, output_size); + iounmap(input); + vunmap(output); + + if ( rc ) + { + free_domheap_pages(pages, kernel_order_out); + return rc; + } + + mod->start = page_to_maddr(pages); + mod->size = output_size; + + /* + * Need to free pages after output_size here because they won't be + * freed by discard_initial_modules + */ + i = PFN_UP(output_size); + for ( ; i < (1 << kernel_order_out); i++ ) + free_domheap_page(pages + i); + + /* + * Free the original kernel, update the pointers to the + * decompressed kernel + */ + fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0); + + return 0; +} + /* * Uimage CPU Architecture Codes */ @@ -289,79 +362,6 @@ static int __init kernel_uimage_probe(struct kernel_info *info, return 0; } -static __init uint32_t output_length(char *image, unsigned long image_len) -{ - return *(uint32_t *)&image[image_len - 4]; -} - -static __init int kernel_decompress(struct bootmodule *mod) -{ - char *output, *input; - char magic[2]; - int rc; - unsigned int kernel_order_out; - paddr_t output_size; - struct page_info *pages; - mfn_t mfn; - int i; - paddr_t addr = mod->start; - paddr_t size = mod->size; - - if ( size < 2 ) - return -EINVAL; - - copy_from_paddr(magic, addr, sizeof(magic)); - - /* only gzip is supported */ - if ( !gzip_check(magic, size) ) - return -EINVAL; - - input = ioremap_cache(addr, size); - if ( input == NULL ) - return -EFAULT; - - output_size = output_length(input, size); - kernel_order_out = get_order_from_bytes(output_size); - pages = alloc_domheap_pages(NULL, kernel_order_out, 0); - if ( pages == NULL ) - { - iounmap(input); - return -ENOMEM; - } - mfn = page_to_mfn(pages); - output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR, VMAP_DEFAULT); - - rc = perform_gunzip(output, input, size); - clean_dcache_va_range(output, output_size); - iounmap(input); - vunmap(output); - - if ( rc ) - { - free_domheap_pages(pages, kernel_order_out); - return rc; - } - - mod->start = page_to_maddr(pages); - mod->size = output_size; - - /* - * Need to free pages after output_size here because they won't be - * freed by discard_initial_modules - */ - i = PFN_UP(output_size); - for ( ; i < (1 << kernel_order_out); i++ ) - free_domheap_page(pages + i); - - /* - * Free the original kernel, update the pointers to the - * decompressed kernel - */ - fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0); - - return 0; -} - #ifdef CONFIG_ARM_64 /* * Check if the image is a 64-bit Image.
In a follow-up patch, we will be calling kernel_decompress function from within kernel_uimage_probe to support booting compressed images with u-boot header. Therefore, move the kernel_uimage_probe definition after kernel_decompress so that the latter is visible to the former. No functional change intended. Signed-off-by: Michal Orzel <michal.orzel@amd.com> --- xen/arch/arm/kernel.c | 146 +++++++++++++++++++++--------------------- 1 file changed, 73 insertions(+), 73 deletions(-)