first commit: base 2024.08

Signed-off-by: maoxiaochuan <maoxiaochuan@loongson.cn>
This commit is contained in:
tao89959
2025-02-12 17:59:29 +08:00
committed by maoxiaochuan
commit f3217a7708
14356 changed files with 572894 additions and 0 deletions
@@ -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
+23
View File
@@ -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
View File
@@ -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()
+3
View File
@@ -0,0 +1,3 @@
#locally computed
sha256 a042764f0b6f6d92b267454c5bd5afcb83fc3900119f2583672aac571e661924 micropython-1.22.0.tar.xz
sha256 d9e0e0395867c899090e150213bc2b417e970c17355a8d48300089875b3c8037 LICENSE
+76
View File
@@ -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))