|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/2] xen/arm: support gzip compressed kernels
On Thu, 13 Aug 2015, Julien Grall wrote:
> Hi Stefano,
>
> On 13/08/15 12:21, Stefano Stabellini wrote:
> > +static int kernel_decompress(struct kernel_info *info,
> > + paddr_t *addr, paddr_t *size)
> > +{
> > + char *output, *input;
> > + char magic[2];
> > + int rc;
> > + unsigned kernel_order_in;
> > + unsigned kernel_order_out;
> > + paddr_t output_size;
> > +
>
> Please check that the binary is not too small before reading the magic.
>
> > + copy_from_paddr(magic, *addr, sizeof(magic));
> > +
> > + /* only gzip is supported */
> > + if (!gzip_check(magic, *size))
> > + return 0;
> > +
> > + kernel_order_in = get_order_from_bytes(*size);
> > + input = ioremap_cache(*addr, *size);
>
> The return of ioremap_cache should be check.
>
> > +
> > + output_size = output_length(input, *size);
> > + kernel_order_out = get_order_from_bytes(output_size);
> > + output = alloc_xenheap_pages(kernel_order_out, 0);
>
> Ditto.
I'll make these changes
> > +
> > + rc = perform_gunzip(output, input, *size);
> > + clean_dcache_va_range(output, output_size);
> > + iounmap(input);
> > +
> > + *addr = virt_to_maddr(output);
> > + *size = output_size;
> > + return 1;
> > +}
> > +
> > #ifdef CONFIG_ARM_64
> > /*
> > * Check if the image is a 64-bit Image.
> > @@ -463,6 +502,15 @@ int kernel_probe(struct kernel_info *info)
> > printk("Loading ramdisk from boot module @ %"PRIpaddr"\n",
> > info->initrd_bootmodule->start);
> >
> > + if (kernel_decompress(info, &start, &size) > 0)
> > + {
> > + /* Free the original kernel, update the pointers to the
> > + * decompressed kernel */
> > + dt_unreserved_regions(mod->start, mod->start + mod->size,
> > + init_domheap_pages, 0);
> > + mod->start = start;
> > + mod->size = size;
>
> I'm not sure to see how this would work. Any call to alloc_xenheap_pages
> should be follow by a called to free_xenheap_pages.
> But when freeing the modules, we are using init_heap_pages.
> I don't think they are similar.
Actually init_heap_pages is just a wrapper around free_heap_pages, like
free_xenheap_pages. I think it is safe to call init_heap_pages, on
memory allocated by alloc_xenheap_pages.
> Furthermore, you may allocate more memory than necessary because you are
> using an order but you never update the size. So we would have memory
> loose forever.
That is a good point. I am going to write a simple loop to free the
remaining pages.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |