ACPI RSDT detected !
This commit is contained in:
parent
02e7b7ea77
commit
9f52833adb
|
@ -31,7 +31,25 @@
|
|||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
//
|
||||
// ACPI 2.0 Legacy descriptor
|
||||
//
|
||||
struct RSDPDescriptor {
|
||||
char signature[8];
|
||||
uchar checksum;
|
||||
char OEMID[6];
|
||||
uchar revision;
|
||||
uint rsdtAddress;
|
||||
uint length;
|
||||
ulong xsdtAddress;
|
||||
uchar extendedChecksum;
|
||||
uchar reserved[3];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
void IoTestAcpi(void);
|
||||
RSDPDescriptor *IoFindRSDP(void);
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
|
|
|
@ -56,6 +56,8 @@ typedef struct IdtPtr_t IdtPtr_t;
|
|||
typedef struct ISRList_t ISRList_t;
|
||||
typedef struct ISRFrame_t ISRFrame_t;
|
||||
|
||||
typedef struct RSDPDescriptor RSDPDescriptor;
|
||||
|
||||
typedef struct MemoryMap_t MemoryMap_t;
|
||||
typedef struct MapEntry_t MapEntry_t;
|
||||
typedef struct GdtEntry_t GdtEntry_t;
|
||||
|
|
|
@ -64,6 +64,9 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
|||
// Sanity checks
|
||||
BtDoSanityChecks(mbMagic);
|
||||
|
||||
// ACPI
|
||||
IoTestAcpi();
|
||||
|
||||
// Memory
|
||||
MmInitMemoryMap();
|
||||
MmInitGdt();
|
||||
|
@ -83,9 +86,6 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
|||
KeGetCpuInfos();
|
||||
IoEnableKeyb();
|
||||
|
||||
// ACPI
|
||||
IoTestAcpi();
|
||||
|
||||
// Scheduler
|
||||
PsInitSched();
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <init/boot.h>
|
||||
#include <io/vga.h>
|
||||
#include <io/acpi.h>
|
||||
|
||||
void IoTestAcpi(void)
|
||||
{
|
||||
|
@ -34,6 +35,57 @@ void IoTestAcpi(void)
|
|||
if (BtFirmwareInfo.apmValid)
|
||||
KernLog("\tApm Table is valid at %p\n", BtFirmwareInfo.apmTable);
|
||||
|
||||
RSDPDescriptor *rsdp = IoFindRSDP();
|
||||
if (!rsdp)
|
||||
return;
|
||||
|
||||
KernLog("\tFound ACPI RSDP (%s) version %d at %p\n",
|
||||
rsdp->OEMID, (uint)rsdp->revision, rsdp
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
RSDPDescriptor *IoFindRSDP()
|
||||
{
|
||||
char *rsdp = NULL;
|
||||
|
||||
|
||||
// Search in EBDA
|
||||
for (rsdp = (char *)0x00080000; // EBDA address
|
||||
(ulong)rsdp < (ulong)0x0009FFFF; // EBDA end
|
||||
rsdp++) {
|
||||
|
||||
if (rsdp[0] == 'R' &&
|
||||
rsdp[1] == 'S' &&
|
||||
rsdp[2] == 'D' &&
|
||||
rsdp[3] == ' ' &&
|
||||
rsdp[4] == 'P' &&
|
||||
rsdp[5] == 'T' &&
|
||||
rsdp[6] == 'R' &&
|
||||
rsdp[7] == ' '
|
||||
) {
|
||||
return (RSDPDescriptor *)rsdp;
|
||||
}
|
||||
}
|
||||
|
||||
// Search in BDA
|
||||
for (rsdp = (char *)0x000E0000; // BDA address
|
||||
(ulong)rsdp < (ulong)0x000FFFFF; // BDA end
|
||||
rsdp++) {
|
||||
|
||||
if (rsdp[0] == 'R' &&
|
||||
rsdp[1] == 'S' &&
|
||||
rsdp[2] == 'D' &&
|
||||
rsdp[3] == ' ' &&
|
||||
rsdp[4] == 'P' &&
|
||||
rsdp[5] == 'T' &&
|
||||
rsdp[6] == 'R' &&
|
||||
rsdp[7] == ' '
|
||||
) {
|
||||
return (RSDPDescriptor *)rsdp;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -143,7 +143,6 @@ error_t CmdDumpMem(int argc, char **argv, char *cmdline)
|
|||
x += step;
|
||||
}
|
||||
|
||||
KernLog("\n\n");
|
||||
return EOK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue