Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Dec 2009 14:37:08 -0500
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        freebsd-acpi@FreeBSD.org
Cc:        Andrew Pantyukhin <infofarmer@freebsd.org>, "Moore, Robert" <robert.moore@intel.com>
Subject:   Re: libi386/biosacpi.c - bad RSDP checksum search
Message-ID:  <200912091437.09680.jkim@FreeBSD.org>
In-Reply-To: <4911F71203A09E4D9981D27F9D83085840DA9AC8@orsmsx503.amr.corp.intel.com>
References:  <20091208060339.GK98273@pollux.cenkes.org> <200912080749.55710.jhb@freebsd.org> <4911F71203A09E4D9981D27F9D83085840DA9AC8@orsmsx503.amr.corp.intel.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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 = (uint16_t *)PTOV(0x40E);
> >    if ((rsdp = biosacpi_search_rsdp((char *)(*addr << 4), 0x400))
> > != NULL) return (rsdp);
> >
> >    /* Check the upper memory BIOS space, 0xe0000 - 0xfffff. */
> >    if ((rsdp = biosacpi_search_rsdp((char *)0xe0000, 0x20000)) !=
> > 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 = 0; ofs < length; ofs += 16) {
> >	rsdp = (ACPI_TABLE_RSDP *)PTOV(base + ofs);
> >
> >	/* compare signature, validate checksum */
> >	if (!strncmp(rsdp->Signature, ACPI_SIG_RSDP,
> > strlen(ACPI_SIG_RSDP))) {
> >	    cp = (u_int8_t *)rsdp;
> >	    sum = 0;
> >	    for (idx = 0; idx < RSDP_CHECKSUM_LENGTH; idx++)
> >		sum += *(cp + idx);
> >	    if (sum != 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?200912091437.09680.jkim>