mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: Jules Maselbas <jmaselbas@zdiv.net>, barebox@lists.infradead.org
Subject: Re: [PATCH 1/3] decompressors: Update xz to include ARM64 BCJ decoder
Date: Thu, 7 Sep 2023 11:00:05 +0200	[thread overview]
Message-ID: <393f8933-d264-e4a2-4497-39c8240796e7@pengutronix.de> (raw)
In-Reply-To: <20230906150857.32035-1-jmaselbas@zdiv.net>

On 06.09.23 17:08, Jules Maselbas wrote:
> Update lib/xz/xz_dec_bcj.c and lib/xz/xz_private.h files from xz-embedded [1],
> which include spelling fixes and the new ARM64 BCJ decoder which was recently
> introduced into .xz file format version 1.1.0 (2022-12-11) [2].
> 
> [1] https://git.tukaani.org/?p=xz-embedded.git
> [2] https://tukaani.org/xz/xz-file-format-1.1.0.txt
> 
> Signed-off-by: Jules Maselbas <jmaselbas@zdiv.net>
> ---
>  lib/Kconfig           |  4 ++++
>  lib/decompress_unxz.c |  3 +++
>  lib/xz/xz_dec_bcj.c   | 54 ++++++++++++++++++++++++++++++++++++++++---
>  lib/xz/xz_private.h   |  3 +++
>  4 files changed, 61 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/Kconfig b/lib/Kconfig
> index 758197b608..9291e5a8ff 100644
> --- a/lib/Kconfig
> +++ b/lib/Kconfig
> @@ -42,6 +42,7 @@ config XZ_DECOMPRESS
>  	select XZ_DEC_ARM
>  	select XZ_DEC_ARMTHUMB
>  	select XZ_DEC_SPARC
> +	select XZ_DEC_ARM64

Hmm, maybe for PBL, we should only support the XZ BCJ filter that is chosen
for barebox proper? If you are trying to get barebox binary size down,
maybe you are inclined to check? :-)

Thanks,
Ahmad 

