summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/include/pmm.h7
-rw-r--r--kernel/src/apic/madt.c10
-rw-r--r--kernel/src/main.c13
-rw-r--r--kernel/src/mem/pmm.c49
5 files changed, 65 insertions, 15 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 93cfa24..266eea8 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -31,6 +31,7 @@ OBJS = \
src/mem/heap.o \
src/mem/paging_asm.o \
src/mem/paging.o \
+ src/mem/pmm.o \
src/misc/graphics.o \
src/misc/stdbuff.o \
src/scheduler/atomic.o \
diff --git a/kernel/include/pmm.h b/kernel/include/pmm.h
new file mode 100644
index 0000000..5fe62a8
--- /dev/null
+++ b/kernel/include/pmm.h
@@ -0,0 +1,7 @@
+#ifndef PMM_H
+#define PMM_H
+
+void init_pmm(void);
+void memory_usage(void);
+
+#endif
diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c
index fff0db5..654182a 100644
--- a/kernel/src/apic/madt.c
+++ b/kernel/src/apic/madt.c
@@ -99,7 +99,7 @@ void parse_madt()
cpu_apic_ids[numcores] = cpu->apic_id;
numcores++;
- printf("found cpu: acpi_id: 0x%x, apic_id: 0x%x, flags: 0x%x\n", cpu->acpi_id, cpu->apic_id, cpu->flags);
+ // 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
@@ -108,14 +108,14 @@ void parse_madt()
ioapic_addr = io->io_apic_addr;
- 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);
+ // 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);
+ // 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
@@ -125,14 +125,14 @@ void parse_madt()
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);
+ // 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_ovr = (struct MADT_lapic_addr*)kalloc(sizeof(struct MADT_lapic_addr));
memcpy(lapic_addr_ovr, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_addr));
- printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr);
+ // printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr);
kfree(lapic_addr_ovr);
} else if (type == 9) {
// Processor Local x2APIC
diff --git a/kernel/src/main.c b/kernel/src/main.c
index 766d69c..5061515 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -20,6 +20,7 @@
#include <containter_of.h>
#include <madt.h>
#include <atomic.h>
+#include <pmm.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)
@@ -32,24 +33,16 @@ 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);
- //}
-
+ init_pmm();
+ memory_usage();
init_keyboard();
init_timer(TICKS_PER_SECOND);
init_idt();
disc_init();
ext2_init();
- //ls(path_to_inode("/"));
- //print_inode(path_to_inode("/"));
init_tss();
-
list_sys_tables();
parse_madt();
-
jump_userspace();
for(;;) {
diff --git a/kernel/src/mem/pmm.c b/kernel/src/mem/pmm.c
new file mode 100644
index 0000000..63bfb07
--- /dev/null
+++ b/kernel/src/mem/pmm.c
@@ -0,0 +1,49 @@
+#include <paging.h>
+#include <heap.h>
+#include <libk/list.h>
+#include <libk/stdio.h>
+#include <libk/serial_stdio.h>
+#include <libk/string.h>
+#include <multiboot2.h>
+#include <pmm.h>
+
+#define PMM_PAGE_SIZE 4096 * 512
+#define MEM_USED_BELOW 0x03000000
+
+uint64_t free_mem_cnt;
+uint64_t all_mem_cnt;
+list_t pmm_list;
+
+void init_pmm()
+{
+ INIT_LIST(pmm_list);
+
+ mmap_t* pos;
+ list_for_each_entry_prev(pos, (&mmap.list), list) {
+ mb2_tag_mmap_entry entry = pos->mmap_entry;
+ if (entry.type != 1)
+ continue;
+ uint64_t base = entry.base_addr & (PMM_PAGE_SIZE - 1) ? (entry.base_addr & (uint64_t)~(PMM_PAGE_SIZE - 1)) + PMM_PAGE_SIZE : entry.base_addr;
+ for (uint64_t i = base; i + PMM_PAGE_SIZE <= entry.base_addr + entry.length; i += PMM_PAGE_SIZE) {
+ if (i >= MEM_USED_BELOW) {
+ free_mem_cnt++;
+ map_addr(i, i, FLAG_PRESENT);
+ list_t* list = (list_t*)i;
+ add_to_list(list, &pmm_list, pmm_list.next);
+ }
+ }
+ }
+ all_mem_cnt = free_mem_cnt;
+
+ // print addr of every free block of memory
+ //list_t* pok;
+ //list_for_each(pok, (&pmm_list)) {
+ // serial_printf("0x%x\n", pok);
+ //}
+}
+
+void memory_usage()
+{
+ printf("memory used: %dMB\n", (48 * 1024 * 1024 + (all_mem_cnt - free_mem_cnt) * PAGE_SIZE) / 1024 / 1024);
+ printf("memory free: %dMB\n", free_mem_cnt * PAGE_SIZE / 1024 / 1024);
+}