libi386/biosacpi.c - bad RSDP checksum search
Jung-uk Kim
jkim at FreeBSD.org
Wed Dec 9 19:37:26 UTC 2009
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 at freebsd.org [mailto:owner-freebsd-
> >acpi at freebsd.org] On Behalf Of John Baldwin
> >Sent: Tuesday, December 08, 2009 4:50 AM
> >To: freebsd-acpi at 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 at freebsd.org mailing list
> >http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
> >To unsubscribe, send any mail to
> > "freebsd-acpi-unsubscribe at freebsd.org"
>
> _______________________________________________
> freebsd-acpi at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
> To unsubscribe, send any mail to
> "freebsd-acpi-unsubscribe at freebsd.org"
More information about the freebsd-acpi
mailing list