diff --git a/header.mk b/header.mk index adbd6c7b..a3f187f0 100644 --- a/header.mk +++ b/header.mk @@ -115,12 +115,12 @@ endif # # These flags are used when preprocessing C and assembly language files. CPPFLAGS.includes = -I$(includes) -CPPFLAGS.arch = -m32 -march=i686 +CPPFLAGS.arch = -m32 -march=i686 CPPFLAGS.others = -nostdinc CPPFLAGS = $(CPPFLAGS.arch) $(CPPFLAGS.includes) $(CPPFLAGS.debug) $(CPPFLAGS.others) $(CPPFLAGS.extra) # C compiler flags -CFLAGS.warnings = -std=c99 -pedantic -Wall -Werror=implicit -Werror=uninitialized -Werror=return-type +CFLAGS.warnings = -std=c99 -pedantic -Wall -Wno-array-bounds -Werror=implicit -Werror=uninitialized -Werror=return-type CFLAGS.arch = -m32 -march=i686 CFLAGS.optimization = -O3 CFLAGS.others = -ffreestanding -fno-pie -fno-common -fno-omit-frame-pointer -fno-delete-null-pointer-checks diff --git a/include/kernel/infrastructure/i686/drivers/acpi.h b/include/kernel/infrastructure/i686/drivers/acpi.h index 7e4b1d30..6cb9e984 100644 --- a/include/kernel/infrastructure/i686/drivers/acpi.h +++ b/include/kernel/infrastructure/i686/drivers/acpi.h @@ -35,14 +35,6 @@ #include #include -typedef struct { - char signature[8]; - uint8_t checksum; - char oemid[6]; - uint8_t revision; - uint32_t rsdt_address; -} acpiv1_rsdp_t; - typedef struct { char signature[8]; uint8_t checksum; @@ -55,6 +47,6 @@ typedef struct { uint8_t reserved[3]; } acpi_rsdp_t; -const acpi_rsdp_t *acpi_find_rsdp(void); +void acpi_init(void); #endif diff --git a/include/kernel/infrastructure/i686/drivers/asm/acpi.h b/include/kernel/infrastructure/i686/drivers/asm/acpi.h index 2d02343b..caf1a150 100644 --- a/include/kernel/infrastructure/i686/drivers/asm/acpi.h +++ b/include/kernel/infrastructure/i686/drivers/asm/acpi.h @@ -38,4 +38,6 @@ #define ACPI_V2_REVISION 2 +#define ACPI_V1_RSDP_SIZE 20 + #endif diff --git a/kernel/infrastructure/i686/drivers/acpi.c b/kernel/infrastructure/i686/drivers/acpi.c index bf05453c..936c14b3 100644 --- a/kernel/infrastructure/i686/drivers/acpi.c +++ b/kernel/infrastructure/i686/drivers/acpi.c @@ -29,7 +29,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include +#include #include #include #include @@ -51,7 +53,7 @@ static bool check_rsdp(const acpi_rsdp_t *rsdp) { return false; } - uint8_t checksum = compute_checksum(rsdp, sizeof(acpiv1_rsdp_t)); + uint8_t checksum = compute_checksum(rsdp, ACPI_V1_RSDP_SIZE); if(checksum != 0) { return false; @@ -68,8 +70,7 @@ static bool check_rsdp(const acpi_rsdp_t *rsdp) { return compute_checksum(rsdp, sizeof(acpi_rsdp_t)) == 0; } -const acpi_rsdp_t *acpi_find_rsdp(void) { - +static const acpi_rsdp_t *find_rsdp(void) { const char *ebda = (const char *)(16 * (*(uint16_t *)ACPI_BDA_EBDA)); for(const char *addr = ebda; addr < ebda + 1024; addr += 16) { @@ -93,3 +94,23 @@ const acpi_rsdp_t *acpi_find_rsdp(void) { return NULL; } + +void acpi_init(void) { + const acpi_rsdp_t *rsdp = find_rsdp(); + + if(rsdp == NULL) { + warning("ACPI RSDP not found"); + return; + } + + info("ACPI:"); + info(" RSDP: %#08p", rsdp); + info(" Version: %s", rsdp->revision == ACPI_V1_REVISION ? "1.0" : "2.x"); + info(" RSDT addr: 0x%08" PRIx32, rsdp->rsdt_address); + + if(rsdp->revision == ACPI_V1_REVISION) { + return; + } + + info(" XSDT addr: %#" PRIx64, rsdp->xsdt_address); +} diff --git a/kernel/infrastructure/i686/init.c b/kernel/infrastructure/i686/init.c index f445a668..6534db82 100644 --- a/kernel/infrastructure/i686/init.c +++ b/kernel/infrastructure/i686/init.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -373,6 +374,8 @@ void machine_init(const config_t *config) { pit8253_init(); pic8259_unmask(IRQ_TIMER); + acpi_init(); + exec_file_t kernel; get_kernel_exec_file(&kernel, bootinfo);