From 1348508138b41d6a11017b6006724ada2bfc197c Mon Sep 17 00:00:00 2001 From: Cody-ic <261693366+Cody-ic@users.noreply.github.com> Date: Mon, 12 Oct 2026 13:25:10 +0800 Subject: [PATCH] =?UTF-8?q?[fpga]=20test:=20=E5=BD=92=E6=A1=A3=20Linux/Gem?= =?UTF-8?q?mini=20=E5=AE=9E=E7=89=A9=E6=B5=8B=E8=AF=95=E4=B8=8E=E5=A4=8D?= =?UTF-8?q?=E7=8E=B0=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/arty-a7-toy.yml | 2 + platforms/arty-a7-toy/README.md | 11 +- platforms/arty-a7-toy/SOURCE_LOCK.json | 74 +- platforms/arty-a7-toy/VALIDATION.md | 18 +- .../2026-10-12/linux-gemmini/MANIFEST.json | 240 +++ .../2026-10-12/linux-gemmini/README.md | 36 + .../2026-10-12/linux-gemmini/REPORT.md | 81 + .../build/BOARD_FIRMWARE_RESULT.json | 29 + .../linux-gemmini/build/INPUT_MANIFEST.json | 203 +++ .../build/LINUX_GEMMINI_BUILD.json | 86 + .../linux-gemmini/build/SESSION.json | 6 + .../2026-10-12/linux-gemmini/build/build.log | 1564 +++++++++++++++++ .../linux-gemmini/first-pass/LOAD_RESULT.json | 12 + .../linux-gemmini/first-pass/PERFORMANCE.json | 169 ++ .../linux-gemmini/first-pass/RESULT.json | 109 ++ .../linux-gemmini/first-pass/boot-console.log | 142 ++ .../first-pass/linux-console.log | 234 +++ .../generated-inputs/CMakeLists.txt | 53 + .../generated-inputs/PREPARED.json | 30 + .../linux-gemmini/generated-inputs/ballISA.h | 23 + .../generated-inputs/gemmini_linux_check.c | 132 ++ .../gemmini_os_cisc_atranspose_test.c | 47 + .../gemmini_os_cisc_basic_test.c | 45 + .../gemmini_os_cisc_btranspose_test.c | 47 + .../gemmini_os_cisc_shift_test.c | 48 + .../gemmini_os_risc_abtranspose_test.c | 53 + .../gemmini_os_risc_atranspose_test.c | 51 + .../gemmini_os_risc_basic_test.c | 71 + .../gemmini_os_risc_btranspose_test.c | 51 + .../gemmini_os_risc_shift_test.c | 52 + .../gemmini_ws_cisc_conv_test.c | 74 + .../gemmini_ws_risc_basic_test.c | 53 + .../gemmini_ws_risc_btranspose_test.c | 56 + .../gemmini_ws_risc_shift_test.c | 57 + .../linux-gemmini/generated-inputs/params.h | 5 + .../linux-gemmini/hardware/LOAD_RESULT.json | 12 + .../linux-gemmini/hardware/PERFORMANCE.json | 169 ++ .../linux-gemmini/hardware/POST_RESULT.json | 9 + .../linux-gemmini/hardware/RESULT.json | 109 ++ .../linux-gemmini/hardware/boot-console.log | 142 ++ .../linux-gemmini/hardware/linux-console.log | 235 +++ .../linux-gemmini/hardware/post-console.log | 8 + .../hardware/program-console.log | 64 + .../linux-gemmini/hardware/program.jou | 24 + .../linux-gemmini/hardware/program.log | 78 + .../2026-10-12/linux-gemmini/load/RESULT.json | 12 + .../linux-gemmini/load/linux-boot.log | 142 ++ .../linux-gemmini/load/transfer.log | 30 + .../sources/board/program_arty.tcl | 25 + .../sources/diagnostics/check_watchdog.py | 49 + .../sources/diagnostics/post_gemmini_live.py | 47 + .../sources/host/check_linux_gemmini.py | 181 ++ .../sources/host/ftdi_transport.py | 105 ++ .../linux-gemmini/sources/host/load.py | 103 ++ .../linux-gemmini/sources/program.tcl | 5 + .../sources/scripts/remote_linux_gemmini.py | 90 + .../sources/scripts/verify_linux_gemmini.py | 121 ++ .../sources/software/build_gemmini_image.py | 82 + .../sources/software/gemmini_linux_check.c | 132 ++ .../sources/software/prepare_gemmini_linux.py | 91 + .../linux-gemmini/watchdog/RESULT.json | 26 + .../linux-gemmini/watchdog/check.log | 22 + .../arty-a7-toy/host/check_linux_gemmini.py | 186 ++ platforms/arty-a7-toy/host/check_watchdog.py | 69 + platforms/arty-a7-toy/host/ftdi_transport.py | 105 ++ .../arty-a7-toy/host/requirements-gemmini.txt | 2 + .../scripts/remote_linux_gemmini.py | 90 + .../scripts/verify_linux_gemmini.py | 125 ++ .../scripts/verify_linux_gemmini_archive.py | 75 + .../arty-a7-toy/software/GEMMINI_LINUX.md | 127 ++ .../software/MODEL_COMPATIBILITY.md | 45 + .../software/build_gemmini_image.py | 82 + .../software/gemmini_linux_check.c | 132 ++ .../software/prepare_gemmini_linux.py | 91 + 74 files changed, 7200 insertions(+), 6 deletions(-) create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/MANIFEST.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/README.md create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/REPORT.md create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/BOARD_FIRMWARE_RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/INPUT_MANIFEST.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/SESSION.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/build.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/LOAD_RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/PERFORMANCE.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/boot-console.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/linux-console.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/CMakeLists.txt create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/PREPARED.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/ballISA.h create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_linux_check.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_atranspose_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_basic_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_btranspose_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_shift_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_abtranspose_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_atranspose_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_basic_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_btranspose_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_shift_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_cisc_conv_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_basic_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_btranspose_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_shift_test.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/params.h create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/LOAD_RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/PERFORMANCE.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/POST_RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/boot-console.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/linux-console.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/post-console.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program-console.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.jou create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/linux-boot.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/transfer.log create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/board/program_arty.tcl create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/check_watchdog.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/post_gemmini_live.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/check_linux_gemmini.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/ftdi_transport.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/load.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/program.tcl create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/scripts/remote_linux_gemmini.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/scripts/verify_linux_gemmini.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/build_gemmini_image.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/gemmini_linux_check.c create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/prepare_gemmini_linux.py create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/RESULT.json create mode 100644 platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/check.log create mode 100644 platforms/arty-a7-toy/host/check_linux_gemmini.py create mode 100644 platforms/arty-a7-toy/host/check_watchdog.py create mode 100644 platforms/arty-a7-toy/host/ftdi_transport.py create mode 100644 platforms/arty-a7-toy/host/requirements-gemmini.txt create mode 100644 platforms/arty-a7-toy/scripts/remote_linux_gemmini.py create mode 100644 platforms/arty-a7-toy/scripts/verify_linux_gemmini.py create mode 100644 platforms/arty-a7-toy/scripts/verify_linux_gemmini_archive.py create mode 100644 platforms/arty-a7-toy/software/GEMMINI_LINUX.md create mode 100644 platforms/arty-a7-toy/software/MODEL_COMPATIBILITY.md create mode 100644 platforms/arty-a7-toy/software/build_gemmini_image.py create mode 100644 platforms/arty-a7-toy/software/gemmini_linux_check.c create mode 100644 platforms/arty-a7-toy/software/prepare_gemmini_linux.py diff --git a/.github/workflows/arty-a7-toy.yml b/.github/workflows/arty-a7-toy.yml index f006645..84962fb 100644 --- a/.github/workflows/arty-a7-toy.yml +++ b/.github/workflows/arty-a7-toy.yml @@ -26,6 +26,8 @@ jobs: working-directory: platforms/arty-a7-toy run: | python3 scripts/verify_target.py + python3 scripts/verify_linux_gemmini_archive.py + python3 scripts/verify_linux_gemmini.py --build-record evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json --hardware-result evidence/2026-10-12/linux-gemmini/hardware/RESULT.json python3 -m compileall -q scripts tests host software bash -n scripts/elaborate.sh scripts/build_test_programs.sh software/build.sh - name: Install interface simulator diff --git a/platforms/arty-a7-toy/README.md b/platforms/arty-a7-toy/README.md index 377e902..042cfd9 100644 --- a/platforms/arty-a7-toy/README.md +++ b/platforms/arty-a7-toy/README.md @@ -5,7 +5,7 @@ FP16/32/64 support and Gemmini 8×8. Complete board implementation, timing, CDC checks and Linux RTL tests pass. On 2026-10-12 the connected board was programmed, the complete image was read back from DDR and five Linux checks passed on hardware. This remains a **Rev E engineering target**: PCB revision is unconfirmed and -physical Gemmini tests are pending. See [measured results](VALIDATION.md) and +the remaining acceptance scope is recorded in [measured results](VALIDATION.md) and [the hardware logs](evidence/2026-10-12/README.md). For stored configuration/software and autonomous power-on startup, see @@ -15,6 +15,15 @@ it boots the original Linux image and passes all five system checks without reloading from the host. See [Flash evidence](evidence/2026-10-12/flash/README.md). Runtime DDR and changes to the initramfs remain volatile. +## 2026-10-12:Linux/Gemmini 实物回归 + +按标准 rootfs/bbkernel 流程构建的新镜像已完成全部 DDR 读回和实物启动; +15 个程序返回 0,覆盖五项 Linux 系统检查、原 13 项 Gemmini 测试及新增 16 项 +OS/WS 矩阵对照(包含分块和尾块)。最终运行器回归与看门狗清理检查均通过。 +多数小矩阵端到端路径暂时比 CPU 参考更慢,原始计时和测试记录见 +[中文实物报告](evidence/2026-10-12/linux-gemmini/REPORT.md),复现方法见 +[验证指南](software/GEMMINI_LINUX.md)。本轮未写 Flash,整模型仍未验收。 + ## Architecture and scope - RV64IMAFDC with Zfh/Zba/Zbb/Zbs, M/S/U, PMP, Sv39, interrupts and 8 KiB I/D diff --git a/platforms/arty-a7-toy/SOURCE_LOCK.json b/platforms/arty-a7-toy/SOURCE_LOCK.json index d921035..49248f5 100644 --- a/platforms/arty-a7-toy/SOURCE_LOCK.json +++ b/platforms/arty-a7-toy/SOURCE_LOCK.json @@ -6,11 +6,11 @@ ".gitignore": "5eaf4f0d4cbefc5292732eb17cd984839a8fe4cfc65f39352c187fd73c95947a", ".jvmopts": "a66471d84e6e2ed0c3c40d5ebbc237d268ed9b04f3528ef22e967a2bd4e8aa44", "FLASH_BOOT.md": "471bcd9c9704bd2eedf11880c27c48d0505a56498e62e68ada84d5cd5ed70686", - "README.md": "f2adecb86fb96ce99b88791e05730797a427de51fa01e6f1012e94fec8e3e486", + "README.md": "d1a1326934b5f211f617b0528ca6d85fde5771d8ca32f0c85add7ffcb8310264", "SOFTWARE_BASELINE.json": "3a5c9f65771e6fd7f8172674baf22263ba7c2d9244993c9162ba526344a7b0aa", "THIRDPARTY.md": "02ed1d3ddd4fc26a8b1580eb4948ff6cf4f548c0434c89f1c6c2220bed3d4a42", "UPSTREAM_MANIFEST.json": "c4a96343e318c452420cf86b34d6008140560eeffa91cd85b4b87b229717c9be", - "VALIDATION.md": "99d986881af4c697b0c3313c47296d7c76a95322fda36c67c0ac22b128fad37e", + "VALIDATION.md": "ec3963aee9098723fe7bce0910ac66e7169752e81ae2a687c454154d58f4b610", "board/README.md": "5a7f01460107df0c5c40d2a2b18c68648ca2d7b20c914c788b880ec1b9f6f95b", "board/SOURCE_MANIFEST.json": "03d99f1f43bbf68d92df61db52bdee0019723e2e194ee5f9c12a5ac6d4c5a105", "board/arty_a7.xdc": "f13869ba386038557084adabafeb5255943d0b67f1db4b88fd907e4f095d016f", @@ -185,10 +185,72 @@ "evidence/2026-10-12/hardware/program.log": "c754d0f5066dbd34b9035fb77ee6e8ef3fe403b03b56b97f5cdd523aba313511", "evidence/2026-10-12/hardware/program_arty.tcl": "fbb62bafb6df602b0f5f638fb05ae4ecc90494ac162b9a5f5ac314200f7a241c", "evidence/2026-10-12/hardware/summarize_hardware.py": "a0f681a64ca0c441fc614bf8c2ccf664e2de86d02d3d2cfe2eb0b99e7f8edefd", + "evidence/2026-10-12/linux-gemmini/MANIFEST.json": "13a488dcc4975e3936b3f4db81768c4c190602b6cda5d931394efe3e252eeea8", + "evidence/2026-10-12/linux-gemmini/README.md": "77ef4fdb7507cf748201bf751109ac30aaa1f8d3af0d3d52bf53bf5da5f07045", + "evidence/2026-10-12/linux-gemmini/REPORT.md": "0b54513128c3e9432964b1082ebcb04af46b41e8034f7ddef35b7876b2e3a7bf", + "evidence/2026-10-12/linux-gemmini/build/BOARD_FIRMWARE_RESULT.json": "a1c458a50c26a7cd05bf17d362771db241d526d909821f7b2ed32a42ecf5a8c0", + "evidence/2026-10-12/linux-gemmini/build/INPUT_MANIFEST.json": "b1bd6eb8c04f88d9ab1080118e6ed4ba4e760ad121ec1d30ed42936bc59226c4", + "evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json": "4d9229135d7f92b711c385628fcd96839ad0e667a6579f87d8f604ce8dd7cda3", + "evidence/2026-10-12/linux-gemmini/build/SESSION.json": "06e0cb8cd341a395a87d514381422da405c3c08c5312c69fd71a72a82b00ceb0", + "evidence/2026-10-12/linux-gemmini/build/build.log": "1c9ba6e82cae3182025567709bd6796910e194ff30a22f6545ec2ca8967037f7", + "evidence/2026-10-12/linux-gemmini/first-pass/LOAD_RESULT.json": "a36ce2b6e39608aa4d1f0df71ae8354b5e446a360623891b3846a77d0388e657", + "evidence/2026-10-12/linux-gemmini/first-pass/PERFORMANCE.json": "fc681a9d01275898476837e413d4edfcd67fbc1c98fcb8be3ac443fabcfb0e0e", + "evidence/2026-10-12/linux-gemmini/first-pass/RESULT.json": "b2422db3c133cab82d69efe300642ca16c546054b091125c1b208f2cbd42e269", + "evidence/2026-10-12/linux-gemmini/first-pass/boot-console.log": "eb98e070415b15b6500d53eaeebc19b32f526cbe34cd3f2b8f9f652187c900c1", + "evidence/2026-10-12/linux-gemmini/first-pass/linux-console.log": "edf9345b7a7757c4149fc993ad203b541047332d49525fe5ed965de7c026a1b1", + "evidence/2026-10-12/linux-gemmini/generated-inputs/CMakeLists.txt": "4ea8d92e23c19d780fff7d6a2c1369ef3363dc1fe87acf1195656ce852684f4f", + "evidence/2026-10-12/linux-gemmini/generated-inputs/PREPARED.json": "890d8a759be94610a16a5ac976f0775e99220a4e4de3e44abd3c3aeeff99819e", + "evidence/2026-10-12/linux-gemmini/generated-inputs/ballISA.h": "8f74e9230c45bc270c99b4b31fde6db6ed61b01c0055c7c62855de11bb571606", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_linux_check.c": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_atranspose_test.c": "d4b44df5f004b4e1d4ada02c247e5f66a6596dfa80cf70a09c54d7448b572712", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_basic_test.c": "481733138780de0ef2ce7d867bc375cd22a64990f33b9eabd8a03a45c2e8861c", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_btranspose_test.c": "efdf1cefe9277fde1dce1d62eb7c3364ddbb27926e99ddce9800f1fb54be1fec", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_shift_test.c": "9676b4e45945de9cbe005be695ffd8d0f3a406fa0448875a8372cc1d1c20fb4c", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_abtranspose_test.c": "641982f9adc4b898a27d23967807d9f350c3db717b7c276df42281b7c6ba3558", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_atranspose_test.c": "4583e36cbea777a439e65fb4ca58e51574e2f7686217088922128c36fa8d74f9", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_basic_test.c": "cd8102c88b58a2ea289212779bd2bf50f9e35806e9039f4cc5a6abf73eef131f", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_btranspose_test.c": "01ee05bb7a92de708e1bac4041354d9f0363c70a4f5b898af784f47410f63798", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_shift_test.c": "aae1a632fd3fabc1ae9fea89daf9dc0693880c718f100c86b946257935a4076d", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_cisc_conv_test.c": "ab75719d036a6b61b4369514c6771ebac94a04e7448f2127b1be60bab2e8f28b", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_basic_test.c": "f5aab861cf0f764e6179e24c70c75d9f3c7e9a0364a4e3aa818784f7f309c03a", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_btranspose_test.c": "fff4938ea7c16864e3e1b91a2d30ef2d3eabeb3ed4a1153964f5d351d6980279", + "evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_shift_test.c": "a22209c0c02cd5d5b258525dd6266bbe3a7447b410a082e8da19a268478b6307", + "evidence/2026-10-12/linux-gemmini/generated-inputs/params.h": "cc6bbe816a15f9a7bd133fbeb45d039733a22a6a6f94dace16eecea5eef61b24", + "evidence/2026-10-12/linux-gemmini/hardware/LOAD_RESULT.json": "a36ce2b6e39608aa4d1f0df71ae8354b5e446a360623891b3846a77d0388e657", + "evidence/2026-10-12/linux-gemmini/hardware/PERFORMANCE.json": "696de0aa9b3129ae10369afe8d71553922b577170554a1b2d9639048d89d5b20", + "evidence/2026-10-12/linux-gemmini/hardware/POST_RESULT.json": "3d2ad49575d52bdf4fdcee730a69c7d79b6c5add809f9b7007607c2b883246ac", + "evidence/2026-10-12/linux-gemmini/hardware/RESULT.json": "184efe4a22b4d1078788d74167c40ae8fd65210650f01458d752be927a6e1206", + "evidence/2026-10-12/linux-gemmini/hardware/boot-console.log": "eb98e070415b15b6500d53eaeebc19b32f526cbe34cd3f2b8f9f652187c900c1", + "evidence/2026-10-12/linux-gemmini/hardware/linux-console.log": "e5c5442fa53496bc2c72bb725678fa424c0a73f43a511fee1e678ca7b6ca6729", + "evidence/2026-10-12/linux-gemmini/hardware/post-console.log": "3b9b17bdc1c03a90b6fcc3b66ae796c721f41a3fe1a690dc753bc71ea84311ee", + "evidence/2026-10-12/linux-gemmini/hardware/program-console.log": "e4ee8fb155e0bb01fd4eef92a4e64c560a2921815eb60ce70c0cd72293c2f697", + "evidence/2026-10-12/linux-gemmini/hardware/program.jou": "0e45a26886ecdfaf1dec01dc4b9b256f5a40db1239e1d09f5aa7d439bcd36fac", + "evidence/2026-10-12/linux-gemmini/hardware/program.log": "7e71edb015aa3f1e9afd6b62c13364d7e2e760e6c6a48734de84e66eadbdb304", + "evidence/2026-10-12/linux-gemmini/load/RESULT.json": "a36ce2b6e39608aa4d1f0df71ae8354b5e446a360623891b3846a77d0388e657", + "evidence/2026-10-12/linux-gemmini/load/linux-boot.log": "eb98e070415b15b6500d53eaeebc19b32f526cbe34cd3f2b8f9f652187c900c1", + "evidence/2026-10-12/linux-gemmini/load/transfer.log": "25799c30f382384cc2facce1320f1b11c86d555a7a6364fa3384079886aa39a4", + "evidence/2026-10-12/linux-gemmini/sources/board/program_arty.tcl": "fbb62bafb6df602b0f5f638fb05ae4ecc90494ac162b9a5f5ac314200f7a241c", + "evidence/2026-10-12/linux-gemmini/sources/diagnostics/check_watchdog.py": "de3dea9d9bdff5760788918ad7493651903e5bb633804796de1dd6d840b3d71c", + "evidence/2026-10-12/linux-gemmini/sources/diagnostics/post_gemmini_live.py": "bfc88015da57b0601793b6253ed3b0659391916becbe81dd248c3a1c5e0f97b3", + "evidence/2026-10-12/linux-gemmini/sources/host/check_linux_gemmini.py": "5554ebb0902b9cca203d48889f59ef160ad958aaac1dbb8d37c0579a1c3e5b2b", + "evidence/2026-10-12/linux-gemmini/sources/host/ftdi_transport.py": "f3a88c170f40121febde7fd283a50e54ab5af5b79f0651cb15db9af743d57de7", + "evidence/2026-10-12/linux-gemmini/sources/host/load.py": "a62e48b779c9ce1d6f8f6669523e427cf48bd19be3bf50a554dc391b09b3e3b2", + "evidence/2026-10-12/linux-gemmini/sources/program.tcl": "0ff928503cf00798dae132117435e34981a176c586d7aa16e587c47877ba031f", + "evidence/2026-10-12/linux-gemmini/sources/scripts/remote_linux_gemmini.py": "b99f6cea4cdbc5765cb9778ee12a6485a778f558e1871d40473cd532889c3e60", + "evidence/2026-10-12/linux-gemmini/sources/scripts/verify_linux_gemmini.py": "ef336dfa911a71ef9b64618444864dc4f8620d2b53674422ea238fb1b11c2c26", + "evidence/2026-10-12/linux-gemmini/sources/software/build_gemmini_image.py": "949a59cbc4bd494cbe793b392aaccc237637c809667b6bd5dd211e2176e6fcbf", + "evidence/2026-10-12/linux-gemmini/sources/software/gemmini_linux_check.c": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467", + "evidence/2026-10-12/linux-gemmini/sources/software/prepare_gemmini_linux.py": "358cee302a2a8ee6672cbf4c830776a6047dc33793a272a89f7343729ca0b3ec", + "evidence/2026-10-12/linux-gemmini/watchdog/RESULT.json": "efc60f10a891ba2e224ee3130d4e776c00fc04eea5cc2e522690f85ddfb0475e", + "evidence/2026-10-12/linux-gemmini/watchdog/check.log": "58de5f54346dfd805737aea528347a5fa9430a7a0962964a08b349ede52b6303", "evidence/README.md": "058e5d4580d68897450dd08eb114469007f9d931bfcd5423809cd1d12811cde0", + "host/check_linux_gemmini.py": "3b23497e7b5b3516af22abb1fc38da48055c60dd786f75f5ada3faa201ca9268", + "host/check_watchdog.py": "0d35f150a4cff87d99d6c368e9d1ba62312db9b780210bdb33269881421cc573", "host/flash.py": "47ad35043c9a04e9f6730dd4d53cf84f0d7bb018a03f76754d549f7bebe936dc", + "host/ftdi_transport.py": "f3a88c170f40121febde7fd283a50e54ab5af5b79f0651cb15db9af743d57de7", "host/load.py": "a62e48b779c9ce1d6f8f6669523e427cf48bd19be3bf50a554dc391b09b3e3b2", "host/observe_flash_boot.py": "7beecce577edcc6ede47f66eff456abd13430a04919cc0ce03ee03abeb539a12", + "host/requirements-gemmini.txt": "43ab64f971d4d5ffbbc16009743fb980a06a76d381a2c71e54e9d3aab314cb6a", "patches/buckyball/GemminiBall.scala": "c18ace5c3ae6645c022af809104e4baf35da657a42ab144ce86260327ebab5aa", "patches/buckyball/GemminiExCtrl.scala": "ac3ecc72fa7deb5d50c0c42496b19de9d596b4ebaebd24496bf3792c87d85eaf", "patches/buckyball/GemminiExCtrlCmdStates.scala": "6fc95f3f3f22333e5ad5a90d28a40bfa70fa2593b4ea0be05e42fcfb11235f6e", @@ -232,15 +294,23 @@ "scripts/prepare_flash_boot.py": "75ff16be3f820dc2e9e167132d0ca4f20e67ca359a95398413e80430eebf2101", "scripts/prepare_fpga_memories.py": "e9914433d01be3cbc253f237934d674a360dd4b97c2b0799b1e67cab5f5fe294", "scripts/prepare_sources.py": "eb3637a141d4ef30659eb8086d1d59ec159c710ee81d9f8e64fc38b811632799", + "scripts/remote_linux_gemmini.py": "2221acd85bc1876d7730f15bb01f0b50629c2a9b9645b4d12cb74e566cf1e686", "scripts/resolve_config.py": "1c4fb7d8533e659c7f8cb9e0ef5eb93f06d29a51d6b3e2449efe648f8f74000d", "scripts/run_board_regression.py": "7302be4d5517eb315eb37b3ff8972bf17e2fe42990ae1fb6702c43c632515bfd", "scripts/start_board_build.py": "04c5a521bcd7014774e6b476e8395bde134de9096bb22e6d6b6f200bf4311c83", "scripts/verify_flash_evidence.py": "6db7b0dcc7323ba07ec6f17d0a09f04b321f8bdd24582ca49184dd654c1ebd45", "scripts/verify_hardware_evidence.py": "60f3555a6b6ac6a9f567cf1b22caca9755bd4179dcea1f6731a70f8bd26a1202", + "scripts/verify_linux_gemmini.py": "1413703dfa42a6be6ac60e0df6bf3eb95ce8b50671a3a803c7421302eace7b2b", + "scripts/verify_linux_gemmini_archive.py": "cf8ab6737b2ad3525cf91e528aab64d78261146dec7473596d321812f3bad5e0", "scripts/verify_target.py": "39bdd529e55f2b36bed4ba6b10a4b0a400fcb685f6f3e5886d537e8c549932cd", + "software/GEMMINI_LINUX.md": "31d991de14e315a1cf8ca24f5d3715a25a13d8601c8334687730a5b47959a963", + "software/MODEL_COMPATIBILITY.md": "1e3a78574d019f4a3e1442b899cc654f2c5a3e41cf55a7650610eed75618a1cf", "software/build.sh": "908b5678edf5a710187480974c0c699ca8833faede20d044b7131060c3161292", + "software/build_gemmini_image.py": "949a59cbc4bd494cbe793b392aaccc237637c809667b6bd5dd211e2176e6fcbf", + "software/gemmini_linux_check.c": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467", "software/linux_system_check.c": "c1cedf2ce6e2583393c9e7f51fe20558c1402b8d81faf2152e8f6eeaf8058315", "software/prepare_dependencies.py": "5bf2eca25081e014ff0de67ae0aeb41cb4380a2767a08a109a3bf6c19238b308", + "software/prepare_gemmini_linux.py": "358cee302a2a8ee6672cbf4c830776a6047dc33793a272a89f7343729ca0b3ec", "software/prepare_platform.py": "f053463897045e1929d65aa9614b7b871c1c6c342f1f15865793883c858f3d61", "src/main/scala/EmitFmaChecks.scala": "1d6eef40cefb36aaf0ce73838f2954cd89d09ad8c97244a2ac346da7137dccfd", "src/main/scala/EmitGroupQueryCheck.scala": "ae3a7bb5a7d951109596bc3e481a9a275e14f04a7cf6ec28084d50f354122ee1", diff --git a/platforms/arty-a7-toy/VALIDATION.md b/platforms/arty-a7-toy/VALIDATION.md index 1483076..4111f13 100644 --- a/platforms/arty-a7-toy/VALIDATION.md +++ b/platforms/arty-a7-toy/VALIDATION.md @@ -77,9 +77,9 @@ the connected Arty A7-100T; the October 11 records remain unchanged. MemTotal is 245,784 KiB. Transport restores the original 16 ms FTDI latency. PCB revision remains unknown; this exact official E.0 MIG image works on the -connected board. Physical Gemmini operator regression, FP16/FP32 exhaustive -checks, full 256 MiB DDR sweep, long-duration stability and power measurements -are still pending. This first run used volatile SRAM and did not write Flash. +connected board. 该首次启动记录不包含 Gemmini 实物回归,后续覆盖见下方新增章节。 +FP16/FP32 全面检查、全 256 MiB DDR 扫描、长期稳定性和功耗仍未验证。 +This first run used volatile SRAM and did not write Flash. Treat the result as successful first bring-up, not full hardware release. DRC retains 360 warnings; methodology retains 49 warnings and 16 advisories, @@ -111,3 +111,15 @@ a bitstream or software. The cold-start observer records one USB disconnect and five Linux checks with exit status 0. Runtime DDR/initramfs changes still vanish on reset; the stored startup image persists. Hardware Gemmini qualification and the other acceptance limits above remain pending. + +## Linux/Gemmini 实物回归:2026-10-12 + +后续的新标准软件镜像完成 25,797,640 字节 DDR 完整读回(806.172 秒)、Linux 启动, +板上 15 个程序摘要与构建记录一致。五项系统检查、原 13 项 Gemmini 测试及新增 +16 项 OS/WS 矩阵对照均通过;最终运行器和 watchdog 回收检查也通过。 +实际用例未超时;单独构造的 1 秒 watchdog 超时按预期返回 137。 + +本轮使用相同已验证 UART 位流,没有增加或裁剪 RTL,也未改 Flash。 +上述两个历史归档的测试范围保持原样;本轮原始测试日志、精确来源及 +毫秒级计算计时见 [中文报告](evidence/2026-10-12/linux-gemmini/REPORT.md)。 +多数小矩阵端到端路径比朴素 CPU 参考更慢;完整模型及其他未覆盖项目仍待验证。 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/MANIFEST.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/MANIFEST.json new file mode 100644 index 0000000..dab9dda --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/MANIFEST.json @@ -0,0 +1,240 @@ +{ + "run_date": "2026-10-12", + "time_zone": "Asia/Shanghai", + "result": "PASS_LINUX_AND_GEMMINI_HARDWARE", + "base_fpga_commit": "936aba48d51b2f280cd60d4968a05c8a5bfd540f", + "upstream_commit": "1f3d54535bd5fb76d5fd2f6b05ed36e591cf3097", + "flash_written": false, + "model_end_to_end_tested": false, + "log_selection": "DDR/启动日志为有用阶段的原文前缀;两个回归的算子串口日志为完整原文。", + "files": { + "build/BOARD_FIRMWARE_RESULT.json": { + "sha256": "a1c458a50c26a7cd05bf17d362771db241d526d909821f7b2ed32a42ecf5a8c0", + "kind": "run-artifact-or-executed-source" + }, + "build/build.log": { + "sha256": "1c9ba6e82cae3182025567709bd6796910e194ff30a22f6545ec2ca8967037f7", + "kind": "run-artifact-or-executed-source" + }, + "build/INPUT_MANIFEST.json": { + "sha256": "b1bd6eb8c04f88d9ab1080118e6ed4ba4e760ad121ec1d30ed42936bc59226c4", + "kind": "run-artifact-or-executed-source" + }, + "build/LINUX_GEMMINI_BUILD.json": { + "sha256": "4d9229135d7f92b711c385628fcd96839ad0e667a6579f87d8f604ce8dd7cda3", + "kind": "run-artifact-or-executed-source" + }, + "build/SESSION.json": { + "sha256": "06e0cb8cd341a395a87d514381422da405c3c08c5312c69fd71a72a82b00ceb0", + "kind": "run-artifact-or-executed-source" + }, + "first-pass/boot-console.log": { + "sha256": "eb98e070415b15b6500d53eaeebc19b32f526cbe34cd3f2b8f9f652187c900c1", + "kind": "selected-stage-prefix" + }, + "first-pass/linux-console.log": { + "sha256": "edf9345b7a7757c4149fc993ad203b541047332d49525fe5ed965de7c026a1b1", + "kind": "run-artifact-or-executed-source" + }, + "first-pass/LOAD_RESULT.json": { + "sha256": "a36ce2b6e39608aa4d1f0df71ae8354b5e446a360623891b3846a77d0388e657", + "kind": "derived-stage-record" + }, + "first-pass/PERFORMANCE.json": { + "sha256": "fc681a9d01275898476837e413d4edfcd67fbc1c98fcb8be3ac443fabcfb0e0e", + "kind": "run-artifact-or-executed-source" + }, + "first-pass/RESULT.json": { + "sha256": "b2422db3c133cab82d69efe300642ca16c546054b091125c1b208f2cbd42e269", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/ballISA.h": { + "sha256": "8f74e9230c45bc270c99b4b31fde6db6ed61b01c0055c7c62855de11bb571606", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/CMakeLists.txt": { + "sha256": "4ea8d92e23c19d780fff7d6a2c1369ef3363dc1fe87acf1195656ce852684f4f", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_linux_check.c": { + "sha256": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_cisc_atranspose_test.c": { + "sha256": "d4b44df5f004b4e1d4ada02c247e5f66a6596dfa80cf70a09c54d7448b572712", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_cisc_basic_test.c": { + "sha256": "481733138780de0ef2ce7d867bc375cd22a64990f33b9eabd8a03a45c2e8861c", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_cisc_btranspose_test.c": { + "sha256": "efdf1cefe9277fde1dce1d62eb7c3364ddbb27926e99ddce9800f1fb54be1fec", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_cisc_shift_test.c": { + "sha256": "9676b4e45945de9cbe005be695ffd8d0f3a406fa0448875a8372cc1d1c20fb4c", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_risc_abtranspose_test.c": { + "sha256": "641982f9adc4b898a27d23967807d9f350c3db717b7c276df42281b7c6ba3558", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_risc_atranspose_test.c": { + "sha256": "4583e36cbea777a439e65fb4ca58e51574e2f7686217088922128c36fa8d74f9", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_risc_basic_test.c": { + "sha256": "cd8102c88b58a2ea289212779bd2bf50f9e35806e9039f4cc5a6abf73eef131f", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_risc_btranspose_test.c": { + "sha256": "01ee05bb7a92de708e1bac4041354d9f0363c70a4f5b898af784f47410f63798", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_os_risc_shift_test.c": { + "sha256": "aae1a632fd3fabc1ae9fea89daf9dc0693880c718f100c86b946257935a4076d", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_ws_cisc_conv_test.c": { + "sha256": "ab75719d036a6b61b4369514c6771ebac94a04e7448f2127b1be60bab2e8f28b", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_ws_risc_basic_test.c": { + "sha256": "f5aab861cf0f764e6179e24c70c75d9f3c7e9a0364a4e3aa818784f7f309c03a", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_ws_risc_btranspose_test.c": { + "sha256": "fff4938ea7c16864e3e1b91a2d30ef2d3eabeb3ed4a1153964f5d351d6980279", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/gemmini_ws_risc_shift_test.c": { + "sha256": "a22209c0c02cd5d5b258525dd6266bbe3a7447b410a082e8da19a268478b6307", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/params.h": { + "sha256": "cc6bbe816a15f9a7bd133fbeb45d039733a22a6a6f94dace16eecea5eef61b24", + "kind": "run-artifact-or-executed-source" + }, + "generated-inputs/PREPARED.json": { + "sha256": "890d8a759be94610a16a5ac976f0775e99220a4e4de3e44abd3c3aeeff99819e", + "kind": "run-artifact-or-executed-source" + }, + "hardware/boot-console.log": { + "sha256": "eb98e070415b15b6500d53eaeebc19b32f526cbe34cd3f2b8f9f652187c900c1", + "kind": "selected-stage-prefix" + }, + "hardware/linux-console.log": { + "sha256": "e5c5442fa53496bc2c72bb725678fa424c0a73f43a511fee1e678ca7b6ca6729", + "kind": "run-artifact-or-executed-source" + }, + "hardware/LOAD_RESULT.json": { + "sha256": "a36ce2b6e39608aa4d1f0df71ae8354b5e446a360623891b3846a77d0388e657", + "kind": "derived-stage-record" + }, + "hardware/PERFORMANCE.json": { + "sha256": "696de0aa9b3129ae10369afe8d71553922b577170554a1b2d9639048d89d5b20", + "kind": "run-artifact-or-executed-source" + }, + "hardware/post-console.log": { + "sha256": "3b9b17bdc1c03a90b6fcc3b66ae796c721f41a3fe1a690dc753bc71ea84311ee", + "kind": "run-artifact-or-executed-source" + }, + "hardware/POST_RESULT.json": { + "sha256": "3d2ad49575d52bdf4fdcee730a69c7d79b6c5add809f9b7007607c2b883246ac", + "kind": "run-artifact-or-executed-source" + }, + "hardware/program-console.log": { + "sha256": "e4ee8fb155e0bb01fd4eef92a4e64c560a2921815eb60ce70c0cd72293c2f697", + "kind": "run-artifact-or-executed-source" + }, + "hardware/program.jou": { + "sha256": "0e45a26886ecdfaf1dec01dc4b9b256f5a40db1239e1d09f5aa7d439bcd36fac", + "kind": "run-artifact-or-executed-source" + }, + "hardware/program.log": { + "sha256": "7e71edb015aa3f1e9afd6b62c13364d7e2e760e6c6a48734de84e66eadbdb304", + "kind": "run-artifact-or-executed-source" + }, + "hardware/RESULT.json": { + "sha256": "184efe4a22b4d1078788d74167c40ae8fd65210650f01458d752be927a6e1206", + "kind": "run-artifact-or-executed-source" + }, + "load/linux-boot.log": { + "sha256": "eb98e070415b15b6500d53eaeebc19b32f526cbe34cd3f2b8f9f652187c900c1", + "kind": "selected-stage-prefix" + }, + "load/RESULT.json": { + "sha256": "a36ce2b6e39608aa4d1f0df71ae8354b5e446a360623891b3846a77d0388e657", + "kind": "derived-stage-record" + }, + "load/transfer.log": { + "sha256": "25799c30f382384cc2facce1320f1b11c86d555a7a6364fa3384079886aa39a4", + "kind": "selected-stage-prefix" + }, + "README.md": { + "sha256": "77ef4fdb7507cf748201bf751109ac30aaa1f8d3af0d3d52bf53bf5da5f07045", + "kind": "documentation" + }, + "REPORT.md": { + "sha256": "0b54513128c3e9432964b1082ebcb04af46b41e8034f7ddef35b7876b2e3a7bf", + "kind": "documentation" + }, + "sources/board/program_arty.tcl": { + "sha256": "fbb62bafb6df602b0f5f638fb05ae4ecc90494ac162b9a5f5ac314200f7a241c", + "kind": "run-artifact-or-executed-source" + }, + "sources/diagnostics/check_watchdog.py": { + "sha256": "de3dea9d9bdff5760788918ad7493651903e5bb633804796de1dd6d840b3d71c", + "kind": "run-artifact-or-executed-source" + }, + "sources/diagnostics/post_gemmini_live.py": { + "sha256": "bfc88015da57b0601793b6253ed3b0659391916becbe81dd248c3a1c5e0f97b3", + "kind": "run-artifact-or-executed-source" + }, + "sources/host/check_linux_gemmini.py": { + "sha256": "5554ebb0902b9cca203d48889f59ef160ad958aaac1dbb8d37c0579a1c3e5b2b", + "kind": "run-artifact-or-executed-source" + }, + "sources/host/ftdi_transport.py": { + "sha256": "f3a88c170f40121febde7fd283a50e54ab5af5b79f0651cb15db9af743d57de7", + "kind": "run-artifact-or-executed-source" + }, + "sources/host/load.py": { + "sha256": "a62e48b779c9ce1d6f8f6669523e427cf48bd19be3bf50a554dc391b09b3e3b2", + "kind": "run-artifact-or-executed-source" + }, + "sources/program.tcl": { + "sha256": "0ff928503cf00798dae132117435e34981a176c586d7aa16e587c47877ba031f", + "kind": "run-artifact-or-executed-source" + }, + "sources/scripts/remote_linux_gemmini.py": { + "sha256": "b99f6cea4cdbc5765cb9778ee12a6485a778f558e1871d40473cd532889c3e60", + "kind": "public-auth-interface-copy" + }, + "sources/scripts/verify_linux_gemmini.py": { + "sha256": "ef336dfa911a71ef9b64618444864dc4f8620d2b53674422ea238fb1b11c2c26", + "kind": "run-artifact-or-executed-source" + }, + "sources/software/build_gemmini_image.py": { + "sha256": "949a59cbc4bd494cbe793b392aaccc237637c809667b6bd5dd211e2176e6fcbf", + "kind": "run-artifact-or-executed-source" + }, + "sources/software/gemmini_linux_check.c": { + "sha256": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467", + "kind": "run-artifact-or-executed-source" + }, + "sources/software/prepare_gemmini_linux.py": { + "sha256": "358cee302a2a8ee6672cbf4c830776a6047dc33793a272a89f7343729ca0b3ec", + "kind": "run-artifact-or-executed-source" + }, + "watchdog/check.log": { + "sha256": "58de5f54346dfd805737aea528347a5fa9430a7a0962964a08b349ede52b6303", + "kind": "run-artifact-or-executed-source" + }, + "watchdog/RESULT.json": { + "sha256": "efc60f10a891ba2e224ee3130d4e776c00fc04eea5cc2e522690f85ddfb0475e", + "kind": "run-artifact-or-executed-source" + } + } +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/README.md b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/README.md new file mode 100644 index 0000000..4a80110 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/README.md @@ -0,0 +1,36 @@ +# Linux/Gemmini 实物测试归档索引 + +[报告](REPORT.md)给出范围和计时;[复现指南](../../../software/GEMMINI_LINUX.md) +包含软件镜像构建、FPGA 位流来源、主机依赖、实物命令和离线核验。 +本目录保存有用的测试信息,不包含与板子功能无关的排查记录。 + +| 路径 | 内容与来源 | +|---|---| +| `build/` | 完整软件构建日志、固定依赖/配置、rootfs 安装核验和镜像摘要 | +| `generated-inputs/` | 实际编译的 14 个 Gemmini C 程序、参数、23 个 opcode 定义及 CMake | +| `load/` | 完整 DDR 写入/读回进度、Linux 启动阶段原文前缀及派生阶段记录 | +| `hardware/` | 最终回归完整串口、15 个程序摘要/返回码、16 项计时、JTAG 日志、最终 shell 检查 | +| `first-pass/` | 前一次通过回归的完整算子日志/结果/计时,保留重复运行证据 | +| `watchdog/` | 正常/非零退出、刻意超时及 watcher 回收检查,137 属于预期结果 | +| `sources/` | 实际执行版本的构建/测试脚本、新测试 C、UART loader、`program.tcl` 和 `board/program_arty.tcl` | + +原 13 个参考 C 源码、ISA/DMA 库在平台 `tests/reference/`,由 +`tests/REFERENCE_MANIFEST.json` 固定至 Buckyball `1f3d545`;原 Linux 检查源码为 +`software/linux_system_check.c`。`build/INPUT_MANIFEST.json` 绑定实际 47 个来源和 +18 个生成输入;生成 C 与参考 C 的唯一尺寸适配是 `#define DIM 16` → `8`。 + +本次没有重新综合/布线,使用原已验证 UART 位流。其实现报告和输入 Tcl 在 +`evidence/2026-10-11/`;本次实际烧录 Tcl 的原文快照位于 `sources/`。 +当前便携入口相比快照补充日期命名、新位流摘要参数和 watchdog 调用接口。 +上传器的 SSH 接入整理为仓库外 `connect(client)` 接口;归档中的上传器是对应的 +公开接口副本,不标作逐字执行快照。构建/上传循环及实际编译输入保持不变。 +历史实物结论只属于记录里的精确摘要,重新生成的产物必须重新验证。 + +Linux 构建工具为 GCC 15.3.0 / Binutils 2.46;主机为 Python 3.10.11、pyserial 3.5、 +paramiko 5.0.0、Vivado 2025.1,D2XX DLL 产品版本 2.12.36.20。 +板卡为 Arty A7-100T、CPU 25 MHz、CLINT 500 kHz、UART 1 Mbps 8N1。 +PCB revision 未确认,沿用已在实物工作过的官方 E.0 MIG 参数。 + +`MANIFEST.json` 逐文件标注摘要/类型:回归日志为完整原文,加载/启动为明确选取的 +阶段前缀,阶段 JSON 是派生摘要。离线校验会核对这些关系,不能将加载阶段摘要 +当作其他阶段已通过。本轮未写 Flash;没有整模型、全 DDR、全面 FPU 或长期功耗验收。 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/REPORT.md b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/REPORT.md new file mode 100644 index 0000000..f2646cf --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/REPORT.md @@ -0,0 +1,81 @@ +# Toy 8×8 Linux/Gemmini 实物验证 + +## 结论与运行对象 + +2026-10-12,在实际 Arty A7-100T(`xc7a100tcsg324-1`)上,15 个 Linux 程序全部返回 0: +原五项系统检查、原 13 项 Gemmini 测试及新增 16 项矩阵对照通过。最终运行器与前一次 +运行均得到相同正确性结论。PCB revision 仍未确认;这不是完整芯片资格或整模型验收。 + +使用原已布线验证的 UART 位流,CPU 25 MHz、CLINT 500 kHz、DDR 256 MiB、 +8×8 Gemmini、64-bit bank。没有修改 RTL、引脚、时序约束或擦写 Flash。 +原位流 SHA256 为 `ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1`。 + +## 标准镜像构建与加载 + +按项目原 CMake/bbkernel 流程交叉编译并安装到 rootfs 的 `/root`,构建 OpenSBI/Linux +payload;没有使用独立运行时 ELF 上传协议。本次在服务器隔离目录构建, +固定 Buckyball 来源为 `1f3d54535bd5fb76d5fd2f6b05ed36e591cf3097`,软件依赖版本 +见 [构建记录](build/LINUX_GEMMINI_BUILD.json)。构建成功耗时 143.825 秒,使用 GNU 15.3.0、 +`rv64gc/lp64d`、`-O2 -static -Wall -Wextra -Werror`。 + +新 payload 25,797,640 字节,SHA256 为 +`e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0`。 +UART 1 Mbps 逐段写入并完整读回一致后才释放 CPU,传输/校验耗时 806.172 秒。 +随后实物启动 OpenSBI v1.9、Linux 6.6.0、BusyBox shell。 +两个回归会话均从实际 Linux 对 15 个程序逐个核验 SHA256,才执行测试。 +最终摘要核验、程序执行和串口记录共 123.859 秒;这不是单个矩阵计算时间。 + +## 功能与耗时 + +- COW、页保护、FP64 进程上下文、定时器及总系统检查通过;页保护子进程的 + SIGSEGV 是预期行为,父进程核验通过。最终 timer 为 104,200,000 ns。 +- 原 13 项仅将测试尺寸定义从 16 改为 8,参考结果和 ISA 不变;包括 OS/WS、 + RISC/CISC、转置、移位及 1×1 pointwise 卷积测试。 +- 新 16 项覆盖 M/N/K 为 8/8/8、16/16/16、13/11/17、8/24/8,OS/WS 交替两轮, + 逐元素比较独立 CPU INT32 参考结果。尾块补零;跨 K 子块结果由 CPU 累加。 + +下表是最终运行的两次样本范围,单位毫秒;原始 16 项结果见 +[PERFORMANCE.json](hardware/PERFORMANCE.json)。CPU 为朴素三重循环参考实现, +加速器路径包含分块、DMA、配置、同步和 CPU 跨 K 累加。 + +| M/N/K | 模式 | CPU | 加速器端到端 | +|---|---|---:|---:| +| 8/8/8 | OS | 0.608–0.636 | 2.762–2.862 | +| 8/8/8 | WS | 0.606–0.642 | 0.818–0.906 | +| 16/16/16 | OS | 5.502–5.532 | 7.240–7.654 | +| 16/16/16 | WS | 7.052–7.080 | 5.718–7.750 | +| 13/11/17 | OS | 4.084–4.104 | 8.738–8.794 | +| 13/11/17 | WS | 4.048–4.098 | 8.642–8.686 | +| 8/24/8 | OS | 3.294–3.314 | 3.766–3.840 | +| 8/24/8 | WS | 3.244–3.256 | 1.664–1.668 | + +当前多数小矩阵端到端路径更慢;两次样本不足以建立稳定性能结论。计时包含 Linux +调度影响,不是纯 MAC 延迟或整模型加速比。下一步应复用 bank、减少逐 tile 搬运/配置, +再测更大工作负载;不需要先继续裁剪硬件。 + +## 超时保护 + +实际系统/算子用例没有触发超时。单独检查 `true` 返回 0、`false` 返回 1; +刻意让 `sleep 5` 触发 1 秒超时,按预期 SIGKILL/137,三次 watcher 均回收。 +结果与原始日志见 `watchdog/`;这是预期超时保护检查,不是算子超时。 +最终运行器的单条命令最多 177 字节,满足 256 字节 RX FIFO 的预算。 + +## 当前板子与边界 + +最终 shell 仍可响应;MemTotal 245,888 KiB,MemAvailable 225,972 KiB。 +watcher 已回收,UART B 关闭并恢复原 16 ms 延迟。新镜像仅在 DDR,断电会丢失; +Flash 未变,下次上电仍启动原固化镜像,新增测试需重新加载。 + +没有整模型通过证据;LeNet 的 Toy 目标/lowering、量化及资源打包仍需适配。 +也没有宣称硬件 CISC 跨 K 累加、任意卷积/池化、所有浮点运算、全 DDR 扫描、 +长期稳定性或功耗已覆盖。来源、原始测试日志和机器结果由 +[MANIFEST.json](MANIFEST.json) 逐文件绑定;运行方法见 +[中文指南](../../../software/GEMMINI_LINUX.md)。 + +## 记录类型 + +两次回归的算子串口日志保持完整原文;加载/启动日志为原文的阶段前缀, +`load/RESULT.json` 和回归目录的 `LOAD_RESULT.json` 为加载/启动阶段的派生摘要。 +每份记录只证明其声明的阶段,不将阶段摘要作为整段会话的退出状态。 +`MANIFEST.json` 标注类型并绑定 SHA256;构建、回归、Tcl 与源码对应关系见 +[归档索引](README.md),实际复现步骤见中文指南。 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/BOARD_FIRMWARE_RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/BOARD_FIRMWARE_RESULT.json new file mode 100644 index 0000000..47b84f0 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/BOARD_FIRMWARE_RESULT.json @@ -0,0 +1,29 @@ +{ + "result": "PASS_BUILD", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "payload_bytes": 25797640, + "linux_image_sha256": "83771853398f2079e8f001e8f3eebb0cc532624948cfa2f71fc6c3d29002e81a", + "linux_image_unchanged": true, + "clint_frequency_hz": 500000, + "core_frequency_hz": 25000000, + "console_base": "0x60020000", + "memory_bytes": 268435456, + "original_platform_sha256": "215cc16a14101a2b987fb05f8619ccf20eef610f5f88c6561575e9a25fff7773", + "adapted_platform_sha256": "f1a7a6d2921105055adb66e9df759d12196cdf9d63d15966c66276f69354fc9f", + "original_payload_sha256": "e2ed973f994818afb73b500834ce9996ce58f4a6b353d4b901fdae9671eb0a93", + "boot_tested": false, + "command": [ + "make", + "-C", + "/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/opensbi-src", + "-j8", + "CROSS_COMPILE=riscv64-unknown-linux-gnu-", + "PLATFORM_DIR=/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/platform", + "PLATFORM=buckyball", + "O=/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/opensbi-build", + "FW_PAYLOAD_PATH=/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/Image", + "BUCKYBALL_VISIBLE_HART_COUNT=1", + "BUCKYBALL_TOTAL_HART_COUNT=1", + "BUCKYBALL_HIDDEN_HART_BASE=1" + ] +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/INPUT_MANIFEST.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/INPUT_MANIFEST.json new file mode 100644 index 0000000..b9fb2ce --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/INPUT_MANIFEST.json @@ -0,0 +1,203 @@ +{ + "result": "PASS_REMOTE_INPUTS_MATCH_LOCAL", + "source_files": { + "SOFTWARE_BASELINE.json": { + "sha256": "3a5c9f65771e6fd7f8172674baf22263ba7c2d9244993c9162ba526344a7b0aa" + }, + "evidence/2026-10-11/ToyLinuxChip.profile.json": { + "sha256": "57e251b00a486f406e5e27f666f4416be730b4e08c8838584e4aac49ebb30f86" + }, + "scripts/build_board_firmware.py": { + "sha256": "1af5afa3b468fa13a0aaba57a977ba26ff2b0857a765ceda0a0b666fec39b344" + }, + "software/build.sh": { + "sha256": "908b5678edf5a710187480974c0c699ca8833faede20d044b7131060c3161292" + }, + "software/build_gemmini_image.py": { + "sha256": "949a59cbc4bd494cbe793b392aaccc237637c809667b6bd5dd211e2176e6fcbf" + }, + "software/gemmini_linux_check.c": { + "sha256": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467" + }, + "software/linux_system_check.c": { + "sha256": "c1cedf2ce6e2583393c9e7f51fe20558c1402b8d81faf2152e8f6eeaf8058315" + }, + "software/prepare_dependencies.py": { + "sha256": "5bf2eca25081e014ff0de67ae0aeb41cb4380a2767a08a109a3bf6c19238b308" + }, + "software/prepare_gemmini_linux.py": { + "sha256": "358cee302a2a8ee6672cbf4c830776a6047dc33793a272a89f7343729ca0b3ec" + }, + "software/prepare_platform.py": { + "sha256": "f053463897045e1929d65aa9614b7b871c1c6c342f1f15865793883c858f3d61" + }, + "tests/REFERENCE_MANIFEST.json": { + "sha256": "de4c11a8bca5bf8bb0fba0eada731177772756f307abd5523bbe5d60ffe3ff25" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/00_fence.c": { + "sha256": "465a066c9f4b4dc7f75a8981983ea98ea29ca9838afc179f385dbfa569e45fb8" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/01_barrier.c": { + "sha256": "5e3e8ac07f8a18eb771696e668e64754ce0dc5603a997dade467b26d8298b139" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/16_mvout.c": { + "sha256": "d2dddcf237327aa65828ebf713466727544d08e41f93f0471fc3813169136e41" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/32_mset.c": { + "sha256": "84c0ddded8d13f38a27613b019255a83638da85f31fddb36f5934b108c37499e" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/33_mvin.c": { + "sha256": "713fdc01623938acefe64899e1b4a1f1c712bbb1fc48241d5a4392ff6e44e5fe" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/34_mvin_2d.c": { + "sha256": "c79c07850fec290219221eebd6f5689ec0ad6ccd9c9ee29122ebb10a42d9ada7" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/35_mvin_mmio.c": { + "sha256": "3729c4e3e5997594d8c8498eb90243327a508a6b1ddcf8484c69706d5a105f10" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/bb_func7.h": { + "sha256": "f331dee3ce71c92b0934e80bb43b389dd041a39906ae149e848f1a66b057740c" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/isa.c": { + "sha256": "939f5e399bfc8d7b365624f1f9b70b30d6d3211908a06230bb2f268dba9b7773" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/isa/isa.h": { + "sha256": "f23d3ee4440cb928645a4e3f1402ec94a3074b38f8f3f52836ab30486a9f6895" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/mem/mem.c": { + "sha256": "1ff9240196f37dbe2bc5af79d54508e718b5986ad69567ed74491133f19d5996" + }, + "tests/reference/bb-tests/workloads/lib/bbhw/mem/mem.h": { + "sha256": "57021a3076bb25a2a597c6f1f6ed147ab92acc7fca4768da87f96c2a22edb3ad" + }, + "tests/reference/bb-tests/workloads/lib/buckyball.c": { + "sha256": "c4c4b9fb107b89407c0654dab809885af7b855e985d7a6d2b80ea2d3d4394673" + }, + "tests/reference/bb-tests/workloads/lib/buckyball.h": { + "sha256": "c832025bdcbd13960537c317145623fe99eb15d333ad4645e3cd2aee0c493c50" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/CMakeLists.txt": { + "sha256": "724fd8f7733f25b39d46c142f777c588a603124a3f6484a04267a81242d0d11b" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_cisc_atranspose_test.c": { + "sha256": "4a275b5e4a227d1a98270df7743428dbc423fe8a01f1daed621a59c9734e6246" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_cisc_basic_test.c": { + "sha256": "c0050f3b79e787b35662daceb065e0d1f70f77136ac8f3d5413ad470423facc4" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_cisc_btranspose_test.c": { + "sha256": "3027b5dd089b56ace3884f37d604035156a40f3054b21ae8fd8c3c861a98a4d2" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_cisc_shift_test.c": { + "sha256": "b7b38aa6ea09431a6a47fa4d7959f7db40fc4b9fcd9551cbf3f52f4bdecd33e0" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_risc_abtranspose_test.c": { + "sha256": "a7f5f12fa7972b66f42a80d1d9311dea6fa5b1a659735c6100b32fae9d33484e" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_risc_atranspose_test.c": { + "sha256": "28ed257342db8009a4b38a022da5a532e477a10e6c8dcfdff1dd05070dfaedbf" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_risc_basic_test.c": { + "sha256": "7aa2d5a79425697cff9731fd3ce122572c72e844fab636a32e20f44cbd485f07" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_risc_btranspose_test.c": { + "sha256": "eb3c6f237d1de012bb48e61d516d1f1d91af28217a29e30da084eeb54e7612c2" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_os_risc_shift_test.c": { + "sha256": "9900168f5dcbecba4768e28ed390fef9ec80e592147942f3c21af6b964d3a51e" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_ws_cisc_conv_test.c": { + "sha256": "2c277ac5740e7cc28198ba3b213fb29bbb1af4c7cfe114c23f30240955b026f7" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_ws_risc_basic_test.c": { + "sha256": "c34824e7d4fefbe98d1f8d606bdb14c042917e1603ebdfe4d98a7f8a31147158" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_ws_risc_btranspose_test.c": { + "sha256": "3869bc9ce52591118fcfb6fe1ceab4f3a8a0fe496b12dbd2b84f20ac3fde0fbc" + }, + "tests/reference/examples/balls/gemmini/workloads/ctests/gemmini_ws_risc_shift_test.c": { + "sha256": "ba8cd9b3148f707c7a451dc016fff5d0bb6df3b7f05accd6a22c3202ea7bd663" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini.h": { + "sha256": "28d76de0a7cea15ad56857dc0bf96e66931a004d43531d57415fef9180060794" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_compute_accumulated.h": { + "sha256": "884721bb02de7c8e5ad5df6ce64a55eb1877de69ce1b5b82ddeed32615f59e21" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_compute_preloaded.h": { + "sha256": "bbab5fa3af8537b10dd9102008e4fac64553a6f265837aea7fa7ffa07d941fa3" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_config.h": { + "sha256": "c02b851181bbba2e3c562714dade47ef9fd37d94671827df9fca2da99b429265" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_flush.h": { + "sha256": "9e57eb61e455a3296e3177c2f56a50ee4b85467e17db925ec959e83e9d469822" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_loop_conv_ws.h": { + "sha256": "3111bf7ece22ff56a2a248c802dd5dc0cc5a7cb8323a427b916c2de98b306fe6" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_loop_ws.h": { + "sha256": "19530b9162e59cce3deb707312c2cfe4ec885fa73b54cc79bf3e6f52d45a73e0" + }, + "tests/reference/examples/balls/gemmini/workloads/isa/gemmini_preload.h": { + "sha256": "a5ac4c839a9ec1c33e8a34a1ebc282c6470196b8c19d91a429df3afa24f4b85e" + } + }, + "generated_build_inputs": { + "CMakeLists.txt": { + "sha256": "4ea8d92e23c19d780fff7d6a2c1369ef3363dc1fe87acf1195656ce852684f4f" + }, + "PREPARED.json": { + "sha256": "890d8a759be94610a16a5ac976f0775e99220a4e4de3e44abd3c3aeeff99819e" + }, + "ballISA.h": { + "sha256": "8f74e9230c45bc270c99b4b31fde6db6ed61b01c0055c7c62855de11bb571606" + }, + "gemmini_linux_check.c": { + "sha256": "2fa2f6d73d674d89344ffd058f28712380c2de04d64a88b43fe141e30e9df467" + }, + "gemmini_os_cisc_atranspose_test.c": { + "sha256": "d4b44df5f004b4e1d4ada02c247e5f66a6596dfa80cf70a09c54d7448b572712" + }, + "gemmini_os_cisc_basic_test.c": { + "sha256": "481733138780de0ef2ce7d867bc375cd22a64990f33b9eabd8a03a45c2e8861c" + }, + "gemmini_os_cisc_btranspose_test.c": { + "sha256": "efdf1cefe9277fde1dce1d62eb7c3364ddbb27926e99ddce9800f1fb54be1fec" + }, + "gemmini_os_cisc_shift_test.c": { + "sha256": "9676b4e45945de9cbe005be695ffd8d0f3a406fa0448875a8372cc1d1c20fb4c" + }, + "gemmini_os_risc_abtranspose_test.c": { + "sha256": "641982f9adc4b898a27d23967807d9f350c3db717b7c276df42281b7c6ba3558" + }, + "gemmini_os_risc_atranspose_test.c": { + "sha256": "4583e36cbea777a439e65fb4ca58e51574e2f7686217088922128c36fa8d74f9" + }, + "gemmini_os_risc_basic_test.c": { + "sha256": "cd8102c88b58a2ea289212779bd2bf50f9e35806e9039f4cc5a6abf73eef131f" + }, + "gemmini_os_risc_btranspose_test.c": { + "sha256": "01ee05bb7a92de708e1bac4041354d9f0363c70a4f5b898af784f47410f63798" + }, + "gemmini_os_risc_shift_test.c": { + "sha256": "aae1a632fd3fabc1ae9fea89daf9dc0693880c718f100c86b946257935a4076d" + }, + "gemmini_ws_cisc_conv_test.c": { + "sha256": "ab75719d036a6b61b4369514c6771ebac94a04e7448f2127b1be60bab2e8f28b" + }, + "gemmini_ws_risc_basic_test.c": { + "sha256": "f5aab861cf0f764e6179e24c70c75d9f3c7e9a0364a4e3aa818784f7f309c03a" + }, + "gemmini_ws_risc_btranspose_test.c": { + "sha256": "fff4938ea7c16864e3e1b91a2d30ef2d3eabeb3ed4a1153964f5d351d6980279" + }, + "gemmini_ws_risc_shift_test.c": { + "sha256": "a22209c0c02cd5d5b258525dd6266bbe3a7447b410a082e8da19a268478b6307" + }, + "params.h": { + "sha256": "cc6bbe816a15f9a7bd133fbeb45d039733a22a6a6f94dace16eecea5eef61b24" + } + }, + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0" +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json new file mode 100644 index 0000000..ae04c82 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/LINUX_GEMMINI_BUILD.json @@ -0,0 +1,86 @@ +{ + "result": "PASS_BUILD_NOT_HARDWARE_TESTED", + "elapsed_seconds": 143.825, + "software_baseline": { + "bbkernel": "b80336ce647f6604713f1570e1e1355f705a4355", + "linux": "ffc253263a1375a65fa6c9f62a893e9767fbebfa", + "opensbi": "c0f87f10d1bfb9e72a84ddfafb5604ee1bfe9d04", + "busybox": "1a64f6a20aaf6ea4dbba68bbfa8cc1ab7e5c57c4" + }, + "profile": { + "gemmini_rows": 8, + "gemmini_columns": 8, + "bank_width": 64, + "bank_count": 8, + "virtual_bank_count": 16, + "bank_rows": 1024 + }, + "payload_bytes": 25797640, + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "workloads": { + "gemmini_linux_check-linux": { + "bytes": 630680, + "sha256": "3d80717b1f0b593e22761e78626c38dec685c7a25c3d53ed42037357b652aa90" + }, + "gemmini_os_cisc_atranspose_test-linux": { + "bytes": 604440, + "sha256": "a2a79cc1d7bb333494ae14307685fb4b8891869a5d1eb037c004c176e0b98f6c" + }, + "gemmini_os_cisc_basic_test-linux": { + "bytes": 604408, + "sha256": "1215a8cafc2d6c11cfc8f01888f6bbecb8b2ca2201d5145f474bc852b68e4af4" + }, + "gemmini_os_cisc_btranspose_test-linux": { + "bytes": 604440, + "sha256": "18fe78a5f89ce0123f475df151d407cdb1b68c99dda7ef94b5255f376a667ec9" + }, + "gemmini_os_cisc_shift_test-linux": { + "bytes": 604408, + "sha256": "8b909fa200eeb000eb21cc71ca5ee2c960079fea2d57c62914e1ea3db4ba1651" + }, + "gemmini_os_risc_abtranspose_test-linux": { + "bytes": 604960, + "sha256": "443f12c0b2c6695c88592ac6c40b29ec56b09750d4e993c60b1bfceb5fdd1b5d" + }, + "gemmini_os_risc_atranspose_test-linux": { + "bytes": 604928, + "sha256": "40b99995cb6da30d2c3ba3a22b409033ddb2bd919b65b9eb1e0a3c19b67ff72e" + }, + "gemmini_os_risc_basic_test-linux": { + "bytes": 604920, + "sha256": "c789f91569d945db7c3d0b9d3441ab8938bc63354b0cabdfc003b634928664ba" + }, + "gemmini_os_risc_btranspose_test-linux": { + "bytes": 604928, + "sha256": "157bc4c831becf30652c60f62cbe65d33a60e8daa2eaa3ede2c8f8462f3a10b7" + }, + "gemmini_os_risc_shift_test-linux": { + "bytes": 604888, + "sha256": "be2b3cdaf1508650b374a36ac71b6a2bc05773366534ccd4cb1ce0a6ff524a76" + }, + "gemmini_ws_cisc_conv_test-linux": { + "bytes": 604408, + "sha256": "dd6d61b4f5d3a3058c6d2ca9a719c2a764533a01931a6e1c8d502f4793cdc9b4" + }, + "gemmini_ws_risc_basic_test-linux": { + "bytes": 604920, + "sha256": "b71942c93c3c6e2fc0ae9a2bfb07f7c061eef863e1282bf1c38a58d3864fa796" + }, + "gemmini_ws_risc_btranspose_test-linux": { + "bytes": 604960, + "sha256": "db3c5c781198f5c9f6d4df6c74ed640c1dc20e3964a32908b57b3e6264a584e7" + }, + "gemmini_ws_risc_shift_test-linux": { + "bytes": 604920, + "sha256": "14ef70b0c8a134ab12deb37bb6d0b245b19243cf556eb0da970d823e7032a822" + }, + "linux_system_check-linux": { + "bytes": 616848, + "sha256": "7fff55e3b560fd72482984f225b70a4a1154512452b96fc1467665b2acc32e00" + } + }, + "rootfs_install_verified": true, + "flash_modified": false, + "hardware_gemmini_tested": false, + "model_end_to_end_tested": false +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/SESSION.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/SESSION.json new file mode 100644 index 0000000..ed34534 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/SESSION.json @@ -0,0 +1,6 @@ +{ + "remote": "/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c", + "exit_code": 0, + "timeout_seconds": 3600, + "elapsed_seconds": 145.796 +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/build.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/build.log new file mode 100644 index 0000000..596c789 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/build/build.log @@ -0,0 +1,1564 @@ +CACHE bbkernel a950c71b7067c64b4aecbfa1b984be4e6441cf7a6fbdffcc88e46b1a5c07c388 +CACHE linux 2fa48537a32d233ec8f8f0ba36fdd19c07a9ee78a574034876b39939429ced84 +CACHE opensbi 3727578a8ca58564f496aaaffc57d458ee65cf0f8302df657cb3e9deeacda2f9 +CACHE busybox 076a7449075feea57afc2750b10a9ff5e95e93f782ad454404fedd10a27c2933 +RUN python3 software/prepare_gemmini_linux.py +Prepared 13 pinned cases and one blocked-matmul workload in /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/linux-gemmini +RUN cmake -S build/linux-gemmini -B build/linux-gemmini-build -DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc +-- The C compiler identification is GNU 15.3.0 +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /nix/store/l4dz443kk1rr8m3z0hby213xc2wqpjyc-riscv64-linux-gnu-toolchain/bin/riscv64-unknown-linux-gnu-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Configuring done (0.6s) +-- Generating done (0.0s) +-- Build files have been written to: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/linux-gemmini-build +RUN cmake --build build/linux-gemmini-build -j8 +[ 3%] Building C object CMakeFiles/bb_reference.dir/reference/bb-tests/workloads/lib/buckyball.c.o +[ 9%] Building C object CMakeFiles/bb_reference.dir/reference/bb-tests/workloads/lib/bbhw/mem/mem.c.o +[ 9%] Building C object CMakeFiles/bb_reference.dir/reference/bb-tests/workloads/lib/bbhw/isa/isa.c.o +[ 12%] Linking C static library libbb_reference.a +[ 12%] Built target bb_reference +[ 15%] Building C object CMakeFiles/gemmini_os_cisc_basic_test-linux.dir/gemmini_os_cisc_basic_test.c.o +[ 18%] Building C object CMakeFiles/gemmini_os_cisc_btranspose_test-linux.dir/gemmini_os_cisc_btranspose_test.c.o +[ 21%] Building C object CMakeFiles/gemmini_linux_check-linux.dir/gemmini_linux_check.c.o +[ 28%] Building C object CMakeFiles/gemmini_os_cisc_shift_test-linux.dir/gemmini_os_cisc_shift_test.c.o +[ 28%] Building C object CMakeFiles/gemmini_os_risc_basic_test-linux.dir/gemmini_os_risc_basic_test.c.o +[ 34%] Building C object CMakeFiles/gemmini_os_risc_abtranspose_test-linux.dir/gemmini_os_risc_abtranspose_test.c.o +[ 34%] Building C object CMakeFiles/gemmini_os_cisc_atranspose_test-linux.dir/gemmini_os_cisc_atranspose_test.c.o +[ 37%] Building C object CMakeFiles/gemmini_os_risc_atranspose_test-linux.dir/gemmini_os_risc_atranspose_test.c.o +[ 40%] Linking C executable gemmini_os_cisc_basic_test-linux +[ 43%] Linking C executable gemmini_os_cisc_btranspose_test-linux +[ 46%] Linking C executable gemmini_os_cisc_shift_test-linux +[ 50%] Linking C executable gemmini_os_risc_abtranspose_test-linux +[ 53%] Linking C executable gemmini_os_risc_atranspose_test-linux +[ 56%] Linking C executable gemmini_os_risc_basic_test-linux +[ 59%] Linking C executable gemmini_os_cisc_atranspose_test-linux +[ 59%] Built target gemmini_os_cisc_shift_test-linux +[ 59%] Built target gemmini_os_risc_atranspose_test-linux +[ 62%] Linking C executable gemmini_linux_check-linux +[ 62%] Built target gemmini_os_cisc_basic_test-linux +[ 62%] Built target gemmini_os_cisc_btranspose_test-linux +[ 62%] Built target gemmini_os_cisc_atranspose_test-linux +[ 65%] Building C object CMakeFiles/gemmini_os_risc_btranspose_test-linux.dir/gemmini_os_risc_btranspose_test.c.o +[ 65%] Built target gemmini_os_risc_abtranspose_test-linux +[ 68%] Building C object CMakeFiles/gemmini_os_risc_shift_test-linux.dir/gemmini_os_risc_shift_test.c.o +[ 75%] Building C object CMakeFiles/gemmini_ws_risc_basic_test-linux.dir/gemmini_ws_risc_basic_test.c.o +[ 75%] Building C object CMakeFiles/gemmini_ws_cisc_conv_test-linux.dir/gemmini_ws_cisc_conv_test.c.o +[ 75%] Built target gemmini_os_risc_basic_test-linux +[ 78%] Building C object CMakeFiles/gemmini_ws_risc_btranspose_test-linux.dir/gemmini_ws_risc_btranspose_test.c.o +[ 81%] Building C object CMakeFiles/gemmini_ws_risc_shift_test-linux.dir/gemmini_ws_risc_shift_test.c.o +[ 84%] Linking C executable gemmini_os_risc_btranspose_test-linux +[ 90%] Linking C executable gemmini_ws_cisc_conv_test-linux +[ 90%] Linking C executable gemmini_os_risc_shift_test-linux +[ 93%] Linking C executable gemmini_ws_risc_basic_test-linux +[ 96%] Linking C executable gemmini_ws_risc_shift_test-linux +[100%] Linking C executable gemmini_ws_risc_btranspose_test-linux +[100%] Built target gemmini_linux_check-linux +[100%] Built target gemmini_os_risc_btranspose_test-linux +[100%] Built target gemmini_ws_risc_basic_test-linux +[100%] Built target gemmini_os_risc_shift_test-linux +[100%] Built target gemmini_ws_risc_shift_test-linux +[100%] Built target gemmini_ws_risc_btranspose_test-linux +[100%] Built target gemmini_ws_cisc_conv_test-linux +RUN cmake --install build/linux-gemmini-build --prefix /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads +-- Install configuration: "" +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_linux_check-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_cisc_atranspose_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_cisc_basic_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_cisc_btranspose_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_cisc_shift_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_risc_abtranspose_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_risc_atranspose_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_risc_basic_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_risc_btranspose_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_os_risc_shift_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_ws_cisc_conv_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_ws_risc_basic_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_ws_risc_btranspose_test-linux +-- Installing: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/output/workloads/./gemmini_ws_risc_shift_test-linux +RUN bash software/build.sh +Prepared 19 pinned bbkernel files; two board adaptations; no image built +Prepared firesim/linux at ffc253263a1375a65fa6c9f62a893e9767fbebfa +Prepared riscv-software-src/opensbi at c0f87f10d1bfb9e72a84ddfafb5604ee1bfe9d04 +Prepared mirror/busybox at 1a64f6a20aaf6ea4dbba68bbfa8cc1ab7e5c57c4 +-- Configuring done (0.0s) +-- Generating done (0.0s) +-- Build files have been written to: /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/kernel-build +[ 16%] Building busybox (static RISC-V) + GEN /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/kernel-build/busybox/Makefile + GEN include/applets.h + GEN include/usage.h + GEN miscutils/Kbuild + GEN miscutils/Config.in + GEN klibc-utils/Kbuild + GEN klibc-utils/Config.in + GEN archival/Kbuild + GEN archival/Config.in + GEN archival/libarchive/Kbuild + GEN mailutils/Kbuild + GEN mailutils/Config.in + GEN selinux/Kbuild + GEN selinux/Config.in + GEN scripts/Kbuild + GEN applets/Kbuild + GEN libbb/Kbuild + GEN libbb/Config.in + GEN printutils/Kbuild + GEN printutils/Config.in + GEN modutils/Kbuild + GEN modutils/Config.in + GEN editors/Kbuild + GEN editors/Config.in + GEN e2fsprogs/Kbuild + GEN e2fsprogs/Config.in + GEN shell/Kbuild + GEN shell/Config.in + GEN debianutils/Kbuild + GEN debianutils/Config.in + GEN runit/Kbuild + GEN runit/Config.in + GEN init/Kbuild + GEN init/Config.in + GEN networking/Kbuild + GEN networking/Config.in + GEN networking/libiproute/Kbuild + GEN networking/udhcp/Kbuild + GEN networking/udhcp/Config.in + GEN coreutils/Kbuild + GEN coreutils/Config.in + GEN coreutils/libcoreutils/Kbuild + GEN console-tools/Kbuild + GEN console-tools/Config.in + GEN util-linux/Kbuild + GEN util-linux/Config.in + GEN util-linux/volume_id/Kbuild + GEN util-linux/volume_id/Config.in + GEN procps/Kbuild + GEN procps/Config.in + GEN sysklogd/Kbuild + GEN sysklogd/Config.in + GEN loginutils/Kbuild + GEN loginutils/Config.in + GEN findutils/Kbuild + GEN findutils/Config.in + GEN libpwdgrp/Kbuild +# +# using defaults found in .config +# +* +* Busybox Configuration +* +* +* Settings +* +Enable compatibility for full-blown desktop systems (8kb) (DESKTOP) [Y/n/?] y +Provide compatible behavior for rare corner cases (bigger code) (EXTRA_COMPAT) [N/y/?] n +Building for Fedora distribution (FEDORA_COMPAT) [N/y/?] n +Enable obsolete features removed before SUSv3 (INCLUDE_SUSv2) [Y/n/?] y +Support --long-options (LONG_OPTS) [Y/?] y +Show applet usage messages (SHOW_USAGE) [Y/n/?] y + Show verbose applet usage messages (FEATURE_VERBOSE_USAGE) [Y/n/?] y + Store applet usage messages in compressed form (FEATURE_COMPRESS_USAGE) [N/y/?] n +Support files > 2 GB (LFS) [Y/n/?] y +Support PAM (Pluggable Authentication Modules) (PAM) [N/y/?] n +Use the devpts filesystem for Unix98 PTYs (FEATURE_DEVPTS) [Y/n/?] y +Support utmp file (FEATURE_UTMP) [Y/n/?] y + Support wtmp file (FEATURE_WTMP) [Y/n/?] y +Support writing pidfiles (FEATURE_PIDFILE) [N/y/?] n + Directory for pidfiles (PID_FILE_PATH) [] +Include busybox applet (BUSYBOX) [Y/n/?] y + Support --show SCRIPT (FEATURE_SHOW_SCRIPT) [Y/n] y + Support --install [-s] to install applet links at runtime (FEATURE_INSTALLER) [Y/n/?] y +Don't use /usr (INSTALL_NO_USR) [N/y/?] n +Drop SUID state for most applets (FEATURE_SUID) [Y/n/?] y + Enable SUID configuration via /etc/busybox.conf (FEATURE_SUID_CONFIG) [N/y/?] n +exec prefers applets (FEATURE_PREFER_APPLETS) [N/y/?] n +Path to busybox executable (BUSYBOX_EXEC_PATH) [/proc/self/exe] /proc/self/exe +Support NSA Security Enhanced Linux (SELINUX) [N/y/?] n +Clean up all memory before exiting (usually not needed) (FEATURE_CLEAN_UP) [Y/n/?] y +Support LOG_INFO level syslog messages (FEATURE_SYSLOG_INFO) [Y/n/?] y +* +* Build Options +* +Build static binary (no shared libs) (STATIC) [Y/n/?] y +Force NOMMU build (NOMMU) [N/y/?] n +Cross compiler prefix (CROSS_COMPILER_PREFIX) [riscv64-unknown-linux-gnu-] riscv64-unknown-linux-gnu- +Path to sysroot (SYSROOT) [] +Additional CFLAGS (EXTRA_CFLAGS) [] +Additional LDFLAGS (EXTRA_LDFLAGS) [] +Additional LDLIBS (EXTRA_LDLIBS) [] +Avoid using GCC-specific code constructs (USE_PORTABLE_CODE) [N/y/?] n +Use -mpreferred-stack-boundary=2 on i386 arch (STACK_OPTIMIZATION_386) [Y/n/?] y +Use -static-libgcc (STATIC_LIBGCC) [Y/n/?] y +* +* Installation Options ("make install" behavior) +* +What kind of applet links to install +> 1. as soft-links (INSTALL_APPLET_SYMLINKS) + 2. as hard-links (INSTALL_APPLET_HARDLINKS) + 3. as script wrappers (INSTALL_APPLET_SCRIPT_WRAPPERS) + 4. not installed (INSTALL_APPLET_DONT) +choice[1-4?]: 1 +Destination path for 'make install' (PREFIX) [./_install] ./_install +* +* Debugging Options +* +Build with debug information (DEBUG) [N/y/?] n +Enable runtime sanitizers (ASAN/LSAN/USAN/etc...) (DEBUG_SANITIZE) [N/y/?] n +Build unit tests (UNIT_TEST) [N/y/?] n +Abort compilation on any warning (WERROR) [N/y/?] n +Warn about single parameter bb_xx_msg calls (WARN_SIMPLE_MSG) [N/y/?] n +Additional debugging library +> 1. None (NO_DEBUG_LIB) + 2. Dmalloc (DMALLOC) + 3. Electric-fence (EFENCE) +choice[1-3?]: 1 +* +* Library Tuning +* +Use the end of BSS page (FEATURE_USE_BSS_TAIL) [N/y/?] n +Enable fractional duration arguments (FLOAT_DURATION) [Y/n/?] y +Support RTMIN[+n] and RTMAX[-n] signal names (FEATURE_RTMINMAX) [Y/n/?] y + Use the definitions of SIGRTMIN/SIGRTMAX provided by libc (FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS) [Y/n/?] y +Buffer allocation policy +> 1. Allocate with Malloc (FEATURE_BUFFERS_USE_MALLOC) + 2. Allocate on the Stack (FEATURE_BUFFERS_GO_ON_STACK) + 3. Allocate in the .bss section (FEATURE_BUFFERS_GO_IN_BSS) +choice[1-3?]: 1 +Minimum password length (PASSWORD_MINLEN) [6] 6 +MD5: Trade bytes for speed (0:fast, 3:slow) (MD5_SMALL) [1] 1 +SHA1: Trade bytes for speed (0:fast, 3:slow) (SHA1_SMALL) [3] 3 +SHA1: Use hardware accelerated instructions if possible (SHA1_HWACCEL) [N/y/?] n +SHA256: Use hardware accelerated instructions if possible (SHA256_HWACCEL) [N/y/?] n +SHA3: Trade bytes for speed (0:fast, 1:slow) (SHA3_SMALL) [1] 1 +Non-POSIX, but safer, copying to special nodes (FEATURE_NON_POSIX_CP) [Y/n/?] y +Give more precise messages when copy fails (cp, mv etc) (FEATURE_VERBOSE_CP_MESSAGE) [N/y/?] n +Use sendfile system call (FEATURE_USE_SENDFILE) [Y/n/?] y +Copy buffer size, in kilobytes (FEATURE_COPYBUF_KB) [4] 4 +Use clock_gettime(CLOCK_MONOTONIC) syscall (MONOTONIC_SYSCALL) [Y/n/?] y +Use ioctl names rather than hex values in error messages (IOCTL_HEX2STR_ERROR) [Y/n/?] y +Command line editing (FEATURE_EDITING) [Y/n/?] y + Maximum length of input (FEATURE_EDITING_MAX_LEN) [1024] 1024 + vi-style line editing commands (FEATURE_EDITING_VI) [Y/n/?] y + History size (FEATURE_EDITING_HISTORY) [999] 999 + History saving (FEATURE_EDITING_SAVEHISTORY) [Y/n/?] y + Save history on shell exit, not after every command (FEATURE_EDITING_SAVE_ON_EXIT) [N/y/?] n + Reverse history search (FEATURE_REVERSE_SEARCH) [Y/n/?] y + Tab completion (FEATURE_TAB_COMPLETION) [Y/n] y + Username completion (FEATURE_USERNAME_COMPLETION) [N/y] n + Fancy shell prompts (FEATURE_EDITING_FANCY_PROMPT) [Y/n/?] y + Enable automatic tracking of window size changes (FEATURE_EDITING_WINCH) [Y/n] y + Query cursor position from terminal (FEATURE_EDITING_ASK_TERMINAL) [N/y/?] n +Enable locale support (system needs locale for this to work) (LOCALE_SUPPORT) [N/y/?] n +Support Unicode (UNICODE_SUPPORT) [N/y/?] n +Use LOOP_CONFIGURE for losetup and loop mounts + 1. use LOOP_CONFIGURE, needs kernel >= 5.8 (LOOP_CONFIGURE) + 2. use LOOP_SET_FD + LOOP_SET_STATUS (NO_LOOP_CONFIGURE) +> 3. try LOOP_CONFIGURE, fall back to LOOP_SET_FD + LOOP_SET_STATUS (TRY_LOOP_CONFIGURE) +choice[1-3?]: 3 +* +* Applets +* +* +* Archival Utilities +* +Make tar, rpm, modprobe etc understand .xz data (FEATURE_SEAMLESS_XZ) [N/y] n +Make tar, rpm, modprobe etc understand .lzma data (FEATURE_SEAMLESS_LZMA) [N/y] n +Make tar, rpm, modprobe etc understand .bz2 data (FEATURE_SEAMLESS_BZ2) [N/y] n +Make tar, rpm, modprobe etc understand .gz data (FEATURE_SEAMLESS_GZ) [N/y] n +Make tar, rpm, modprobe etc understand .Z data (FEATURE_SEAMLESS_Z) [N/y] n +ar (9.5 kb) (AR) [Y/n/?] y + Support long filenames (not needed for debs) (FEATURE_AR_LONG_FILENAMES) [N/y/?] n + Support archive creation (FEATURE_AR_CREATE) [Y/n/?] y +uncompress (7.1 kb) (UNCOMPRESS) [N/y/?] n +gunzip (11 kb) (GUNZIP) [Y/n/?] y +zcat (24 kb) (ZCAT) [Y/n/?] y + Enable long options (FEATURE_GUNZIP_LONG_OPTIONS) [Y/n] y +bunzip2 (8.7 kb) (BUNZIP2) [Y/n/?] y +bzcat (8.7 kb) (BZCAT) [Y/n/?] y +unlzma (7.5 kb) (UNLZMA) [Y/n/?] y +lzcat (7.5 kb) (LZCAT) [Y/n/?] y +lzma -d (LZMA) [Y/n/?] y +unxz (13 kb) (UNXZ) [Y/n/?] y +xzcat (13 kb) (XZCAT) [Y/n/?] y +xz -d (XZ) [Y/n/?] y +bzip2 (16 kb) (BZIP2) [N/y/?] n + Enable decompression (FEATURE_BZIP2_DECOMPRESS) [Y/?] y +cpio (15 kb) (CPIO) [Y/n/?] y + Support archive creation (FEATURE_CPIO_O) [N/y/?] n +dpkg (43 kb) (DPKG) [N/y/?] n +dpkg-deb (30 kb) (DPKG_DEB) [N/y/?] n +gzip (17 kb) (GZIP) [Y/n/?] y + Enable long options (FEATURE_GZIP_LONG_OPTIONS) [N/y] n + Trade memory for speed (0:small,slow - 2:fast,big) (GZIP_FAST) [0] 0 + Enable compression levels (FEATURE_GZIP_LEVELS) [N/y/?] n + Enable decompression (FEATURE_GZIP_DECOMPRESS) [Y/?] y +lzop (12 kb) (LZOP) [N/y/?] n +unlzop (13 kb) (UNLZOP) [Y/n/?] y +lzopcat (13 kb) (LZOPCAT) [Y/n/?] y + lzop compression levels 7,8,9 (not very useful) (LZOP_COMPR_HIGH) [N/y/?] n +rpm (32 kb) (RPM) [N/y/?] n +rpm2cpio (21 kb) (RPM2CPIO) [N/y/?] n +tar (39 kb) (TAR) [Y/n/?] y + Enable long options (FEATURE_TAR_LONG_OPTIONS) [Y/n] y + Enable -c (archive creation) (FEATURE_TAR_CREATE) [Y/n] y + Enable -X (exclude from) and -T (include from) options (FEATURE_TAR_FROM) [Y/n/?] y + Support old tar header format (FEATURE_TAR_OLDGNU_COMPATIBILITY) [N/y/?] n + Enable untarring of tarballs with checksums produced by buggy Sun tar (FEATURE_TAR_OLDSUN_COMPATIBILITY) [N/y/?] n + Support GNU tar extensions (long filenames) (FEATURE_TAR_GNU_EXTENSIONS) [Y/n] y + Support writing to an external program (--to-command) (FEATURE_TAR_TO_COMMAND) [Y/n/?] y + Enable use of user and group names (FEATURE_TAR_UNAME_GNAME) [N/y/?] n + Enable -m (do not preserve time) GNU option (FEATURE_TAR_NOPRESERVE_TIME) [N/y] n +unzip (26 kb) (UNZIP) [Y/n/?] y + Read and use Central Directory data (FEATURE_UNZIP_CDF) [Y/n/?] y + Support compression method 12 (bzip2) (FEATURE_UNZIP_BZIP2) [Y/n] y + Support compression method 14 (lzma) (FEATURE_UNZIP_LZMA) [Y/n] y + Support compression method 95 (xz) (FEATURE_UNZIP_XZ) [Y/n] y +Optimize lzma for speed (FEATURE_LZMA_FAST) [N/y/?] n +* +* Coreutils +* +Support verbose options (usually -v) for various applets (FEATURE_VERBOSE) [Y/n/?] y +* +* Common options for date and touch +* +Allow timezone in dates (FEATURE_TIMEZONE) [Y/n/?] y +* +* Common options for cp and mv +* +Preserve hard links (FEATURE_PRESERVE_HARDLINKS) [Y/n/?] y +* +* Common options for df, du, ls +* +Support human readable output (example 13k, 23M, 235G) (FEATURE_HUMAN_READABLE) [Y/n/?] y +basename (438 bytes) (BASENAME) [Y/n/?] y +cat (5.6 kb) (CAT) [Y/?] y + Enable -n and -b options (FEATURE_CATN) [Y/n/?] y + cat -v[etA] (FEATURE_CATV) [Y/n/?] y +chgrp (7.6 kb) (CHGRP) [Y/n/?] y +chmod (5.5 kb) (CHMOD) [Y/n/?] y +chown (7.6 kb) (CHOWN) [Y/n/?] y + Enable long options (FEATURE_CHOWN_LONG_OPTIONS) [N/y] n +chroot (3.7 kb) (CHROOT) [Y/n/?] y +cksum (4.1 kb) (CKSUM) [Y/n] y +crc32 (4.1 kb) (CRC32) [Y/n] y +comm (4.2 kb) (COMM) [N/y/?] n +cp (10 kb) (CP) [Y/n/?] y + Enable long options (FEATURE_CP_LONG_OPTIONS) [N/y/?] n +cut (5.8 kb) (CUT) [Y/n/?] y + cut -F (FEATURE_CUT_REGEX) [Y/n/?] y +date (7 kb) (DATE) [Y/n/?] y + Enable ISO date format output (-I) (FEATURE_DATE_ISOFMT) [Y/n/?] y + Support %[num]N nanosecond format specifier (FEATURE_DATE_NANO) [N/y/?] n + Support weird 'date MMDDhhmm[[YY]YY][.ss]' format (FEATURE_DATE_COMPAT) [Y/n/?] y +dd (7.5 kb) (DD) [Y/n/?] y + Enable signal handling for status reporting (FEATURE_DD_SIGNAL_HANDLING) [Y/n/?] y + Enable the third status line upon signal (FEATURE_DD_THIRD_STATUS_LINE) [N/y/?] n + Enable ibs, obs, iflag, oflag and conv options (FEATURE_DD_IBS_OBS) [Y/n/?] y + Enable status display options (FEATURE_DD_STATUS) [Y/n/?] y +df (6.8 kb) (DF) [Y/n/?] y + Enable -a, -i, -B (FEATURE_DF_FANCY) [N/y/?] n + Skip rootfs in mount table (FEATURE_SKIP_ROOTFS) [Y/n/?] y +dirname (329 bytes) (DIRNAME) [Y/n/?] y +dos2unix (5.2 kb) (DOS2UNIX) [Y/n/?] y +unix2dos (5.2 kb) (UNIX2DOS) [Y/n/?] y +du (6.3 kb) (DU) [Y/n/?] y + Use default blocksize of 1024 bytes (else it's 512 bytes) (FEATURE_DU_DEFAULT_BLOCKSIZE_1K) [Y/n] y +echo (1.8 kb) (ECHO) [Y/?] y + Enable -n and -e options (FEATURE_FANCY_ECHO) [Y/n] y +env (4 kb) (ENV) [Y/n/?] y +expand (5.1 kb) (EXPAND) [N/y/?] n +unexpand (5.3 kb) (UNEXPAND) [N/y/?] n +expr (6.6 kb) (EXPR) [Y/n/?] y + Extend Posix numbers support to 64 bit (EXPR_MATH_SUPPORT_64) [Y/n/?] y +factor (2.7 kb) (FACTOR) [Y/n/?] y +false (tiny) (FALSE) [Y/n/?] y +fold (4.6 kb) (FOLD) [Y/n/?] y +head (3.8 kb) (HEAD) [Y/n/?] y + Enable -c, -q, and -v (FEATURE_FANCY_HEAD) [Y/n] y +hostid (286 bytes) (HOSTID) [Y/n/?] y +id (7 kb) (ID) [Y/n/?] y +groups (6.7 kb) (GROUPS) [N/y/?] n +install (12 kb) (INSTALL) [Y/n/?] y + Enable long options (FEATURE_INSTALL_LONG_OPTIONS) [Y/n] y +link (3.2 kb) (LINK) [Y/n/?] y +ln (4.9 kb) (LN) [Y/n/?] y +logname (1.1 kb) (LOGNAME) [Y/n/?] y +ls (14 kb) (LS) [Y/n/?] y + Enable filetyping options (-p and -F) (FEATURE_LS_FILETYPES) [Y/n] y + Enable symlinks dereferencing (-L) (FEATURE_LS_FOLLOWLINKS) [Y/n] y + Enable recursion (-R) (FEATURE_LS_RECURSIVE) [Y/n] y + Enable -w WIDTH and window size autodetection (FEATURE_LS_WIDTH) [Y/n] y + Sort the file names (FEATURE_LS_SORTFILES) [Y/n/?] y + Show file timestamps (FEATURE_LS_TIMESTAMPS) [Y/n/?] y + Show username/groupnames (FEATURE_LS_USERNAME) [Y/n/?] y + Allow use of color to identify file types (FEATURE_LS_COLOR) [Y/n/?] y + Produce colored ls output by default (FEATURE_LS_COLOR_IS_DEFAULT) [Y/n/?] y +md5sum (6.5 kb) (MD5SUM) [Y/n/?] y +sha1sum (5.9 kb) (SHA1SUM) [Y/n/?] y +sha256sum (7 kb) (SHA256SUM) [Y/n/?] y +sha512sum (7.4 kb) (SHA512SUM) [Y/n/?] y +sha3sum (6.1 kb) (SHA3SUM) [Y/n/?] y + * + * Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum + * + Enable -c, -s and -w options (FEATURE_MD5_SHA1_SUM_CHECK) [Y/n/?] y +mkdir (4.5 kb) (MKDIR) [Y/n/?] y +mkfifo (3.8 kb) (MKFIFO) [Y/n/?] y +mknod (4.5 kb) (MKNOD) [Y/n/?] y +mktemp (4.2 kb) (MKTEMP) [Y/n/?] y +mv (10 kb) (MV) [Y/n/?] y +nice (2.1 kb) (NICE) [Y/n/?] y +nl (4.6 kb) (NL) [Y/n/?] y +nohup (2 kb) (NOHUP) [Y/n/?] y +nproc (3.7 kb) (NPROC) [Y/n/?] y +od (11 kb) (OD) [Y/n/?] y +paste (4.9 kb) (PASTE) [Y/n/?] y +printenv (1.3 kb) (PRINTENV) [Y/n/?] y +printf (3.8 kb) (PRINTF) [Y/n/?] y +pwd (3.7 kb) (PWD) [Y/n/?] y +readlink (4 kb) (READLINK) [Y/n/?] y + Enable canonicalization by following all symlinks (-f) (FEATURE_READLINK_FOLLOW) [Y/n/?] y +realpath (1.6 kb) (REALPATH) [Y/n/?] y +rm (5.4 kb) (RM) [Y/n/?] y +rmdir (3.5 kb) (RMDIR) [Y/n/?] y +seq (3.8 kb) (SEQ) [Y/n/?] y +shred (4.9 kb) (SHRED) [Y/n/?] y +shuf (5.4 kb) (SHUF) [N/y/?] n +sleep (2 kb) (SLEEP) [Y/?] y + Enable multiple arguments and s/m/h/d suffixes (FEATURE_FANCY_SLEEP) [Y/n/?] y +sort (7.7 kb) (SORT) [Y/n/?] y + Full SuSv3 compliant sort (support -ktcbdfioghM) (FEATURE_SORT_BIG) [Y/n/?] y + Use less memory (but might be slower) (FEATURE_SORT_OPTIMIZE_MEMORY) [N/y/?] n +split (5 kb) (SPLIT) [N/y/?] n +stat (11 kb) (STAT) [N/y/?] n +stty (8.9 kb) (STTY) [Y/n/?] y +sum (4 kb) (SUM) [N/y/?] n +sync (3.8 kb) (SYNC) [Y/n/?] y + Enable -d and -f flags (requires syncfs(2) in libc) (FEATURE_SYNC_FANCY) [N/y/?] n +fsync (3.6 kb) (FSYNC) [N/y/?] n +tac (3.9 kb) (TAC) [N/y/?] n +tail (6.8 kb) (TAIL) [Y/n/?] y + Enable -q, -s, -v, and -F options (FEATURE_FANCY_TAIL) [Y/n/?] y +tee (4.2 kb) (TEE) [Y/n/?] y + Enable block I/O (larger/faster) instead of byte I/O (FEATURE_TEE_USE_BLOCK_IO) [Y/n/?] y +test (4.1 kb) (TEST) [Y/n/?] y +test as [ (TEST1) [Y/n/?] y +test as [[ (TEST2) [Y/n/?] y + Extend test to 64 bit (FEATURE_TEST_64) [Y/n/?] y +timeout (6 kb) (TIMEOUT) [N/y/?] n +touch (5.9 kb) (TOUCH) [Y/n/?] y + Add support for SUSV3 features (-a -d -m -t -r) (FEATURE_TOUCH_SUSV3) [Y/n/?] y +tr (5.1 kb) (TR) [Y/n/?] y + Enable character classes (such as [:upper:]) (FEATURE_TR_CLASSES) [Y/n/?] y + Enable equivalence classes (FEATURE_TR_EQUIV) [Y/n/?] y +true (tiny) (TRUE) [Y/n/?] y +truncate (4.2 kb) (TRUNCATE) [Y/n/?] y +tsort (0.7 kb) (TSORT) [Y/n/?] y +tty (3.6 kb) (TTY) [Y/n/?] y +uname (3.9 kb) (UNAME) [Y/n/?] y + Operating system name (UNAME_OSNAME) [GNU/Linux] GNU/Linux +arch (1.1 kb) (BB_ARCH) [Y/n/?] y +uniq (4.9 kb) (UNIQ) [Y/n/?] y +unlink (3.2 kb) (UNLINK) [Y/n/?] y +usleep (1.3 kb) (USLEEP) [Y/n/?] y +uudecode (5.8 kb) (UUDECODE) [Y/n/?] y +base32 (4.9 kb) (BASE32) [Y/n/?] y +base64 (4.9 kb) (BASE64) [N/y/?] n +uuencode (4.4 kb) (UUENCODE) [Y/n/?] y +wc (4.5 kb) (WC) [Y/n/?] y + Support very large counts (FEATURE_WC_LARGE) [N/y/?] n +who (3.9 kb) (WHO) [Y/n/?] y +w (3.8 kb) (W) [Y/n/?] y +users (3.4 kb) (USERS) [N/y/?] n +whoami (3.2 kb) (WHOAMI) [Y/n/?] y +yes (1.2 kb) (YES) [Y/n/?] y +* +* Console Utilities +* +chvt (2 kb) (CHVT) [Y/n/?] y +clear (tiny) (CLEAR) [Y/n/?] y +deallocvt (1.9 kb) (DEALLOCVT) [Y/n/?] y +dumpkmap (1.6 kb) (DUMPKMAP) [Y/n/?] y +fgconsole (1.5 kb) (FGCONSOLE) [N/y/?] n +kbd_mode (4.1 kb) (KBD_MODE) [N/y/?] n +loadfont (5.2 kb) (LOADFONT) [Y/n/?] y +setfont (24 kb) (SETFONT) [N/y/?] n + * + * Common options for loadfont and setfont + * + Support PSF2 console fonts (FEATURE_LOADFONT_PSF2) [Y/n] y + Support old (raw) console fonts (FEATURE_LOADFONT_RAW) [Y/n] y +loadkmap (1.8 kb) (LOADKMAP) [Y/n/?] y +openvt (7.2 kb) (OPENVT) [Y/n/?] y +reset (345 bytes) (RESET) [Y/n/?] y +resize (903 bytes) (RESIZE) [Y/n/?] y + Print environment variables (FEATURE_RESIZE_PRINT) [Y/n/?] y +setconsole (3.6 kb) (SETCONSOLE) [Y/n/?] y + Enable long options (FEATURE_SETCONSOLE_LONG_OPTIONS) [N/y] n +setkeycodes (2.1 kb) (SETKEYCODES) [Y/n/?] y +setlogcons (1.8 kb) (SETLOGCONS) [Y/n/?] y +showkey (4.7 kb) (SHOWKEY) [N/y/?] n +* +* Debian Utilities +* +pipe_progress (275 bytes) (PIPE_PROGRESS) [Y/n/?] y +run-parts (6.1 kb) (RUN_PARTS) [Y/n/?] y + Enable long options (FEATURE_RUN_PARTS_LONG_OPTIONS) [Y/n] y + Support additional arguments (FEATURE_RUN_PARTS_FANCY) [N/y/?] n +start-stop-daemon (12 kb) (START_STOP_DAEMON) [Y/n/?] y + Enable long options (FEATURE_START_STOP_DAEMON_LONG_OPTIONS) [Y/n] y + Support additional arguments (FEATURE_START_STOP_DAEMON_FANCY) [Y/n/?] y +which (3.8 kb) (WHICH) [Y/n/?] y +* +* klibc-utils +* +minips (11 kb) (MINIPS) [N/y/?] n +nuke (2.9 kb) (NUKE) [Y/n/?] y +resume (3.2 kb) (RESUME) [Y/n/?] y +run-init (7.7 kb) (RUN_INIT) [Y/n/?] y +* +* Editors +* +awk (23 kb) (AWK) [Y/n/?] y + Enable math functions (requires libm) (FEATURE_AWK_LIBM) [N/y/?] n + Enable a few GNU extensions (FEATURE_AWK_GNU_EXTENSIONS) [Y/n/?] y +cmp (4.9 kb) (CMP) [Y/n/?] y +diff (13 kb) (DIFF) [Y/n/?] y + Enable long options (FEATURE_DIFF_LONG_OPTIONS) [N/y] n + Enable directory support (FEATURE_DIFF_DIR) [Y/n/?] y +ed (21 kb) (ED) [N/y/?] n +patch (9.4 kb) (PATCH) [Y/n/?] y +sed (12 kb) (SED) [Y/n/?] y +vi (23 kb) (VI) [Y/n/?] y + Maximum screen width (FEATURE_VI_MAX_LEN) [4096] 4096 + Allow to display 8-bit chars (otherwise shows dots) (FEATURE_VI_8BIT) [Y/n/?] y + Enable ":" colon commands (no "ex" mode) (FEATURE_VI_COLON) [Y/n/?] y + Expand "%" and "#" in colon commands (FEATURE_VI_COLON_EXPAND) [Y/n/?] y + Enable yank/put commands and mark cmds (FEATURE_VI_YANKMARK) [Y/n/?] y + Enable search and replace cmds (FEATURE_VI_SEARCH) [Y/n/?] y + Enable regex in search and replace (FEATURE_VI_REGEX_SEARCH) [N/y/?] n + Catch signals (FEATURE_VI_USE_SIGNALS) [Y/n/?] y + Remember previous cmd and "." cmd (FEATURE_VI_DOT_CMD) [Y/n/?] y + Enable -R option and "view" mode (FEATURE_VI_READONLY) [Y/n/?] y + Enable settable options, ai ic showmatch (FEATURE_VI_SETOPTS) [Y/n/?] y + Support :set (FEATURE_VI_SET) [Y/n] y + Handle window resize (FEATURE_VI_WIN_RESIZE) [Y/n/?] y + Use 'tell me cursor position' ESC sequence to measure window (FEATURE_VI_ASK_TERMINAL) [Y/n/?] y + Support undo command "u" (FEATURE_VI_UNDO) [Y/n/?] y + Enable undo operation queuing (FEATURE_VI_UNDO_QUEUE) [Y/n/?] y + Maximum undo character queue size (FEATURE_VI_UNDO_QUEUE_MAX) [256] 256 + Enable verbose status reporting (FEATURE_VI_VERBOSE_STATUS) [Y/n/?] y + Allow vi and awk to execute shell commands (FEATURE_ALLOW_EXEC) [Y/n/?] y +* +* Finding Utilities +* +find (14 kb) (FIND) [Y/n/?] y + Enable -print0: NUL-terminated output (FEATURE_FIND_PRINT0) [Y/n/?] y + Enable -mtime: modification time matching (FEATURE_FIND_MTIME) [Y/n/?] y + Enable -atime: access time matching (FEATURE_FIND_ATIME) [Y/n/?] y + Enable -ctime: status change timestamp matching (FEATURE_FIND_CTIME) [Y/n/?] y + Enable -mmin: modification time matching by minutes (FEATURE_FIND_MMIN) [Y/n/?] y + Enable -amin: access time matching by minutes (FEATURE_FIND_AMIN) [Y/n/?] y + Enable -cmin: status change timestamp matching by minutes (FEATURE_FIND_CMIN) [Y/n/?] y + Enable -perm: permissions matching (FEATURE_FIND_PERM) [Y/n] y + Enable -type: file type matching (file/dir/link/...) (FEATURE_FIND_TYPE) [Y/n/?] y + Enable -executable: file is executable (FEATURE_FIND_EXECUTABLE) [Y/n] y + Enable -xdev: 'stay in filesystem' (FEATURE_FIND_XDEV) [Y/n] y + Enable -mindepth N and -maxdepth N (FEATURE_FIND_MAXDEPTH) [Y/n] y + Enable -newer: compare file modification times (FEATURE_FIND_NEWER) [Y/n/?] y + Enable -inum: inode number matching (FEATURE_FIND_INUM) [N/y] n + Enable -samefile: reference file matching (FEATURE_FIND_SAMEFILE) [Y/n/?] y + Enable -exec: execute commands (FEATURE_FIND_EXEC) [Y/n/?] y + Enable -exec ... {} + (FEATURE_FIND_EXEC_PLUS) [Y/n/?] y + Enable -user: username/uid matching (FEATURE_FIND_USER) [Y/n] y + Enable -group: group/gid matching (FEATURE_FIND_GROUP) [Y/n] y + Enable the 'not' (!) operator (FEATURE_FIND_NOT) [Y/n/?] y + Enable -depth (FEATURE_FIND_DEPTH) [Y/n/?] y + Enable parens in options (FEATURE_FIND_PAREN) [Y/n/?] y + Enable -size: file size matching (FEATURE_FIND_SIZE) [Y/n] y + Enable -prune: exclude subdirectories (FEATURE_FIND_PRUNE) [Y/n/?] y + Enable -quit: exit (FEATURE_FIND_QUIT) [Y/n/?] y + Enable -delete: delete files/dirs (FEATURE_FIND_DELETE) [N/y/?] n + Enable -empty: match empty files or directories (FEATURE_FIND_EMPTY) [Y/n/?] y + Enable -path: match pathname with shell pattern (FEATURE_FIND_PATH) [Y/n/?] y + Enable -regex: match pathname with regex (FEATURE_FIND_REGEX) [Y/n/?] y + Enable -links: link count matching (FEATURE_FIND_LINKS) [N/y/?] n +grep (8.6 kb) (GREP) [Y/n/?] y +egrep (7.8 kb) (EGREP) [Y/n/?] y +fgrep (7.8 kb) (FGREP) [Y/n/?] y + Enable before and after context flags (-A, -B and -C) (FEATURE_GREP_CONTEXT) [Y/n/?] y +xargs (7.2 kb) (XARGS) [Y/n/?] y + Enable -p: prompt and confirmation (FEATURE_XARGS_SUPPORT_CONFIRMATION) [N/y/?] n + Enable single and double quotes and backslash (FEATURE_XARGS_SUPPORT_QUOTES) [Y/n/?] y + Enable -x: exit if -s or -n is exceeded (FEATURE_XARGS_SUPPORT_TERMOPT) [Y/n/?] y + Enable -0: NUL-terminated input (FEATURE_XARGS_SUPPORT_ZERO_TERM) [Y/n/?] y + Enable -I STR: string to replace (FEATURE_XARGS_SUPPORT_REPL_STR) [Y/n/?] y + Enable -P N: processes to run in parallel (FEATURE_XARGS_SUPPORT_PARALLEL) [Y/n] y + Enable -a FILE: use FILE instead of stdin (FEATURE_XARGS_SUPPORT_ARGS_FILE) [Y/n] y +* +* Init Utilities +* +bootchartd (10 kb) (BOOTCHARTD) [N/y/?] n +halt (4 kb) (HALT) [Y/n/?] y +poweroff (4 kb) (POWEROFF) [Y/n/?] y +reboot (4 kb) (REBOOT) [Y/n/?] y + Before signaling init, make sure it is ready for it (FEATURE_WAIT_FOR_INIT) [Y/n/?] y +init (10 kb) (INIT) [Y/n/?] y +linuxrc: support running init from initrd (not initramfs) (LINUXRC) [Y/n/?] y + Support reading an inittab file (FEATURE_USE_INITTAB) [Y/n/?] y + Support killing processes that have been removed from inittab (FEATURE_KILL_REMOVED) [Y/n/?] y + How long to wait between TERM and KILL (0 - send TERM only) (FEATURE_KILL_DELAY) [0] 0 + Run commands with leading dash with controlling tty (FEATURE_INIT_SCTTY) [Y/n/?] y + Enable init to write to syslog (FEATURE_INIT_SYSLOG) [Y/n/?] y + Be quiet on boot (no 'init started:' message) (FEATURE_INIT_QUIET) [Y/n] y + Support dumping core for child processes (debugging only) (FEATURE_INIT_COREDUMPS) [N/y/?] n + Initial terminal type (INIT_TERMINAL_TYPE) [linux] linux + Clear init's command line (FEATURE_INIT_MODIFY_CMDLINE) [Y/n/?] y +* +* Login/Password Management Utilities +* +Support shadow passwords (FEATURE_SHADOWPASSWDS) [Y/n/?] y +Use internal password and group functions rather than system functions (USE_BB_PWD_GRP) [N/y/?] n +Use internal crypt functions (USE_BB_CRYPT) [Y/n/?] y + Enable SHA256/512 crypt functions (USE_BB_CRYPT_SHA) [N/y/?] n +add-shell (3.1 kb) (ADD_SHELL) [N/y/?] n +remove-shell (3 kb) (REMOVE_SHELL) [N/y/?] n +addgroup (8.6 kb) (ADDGROUP) [Y/n/?] y + Support adding users to groups (FEATURE_ADDUSER_TO_GROUP) [N/y/?] n +adduser (15 kb) (ADDUSER) [Y/n/?] y + Enable sanity check on user/group names in adduser and addgroup (FEATURE_CHECK_NAMES) [N/y/?] n + Last valid uid or gid for adduser and addgroup (LAST_ID) [60000] 60000 + First valid system uid or gid for adduser and addgroup (FIRST_SYSTEM_ID) [100] 100 + Last valid system uid or gid for adduser and addgroup (LAST_SYSTEM_ID) [999] 999 +chpasswd (18 kb) (CHPASSWD) [N/y/?] n + Default encryption method (passwd -a, cryptpw -m, chpasswd -c ALG) (FEATURE_DEFAULT_PASSWD_ALGO) [md5] md5 +cryptpw (14 kb) (CRYPTPW) [N/y/?] n +mkpasswd (15 kb) (MKPASSWD) [Y/n/?] y +deluser (9.1 kb) (DELUSER) [Y/n/?] y +delgroup (6.4 kb) (DELGROUP) [Y/n/?] y + Support removing users from groups (FEATURE_DEL_USER_FROM_GROUP) [N/y/?] n +getty (10 kb) (GETTY) [Y/n/?] y +login (24 kb) (LOGIN) [Y/n/?] y + Run logged in session in a child process (LOGIN_SESSION_AS_CHILD) [N/y/?] n + Support login scripts (LOGIN_SCRIPTS) [N/y/?] n + Support /etc/nologin (FEATURE_NOLOGIN) [Y/n/?] y + Support /etc/securetty (FEATURE_SECURETTY) [Y/n/?] y +passwd (21 kb) (PASSWD) [Y/n/?] y + Check new passwords for weakness (FEATURE_PASSWD_WEAK_CHECK) [Y/n/?] y +su (19 kb) (SU) [Y/n/?] y + Log to syslog all attempts to use su (FEATURE_SU_SYSLOG) [Y/n] y + If user's shell is not in /etc/shells, disallow -s PROG (FEATURE_SU_CHECKS_SHELLS) [Y/n] y + Allow blank passwords only on TTYs in /etc/securetty (FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY) [N/y] n +sulogin (17 kb) (SULOGIN) [Y/n/?] y +vlock (17 kb) (VLOCK) [Y/n/?] y +* +* Linux Ext2 FS Progs +* +chattr (3.8 kb) (CHATTR) [Y/n/?] y +fsck (7.4 kb) (FSCK) [Y/n/?] y +lsattr (5.5 kb) (LSATTR) [Y/n/?] y +tune2fs (4.4 kb) (TUNE2FS) [N/y/?] n +* +* Linux Module Utilities +* +Simplified modutils (MODPROBE_SMALL) [N/y/?] n +depmod (27 kb) (DEPMOD) [N/y/?] n +insmod (22 kb) (INSMOD) [Y/n/?] y +lsmod (1.9 kb) (LSMOD) [Y/n/?] y + Pretty output (FEATURE_LSMOD_PRETTY_2_6_OUTPUT) [Y/n/?] y +modinfo (24 kb) (MODINFO) [Y/n/?] y +modprobe (28 kb) (MODPROBE) [Y/n/?] y + Blacklist support (FEATURE_MODPROBE_BLACKLIST) [N/y/?] n +rmmod (3.3 kb) (RMMOD) [Y/n/?] y +* +* Options common to multiple modutils +* +Accept module options on modprobe command line (FEATURE_CMDLINE_MODULE_OPTIONS) [Y/n/?] y +Support version 2.2/2.4 Linux kernels (FEATURE_2_4_MODULES) [N/y/?] n +Support tainted module checking with new kernels (FEATURE_CHECK_TAINTED_MODULE) [Y/n/?] y +Try to load module from a mmap'ed area (FEATURE_INSMOD_TRY_MMAP) [N/y/?] n +Support module.aliases file (FEATURE_MODUTILS_ALIAS) [Y/n/?] y +Support module.symbols file (FEATURE_MODUTILS_SYMBOLS) [Y/n/?] y +Default directory containing modules (DEFAULT_MODULES_DIR) [/lib/modules] /lib/modules +Default name of modules.dep (DEFAULT_DEPMOD_FILE) [modules.dep] modules.dep +* +* Linux System Utilities +* +acpid (9 kb) (ACPID) [N/y/?] n +blkdiscard (4.3 kb) (BLKDISCARD) [N/y/?] n +blkid (12 kb) (BLKID) [Y/n/?] y + Print filesystem type (FEATURE_BLKID_TYPE) [N/y/?] n +blockdev (2.3 kb) (BLOCKDEV) [N/y/?] n +cal (5.8 kb) (CAL) [N/y/?] n +chrt (4.7 kb) (CHRT) [Y/n/?] y +dmesg (3.7 kb) (DMESG) [Y/n/?] y + Pretty output (FEATURE_DMESG_PRETTY) [Y/n/?] y +eject (4 kb) (EJECT) [Y/n/?] y + SCSI support (FEATURE_EJECT_SCSI) [N/y/?] n +fallocate (4.1 kb) (FALLOCATE) [Y/n/?] y +fatattr (1.9 kb) (FATATTR) [N/y/?] n +fbset (5.9 kb) (FBSET) [Y/n/?] y + Enable extra options (FEATURE_FBSET_FANCY) [Y/n/?] y + Enable readmode support (FEATURE_FBSET_READMODE) [Y/n/?] y +fdformat (4.4 kb) (FDFORMAT) [Y/n/?] y +fdisk (37 kb) (FDISK) [Y/n/?] y + Write support (FEATURE_FDISK_WRITABLE) [Y/n/?] y + Support AIX disklabels (FEATURE_AIX_LABEL) [N/y/?] n + Support SGI disklabels (FEATURE_SGI_LABEL) [N/y/?] n + Support SUN disklabels (FEATURE_SUN_LABEL) [N/y/?] n + Support BSD disklabels (FEATURE_OSF_LABEL) [N/y/?] n + Support GPT disklabels (FEATURE_GPT_LABEL) [Y/n/?] y + Support expert mode (FEATURE_FDISK_ADVANCED) [Y/n/?] y +findfs (12 kb) (FINDFS) [N/y/?] n +flock (6.3 kb) (FLOCK) [Y/n/?] y +fdflush (1.3 kb) (FDFLUSH) [Y/n/?] y +freeramdisk (1.3 kb) (FREERAMDISK) [Y/n/?] y +fsck.minix (13 kb) (FSCK_MINIX) [N/y/?] n +fsfreeze (3.5 kb) (FSFREEZE) [Y/n/?] y +fstrim (4.4 kb) (FSTRIM) [Y/n/?] y +getopt (5.8 kb) (GETOPT) [Y/n/?] y + Support -l LONGOPTs (FEATURE_GETOPT_LONG) [Y/n/?] y +hexdump (8.6 kb) (HEXDUMP) [Y/n/?] y +hd (7.8 kb) (HD) [N/y/?] n +xxd (8.9 kb) (XXD) [Y/n/?] y +hwclock (5.8 kb) (HWCLOCK) [Y/n/?] y + Use FHS /var/lib/hwclock/adjtime (FEATURE_HWCLOCK_ADJTIME_FHS) [Y/n/?] y +ionice (3.8 kb) (IONICE) [N/y/?] n +ipcrm (3.2 kb) (IPCRM) [Y/n/?] y +ipcs (11 kb) (IPCS) [Y/n/?] y +last (6.1 kb) (LAST) [Y/n/?] y + Output extra information (FEATURE_LAST_FANCY) [N/y/?] n +losetup (5.5 kb) (LOSETUP) [Y/n/?] y +lspci (6.3 kb) (LSPCI) [Y/n/?] y +lsusb (4.2 kb) (LSUSB) [Y/n/?] y +mdev (17 kb) (MDEV) [Y/n/?] y + Support /etc/mdev.conf (FEATURE_MDEV_CONF) [Y/n/?] y + Support subdirs/symlinks (FEATURE_MDEV_RENAME) [Y/n/?] y + Support regular expressions substitutions when renaming device (FEATURE_MDEV_RENAME_REGEXP) [N/y/?] n + Support command execution at device addition/removal (FEATURE_MDEV_EXEC) [Y/n/?] y + Support loading of firmware (FEATURE_MDEV_LOAD_FIRMWARE) [Y/n/?] y + Support daemon mode (FEATURE_MDEV_DAEMON) [Y/n/?] y +mesg (1.4 kb) (MESG) [Y/n/?] y + Enable writing to tty only by group, not by everybody (FEATURE_MESG_ENABLE_ONLY_GROUP) [Y/n/?] y +mke2fs (10 kb) (MKE2FS) [Y/n/?] y +mkfs.ext2 (10 kb) (MKFS_EXT2) [N/y/?] n +mkfs.minix (10 kb) (MKFS_MINIX) [N/y/?] n +mkfs_reiser (MKFS_REISER) [N/y/?] n +mkdosfs (7.2 kb) (MKDOSFS) [Y/n/?] y +mkfs.vfat (7.2 kb) (MKFS_VFAT) [N/y/?] n +mkswap (6.3 kb) (MKSWAP) [Y/n/?] y + UUID support (FEATURE_MKSWAP_UUID) [N/y/?] n +more (7 kb) (MORE) [Y/n/?] y +mount (23 kb) (MOUNT) [Y/n/?] y + Support -f (fake mount) (FEATURE_MOUNT_FAKE) [N/y/?] n + Support -v (verbose) (FEATURE_MOUNT_VERBOSE) [N/y/?] n + Support mount helpers (FEATURE_MOUNT_HELPERS) [N/y/?] n + Support specifying devices by label or UUID (FEATURE_MOUNT_LABEL) [N/y/?] n + Support mounting NFS file systems on Linux < 2.6.23 (FEATURE_MOUNT_NFS) [N/y/?] n + Support mounting CIFS/SMB file systems (FEATURE_MOUNT_CIFS) [Y/n/?] y + Support lots of -o flags (FEATURE_MOUNT_FLAGS) [Y/n/?] y + Support /etc/fstab and -a (mount all) (FEATURE_MOUNT_FSTAB) [Y/n/?] y + Support -T (FEATURE_MOUNT_OTHERTAB) [Y/n/?] y +mountpoint (4.9 kb) (MOUNTPOINT) [Y/n/?] y +nologin (NOLOGIN) [Y/n/?] y + Enable dependencies for nologin (NOLOGIN_DEPENDENCIES) [Y/n/?] y +nsenter (6.5 kb) (NSENTER) [N/y/?] n +pivot_root (1.1 kb) (PIVOT_ROOT) [Y/n/?] y +rdate (5.6 kb) (RDATE) [Y/n/?] y +rdev (1.8 kb) (RDEV) [N/y/?] n +readprofile (7.1 kb) (READPROFILE) [Y/n/?] y +renice (4.2 kb) (RENICE) [Y/n/?] y +rev (4.4 kb) (REV) [N/y/?] n +rtcwake (6.8 kb) (RTCWAKE) [N/y/?] n +script (8.6 kb) (SCRIPT) [N/y/?] n +scriptreplay (2.4 kb) (SCRIPTREPLAY) [N/y/?] n +setarch (3.6 kb) (SETARCH) [Y/n/?] y +linux32 (3.3 kb) (LINUX32) [Y/n/?] y +linux64 (3.3 kb) (LINUX64) [Y/n/?] y +setpriv (6.6 kb) (SETPRIV) [Y/n/?] y + Support dumping current privilege state (FEATURE_SETPRIV_DUMP) [Y/n/?] y + Support capabilities (FEATURE_SETPRIV_CAPABILITIES) [Y/n/?] y + Support capability names (FEATURE_SETPRIV_CAPABILITY_NAMES) [Y/n/?] y +setsid (3.6 kb) (SETSID) [Y/n/?] y +swapon (15 kb) (SWAPON) [Y/n/?] y + Support discard option -d (FEATURE_SWAPON_DISCARD) [N/y/?] n + Support priority option -p (FEATURE_SWAPON_PRI) [N/y/?] n +swapoff (14 kb) (SWAPOFF) [Y/n] y + Support specifying devices by label or UUID (FEATURE_SWAPONOFF_LABEL) [Y/n/?] y +switch_root (5.5 kb) (SWITCH_ROOT) [Y/n/?] y +taskset (4.2 kb) (TASKSET) [Y/n/?] y + Fancy output (FEATURE_TASKSET_FANCY) [Y/n/?] y + CPU list support (-c option) (FEATURE_TASKSET_CPULIST) [Y/n/?] y +uevent (3.1 kb) (UEVENT) [Y/n/?] y +umount (5.1 kb) (UMOUNT) [Y/n/?] y + Support -a (unmount all) (FEATURE_UMOUNT_ALL) [Y/n/?] y +unshare (7.2 kb) (UNSHARE) [N/y/?] n +wall (2.6 kb) (WALL) [N/y/?] n +* +* Common options for mount/umount +* +Support loopback mounts (FEATURE_MOUNT_LOOP) [Y/n/?] y + Create new loopback devices if needed (FEATURE_MOUNT_LOOP_CREATE) [Y/n/?] y +Support old /etc/mtab file (FEATURE_MTAB_SUPPORT) [N/y/?] n +* +* Filesystem/Volume identification +* +bcache filesystem (FEATURE_VOLUMEID_BCACHE) [N/y] n +btrfs filesystem (FEATURE_VOLUMEID_BTRFS) [N/y] n +cramfs filesystem (FEATURE_VOLUMEID_CRAMFS) [N/y] n +erofs filesystem (FEATURE_VOLUMEID_EROFS) [Y/n/?] y +exFAT filesystem (FEATURE_VOLUMEID_EXFAT) [Y/n/?] y +Ext filesystem (FEATURE_VOLUMEID_EXT) [Y/n] y +f2fs filesystem (FEATURE_VOLUMEID_F2FS) [Y/n/?] y +fat filesystem (FEATURE_VOLUMEID_FAT) [Y/n] y +hfs filesystem (FEATURE_VOLUMEID_HFS) [N/y] n +iso9660 filesystem (FEATURE_VOLUMEID_ISO9660) [N/y] n +jfs filesystem (FEATURE_VOLUMEID_JFS) [N/y] n +linuxraid (FEATURE_VOLUMEID_LINUXRAID) [N/y] n +linux swap filesystem (FEATURE_VOLUMEID_LINUXSWAP) [N/y] n +luks filesystem (FEATURE_VOLUMEID_LUKS) [N/y] n +minix filesystem (FEATURE_VOLUMEID_MINIX) [Y/n] y +nilfs filesystem (FEATURE_VOLUMEID_NILFS) [N/y/?] n +ntfs filesystem (FEATURE_VOLUMEID_NTFS) [N/y] n +ocfs2 filesystem (FEATURE_VOLUMEID_OCFS2) [N/y] n +Reiser filesystem (FEATURE_VOLUMEID_REISERFS) [N/y] n +romfs filesystem (FEATURE_VOLUMEID_ROMFS) [N/y] n +sysv filesystem (FEATURE_VOLUMEID_SYSV) [N/y] n +UBIFS filesystem (FEATURE_VOLUMEID_UBIFS) [Y/n/?] y +udf filesystem (FEATURE_VOLUMEID_UDF) [N/y] n +xfs filesystem (FEATURE_VOLUMEID_XFS) [N/y] n +* +* Miscellaneous Utilities +* +adjtimex (4.7 kb) (ADJTIMEX) [N/y/?] n +ascii (ASCII) [Y/n/?] y +bbconfig (9.7 kb) (BBCONFIG) [N/y/?] n +bc (45 kb) (BC) [Y/n/?] y +dc (36 kb) (DC) [Y/n/?] y + Use bc code base for dc (larger, more features) (FEATURE_DC_BIG) [Y] y + Interactive mode (+4kb) (FEATURE_BC_INTERACTIVE) [Y/n/?] y + Enable bc/dc long options (FEATURE_BC_LONG_OPTIONS) [Y/n] y +beep (2.4 kb) (BEEP) [N/y/?] n +chat (6.3 kb) (CHAT) [N/y/?] n +conspy (10 kb) (CONSPY) [N/y/?] n +crond (14 kb) (CROND) [Y/n/?] y + Support -d (redirect output to stderr) (FEATURE_CROND_D) [N/y/?] n + Report command output via email (using sendmail) (FEATURE_CROND_CALL_SENDMAIL) [N/y/?] n + Support special times (@reboot, @daily, etc) in crontabs (FEATURE_CROND_SPECIAL_TIMES) [Y/n/?] y + crond spool directory (FEATURE_CROND_DIR) [/var/spool/cron] /var/spool/cron +crontab (10 kb) (CRONTAB) [Y/n/?] y +devfsd (obsolete) (DEVFSD) [N/y/?] n +Use devfs names for all devices (obsolete) (FEATURE_DEVFS) [N/y/?] n +devmem (2.5 kb) (DEVMEM) [Y/n/?] y +fbsplash (26 kb) (FBSPLASH) [N/y/?] n +flash_eraseall (5.9 kb) (FLASH_ERASEALL) [N/y/?] n +flash_lock (2.1 kb) (FLASH_LOCK) [N/y/?] n +flash_unlock (1.3 kb) (FLASH_UNLOCK) [N/y/?] n +flashcp (5.3 kb) (FLASHCP) [N/y/?] n +hdparm (25 kb) (HDPARM) [Y/n/?] y + Support obtaining detailed information directly from drives (FEATURE_HDPARM_GET_IDENTITY) [Y/n/?] y + Register an IDE interface (DANGEROUS) (FEATURE_HDPARM_HDIO_SCAN_HWIF) [N/y/?] n + Un-register an IDE interface (DANGEROUS) (FEATURE_HDPARM_HDIO_UNREGISTER_HWIF) [N/y/?] n + Perform device reset (DANGEROUS) (FEATURE_HDPARM_HDIO_DRIVE_RESET) [N/y/?] n + Tristate device for hotswap (DANGEROUS) (FEATURE_HDPARM_HDIO_TRISTATE_HWIF) [N/y/?] n + Get/set using_dma flag (FEATURE_HDPARM_HDIO_GETSET_DMA) [N/y/?] n +hexedit (21 kb) (HEXEDIT) [Y/n/?] y +i2cget (5.5 kb) (I2CGET) [Y/n/?] y +i2cset (6.7 kb) (I2CSET) [Y/n/?] y +i2cdump (7.1 kb) (I2CDUMP) [Y/n/?] y +i2cdetect (7.1 kb) (I2CDETECT) [Y/n/?] y +i2ctransfer (4.0 kb) (I2CTRANSFER) [Y/n/?] y +inotifyd (3.6 kb) (INOTIFYD) [N/y/?] n +less (16 kb) (LESS) [Y/n/?] y + Max number of input lines less will try to eat (FEATURE_LESS_MAXLINES) [9999999] 9999999 + Enable bracket searching (FEATURE_LESS_BRACKETS) [Y/n/?] y + Enable -m/-M (FEATURE_LESS_FLAGS) [Y/n/?] y + Enable -S (FEATURE_LESS_TRUNCATE) [Y/n/?] y + Enable marks (FEATURE_LESS_MARKS) [N/y/?] n + Enable regular expressions (FEATURE_LESS_REGEXP) [Y/n/?] y + Enable automatic resizing on window size changes (FEATURE_LESS_WINCH) [N/y/?] n + Enable flag changes ('-' command) (FEATURE_LESS_DASHCMD) [N/y/?] n +lsscsi (2.5 kb) (LSSCSI) [Y/n/?] y +makedevs (9.2 kb) (MAKEDEVS) [Y/n/?] y + Choose makedevs behaviour + 1. leaf (FEATURE_MAKEDEVS_LEAF) + > 2. table (FEATURE_MAKEDEVS_TABLE) + choice[1-2]: 2 +man (26 kb) (MAN) [N/y/?] n +microcom (5.7 kb) (MICROCOM) [Y/n/?] y +mim (0.5 kb) (MIM) [Y/n/?] y +mt (2.5 kb) (MT) [Y/n/?] y +nandwrite (4.8 kb) (NANDWRITE) [N/y/?] n +nanddump (5.2 kb) (NANDDUMP) [N/y/?] n +partprobe (3.5 kb) (PARTPROBE) [Y/n/?] y +raidautorun (1.3 kb) (RAIDAUTORUN) [N/y/?] n +readahead (1.5 kb) (READAHEAD) [N/y/?] n +rfkill (4.4 kb) (RFKILL) [N/y/?] n +runlevel (559 bytes) (RUNLEVEL) [Y/n/?] y +rx (2.9 kb) (RX) [N/y/?] n +seedrng (1.3 kb) (SEEDRNG) [Y/n/?] y +setfattr (3.7 kb) (SETFATTR) [Y/n/?] y +setserial (6.9 kb) (SETSERIAL) [Y/n/?] y +strings (4.6 kb) (STRINGS) [Y/n/?] y +time (6.8 kb) (TIME) [Y/n/?] y +tree (0.6 kb) (TREE) [Y/n/?] y +ts (450 bytes) (TS) [Y/n] y +ttysize (432 bytes) (TTYSIZE) [N/y/?] n +ubiattach (4.2 kb) (UBIATTACH) [N/y/?] n +ubidetach (4.1 kb) (UBIDETACH) [N/y/?] n +ubimkvol (5.3 kb) (UBIMKVOL) [N/y/?] n +ubirmvol (4.9 kb) (UBIRMVOL) [N/y/?] n +ubirsvol (4.2 kb) (UBIRSVOL) [N/y/?] n +ubiupdatevol (5.2 kb) (UBIUPDATEVOL) [N/y/?] n +ubirename (2.4 kb) (UBIRENAME) [Y/n/?] y +volname (1.6 kb) (VOLNAME) [N/y/?] n +watchdog (5.3 kb) (WATCHDOG) [Y/n/?] y + Open watchdog device twice, closing it gracefully in between (FEATURE_WATCHDOG_OPEN_TWICE) [N/y/?] n +* +* Networking Utilities +* +Enable IPv6 support (FEATURE_IPV6) [Y/n/?] y +Enable Unix domain socket support (usually not needed) (FEATURE_UNIX_LOCAL) [N/y/?] n +Prefer IPv4 addresses from DNS queries (FEATURE_PREFER_IPV4_ADDRESS) [Y/n/?] y +Verbose resolution errors (VERBOSE_RESOLUTION_ERRORS) [N/y/?] n +Support /etc/networks (FEATURE_ETC_NETWORKS) [Y/n/?] y +Consult /etc/services even for well-known ports (FEATURE_ETC_SERVICES) [Y/n/?] y +Support infiniband HW (FEATURE_HWIB) [Y/n/?] y +In TLS code, support ciphers which use deprecated SHA1 (FEATURE_TLS_SHA1) [N/y/?] n +arp (10 kb) (ARP) [Y/n/?] y +arping (9 kb) (ARPING) [Y/n/?] y +brctl (4.7 kb) (BRCTL) [N/y/?] n +dnsd (9.8 kb) (DNSD) [Y/n/?] y +ether-wake (4.9 kb) (ETHER_WAKE) [Y/n/?] y +ftpd (30 kb) (FTPD) [N/y/?] n +ftpget (7.8 kb) (FTPGET) [N/y/?] n +ftpput (7.5 kb) (FTPPUT) [N/y/?] n +hostname (5.5 kb) (HOSTNAME) [Y/n/?] y +dnsdomainname (3.6 kb) (DNSDOMAINNAME) [Y/n/?] y +httpd (32 kb) (HTTPD) [N/y/?] n +ifconfig (12 kb) (IFCONFIG) [Y/n/?] y + Enable status reporting output (+7k) (FEATURE_IFCONFIG_STATUS) [Y/n/?] y + Enable slip-specific options "keepalive" and "outfill" (FEATURE_IFCONFIG_SLIP) [Y/n/?] y + Enable options "mem_start", "io_addr", and "irq" (FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ) [Y/n/?] y + Enable option "hw" (ether only) (FEATURE_IFCONFIG_HW) [Y/n/?] y + Set the broadcast automatically (FEATURE_IFCONFIG_BROADCAST_PLUS) [N/y/?] n +ifenslave (13 kb) (IFENSLAVE) [N/y/?] n +ifplugd (10 kb) (IFPLUGD) [N/y/?] n +ifup (14 kb) (IFUP) [Y/n/?] y +ifdown (13 kb) (IFDOWN) [Y/n/?] y + Absolute path to ifstate file (IFUPDOWN_IFSTATE_PATH) [/var/run/ifstate] /var/run/ifstate + Use ip tool (else ifconfig/route is used) (FEATURE_IFUPDOWN_IP) [Y/n/?] y + Support IPv4 (FEATURE_IFUPDOWN_IPV4) [Y/n/?] y + Support IPv6 (FEATURE_IFUPDOWN_IPV6) [Y/n/?] y + Enable mapping support (FEATURE_IFUPDOWN_MAPPING) [Y/n/?] y + Support external DHCP clients (FEATURE_IFUPDOWN_EXTERNAL_DHCP) [N/y/?] n +inetd (18 kb) (INETD) [Y/n/?] y + Support echo service on port 7 (FEATURE_INETD_SUPPORT_BUILTIN_ECHO) [Y/n/?] y + Support discard service on port 8 (FEATURE_INETD_SUPPORT_BUILTIN_DISCARD) [Y/n/?] y + Support time service on port 37 (FEATURE_INETD_SUPPORT_BUILTIN_TIME) [Y/n/?] y + Support daytime service on port 13 (FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME) [Y/n/?] y + Support chargen service on port 19 (FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN) [Y/n/?] y + Support RPC services (FEATURE_INETD_RPC) [N/y/?] n +ip (35 kb) (IP) [Y/n/?] y +ipaddr (14 kb) (IPADDR) [Y/n/?] y +iplink (17 kb) (IPLINK) [Y/n/?] y +iproute (15 kb) (IPROUTE) [Y/n/?] y +iptunnel (9.6 kb) (IPTUNNEL) [Y/n/?] y +iprule (10 kb) (IPRULE) [Y/n/?] y +ipneigh (8.3 kb) (IPNEIGH) [Y/n/?] y +ip address (FEATURE_IP_ADDRESS) [Y/?] y +ip link (FEATURE_IP_LINK) [Y/?] y +ip route (FEATURE_IP_ROUTE) [Y/?] y + ip route configuration directory (FEATURE_IP_ROUTE_DIR) [/etc/iproute2] /etc/iproute2 +ip tunnel (FEATURE_IP_TUNNEL) [Y/?] y +ip rule (FEATURE_IP_RULE) [Y/?] y +ip neighbor (FEATURE_IP_NEIGH) [Y/?] y +Support displaying rarely used link types (FEATURE_IP_RARE_PROTOCOLS) [N/y/?] n +ipcalc (4.4 kb) (IPCALC) [N/y/?] n +fakeidentd (8.7 kb) (FAKEIDENTD) [N/y/?] n +nameif (6.6 kb) (NAMEIF) [Y/n/?] y + Extended nameif (FEATURE_NAMEIF_EXTENDED) [N/y/?] n +nbd-client (6 kb) (NBDCLIENT) [N/y/?] n +nc (11 kb) (NC) [N/y/?] n +netcat (11 kb) (NETCAT) [N/y/?] n +netstat (10 kb) (NETSTAT) [Y/n/?] y + Enable wide output (FEATURE_NETSTAT_WIDE) [N/y/?] n + Enable PID/Program name output (FEATURE_NETSTAT_PRG) [N/y/?] n +nslookup (9.7 kb) (NSLOOKUP) [Y/n/?] y + Use internal resolver code instead of libc (FEATURE_NSLOOKUP_BIG) [Y/n] y + Enable long options (FEATURE_NSLOOKUP_LONG_OPTIONS) [Y/n] y +ntpd (22 kb) (NTPD) [N/y/?] n +ping (10 kb) (PING) [Y/n/?] y +ping6 (11 kb) (PING6) [N/y/?] n +Enable fancy ping output (FEATURE_FANCY_PING) [Y/n/?] y +pscan (6 kb) (PSCAN) [N/y/?] n +route (8.7 kb) (ROUTE) [Y/n/?] y +slattach (6.2 kb) (SLATTACH) [N/y/?] n +ssl_client (25 kb) (SSL_CLIENT) [Y/n/?] y +tc (8.3 kb) (TC) [N/y/?] n +tcpsvd (14 kb) (TCPSVD) [N/y/?] n +udpsvd (13 kb) (UDPSVD) [N/y/?] n +telnet (8.8 kb) (TELNET) [Y/n/?] y + Pass TERM type to remote host (FEATURE_TELNET_TTYPE) [Y/n/?] y + Pass USER type to remote host (FEATURE_TELNET_AUTOLOGIN) [Y/n/?] y + Enable window size autodetection (FEATURE_TELNET_WIDTH) [Y/n] y +telnetd (12 kb) (TELNETD) [N/y/?] n +tftp (11 kb) (TFTP) [Y/n/?] y + Enable progress bar (FEATURE_TFTP_PROGRESS_BAR) [Y/n] y + tftp-hpa compat (support -c get/put FILE) (FEATURE_TFTP_HPA_COMPAT) [Y/n] y +tftpd (10 kb) (TFTPD) [N/y/?] n + Enable 'tftp get' and/or tftpd upload code (FEATURE_TFTP_GET) [Y/n/?] y + Enable 'tftp put' and/or tftpd download code (FEATURE_TFTP_PUT) [Y/n/?] y + Enable 'blksize' and 'tsize' protocol options (FEATURE_TFTP_BLOCKSIZE) [Y/n/?] y + Enable debug (TFTP_DEBUG) [N/y/?] n +traceroute (11 kb) (TRACEROUTE) [Y/n/?] y +traceroute6 (13 kb) (TRACEROUTE6) [N/y/?] n +Enable verbose output (FEATURE_TRACEROUTE_VERBOSE) [N/y/?] n +Enable -I option (use ICMP instead of UDP) (FEATURE_TRACEROUTE_USE_ICMP) [N/y] n +tunctl (6.2 kb) (TUNCTL) [N/y/?] n +vconfig (2.3 kb) (VCONFIG) [Y/n/?] y +wget (38 kb) (WGET) [Y/n/?] y + Enable long options (FEATURE_WGET_LONG_OPTIONS) [Y/n] y + Enable progress bar (+2k) (FEATURE_WGET_STATUSBAR) [Y/n] y + Enable FTP protocol (+1k) (FEATURE_WGET_FTP) [Y/n/?] y + Enable HTTP authentication (FEATURE_WGET_AUTHENTICATION) [Y/n/?] y + Enable timeout option -T SEC (FEATURE_WGET_TIMEOUT) [Y/n/?] y + Support HTTPS using internal TLS code (FEATURE_WGET_HTTPS) [Y/n/?] y + Try to connect to HTTPS using openssl (FEATURE_WGET_OPENSSL) [Y/n/?] y +whois (6.3 kb) (WHOIS) [N/y/?] n +zcip (8.4 kb) (ZCIP) [N/y/?] n +udhcpd (21 kb) (UDHCPD) [N/y/?] n +dumpleases (5.1 kb) (DUMPLEASES) [N/y/?] n +dhcprelay (5.2 kb) (DHCPRELAY) [N/y/?] n +udhcpc (24 kb) (UDHCPC) [Y/n/?] y + Verify that the offered address is free, using ARP ping (FEATURE_UDHCPC_ARPING) [Y/n/?] y + Do not pass malformed host and domain names (FEATURE_UDHCPC_SANITIZEOPT) [Y/n/?] y + Absolute path to config script (UDHCPC_DEFAULT_SCRIPT) [/usr/share/udhcpc/default.script] /usr/share/udhcpc/default.script +udhcpc6 (21 kb) (UDHCPC6) [N/y/?] n +* +* Common options for DHCP applets +* +Default interface name (UDHCPC_DEFAULT_INTERFACE) [] +Enable '-P port' option for udhcpd and udhcpc (FEATURE_UDHCP_PORT) [N/y/?] n +Maximum verbosity level (0..9) (UDHCP_DEBUG) [0] 0 +DHCP options slack buffer size (UDHCPC_SLACK_FOR_BUGGY_SERVERS) [80] 80 +Support RFC 3397 domain search options (FEATURE_UDHCP_RFC3397) [N/y/?] n +Support 802.1Q VLAN parameters options (FEATURE_UDHCP_8021Q) [Y/n/?] y +ifup udhcpc command line options (IFUPDOWN_UDHCPC_CMD_OPTIONS) [-R -n] -R -n +* +* Print Utilities +* +lpd (5.5 kb) (LPD) [N/y/?] n +lpr (9.9 kb) (LPR) [N/y/?] n +lpq (9.9 kb) (LPQ) [N/y/?] n +* +* Mail Utilities +* +makemime (5.4 kb) (MAKEMIME) [N/y/?] n +popmaildir (10 kb) (POPMAILDIR) [N/y/?] n +reformime (7.5 kb) (REFORMIME) [N/y/?] n +sendmail (14 kb) (SENDMAIL) [N/y/?] n +* +* Process Utilities +* +Faster /proc scanning code (+100 bytes) (FEATURE_FAST_TOP) [Y/n/?] y +Support thread display in ps/pstree/top (FEATURE_SHOW_THREADS) [N/y/?] n +free (3.1 kb) (FREE) [Y/n/?] y +fuser (7 kb) (FUSER) [Y/n/?] y +iostat (7.6 kb) (IOSTAT) [N/y/?] n +kill (3.1 kb) (KILL) [Y/n/?] y +killall (5.6 kb) (KILLALL) [Y/n/?] y +killall5 (5.3 kb) (KILLALL5) [Y/n/?] y +lsof (3.4 kb) (LSOF) [Y/n/?] y +mpstat (9.8 kb) (MPSTAT) [N/y/?] n +nmeter (11 kb) (NMETER) [N/y/?] n +pgrep (6.5 kb) (PGREP) [N/y/?] n +pkill (7.5 kb) (PKILL) [N/y/?] n +pidof (6.3 kb) (PIDOF) [Y/n/?] y + Enable single shot (-s) (FEATURE_PIDOF_SINGLE) [Y/n/?] y + Enable omitting pids (-o PID) (FEATURE_PIDOF_OMIT) [Y/n/?] y +pmap (6 kb) (PMAP) [N/y/?] n +powertop (9.6 kb) (POWERTOP) [N/y/?] n +ps (11 kb) (PS) [Y/n/?] y + Enable -o time and -o etime specifiers (FEATURE_PS_TIME) [N/y] n + Enable -o rgroup, -o ruser, -o nice specifiers (FEATURE_PS_ADDITIONAL_COLUMNS) [N/y] n +pstree (9.3 kb) (PSTREE) [N/y/?] n +pwdx (3.7 kb) (PWDX) [N/y/?] n +smemcap (2.5 kb) (SMEMCAP) [N/y/?] n +sysctl (7.4 kb) (BB_SYSCTL) [Y/n/?] y +top (18 kb) (TOP) [Y/n/?] y + Accept keyboard commands (FEATURE_TOP_INTERACTIVE) [Y/n/?] y + Show CPU per-process usage percentage (FEATURE_TOP_CPU_USAGE_PERCENTAGE) [Y/n/?] y + Show CPU global usage percentage (FEATURE_TOP_CPU_GLOBAL_PERCENTS) [Y/n/?] y + SMP CPU usage display ('c' key) (FEATURE_TOP_SMP_CPU) [N/y/?] n + Show 1/10th of a percent in CPU/mem statistics (FEATURE_TOP_DECIMALS) [N/y/?] n + Show CPU process runs on ('j' field) (FEATURE_TOP_SMP_PROCESS) [N/y/?] n + Topmem command ('s' key) (FEATURE_TOPMEM) [N/y/?] n +uptime (3.7 kb) (UPTIME) [Y/n/?] y + Show the number of users (FEATURE_UPTIME_UTMP_SUPPORT) [N/y/?] n +watch (4.4 kb) (WATCH) [Y/n/?] y +* +* Runit Utilities +* +chpst (9 kb) (CHPST) [N/y/?] n +setuidgid (4 kb) (SETUIDGID) [N/y/?] n +envuidgid (3.9 kb) (ENVUIDGID) [N/y/?] n +envdir (2.5 kb) (ENVDIR) [N/y/?] n +softlimit (4.5 kb) (SOFTLIMIT) [N/y/?] n +runsv (7.8 kb) (RUNSV) [N/y/?] n +runsvdir (6.3 kb) (RUNSVDIR) [N/y/?] n +sv (8.5 kb) (SV) [N/y/?] n + Default directory for services (SV_DEFAULT_SERVICE_DIR) [] +svc (8.4 kb) (SVC) [Y/n/?] y +svok (1.5 kb) (SVOK) [Y/n/?] y +svlogd (16 kb) (SVLOGD) [N/y/?] n +* +* Shells +* +Choose which shell is aliased to 'sh' name +> 1. ash (SH_IS_ASH) + 2. hush (SH_IS_HUSH) + 3. none (SH_IS_NONE) +choice[1-3?]: 1 +Choose which shell is aliased to 'bash' name + 1. ash (BASH_IS_ASH) + 2. hush (BASH_IS_HUSH) +> 3. none (BASH_IS_NONE) +choice[1-3?]: 3 +ash (78 kb) (ASH) [Y/n/?] y + Optimize for size instead of speed (ASH_OPTIMIZE_FOR_SIZE) [Y/n] y + Use internal glob() implementation (ASH_INTERNAL_GLOB) [Y/n/?] y + bash-compatible extensions (ASH_BASH_COMPAT) [Y/n] y + 'source' and '.' builtins search current directory after $PATH (ASH_BASH_SOURCE_CURDIR) [N/y/?] n + command_not_found_handle hook support (ASH_BASH_NOT_FOUND_HOOK) [Y/n/?] y + Job control (ASH_JOB_CONTROL) [Y/n] y + Alias support (ASH_ALIAS) [Y/n] y + Pseudorandom generator and $RANDOM variable (ASH_RANDOM_SUPPORT) [Y/n/?] y + Expand prompt string (ASH_EXPAND_PRMT) [Y/n/?] y + Idle timeout variable $TMOUT (ASH_IDLE_TIMEOUT) [Y/n/?] y + Check for new mail in interactive shell (ASH_MAIL) [N/y/?] n + echo builtin (ASH_ECHO) [Y/n] y + printf builtin (ASH_PRINTF) [Y/n] y + test builtin (ASH_TEST) [Y/n] y + sleep builtin (ASH_SLEEP) [Y/n] y + help builtin (ASH_HELP) [Y/n] y + getopts builtin (ASH_GETOPTS) [Y/n] y + command builtin (ASH_CMDCMD) [Y/n/?] y +cttyhack (2.4 kb) (CTTYHACK) [N/y/?] n +hush (68 kb) (HUSH) [N/y/?] n +Internal shell for embedded script support (SHELL_HUSH) [N/y] n +* +* Options common to all shells +* +POSIX math support (FEATURE_SH_MATH) [Y/n/?] y + Extend POSIX math support to 64 bit (FEATURE_SH_MATH_64) [Y/n/?] y + Support BASE#nnnn literals (FEATURE_SH_MATH_BASE) [Y/n] y +Hide message on interactive shell startup (FEATURE_SH_EXTRA_QUIET) [Y/n/?] y +Standalone shell (FEATURE_SH_STANDALONE) [N/y/?] n +Run 'nofork' applets directly (FEATURE_SH_NOFORK) [N/y/?] n +read -t N.NNN support (+110 bytes) (FEATURE_SH_READ_FRAC) [Y/n/?] y +Use $HISTFILESIZE (FEATURE_SH_HISTFILESIZE) [N/y/?] n +Embed scripts in the binary (FEATURE_SH_EMBEDDED_SCRIPTS) [Y/n/?] y +* +* System Logging Utilities +* +klogd (5.7 kb) (KLOGD) [Y/n/?] y + Use the klogctl() interface (FEATURE_KLOGD_KLOGCTL) [Y/n/?] y +logger (6.3 kb) (LOGGER) [Y/n/?] y +logread (4.8 kb) (LOGREAD) [N/y/?] n +syslogd (13 kb) (SYSLOGD) [Y/n/?] y + Rotate message files (FEATURE_ROTATE_LOGFILE) [Y/n/?] y + Remote Log support (FEATURE_REMOTE_LOG) [Y/n/?] y + Support -D (drop dups) option (FEATURE_SYSLOGD_DUP) [N/y/?] n + Support syslog.conf (FEATURE_SYSLOGD_CFG) [N/y/?] n + Include milliseconds in timestamps (FEATURE_SYSLOGD_PRECISE_TIMESTAMPS) [N/y/?] n + Read buffer size in bytes (FEATURE_SYSLOGD_READ_BUFFER_SIZE) [256] 256 + Circular Buffer support (FEATURE_IPC_SYSLOG) [N/y/?] n + Linux kernel printk buffer support (FEATURE_KMSG_SYSLOG) [N/y/?] n + GEN /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/kernel-build/busybox/Makefile + Using /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox as source for busybox +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/applets/usage.c: In function ‘main’: +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/applets/usage.c:52:17: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 52 | write(STDOUT_FILENO, usage_array[i].usage, strlen(usage_array[i].usage) + 1); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c: In function ‘list_i2c_busses_and_exit’: +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1152:46: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation=] + 1152 | snprintf(path, NAME_MAX, "%s/%s/name", + | ^~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1152:17: note: ‘snprintf’ output between 25 and 280 bytes into a destination of size 255 + 1152 | snprintf(path, NAME_MAX, "%s/%s/name", + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 1153 | i2cdev_path, de->d_name); + | ~~~~~~~~~~~~~~~~~~~~~~~~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1157:38: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation=] + 1157 | "%s/%s/device/name", + | ^~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1156:25: note: ‘snprintf’ output between 32 and 287 bytes into a destination of size 255 + 1156 | snprintf(path, NAME_MAX, + | ^~~~~~~~~~~~~~~~~~~~~~~~ + 1157 | "%s/%s/device/name", + | ~~~~~~~~~~~~~~~~~~~~ + 1158 | i2cdev_path, de->d_name); + | ~~~~~~~~~~~~~~~~~~~~~~~~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1165:38: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation=] + 1165 | "%s/%s/device/name", + | ^~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1164:25: note: ‘snprintf’ output between 32 and 287 bytes into a destination of size 255 + 1164 | snprintf(path, NAME_MAX, + | ^~~~~~~~~~~~~~~~~~~~~~~~ + 1165 | "%s/%s/device/name", + | ~~~~~~~~~~~~~~~~~~~~ + 1166 | i2cdev_path, de->d_name); + | ~~~~~~~~~~~~~~~~~~~~~~~~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1177:54: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 236 [-Wformat-truncation=] + 1177 | "%s/%s/device/%s/name", + | ^~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/miscutils/i2c_tools.c:1176:41: note: ‘snprintf’ output between 33 and 543 bytes into a destination of size 255 + 1176 | snprintf(path, NAME_MAX, + | ^~~~~~~~~~~~~~~~~~~~~~~~ + 1177 | "%s/%s/device/%s/name", + | ~~~~~~~~~~~~~~~~~~~~~~~ + 1178 | i2cdev_path, de->d_name, + | ~~~~~~~~~~~~~~~~~~~~~~~~ + 1179 | subde->d_name); + | ~~~~~~~~~~~~~~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/modutils/modutils.c: In function ‘filename2modname’: +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/modutils/modutils.c:115:1: warning: function may return address of local variable [-Wreturn-local-addr] + 115 | } + | ^ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/modutils/modutils.c:94:14: note: declared here + 94 | char local_modname[MODULE_NAME_LEN]; + | ^~~~~~~~~~~~~ +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/networking/udhcp/dhcpc.c: In function ‘udhcpc_main’: +/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/thirdparty/busybox/networking/udhcp/dhcpc.c:1665:48: warning: variable ‘temp_addr’ set but not used [-Wunused-but-set-variable] + 1665 | struct in_addr temp_addr; + | ^~~~~~~~~ +Static linking against glibc, can't use --gc-sections +Trying libraries: m resolv rt + Library m is not needed, excluding it + Library resolv is needed, can't exclude it (yet) + Library rt is not needed, excluding it + Library resolv is needed, can't exclude it (yet) +Final link with: resolv +[ 33%] Creating initramfs source tree +[kernel] installed gemmini_linux_check-linux +[kernel] installed gemmini_os_cisc_atranspose_test-linux +[kernel] installed gemmini_os_cisc_basic_test-linux +[kernel] installed gemmini_os_cisc_btranspose_test-linux +[kernel] installed gemmini_os_cisc_shift_test-linux +[kernel] installed gemmini_os_risc_abtranspose_test-linux +[kernel] installed gemmini_os_risc_atranspose_test-linux +[kernel] installed gemmini_os_risc_basic_test-linux +[kernel] installed gemmini_os_risc_btranspose_test-linux +[kernel] installed gemmini_os_risc_shift_test-linux +[kernel] installed gemmini_ws_cisc_conv_test-linux +[kernel] installed gemmini_ws_risc_basic_test-linux +[kernel] installed gemmini_ws_risc_btranspose_test-linux +[kernel] installed gemmini_ws_risc_shift_test-linux +[kernel] installed linux_system_check-linux +[kernel] 15 workload binary/binaries installed into /root/ +[ 50%] Building Linux kernel with initramfs +[ 66%] Building OpenSBI fw_payload with Linux +Loaded configuration '/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/workloads/lib/kernel/opensbi-platform/buckyball/configs/defconfig' +Configuration saved to '/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/kernel-build/opensbi/platform/buckyball/kconfig/.config' + CPP-DEP platform/buckyball/firmware/fw_payload.elf.dep + CPP-DEP platform/buckyball/firmware/payloads/test.elf.dep + AS-DEP platform/buckyball/firmware/fw_payload.dep + AS-DEP platform/buckyball/firmware/payloads/test_head.dep + CC-DEP platform/buckyball/firmware/payloads/test_main.dep + MERGE-DEP platform/buckyball/firmware/payloads/test.dep + CC-DEP lib/sbi/sbi_fp.dep + CC-DEP lib/sbi/sbi_vector.dep + CC-DEP lib/sbi/sbi_cppc.dep + AS-DEP lib/sbi/sbi_expected_trap.dep + CC-DEP lib/sbi/sbi_unpriv.dep + CC-DEP lib/sbi/sbi_trap_v_ldst.dep + CC-DEP lib/sbi/sbi_trap_ldst.dep + CC-DEP lib/sbi/sbi_trap.dep + CC-DEP lib/sbi/sbi_tlb.dep + CC-DEP lib/sbi/sbi_timer.dep + CC-DEP lib/sbi/sbi_system.dep + CC-DEP lib/sbi/sbi_string.dep + CC-DEP lib/sbi/sbi_sse.dep + CC-DEP lib/sbi/sbi_scratch.dep + CC-DEP lib/sbi/sbi_mpxy.dep + CC-DEP lib/sbi/sbi_dbtr.dep + CC-DEP lib/sbi/sbi_pmu.dep + CC-DEP lib/sbi/sbi_pmp.dep + CC-DEP lib/sbi/sbi_platform.dep + CC-DEP lib/sbi/sbi_irqchip.dep + CC-DEP lib/sbi/sbi_ipi.dep + CC-DEP lib/sbi/sbi_init.dep + CC-DEP lib/sbi/sbi_illegal_insn.dep + CC-DEP lib/sbi/sbi_illegal_atomic.dep + CC-DEP lib/sbi/sbi_hsm.dep + AS-DEP lib/sbi/sbi_hfence.dep + CC-DEP lib/sbi/sbi_math.dep + CC-DEP lib/sbi/sbi_heap.dep + CC-DEP lib/sbi/sbi_hart_protection.dep + CC-DEP lib/sbi/sbi_hart_pmp.dep + CC-DEP lib/sbi/sbi_hart.dep + CC-DEP lib/sbi/sbi_fwft.dep + CC-DEP lib/sbi/sbi_fifo.dep + CC-DEP lib/sbi/sbi_emulate_csr.dep + CC-DEP lib/sbi/sbi_double_trap.dep + CC-DEP lib/sbi/sbi_domain.dep + CC-DEP lib/sbi/sbi_domain_data.dep + CC-DEP lib/sbi/sbi_domain_context.dep + CC-DEP lib/sbi/sbi_console.dep + CC-DEP lib/sbi/sbi_bitops.dep + CC-DEP lib/sbi/sbi_bitmap.dep + CC-DEP lib/sbi/sbi_ecall_base.dep + CC-DEP lib/sbi/sbi_ecall.dep + CC-DEP lib/sbi/riscv_locks.dep + AS-DEP lib/sbi/riscv_hardfp.dep + CC-DEP lib/sbi/riscv_atomic.dep + CC-DEP lib/sbi/riscv_asm.dep + CC-DEP platform/buckyball/platform.dep + CC-DEP platform/buckyball/lib/utils/fdt/fdt_fixup.dep + CC-DEP platform/buckyball/lib/utils/fdt/fdt_driver.dep + CC-DEP platform/buckyball/lib/utils/fdt/fdt_helper.dep + CC-DEP platform/buckyball/lib/utils/ipi/aclint_mswi.dep + CC-DEP platform/buckyball/lib/utils/irqchip/plic.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_wip.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_sw.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_strerror.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_rw.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_ro.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_empty_tree.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_check.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt_addresses.dep + CC-DEP platform/buckyball/lib/utils/libfdt/fdt.dep + CC-DEP platform/buckyball/lib/utils/timer/aclint_mtimer.dep + CC-DEP lib/sbi/sbi_ecall_mpxy.dep + CC-DEP lib/sbi/sbi_ecall_sse.dep + CC-DEP lib/sbi/sbi_ecall_dbtr.dep + CC-DEP lib/sbi/sbi_ecall_vendor.dep + CC-DEP lib/sbi/sbi_ecall_legacy.dep + CC-DEP lib/sbi/sbi_ecall_fwft.dep + CC-DEP lib/sbi/sbi_ecall_cppc.dep + CC-DEP lib/sbi/sbi_ecall_dbcn.dep + CC-DEP lib/sbi/sbi_ecall_pmu.dep + CC-DEP lib/sbi/sbi_ecall_susp.dep + CC-DEP lib/sbi/sbi_ecall_srst.dep + CC-DEP lib/sbi/sbi_ecall_hsm.dep + CC-DEP lib/sbi/sbi_ecall_ipi.dep + CC-DEP lib/sbi/sbi_ecall_rfence.dep + CC-DEP lib/sbi/sbi_ecall_time.dep + CC lib/sbi/riscv_asm.o + CC lib/sbi/riscv_atomic.o + AS lib/sbi/riscv_hardfp.o + CC lib/sbi/riscv_locks.o + CC lib/sbi/sbi_ecall.o + CARRAY lib/sbi/sbi_ecall_exts.carray.c + CC lib/sbi/sbi_ecall_exts.carray.o + CC lib/sbi/sbi_ecall_time.o + CC lib/sbi/sbi_ecall_rfence.o + CC lib/sbi/sbi_ecall_ipi.o + CC lib/sbi/sbi_ecall_base.o + CC lib/sbi/sbi_ecall_hsm.o + CC lib/sbi/sbi_ecall_srst.o + CC lib/sbi/sbi_ecall_susp.o + CC lib/sbi/sbi_ecall_pmu.o + CC lib/sbi/sbi_ecall_dbcn.o + CC lib/sbi/sbi_ecall_cppc.o + CC lib/sbi/sbi_ecall_fwft.o + CC lib/sbi/sbi_ecall_legacy.o + CC lib/sbi/sbi_ecall_vendor.o + CC lib/sbi/sbi_ecall_dbtr.o + CC lib/sbi/sbi_ecall_sse.o + CC lib/sbi/sbi_ecall_mpxy.o + CC lib/sbi/sbi_bitmap.o + CC lib/sbi/sbi_bitops.o + CC lib/sbi/sbi_console.o + CC lib/sbi/sbi_domain_context.o + CC lib/sbi/sbi_domain_data.o + CC lib/sbi/sbi_domain.o + CC lib/sbi/sbi_double_trap.o + CC lib/sbi/sbi_emulate_csr.o + CC lib/sbi/sbi_fifo.o + CC lib/sbi/sbi_fwft.o + CC lib/sbi/sbi_hart.o + CC lib/sbi/sbi_hart_pmp.o + CC lib/sbi/sbi_hart_protection.o + CC lib/sbi/sbi_heap.o + CC lib/sbi/sbi_math.o + AS lib/sbi/sbi_hfence.o + CC lib/sbi/sbi_hsm.o + CC lib/sbi/sbi_illegal_atomic.o + CC lib/sbi/sbi_illegal_insn.o + CC lib/sbi/sbi_init.o + CC lib/sbi/sbi_ipi.o + CC lib/sbi/sbi_irqchip.o + CC lib/sbi/sbi_platform.o + CC lib/sbi/sbi_pmp.o + CC lib/sbi/sbi_pmu.o + CC lib/sbi/sbi_dbtr.o + CC lib/sbi/sbi_mpxy.o + CC lib/sbi/sbi_scratch.o + CC lib/sbi/sbi_sse.o + CC lib/sbi/sbi_string.o + CC lib/sbi/sbi_system.o + CC lib/sbi/sbi_timer.o + CC lib/sbi/sbi_tlb.o + CC lib/sbi/sbi_trap.o + CC lib/sbi/sbi_trap_ldst.o + CC lib/sbi/sbi_trap_v_ldst.o + CC lib/sbi/sbi_unpriv.o + AS lib/sbi/sbi_expected_trap.o + CC lib/sbi/sbi_cppc.o + CC lib/sbi/sbi_vector.o + CC lib/sbi/sbi_fp.o + AR lib/libsbi.a + CC platform/buckyball/lib/utils/timer/aclint_mtimer.o + CC platform/buckyball/lib/utils/libfdt/fdt.o + CC platform/buckyball/lib/utils/libfdt/fdt_addresses.o + CC platform/buckyball/lib/utils/libfdt/fdt_check.o + CC platform/buckyball/lib/utils/libfdt/fdt_empty_tree.o + CC platform/buckyball/lib/utils/libfdt/fdt_ro.o + CC platform/buckyball/lib/utils/libfdt/fdt_rw.o + CC platform/buckyball/lib/utils/libfdt/fdt_strerror.o + CC platform/buckyball/lib/utils/libfdt/fdt_sw.o + CC platform/buckyball/lib/utils/libfdt/fdt_wip.o + CC platform/buckyball/lib/utils/irqchip/plic.o + CC platform/buckyball/lib/utils/ipi/aclint_mswi.o + CARRAY platform/buckyball/lib/utils/fdt/fdt_early_drivers.carray.c +Warning; no VAR list on command line + CC platform/buckyball/lib/utils/fdt/fdt_early_drivers.carray.o + CC platform/buckyball/lib/utils/fdt/fdt_helper.o + CC platform/buckyball/lib/utils/fdt/fdt_driver.o + CC platform/buckyball/lib/utils/fdt/fdt_fixup.o + CC platform/buckyball/platform.o + AR platform/buckyball/lib/libplatsbi.a + AS platform/buckyball/firmware/payloads/test_head.o + CC platform/buckyball/firmware/payloads/test_main.o + MERGE platform/buckyball/firmware/payloads/test.o + CPP platform/buckyball/firmware/payloads/test.elf.ld + ELF platform/buckyball/firmware/payloads/test.elf + OBJCOPY platform/buckyball/firmware/payloads/test.bin + AS platform/buckyball/firmware/fw_payload.o + CPP platform/buckyball/firmware/fw_payload.elf.ld + ELF platform/buckyball/firmware/fw_payload.elf + OBJCOPY platform/buckyball/firmware/fw_payload.bin +[ 83%] Copying OpenSBI fw_payload to output +[100%] OpenSBI fw_payload ready at /home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/software/bb-tests/workloads/lib/kernel/../../../output/kernel/fw_payload-v1-t1.bin +[100%] Built target kernel-build +RUN python3 scripts/build_board_firmware.py --cross-compile riscv64-unknown-linux-gnu- +{ + "result": "PASS_BUILD", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "payload_bytes": 25797640, + "linux_image_sha256": "83771853398f2079e8f001e8f3eebb0cc532624948cfa2f71fc6c3d29002e81a", + "linux_image_unchanged": true, + "clint_frequency_hz": 500000, + "core_frequency_hz": 25000000, + "console_base": "0x60020000", + "memory_bytes": 268435456, + "original_platform_sha256": "215cc16a14101a2b987fb05f8619ccf20eef610f5f88c6561575e9a25fff7773", + "adapted_platform_sha256": "f1a7a6d2921105055adb66e9df759d12196cdf9d63d15966c66276f69354fc9f", + "original_payload_sha256": "e2ed973f994818afb73b500834ce9996ce58f4a6b353d4b901fdae9671eb0a93", + "boot_tested": false, + "command": [ + "make", + "-C", + "/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/opensbi-src", + "-j8", + "CROSS_COMPILE=riscv64-unknown-linux-gnu-", + "PLATFORM_DIR=/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/platform", + "PLATFORM=buckyball", + "O=/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/opensbi-build", + "FW_PAYLOAD_PATH=/home/yys/codex-builds/linux-gemmini-20261012-e8e89f4c/build/board-software/Image", + "BUCKYBALL_VISIBLE_HART_COUNT=1", + "BUCKYBALL_TOTAL_HART_COUNT=1", + "BUCKYBALL_HIDDEN_HART_BASE=1" + ] +} +{ + "result": "PASS_BUILD_NOT_HARDWARE_TESTED", + "elapsed_seconds": 143.825, + "software_baseline": { + "bbkernel": "b80336ce647f6604713f1570e1e1355f705a4355", + "linux": "ffc253263a1375a65fa6c9f62a893e9767fbebfa", + "opensbi": "c0f87f10d1bfb9e72a84ddfafb5604ee1bfe9d04", + "busybox": "1a64f6a20aaf6ea4dbba68bbfa8cc1ab7e5c57c4" + }, + "profile": { + "gemmini_rows": 8, + "gemmini_columns": 8, + "bank_width": 64, + "bank_count": 8, + "virtual_bank_count": 16, + "bank_rows": 1024 + }, + "payload_bytes": 25797640, + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "workloads": { + "gemmini_linux_check-linux": { + "bytes": 630680, + "sha256": "3d80717b1f0b593e22761e78626c38dec685c7a25c3d53ed42037357b652aa90" + }, + "gemmini_os_cisc_atranspose_test-linux": { + "bytes": 604440, + "sha256": "a2a79cc1d7bb333494ae14307685fb4b8891869a5d1eb037c004c176e0b98f6c" + }, + "gemmini_os_cisc_basic_test-linux": { + "bytes": 604408, + "sha256": "1215a8cafc2d6c11cfc8f01888f6bbecb8b2ca2201d5145f474bc852b68e4af4" + }, + "gemmini_os_cisc_btranspose_test-linux": { + "bytes": 604440, + "sha256": "18fe78a5f89ce0123f475df151d407cdb1b68c99dda7ef94b5255f376a667ec9" + }, + "gemmini_os_cisc_shift_test-linux": { + "bytes": 604408, + "sha256": "8b909fa200eeb000eb21cc71ca5ee2c960079fea2d57c62914e1ea3db4ba1651" + }, + "gemmini_os_risc_abtranspose_test-linux": { + "bytes": 604960, + "sha256": "443f12c0b2c6695c88592ac6c40b29ec56b09750d4e993c60b1bfceb5fdd1b5d" + }, + "gemmini_os_risc_atranspose_test-linux": { + "bytes": 604928, + "sha256": "40b99995cb6da30d2c3ba3a22b409033ddb2bd919b65b9eb1e0a3c19b67ff72e" + }, + "gemmini_os_risc_basic_test-linux": { + "bytes": 604920, + "sha256": "c789f91569d945db7c3d0b9d3441ab8938bc63354b0cabdfc003b634928664ba" + }, + "gemmini_os_risc_btranspose_test-linux": { + "bytes": 604928, + "sha256": "157bc4c831becf30652c60f62cbe65d33a60e8daa2eaa3ede2c8f8462f3a10b7" + }, + "gemmini_os_risc_shift_test-linux": { + "bytes": 604888, + "sha256": "be2b3cdaf1508650b374a36ac71b6a2bc05773366534ccd4cb1ce0a6ff524a76" + }, + "gemmini_ws_cisc_conv_test-linux": { + "bytes": 604408, + "sha256": "dd6d61b4f5d3a3058c6d2ca9a719c2a764533a01931a6e1c8d502f4793cdc9b4" + }, + "gemmini_ws_risc_basic_test-linux": { + "bytes": 604920, + "sha256": "b71942c93c3c6e2fc0ae9a2bfb07f7c061eef863e1282bf1c38a58d3864fa796" + }, + "gemmini_ws_risc_btranspose_test-linux": { + "bytes": 604960, + "sha256": "db3c5c781198f5c9f6d4df6c74ed640c1dc20e3964a32908b57b3e6264a584e7" + }, + "gemmini_ws_risc_shift_test-linux": { + "bytes": 604920, + "sha256": "14ef70b0c8a134ab12deb37bb6d0b245b19243cf556eb0da970d823e7032a822" + }, + "linux_system_check-linux": { + "bytes": 616848, + "sha256": "7fff55e3b560fd72482984f225b70a4a1154512452b96fc1467665b2acc32e00" + } + }, + "rootfs_install_verified": true, + "flash_modified": false, + "hardware_gemmini_tested": false, + "model_end_to_end_tested": false +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/LOAD_RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/LOAD_RESULT.json new file mode 100644 index 0000000..1adfb83 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/LOAD_RESULT.json @@ -0,0 +1,12 @@ +{ + "bitstream_sha256": "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "ddr_readback_bytes": 25797640, + "ddr_transfer_seconds": 806.172, + "timeout_seconds": 3600, + "flash_written": false, + "result": "PASS_DDR_READBACK_AND_LINUX_BOOT", + "kind": "derived-load-stage-record", + "linux_boot": true, + "scope": "仅记录已完成的完整 DDR 校验及 Linux 启动阶段,不代表其他阶段的结论。" +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/PERFORMANCE.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/PERFORMANCE.json new file mode 100644 index 0000000..d1cb8a3 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/PERFORMANCE.json @@ -0,0 +1,169 @@ +{ + "result": "PASS_OFFLINE_VERIFICATION", + "console_sha256": "edf9345b7a7757c4149fc993ad203b541047332d49525fe5ed965de7c026a1b1", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "matrix_measurements": [ + { + "case": 1, + "mode": "OS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 638000, + "accelerator_end_to_end_ns": 2808000, + "cpu_over_accelerator": 0.2272 + }, + { + "case": 2, + "mode": "WS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 620000, + "accelerator_end_to_end_ns": 850000, + "cpu_over_accelerator": 0.7294 + }, + { + "case": 3, + "mode": "OS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 7132000, + "accelerator_end_to_end_ns": 7644000, + "cpu_over_accelerator": 0.933 + }, + { + "case": 4, + "mode": "WS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 7252000, + "accelerator_end_to_end_ns": 7738000, + "cpu_over_accelerator": 0.9372 + }, + { + "case": 5, + "mode": "OS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 4134000, + "accelerator_end_to_end_ns": 8688000, + "cpu_over_accelerator": 0.4758 + }, + { + "case": 6, + "mode": "WS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 3942000, + "accelerator_end_to_end_ns": 8714000, + "cpu_over_accelerator": 0.4524 + }, + { + "case": 7, + "mode": "OS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 3318000, + "accelerator_end_to_end_ns": 1698000, + "cpu_over_accelerator": 1.9541 + }, + { + "case": 8, + "mode": "WS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 1592000, + "accelerator_end_to_end_ns": 3510000, + "cpu_over_accelerator": 0.4536 + }, + { + "case": 9, + "mode": "OS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 610000, + "accelerator_end_to_end_ns": 2854000, + "cpu_over_accelerator": 0.2137 + }, + { + "case": 10, + "mode": "WS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 620000, + "accelerator_end_to_end_ns": 874000, + "cpu_over_accelerator": 0.7094 + }, + { + "case": 11, + "mode": "OS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 7168000, + "accelerator_end_to_end_ns": 7712000, + "cpu_over_accelerator": 0.9295 + }, + { + "case": 12, + "mode": "WS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 6948000, + "accelerator_end_to_end_ns": 9692000, + "cpu_over_accelerator": 0.7169 + }, + { + "case": 13, + "mode": "OS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 5656000, + "accelerator_end_to_end_ns": 8728000, + "cpu_over_accelerator": 0.648 + }, + { + "case": 14, + "mode": "WS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 4028000, + "accelerator_end_to_end_ns": 12712000, + "cpu_over_accelerator": 0.3169 + }, + { + "case": 15, + "mode": "OS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 3260000, + "accelerator_end_to_end_ns": 3618000, + "cpu_over_accelerator": 0.9011 + }, + { + "case": 16, + "mode": "WS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 1614000, + "accelerator_end_to_end_ns": 3752000, + "cpu_over_accelerator": 0.4302 + } + ], + "timing_scope": "分块、DMA、配置、同步和 CPU 跨 K 累加;不是纯 MAC 延迟", + "model_end_to_end_tested": false +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/RESULT.json new file mode 100644 index 0000000..ee9a040 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/RESULT.json @@ -0,0 +1,109 @@ +{ + "result": "PASS_LINUX_AND_GEMMINI_HARDWARE", + "bitstream_sha256": "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "port": "COM5", + "timeout_seconds": 3600, + "flash_written": false, + "tests": [ + { + "name": "linux_system_check-linux", + "exit_code": 0, + "output": "~ # /root/linux_system_check-linux & p=$!; (sleep 90; kill -KILL \"$p\") & w=$!; w\nait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_0:%s\\n' \"$r\"\nBEGIN LINUX_SYSTEM_CHECK\nPASS VM_COPY_ON_WRITE\nlinux_system_ch[42]: unhandled signal 11 code 0x2 at 0x0000003fa076d000 in linux_system_check-linux[10000+7a000]\nCPU: 0 PID: 42 Comm: linux_system_ch Not tainted 6.6.0 #1\nHardware name: ucb-bar,buckyball (DT)\nepc : 00000000000105c6 ra : 000000000001041e sp : 0000003ffa033b50\n gp : 0000000000090078 tp : 0000000000096760 t0 : 0000000000000000\n t1 : 0000000000000000 t2 : 0000000000000000 s0 : 0000003ffa033bd0\n s1 : 0000003fa076c000 a0 : 0000000000000000 a1 : 0000000000000000\n a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000\n a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000\n s2 : 0000000000000042 s3 : 0000000000001000 s4 : 0000003fa076d000\n s5 : 0000003ffa033d88 s6 : 0000000000000002 s7 : 00000000000106ba\n s8 : 00000000000101e0 s9 : 000000000000003a s10: 0000000000094e28\n s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000\n t5 : 0000000000000000 t6 : 0000000000000000\nstatus: 800000020001e020 badaddr: 0000003fa076d000 cause: 000000000000000d\nPASS VM_PAGE_PROTECTION\nPASS FP64_PROCESS_CONTEXT\nPASS LINUX_TIMER elapsed_ns=104124000\nPASS LINUX_SYSTEM_CHECK\n\nWB_TEST_RC_0:0\n" + }, + { + "name": "gemmini_linux_check-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_linux_check-linux & p=$!; (sleep 90; kill -KILL \"$p\") & w=$!; \nwait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_1:%s\\n' \"$r\"\nBEGIN GEMMINI_LINUX_CHECK pid=44 dimension=8 bank_width=64\nBEGIN GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8\nPASS GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8 cpu_ns=638000 accelerator_end_to_end_ns=2808000\nBEGIN GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8\nPASS GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8 cpu_ns=620000 accelerator_end_to_end_ns=850000\nBEGIN GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16\nPASS GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16 cpu_ns=7132000 accelerator_end_to_end_ns=7644000\nBEGIN GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16\nPASS GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16 cpu_ns=7252000 accelerator_end_to_end_ns=7738000\nBEGIN GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17\nPASS GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17 cpu_ns=4134000 accelerator_end_to_end_ns=8688000\nBEGIN GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17\nPASS GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17 cpu_ns=3942000 accelerator_end_to_end_ns=8714000\nBEGIN GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8\nPASS GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8 cpu_ns=3318000 accelerator_end_to_end_ns=1698000\nBEGIN GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8\nPASS GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8 cpu_ns=1592000 accelerator_end_to_end_ns=3510000\nBEGIN GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8\nPASS GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8 cpu_ns=610000 accelerator_end_to_end_ns=2854000\nBEGIN GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8\nPASS GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8 cpu_ns=620000 accelerator_end_to_end_ns=874000\nBEGIN GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16\nPASS GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16 cpu_ns=7168000 accelerator_end_to_end_ns=7712000\nBEGIN GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16\nPASS GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16 cpu_ns=6948000 accelerator_end_to_end_ns=9692000\nBEGIN GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17\nPASS GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17 cpu_ns=5656000 accelerator_end_to_end_ns=8728000\nBEGIN GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17\nPASS GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17 cpu_ns=4028000 accelerator_end_to_end_ns=12712000\nBEGIN GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8\nPASS GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8 cpu_ns=3260000 accelerator_end_to_end_ns=3618000\nBEGIN GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8\nPASS GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8 cpu_ns=1614000 accelerator_end_to_end_ns=3752000\nPASS GEMMINI_LINUX_CHECK cases=16\n\nWB_TEST_RC_1:0\n" + }, + { + "name": "gemmini_os_cisc_atranspose_test-linux", + "exit_code": 0, + "output": "/root/gemmini_os_cisc_atranspose_test-linux & p=~ # $!; (sleep 90; k/ill -KILL \"$p\") r& w=$!; wait \"$po\"; r=$?; kill \"$ow\" 2>/dev/null; tprintf '\\nWB_TES/T_RC_2:%s\\n' \"$rg\"\nemmini_os_cisc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL \"$\np\") & w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_2:%s\\n'\n \"$r\"\n=== Gemmini OS CISC a_transpose Test ===\nGemmini OS CISC a_transpose Test PASSED\n\nWB_TEST_RC_2:0\n" + }, + { + "name": "gemmini_os_cisc_basic_test-linux", + "exit_code": 0, + "output": "/root/gemmini_os_cisc_basic_test~ # -linux & p=$!; (/sleep 90; kill -rKILL \"$p\") & w=$o!; wait \"$p\"; r=o$?; kill \"$w\" 2>t/dev/null; print/f '\\nWB_TEST_RC_g3:%s\\n' \"$r\"\nemmini_os_cisc_basic_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") &\n w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_3:%s\\n' \"$r\"\n=== Gemmini OS CISC Basic Test ===\nGemmini OS CISC Basic Test PASSED\n\nWB_TEST_RC_3:0\n" + }, + { + "name": "gemmini_os_cisc_btranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_cisc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL \"$\np\") & w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_4:%s\\n'\n \"$r\"\n=== Gemmini OS CISC b_transpose Test ===\nGemmini OS CISC b_transpose Test PASSED\n\nWB_TEST_RC_4:0\n" + }, + { + "name": "gemmini_os_cisc_shift_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_cisc_shift_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") &\n w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_5:%s\\n' \"$r\"\n=== Gemmini OS CISC in_shift Test ===\nGemmini OS CISC in_shift Test PASSED\n\nWB_TEST_RC_5:0\n" + }, + { + "name": "gemmini_os_risc_abtranspose_test-linux", + "exit_code": 0, + "output": "~ # \n/root/gemmini_os_risc_abtranspos~ # e_test-linux & p/=$!; (sleep 90; rkill -KILL \"$p\")o & w=$!; wait \"$op\"; r=$?; kill \"t$w\" 2>/dev/null;/ printf '\\nWB_TEgST_RC_6:%s\\n' \"$er\"\nmmini_os_risc_abtranspose_test-linux & p=$!; (sleep 90; kill -KILL \"\n$p\") & w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_6:%s\\n\n' \"$r\"\n=== Gemmini OS RISC ab_transpose Test ===\nGemmini OS RISC ab_transpose Test PASSED\n\nWB_TEST_RC_6:0\n" + }, + { + "name": "gemmini_os_risc_atranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL \"$\np\") & w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_7:%s\\n'\n \"$r\"\n=== Gemmini OS RISC a_transpose Test ===\nGemmini OS RISC a_transpose Test PASSED\n\nWB_TEST_RC_7:0\n" + }, + { + "name": "gemmini_os_risc_basic_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") &\n w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_8:%s\\n' \"$r\"\n=== Gemmini OS RISC Basic Test ===\nGemmini OS RISC Basic Test PASSED\n\nWB_TEST_RC_8:0\n" + }, + { + "name": "gemmini_os_risc_btranspose_test-linux", + "exit_code": 0, + "output": "/root/gemmini_os_risc_btranspose~ # _test-linux & p=/$!; (sleep 90; krill -KILL \"$p\") o& w=$!; wait \"$po\"; r=$?; kill \"$tw\" 2>/dev/null; /printf '\\nWB_TESgT_RC_9:%s\\n' \"$re\"\nmmini_os_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL \"$\np\") & w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_9:%s\\n'\n \"$r\"\n=== Gemmini OS RISC b_transpose Test ===\nGemmini OS RISC b_transpose Test PASSED\n\nWB_TEST_RC_9:0\n" + }, + { + "name": "gemmini_os_risc_shift_test-linux", + "exit_code": 0, + "output": "/root/gemmini_os_risc_shift_test-linux & p=$!; (~ # sleep 90; kill -/KILL \"$p\") & w=$r!; wait \"$p\"; r=o$?; kill \"$w\" 2>o/dev/null; printtf '\\nWB_TEST_RC_/10:%s\\n' \"$r\"\ngemmini_os_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") &\n w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_10:%s\\n' \"$r\n\"\n=== Gemmini OS RISC in_shift Test ===\nGemmini OS RISC in_shift Test PASSED\n\nWB_TEST_RC_10:0\n" + }, + { + "name": "gemmini_ws_cisc_conv_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_cisc_conv_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") & \nw=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_11:%s\\n' \"$r\"\n=== Gemmini WS CISC Loop Conv Test ===\nGemmini WS CISC Loop Conv Test PASSED\n\nWB_TEST_RC_11:0\n" + }, + { + "name": "gemmini_ws_risc_basic_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") &\n w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_12:%s\\n' \"$r\n\"\n=== Gemmini WS RISC Basic Test ===\nGemmini WS RISC Basic Test PASSED\n\nWB_TEST_RC_12:0\n" + }, + { + "name": "gemmini_ws_risc_btranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL \"$\np\") & w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_13:%s\\n\n' \"$r\"\n=== Gemmini WS RISC b_transpose Test ===\nGemmini WS RISC b_transpose Test PASSED\n\nWB_TEST_RC_13:0\n" + }, + { + "name": "gemmini_ws_risc_shift_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL \"$p\") &\n w=$!; wait \"$p\"; r=$?; kill \"$w\" 2>/dev/null; printf '\\nWB_TEST_RC_14:%s\\n' \"$r\n\"\n=== Gemmini WS RISC in_shift Test ===\nGemmini WS RISC in_shift Test PASSED\n\nWB_TEST_RC_14:0\n" + } + ], + "loaded_run": "D:\\Verilog_Dev\\fpga-arty-a7-gemmini-linux\\platforms\\arty-a7-toy\\build\\hardware-gemmini-20261012-8f4c6185", + "ddr_readback_bytes": 25797640, + "ddr_transfer_seconds": 806.172, + "configuration_reused": true, + "workload_hashes": { + "gemmini_linux_check-linux": "3d80717b1f0b593e22761e78626c38dec685c7a25c3d53ed42037357b652aa90", + "gemmini_os_cisc_atranspose_test-linux": "a2a79cc1d7bb333494ae14307685fb4b8891869a5d1eb037c004c176e0b98f6c", + "gemmini_os_cisc_basic_test-linux": "1215a8cafc2d6c11cfc8f01888f6bbecb8b2ca2201d5145f474bc852b68e4af4", + "gemmini_os_cisc_btranspose_test-linux": "18fe78a5f89ce0123f475df151d407cdb1b68c99dda7ef94b5255f376a667ec9", + "gemmini_os_cisc_shift_test-linux": "8b909fa200eeb000eb21cc71ca5ee2c960079fea2d57c62914e1ea3db4ba1651", + "gemmini_os_risc_abtranspose_test-linux": "443f12c0b2c6695c88592ac6c40b29ec56b09750d4e993c60b1bfceb5fdd1b5d", + "gemmini_os_risc_atranspose_test-linux": "40b99995cb6da30d2c3ba3a22b409033ddb2bd919b65b9eb1e0a3c19b67ff72e", + "gemmini_os_risc_basic_test-linux": "c789f91569d945db7c3d0b9d3441ab8938bc63354b0cabdfc003b634928664ba", + "gemmini_os_risc_btranspose_test-linux": "157bc4c831becf30652c60f62cbe65d33a60e8daa2eaa3ede2c8f8462f3a10b7", + "gemmini_os_risc_shift_test-linux": "be2b3cdaf1508650b374a36ac71b6a2bc05773366534ccd4cb1ce0a6ff524a76", + "gemmini_ws_cisc_conv_test-linux": "dd6d61b4f5d3a3058c6d2ca9a719c2a764533a01931a6e1c8d502f4793cdc9b4", + "gemmini_ws_risc_basic_test-linux": "b71942c93c3c6e2fc0ae9a2bfb07f7c061eef863e1282bf1c38a58d3864fa796", + "gemmini_ws_risc_btranspose_test-linux": "db3c5c781198f5c9f6d4df6c74ed640c1dc20e3964a32908b57b3e6264a584e7", + "gemmini_ws_risc_shift_test-linux": "14ef70b0c8a134ab12deb37bb6d0b245b19243cf556eb0da970d823e7032a822", + "linux_system_check-linux": "7fff55e3b560fd72482984f225b70a4a1154512452b96fc1467665b2acc32e00" + }, + "test_count": 15, + "blocked_matmul_cases": 16, + "elapsed_seconds": 123.953 +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/boot-console.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/boot-console.log new file mode 100644 index 0000000..7936261 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/boot-console.log @@ -0,0 +1,142 @@ + +OpenSBI v1.9 + ____ _____ ____ _____ + / __ \ / ____| _ \_ _| + | | | |_ __ ___ _ __ | (___ | |_) || | + | | | | '_ \ / _ \ '_ \ \___ \| _ < | | + | |__| | |_) | __/ | | |____) | |_) || |_ + \____/| .__/ \___|_| |_|_____/|____/_____| + | | + |_| + +Platform Name : Buckyball +Platform Features : medeleg +Platform HART Count : 1 +Platform HART Protection : pmp +Platform IPI Device : aclint-mswi +Platform Timer Device : aclint-mtimer @ 500000Hz +Platform Console Device : buckyball-scu +Platform HSM Device : --- +Platform PMU Device : --- +Platform Reboot Device : buckyball-scu-reset +Platform Shutdown Device : buckyball-scu-reset +Platform Suspend Device : --- +Platform CPPC Device : --- +Firmware Base : 0x80000000 +Firmware Size : 312 KB +Firmware RW Offset : 0x40000 +Firmware RW Size : 56 KB +Firmware Heap Offset : 0x45000 +Firmware Heap Size : 36 KB (total), 0 KB (reserved), 12 KB (used), 23 KB (free) +Firmware Scratch Size : 4096 B (total), 496 B (used), 3600 B (free) +Runtime SBI Version : 3.0 +Standard SBI Extensions : time,rfnc,ipi,base,hsm,srst,pmu,dbcn,fwft,legacy,sse +Experimental SBI Extensions : none + +Domain0 Name : root +Domain0 Boot HART : 0 +Domain0 HARTs : 0x0* +Domain0 Region00 : 0x0000000080040000-0x000000008004ffff M: (F,R,W) S/U: () +Domain0 Region01 : 0x0000000080000000-0x000000008003ffff M: (F,R,X) S/U: () +Domain0 Region02 : 0x0000000002008000-0x000000000200bfff M: (I,R,W) S/U: () +Domain0 Region03 : 0x0000000002000000-0x0000000002007fff M: (I,R,W) S/U: () +Domain0 Region04 : 0x000000000c000000-0x000000000fffffff M: (I,R,W) S/U: (R,W) +Domain0 Region05 : 0x0000000000000000-0xffffffffffffffff M: () S/U: (R,W,X) +Domain0 Next Address : 0x0000000080200000 +Domain0 Next Arg1 : 0x0000000088000000 +Domain0 Next Mode : S-mode +Domain0 SysReset : yes +Domain0 SysSuspend : yes + +Boot HART ID : 0 +Boot HART Domain : root +Boot HART Priv Version : v1.12 +Boot HART Base ISA : rv64imafdcx +Boot HART ISA Extensions : sdtrig +Boot HART PMP Count : 8 +Boot HART PMP Granularity : 2 bits +Boot HART PMP Address Bits : 30 +Boot HART MHPM Info : 0 (0x00000000) +Boot HART Debug Triggers : 0 triggers +Boot HART MIDELEG : 0x0000000000000222 +Boot HART MEDELEG : 0x000000000000b109 +Linux version 6.6.0 (yys@amax) (riscv64-unknown-linux-gnu-gcc (GCC) 15.3.0, GNU ld (GNU Binutils) 2.46) #1 Mon Oct 12 12:10:02 CST 2026 +Machine model: ucb-bar,buckyball +Forcing kernel command line to: console=hvc0 earlycon=sbi loglevel=8 ignore_loglevel panic=1 mem=256M +SBI specification v3.0 detected +SBI implementation ID=0x1 Version=0x10009 +SBI TIME extension detected +SBI IPI extension detected +SBI RFENCE extension detected +SBI SRST extension detected +earlycon: sbi0 at I/O port 0x0 (options '') +printk: bootconsole [sbi0] enabled +printk: debug: ignoring loglevel setting. +Memory limited to 256MB +efi: UEFI not found. +OF: reserved mem: 0x0000000080000000..0x000000008003ffff (256 KiB) nomap non-reusable mmode_resv1@80000000 +OF: reserved mem: 0x0000000080040000..0x000000008004ffff (64 KiB) nomap non-reusable mmode_resv0@80040000 +Zone ranges: + DMA32 [mem 0x0000000080000000-0x000000008fffffff] + Normal empty +Movable zone start for each node +Early memory node ranges + node 0: [mem 0x0000000080000000-0x000000008004ffff] + node 0: [mem 0x0000000080050000-0x000000008fffffff] +Initmem setup node 0 [mem 0x0000000080000000-0x000000008fffffff] +Falling back to deprecated "riscv,isa" +riscv: base ISA extensions abcdfim +riscv: ELF capabilities acdfim +pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 +pcpu-alloc: [0] 0 +Kernel command line: console=hvc0 earlycon=sbi loglevel=8 ignore_loglevel panic=1 mem=256M +Dentry cache hash table entries: 32768 (order: 6, 262144 bytes, linear) +Inode-cache hash table entries: 16384 (order: 5, 131072 bytes, linear) +Built 1 zonelists, mobility grouping on. Total pages: 64640 +mem auto-init: stack:all(zero), heap alloc:off, heap free:off +Memory: 233208K/262144K available (2126K kernel code, 4319K rwdata, 2048K rodata, 12681K init, 299K bss, 28936K reserved, 0K cma-reserved) +SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 +NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0 +riscv-intc: 64 local interrupts mapped +plic: interrupt-controller@c000000: mapped 1 interrupts with 1 handlers for 2 contexts. +clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 7052723233920 ns +sched_clock: 64 bits at 500kHz, resolution 2000ns, wraps every 4398046511000ns +Console: colour dummy device 80x25 +printk: console [hvc0] enabled +printk: console [hvc0] enabled +printk: bootconsole [sbi0] disabled +printk: bootconsole [sbi0] disabled +Calibrating delay loop (skipped), value calculated using timer frequency.. 1.00 BogoMIPS (lpj=2000) +pid_max: default: 32768 minimum: 301 +Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear) +Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear) +riscv: ELF compat mode unsupported +ASID allocator disabled (0 bits) +EFI services will not be available. +devtmpfs: initialized +clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns +futex hash table entries: 256 (order: 0, 6144 bytes, linear) +DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations +DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations +cpu0: Ratio of byte access time to unaligned word access is 0.01, unaligned accesses are slow +clocksource: Switched to clocksource riscv_clocksource +workingset: timestamp_bits=62 max_order=16 bucket_order=0 +io scheduler mq-deadline registered +io scheduler kyber registered +clk: Disabling unused clocks +Freeing unused kernel image (initmem) memory: 12680K +Run /init as init process + with arguments: + /init + with environment: + HOME=/ + TERM=linux + + __ __ __ ____ + / / / /___ __ _____ ____ _ / /_ ____ _/ / / + / /_/ / __ `/ | / / _ \ / __ `/ / __ \/ __ `/ / / + / __ / /_/ /| |/ / __/ / /_/ / / /_/ / /_/ / / / + /_/ /_/\__,_/ |___/\___/ \__,_/ /_.___/\__,_/_/_/ + +/bin/sh: can't access tty; job control turned off +~ # \ No newline at end of file diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/linux-console.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/linux-console.log new file mode 100644 index 0000000..8d67204 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/first-pass/linux-console.log @@ -0,0 +1,234 @@ + +~ # printf 'WB_RESUME_88d47bdc\n' +WB_RESUME_88d47bdc +~ # /bin/busybox sha256sum /root/gemmini_linux_check-linux; printf '\nWB_HASH_0: +%s\n' "$?" +3d80717b1f0b593e22761e78626c38dec685c7a25c3d53ed42037357b652aa90 /root/gemmini_linux_check-linux + +WB_HASH_0:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_atranspose_test-linux; printf ' +\nWB_HASH_1:%s\n' "$?" +a2a79cc1d7bb333494ae14307685fb4b8891869a5d1eb037c004c176e0b98f6c /root/gemmini_os_cisc_atranspose_test-linux + +WB_HASH_1:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_basic_test-linux; printf '\nWB_ +HASH_2:%s\n' "$?" +1215a8cafc2d6c11cfc8f01888f6bbecb8b2ca2201d5145f474bc852b68e4af4 /root/gemmini_os_cisc_basic_test-linux + +WB_HASH_2:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_btranspose_test-linux; printf ' +\nWB_HASH_3:%s\n' "$?" +18fe78a5f89ce0123f475df151d407cdb1b68c99dda7ef94b5255f376a667ec9 /root/gemmini_os_cisc_btranspose_test-linux + +WB_HASH_3:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_shift_test-linux; printf '\nWB_ +HASH_4:%s\n' "$?" +8b909fa200eeb000eb21cc71ca5ee2c960079fea2d57c62914e1ea3db4ba1651 /root/gemmini_os_cisc_shift_test-linux + +WB_HASH_4:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_abtranspose_test-linux; printf +'\nWB_HASH_5:%s\n' "$?" +443f12c0b2c6695c88592ac6c40b29ec56b09750d4e993c60b1bfceb5fdd1b5d /root/gemmini_os_risc_abtranspose_test-linux + +WB_HASH_5:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_atranspose_test-linux; printf ' +\nWB_HASH_6:%s\n' "$?" +40b99995cb6da30d2c3ba3a22b409033ddb2bd919b65b9eb1e0a3c19b67ff72e /root/gemmini_os_risc_atranspose_test-linux + +WB_HASH_6:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_basic_test-linux; printf '\nWB_ +HASH_7:%s\n' "$?" +c789f91569d945db7c3d0b9d3441ab8938bc63354b0cabdfc003b634928664ba /root/gemmini_os_risc_basic_test-linux + +WB_HASH_7:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_btranspose_test-linux; printf ' +\nWB_HASH_8:%s\n' "$?" +157bc4c831becf30652c60f62cbe65d33a60e8daa2eaa3ede2c8f8462f3a10b7 /root/gemmini_os_risc_btranspose_test-linux + +WB_HASH_8:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_shift_test-linux; printf '\nWB_ +HASH_9:%s\n' "$?" +be2b3cdaf1508650b374a36ac71b6a2bc05773366534ccd4cb1ce0a6ff524a76 /root/gemmini_os_risc_shift_test-linux + +WB_HASH_9:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_cisc_conv_test-linux; printf '\nWB_H +ASH_10:%s\n' "$?" +dd6d61b4f5d3a3058c6d2ca9a719c2a764533a01931a6e1c8d502f4793cdc9b4 /root/gemmini_ws_cisc_conv_test-linux + +WB_HASH_10:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_risc_basic_test-linux; printf '\nWB_ +HASH_11:%s\n' "$?" +b71942c93c3c6e2fc0ae9a2bfb07f7c061eef863e1282bf1c38a58d3864fa796 /root/gemmini_ws_risc_basic_test-linux + +WB_HASH_11:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_risc_btranspose_test-linux; printf ' +\nWB_HASH_12:%s\n' "$?" +db3c5c781198f5c9f6d4df6c74ed640c1dc20e3964a32908b57b3e6264a584e7 /root/gemmini_ws_risc_btranspose_test-linux + +WB_HASH_12:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_risc_shift_test-linux; printf '\nWB_ +HASH_13:%s\n' "$?" +14ef70b0c8a134ab12deb37bb6d0b245b19243cf556eb0da970d823e7032a822 /root/gemmini_ws_risc_shift_test-linux + +WB_HASH_13:0 +~ # /bin/busybox sha256sum /root/linux_system_check-linux; printf '\nWB_HASH_14: +%s\n' "$?" +7fff55e3b560fd72482984f225b70a4a1154512452b96fc1467665b2acc32e00 /root/linux_system_check-linux + +WB_HASH_14:0 +~ # /root/linux_system_check-linux & p=$!; (sleep 90; kill -KILL "$p") & w=$!; w +ait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_0:%s\n' "$r" +BEGIN LINUX_SYSTEM_CHECK +PASS VM_COPY_ON_WRITE +linux_system_ch[42]: unhandled signal 11 code 0x2 at 0x0000003fa076d000 in linux_system_check-linux[10000+7a000] +CPU: 0 PID: 42 Comm: linux_system_ch Not tainted 6.6.0 #1 +Hardware name: ucb-bar,buckyball (DT) +epc : 00000000000105c6 ra : 000000000001041e sp : 0000003ffa033b50 + gp : 0000000000090078 tp : 0000000000096760 t0 : 0000000000000000 + t1 : 0000000000000000 t2 : 0000000000000000 s0 : 0000003ffa033bd0 + s1 : 0000003fa076c000 a0 : 0000000000000000 a1 : 0000000000000000 + a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 + a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 + s2 : 0000000000000042 s3 : 0000000000001000 s4 : 0000003fa076d000 + s5 : 0000003ffa033d88 s6 : 0000000000000002 s7 : 00000000000106ba + s8 : 00000000000101e0 s9 : 000000000000003a s10: 0000000000094e28 + s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 + t5 : 0000000000000000 t6 : 0000000000000000 +status: 800000020001e020 badaddr: 0000003fa076d000 cause: 000000000000000d +PASS VM_PAGE_PROTECTION +PASS FP64_PROCESS_CONTEXT +PASS LINUX_TIMER elapsed_ns=104124000 +PASS LINUX_SYSTEM_CHECK + +WB_TEST_RC_0:0 +~ # /root/gemmini_linux_check-linux & p=$!; (sleep 90; kill -KILL "$p") & w=$!; +wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_1:%s\n' "$r" +BEGIN GEMMINI_LINUX_CHECK pid=44 dimension=8 bank_width=64 +BEGIN GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8 +PASS GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8 cpu_ns=638000 accelerator_end_to_end_ns=2808000 +BEGIN GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8 +PASS GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8 cpu_ns=620000 accelerator_end_to_end_ns=850000 +BEGIN GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16 +PASS GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16 cpu_ns=7132000 accelerator_end_to_end_ns=7644000 +BEGIN GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16 +PASS GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16 cpu_ns=7252000 accelerator_end_to_end_ns=7738000 +BEGIN GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17 +PASS GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17 cpu_ns=4134000 accelerator_end_to_end_ns=8688000 +BEGIN GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17 +PASS GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17 cpu_ns=3942000 accelerator_end_to_end_ns=8714000 +BEGIN GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8 +PASS GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8 cpu_ns=3318000 accelerator_end_to_end_ns=1698000 +BEGIN GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8 +PASS GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8 cpu_ns=1592000 accelerator_end_to_end_ns=3510000 +BEGIN GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8 +PASS GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8 cpu_ns=610000 accelerator_end_to_end_ns=2854000 +BEGIN GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8 +PASS GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8 cpu_ns=620000 accelerator_end_to_end_ns=874000 +BEGIN GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16 +PASS GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16 cpu_ns=7168000 accelerator_end_to_end_ns=7712000 +BEGIN GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16 +PASS GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16 cpu_ns=6948000 accelerator_end_to_end_ns=9692000 +BEGIN GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17 +PASS GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17 cpu_ns=5656000 accelerator_end_to_end_ns=8728000 +BEGIN GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17 +PASS GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17 cpu_ns=4028000 accelerator_end_to_end_ns=12712000 +BEGIN GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8 +PASS GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8 cpu_ns=3260000 accelerator_end_to_end_ns=3618000 +BEGIN GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8 +PASS GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8 cpu_ns=1614000 accelerator_end_to_end_ns=3752000 +PASS GEMMINI_LINUX_CHECK cases=16 + +WB_TEST_RC_1:0 +/root/gemmini_os_cisc_atranspose_test-linux & p=~ # $!; (sleep 90; k/ill -KILL "$p") r& w=$!; wait "$po"; r=$?; kill "$ow" 2>/dev/null; tprintf '\nWB_TES/T_RC_2:%s\n' "$rg" +emmini_os_cisc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL "$ +p") & w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_2:%s\n' + "$r" +=== Gemmini OS CISC a_transpose Test === +Gemmini OS CISC a_transpose Test PASSED + +WB_TEST_RC_2:0 +/root/gemmini_os_cisc_basic_test~ # -linux & p=$!; (/sleep 90; kill -rKILL "$p") & w=$o!; wait "$p"; r=o$?; kill "$w" 2>t/dev/null; print/f '\nWB_TEST_RC_g3:%s\n' "$r" +emmini_os_cisc_basic_test-linux & p=$!; (sleep 90; kill -KILL "$p") & + w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_3:%s\n' "$r" +=== Gemmini OS CISC Basic Test === +Gemmini OS CISC Basic Test PASSED + +WB_TEST_RC_3:0 +~ # /root/gemmini_os_cisc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL "$ +p") & w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_4:%s\n' + "$r" +=== Gemmini OS CISC b_transpose Test === +Gemmini OS CISC b_transpose Test PASSED + +WB_TEST_RC_4:0 +~ # /root/gemmini_os_cisc_shift_test-linux & p=$!; (sleep 90; kill -KILL "$p") & + w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_5:%s\n' "$r" +=== Gemmini OS CISC in_shift Test === +Gemmini OS CISC in_shift Test PASSED + +WB_TEST_RC_5:0 +~ # +/root/gemmini_os_risc_abtranspos~ # e_test-linux & p/=$!; (sleep 90; rkill -KILL "$p")o & w=$!; wait "$op"; r=$?; kill "t$w" 2>/dev/null;/ printf '\nWB_TEgST_RC_6:%s\n' "$er" +mmini_os_risc_abtranspose_test-linux & p=$!; (sleep 90; kill -KILL " +$p") & w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_6:%s\n +' "$r" +=== Gemmini OS RISC ab_transpose Test === +Gemmini OS RISC ab_transpose Test PASSED + +WB_TEST_RC_6:0 +~ # /root/gemmini_os_risc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL "$ +p") & w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_7:%s\n' + "$r" +=== Gemmini OS RISC a_transpose Test === +Gemmini OS RISC a_transpose Test PASSED + +WB_TEST_RC_7:0 +~ # /root/gemmini_os_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL "$p") & + w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_8:%s\n' "$r" +=== Gemmini OS RISC Basic Test === +Gemmini OS RISC Basic Test PASSED + +WB_TEST_RC_8:0 +/root/gemmini_os_risc_btranspose~ # _test-linux & p=/$!; (sleep 90; krill -KILL "$p") o& w=$!; wait "$po"; r=$?; kill "$tw" 2>/dev/null; /printf '\nWB_TESgT_RC_9:%s\n' "$re" +mmini_os_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL "$ +p") & w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_9:%s\n' + "$r" +=== Gemmini OS RISC b_transpose Test === +Gemmini OS RISC b_transpose Test PASSED + +WB_TEST_RC_9:0 +/root/gemmini_os_risc_shift_test-linux & p=$!; (~ # sleep 90; kill -/KILL "$p") & w=$r!; wait "$p"; r=o$?; kill "$w" 2>o/dev/null; printtf '\nWB_TEST_RC_/10:%s\n' "$r" +gemmini_os_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL "$p") & + w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_10:%s\n' "$r +" +=== Gemmini OS RISC in_shift Test === +Gemmini OS RISC in_shift Test PASSED + +WB_TEST_RC_10:0 +~ # /root/gemmini_ws_cisc_conv_test-linux & p=$!; (sleep 90; kill -KILL "$p") & +w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_11:%s\n' "$r" +=== Gemmini WS CISC Loop Conv Test === +Gemmini WS CISC Loop Conv Test PASSED + +WB_TEST_RC_11:0 +~ # /root/gemmini_ws_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL "$p") & + w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_12:%s\n' "$r +" +=== Gemmini WS RISC Basic Test === +Gemmini WS RISC Basic Test PASSED + +WB_TEST_RC_12:0 +~ # /root/gemmini_ws_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL "$ +p") & w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_13:%s\n +' "$r" +=== Gemmini WS RISC b_transpose Test === +Gemmini WS RISC b_transpose Test PASSED + +WB_TEST_RC_13:0 +~ # /root/gemmini_ws_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL "$p") & + w=$!; wait "$p"; r=$?; kill "$w" 2>/dev/null; printf '\nWB_TEST_RC_14:%s\n' "$r +" +=== Gemmini WS RISC in_shift Test === +Gemmini WS RISC in_shift Test PASSED + +WB_TEST_RC_14:0 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/CMakeLists.txt b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/CMakeLists.txt new file mode 100644 index 0000000..a3931f9 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/CMakeLists.txt @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.22) +project(ToyLinuxGemmini C) +set(CMAKE_C_STANDARD 11) +add_compile_options(-march=rv64gc -mabi=lp64d -O2 -Wall -Wextra -Werror -ffp-contract=off) +add_link_options(-static) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + reference/bb-tests/workloads/lib reference/examples/balls/gemmini/workloads) +add_library(bb_reference STATIC reference/bb-tests/workloads/lib/buckyball.c + reference/bb-tests/workloads/lib/bbhw/mem/mem.c + reference/bb-tests/workloads/lib/bbhw/isa/isa.c) +set(workloads gemmini_linux_check-linux) +add_executable(gemmini_linux_check-linux gemmini_linux_check.c) +target_link_libraries(gemmini_linux_check-linux PRIVATE bb_reference m) +add_executable(gemmini_os_cisc_atranspose_test-linux gemmini_os_cisc_atranspose_test.c) +target_link_libraries(gemmini_os_cisc_atranspose_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_cisc_atranspose_test-linux) +add_executable(gemmini_os_cisc_basic_test-linux gemmini_os_cisc_basic_test.c) +target_link_libraries(gemmini_os_cisc_basic_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_cisc_basic_test-linux) +add_executable(gemmini_os_cisc_btranspose_test-linux gemmini_os_cisc_btranspose_test.c) +target_link_libraries(gemmini_os_cisc_btranspose_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_cisc_btranspose_test-linux) +add_executable(gemmini_os_cisc_shift_test-linux gemmini_os_cisc_shift_test.c) +target_link_libraries(gemmini_os_cisc_shift_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_cisc_shift_test-linux) +add_executable(gemmini_os_risc_abtranspose_test-linux gemmini_os_risc_abtranspose_test.c) +target_link_libraries(gemmini_os_risc_abtranspose_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_risc_abtranspose_test-linux) +add_executable(gemmini_os_risc_atranspose_test-linux gemmini_os_risc_atranspose_test.c) +target_link_libraries(gemmini_os_risc_atranspose_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_risc_atranspose_test-linux) +add_executable(gemmini_os_risc_basic_test-linux gemmini_os_risc_basic_test.c) +target_link_libraries(gemmini_os_risc_basic_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_risc_basic_test-linux) +add_executable(gemmini_os_risc_btranspose_test-linux gemmini_os_risc_btranspose_test.c) +target_link_libraries(gemmini_os_risc_btranspose_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_risc_btranspose_test-linux) +add_executable(gemmini_os_risc_shift_test-linux gemmini_os_risc_shift_test.c) +target_link_libraries(gemmini_os_risc_shift_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_os_risc_shift_test-linux) +add_executable(gemmini_ws_cisc_conv_test-linux gemmini_ws_cisc_conv_test.c) +target_link_libraries(gemmini_ws_cisc_conv_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_ws_cisc_conv_test-linux) +add_executable(gemmini_ws_risc_basic_test-linux gemmini_ws_risc_basic_test.c) +target_link_libraries(gemmini_ws_risc_basic_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_ws_risc_basic_test-linux) +add_executable(gemmini_ws_risc_btranspose_test-linux gemmini_ws_risc_btranspose_test.c) +target_link_libraries(gemmini_ws_risc_btranspose_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_ws_risc_btranspose_test-linux) +add_executable(gemmini_ws_risc_shift_test-linux gemmini_ws_risc_shift_test.c) +target_link_libraries(gemmini_ws_risc_shift_test-linux PRIVATE bb_reference m) +list(APPEND workloads gemmini_ws_risc_shift_test-linux) +install(TARGETS ${workloads} RUNTIME DESTINATION .) diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/PREPARED.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/PREPARED.json new file mode 100644 index 0000000..48d3b2d --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/PREPARED.json @@ -0,0 +1,30 @@ +{ + "result": "PREPARED_NOT_BUILT", + "dimension": 8, + "reference_commit": "1f3d54535bd5fb76d5fd2f6b05ed36e591cf3097", + "original_cases": [ + "gemmini_os_cisc_atranspose_test.c", + "gemmini_os_cisc_basic_test.c", + "gemmini_os_cisc_btranspose_test.c", + "gemmini_os_cisc_shift_test.c", + "gemmini_os_risc_abtranspose_test.c", + "gemmini_os_risc_atranspose_test.c", + "gemmini_os_risc_basic_test.c", + "gemmini_os_risc_btranspose_test.c", + "gemmini_os_risc_shift_test.c", + "gemmini_ws_cisc_conv_test.c", + "gemmini_ws_risc_basic_test.c", + "gemmini_ws_risc_btranspose_test.c", + "gemmini_ws_risc_shift_test.c" + ], + "new_blocked_matmul_cases": 16, + "profile": { + "gemmini_rows": 8, + "gemmini_columns": 8, + "bank_width": 64, + "bank_count": 8, + "virtual_bank_count": 16, + "bank_rows": 1024 + }, + "model_end_to_end_tested": false +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/ballISA.h b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/ballISA.h new file mode 100644 index 0000000..3956da8 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/ballISA.h @@ -0,0 +1,23 @@ +#define BB_FUNC7_GEMMINI_CONFIG 2 +#define BB_FUNC7_GEMMINI_FLUSH 3 +#define BB_FUNC7_GEMMINI_PRELOAD 53 +#define BB_FUNC7_GEMMINI_COMPUTE_PRELOADED 66 +#define BB_FUNC7_GEMMINI_COMPUTE_ACCUMULATED 67 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_BOUNDS 80 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_ADDR_A 81 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_ADDR_B 82 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_ADDR_D 83 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_ADDR_C 84 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_STRIDES_AB 85 +#define BB_FUNC7_GEMMINI_LOOP_WS_CONFIG_STRIDES_DC 86 +#define BB_FUNC7_GEMMINI_LOOP_WS 87 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_1 96 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_2 97 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_3 98 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_4 99 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_5 100 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_6 101 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_7 102 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_8 103 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS_CONFIG_9 104 +#define BB_FUNC7_GEMMINI_LOOP_CONV_WS 105 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_linux_check.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_linux_check.c new file mode 100644 index 0000000..1f6fa7d --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_linux_check.c @@ -0,0 +1,132 @@ +// Linux workload for the actual 8x8 profile; use the pinned upstream ISA and DMA library. +#define _GNU_SOURCE +#include "buckyball.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if GEMMINI_DIM != 8 || BANK_WIDTH != 64 +#error This workload requires the emitted Toy FPGA 8x8 / 64-bit bank profile. +#endif + +enum { TILE = 8, MAX_DIM = 24 }; +static elem_t tile_a[TILE * TILE] __attribute__((aligned(64))); +static elem_t tile_b[TILE * TILE] __attribute__((aligned(64))); +static elem_t tile_zero[TILE * TILE] __attribute__((aligned(64))); +static result_t tile_c[TILE * TILE] __attribute__((aligned(64))); +static elem_t matrix_a[MAX_DIM * MAX_DIM], matrix_b[MAX_DIM * MAX_DIM]; +static result_t expected[MAX_DIM * MAX_DIM], observed[MAX_DIM * MAX_DIM]; + +static uint64_t nanoseconds(void) { + struct timespec value; + if (clock_gettime(CLOCK_MONOTONIC, &value)) { + perror("clock_gettime"); + exit(2); + } + return (uint64_t)value.tv_sec * 1000000000ULL + value.tv_nsec; +} + +static void gemmini_tile(unsigned ws) { + // 8-byte bank rows: INT8 uses one group, INT32 output uses four groups. + bb_mem_alloc(0, 1, 1); + bb_mem_alloc(1, 1, 1); + bb_mem_alloc(2, 1, 4); + bb_mem_alloc(3, 1, 1); + bb_mvin((uintptr_t)tile_a, 0, TILE, 1); + bb_mvin((uintptr_t)tile_b, 1, TILE, 1); + bb_mvin((uintptr_t)tile_zero, 3, TILE, 1); + bb_gemmini_config(ws, 0, 0, 0, 0); + bb_gemmini_preload(ws ? 1 : 3, 2, TILE, 0, 0); + bb_gemmini_compute_preloaded(0, ws ? 3 : 1, 2, TILE, 0, 0, 0); + bb_mvout((uintptr_t)tile_c, 2, TILE, 1); + bb_fence(); + for (unsigned bank = 0; bank < 4; ++bank) + bb_mem_release(bank); +} + +static void cpu_reference(unsigned m, unsigned n, unsigned k) { + for (unsigned row = 0; row < m; ++row) + for (unsigned col = 0; col < n; ++col) { + int32_t sum = 0; + for (unsigned inner = 0; inner < k; ++inner) + sum += (int32_t)matrix_a[row * k + inner] * matrix_b[inner * n + col]; + expected[row * n + col] = sum; + } +} + +static void blocked_matmul(unsigned m, unsigned n, unsigned k, unsigned ws) { + memset(observed, 0, sizeof(observed)); + for (unsigned row = 0; row < m; row += TILE) + for (unsigned col = 0; col < n; col += TILE) + for (unsigned inner = 0; inner < k; inner += TILE) { + memset(tile_a, 0, sizeof(tile_a)); + memset(tile_b, 0, sizeof(tile_b)); + memset(tile_zero, 0, sizeof(tile_zero)); + // Explicit writes give the DMA destination a private writable page. + memset(tile_c, 0, sizeof(tile_c)); + for (unsigned i = 0; i < TILE; ++i) + for (unsigned j = 0; j < TILE; ++j) { + if (row + i < m && inner + j < k) + tile_a[i * TILE + j] = matrix_a[(row + i) * k + inner + j]; + if (inner + i < k && col + j < n) + tile_b[i * TILE + j] = matrix_b[(inner + i) * n + col + j]; + } + gemmini_tile(ws); + for (unsigned i = 0; i < TILE && row + i < m; ++i) + for (unsigned j = 0; j < TILE && col + j < n; ++j) + observed[(row + i) * n + col + j] += tile_c[i * TILE + j]; + } +} + +static int check_case(unsigned id, unsigned m, unsigned n, unsigned k, unsigned ws) { + // Small bounded values keep the independent INT32 oracle free of overflow. + for (unsigned i = 0; i < m * k; ++i) + matrix_a[i] = (int)((i * 7 + id * 3) % 19) - 9; + for (unsigned i = 0; i < k * n; ++i) + matrix_b[i] = (int)((i * 11 + id * 5) % 23) - 11; + printf("BEGIN GEMMINI_CASE id=%u mode=%s m=%u n=%u k=%u\n", + id, ws ? "WS" : "OS", m, n, k); + alarm(60); + uint64_t start = nanoseconds(); + cpu_reference(m, n, k); + uint64_t cpu_ns = nanoseconds() - start; + start = nanoseconds(); + blocked_matmul(m, n, k, ws); + uint64_t accelerator_ns = nanoseconds() - start; + alarm(0); + for (unsigned i = 0; i < m * n; ++i) + if (observed[i] != expected[i]) { + printf("FAIL GEMMINI_CASE id=%u row=%u col=%u got=%d expected=%d\n", + id, i / n, i % n, observed[i], expected[i]); + return 1; + } + printf("PASS GEMMINI_CASE id=%u mode=%s m=%u n=%u k=%u cpu_ns=%llu " + "accelerator_end_to_end_ns=%llu\n", id, ws ? "WS" : "OS", m, n, k, + (unsigned long long)cpu_ns, (unsigned long long)accelerator_ns); + return 0; +} + +int main(void) { + setvbuf(stdout, NULL, _IONBF, 0); + printf("BEGIN GEMMINI_LINUX_CHECK pid=%ld dimension=%d bank_width=%d\n", + (long)getpid(), GEMMINI_DIM, BANK_WIDTH); + if (mlockall(MCL_CURRENT | MCL_FUTURE)) + printf("INFO MLOCKALL errno=%d; buffers are explicitly faulted in\n", errno); + unsigned id = 0; + const unsigned shapes[][3] = {{8, 8, 8}, {16, 16, 16}, {13, 11, 17}, {8, 24, 8}}; + for (unsigned repeat = 0; repeat < 2; ++repeat) + for (unsigned shape = 0; shape < sizeof(shapes) / sizeof(shapes[0]); ++shape) + for (unsigned ws = 0; ws < 2; ++ws) + if (check_case(++id, shapes[shape][0], shapes[shape][1], shapes[shape][2], ws)) + return 1; + printf("PASS GEMMINI_LINUX_CHECK cases=%u\n", id); + return 0; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_atranspose_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_atranspose_test.c new file mode 100644 index 0000000..02a4d6c --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_atranspose_test.c @@ -0,0 +1,47 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_at[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS CISC a_transpose Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + transpose_u8_matrix(mat_a, mat_at, DIM, DIM); + cpu_matmul(mat_at, mat_b, expected, DIM, DIM, DIM); + + bb_gemmini_config(0, 0, 1, 0, 0); + bb_gemmini_loop_ws_config_bounds(1, 1, 1); + bb_gemmini_loop_ws_config_addr_a((uintptr_t)mat_a); + bb_gemmini_loop_ws_config_addr_b((uintptr_t)mat_b); + bb_gemmini_loop_ws_config_addr_d(0); + bb_gemmini_loop_ws_config_addr_c((uintptr_t)mat_c); + bb_gemmini_loop_ws_config_strides_ab(DIM, DIM); + bb_gemmini_loop_ws_config_strides_dc(0, DIM * 4); + bb_gemmini_loop_ws(0, 1, 2, 1); + bb_fence(); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS CISC a_transpose Test PASSED\n"); + return 0; + } + printf("Gemmini OS CISC a_transpose Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_basic_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_basic_test.c new file mode 100644 index 0000000..c8689ff --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_basic_test.c @@ -0,0 +1,45 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS CISC Basic Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + cpu_matmul(mat_a, mat_b, expected, DIM, DIM, DIM); + + bb_gemmini_config(0, 0, 0, 0, 0); + bb_gemmini_loop_ws_config_bounds(1, 1, 1); + bb_gemmini_loop_ws_config_addr_a((uintptr_t)mat_a); + bb_gemmini_loop_ws_config_addr_b((uintptr_t)mat_b); + bb_gemmini_loop_ws_config_addr_d(0); + bb_gemmini_loop_ws_config_addr_c((uintptr_t)mat_c); + bb_gemmini_loop_ws_config_strides_ab(DIM, DIM); + bb_gemmini_loop_ws_config_strides_dc(0, DIM * 4); + bb_gemmini_loop_ws(0, 1, 2, 1); + bb_fence(); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS CISC Basic Test PASSED\n"); + return 0; + } + printf("Gemmini OS CISC Basic Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_btranspose_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_btranspose_test.c new file mode 100644 index 0000000..fd0fb1c --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_btranspose_test.c @@ -0,0 +1,47 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_bt[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS CISC b_transpose Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + transpose_u8_matrix(mat_b, mat_bt, DIM, DIM); + cpu_matmul(mat_a, mat_bt, expected, DIM, DIM, DIM); + + bb_gemmini_config(0, 0, 0, 1, 0); + bb_gemmini_loop_ws_config_bounds(1, 1, 1); + bb_gemmini_loop_ws_config_addr_a((uintptr_t)mat_a); + bb_gemmini_loop_ws_config_addr_b((uintptr_t)mat_b); + bb_gemmini_loop_ws_config_addr_d(0); + bb_gemmini_loop_ws_config_addr_c((uintptr_t)mat_c); + bb_gemmini_loop_ws_config_strides_ab(DIM, DIM); + bb_gemmini_loop_ws_config_strides_dc(0, DIM * 4); + bb_gemmini_loop_ws(0, 1, 2, 1); + bb_fence(); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS CISC b_transpose Test PASSED\n"); + return 0; + } + printf("Gemmini OS CISC b_transpose Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_shift_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_shift_test.c new file mode 100644 index 0000000..bde5f70 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_cisc_shift_test.c @@ -0,0 +1,48 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 +#define SHIFT 4 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS CISC in_shift Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + cpu_matmul(mat_a, mat_b, expected, DIM, DIM, DIM); + for (int i = 0; i < DIM * DIM; i++) + expected[i] = gemmini_in_shift(expected[i], SHIFT); + + bb_gemmini_config(0, 0, 0, 0, SHIFT); + bb_gemmini_loop_ws_config_bounds(1, 1, 1); + bb_gemmini_loop_ws_config_addr_a((uintptr_t)mat_a); + bb_gemmini_loop_ws_config_addr_b((uintptr_t)mat_b); + bb_gemmini_loop_ws_config_addr_d(0); + bb_gemmini_loop_ws_config_addr_c((uintptr_t)mat_c); + bb_gemmini_loop_ws_config_strides_ab(DIM, DIM); + bb_gemmini_loop_ws_config_strides_dc(0, DIM * 4); + bb_gemmini_loop_ws(0, 1, 2, 1); + bb_fence(); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS CISC in_shift Test PASSED\n"); + return 0; + } + printf("Gemmini OS CISC in_shift Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_abtranspose_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_abtranspose_test.c new file mode 100644 index 0000000..565b36f --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_abtranspose_test.c @@ -0,0 +1,53 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_at[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_bt[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS RISC ab_transpose Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + transpose_u8_matrix(mat_a, mat_at, DIM, DIM); + transpose_u8_matrix(mat_b, mat_bt, DIM, DIM); + cpu_matmul(mat_at, mat_bt, expected, DIM, DIM, DIM); + + uint32_t bank_a = 0, bank_b = 1, bank_c = 2; + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_b, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_b, bank_b, DIM, 1); + bb_gemmini_config(0, 0, 1, 1, 0); + bb_gemmini_preload(bank_a, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_b, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_a); + bb_mem_release(bank_b); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS RISC ab_transpose Test PASSED\n"); + return 0; + } + printf("Gemmini OS RISC ab_transpose Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_atranspose_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_atranspose_test.c new file mode 100644 index 0000000..32b9bb1 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_atranspose_test.c @@ -0,0 +1,51 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_at[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS RISC a_transpose Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + transpose_u8_matrix(mat_a, mat_at, DIM, DIM); + cpu_matmul(mat_at, mat_b, expected, DIM, DIM, DIM); + + uint32_t bank_a = 0, bank_b = 1, bank_c = 2; + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_b, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_b, bank_b, DIM, 1); + bb_gemmini_config(0, 0, 1, 0, 0); + bb_gemmini_preload(bank_a, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_b, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_a); + bb_mem_release(bank_b); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS RISC a_transpose Test PASSED\n"); + return 0; + } + printf("Gemmini OS RISC a_transpose Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_basic_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_basic_test.c new file mode 100644 index 0000000..b335b4f --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_basic_test.c @@ -0,0 +1,71 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t zeros[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + printf("=== Gemmini OS RISC Basic Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + cpu_matmul(mat_a, mat_b, expected, DIM, DIM, DIM); + + uint32_t bank_a = 0, bank_b = 1, bank_c = 2, bank_d_zeros = 3; + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_b, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mem_alloc(bank_d_zeros, 1, 1); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_b, bank_b, DIM, 1); + bb_mvin((uintptr_t)zeros, bank_d_zeros, DIM, 1); + bb_gemmini_config(0, 0, 0, 0, 0); + /* Preload D from zeros bank so C = A*B + D = A*B (not A*B + A) */ + bb_gemmini_preload(bank_d_zeros, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_b, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_a); + bb_mem_release(bank_b); + bb_mem_release(bank_c); + bb_mem_release(bank_d_zeros); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS RISC Basic Test PASSED\n"); + return 0; + } + + printf("got mat_c: "); + for (int i = 0; i < DIM; i++) { + printf("%d ", mat_c[i]); + } + printf("\n"); + // for (int i = 0; i < DIM; i++) { + // for (int j = 0; j < DIM; j++) { + // printf("%d ", mat_c[i * DIM + j]); + // } + // printf("\n"); + // } + + printf("exp row0: "); + for (int i = 0; i < DIM; i++) { + printf("%d ", expected[i]); + } + printf("\n"); + printf("Gemmini OS RISC Basic Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_btranspose_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_btranspose_test.c new file mode 100644 index 0000000..b8b6a40 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_btranspose_test.c @@ -0,0 +1,51 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_bt[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS RISC b_transpose Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + transpose_u8_matrix(mat_b, mat_bt, DIM, DIM); + cpu_matmul(mat_a, mat_bt, expected, DIM, DIM, DIM); + + uint32_t bank_a = 0, bank_b = 1, bank_c = 2; + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_b, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_b, bank_b, DIM, 1); + bb_gemmini_config(0, 0, 0, 1, 0); + bb_gemmini_preload(bank_a, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_b, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_a); + bb_mem_release(bank_b); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS RISC b_transpose Test PASSED\n"); + return 0; + } + printf("Gemmini OS RISC b_transpose Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_shift_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_shift_test.c new file mode 100644 index 0000000..d357012 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_os_risc_shift_test.c @@ -0,0 +1,52 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 +#define SHIFT 4 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini OS RISC in_shift Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + cpu_matmul(mat_a, mat_b, expected, DIM, DIM, DIM); + for (int i = 0; i < DIM * DIM; i++) + expected[i] = gemmini_in_shift(expected[i], SHIFT); + + uint32_t bank_a = 0, bank_b = 1, bank_c = 2; + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_b, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_b, bank_b, DIM, 1); + bb_gemmini_config(0, 0, 0, 0, SHIFT); + bb_gemmini_preload(bank_a, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_b, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_a); + bb_mem_release(bank_b); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini OS RISC in_shift Test PASSED\n"); + return 0; + } + printf("Gemmini OS RISC in_shift Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_cisc_conv_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_cisc_conv_test.c new file mode 100644 index 0000000..71f7653 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_cisc_conv_test.c @@ -0,0 +1,74 @@ +#include "buckyball.h" +#include +#include +#include +#include + +// Pointwise conv: batch=1, in_dim=1, in_channels=DIM, out_channels=DIM, +// kernel=1 Degenerates to a single DIM x DIM matmul (input[1x1xIC] * +// weight[1x1xICxOC]) +#define DIM 8 +#define BATCH 1 +#define IN_DIM 1 +#define OUT_DIM 1 +#define IN_CH DIM +#define OUT_CH DIM +#define KERNEL_DIM 1 + +// input layout: [batch, in_dim, in_dim, in_ch] = [1, 1, 1, 16] = 16 bytes +// weight layout: [krow, kcol, in_ch, out_ch] = [1, 1, 16, 16] = 256 bytes +// output layout: [batch, out_dim, out_dim, out_ch] = [1, 1, 1, 16] x 4 bytes = +// 64 bytes +static elem_t input[BATCH * IN_DIM * IN_DIM * IN_CH] + __attribute__((aligned(64))); +static elem_t weight[KERNEL_DIM * KERNEL_DIM * IN_CH * OUT_CH] + __attribute__((aligned(64))); +static result_t output[BATCH * OUT_DIM * OUT_DIM * OUT_CH] + __attribute__((aligned(64))); +static result_t expected[BATCH * OUT_DIM * OUT_DIM * OUT_CH] + __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini WS CISC Loop Conv Test ===\n"); + + for (int k = 0; k < IN_CH; ++k) { + input[k] = k % 7 - 3; + for (int out = 0; out < OUT_CH; ++out) + weight[k * OUT_CH + out] = (2 * k + 3 * out) % 5 - 2; + } + + // CPU reference: output[0..OUT_CH] = sum_k(input[k] * weight[k][j]) + // cpu_matmul(A[M×K], B[K×N], C[M×N]) — here A=input(1×IN_CH), + // B=weight(IN_CH×OUT_CH) + cpu_matmul(input, weight, expected, 1, OUT_CH, IN_CH); + + // Strides: + // input_stride = in_ch * elemSize = 16 * 1 = 16 (bytes per spatial step) + // weight_stride = in_ch * out_ch * elemSize = 16 * 16 * 1 = 256 (bytes per + // kernel step) output_stride = out_ch * accBytes = 16 * 4 = 64 + bb_gemmini_config(1, 0, 0, 0, 0); + bb_gemmini_loop_conv_ws_config_1(BATCH, IN_DIM, IN_CH); + bb_gemmini_loop_conv_ws_config_2(OUT_CH, OUT_DIM, 1, 0); + bb_gemmini_loop_conv_ws_config_3(KERNEL_DIM, 0, 0, 0); + bb_gemmini_loop_conv_ws_config_4(0); // no bias + bb_gemmini_loop_conv_ws_config_5((uintptr_t)input); + bb_gemmini_loop_conv_ws_config_6((uintptr_t)weight); + bb_gemmini_loop_conv_ws_config_7((uintptr_t)output); + bb_gemmini_loop_conv_ws_config_8( + IN_CH, IN_CH * OUT_CH); // input_stride, weight_stride + bb_gemmini_loop_conv_ws_config_9(OUT_CH * 4); // output_stride (accBytes=4) + bb_gemmini_loop_conv_ws( + 0, 1, 2, 1); // bank_input=0, bank_weight=1, bank_output=2, no_bias=1 + bb_fence(); + + if (compare_u32_matrices(output, expected, 1, OUT_CH)) { + printf("Gemmini WS CISC Loop Conv Test PASSED\n"); + return 0; + } + printf("Gemmini WS CISC Loop Conv Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_basic_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_basic_test.c new file mode 100644 index 0000000..fa62726 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_basic_test.c @@ -0,0 +1,53 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_d[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + printf("=== Gemmini WS RISC Basic Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + clear_u8_matrix(mat_d, DIM, DIM); + cpu_matmul(mat_a, mat_b, expected, DIM, DIM, DIM); + + // WS: bank_w=weights(B), bank_a=activations(A), bank_d=bias(0), bank_c=output + uint32_t bank_w = 0, bank_a = 1, bank_d = 2, bank_c = 3; + bb_mem_alloc(bank_w, 1, 1); + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_d, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_b, bank_w, DIM, 1); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_d, bank_d, DIM, 1); + bb_gemmini_config(1, 0, 0, 0, 0); + bb_gemmini_preload(bank_w, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_d, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_w); + bb_mem_release(bank_a); + bb_mem_release(bank_d); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini WS RISC Basic Test PASSED\n"); + return 0; + } + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_btranspose_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_btranspose_test.c new file mode 100644 index 0000000..052d4bc --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_btranspose_test.c @@ -0,0 +1,56 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_bt[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_d[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini WS RISC b_transpose Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + transpose_u8_matrix(mat_b, mat_bt, DIM, DIM); + clear_u8_matrix(mat_d, DIM, DIM); + cpu_matmul(mat_a, mat_bt, expected, DIM, DIM, DIM); + + uint32_t bank_w = 0, bank_a = 1, bank_d = 2, bank_c = 3; + bb_mem_alloc(bank_w, 1, 1); + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_d, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_b, bank_w, DIM, 1); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_d, bank_d, DIM, 1); + bb_gemmini_config(1, 0, 0, 1, 0); + bb_gemmini_preload(bank_w, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_d, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_w); + bb_mem_release(bank_a); + bb_mem_release(bank_d); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini WS RISC b_transpose Test PASSED\n"); + return 0; + } + printf("Gemmini WS RISC b_transpose Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_shift_test.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_shift_test.c new file mode 100644 index 0000000..e645b9e --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/gemmini_ws_risc_shift_test.c @@ -0,0 +1,57 @@ +#include "buckyball.h" +#include +#include +#include +#include + +#define DIM 8 +#define SHIFT 4 + +static elem_t mat_a[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_b[DIM * DIM] __attribute__((aligned(64))); +static elem_t mat_d[DIM * DIM] __attribute__((aligned(64))); +static result_t mat_c[DIM * DIM] __attribute__((aligned(64))); +static result_t expected[DIM * DIM] __attribute__((aligned(64))); + +int main() { +#ifdef MULTICORE + multicore(MULTICORE); +#endif + + printf("=== Gemmini WS RISC in_shift Test ===\n"); + + for (int row = 0; row < DIM; ++row) + for (int col = 0; col < DIM; ++col) { + mat_a[row * DIM + col] = (3 * row + 5 * col) % 11 - 5; + mat_b[row * DIM + col] = (7 * row + 2 * col) % 13 - 6; + } + clear_u8_matrix(mat_d, DIM, DIM); + cpu_matmul(mat_a, mat_b, expected, DIM, DIM, DIM); + for (int i = 0; i < DIM * DIM; i++) + expected[i] = gemmini_in_shift(expected[i], SHIFT); + + uint32_t bank_w = 0, bank_a = 1, bank_d = 2, bank_c = 3; + bb_mem_alloc(bank_w, 1, 1); + bb_mem_alloc(bank_a, 1, 1); + bb_mem_alloc(bank_d, 1, 1); + bb_mem_alloc(bank_c, 1, 4); + bb_mvin((uintptr_t)mat_b, bank_w, DIM, 1); + bb_mvin((uintptr_t)mat_a, bank_a, DIM, 1); + bb_mvin((uintptr_t)mat_d, bank_d, DIM, 1); + bb_gemmini_config(1, 0, 0, 0, SHIFT); + bb_gemmini_preload(bank_w, bank_c, DIM, 0, 0); + bb_gemmini_compute_preloaded(bank_a, bank_d, bank_c, DIM, 0, 0, 0); + bb_mvout((uintptr_t)mat_c, bank_c, DIM, 1); + bb_fence(); + bb_mem_release(bank_w); + bb_mem_release(bank_a); + bb_mem_release(bank_d); + bb_mem_release(bank_c); + + if (compare_u32_matrices(mat_c, expected, DIM, DIM)) { + printf("Gemmini WS RISC in_shift Test PASSED\n"); + return 0; + } + printf("Gemmini WS RISC in_shift Test FAILED\n"); + return 1; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/params.h b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/params.h new file mode 100644 index 0000000..092a058 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/generated-inputs/params.h @@ -0,0 +1,5 @@ +#define BANK_WIDTH 64 +#define PHYSICAL_BANK_NUM 8 +#define VIRTUAL_BANK_NUM 16 +#define BANK_ENTRIES 1024 +#define GEMMINI_DIM 8 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/LOAD_RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/LOAD_RESULT.json new file mode 100644 index 0000000..1adfb83 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/LOAD_RESULT.json @@ -0,0 +1,12 @@ +{ + "bitstream_sha256": "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "ddr_readback_bytes": 25797640, + "ddr_transfer_seconds": 806.172, + "timeout_seconds": 3600, + "flash_written": false, + "result": "PASS_DDR_READBACK_AND_LINUX_BOOT", + "kind": "derived-load-stage-record", + "linux_boot": true, + "scope": "仅记录已完成的完整 DDR 校验及 Linux 启动阶段,不代表其他阶段的结论。" +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/PERFORMANCE.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/PERFORMANCE.json new file mode 100644 index 0000000..052e7ab --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/PERFORMANCE.json @@ -0,0 +1,169 @@ +{ + "result": "PASS_OFFLINE_VERIFICATION", + "console_sha256": "e5c5442fa53496bc2c72bb725678fa424c0a73f43a511fee1e678ca7b6ca6729", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "matrix_measurements": [ + { + "case": 1, + "mode": "OS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 636000, + "accelerator_end_to_end_ns": 2762000, + "cpu_over_accelerator": 0.2303 + }, + { + "case": 2, + "mode": "WS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 642000, + "accelerator_end_to_end_ns": 906000, + "cpu_over_accelerator": 0.7086 + }, + { + "case": 3, + "mode": "OS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 5502000, + "accelerator_end_to_end_ns": 7654000, + "cpu_over_accelerator": 0.7188 + }, + { + "case": 4, + "mode": "WS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 7052000, + "accelerator_end_to_end_ns": 5718000, + "cpu_over_accelerator": 1.2333 + }, + { + "case": 5, + "mode": "OS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 4104000, + "accelerator_end_to_end_ns": 8738000, + "cpu_over_accelerator": 0.4697 + }, + { + "case": 6, + "mode": "WS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 4098000, + "accelerator_end_to_end_ns": 8686000, + "cpu_over_accelerator": 0.4718 + }, + { + "case": 7, + "mode": "OS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 3314000, + "accelerator_end_to_end_ns": 3840000, + "cpu_over_accelerator": 0.863 + }, + { + "case": 8, + "mode": "WS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 3244000, + "accelerator_end_to_end_ns": 1664000, + "cpu_over_accelerator": 1.9495 + }, + { + "case": 9, + "mode": "OS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 608000, + "accelerator_end_to_end_ns": 2862000, + "cpu_over_accelerator": 0.2124 + }, + { + "case": 10, + "mode": "WS", + "m": 8, + "n": 8, + "k": 8, + "cpu_ns": 606000, + "accelerator_end_to_end_ns": 818000, + "cpu_over_accelerator": 0.7408 + }, + { + "case": 11, + "mode": "OS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 5532000, + "accelerator_end_to_end_ns": 7240000, + "cpu_over_accelerator": 0.7641 + }, + { + "case": 12, + "mode": "WS", + "m": 16, + "n": 16, + "k": 16, + "cpu_ns": 7080000, + "accelerator_end_to_end_ns": 7750000, + "cpu_over_accelerator": 0.9135 + }, + { + "case": 13, + "mode": "OS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 4084000, + "accelerator_end_to_end_ns": 8794000, + "cpu_over_accelerator": 0.4644 + }, + { + "case": 14, + "mode": "WS", + "m": 13, + "n": 11, + "k": 17, + "cpu_ns": 4048000, + "accelerator_end_to_end_ns": 8642000, + "cpu_over_accelerator": 0.4684 + }, + { + "case": 15, + "mode": "OS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 3294000, + "accelerator_end_to_end_ns": 3766000, + "cpu_over_accelerator": 0.8747 + }, + { + "case": 16, + "mode": "WS", + "m": 8, + "n": 24, + "k": 8, + "cpu_ns": 3256000, + "accelerator_end_to_end_ns": 1668000, + "cpu_over_accelerator": 1.952 + } + ], + "timing_scope": "分块、DMA、配置、同步和 CPU 跨 K 累加;不是纯 MAC 延迟", + "model_end_to_end_tested": false +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/POST_RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/POST_RESULT.json new file mode 100644 index 0000000..9251ba9 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/POST_RESULT.json @@ -0,0 +1,9 @@ +{ + "flash_written": false, + "configuration_changed": false, + "watchdog_alive_rc": 1, + "MemTotal_kib": 245888, + "MemAvailable_kib": 225972, + "result": "PASS_POST_TEST_LIVE_SHELL", + "uart_latency_restored_ms": 16 +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/RESULT.json new file mode 100644 index 0000000..80b1d7e --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/RESULT.json @@ -0,0 +1,109 @@ +{ + "result": "PASS_LINUX_AND_GEMMINI_HARDWARE", + "bitstream_sha256": "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "port": "COM5", + "timeout_seconds": 3600, + "flash_written": false, + "tests": [ + { + "name": "linux_system_check-linux", + "exit_code": 0, + "output": "~ # /root/linux_system_check-linux & p=$!; (sleep 90; kill -KILL $p) & w=$!; wai\nt $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_RC_0:%s\\\nn' $r\nBEGIN LINUX_SYSTEM_CHECK\nPASS VM_COPY_ON_WRITE\nlinux_system_ch[97]: unhandled signal 11 code 0x2 at 0x0000003fa2571000 in linux_system_check-linux[10000+7a000]\nCPU: 0 PID: 97 Comm: linux_system_ch Not tainted 6.6.0 #1\nHardware name: ucb-bar,buckyball (DT)\nepc : 00000000000105c6 ra : 000000000001041e sp : 0000003fc329db50\n gp : 0000000000090078 tp : 0000000000096760 t0 : 0000000000000000\n t1 : 0000000000000000 t2 : 0000000000000000 s0 : 0000003fc329dbd0\n s1 : 0000003fa2570000 a0 : 0000000000000000 a1 : 0000000000000000\n a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000\n a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000\n s2 : 0000000000000042 s3 : 0000000000001000 s4 : 0000003fa2571000\n s5 : 0000003fc329dd88 s6 : 0000000000000002 s7 : 00000000000106ba\n s8 : 00000000000101e0 s9 : 000000000000003a s10: 0000000000094e28\n s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000\n t5 : 0000000000000000 t6 : 0000000000000000\nstatus: 800000020001e020 badaddr: 0000003fa2571000 cause: 000000000000000d\nPASS VM_PAGE_PROTECTION\nPASS FP64_PROCESS_CONTEXT\nPASS LINUX_TIMER elapsed_ns=104200000\nPASS LINUX_SYSTEM_CHECK\n\nWB_TEST_RC_0:0\n" + }, + { + "name": "gemmini_linux_check-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_linux_check-linux & p=$!; (sleep 90; kill -KILL $p) & w=$!; wa\nit $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_RC_1:%s\n\\n' $r\nBEGIN GEMMINI_LINUX_CHECK pid=99 dimension=8 bank_width=64\nBEGIN GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8\nPASS GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8 cpu_ns=636000 accelerator_end_to_end_ns=2762000\nBEGIN GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8\nPASS GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8 cpu_ns=642000 accelerator_end_to_end_ns=906000\nBEGIN GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16\nPASS GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16 cpu_ns=5502000 accelerator_end_to_end_ns=7654000\nBEGIN GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16\nPASS GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16 cpu_ns=7052000 accelerator_end_to_end_ns=5718000\nBEGIN GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17\nPASS GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17 cpu_ns=4104000 accelerator_end_to_end_ns=8738000\nBEGIN GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17\nPASS GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17 cpu_ns=4098000 accelerator_end_to_end_ns=8686000\nBEGIN GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8\nPASS GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8 cpu_ns=3314000 accelerator_end_to_end_ns=3840000\nBEGIN GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8\nPASS GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8 cpu_ns=3244000 accelerator_end_to_end_ns=1664000\nBEGIN GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8\nPASS GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8 cpu_ns=608000 accelerator_end_to_end_ns=2862000\nBEGIN GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8\nPASS GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8 cpu_ns=606000 accelerator_end_to_end_ns=818000\nBEGIN GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16\nPASS GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16 cpu_ns=5532000 accelerator_end_to_end_ns=7240000\nBEGIN GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16\nPASS GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16 cpu_ns=7080000 accelerator_end_to_end_ns=7750000\nBEGIN GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17\nPASS GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17 cpu_ns=4084000 accelerator_end_to_end_ns=8794000\nBEGIN GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17\nPASS GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17 cpu_ns=4048000 accelerator_end_to_end_ns=8642000\nBEGIN GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8\nPASS GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8 cpu_ns=3294000 accelerator_end_to_end_ns=3766000\nBEGIN GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8\nPASS GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8 cpu_ns=3256000 accelerator_end_to_end_ns=1668000\nPASS GEMMINI_LINUX_CHECK cases=16\n\nWB_TEST_RC_1:0\n" + }, + { + "name": "gemmini_os_cisc_atranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_cisc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL $p\n) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_\nTEST_RC_2:%s\\n' $r\n=== Gemmini OS CISC a_transpose Test ===\nGemmini OS CISC a_transpose Test PASSED\n\nWB_TEST_RC_2:0\n" + }, + { + "name": "gemmini_os_cisc_basic_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_cisc_basic_test-linux & p=$!; (sleep 90; kill -KILL $p) & w\n=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_\nRC_3:%s\\n' $r\n=== Gemmini OS CISC Basic Test ===\nGemmini OS CISC Basic Test PASSED\n\nWB_TEST_RC_3:0\n" + }, + { + "name": "gemmini_os_cisc_btranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_cisc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL $p\n) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_\nTEST_RC_4:%s\\n' $r\n=== Gemmini OS CISC b_transpose Test ===\nGemmini OS CISC b_transpose Test PASSED\n\nWB_TEST_RC_4:0\n" + }, + { + "name": "gemmini_os_cisc_shift_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_cisc_shift_test-linux & p=$!; (sleep 90; kill -KILL $p) & w\n=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_\nRC_5:%s\\n' $r\n=== Gemmini OS CISC in_shift Test ===\nGemmini OS CISC in_shift Test PASSED\n\nWB_TEST_RC_5:0\n" + }, + { + "name": "gemmini_os_risc_abtranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_abtranspose_test-linux & p=$!; (sleep 90; kill -KILL $\np) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB\n_TEST_RC_6:%s\\n' $r\n=== Gemmini OS RISC ab_transpose Test ===\nGemmini OS RISC ab_transpose Test PASSED\n\nWB_TEST_RC_6:0\n" + }, + { + "name": "gemmini_os_risc_atranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL $p\n) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_\nTEST_RC_7:%s\\n' $r\n=== Gemmini OS RISC a_transpose Test ===\nGemmini OS RISC a_transpose Test PASSED\n\nWB_TEST_RC_7:0\n" + }, + { + "name": "gemmini_os_risc_basic_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL $p) & w\n=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_\nRC_8:%s\\n' $r\n=== Gemmini OS RISC Basic Test ===\nGemmini OS RISC Basic Test PASSED\n\nWB_TEST_RC_8:0\n" + }, + { + "name": "gemmini_os_risc_btranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL $p\n) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_\nTEST_RC_9:%s\\n' $r\n=== Gemmini OS RISC b_transpose Test ===\nGemmini OS RISC b_transpose Test PASSED\n\nWB_TEST_RC_9:0\n" + }, + { + "name": "gemmini_os_risc_shift_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_os_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL $p) & w\n=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_\nRC_10:%s\\n' $r\n=== Gemmini OS RISC in_shift Test ===\nGemmini OS RISC in_shift Test PASSED\n\nWB_TEST_RC_10:0\n" + }, + { + "name": "gemmini_ws_cisc_conv_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_cisc_conv_test-linux & p=$!; (sleep 90; kill -KILL $p) & w=\n$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_R\nC_11:%s\\n' $r\n=== Gemmini WS CISC Loop Conv Test ===\nGemmini WS CISC Loop Conv Test PASSED\n\nWB_TEST_RC_11:0\n" + }, + { + "name": "gemmini_ws_risc_basic_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL $p) & w\n=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_\nRC_12:%s\\n' $r\n=== Gemmini WS RISC Basic Test ===\nGemmini WS RISC Basic Test PASSED\n\nWB_TEST_RC_12:0\n" + }, + { + "name": "gemmini_ws_risc_btranspose_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL $p\n) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_\nTEST_RC_13:%s\\n' $r\n=== Gemmini WS RISC b_transpose Test ===\nGemmini WS RISC b_transpose Test PASSED\n\nWB_TEST_RC_13:0\n" + }, + { + "name": "gemmini_ws_risc_shift_test-linux", + "exit_code": 0, + "output": "~ # /root/gemmini_ws_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL $p) & w\n=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\\nWB_TEST_\nRC_14:%s\\n' $r\n=== Gemmini WS RISC in_shift Test ===\nGemmini WS RISC in_shift Test PASSED\n\nWB_TEST_RC_14:0\n" + } + ], + "loaded_run": "D:\\Verilog_Dev\\fpga-arty-a7-gemmini-linux\\platforms\\arty-a7-toy\\build\\hardware-gemmini-20261012-8f4c6185", + "ddr_readback_bytes": 25797640, + "ddr_transfer_seconds": 806.172, + "configuration_reused": true, + "workload_hashes": { + "gemmini_linux_check-linux": "3d80717b1f0b593e22761e78626c38dec685c7a25c3d53ed42037357b652aa90", + "gemmini_os_cisc_atranspose_test-linux": "a2a79cc1d7bb333494ae14307685fb4b8891869a5d1eb037c004c176e0b98f6c", + "gemmini_os_cisc_basic_test-linux": "1215a8cafc2d6c11cfc8f01888f6bbecb8b2ca2201d5145f474bc852b68e4af4", + "gemmini_os_cisc_btranspose_test-linux": "18fe78a5f89ce0123f475df151d407cdb1b68c99dda7ef94b5255f376a667ec9", + "gemmini_os_cisc_shift_test-linux": "8b909fa200eeb000eb21cc71ca5ee2c960079fea2d57c62914e1ea3db4ba1651", + "gemmini_os_risc_abtranspose_test-linux": "443f12c0b2c6695c88592ac6c40b29ec56b09750d4e993c60b1bfceb5fdd1b5d", + "gemmini_os_risc_atranspose_test-linux": "40b99995cb6da30d2c3ba3a22b409033ddb2bd919b65b9eb1e0a3c19b67ff72e", + "gemmini_os_risc_basic_test-linux": "c789f91569d945db7c3d0b9d3441ab8938bc63354b0cabdfc003b634928664ba", + "gemmini_os_risc_btranspose_test-linux": "157bc4c831becf30652c60f62cbe65d33a60e8daa2eaa3ede2c8f8462f3a10b7", + "gemmini_os_risc_shift_test-linux": "be2b3cdaf1508650b374a36ac71b6a2bc05773366534ccd4cb1ce0a6ff524a76", + "gemmini_ws_cisc_conv_test-linux": "dd6d61b4f5d3a3058c6d2ca9a719c2a764533a01931a6e1c8d502f4793cdc9b4", + "gemmini_ws_risc_basic_test-linux": "b71942c93c3c6e2fc0ae9a2bfb07f7c061eef863e1282bf1c38a58d3864fa796", + "gemmini_ws_risc_btranspose_test-linux": "db3c5c781198f5c9f6d4df6c74ed640c1dc20e3964a32908b57b3e6264a584e7", + "gemmini_ws_risc_shift_test-linux": "14ef70b0c8a134ab12deb37bb6d0b245b19243cf556eb0da970d823e7032a822", + "linux_system_check-linux": "7fff55e3b560fd72482984f225b70a4a1154512452b96fc1467665b2acc32e00" + }, + "test_count": 15, + "blocked_matmul_cases": 16, + "elapsed_seconds": 123.859 +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/boot-console.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/boot-console.log new file mode 100644 index 0000000..7936261 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/boot-console.log @@ -0,0 +1,142 @@ + +OpenSBI v1.9 + ____ _____ ____ _____ + / __ \ / ____| _ \_ _| + | | | |_ __ ___ _ __ | (___ | |_) || | + | | | | '_ \ / _ \ '_ \ \___ \| _ < | | + | |__| | |_) | __/ | | |____) | |_) || |_ + \____/| .__/ \___|_| |_|_____/|____/_____| + | | + |_| + +Platform Name : Buckyball +Platform Features : medeleg +Platform HART Count : 1 +Platform HART Protection : pmp +Platform IPI Device : aclint-mswi +Platform Timer Device : aclint-mtimer @ 500000Hz +Platform Console Device : buckyball-scu +Platform HSM Device : --- +Platform PMU Device : --- +Platform Reboot Device : buckyball-scu-reset +Platform Shutdown Device : buckyball-scu-reset +Platform Suspend Device : --- +Platform CPPC Device : --- +Firmware Base : 0x80000000 +Firmware Size : 312 KB +Firmware RW Offset : 0x40000 +Firmware RW Size : 56 KB +Firmware Heap Offset : 0x45000 +Firmware Heap Size : 36 KB (total), 0 KB (reserved), 12 KB (used), 23 KB (free) +Firmware Scratch Size : 4096 B (total), 496 B (used), 3600 B (free) +Runtime SBI Version : 3.0 +Standard SBI Extensions : time,rfnc,ipi,base,hsm,srst,pmu,dbcn,fwft,legacy,sse +Experimental SBI Extensions : none + +Domain0 Name : root +Domain0 Boot HART : 0 +Domain0 HARTs : 0x0* +Domain0 Region00 : 0x0000000080040000-0x000000008004ffff M: (F,R,W) S/U: () +Domain0 Region01 : 0x0000000080000000-0x000000008003ffff M: (F,R,X) S/U: () +Domain0 Region02 : 0x0000000002008000-0x000000000200bfff M: (I,R,W) S/U: () +Domain0 Region03 : 0x0000000002000000-0x0000000002007fff M: (I,R,W) S/U: () +Domain0 Region04 : 0x000000000c000000-0x000000000fffffff M: (I,R,W) S/U: (R,W) +Domain0 Region05 : 0x0000000000000000-0xffffffffffffffff M: () S/U: (R,W,X) +Domain0 Next Address : 0x0000000080200000 +Domain0 Next Arg1 : 0x0000000088000000 +Domain0 Next Mode : S-mode +Domain0 SysReset : yes +Domain0 SysSuspend : yes + +Boot HART ID : 0 +Boot HART Domain : root +Boot HART Priv Version : v1.12 +Boot HART Base ISA : rv64imafdcx +Boot HART ISA Extensions : sdtrig +Boot HART PMP Count : 8 +Boot HART PMP Granularity : 2 bits +Boot HART PMP Address Bits : 30 +Boot HART MHPM Info : 0 (0x00000000) +Boot HART Debug Triggers : 0 triggers +Boot HART MIDELEG : 0x0000000000000222 +Boot HART MEDELEG : 0x000000000000b109 +Linux version 6.6.0 (yys@amax) (riscv64-unknown-linux-gnu-gcc (GCC) 15.3.0, GNU ld (GNU Binutils) 2.46) #1 Mon Oct 12 12:10:02 CST 2026 +Machine model: ucb-bar,buckyball +Forcing kernel command line to: console=hvc0 earlycon=sbi loglevel=8 ignore_loglevel panic=1 mem=256M +SBI specification v3.0 detected +SBI implementation ID=0x1 Version=0x10009 +SBI TIME extension detected +SBI IPI extension detected +SBI RFENCE extension detected +SBI SRST extension detected +earlycon: sbi0 at I/O port 0x0 (options '') +printk: bootconsole [sbi0] enabled +printk: debug: ignoring loglevel setting. +Memory limited to 256MB +efi: UEFI not found. +OF: reserved mem: 0x0000000080000000..0x000000008003ffff (256 KiB) nomap non-reusable mmode_resv1@80000000 +OF: reserved mem: 0x0000000080040000..0x000000008004ffff (64 KiB) nomap non-reusable mmode_resv0@80040000 +Zone ranges: + DMA32 [mem 0x0000000080000000-0x000000008fffffff] + Normal empty +Movable zone start for each node +Early memory node ranges + node 0: [mem 0x0000000080000000-0x000000008004ffff] + node 0: [mem 0x0000000080050000-0x000000008fffffff] +Initmem setup node 0 [mem 0x0000000080000000-0x000000008fffffff] +Falling back to deprecated "riscv,isa" +riscv: base ISA extensions abcdfim +riscv: ELF capabilities acdfim +pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 +pcpu-alloc: [0] 0 +Kernel command line: console=hvc0 earlycon=sbi loglevel=8 ignore_loglevel panic=1 mem=256M +Dentry cache hash table entries: 32768 (order: 6, 262144 bytes, linear) +Inode-cache hash table entries: 16384 (order: 5, 131072 bytes, linear) +Built 1 zonelists, mobility grouping on. Total pages: 64640 +mem auto-init: stack:all(zero), heap alloc:off, heap free:off +Memory: 233208K/262144K available (2126K kernel code, 4319K rwdata, 2048K rodata, 12681K init, 299K bss, 28936K reserved, 0K cma-reserved) +SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 +NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0 +riscv-intc: 64 local interrupts mapped +plic: interrupt-controller@c000000: mapped 1 interrupts with 1 handlers for 2 contexts. +clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 7052723233920 ns +sched_clock: 64 bits at 500kHz, resolution 2000ns, wraps every 4398046511000ns +Console: colour dummy device 80x25 +printk: console [hvc0] enabled +printk: console [hvc0] enabled +printk: bootconsole [sbi0] disabled +printk: bootconsole [sbi0] disabled +Calibrating delay loop (skipped), value calculated using timer frequency.. 1.00 BogoMIPS (lpj=2000) +pid_max: default: 32768 minimum: 301 +Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear) +Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear) +riscv: ELF compat mode unsupported +ASID allocator disabled (0 bits) +EFI services will not be available. +devtmpfs: initialized +clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns +futex hash table entries: 256 (order: 0, 6144 bytes, linear) +DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations +DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations +cpu0: Ratio of byte access time to unaligned word access is 0.01, unaligned accesses are slow +clocksource: Switched to clocksource riscv_clocksource +workingset: timestamp_bits=62 max_order=16 bucket_order=0 +io scheduler mq-deadline registered +io scheduler kyber registered +clk: Disabling unused clocks +Freeing unused kernel image (initmem) memory: 12680K +Run /init as init process + with arguments: + /init + with environment: + HOME=/ + TERM=linux + + __ __ __ ____ + / / / /___ __ _____ ____ _ / /_ ____ _/ / / + / /_/ / __ `/ | / / _ \ / __ `/ / __ \/ __ `/ / / + / __ / /_/ /| |/ / __/ / /_/ / / /_/ / /_/ / / / + /_/ /_/\__,_/ |___/\___/ \__,_/ /_.___/\__,_/_/_/ + +/bin/sh: can't access tty; job control turned off +~ # \ No newline at end of file diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/linux-console.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/linux-console.log new file mode 100644 index 0000000..490be7c --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/linux-console.log @@ -0,0 +1,235 @@ + +~ # printf 'WB_RESUME_4de39d38\n' +WB_RESUME_4de39d38 +~ # /bin/busybox sha256sum /root/gemmini_linux_check-linux; printf '\nWB_HASH_0: +%s\n' "$?" +3d80717b1f0b593e22761e78626c38dec685c7a25c3d53ed42037357b652aa90 /root/gemmini_linux_check-linux + +WB_HASH_0:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_atranspose_test-linux; printf ' +\nWB_HASH_1:%s\n' "$?" +a2a79cc1d7bb333494ae14307685fb4b8891869a5d1eb037c004c176e0b98f6c /root/gemmini_os_cisc_atranspose_test-linux + +WB_HASH_1:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_basic_test-linux; printf '\nWB_ +HASH_2:%s\n' "$?" +1215a8cafc2d6c11cfc8f01888f6bbecb8b2ca2201d5145f474bc852b68e4af4 /root/gemmini_os_cisc_basic_test-linux + +WB_HASH_2:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_btranspose_test-linux; printf ' +\nWB_HASH_3:%s\n' "$?" +18fe78a5f89ce0123f475df151d407cdb1b68c99dda7ef94b5255f376a667ec9 /root/gemmini_os_cisc_btranspose_test-linux + +WB_HASH_3:0 +~ # /bin/busybox sha256sum /root/gemmini_os_cisc_shift_test-linux; printf '\nWB_ +HASH_4:%s\n' "$?" +8b909fa200eeb000eb21cc71ca5ee2c960079fea2d57c62914e1ea3db4ba1651 /root/gemmini_os_cisc_shift_test-linux + +WB_HASH_4:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_abtranspose_test-linux; printf +'\nWB_HASH_5:%s\n' "$?" +443f12c0b2c6695c88592ac6c40b29ec56b09750d4e993c60b1bfceb5fdd1b5d /root/gemmini_os_risc_abtranspose_test-linux + +WB_HASH_5:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_atranspose_test-linux; printf ' +\nWB_HASH_6:%s\n' "$?" +40b99995cb6da30d2c3ba3a22b409033ddb2bd919b65b9eb1e0a3c19b67ff72e /root/gemmini_os_risc_atranspose_test-linux + +WB_HASH_6:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_basic_test-linux; printf '\nWB_ +HASH_7:%s\n' "$?" +c789f91569d945db7c3d0b9d3441ab8938bc63354b0cabdfc003b634928664ba /root/gemmini_os_risc_basic_test-linux + +WB_HASH_7:0 +~ # /bin/busybox sha256sum /root/gemmini_os_risc_btranspose_test-linux; printf ' +\nWB_HASH_8:%s\n' "$?" +157bc4c831becf30652c60f62cbe65d33a60e8daa2eaa3ede2c8f8462f3a10b7 /root/gemmini_os_risc_btranspose_test-linux + +WB_HASH_8:0 +/bin/busybox sha256sum /root/gem~ # mini_os_risc_shi/ft_test-linux; pbrintf '\nWB_HASHi_9:%s\n' "$?" +n/busybox sha256sum /root/gemmini_os_risc_shift_test-linux; printf '\nWB_ +HASH_9:%s\n' "$?" +be2b3cdaf1508650b374a36ac71b6a2bc05773366534ccd4cb1ce0a6ff524a76 /root/gemmini_os_risc_shift_test-linux + +WB_HASH_9:0 +/bin/busybox sha256sum /root/gem~ # mini_ws_cisc_con/bin/busybox sha256sum /root/gemmini_ws_cisc_conv_test-linux; printf '\nWB_H +ASH_10:%s\n' "$?" +dd6d61b4f5d3a3058c6d2ca9a719c2a764533a01931a6e1c8d502f4793cdc9b4 /root/gemmini_ws_cisc_conv_test-linux + +WB_HASH_10:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_risc_basic_test-linux; printf '\nWB_ +HASH_11:%s\n' "$?" +b71942c93c3c6e2fc0ae9a2bfb07f7c061eef863e1282bf1c38a58d3864fa796 /root/gemmini_ws_risc_basic_test-linux + +WB_HASH_11:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_risc_btranspose_test-linux; printf ' +\nWB_HASH_12:%s\n' "$?" +db3c5c781198f5c9f6d4df6c74ed640c1dc20e3964a32908b57b3e6264a584e7 /root/gemmini_ws_risc_btranspose_test-linux + +WB_HASH_12:0 +~ # /bin/busybox sha256sum /root/gemmini_ws_risc_shift_test-linux; printf '\nWB_ +HASH_13:%s\n' "$?" +14ef70b0c8a134ab12deb37bb6d0b245b19243cf556eb0da970d823e7032a822 /root/gemmini_ws_risc_shift_test-linux + +WB_HASH_13:0 +~ # /bin/busybox sha256sum /root/linux_system_check-linux; printf '\nWB_HASH_14: +%s\n' "$?" +7fff55e3b560fd72482984f225b70a4a1154512452b96fc1467665b2acc32e00 /root/linux_system_check-linux + +WB_HASH_14:0 +~ # /root/linux_system_check-linux & p=$!; (sleep 90; kill -KILL $p) & w=$!; wai +t $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_RC_0:%s\ +n' $r +BEGIN LINUX_SYSTEM_CHECK +PASS VM_COPY_ON_WRITE +linux_system_ch[97]: unhandled signal 11 code 0x2 at 0x0000003fa2571000 in linux_system_check-linux[10000+7a000] +CPU: 0 PID: 97 Comm: linux_system_ch Not tainted 6.6.0 #1 +Hardware name: ucb-bar,buckyball (DT) +epc : 00000000000105c6 ra : 000000000001041e sp : 0000003fc329db50 + gp : 0000000000090078 tp : 0000000000096760 t0 : 0000000000000000 + t1 : 0000000000000000 t2 : 0000000000000000 s0 : 0000003fc329dbd0 + s1 : 0000003fa2570000 a0 : 0000000000000000 a1 : 0000000000000000 + a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 + a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 + s2 : 0000000000000042 s3 : 0000000000001000 s4 : 0000003fa2571000 + s5 : 0000003fc329dd88 s6 : 0000000000000002 s7 : 00000000000106ba + s8 : 00000000000101e0 s9 : 000000000000003a s10: 0000000000094e28 + s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 + t5 : 0000000000000000 t6 : 0000000000000000 +status: 800000020001e020 badaddr: 0000003fa2571000 cause: 000000000000000d +PASS VM_PAGE_PROTECTION +PASS FP64_PROCESS_CONTEXT +PASS LINUX_TIMER elapsed_ns=104200000 +PASS LINUX_SYSTEM_CHECK + +WB_TEST_RC_0:0 +~ # /root/gemmini_linux_check-linux & p=$!; (sleep 90; kill -KILL $p) & w=$!; wa +it $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_RC_1:%s +\n' $r +BEGIN GEMMINI_LINUX_CHECK pid=99 dimension=8 bank_width=64 +BEGIN GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8 +PASS GEMMINI_CASE id=1 mode=OS m=8 n=8 k=8 cpu_ns=636000 accelerator_end_to_end_ns=2762000 +BEGIN GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8 +PASS GEMMINI_CASE id=2 mode=WS m=8 n=8 k=8 cpu_ns=642000 accelerator_end_to_end_ns=906000 +BEGIN GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16 +PASS GEMMINI_CASE id=3 mode=OS m=16 n=16 k=16 cpu_ns=5502000 accelerator_end_to_end_ns=7654000 +BEGIN GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16 +PASS GEMMINI_CASE id=4 mode=WS m=16 n=16 k=16 cpu_ns=7052000 accelerator_end_to_end_ns=5718000 +BEGIN GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17 +PASS GEMMINI_CASE id=5 mode=OS m=13 n=11 k=17 cpu_ns=4104000 accelerator_end_to_end_ns=8738000 +BEGIN GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17 +PASS GEMMINI_CASE id=6 mode=WS m=13 n=11 k=17 cpu_ns=4098000 accelerator_end_to_end_ns=8686000 +BEGIN GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8 +PASS GEMMINI_CASE id=7 mode=OS m=8 n=24 k=8 cpu_ns=3314000 accelerator_end_to_end_ns=3840000 +BEGIN GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8 +PASS GEMMINI_CASE id=8 mode=WS m=8 n=24 k=8 cpu_ns=3244000 accelerator_end_to_end_ns=1664000 +BEGIN GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8 +PASS GEMMINI_CASE id=9 mode=OS m=8 n=8 k=8 cpu_ns=608000 accelerator_end_to_end_ns=2862000 +BEGIN GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8 +PASS GEMMINI_CASE id=10 mode=WS m=8 n=8 k=8 cpu_ns=606000 accelerator_end_to_end_ns=818000 +BEGIN GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16 +PASS GEMMINI_CASE id=11 mode=OS m=16 n=16 k=16 cpu_ns=5532000 accelerator_end_to_end_ns=7240000 +BEGIN GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16 +PASS GEMMINI_CASE id=12 mode=WS m=16 n=16 k=16 cpu_ns=7080000 accelerator_end_to_end_ns=7750000 +BEGIN GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17 +PASS GEMMINI_CASE id=13 mode=OS m=13 n=11 k=17 cpu_ns=4084000 accelerator_end_to_end_ns=8794000 +BEGIN GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17 +PASS GEMMINI_CASE id=14 mode=WS m=13 n=11 k=17 cpu_ns=4048000 accelerator_end_to_end_ns=8642000 +BEGIN GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8 +PASS GEMMINI_CASE id=15 mode=OS m=8 n=24 k=8 cpu_ns=3294000 accelerator_end_to_end_ns=3766000 +BEGIN GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8 +PASS GEMMINI_CASE id=16 mode=WS m=8 n=24 k=8 cpu_ns=3256000 accelerator_end_to_end_ns=1668000 +PASS GEMMINI_LINUX_CHECK cases=16 + +WB_TEST_RC_1:0 +~ # /root/gemmini_os_cisc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL $p +) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_ +TEST_RC_2:%s\n' $r +=== Gemmini OS CISC a_transpose Test === +Gemmini OS CISC a_transpose Test PASSED + +WB_TEST_RC_2:0 +~ # /root/gemmini_os_cisc_basic_test-linux & p=$!; (sleep 90; kill -KILL $p) & w +=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_ +RC_3:%s\n' $r +=== Gemmini OS CISC Basic Test === +Gemmini OS CISC Basic Test PASSED + +WB_TEST_RC_3:0 +~ # /root/gemmini_os_cisc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL $p +) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_ +TEST_RC_4:%s\n' $r +=== Gemmini OS CISC b_transpose Test === +Gemmini OS CISC b_transpose Test PASSED + +WB_TEST_RC_4:0 +~ # /root/gemmini_os_cisc_shift_test-linux & p=$!; (sleep 90; kill -KILL $p) & w +=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_ +RC_5:%s\n' $r +=== Gemmini OS CISC in_shift Test === +Gemmini OS CISC in_shift Test PASSED + +WB_TEST_RC_5:0 +~ # /root/gemmini_os_risc_abtranspose_test-linux & p=$!; (sleep 90; kill -KILL $ +p) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB +_TEST_RC_6:%s\n' $r +=== Gemmini OS RISC ab_transpose Test === +Gemmini OS RISC ab_transpose Test PASSED + +WB_TEST_RC_6:0 +~ # /root/gemmini_os_risc_atranspose_test-linux & p=$!; (sleep 90; kill -KILL $p +) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_ +TEST_RC_7:%s\n' $r +=== Gemmini OS RISC a_transpose Test === +Gemmini OS RISC a_transpose Test PASSED + +WB_TEST_RC_7:0 +~ # /root/gemmini_os_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL $p) & w +=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_ +RC_8:%s\n' $r +=== Gemmini OS RISC Basic Test === +Gemmini OS RISC Basic Test PASSED + +WB_TEST_RC_8:0 +~ # /root/gemmini_os_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL $p +) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_ +TEST_RC_9:%s\n' $r +=== Gemmini OS RISC b_transpose Test === +Gemmini OS RISC b_transpose Test PASSED + +WB_TEST_RC_9:0 +~ # /root/gemmini_os_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL $p) & w +=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_ +RC_10:%s\n' $r +=== Gemmini OS RISC in_shift Test === +Gemmini OS RISC in_shift Test PASSED + +WB_TEST_RC_10:0 +~ # /root/gemmini_ws_cisc_conv_test-linux & p=$!; (sleep 90; kill -KILL $p) & w= +$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_R +C_11:%s\n' $r +=== Gemmini WS CISC Loop Conv Test === +Gemmini WS CISC Loop Conv Test PASSED + +WB_TEST_RC_11:0 +~ # /root/gemmini_ws_risc_basic_test-linux & p=$!; (sleep 90; kill -KILL $p) & w +=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_ +RC_12:%s\n' $r +=== Gemmini WS RISC Basic Test === +Gemmini WS RISC Basic Test PASSED + +WB_TEST_RC_12:0 +~ # /root/gemmini_ws_risc_btranspose_test-linux & p=$!; (sleep 90; kill -KILL $p +) & w=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_ +TEST_RC_13:%s\n' $r +=== Gemmini WS RISC b_transpose Test === +Gemmini WS RISC b_transpose Test PASSED + +WB_TEST_RC_13:0 +~ # /root/gemmini_ws_risc_shift_test-linux & p=$!; (sleep 90; kill -KILL $p) & w +=$!; wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWB_TEST_ +RC_14:%s\n' $r +=== Gemmini WS RISC in_shift Test === +Gemmini WS RISC in_shift Test PASSED + +WB_TEST_RC_14:0 diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/post-console.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/post-console.log new file mode 100644 index 0000000..41ffa4a --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/post-console.log @@ -0,0 +1,8 @@ +kill -0 "$w" 2>/dev/null; printf '\nWATCHDOG_ALIVE_RC:%s\n' "$?" + +WATCHDOG_ALIVE_RC:1 +~ # while read a b c; do case "$a" in MemTotal:|MemAvailable:) printf '%s %s %s\ +n' "$a" "$b" "$c";; esac; done < /proc/meminfo; printf 'LIVE_MEM_DONE\n' +MemTotal: 245888 kB +MemAvailable: 225972 kB +LIVE_MEM_DONE diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program-console.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program-console.log new file mode 100644 index 0000000..ca58365 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program-console.log @@ -0,0 +1,64 @@ + +****** Vivado v2025.1 (64-bit) + **** SW Build 6140274 on Thu May 22 00:12:29 MDT 2025 + **** IP Build 6138677 on Thu May 22 03:10:11 MDT 2025 + **** SharedData Build 6139179 on Tue May 20 17:58:58 MDT 2025 + **** Start of session at: Mon Oct 12 12:27:29 2026 + ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. + ** Copyright 2022-2025 Advanced Micro Devices, Inc. All Rights Reserved. + +source {D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\program.tcl} +# set toy_program_script [file join [file dirname [file normalize [info script]]] board program_arty.tcl] +# source $toy_program_script +## if {$argc != 1} { error "Supply the Arty A7-100T .bit file" } +## set bitfile [file normalize [lindex $argv 0]] +## if {![file isfile $bitfile]} { error "Bitstream not found: $bitfile" } +## open_hw_manager +open_hw_manager: Time (s): cpu = 00:00:04 ; elapsed = 00:00:07 . Memory (MB): peak = 494.582 ; gain = 214.816 +## connect_hw_server -allow_non_jtag +INFO: [Labtools 27-2285] Connecting to hw_server url TCP:localhost:3121 +INFO: [Labtools 27-2222] Launching hw_server... +INFO: [Labtools 27-2221] Launch Output: + +****** Xilinx hw_server v2025.1 + **** Build date : May 6 2025 at 09:15:36 + ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. + + +INFO: [Labtools 27-3415] Connecting to cs_server url TCP:localhost:0 +INFO: [Labtools 27-3417] Launching cs_server... +INFO: [Labtools 27-2221] Launch Output: + + +******** Xilinx cs_server v2025.1.0 + ****** Build date : May 14 2025-03:15:27 + **** Build number : 2025.1.1747163727 + ** Copyright 2017-2022 Xilinx, Inc. All Rights Reserved. + ** Copyright 2022-2026 Advanced Micro Devices, Inc. All Rights Reserved. + + + +connect_hw_server: Time (s): cpu = 00:00:00 ; elapsed = 00:00:07 . Memory (MB): peak = 494.582 ; gain = 0.000 +## set targets [get_hw_targets -quiet] +## if {[llength $targets] != 1} { +## error "Expected one connected JTAG target. Select the Arty manually in Hardware Manager if multiple boards are attached." +## } +## open_hw_target [lindex $targets 0] +INFO: [Labtoolstcl 44-466] Opening hw_target localhost:3121/xilinx_tcf/Digilent/210319BCC5FCA +## set devices [get_hw_devices -quiet -filter {PART == xc7a100t}] +## if {[llength $devices] != 1} { error "Expected one XC7A100T; inspect the connected board" } +## set device [lindex $devices 0] +## current_hw_device $device +## set_property PROGRAM.FILE $bitfile $device +## program_hw_devices $device +INFO: [Labtools 27-3164] End of startup status: HIGH +## refresh_hw_device $device +INFO: [Labtools 27-1434] Device xc7a100t (JTAG device index = 0) is programmed with a design that has no supported debug core(s) in it. +## puts "ARTY_JTAG_PROGRAMMED: $bitfile" +ARTY_JTAG_PROGRAMMED: D:/Verilog_Dev/toy-a7-gemmini-correct-20261010/build/board-20261011-132657/toy_a7.bit +## close_hw_target +INFO: [Labtoolstcl 44-464] Closing hw_target localhost:3121/xilinx_tcf/Digilent/210319BCC5FCA +## disconnect_hw_server +## close_hw_manager +## exit +INFO: [Common 17-206] Exiting Vivado at Mon Oct 12 12:27:52 2026... diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.jou b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.jou new file mode 100644 index 0000000..359d324 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.jou @@ -0,0 +1,24 @@ +#----------------------------------------------------------- +# Vivado v2025.1 (64-bit) +# SW Build 6140274 on Thu May 22 00:12:29 MDT 2025 +# IP Build 6138677 on Thu May 22 03:10:11 MDT 2025 +# SharedData Build 6139179 on Tue May 20 17:58:58 MDT 2025 +# Start of session at: Mon Oct 12 12:27:29 2026 +# Process ID : 47596 +# Current directory : D:/Verilog_Dev/fpga-arty-a7-gemmini-linux/platforms/arty-a7-toy +# Command line : vivado.exe -mode batch -source D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\program.tcl -log D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\build\hardware-gemmini-20261012-8f4c6185\program.log -journal D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\build\hardware-gemmini-20261012-8f4c6185\program.jou -tclargs D:\Verilog_Dev\toy-a7-gemmini-correct-20261010\build\board-20261011-132657\toy_a7.bit +# Log file : D:/Verilog_Dev/fpga-arty-a7-gemmini-linux/platforms/arty-a7-toy/build/hardware-gemmini-20261012-8f4c6185/program.log +# Journal file : D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\build\hardware-gemmini-20261012-8f4c6185\program.jou +# Running On : LAPTOP-IQGP9732 +# Platform : Windows Server 2016 or Windows 10 +# Operating System : 26200 +# Processor Detail : AMD Ryzen 9 8945HX with Radeon Graphics +# CPU Frequency : 2495 MHz +# CPU Physical cores : 16 +# CPU Logical cores : 32 +# Host memory : 33605 MB +# Swap memory : 66571 MB +# Total Virtual : 100177 MB +# Available Virtual : 72058 MB +#----------------------------------------------------------- +source {D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\program.tcl} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.log new file mode 100644 index 0000000..11f3127 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/hardware/program.log @@ -0,0 +1,78 @@ +#----------------------------------------------------------- +# Vivado v2025.1 (64-bit) +# SW Build 6140274 on Thu May 22 00:12:29 MDT 2025 +# IP Build 6138677 on Thu May 22 03:10:11 MDT 2025 +# SharedData Build 6139179 on Tue May 20 17:58:58 MDT 2025 +# Start of session at: Mon Oct 12 12:27:29 2026 +# Process ID : 47596 +# Current directory : D:/Verilog_Dev/fpga-arty-a7-gemmini-linux/platforms/arty-a7-toy +# Command line : vivado.exe -mode batch -source D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\program.tcl -log D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\build\hardware-gemmini-20261012-8f4c6185\program.log -journal D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\build\hardware-gemmini-20261012-8f4c6185\program.jou -tclargs D:\Verilog_Dev\toy-a7-gemmini-correct-20261010\build\board-20261011-132657\toy_a7.bit +# Log file : D:/Verilog_Dev/fpga-arty-a7-gemmini-linux/platforms/arty-a7-toy/build/hardware-gemmini-20261012-8f4c6185/program.log +# Journal file : D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\build\hardware-gemmini-20261012-8f4c6185\program.jou +# Running On : LAPTOP-IQGP9732 +# Platform : Windows Server 2016 or Windows 10 +# Operating System : 26200 +# Processor Detail : AMD Ryzen 9 8945HX with Radeon Graphics +# CPU Frequency : 2495 MHz +# CPU Physical cores : 16 +# CPU Logical cores : 32 +# Host memory : 33605 MB +# Swap memory : 66571 MB +# Total Virtual : 100177 MB +# Available Virtual : 72058 MB +#----------------------------------------------------------- +source {D:\Verilog_Dev\fpga-arty-a7-gemmini-linux\platforms\arty-a7-toy\program.tcl} +# set toy_program_script [file join [file dirname [file normalize [info script]]] board program_arty.tcl] +# source $toy_program_script +## if {$argc != 1} { error "Supply the Arty A7-100T .bit file" } +## set bitfile [file normalize [lindex $argv 0]] +## if {![file isfile $bitfile]} { error "Bitstream not found: $bitfile" } +## open_hw_manager +open_hw_manager: Time (s): cpu = 00:00:04 ; elapsed = 00:00:07 . Memory (MB): peak = 494.582 ; gain = 214.816 +## connect_hw_server -allow_non_jtag +INFO: [Labtools 27-2285] Connecting to hw_server url TCP:localhost:3121 +INFO: [Labtools 27-2222] Launching hw_server... +INFO: [Labtools 27-2221] Launch Output: + +****** Xilinx hw_server v2025.1 + **** Build date : May 6 2025 at 09:15:36 + ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. + + +INFO: [Labtools 27-3415] Connecting to cs_server url TCP:localhost:0 +INFO: [Labtools 27-3417] Launching cs_server... +INFO: [Labtools 27-2221] Launch Output: + + +******** Xilinx cs_server v2025.1.0 + ****** Build date : May 14 2025-03:15:27 + **** Build number : 2025.1.1747163727 + ** Copyright 2017-2022 Xilinx, Inc. All Rights Reserved. + ** Copyright 2022-2026 Advanced Micro Devices, Inc. All Rights Reserved. + + + +connect_hw_server: Time (s): cpu = 00:00:00 ; elapsed = 00:00:07 . Memory (MB): peak = 494.582 ; gain = 0.000 +## set targets [get_hw_targets -quiet] +## if {[llength $targets] != 1} { +## error "Expected one connected JTAG target. Select the Arty manually in Hardware Manager if multiple boards are attached." +## } +## open_hw_target [lindex $targets 0] +INFO: [Labtoolstcl 44-466] Opening hw_target localhost:3121/xilinx_tcf/Digilent/210319BCC5FCA +## set devices [get_hw_devices -quiet -filter {PART == xc7a100t}] +## if {[llength $devices] != 1} { error "Expected one XC7A100T; inspect the connected board" } +## set device [lindex $devices 0] +## current_hw_device $device +## set_property PROGRAM.FILE $bitfile $device +## program_hw_devices $device +INFO: [Labtools 27-3164] End of startup status: HIGH +## refresh_hw_device $device +INFO: [Labtools 27-1434] Device xc7a100t (JTAG device index = 0) is programmed with a design that has no supported debug core(s) in it. +## puts "ARTY_JTAG_PROGRAMMED: $bitfile" +ARTY_JTAG_PROGRAMMED: D:/Verilog_Dev/toy-a7-gemmini-correct-20261010/build/board-20261011-132657/toy_a7.bit +## close_hw_target +INFO: [Labtoolstcl 44-464] Closing hw_target localhost:3121/xilinx_tcf/Digilent/210319BCC5FCA +## disconnect_hw_server +## close_hw_manager +## exit +INFO: [Common 17-206] Exiting Vivado at Mon Oct 12 12:27:52 2026... diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/RESULT.json new file mode 100644 index 0000000..1adfb83 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/RESULT.json @@ -0,0 +1,12 @@ +{ + "bitstream_sha256": "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1", + "payload_sha256": "e2282b5a7ddf1aa01579919aa92df483ed79e739bf5d39530e07532e164118b0", + "ddr_readback_bytes": 25797640, + "ddr_transfer_seconds": 806.172, + "timeout_seconds": 3600, + "flash_written": false, + "result": "PASS_DDR_READBACK_AND_LINUX_BOOT", + "kind": "derived-load-stage-record", + "linux_boot": true, + "scope": "仅记录已完成的完整 DDR 校验及 Linux 启动阶段,不代表其他阶段的结论。" +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/linux-boot.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/linux-boot.log new file mode 100644 index 0000000..7936261 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/linux-boot.log @@ -0,0 +1,142 @@ + +OpenSBI v1.9 + ____ _____ ____ _____ + / __ \ / ____| _ \_ _| + | | | |_ __ ___ _ __ | (___ | |_) || | + | | | | '_ \ / _ \ '_ \ \___ \| _ < | | + | |__| | |_) | __/ | | |____) | |_) || |_ + \____/| .__/ \___|_| |_|_____/|____/_____| + | | + |_| + +Platform Name : Buckyball +Platform Features : medeleg +Platform HART Count : 1 +Platform HART Protection : pmp +Platform IPI Device : aclint-mswi +Platform Timer Device : aclint-mtimer @ 500000Hz +Platform Console Device : buckyball-scu +Platform HSM Device : --- +Platform PMU Device : --- +Platform Reboot Device : buckyball-scu-reset +Platform Shutdown Device : buckyball-scu-reset +Platform Suspend Device : --- +Platform CPPC Device : --- +Firmware Base : 0x80000000 +Firmware Size : 312 KB +Firmware RW Offset : 0x40000 +Firmware RW Size : 56 KB +Firmware Heap Offset : 0x45000 +Firmware Heap Size : 36 KB (total), 0 KB (reserved), 12 KB (used), 23 KB (free) +Firmware Scratch Size : 4096 B (total), 496 B (used), 3600 B (free) +Runtime SBI Version : 3.0 +Standard SBI Extensions : time,rfnc,ipi,base,hsm,srst,pmu,dbcn,fwft,legacy,sse +Experimental SBI Extensions : none + +Domain0 Name : root +Domain0 Boot HART : 0 +Domain0 HARTs : 0x0* +Domain0 Region00 : 0x0000000080040000-0x000000008004ffff M: (F,R,W) S/U: () +Domain0 Region01 : 0x0000000080000000-0x000000008003ffff M: (F,R,X) S/U: () +Domain0 Region02 : 0x0000000002008000-0x000000000200bfff M: (I,R,W) S/U: () +Domain0 Region03 : 0x0000000002000000-0x0000000002007fff M: (I,R,W) S/U: () +Domain0 Region04 : 0x000000000c000000-0x000000000fffffff M: (I,R,W) S/U: (R,W) +Domain0 Region05 : 0x0000000000000000-0xffffffffffffffff M: () S/U: (R,W,X) +Domain0 Next Address : 0x0000000080200000 +Domain0 Next Arg1 : 0x0000000088000000 +Domain0 Next Mode : S-mode +Domain0 SysReset : yes +Domain0 SysSuspend : yes + +Boot HART ID : 0 +Boot HART Domain : root +Boot HART Priv Version : v1.12 +Boot HART Base ISA : rv64imafdcx +Boot HART ISA Extensions : sdtrig +Boot HART PMP Count : 8 +Boot HART PMP Granularity : 2 bits +Boot HART PMP Address Bits : 30 +Boot HART MHPM Info : 0 (0x00000000) +Boot HART Debug Triggers : 0 triggers +Boot HART MIDELEG : 0x0000000000000222 +Boot HART MEDELEG : 0x000000000000b109 +Linux version 6.6.0 (yys@amax) (riscv64-unknown-linux-gnu-gcc (GCC) 15.3.0, GNU ld (GNU Binutils) 2.46) #1 Mon Oct 12 12:10:02 CST 2026 +Machine model: ucb-bar,buckyball +Forcing kernel command line to: console=hvc0 earlycon=sbi loglevel=8 ignore_loglevel panic=1 mem=256M +SBI specification v3.0 detected +SBI implementation ID=0x1 Version=0x10009 +SBI TIME extension detected +SBI IPI extension detected +SBI RFENCE extension detected +SBI SRST extension detected +earlycon: sbi0 at I/O port 0x0 (options '') +printk: bootconsole [sbi0] enabled +printk: debug: ignoring loglevel setting. +Memory limited to 256MB +efi: UEFI not found. +OF: reserved mem: 0x0000000080000000..0x000000008003ffff (256 KiB) nomap non-reusable mmode_resv1@80000000 +OF: reserved mem: 0x0000000080040000..0x000000008004ffff (64 KiB) nomap non-reusable mmode_resv0@80040000 +Zone ranges: + DMA32 [mem 0x0000000080000000-0x000000008fffffff] + Normal empty +Movable zone start for each node +Early memory node ranges + node 0: [mem 0x0000000080000000-0x000000008004ffff] + node 0: [mem 0x0000000080050000-0x000000008fffffff] +Initmem setup node 0 [mem 0x0000000080000000-0x000000008fffffff] +Falling back to deprecated "riscv,isa" +riscv: base ISA extensions abcdfim +riscv: ELF capabilities acdfim +pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 +pcpu-alloc: [0] 0 +Kernel command line: console=hvc0 earlycon=sbi loglevel=8 ignore_loglevel panic=1 mem=256M +Dentry cache hash table entries: 32768 (order: 6, 262144 bytes, linear) +Inode-cache hash table entries: 16384 (order: 5, 131072 bytes, linear) +Built 1 zonelists, mobility grouping on. Total pages: 64640 +mem auto-init: stack:all(zero), heap alloc:off, heap free:off +Memory: 233208K/262144K available (2126K kernel code, 4319K rwdata, 2048K rodata, 12681K init, 299K bss, 28936K reserved, 0K cma-reserved) +SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 +NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0 +riscv-intc: 64 local interrupts mapped +plic: interrupt-controller@c000000: mapped 1 interrupts with 1 handlers for 2 contexts. +clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 7052723233920 ns +sched_clock: 64 bits at 500kHz, resolution 2000ns, wraps every 4398046511000ns +Console: colour dummy device 80x25 +printk: console [hvc0] enabled +printk: console [hvc0] enabled +printk: bootconsole [sbi0] disabled +printk: bootconsole [sbi0] disabled +Calibrating delay loop (skipped), value calculated using timer frequency.. 1.00 BogoMIPS (lpj=2000) +pid_max: default: 32768 minimum: 301 +Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear) +Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear) +riscv: ELF compat mode unsupported +ASID allocator disabled (0 bits) +EFI services will not be available. +devtmpfs: initialized +clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns +futex hash table entries: 256 (order: 0, 6144 bytes, linear) +DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations +DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations +cpu0: Ratio of byte access time to unaligned word access is 0.01, unaligned accesses are slow +clocksource: Switched to clocksource riscv_clocksource +workingset: timestamp_bits=62 max_order=16 bucket_order=0 +io scheduler mq-deadline registered +io scheduler kyber registered +clk: Disabling unused clocks +Freeing unused kernel image (initmem) memory: 12680K +Run /init as init process + with arguments: + /init + with environment: + HOME=/ + TERM=linux + + __ __ __ ____ + / / / /___ __ _____ ____ _ / /_ ____ _/ / / + / /_/ / __ `/ | / / _ \ / __ `/ / __ \/ __ `/ / / + / __ / /_/ /| |/ / __/ / /_/ / / /_/ / /_/ / / / + /_/ /_/\__,_/ |___/\___/ \__,_/ /_.___/\__,_/_/_/ + +/bin/sh: can't access tty; job control turned off +~ # \ No newline at end of file diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/transfer.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/transfer.log new file mode 100644 index 0000000..d1d7d9e --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/load/transfer.log @@ -0,0 +1,30 @@ +PASS VOLATILE_JTAG_PROGRAM +D2XX UART B COM5: latency 16->2 ms +PASS LOADER_INFO DDR=256MiB CPU=25MHz +DDR_VERIFY 256/25797640 +DDR_VERIFY 1048832/25797640 +DDR_VERIFY 2097408/25797640 +DDR_VERIFY 3145984/25797640 +DDR_VERIFY 4194560/25797640 +DDR_VERIFY 5243136/25797640 +DDR_VERIFY 6291712/25797640 +DDR_VERIFY 7340288/25797640 +DDR_VERIFY 8388864/25797640 +DDR_VERIFY 9437440/25797640 +DDR_VERIFY 10486016/25797640 +DDR_VERIFY 11534592/25797640 +DDR_VERIFY 12583168/25797640 +DDR_VERIFY 13631744/25797640 +DDR_VERIFY 14680320/25797640 +DDR_VERIFY 15728896/25797640 +DDR_VERIFY 16777472/25797640 +DDR_VERIFY 17826048/25797640 +DDR_VERIFY 18874624/25797640 +DDR_VERIFY 19923200/25797640 +DDR_VERIFY 20971776/25797640 +DDR_VERIFY 22020352/25797640 +DDR_VERIFY 23068928/25797640 +DDR_VERIFY 24117504/25797640 +DDR_VERIFY 25166080/25797640 +PASS FULL_DDR_READBACK bytes=25797640 seconds=806.172 +PASS LINUX_BOOT diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/board/program_arty.tcl b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/board/program_arty.tcl new file mode 100644 index 0000000..f70f054 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/board/program_arty.tcl @@ -0,0 +1,25 @@ +# Volatile JTAG programming only. Usage: +# Confirm physical Rev E DDR compatibility before using this engineering image. +# vivado -mode batch -source board/program_arty.tcl -tclargs /path/to/toy_a7.bit +if {$argc != 1} { error "Supply the Arty A7-100T .bit file" } +set bitfile [file normalize [lindex $argv 0]] +if {![file isfile $bitfile]} { error "Bitstream not found: $bitfile" } +open_hw_manager +connect_hw_server -allow_non_jtag +set targets [get_hw_targets -quiet] +if {[llength $targets] != 1} { + error "Expected one connected JTAG target. Select the Arty manually in Hardware Manager if multiple boards are attached." +} +open_hw_target [lindex $targets 0] +set devices [get_hw_devices -quiet -filter {PART == xc7a100t}] +if {[llength $devices] != 1} { error "Expected one XC7A100T; inspect the connected board" } +set device [lindex $devices 0] +current_hw_device $device +set_property PROGRAM.FILE $bitfile $device +program_hw_devices $device +refresh_hw_device $device +puts "ARTY_JTAG_PROGRAMMED: $bitfile" +close_hw_target +disconnect_hw_server +close_hw_manager +exit diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/check_watchdog.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/check_watchdog.py new file mode 100644 index 0000000..6fbe75c --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/check_watchdog.py @@ -0,0 +1,49 @@ +import json +from pathlib import Path +import re +import sys +import time + +root = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(root / "host")) +from check_linux_gemmini import bounded_command +from ftdi_transport import D2xxPort + +out = root / "build/hardware-gemmini-20261012-88d47bdc" +build = json.loads((root / "build/linux-gemmini-20261012-e8e89f4c/LINUX_GEMMINI_BUILD.json").read_text()) +maximum = max(len(bounded_command("/root/" + name, "WB_TEST_RC_14").encode()) + for name in build["workloads"]) +print("MAX_CONSOLE_COMMAND_BYTES", maximum) +cases = [("/bin/busybox true", 0), ("/bin/busybox false", 1), ("/bin/busybox sleep 5", 137)] +result = {"cases": [], "max_console_command_bytes": maximum, "flash_written": False} +with D2xxPort("COM5", timeout_seconds=120) as port: + with (out / "watchdog-check.log").open("wb") as log: + def run(command, marker): + port.write(command.encode()) + buffer = bytearray() + deadline = time.monotonic() + 15 + while time.monotonic() < deadline: + data = port.read(4096) + buffer.extend(data) + log.write(data) + log.flush() + match = re.search(rb"(?:^|\n)" + marker.encode() + rb":(\d+)\r*\n", buffer) + if match: + print(buffer.decode(errors="replace")) + return int(match[1]) + raise TimeoutError("Watchdog self-check response timeout") + + for index, (program, expected) in enumerate(cases): + marker = f"WATCH_SELF_{index}" + code = run(bounded_command(program, marker, seconds=1), marker) + if code != expected: + raise ValueError(f"Wrong watchdog result: {program} {code} != {expected}") + marker = f"WATCH_REAP_{index}" + alive = run(f"kill -0 $w 2>/dev/null; printf '\\n{marker}:%s\\n' $?\n", marker) + if alive == 0: + raise ValueError("Watcher remains after explicit wait") + result["cases"].append({"program": program, "exit_code": code, + "watcher_alive_rc": alive, "expected": True}) +result["result"] = "PASS_WATCHDOG_SUCCESS_FAILURE_TIMEOUT_AND_REAP" +result["uart_latency_restored_ms"] = 16 +(out / "WATCHDOG_RESULT.json").write_text(json.dumps(result, indent=2) + "\n") diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/post_gemmini_live.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/post_gemmini_live.py new file mode 100644 index 0000000..a6fa0a4 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/diagnostics/post_gemmini_live.py @@ -0,0 +1,47 @@ +import json +from pathlib import Path +import re +import sys +import time + +root = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(root / "host")) +from ftdi_transport import D2xxPort + +out = root / "build/hardware-gemmini-20261012-4de39d38" +commands = [ + b"kill -0 \"$w\" 2>/dev/null; printf '\\nWATCHDOG_ALIVE_RC:%s\\n' \"$?\"\n", + b"while read a b c; do case \"$a\" in MemTotal:|MemAvailable:) printf '%s %s %s\\n' \"$a\" \"$b\" \"$c\";; esac; done < /proc/meminfo; printf 'LIVE_MEM_DONE\\n'\n", +] +result = {"flash_written": False, "configuration_changed": False} +with D2xxPort("COM5", timeout_seconds=120) as port: + with (out / "post-console.log").open("wb") as log: + for index, command in enumerate(commands): + port.write(command) + buffer = bytearray() + deadline = time.monotonic() + 30 + pattern = rb"(?:^|\n)WATCHDOG_ALIVE_RC:(\d+)\r*\n" if index == 0 else rb"(?:^|\n)LIVE_MEM_DONE\r*\n" + while time.monotonic() < deadline: + data = port.read(4096) + buffer.extend(data) + log.write(data) + match = re.search(pattern, buffer) + if match: + break + else: + raise TimeoutError("Post-test live console timeout") + print(buffer.decode(errors="replace")) + if index == 0: + result["watchdog_alive_rc"] = int(match[1]) + if int(match[1]) == 0: + raise ValueError("Last watchdog still running") + else: + for name in ["MemTotal", "MemAvailable"]: + match = re.search(name.encode() + rb":\s+(\d+) kB\r*\n", buffer) + if not match: + raise ValueError("Missing live memory field") + result[name + "_kib"] = int(match[1]) +result["result"] = "PASS_POST_TEST_LIVE_SHELL" +result["uart_latency_restored_ms"] = 16 +(out / "POST_RESULT.json").write_text(json.dumps(result, indent=2) + "\n") +print(json.dumps(result, indent=2)) diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/check_linux_gemmini.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/check_linux_gemmini.py new file mode 100644 index 0000000..90501b9 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/check_linux_gemmini.py @@ -0,0 +1,181 @@ +"""临时烧录已验证位流、完整读回标准镜像,运行 Linux/Gemmini 测试并归档证据。""" + +import argparse +import hashlib +import json +from pathlib import Path +import re +import shutil +import struct +import subprocess +import time +import uuid + +from ftdi_transport import D2xxPort +from load import Loader + +ROOT = Path(__file__).resolve().parents[1] +EXPECTED_BIT = "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1" + + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def bounded_command(program, marker, seconds=90): + # $! and $? produce numeric values. Wait for both children so the watcher + # cannot retain a pending job/zombie after a successful workload. + command = (f"{program} & p=$!; (sleep {seconds}; kill -KILL $p) & w=$!; " + f"wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; " + f"printf '\\n{marker}:%s\\n' $r\n") + if len(command.encode()) >= 220: + raise ValueError("Console command exceeds the RX FIFO budget") + return command + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--payload", type=Path, required=True) + parser.add_argument("--build-result", type=Path, required=True) + parser.add_argument("--bitstream", type=Path, required=True) + parser.add_argument("--vivado", type=Path, required=True) + parser.add_argument("--port", default="COM5") + parser.add_argument("--loaded-run", type=Path, + help="继续完整读回且已启动 Linux 的运行;逐个核验板上程序摘要") + args = parser.parse_args() + build = json.loads(args.build_result.read_text(encoding="utf-8")) + if build["result"] != "PASS_BUILD_NOT_HARDWARE_TESTED": + raise ValueError("Expected a verified standard-image build record") + if digest(args.payload) != build["payload_sha256"] or digest(args.bitstream) != EXPECTED_BIT: + raise ValueError("Payload or previously validated UART bitstream hash mismatch") + out = ROOT / "build" / ("hardware-gemmini-20261012-" + uuid.uuid4().hex[:8]) + out.mkdir(parents=True, exist_ok=False) + started = time.monotonic() + result = {"result": "RUNNING", "bitstream_sha256": EXPECTED_BIT, + "payload_sha256": build["payload_sha256"], "port": args.port, + "timeout_seconds": 3600, "flash_written": False, "tests": []} + try: + if args.loaded_run: + previous = json.loads((args.loaded_run / "RESULT.json").read_text(encoding="utf-8")) + boot = (args.loaded_run / "linux-console.log").read_bytes() + if (previous["bitstream_sha256"] != EXPECTED_BIT + or previous["payload_sha256"] != build["payload_sha256"] + or previous.get("ddr_readback_bytes") != build["payload_bytes"] + or b"Linux version 6.6.0" not in boot or b"~ # " not in boot + or b"Kernel panic" in boot or previous["flash_written"]): + raise ValueError("Loaded run lacks complete DDR/boot evidence") + shutil.copy2(args.loaded_run / "RESULT.json", out / "LOAD_RESULT.json") + shutil.copy2(args.loaded_run / "linux-console.log", out / "boot-console.log") + for name in ["program.log", "program.jou", "program-console.log"]: + shutil.copy2(args.loaded_run / name, out / name) + result["loaded_run"] = str(args.loaded_run.resolve()) + result["ddr_readback_bytes"] = previous["ddr_readback_bytes"] + result["ddr_transfer_seconds"] = previous["ddr_transfer_seconds"] + result["configuration_reused"] = True + print("REUSE COMPLETE_DDR_READBACK_AND_LINUX_BOOT", flush=True) + else: + with (out / "program-console.log").open("wb") as log: + subprocess.run([str(args.vivado), "-mode", "batch", "-source", + str(ROOT / "program.tcl"), "-log", str(out / "program.log"), + "-journal", str(out / "program.jou"), "-tclargs", str(args.bitstream.resolve())], + cwd=ROOT, stdout=log, stderr=subprocess.STDOUT, timeout=120, check=True) + print("PASS VOLATILE_JTAG_PROGRAM", flush=True) + data = args.payload.read_bytes() + with D2xxPort(args.port, timeout_seconds=3500) as port: + if not args.loaded_run: + loader = Loader(port) + info = loader.request(4) + if info != b"TA7\x02" + struct.pack(" 3500: + raise TimeoutError("One-hour board verification timeout") + chunk = data[offset:offset + 256] + loader.request(1, 0x80000000 + offset, len(chunk), chunk) + if loader.request(2, 0x80000000 + offset, len(chunk)) != chunk: + raise RuntimeError(f"DDR readback mismatch at {offset:#x}; CPU remains reset") + if offset % 1048576 == 0: + print(f"DDR_VERIFY {offset + len(chunk)}/{len(data)}", flush=True) + result["ddr_readback_bytes"] = len(data) + result["ddr_transfer_seconds"] = round(time.monotonic() - transfer_start, 3) + print(f"PASS FULL_DDR_READBACK bytes={len(data)} seconds={result['ddr_transfer_seconds']}", flush=True) + loader.request(3, 0x80000000) + with (out / "linux-console.log").open("wb") as log: + console = bytearray() + + def read_until(pattern, seconds): + deadline = time.monotonic() + seconds + while time.monotonic() < deadline: + block = port.read(4096) + if block: + console.extend(block) + log.write(block) + log.flush() + if b"Kernel panic" in console: + raise RuntimeError("Kernel panic; inspect raw console") + match = re.search(pattern, console) + if match: + return match + raise TimeoutError("Linux console response timeout; inspect raw transcript") + + if args.loaded_run: + marker = "WB_RESUME_" + out.name.rsplit("-", 1)[-1] + port.write(f"\nprintf '{marker}\\n'\n".encode()) + read_until(rb"(?:^|\n)" + marker.encode() + rb"\r*\n", 15) + result["workload_hashes"] = {} + for index, (name, metadata) in enumerate(build["workloads"].items()): + console.clear() + marker = f"WB_HASH_{index}" + port.write((f"/bin/busybox sha256sum /root/{name}; " + f"printf '\\n{marker}:%s\\n' \"$?\"\n").encode()) + match = read_until(rb"(?:^|\n)" + marker.encode() + rb":(\d+)\r*\n", 60) + if int(match.group(1)) or not re.search( + rb"(?:^|\n)" + metadata["sha256"].encode() + rb"\s+/root/" + + re.escape(name.encode()) + rb"\r*\n", console): + raise RuntimeError("Live rootfs workload hash mismatch: " + name) + result["workload_hashes"][name] = metadata["sha256"] + print("PASS LIVE_WORKLOAD_SHA256 " + name, flush=True) + else: + read_until(rb"~ # ", 180) + if b"Linux version 6.6.0" not in console: + raise RuntimeError("Expected real Linux 6.6.0 boot") + print("PASS LINUX_BOOT", flush=True) + commands = ["linux_system_check-linux", "gemmini_linux_check-linux"] + commands += sorted(name for name in build["workloads"] + if name not in commands) + for index, name in enumerate(commands): + console.clear() + marker = f"WB_TEST_RC_{index}" + command = bounded_command("/root/" + name, marker) + print("RUN " + name, flush=True) + port.write(command.encode()) + match = read_until(rb"(?:^|\n)" + marker.encode() + rb":(\d+)\r*\n", 120) + code = int(match.group(1)) + output = bytes(console).replace(b"\r", b"").decode(errors="replace") + item = {"name": name, "exit_code": code, "output": output} + result["tests"].append(item) + print(output, flush=True) + if code or (name == "gemmini_linux_check-linux" and "PASS GEMMINI_LINUX_CHECK cases=16" not in output): + raise RuntimeError(f"Hardware workload failed: {name} rc={code}") + if name == "linux_system_check-linux": + for label in ["VM_COPY_ON_WRITE", "VM_PAGE_PROTECTION", + "FP64_PROCESS_CONTEXT", "LINUX_TIMER", "LINUX_SYSTEM_CHECK"]: + if "PASS " + label not in output: + raise RuntimeError("Missing Linux check: " + label) + result["result"] = "PASS_LINUX_AND_GEMMINI_HARDWARE" + result["test_count"] = len(result["tests"]) + result["blocked_matmul_cases"] = 16 + except BaseException as error: + result["result"] = "FAIL" + result["error"] = str(error) + raise + finally: + result["elapsed_seconds"] = round(time.monotonic() - started, 3) + (out / "RESULT.json").write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") + print("RESULT " + str(out / "RESULT.json"), flush=True) + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/ftdi_transport.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/ftdi_transport.py new file mode 100644 index 0000000..2439f49 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/ftdi_transport.py @@ -0,0 +1,105 @@ +"""Windows UART B 的 D2XX 运输适配;关闭时恢复原延迟,不访问 JTAG A。""" + +import ctypes as c +import time + + +class D2xxPort: + def __init__(self, port, baudrate=1000000, timeout_seconds=3600): + import serial.tools.list_ports + + matches = [item for item in serial.tools.list_ports.comports() if item.device == port] + if len(matches) != 1: + raise RuntimeError("Expected exactly one selected UART port") + device = matches[0] + if (device.vid, device.pid) != (0x0403, 0x6010) or not device.serial_number.endswith("B"): + raise RuntimeError("Expected FT2232 UART B; do not use JTAG A") + self.api = c.WinDLL("C:/Windows/System32/ftd2xx.dll") + signatures = { + "FT_OpenEx": [c.c_void_p, c.c_uint32, c.POINTER(c.c_void_p)], + "FT_Close": [c.c_void_p], + "FT_GetLatencyTimer": [c.c_void_p, c.POINTER(c.c_ubyte)], + "FT_SetLatencyTimer": [c.c_void_p, c.c_ubyte], + "FT_SetBaudRate": [c.c_void_p, c.c_uint32], + "FT_SetDataCharacteristics": [c.c_void_p, c.c_ubyte, c.c_ubyte, c.c_ubyte], + "FT_SetFlowControl": [c.c_void_p, c.c_ushort, c.c_ubyte, c.c_ubyte], + "FT_SetTimeouts": [c.c_void_p, c.c_uint32, c.c_uint32], + "FT_Purge": [c.c_void_p, c.c_uint32], + "FT_Read": [c.c_void_p, c.c_void_p, c.c_uint32, c.POINTER(c.c_uint32)], + "FT_Write": [c.c_void_p, c.c_void_p, c.c_uint32, c.POINTER(c.c_uint32)], + "FT_GetQueueStatus": [c.c_void_p, c.POINTER(c.c_uint32)], + } + for name, signature in signatures.items(): + method = getattr(self.api, name) + method.argtypes = signature + method.restype = c.c_uint32 + self.handle = c.c_void_p() + self.original_latency = c.c_ubyte() + self.closed = True + self.deadline = time.monotonic() + timeout_seconds + self.call("FT_OpenEx", c.cast(c.c_char_p(device.serial_number.encode()), c.c_void_p), + 1, c.byref(self.handle)) + self.closed = False + self.latency_known = False + try: + self.call("FT_GetLatencyTimer", self.handle, c.byref(self.original_latency)) + self.latency_known = True + self.call("FT_SetLatencyTimer", self.handle, 2) + self.call("FT_SetBaudRate", self.handle, baudrate) + self.call("FT_SetDataCharacteristics", self.handle, 8, 0, 0) + self.call("FT_SetFlowControl", self.handle, 0, 0, 0) + self.call("FT_SetTimeouts", self.handle, 100, 5000) + self.call("FT_Purge", self.handle, 3) + except BaseException: + self.close() + raise + print(f"D2XX UART B {port}: latency {self.original_latency.value}->2 ms", flush=True) + + def call(self, name, *args): + status = getattr(self.api, name)(*args) + if status: + raise OSError(f"{name}: FT_STATUS {status}") + + def check_deadline(self): + if time.monotonic() > self.deadline: + raise TimeoutError("One-hour hardware-session timeout") + + def read(self, count): + self.check_deadline() + if not count: + return b"" + available = c.c_uint32() + self.call("FT_GetQueueStatus", self.handle, c.byref(available)) + size = min(count, available.value) if available.value else 1 + buffer = c.create_string_buffer(size) + received = c.c_uint32() + self.call("FT_Read", self.handle, buffer, size, c.byref(received)) + return buffer.raw[:received.value] + + def write(self, data): + self.check_deadline() + buffer = c.create_string_buffer(data) + written = c.c_uint32() + self.call("FT_Write", self.handle, buffer, len(data), c.byref(written)) + if written.value != len(data): + raise TimeoutError("D2XX short write") + return written.value + + def flush(self): + pass # FT_Write completes its synchronous USB transfer before returning. + + def close(self): + if not self.closed: + try: + if self.latency_known: + self.call("FT_SetLatencyTimer", self.handle, self.original_latency.value) + finally: + self.call("FT_Close", self.handle) + self.closed = True + print(f"D2XX closed; latency restored to {self.original_latency.value} ms", flush=True) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/load.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/load.py new file mode 100644 index 0000000..1f83575 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/host/load.py @@ -0,0 +1,103 @@ +"""Load and byte-verify a complete Toy/OpenSBI/Linux payload in DDR. + +Reset BTN0 and wait for LED0 (DDR calibration). Requires pyserial. +Example: python host/load.py --port COM5 build/board-software/fw_payload.bin +""" +import argparse +import binascii +import hashlib +from pathlib import Path +import struct +import sys +import time + + +def frame(op, sequence, address, length, data=b""): + body=struct.pack("256:raise ValueError("Invalid response size") + payload=self.read_exact(size) + checksum=struct.unpack("capacity:raise ValueError("Image exceeds reported DDR capacity") + print(f"DDR {capacity} bytes, core {clock} Hz, payload SHA256 {hashlib.sha256(data).hexdigest()}") + started=time.monotonic() + for offset in range(0,len(data),256): + chunk=data[offset:offset+256] + loader.request(1,0x80000000+offset,len(chunk),chunk) + if loader.request(2,0x80000000+offset,len(chunk))!=chunk: + raise RuntimeError(f"DDR readback mismatch at {offset:#x}; CPU remains reset") + if offset%65536==0:print(f"Verified {offset+len(chunk)}/{len(data)} bytes",flush=True) + loader.request(3,0x80000000) + print(f"Full readback passed; CPU started after {time.monotonic()-started:.1f}s. Console:") + deadline=time.monotonic()+args.console_seconds + console=bytearray() + command_sent=False + linux_passed=False + checks=(b"PASS VM_COPY_ON_WRITE",b"PASS VM_PAGE_PROTECTION",b"PASS FP64_PROCESS_CONTEXT", + b"PASS LINUX_TIMER",b"PASS LINUX_SYSTEM_CHECK") + with args.transcript.open("wb") as log: + while time.monotonic() 3650: + channel.close() + raise TimeoutError("One-hour software build timeout") + if channel.recv_ready(): + data = channel.recv(65536) + log.write(data) + log.flush() + print(data.decode(errors="replace"), end="", flush=True) + else: + time.sleep(0.1) + code = channel.recv_exit_status() + (out / "SESSION.json").write_text(json.dumps({"remote": remote, "exit_code": code, + "timeout_seconds": 3600, "elapsed_seconds": round(time.monotonic() - started, 3)}, indent=2) + "\n") + if code: + raise RuntimeError(f"Remote build failed with exit {code}; see {out / 'build.log'}") + for filename in ["build/LINUX_GEMMINI_BUILD.json", "build/board-software/fw_payload.bin", + "build/board-software/RESULT.json"]: + destination = out / Path(filename).name + sftp.get(remote + "/" + filename, str(destination)) + sftp.close() + print("DOWNLOADED " + str(out), flush=True) + finally: + client.close() + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/scripts/verify_linux_gemmini.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/scripts/verify_linux_gemmini.py new file mode 100644 index 0000000..d068a07 --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/scripts/verify_linux_gemmini.py @@ -0,0 +1,121 @@ +"""离线核验标准镜像与实物日志;仅从实际 PASS 行汇总计算耗时。""" + +import argparse +import hashlib +import json +from pathlib import Path +import re + +ROOT = Path(__file__).resolve().parents[1] +SHAPES = [(8, 8, 8), (16, 16, 16), (13, 11, 17), (8, 24, 8)] +CHECKS = [ + "VM_COPY_ON_WRITE", + "VM_PAGE_PROTECTION", + "FP64_PROCESS_CONTEXT", + "LINUX_TIMER", + "LINUX_SYSTEM_CHECK", +] + + +def read(path): + return json.loads(path.read_text(encoding="utf-8")) + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--build-record", type=Path, required=True) + parser.add_argument("--hardware-result", type=Path, required=True) + parser.add_argument("--output", type=Path) + args = parser.parse_args() + build = read(args.build_record) + result = read(args.hardware_result) + original = read(ROOT / "evidence/2026-10-11/BOARD_RESULT.json") + require(build["result"] == "PASS_BUILD_NOT_HARDWARE_TESTED", "Build did not pass") + require(result["result"] == "PASS_LINUX_AND_GEMMINI_HARDWARE", "Hardware did not pass") + require(result["bitstream_sha256"] == original["bitstream_sha256"], "Wrong bitstream") + require(result["payload_sha256"] == build["payload_sha256"], "Payload mismatch") + require(result["ddr_readback_bytes"] == build["payload_bytes"], "Incomplete DDR readback") + require(not result["flash_written"], "Expected temporary deployment") + require(result["elapsed_seconds"] < result["timeout_seconds"] == 3600, "Invalid timeout") + require(len(result["tests"]) == result["test_count"] == 15, "Expected 15 workloads") + tests = {item["name"]: item for item in result["tests"]} + require(set(tests) == set(build["workloads"]), "Workload set mismatch") + raw = (args.hardware_result.parent / "linux-console.log").read_bytes() + console = raw.replace(b"\r", b"").decode(errors="replace") + boot_file = args.hardware_result.parent / "boot-console.log" + boot = boot_file.read_bytes().decode(errors="replace") if boot_file.is_file() else console + require("OpenSBI v1.9" in boot and "Linux version 6.6.0" in boot, "Wrong boot") + if result.get("configuration_reused"): + load = read(args.hardware_result.parent / "LOAD_RESULT.json") + require(load["payload_sha256"] == build["payload_sha256"] + and load["bitstream_sha256"] == result["bitstream_sha256"] + and load["ddr_readback_bytes"] == build["payload_bytes"], "Wrong prior load") + expected_hashes = {name: item["sha256"] for name, item in build["workloads"].items()} + require(result["workload_hashes"] == expected_hashes, "Live workload hash mismatch") + for name, expected in expected_hashes.items(): + require(re.search(rf"^{expected}\s+/root/{re.escape(name)}$", + console, re.MULTILINE), "Missing raw live hash: " + name) + require("Kernel panic" not in console, "Kernel panic in transcript") + for index, item in enumerate(result["tests"]): + require(item["exit_code"] == 0, "Failed workload: " + item["name"]) + require(item["output"] in console, "Structured output differs from raw transcript") + require(re.search(rf"^WB_TEST_RC_{index}:0$", console, re.MULTILINE), + "Missing raw process return code: " + item["name"]) + for label in CHECKS: + require("PASS " + label in tests["linux_system_check-linux"]["output"], label) + sources = ROOT / "tests/reference/examples/balls/gemmini/workloads/ctests" + for source in sources.glob("*.c"): + output = tests[source.stem + "-linux"]["output"] + markers = re.findall(r'printf\("([^"\n]* PASSED)\\n"\)', + source.read_text(encoding="utf-8")) + require(len(markers) == 1 and markers[0] in output, "Missing oracle: " + source.name) + require(markers[0] in console, "Missing raw oracle: " + source.name) + output = tests["gemmini_linux_check-linux"]["output"] + pattern = (r"^PASS GEMMINI_CASE id=(\d+) mode=(OS|WS) m=(\d+) n=(\d+) k=(\d+) " + r"cpu_ns=(\d+) accelerator_end_to_end_ns=(\d+)$") + rows = re.findall(pattern, output, re.MULTILINE) + require(len(rows) == result["blocked_matmul_cases"] == 16, "Missing matrix cases") + measurements = [] + for index, row in enumerate(rows): + case, mode, m, n, k, cpu, accelerator = row + shape = tuple(map(int, (m, n, k))) + require(int(case) == index + 1 and shape == SHAPES[(index % 8) // 2] + and mode == ("WS" if index % 2 else "OS"), "Wrong case order/shape") + require(int(cpu) > 0 and int(accelerator) > 0, "Unusable timing sample") + require("PASS GEMMINI_CASE " + " ".join([ + f"id={case}", f"mode={mode}", f"m={m}", f"n={n}", f"k={k}", + f"cpu_ns={cpu}", f"accelerator_end_to_end_ns={accelerator}", + ]) in console, "Missing raw matrix result") + measurements.append({ + "case": int(case), "mode": mode, "m": int(m), "n": int(n), "k": int(k), + "cpu_ns": int(cpu), "accelerator_end_to_end_ns": int(accelerator), + "cpu_over_accelerator": round(int(cpu) / int(accelerator), 4), + }) + require("PASS GEMMINI_LINUX_CHECK cases=16" in output, "Missing final oracle") + require("PASS GEMMINI_LINUX_CHECK cases=16" in console, "Missing raw final oracle") + summary = { + "result": "PASS_OFFLINE_VERIFICATION", + "console_sha256": hashlib.sha256(raw).hexdigest(), + "payload_sha256": build["payload_sha256"], + "matrix_measurements": measurements, + "timing_scope": "分块、DMA、配置、同步和 CPU 跨 K 累加;不是纯 MAC 延迟", + "model_end_to_end_tested": False, + } + if args.output: + args.output.write_text(json.dumps(summary, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8") + print("PASS offline verification: 15 workloads, five Linux checks, 16 matrix cases") + for item in measurements: + print(f"CASE {item['case']:2} {item['mode']} {item['m']}x{item['n']}x{item['k']} " + f"CPU={item['cpu_ns'] / 1e6:.3f}ms " + f"accelerator={item['accelerator_end_to_end_ns'] / 1e6:.3f}ms " + f"CPU/accelerator={item['cpu_over_accelerator']:.4f}") + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/build_gemmini_image.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/build_gemmini_image.py new file mode 100644 index 0000000..678e72a --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/build_gemmini_image.py @@ -0,0 +1,82 @@ +"""在全新隔离目录按原 bbkernel 流程构建 Linux/Gemmini 测试镜像。""" + +import argparse +import hashlib +import json +import os +from pathlib import Path +import shutil +import subprocess +import time + +ROOT = Path(__file__).resolve().parents[1] + + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--cache-base", type=Path, required=True) + parser.add_argument("--sdk", type=Path, required=True) + args = parser.parse_args() + started = time.monotonic() + baseline = json.loads((ROOT / "SOFTWARE_BASELINE.json").read_text()) + cache = ROOT / "build/downloads" + cache.mkdir(parents=True, exist_ok=True) + for name, commit in baseline.items(): + filename = f"{name}-{commit}.tar.gz" + source = args.cache_base / "build/downloads" / filename + target = cache / filename + if source.is_file() and not target.exists(): + shutil.copy2(source, target) + print(f"CACHE {name} {digest(target)}", flush=True) + environment = os.environ.copy() + environment["PATH"] = str(args.sdk / "bin") + ":" + environment["PATH"] + + def run(command, timeout): + print("RUN " + " ".join(map(str, command)), flush=True) + subprocess.run(list(map(str, command)), cwd=ROOT, env=environment, + timeout=timeout, check=True) + + run(["python3", "software/prepare_gemmini_linux.py"], 60) + run(["cmake", "-S", "build/linux-gemmini", "-B", "build/linux-gemmini-build", + "-DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc"], 60) + run(["cmake", "--build", "build/linux-gemmini-build", "-j8"], 180) + workloads = ROOT / "build/software/bb-tests/output/workloads" + run(["cmake", "--install", "build/linux-gemmini-build", "--prefix", workloads], 60) + # Existing entry installs the Linux system check, builds rootfs and Linux, + # and packages the original OpenSBI firmware. No alternate runtime uploader. + run(["bash", "software/build.sh"], 2400) + run(["python3", "scripts/build_board_firmware.py", + "--cross-compile", "riscv64-unknown-linux-gnu-"], 300) + payload = ROOT / "build/board-software/fw_payload.bin" + prepared = json.loads((ROOT / "build/linux-gemmini/PREPARED.json").read_text()) + installed = sorted(workloads.glob("*-linux")) + rootfs = ROOT / "build/software/kernel-build/rootfs/root" + if len(installed) != 15: + raise RuntimeError(f"Expected 15 workloads, got {len(installed)}") + for path in installed: + if digest(path) != digest(rootfs / path.name): + raise RuntimeError(f"Rootfs workload mismatch: {path.name}") + result = { + "result": "PASS_BUILD_NOT_HARDWARE_TESTED", + "elapsed_seconds": round(time.monotonic() - started, 3), + "software_baseline": baseline, + "profile": prepared["profile"], + "payload_bytes": payload.stat().st_size, + "payload_sha256": digest(payload), + "workloads": {path.name: {"bytes": path.stat().st_size, "sha256": digest(path)} + for path in installed}, + "rootfs_install_verified": True, + "flash_modified": False, + "hardware_gemmini_tested": False, + "model_end_to_end_tested": False, + } + (ROOT / "build/LINUX_GEMMINI_BUILD.json").write_text(json.dumps(result, indent=2) + "\n") + print(json.dumps(result, indent=2), flush=True) + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/gemmini_linux_check.c b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/gemmini_linux_check.c new file mode 100644 index 0000000..1f6fa7d --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/gemmini_linux_check.c @@ -0,0 +1,132 @@ +// Linux workload for the actual 8x8 profile; use the pinned upstream ISA and DMA library. +#define _GNU_SOURCE +#include "buckyball.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if GEMMINI_DIM != 8 || BANK_WIDTH != 64 +#error This workload requires the emitted Toy FPGA 8x8 / 64-bit bank profile. +#endif + +enum { TILE = 8, MAX_DIM = 24 }; +static elem_t tile_a[TILE * TILE] __attribute__((aligned(64))); +static elem_t tile_b[TILE * TILE] __attribute__((aligned(64))); +static elem_t tile_zero[TILE * TILE] __attribute__((aligned(64))); +static result_t tile_c[TILE * TILE] __attribute__((aligned(64))); +static elem_t matrix_a[MAX_DIM * MAX_DIM], matrix_b[MAX_DIM * MAX_DIM]; +static result_t expected[MAX_DIM * MAX_DIM], observed[MAX_DIM * MAX_DIM]; + +static uint64_t nanoseconds(void) { + struct timespec value; + if (clock_gettime(CLOCK_MONOTONIC, &value)) { + perror("clock_gettime"); + exit(2); + } + return (uint64_t)value.tv_sec * 1000000000ULL + value.tv_nsec; +} + +static void gemmini_tile(unsigned ws) { + // 8-byte bank rows: INT8 uses one group, INT32 output uses four groups. + bb_mem_alloc(0, 1, 1); + bb_mem_alloc(1, 1, 1); + bb_mem_alloc(2, 1, 4); + bb_mem_alloc(3, 1, 1); + bb_mvin((uintptr_t)tile_a, 0, TILE, 1); + bb_mvin((uintptr_t)tile_b, 1, TILE, 1); + bb_mvin((uintptr_t)tile_zero, 3, TILE, 1); + bb_gemmini_config(ws, 0, 0, 0, 0); + bb_gemmini_preload(ws ? 1 : 3, 2, TILE, 0, 0); + bb_gemmini_compute_preloaded(0, ws ? 3 : 1, 2, TILE, 0, 0, 0); + bb_mvout((uintptr_t)tile_c, 2, TILE, 1); + bb_fence(); + for (unsigned bank = 0; bank < 4; ++bank) + bb_mem_release(bank); +} + +static void cpu_reference(unsigned m, unsigned n, unsigned k) { + for (unsigned row = 0; row < m; ++row) + for (unsigned col = 0; col < n; ++col) { + int32_t sum = 0; + for (unsigned inner = 0; inner < k; ++inner) + sum += (int32_t)matrix_a[row * k + inner] * matrix_b[inner * n + col]; + expected[row * n + col] = sum; + } +} + +static void blocked_matmul(unsigned m, unsigned n, unsigned k, unsigned ws) { + memset(observed, 0, sizeof(observed)); + for (unsigned row = 0; row < m; row += TILE) + for (unsigned col = 0; col < n; col += TILE) + for (unsigned inner = 0; inner < k; inner += TILE) { + memset(tile_a, 0, sizeof(tile_a)); + memset(tile_b, 0, sizeof(tile_b)); + memset(tile_zero, 0, sizeof(tile_zero)); + // Explicit writes give the DMA destination a private writable page. + memset(tile_c, 0, sizeof(tile_c)); + for (unsigned i = 0; i < TILE; ++i) + for (unsigned j = 0; j < TILE; ++j) { + if (row + i < m && inner + j < k) + tile_a[i * TILE + j] = matrix_a[(row + i) * k + inner + j]; + if (inner + i < k && col + j < n) + tile_b[i * TILE + j] = matrix_b[(inner + i) * n + col + j]; + } + gemmini_tile(ws); + for (unsigned i = 0; i < TILE && row + i < m; ++i) + for (unsigned j = 0; j < TILE && col + j < n; ++j) + observed[(row + i) * n + col + j] += tile_c[i * TILE + j]; + } +} + +static int check_case(unsigned id, unsigned m, unsigned n, unsigned k, unsigned ws) { + // Small bounded values keep the independent INT32 oracle free of overflow. + for (unsigned i = 0; i < m * k; ++i) + matrix_a[i] = (int)((i * 7 + id * 3) % 19) - 9; + for (unsigned i = 0; i < k * n; ++i) + matrix_b[i] = (int)((i * 11 + id * 5) % 23) - 11; + printf("BEGIN GEMMINI_CASE id=%u mode=%s m=%u n=%u k=%u\n", + id, ws ? "WS" : "OS", m, n, k); + alarm(60); + uint64_t start = nanoseconds(); + cpu_reference(m, n, k); + uint64_t cpu_ns = nanoseconds() - start; + start = nanoseconds(); + blocked_matmul(m, n, k, ws); + uint64_t accelerator_ns = nanoseconds() - start; + alarm(0); + for (unsigned i = 0; i < m * n; ++i) + if (observed[i] != expected[i]) { + printf("FAIL GEMMINI_CASE id=%u row=%u col=%u got=%d expected=%d\n", + id, i / n, i % n, observed[i], expected[i]); + return 1; + } + printf("PASS GEMMINI_CASE id=%u mode=%s m=%u n=%u k=%u cpu_ns=%llu " + "accelerator_end_to_end_ns=%llu\n", id, ws ? "WS" : "OS", m, n, k, + (unsigned long long)cpu_ns, (unsigned long long)accelerator_ns); + return 0; +} + +int main(void) { + setvbuf(stdout, NULL, _IONBF, 0); + printf("BEGIN GEMMINI_LINUX_CHECK pid=%ld dimension=%d bank_width=%d\n", + (long)getpid(), GEMMINI_DIM, BANK_WIDTH); + if (mlockall(MCL_CURRENT | MCL_FUTURE)) + printf("INFO MLOCKALL errno=%d; buffers are explicitly faulted in\n", errno); + unsigned id = 0; + const unsigned shapes[][3] = {{8, 8, 8}, {16, 16, 16}, {13, 11, 17}, {8, 24, 8}}; + for (unsigned repeat = 0; repeat < 2; ++repeat) + for (unsigned shape = 0; shape < sizeof(shapes) / sizeof(shapes[0]); ++shape) + for (unsigned ws = 0; ws < 2; ++ws) + if (check_case(++id, shapes[shape][0], shapes[shape][1], shapes[shape][2], ws)) + return 1; + printf("PASS GEMMINI_LINUX_CHECK cases=%u\n", id); + return 0; +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/prepare_gemmini_linux.py b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/prepare_gemmini_linux.py new file mode 100644 index 0000000..267558b --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/sources/software/prepare_gemmini_linux.py @@ -0,0 +1,91 @@ +"""生成匹配实际 8×8 核心的 Linux 测试构建输入,不执行编译。""" + +import argparse +import hashlib +import json +from pathlib import Path +import shutil + +ROOT = Path(__file__).resolve().parents[1] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--profile", type=Path, + default=ROOT / "evidence/2026-10-11/ToyLinuxChip.profile.json") + parser.add_argument("--output", type=Path, default=ROOT / "build/linux-gemmini") + args = parser.parse_args() + profile = json.loads(args.profile.read_text(encoding="utf-8")) + expected = {"gemmini_rows": 8, "gemmini_columns": 8, "bank_width": 64, + "bank_count": 8, "virtual_bank_count": 16, "bank_rows": 1024} + for key, value in expected.items(): + if profile[key] != value: + raise ValueError(f"Wrong hardware profile: {key}={profile[key]}, expected {value}") + reference = ROOT / "tests/reference" + manifest = json.loads((ROOT / "tests/REFERENCE_MANIFEST.json").read_text(encoding="utf-8")) + for name, digest in manifest["files"].items(): + if hashlib.sha256((reference / name).read_bytes()).hexdigest() != digest: + raise ValueError(f"Changed pinned reference: {name}") + out = args.output.resolve() + if out == ROOT or out in ROOT.parents: + raise ValueError("Output must not replace the source directory") + out.mkdir(parents=True, exist_ok=True) + shutil.copytree(reference, out / "reference", dirs_exist_ok=True) + shutil.copy2(ROOT / "software/gemmini_linux_check.c", out / "gemmini_linux_check.c") + (out / "params.h").write_text( + "#define BANK_WIDTH 64\n#define PHYSICAL_BANK_NUM 8\n" + "#define VIRTUAL_BANK_NUM 16\n#define BANK_ENTRIES 1024\n#define GEMMINI_DIM 8\n", + encoding="utf-8") + # Preserve the exact pinned Gemmini instruction encodings; do not use + # upstream Berkeley Gemmini binaries with this Buckyball instruction ABI. + names = {2: "CONFIG", 3: "FLUSH", 53: "PRELOAD", 66: "COMPUTE_PRELOADED", + 67: "COMPUTE_ACCUMULATED", 80: "LOOP_WS_CONFIG_BOUNDS", + 81: "LOOP_WS_CONFIG_ADDR_A", 82: "LOOP_WS_CONFIG_ADDR_B", + 83: "LOOP_WS_CONFIG_ADDR_D", 84: "LOOP_WS_CONFIG_ADDR_C", + 85: "LOOP_WS_CONFIG_STRIDES_AB", 86: "LOOP_WS_CONFIG_STRIDES_DC", + 87: "LOOP_WS"} + names.update({95 + index: f"LOOP_CONV_WS_CONFIG_{index}" for index in range(1, 10)}) + names[105] = "LOOP_CONV_WS" + if set(names) != set(profile["ball_funct7"]): + raise ValueError("Instruction definitions do not match the emitted profile") + (out / "ballISA.h").write_text("\n".join( + f"#define BB_FUNC7_GEMMINI_{name} {number}" for number, name in names.items()) + "\n", + encoding="utf-8") + sources = [] + for index, original in enumerate(sorted((reference / "examples/balls/gemmini/workloads/ctests").glob("*.c")), 1): + data = original.read_text(encoding="utf-8") + if data.count("#define DIM 16") != 1: + raise ValueError(f"Unexpected test dimension: {original}") + target = out / (original.stem + ".c") + target.write_text(data.replace("#define DIM 16", "#define DIM 8"), encoding="utf-8") + sources.append(target.name) + cmake = '''cmake_minimum_required(VERSION 3.22) +project(ToyLinuxGemmini C) +set(CMAKE_C_STANDARD 11) +add_compile_options(-march=rv64gc -mabi=lp64d -O2 -Wall -Wextra -Werror -ffp-contract=off) +add_link_options(-static) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + reference/bb-tests/workloads/lib reference/examples/balls/gemmini/workloads) +add_library(bb_reference STATIC reference/bb-tests/workloads/lib/buckyball.c + reference/bb-tests/workloads/lib/bbhw/mem/mem.c + reference/bb-tests/workloads/lib/bbhw/isa/isa.c) +set(workloads gemmini_linux_check-linux) +add_executable(gemmini_linux_check-linux gemmini_linux_check.c) +target_link_libraries(gemmini_linux_check-linux PRIVATE bb_reference m) +''' + for name in sources: + target = Path(name).stem + "-linux" + cmake += f"add_executable({target} {name})\ntarget_link_libraries({target} PRIVATE bb_reference m)\nlist(APPEND workloads {target})\n" + cmake += "install(TARGETS ${workloads} RUNTIME DESTINATION .)\n" + (out / "CMakeLists.txt").write_text(cmake, encoding="utf-8") + (out / "PREPARED.json").write_text(json.dumps({ + "result": "PREPARED_NOT_BUILT", "dimension": 8, + "reference_commit": manifest["commit"], "original_cases": sources, + "new_blocked_matmul_cases": 16, "profile": expected, + "model_end_to_end_tested": False, + }, indent=2) + "\n", encoding="utf-8") + print(f"Prepared {len(sources)} pinned cases and one blocked-matmul workload in {out}") + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/RESULT.json b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/RESULT.json new file mode 100644 index 0000000..dfcfeff --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/RESULT.json @@ -0,0 +1,26 @@ +{ + "cases": [ + { + "program": "/bin/busybox true", + "exit_code": 0, + "watcher_alive_rc": 1, + "expected": true + }, + { + "program": "/bin/busybox false", + "exit_code": 1, + "watcher_alive_rc": 1, + "expected": true + }, + { + "program": "/bin/busybox sleep 5", + "exit_code": 137, + "watcher_alive_rc": 1, + "expected": true + } + ], + "max_console_command_bytes": 177, + "flash_written": false, + "result": "PASS_WATCHDOG_SUCCESS_FAILURE_TIMEOUT_AND_REAP", + "uart_latency_restored_ms": 16 +} diff --git a/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/check.log b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/check.log new file mode 100644 index 0000000..8aa436b --- /dev/null +++ b/platforms/arty-a7-toy/evidence/2026-10-12/linux-gemmini/watchdog/check.log @@ -0,0 +1,22 @@ +/bin/busybox true & p=$!; (sleep 1; kill -KILL $p) & w=$!; wait $p; r=$?; ki +ll $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWATCH_SELF_0:%s\n' $r + +WATCH_SELF_0:0 +~ # kill -0 $w 2>/dev/null; printf '\nWATCH_REAP_0:%s\n' $? + +WATCH_REAP_0:1 +~ # /bin/busybox false & p=$!; (sleep 1; kill -KILL $p) & w=$!; wait $p; r=$?; k +ill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWATCH_SELF_1:%s\n' $r + +WATCH_SELF_1:1 +~ # kill -0 $w 2>/dev/null; printf '\nWATCH_REAP_1:%s\n' $? + +WATCH_REAP_1:1 +~ # /bin/busybox sleep 5 & p=$!; (sleep 1; kill -KILL $p) & w=$!; wait $p; r=$?; + kill $w 2>/dev/null; wait $w 2>/dev/null; printf '\nWATCH_SELF_2:%s\n' $r +Killed + +WATCH_SELF_2:137 +~ # kill -0 $w 2>/dev/null; printf '\nWATCH_REAP_2:%s\n' $? + +WATCH_REAP_2:1 diff --git a/platforms/arty-a7-toy/host/check_linux_gemmini.py b/platforms/arty-a7-toy/host/check_linux_gemmini.py new file mode 100644 index 0000000..01619cd --- /dev/null +++ b/platforms/arty-a7-toy/host/check_linux_gemmini.py @@ -0,0 +1,186 @@ +"""临时烧录已验证位流、完整读回标准镜像,运行 Linux/Gemmini 测试并归档证据。""" + +import argparse +import hashlib +import json +from pathlib import Path +import re +import shutil +import struct +import subprocess +import time +import uuid + +from ftdi_transport import D2xxPort +from load import Loader + +ROOT = Path(__file__).resolve().parents[1] +EXPECTED_BIT = "ccc33c511e613561fb9dd1e9c847bd3b84037da1d078c44cd3de197d55dffde1" + + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def bounded_command(program, marker, seconds=90): + # $! and $? produce numeric values. Wait for both children so the watcher + # cannot retain a pending job/zombie after a successful workload. + command = (f"{program} & p=$!; (sleep {seconds}; kill -KILL $p) & w=$!; " + f"wait $p; r=$?; kill $w 2>/dev/null; wait $w 2>/dev/null; " + f"printf '\\n{marker}:%s\\n' $r\n") + if len(command.encode()) >= 220: + raise ValueError("Console command exceeds the RX FIFO budget") + return command + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--payload", type=Path, required=True) + parser.add_argument("--build-result", type=Path, required=True) + parser.add_argument("--bitstream", type=Path, required=True) + parser.add_argument("--vivado", type=Path, required=True) + parser.add_argument("--port", default="COM5") + parser.add_argument("--expected-bit-sha256", default=EXPECTED_BIT, + help="重建 UART 位流后,填写已通过实现检查的位流 SHA256") + parser.add_argument("--loaded-run", type=Path, + help="继续完整读回且已启动 Linux 的运行;逐个核验板上程序摘要") + args = parser.parse_args() + build = json.loads(args.build_result.read_text(encoding="utf-8")) + if build["result"] != "PASS_BUILD_NOT_HARDWARE_TESTED": + raise ValueError("Expected a verified standard-image build record") + expected_bit = args.expected_bit_sha256.lower() + if not re.fullmatch(r"[0-9a-f]{64}", expected_bit): + raise ValueError("Expected an explicit 64-digit bitstream SHA256") + if digest(args.payload) != build["payload_sha256"] or digest(args.bitstream) != expected_bit: + raise ValueError("Payload or previously validated UART bitstream hash mismatch") + out = ROOT / "build" / ("hardware-gemmini-" + time.strftime("%Y%m%d") + "-" + uuid.uuid4().hex[:8]) + out.mkdir(parents=True, exist_ok=False) + started = time.monotonic() + result = {"result": "RUNNING", "bitstream_sha256": expected_bit, + "payload_sha256": build["payload_sha256"], "port": args.port, + "timeout_seconds": 3600, "flash_written": False, "tests": []} + try: + if args.loaded_run: + previous = json.loads((args.loaded_run / "RESULT.json").read_text(encoding="utf-8")) + boot = (args.loaded_run / "linux-console.log").read_bytes() + if (previous["bitstream_sha256"] != expected_bit + or previous["payload_sha256"] != build["payload_sha256"] + or previous.get("ddr_readback_bytes") != build["payload_bytes"] + or b"Linux version 6.6.0" not in boot or b"~ # " not in boot + or b"Kernel panic" in boot or previous["flash_written"]): + raise ValueError("Loaded run lacks complete DDR/boot evidence") + shutil.copy2(args.loaded_run / "RESULT.json", out / "LOAD_RESULT.json") + shutil.copy2(args.loaded_run / "linux-console.log", out / "boot-console.log") + for name in ["program.log", "program.jou", "program-console.log"]: + shutil.copy2(args.loaded_run / name, out / name) + result["loaded_run"] = str(args.loaded_run.resolve()) + result["ddr_readback_bytes"] = previous["ddr_readback_bytes"] + result["ddr_transfer_seconds"] = previous["ddr_transfer_seconds"] + result["configuration_reused"] = True + print("REUSE COMPLETE_DDR_READBACK_AND_LINUX_BOOT", flush=True) + else: + with (out / "program-console.log").open("wb") as log: + subprocess.run([str(args.vivado), "-mode", "batch", "-source", + str(ROOT / "program.tcl"), "-log", str(out / "program.log"), + "-journal", str(out / "program.jou"), "-tclargs", str(args.bitstream.resolve())], + cwd=ROOT, stdout=log, stderr=subprocess.STDOUT, timeout=120, check=True) + print("PASS VOLATILE_JTAG_PROGRAM", flush=True) + data = args.payload.read_bytes() + with D2xxPort(args.port, timeout_seconds=3500) as port: + if not args.loaded_run: + loader = Loader(port) + info = loader.request(4) + if info != b"TA7\x02" + struct.pack(" 3500: + raise TimeoutError("One-hour board verification timeout") + chunk = data[offset:offset + 256] + loader.request(1, 0x80000000 + offset, len(chunk), chunk) + if loader.request(2, 0x80000000 + offset, len(chunk)) != chunk: + raise RuntimeError(f"DDR readback mismatch at {offset:#x}; CPU remains reset") + if offset % 1048576 == 0: + print(f"DDR_VERIFY {offset + len(chunk)}/{len(data)}", flush=True) + result["ddr_readback_bytes"] = len(data) + result["ddr_transfer_seconds"] = round(time.monotonic() - transfer_start, 3) + print(f"PASS FULL_DDR_READBACK bytes={len(data)} seconds={result['ddr_transfer_seconds']}", flush=True) + loader.request(3, 0x80000000) + with (out / "linux-console.log").open("wb") as log: + console = bytearray() + + def read_until(pattern, seconds): + deadline = time.monotonic() + seconds + while time.monotonic() < deadline: + block = port.read(4096) + if block: + console.extend(block) + log.write(block) + log.flush() + if b"Kernel panic" in console: + raise RuntimeError("Kernel panic; inspect raw console") + match = re.search(pattern, console) + if match: + return match + raise TimeoutError("Linux console response timeout; inspect raw transcript") + + if args.loaded_run: + marker = "WB_RESUME_" + out.name.rsplit("-", 1)[-1] + port.write(f"\nprintf '{marker}\\n'\n".encode()) + read_until(rb"(?:^|\n)" + marker.encode() + rb"\r*\n", 15) + result["workload_hashes"] = {} + for index, (name, metadata) in enumerate(build["workloads"].items()): + console.clear() + marker = f"WB_HASH_{index}" + port.write((f"/bin/busybox sha256sum /root/{name}; " + f"printf '\\n{marker}:%s\\n' \"$?\"\n").encode()) + match = read_until(rb"(?:^|\n)" + marker.encode() + rb":(\d+)\r*\n", 60) + if int(match.group(1)) or not re.search( + rb"(?:^|\n)" + metadata["sha256"].encode() + rb"\s+/root/" + + re.escape(name.encode()) + rb"\r*\n", console): + raise RuntimeError("Live rootfs workload hash mismatch: " + name) + result["workload_hashes"][name] = metadata["sha256"] + print("PASS LIVE_WORKLOAD_SHA256 " + name, flush=True) + else: + read_until(rb"~ # ", 180) + if b"Linux version 6.6.0" not in console: + raise RuntimeError("Expected real Linux 6.6.0 boot") + print("PASS LINUX_BOOT", flush=True) + commands = ["linux_system_check-linux", "gemmini_linux_check-linux"] + commands += sorted(name for name in build["workloads"] + if name not in commands) + for index, name in enumerate(commands): + console.clear() + marker = f"WB_TEST_RC_{index}" + command = bounded_command("/root/" + name, marker) + print("RUN " + name, flush=True) + port.write(command.encode()) + match = read_until(rb"(?:^|\n)" + marker.encode() + rb":(\d+)\r*\n", 120) + code = int(match.group(1)) + output = bytes(console).replace(b"\r", b"").decode(errors="replace") + item = {"name": name, "exit_code": code, "output": output} + result["tests"].append(item) + print(output, flush=True) + if code or (name == "gemmini_linux_check-linux" and "PASS GEMMINI_LINUX_CHECK cases=16" not in output): + raise RuntimeError(f"Hardware workload failed: {name} rc={code}") + if name == "linux_system_check-linux": + for label in ["VM_COPY_ON_WRITE", "VM_PAGE_PROTECTION", + "FP64_PROCESS_CONTEXT", "LINUX_TIMER", "LINUX_SYSTEM_CHECK"]: + if "PASS " + label not in output: + raise RuntimeError("Missing Linux check: " + label) + result["result"] = "PASS_LINUX_AND_GEMMINI_HARDWARE" + result["test_count"] = len(result["tests"]) + result["blocked_matmul_cases"] = 16 + except BaseException as error: + result["result"] = "FAIL" + result["error"] = str(error) + raise + finally: + result["elapsed_seconds"] = round(time.monotonic() - started, 3) + (out / "RESULT.json").write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") + print("RESULT " + str(out / "RESULT.json"), flush=True) + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/host/check_watchdog.py b/platforms/arty-a7-toy/host/check_watchdog.py new file mode 100644 index 0000000..eaa947c --- /dev/null +++ b/platforms/arty-a7-toy/host/check_watchdog.py @@ -0,0 +1,69 @@ +"""在已启动的 Linux 控制台验证正常退出、非零退出、超时及 watcher 回收。""" + +import argparse +import json +from pathlib import Path +import re +import time +import uuid + +from check_linux_gemmini import bounded_command +from ftdi_transport import D2xxPort + +ROOT = Path(__file__).resolve().parents[1] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--port", default="COM5") + parser.add_argument("--output", type=Path) + args = parser.parse_args() + out = args.output or ROOT / "build" / ( + "watchdog-" + time.strftime("%Y%m%d") + "-" + uuid.uuid4().hex[:8] + ) + out.mkdir(parents=True, exist_ok=False) + cases = [("/bin/busybox true", 0), ("/bin/busybox false", 1), + ("/bin/busybox sleep 5", 137)] + result = {"result": "RUNNING", "cases": [], "flash_written": False} + try: + with D2xxPort(args.port, timeout_seconds=120) as port: + with (out / "check.log").open("wb") as log: + def run(command, marker): + port.write(command.encode()) + buffer = bytearray() + deadline = time.monotonic() + 15 + while time.monotonic() < deadline: + block = port.read(4096) + buffer.extend(block) + log.write(block) + log.flush() + match = re.search(rb"(?:^|\n)" + marker.encode() + + rb":(\d+)\r*\n", buffer) + if match: + return int(match[1]) + raise TimeoutError("Watchdog check response timeout") + + for index, (program, expected) in enumerate(cases): + marker = f"WATCH_SELF_{index}" + code = run(bounded_command(program, marker, seconds=1), marker) + if code != expected: + raise RuntimeError(f"{program}: exit {code}, expected {expected}") + marker = f"WATCH_REAP_{index}" + alive = run(f"kill -0 $w 2>/dev/null; " + f"printf '\\n{marker}:%s\\n' $?\n", marker) + if alive == 0: + raise RuntimeError("Watcher remains after explicit wait") + result["cases"].append({"program": program, "exit_code": code, + "watcher_alive_rc": alive, "expected": True}) + print(f"PASS watchdog case={index} exit={code} watcher_reaped=True") + result["result"] = "PASS_WATCHDOG_SUCCESS_FAILURE_TIMEOUT_AND_REAP" + except BaseException as error: + result.update(result="FAIL", error=str(error)) + raise + finally: + (out / "RESULT.json").write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") + print("RESULT " + str(out / "RESULT.json")) + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/host/ftdi_transport.py b/platforms/arty-a7-toy/host/ftdi_transport.py new file mode 100644 index 0000000..2439f49 --- /dev/null +++ b/platforms/arty-a7-toy/host/ftdi_transport.py @@ -0,0 +1,105 @@ +"""Windows UART B 的 D2XX 运输适配;关闭时恢复原延迟,不访问 JTAG A。""" + +import ctypes as c +import time + + +class D2xxPort: + def __init__(self, port, baudrate=1000000, timeout_seconds=3600): + import serial.tools.list_ports + + matches = [item for item in serial.tools.list_ports.comports() if item.device == port] + if len(matches) != 1: + raise RuntimeError("Expected exactly one selected UART port") + device = matches[0] + if (device.vid, device.pid) != (0x0403, 0x6010) or not device.serial_number.endswith("B"): + raise RuntimeError("Expected FT2232 UART B; do not use JTAG A") + self.api = c.WinDLL("C:/Windows/System32/ftd2xx.dll") + signatures = { + "FT_OpenEx": [c.c_void_p, c.c_uint32, c.POINTER(c.c_void_p)], + "FT_Close": [c.c_void_p], + "FT_GetLatencyTimer": [c.c_void_p, c.POINTER(c.c_ubyte)], + "FT_SetLatencyTimer": [c.c_void_p, c.c_ubyte], + "FT_SetBaudRate": [c.c_void_p, c.c_uint32], + "FT_SetDataCharacteristics": [c.c_void_p, c.c_ubyte, c.c_ubyte, c.c_ubyte], + "FT_SetFlowControl": [c.c_void_p, c.c_ushort, c.c_ubyte, c.c_ubyte], + "FT_SetTimeouts": [c.c_void_p, c.c_uint32, c.c_uint32], + "FT_Purge": [c.c_void_p, c.c_uint32], + "FT_Read": [c.c_void_p, c.c_void_p, c.c_uint32, c.POINTER(c.c_uint32)], + "FT_Write": [c.c_void_p, c.c_void_p, c.c_uint32, c.POINTER(c.c_uint32)], + "FT_GetQueueStatus": [c.c_void_p, c.POINTER(c.c_uint32)], + } + for name, signature in signatures.items(): + method = getattr(self.api, name) + method.argtypes = signature + method.restype = c.c_uint32 + self.handle = c.c_void_p() + self.original_latency = c.c_ubyte() + self.closed = True + self.deadline = time.monotonic() + timeout_seconds + self.call("FT_OpenEx", c.cast(c.c_char_p(device.serial_number.encode()), c.c_void_p), + 1, c.byref(self.handle)) + self.closed = False + self.latency_known = False + try: + self.call("FT_GetLatencyTimer", self.handle, c.byref(self.original_latency)) + self.latency_known = True + self.call("FT_SetLatencyTimer", self.handle, 2) + self.call("FT_SetBaudRate", self.handle, baudrate) + self.call("FT_SetDataCharacteristics", self.handle, 8, 0, 0) + self.call("FT_SetFlowControl", self.handle, 0, 0, 0) + self.call("FT_SetTimeouts", self.handle, 100, 5000) + self.call("FT_Purge", self.handle, 3) + except BaseException: + self.close() + raise + print(f"D2XX UART B {port}: latency {self.original_latency.value}->2 ms", flush=True) + + def call(self, name, *args): + status = getattr(self.api, name)(*args) + if status: + raise OSError(f"{name}: FT_STATUS {status}") + + def check_deadline(self): + if time.monotonic() > self.deadline: + raise TimeoutError("One-hour hardware-session timeout") + + def read(self, count): + self.check_deadline() + if not count: + return b"" + available = c.c_uint32() + self.call("FT_GetQueueStatus", self.handle, c.byref(available)) + size = min(count, available.value) if available.value else 1 + buffer = c.create_string_buffer(size) + received = c.c_uint32() + self.call("FT_Read", self.handle, buffer, size, c.byref(received)) + return buffer.raw[:received.value] + + def write(self, data): + self.check_deadline() + buffer = c.create_string_buffer(data) + written = c.c_uint32() + self.call("FT_Write", self.handle, buffer, len(data), c.byref(written)) + if written.value != len(data): + raise TimeoutError("D2XX short write") + return written.value + + def flush(self): + pass # FT_Write completes its synchronous USB transfer before returning. + + def close(self): + if not self.closed: + try: + if self.latency_known: + self.call("FT_SetLatencyTimer", self.handle, self.original_latency.value) + finally: + self.call("FT_Close", self.handle) + self.closed = True + print(f"D2XX closed; latency restored to {self.original_latency.value} ms", flush=True) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() diff --git a/platforms/arty-a7-toy/host/requirements-gemmini.txt b/platforms/arty-a7-toy/host/requirements-gemmini.txt new file mode 100644 index 0000000..6632677 --- /dev/null +++ b/platforms/arty-a7-toy/host/requirements-gemmini.txt @@ -0,0 +1,2 @@ +pyserial==3.5 +paramiko==5.0.0 diff --git a/platforms/arty-a7-toy/scripts/remote_linux_gemmini.py b/platforms/arty-a7-toy/scripts/remote_linux_gemmini.py new file mode 100644 index 0000000..557d76b --- /dev/null +++ b/platforms/arty-a7-toy/scripts/remote_linux_gemmini.py @@ -0,0 +1,90 @@ +"""从私有 SSH 配置连接,在新目录构建并下载镜像;不保存或输出凭据。""" + +import argparse +import importlib.util +import json +from pathlib import Path +import shlex +import time +import uuid + +import paramiko + +ROOT = Path(__file__).resolve().parents[1] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--ssh-helper", type=Path, required=True) + parser.add_argument("--cache-base", default="/home/yys/codex-builds/pebble-linux-20261010") + parser.add_argument("--sdk", default="/nix/store/l4dz443kk1rr8m3z0hby213xc2wqpjyc-riscv64-linux-gnu-toolchain") + args = parser.parse_args() + spec = importlib.util.spec_from_file_location("private_ssh", args.ssh_helper) + private = importlib.util.module_from_spec(spec) + spec.loader.exec_module(private) + client = paramiko.SSHClient() + client.load_system_host_keys() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + if not callable(getattr(private, "connect", None)): + raise ValueError("Private SSH module must provide connect(client)") + private.connect(client) + client.get_transport().set_keepalive(30) + started = time.monotonic() + label = "linux-gemmini-" + time.strftime("%Y%m%d") + "-" + uuid.uuid4().hex[:8] + out = ROOT / "build" / label + out.mkdir(parents=True, exist_ok=False) + try: + sftp = client.open_sftp() + remote = sftp.normalize(".") + "/codex-builds/" + label + sftp.mkdir(remote) + files = [ROOT / "SOFTWARE_BASELINE.json", ROOT / "tests/REFERENCE_MANIFEST.json", + ROOT / "evidence/2026-10-11/ToyLinuxChip.profile.json", + ROOT / "scripts/build_board_firmware.py"] + files += list((ROOT / "software").glob("*.py")) + files += [ROOT / "software/build.sh", ROOT / "software/linux_system_check.c", + ROOT / "software/gemmini_linux_check.c"] + files += [path for path in (ROOT / "tests/reference").rglob("*") if path.is_file()] + directories = set() + for path in files: + relative = path.relative_to(ROOT) + for parent in relative.parents: + if str(parent) != ".": + directories.add(parent.as_posix()) + for directory in sorted(directories, key=lambda item: (item.count("/"), item)): + sftp.mkdir(remote + "/" + directory) + for path in files: + sftp.put(str(path), remote + "/" + path.relative_to(ROOT).as_posix()) + command = "cd " + shlex.quote(remote) + " && timeout --signal=TERM --kill-after=10s 3600s python3 -u software/build_gemmini_image.py --cache-base " + shlex.quote(args.cache_base) + " --sdk " + shlex.quote(args.sdk) + print("REMOTE " + remote, flush=True) + _, stdout, _ = client.exec_command(command, timeout=15) + channel = stdout.channel + channel.set_combine_stderr(True) + with (out / "build.log").open("wb") as log: + while not channel.exit_status_ready() or channel.recv_ready(): + if time.monotonic() - started > 3650: + channel.close() + raise TimeoutError("One-hour software build timeout") + if channel.recv_ready(): + data = channel.recv(65536) + log.write(data) + log.flush() + print(data.decode(errors="replace"), end="", flush=True) + else: + time.sleep(0.1) + code = channel.recv_exit_status() + (out / "SESSION.json").write_text(json.dumps({"remote": remote, "exit_code": code, + "timeout_seconds": 3600, "elapsed_seconds": round(time.monotonic() - started, 3)}, indent=2) + "\n") + if code: + raise RuntimeError(f"Remote build failed with exit {code}; see {out / 'build.log'}") + for filename in ["build/LINUX_GEMMINI_BUILD.json", "build/board-software/fw_payload.bin", + "build/board-software/RESULT.json"]: + destination = out / Path(filename).name + sftp.get(remote + "/" + filename, str(destination)) + sftp.close() + print("DOWNLOADED " + str(out), flush=True) + finally: + client.close() + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/scripts/verify_linux_gemmini.py b/platforms/arty-a7-toy/scripts/verify_linux_gemmini.py new file mode 100644 index 0000000..27aa87d --- /dev/null +++ b/platforms/arty-a7-toy/scripts/verify_linux_gemmini.py @@ -0,0 +1,125 @@ +"""离线核验标准镜像与实物日志;仅从实际 PASS 行汇总计算耗时。""" + +import argparse +import hashlib +import json +from pathlib import Path +import re + +ROOT = Path(__file__).resolve().parents[1] +SHAPES = [(8, 8, 8), (16, 16, 16), (13, 11, 17), (8, 24, 8)] +CHECKS = [ + "VM_COPY_ON_WRITE", + "VM_PAGE_PROTECTION", + "FP64_PROCESS_CONTEXT", + "LINUX_TIMER", + "LINUX_SYSTEM_CHECK", +] + + +def read(path): + return json.loads(path.read_text(encoding="utf-8")) + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--build-record", type=Path, required=True) + parser.add_argument("--hardware-result", type=Path, required=True) + parser.add_argument("--output", type=Path) + parser.add_argument("--expected-bit-sha256", + help="核验重建位流的新运行;省略时使用历史实测位流摘要") + args = parser.parse_args() + build = read(args.build_record) + result = read(args.hardware_result) + original = read(ROOT / "evidence/2026-10-11/BOARD_RESULT.json") + require(build["result"] == "PASS_BUILD_NOT_HARDWARE_TESTED", "Build did not pass") + require(result["result"] == "PASS_LINUX_AND_GEMMINI_HARDWARE", "Hardware did not pass") + expected_bit = args.expected_bit_sha256 or original["bitstream_sha256"] + require(re.fullmatch(r"[0-9a-f]{64}", expected_bit), "Invalid expected bitstream digest") + require(result["bitstream_sha256"] == expected_bit, "Wrong bitstream") + require(result["payload_sha256"] == build["payload_sha256"], "Payload mismatch") + require(result["ddr_readback_bytes"] == build["payload_bytes"], "Incomplete DDR readback") + require(not result["flash_written"], "Expected temporary deployment") + require(result["elapsed_seconds"] < result["timeout_seconds"] == 3600, "Invalid timeout") + require(len(result["tests"]) == result["test_count"] == 15, "Expected 15 workloads") + tests = {item["name"]: item for item in result["tests"]} + require(set(tests) == set(build["workloads"]), "Workload set mismatch") + raw = (args.hardware_result.parent / "linux-console.log").read_bytes() + console = raw.replace(b"\r", b"").decode(errors="replace") + boot_file = args.hardware_result.parent / "boot-console.log" + boot = boot_file.read_bytes().decode(errors="replace") if boot_file.is_file() else console + require("OpenSBI v1.9" in boot and "Linux version 6.6.0" in boot, "Wrong boot") + if result.get("configuration_reused"): + load = read(args.hardware_result.parent / "LOAD_RESULT.json") + require(load["payload_sha256"] == build["payload_sha256"] + and load["bitstream_sha256"] == result["bitstream_sha256"] + and load["ddr_readback_bytes"] == build["payload_bytes"], "Wrong prior load") + expected_hashes = {name: item["sha256"] for name, item in build["workloads"].items()} + require(result["workload_hashes"] == expected_hashes, "Live workload hash mismatch") + for name, expected in expected_hashes.items(): + require(re.search(rf"^{expected}\s+/root/{re.escape(name)}$", + console, re.MULTILINE), "Missing raw live hash: " + name) + require("Kernel panic" not in console, "Kernel panic in transcript") + for index, item in enumerate(result["tests"]): + require(item["exit_code"] == 0, "Failed workload: " + item["name"]) + require(item["output"] in console, "Structured output differs from raw transcript") + require(re.search(rf"^WB_TEST_RC_{index}:0$", console, re.MULTILINE), + "Missing raw process return code: " + item["name"]) + for label in CHECKS: + require("PASS " + label in tests["linux_system_check-linux"]["output"], label) + sources = ROOT / "tests/reference/examples/balls/gemmini/workloads/ctests" + for source in sources.glob("*.c"): + output = tests[source.stem + "-linux"]["output"] + markers = re.findall(r'printf\("([^"\n]* PASSED)\\n"\)', + source.read_text(encoding="utf-8")) + require(len(markers) == 1 and markers[0] in output, "Missing oracle: " + source.name) + require(markers[0] in console, "Missing raw oracle: " + source.name) + output = tests["gemmini_linux_check-linux"]["output"] + pattern = (r"^PASS GEMMINI_CASE id=(\d+) mode=(OS|WS) m=(\d+) n=(\d+) k=(\d+) " + r"cpu_ns=(\d+) accelerator_end_to_end_ns=(\d+)$") + rows = re.findall(pattern, output, re.MULTILINE) + require(len(rows) == result["blocked_matmul_cases"] == 16, "Missing matrix cases") + measurements = [] + for index, row in enumerate(rows): + case, mode, m, n, k, cpu, accelerator = row + shape = tuple(map(int, (m, n, k))) + require(int(case) == index + 1 and shape == SHAPES[(index % 8) // 2] + and mode == ("WS" if index % 2 else "OS"), "Wrong case order/shape") + require(int(cpu) > 0 and int(accelerator) > 0, "Unusable timing sample") + require("PASS GEMMINI_CASE " + " ".join([ + f"id={case}", f"mode={mode}", f"m={m}", f"n={n}", f"k={k}", + f"cpu_ns={cpu}", f"accelerator_end_to_end_ns={accelerator}", + ]) in console, "Missing raw matrix result") + measurements.append({ + "case": int(case), "mode": mode, "m": int(m), "n": int(n), "k": int(k), + "cpu_ns": int(cpu), "accelerator_end_to_end_ns": int(accelerator), + "cpu_over_accelerator": round(int(cpu) / int(accelerator), 4), + }) + require("PASS GEMMINI_LINUX_CHECK cases=16" in output, "Missing final oracle") + require("PASS GEMMINI_LINUX_CHECK cases=16" in console, "Missing raw final oracle") + summary = { + "result": "PASS_OFFLINE_VERIFICATION", + "console_sha256": hashlib.sha256(raw).hexdigest(), + "payload_sha256": build["payload_sha256"], + "matrix_measurements": measurements, + "timing_scope": "分块、DMA、配置、同步和 CPU 跨 K 累加;不是纯 MAC 延迟", + "model_end_to_end_tested": False, + } + if args.output: + args.output.write_text(json.dumps(summary, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8") + print("PASS offline verification: 15 workloads, five Linux checks, 16 matrix cases") + for item in measurements: + print(f"CASE {item['case']:2} {item['mode']} {item['m']}x{item['n']}x{item['k']} " + f"CPU={item['cpu_ns'] / 1e6:.3f}ms " + f"accelerator={item['accelerator_end_to_end_ns'] / 1e6:.3f}ms " + f"CPU/accelerator={item['cpu_over_accelerator']:.4f}") + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/scripts/verify_linux_gemmini_archive.py b/platforms/arty-a7-toy/scripts/verify_linux_gemmini_archive.py new file mode 100644 index 0000000..7dc6b27 --- /dev/null +++ b/platforms/arty-a7-toy/scripts/verify_linux_gemmini_archive.py @@ -0,0 +1,75 @@ +"""离线核验本次实物归档的文件、输入、DDR/启动片段和超时保护证据。""" + +import hashlib +import json +from pathlib import Path +import re + +ROOT = Path(__file__).resolve().parents[1] +ARCHIVE = ROOT / "evidence/2026-10-12/linux-gemmini" + + +def read(path): + return json.loads(path.read_text(encoding="utf-8")) + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def main(): + manifest = read(ARCHIVE / "MANIFEST.json") + for name, metadata in manifest["files"].items(): + path = (ARCHIVE / name).resolve() + require(path.is_relative_to(ARCHIVE.resolve()), "Invalid archive path") + require(sha(path) == metadata["sha256"], "Archive hash mismatch: " + name) + inputs = read(ARCHIVE / "build/INPUT_MANIFEST.json") + for name, metadata in inputs["source_files"].items(): + snapshot = ARCHIVE / "sources" / name + path = snapshot if snapshot.is_file() else ROOT / name + require(sha(path) == metadata["sha256"], "Source binding mismatch: " + name) + for name, metadata in inputs["generated_build_inputs"].items(): + require(sha(ARCHIVE / "generated-inputs" / name) == metadata["sha256"], name) + for original in (ROOT / "tests/reference/examples/balls/gemmini/workloads/ctests").glob("*.c"): + expected = original.read_text(encoding="utf-8").replace("#define DIM 16", "#define DIM 8") + actual = (ARCHIVE / "generated-inputs" / original.name).read_text(encoding="utf-8") + require(actual == expected, "Reference oracle changed: " + original.name) + load = read(ARCHIVE / "load/RESULT.json") + build = read(ARCHIVE / "build/LINUX_GEMMINI_BUILD.json") + require(load["result"] == "PASS_DDR_READBACK_AND_LINUX_BOOT", "Load stage did not pass") + require(load["ddr_readback_bytes"] == build["payload_bytes"], "Incomplete DDR image") + transfer = (ARCHIVE / "load/transfer.log").read_bytes() + marker = f"PASS FULL_DDR_READBACK bytes={build['payload_bytes']} seconds={load['ddr_transfer_seconds']}" + require(marker.encode() in transfer, "Missing full readback proof") + require(b"PASS LINUX_BOOT" in transfer, "Missing boot checkpoint") + boot = (ARCHIVE / "load/linux-boot.log").read_bytes() + require(b"OpenSBI v1.9" in boot and b"Linux version 6.6.0" in boot and b"~ # " in boot, + "Missing physical Linux boot") + for directory in ["hardware", "first-pass"]: + require(read(ARCHIVE / directory / "LOAD_RESULT.json") == load, "Different reused load") + require((ARCHIVE / directory / "boot-console.log").read_bytes() == boot, "Different boot prefix") + watchdog = read(ARCHIVE / "watchdog/RESULT.json") + require(watchdog["result"] == "PASS_WATCHDOG_SUCCESS_FAILURE_TIMEOUT_AND_REAP", "Watchdog failed") + require([row["exit_code"] for row in watchdog["cases"]] == [0, 1, 137], "Wrong exit cases") + console = (ARCHIVE / "watchdog/check.log").read_bytes() + for index, row in enumerate(watchdog["cases"]): + require(row["watcher_alive_rc"] == 1, "Watcher not reaped") + require(re.search(rb"(?:^|\n)WATCH_SELF_" + str(index).encode() + rb":" + + str(row["exit_code"]).encode() + rb"\r*\n", console), "Missing exit proof") + require(re.search(rb"(?:^|\n)WATCH_REAP_" + str(index).encode() + rb":1\r*\n", console), + "Missing reap proof") + post = read(ARCHIVE / "hardware/POST_RESULT.json") + require(post["result"] == "PASS_POST_TEST_LIVE_SHELL" and post["watchdog_alive_rc"] == 1, + "Post-test shell/reap check failed") + require(post["uart_latency_restored_ms"] == 16 and not post["flash_written"], "Wrong cleanup") + require(not manifest["flash_written"] and not manifest["model_end_to_end_tested"], "Wrong scope") + print(f"PASS Linux/Gemmini archive: {len(manifest['files'])} files, pinned inputs, DDR/boot and watchdog") + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/software/GEMMINI_LINUX.md b/platforms/arty-a7-toy/software/GEMMINI_LINUX.md new file mode 100644 index 0000000..7907688 --- /dev/null +++ b/platforms/arty-a7-toy/software/GEMMINI_LINUX.md @@ -0,0 +1,127 @@ +# 8×8 Gemmini 的 Linux 实物验证与复现 + +本轮沿用项目的标准软件镜像流程:交叉编译 Linux workload,将可执行文件安装进 +rootfs 的 `/root`,生成 `fw_payload.bin`,再通过既有板级启动方式加载。 +不依赖工作台的独立 ELF 上传协议,也不要求 SD 卡。 + +本次归档为 [`evidence/2026-10-12/linux-gemmini/`](../evidence/2026-10-12/linux-gemmini/README.md), +包含源码索引、实际编译输入、Tcl、两次完整回归、DDR/Linux 启动片段、计时和摘要。 +本机路径和串口号均需替换为复现机器上的真实位置。 + +## 测试内容 + +- 原版 13 项 Gemmini 测试仅将 `DIM=16` 适配为 `8`,ISA、比较逻辑和原始参考源码不变。 +- 新增 `gemmini_linux_check-linux`:OS/WS 交替运行两轮;覆盖 8×8×8、16×16×16、 + M13/N11/K17 尾块及 M8/N24/K8;逐元素比较独立 CPU 参考结果,共 16 项。 +- 大矩阵由软件拆成 8×8 子块,尾块补零;K 方向的部分结果由 CPU 累加。 + 因此通过本测试不能宣称硬件 CISC 的跨 K 分块累加已通过。 +- 输出 CPU 耗时和加速器端到端耗时;后者包含分块、搬运、配置、同步及 CPU 累加。 + 小矩阵不保证加速,不把主机仿真耗时当作 FPGA 性能。 +- 沿用原 `bb_dma_touch_mvout`,显式写入输出缓冲区,避免 Linux 零页/COW 与 DMA 的问题。 + 每项新测试设 60 秒 alarm;主机运行器仍需设置独立超时。 + +## 准备与构建 + +`prepare_gemmini_linux.py` 只准备源码:核验固定参考摘要和实际 8×8/64-bit bank 配置, +生成参数、23 项 Gemmini 指令定义及 CMake 输入。构建代理须走 `bbdev_*` MCP, +并轮询任务状态;若工具不可用,应先恢复入口或取得本轮直接构建的明确授权。 + +供人工执行的隔离 Linux/Nix 构建示例: + +完整镜像构建需要 Python 3.12+、CMake 3.22+、Make、curl、flex、bison、bc、 +OpenSSL 开发库和带静态 libc/libm 的 RV64 Linux GNU 工具链。 +本次实际 GCC 15.3.0、Binutils 2.46,`rv64gc/lp64d`、`-O2 -static`。 +`RV64_LINUX_SDK` 指向工具链根目录,其 `bin/` 须有 `riscv64-unknown-linux-gnu-*`。 +在干净平台目录执行下面的完整入口可依次编译、安装、构建 rootfs/Linux 和重打包 OpenSBI: + +```bash +timeout --signal=TERM --kill-after=10s 3600s python3 -u software/build_gemmini_image.py --cache-base "$PWD/build/empty-cache" --sdk "$RV64_LINUX_SDK" +``` + +缓存目录可以为空;原准备流程会下载固定提交的依赖。结果为 +`build/board-software/fw_payload.bin` 和 `build/LINUX_GEMMINI_BUILD.json`。 +只准备/单独交叉编译时可用下面的步骤: + +```bash +python3 software/prepare_gemmini_linux.py +cmake -S build/linux-gemmini -B build/linux-gemmini-build \ + -DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc +cmake --build build/linux-gemmini-build -j8 +cmake --install build/linux-gemmini-build \ + --prefix "$PWD/build/software/bb-tests/output/workloads" +# 然后由既有 bbkernel 流程重新生成带这些文件的 Linux Image / fw_payload.bin。 +``` + +用户已授权本轮在服务器隔离目录直接调用原 CMake/bbkernel 流程,作为 MCP 工具缺失 +时的限定例外;此授权不修改共享服务器工程。远程入口为 +`scripts/remote_linux_gemmini.py --ssh-helper <私有配置路径>`,不保存或打印凭据, +构建总超时一小时。`software/build_gemmini_image.py` 复用固定版本依赖归档, +校验 15 个程序确实安装到 rootfs,再按已验证的 500 kHz CLINT 适配重新打包 OpenSBI。 +远程入口默认 SDK/缓存为本次服务器位置,其他机器须覆盖 `--sdk`、`--cache-base`。 +仓库外的私有配置模块提供 `connect(client)`,接收 Paramiko `SSHClient` 并连接服务器; +该函数从系统 SSH agent、环境或临时输入取得认证信息,不提交私有配置。 +归档上传器使用同一公开接入接口的副本,构建和传输逻辑未改。 +软件构建时间/工具链变化可能改变镜像摘要, +请使用该次构建产生的记录,不直接套用历史摘要。 + +实物入口 `host/check_linux_gemmini.py` 核验镜像与既有位流摘要,只写易失 FPGA SRAM, +用原 UART loader 写入并逐字节读回完整标准 payload 后才释放 CPU。Windows 使用 +已安装的 FTDI D2XX UART B,临时延迟 2 ms,关闭恢复原值;不操作 EEPROM 或 JTAG A。 +精简 BusyBox 未启用 `timeout`;运行器用已启用的 ash `sleep`、`kill`、`wait` +构造 90 秒 watchdog,并在程序结束后取消、回收它;主机再设独立 120 秒等待, +整个硬件会话限制一小时。每次运行独立保存原始日志、返回码和机器结果。 + +本机实际 Python 3.10.11、pyserial 3.5、paramiko 5.0.0、Vivado 2025.1; +FTDI D2XX DLL 产品版本 2.12.36.20。Windows 实物调用示例(从平台目录执行, +替换变量中的真实路径,关闭其他串口客户端): + +```powershell +$env:PYTHONUTF8 = '1' +python -m pip install -r host/requirements-gemmini.txt +$bit = 'D:\实际实现目录\toy_a7.bit' +$payload = 'D:\实际软件目录\fw_payload.bin' +$record = 'D:\实际软件目录\LINUX_GEMMINI_BUILD.json' +$sha = (Get-FileHash -LiteralPath $bit -Algorithm SHA256).Hash.ToLower() +python host/check_linux_gemmini.py --payload $payload --build-result $record --bitstream $bit --expected-bit-sha256 $sha --vivado 'D:\Xilinx\2025.1\Vivado\bin\vivado.bat' --port COM5 +``` + +缺省摘要是本次已验证的 UART 位流 `ccc33c51…dffde1`。没有原二进制时,在安装了 +Artix-7 器件支持的 Linux Vivado 2024.1 环境,按 [平台构建说明](../README.md#build) +运行 `scripts/elaborate.sh` 和 `scripts/start_board_build.py`(不加 `--flash`)。轮询 +`RUN.json`,仅使用 `COMPLETED`、退出 0、`bitstream_generated=true`、实现检查通过的位流。 +重建位流可能有不同摘要,需显式传入 `--expected-bit-sha256` 并保存其实现记录, +重新上板验证;该参数不赋予新产物历史验收结论。不能传入 Flash 目标位流。 +关闭其他串口客户端,使用 PROG/UART USB;自动临时编程后,按顺序执行完整 DDR +读回、Linux 启动、原五项系统检查、新 16 项矩阵比较和原 13 项 Gemmini 测试。 +日志在独立的 `build/hardware-gemmini-<日期>-<标识>/`。失败/超时记录与成功记录分开, +不能只凭 LED、进程返回 0 或构建成功认定全部功能通过。 + +如果完整 DDR 读回及 Linux 启动已完成、只需修正测试入口,可用 +`--loaded-run <旧硬件运行目录>` 继续,避免重复传输。该模式核验旧加载记录, +再从实际 Linux 对 15 个已安装程序逐个执行 `sha256sum`;任何文件缺失或摘要不同 +都会拒绝执行测试。断电或复位后须重新完整加载,不能沿用旧记录。 + +完成后,独立核对原始串口日志、15 个进程返回码、原测试成功标志和 16 个矩阵结果: + +```bash +python scripts/verify_linux_gemmini.py --build-record --hardware-result --output +``` + +这里的 `RESULT.json` 必须来自硬件运行目录。`CPU/accelerator` 小于 1 表示本次 +端到端加速器路径更慢;如实保留结果,不把小矩阵和软件搬运开销排除后宣称加速比。 +核验重建位流的新结果时,同样传入 `--expected-bit-sha256 <检查过的摘要>`。 + +看门狗可单独复现,需要已经启动、空闲的 Linux shell;不重烧位流: + +```powershell +python host/check_watchdog.py --port COM5 +``` + +正常退出 0、非零退出 1、刻意让 `sleep 5` 触发 1 秒超时并返回 137,同时检查 watcher +已回收。记录保存在独立 `build/watchdog-<日期>-<标识>/`。归档的 `sources/` 是实际 +执行版本;当前入口额外提供日期命名、新位流摘要参数和便携的 watchdog 入口, +这些包装改进不回写到历史实物记录。 + +准备/构建结果不代替实物通过证据。首轮只临时加载新软件镜像; +原 Flash 镜像作为恢复入口保留。确认 Linux/Gemmini 实物结果后,再更新固化镜像。 +整模型验证尚未完成;LeNet 的固定版本源码核对见 [模型兼容性评估](MODEL_COMPATIBILITY.md)。 diff --git a/platforms/arty-a7-toy/software/MODEL_COMPATIBILITY.md b/platforms/arty-a7-toy/software/MODEL_COMPATIBILITY.md new file mode 100644 index 0000000..39e1b0b --- /dev/null +++ b/platforms/arty-a7-toy/software/MODEL_COMPATIBILITY.md @@ -0,0 +1,45 @@ +# Toy 8×8 的模型兼容性评估 + +本评估区分“模型能够分块计算”和“已有 ModelTest 二进制兼容”。硬件来源固定为 +Buckyball `1f3d54535bd5fb76d5fd2f6b05ed36e591cf3097`;其 ModelTest 子模块固定为 +Buddy Examples `74a062b8e607e0806c2423f639daad650b8d82be`,不混用最新主分支结果。 + +## 已核对的构建路径 + +- 该版本 `models/archs/buckyball/` 有 goban、pebble、poly 布局,没有 toy。 + 架构选择 CMake 在缺少对应目录时明确报错,因此不能直接声称 `--chip toy --model lenet` + 是现成可用的模型组合。 +- LeNet 的 Buckyball 路径位于 `models/archs/buckyball/pebble/LeNet/`,通过 + Tile/Buckyball lowering 和物理 bank 分配生成代码,目标是 Pebble。 +- 独立的 `models/archs/gemmini/LeNet/` 使用 `convert-linalg-to-gemmini`、 + `lower-gemmini` 和 `+xgemmini`。该名称不保证生成的指令编码、DMA 和片上存储布局 + 兼容本项目的 GemminiBall;需要核对实际 LLVM/反汇编,不能直接替换目标名。 +- 模型数据通过标准模型导入生成:`params.f32`、`weights.i8`、`scales.bin` 和 MLIR。 + 模型执行文件依赖这些资源,打包一个 ELF 不等于拥有完整模型镜像。 + +## 当前 FPGA 的约束 + +实际 profile 只保留 GemminiBall 的 23 个算子编码,以及基础访存/同步指令。 +原 Toy 的独立 MXFP2INT、RELU 和 BDB_COUNTER 已移除,没有自动软件回退。 +软件必须使用实际 8×8、64-bit bank、8 physical/16 virtual banks 参数。 +不能把所有 `16` 常量直接替换为 `8`;矩阵维度、bank 宽度及指令字段是不同概念。 + +8×8 只限制每次子块的并行规模,较大矩阵可以分块。保持数据类型、累加、缩放和 +舍入语义后,模型结构不需要因阵列缩小而改变。同频 PE 数从 256 降到 64, +理论峰值减少为四分之一;整模型耗时还受分块、CPU 算子及数据搬运影响。 + +## LeNet 的后续验收 + +先完成 Linux/Gemmini 实物算子验证,再补齐 Toy 模型构建目标及匹配的 lowering。 +应使用同一份固定训练权重、量化参数和输入,对照 CPU 参考的逐层输出和最终分类。 +ReLU、池化、量化等若改由 CPU 实现,必须明确记录,不能宣称它们由已移除 Ball 执行。 +同时核对资源打包、运行内存和最终执行的自定义指令。 + +目前没有 Toy 8×8 整模型通过证据。本文件记录的是源码核对结果,不是模型性能报告。 + +## 固定版本来源 + +- [ModelTest 架构选择](https://github.com/buddy-compiler/buddy-examples/blob/74a062b8e607e0806c2423f639daad650b8d82be/models/archs/buckyball/CMakeLists.txt) +- [Pebble LeNet 构建](https://github.com/buddy-compiler/buddy-examples/blob/74a062b8e607e0806c2423f639daad650b8d82be/models/archs/buckyball/pebble/LeNet/CMakeLists.txt) +- [独立 Gemmini LeNet 构建](https://github.com/buddy-compiler/buddy-examples/blob/74a062b8e607e0806c2423f639daad650b8d82be/models/archs/gemmini/LeNet/CMakeLists.txt) +- [LeNet 模型与数据生成](https://github.com/buddy-compiler/buddy-examples/blob/74a062b8e607e0806c2423f639daad650b8d82be/models/models/LeNet/CMakeLists.txt) diff --git a/platforms/arty-a7-toy/software/build_gemmini_image.py b/platforms/arty-a7-toy/software/build_gemmini_image.py new file mode 100644 index 0000000..678e72a --- /dev/null +++ b/platforms/arty-a7-toy/software/build_gemmini_image.py @@ -0,0 +1,82 @@ +"""在全新隔离目录按原 bbkernel 流程构建 Linux/Gemmini 测试镜像。""" + +import argparse +import hashlib +import json +import os +from pathlib import Path +import shutil +import subprocess +import time + +ROOT = Path(__file__).resolve().parents[1] + + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--cache-base", type=Path, required=True) + parser.add_argument("--sdk", type=Path, required=True) + args = parser.parse_args() + started = time.monotonic() + baseline = json.loads((ROOT / "SOFTWARE_BASELINE.json").read_text()) + cache = ROOT / "build/downloads" + cache.mkdir(parents=True, exist_ok=True) + for name, commit in baseline.items(): + filename = f"{name}-{commit}.tar.gz" + source = args.cache_base / "build/downloads" / filename + target = cache / filename + if source.is_file() and not target.exists(): + shutil.copy2(source, target) + print(f"CACHE {name} {digest(target)}", flush=True) + environment = os.environ.copy() + environment["PATH"] = str(args.sdk / "bin") + ":" + environment["PATH"] + + def run(command, timeout): + print("RUN " + " ".join(map(str, command)), flush=True) + subprocess.run(list(map(str, command)), cwd=ROOT, env=environment, + timeout=timeout, check=True) + + run(["python3", "software/prepare_gemmini_linux.py"], 60) + run(["cmake", "-S", "build/linux-gemmini", "-B", "build/linux-gemmini-build", + "-DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc"], 60) + run(["cmake", "--build", "build/linux-gemmini-build", "-j8"], 180) + workloads = ROOT / "build/software/bb-tests/output/workloads" + run(["cmake", "--install", "build/linux-gemmini-build", "--prefix", workloads], 60) + # Existing entry installs the Linux system check, builds rootfs and Linux, + # and packages the original OpenSBI firmware. No alternate runtime uploader. + run(["bash", "software/build.sh"], 2400) + run(["python3", "scripts/build_board_firmware.py", + "--cross-compile", "riscv64-unknown-linux-gnu-"], 300) + payload = ROOT / "build/board-software/fw_payload.bin" + prepared = json.loads((ROOT / "build/linux-gemmini/PREPARED.json").read_text()) + installed = sorted(workloads.glob("*-linux")) + rootfs = ROOT / "build/software/kernel-build/rootfs/root" + if len(installed) != 15: + raise RuntimeError(f"Expected 15 workloads, got {len(installed)}") + for path in installed: + if digest(path) != digest(rootfs / path.name): + raise RuntimeError(f"Rootfs workload mismatch: {path.name}") + result = { + "result": "PASS_BUILD_NOT_HARDWARE_TESTED", + "elapsed_seconds": round(time.monotonic() - started, 3), + "software_baseline": baseline, + "profile": prepared["profile"], + "payload_bytes": payload.stat().st_size, + "payload_sha256": digest(payload), + "workloads": {path.name: {"bytes": path.stat().st_size, "sha256": digest(path)} + for path in installed}, + "rootfs_install_verified": True, + "flash_modified": False, + "hardware_gemmini_tested": False, + "model_end_to_end_tested": False, + } + (ROOT / "build/LINUX_GEMMINI_BUILD.json").write_text(json.dumps(result, indent=2) + "\n") + print(json.dumps(result, indent=2), flush=True) + + +if __name__ == "__main__": + main() diff --git a/platforms/arty-a7-toy/software/gemmini_linux_check.c b/platforms/arty-a7-toy/software/gemmini_linux_check.c new file mode 100644 index 0000000..1f6fa7d --- /dev/null +++ b/platforms/arty-a7-toy/software/gemmini_linux_check.c @@ -0,0 +1,132 @@ +// Linux workload for the actual 8x8 profile; use the pinned upstream ISA and DMA library. +#define _GNU_SOURCE +#include "buckyball.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if GEMMINI_DIM != 8 || BANK_WIDTH != 64 +#error This workload requires the emitted Toy FPGA 8x8 / 64-bit bank profile. +#endif + +enum { TILE = 8, MAX_DIM = 24 }; +static elem_t tile_a[TILE * TILE] __attribute__((aligned(64))); +static elem_t tile_b[TILE * TILE] __attribute__((aligned(64))); +static elem_t tile_zero[TILE * TILE] __attribute__((aligned(64))); +static result_t tile_c[TILE * TILE] __attribute__((aligned(64))); +static elem_t matrix_a[MAX_DIM * MAX_DIM], matrix_b[MAX_DIM * MAX_DIM]; +static result_t expected[MAX_DIM * MAX_DIM], observed[MAX_DIM * MAX_DIM]; + +static uint64_t nanoseconds(void) { + struct timespec value; + if (clock_gettime(CLOCK_MONOTONIC, &value)) { + perror("clock_gettime"); + exit(2); + } + return (uint64_t)value.tv_sec * 1000000000ULL + value.tv_nsec; +} + +static void gemmini_tile(unsigned ws) { + // 8-byte bank rows: INT8 uses one group, INT32 output uses four groups. + bb_mem_alloc(0, 1, 1); + bb_mem_alloc(1, 1, 1); + bb_mem_alloc(2, 1, 4); + bb_mem_alloc(3, 1, 1); + bb_mvin((uintptr_t)tile_a, 0, TILE, 1); + bb_mvin((uintptr_t)tile_b, 1, TILE, 1); + bb_mvin((uintptr_t)tile_zero, 3, TILE, 1); + bb_gemmini_config(ws, 0, 0, 0, 0); + bb_gemmini_preload(ws ? 1 : 3, 2, TILE, 0, 0); + bb_gemmini_compute_preloaded(0, ws ? 3 : 1, 2, TILE, 0, 0, 0); + bb_mvout((uintptr_t)tile_c, 2, TILE, 1); + bb_fence(); + for (unsigned bank = 0; bank < 4; ++bank) + bb_mem_release(bank); +} + +static void cpu_reference(unsigned m, unsigned n, unsigned k) { + for (unsigned row = 0; row < m; ++row) + for (unsigned col = 0; col < n; ++col) { + int32_t sum = 0; + for (unsigned inner = 0; inner < k; ++inner) + sum += (int32_t)matrix_a[row * k + inner] * matrix_b[inner * n + col]; + expected[row * n + col] = sum; + } +} + +static void blocked_matmul(unsigned m, unsigned n, unsigned k, unsigned ws) { + memset(observed, 0, sizeof(observed)); + for (unsigned row = 0; row < m; row += TILE) + for (unsigned col = 0; col < n; col += TILE) + for (unsigned inner = 0; inner < k; inner += TILE) { + memset(tile_a, 0, sizeof(tile_a)); + memset(tile_b, 0, sizeof(tile_b)); + memset(tile_zero, 0, sizeof(tile_zero)); + // Explicit writes give the DMA destination a private writable page. + memset(tile_c, 0, sizeof(tile_c)); + for (unsigned i = 0; i < TILE; ++i) + for (unsigned j = 0; j < TILE; ++j) { + if (row + i < m && inner + j < k) + tile_a[i * TILE + j] = matrix_a[(row + i) * k + inner + j]; + if (inner + i < k && col + j < n) + tile_b[i * TILE + j] = matrix_b[(inner + i) * n + col + j]; + } + gemmini_tile(ws); + for (unsigned i = 0; i < TILE && row + i < m; ++i) + for (unsigned j = 0; j < TILE && col + j < n; ++j) + observed[(row + i) * n + col + j] += tile_c[i * TILE + j]; + } +} + +static int check_case(unsigned id, unsigned m, unsigned n, unsigned k, unsigned ws) { + // Small bounded values keep the independent INT32 oracle free of overflow. + for (unsigned i = 0; i < m * k; ++i) + matrix_a[i] = (int)((i * 7 + id * 3) % 19) - 9; + for (unsigned i = 0; i < k * n; ++i) + matrix_b[i] = (int)((i * 11 + id * 5) % 23) - 11; + printf("BEGIN GEMMINI_CASE id=%u mode=%s m=%u n=%u k=%u\n", + id, ws ? "WS" : "OS", m, n, k); + alarm(60); + uint64_t start = nanoseconds(); + cpu_reference(m, n, k); + uint64_t cpu_ns = nanoseconds() - start; + start = nanoseconds(); + blocked_matmul(m, n, k, ws); + uint64_t accelerator_ns = nanoseconds() - start; + alarm(0); + for (unsigned i = 0; i < m * n; ++i) + if (observed[i] != expected[i]) { + printf("FAIL GEMMINI_CASE id=%u row=%u col=%u got=%d expected=%d\n", + id, i / n, i % n, observed[i], expected[i]); + return 1; + } + printf("PASS GEMMINI_CASE id=%u mode=%s m=%u n=%u k=%u cpu_ns=%llu " + "accelerator_end_to_end_ns=%llu\n", id, ws ? "WS" : "OS", m, n, k, + (unsigned long long)cpu_ns, (unsigned long long)accelerator_ns); + return 0; +} + +int main(void) { + setvbuf(stdout, NULL, _IONBF, 0); + printf("BEGIN GEMMINI_LINUX_CHECK pid=%ld dimension=%d bank_width=%d\n", + (long)getpid(), GEMMINI_DIM, BANK_WIDTH); + if (mlockall(MCL_CURRENT | MCL_FUTURE)) + printf("INFO MLOCKALL errno=%d; buffers are explicitly faulted in\n", errno); + unsigned id = 0; + const unsigned shapes[][3] = {{8, 8, 8}, {16, 16, 16}, {13, 11, 17}, {8, 24, 8}}; + for (unsigned repeat = 0; repeat < 2; ++repeat) + for (unsigned shape = 0; shape < sizeof(shapes) / sizeof(shapes[0]); ++shape) + for (unsigned ws = 0; ws < 2; ++ws) + if (check_case(++id, shapes[shape][0], shapes[shape][1], shapes[shape][2], ws)) + return 1; + printf("PASS GEMMINI_LINUX_CHECK cases=%u\n", id); + return 0; +} diff --git a/platforms/arty-a7-toy/software/prepare_gemmini_linux.py b/platforms/arty-a7-toy/software/prepare_gemmini_linux.py new file mode 100644 index 0000000..267558b --- /dev/null +++ b/platforms/arty-a7-toy/software/prepare_gemmini_linux.py @@ -0,0 +1,91 @@ +"""生成匹配实际 8×8 核心的 Linux 测试构建输入,不执行编译。""" + +import argparse +import hashlib +import json +from pathlib import Path +import shutil + +ROOT = Path(__file__).resolve().parents[1] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--profile", type=Path, + default=ROOT / "evidence/2026-10-11/ToyLinuxChip.profile.json") + parser.add_argument("--output", type=Path, default=ROOT / "build/linux-gemmini") + args = parser.parse_args() + profile = json.loads(args.profile.read_text(encoding="utf-8")) + expected = {"gemmini_rows": 8, "gemmini_columns": 8, "bank_width": 64, + "bank_count": 8, "virtual_bank_count": 16, "bank_rows": 1024} + for key, value in expected.items(): + if profile[key] != value: + raise ValueError(f"Wrong hardware profile: {key}={profile[key]}, expected {value}") + reference = ROOT / "tests/reference" + manifest = json.loads((ROOT / "tests/REFERENCE_MANIFEST.json").read_text(encoding="utf-8")) + for name, digest in manifest["files"].items(): + if hashlib.sha256((reference / name).read_bytes()).hexdigest() != digest: + raise ValueError(f"Changed pinned reference: {name}") + out = args.output.resolve() + if out == ROOT or out in ROOT.parents: + raise ValueError("Output must not replace the source directory") + out.mkdir(parents=True, exist_ok=True) + shutil.copytree(reference, out / "reference", dirs_exist_ok=True) + shutil.copy2(ROOT / "software/gemmini_linux_check.c", out / "gemmini_linux_check.c") + (out / "params.h").write_text( + "#define BANK_WIDTH 64\n#define PHYSICAL_BANK_NUM 8\n" + "#define VIRTUAL_BANK_NUM 16\n#define BANK_ENTRIES 1024\n#define GEMMINI_DIM 8\n", + encoding="utf-8") + # Preserve the exact pinned Gemmini instruction encodings; do not use + # upstream Berkeley Gemmini binaries with this Buckyball instruction ABI. + names = {2: "CONFIG", 3: "FLUSH", 53: "PRELOAD", 66: "COMPUTE_PRELOADED", + 67: "COMPUTE_ACCUMULATED", 80: "LOOP_WS_CONFIG_BOUNDS", + 81: "LOOP_WS_CONFIG_ADDR_A", 82: "LOOP_WS_CONFIG_ADDR_B", + 83: "LOOP_WS_CONFIG_ADDR_D", 84: "LOOP_WS_CONFIG_ADDR_C", + 85: "LOOP_WS_CONFIG_STRIDES_AB", 86: "LOOP_WS_CONFIG_STRIDES_DC", + 87: "LOOP_WS"} + names.update({95 + index: f"LOOP_CONV_WS_CONFIG_{index}" for index in range(1, 10)}) + names[105] = "LOOP_CONV_WS" + if set(names) != set(profile["ball_funct7"]): + raise ValueError("Instruction definitions do not match the emitted profile") + (out / "ballISA.h").write_text("\n".join( + f"#define BB_FUNC7_GEMMINI_{name} {number}" for number, name in names.items()) + "\n", + encoding="utf-8") + sources = [] + for index, original in enumerate(sorted((reference / "examples/balls/gemmini/workloads/ctests").glob("*.c")), 1): + data = original.read_text(encoding="utf-8") + if data.count("#define DIM 16") != 1: + raise ValueError(f"Unexpected test dimension: {original}") + target = out / (original.stem + ".c") + target.write_text(data.replace("#define DIM 16", "#define DIM 8"), encoding="utf-8") + sources.append(target.name) + cmake = '''cmake_minimum_required(VERSION 3.22) +project(ToyLinuxGemmini C) +set(CMAKE_C_STANDARD 11) +add_compile_options(-march=rv64gc -mabi=lp64d -O2 -Wall -Wextra -Werror -ffp-contract=off) +add_link_options(-static) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + reference/bb-tests/workloads/lib reference/examples/balls/gemmini/workloads) +add_library(bb_reference STATIC reference/bb-tests/workloads/lib/buckyball.c + reference/bb-tests/workloads/lib/bbhw/mem/mem.c + reference/bb-tests/workloads/lib/bbhw/isa/isa.c) +set(workloads gemmini_linux_check-linux) +add_executable(gemmini_linux_check-linux gemmini_linux_check.c) +target_link_libraries(gemmini_linux_check-linux PRIVATE bb_reference m) +''' + for name in sources: + target = Path(name).stem + "-linux" + cmake += f"add_executable({target} {name})\ntarget_link_libraries({target} PRIVATE bb_reference m)\nlist(APPEND workloads {target})\n" + cmake += "install(TARGETS ${workloads} RUNTIME DESTINATION .)\n" + (out / "CMakeLists.txt").write_text(cmake, encoding="utf-8") + (out / "PREPARED.json").write_text(json.dumps({ + "result": "PREPARED_NOT_BUILT", "dimension": 8, + "reference_commit": manifest["commit"], "original_cases": sources, + "new_blocked_matmul_cases": 16, "profile": expected, + "model_end_to_end_tested": False, + }, indent=2) + "\n", encoding="utf-8") + print(f"Prepared {len(sources)} pinned cases and one blocked-matmul workload in {out}") + + +if __name__ == "__main__": + main()