Skip to content

Commit

Permalink
kernel/kexec_file.c: move purgatories sha256 to common code
Browse files Browse the repository at this point in the history
The code to verify the new kernels sha digest is applicable for all
architectures.  Move it to common code.

One problem is the string.c implementation on x86.  Currently sha256
includes x86/boot/string.h which defines memcpy and memset to be gcc
builtins.  By moving the sha256 implementation to common code and
changing the include to linux/string.h both functions are no longer
defined.  Thus definitions have to be provided in x86/purgatory/string.c

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Philipp Rudo <[email protected]>
Acked-by: Dave Young <[email protected]>
Cc: AKASHI Takahiro <[email protected]>
Cc: Eric Biederman <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Martin Schwidefsky <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Thiago Jung Bauermann <[email protected]>
Cc: Vivek Goyal <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Philipp Rudo authored and torvalds committed Apr 14, 2018
1 parent 3be3f61 commit df6f280
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 4 deletions.
3 changes: 3 additions & 0 deletions arch/x86/purgatory/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string
targets += $(purgatory-y)
PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y))

$(obj)/sha256.o: $(srctree)/lib/sha256.c
$(call if_changed_rule,cc_o_c)

LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
targets += purgatory.ro

Expand Down
2 changes: 1 addition & 1 deletion arch/x86/purgatory/purgatory.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
*/

#include <linux/bug.h>
#include <linux/sha256.h>
#include <asm/purgatory.h>

#include "sha256.h"
#include "../boot/string.h"

unsigned long purgatory_backup_dest __section(.kexec-purgatory);
Expand Down
12 changes: 12 additions & 0 deletions arch/x86/purgatory/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,16 @@
* Version 2. See the file COPYING for more details.
*/

#include <linux/types.h>

#include "../boot/string.c"

void *memcpy(void *dst, const void *src, size_t len)
{
return __builtin_memcpy(dst, src, len);
}

void *memset(void *dst, int c, size_t len)
{
return __builtin_memset(dst, c, len);
}
11 changes: 10 additions & 1 deletion arch/x86/purgatory/sha256.h → include/linux/sha256.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,18 @@
#include <linux/types.h>
#include <crypto/sha.h>

/*
* Stand-alone implementation of the SHA256 algorithm. It is designed to
* have as little dependencies as possible so it can be used in the
* kexec_file purgatory. In other cases you should use the implementation in
* crypto/.
*
* For details see lib/sha256.c
*/

extern int sha256_init(struct sha256_state *sctx);
extern int sha256_update(struct sha256_state *sctx, const u8 *input,
unsigned int length);
unsigned int length);
extern int sha256_final(struct sha256_state *sctx, u8 *hash);

#endif /* SHA256_H */
4 changes: 2 additions & 2 deletions arch/x86/purgatory/sha256.c → lib/sha256.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
*/

#include <linux/bitops.h>
#include <linux/sha256.h>
#include <linux/string.h>
#include <asm/byteorder.h>
#include "sha256.h"
#include "../boot/string.h"

static inline u32 Ch(u32 x, u32 y, u32 z)
{
Expand Down

0 comments on commit df6f280

Please sign in to comment.