diff options
author | Brett Weiland <brett_weiland@bpcspace.com> | 2021-03-24 15:42:20 -0500 |
---|---|---|
committer | Brett Weiland <brett_weiland@bpcspace.com> | 2021-03-24 15:42:20 -0500 |
commit | f90c075d5061b3a89316d6bf3d5b190d49049ccd (patch) | |
tree | 36265da568b852ca5c0a8b4affe706cda80c4a9d /src/kernel/acpi.c | |
parent | 14b109ea24dc5cb1db948de57a2a44c80ef4622e (diff) |
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
Diffstat (limited to 'src/kernel/acpi.c')
-rw-r--r-- | src/kernel/acpi.c | 58 |
1 files changed, 58 insertions, 0 deletions
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 <acpi.h> +#include <stdint.h> +#include <printf.h> + +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); + } + } + } +} + + |