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>