Module Name:    src
Committed By:   maxv
Date:           Sat Oct 21 08:08:26 UTC 2017

Modified Files:
        src/sys/arch/amd64/amd64: locore.S trap.c

Log Message:
Use labels instead of disassembling *(%rip). intrfastexit is now the
only place where the segregs can fault.


To generate a diff of this commit:
cvs rdiff -u -r1.137 -r1.138 src/sys/arch/amd64/amd64/locore.S
cvs rdiff -u -r1.103 -r1.104 src/sys/arch/amd64/amd64/trap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.137 src/sys/arch/amd64/amd64/locore.S:1.138
--- src/sys/arch/amd64/amd64/locore.S:1.137	Sat Oct 21 06:55:54 2017
+++ src/sys/arch/amd64/amd64/locore.S	Sat Oct 21 08:08:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.137 2017/10/21 06:55:54 maxv Exp $	*/
+/*	$NetBSD: locore.S,v 1.138 2017/10/21 08:08:26 maxv Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -330,6 +330,10 @@
 	.globl	_C_LABEL(biosextmem)
 	.globl	_C_LABEL(lwp0uarea)
 	.globl	do_sysret
+	.globl	do_mov_es
+	.globl	do_mov_ds
+	.globl	do_mov_fs
+	.globl	do_mov_gs
 	.globl	do_iret
 
 	.type	_C_LABEL(tablesize), @object
@@ -1196,7 +1200,7 @@ lwp_32bit:
 	movq	PCB_GS(%r14),%rax
 	movq	%rax,(GUGS_SEL*8)(%rcx)
 
-	/* Set default 32bit values in %ds, %es, %fs and %gs. */
+	/* Set default 32bit values in %ds, %es and %fs. %gs is special. */
 	movq	L_MD_REGS(%r12),%rbx
 	movq	$GSEL(GUDATA32_SEL, SEL_UPL),%rax
 	movw	%ax,%ds
@@ -1482,11 +1486,15 @@ ENTRY(intrfastexit)
 
 .Luexit32:
 	NOT_XEN(cli;)
+do_mov_es:
 	movw	TF_ES(%rsp),%es
+do_mov_ds:
 	movw	TF_DS(%rsp),%ds
+do_mov_fs:
 	movw	TF_FS(%rsp),%fs
 	SWAPGS
 #ifndef XEN
+do_mov_gs:
 	movw	TF_GS(%rsp),%gs
 #endif
 	jmp	.Lkexit

Index: src/sys/arch/amd64/amd64/trap.c
diff -u src/sys/arch/amd64/amd64/trap.c:1.103 src/sys/arch/amd64/amd64/trap.c:1.104
--- src/sys/arch/amd64/amd64/trap.c:1.103	Sat Oct 21 07:23:22 2017
+++ src/sys/arch/amd64/amd64/trap.c	Sat Oct 21 08:08:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.103 2017/10/21 07:23:22 maxv Exp $	*/
+/*	$NetBSD: trap.c,v 1.104 2017/10/21 08:08:26 maxv Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000, 2017 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.103 2017/10/21 07:23:22 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.104 2017/10/21 08:08:26 maxv Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -236,6 +236,8 @@ static void trap_user_kernelmode(struct 
 static void
 trap_user_kernelmode(struct trapframe *frame, int type, lwp_t *l, proc_t *p)
 {
+	extern uint64_t do_mov_es, do_mov_ds, do_mov_fs, do_mov_gs;
+	extern uint64_t do_iret;
 	struct trapframe *vframe;
 	ksiginfo_t ksi;
 
@@ -260,8 +262,7 @@ trap_user_kernelmode(struct trapframe *f
 	 */
 	vframe = (void *)frame->tf_rsp;
 
-	switch (*(uint16_t *)frame->tf_rip) {
-	case 0xcf48:	/* iretq */
+	if (frame->tf_rip == (uint64_t)&do_iret) {
 		/*
 		 * The 'iretq' instruction faulted, so we have the
 		 * 'user' registers saved after the kernel
@@ -277,12 +278,10 @@ trap_user_kernelmode(struct trapframe *f
 		memmove(vframe, frame, offsetof(struct trapframe, tf_rip));
 		/* Set the faulting address to the user %rip */
 		ksi.ksi_addr = (void *)vframe->tf_rip;
-		break;
-
-	case 0x848e:	/* mov 0xa8(%rsp),%es (8e 84 24 a8 00 00 00) */
-	case 0x9c8e:	/* mov 0xb0(%rsp),%ds (8e 9c 24 b0 00 00 00) */
-	case 0xa48e:	/* mov 0xa0(%rsp),%fs (8e a4 24 a0 00 00 00) */
-	case 0xac8e:	/* mov 0x98(%rsp),%gs (8e ac 24 98 00 00 00) */
+	} else if (frame->tf_rip == (uint64_t)&do_mov_es ||
+	    frame->tf_rip == (uint64_t)&do_mov_ds ||
+	    frame->tf_rip == (uint64_t)&do_mov_fs ||
+	    frame->tf_rip == (uint64_t)&do_mov_gs) {
 		/*
 		 * We faulted loading one of the user segment registers.
 		 * The stack frame containing the user registers is
@@ -291,9 +290,7 @@ trap_user_kernelmode(struct trapframe *f
 		if (KERNELMODE(vframe->tf_cs))
 			return;
 		/* There is no valid address for the fault */
-		break;
-
-	default:
+	} else {
 		return;
 	}
 

Reply via email to