summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2012-12-19 16:19:56 -0700
committerSimon Horman <horms@verge.net.au>2012-12-23 13:20:39 +0900
commitc30e0bbd021b5744532fb8555bd4d4bbf8a00a04 (patch)
treeafa8ebfb3f2b5825f1609546101e0fe2568fa392
parentea14742d8c5ee3b2d693bc009fd5a5f5e4a8f2da (diff)
downloadkexec-tools-c30e0bbd021b5744532fb8555bd4d4bbf8a00a04.tar.gz
kexec-zImage-arm: simply cmdline-related DTB resizing
When resizing a dtb to add the command-line, only resize the DTB once, rather than once to add the /chosen node, and once to add the bootargs property. Also, simply add 1K of overhead (beyond strlen(cmdline)) to the buffer, to avoid requiring precise knowledge of the size impact of the requested FTB changes. In particular, some padding is performed when setting property values, which was not accounted for in the current code, which caused failures to set the bootargs values in some cases. Cc: Daniel Mack <zonque@gmail.com> Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/arch/arm/kexec-zImage-arm.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/kexec/arch/arm/kexec-zImage-arm.c b/kexec/arch/arm/kexec-zImage-arm.c
index 0950897a..db29a7b9 100644
--- a/kexec/arch/arm/kexec-zImage-arm.c
+++ b/kexec/arch/arm/kexec-zImage-arm.c
@@ -370,31 +370,22 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len,
const char *prop_name = "bootargs";
int off;
+ dtb_length = fdt_totalsize(dtb_buf) + 1024 +
+ strlen(command_line);
+ dtb_buf = xrealloc(dtb_buf, dtb_length);
+ fdt_set_totalsize(dtb_buf, dtb_length);
+
/* check if a /choosen subnode already exists */
off = fdt_path_offset(dtb_buf, node_name);
- if (off == -FDT_ERR_NOTFOUND) {
- dtb_length = fdt_totalsize(dtb_buf)
- + strlen(node_name) + 1
- + sizeof(struct fdt_node_header)
- + FDT_TAGSIZE;
- dtb_buf = xrealloc(dtb_buf, dtb_length);
- fdt_set_totalsize(dtb_buf, dtb_length);
+ if (off == -FDT_ERR_NOTFOUND)
off = fdt_add_subnode(dtb_buf, off, node_name);
- }
if (off < 0) {
fprintf(stderr, "FDT: Error adding %s node.\n", node_name);
return -1;
}
- dtb_length = fdt_totalsize(dtb_buf)
- + strlen(prop_name)
- + strlen(command_line) + 1
- + sizeof(struct fdt_property);
- dtb_buf = xrealloc(dtb_buf, dtb_length);
- fdt_set_totalsize(dtb_buf, dtb_length);
-
if (fdt_setprop(dtb_buf, off, prop_name,
command_line, strlen(command_line) + 1) != 0) {
fprintf(stderr, "FDT: Error setting %s/%s property.\n",