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);
|
void IoTestAcpi(void);
|
||||||
|
RSDPDescriptor *IoFindRSDP(void);
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,8 @@ typedef struct IdtPtr_t IdtPtr_t;
|
||||||
typedef struct ISRList_t ISRList_t;
|
typedef struct ISRList_t ISRList_t;
|
||||||
typedef struct ISRFrame_t ISRFrame_t;
|
typedef struct ISRFrame_t ISRFrame_t;
|
||||||
|
|
||||||
|
typedef struct RSDPDescriptor RSDPDescriptor;
|
||||||
|
|
||||||
typedef struct MemoryMap_t MemoryMap_t;
|
typedef struct MemoryMap_t MemoryMap_t;
|
||||||
typedef struct MapEntry_t MapEntry_t;
|
typedef struct MapEntry_t MapEntry_t;
|
||||||
typedef struct GdtEntry_t GdtEntry_t;
|
typedef struct GdtEntry_t GdtEntry_t;
|
||||||
|
|
|
@ -64,6 +64,9 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
||||||
// Sanity checks
|
// Sanity checks
|
||||||
BtDoSanityChecks(mbMagic);
|
BtDoSanityChecks(mbMagic);
|
||||||
|
|
||||||
|
// ACPI
|
||||||
|
IoTestAcpi();
|
||||||
|
|
||||||
// Memory
|
// Memory
|
||||||
MmInitMemoryMap();
|
MmInitMemoryMap();
|
||||||
MmInitGdt();
|
MmInitGdt();
|
||||||
|
@ -83,9 +86,6 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
||||||
KeGetCpuInfos();
|
KeGetCpuInfos();
|
||||||
IoEnableKeyb();
|
IoEnableKeyb();
|
||||||
|
|
||||||
// ACPI
|
|
||||||
IoTestAcpi();
|
|
||||||
|
|
||||||
// Scheduler
|
// Scheduler
|
||||||
PsInitSched();
|
PsInitSched();
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include <init/boot.h>
|
#include <init/boot.h>
|
||||||
#include <io/vga.h>
|
#include <io/vga.h>
|
||||||
|
#include <io/acpi.h>
|
||||||
|
|
||||||
void IoTestAcpi(void)
|
void IoTestAcpi(void)
|
||||||
{
|
{
|
||||||
|
@ -34,6 +35,57 @@ void IoTestAcpi(void)
|
||||||
if (BtFirmwareInfo.apmValid)
|
if (BtFirmwareInfo.apmValid)
|
||||||
KernLog("\tApm Table is valid at %p\n", BtFirmwareInfo.apmTable);
|
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;
|
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;
|
x += step;
|
||||||
}
|
}
|
||||||
|
|
||||||
KernLog("\n\n");
|
|
||||||
return EOK;
|
return EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue