Przeglądaj źródła

[LibOS] Preserve rflags register on syscalldb()

Linux system calls preserve rflags; LibOS must do the same.
This commit adds rflags to shim_regs and saves/restores it
on syscalldb() entry/exit.
Isaku Yamahata 5 lat temu
rodzic
commit
783304de6a

+ 1 - 0
LibOS/shim/include/shim_tls.h

@@ -37,6 +37,7 @@ struct shim_regs {
     unsigned long           rdi;
     unsigned long           rbx;
     unsigned long           rbp;
+    unsigned long           rflags;
 };
 
 struct shim_context {

+ 1 - 0
LibOS/shim/src/bookkeep/shim_signal.c

@@ -117,6 +117,7 @@ void __store_context (shim_tcb_t * tcb, PAL_CONTEXT * pal_context,
 
         if (ct->regs) {
             struct shim_regs * regs = ct->regs;
+            context->uc_mcontext.gregs[REG_EFL] = regs->rflags;
             context->uc_mcontext.gregs[REG_R15] = regs->r15;
             context->uc_mcontext.gregs[REG_R14] = regs->r14;
             context->uc_mcontext.gregs[REG_R13] = regs->r13;

+ 1 - 0
LibOS/shim/src/shim_checkpoint.c

@@ -1289,6 +1289,7 @@ void restore_context (struct shim_context * context)
                      "popq %%rdi\r\n"
                      "popq %%rbx\r\n"
                      "popq %%rbp\r\n"
+                     "popfq\r\n"
                      "popq %%rsp\r\n"
                      "movq $0, %%rax\r\n"
                      "jmp *-128-8(%%rsp)\r\n"

+ 4 - 2
LibOS/shim/src/syscallas.S

@@ -34,6 +34,7 @@ syscalldb:
         .cfi_startproc
 
         # Create shim_regs struct on the stack.
+        pushfq
         pushq %rbp
         pushq %rbx
         pushq %rdi
@@ -52,8 +53,8 @@ syscalldb:
 
         movq %rsp, %rbp
         .cfi_def_cfa_offset SHIM_REGS_SIZE+8  # +8 for ret_addr
-        .cfi_offset 6,-16        # saved_rbp is at CFA-16 (ret + saved_rbp)
-        .cfi_def_cfa_register 6  # %rbp
+        .cfi_offset %rbp, -3 * 8    # saved_rbp is at CFA-24 (ret + saved_rflags + saved_rbp)
+        .cfi_def_cfa_register %rbp  # %rbp
 
         cmp $LIBOS_SYSCALL_BOUND, %rax
         jae isundef
@@ -97,6 +98,7 @@ ret:
         popq %rdi
         popq %rbx
         popq %rbp
+        popfq
         retq
 
 isundef: