version 1.55.2.2, 2010/08/17 06:43:51 |
version 1.55.2.3, 2010/10/22 07:20:57 |
Line 1085 IDTVEC(syscall) |
|
Line 1085 IDTVEC(syscall) |
|
pushq $(LSEL(LUDATA_SEL, SEL_UPL)) /* Known to be user ss */ |
pushq $(LSEL(LUDATA_SEL, SEL_UPL)) /* Known to be user ss */ |
pushq %r15 /* User space rsp */ |
pushq %r15 /* User space rsp */ |
movq CPUVAR(SCRATCH),%r15 |
movq CPUVAR(SCRATCH),%r15 |
sti |
|
subq $TF_REGSIZE+(TF_RSP-TF_TRAPNO),%rsp |
subq $TF_REGSIZE+(TF_RSP-TF_TRAPNO),%rsp |
|
movw %es,TF_ES(%rsp) |
|
sti |
INTR_SAVE_GPRS |
INTR_SAVE_GPRS |
movw %fs,TF_FS(%rsp) |
movw %fs,TF_FS(%rsp) |
movw %gs,TF_GS(%rsp) |
movw %gs,TF_GS(%rsp) |
movw %es,TF_ES(%rsp) |
|
movw $(LSEL(LUDATA_SEL, SEL_UPL)),TF_DS(%rsp) |
movw $(LSEL(LUDATA_SEL, SEL_UPL)),TF_DS(%rsp) |
movq %r11, TF_RFLAGS(%rsp) /* old rflags from syscall insn */ |
movq %r11, TF_RFLAGS(%rsp) /* old rflags from syscall insn */ |
movq $(LSEL(LUCODE_SEL, SEL_UPL)), TF_CS(%rsp) |
movq $(LSEL(LUCODE_SEL, SEL_UPL)), TF_CS(%rsp) |
Line 1128 IDTVEC(syscall) |
|
Line 1128 IDTVEC(syscall) |
|
jnz 9f |
jnz 9f |
testl $MDP_IRET, L_MD_FLAGS(%r14) |
testl $MDP_IRET, L_MD_FLAGS(%r14) |
jne iret_return; |
jne iret_return; |
syscall_return: |
|
#ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
cmpl $IPL_NONE,CPUVAR(ILEVEL) |
cmpl $IPL_NONE,CPUVAR(ILEVEL) |
jne 3f |
jne 3f |
Line 1172 syscall_return: |
|
Line 1171 syscall_return: |
|
call _C_LABEL(do_pmap_load) |
call _C_LABEL(do_pmap_load) |
jmp .Lsyscall_checkast /* re-check ASTs */ |
jmp .Lsyscall_checkast /* re-check ASTs */ |
10: |
10: |
/* Always returning to user mode here. */ |
|
CLEAR_ASTPENDING(%r14) |
CLEAR_ASTPENDING(%r14) |
STI(si) |
STI(si) |
/* Pushed T_ASTFLT into tf_trapno on entry. */ |
/* Pushed T_ASTFLT into tf_trapno on entry. */ |
Line 1260 _C_LABEL(osyscall_return): |
|
Line 1258 _C_LABEL(osyscall_return): |
|
.Losyscall_checkast: |
.Losyscall_checkast: |
/* Check for ASTs on exit to user mode. */ |
/* Check for ASTs on exit to user mode. */ |
CLI(si) |
CLI(si) |
CHECK_ASTPENDING(%r14) |
movl L_MD_ASTPENDING(%r14), %eax |
je 1f |
orl CPUVAR(WANT_PMAPLOAD), %eax |
/* Always returning to user mode here. */ |
|
CLEAR_ASTPENDING(%r14) |
|
STI(si) |
|
/* Pushed T_ASTFLT into tf_trapno on entry. */ |
|
movq %rsp,%rdi |
|
call _C_LABEL(trap) |
|
jmp .Losyscall_checkast |
|
1: CHECK_DEFERRED_SWITCH |
|
jnz 9f |
jnz 9f |
iret_return: |
iret_return: |
#ifndef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
INTRFASTEXIT |
|
#else /* DIAGNOSTIC */ |
|
cmpl $IPL_NONE,CPUVAR(ILEVEL) |
cmpl $IPL_NONE,CPUVAR(ILEVEL) |
jne 3f |
jne 3f |
|
#endif |
INTRFASTEXIT |
INTRFASTEXIT |
3: |
#ifdef DIAGNOSTIC |
STI(si) |
3: movabsq $4f, %rdi |
movabsq $4f, %rdi |
movl TF_RAX(%rsp),%esi |
|
movl TF_RDI(%rsp),%edx |
|
movl %ebx,%ecx |
|
movl CPUVAR(ILEVEL),%r8d |
xorq %rax,%rax |
xorq %rax,%rax |
call _C_LABEL(printf) |
call _C_LABEL(printf) |
movl $IPL_NONE,%edi |
movl $IPL_NONE,%edi |
call _C_LABEL(spllower) |
call _C_LABEL(spllower) |
jmp .Losyscall_checkast |
jmp .Losyscall_checkast |
4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n" |
4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL %d %d EXIT %x %x\n" |
#endif /* DIAGNOSTIC */ |
#endif |
9: STI(si) |
9: |
|
cmpl $0, CPUVAR(WANT_PMAPLOAD) |
|
jz 10f |
|
STI(si) |
call _C_LABEL(do_pmap_load) |
call _C_LABEL(do_pmap_load) |
jmp .Losyscall_checkast /* re-check ASTs */ |
jmp .Losyscall_checkast /* re-check ASTs */ |
|
10: |
|
CLEAR_ASTPENDING(%r14) |
|
STI(si) |
|
/* Pushed T_ASTFLT into tf_trapno on entry. */ |
|
movq %rsp,%rdi |
|
call _C_LABEL(trap) |
|
jmp .Losyscall_checkast /* re-check ASTs */ |
|
|
/* |
/* |
* void sse2_idlezero_page(void *pg) |
* void sse2_idlezero_page(void *pg) |