[PATCH] romsignature/checksum cleanup

From: Rene Herman
Date: Sun Jan 07 2007 - 21:50:38 EST


On 01/07/2007 07:07 PM, Jeremy Fitzhardinge wrote:

Rene Herman wrote:

Doing the set_fs() and pagefault_{disable,enable} calls for every
single byte during the checksum seems rather silly.

Why?

Because it makes for dumb code. But oh well, given that it all compiles to basically nothing I guess I'll stop objecting.

Andrew: The attached removes the assumption that if the first page of an ISA ROM is mapped, it'll all be mapped. This'll also stop people reading this code from wondering if they're looking at a bug.

This replaces "romsignature-checksum-cleanup.patch" in current -mm.

Signed-off-by: Rene Herman <rene.herman@xxxxxxxxx>
Not-strongly-objected-to-by: Jeremy Fitzhardinge <jeremy@xxxxxxxx>

Rene. diff --git a/arch/i386/kernel/e820.c b/arch/i386/kernel/e820.c
index f391abc..8b8741f 100644
--- a/arch/i386/kernel/e820.c
+++ b/arch/i386/kernel/e820.c
@@ -156,29 +156,31 @@ static struct resource standard_io_resou
.flags = IORESOURCE_BUSY | IORESOURCE_IO
} };

-static int romsignature(const unsigned char *x)
+#define ROMSIGNATURE 0xaa55
+
+static int __init romsignature(const unsigned char *rom)
{
+ const unsigned short * const ptr = (const unsigned short *)rom;
unsigned short sig;
- int ret = 0;
- if (probe_kernel_address((const unsigned short *)x, sig) == 0)
- ret = (sig == 0xaa55);
- return ret;
+
+ return probe_kernel_address(ptr, sig) == 0 && sig == ROMSIGNATURE;
}

-static int __init romchecksum(unsigned char *rom, unsigned long length)
+static int __init romchecksum(const unsigned char *rom, unsigned long length)
{
- unsigned char *p, sum = 0;
+ unsigned char sum, c;

- for (p = rom; p < rom + length; p++)
- sum += *p;
- return sum == 0;
+ for (sum = 0; length && probe_kernel_address(rom++, c) == 0; length--)
+ sum += c;
+ return !length && !sum;
}

static void __init probe_roms(void)
{
+ const unsigned char *rom;
unsigned long start, length, upper;
- unsigned char *rom;
- int i;
+ unsigned char c;
+ int i;

/* video rom */
upper = adapter_rom_resources[0].start;
@@ -189,8 +191,11 @@ static void __init probe_roms(void)

video_rom_resource.start = start;

+ if (probe_kernel_address(rom + 2, c) != 0)
+ continue;
+
/* 0 < length <= 0x7f * 512, historically */
- length = rom[2] * 512;
+ length = c * 512;

/* if checksum okay, trust length byte */
if (length && romchecksum(rom, length))
@@ -224,8 +229,11 @@ static void __init probe_roms(void)
if (!romsignature(rom))
continue;

+ if (probe_kernel_address(rom + 2, c) != 0)
+ continue;
+
/* 0 < length <= 0x7f * 512, historically */
- length = rom[2] * 512;
+ length = c * 512;

/* but accept any length that fits if checksum okay */
if (!length || start + length > upper || !romchecksum(rom, length))