Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 620f697c authored by Philipp Rudo's avatar Philipp Rudo Committed by Linus Torvalds
Browse files

kernel/kexec_file.c: remove unneeded variables in kexec_purgatory_setup_sechdrs

The main loop currently uses quite a lot of variables to update the
section headers.  Some of them are unnecessary.  So clean them up a
little.

Link: http://lkml.kernel.org/r/20180321112751.22196-9-prudo@linux.vnet.ibm.com


Signed-off-by: default avatarPhilipp Rudo <prudo@linux.vnet.ibm.com>
Acked-by: default avatarDave Young <dyoung@redhat.com>
Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f1b1cca3
Loading
Loading
Loading
Loading
+12 −22
Original line number Diff line number Diff line
@@ -785,12 +785,8 @@ static int kexec_purgatory_setup_kbuf(struct purgatory_info *pi,
static int kexec_purgatory_setup_sechdrs(struct purgatory_info *pi,
					 struct kexec_buf *kbuf)
{
	unsigned long curr_load_addr;
	unsigned long load_addr;
	unsigned long bss_addr;
	unsigned long offset;
	unsigned char *buf_addr;
	unsigned char *src;
	Elf_Shdr *sechdrs;
	int i;

@@ -823,20 +819,18 @@ static int kexec_purgatory_setup_sechdrs(struct purgatory_info *pi,
						sechdrs[i].sh_offset;
	}

	/* Load SHF_ALLOC sections */
	buf_addr = kbuf->buffer;
	load_addr = curr_load_addr = kbuf->mem;
	bss_addr = load_addr + kbuf->bufsz;
	offset = 0;
	bss_addr = kbuf->mem + kbuf->bufsz;
	kbuf->image->start = pi->ehdr->e_entry;

	for (i = 0; i < pi->ehdr->e_shnum; i++) {
		unsigned long align;
		void *src, *dst;

		if (!(sechdrs[i].sh_flags & SHF_ALLOC))
			continue;

		align = sechdrs[i].sh_addralign;

		if (sechdrs[i].sh_type == SHT_NOBITS) {
			bss_addr = ALIGN(bss_addr, align);
			sechdrs[i].sh_addr = bss_addr;
@@ -844,31 +838,27 @@ static int kexec_purgatory_setup_sechdrs(struct purgatory_info *pi,
			continue;
		}

		curr_load_addr = ALIGN(curr_load_addr, align);
		offset = curr_load_addr - load_addr;
		/* We already modifed ->sh_offset to keep src addr */
		src = (char *)sechdrs[i].sh_offset;
		memcpy(buf_addr + offset, src, sechdrs[i].sh_size);

		offset = ALIGN(offset, align);
		if (sechdrs[i].sh_flags & SHF_EXECINSTR &&
		    pi->ehdr->e_entry >= sechdrs[i].sh_addr &&
		    pi->ehdr->e_entry < (sechdrs[i].sh_addr
					 + sechdrs[i].sh_size)) {
			kbuf->image->start -= sechdrs[i].sh_addr;
			kbuf->image->start += curr_load_addr;
			kbuf->image->start += kbuf->mem + offset;
		}

		/* Store load address and source address of section */
		sechdrs[i].sh_addr = curr_load_addr;
		src = (void *)sechdrs[i].sh_offset;
		dst = pi->purgatory_buf + offset;
		memcpy(dst, src, sechdrs[i].sh_size);

		sechdrs[i].sh_addr = kbuf->mem + offset;

		/*
		 * This section got copied to temporary buffer. Update
		 * ->sh_offset accordingly.
		 */
		sechdrs[i].sh_offset = (unsigned long)(buf_addr + offset);

		/* Advance to the next address */
		curr_load_addr += sechdrs[i].sh_size;
		sechdrs[i].sh_offset = (unsigned long)dst;
		offset += sechdrs[i].sh_size;
	}

	return 0;