From 71f6ba47b2141e263b2900a71f419183f6eca908 Mon Sep 17 00:00:00 2001 From: Zachary Amsden Date: Fri, 6 Jan 2006 00:11:50 -0800 Subject: [PATCH] --- yaml --- r: 16369 b: refs/heads/master c: ff6e8c0d5e47f0ceeebde86ec2f5919dbd5beb67 h: refs/heads/master i: 16367: 2d5e057e812be99caf664003b3650eafb580e8c4 v: v3 --- [refs] | 2 +- trunk/arch/i386/kernel/process.c | 4 +--- trunk/include/asm-i386/system.h | 13 +++++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index df25ef623aaa..7988ee53445c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: eb05c3249a8e8a675e79d221f4a0874dc10ec903 +refs/heads/master: ff6e8c0d5e47f0ceeebde86ec2f5919dbd5beb67 diff --git a/trunk/arch/i386/kernel/process.c b/trunk/arch/i386/kernel/process.c index 2333aead0563..6081a10d3416 100644 --- a/trunk/arch/i386/kernel/process.c +++ b/trunk/arch/i386/kernel/process.c @@ -308,9 +308,7 @@ void show_regs(struct pt_regs * regs) cr0 = read_cr0(); cr2 = read_cr2(); cr3 = read_cr3(); - if (current_cpu_data.x86 > 4) { - cr4 = read_cr4(); - } + cr4 = read_cr4_safe(); printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4); show_trace(NULL, ®s->esp); } diff --git a/trunk/include/asm-i386/system.h b/trunk/include/asm-i386/system.h index 772f85da1206..88b4d5c6f37a 100644 --- a/trunk/include/asm-i386/system.h +++ b/trunk/include/asm-i386/system.h @@ -140,6 +140,19 @@ static inline unsigned long _get_base(char * addr) :"=r" (__dummy)); \ __dummy; \ }) + +#define read_cr4_safe() ({ \ + unsigned int __dummy; \ + /* This could fault if %cr4 does not exist */ \ + __asm__("1: movl %%cr4, %0 \n" \ + "2: \n" \ + ".section __ex_table,\"a\" \n" \ + ".long 1b,2b \n" \ + ".previous \n" \ + : "=r" (__dummy): "0" (0)); \ + __dummy; \ +}) + #define write_cr4(x) \ __asm__ __volatile__("movl %0,%%cr4": :"r" (x)); #define stts() write_cr0(8 | read_cr0())