Remove duplicated code for reading control registers
PATCH 1/1 Remove duplicated code for reading control registers
Tiny cleanup:
In x86_64, the same functions for reading cr3 and writing cr{3,4} are defined in tlbflush.h and system.h, whith just a name change. The only difference is the clobbering of memory, which seems a safe, and even needed change for the write_cr4. This patch removes the duplicate. write_cr3() is moved to system.h for consistency.
Signature · 3 lines
Glauber de Oliveira Costa Red Hat Inc. "Free as in Freedom"
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 4 lines · Randy.Dunlap
Quoted 2 lines · Glauber de Oliveira Costa
Tiny cleanup:
Quoted 8 lines
Quoted 5 lines
In
x86_64, the same functions for reading cr3 and writing cr{3,4} are defined intlbflush.handsystem.h, whith just a name change. The only difference is the clobbering of memory, which seems a safe, and even needed change for thewrite_cr4. This patch removes the duplicate.write_cr3()is moved tosystem.hfor consistency.missing patch.....
thanks. Attached now
Signature · 3 lines
Glauber de Oliveira Costa Red Hat Inc. "Free as in Freedom"
---
include/asm-x86_64/system.h | 7 ++++++- include/asm-x86_64/tlbflush.h | 33 +++++---------------------------- 2 files changed, 11 insertions(+), 29 deletions(-)
2d19cf472903fa4c9e763301b7b1cc0fa53bd023
include/asm-x86_64/system.h +6 -1
@@ -89,6 +89,11 @@ static inline unsigned long read_cr3(voireturn cr3; } +static inline void write_cr3 (unsigned long val) +{ + asmvolatile ("movq %0,%%cr3" ::"r" (val) :"memory" ); +} +static inline unsigned long read_cr4 (void ) {unsigned long cr4;
@@ -98,7 +103,7 @@ static inline unsigned long read_cr4(voistatic inline void write_cr4 (unsigned long val) { - asmvolatile ("movq %0,%%cr4" ::"r" (val)); + asmvolatile ("movq %0,%%cr4" ::"r" (val) :"memory" ); }#define stts () write_cr0(8 | read_cr0())
include/asm-x86_64/tlbflush.h +5 -28
@@ -3,41 +3,18 @@#include <linux/mm.h> #include <asm/processor.h> - -static inline unsigned long get_cr3 (void ) -{ -unsigned long cr3; - asmvolatile ("mov %%cr3,%0" :"=r" (cr3)); -return cr3; -} - -static inline void set_cr3 (unsigned long cr3) -{ - asmvolatile ("mov %0,%%cr3" ::"r" (cr3) :"memory" ); -} +#include <asm/system.h> static inline void __flush_tlb (void ) { -set_cr3 (get_cr3 ()); -} - -static inline unsigned long get_cr4 (void ) -{ -unsigned long cr4; - asmvolatile ("mov %%cr4,%0" :"=r" (cr4)); -return cr4; -} - -static inline void set_cr4 (unsigned long cr4) -{ - asmvolatile ("mov %0,%%cr4" ::"r" (cr4) :"memory" ); +write_cr3 (read_cr3 ()); }static inline void __flush_tlb_all (void ) { -unsigned long cr4 =get_cr4 (); -set_cr4 (cr4 & ~X86_CR4_PGE );/* clear PGE */ -set_cr4 (cr4);/* write old PGE again and flush TLBs */ +unsigned long cr4 =read_cr4 (); +write_cr4 (cr4 & ~X86_CR4_PGE );/* clear PGE */ +write_cr4 (cr4);/* write old PGE again and flush TLBs */ }#define __flush_tlb_one (addr) \
Signature · 1 line
1.1.3