diff mbox series

arm: Add support for ZSTD compressed kernel

Message ID CAMdYzYoqKcG+LtFZy+TeYWB=GJo8Ya60r3Los4T5j7j3Okdbtw@mail.gmail.com
State Deferred
Headers show
Series arm: Add support for ZSTD compressed kernel | expand

Commit Message

Peter Geis Aug. 6, 2020, 9:46 p.m. UTC
Good Evening,

I had attempted to get this working as well, but have run into
difficulties with both my implementation and yours as well.
My implementation was almost the same as yours, with the exception of
also changing:
@@ -303,7 +305,7 @@ restart: adr r0, LC1

 #ifndef CONFIG_ZBOOT_ROM
  /* malloc space is above the relocated stack (64k max) */
- add r10, sp, #0x10000
+ add r10, sp, #0x30000
 #else
  /*
  * With ZBOOT_ROM the bss/stack is non relocatable,

On QEMU this implementation works fine.
However on bare metal tegra30, I get the following error:

Jumping to kernel at:4861 ms

C:0x80A000C0-0x8112BA40->0x8152C700-0x81C58080
Uncompressing Linux...

ZSTD-compressed dstSize is too small

 -- System halted

The only difference between the bare metal test and the qemu test is
the zImage with appended dtb is packaged in the android boot format
for the bare metal test.
Otherwise it's exactly the same file.

I had to modify the original zstd error message because it grouped
several errors together.
Here is my patch for that:

  break;

Very Respectfully,
Peter Geis

Comments

Russell King (Oracle) Aug. 6, 2020, 10:22 p.m. UTC | #1
On Thu, Aug 06, 2020 at 05:46:50PM -0400, Peter Geis wrote:
> Good Evening,
> 
> I had attempted to get this working as well, but have run into
> difficulties with both my implementation and yours as well.
> My implementation was almost the same as yours, with the exception of
> also changing:
> @@ -303,7 +305,7 @@ restart: adr r0, LC1
> 
>  #ifndef CONFIG_ZBOOT_ROM
>   /* malloc space is above the relocated stack (64k max) */
> - add r10, sp, #0x10000
> + add r10, sp, #0x30000
>  #else
>   /*
>   * With ZBOOT_ROM the bss/stack is non relocatable,
> 
> On QEMU this implementation works fine.
> However on bare metal tegra30, I get the following error:
> 
> Jumping to kernel at:4861 ms
> 
> C:0x80A000C0-0x8112BA40->0x8152C700-0x81C58080
> Uncompressing Linux...
> 
> ZSTD-compressed dstSize is too small
> 
>  -- System halted
> 
> The only difference between the bare metal test and the qemu test is
> the zImage with appended dtb is packaged in the android boot format
> for the bare metal test.
> Otherwise it's exactly the same file.

So it's relocating the compressed kernel and decompressor from
0x80A000C0-0x8112BA40 to 0x8152C700-0x81C58080 and then failing.
Does the QEMU version also do similar?

On the off-hand, I'm not sure why it should fail.  I assume that
you've tried the other decompressors and they work fine on the
same setups?
Peter Geis Aug. 6, 2020, 10:58 p.m. UTC | #2
On Thu, Aug 6, 2020 at 6:22 PM Russell King - ARM Linux admin
<linux@armlinux.org.uk> wrote:
>
> On Thu, Aug 06, 2020 at 05:46:50PM -0400, Peter Geis wrote:
> > Good Evening,
> >
> > I had attempted to get this working as well, but have run into
> > difficulties with both my implementation and yours as well.
> > My implementation was almost the same as yours, with the exception of
> > also changing:
> > @@ -303,7 +305,7 @@ restart: adr r0, LC1
> >
> >  #ifndef CONFIG_ZBOOT_ROM
> >   /* malloc space is above the relocated stack (64k max) */
> > - add r10, sp, #0x10000
> > + add r10, sp, #0x30000
> >  #else
> >   /*
> >   * With ZBOOT_ROM the bss/stack is non relocatable,
> >
> > On QEMU this implementation works fine.
> > However on bare metal tegra30, I get the following error:
> >
> > Jumping to kernel at:4861 ms
> >
> > C:0x80A000C0-0x8112BA40->0x8152C700-0x81C58080
> > Uncompressing Linux...
> >
> > ZSTD-compressed dstSize is too small
> >
> >  -- System halted
> >
> > The only difference between the bare metal test and the qemu test is
> > the zImage with appended dtb is packaged in the android boot format
> > for the bare metal test.
> > Otherwise it's exactly the same file.
>
> So it's relocating the compressed kernel and decompressor from
> 0x80A000C0-0x8112BA40 to 0x8152C700-0x81C58080 and then failing.
> Does the QEMU version also do similar?

Here is the output from QEMU, note boot doesn't work because this
image isn't for QEMU:

C:0x400100C0-0x4073B1E0->0x4152C600-0x41C57720
Uncompressing Linux... done, booting the kernel.

>
> On the off-hand, I'm not sure why it should fail.  I assume that
> you've tried the other decompressors and they work fine on the
> same setups?

Correct, all other compressors work.
ZSTD is handy for arm because size and speed are both important.

>
> --
> RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
> FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!
diff mbox series

Patch

diff --git a/lib/decompress_unzstd.c b/lib/decompress_unzstd.c
index 062617bb0afe..89ac73e900ce 100644
--- a/lib/decompress_unzstd.c
+++ b/lib/decompress_unzstd.c
@@ -103,10 +103,14 @@  static int INIT handle_zstd_error(size_t ret,
void (*error)(char *x))
  error("Input is not in the ZSTD format (wrong magic bytes)");
  break;
  case ZSTD_error_dstSize_tooSmall:
+ error("ZSTD-compressed dstSize is too small");
+ break;
  case ZSTD_error_corruption_detected:
- case ZSTD_error_checksum_wrong:
  error("ZSTD-compressed data is corrupt");
  break;
+ case ZSTD_error_checksum_wrong:
+ error("ZSTD-compressed data checksum is wrong");
+ break;
  default:
  error("ZSTD-compressed data is probably corrupt");