windows-nt/Source/XPSP1/NT/base/boot/detect/ia64/hwpmbios.c

177 lines
4.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1990, 1991 Microsoft Corporation
Module Name:
hwpmbiosc.c
Abstract:
This modules contains ACPI BIOS C supporting routines
Author:
Jake Oshins (jakeo) 6-Feb-1997
Environment:
Real mode.
Revision History:
--*/
#include "hwdetect.h"
#include <string.h>
#include "acpibios.h"
BOOLEAN
HwGetAcpiBiosData(
IN FPUCHAR *Configuration,
OUT PUSHORT Length
)
/*++
Routine Description:
This routine checks to see if an ACPI BIOS is present. If it is,
then it returns the ACPI Root System Description Pointer.
Arguments:
Configuration - structure that holds ACPI pointer
Length - length of that structure
Return Value:
TRUE if ACPI BIOS is present, FALSE otherwise
--*/
{
ULONG romAddr, romEnd;
FPUCHAR current;
FPULONG EbdaAddr;
FPACPI_BIOS_INSTALLATION_CHECK header;
UCHAR sum, node = 0;
USHORT i, nodeSize;
enum PASS { PASS1 = 0, PASS2, MAX_PASSES } pass;
//
// Search on 16 byte boundaries for the signature of the
// Root System Description Table structure.
//
#if defined(NEC_98)
//
// PC98, we search (physical) memory from 0xE8000
// to 0xFFFFF.
MAKE_FP(current, 0xE8000);
romAddr = 0xE8000;
romEnd = ACPI_BIOS_END;
#else
for (pass = PASS1; pass < MAX_PASSES; pass++) {
if (pass == PASS1) {
//
// On the first pass, we search the first 1K of the
// Extended BIOS data area.
//
//
// Earlier, we stored the address of the EBDA in address
// DOS_BEGIN_SEGMENT << 4 : EBIOS_INFO_OFFSET
//
MAKE_FP(EbdaAddr, ((DOS_BEGIN_SEGMENT << 4) + EBIOS_INFO_OFFSET));
MAKE_FP(current, *EbdaAddr);
if (*EbdaAddr == 0) {
continue;
}
romAddr = *EbdaAddr;
romEnd = romAddr + 1024;
} else {
//
// On the second pass, we search (physical) memory 0xE0000
// to 0xF0000.
MAKE_FP(current, ACPI_BIOS_START);
romAddr = ACPI_BIOS_START;
romEnd = ACPI_BIOS_END;
}
#endif
while (romAddr < romEnd) {
header = (FPACPI_BIOS_INSTALLATION_CHECK)current;
//
// Signature to match is the string "RSD PTR".
//
if (header->Signature[0] == 'R' && header->Signature[1] == 'S' &&
header->Signature[2] == 'D' && header->Signature[3] == ' ' &&
header->Signature[4] == 'P' && header->Signature[5] == 'T' &&
header->Signature[6] == 'R' && header->Signature[7] == ' ' ) {
sum = 0;
for (i = 0; i < sizeof(ACPI_BIOS_INSTALLATION_CHECK); i++) {
sum += current[i];
}
if (sum == 0) {
pass = MAX_PASSES; // leave 'for' loop
break; // leave 'while' loop
}
#if DBG
BlPrint("GetAcpiBiosData: Checksum fails\n");
#endif
}
romAddr += ACPI_BIOS_HEADER_INCREMENT;
MAKE_FP(current, romAddr);
}
#if defined(NEC_98)
#else
}
#endif
if (romAddr >= romEnd) {
#if DBG
BlPrint("GetAcpiBiosData: RSDT pointer not found\n");
#endif
return FALSE;
}
nodeSize = sizeof(ACPI_BIOS_INSTALLATION_CHECK) + DATA_HEADER_SIZE;
current = (FPUCHAR) HwAllocateHeap(nodeSize, FALSE);
if (!current) {
#if DBG
BlPrint("GetAcpiBiosData: Out of heap space.\n");
#endif
return FALSE;
}
//
// Collect ACPI Bios installation check data and device node data.
//
_fmemcpy (current + DATA_HEADER_SIZE,
(FPUCHAR)header,
sizeof(ACPI_BIOS_INSTALLATION_CHECK)
);
*Configuration = current;
*Length = nodeSize;
#if DBG
BlPrint("ACPI BIOS found at 0x%x:%x. RdstAddress is 0x%x:%x\n",
(USHORT)(romAddr >> 16),
(USHORT)(romAddr),
(USHORT)(header->RsdtAddress >> 16),
(USHORT)(header->RsdtAddress)
);
#endif
return TRUE;
}