User trapframes can return from sysenter
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 11 Apr 2010 21:59:52 +0000 (14:59 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:42 +0000 (17:35 -0700)
Also properly handles eflags.

user/include/i686/hart.h
user/parlib/syscall.c

index f3e3457..b54fc84 100644 (file)
  * running. */
 static inline void pop_ros_tf(struct user_trapframe *tf, bool *notif_en_loc)
 {
+       if (!tf->tf_cs) { /* sysenter TF.  esp and eip are in other regs. */
+               tf->tf_esp = tf->tf_regs.reg_ebp;
+               tf->tf_eip = tf->tf_regs.reg_edx;
+       }
        asm volatile ("movl %2,-4(%1);          " /* push the PC */
                      "movl %3,-12(%1);         " /* leave room for eax, push loc */
                      "movl %0,%%esp;           " /* pop the real tf */
                      "popal;                   "
-                     "addl $0x24,%%esp;        " /* move to the %esp in the tf */
+                     "addl $0x20,%%esp;        " /* move to the eflags in the tf */
+                     "popfl;                   " /* restore eflags */
                      "popl %%esp;              " /* change to the new %esp */
                      "subl $0x4,%%esp;         " /* move esp to the slot for eax */
                      "pushl %%eax;             " /* save eax, will clobber soon */
index af9d8a1..ecc7bed 100644 (file)
@@ -91,11 +91,7 @@ ssize_t sys_eth_read(void* buf, size_t len)
 /* Request resources from the kernel.  Flags in ros/resource.h. */
 ssize_t sys_resource_req(int type, size_t amt_max, size_t amt_min, uint32_t flags)
 {
-#ifdef __i386__
-       return syscall_trap(SYS_resource_req, type, amt_max, amt_min, flags, 0);
-#else
        return ros_syscall(SYS_resource_req, type, amt_max, amt_min, flags, 0);
-#endif
 }
 
 void sys_reboot()