mirror of
https://gitee.com/open-loongarch/buildroot-2024.08.git
synced 2026-10-29 06:27:14 +08:00
first commit: base 2024.08
Signed-off-by: maoxiaochuan <maoxiaochuan@loongson.cn>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
config BR2_PACKAGE_MICROPYTHON
|
||||
bool "micropython"
|
||||
depends on BR2_TOOLCHAIN_HAS_THREADS
|
||||
depends on !BR2_STATIC_LIBS
|
||||
help
|
||||
MicroPython is a lean and fast implementation of the Python
|
||||
3 programming language that is optimised to run on a
|
||||
microcontroller.
|
||||
|
||||
https://micropython.org
|
||||
|
||||
if BR2_PACKAGE_MICROPYTHON
|
||||
|
||||
config BR2_PACKAGE_MICROPYTHON_LIB
|
||||
bool "micropython-lib"
|
||||
select BR2_PACKAGE_PCRE2 # runtime
|
||||
help
|
||||
Core Python libraries ported to MicroPython.
|
||||
|
||||
endif # BR2_PACKAGE_MICROPYTHON
|
||||
|
||||
comment "micropython needs a toolchain w/ threads, dynamic library"
|
||||
depends on !BR2_TOOLCHAIN_HAS_THREADS || BR2_STATIC_LIBS
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Sometime after v1.9.3, micropython-lib's directory structure was cleaned up and
|
||||
enhanced with manifest files.
|
||||
|
||||
Though cleaner, it means it cannot be directly copied into the target.
|
||||
This script is during build process to perform that conversion.
|
||||
|
||||
It makes use of manifestfile.py, which is normally located in micropython's
|
||||
tool directory.
|
||||
|
||||
It also depends on the micropython-lib that is cloned in lib/micropython-lib
|
||||
during build.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import manifestfile
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
def get_library_name_type(manifest_path: str) -> tuple[str, bool]:
|
||||
split = manifest_path.split("/")
|
||||
return (split[-2], "unix-ffi" in split) # -1: "manifest.py", -2: library name
|
||||
|
||||
|
||||
def get_all_libraries(mpy_lib_dir: str):
|
||||
# reuse manifestfile module capabilities to scan the micropython-lib directory
|
||||
|
||||
collected_list = manifestfile.ManifestFile(
|
||||
manifestfile.MODE_FREEZE, {"MPY_LIB_DIR": mpy_lib_dir}
|
||||
)
|
||||
collected_list.freeze(mpy_lib_dir)
|
||||
|
||||
for file in collected_list.files():
|
||||
if file.target_path.endswith("manifest.py"):
|
||||
yield get_library_name_type(file.full_path)
|
||||
|
||||
|
||||
def copy_file(src: str, target: str, destination: str):
|
||||
s = target.split("/")
|
||||
s.pop()
|
||||
d = f"{destination}/{'/'.join(s)}"
|
||||
os.makedirs(d, exist_ok=True)
|
||||
shutil.copy(src, f"{destination}/{target}")
|
||||
|
||||
|
||||
def copy_libraries(manifest, destination: str):
|
||||
for f in manifest.files():
|
||||
copy_file(f.full_path, f.target_path, destination)
|
||||
|
||||
|
||||
def process_cmdline_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Prepare micropython-lib to be installed"
|
||||
)
|
||||
parser.add_argument("micropython", help="Path to micropython source directory")
|
||||
parser.add_argument("destination", help="Destination directory")
|
||||
|
||||
args = parser.parse_args()
|
||||
return os.path.abspath(args.micropython), os.path.abspath(args.destination)
|
||||
|
||||
|
||||
def main():
|
||||
micropython_dir, destination_dir = process_cmdline_args()
|
||||
mpy_lib_dir = f"{micropython_dir}/lib/micropython-lib"
|
||||
|
||||
manifest = manifestfile.ManifestFile(
|
||||
manifestfile.MODE_FREEZE, {"MPY_LIB_DIR": mpy_lib_dir}
|
||||
)
|
||||
|
||||
for library, is_ffi in get_all_libraries(mpy_lib_dir):
|
||||
manifest.require(library, unix_ffi=is_ffi)
|
||||
|
||||
copy_libraries(manifest, destination_dir)
|
||||
|
||||
|
||||
main()
|
||||
@@ -0,0 +1,3 @@
|
||||
#locally computed
|
||||
sha256 a042764f0b6f6d92b267454c5bd5afcb83fc3900119f2583672aac571e661924 micropython-1.22.0.tar.xz
|
||||
sha256 d9e0e0395867c899090e150213bc2b417e970c17355a8d48300089875b3c8037 LICENSE
|
||||
@@ -0,0 +1,76 @@
|
||||
################################################################################
|
||||
#
|
||||
# micropython
|
||||
#
|
||||
################################################################################
|
||||
|
||||
MICROPYTHON_VERSION = 1.22.0
|
||||
MICROPYTHON_SITE = https://micropython.org/resources/source
|
||||
MICROPYTHON_SOURCE = micropython-$(MICROPYTHON_VERSION).tar.xz
|
||||
# Micropython has a lot of code copied from other projects, and also a number
|
||||
# of submodules for various libs. However, we don't even clone the submodules,
|
||||
# and most of the copied code is not used in the unix build.
|
||||
MICROPYTHON_LICENSE = MIT, BSD-1-Clause, BSD-3-Clause, Zlib
|
||||
MICROPYTHON_LICENSE_FILES = LICENSE
|
||||
MICROPYTHON_DEPENDENCIES = host-python3
|
||||
MICROPYTHON_CPE_ID_VENDOR = micropython
|
||||
|
||||
# Use fallback implementation for exception handling on architectures that don't
|
||||
# have explicit support.
|
||||
ifeq ($(BR2_i386)$(BR2_x86_64)$(BR2_arm)$(BR2_armeb),)
|
||||
MICROPYTHON_CFLAGS = -DMICROPY_GCREGS_SETJMP=1
|
||||
endif
|
||||
|
||||
# xtensa has problems with nlr_push, use setjmp based implementation instead
|
||||
ifeq ($(BR2_xtensa),y)
|
||||
MICROPYTHON_CFLAGS = -DMICROPY_NLR_SETJMP=1
|
||||
endif
|
||||
|
||||
# When building from a tarball we don't have some of the dependencies that are in
|
||||
# the git repository as submodules
|
||||
MICROPYTHON_MAKE_OPTS += \
|
||||
MICROPY_PY_BTREE=0 \
|
||||
MICROPY_PY_USSL=0 \
|
||||
CROSS_COMPILE=$(TARGET_CROSS) \
|
||||
CFLAGS_EXTRA=$(MICROPYTHON_CFLAGS) \
|
||||
LDFLAGS_EXTRA="$(TARGET_LDFLAGS)" \
|
||||
CWARN=
|
||||
|
||||
ifeq ($(BR2_PACKAGE_LIBFFI),y)
|
||||
MICROPYTHON_DEPENDENCIES += host-pkgconf libffi
|
||||
MICROPYTHON_MAKE_OPTS += MICROPY_PY_FFI=1
|
||||
else
|
||||
MICROPYTHON_MAKE_OPTS += MICROPY_PY_FFI=0
|
||||
endif
|
||||
|
||||
define MICROPYTHON_BUILD_CMDS
|
||||
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/mpy-cross
|
||||
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/ports/unix \
|
||||
$(MICROPYTHON_MAKE_OPTS)
|
||||
endef
|
||||
|
||||
define MICROPYTHON_INSTALL_TARGET_CMDS
|
||||
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/ports/unix \
|
||||
$(MICROPYTHON_MAKE_OPTS) \
|
||||
DESTDIR=$(TARGET_DIR) \
|
||||
PREFIX=/usr \
|
||||
install
|
||||
endef
|
||||
|
||||
ifeq ($(BR2_PACKAGE_MICROPYTHON_LIB),y)
|
||||
define MICROPYTHON_COLLECT_LIBS
|
||||
$(EXTRA_ENV) PYTHONPATH=$(@D)/tools \
|
||||
package/micropython/collect_micropython_lib.py \
|
||||
$(@D) $(@D)/.built_pylib
|
||||
endef
|
||||
|
||||
define MICROPYTHON_INSTALL_LIBS
|
||||
$(INSTALL) -d -m 0755 $(TARGET_DIR)/usr/lib/micropython
|
||||
cp -a $(@D)/.built_pylib/* $(TARGET_DIR)/usr/lib/micropython
|
||||
endef
|
||||
|
||||
MICROPYTHON_POST_BUILD_HOOKS += MICROPYTHON_COLLECT_LIBS
|
||||
MICROPYTHON_POST_INSTALL_TARGET_HOOKS += MICROPYTHON_INSTALL_LIBS
|
||||
endif
|
||||
|
||||
$(eval $(generic-package))
|
||||
Reference in New Issue
Block a user