lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 13 Feb 2017 21:38:08 +0100
From:   Alban <albeu@...e.fr>
To:     linux-mips@...ux-mips.org
Cc:     Alban Bedel <albeu@...e.fr>, Ralf Baechle <ralf@...ux-mips.org>,
        Jonas Gorski <jogo@...nwrt.org>, linux-kernel@...r.kernel.org
Subject: [PATCH v2] MIPS: Allow compressed images to be loaded at any address

From: Alban Bedel <albeu@...e.fr>

Compressed images (vmlinuz.bin) have to be loaded at a specific
address that differ from the address normaly used for vmlinux.bin.
This is because the decompressor just write its output at the address
vmlinux.bin should be loaded at, and it shouldn't overwrite itself.
This limitation mean that the bootloader must be configured differently
when loading a vmlinux.bin or a vmlinuz.bin image, this is annoying
and a source of error.

To workaround this we extend the compressed loader to cope with being
loaded at (nearly) any address. During the early init a jump is used
to compute the offset between the current address and the linked
address, if they differ the whole image is first copied to the linked
address before proceeding.

Some load address won't work, for example if there is an overlap with
the range where vmlinuz.bin should be loaded. However for the typical
case of using the vmlinux.bin address that won't be the case.

Signed-off-by: Alban Bedel <albeu@...e.fr>
Suggested-by: Jonas Gorski <jonas.gorski@...il.com>
---
Changelog:
v2: * Rework the code as suggested by Jonas Gorski to autodetect the
      load address and remove the need for a Kconfig option.
---
 arch/mips/boot/compressed/head.S | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/arch/mips/boot/compressed/head.S b/arch/mips/boot/compressed/head.S
index 409cb48..3c25a96 100644
--- a/arch/mips/boot/compressed/head.S
+++ b/arch/mips/boot/compressed/head.S
@@ -25,6 +25,29 @@ start:
 	move	s2, a2
 	move	s3, a3
 
+	/* Get the offset between the current address and linked address */
+	PTR_LA	t0, reloc_label
+	bal	reloc_label
+	 nop
+reloc_label:
+	subu	t0, ra, t0
+
+	/* If there is no offset no reloc is needed */
+	beqz	t0, clear_bss
+	 nop
+
+	/* Move the text, data section and DTB to the correct address */
+	PTR_LA	a0, .text
+	addu	a1, t0, a0
+	PTR_LA	a2, _edata
+copy_vmlinuz:
+	lw	a3, 0(a1)
+	sw	a3, 0(a0)
+	addiu	a0, a0, 4
+	bne	a2, a0, copy_vmlinuz
+	 addiu	a1, a1, 4
+
+clear_bss:
 	/* Clear BSS */
 	PTR_LA	a0, _edata
 	PTR_LA	a2, _end
-- 
2.7.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