1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-11 09:50:12 +00:00

Export the physical address of the RSDP to userland by means

of the `machdep.acpi_root' sysctl. This is required on ia64
because the root pointer hardly ever, if at all, lives in the
first MB of memory and also because scanning the first MB of
memory can cause machine checks.
This provides a save and reliable way for ACPI tools to work
with the tables if ACPI support is present in the kernel. On
ia64 ACPI is non-optional.
This commit is contained in:
Marcel Moolenaar 2002-12-18 08:47:07 +00:00
parent 414c998fba
commit 91c71b46ed
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=108026
3 changed files with 81 additions and 32 deletions

View File

@ -30,32 +30,50 @@
/*
* 6.1 : Environmental support
*/
#include <sys/types.h>
#include <sys/linker_set.h>
#include <sys/sysctl.h>
#include "acpi.h"
#include <machine/pc/bios.h>
u_long i386_acpi_root;
SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &i386_acpi_root, 0,
"The physical address of the RSDP");
ACPI_STATUS
AcpiOsInitialize(void)
{
return(0);
return(0);
}
ACPI_STATUS
AcpiOsTerminate(void)
{
return(0);
return(0);
}
ACPI_STATUS
AcpiOsGetRootPointer(
UINT32 Flags,
ACPI_POINTER *RsdpPhysicalAddress)
AcpiOsGetRootPointer(UINT32 Flags, ACPI_POINTER *RsdpPhysicalAddress)
{
/*
* The loader passes the physical address at which it found the
* RSDP in a hint. We could recover this rather than searching
* manually here.
*/
return(AcpiFindRootPointer(Flags, RsdpPhysicalAddress));
ACPI_POINTER ptr;
ACPI_STATUS status;
if (i386_acpi_root == 0) {
/*
* The loader passes the physical address at which it found the
* RSDP in a hint. We could recover this rather than searching
* manually here.
*/
status = AcpiFindRootPointer(Flags, &ptr);
if (status == AE_OK)
i386_acpi_root = ptr.Pointer.Physical;
} else
status = AE_OK;
RsdpPhysicalAddress->PointerType = ACPI_PHYSICAL_POINTER;
RsdpPhysicalAddress->Pointer.Physical = i386_acpi_root;
return (status);
}

View File

@ -30,32 +30,50 @@
/*
* 6.1 : Environmental support
*/
#include <sys/types.h>
#include <sys/linker_set.h>
#include <sys/sysctl.h>
#include "acpi.h"
#include <machine/pc/bios.h>
u_long i386_acpi_root;
SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &i386_acpi_root, 0,
"The physical address of the RSDP");
ACPI_STATUS
AcpiOsInitialize(void)
{
return(0);
return(0);
}
ACPI_STATUS
AcpiOsTerminate(void)
{
return(0);
return(0);
}
ACPI_STATUS
AcpiOsGetRootPointer(
UINT32 Flags,
ACPI_POINTER *RsdpPhysicalAddress)
AcpiOsGetRootPointer(UINT32 Flags, ACPI_POINTER *RsdpPhysicalAddress)
{
/*
* The loader passes the physical address at which it found the
* RSDP in a hint. We could recover this rather than searching
* manually here.
*/
return(AcpiFindRootPointer(Flags, RsdpPhysicalAddress));
ACPI_POINTER ptr;
ACPI_STATUS status;
if (i386_acpi_root == 0) {
/*
* The loader passes the physical address at which it found the
* RSDP in a hint. We could recover this rather than searching
* manually here.
*/
status = AcpiFindRootPointer(Flags, &ptr);
if (status == AE_OK)
i386_acpi_root = ptr.Pointer.Physical;
} else
status = AE_OK;
RsdpPhysicalAddress->PointerType = ACPI_PHYSICAL_POINTER;
RsdpPhysicalAddress->Pointer.Physical = i386_acpi_root;
return (status);
}

View File

@ -30,12 +30,20 @@
/*
* 6.1 : Environmental support
*/
#include <sys/types.h>
#include <sys/linker_set.h>
#include <sys/sysctl.h>
#include "acpi.h"
extern u_int64_t ia64_efi_acpi_table;
extern u_int64_t ia64_efi_acpi20_table;
u_long ia64_acpi_root;
SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &ia64_acpi_root, 0,
"The physical address of the RSDP");
ACPI_STATUS
AcpiOsInitialize(void)
{
@ -54,17 +62,22 @@ ACPI_STATUS
AcpiOsGetRootPointer(UINT32 Flags, ACPI_POINTER *RsdpAddress)
{
if (ia64_efi_acpi20_table) {
RsdpAddress->PointerType = ACPI_PHYSICAL_POINTER;
RsdpAddress->Pointer.Physical = ia64_efi_acpi20_table;
if (ia64_acpi_root == 0) {
if (ia64_efi_acpi20_table) {
/* XXX put under bootverbose. */
printf("Using ACPI2.0 table at 0x%lx\n",
ia64_efi_acpi20_table);
ia64_acpi_root = ia64_efi_acpi20_table;
} else if (ia64_efi_acpi_table) {
/* XXX put under bootverbose. */
printf("Using ACPI1.x table at 0x%lx\n",
ia64_efi_acpi_table);
ia64_acpi_root = ia64_efi_acpi_table;
} else
return(AE_NOT_FOUND);
}
else if (ia64_efi_acpi_table) {
RsdpAddress->PointerType = ACPI_PHYSICAL_POINTER;
RsdpAddress->Pointer.Physical = ia64_efi_acpi_table;
}
else
return(AE_NOT_FOUND);
RsdpAddress->PointerType = ACPI_PHYSICAL_POINTER;
RsdpAddress->Pointer.Physical = ia64_acpi_root;
return(AE_OK);
}