Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,36 @@ jobs:
- name: Test
run: meson test -C build-san --print-errorlogs

arch-asm:
name: Assembly (32-bit arch validation)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install clang + lld
run: |
sudo apt-get update
sudo apt-get install -y clang lld

- name: Assemble and PIC-link each 32-bit arch backend
run: |
set -e
assemble() {
dir="$1"; shift
for a in crc32 md5 sha256; do
clang "$@" -fPIC -c "arch/$dir/$a.S" -o "/tmp/${dir}_$a.o"
done
clang "$@" -shared -fPIC -fuse-ld=lld -Wl,-z,text -nostdlib \
"/tmp/${dir}_crc32.o" "/tmp/${dir}_md5.o" "/tmp/${dir}_sha256.o" \
-o "/tmp/${dir}.so"
echo "OK: $dir"
}
assemble arm -target arm-linux-gnueabihf -march=armv7-a
assemble x86 -target i386-linux-gnu
assemble riscv32 -target riscv32-linux-gnu -march=rv32gc -mabi=ilp32
assemble mips -target mipsel-linux-gnu -march=mips32r2
assemble powerpc -target powerpc-linux-gnu

cross-aarch64:
name: Cross-compile (aarch64)
runs-on: ubuntu-latest
Expand Down Expand Up @@ -284,6 +314,58 @@ jobs:
--buildtype=release
meson compile -C build-mips64el

cross-armhf:
name: Cross-compile (armhf)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Add armhf architecture
run: |
sudo dpkg --add-architecture armhf
sudo sed -i '/^deb \[/!s/^deb /deb [arch=amd64] /' /etc/apt/sources.list
sudo find /etc/apt/sources.list.d/ -name '*.list' \
-exec sed -i '/^deb \[/!s/^deb /deb [arch=amd64] /' {} +
sudo find /etc/apt/sources.list.d/ -name '*.sources' \
-exec sed -i '/^Architectures:/d; /^Types:/i Architectures: amd64' {} +
. /etc/os-release
sudo tee /etc/apt/sources.list.d/armhf-ports.list << EOF
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports ${VERSION_CODENAME} main restricted universe
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports ${VERSION_CODENAME}-updates main restricted universe
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports ${VERSION_CODENAME}-security main restricted universe
EOF
sudo apt-get update

- name: Install dependencies
run: |
sudo apt-get install -y \
clang lld llvm \
gcc-arm-linux-gnueabihf \
meson ninja-build pkg-config \
libarchive-dev:armhf \
liblmdb-dev:armhf \
libsodium-dev:armhf \
libseccomp-dev:armhf

- name: Build yyjson for armhf
run: |
git clone --depth=1 https://github.com/ibireme/yyjson.git /tmp/yyjson
clang --target=arm-linux-gnueabihf -O2 -shared -fPIC \
-o /tmp/libyyjson.so /tmp/yyjson/src/yyjson.c
sudo cp /tmp/libyyjson.so /usr/lib/arm-linux-gnueabihf/
sudo cp /tmp/yyjson/src/yyjson.h /usr/include/
printf 'Name: yyjson\nDescription: Fast JSON library\nVersion: 0.0.0\nLibs: -L/usr/lib/arm-linux-gnueabihf -lyyjson\nCflags: -I/usr/include\n' | \
sudo tee /usr/lib/arm-linux-gnueabihf/pkgconfig/yyjson.pc

- name: Cross-compile
env:
PKG_CONFIG_LIBDIR: /usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig
run: |
meson setup build-armhf \
--cross-file cross-arm.txt \
--buildtype=release
meson compile -C build-armhf

freebsd:
name: Build (FreeBSD x86_64)
runs-on: ubuntu-latest
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@ All notable changes to this project will be documented in this file.

### Added

- 32-bit assembly backends for the checksum module (CRC-32, MD5, SHA-256) on
ARM (AArch32/ARMv7), x86 (i386/IA-32), RISC-V (RV32), MIPS32 and PowerPC,
extending the existing 64-bit backends to 32-bit targets; each replaces the
portable C fallback with a hand-written scalar transform selected at build
time via `host_machine.cpu_family()`. The message-scheduling code assembles
words byte-wise, so the backends are endian-independent (validated on both
little- and big-endian MIPS and on big-endian PowerPC), and symbol
addressing is position-independent so they link cleanly into the shared
library
- Cross-compilation files (`cross-arm.txt`, `cross-i386.txt`,
`cross-riscv32.txt`, `cross-mips.txt`, `cross-powerpc.txt`) and CI coverage:
an `arch-asm` job that assembles and PIC-links every 32-bit backend, plus a
full `armhf` cross-compile job
- FreeBSD support: the library builds, links, and passes its test suite on
FreeBSD with the libsodium signing backend; no source changes are required
because the seccomp dependency is optional and the install-script runner
Expand Down
136 changes: 136 additions & 0 deletions arch/arm/crc32.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/* SPDX-License-Identifier: GPL-3.0-only */
/* SPDX-FileCopyrightText: 2026 Meigo™ Corporation (https://github.com/meigoc) */

.text
.syntax unified
.arm

.globl apg_crc32_hw_supported
.type apg_crc32_hw_supported, %function
apg_crc32_hw_supported:
mov r0, #1
bx lr
.size apg_crc32_hw_supported, .-apg_crc32_hw_supported

.globl apg_crc32_update_hw
.type apg_crc32_update_hw, %function
apg_crc32_update_hw:
push {r4, lr}
movw r3, #:lower16:(.Ltab - (0f + 8))
movt r3, #:upper16:(.Ltab - (0f + 8))
0: add r3, pc, r3
.Lc4:
cmp r2, #4
blo .Lctail
ldrb r4, [r1, #0]
eor r4, r4, r0
and r4, r4, #0xff
ldr r4, [r3, r4, lsl #2]
lsr r0, r0, #8
eor r0, r0, r4
ldrb r4, [r1, #1]
eor r4, r4, r0
and r4, r4, #0xff
ldr r4, [r3, r4, lsl #2]
lsr r0, r0, #8
eor r0, r0, r4
ldrb r4, [r1, #2]
eor r4, r4, r0
and r4, r4, #0xff
ldr r4, [r3, r4, lsl #2]
lsr r0, r0, #8
eor r0, r0, r4
ldrb r4, [r1, #3]
eor r4, r4, r0
and r4, r4, #0xff
ldr r4, [r3, r4, lsl #2]
lsr r0, r0, #8
eor r0, r0, r4
add r1, r1, #4
sub r2, r2, #4
b .Lc4
.Lctail:
cmp r2, #0
beq .Lcdone
ldrb r4, [r1], #1
eor r4, r4, r0
and r4, r4, #0xff
ldr r4, [r3, r4, lsl #2]
lsr r0, r0, #8
eor r0, r0, r4
sub r2, r2, #1
b .Lctail
.Lcdone:
pop {r4, lr}
bx lr
.size apg_crc32_update_hw, .-apg_crc32_update_hw

.section .rodata
.align 4
.Ltab:
.long 0x00000000,0x77073096,0xee0e612c,0x990951ba
.long 0x076dc419,0x706af48f,0xe963a535,0x9e6495a3
.long 0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988
.long 0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91
.long 0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de
.long 0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7
.long 0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec
.long 0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5
.long 0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172
.long 0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b
.long 0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940
.long 0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59
.long 0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116
.long 0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f
.long 0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924
.long 0x2f6f7c87,0x58684c11,0xc1611dab,0xb6662d3d
.long 0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a
.long 0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433
.long 0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818
.long 0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01
.long 0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e
.long 0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457
.long 0x65b0d9c6,0x12b7e950,0x8bbeb8ea,0xfcb9887c
.long 0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65
.long 0x4db26158,0x3ab551ce,0xa3bc0074,0xd4bb30e2
.long 0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb
.long 0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0
.long 0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9
.long 0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086
.long 0x5768b525,0x206f85b3,0xb966d409,0xce61e49f
.long 0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4
.long 0x59b33d17,0x2eb40d81,0xb7bd5c3b,0xc0ba6cad
.long 0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a
.long 0xead54739,0x9dd277af,0x04db2615,0x73dc1683
.long 0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8
.long 0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1
.long 0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe
.long 0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7
.long 0xfed41b76,0x89d32be0,0x10da7a5a,0x67dd4acc
.long 0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5
.long 0xd6d6a3e8,0xa1d1937e,0x38d8c2c4,0x4fdff252
.long 0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b
.long 0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60
.long 0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79
.long 0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236
.long 0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f
.long 0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04
.long 0xc2d7ffa7,0xb5d0cf31,0x2cd99e8b,0x5bdeae1d
.long 0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a
.long 0x9c0906a9,0xeb0e363f,0x72076785,0x05005713
.long 0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38
.long 0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21
.long 0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e
.long 0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777
.long 0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c
.long 0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45
.long 0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2
.long 0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db
.long 0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0
.long 0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9
.long 0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6
.long 0xbad03605,0xcdd70693,0x54de5729,0x23d967bf
.long 0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94
.long 0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d

.section .note.GNU-stack,"",%progbits
Loading
Loading