mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 04:11:49 +00:00
2d4a34c936
Make swsusp support i386 systems with PAE or without PSE. This is done by creating temporary page tables located in resume-safe page frames before the suspend image is restored in the same way as x86_64 does it. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Cc: Andi Kleen <ak@suse.de> Cc: Dave Jones <davej@redhat.com> Cc: Nigel Cunningham <ncunningham@linuxmail.org> Cc: Pavel Machek <pavel@ucw.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
79 lines
1.5 KiB
ArmAsm
79 lines
1.5 KiB
ArmAsm
.text
|
|
|
|
/* Originally gcc generated, modified by hand
|
|
*
|
|
* This may not use any stack, nor any variable that is not "NoSave":
|
|
*
|
|
* Its rewriting one kernel image with another. What is stack in "old"
|
|
* image could very well be data page in "new" image, and overwriting
|
|
* your own stack under you is bad idea.
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/segment.h>
|
|
#include <asm/page.h>
|
|
#include <asm/asm-offsets.h>
|
|
|
|
.text
|
|
|
|
ENTRY(swsusp_arch_suspend)
|
|
|
|
movl %esp, saved_context_esp
|
|
movl %ebx, saved_context_ebx
|
|
movl %ebp, saved_context_ebp
|
|
movl %esi, saved_context_esi
|
|
movl %edi, saved_context_edi
|
|
pushfl ; popl saved_context_eflags
|
|
|
|
call swsusp_save
|
|
ret
|
|
|
|
ENTRY(restore_image)
|
|
movl resume_pg_dir, %ecx
|
|
subl $__PAGE_OFFSET, %ecx
|
|
movl %ecx, %cr3
|
|
|
|
movl restore_pblist, %edx
|
|
.p2align 4,,7
|
|
|
|
copy_loop:
|
|
testl %edx, %edx
|
|
jz done
|
|
|
|
movl pbe_address(%edx), %esi
|
|
movl pbe_orig_address(%edx), %edi
|
|
|
|
movl $1024, %ecx
|
|
rep
|
|
movsl
|
|
|
|
movl pbe_next(%edx), %edx
|
|
jmp copy_loop
|
|
.p2align 4,,7
|
|
|
|
done:
|
|
/* go back to the original page tables */
|
|
movl $swapper_pg_dir, %ecx
|
|
subl $__PAGE_OFFSET, %ecx
|
|
movl %ecx, %cr3
|
|
/* Flush TLB, including "global" things (vmalloc) */
|
|
movl mmu_cr4_features, %eax
|
|
movl %eax, %edx
|
|
andl $~(1<<7), %edx; # PGE
|
|
movl %edx, %cr4; # turn off PGE
|
|
movl %cr3, %ecx; # flush TLB
|
|
movl %ecx, %cr3
|
|
movl %eax, %cr4; # turn PGE back on
|
|
|
|
movl saved_context_esp, %esp
|
|
movl saved_context_ebp, %ebp
|
|
movl saved_context_ebx, %ebx
|
|
movl saved_context_esi, %esi
|
|
movl saved_context_edi, %edi
|
|
|
|
pushl saved_context_eflags ; popfl
|
|
|
|
xorl %eax, %eax
|
|
|
|
ret
|