>  
>  config XZ_DEC_X86
>          bool
> @@ -61,6 +62,9 @@ config XZ_DEC_ARMTHUMB
>  config XZ_DEC_SPARC
>          bool
>  
> +config XZ_DEC_ARM64
> +	bool "ARM64 BCJ filter decoder"
> +
>  config REED_SOLOMON
>  	bool
>  
> diff --git a/lib/decompress_unxz.c b/lib/decompress_unxz.c
> index a7e2d331ab..5c906932f8 100644
> --- a/lib/decompress_unxz.c
> +++ b/lib/decompress_unxz.c
> @@ -132,6 +132,9 @@
>  #endif
>  #ifdef CONFIG_ARM
>  #	define XZ_DEC_ARM
> +#	ifdef CONFIG_CPU_64
> +#		define XZ_DEC_ARM64
> +#	endif
>  #endif
>  #ifdef CONFIG_IA64
>  #	define XZ_DEC_IA64
> diff --git a/lib/xz/xz_dec_bcj.c b/lib/xz/xz_dec_bcj.c
> index d268adbc65..d40fae3416 100644
> --- a/lib/xz/xz_dec_bcj.c
> +++ b/lib/xz/xz_dec_bcj.c
> @@ -2,7 +2,7 @@
>   * Branch/Call/Jump (BCJ) filter decoders
>   *
>   * Authors: Lasse Collin <lasse.collin@tukaani.org>
> - *          Igor Pavlov <http://7-zip.org/>
> + *          Igor Pavlov <https://7-zip.org/>
>   *
>   * This file has been put into the public domain.
>   * You can do whatever you want with this file.
> @@ -24,7 +24,8 @@ struct xz_dec_bcj {
>  		BCJ_IA64 = 6,       /* Big or little endian */
>  		BCJ_ARM = 7,        /* Little endian only */
>  		BCJ_ARMTHUMB = 8,   /* Little endian only */
> -		BCJ_SPARC = 9       /* Big or little endian */
> +		BCJ_SPARC = 9,      /* Big or little endian */
> +		BCJ_ARM64 = 10      /* AArch64 */
>  	} type;
>  
>  	/*
> @@ -334,6 +335,45 @@ static size_t bcj_sparc(struct xz_dec_bcj *s, uint8_t *buf, size_t size)
>  }
>  #endif
>  
> +#ifdef XZ_DEC_ARM64
> +static size_t bcj_arm64(struct xz_dec_bcj *s, uint8_t *buf, size_t size)
> +{
> +	size_t i;
> +	uint32_t instr;
> +	uint32_t addr;
> +
> +	for (i = 0; i + 4 <= size; i += 4) {
> +		instr = get_unaligned_le32(buf + i);
> +
> +		if ((instr >> 26) == 0x25) {
> +			/* BL instruction */
> +			addr = instr - ((s->pos + (uint32_t)i) >> 2);
> +			instr = 0x94000000 | (addr & 0x03FFFFFF);
> +			put_unaligned_le32(instr, buf + i);
> +
> +		} else if ((instr & 0x9F000000) == 0x90000000) {
> +			/* ADRP instruction */
> +			addr = ((instr >> 29) & 3) | ((instr >> 3) & 0x1FFFFC);
> +
> +			/* Only convert values in the range +/-512 MiB. */
> +			if ((addr + 0x020000) & 0x1C0000)
> +				continue;
> +
> +			addr -= (s->pos + (uint32_t)i) >> 12;
> +
> +			instr &= 0x9000001F;
> +			instr |= (addr & 3) << 29;
> +			instr |= (addr & 0x03FFFC) << 3;
> +			instr |= (0U - (addr & 0x020000)) & 0xE00000;
> +
> +			put_unaligned_le32(instr, buf + i);
> +		}
> +	}
> +
> +	return i;
> +}
> +#endif
> +
>  /*
>   * Apply the selected BCJ filter. Update *pos and s->pos to match the amount
>   * of data that got filtered.
> @@ -380,6 +420,11 @@ static void bcj_apply(struct xz_dec_bcj *s,
>  	case BCJ_SPARC:
>  		filtered = bcj_sparc(s, buf, size);
>  		break;
> +#endif
> +#ifdef XZ_DEC_ARM64
> +	case BCJ_ARM64:
> +		filtered = bcj_arm64(s, buf, size);
> +		break;
>  #endif
>  	default:
>  		/* Never reached but silence compiler warnings. */
> @@ -422,7 +467,7 @@ XZ_EXTERN enum xz_ret xz_dec_bcj_run(struct xz_dec_bcj *s,
>  
>  	/*
>  	 * Flush pending already filtered data to the output buffer. Return
> -	 * immediatelly if we couldn't flush everything, or if the next
> +	 * immediately if we couldn't flush everything, or if the next
>  	 * filter in the chain had already returned XZ_STREAM_END.
>  	 */
>  	if (s->temp.filtered > 0) {
> @@ -553,6 +598,9 @@ XZ_EXTERN enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id)
>  #endif
>  #ifdef XZ_DEC_SPARC
>  	case BCJ_SPARC:
> +#endif
> +#ifdef XZ_DEC_ARM64
> +	case BCJ_ARM64:
>  #endif
>  		break;
>  
> diff --git a/lib/xz/xz_private.h b/lib/xz/xz_private.h
> index 85f79635f0..9d6bd7c905 100644
> --- a/lib/xz/xz_private.h
> +++ b/lib/xz/xz_private.h
> @@ -37,6 +37,9 @@
>  #		ifdef CONFIG_XZ_DEC_SPARC
>  #			define XZ_DEC_SPARC
>  #		endif
> +#		ifdef CONFIG_XZ_DEC_ARM64
> +#			define XZ_DEC_ARM64
> +#		endif
>  #		define memeq(a, b, size) (memcmp(a, b, size) == 0)
>  #		define memzero(buf, size) memset(buf, 0, size)
>  #		define FREE free

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |




  parent reply	other threads:[~2023-09-07  9:01 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-06 15:08 Jules Maselbas
2023-09-06 15:08 ` [PATCH 2/3] scripts: Select XZ --arm64 BCJ filter for 64-bit arm Jules Maselbas
2023-09-07  8:56   ` Ahmad Fatoum
2023-09-07  9:48     ` Jules Maselbas
2023-09-07  9:51       ` Ahmad Fatoum
2023-09-06 15:08 ` [PATCH 3/3] kbuild: remove duplicated xz compressions target Jules Maselbas
2023-09-07  8:53   ` Ahmad Fatoum
2023-09-07  9:00 ` Ahmad Fatoum [this message]
2023-09-07  9:57   ` [PATCH 1/3] decompressors: Update xz to include ARM64 BCJ decoder Jules Maselbas
2023-09-07 10:08     ` Ahmad Fatoum
2023-09-07 10:42       ` Jules Maselbas
2023-09-07 10:46         ` Ahmad Fatoum
2023-09-07 10:51 ` [PATCH] fixup! " Jules Maselbas
2023-09-07 13:37   ` Jules Maselbas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=393f8933-d264-e4a2-4497-39c8240796e7@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=jmaselbas@zdiv.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox