diff mbox series

[v2,2/2] micropython: Add patch to avoid textrel on arm/thumb

Message ID 20240529-ztext-v2-2-82985032f169@gmx.net
State Accepted
Headers show
Series Add option to ban textrels | expand

Commit Message

J. Neuschäfer May 29, 2024, 6:22 p.m. UTC
Signed-off-by: J. Neuschäfer <j.neuschaefer@gmx.net>
---
 ...-Make-non-Thumb2-long-jump-workaround-opt.patch | 130 +++++++++++++++++++++
 1 file changed, 130 insertions(+)


--
2.43.0

Comments

Yann E. MORIN June 1, 2024, 8:51 p.m. UTC | #1
J., All,

On 2024-05-29 20:22 +0200, J. Neuschäfer via buildroot spake thusly:
> Signed-off-by: J. Neuschäfer <j.neuschaefer@gmx.net>

Applied to master, thanks.

Regards,
Yann E. MORIN.

> ---
>  ...-Make-non-Thumb2-long-jump-workaround-opt.patch | 130 +++++++++++++++++++++
>  1 file changed, 130 insertions(+)
> 
> diff --git a/package/micropython/0001-py-nlrthumb-Make-non-Thumb2-long-jump-workaround-opt.patch b/package/micropython/0001-py-nlrthumb-Make-non-Thumb2-long-jump-workaround-opt.patch
> new file mode 100644
> index 0000000000..f41c11371a
> --- /dev/null
> +++ b/package/micropython/0001-py-nlrthumb-Make-non-Thumb2-long-jump-workaround-opt.patch
> @@ -0,0 +1,130 @@
> +From 7b050b366b7dacfb43779c51702a892d8f1873d0 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?J=2E=20Neusch=C3=A4fer?= <j.ne@posteo.net>
> +Date: Sun, 2 Apr 2023 19:58:42 +0200
> +Subject: [PATCH] py/nlrthumb: Make non-Thumb2 long-jump workaround opt-in.
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Although the original motivation given for the workaround[1] is correct,
> +nlr.o and nlrthumb.o are linked with a small enough distance that the
> +problem does not occur, and the workaround isn't necessary. The distance
> +between the b instruction and its target (nlr_push_tail) is just 64
> +bytes[2], well within the ±2046 byte range addressable by an
> +unconditional branch instruction in Thumb mode.
> +
> +The workaround induces a relocation in the text section (textrel), which
> +isn't supported everywhere, notably not on musl-libc[3], where it causes
> +a crash on start-up. With the workaround removed, micropython works on an
> +ARMv5T Linux system built with musl-libc.
> +
> +This commit changes nlrthumb.c to use a direct jump by default, but
> +leaves the long jump workaround as an option for those cases where it's
> +actually needed.
> +
> +[1]: commit dd376a239dc4f47b0ee7866810fcda151f3cf6dd
> +
> +Author: Damien George <damien.p.george@gmail.com>
> +Date:   Fri Sep 1 15:25:29 2017 +1000
> +
> +    py/nlrthumb: Get working again on standard Thumb arch (ie not Thumb2).
> +
> +    "b" on Thumb might not be long enough for the jump to nlr_push_tail so
> +    it must be done indirectly.
> +
> +[2]: Excerpt from objdump -d micropython:
> +
> +000095c4 <nlr_push_tail>:
> +    95c4:       b510            push    {r4, lr}
> +    95c6:       0004            movs    r4, r0
> +    95c8:       f02d fd42       bl      37050 <mp_thread_get_state>
> +    95cc:       6943            ldr     r3, [r0, #20]
> +    95ce:       6023            str     r3, [r4, #0]
> +    95d0:       6144            str     r4, [r0, #20]
> +    95d2:       2000            movs    r0, #0
> +    95d4:       bd10            pop     {r4, pc}
> +
> +000095d6 <nlr_pop>:
> +    95d6:       b510            push    {r4, lr}
> +    95d8:       f02d fd3a       bl      37050 <mp_thread_get_state>
> +    95dc:       6943            ldr     r3, [r0, #20]
> +    95de:       681b            ldr     r3, [r3, #0]
> +    95e0:       6143            str     r3, [r0, #20]
> +    95e2:       bd10            pop     {r4, pc}
> +
> +000095e4 <nlr_push>:
> +    95e4:       60c4            str     r4, [r0, #12]
> +    95e6:       6105            str     r5, [r0, #16]
> +    95e8:       6146            str     r6, [r0, #20]
> +    95ea:       6187            str     r7, [r0, #24]
> +    95ec:       4641            mov     r1, r8
> +    95ee:       61c1            str     r1, [r0, #28]
> +    95f0:       4649            mov     r1, r9
> +    95f2:       6201            str     r1, [r0, #32]
> +    95f4:       4651            mov     r1, sl
> +    95f6:       6241            str     r1, [r0, #36]   @ 0x24
> +    95f8:       4659            mov     r1, fp
> +    95fa:       6281            str     r1, [r0, #40]   @ 0x28
> +    95fc:       4669            mov     r1, sp
> +    95fe:       62c1            str     r1, [r0, #44]   @ 0x2c
> +    9600:       4671            mov     r1, lr
> +    9602:       6081            str     r1, [r0, #8]
> +    9604:       e7de            b.n     95c4 <nlr_push_tail>
> +
> +[3]: https://www.openwall.com/lists/musl/2020/09/25/4
> +
> +Signed-off-by: J. Neuschäfer <j.ne@posteo.net>
> +Upstream: https://github.com/micropython/micropython/commit/7b050b366b7dacfb43779c51702a892d8f1873d0
> +---
> + py/mpconfig.h |  6 ++++++
> + py/nlrthumb.c | 10 +++++++++-
> + 2 files changed, 15 insertions(+), 1 deletion(-)
> +
> +diff --git a/py/mpconfig.h b/py/mpconfig.h
> +index af2480266..1aa3e0699 100644
> +--- a/py/mpconfig.h
> ++++ b/py/mpconfig.h
> +@@ -587,6 +587,12 @@
> + /*****************************************************************************/
> + /* Python internal features                                                  */
> +
> ++// Use a special long jump in nlrthumb.c, which may be necessary if nlr.o and
> ++// nlrthumb.o are linked far apart from each other.
> ++#ifndef MICROPY_NLR_THUMB_USE_LONG_JUMP
> ++#define MICROPY_NLR_THUMB_USE_LONG_JUMP (0)
> ++#endif
> ++
> + // Whether to enable import of external modules
> + // When disabled, only importing of built-in modules is supported
> + // When enabled, a port must implement mp_import_stat (among other things)
> +diff --git a/py/nlrthumb.c b/py/nlrthumb.c
> +index a22c5df5b..e7b24f242 100644
> +--- a/py/nlrthumb.c
> ++++ b/py/nlrthumb.c
> +@@ -38,6 +38,14 @@
> +
> + __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
> +
> ++    // If you get a linker error here, indicating that a relocation doesn't
> ++    // fit, try the following (in that order):
> ++    //
> ++    // 1. Ensure that nlr.o nlrthumb.o are linked closely together, i.e.
> ++    //    there aren't too many other files between them in the linker list
> ++    //    (PY_CORE_O_BASENAME in py/py.mk)
> ++    // 2. Set -DMICROPY_NLR_THUMB_USE_LONG_JUMP=1 during the build
> ++    //
> +     __asm volatile (
> +         "str    r4, [r0, #12]       \n" // store r4 into nlr_buf
> +         "str    r5, [r0, #16]       \n" // store r5 into nlr_buf
> +@@ -71,7 +79,7 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
> +         "str    lr, [r0, #8]        \n" // store lr into nlr_buf
> +         #endif
> +
> +-        #if !defined(__thumb2__)
> ++        #if MICROPY_NLR_THUMB_USE_LONG_JUMP
> +         "ldr    r1, nlr_push_tail_var \n"
> +         "bx     r1                  \n" // do the rest in C
> +         ".align 2                   \n"
> +--
> +2.43.0
> +
> 
> --
> 2.43.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
Peter Korsgaard June 8, 2024, 5:01 p.m. UTC | #2
>>>>> "J" == J Neuschäfer via buildroot <buildroot@buildroot.org> writes:

 > Signed-off-by: J. Neuschäfer <j.neuschaefer@gmx.net>

Committed to 2024.02.x, thanks.
Baruch Siach June 9, 2024, 4:12 a.m. UTC | #3
Hi Peter,

On Sat, Jun 08 2024, Peter Korsgaard wrote:

>>>>>> "J" == J Neuschäfer via buildroot <buildroot@buildroot.org> writes:
>
>  > Signed-off-by: J. Neuschäfer <j.neuschaefer@gmx.net>
>
> Committed to 2024.02.x, thanks.

Not in 2024.02.x as of commit ee6694e9704b ("package/libopenssl:
security bump to version 3.2.2").

baruch
Peter Korsgaard June 9, 2024, 8:33 a.m. UTC | #4
>>>>> "Baruch" == Baruch Siach <baruch@tkos.co.il> writes:

 > Hi Peter,
 > On Sat, Jun 08 2024, Peter Korsgaard wrote:

 >>>>>>> "J" == J Neuschäfer via buildroot <buildroot@buildroot.org> writes:
 >> 
 >> > Signed-off-by: J. Neuschäfer <j.neuschaefer@gmx.net>
 >> 
 >> Committed to 2024.02.x, thanks.

 > Not in 2024.02.x as of commit ee6694e9704b ("package/libopenssl:
 > security bump to version 3.2.2").

Ups, thanks for the heads up - Fixed now.
diff mbox series

Patch

diff --git a/package/micropython/0001-py-nlrthumb-Make-non-Thumb2-long-jump-workaround-opt.patch b/package/micropython/0001-py-nlrthumb-Make-non-Thumb2-long-jump-workaround-opt.patch
new file mode 100644
index 0000000000..f41c11371a
--- /dev/null
+++ b/package/micropython/0001-py-nlrthumb-Make-non-Thumb2-long-jump-workaround-opt.patch
@@ -0,0 +1,130 @@ 
+From 7b050b366b7dacfb43779c51702a892d8f1873d0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?J=2E=20Neusch=C3=A4fer?= <j.ne@posteo.net>
+Date: Sun, 2 Apr 2023 19:58:42 +0200
+Subject: [PATCH] py/nlrthumb: Make non-Thumb2 long-jump workaround opt-in.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Although the original motivation given for the workaround[1] is correct,
+nlr.o and nlrthumb.o are linked with a small enough distance that the
+problem does not occur, and the workaround isn't necessary. The distance
+between the b instruction and its target (nlr_push_tail) is just 64
+bytes[2], well within the ±2046 byte range addressable by an
+unconditional branch instruction in Thumb mode.
+
+The workaround induces a relocation in the text section (textrel), which
+isn't supported everywhere, notably not on musl-libc[3], where it causes
+a crash on start-up. With the workaround removed, micropython works on an
+ARMv5T Linux system built with musl-libc.
+
+This commit changes nlrthumb.c to use a direct jump by default, but
+leaves the long jump workaround as an option for those cases where it's
+actually needed.
+
+[1]: commit dd376a239dc4f47b0ee7866810fcda151f3cf6dd
+
+Author: Damien George <damien.p.george@gmail.com>
+Date:   Fri Sep 1 15:25:29 2017 +1000
+
+    py/nlrthumb: Get working again on standard Thumb arch (ie not Thumb2).
+
+    "b" on Thumb might not be long enough for the jump to nlr_push_tail so
+    it must be done indirectly.
+
+[2]: Excerpt from objdump -d micropython:
+
+000095c4 <nlr_push_tail>:
+    95c4:       b510            push    {r4, lr}
+    95c6:       0004            movs    r4, r0
+    95c8:       f02d fd42       bl      37050 <mp_thread_get_state>
+    95cc:       6943            ldr     r3, [r0, #20]
+    95ce:       6023            str     r3, [r4, #0]
+    95d0:       6144            str     r4, [r0, #20]
+    95d2:       2000            movs    r0, #0
+    95d4:       bd10            pop     {r4, pc}
+
+000095d6 <nlr_pop>:
+    95d6:       b510            push    {r4, lr}
+    95d8:       f02d fd3a       bl      37050 <mp_thread_get_state>
+    95dc:       6943            ldr     r3, [r0, #20]
+    95de:       681b            ldr     r3, [r3, #0]
+    95e0:       6143            str     r3, [r0, #20]
+    95e2:       bd10            pop     {r4, pc}
+
+000095e4 <nlr_push>:
+    95e4:       60c4            str     r4, [r0, #12]
+    95e6:       6105            str     r5, [r0, #16]
+    95e8:       6146            str     r6, [r0, #20]
+    95ea:       6187            str     r7, [r0, #24]
+    95ec:       4641            mov     r1, r8
+    95ee:       61c1            str     r1, [r0, #28]
+    95f0:       4649            mov     r1, r9
+    95f2:       6201            str     r1, [r0, #32]
+    95f4:       4651            mov     r1, sl
+    95f6:       6241            str     r1, [r0, #36]   @ 0x24
+    95f8:       4659            mov     r1, fp
+    95fa:       6281            str     r1, [r0, #40]   @ 0x28
+    95fc:       4669            mov     r1, sp
+    95fe:       62c1            str     r1, [r0, #44]   @ 0x2c
+    9600:       4671            mov     r1, lr
+    9602:       6081            str     r1, [r0, #8]
+    9604:       e7de            b.n     95c4 <nlr_push_tail>
+
+[3]: https://www.openwall.com/lists/musl/2020/09/25/4
+
+Signed-off-by: J. Neuschäfer <j.ne@posteo.net>
+Upstream: https://github.com/micropython/micropython/commit/7b050b366b7dacfb43779c51702a892d8f1873d0
+---
+ py/mpconfig.h |  6 ++++++
+ py/nlrthumb.c | 10 +++++++++-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/py/mpconfig.h b/py/mpconfig.h
+index af2480266..1aa3e0699 100644
+--- a/py/mpconfig.h
++++ b/py/mpconfig.h
+@@ -587,6 +587,12 @@
+ /*****************************************************************************/
+ /* Python internal features                                                  */
+
++// Use a special long jump in nlrthumb.c, which may be necessary if nlr.o and
++// nlrthumb.o are linked far apart from each other.
++#ifndef MICROPY_NLR_THUMB_USE_LONG_JUMP
++#define MICROPY_NLR_THUMB_USE_LONG_JUMP (0)
++#endif
++
+ // Whether to enable import of external modules
+ // When disabled, only importing of built-in modules is supported
+ // When enabled, a port must implement mp_import_stat (among other things)
+diff --git a/py/nlrthumb.c b/py/nlrthumb.c
+index a22c5df5b..e7b24f242 100644
+--- a/py/nlrthumb.c
++++ b/py/nlrthumb.c
+@@ -38,6 +38,14 @@
+
+ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
+
++    // If you get a linker error here, indicating that a relocation doesn't
++    // fit, try the following (in that order):
++    //
++    // 1. Ensure that nlr.o nlrthumb.o are linked closely together, i.e.
++    //    there aren't too many other files between them in the linker list
++    //    (PY_CORE_O_BASENAME in py/py.mk)
++    // 2. Set -DMICROPY_NLR_THUMB_USE_LONG_JUMP=1 during the build
++    //
+     __asm volatile (
+         "str    r4, [r0, #12]       \n" // store r4 into nlr_buf
+         "str    r5, [r0, #16]       \n" // store r5 into nlr_buf
+@@ -71,7 +79,7 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
+         "str    lr, [r0, #8]        \n" // store lr into nlr_buf
+         #endif
+
+-        #if !defined(__thumb2__)
++        #if MICROPY_NLR_THUMB_USE_LONG_JUMP
+         "ldr    r1, nlr_push_tail_var \n"
+         "bx     r1                  \n" // do the rest in C
+         ".align 2                   \n"
+--
+2.43.0
+