summaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2008-11-27 01:37:52 +0000
committerThomas Schwinge <tschwinge@gnu.org>2009-06-18 00:27:21 +0200
commit56ff60294ba81457e453b688cbec314f92f0fff3 (patch)
treee725ae7becf113b18952e5c6e7d1f3bbef59dbb6 /i386
parenta2432a9b39b470aace2210f9cc4fb790df9c8702 (diff)
2008-11-27 Samuel Thibault <samuel.thibault@ens-lyon.org>
* i386/i386/proc_reg.h (invlpg): New macro. * i386/intel/pmap.c (INVALIDATE_TLB): If portion to be flushed is less than 32 pages, use calls to invlpg instead of flush_tlb.
Diffstat (limited to 'i386')
-rw-r--r--i386/i386/proc_reg.h5
-rw-r--r--i386/intel/pmap.c8
2 files changed, 12 insertions, 1 deletions
diff --git a/i386/i386/proc_reg.h b/i386/i386/proc_reg.h
index 7ccc2aa..368ea25 100644
--- a/i386/i386/proc_reg.h
+++ b/i386/i386/proc_reg.h
@@ -134,6 +134,11 @@ set_eflags(unsigned eflags)
#define flush_tlb() set_cr3(get_cr3())
+#define invlpg(addr) \
+ ({ \
+ asm volatile("invlpg (%0)" : : "r" (addr)); \
+ })
+
#define get_cr4() \
({ \
register unsigned int _temp__; \
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 697e5f8..02482ae 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -332,7 +332,13 @@ lock_data_t pmap_system_lock;
#define MAX_TBIS_SIZE 32 /* > this -> TBIA */ /* XXX */
#define INVALIDATE_TLB(s, e) { \
- flush_tlb(); \
+ if (((e) - (s)) > 32 * PAGE_SIZE) { \
+ flush_tlb(); \
+ } else { \
+ vm_offset_t i; \
+ for (i = s; i < e; i += PAGE_SIZE) \
+ invlpg(i); \
+ } \
}