save/restore rbp when entering/leaving kernel (required for fork() in glibc)

This commit is contained in:
Balazs Gerofi bgerofi@riken.jp
2014-04-02 14:02:20 +09:00
parent b01b31f04d
commit 3ce94072b4
2 changed files with 9 additions and 4 deletions

View File

@@ -137,7 +137,7 @@ struct tss64 {
struct x86_regs { struct x86_regs {
unsigned long r11, r10, r9, r8; unsigned long r11, r10, r9, r8;
unsigned long rdi, rsi, rdx, rcx, rbx, rax; unsigned long rdi, rsi, rdx, rcx, rbx, rax, rbp;
unsigned long error, rip, cs, rflags, rsp, ss; unsigned long error, rip, cs, rflags, rsp, ss;
}; };

View File

@@ -8,6 +8,9 @@
*/ */
/* /*
* HISTORY * HISTORY
*
* 2014/04 - bgerofi: save/restore rbp when entering/leaving kernel (for glibc)
* 2013/?? - bgerofi + shimosawa: handle rsp correctly for nested interrupts
*/ */
#define X86_CPU_LOCAL_OFFSET_TSS 128 #define X86_CPU_LOCAL_OFFSET_TSS 128
@@ -22,6 +25,7 @@
#define USER_DS (56 + 3) #define USER_DS (56 + 3)
#define PUSH_ALL_REGS \ #define PUSH_ALL_REGS \
pushq %rbp; \
pushq %rax; \ pushq %rax; \
pushq %rbx; \ pushq %rbx; \
pushq %rcx; \ pushq %rcx; \
@@ -42,7 +46,8 @@
popq %rdx; \ popq %rdx; \
popq %rcx; \ popq %rcx; \
popq %rbx; \ popq %rbx; \
popq %rax popq %rax; \
popq %rbp
.data .data
.globl generic_common_handlers .globl generic_common_handlers
@@ -62,7 +67,7 @@ vector=vector+1
common_interrupt: common_interrupt:
PUSH_ALL_REGS PUSH_ALL_REGS
movq 80(%rsp), %rdi movq 88(%rsp), %rdi
movq %rsp, %rsi movq %rsp, %rsi
call handle_interrupt /* Enter C code */ call handle_interrupt /* Enter C code */
POP_ALL_REGS POP_ALL_REGS
@@ -78,7 +83,7 @@ page_fault:
cld cld
PUSH_ALL_REGS PUSH_ALL_REGS
movq %cr2, %rdi movq %cr2, %rdi
movq 80(%rsp),%rsi movq 88(%rsp),%rsi
movq %rsp,%rdx movq %rsp,%rdx
movq __page_fault_handler_address(%rip), %rax movq __page_fault_handler_address(%rip), %rax
andq %rax, %rax andq %rax, %rax