[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] xen/arm: Add support for booting gzip compressed uImages
Hi Julien, On 01/02/2023 19:54, Julien Grall wrote: > > > On 01/02/2023 12:56, Michal Orzel wrote: >> Hi Julien, > > Hi Michal, > >> On 01/02/2023 12:20, Julien Grall wrote: >>> >>> >>> On 01/02/2023 11:01, Michal Orzel wrote: >>>> I would prefer not to do this in this series as the goals are different. >>>> This series is to remove >>>> the known Xen limitation. >>> >>> The reason I am asking is it effectively change the way you would >>> implement. If we were going to support zImage/Image within uImage, then >>> we would need to fallthrough rather than calling kernel_decompress(). >>> >>> I am not aware of any at the moment. Better asking now than realizing >>> after the fact that there is a need... >> We need uImage support as there is more and more need to support booting >> raw images of some RTOSes (there is always additional concern \wrt booting >> requirements >> but at least the header allows to try to boot them). We are not aware of any >> need >> to do some special handling to parse more than one header + from what I said >> earlier, >> this is an unusual approach not seen to be handled by anyone. >> >>> >>>>>> This could be solved by doing (not harmful in my opinion for common case) >>>>>> addr &= PAGE_MASK. >>>>> I don't quite understand your argument here. We need a check that work >>>>> for everyone (not only in the common case). >>>> As we assume the kernel module is at page aligned address (otherwise the >>>> issue you observed >>>> can happen not only in uImage compressed case) >>> >>> I am not aware of such assumption. It is allowed to use non page-aligned >>> address and it is correct for Xen to not free the first part if it is >>> not page aligned because the first part may contain data from another >>> module (or else). >>> >>>> , having a check like >>>> this is generic. I.e. for normal usecase (no uImage compressed), addr &= >>>> PAGE_MASK >>>> does not modify the address. For uImage compressed usecase it causes the >>>> addr to get >>>> back to the previous value (before we added header size to it). >>>> >>>> Apart from the addr, we need to pass the correct size (as we extracted >>>> header size from it). >>>> We could have the following (with appropriate comment): >>>> size += addr - (addr & PAGE_MASK); >>>> addr &= PAGE_MASK; >>>> fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0); >>>> >>>> It does not look great but solves the uImage issue and does not modify >>>> the previous behavior. Anyway, I'm open for suggestions. >>> >>> Two options: >>> 1) Move the call to fw_unreserved_regions() outside of >>> kernel_decompress(). >>> 2) Pass the offset of the gzip header to kernel_decompress(). >>> Something like where it would be sizeof(uimage) in the uImage case or 0 >>> otherwise. >>> >>> I have a slight preference for the latter. >> That is cool. >> I'm in favor of this as well because it would allow not to set >> mod->start,size >> from kernel_uimage_probe. Everything can be done in kernel_decompress: >> >> Diff: > > A few comments because you resend the patch with it included. > >> >> -static __init int kernel_decompress(struct bootmodule *mod) >> +static __init int kernel_decompress(struct bootmodule *mod, uint32_t offset) >> { >> char *output, *input; >> char magic[2]; >> @@ -201,8 +201,14 @@ static __init int kernel_decompress(struct bootmodule >> *mod) >> struct page_info *pages; >> mfn_t mfn; >> int i; >> - paddr_t addr = mod->start; >> - paddr_t size = mod->size; >> + >> + /* >> + * It might be that gzip header does not appear at the start address >> + * (i.e. in case of compressed uImage) so take into account offset to > > NIT: I would use 'e.g.' because in the future we may have multiple > reason where the offset is not zero. > >> + * gzip header. >> + */ > + paddr_t addr = mod->start + offset; >> + paddr_t size = mod->size - offset; > > You want to check that mod->size is at least equal to offset. Sounds reasonable. Thanks. ~Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |