• Rafael J. Wysocki's avatar
    Hibernation: Arbitrary boot kernel support on x86_64 · d158cbdf
    Rafael J. Wysocki authored
    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: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Acked-by: default avatarPavel Machek <pavel@ucw.cz>
    Cc: Andi Kleen <ak@suse.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d158cbdf
suspend_64.h 1.67 KB