From f90c075d5061b3a89316d6bf3d5b190d49049ccd Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Wed, 24 Mar 2021 15:42:20 -0500 Subject: renamed: kernel/include/acpi.h -> include/acpi.h renamed: kernel/include/libc.h -> include/libc.h renamed: kernel/include/paging.h -> include/paging.h renamed: kernel/include/printf.h -> include/printf.h renamed: kernel/include/serial.h -> include/serial.h renamed: kernel/include/video.h -> include/video.h new file: indigo_os renamed: kernel/libs/acpi.c -> kernel/acpi.c renamed: kernel/libs/drivers/serial.c -> kernel/drivers/serial.c renamed: kernel/libs/drivers/video.c -> kernel/drivers/video.c renamed: kernel/libs/libc.c -> kernel/libc.c renamed: kernel/libs/page.c -> kernel/page.c renamed: kernel/libs/printf.c -> kernel/printf.c renamed: kernel/libs/printf.h -> kernel/printf.h modified: makefile --- src/kernel/acpi.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/kernel/acpi.c (limited to 'src/kernel/acpi.c') diff --git a/src/kernel/acpi.c b/src/kernel/acpi.c new file mode 100644 index 0000000..0c22fe4 --- /dev/null +++ b/src/kernel/acpi.c @@ -0,0 +1,58 @@ +#include +#include +#include + +static int RSDP_verify(void *rsdp_pointer) { + printf("Verifying potential RSDP at address 0x%p... ", rsdp_pointer); + union rsdp_t *rsdp = rsdp_pointer; + uint8_t checksum = 0; + char *rsdp_csm_ptr = rsdp_pointer; + int i; + if(checksum) return 0; + if(rsdp->v1.version) { + printf("APCI revision > 2.\n"); + checksum = 0; + printf("len : %i\n", rsdp->v2.len); + for(i = 0; i < rsdp->v2.len; i++) { + checksum += rsdp_csm_ptr[i]; + } + } + else { + printf("APCI revision 1.\n"); + for(i = 0; i <= 20; i++) { + checksum += rsdp_csm_ptr[i]; + } + } + if(checksum) { + return 0; + printf("Invalid, searching on.\n"); + } + printf("RSDP Verified!\n"); + return 1; +} + +rsdp_t *find_RSDP() { + const char sig[9] = "RSD PTR "; + uintptr_t *p = (void *)0x040e; + uintptr_t *ebda_unshifted = (void *)p; + + void *ebda = (void *)((uintptr_t)ebda_unshifted << (uintptr_t)4 & (uintptr_t)0xfffff); + + for(void *i = ebda; i <= ebda + 64000; i += 16) { + if(!(memcmp(sig, i, 8))) { + if(RSDP_verify(i)) { + return(i); + } + } + } + + for(void *i = (void *)0xe0000; i <= (void *)0xfffff; i += 16) { + if(!(memcmp(sig, i, 8))) { + if(RSDP_verify(i)) { + return(i); + } + } + } +} + + -- cgit v1.2.3