PERFORCE change 31118 for review

Peter Wemm peter at FreeBSD.org
Tue May 13 20:18:38 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=31118

Change 31118 by peter at peter_hammer on 2003/05/13 20:17:52

	Move int0x80 handler into the i386 emulator support code.
	
	Note, if you have any old-style binaries that use int $0x80
	still, it would be a really good thing to recompile them
	before booting this kernel.

Affected files ...

.. //depot/projects/hammer/sys/amd64/amd64/exception.S#12 edit
.. //depot/projects/hammer/sys/amd64/amd64/machdep.c#32 edit
.. //depot/projects/hammer/sys/amd64/amd64/trap.c#15 edit
.. //depot/projects/hammer/sys/amd64/ia32/ia32_exception.S#1 add
.. //depot/projects/hammer/sys/amd64/ia32/ia32_syscall.c#1 add
.. //depot/projects/hammer/sys/conf/files.amd64#12 edit

Differences ...

==== //depot/projects/hammer/sys/amd64/amd64/exception.S#12 (text+ko) ====

@@ -218,40 +218,6 @@
 	jmp	alltraps_pushregs_no_rdi
 
 /*
- * Call gate entry for FreeBSD ELF and Linux/NetBSD syscall (int 0x80)
- *
- * This is a SDT_SYSIDT entry point (unlike the i386 port) so that we
- * can do a swapgs before enabling interrupts.  This is critical because
- * if we took an interrupt before swapgs, the interrupt code would see
- * that it originated in supervisor mode and skip the swapgs.
- */
-	SUPERALIGN_TEXT
-IDTVEC(int0x80_syscall)
-	swapgs
-	sti
-	pushq	$2			/* sizeof "int 0x80" */
-	subq	$TF_ERR,%rsp		/* skip over tf_trapno */
-	movq	%rdi,TF_RDI(%rsp)
-	movq	%rsi,TF_RSI(%rsp)
-	movq	%rdx,TF_RDX(%rsp)
-	movq	%rcx,TF_RCX(%rsp)
-	movq	%r8,TF_R8(%rsp)
-	movq	%r9,TF_R9(%rsp)
-	movq	%rax,TF_RAX(%rsp)
-	movq	%rbx,TF_RBX(%rsp)
-	movq	%rbp,TF_RBP(%rsp)
-	movq	%r10,TF_R10(%rsp)
-	movq	%r11,TF_R11(%rsp)
-	movq	%r12,TF_R12(%rsp)
-	movq	%r13,TF_R13(%rsp)
-	movq	%r14,TF_R14(%rsp)
-	movq	%r15,TF_R15(%rsp)
-	FAKE_MCOUNT(13*4(%rsp))
-	call	ia32_syscall
-	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.
@@ -353,6 +319,7 @@
  */
 	.text
 	SUPERALIGN_TEXT
+	.globl	doreti
 	.type	doreti, at function
 doreti:
 	FAKE_MCOUNT(bintr)		/* init "from" bintr -> doreti */

==== //depot/projects/hammer/sys/amd64/amd64/machdep.c#32 (text+ko) ====

@@ -683,7 +683,7 @@
 	IDTVEC(bnd), IDTVEC(ill), IDTVEC(dna), IDTVEC(fpusegm),
 	IDTVEC(tss), IDTVEC(missing), IDTVEC(stk), IDTVEC(prot),
 	IDTVEC(page), IDTVEC(mchk), IDTVEC(rsvd), IDTVEC(fpu), IDTVEC(align),
-	IDTVEC(xmm), IDTVEC(dblfault), IDTVEC(int0x80_syscall),
+	IDTVEC(xmm), IDTVEC(dblfault),
 	IDTVEC(fast_syscall), IDTVEC(fast_syscall32);
 
 void
@@ -1254,7 +1254,6 @@
 	setidt(17, &IDTVEC(align), SDT_SYSIGT, SEL_KPL, 0);
 	setidt(18, &IDTVEC(mchk),  SDT_SYSIGT, SEL_KPL, 0);
 	setidt(19, &IDTVEC(xmm), SDT_SYSIGT, SEL_KPL, 0);
- 	setidt(0x80, &IDTVEC(int0x80_syscall), SDT_SYSIGT, SEL_UPL, 0);
 
 	r_idt.rd_limit = sizeof(idt0) - 1;
 	r_idt.rd_base = (long) idt;

==== //depot/projects/hammer/sys/amd64/amd64/trap.c#15 (text+ko) ====

@@ -817,174 +817,3 @@
 	mtx_assert(&sched_lock, MA_NOTOWNED);
 	mtx_assert(&Giant, MA_NOTOWNED);
 }
