Date: Fri, 25 Apr 2003 14:12:41 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 29731 for review Message-ID: <200304252112.h3PLCfoN029953@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=29731 Change 29731 by peter@peter_daintree on 2003/04/25 14:12:33 Make some guesses about what fast_syscall could look like. It isn't enabled on the cpu yet though. This is still pretty rough, and the swapgs stuff is commented out since the PCPU stuff is commented out, hence it doesn't gain anything yet. Affected files ... .. //depot/projects/hammer/sys/x86_64/x86_64/exception.s#24 edit Differences ... ==== //depot/projects/hammer/sys/x86_64/x86_64/exception.s#24 (text+ko) ==== @@ -191,6 +191,68 @@ MEXITCOUNT jmp doreti +/* + * Fast syscall entry point. We enter here with just our new %cs/%ss set, + * and the new privilige level. We are still running on the old user stack + * pointer. We have to juggle a few things around to find our stack etc. + * swapgs gives us access to our PCPU space only. + * XXX The PCPU stuff is stubbed out right now... + */ +IDTVEC(fast_syscall) + #swapgs + movq %rsp,PCPU(SCRATCH_RSP) + movq common_tss+COMMON_TSS_RSP0,%rsp + sti + /* Now emulate a trapframe. Ugh. */ + subq $TF_SIZE,%rsp + movq $KUDSEL,TF_SS(%rsp) + /* defer TF_RSP till we have a spare register */ + movq %r11,TF_RFLAGS(%rsp) + movq $KUCSEL,TF_CS(%rsp) + movq %rcx,TF_RIP(%rsp) /* %rcx original value is in %r10 */ + movq $2,TF_ERR(%rsp) + movq %rdi,TF_RDI(%rsp) /* arg 1 */ + movq %rsi,TF_RSI(%rsp) /* arg 2 */ + movq %rdx,TF_RDX(%rsp) /* arg 3 */ + movq %r10,TF_RCX(%rsp) /* arg 4 */ + movq %r8,TF_R8(%rsp) /* arg 5 */ + movq %r9,TF_R9(%rsp) /* arg 6 */ + movq %rax,TF_RAX(%rsp) /* syscall number */ + movq %rbx,TF_RBX(%rsp) /* C preserved */ + movq %rbp,TF_RBP(%rsp) /* C preserved */ + movq %r12,TF_R12(%rsp) /* C preserved */ + movq %r13,TF_R13(%rsp) /* C preserved */ + movq %r14,TF_R14(%rsp) /* C preserved */ + movq %r15,TF_R15(%rsp) /* C preserved */ + movq PCPU(SCRATCH_RSP),%r12 /* %r12 already saved */ + movq %r12,TF_RSP(%rsp) /* user stack pointer */ + call syscall + /* simplified from doreti */ +1: /* Check for and handle AST's on return to userland */ + cli + movq PCPU(CURTHREAD),%rax + testl $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax) + je 2f + sti + movq %rsp, %rdi + call ast + jmp 1b +2: /* restore preserved registers */ + movq TF_RSP(%rsp),%rdi /* user stack pointer */ + movq TF_RAX(%rsp),%rax /* return value 1 */ + movq TF_RDX(%rsp),%rdx /* return value 2 */ + movq TF_RBX(%rsp),%rbx /* C preserved */ + movq TF_RBP(%rsp),%rbp /* C preserved */ + movq TF_R12(%rsp),%r12 /* C preserved */ + movq TF_R13(%rsp),%r13 /* C preserved */ + movq TF_R14(%rsp),%r14 /* C preserved */ + movq TF_R15(%rsp),%r15 /* C preserved */ + movq TF_R11(%rsp),%r11 /* original %rflags */ + movq TF_RIP(%rsp),%rcx /* original %rip */ + sti + #swapgs + sysret + ENTRY(fork_trampoline) movq %r12, %rdi /* function */ movq %rbx, %rsi /* arg1 */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304252112.h3PLCfoN029953>