Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Dec 2009 10:46:36 -0800
From:      "Moore, Robert" <robert.moore@intel.com>
To:        John Baldwin <jhb@freebsd.org>, "freebsd-acpi@freebsd.org" <freebsd-acpi@freebsd.org>
Cc:        Andrew Pantyukhin <infofarmer@freebsd.org>
Subject:   RE: libi386/biosacpi.c - bad RSDP checksum search
Message-ID:  <4911F71203A09E4D9981D27F9D83085840DA9AC8@orsmsx503.amr.corp.intel.com>
In-Reply-To: <200912080749.55710.jhb@freebsd.org>
References:  <20091208060339.GK98273@pollux.cenkes.org> <200912080749.55710.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Might be a dumb question, but why is the bootloader looking around for ACPI=
 tables in the first place?

Thanks,
Bob


>-----Original Message-----
>From: owner-freebsd-acpi@freebsd.org [mailto:owner-freebsd-
>acpi@freebsd.org] On Behalf Of John Baldwin
>Sent: Tuesday, December 08, 2009 4:50 AM
>To: freebsd-acpi@freebsd.org
>Cc: Andrew Pantyukhin
>Subject: Re: libi386/biosacpi.c - bad RSDP checksum search
>
>On Tuesday 08 December 2009 1:03:40 am Andrew Pantyukhin wrote:
>> Our boot loader stops searching memory at the first occurrence of
>> "RSD PTR" while there are BIOSes (e.g. some IBM System x) that
>> have multiple such strings and the first one does not contain the
>> correct checksum.
>>
>> The acpi-ca code does the right thing and continues the search.
>>
>> Any ACPI experts interested in fixing this? I'll be ready to
>> test.
>
>Are you sure?  It looks like it keeps going if the checksum fails.  Note
>the
>'continue' after the printf() about a bad checksum.
>
>/*
> * Find the RSDP in low memory.  See section 5.2.2 of the ACPI spec.
> */
>static ACPI_TABLE_RSDP *
>biosacpi_find_rsdp(void)
>{
>    ACPI_TABLE_RSDP	*rsdp;
>    uint16_t		*addr;
>
>    /* EBDA is the 1 KB addressed by the 16 bit pointer at 0x40E. */
>    addr =3D (uint16_t *)PTOV(0x40E);
>    if ((rsdp =3D biosacpi_search_rsdp((char *)(*addr << 4), 0x400)) !=3D =
NULL)
>	return (rsdp);
>
>    /* Check the upper memory BIOS space, 0xe0000 - 0xfffff. */
>    if ((rsdp =3D biosacpi_search_rsdp((char *)0xe0000, 0x20000)) !=3D NUL=
L)
>	return (rsdp);
>
>    return (NULL);
>}
>
>static ACPI_TABLE_RSDP *
>biosacpi_search_rsdp(char *base, int length)
>{
>    ACPI_TABLE_RSDP	*rsdp;
>    u_int8_t		*cp, sum;
>    int			ofs, idx;
>
>    /* search on 16-byte boundaries */
>    for (ofs =3D 0; ofs < length; ofs +=3D 16) {
>	rsdp =3D (ACPI_TABLE_RSDP *)PTOV(base + ofs);
>
>	/* compare signature, validate checksum */
>	if (!strncmp(rsdp->Signature, ACPI_SIG_RSDP, strlen(ACPI_SIG_RSDP)))
>{
>	    cp =3D (u_int8_t *)rsdp;
>	    sum =3D 0;
>	    for (idx =3D 0; idx < RSDP_CHECKSUM_LENGTH; idx++)
>		sum +=3D *(cp + idx);
>	    if (sum !=3D 0) {
>		printf("acpi: bad RSDP checksum (%d)\n", sum);
>		continue;
>	    }
>	    return(rsdp);
>	}
>    }
>    return(NULL);
>}
>
>--
>John Baldwin
>_______________________________________________
>freebsd-acpi@freebsd.org mailing list
>http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
>To unsubscribe, send any mail to "freebsd-acpi-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4911F71203A09E4D9981D27F9D83085840DA9AC8>