|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/gunzip: Move crc state into gunzip_state
commit 1c6112b8f5c5d6f2c5ff1c84887cd9241c891732
Author: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
AuthorDate: Wed Apr 24 12:34:22 2024 -0400
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Thu May 9 18:19:49 2024 +0100
xen/gunzip: Move crc state into gunzip_state
Move the crc and its state into struct gunzip_state. In the process, expand
the only use of CRC_VALUE as it is hides what is being compared.
Furthermore, all variables here should be uint32_t rather than unsigned
long,
which halves the storage space required. Filter the typechanges through the
logic.
Adjust the logic to hold crc in a positive form, and negate it for update in
flush_window(). This is the more normal way to write CRC algorithms, and
avoids weird-to-follow logic in gunzip().
Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/common/gzip/gunzip.c | 11 +++++++----
xen/common/gzip/inflate.c | 16 ++++++----------
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/xen/common/gzip/gunzip.c b/xen/common/gzip/gunzip.c
index 134144a184..89f45d4050 100644
--- a/xen/common/gzip/gunzip.c
+++ b/xen/common/gzip/gunzip.c
@@ -21,6 +21,9 @@ struct gunzip_state {
unsigned long bb; /* bit buffer */
unsigned int bk; /* bits in bit buffer */
+
+ uint32_t crc_32_tab[256];
+ uint32_t crc;
};
#define malloc(a) xmalloc_bytes(a)
@@ -74,7 +77,7 @@ static __init void flush_window(struct gunzip_state *s)
* The window is equal to the output buffer therefore only need to
* compute the crc.
*/
- unsigned long c = crc;
+ uint32_t c = ~s->crc;
unsigned int n;
unsigned char *in, ch;
@@ -82,9 +85,9 @@ static __init void flush_window(struct gunzip_state *s)
for ( n = 0; n < s->wp; n++ )
{
ch = *in++;
- c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
+ c = s->crc_32_tab[(c ^ ch) & 0xff] ^ (c >> 8);
}
- crc = c;
+ s->crc = ~c;
s->bytes_out += s->wp;
s->wp = 0;
@@ -121,7 +124,7 @@ __init int perform_gunzip(char *output, char *image,
unsigned long image_len)
s->inptr = 0;
s->bytes_out = 0;
- makecrc();
+ makecrc(s);
if ( gunzip(s) < 0 )
{
diff --git a/xen/common/gzip/inflate.c b/xen/common/gzip/inflate.c
index 7487616442..b9a2d7a23a 100644
--- a/xen/common/gzip/inflate.c
+++ b/xen/common/gzip/inflate.c
@@ -1041,16 +1041,12 @@ static int __init inflate(struct gunzip_state *s)
*
**********************************************************************/
-static ulg __initdata crc_32_tab[256];
-static ulg __initdata crc; /* initialized in makecrc() so it'll reside in bss
*/
-#define CRC_VALUE (crc ^ 0xffffffffUL)
-
/*
* Code to compute the CRC-32 table. Borrowed from
* gzip-1.0.3/makecrc.c.
*/
-static void __init makecrc(void)
+static void __init makecrc(struct gunzip_state *s)
{
/* Not copyrighted 1990 Mark Adler */
@@ -1067,7 +1063,7 @@ static void __init makecrc(void)
for (i = 0; i < sizeof(p)/sizeof(int); i++)
e |= 1L << (31 - p[i]);
- crc_32_tab[0] = 0;
+ s->crc_32_tab[0] = 0;
for (i = 1; i < 256; i++)
{
@@ -1078,11 +1074,10 @@ static void __init makecrc(void)
if (k & 1)
c ^= e;
}
- crc_32_tab[i] = c;
+ s->crc_32_tab[i] = c;
}
- /* this is initialized here so this code could reside in ROM */
- crc = (ulg)0xffffffffUL; /* shift register contents */
+ s->crc = 0;
}
/* gzip flag byte */
@@ -1204,7 +1199,8 @@ static int __init gunzip(struct gunzip_state *s)
orig_len |= (ulg) NEXTBYTE(s) << 24;
/* Validate decompression */
- if (orig_crc != CRC_VALUE) {
+ if ( orig_crc != s->crc )
+ {
error("crc error");
return -1;
}
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |