diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fa66fb2e75..d385e8f7df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - arch: [x86_64, riscv64, aarch64, loongarch64] + arch: [x86_64, riscv64, aarch64, loongarch64, arm] rust-toolchain: [nightly, nightly-2025-05-20] env: RUSTUP_TOOLCHAIN: ${{ matrix.rust-toolchain }} @@ -18,7 +18,7 @@ jobs: with: toolchain: ${{ matrix.rust-toolchain }} components: rust-src, clippy, rustfmt - targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat + targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat, armv7a-none-eabi - name: Check rust version run: rustc --version --verbose - name: Check code format @@ -38,7 +38,7 @@ jobs: strategy: fail-fast: false matrix: - arch: [x86_64, riscv64, aarch64, loongarch64] + arch: [x86_64, riscv64, aarch64, loongarch64, arm] rust-toolchain: [nightly, nightly-2025-05-20] env: RUSTUP_TOOLCHAIN: ${{ matrix.rust-toolchain }} @@ -48,7 +48,7 @@ jobs: with: toolchain: ${{ matrix.rust-toolchain }} components: rust-src, llvm-tools - targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat + targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat, armv7a-none-eabi - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-bin-cache-${{ matrix.rust-toolchain }} @@ -66,7 +66,7 @@ jobs: continue-on-error: ${{ matrix.rust-toolchain == 'nightly' }} run: make ARCH=${{ matrix.arch }} A=examples/shell - - uses: arceos-org/setup-musl@v1 + - uses: arceos-org/setup-musl@v1.0.3 with: arch: ${{ matrix.arch }} - name: Build helloworld-c @@ -93,7 +93,7 @@ jobs: with: toolchain: ${{ matrix.rust-toolchain }} components: rust-src, llvm-tools - targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat + targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat, armv7a-none-eabi - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-bin-cache-${{ matrix.rust-toolchain }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1f77e61413..fef4c324f3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ on: [push, pull_request] env: qemu-version: 9.2.4 rust-toolchain: nightly-2025-05-20 - arceos-apps: '7ad6143' + arceos-apps: 'bcbbcb9' jobs: unit-test: @@ -24,7 +24,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - arch: [x86_64, riscv64, aarch64, loongarch64] + arch: [x86_64, riscv64, aarch64, loongarch64, arm] env: RUSTUP_TOOLCHAIN: nightly-2025-05-20 steps: @@ -33,7 +33,7 @@ jobs: with: toolchain: ${{ env.rust-toolchain }} components: rust-src, llvm-tools - targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat + targets: x86_64-unknown-none, riscv64gc-unknown-none-elf, aarch64-unknown-none-softfloat, loongarch64-unknown-none-softfloat, armv7a-none-eabi - uses: Swatinem/rust-cache@v2 with: shared-key: cargo-bin-cache-${{ env.rust-toolchain }} @@ -41,8 +41,8 @@ jobs: - uses: arceos-org/setup-qemu@v1 with: version: ${{ env.qemu-version }} - arch_list: x86_64,aarch64,riscv64,loongarch64 - - uses: arceos-org/setup-musl@v1 + arch_list: x86_64,aarch64,riscv64,loongarch64,arm + - uses: arceos-org/setup-musl@v1.0.3 with: arch: ${{ matrix.arch }} - name: Run app tests diff --git a/Cargo.lock b/Cargo.lock index 73c5517248..0e41082790 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,7 @@ dependencies = [ "axplat-aarch64-phytium-pi", "axplat-aarch64-qemu-virt", "axplat-aarch64-raspi", + "axplat-arm-qemu-virt", "axplat-loongarch64-qemu-virt", "axplat-riscv64-qemu-virt", "axplat-x86-pc", @@ -211,7 +212,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dda00d35b3c85f4e994746587c4579e63c0ba350b843fca96d6531b609292ae" dependencies = [ "aarch64-cpu", - "bitflags 2.11.0", + "bitflags 2.11.1", "enum_dispatch", "log", "paste", @@ -537,7 +538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcba2006898d7879d456a9c34b9c9460cb536f5bf69d1d5d7d0e0f19f073368d" dependencies = [ "axerrno 0.1.2", - "bitflags 2.11.0", + "bitflags 2.11.1", "log", ] @@ -552,6 +553,7 @@ dependencies = [ "axlog", "axplat", "axplat-aarch64-qemu-virt", + "axplat-arm-qemu-virt", "axplat-loongarch64-qemu-virt", "axplat-riscv64-qemu-virt", "axplat-x86-pc", @@ -655,12 +657,12 @@ dependencies = [ [[package]] name = "axplat" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f0aacd881a70f8ab32426ce1f2b235ae7d900745522aa5abfa9a7539fe6ab62" +checksum = "5de49c652acfdca161a878a26e1e592668128b51cc30f23ce889aed0728d1175" dependencies = [ "axplat-macros", - "bitflags 2.11.0", + "bitflags 2.11.1", "const-str", "crate_interface", "handler_table", @@ -744,6 +746,19 @@ dependencies = [ "log", ] +[[package]] +name = "axplat-arm-qemu-virt" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cdbcdf28488572c91e811174eb47d7ba50c26e003be531e4264074b01c613fb" +dependencies = [ + "axconfig-macros", + "axcpu", + "axplat", + "axplat-arm-peripherals", + "page_table_entry", +] + [[package]] name = "axplat-loongarch64-qemu-virt" version = "0.4.2" @@ -797,7 +812,7 @@ dependencies = [ "axconfig-macros", "axcpu", "axplat", - "bitflags 2.11.0", + "bitflags 2.11.1", "heapless 0.9.2", "int_ratio", "kspin", @@ -911,7 +926,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools", @@ -957,9 +972,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bitmap-allocator" @@ -1006,14 +1021,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9b24894fa5f73bbf9c72196e7f495a1f81d6218a548280a09ada4a937157692" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] name = "cc" -version = "1.2.59" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "shlex", @@ -1071,9 +1086,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -1093,9 +1108,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -1296,7 +1311,7 @@ name = "fatfs" version = "0.4.0" source = "git+https://github.com/rafalh/rust-fatfs?rev=4eccb50#4eccb50d011146fbed20e133d33b22f3c27292e7" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "log", ] @@ -1378,9 +1393,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heapless" @@ -1440,12 +1455,12 @@ checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "indexmap" -version = "2.13.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -1492,9 +1507,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ "once_cell", "wasm-bindgen", @@ -1543,9 +1558,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.184" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libloading" @@ -1565,18 +1580,18 @@ checksum = "1730c4ce817dc3edb092739ca5c109fe551018e5ea5a8361a8ddaa13d79ac8ed" [[package]] name = "linkme" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e3283ed2d0e50c06dd8602e0ab319bb048b6325d0bba739db64ed8205179898" +checksum = "e83272d46373fb8decca684579ac3e7c8f3d71d4cc3aa693df8759e260ae41cf" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5cec0ec4228b4853bb129c84dbf093a27e6c7a20526da046defc334a1b017f7" +checksum = "32d59e20403c7d08fe62b4376edfe5c7fb2ef1e6b1465379686d0f21c8df444b" dependencies = [ "proc-macro2", "quote", @@ -1600,12 +1615,12 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loongArch64" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9f0d275c70310e2a9d2fc23250c5ac826a73fa828a5f256401f85c5c554283" +checksum = "236e72a07bb26b68662f7cc9dcb58cea50cf5e3d8b698e1b51ff7c36d633dd92" dependencies = [ "bit_field", - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -1715,7 +1730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9a63b9b86d32f64c3874a90936939281d045ef1751d0aca3d82d5e4e06b2ef" dependencies = [ "aarch64-cpu", - "bitflags 2.11.0", + "bitflags 2.11.1", "memory_addr", "x86_64", ] @@ -1822,9 +1837,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "chacha20", "getrandom", @@ -1833,9 +1848,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "raw-cpuid" @@ -1852,7 +1867,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -2218,7 +2233,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d293f51425981fdb1b766beae254dbb711a17e8c4b549dc69b9b7ee0d478d5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "rustversion", "x86", ] @@ -2253,7 +2268,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfdc1c628cdd8ce7c3b9e65a8ed550d0338e9ef9f911e729666f1cce097de2f7" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "enumn", "log", "safe-mmio", @@ -2275,11 +2290,11 @@ checksum = "442887c63f2c839b346c192d047a7c87e73d0689c9157b00b53dcc27dd5ea793" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -2288,14 +2303,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -2306,9 +2321,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2316,9 +2331,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -2329,9 +2344,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -2364,7 +2379,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -2456,6 +2471,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -2505,7 +2526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.11.1", "indexmap", "log", "serde", @@ -2566,7 +2587,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7841fa0098ceb15c567d93d3fae292c49e10a7662b4936d5f6a9728594555ba" dependencies = [ "bit_field", - "bitflags 2.11.0", + "bitflags 2.11.1", "const_fn", "rustversion", "volatile 0.4.6", diff --git a/Makefile b/Makefile index 81189c725a..4e94959871 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Available arguments: # * General options: -# - `ARCH`: Target architecture: x86_64, riscv64, aarch64, loongarch64 +# - `ARCH`: Target architecture: x86_64, riscv64, aarch64, loongarch64, arm # - `MYPLAT`: Package name of the target platform crate. # - `PLAT_CONFIG`: Path to the platform configuration file. # - `SMP`: Override maximum CPU number specified in the platform config. For @@ -108,8 +108,10 @@ else ifeq ($(ARCH), riscv64) TARGET := riscv64gc-unknown-none-elf else ifeq ($(ARCH), loongarch64) TARGET := loongarch64-unknown-none-softfloat +else ifeq ($(ARCH), arm) + TARGET := armv7a-none-eabi else - $(error "ARCH" must be one of "x86_64", "riscv64", "aarch64" or "loongarch64") + $(error "ARCH" must be one of "x86_64", "riscv64", "aarch64", "loongarch64" or "arm") endif export AX_ARCH=$(ARCH) @@ -129,7 +131,11 @@ else endif # Binutils -CROSS_COMPILE ?= $(ARCH)-linux-musl- +ifeq ($(ARCH), arm) + CROSS_COMPILE ?= arm-linux-musleabi- +else + CROSS_COMPILE ?= $(ARCH)-linux-musl- +endif CC := $(CROSS_COMPILE)gcc AR := $(CROSS_COMPILE)ar RANLIB := $(CROSS_COMPILE)ranlib diff --git a/api/arceos_api/src/lib.rs b/api/arceos_api/src/lib.rs index d91da0c342..5c4248815b 100644 --- a/api/arceos_api/src/lib.rs +++ b/api/arceos_api/src/lib.rs @@ -3,7 +3,6 @@ //! [ArceOS]: https://github.com/arceos-org/arceos #![no_std] -#![feature(doc_auto_cfg)] #![feature(doc_cfg)] #![allow(unused_imports)] diff --git a/api/arceos_posix_api/build.rs b/api/arceos_posix_api/build.rs index f46d7f7100..bdd320c6a7 100644 --- a/api/arceos_posix_api/build.rs +++ b/api/arceos_posix_api/build.rs @@ -3,18 +3,43 @@ fn main() { fn gen_pthread_mutex(out_file: &str) -> std::io::Result<()> { // TODO: Generate size and initial content automatically. - let (mutex_size, mutex_init) = if cfg!(feature = "multitask") { - if cfg!(feature = "smp") { + let target_pointer_width = std::env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap(); + let long_size = if target_pointer_width == "32" { + 4 + } else if target_pointer_width == "64" { + 8 + } else { + panic!("unsupported target pointer width: {target_pointer_width}"); + }; + + let (mutex_size_bytes, mutex_init) = match ( + cfg!(feature = "multitask"), + cfg!(feature = "smp"), + target_pointer_width.as_str(), + ) { + (true, true, "32") => { + // core::mem::transmute::<_, [usize; 8]>(axsync::Mutex::new(())) + (32, "{0, 0, 0, 0, 4, 0, 0, 0}") + } + (true, true, "64") => { // core::mem::transmute::<_, [usize; 6]>(axsync::Mutex::new(())) - (6, "{0, 0, 8, 0, 0, 0}") - } else { + (48, "{0, 0, 8, 0, 0, 0}") + } + (true, false, "32") => { + // core::mem::transmute::<_, [usize; 6]>(axsync::Mutex::new(())) + (24, "{0, 4, 0, 0, 0, 0}") + } + (true, false, "64") => { // core::mem::transmute::<_, [usize; 5]>(axsync::Mutex::new(())) - (5, "{0, 8, 0, 0, 0}") + (40, "{0, 8, 0, 0, 0}") } - } else { - (1, "{0}") + (false, _, _) => (long_size, "{0}"), + _ => panic!("unsupported target pointer width: {target_pointer_width}"), }; + debug_assert_eq!(mutex_size_bytes % long_size, 0); + let mutex_long_count = mutex_size_bytes / long_size; + let mut output = Vec::new(); writeln!( output, @@ -24,8 +49,8 @@ fn main() { output, r#" typedef struct {{ - long __l[{mutex_size}]; -}} pthread_mutex_t; + long __l[{mutex_long_count}]; +}} __attribute__((aligned(8))) pthread_mutex_t; #define PTHREAD_MUTEX_INITIALIZER {{ .__l = {mutex_init} }} "# diff --git a/api/arceos_posix_api/src/imp/pthread/mutex.rs b/api/arceos_posix_api/src/imp/pthread/mutex.rs index 4d9e09dfc2..950d39fe13 100644 --- a/api/arceos_posix_api/src/imp/pthread/mutex.rs +++ b/api/arceos_posix_api/src/imp/pthread/mutex.rs @@ -4,12 +4,16 @@ use axerrno::LinuxResult; use axsync::Mutex; use core::ffi::c_int; -use core::mem::{ManuallyDrop, size_of}; +use core::mem::{ManuallyDrop, align_of, size_of}; static_assertions::const_assert_eq!( size_of::(), size_of::() ); +static_assertions::const_assert_eq!( + align_of::(), + align_of::() +); #[repr(C)] pub struct PthreadMutex(Mutex<()>); diff --git a/api/arceos_posix_api/src/imp/time.rs b/api/arceos_posix_api/src/imp/time.rs index 62458f489e..a54d59acbc 100644 --- a/api/arceos_posix_api/src/imp/time.rs +++ b/api/arceos_posix_api/src/imp/time.rs @@ -1,5 +1,5 @@ use axerrno::LinuxError; -use core::ffi::{c_int, c_long}; +use core::ffi::{c_int, c_long, c_longlong}; use core::time::Duration; use crate::ctypes; @@ -20,7 +20,7 @@ impl From for Duration { impl From for ctypes::timespec { fn from(d: Duration) -> Self { ctypes::timespec { - tv_sec: d.as_secs() as c_long, + tv_sec: d.as_secs() as c_longlong, tv_nsec: d.subsec_nanos() as c_long, } } @@ -29,7 +29,7 @@ impl From for ctypes::timespec { impl From for ctypes::timeval { fn from(d: Duration) -> Self { ctypes::timeval { - tv_sec: d.as_secs() as c_long, + tv_sec: d.as_secs() as c_longlong, tv_usec: d.subsec_micros() as c_long, } } diff --git a/api/arceos_posix_api/src/lib.rs b/api/arceos_posix_api/src/lib.rs index 50ccb833f4..95fe2c30ad 100644 --- a/api/arceos_posix_api/src/lib.rs +++ b/api/arceos_posix_api/src/lib.rs @@ -4,7 +4,6 @@ #![cfg_attr(all(not(test), not(doc)), no_std)] #![feature(doc_cfg)] -#![feature(doc_auto_cfg)] #![allow(clippy::missing_safety_doc)] #[macro_use] diff --git a/examples/helloworld-myplat/Cargo.toml b/examples/helloworld-myplat/Cargo.toml index 05d920f8ed..fff9cdcb03 100644 --- a/examples/helloworld-myplat/Cargo.toml +++ b/examples/helloworld-myplat/Cargo.toml @@ -12,6 +12,7 @@ aarch64-bsta1000b = ["dep:axplat-aarch64-bsta1000b"] aarch64-phytium-pi = ["dep:axplat-aarch64-phytium-pi"] riscv64-qemu-virt = ["dep:axplat-riscv64-qemu-virt"] loongarch64-qemu-virt = ["dep:axplat-loongarch64-qemu-virt"] +arm-qemu-virt = ["dep:axplat-arm-qemu-virt"] [dependencies] cfg-if = "1.0" @@ -26,6 +27,9 @@ axplat-aarch64-raspi = { version = "0.4", features = ["smp", "irq"], optional = axplat-aarch64-bsta1000b = { version = "0.4", features = ["smp", "irq"], optional = true } axplat-aarch64-phytium-pi = { version = "0.4", features = ["smp", "irq"], optional = true } +[target.'cfg(target_arch = "arm")'.dependencies] +axplat-arm-qemu-virt = { version = "0.4", features = ["smp", "irq"], optional = true } + [target.'cfg(target_arch = "riscv64")'.dependencies] axplat-riscv64-qemu-virt = { version = "0.4", features = ["smp", "irq"], optional = true } diff --git a/examples/helloworld-myplat/src/main.rs b/examples/helloworld-myplat/src/main.rs index ff1198b455..6403e82474 100644 --- a/examples/helloworld-myplat/src/main.rs +++ b/examples/helloworld-myplat/src/main.rs @@ -16,6 +16,8 @@ cfg_if::cfg_if! { extern crate axplat_riscv64_qemu_virt; } else if #[cfg(all(target_arch = "loongarch64", feature = "loongarch64-qemu-virt"))] { extern crate axplat_loongarch64_qemu_virt; + } else if #[cfg(all(target_arch = "arm", feature = "arm-qemu-virt"))] { + extern crate axplat_arm_qemu_virt; } else { #[cfg(target_os = "none")] // ignore in rust-analyzer & cargo test compile_error!("No platform crate linked!\n\nPlease add `extern crate ` in your code."); diff --git a/modules/axdriver/src/lib.rs b/modules/axdriver/src/lib.rs index cc9144645a..6f319c3bda 100644 --- a/modules/axdriver/src/lib.rs +++ b/modules/axdriver/src/lib.rs @@ -55,7 +55,6 @@ //! [dyn]: https://doc.rust-lang.org/std/keyword.dyn.html #![no_std] -#![feature(doc_auto_cfg)] #![feature(associated_type_defaults)] #[macro_use] diff --git a/modules/axfs/src/lib.rs b/modules/axfs/src/lib.rs index 4c69f5c745..d878203074 100644 --- a/modules/axfs/src/lib.rs +++ b/modules/axfs/src/lib.rs @@ -20,7 +20,6 @@ //! [`MyFileSystemIf`]: fops::MyFileSystemIf #![cfg_attr(all(not(test), not(doc)), no_std)] -#![feature(doc_auto_cfg)] #[macro_use] extern crate log; diff --git a/modules/axhal/Cargo.toml b/modules/axhal/Cargo.toml index 0fdf42562a..332a85e1b3 100644 --- a/modules/axhal/Cargo.toml +++ b/modules/axhal/Cargo.toml @@ -10,17 +10,17 @@ repository = "https://github.com/arceos-org/arceos/tree/main/modules/axhal" documentation = "https://arceos-org.github.io/arceos/axhal/index.html" [features] -smp = ["axplat-x86-pc?/smp", "axplat-aarch64-qemu-virt?/smp", "axplat-riscv64-qemu-virt?/smp", "axplat-loongarch64-qemu-virt?/smp", "axplat/smp"] -irq = ["linkme", "axplat-x86-pc?/irq", "axplat-aarch64-qemu-virt?/irq", "axplat-riscv64-qemu-virt?/irq", "axplat-loongarch64-qemu-virt?/irq", "axplat/irq"] -fp-simd = ["axcpu/fp-simd", "axplat-x86-pc?/fp-simd", "axplat-aarch64-qemu-virt?/fp-simd", "axplat-riscv64-qemu-virt?/fp-simd", "axplat-loongarch64-qemu-virt?/fp-simd"] -rtc = ["axplat-x86-pc?/rtc", "axplat-aarch64-qemu-virt?/rtc", "axplat-riscv64-qemu-virt?/rtc", "axplat-loongarch64-qemu-virt?/rtc"] +smp = ["axplat-x86-pc?/smp", "axplat-aarch64-qemu-virt?/smp", "axplat-riscv64-qemu-virt?/smp", "axplat-loongarch64-qemu-virt?/smp", "axplat-arm-qemu-virt?/smp", "axplat/smp"] +irq = ["linkme", "axplat-x86-pc?/irq", "axplat-aarch64-qemu-virt?/irq", "axplat-riscv64-qemu-virt?/irq", "axplat-loongarch64-qemu-virt?/irq", "axplat-arm-qemu-virt?/irq", "axplat/irq"] +fp-simd = ["axcpu/fp-simd", "axplat-x86-pc?/fp-simd", "axplat-aarch64-qemu-virt?/fp-simd", "axplat-riscv64-qemu-virt?/fp-simd", "axplat-loongarch64-qemu-virt?/fp-simd", "axplat-arm-qemu-virt?/fp-simd"] +rtc = ["axplat-x86-pc?/rtc", "axplat-aarch64-qemu-virt?/rtc", "axplat-riscv64-qemu-virt?/rtc", "axplat-loongarch64-qemu-virt?/rtc", "axplat-arm-qemu-virt?/rtc"] paging = ["axalloc", "page_table_multiarch"] tls = ["axcpu/tls"] uspace = ["paging", "axcpu/uspace"] # Custom or default platforms myplat = [] -defplat = ["dep:axplat-x86-pc", "dep:axplat-aarch64-qemu-virt", "dep:axplat-riscv64-qemu-virt", "dep:axplat-loongarch64-qemu-virt"] +defplat = ["dep:axplat-x86-pc", "dep:axplat-aarch64-qemu-virt", "dep:axplat-riscv64-qemu-virt", "dep:axplat-loongarch64-qemu-virt", "dep:axplat-arm-qemu-virt"] default = [] ipi = ["irq"] @@ -48,6 +48,9 @@ axplat-x86-pc = { version = "0.4", optional = true } aarch64-cpu = "11.2" axplat-aarch64-qemu-virt = { version = "0.4", optional = true } +[target.'cfg(target_arch = "arm")'.dependencies] +axplat-arm-qemu-virt = { version = "0.4", optional = true } + [target.'cfg(target_arch = "riscv64")'.dependencies] axplat-riscv64-qemu-virt = { version = "0.4", optional = true } diff --git a/modules/axhal/src/lib.rs b/modules/axhal/src/lib.rs index 2b200437b8..a7d9298764 100644 --- a/modules/axhal/src/lib.rs +++ b/modules/axhal/src/lib.rs @@ -28,7 +28,6 @@ //! [cargo test]: https://doc.rust-lang.org/cargo/guide/tests.html #![no_std] -#![feature(doc_auto_cfg)] #[allow(unused_imports)] #[macro_use] @@ -50,6 +49,8 @@ cfg_if::cfg_if! { extern crate axplat_x86_pc; #[cfg(target_arch = "aarch64")] extern crate axplat_aarch64_qemu_virt; + #[cfg(target_arch = "arm")] + extern crate axplat_arm_qemu_virt; #[cfg(target_arch = "riscv64")] extern crate axplat_riscv64_qemu_virt; #[cfg(target_arch = "loongarch64")] diff --git a/modules/axhal/src/paging.rs b/modules/axhal/src/paging.rs index fe109b9525..fd63dbae58 100644 --- a/modules/axhal/src/paging.rs +++ b/modules/axhal/src/paging.rs @@ -44,5 +44,8 @@ cfg_if::cfg_if! { } else if #[cfg(target_arch = "loongarch64")] { /// The architecture-specific page table. pub type PageTable = page_table_multiarch::loongarch64::LA64PageTable; + } else if #[cfg(target_arch = "arm")] { + /// The architecture-specific page table. + pub type PageTable = page_table_multiarch::arm::A32PageTable; } } diff --git a/modules/axhal/src/percpu.rs b/modules/axhal/src/percpu.rs index 939e7cbd9c..40ff1d0e81 100644 --- a/modules/axhal/src/percpu.rs +++ b/modules/axhal/src/percpu.rs @@ -72,6 +72,11 @@ pub fn current_task_ptr() -> *const T { } } } + #[cfg(target_arch = "arm")] + unsafe { + let _guard = kernel_guard::IrqSave::new(); + CURRENT_TASK_PTR.read_current_raw() as _ + } } /// Sets the pointer to the current task with preemption-safety. @@ -105,6 +110,11 @@ pub unsafe fn set_current_task_ptr(ptr: *const T) { cache_current_task_ptr(ptr); } } + #[cfg(target_arch = "arm")] + { + let _guard = kernel_guard::IrqSave::new(); + unsafe { CURRENT_TASK_PTR.write_current_raw(ptr as usize) } + } } #[allow(dead_code)] diff --git a/modules/axhal/src/tls.rs b/modules/axhal/src/tls.rs index 331fda3446..248fc7afc1 100644 --- a/modules/axhal/src/tls.rs +++ b/modules/axhal/src/tls.rs @@ -62,6 +62,9 @@ cfg_if::cfg_if! { if #[cfg(target_arch = "x86_64")] { const TCB_SIZE: usize = 8; // to store TLS self pointer const GAP_ABOVE_TP: usize = 0; + } else if #[cfg(target_arch = "arm")] { + const TCB_SIZE: usize = 0; + const GAP_ABOVE_TP: usize = 16; } else if #[cfg(target_arch = "aarch64")] { const TCB_SIZE: usize = 0; const GAP_ABOVE_TP: usize = 16; @@ -135,6 +138,7 @@ fn static_tls_offset() -> usize { if cfg!(target_arch = "x86_64") { 0 } else if cfg!(any( + target_arch = "arm", target_arch = "aarch64", target_arch = "riscv64", target_arch = "loongarch64" @@ -149,6 +153,7 @@ fn tp_offset() -> usize { if cfg!(target_arch = "x86_64") { static_tls_size() } else if cfg!(any( + target_arch = "arm", target_arch = "aarch64", target_arch = "riscv64", target_arch = "loongarch64" @@ -163,6 +168,7 @@ fn tls_area_size() -> usize { if cfg!(target_arch = "x86_64") { static_tls_size() + TCB_SIZE } else if cfg!(any( + target_arch = "arm", target_arch = "aarch64", target_arch = "riscv64", target_arch = "loongarch64" @@ -179,3 +185,12 @@ unsafe fn init_tcb(tls_area: *mut u8) { tp_addr.write(tp_addr as usize); // write self pointer } } + +/// Reads the thread pointer of the current CPU. +/// `__aeabi_read_tp` is used by the Rust compiler to +/// implement thread-local storage (TLS) access on ARM32. +#[unsafe(no_mangle)] +#[cfg(target_arch = "arm")] +extern "C" fn __aeabi_read_tp() -> *mut u8 { + crate::asm::read_thread_pointer() as *mut u8 +} diff --git a/modules/axnet/src/smoltcp_impl/bench.rs b/modules/axnet/src/smoltcp_impl/bench.rs index 81f21a69ef..e627d0024e 100644 --- a/modules/axnet/src/smoltcp_impl/bench.rs +++ b/modules/axnet/src/smoltcp_impl/bench.rs @@ -2,16 +2,16 @@ use super::{AxNetRxToken, AxNetTxToken, STANDARD_MTU}; use super::{DeviceWrapper, InterfaceWrapper}; use smoltcp::phy::{Device, RxToken, TxToken}; -const GB: usize = 1000 * MB; -const MB: usize = 1000 * KB; -const KB: usize = 1000; +const GB: u64 = 1000 * MB; +const MB: u64 = 1000 * KB; +const KB: u64 = 1000; impl DeviceWrapper { pub fn bench_transmit_bandwidth(&mut self) { // 10 Gb - const MAX_SEND_BYTES: usize = 10 * GB; - let mut send_bytes: usize = 0; - let mut past_send_bytes: usize = 0; + const MAX_SEND_BYTES: u64 = 10 * GB; + let mut send_bytes: u64 = 0; + let mut past_send_bytes: u64 = 0; let mut past_time = InterfaceWrapper::current_time(); // Send bytes @@ -23,7 +23,7 @@ impl DeviceWrapper { tx_buf[12..14].copy_from_slice(&[0x08, 0x00]); tx_buf[14..STANDARD_MTU].fill(1); }); - send_bytes += STANDARD_MTU; + send_bytes += STANDARD_MTU as u64; } let current_time = InterfaceWrapper::current_time(); @@ -44,15 +44,15 @@ impl DeviceWrapper { pub fn bench_receive_bandwidth(&mut self) { // 10 Gb - const MAX_RECEIVE_BYTES: usize = 10 * GB; - let mut receive_bytes: usize = 0; - let mut past_receive_bytes: usize = 0; + const MAX_RECEIVE_BYTES: u64 = 10 * GB; + let mut receive_bytes: u64 = 0; + let mut past_receive_bytes: u64 = 0; let mut past_time = InterfaceWrapper::current_time(); // Receive bytes while receive_bytes < MAX_RECEIVE_BYTES { if let Some(rx_token) = self.receive(InterfaceWrapper::current_time()) { AxNetRxToken::consume(rx_token.0, |rx_buf| { - receive_bytes += rx_buf.len(); + receive_bytes += rx_buf.len() as u64; }); } diff --git a/modules/axruntime/src/lib.rs b/modules/axruntime/src/lib.rs index 3f9a6b9b30..9849fa2b08 100644 --- a/modules/axruntime/src/lib.rs +++ b/modules/axruntime/src/lib.rs @@ -17,7 +17,6 @@ //! All the features are optional and disabled by default. #![cfg_attr(not(test), no_std)] -#![feature(doc_auto_cfg)] #[macro_use] extern crate axlog; diff --git a/modules/axtask/src/lib.rs b/modules/axtask/src/lib.rs index e22f816ae7..c765a9d1c3 100644 --- a/modules/axtask/src/lib.rs +++ b/modules/axtask/src/lib.rs @@ -27,7 +27,6 @@ #![cfg_attr(not(test), no_std)] #![feature(doc_cfg)] -#![feature(doc_auto_cfg)] #![feature(linkage)] #[cfg(test)] diff --git a/rust-toolchain.toml b/rust-toolchain.toml index c045ffc66b..1727658285 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -7,4 +7,5 @@ targets = [ "riscv64gc-unknown-none-elf", "aarch64-unknown-none-softfloat", "loongarch64-unknown-none-softfloat", + "armv7a-none-eabi", ] diff --git a/scripts/make/build_c.mk b/scripts/make/build_c.mk index a768287a9b..48595263be 100644 --- a/scripts/make/build_c.mk +++ b/scripts/make/build_c.mk @@ -36,6 +36,8 @@ endif ifeq ($(findstring fp-simd,$(FEATURES)),) ifeq ($(ARCH), x86_64) CFLAGS += -mno-sse + else ifeq ($(ARCH), arm) + CFLAGS += -mfloat-abi=soft else ifeq ($(ARCH), aarch64) CFLAGS += -mgeneral-regs-only endif @@ -46,6 +48,17 @@ else endif endif +ifeq ($(ARCH), arm) + # ARM32 commonly needs atomic runtime symbols at link time + # (e.g. __atomic_fetch_add_8), see: + # https://github.com/redis/redis/issues/6275 + # https://github.com/redis/redis/pull/6975 + libatomic := $(shell $(CC) -print-file-name=libatomic.a) + ifneq ($(libatomic),libatomic.a) + libgcc += $(libatomic) + endif +endif + _check_need_rebuild: $(obj_dir) @if [ "$(CFLAGS)" != "`cat $(last_cflags) 2>&1`" ]; then \ echo "CFLAGS changed, rebuild"; \ diff --git a/scripts/make/deps.mk b/scripts/make/deps.mk index bbeee1156b..1c4bef0802 100644 --- a/scripts/make/deps.mk +++ b/scripts/make/deps.mk @@ -3,17 +3,17 @@ # Tool to parse information about the target package ifeq ($(shell cargo axplat --version 2>/dev/null),) $(info Installing cargo-axplat...) - $(shell cargo install cargo-axplat) + $(shell cargo install cargo-axplat --locked) endif # Tool to generate platform configuration files ifeq ($(shell axconfig-gen --version 2>/dev/null),) $(info Installing axconfig-gen...) - $(shell cargo install axconfig-gen) + $(shell cargo install axconfig-gen --locked) endif # Cargo binutils ifeq ($(shell cargo install --list | grep cargo-binutils),) $(info Installing cargo-binutils...) - $(shell cargo install cargo-binutils) + $(shell cargo install cargo-binutils --locked) endif diff --git a/scripts/make/platform.mk b/scripts/make/platform.mk index 265c2f1721..580dbd12b0 100644 --- a/scripts/make/platform.mk +++ b/scripts/make/platform.mk @@ -29,8 +29,10 @@ ifeq ($(MYPLAT),) PLAT_PACKAGE := axplat-riscv64-qemu-virt else ifeq ($(ARCH), loongarch64) PLAT_PACKAGE := axplat-loongarch64-qemu-virt + else ifeq ($(ARCH), arm) + PLAT_PACKAGE := axplat-arm-qemu-virt else - $(error "ARCH" must be one of "x86_64", "riscv64", "aarch64" or "loongarch64") + $(error "ARCH" must be one of "x86_64", "riscv64", "aarch64", "loongarch64" or "arm") endif PLAT_CONFIG := $(strip $(call resolve_config)) # We don't need to check whether `PLAT_CONFIG` is valid here, as the `PLAT_PACKAGE` diff --git a/scripts/make/qemu.mk b/scripts/make/qemu.mk index f35663a6c6..c42a604d59 100644 --- a/scripts/make/qemu.mk +++ b/scripts/make/qemu.mk @@ -21,6 +21,8 @@ else ifeq ($(ARCH), aarch64) else machine := virt endif +else ifeq ($(ARCH), arm) + machine := virt,gic-version=2,highmem=off else ifeq ($(ARCH), loongarch64) machine := virt override MEM := 1G @@ -44,6 +46,11 @@ qemu_args-loongarch64 := \ -machine $(machine) \ -kernel $(OUT_ELF) +qemu_args-arm := \ + -machine $(machine) \ + -cpu cortex-a15 \ + -kernel $(FINAL_IMG) + qemu_args-y := -m $(MEM) -smp $(SMP) $(qemu_args-$(ARCH)) qemu_args-$(BLK) += \ diff --git a/ulib/axlibc/build.rs b/ulib/axlibc/build.rs index d8d7ce0dbe..55660711ae 100644 --- a/ulib/axlibc/build.rs +++ b/ulib/axlibc/build.rs @@ -1,4 +1,15 @@ fn main() { + fn clang_target_for_bindgen(target: &str) -> String { + match target { + // Clang does not accept Rust's `riscv64gc` arch suffix in the target triple. + "riscv64gc-unknown-none-elf" => "riscv64-unknown-elf".to_string(), + _ => target + .strip_suffix("-softfloat") + .unwrap_or(target) + .to_string(), + } + } + fn gen_c_to_rust_bindings(in_file: &str, out_file: &str) { println!("cargo:rerun-if-changed={in_file}"); @@ -10,10 +21,10 @@ fn main() { .derive_default(true) .size_t_is_usize(false) .use_core(); - if let Some(llvm_target) = target.strip_suffix("-softfloat") { - // remove "-softfloat" suffix for some targets - builder = builder.clang_arg(format!("--target={llvm_target}")); - } + // Always pass an explicit clang target to avoid using host ABI. + // Some Rust target triples are not accepted by clang and need mapping. + let clang_target = clang_target_for_bindgen(&target); + builder = builder.clang_arg(format!("--target={clang_target}")); for ty in allow_types { builder = builder.allowlist_type(ty); } diff --git a/ulib/axlibc/include/assert.h b/ulib/axlibc/include/assert.h index 0385fa3afe..23a58e0dc9 100644 --- a/ulib/axlibc/include/assert.h +++ b/ulib/axlibc/include/assert.h @@ -7,7 +7,11 @@ #define static_assert _Static_assert #endif +#ifdef NDEBUG +#define assert(x) ((void)0) +#else #define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, __func__), 0))) +#endif _Noreturn void __assert_fail(const char *, const char *, int, const char *); diff --git a/ulib/axlibc/include/float.h b/ulib/axlibc/include/float.h index 3a0da9cdfe..8ada1a45f5 100644 --- a/ulib/axlibc/include/float.h +++ b/ulib/axlibc/include/float.h @@ -39,7 +39,24 @@ #define LDBL_HAS_SUBNORM 1 #define LDBL_DECIMAL_DIG DECIMAL_DIG -#if defined(__aarch64__) +#if defined(__arm__) +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 4.94065645841246544177e-324L +#define LDBL_MIN 2.22507385850720138309e-308L +#define LDBL_MAX 1.79769313486231570815e+308L +#define LDBL_EPSILON 2.22044604925031308085e-16L + +#define LDBL_MANT_DIG 53 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MAX_EXP 1024 + +#define LDBL_DIG 15 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_10_EXP 308 + +#define DECIMAL_DIG 17 +#elif defined(__aarch64__) #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L diff --git a/ulib/axlibc/include/limits.h b/ulib/axlibc/include/limits.h index 26b213a962..946a456675 100644 --- a/ulib/axlibc/include/limits.h +++ b/ulib/axlibc/include/limits.h @@ -1,7 +1,11 @@ #ifndef __LIMITS__ #define __LIMITS__ +#if __riscv_xlen == 64 || defined(__x86_64__) || defined(__aarch64__) || defined(__loongarch__) #define __LONG_MAX 0x7fffffffffffffffL +#elif __riscv_xlen == 32 || defined(__i386__) || defined(__arm__) +#define __LONG_MAX 0x7fffffffL +#endif #define CHAR_BIT 8 #define SCHAR_MIN (-128) #define SCHAR_MAX 127 diff --git a/ulib/axlibc/include/setjmp.h b/ulib/axlibc/include/setjmp.h index 5f5ee0a076..53c38dc2c8 100644 --- a/ulib/axlibc/include/setjmp.h +++ b/ulib/axlibc/include/setjmp.h @@ -11,13 +11,15 @@ typedef unsigned long __jmp_buf[26]; typedef unsigned long __jmp_buf[8]; #elif defined(__loongarch__) typedef unsigned long __jmp_buf[21]; +#elif defined(__arm__) +typedef unsigned long __jmp_buf[26]; /* r4-r11, sp, lr, d8-d15 (VFP) */ #endif typedef struct __jmp_buf_tag { __jmp_buf __jb; unsigned long __fl; unsigned long __ss[128 / sizeof(long)]; -} jmp_buf[1]; +} __attribute__((aligned(8))) jmp_buf[1]; int setjmp(jmp_buf); _Noreturn void longjmp(jmp_buf, int); diff --git a/ulib/axlibc/include/stdint.h b/ulib/axlibc/include/stdint.h index 89d87f2458..823d423bdd 100644 --- a/ulib/axlibc/include/stdint.h +++ b/ulib/axlibc/include/stdint.h @@ -41,7 +41,7 @@ typedef int64_t intmax_t; #if __riscv_xlen == 64 || defined(__x86_64__) || defined(__aarch64__) || defined(__loongarch__) typedef int64_t intptr_t; typedef uint64_t uintptr_t; -#elif __riscv_xlen == 32 || defined(__i386__) +#elif __riscv_xlen == 32 || defined(__i386__) || defined(__arm__) typedef int32_t intptr_t; typedef uint32_t uintptr_t; #endif diff --git a/ulib/axlibc/src/lib.rs b/ulib/axlibc/src/lib.rs index d6d4f5edfe..c271da4a88 100644 --- a/ulib/axlibc/src/lib.rs +++ b/ulib/axlibc/src/lib.rs @@ -27,7 +27,6 @@ #![cfg_attr(all(not(test), not(doc)), no_std)] #![feature(doc_cfg)] -#![feature(doc_auto_cfg)] #![feature(thread_local)] #![allow(clippy::missing_safety_doc)] diff --git a/ulib/axlibc/src/malloc.rs b/ulib/axlibc/src/malloc.rs index a7bf5ba833..bda0a5e56f 100644 --- a/ulib/axlibc/src/malloc.rs +++ b/ulib/axlibc/src/malloc.rs @@ -12,6 +12,7 @@ use core::ffi::c_void; use crate::ctypes; +#[repr(C, align(8))] struct MemoryControlBlock { size: usize, } diff --git a/ulib/axlibc/src/setjmp.rs b/ulib/axlibc/src/setjmp.rs index e8ff3c3455..2d7d1975e8 100644 --- a/ulib/axlibc/src/setjmp.rs +++ b/ulib/axlibc/src/setjmp.rs @@ -152,13 +152,54 @@ pub unsafe extern "C" fn setjmp(_buf: *mut ctypes::__jmp_buf_tag) { li.w $a0, 0 ret", ); + #[cfg(all(target_arch = "arm", feature = "fp-simd"))] + core::arch::naked_asm!( + "str r4, [r0, #0] + str r5, [r0, #4] + str r6, [r0, #8] + str r7, [r0, #12] + str r8, [r0, #16] + str r9, [r0, #20] + str r10, [r0, #24] + str r11, [r0, #28] + str sp, [r0, #32] + str lr, [r0, #36] + vstr d8, [r0, #40] + vstr d9, [r0, #48] + vstr d10, [r0, #56] + vstr d11, [r0, #64] + vstr d12, [r0, #72] + vstr d13, [r0, #80] + vstr d14, [r0, #88] + vstr d15, [r0, #96] + mov r0, #0 + bx lr", + ); + + #[cfg(all(target_arch = "arm", not(feature = "fp-simd")))] + core::arch::naked_asm!( + "str r4, [r0, #0] + str r5, [r0, #4] + str r6, [r0, #8] + str r7, [r0, #12] + str r8, [r0, #16] + str r9, [r0, #20] + str r10, [r0, #24] + str r11, [r0, #28] + str sp, [r0, #32] + str lr, [r0, #36] + mov r0, #0 + bx lr", + ); + #[cfg(not(any( target_arch = "aarch64", target_arch = "x86_64", target_arch = "riscv64", - target_arch = "loongarch64" + target_arch = "loongarch64", + target_arch = "arm" )))] - core::arch::naked_asm!("ret") + compile_error!("Unsupported target architecture for setjmp"); } /// `longjmp` implementation @@ -322,4 +363,56 @@ pub unsafe extern "C" fn longjmp(_buf: *mut ctypes::__jmp_buf_tag, _val: c_int) add.d $a0, $a0, $a1 jirl $zero,$ra, 0", ); + #[cfg(all(target_arch = "arm", feature = "fp-simd"))] + core::arch::naked_asm!( + "ldr r4, [r0, #0] + ldr r5, [r0, #4] + ldr r6, [r0, #8] + ldr r7, [r0, #12] + ldr r8, [r0, #16] + ldr r9, [r0, #20] + ldr r10, [r0, #24] + ldr r11, [r0, #28] + ldr sp, [r0, #32] + ldr lr, [r0, #36] + vldr d8, [r0, #40] + vldr d9, [r0, #48] + vldr d10, [r0, #56] + vldr d11, [r0, #64] + vldr d12, [r0, #72] + vldr d13, [r0, #80] + vldr d14, [r0, #88] + vldr d15, [r0, #96] + cmp r1, #0 + moveq r0, #1 + movne r0, r1 + bx lr", + ); + + #[cfg(all(target_arch = "arm", not(feature = "fp-simd")))] + core::arch::naked_asm!( + "ldr r4, [r0, #0] + ldr r5, [r0, #4] + ldr r6, [r0, #8] + ldr r7, [r0, #12] + ldr r8, [r0, #16] + ldr r9, [r0, #20] + ldr r10, [r0, #24] + ldr r11, [r0, #28] + ldr sp, [r0, #32] + ldr lr, [r0, #36] + cmp r1, #0 + moveq r0, #1 + movne r0, r1 + bx lr", + ); + + #[cfg(not(any( + target_arch = "aarch64", + target_arch = "x86_64", + target_arch = "riscv64", + target_arch = "loongarch64", + target_arch = "arm" + )))] + compile_error!("Unsupported target architecture for longjmp"); } diff --git a/ulib/axstd/src/lib.rs b/ulib/axstd/src/lib.rs index 26b63b288c..95278f8b2d 100644 --- a/ulib/axstd/src/lib.rs +++ b/ulib/axstd/src/lib.rs @@ -48,7 +48,6 @@ #![cfg_attr(all(not(test), not(doc)), no_std)] #![feature(doc_cfg)] -#![feature(doc_auto_cfg)] #[cfg(feature = "alloc")] extern crate alloc;