Skip site navigation (1)Skip section navigation (2)
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>