mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-27 00:55:28 +07:00
d607251ba9
Currently z_extract_offset is calculated in boot/compressed/mkpiggy.c. This doesn't work well because mkpiggy.c doesn't know the details of the decompressor in use. As a result, it can only make an estimation, which has risks: - output + output_len (VO) could be much bigger than input + input_len (ZO). In this case, the decompressed kernel plus relocs could overwrite the decompression code while it is running. - The head code of ZO could be bigger than z_extract_offset. In this case an overwrite could happen when the head code is running to move ZO to the end of buffer. Though currently the size of the head code is very small it's still a potential risk. Since there is no rule to limit the size of the head code of ZO, it runs the risk of suddenly becoming a (hard to find) bug. Instead, this moves the z_extract_offset calculation into header.S, and makes adjustments to be sure that the above two cases can never happen, and further corrects the comments describing the calculations. Since we have (in the previous patch) made ZO always be located against the end of decompression buffer, z_extract_offset is only used here to calculate an appropriate buffer size (INIT_SIZE), and is not longer used elsewhere. As such, it can be removed from voffset.h. Additionally clean up #if/#else #define to improve readability. Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Baoquan He <bhe@redhat.com> [ Rewrote the changelog and comments. ] Signed-off-by: Kees Cook <keescook@chromium.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Dave Young <dyoung@redhat.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vivek Goyal <vgoyal@redhat.com> Cc: lasse.collin@tukaani.org Link: http://lkml.kernel.org/r/1461888548-32439-4-git-send-email-keescook@chromium.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
89 lines
2.2 KiB
C
89 lines
2.2 KiB
C
/* ----------------------------------------------------------------------- *
|
|
*
|
|
* Copyright (C) 2009 Intel Corporation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version
|
|
* 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*
|
|
* H. Peter Anvin <hpa@linux.intel.com>
|
|
*
|
|
* -----------------------------------------------------------------------
|
|
*
|
|
* Outputs a small assembly wrapper with the appropriate symbols defined.
|
|
*
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <inttypes.h>
|
|
#include <tools/le_byteshift.h>
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
uint32_t olen;
|
|
long ilen;
|
|
unsigned long run_size;
|
|
FILE *f = NULL;
|
|
int retval = 1;
|
|
|
|
if (argc < 3) {
|
|
fprintf(stderr, "Usage: %s compressed_file run_size\n",
|
|
argv[0]);
|
|
goto bail;
|
|
}
|
|
|
|
/* Get the information for the compressed kernel image first */
|
|
|
|
f = fopen(argv[1], "r");
|
|
if (!f) {
|
|
perror(argv[1]);
|
|
goto bail;
|
|
}
|
|
|
|
|
|
if (fseek(f, -4L, SEEK_END)) {
|
|
perror(argv[1]);
|
|
}
|
|
|
|
if (fread(&olen, sizeof(olen), 1, f) != 1) {
|
|
perror(argv[1]);
|
|
goto bail;
|
|
}
|
|
|
|
ilen = ftell(f);
|
|
olen = get_unaligned_le32(&olen);
|
|
|
|
run_size = atoi(argv[2]);
|
|
|
|
printf(".section \".rodata..compressed\",\"a\",@progbits\n");
|
|
printf(".globl z_input_len\n");
|
|
printf("z_input_len = %lu\n", ilen);
|
|
printf(".globl z_output_len\n");
|
|
printf("z_output_len = %lu\n", (unsigned long)olen);
|
|
printf(".globl z_run_size\n");
|
|
printf("z_run_size = %lu\n", run_size);
|
|
|
|
printf(".globl input_data, input_data_end\n");
|
|
printf("input_data:\n");
|
|
printf(".incbin \"%s\"\n", argv[1]);
|
|
printf("input_data_end:\n");
|
|
|
|
retval = 0;
|
|
bail:
|
|
if (f)
|
|
fclose(f);
|
|
return retval;
|
|
}
|