summaryrefslogtreecommitdiff
path: root/sys/arch/amd64
diff options
context:
space:
mode:
authorPhilip Guenther <guenther@cvs.openbsd.org>2018-09-12 06:13:00 +0000
committerPhilip Guenther <guenther@cvs.openbsd.org>2018-09-12 06:13:00 +0000
commitae6677840e4ac8fe2d0ed6d658e6f74141bf5220 (patch)
treef8851d99873ffe64074c1454d2e8ac673cf662e4 /sys/arch/amd64
parent83942f081d5efe5b6e55bcf4d891645c7df2d13b (diff)
Now that the pmap is more paranoid about some shootdowns (pmap.c rev 1.119),
avoid some TLB flushes by not reloading %cr3 when the value isn't changing. original diff by and ok mlarkin@
Diffstat (limited to 'sys/arch/amd64')
-rw-r--r--sys/arch/amd64/amd64/locore.S10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/arch/amd64/amd64/locore.S b/sys/arch/amd64/amd64/locore.S
index ecc9eedc05d..a205e681012 100644
--- a/sys/arch/amd64/amd64/locore.S
+++ b/sys/arch/amd64/amd64/locore.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.S,v 1.108 2018/09/09 22:09:36 guenther Exp $ */
+/* $OpenBSD: locore.S,v 1.109 2018/09/12 06:12:59 guenther Exp $ */
/* $NetBSD: locore.S,v 1.13 2004/03/25 18:33:17 drochner Exp $ */
/*
@@ -445,9 +445,15 @@ restore_saved:
/* Stack pivot done, setup RETGUARD */
RETGUARD_SETUP_OFF(cpu_switchto, r11, 6*8)
- movq PCB_CR3(%r13),%rax
+ /* don't switch cr3 to the same thing it already was */
+ movq %cr3,%rax
+ cmpq PCB_CR3(%r13),%rax
+ movq PCB_CR3(%r13),%rax /* flags from cmpq unchanged */
+ jz .Lsame_cr3
+
movq %rax,%cr3 /* %rax used below too */
+.Lsame_cr3:
/*
* If we switched from a userland thread with a shallow call stack
* (e.g interrupt->ast->mi_ast->prempt->mi_switch->cpu_switchto)