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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.