From: "Marek Behún" <kabel@kernel.org>
To: Stefan Roese <sr@denx.de>
Cc: u-boot@lists.denx.de, "Pali Rohár" <pali@kernel.org>,
"Marek Behún" <marek.behun@nic.cz>
Subject: [PATCH u-boot-marvell 05/13] tools: kwboot: Inject baudrate change back code after data part
Date: Mon, 25 Oct 2021 15:12:56 +0200 [thread overview]
Message-ID: <20211025131304.21310-6-kabel@kernel.org> (raw)
In-Reply-To: <20211025131304.21310-1-kabel@kernel.org>
From: Pali Rohár <pali@kernel.org>
Some vendor U-Boot kwbimage binaries (e.g. those for A375) have load
address set to zero. Therefore it is not possible to inject code which
changes baudrate back to 115200 Bd before the data part.
So instead inject it after the data part and change kwbimage execution
address to that offset. Also store original execution address into
baudrate change code, so after it changes baudrate back to 115200 Bd, it
can jump to orignal address.
Signed-off-by: Pali Rohár <pali@kernel.org>
[ refactored ]
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
tools/kwboot.c | 72 ++++++++++++++++++++++----------------------------
1 file changed, 31 insertions(+), 41 deletions(-)
diff --git a/tools/kwboot.c b/tools/kwboot.c
index bc44301535..bf26a667b7 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -1295,34 +1295,22 @@ kwboot_img_is_secure(void *img)
}
static void *
-kwboot_img_grow_data_left(void *img, size_t *size, size_t grow)
+kwboot_img_grow_data_right(void *img, size_t *size, size_t grow)
{
- uint32_t hdrsz, datasz, srcaddr;
struct main_hdr_v1 *hdr = img;
- uint8_t *data;
-
- srcaddr = le32_to_cpu(hdr->srcaddr);
-
- hdrsz = kwbheader_size(hdr);
- data = (uint8_t *)img + srcaddr;
- datasz = *size - srcaddr;
-
- /* only move data if there is not enough space */
- if (hdrsz + grow > srcaddr) {
- size_t need = hdrsz + grow - srcaddr;
-
- /* move data by enough bytes */
- memmove(data + need, data, datasz);
- *size += need;
- srcaddr += need;
- }
+ void *result;
- srcaddr -= grow;
- hdr->srcaddr = cpu_to_le32(srcaddr);
- hdr->destaddr = cpu_to_le32(le32_to_cpu(hdr->destaddr) - grow);
+ /*
+ * 32-bit checksum comes after end of image code, so we will be putting
+ * new code there. So we get this pointer and then increase data size
+ * (since increasing data size changes kwboot_img_csum32_ptr() return
+ * value).
+ */
+ result = kwboot_img_csum32_ptr(img);
hdr->blocksize = cpu_to_le32(le32_to_cpu(hdr->blocksize) + grow);
+ *size += grow;
- return (uint8_t *)img + srcaddr;
+ return result;
}
static void
@@ -1400,14 +1388,20 @@ kwboot_add_bin_ohdr_v1(void *img, size_t *size, uint32_t binsz)
}
static void
-_copy_baudrate_change_code(struct main_hdr_v1 *hdr, void *dst, int pre,
- int old_baud, int new_baud)
+_inject_baudrate_change_code(void *img, size_t *size, int pre,
+ int old_baud, int new_baud)
{
- size_t codesz = sizeof(kwboot_baud_code);
- uint8_t *code = dst;
+ uint32_t codesz = sizeof(kwboot_baud_code);
+ struct main_hdr_v1 *hdr = img;
+ uint8_t *code;
if (pre) {
- size_t presz = sizeof(kwboot_pre_baud_code);
+ uint32_t presz = sizeof(kwboot_pre_baud_code);
+ uint32_t orig_datasz;
+
+ orig_datasz = le32_to_cpu(hdr->blocksize) - sizeof(uint32_t);
+
+ code = kwboot_img_grow_data_right(img, size, presz + codesz);
/*
* We need to prepend code that loads lr register with original
@@ -1421,9 +1415,12 @@ _copy_baudrate_change_code(struct main_hdr_v1 *hdr, void *dst, int pre,
memcpy(code, kwboot_pre_baud_code, presz);
*(uint32_t *)code = hdr->execaddr;
- hdr->execaddr = cpu_to_le32(le32_to_cpu(hdr->destaddr) + 4);
+ hdr->execaddr = cpu_to_le32(le32_to_cpu(hdr->destaddr) +
+ orig_datasz + 4);
code += presz;
+ } else {
+ code = kwboot_add_bin_ohdr_v1(img, size, codesz);
}
memcpy(code, kwboot_baud_code, codesz - 8);
@@ -1516,9 +1513,6 @@ kwboot_img_patch(void *img, size_t *size, int baudrate)
}
if (baudrate) {
- uint32_t codesz = sizeof(kwboot_baud_code);
- void *code;
-
if (image_ver == 0) {
fprintf(stderr,
"Cannot inject code for changing baudrate into v0 image header\n");
@@ -1539,20 +1533,16 @@ kwboot_img_patch(void *img, size_t *size, int baudrate)
*/
kwboot_printv("Injecting binary header code for changing baudrate to %d Bd\n",
baudrate);
-
- code = kwboot_add_bin_ohdr_v1(img, size, codesz);
- _copy_baudrate_change_code(hdr, code, 0, 115200, baudrate);
+ _inject_baudrate_change_code(img, size, 0, 115200, baudrate);
/*
* Now inject code that changes the baudrate back to 115200 Bd.
- * This code is prepended to the data part of the image, so it
- * is executed before U-Boot proper.
+ * This code is appended after the data part of the image, and
+ * execaddr is changed so that it is executed before U-Boot
+ * proper.
*/
kwboot_printv("Injecting code for changing baudrate back\n");
-
- codesz += sizeof(kwboot_pre_baud_code);
- code = kwboot_img_grow_data_left(img, size, codesz);
- _copy_baudrate_change_code(hdr, code, 1, baudrate, 115200);
+ _inject_baudrate_change_code(img, size, 1, baudrate, 115200);
/* recompute header size */
hdrsz = kwbheader_size(hdr);
--
2.32.0
next prev parent reply other threads:[~2021-10-25 13:14 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-25 13:12 [PATCH u-boot-marvell 00/13] Yet another kwboot improvements Marek Behún
2021-10-25 13:12 ` [PATCH u-boot-marvell 01/13] tools: kwboot: Initialize rfds to zero Marek Behún
2021-10-26 5:41 ` Stefan Roese
2021-10-25 13:12 ` [PATCH u-boot-marvell 02/13] tools: kwboot: Fix initialization of tty device Marek Behún
2021-10-26 5:41 ` Stefan Roese
2021-10-25 13:12 ` [PATCH u-boot-marvell 03/13] tools: kwboot: Reserve enough space for patching kwbimage in memory Marek Behún
2021-10-26 5:42 ` Stefan Roese
2021-10-25 13:12 ` [PATCH u-boot-marvell 04/13] tools: kwboot: Validate 4-byte image data checksum Marek Behún
2021-10-26 5:43 ` Stefan Roese
2021-10-25 13:12 ` Marek Behún [this message]
2021-10-26 5:43 ` [PATCH u-boot-marvell 05/13] tools: kwboot: Inject baudrate change back code after data part Stefan Roese
2021-10-25 13:12 ` [PATCH u-boot-marvell 06/13] tools: kwboot: Recalculate 4-byte data checksum after injecting baudrate code Marek Behún
2021-10-26 5:44 ` Stefan Roese
2021-10-25 13:12 ` [PATCH u-boot-marvell 07/13] tools: kwboot: Correctly set configuration of UART for BootROM messages Marek Behún
2021-10-26 5:45 ` Stefan Roese
2021-10-25 13:12 ` [PATCH u-boot-marvell 08/13] tools: kwboot: Show verbose message when waiting for baudrate change magic Marek Behún
2021-10-26 5:45 ` Stefan Roese
2021-10-25 13:13 ` [PATCH u-boot-marvell 09/13] tools: kwboot: Simplify code for aligning image header Marek Behún
2021-10-26 5:45 ` Stefan Roese
2021-10-25 13:13 ` [PATCH u-boot-marvell 10/13] tools: kwboot: Do not modify kwbimage header before increasing its size Marek Behún
2021-10-26 5:46 ` Stefan Roese
2021-10-25 13:13 ` [PATCH u-boot-marvell 11/13] tools: kwboot: Calculate real used space in kwbimage header when calling kwboot_img_grow_hdr() Marek Behún
2021-10-26 5:48 ` Stefan Roese
2021-10-25 13:13 ` [PATCH u-boot-marvell 12/13] tools: kwboot: Change retry loop from decreasing to increasing Marek Behún
2021-10-26 5:49 ` Stefan Roese
2021-10-25 13:13 ` [PATCH u-boot-marvell 13/13] tools: kwboot: Resend first 3 xmodem retry packets immediately Marek Behún
2021-10-26 5:50 ` Stefan Roese
2021-10-25 14:39 ` [PATCH u-boot-marvell 00/13] Yet another kwboot improvements Stefan Roese
2021-10-25 14:42 ` Pali Rohár
2021-10-25 15:15 ` Stefan Roese
2021-10-26 8:33 ` Pali Rohár
2021-10-26 8:45 ` Stefan Roese
2021-10-26 9:06 ` Pali Rohár
2021-10-26 11:09 ` Stefan Roese
2021-10-26 12:40 ` Pali Rohár
2021-10-26 13:06 ` Marek Behún
2021-10-26 14:06 ` Stefan Roese
2021-10-26 14:21 ` Stefan Roese
2021-10-26 14:48 ` Pali Rohár
2021-10-26 15:13 ` Stefan Roese
2021-10-26 15:20 ` Marek Behún
2021-10-26 15:25 ` Stefan Roese
2021-10-26 15:34 ` Marek Behún
2021-10-26 15:40 ` Stefan Roese
2021-10-26 18:48 ` Pali Rohár
2021-10-27 5:09 ` Stefan Roese
2021-10-27 13:52 ` Pali Rohár
2021-10-27 14:10 ` Pali Rohár
2021-10-27 15:08 ` Marek Behún
2021-10-27 15:13 ` Pali Rohár
2021-10-27 15:27 ` Stefan Roese
2021-10-27 15:29 ` Pali Rohár
2021-10-27 21:03 ` Pali Rohár
2021-10-28 6:16 ` Stefan Roese
2021-10-28 11:04 ` Pali Rohár
2021-10-28 14:20 ` Stefan Roese
2021-10-28 17:00 ` Pali Rohár
2021-10-29 4:44 ` Stefan Roese
2021-11-03 7:46 ` Stefan Roese
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211025131304.21310-6-kabel@kernel.org \
--to=kabel@kernel.org \
--cc=marek.behun@nic.cz \
--cc=pali@kernel.org \
--cc=sr@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox