freebsd-dev/sys/amd64/amd64/bios.c
Poul-Henning Kamp 636d90fc5c Make the facility for recognizing BIOS-signatures more general
and return a printable representation.

This fixes recognition of the PC Engines WRAP and improves the
recognition of the Soekris boards (Bios version can now be
seen in the dmesg output for instance).

Also, add watchdog support for PCM-582x platforms.

Submitted by:	Adrian Steinmann <ast@marabu.ch>
Slightly changed by:	phk
PR:	81360
2005-07-21 09:48:37 +00:00

96 lines
3.2 KiB
C

/*-
* Copyright (c) 1997 Michael Smith
* Copyright (c) 1998 Jonathan Lemon
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
/*
* Subset of the i386 bios support code. We cannot make bios16 nor bios32
* calls, so we can leave that out. However, searching for bios rom
* signatures can be useful for locating tables, eg: powernow settings.
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/vmparam.h>
#include <machine/pc/bios.h>
#define BIOS_START 0xe0000
#define BIOS_SIZE 0x20000
/*
* bios_sigsearch
*
* Search some or all of the BIOS region for a signature string.
*
* (start) Optional offset returned from this function
* (for searching for multiple matches), or NULL
* to start the search from the base of the BIOS.
* Note that this will be a _physical_ address in
* the range 0xe0000 - 0xfffff.
* (sig) is a pointer to the byte(s) of the signature.
* (siglen) number of bytes in the signature.
* (paralen) signature paragraph (alignment) size.
* (sigofs) offset of the signature within the paragraph.
*
* Returns the _physical_ address of the found signature, 0 if the
* signature was not found.
*/
u_int32_t
bios_sigsearch(u_int32_t start, u_char *sig, int siglen, int paralen, int sigofs)
{
u_char *sp, *end;
/* compute the starting address */
if ((start >= BIOS_START) && (start <= (BIOS_START + BIOS_SIZE))) {
sp = (char *)BIOS_PADDRTOVADDR(start);
} else if (start == 0) {
sp = (char *)BIOS_PADDRTOVADDR(BIOS_START);
} else {
return 0; /* bogus start address */
}
/* compute the end address */
end = (u_char *)BIOS_PADDRTOVADDR(BIOS_START + BIOS_SIZE);
/* loop searching */
while ((sp + sigofs + siglen) < end) {
/* compare here */
if (!bcmp(sp + sigofs, sig, siglen)) {
/* convert back to physical address */
return((u_int32_t)(uintptr_t)BIOS_VADDRTOPADDR(sp));
}
sp += paralen;
}
return(0);
}