sp1: mm: Add physical memory management groundwork
Signed-off-by: Ian Moffett <ian@mirocom.org>
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
CFILES = $(shell find os/ -name "*.c")
|
CFILES = $(shell find os/ -name "*.c")
|
||||||
CFILES += $(shell find io/ -name "*.c")
|
CFILES += $(shell find io/ -name "*.c")
|
||||||
CFILES += $(shell find bpt/ -name "*.c")
|
CFILES += $(shell find bpt/ -name "*.c")
|
||||||
|
CFILES += $(shell find mm/ -name "*.c")
|
||||||
CFILES += $(shell find ../ext -name "*.c")
|
CFILES += $(shell find ../ext -name "*.c")
|
||||||
CFILES += $(shell find ../lib -name "*.c")
|
CFILES += $(shell find ../lib -name "*.c")
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The following sources are CONFIDENTIAL and PROPRIETARY
|
||||||
|
* property of Mirocom Laboratories. Unauthorized copying,
|
||||||
|
* use, distribution or modification of this file, in whole
|
||||||
|
* and in part, is strictly prohibited without the prior written
|
||||||
|
* consent from Mirocom Laboratories.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/units.h>
|
||||||
|
#include <mm/physmem.h>
|
||||||
|
#include <mu/param.h>
|
||||||
|
#include <lib/printf.h>
|
||||||
|
#include <os/bpt.h>
|
||||||
|
|
||||||
|
#define pr_trace(fmt, ...) \
|
||||||
|
printf("physseg: " fmt, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
/* Use to convert type constants to strings */
|
||||||
|
#define MEM_TYPE(TYPE) \
|
||||||
|
((TYPE) < NELEM(typetab)) \
|
||||||
|
? typetab[(TYPE)] \
|
||||||
|
: "invalid"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Memory type constant to human readable
|
||||||
|
* string table.
|
||||||
|
*/
|
||||||
|
static const char *typetab[] = {
|
||||||
|
[MEMORY_USABLE] = "usable",
|
||||||
|
[MEMORY_RESERVED] = "reserved",
|
||||||
|
[MEMORY_ACPI_RECLAIM] = "acpi reclaimable",
|
||||||
|
[MEMORY_ACPI_NVS] = "acpi nvs",
|
||||||
|
[MEMORY_BAD] = "bad*",
|
||||||
|
[MEMORY_BOOTLOADER] = "bootloader",
|
||||||
|
[MEMORY_KERNEL] = "syspaw",
|
||||||
|
[MEMORY_FRAMEBUFFER] = "framebuffer",
|
||||||
|
[MEMORY_ACPI_TABLES] = "acpi tables"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Memory stats */
|
||||||
|
static uintptr_t highest_usable;
|
||||||
|
static size_t mem_total = 0;
|
||||||
|
static size_t mem_usable = 0;
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
physmem_print_size(const char *title, size_t len)
|
||||||
|
{
|
||||||
|
if (title == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len >= UNIT_GIB) {
|
||||||
|
pr_trace("... %d GiB %s\n", len / UNIT_GIB, title);
|
||||||
|
} else if (len >= UNIT_MIB) {
|
||||||
|
pr_trace("... %d MiB %s\n", len / UNIT_MIB, title);
|
||||||
|
} else {
|
||||||
|
pr_trace("... %d bytes %s\n", len, title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Begin scanning physical memory for usable entries
|
||||||
|
* and other information
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
physmem_probe(void)
|
||||||
|
{
|
||||||
|
struct mem_entry entry;
|
||||||
|
status_t status;
|
||||||
|
|
||||||
|
for (size_t i = 0;; ++i) {
|
||||||
|
status = bpt_mem_entry_i(i, &entry);
|
||||||
|
|
||||||
|
/* Are there no more entries? */
|
||||||
|
if (status != STATUS_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print this entry */
|
||||||
|
pr_trace(
|
||||||
|
"%p ... %p : %s\n",
|
||||||
|
entry.base,
|
||||||
|
entry.base + entry.length,
|
||||||
|
MEM_TYPE(entry.type)
|
||||||
|
);
|
||||||
|
|
||||||
|
mem_total += entry.length;
|
||||||
|
|
||||||
|
/* Skip non-usable memory from here on out */
|
||||||
|
if (entry.type != MEMORY_USABLE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((entry.base + entry.length) > highest_usable) {
|
||||||
|
highest_usable = ALIGN_UP(entry.base + entry.length, PAGESIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
mem_usable += entry.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print memory stats */
|
||||||
|
pr_trace("begin stats\n");
|
||||||
|
physmem_print_size("usable", mem_usable);
|
||||||
|
physmem_print_size("total", mem_total);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mm_physmem_init(void)
|
||||||
|
{
|
||||||
|
/* Probe the physical memory */
|
||||||
|
pr_trace("sniffing out physical memory...\n");
|
||||||
|
physmem_probe();
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <os/bpt.h>
|
#include <os/bpt.h>
|
||||||
#include <lib/printf.h>
|
#include <lib/printf.h>
|
||||||
#include <mu/cpu.h>
|
#include <mu/cpu.h>
|
||||||
|
#include <mm/physmem.h>
|
||||||
|
|
||||||
#define KERNEL_VERSION "0.0.1"
|
#define KERNEL_VERSION "0.0.1"
|
||||||
|
|
||||||
@@ -46,4 +47,7 @@ main(void)
|
|||||||
|
|
||||||
/* Initialize boot protocol translation layer */
|
/* Initialize boot protocol translation layer */
|
||||||
bpt_init();
|
bpt_init();
|
||||||
|
|
||||||
|
/* Initialize physical memory management */
|
||||||
|
mm_physmem_init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The following sources are CONFIDENTIAL and PROPRIETARY
|
||||||
|
* property of Mirocom Laboratories. Unauthorized copying,
|
||||||
|
* use, distribution or modification of this file, in whole
|
||||||
|
* and in part, is strictly prohibited without the prior written
|
||||||
|
* consent from Mirocom Laboratories.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MM_PHYSMEM_H_
|
||||||
|
#define _MM_PHYSMEM_H_ 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the physical memory management
|
||||||
|
*/
|
||||||
|
void mm_physmem_init(void);
|
||||||
|
|
||||||
|
#endif /* !_MM_PHYSMEM_H_ */
|
||||||
Reference in New Issue
Block a user