kexec, x86/purgatory: Unbreak it and clean it up
authorThomas Gleixner <tglx@linutronix.de>
Fri, 10 Mar 2017 12:17:18 +0000 (13:17 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 10 Mar 2017 19:55:09 +0000 (20:55 +0100)
commit40c50c1fecdf012a3bf055ec813f0ef2eda2749c
treeff3b781d968411004fada1618550b4a9dd55136a
parentbba8376aea1dcbbe22bbda118c52abee317c7609
kexec, x86/purgatory: Unbreak it and clean it up

The purgatory code defines global variables which are referenced via a
symbol lookup in the kexec code (core and arch).

A recent commit addressing sparse warnings made these static and thereby
broke kexec_file.

Why did this happen? Simply because the whole machinery is undocumented and
lacks any form of forward declarations. The variable names are unspecific
and lack a prefix, so adding forward declarations creates shadow variables
in the core code. Aside of that the code relies on magic constants and
duplicate struct definitions with no way to ensure that these things stay
in sync. The section placement of the purgatory variables happened by
chance and not by design.

Unbreak kexec and cleanup the mess:

 - Add proper forward declarations and document the usage
 - Use common struct definition
 - Use the proper common defines instead of magic constants
 - Add a purgatory_ prefix to have a proper name space
 - Use ARRAY_SIZE() instead of a homebrewn reimplementation
 - Add proper sections to the purgatory variables [ From Mike ]

Fixes: 72042a8c7b01 ("x86/purgatory: Make functions and variables static")
Reported-by: Mike Galbraith <<efault@gmx.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Nicholas Mc Guire <der.herr@hofr.at>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: "Tobin C. Harding" <me@tobin.cc>
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1703101315140.3681@nanos
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/powerpc/purgatory/trampoline.S
arch/x86/include/asm/purgatory.h [new file with mode: 0644]
arch/x86/kernel/machine_kexec_64.c
arch/x86/purgatory/purgatory.c
arch/x86/purgatory/purgatory.h [deleted file]
arch/x86/purgatory/setup-x86_64.S
arch/x86/purgatory/sha256.h
include/linux/purgatory.h [new file with mode: 0644]
kernel/kexec_file.c
kernel/kexec_internal.h