mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 19:53:59 +08:00
287d6070ac
Currently there are some variables in the purgatory (e.g. kernel_entry) which are defined twice, once in assembler- and once in c-code. The reason for this is that these variables are set during purgatory load, where sanity checks on the corresponding Elf_Sym's are made, while they are used in assembler-code. Thus adding a second definition in c-code is a handy workaround to guarantee correct Elf_Sym's are created. When the purgatory is compiled with -fcommon (default for gcc on s390) this is no problem because both symbols are merged by the linker. However this is not required by ISO C and when the purgatory is built with -fno-common the linker fails with errors like arch/s390/purgatory/purgatory.o:(.bss+0x18): multiple definition of `kernel_entry' arch/s390/purgatory/head.o:/.../arch/s390/purgatory/head.S:230: first defined here Thus remove the duplicate definitions and add the required size and type information to the assembler definition. Also add -fno-common to the command line options to prevent similar hacks in the future. Signed-off-by: Philipp Rudo <prudo@linux.ibm.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
34 lines
734 B
C
34 lines
734 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Purgatory code running between two kernels.
|
|
*
|
|
* Copyright IBM Corp. 2018
|
|
*
|
|
* Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com>
|
|
*/
|
|
|
|
#include <linux/kexec.h>
|
|
#include <linux/sha256.h>
|
|
#include <linux/string.h>
|
|
#include <asm/purgatory.h>
|
|
|
|
int verify_sha256_digest(void)
|
|
{
|
|
struct kexec_sha_region *ptr, *end;
|
|
u8 digest[SHA256_DIGEST_SIZE];
|
|
struct sha256_state sctx;
|
|
|
|
sha256_init(&sctx);
|
|
end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions);
|
|
|
|
for (ptr = purgatory_sha_regions; ptr < end; ptr++)
|
|
sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len);
|
|
|
|
sha256_final(&sctx, digest);
|
|
|
|
if (memcmp(digest, purgatory_sha256_digest, sizeof(digest)))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|