push/pop r15 when entering/leaving kernel space (fix for bug #53: r15 wasn't propagated during fork())

This commit is contained in:
Balazs Gerofi bgerofi@riken.jp
2014-07-10 13:53:12 +09:00
parent 36cff84e05
commit 31a605f94b
2 changed files with 8 additions and 6 deletions

View File

@ -136,7 +136,7 @@ struct tss64 {
} __attribute__((packed)); } __attribute__((packed));
struct x86_regs { struct x86_regs {
unsigned long r11, r10, r9, r8; unsigned long r15, r11, r10, r9, r8;
unsigned long rdi, rsi, rdx, rcx, rbx, rax, rbp; 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

@ -35,8 +35,10 @@
pushq %r8; \ pushq %r8; \
pushq %r9; \ pushq %r9; \
pushq %r10; \ pushq %r10; \
pushq %r11; pushq %r11; \
pushq %r15;
#define POP_ALL_REGS \ #define POP_ALL_REGS \
popq %r15; \
popq %r11; \ popq %r11; \
popq %r10; \ popq %r10; \
popq %r9; \ popq %r9; \
@ -67,7 +69,7 @@ vector=vector+1
common_interrupt: common_interrupt:
PUSH_ALL_REGS PUSH_ALL_REGS
movq 88(%rsp), %rdi movq 96(%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
@ -83,7 +85,7 @@ page_fault:
cld cld
PUSH_ALL_REGS PUSH_ALL_REGS
movq %cr2, %rdi movq %cr2, %rdi
movq 88(%rsp),%rsi movq 96(%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
@ -120,13 +122,13 @@ x86_syscall:
movq %gs:24, %rcx movq %gs:24, %rcx
movq %rcx, 32(%rsp) movq %rcx, 32(%rsp)
PUSH_ALL_REGS PUSH_ALL_REGS
movq 72(%rsp), %rdi movq 80(%rsp), %rdi
movw %ss, %ax movw %ss, %ax
movw %ax, %ds movw %ax, %ds
movq %rsp, %rsi movq %rsp, %rsi
callq *__x86_syscall_handler(%rip) callq *__x86_syscall_handler(%rip)
1: 1:
movq %rax, 72(%rsp) movq %rax, 80(%rsp)
POP_ALL_REGS POP_ALL_REGS
#ifdef USE_SYSRET #ifdef USE_SYSRET
movq 8(%rsp), %rcx movq 8(%rsp), %rcx