diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile index d70c15de417b..2e9ee023e6bc 100644 --- a/arch/x86/purgatory/Makefile +++ b/arch/x86/purgatory/Makefile @@ -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 diff --git a/arch/x86/purgatory/purgatory.c b/arch/x86/purgatory/purgatory.c index 470edad96bb9..025c34ac0d84 100644 --- a/arch/x86/purgatory/purgatory.c +++ b/arch/x86/purgatory/purgatory.c @@ -11,9 +11,9 @@ */ #include +#include #include -#include "sha256.h" #include "../boot/string.h" unsigned long purgatory_backup_dest __section(.kexec-purgatory); diff --git a/arch/x86/purgatory/string.c b/arch/x86/purgatory/string.c index d886b1fa36f0..795ca4f2cb3c 100644 --- a/arch/x86/purgatory/string.c +++ b/arch/x86/purgatory/string.c @@ -10,4 +10,16 @@ * Version 2. See the file COPYING for more details. */ +#include + #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); +} diff --git a/arch/x86/purgatory/sha256.h b/include/linux/sha256.h similarity index 62% rename from arch/x86/purgatory/sha256.h rename to include/linux/sha256.h index 2867d9825a57..244fe01a65fb 100644 --- a/arch/x86/purgatory/sha256.h +++ b/include/linux/sha256.h @@ -13,9 +13,18 @@ #include #include +/* + * 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 */ diff --git a/arch/x86/purgatory/sha256.c b/lib/sha256.c similarity index 99% rename from arch/x86/purgatory/sha256.c rename to lib/sha256.c index 548ca675a14a..4400c832e2aa 100644 --- a/arch/x86/purgatory/sha256.c +++ b/lib/sha256.c @@ -16,9 +16,9 @@ */ #include +#include +#include #include -#include "sha256.h" -#include "../boot/string.h" static inline u32 Ch(u32 x, u32 y, u32 z) {