linux/arch
Rafael J. Wysocki d158cbdf39 Hibernation: Arbitrary boot kernel support on x86_64
Make it possible to restore a hibernation image on x86_64 with the help of a
kernel different from the one in the image.

The idea is to split the core restoration code into two separate parts and to
place each of them in a different page.   The first part belongs to the boot
kernel and is executed as the last step of the image kernel's memory
restoration procedure.   Before being executed, it is relocated to a safe page
that won't be overwritten while copying the image kernel pages.

The final operation performed by it is a jump to the second part of the core
restoration code that belongs to the image kernel and has just been restored.
This code makes the CPU switch to the image kernel's page tables and restores
the state of general purpose registers (including the stack pointer) from
before the hibernation.

The main issue with this idea is that in order to jump to the second part of
the core restoration code the boot kernel needs to know its address.
 However, this address may be passed to it in the image header.   Namely, the
part of the image header previously used for checking if the version of the
image kernel is correct can be replaced with some architecture specific data
that will allow the boot kernel to jump to the right address within the image
kernel.   These data should also be used for checking if the image kernel is
compatible with the boot kernel (as far as the memory restroration procedure
is concerned).  It can be done, for example, with the help of a "magic" value
that has to be equal in both kernels, so that they can be regarded as
compatible.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-10-18 14:37:19 -07:00
..
alpha Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild 2007-10-16 11:23:06 -07:00
arm PM: Rework struct platform_suspend_ops 2007-10-18 14:37:18 -07:00
avr32 Remove dma_cache_(wback|inv|wback_inv) functions 2007-10-17 08:42:57 -07:00
blackfin PM: Rework struct platform_suspend_ops 2007-10-18 14:37:18 -07:00
cris remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
frv remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
h8300 remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
i386 .gitignore update for x86 arch 2007-10-17 21:19:04 +02:00
ia64 [IA64] fix non-numa build 2007-10-17 14:28:38 -07:00
m32r remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
m68k remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
m68knommu remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
mips [MIPS] IP22: Fix hang due to messing with timer interrupt handler 2007-10-17 18:28:49 +01:00
parisc Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild 2007-10-16 11:23:06 -07:00
powerpc serial: turn serial console suspend a boot rather than compile time option 2007-10-18 14:37:19 -07:00
ppc Merge branch 'for-2.6.24' of git://git.secretlab.ca/git/linux-2.6-mpc52xx into merge 2007-10-17 22:31:13 +10:00
s390 remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
sh PM: Rename struct pm_ops and related things 2007-10-18 14:37:18 -07:00
sh64 Remove dma_cache_(wback|inv|wback_inv) functions 2007-10-17 08:42:57 -07:00
sparc remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
sparc64 Merge branch 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block 2007-10-17 09:08:13 -07:00
um remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
v850 remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
x86 Hibernation: Arbitrary boot kernel support on x86_64 2007-10-18 14:37:19 -07:00
x86_64 Hibernation: Arbitrary boot kernel support on x86_64 2007-10-18 14:37:19 -07:00
xtensa Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild 2007-10-16 11:23:06 -07:00