Module Name: src
Committed By: rmind
Date: Mon Apr 26 17:06:21 UTC 2010
Modified Files:
src/sys/arch/amd64/amd64 [rmind-uvmplock]: vector.S
src/sys/arch/i386/i386 [rmind-uvmplock]: vector.S
Log Message:
Slight simplification to TLB shootdown handler on i386 and amd64.
To generate a diff of this commit:
cvs rdiff -u -r1.33.2.1 -r1.33.2.2 src/sys/arch/amd64/amd64/vector.S
cvs rdiff -u -r1.53.2.1 -r1.53.2.2 src/sys/arch/i386/i386/vector.S
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/vector.S
diff -u src/sys/arch/amd64/amd64/vector.S:1.33.2.1 src/sys/arch/amd64/amd64/vector.S:1.33.2.2
--- src/sys/arch/amd64/amd64/vector.S:1.33.2.1 Mon Apr 26 04:48:49 2010
+++ src/sys/arch/amd64/amd64/vector.S Mon Apr 26 17:06:21 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: vector.S,v 1.33.2.1 2010/04/26 04:48:49 rmind Exp $ */
+/* $NetBSD: vector.S,v 1.33.2.2 2010/04/26 17:06:21 rmind Exp $ */
/*-
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -546,38 +546,32 @@
4:
iretq
5:
- /* Invalidate whole address space: */
- testw $PG_G, TP_PTE(%rbx)
- jnz 6f
/*
- * a) Invalidating user TLB entries only.
- *
- * - Get the emap generation number.
- * - Invalidate TLB entries.
- * - Perform emap update, pass the generation number.
- *
* Note that caller-save registers might be modified (all saved in the
- * beginning). Only %rbx value must be preserved for the 2b context.
+ * beginning). Only %rbx value must be preserved for the 2f context.
*/
+
+ /* Get the emap generation number. */
callq _C_LABEL(uvm_emap_gen_return)
movq %rax, %rdi
+
+ /* Which entries we are invalidating? */
+ testw $PG_G, TP_PTE(%rbx)
+ jnz 6f
+
+ /* a) Invalidating user TLB entries only. */
movq %cr3, %rax
movq %rax, %cr3
- callq _C_LABEL(uvm_emap_update)
- jmp 2b
+ jmp 7f
6:
- /*
- * b) Invalidating user and kernel TLB entries.
- *
- * See notes above.
- */
- callq _C_LABEL(uvm_emap_gen_return)
- movq %rax, %rdi
+ /* b) Invalidating user and kernel TLB entries. */
movq %cr4, %rax
movq %rax, %rdx
andq $~CR4_PGE, %rdx
movq %rdx, %cr4
movq %rax, %cr4
+7:
+ /* Perform emap update, pass the generation number. */
callq _C_LABEL(uvm_emap_update)
jmp 2b
Index: src/sys/arch/i386/i386/vector.S
diff -u src/sys/arch/i386/i386/vector.S:1.53.2.1 src/sys/arch/i386/i386/vector.S:1.53.2.2
--- src/sys/arch/i386/i386/vector.S:1.53.2.1 Mon Apr 26 02:43:34 2010
+++ src/sys/arch/i386/i386/vector.S Mon Apr 26 17:06:21 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: vector.S,v 1.53.2.1 2010/04/26 02:43:34 rmind Exp $ */
+/* $NetBSD: vector.S,v 1.53.2.2 2010/04/26 17:06:21 rmind Exp $ */
/*
* Copyright 2002 (c) Wasabi Systems, Inc.
@@ -65,7 +65,7 @@
*/
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.53.2.1 2010/04/26 02:43:34 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.53.2.2 2010/04/26 17:06:21 rmind Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -244,40 +244,32 @@
popl %eax
iret
4:
- /* Invalidate whole address space: */
- testw $PG_G, TP_PTE(%ebx)
- jnz 5f
/*
- * a) Invalidating user TLB entries only.
- *
- * - Get the emap generation number.
- * - Invalidate TLB entries.
- * - Perform emap update, pass the generation number.
- *
* Note that caller-save registers might be modified (all saved in the
* beginning). Only %ebx value must be preserved for the 2b context.
*/
+
+ /* Get the emap generation number. */
call _C_LABEL(uvm_emap_gen_return)
- movl %eax, %edx
+ movl %eax, %ecx
+
+ /* Which entries we are invalidating? */
+ testw $PG_G, TP_PTE(%ebx)
+ jnz 5f
+
+ /* a) Invalidating user TLB entries only. */
movl %cr3, %eax
movl %eax, %cr3
- pushl %edx
- call _C_LABEL(uvm_emap_update)
- addl $4, %esp
- jmp 2b
+ jmp 6f
5:
- /*
- * b) Invalidating user and kernel TLB entries.
- *
- * See notes above.
- */
- call _C_LABEL(uvm_emap_gen_return)
- movl %eax, %ecx
+ /* b) Invalidating user and kernel TLB entries. */
movl %cr4, %eax
movl %eax, %edx
andl $~CR4_PGE, %edx
movl %edx, %cr4
movl %eax, %cr4
+6:
+ /* Perform emap update, pass the generation number. */
pushl %ecx
call _C_LABEL(uvm_emap_update)
addl $4, %esp