Make errno and return value work for async syscalls.
[akaros.git] / kern / arch / i686 / env.c
index 33f8d1f..16ac1ec 100644 (file)
@@ -7,6 +7,7 @@
 #include <env.h>
 #include <assert.h>
 #include <pmap.h>
+#include <smp.h>
 
 //
 // This exits the kernel and starts executing some environment's code.
 //
 void env_pop_tf(trapframe_t *tf)
 {
+       /* Bug with this whole idea (TODO: (TLSV))*/
        /* Load the LDT for this process.  Slightly ghetto doing it here. */
-       segdesc_t *my_gdt = per_cpu_info[core_id()].gdt;
        /* copy-in and check the LDT location.  the segmentation hardware write the
         * accessed bit, so we want the memory to be in the user-writeable area. */
-       segdesc_t *ldt = current->env_procdata->ldt;
+       segdesc_t *ldt = current->procdata->ldt;
        ldt = (segdesc_t*)MIN((uintptr_t)ldt, UTOP - LDT_SIZE);
-       segdesc_t ldt_temp = SEG_SYS(STS_LDT, (uint32_t)ldt, LDT_SIZE, 3);
-       my_gdt[GD_LDT >> 3] = ldt_temp;
-       asm volatile("lldt %%ax" :: "a"(GD_LDT));
+       /* Only set up the ldt if a pointer to the ldt actually exists */
+       if(ldt != NULL) {
+               segdesc_t *my_gdt = per_cpu_info[core_id()].gdt;
+               segdesc_t ldt_temp = SEG_SYS(STS_LDT, (uint32_t)ldt, LDT_SIZE, 3);
+               my_gdt[GD_LDT >> 3] = ldt_temp;
+               asm volatile("lldt %%ax" :: "a"(GD_LDT));
+       }
 
        /* In case they are enabled elsewhere.  We can't take an interrupt in these
         * routines, due to how they play with the kernel stack pointer. */
@@ -74,7 +79,6 @@ void env_pop_tf(trapframe_t *tf)
                              "addl $0x10,%%esp;        "
                              "popfl;                   "
                              "movl %%ebp,%%ecx;        "
-                             "movl %%esi,%%edx;        "
                              "popl %%esp;              "
                              "sti;                     "
                              "sysexit                  "
@@ -93,7 +97,7 @@ int env_user_mem_walk(env_t* e, void* start, size_t len,
        uint32_t pdeno, pteno;
        physaddr_t pa;
 
-       assert((intptr_t)start % PGSIZE == 0 && len % PGSIZE == 0);
+       assert((uintptr_t)start % PGSIZE == 0 && len % PGSIZE == 0);
        void* end = (char*)start+len;
        uint32_t pdeno_start = PDX(start);
        uint32_t pdeno_end = PDX(ROUNDUP(end,PTSIZE));
@@ -113,7 +117,7 @@ int env_user_mem_walk(env_t* e, void* start, size_t len,
                                      PTX(end) : NPTENTRIES );
                int ret;
                for (pteno = pteno_start; pteno < pteno_end; pteno++) {
-                       if (pt[pteno] & PTE_P)
+                       if (!PAGE_UNMAPPED(pt[pteno]))
                                if((ret = callback(e, &pt[pteno], PGADDR(pdeno, pteno, 0), arg)))
                                        return ret;
                }