From: "Yann E. MORIN" <yann.morin.1998@free.fr>
To: "J. Neuschäfer" <j.neuschaefer@gmx.net>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>, buildroot@buildroot.org
Subject: Re: [Buildroot] [PATCH v2 2/2] micropython: Add patch to avoid textrel on arm/thumb
Date: Sat, 1 Jun 2024 22:51:40 +0200 [thread overview]
Message-ID: <ZluJ3A9D-fTJKmJ1@landeda> (raw)
In-Reply-To: <20240529-ztext-v2-2-82985032f169@gmx.net>
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
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
next prev parent reply other threads:[~2024-06-01 20:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-29 18:22 [Buildroot] [PATCH v2 0/2] Add option to ban textrels J. Neuschäfer via buildroot
2024-05-29 18:22 ` [Buildroot] [PATCH v2 1/2] Config.in: ban textrels on musl toolchains J. Neuschäfer via buildroot
2024-06-01 20:59 ` Yann E. MORIN
2024-06-09 12:54 ` J. Neuschäfer via buildroot
2024-05-29 18:22 ` [Buildroot] [PATCH v2 2/2] micropython: Add patch to avoid textrel on arm/thumb J. Neuschäfer via buildroot
2024-06-01 20:51 ` Yann E. MORIN [this message]
2024-06-08 17:01 ` Peter Korsgaard
2024-06-09 4:12 ` Baruch Siach via buildroot
2024-06-09 8:33 ` Peter Korsgaard
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=ZluJ3A9D-fTJKmJ1@landeda \
--to=yann.morin.1998@free.fr \
--cc=buildroot@buildroot.org \
--cc=j.neuschaefer@gmx.net \
--cc=thomas.petazzoni@bootlin.com \
/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