Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Dec 2009 11:59:56 -0800
From:      "Moore, Robert" <robert.moore@intel.com>
To:        Jung-uk Kim <jkim@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:  <4911F71203A09E4D9981D27F9D83085840DA9C6B@orsmsx503.amr.corp.intel.com>
In-Reply-To: <200912091437.09680.jkim@FreeBSD.org>
References:  <20091208060339.GK98273@pollux.cenkes.org> <200912080749.55710.jhb@freebsd.org> <4911F71203A09E4D9981D27F9D83085840DA9AC8@orsmsx503.amr.corp.intel.com> <200912091437.09680.jkim@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

Part of the reason I asked the question is because the ACPICA Table Manager=
 (the code that scans and extracts ACPI tables) has been specifically desig=
ned to be available at any time, even before virtual memory is available an=
d before the rest of the ACPICA subsystem is initialized.

I haven't heard of this type of table scan before, but so be it. However, a=
s you have seen, you are stuck with finding and fixing bugs that have been =
already resolved in the ACPICA code.

Bob


>-----Original Message-----
>From: Jung-uk Kim [mailto:jkim@FreeBSD.org]
>Sent: Wednesday, December 09, 2009 11:37 AM
>To: freebsd-acpi@FreeBSD.org
>Cc: Moore, Robert; Andrew Pantyukhin
>Subject: Re: libi386/biosacpi.c - bad RSDP checksum search
>
>On Wednesday 09 December 2009 01:46 pm, Moore, Robert wrote:
>> Might be a dumb question, but why is the bootloader looking around
>> for ACPI tables in the first place?
>
>FreeBSD/i386 bootloader loads ACPI kernel module if the root pointer
>is found and ACPI is not disabled by user.  Then, the pointer is
>passed to kernel as a hint for AcpiOsGetRootPointer() later.
>FreeBSD/amd64 just happened to share the same bootloader. :-)
>
>Jung-uk Kim
>
>> 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
>> > NULL) 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"
>>
>> _______________________________________________
>> 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?4911F71203A09E4D9981D27F9D83085840DA9C6B>