diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | i386/i386/proc_reg.h | 12 |
2 files changed, 13 insertions, 6 deletions
@@ -1,3 +1,10 @@ +2008-11-23 Samuel Thibault <samuel.thibault@ens-lyon.org> + + * i386/i386/proc_reg.h (get_cr0, get_cr2, get_cr3, get_cr4, get_tr, + get_ldt): Add volatile qualifier to asm statement to prevent gcc from + optimizing it away since there seems to be no way to clobber these + properly in the set_* macros. + 2008-11-17 Thomas Schwinge <tschwinge@gnu.org> * Makefile.am (install_sh, INSTALL): Point to `build-aux/install-sh'. diff --git a/i386/i386/proc_reg.h b/i386/i386/proc_reg.h index 448b645..7ccc2aa 100644 --- a/i386/i386/proc_reg.h +++ b/i386/i386/proc_reg.h @@ -102,7 +102,7 @@ set_eflags(unsigned eflags) #define get_cr0() \ ({ \ register unsigned int _temp__; \ - asm("mov %%cr0, %0" : "=r" (_temp__)); \ + asm volatile("mov %%cr0, %0" : "=r" (_temp__)); \ _temp__; \ }) @@ -115,14 +115,14 @@ set_eflags(unsigned eflags) #define get_cr2() \ ({ \ register unsigned int _temp__; \ - asm("mov %%cr2, %0" : "=r" (_temp__)); \ + asm volatile("mov %%cr2, %0" : "=r" (_temp__)); \ _temp__; \ }) #define get_cr3() \ ({ \ register unsigned int _temp__; \ - asm("mov %%cr3, %0" : "=r" (_temp__)); \ + asm volatile("mov %%cr3, %0" : "=r" (_temp__)); \ _temp__; \ }) @@ -137,7 +137,7 @@ set_eflags(unsigned eflags) #define get_cr4() \ ({ \ register unsigned int _temp__; \ - asm("mov %%cr4, %0" : "=r" (_temp__)); \ + asm volatile("mov %%cr4, %0" : "=r" (_temp__)); \ _temp__; \ }) @@ -157,7 +157,7 @@ set_eflags(unsigned eflags) #define get_tr() \ ({ \ unsigned short _seg__; \ - asm("str %0" : "=rm" (_seg__) ); \ + asm volatile("str %0" : "=rm" (_seg__) ); \ _seg__; \ }) @@ -167,7 +167,7 @@ set_eflags(unsigned eflags) #define get_ldt() \ ({ \ unsigned short _seg__; \ - asm("sldt %0" : "=rm" (_seg__) ); \ + asm volatile("sldt %0" : "=rm" (_seg__) ); \ _seg__; \ }) |