#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;
* 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[])
*/
_liblinuxuplat_init_console();
+ ukplat_linuxu_memregion_count = __linuxu_plat_heap_init() == 0 ? 1 : 0 +
+ __linuxu_plat_initrd_init() == 0 ? 1 : 0;
+
/*
* Enter Unikraft
*/