parlib: Implement join/detach() for all uthreads
[akaros.git] / user / vmm / memory.c
index 40e980f..518f697 100644 (file)
@@ -4,34 +4,13 @@
  * Memory, paging, e820, bootparams and other helpers */
 
 #include <stdio.h>
-#include <pthread.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <parlib/arch/arch.h>
-#include <parlib/ros_debug.h>
-#include <unistd.h>
-#include <errno.h>
-#include <dirent.h>
 #include <stdlib.h>
-#include <string.h>
-#include <ros/syscall.h>
 #include <sys/mman.h>
-#include <vmm/vmm.h>
-#include <vmm/acpi/acpi.h>
 #include <ros/arch/mmu.h>
-#include <ros/arch/membar.h>
-#include <ros/vmm.h>
-#include <parlib/uthread.h>
 #include <vmm/linux_bootparam.h>
-#include <getopt.h>
+#include <vmm/vmm.h>
 
-#include <vmm/sched.h>
-#include <vmm/net.h>
-#include <sys/eventfd.h>
-#include <sys/uio.h>
-#include <sys/param.h>
-#include <parlib/opts.h>
+#define ALIGNED(p, a)  (!(((uintptr_t)(p)) & ((a)-1)))
 
 static char *entrynames[] = {
        [E820_RAM] "E820_RAM",
@@ -105,10 +84,25 @@ void *init_e820map(struct boot_params *bp,
        return (void *)bp + PGSIZE;
 }
 
+/* checkmemaligned verifies alignment attributes of your memory space.
+ * It terminates your process with extreme prejudice if they are
+ * incorrect in some way. */
+void checkmemaligned(unsigned long long memstart, unsigned long long memsize)
+{
+       if (!ALIGNED(memstart, PML1_REACH))
+               errx(1, "memstart (%#x) wrong: must be aligned to %#x",
+                     memstart, PML1_REACH);
+       if (!ALIGNED(memsize, PML1_REACH))
+               errx(1, "memsize (%#x) wrong: must be aligned to %#x",
+                     memsize, PML1_REACH);
+}
+
 // memory allocates memory for the VM. It's a complicated mess because of the
 // break for APIC and other things. We just go ahead and leave the region from
 // RESERVED to _4GiB for that.  The memory is either split, all low, or all
-// high.
+// high. This code is designed for a kernel. Dune-style code does not need it
+// as it does not have the RESERVED restrictions. Dune-style code can use this,
+// however, by setting memstart to 4 GiB.
 void mmap_memory(unsigned long long memstart, unsigned long long memsize)
 {
        void *r1, *r2;
@@ -116,6 +110,7 @@ void mmap_memory(unsigned long long memstart, unsigned long long memsize)
 
        // Let's do some minimal validation, so we don't drive
        // people crazy.
+       checkmemaligned(memstart, memsize);
        if ((memstart >= RESERVED) && (memstart < _4GiB))
                errx(1, "memstart (%#x) wrong: must be < %#x or >= %#x\n",
                     memstart, RESERVED, _4GiB);