[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCHv4 32/43] plat/kvm: Parse memory info from device tree for Arm64
QEMU/KVM will store the memory informations like memory region, memory base address and memory size to device tree. We parse these informations for memory allocater and new stack setting. Signed-off-by: Wei Chen <Wei.Chen@xxxxxxx> --- plat/kvm/arm/setup.c | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/plat/kvm/arm/setup.c b/plat/kvm/arm/setup.c index a881152..685308c 100644 --- a/plat/kvm/arm/setup.c +++ b/plat/kvm/arm/setup.c @@ -35,10 +35,15 @@ #include <uk/plat/console.h> #include <uk/assert.h> #include <uk/essentials.h> +#include <arm/cpu_defs.h> #define MAX_CMDLINE_SIZE 1024 static char cmdline[MAX_CMDLINE_SIZE]; +void *_libkvmplat_pagetable; +void *_libkvmplat_heap_start; +void *_libkvmplat_stack_top; +void *_libkvmplat_mem_end; void *_libkvmplat_dtb; static void _init_dtb(void *dtb_pointer) @@ -78,6 +83,53 @@ enocmdl: strcpy(cmdline, CONFIG_UK_NAME); } +static void _init_dtb_mem(void) +{ + extern char _text[]; + extern char _end[]; + int memory, prop_len = 0; + const uint64_t *regs; + uint64_t mem_base, mem_size, max_addr; + + /* search for assigned VM memory in DTB */ + if (fdt_num_mem_rsv(_libkvmplat_dtb) != 0) + uk_printd(DLVL_WARN, "Reserved memory is not supported\n"); + + memory = fdt_node_offset_by_prop_value(_libkvmplat_dtb, -1, + "device_type", + "memory", sizeof("memory")); + if (memory < 0) { + uk_printd(DLVL_WARN, "No memory found in DTB\n"); + return; + } + + /* + * QEMU will always provide us at least one bank of memory. + * unikraft will use the first bank for the time-being. + */ + regs = fdt_getprop(_libkvmplat_dtb, memory, "reg", &prop_len); + + /* + * The property must contain at least the start address + * and size, each of which is 8-bytes. + */ + if (regs == NULL && prop_len < 16) + UK_CRASH("Bad 'reg' property: %p %d\n", regs, prop_len); + + mem_base = fdt64_to_cpu(regs[0]); + mem_size = fdt64_to_cpu(regs[1]); + if (mem_base > (uint64_t)&_text) + UK_CRASH("Fatal: Image outside of RAM\n"); + + max_addr = mem_base + mem_size; + _libkvmplat_pagetable =(void *) ALIGN_UP((size_t)&_end, __PAGE_SIZE); + _libkvmplat_heap_start = _libkvmplat_pagetable + PAGE_TABLE_SIZE; + _libkvmplat_mem_end = (void *) max_addr; + + /* AArch64 require stack be 16-bytes alignment by default */ + _libkvmplat_stack_top = (void *) ALIGN_UP(max_addr, __STACK_ALIGN_SIZE); +} + static void _init_cpufeatures(void) { /* TODO */ @@ -93,4 +145,11 @@ void _libkvmplat_start(void *dtb_pointer) /* Get command line from DTB */ _dtb_get_cmdline(cmdline, sizeof(cmdline)); + + /* Initialize memory from DTB */ + _init_dtb_mem(); + + uk_printd(DLVL_INFO, "pagetable start: %p\n", _libkvmplat_pagetable); + uk_printd(DLVL_INFO, " heap start: %p\n", _libkvmplat_heap_start); + uk_printd(DLVL_INFO, " stack top: %p\n", _libkvmplat_stack_top); } -- 2.17.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |