SMP Booting, APIC, and IRQs
[akaros.git] / kern / env.c
index b086a2d..ea4b100 100644 (file)
@@ -1,4 +1,7 @@
 /* See COPYRIGHT for copyright information. */
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
 
 #include <inc/x86.h>
 #include <inc/mmu.h>
@@ -189,6 +192,8 @@ env_alloc(struct Env **newenv_store, envid_t parent_id)
        e->env_tf.tf_esp = USTACKTOP;
        e->env_tf.tf_cs = GD_UT | 3;
        // You will set e->env_tf.tf_eip later.
+       // set the env's EFLAGSs to have interrupts enabled
+       e->env_tf.tf_eflags |= 0x00000200; // bit 9 is the interrupts-enabled
 
        // commit the allocation
        LIST_REMOVE(e, env_link);
@@ -218,7 +223,7 @@ segment_alloc(struct Env *e, void *va, size_t len)
        end = ROUNDUP(va + len, PGSIZE);
        if (start >= end)
                panic("Wrap-around in memory allocation addresses!");
-       if ((uint32_t)end > UTOP)
+       if ((uintptr_t)end > UTOP)
                panic("Attempting to map above UTOP!");
        // page_insert/pgdir_walk alloc a page and read/write to it via its address
        // starting from pgdir (e's), so we need to be using e's pgdir
@@ -383,6 +388,9 @@ env_free(struct Env *e)
                page_decref(pa2page(pa));
        }
 
+       // need a known good pgdir before releasing the old one
+       lcr3(boot_cr3);
+
        // free the page directory
        pa = e->env_cr3;
        e->env_pgdir = 0;