temp/powervm-boot: new aport

This is a bootloader for Open Firmware PowerPC systems that we will use
to replace grub-ieee1275 in device-generic-ppc64le. Due to its use of
RUSTC_BOOTSTRAP, this APKBUILD cannot go to Alpine at the moment, but
once the Rust targets are added upstream, this can be moved to aports.

Part-of: <https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/9002>
This commit is contained in:
Aelin
2026-08-03 19:24:11 +00:00
parent 76faf7a319
commit 06bdbdba69
5 changed files with 191 additions and 0 deletions
@@ -0,0 +1,13 @@
diff --git a/src/fs.rs b/src/fs.rs
index 605327d..e5290ea 100644
--- a/src/fs.rs
+++ b/src/fs.rs
@@ -34,7 +34,7 @@ impl BootFilesystem for FatPartition {
continue;
}
let key = String::from(&name[..name.len() - 5]);
- let mut reader = match entries_dir.open_file(name) {
+ let mut reader = match entries_dir.open_file(&name) {
Ok(r) => r,
Err(_) => continue,
};
@@ -0,0 +1,56 @@
diff --git a/src/fs.rs b/src/fs.rs
index e5290ea..af190be 100644
--- a/src/fs.rs
+++ b/src/fs.rs
@@ -4,7 +4,7 @@ use alloc::vec::Vec;
use crate::disk::{PROMDisk, Partition};
pub trait BootFilesystem {
- /// List BLS entries from loaders/entries/*.conf.
+ /// List BLS entries from loader/entries/*.conf.
/// Returns (filename_stem, file_content) pairs.
fn list_bls_entries(&self) -> Result<Vec<(String, String)>, &'static str>;
@@ -17,8 +17,8 @@ type FatPartition = hadris_fat::FatFs<Partition<PROMDisk>>;
impl BootFilesystem for FatPartition {
fn list_bls_entries(&self) -> Result<Vec<(String, String)>, &'static str> {
let entries_dir = self
- .open_dir_path("loaders/entries")
- .map_err(|_| "failed to open loaders/entries")?;
+ .open_dir_path("loader/entries")
+ .map_err(|_| "failed to open loader/entries")?;
let mut result = Vec::new();
for entry in entries_dir.entries() {
@@ -75,7 +75,7 @@ impl BootFilesystem for IsoPartition {
fn list_bls_entries(&self) -> Result<Vec<(String, String)>, &'static str> {
let root = self.root_dir();
- let loaders_dir_ref = {
+ let loader_dir_ref = {
let mut found = None;
for entry in root.iter(self).entries() {
let entry = match entry {
@@ -86,18 +86,18 @@ impl BootFilesystem for IsoPartition {
continue;
}
let name = entry.display_name();
- if name.eq_ignore_ascii_case("loaders") {
+ if name.eq_ignore_ascii_case("loader") {
found = Some(entry.as_dir_ref(self).map_err(|_| "as_dir_ref failed")?);
break;
}
}
- found.ok_or("loaders directory not found")?
+ found.ok_or("loader directory not found")?
};
let entries_dir_ref = {
- let loaders_dir = self.open_dir(loaders_dir_ref);
+ let loader_dir = self.open_dir(loader_dir_ref);
let mut found = None;
- for entry in loaders_dir.entries() {
+ for entry in loader_dir.entries() {
let entry = match entry {
Ok(e) => e,
Err(_) => continue,
@@ -0,0 +1,13 @@
diff --git a/src/main.rs b/src/main.rs
index df41a25..fd2857b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -630,7 +630,7 @@ fn load_kernel_and_prepare_jump(
}
};
- if kernel_buf.is_empty() || kernel_buf.len() > 64 * 1024 * 1024 {
+ if kernel_buf.is_empty() || kernel_buf.len() > 512 * 1024 * 1024 {
prom.write_line("invalid kernel size");
prom.power_off();
}
+63
View File
@@ -0,0 +1,63 @@
# This package can be upstreamed to Alpine once Rust MCP 988 is implemented:
# github.com/rust-lang/rust/issues/158199
maintainer="Aelin <aelin@postmarketos.org>"
pkgname=powervm-boot
pkgver=0.5.0_git20260318
pkgrel=0
_commit="38487a6357efb4e1dbc029033693a10b9e6c692d"
pkgdesc="Bootloader for IBM POWER systems that implements BLS on top of Open Firmware"
url="https://gitlab.com/aruiz/powerpc-bootloader"
arch="ppc64le"
license="MPL-2.0"
makedepends="
cargo-auditable
rust-src
"
install="$pkgname.post-upgrade"
source="$pkgname-$pkgver.tar.gz::https://gitlab.com/aruiz/powerpc-bootloader/-/archive/$_commit/powerpc-bootloader/archive/$_commit.tar.gz
0001-Fix-compilation.patch
0002-Fix-loader-directory-path.patch
0003-Raise-kernel-size-limit.patch
"
# !check: Test suite is somewhat specific to Fedora
# !strip: Foreign architecture
# net: cargo
options="!check !strip net pmb:cross-native"
builddir="$srcdir/powerpc-bootloader-$_commit"
prepare() {
default_prepare
cargo fetch --target powerpc-unknown-linux-gnu
}
build() {
# FIXME: We need to cross compile to 32-bit because that's what Open Firmware
# requires. There is no bare metal 32-bit PowerPC target in Rust (yet!), there
# is however an accepted MCP to add one. Until that is in the Alpine Rust
# toolchain, we will have to cheat and use RUSTC_BOOTSTRAP=1 in combination with
# -Zbuild-std to be able to compile for a 32-bit target.
# This is also why this package is not in aports yet.
#
# The RUSTFLAGS mess is ugly because for some reason, abuild completely screws
# up the quoting!?
RUSTC_BOOTSTRAP=1 \
RUSTFLAGS="-Clinker=powerpc64le-alpine-linux-musl-gcc -Clink-arg=-nostdlib -Clink-arg=-ffreestanding -Clink-arg=-fPIC -Clink-arg=-Ttext=100000 -Clink-arg=-mbig-endian -Clink-arg=-Wl,--build-id=none -Ctarget-feature=+crt-static" \
cargo auditable build \
--release \
--target powerpc-unknown-linux-gnu \
-Zbuild-std=core,alloc,compiler_builtins \
-Zbuild-std-features=compiler-builtins-mem
}
package() {
install -Dm644 target/powerpc-unknown-linux-gnu/release/powervm-boot \
-t "$pkgdir"/usr/lib/powervm-boot/
}
sha512sums="
1a332b3e79ccca5e2f284ede9717ca562b0adde0b195813b8b0b2f695c3c811ea2e2579fa1de8af2b16effff2827e49e849b1868f140ff18bc38aa2a385c0b91 powervm-boot-0.5.0_git20260318.tar.gz
09a8ebe2bf932e3f5ca6ea7ee9f587b6e0f2f2f917703d47f14cd2d321fbb5b307fc661f73c2afc90d5ec2aef7d9e2a49de0aa7ef872e46091d0c144870e11ee 0001-Fix-compilation.patch
a2a6fd1a834c22b310a52812342bc5382b9139f0697a001ffaa11f5fb6b2eceb98eb208f47eeecbcb7325ca174f2b6a6e36bb9205a91a6d67ceba6d4c43eb792 0002-Fix-loader-directory-path.patch
5a4542f98063c9b046dacd6629f4167b362bb97008b9aecc869ce2bea16948ed465171efc556a4396884a1d4e20091e66b2a69e3bf8b46b54652a33a429b1ee8 0003-Raise-kernel-size-limit.patch
"
@@ -0,0 +1,46 @@
#!/bin/sh
if [ ! -f /usr/lib/powervm-boot/powervm-boot ]; then
echo "powervm-boot not found"
exit
fi
PREP_GUID="9e1a2d38-c612-4316-aa26-8b49521e5a8b"
PREP_TYPE=0x41
lsblk -nrpo NAME,TYPE,PARTTYPE |
while read -r dev type parttype; do
[ "$type" = "part" ] || continue
case "$(printf '%s' "$parttype" | tr '[:upper:]' '[:lower:]')" in
"$PREP_GUID"|"$PREP_TYPE")
echo "Found PReP boot partition $dev"
magic=$(dd if="$dev" bs=1 count=4 2>/dev/null | od -An -tx1 | tr -d ' \n')
if [ "$magic" != "7f454c46" ]; then
echo "Not an ELF file"
continue
fi
class=$(dd if="$dev" bs=1 skip=4 count=1 2>/dev/null | od -An -tu1 | tr -d ' ')
if [ "$class" != "1" ]; then
echo "Not ELF32"
continue
fi
machine=$(dd if="$dev" bs=1 skip=18 count=2 2>/dev/null | od -An -tx1 | tr -d ' \n')
if [ "$machine" != "0014" ]; then
echo "Not PowerPC ELF"
continue
fi
echo "PReP boot partition with bootloader installed detected, flashing powervm-boot"
dd if=/usr/lib/powervm-boot/powervm-boot of="$dev" bs=512 conv=notrunc
sync
;;
esac
done