From e0b34937b1bd674c05d609331501f81740fbb87f Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Thu, 23 May 2024 01:31:02 -0400 Subject: kernel: vm: Add memory stats Signed-off-by: Ian Moffett --- sys/include/vm/physseg.h | 7 +++++++ sys/include/vm/vm.h | 6 ++++++ sys/vm/vm_physseg.c | 41 +++++++++++++++++++++++++++++++++++++++++ sys/vm/vm_stat.c | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 sys/vm/vm_stat.c diff --git a/sys/include/vm/physseg.h b/sys/include/vm/physseg.h index aced4cb..af8cae8 100644 --- a/sys/include/vm/physseg.h +++ b/sys/include/vm/physseg.h @@ -32,8 +32,15 @@ #include +struct physmem_stat { + size_t reserved_kib; /* Reserved memory */ + size_t total_kib; /* Total memory */ +}; + void vm_physseg_init(void); uintptr_t vm_alloc_pageframe(size_t count); + void vm_free_pageframe(uintptr_t base, size_t count); +struct physmem_stat vm_phys_memstat(void); #endif /* !_VM_VM_PHYSSEG_H_ */ diff --git a/sys/include/vm/vm.h b/sys/include/vm/vm.h index 975eff0..f6fba66 100644 --- a/sys/include/vm/vm.h +++ b/sys/include/vm/vm.h @@ -39,6 +39,7 @@ #include #include #include +#include extern volatile struct limine_hhdm_request g_hhdm_request; @@ -52,6 +53,10 @@ struct vm_range { uintptr_t end; }; +struct vm_memstat { + struct physmem_stat pmem_stat; +}; + /* * Returns the machine's pagesize: * @@ -67,5 +72,6 @@ vm_get_page_size(void) void vm_init(void); struct vm_ctx *vm_get_ctx(void); struct vas vm_get_kvas(void); +struct vm_memstat vm_memstat(void); #endif /* !_VM_H_ */ diff --git a/sys/vm/vm_physseg.c b/sys/vm/vm_physseg.c index ee7f06e..6b803c2 100644 --- a/sys/vm/vm_physseg.c +++ b/sys/vm/vm_physseg.c @@ -67,11 +67,40 @@ static const int MAX_SEGMENTS = __ARRAY_COUNT(segment_name); static bitmap_t bitmap = NULL; +static size_t pages_total = 0; +static size_t pages_reserved = 0; static size_t last_used_idx = 0; static size_t bitmap_size = 0; static size_t highest_frame_idx; static size_t bitmap_free_start; /* Beginning bit of free region */ +static void +vm_physseg_getstat(void) +{ + struct limine_memmap_entry *entry; + size_t entry_pages = 0; + + pages_total = 0; + pages_reserved = 0; + + for (size_t i = 0; i < resp->entry_count; ++i) { + entry = resp->entries[i]; + entry_pages = entry->length / vm_get_page_size(); + + /* Drop invalid entries */ + if (entry->type >= MAX_SEGMENTS) { + continue; + } + + pages_total += entry_pages; + + if (entry->type != LIMINE_MEMMAP_USABLE) { + pages_reserved += entry_pages; + continue; + } + } +} + static void vm_physseg_bitmap_alloc(void) { @@ -223,3 +252,15 @@ vm_physseg_init(void) vm_physseg_bitmap_init(); } + +struct physmem_stat +vm_phys_memstat(void) +{ + size_t pagesize = vm_get_page_size(); + struct physmem_stat stat; + + vm_physseg_getstat(); + stat.total_kib = (pages_total * pagesize) / 1024; + stat.reserved_kib = (pages_reserved * pagesize) / 1024; + return stat; +} diff --git a/sys/vm/vm_stat.c b/sys/vm/vm_stat.c new file mode 100644 index 0000000..99ee9a9 --- /dev/null +++ b/sys/vm/vm_stat.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +struct vm_memstat +vm_memstat(void) +{ + struct vm_memstat stat; + + stat.pmem_stat = vm_phys_memstat(); + return stat; +} -- cgit v1.2.3