diff options
| -rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/efi_32.c | 4 | ||||
| -rw-r--r-- | arch/x86/power/cpu_32.c | 6 | ||||
| -rw-r--r-- | arch/x86/power/hibernate_asm_32.S | 26 |
4 files changed, 22 insertions, 16 deletions
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 81e5ab6542d8..426e5d91b63a 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -86,7 +86,7 @@ int acpi_save_state_mem(void) | |||
| 86 | #endif /* !CONFIG_64BIT */ | 86 | #endif /* !CONFIG_64BIT */ |
| 87 | 87 | ||
| 88 | header->pmode_cr0 = read_cr0(); | 88 | header->pmode_cr0 = read_cr0(); |
| 89 | header->pmode_cr4 = read_cr4(); | 89 | header->pmode_cr4 = read_cr4_safe(); |
| 90 | header->realmode_flags = acpi_realmode_flags; | 90 | header->realmode_flags = acpi_realmode_flags; |
| 91 | header->real_magic = 0x12345678; | 91 | header->real_magic = 0x12345678; |
| 92 | 92 | ||
diff --git a/arch/x86/kernel/efi_32.c b/arch/x86/kernel/efi_32.c index 4b63c8e1f13b..5cab48ee61a4 100644 --- a/arch/x86/kernel/efi_32.c +++ b/arch/x86/kernel/efi_32.c | |||
| @@ -53,7 +53,7 @@ void efi_call_phys_prelog(void) | |||
| 53 | * directory. If I have PAE, I just need to duplicate one entry in | 53 | * directory. If I have PAE, I just need to duplicate one entry in |
| 54 | * page directory. | 54 | * page directory. |
| 55 | */ | 55 | */ |
| 56 | cr4 = read_cr4(); | 56 | cr4 = read_cr4_safe(); |
| 57 | 57 | ||
| 58 | if (cr4 & X86_CR4_PAE) { | 58 | if (cr4 & X86_CR4_PAE) { |
| 59 | efi_bak_pg_dir_pointer[0].pgd = | 59 | efi_bak_pg_dir_pointer[0].pgd = |
| @@ -91,7 +91,7 @@ void efi_call_phys_epilog(void) | |||
| 91 | gdt_descr.size = GDT_SIZE - 1; | 91 | gdt_descr.size = GDT_SIZE - 1; |
| 92 | load_gdt(&gdt_descr); | 92 | load_gdt(&gdt_descr); |
| 93 | 93 | ||
| 94 | cr4 = read_cr4(); | 94 | cr4 = read_cr4_safe(); |
| 95 | 95 | ||
| 96 | if (cr4 & X86_CR4_PAE) { | 96 | if (cr4 & X86_CR4_PAE) { |
| 97 | swapper_pg_dir[pgd_index(0)].pgd = | 97 | swapper_pg_dir[pgd_index(0)].pgd = |
diff --git a/arch/x86/power/cpu_32.c b/arch/x86/power/cpu_32.c index 7dc5d5cf50a2..d3e083dea720 100644 --- a/arch/x86/power/cpu_32.c +++ b/arch/x86/power/cpu_32.c | |||
| @@ -45,7 +45,7 @@ static void __save_processor_state(struct saved_context *ctxt) | |||
| 45 | ctxt->cr0 = read_cr0(); | 45 | ctxt->cr0 = read_cr0(); |
| 46 | ctxt->cr2 = read_cr2(); | 46 | ctxt->cr2 = read_cr2(); |
| 47 | ctxt->cr3 = read_cr3(); | 47 | ctxt->cr3 = read_cr3(); |
| 48 | ctxt->cr4 = read_cr4(); | 48 | ctxt->cr4 = read_cr4_safe(); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /* Needed by apm.c */ | 51 | /* Needed by apm.c */ |
| @@ -98,7 +98,9 @@ static void __restore_processor_state(struct saved_context *ctxt) | |||
| 98 | /* | 98 | /* |
| 99 | * control registers | 99 | * control registers |
| 100 | */ | 100 | */ |
| 101 | write_cr4(ctxt->cr4); | 101 | /* cr4 was introduced in the Pentium CPU */ |
| 102 | if (ctxt->cr4) | ||
| 103 | write_cr4(ctxt->cr4); | ||
| 102 | write_cr3(ctxt->cr3); | 104 | write_cr3(ctxt->cr3); |
| 103 | write_cr2(ctxt->cr2); | 105 | write_cr2(ctxt->cr2); |
| 104 | write_cr0(ctxt->cr0); | 106 | write_cr0(ctxt->cr0); |
diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S index b95aa6cfe3cb..4fc7e872c85e 100644 --- a/arch/x86/power/hibernate_asm_32.S +++ b/arch/x86/power/hibernate_asm_32.S | |||
| @@ -28,9 +28,9 @@ ENTRY(swsusp_arch_suspend) | |||
| 28 | ret | 28 | ret |
| 29 | 29 | ||
| 30 | ENTRY(restore_image) | 30 | ENTRY(restore_image) |
| 31 | movl resume_pg_dir, %ecx | 31 | movl resume_pg_dir, %eax |
| 32 | subl $__PAGE_OFFSET, %ecx | 32 | subl $__PAGE_OFFSET, %eax |
| 33 | movl %ecx, %cr3 | 33 | movl %eax, %cr3 |
| 34 | 34 | ||
| 35 | movl restore_pblist, %edx | 35 | movl restore_pblist, %edx |
| 36 | .p2align 4,,7 | 36 | .p2align 4,,7 |
| @@ -52,17 +52,21 @@ copy_loop: | |||
| 52 | 52 | ||
| 53 | done: | 53 | done: |
| 54 | /* go back to the original page tables */ | 54 | /* go back to the original page tables */ |
| 55 | movl $swapper_pg_dir, %ecx | 55 | movl $swapper_pg_dir, %eax |
| 56 | subl $__PAGE_OFFSET, %ecx | 56 | subl $__PAGE_OFFSET, %eax |
| 57 | movl %ecx, %cr3 | 57 | movl %eax, %cr3 |
| 58 | /* Flush TLB, including "global" things (vmalloc) */ | 58 | /* Flush TLB, including "global" things (vmalloc) */ |
| 59 | movl mmu_cr4_features, %eax | 59 | movl mmu_cr4_features, %ecx |
| 60 | movl %eax, %edx | 60 | jecxz 1f # cr4 Pentium and higher, skip if zero |
| 61 | movl %ecx, %edx | ||
| 61 | andl $~(1<<7), %edx; # PGE | 62 | andl $~(1<<7), %edx; # PGE |
| 62 | movl %edx, %cr4; # turn off PGE | 63 | movl %edx, %cr4; # turn off PGE |
| 63 | movl %cr3, %ecx; # flush TLB | 64 | 1: |
| 64 | movl %ecx, %cr3 | 65 | movl %cr3, %eax; # flush TLB |
| 65 | movl %eax, %cr4; # turn PGE back on | 66 | movl %eax, %cr3 |
| 67 | jecxz 1f # cr4 Pentium and higher, skip if zero | ||
| 68 | movl %ecx, %cr4; # turn PGE back on | ||
| 69 | 1: | ||
| 66 | 70 | ||
| 67 | movl saved_context_esp, %esp | 71 | movl saved_context_esp, %esp |
| 68 | movl saved_context_ebp, %ebp | 72 | movl saved_context_ebp, %ebp |
