]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
plat/linuxu: Move `initrd` and `heap` initialization to `setup.c`
authorSergiu Moga <sergiu.moga@protonmail.com>
Thu, 6 Apr 2023 14:41:03 +0000 (17:41 +0300)
committerUnikraft <monkey@unikraft.io>
Fri, 11 Aug 2023 10:18:44 +0000 (10:18 +0000)
Initialize the `heap` and `initrd` as soon as possible and move the
respective functions to `setup.c`, as that is the only place where
they are to be used.

Signed-off-by: Sergiu Moga <sergiu.moga@protonmail.com>
Reviewed-by: Michalis Pappas <michalis@unikraft.io>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #848

plat/linuxu/memory.c
plat/linuxu/setup.c

index 2410de291eaacf70924f868b36e940e2e4b5cad1..0e32035c910e521fca0198c2f7b902efde4e6a0a 100644 (file)
 #include <linuxu/setup.h>
 #include <uk/errptr.h>
 #include <uk/assert.h>
-#include <linuxu/syscall.h>
 #include <uk/plat/memory.h>
 #include <uk/libparam.h>
 
-#define MB2B           (1024 * 1024)
-
-static __u32 heap_size = CONFIG_LINUXU_DEFAULT_HEAPMB;
-UK_LIB_PARAM(heap_size, __u32);
-
-static const char *initrd;
-UK_LIB_PARAM_STR(initrd);
-
-static int __linuxu_plat_heap_init(void)
-{
-       void *pret;
-       int rc = 0;
-
-       _liblinuxuplat_opts.heap.len = heap_size * MB2B;
-       uk_pr_info("Allocate memory for heap (%u MiB)\n", heap_size);
-
-       /**
-        * Allocate heap memory
-        */
-       if (_liblinuxuplat_opts.heap.len > 0) {
-               pret = sys_mapmem(NULL, _liblinuxuplat_opts.heap.len);
-               if (PTRISERR(pret)) {
-                       rc = PTR2ERR(pret);
-                       uk_pr_err("Failed to allocate memory for heap: %d\n",
-                                  rc);
-               } else
-                       _liblinuxuplat_opts.heap.base = pret;
-       }
-
-       return rc;
-
-}
-
-static int __linuxu_plat_initrd_init(void)
-{
-       void *pret;
-       int rc = 0;
-       struct k_stat file_info;
-
-       if (initrd == NULL) {
-               uk_pr_debug("No initrd present.\n");
-       } else {
-               uk_pr_debug("Mapping in initrd file: %s\n", initrd);
-               int initrd_fd = sys_open(initrd, K_O_RDONLY, 0);
-
-               if (initrd_fd < 0) {
-                       uk_pr_crit("Failed to open %s for initrd\n", initrd);
-                       return -1;
-               }
-
-               /**
-                * Find initrd file size
-                */
-               if (sys_fstat(initrd_fd, &file_info) < 0) {
-                       uk_pr_crit("sys_fstat failed for initrd file\n");
-                       sys_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(NULL,
-                                       _liblinuxuplat_opts.initrd.len,
-                                       PROT_READ | PROT_WRITE | PROT_EXEC,
-                                       MAP_PRIVATE, initrd_fd, 0);
-                       if (PTRISERR(pret)) {
-                               rc = PTR2ERR(pret);
-                               uk_pr_crit("Failed to memory-map initrd: %d\n",
-                                          rc);
-                               sys_close(initrd_fd);
-                               return -1;
-                       }
-                       _liblinuxuplat_opts.initrd.base = pret;
-               } else {
-                       uk_pr_info("Ignoring empty initrd file.\n");
-                       sys_close(initrd_fd);
-                       return 0;
-               }
-       }
-       return rc;
-}
-
 int ukplat_memregion_count(void)
 {
        static int init;
index d4b9648bbb8f9dfbd9fb85e4b7b38fc68040cd83..f64d97c86f47ead35d8e01698fb933b622135c5a 100644 (file)
@@ -31,6 +31,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <errno.h>
+#include <uk/arch/types.h>
 #include <uk/config.h>
 #include <string.h>
 #include <getopt.h>
 #include <linuxu/console.h>
 #include <uk/plat/console.h>
 #include <uk/plat/bootstrap.h>
+#include <linuxu/syscall.h>
+#include <uk/plat/memory.h>
+#include <uk/libparam.h>
 #include <uk/assert.h>
 #include <uk/errptr.h>
 #include <uk/plat/common/cpu.h>
 
+extern int ukplat_linuxu_memregion_count;
+
 struct liblinuxuplat_opts _liblinuxuplat_opts = { 0 };
 
+#define MB2B           (1024 * 1024)
+
+static __u32 heap_size = CONFIG_LINUXU_DEFAULT_HEAPMB;
+UK_LIB_PARAM(heap_size, __u32);
+
+static const char *initrd;
+UK_LIB_PARAM_STR(initrd);
+
+int __linuxu_plat_heap_init(void)
+{
+       void *pret;
+       int rc = 0;
+
+       _liblinuxuplat_opts.heap.len = heap_size * MB2B;
+       uk_pr_info("Allocate memory for heap (%u MiB)\n", heap_size);
+
+       /**
+        * Allocate heap memory
+        */
+       if (_liblinuxuplat_opts.heap.len > 0) {
+               pret = sys_mapmem(NULL, _liblinuxuplat_opts.heap.len);
+               if (PTRISERR(pret)) {
+                       rc = PTR2ERR(pret);
+                       uk_pr_err("Failed to allocate memory for heap: %d\n",
+                                 rc);
+               } else {
+                       _liblinuxuplat_opts.heap.base = pret;
+               }
+       }
+
+       return rc;
+}
+
+int __linuxu_plat_initrd_init(void)
+{
+       void *pret;
+       int rc = 0;
+       struct k_stat file_info;
+
+       if (!initrd) {
+               uk_pr_debug("No initrd present.\n");
+       } else {
+               uk_pr_debug("Mapping in initrd file: %s\n", initrd);
+               int initrd_fd = sys_open(initrd, K_O_RDONLY, 0);
+
+               if (initrd_fd < 0) {
+                       uk_pr_crit("Failed to open %s for initrd\n", initrd);
+                       return -1;
+               }
+
+               /**
+                * Find initrd file size
+                */
+               if (sys_fstat(initrd_fd, &file_info) < 0) {
+                       uk_pr_crit("sys_fstat failed for initrd file\n");
+                       sys_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(NULL,
+                                       _liblinuxuplat_opts.initrd.len,
+                                       PROT_READ | PROT_WRITE | PROT_EXEC,
+                                       MAP_PRIVATE, initrd_fd, 0);
+                       if (PTRISERR(pret)) {
+                               rc = PTR2ERR(pret);
+                               uk_pr_crit("Failed to memory-map initrd: %d\n",
+                                          rc);
+                               sys_close(initrd_fd);
+                               return -1;
+                       }
+                       _liblinuxuplat_opts.initrd.base = pret;
+               } else {
+                       uk_pr_info("Ignoring empty initrd file.\n");
+                       sys_close(initrd_fd);
+                       return 0;
+               }
+       }
+       return rc;
+}
+
 void _liblinuxuplat_entry(int argc, char *argv[]) __noreturn;
 
 void _liblinuxuplat_entry(int argc, char *argv[])
@@ -54,6 +145,9 @@ void _liblinuxuplat_entry(int argc, char *argv[])
         */
        _liblinuxuplat_init_console();
 
+       ukplat_linuxu_memregion_count = __linuxu_plat_heap_init() == 0 ? 1 : 0 +
+                                       __linuxu_plat_initrd_init() == 0 ? 1 : 0;
+
        /*
         * Enter Unikraft
         */