diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/Makefile | 8 | ||||
| -rw-r--r-- | kernel/include/ext2.h | 2 | ||||
| -rw-r--r-- | kernel/include/madt.h | 55 | ||||
| -rw-r--r-- | kernel/include/rsdp.h | 30 | ||||
| -rw-r--r-- | kernel/src/apic/madt.c | 72 | ||||
| -rw-r--r-- | kernel/src/apic/rsdp.c | 68 | ||||
| -rw-r--r-- | kernel/src/fs/ext2.c | 2 | ||||
| -rw-r--r-- | kernel/src/main.c | 18 |
8 files changed, 243 insertions, 12 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index b895ecf..dc75b20 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,6 +1,8 @@ CFLAGS += -I include OBJS = \ + src/apic/madt.o \ + src/apic/rsdp.o \ src/boot/boot64.o \ src/boot/boot.o \ src/boot/header.o \ @@ -31,13 +33,13 @@ OBJS = \ src/mem/paging.o \ src/misc/graphics.o \ src/misc/stdbuff.o \ + src/scheduler/process.o \ + src/scheduler/scheduler.o \ + src/scheduler/switch_process.o \ src/sys/syscall_asm.o \ src/sys/syscall.o \ src/sys/userspace_asm.o \ src/sys/userspace.o \ - src/scheduler/scheduler.o \ - src/scheduler/switch_process.o \ - src/scheduler/process.o \ all: kernel.bin diff --git a/kernel/include/ext2.h b/kernel/include/ext2.h index b9222df..d6022a2 100644 --- a/kernel/include/ext2.h +++ b/kernel/include/ext2.h @@ -152,6 +152,6 @@ char* files_to_buffer(uint32_t inode); path_t* path_to_list(const char* path); uint32_t path_to_inode(const char* path); void ls(uint32_t inode); -void print(uint32_t inode); +void print_inode(uint32_t inode); #endif diff --git a/kernel/include/madt.h b/kernel/include/madt.h new file mode 100644 index 0000000..de3eb95 --- /dev/null +++ b/kernel/include/madt.h @@ -0,0 +1,55 @@ +#ifndef MADT_H +#define MADT_H + +#include <rsdp.h> + +struct MADT { + struct ACPI_header h; + uint32_t lacpi_addr; + uint32_t flags; +} __attribute__((packed)); + +struct MADT_type_header { + uint8_t type; + uint8_t len; +} __attribute__((packed)); + +struct MADT_cpu_local_apic { + struct MADT_type_header h; + uint8_t acpi_id; + uint8_t apic_id; + uint32_t flags; +} __attribute__((packed)); + +struct MADT_io_apic { + struct MADT_type_header h; + uint8_t apic_id; + uint8_t reserved; + uint32_t io_apic_addr; + uint32_t int_base; +} __attribute__((packed)); + +struct MADT_io_apic_int { + struct MADT_type_header h; + uint8_t bus_source; + uint8_t irq_source; + uint32_t global_sys_int; + uint16_t flags; +} __attribute__((packed)); + +struct MADT_lapic_nmi { + struct MADT_type_header h; + uint8_t acpi_cpu_id; + uint16_t flags; + uint8_t lint; +} __attribute__((packed)); + +struct MADT_lapic_addr { + struct MADT_type_header h; + uint16_t reserved; + uint64_t phys_addr; +} __attribute__((packed)); + +void parse_madt(void); + +#endif diff --git a/kernel/include/rsdp.h b/kernel/include/rsdp.h new file mode 100644 index 0000000..c931ee0 --- /dev/null +++ b/kernel/include/rsdp.h @@ -0,0 +1,30 @@ +#ifndef RSDP_H +#define RSDP_H + +#include <types.h> + +struct RSDP_descriptor { + char Signature[8]; + uint8_t Checksum; + char OEMID[6]; + uint8_t Revision; + uint32_t RsdtAddress; +} __attribute__((packed)); + +struct ACPI_header { + char Signature[4]; + uint32_t Length; + uint8_t Revision; + uint8_t Checksum; + char OEMID[6]; + char OEMTableID[8]; + uint32_t OEMRevision; + uint32_t CreatorID; + uint32_t CreatorRevision; +} __attribute__((packed)); + + +uint64_t* find_rsdp(void); +uint64_t* find_sys_table_addr(const char* signature); + +#endif diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c new file mode 100644 index 0000000..b88b788 --- /dev/null +++ b/kernel/src/apic/madt.c @@ -0,0 +1,72 @@ +#include <madt.h> +#include <heap.h> +#include <libk/string.h> +#include <libk/stdio.h> + +void parse_madt() +{ + uint64_t* madt_addr = find_sys_table_addr("APIC"); + + if (madt_addr == NULL) { + printf("MADT NOT FOUND\n"); + return; + } + + struct MADT* madt = (struct MADT*)kalloc(sizeof(struct MADT)); + memcpy(madt, madt_addr, sizeof(struct MADT)); + + for (size_t curr_size = sizeof(struct MADT); curr_size < madt->h.Length;) { + struct MADT_type_header* m = (struct MADT_type_header*)kalloc(sizeof(struct MADT_type_header)); + memcpy(m, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_type_header)); + uint8_t type = m->type; + uint8_t len = m->len; + kfree(m); + + if (type == 0) { + // Processor Local APIC + struct MADT_cpu_local_apic* cpu = (struct MADT_cpu_local_apic*)kalloc(sizeof(struct MADT_cpu_local_apic)); + memcpy(cpu, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_cpu_local_apic)); + + printf("found cpu: acpi_id: 0x%x, apic_id: 0x%x, flags: 0x%x\n", cpu->acpi_id, cpu->apic_id, cpu->flags); + kfree(cpu); + } else if (type == 1) { + // I/O APIC + struct MADT_io_apic* io = (struct MADT_io_apic*)kalloc(sizeof(struct MADT_io_apic)); + memcpy(io, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_io_apic)); + + printf("found io: apic_id: 0x%x, addr: 0x%x, int_base: 0x%x\n", io->apic_id, io->io_apic_addr, io->int_base); + kfree(io); + } else if (type == 2) { + // IO/APIC Interrupt Source Override + struct MADT_io_apic_int* io_apic_int = (struct MADT_io_apic_int*)kalloc(sizeof(struct MADT_io_apic_int)); + memcpy(io_apic_int, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_io_apic_int)); + + printf("found io_apic_int: bus: 0x%x, irq_source: 0x%x, global_sys_int: 0x%x, flags: 0x%x\n", io_apic_int->bus_source, io_apic_int->irq_source, io_apic_int->global_sys_int, io_apic_int->flags); + kfree(io_apic_int); + } else if (type == 3) { + // IO/APIC Non-maskable interrupt source + printf("MADT entry of type %d\n", type); + } else if (type == 4) { + // Local APIC Non-maskable interrupts + struct MADT_lapic_nmi* lapic_nmi = (struct MADT_lapic_nmi*)kalloc(sizeof(struct MADT_lapic_nmi)); + memcpy(lapic_nmi, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_nmi)); + + printf("found lapic_nmi: acpi_cpu_id: 0x%x, flags: 0x%x, lint: 0x%x\n", lapic_nmi->acpi_cpu_id, lapic_nmi->flags, lapic_nmi->lint); + kfree(lapic_nmi); + } else if (type == 5) { + // Local APIC Address Override + struct MADT_lapic_addr* lapic_addr = (struct MADT_lapic_addr*)kalloc(sizeof(struct MADT_lapic_addr)); + memcpy(lapic_addr, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_addr)); + + printf("found lapic: addr: 0x%x\n", lapic_addr->phys_addr); + kfree(lapic_addr); + } else if (type == 9) { + // Processor Local x2APIC + printf("MADT entry of type %d\n", type); + } else { + // ERROR + printf("ERROR: MADT entry of type %d\n", type); + } + curr_size += len; + } +} diff --git a/kernel/src/apic/rsdp.c b/kernel/src/apic/rsdp.c new file mode 100644 index 0000000..ebecd66 --- /dev/null +++ b/kernel/src/apic/rsdp.c @@ -0,0 +1,68 @@ +#include <rsdp.h> +#include <heap.h> +#include <paging.h> +#include <libk/string.h> +#include <libk/stdio.h> + +uint64_t* find_rsdp() +{ + map_addr(0x0, 0x0, FLAG_PRESENT); + const char* rsdp_cs = "RSD PTR "; + for (uint64_t i = 0x10; i < 0x100000; i += 0x10) { + char *x = (char*)i; + uint8_t ind = 1; + for (size_t j = 0; j < strlen(rsdp_cs); j++) { + if (rsdp_cs[j] != x[j]) { + ind = 0; + break; + } + } + if (ind) { + return (uint64_t*)i; + } + } + return NULL; +} + +uint64_t* find_sys_table_addr(const char* signature) +{ + uint64_t* rsdp = find_rsdp(); + + if (rsdp == NULL) { + printf("RSDP NOT FOUND\n"); + return NULL; + } + + struct RSDP_descriptor* rsdp_desc = (struct RSDP_descriptor*)rsdp; + map_addr(rsdp_desc->RsdtAddress, rsdp_desc->RsdtAddress, FLAG_PRESENT); + + struct ACPI_header* rsdt = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header)); + memcpy(rsdt, (uint64_t*)(uint64_t)rsdp_desc->RsdtAddress, sizeof(struct ACPI_header)); + + uint32_t entries = (rsdt->Length - (uint32_t)sizeof(struct ACPI_header)) / 4; + + for (size_t i = 0; i < entries; i++) { + uint32_t na_addr = (uint32_t)rsdp_desc->RsdtAddress + (uint32_t)sizeof(struct ACPI_header) + (uint32_t)i * 4; + uint32_t addr; + memcpy(&addr, (uint64_t*)(uint64_t)na_addr, 4); + + struct ACPI_header* t = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header)); + memcpy(t, (uint64_t*)(uint64_t)addr, sizeof(struct ACPI_header)); + + int ind = 1; + for (size_t j = 0; j < 4; j++) { + if (t->Signature[j] != signature[j]) + ind = 0; + } + if (ind) { + kfree(t); + kfree(rsdt); + return (uint64_t*)(uint64_t)addr; + } + + kfree(t); + } + + kfree(rsdt); + return NULL; +} diff --git a/kernel/src/fs/ext2.c b/kernel/src/fs/ext2.c index f4460c7..72eb776 100644 --- a/kernel/src/fs/ext2.c +++ b/kernel/src/fs/ext2.c @@ -270,7 +270,7 @@ void ls(uint32_t inode) kfree(dir); } -void print(uint32_t inode) +void print_inode(uint32_t inode) { char *p = files_to_buffer(inode); if (p != NULL) { diff --git a/kernel/src/main.c b/kernel/src/main.c index 5b55c09..31f8117 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -18,6 +18,7 @@ #include <tss.h> #include <serial.h> #include <containter_of.h> +#include <madt.h> int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic); int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) @@ -30,20 +31,23 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) read_mb2(multiboot_bootinfo, multiboot_magic); clear_screen(main_fb); // framebuffer is enabled from this point - mmap_t* pos; - list_for_each_entry(pos, (&mmap.list), list) { - mb2_tag_mmap_entry entry = pos->mmap_entry; - printf("base_addr: 0x%x, length: 0x%x, reserved: %d, type: %d\n", entry.base_addr, entry.length, entry.reserved, entry.type); - } + //mmap_t* pos; + //list_for_each_entry(pos, (&mmap.list), list) { + // mb2_tag_mmap_entry entry = pos->mmap_entry; + // printf("base_addr: 0x%x, length: 0x%x, reserved: %d, type: %d\n", entry.base_addr, entry.length, entry.reserved, entry.type); + //} init_keyboard(); init_timer(TICKS_PER_SECOND); init_idt(); disc_init(); ext2_init(); - ls(path_to_inode("/")); - print(path_to_inode("/")); + //ls(path_to_inode("/")); + //print_inode(path_to_inode("/")); init_tss(); + + parse_madt(); + jump_userspace(); for(;;) { |