-
-void ia32_syscall(struct trapframe frame);
-void
-ia32_syscall(struct trapframe frame)
-{
-	caddr_t params;
-	int i;
-	struct sysent *callp;
-	struct thread *td = curthread;
-	struct proc *p = td->td_proc;
-	register_t orig_tf_rflags;
-	u_int sticks;
-	int error;
-	int narg;
-	u_int32_t args[8];
-	u_int64_t args64[8];
-	u_int code;
-
-	/*
-	 * note: PCPU_LAZY_INC() can only be used if we can afford
-	 * occassional inaccuracy in the count.
-	 */
-	cnt.v_syscall++;
-
-	sticks = td->td_sticks;
-	td->td_frame = &frame;
-	if (td->td_ucred != p->p_ucred) 
-		cred_update_thread(td);
-	params = (caddr_t)frame.tf_rsp + sizeof(u_int32_t);
-	code = frame.tf_rax;
-	orig_tf_rflags = frame.tf_rflags;
-
-	if (p->p_sysent->sv_prepsyscall) {
-		/*
-		 * The prep code is MP aware.
-		 */
-		(*p->p_sysent->sv_prepsyscall)(&frame, args, &code, &params);
-	} else {
-		/*
-		 * Need to check if this is a 32 bit or 64 bit syscall.
-		 * fuword is MP aware.
-		 */
-		if (code == SYS_syscall) {
-			/*
-			 * Code is first argument, followed by actual args.
-			 */
-			code = fuword32(params);
-			params += sizeof(int);
-		} else if (code == SYS___syscall) {
-			/*
-			 * Like syscall, but code is a quad, so as to maintain
-			 * quad alignment for the rest of the arguments.
-			 * We use a 32-bit fetch in case params is not
-			 * aligned.
-			 */
-			code = fuword32(params);
-			params += sizeof(quad_t);
-		}
-	}
-
- 	if (p->p_sysent->sv_mask)
- 		code &= p->p_sysent->sv_mask;
-
- 	if (code >= p->p_sysent->sv_size)
- 		callp = &p->p_sysent->sv_table[0];
-  	else
- 		callp = &p->p_sysent->sv_table[code];
-
-	narg = callp->sy_narg & SYF_ARGMASK;
-
-	/*
-	 * copyin and the ktrsyscall()/ktrsysret() code is MP-aware
-	 */
-	if (params != NULL && narg != 0)
-		error = copyin(params, (caddr_t)args,
-		    (u_int)(narg * sizeof(int)));
-	else
-		error = 0;
-
-	for (i = 0; i < narg; i++)
-		args64[i] = args[i];
-
-#ifdef KTRACE
-	if (KTRPOINT(td, KTR_SYSCALL))
-		ktrsyscall(code, narg, args64);
-#endif
-	/*
-	 * Try to run the syscall without Giant if the syscall
-	 * is MP safe.
-	 */
-	if ((callp->sy_narg & SYF_MPSAFE) == 0)
-		mtx_lock(&Giant);
-
-	if (error == 0) {
-		td->td_retval[0] = 0;
-		td->td_retval[1] = frame.tf_rdx;
-
-		STOPEVENT(p, S_SCE, narg);
-
-		error = (*callp->sy_call)(td, args64);
-	}
-
-	switch (error) {
-	case 0:
-		frame.tf_rax = td->td_retval[0];
-		frame.tf_rdx = td->td_retval[1];
-		frame.tf_rflags &= ~PSL_C;
-		break;
-
-	case ERESTART:
-		/*
-		 * Reconstruct pc, assuming lcall $X,y is 7 bytes,
-		 * int 0x80 is 2 bytes. We saved this in tf_err.
-		 */
-		frame.tf_rip -= frame.tf_err;
-		break;
-
-	case EJUSTRETURN:
-		break;
-
-	default:
- 		if (p->p_sysent->sv_errsize) {
- 			if (error >= p->p_sysent->sv_errsize)
-  				error = -1;	/* XXX */
-   			else
-  				error = p->p_sysent->sv_errtbl[error];
-		}
-		frame.tf_rax = error;
-		frame.tf_rflags |= PSL_C;
-		break;
-	}
-
-	/*
-	 * Release Giant if we previously set it.
-	 */
-	if ((callp->sy_narg & SYF_MPSAFE) == 0)
-		mtx_unlock(&Giant);
-
-	/*
-	 * Traced syscall.
-	 */
-	if (orig_tf_rflags & PSL_T) {
-		frame.tf_rflags &= ~PSL_T;
-		trapsignal(td, SIGTRAP, 0);
-	}
-
-	/*
-	 * Handle reschedule and other end-of-syscall issues
-	 */
-	userret(td, &frame, sticks);
-
-#ifdef KTRACE
-	if (KTRPOINT(td, KTR_SYSRET))
-		ktrsysret(code, error, td->td_retval[0]);
-#endif
-
-	/*
-	 * This works because errno is findable through the
-	 * register set.  If we ever support an emulation where this
-	 * is not the case, this code will need to be revisited.
-	 */
-	STOPEVENT(p, S_SCX, code);
-
-#ifdef DIAGNOSTIC
-	cred_free_thread(td);
-#endif
-	WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
-	    (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
-	mtx_assert(&sched_lock, MA_NOTOWNED);
-	mtx_assert(&Giant, MA_NOTOWNED);
-}

==== //depot/projects/hammer/sys/conf/files.amd64#12 (text+ko) ====

@@ -82,6 +82,8 @@
 amd64/ia32/ia32_sysvec.c	optional	ia32
 amd64/ia32/ia32_signal.c	optional	ia32
 amd64/ia32/ia32_sigtramp.S	optional	ia32
+amd64/ia32/ia32_exception.S	optional	ia32
+amd64/ia32/ia32_syscall.c	optional	ia32
 kern/imgact_elf32.c		optional	ia32
 
 # This file tells config what files go into building a kernel,


More information about the p4-projects mailing list