Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * purgatory: Runs between two kernels
0004  *
0005  * Copyright (C) 2014 Red Hat Inc.
0006  *
0007  * Author:
0008  *       Vivek Goyal <vgoyal@redhat.com>
0009  */
0010 
0011 #include <linux/bug.h>
0012 #include <linux/kernel.h>
0013 #include <linux/types.h>
0014 #include <crypto/sha2.h>
0015 #include <asm/purgatory.h>
0016 
0017 #include "../boot/string.h"
0018 
0019 u8 purgatory_sha256_digest[SHA256_DIGEST_SIZE] __section(".kexec-purgatory");
0020 
0021 struct kexec_sha_region purgatory_sha_regions[KEXEC_SEGMENT_MAX] __section(".kexec-purgatory");
0022 
0023 static int verify_sha256_digest(void)
0024 {
0025     struct kexec_sha_region *ptr, *end;
0026     u8 digest[SHA256_DIGEST_SIZE];
0027     struct sha256_state sctx;
0028 
0029     sha256_init(&sctx);
0030     end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions);
0031 
0032     for (ptr = purgatory_sha_regions; ptr < end; ptr++)
0033         sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len);
0034 
0035     sha256_final(&sctx, digest);
0036 
0037     if (memcmp(digest, purgatory_sha256_digest, sizeof(digest)))
0038         return 1;
0039 
0040     return 0;
0041 }
0042 
0043 void purgatory(void)
0044 {
0045     int ret;
0046 
0047     ret = verify_sha256_digest();
0048     if (ret) {
0049         /* loop forever */
0050         for (;;)
0051             ;
0052     }
0053 }
0054 
0055 /*
0056  * Defined in order to reuse memcpy() and memset() from
0057  * arch/x86/boot/compressed/string.c
0058  */
0059 void warn(const char *msg) {}