[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 2/5] plat/linuxu: Add initrd memory region
Add a new library parameter (initrd_file). The parameter can be used to map a file on the host filesystem to to a new memory region on boot. Signed-off-by: Robert Hrusecky <roberth@xxxxxxxxxxxxx> Signed-off-by: Omar Jamil <omarj2898@xxxxxxxxx> Signed-off-by: Sachin Beldona <sachinbeldona@xxxxxxxxxx> --- plat/linuxu/include/linuxu/setup.h | 11 +-- plat/linuxu/memory.c | 105 ++++++++++++++++++++++++----- 2 files changed, 96 insertions(+), 20 deletions(-) diff --git a/plat/linuxu/include/linuxu/setup.h b/plat/linuxu/include/linuxu/setup.h index 571d66c..5d2c3a6 100644 --- a/plat/linuxu/include/linuxu/setup.h +++ b/plat/linuxu/include/linuxu/setup.h @@ -38,11 +38,14 @@ #include <sys/types.h> +struct liblinuxuplat_memregion { + void *base; + size_t len; +}; + struct liblinuxuplat_opts { - struct { - void *base; - size_t len; - } heap; + struct liblinuxuplat_memregion heap; + struct liblinuxuplat_memregion initrd; }; extern struct liblinuxuplat_opts _liblinuxuplat_opts; diff --git a/plat/linuxu/memory.c b/plat/linuxu/memory.c index 9b5479e..842debe 100644 --- a/plat/linuxu/memory.c +++ b/plat/linuxu/memory.c @@ -42,11 +42,19 @@ #include <uk/plat/memory.h> #include <uk/libparam.h> -#define MB2B (1024 * 1024) +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + +#define MB2B (1024 * 1024) static __u32 heap_size = CONFIG_LINUXU_DEFAULT_HEAPMB; UK_LIB_PARAM(heap_size, __u32); +static const char *initrd_file = NULL; +UK_LIB_PARAM_STR(initrd_file); + static int __linuxu_plat_heap_init(void) { void *pret; @@ -63,32 +71,86 @@ static int __linuxu_plat_heap_init(void) if (PTRISERR(pret)) { rc = PTR2ERR(pret); uk_pr_err("Failed to allocate memory for heap: %d\n", - rc); + rc); } else _liblinuxuplat_opts.heap.base = pret; } return rc; +} +static int __linuxu_plat_initrd_init(void) +{ + void *pret; + int rc = 0; + struct stat file_info; + + if (initrd_file == NULL) { + uk_pr_debug("No initrd present.\n"); + } else { + uk_pr_debug("Mapping in initrd file: %s\n", initrd_file); + int initrd_fd = sys_open(initrd_file, O_RDONLY, 0); + + if (initrd_fd < 0) { + uk_pr_err("Failed to open intrd file"); + return -1; + } + + /** + * Find initrd file size + */ + if (sys_fstat(initrd_fd, &file_info) < 0) { + uk_pr_err("sys_fstat failed for initrd file"); + close(initrd_fd); + return -1; + } + _liblinuxuplat_opts.initrd.len = file_info.st_size; + /** + * Allocate initrd memory + */ + if (_liblinuxuplat_opts.initrd.len > 0) { + pret = sys_mmap((void *)_liblinuxuplat_opts.heap.len, + _liblinuxuplat_opts.initrd.len, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE, initrd_fd, 0); + if (PTRISERR(pret)) { + rc = PTR2ERR(pret); + uk_pr_err("Failed to allocate memory for initrd: %d\n", + rc); + close(initrd_fd); + return -1; + } + _liblinuxuplat_opts.initrd.base = pret; + } else { + uk_pr_err("Empty initrd file given.\n"); + close(initrd_fd); + return -1; + } + } + return rc; } int ukplat_memregion_count(void) { static int have_heap = 0; + static int have_initrd = 0; int rc = 0; + /* + * NOTE: The heap size and initrd file can be changed by a + * library parameter. We assume that those ones are processed + * by the boot library shortly before memory regions are + * scanned. This is why we initialize the heap here. + */ if (!have_heap) { - /* - * NOTE: The heap size can be changed by a library parameter. - * We assume that those ones are processed by the boot library - * shortly before memory regions are scanned. This is why - * we initialize the heap here. - */ rc = __linuxu_plat_heap_init(); have_heap = (rc == 0) ? 1 : 0; } - - return (have_heap) ? 1 : 0; + if (!have_initrd) { + rc = __linuxu_plat_initrd_init(); + have_initrd = (rc == 0) ? 1 : 0; + } + return have_heap + have_initrd; } int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m) @@ -98,20 +160,31 @@ int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m) UK_ASSERT(m); if (i == 0 && _liblinuxuplat_opts.heap.base) { - m->base = _liblinuxuplat_opts.heap.base; - m->len = _liblinuxuplat_opts.heap.len; + m->base = _liblinuxuplat_opts.heap.base; + m->len = _liblinuxuplat_opts.heap.len; m->flags = UKPLAT_MEMRF_ALLOCATABLE; #if CONFIG_UKPLAT_MEMRNAME - m->name = "heap"; + m->name = "heap"; +#endif + ret = 0; + } else if ((i == 0 && !_liblinuxuplat_opts.heap.base + && _liblinuxuplat_opts.initrd.base) + || (i == 1 && _liblinuxuplat_opts.heap.base + && _liblinuxuplat_opts.initrd.base)) { + m->base = _liblinuxuplat_opts.initrd.base; + m->len = _liblinuxuplat_opts.initrd.len; + m->flags = UKPLAT_MEMRF_INITRD | UKPLAT_MEMRF_WRITABLE; +#if CONFIG_UKPLAT_MEMRNAME + m->name = "initrd"; #endif ret = 0; } else { /* invalid memory region index or no heap allocated */ - m->base = __NULL; - m->len = 0; + m->base = __NULL; + m->len = 0; m->flags = 0x0; #if CONFIG_UKPLAT_MEMRNAME - m->name = __NULL; + m->name = __NULL; #endif ret = -1; } -- 2.24.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |