kexec-tools: add patch to fix issue with appended DTB and zImage on ARM
This patch fixes a recently found problem when a zImage passed to kexec-tools contains an appended DTB. In that case kexec boot fails because the decompressor wrongly tries to use the non-existing appended DTB instaed of the one passed in the register r2. - http://lists.infradead.org/pipermail/kexec/2021-April/022353.html Signed-off-by: Alexander Egorenkov <egorenar-dev@posteo.net>
This commit is contained in:
		
				
					committed by
					
						
						Hauke Mehrtens
					
				
			
			
				
	
			
			
			
						parent
						
							0097899da7
						
					
				
				
					commit
					42cd06f7fe
				
			@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=kexec-tools
 | 
					PKG_NAME:=kexec-tools
 | 
				
			||||||
PKG_VERSION:=2.0.21
 | 
					PKG_VERSION:=2.0.21
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 | 
					PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 | 
				
			||||||
PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kexec
 | 
					PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kexec
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					From 9817ec81968a5eec7863902833fb77680544eae4 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Alexander Egorenkov <egorenar-dev@posteo.net>
 | 
				
			||||||
 | 
					Date: Mon, 12 Apr 2021 13:18:05 +0200
 | 
				
			||||||
 | 
					Subject: [PATCH 1/1] arm: do not copy magic 4 bytes of appended DTB in zImage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If the passed zImage happens to have a DTB appended, then the magic 4 bytes
 | 
				
			||||||
 | 
					of the DTB are copied together with the kernel image. This leads to
 | 
				
			||||||
 | 
					failed kexec boots because the decompressor finds the aforementioned
 | 
				
			||||||
 | 
					DTB magic and falsely tries to replace the DTB passed in the register r2
 | 
				
			||||||
 | 
					with the non-existent appended one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Alexander Egorenkov <egorenar-dev@posteo.net>
 | 
				
			||||||
 | 
					Signed-off-by: Simon Horman <horms@verge.net.au>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 kexec/arch/arm/kexec-zImage-arm.c | 12 +++++++++++-
 | 
				
			||||||
 | 
					 1 file changed, 11 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/kexec/arch/arm/kexec-zImage-arm.c
 | 
				
			||||||
 | 
					+++ b/kexec/arch/arm/kexec-zImage-arm.c
 | 
				
			||||||
 | 
					@@ -382,6 +382,7 @@ int zImage_arm_load(int argc, char **arg
 | 
				
			||||||
 | 
					 	unsigned int atag_offset = 0x1000; /* 4k offset from memory start */
 | 
				
			||||||
 | 
					 	unsigned int extra_size = 0x8000; /* TEXT_OFFSET */
 | 
				
			||||||
 | 
					 	const struct zimage_tag *tag;
 | 
				
			||||||
 | 
					+	size_t kernel_buf_size;
 | 
				
			||||||
 | 
					 	size_t kernel_mem_size;
 | 
				
			||||||
 | 
					 	const char *command_line;
 | 
				
			||||||
 | 
					 	char *modified_cmdline = NULL;
 | 
				
			||||||
 | 
					@@ -538,6 +539,15 @@ int zImage_arm_load(int argc, char **arg
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					+	 * Save the length of the compressed kernel image w/o the appended DTB.
 | 
				
			||||||
 | 
					+	 * This will be required later on when the kernel image contained
 | 
				
			||||||
 | 
					+	 * in the zImage will be loaded into a kernel memory segment.
 | 
				
			||||||
 | 
					+	 * And we want to load ONLY the compressed kernel image from the zImage
 | 
				
			||||||
 | 
					+	 * and discard the appended DTB.
 | 
				
			||||||
 | 
					+	 */
 | 
				
			||||||
 | 
					+	kernel_buf_size = len;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/*
 | 
				
			||||||
 | 
					 	 * Always extend the zImage by four bytes to ensure that an appended
 | 
				
			||||||
 | 
					 	 * DTB image always sees an initialised value after _edata.
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					@@ -759,7 +769,7 @@ int zImage_arm_load(int argc, char **arg
 | 
				
			||||||
 | 
					 		add_segment(info, dtb_buf, dtb_length, dtb_offset, dtb_length);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	add_segment(info, buf, len, kernel_base, kernel_mem_size);
 | 
				
			||||||
 | 
					+	add_segment(info, buf, kernel_buf_size, kernel_base, kernel_mem_size);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	info->entry = (void*)kernel_base;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
		Reference in New Issue
	
	Block a user