flash/stm32l4x: fix flash programming in 64-bit hosts 56/6556/3
authorTarek BOCHKATI <tarek.bouchkati@gmail.com>
Thu, 9 Sep 2021 21:14:36 +0000 (22:14 +0100)
committerTomas Vanek <vanekt@fbl.cz>
Sun, 12 Sep 2021 14:26:31 +0000 (14:26 +0000)
stm32l4_work_area struct is shared between the loader and stm32l4x flash driver

'*wp' and '*rp' pointers' size is 4 bytes each since stm32l4x devices have
32-bit processors.

however when used in openocd code, their size depends on the host
  if the host is 32-bit, then the size is 4 bytes each.
  if the host is 64-bit, then the size is 8 bytes each.

to avoid this size difference, change their types depending on the
usage (pointers for the loader, and 32-bit integers in openocd code).

Change-Id: I0a3df4bb4bf872b01cdb9357eb28307868d7d469
Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/6556
Tested-by: jenkins
Reviewed-by: Yestin Sun <sunyi0804@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
contrib/loaders/flash/stm32/stm32l4x.c
src/flash/nor/stm32l4x.c
src/flash/nor/stm32l4x.h

index bcad988437acb5fea8e036170b6f8ffc93b82a57..54c88a3355b0062b2bd60a6503acf2311b896753 100644 (file)
@@ -5,6 +5,8 @@
  *   tarek.bouchkati@st.com
  */
 
  *   tarek.bouchkati@st.com
  */
 
+#define OPENOCD_CONTRIB_LOADERS_FLASH_STM32_STM32L4X
+
 #include <stdint.h>
 #include "../../../../src/flash/nor/stm32l4x.h"
 
 #include <stdint.h>
 #include "../../../../src/flash/nor/stm32l4x.h"
 
index f76bc45fe91882c129c6623a18b8e1387f29a7b4..0182aae6600e601f0fca5bfc53f896d7f6db68ce 100644 (file)
@@ -1405,16 +1405,19 @@ static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer,
        armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
        armv7m_info.core_mode = ARM_MODE_THREAD;
 
        armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
        armv7m_info.core_mode = ARM_MODE_THREAD;
 
-       init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* buffer start, status (out) */
+       /* contrib/loaders/flash/stm32/stm32l4x.c:write() arguments */
+       init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* stm32l4_work_area ptr , status (out) */
        init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);    /* buffer end */
        init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);    /* target address */
        init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);    /* count (of stm32l4_info->data_width) */
        init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);    /* buffer end */
        init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);    /* target address */
        init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);    /* count (of stm32l4_info->data_width) */
-       init_reg_param(&reg_params[4], "sp", 32, PARAM_OUT);    /* write algo stack pointer */
 
        buf_set_u32(reg_params[0].value, 0, 32, source->address);
        buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size);
        buf_set_u32(reg_params[2].value, 0, 32, address);
        buf_set_u32(reg_params[3].value, 0, 32, count);
 
        buf_set_u32(reg_params[0].value, 0, 32, source->address);
        buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size);
        buf_set_u32(reg_params[2].value, 0, 32, address);
        buf_set_u32(reg_params[3].value, 0, 32, count);
+
+       /* write algo stack pointer */
+       init_reg_param(&reg_params[4], "sp", 32, PARAM_OUT);
        buf_set_u32(reg_params[4].value, 0, 32, source->address +
                        offsetof(struct stm32l4_work_area, stack) + LDR_STACK_SIZE);
 
        buf_set_u32(reg_params[4].value, 0, 32, source->address +
                        offsetof(struct stm32l4_work_area, stack) + LDR_STACK_SIZE);
 
index 4cc50a0404002ab4953c2f23cfb67e563ffe064c..4458c087560593dee9510f3b61f5d80c79b308f5 100644 (file)
@@ -136,9 +136,24 @@ struct stm32l4_work_area {
        } params;
        uint8_t stack[LDR_STACK_SIZE];
        struct flash_async_algorithm_circbuf {
        } params;
        uint8_t stack[LDR_STACK_SIZE];
        struct flash_async_algorithm_circbuf {
+               /* note: stm32l4_work_area struct is shared between the loader
+                * and stm32l4x flash driver.
+                *
+                * '*wp' and '*rp' pointers' size is 4 bytes each since stm32l4x
+                * devices have 32-bit processors.
+                * however when used in openocd code, their size depends on the host
+                *   if the host is 32-bit, then the size is 4 bytes each.
+                *   if the host is 64-bit, then the size is 8 bytes each.
+                * to avoid this size difference, change their types depending on the
+                * usage (pointers for the loader, and 32-bit integers in openocd code).
+                */
+#ifdef OPENOCD_CONTRIB_LOADERS_FLASH_STM32_STM32L4X
                uint8_t *wp;
                uint8_t *rp;
                uint8_t *wp;
                uint8_t *rp;
-               uint8_t *buf;
+#else
+               uint32_t wp;
+               uint32_t rp;
+#endif /* OPENOCD_CONTRIB_LOADERS_FLASH_STM32_STM32L4X */
        } fifo;
 };
 
        } fifo;
 };
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)