ASELSANMicrokernel
S33 · SOURCE-BOUND GATE EVIDENCE

RPi5 G7b pre-MMU mutex data-abort nedeni düzeltildi; reflash paketi hazırlandı

Operations --test hedefi → focused test içindeki include_str!/#[path] bağı → kaynak kesiti Bu sayfa yalnız S33 kapısına aittir; komşu kapıların kaynakları bu kabulün içine katılmaz.

S33Focused kod testiOperations id exactsource SHA exacttest target exact

operation: rpi5-g7b-pre-mmu-pmm-publish-fix-staged

uygulama/model · focused test · Operations · 3 exact excerpt

sequence-bound=true · implementation-bound=false
01 · Testin bağlı olduğu uygulama/model kodu

Kapının yürüttüğü gerçek kaynak

tam Rust öğesiL9–L65
kernel/src/mm/frame_allocator.rs::FrameAllocator

/// Fiziksel frame ayırma ve serbest bırakma arayüzü.
///
/// # Safety Notu
/// `deallocate_frame` çağrısı **unsafe**'dir çünkü çağrı yapan taraf,
/// verilen frame'in gerçekten bu allocator tarafından ayrıldığını ve
/// şu anda kullanımda olmadığını garanti etmek zorundadır.
pub trait FrameAllocator {
    /// Yeni bir 4K fiziksel frame ayırmaya çalışır.
    ///
    /// Başarılı olursa `Some(PhysFrame)`, bellek bittiğinde `None` döner.
    fn allocate_frame(&mut self) -> Option<PhysFrame>;

    /// Daha önce ayrılmış bir frame'i serbest bırakır.
    ///
    /// # Safety
    /// Çağıran aşağıdaki garantileri vermek **zorundadır**:
    /// - `frame`, bu allocator tarafından daha önce ayrılmış olmalıdır.
    /// - `frame` şu anda hiçbir yerde kullanılmamaktadır.
    /// - Aynı frame birden fazla kez serbest bırakılmamalıdır (double free).
    unsafe fn deallocate_frame(&mut self, frame: PhysFrame);

    /// Temporarily expose one allocated frame for bounded kernel mutation.
    ///
    /// Early boot allocators use the identity map. Runtime allocators override
    /// this hook so loader writes pass through the reserved, non-global kmap
    /// window and their access authority is closed before the call returns.
    ///
    /// # Safety
    ///
    /// `frame` must be live and owned by this allocator. `operation` must not
    /// retain the pointer after returning.
    unsafe fn with_frame_bytes_mut(
        &mut self,
        frame: PhysFrame,
        operation: &mut dyn FnMut(*mut u8),
    ) -> Result<(), FrameAccessError> {
        operation(frame.start_address().as_u64() as *mut u8);
        Ok(())
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FrameAccessError {
    AccessUnavailable,
}

/// En basit fiziksel frame ayırıcısı: Bump (veya "watermark") allocator.
///
/// Belleği baştan sona doğru doğrusal olarak dağıtır.
/// Serbest bırakma (deallocate) desteklemez (henüz).
///
/// Bu allocator, erken kernel aşamasında (M2) kullanmak için idealdir
/// çünkü çok az kod ve state gerektirir.
/// Erken DT planlayıcısının üretebileceği azami usable aralık sayısıyla aynı
/// sabit kapasite. G7b yolu kapasiteyi aşan girdiyi kesmez; hata döndürür.
pub const MAX_BUMP_REGIONS: usize = 40;
snippet sha256: 127c482a9ec0file sha256: d9b1102db489
02 · Doğrulayan test kodu

Operations komutuna bağlı focused test

tam Rust öğesiL89–L104
simulation/tests/rpi5_g7b_pmm.rs::accepts_the_fixed_capacity_without_losing_the_last_region

#[test]
fn accepts_the_fixed_capacity_without_losing_the_last_region() {
    let regions = (0..MAX_BUMP_REGIONS)
        .map(|index| (0x1000 + index as u64 * 0x2000, 0x1000))
        .collect::<Vec<_>>();
    let mut allocator = BumpAllocator::try_from_regions(&regions).expect("full capacity");

    assert_eq!(allocator.region_count(), MAX_BUMP_REGIONS);
    assert_eq!(allocator.remaining_frames(), MAX_BUMP_REGIONS as u64);
    let mut last = 0;
    while let Some(frame) = allocator.allocate_frame() {
        last = frame.as_u64();
    }
    assert_eq!(last, regions[MAX_BUMP_REGIONS - 1].0);
}
snippet sha256: 3a750ecfba1bfile sha256: 8d6f8cc91566
03 · Kapı kimlik kaydı

Operations sıra, kimlik ve başlık bağı

tam Operations kaydıL34180–L34449
website/src/lib/operations.ts::rpi5-g7b-pre-mmu-pmm-publish-fix-staged
  {
    id: "rpi5-g7b-pre-mmu-pmm-publish-fix-staged",
    date: "2026-08-20",
    sequence: 33,
    status: "fixed",
    title:
      "RPi5 G7b pre-MMU mutex data-abort nedeni düzeltildi; reflash paketi hazırlandı",
    summary:
      "Sıra 32'deki gerçek BCM2712 data abort bulgusu kaynak ve disassembly düzeyinde kapatıldı. G7b PMM artık MMU kapalıyken stack-owned ordinary state olarak hazırlanıyor; BOOT4 semantiği korunarak global spin::Mutex ve atomic publish yalnız SCTLR_EL1 enable ile final ISB sonrasında çalışıyor. Yeni c065bbd7…db5f paket image/build kapısını geçti; fiziksel kartta hâlâ başarısız 7f0ba2b9…1720e2 imajı bulunduğundan kayıt staged/fixed'tir, fiziksel PASS değildir.",
    evidence: [
      "Root cause: MMU kapalıyken RPI5_PMM.lock() spin::Mutex yolu LDAXRB/STXR exclusive atomikleri üretiyordu. Stage-1 öncesi veri erişimleri Device bellek semantiğindeyken gerçek BCM2712 bu exclusive erişimde EL1 data abort verdi.",
      "prepare_rpi5_g7b_pmm artık BumpAllocator, probe, total_frames ve region_count değerlerini PreparedRpi5G7bPmm içinde ordinary stack-owned state olarak tutuyor; pre-MMU global mutex/atomic publish kaldırıldı.",
      "MMU enable ile final ISB tamamlandıktan sonra önce mevcut BOOT4 MMU=ON marker semantiği korunuyor, ardından install_rpi5_g7b_pmm çağrılıyor. Global RPI5_PMM mutex'i bu noktada Normal memory mapping altında alınır; metadata store'larından sonra READY release marker'ı en son yazılır.",
      "scripts/verify-rpi5-pre-mmu-atomics.sh disassembly kapısı _start_rust içinde SCTLR_EL1 yazımı ile install_rpi5_g7b_pmm çağrı sırasını doğruluyor ve MMU enable öncesindeki LDAXR/LDXR/STXR/CAS/SWP/LDADD ailesini fail-closed reddediyor.",
      "make image-rpi5 compiled gate ile PASS verdi: PMM publish SCTLR_EL1 + final ISB sonrasında ve _start_rust pre-MMU bölümünde exclusive atomik yok.",
      "Nihai aselsanos-rpi5.img exact 140432 bayt ve SHA-256 c065bbd704d836cd84f7ba9515bacd67664a947337d76a704643d6a58d17db5f olarak üretildi.",
      "RPi5 ELF exact 6604088 bayt / SHA-256 45b95ee8cdd49596e2d446f9dabce5839707506d6c2bab56d983bd62dd9fedd9; DTB 40a2fbe9…abca00 ve config 1248275c…d76b değişmedi.",
      "Yeni SHA256SUMS üç payload için 3/3 OK verdi; 248 bayt manifest SHA-256 6eb474f17acc8f0968f040892856a6e3140e1d66f3f98618362b589d28192bb5 oldu.",
    ],
    commands: [
      "make image-rpi5",
      "scripts/verify-rpi5-pre-mmu-atomics.sh <llvm-objdump> target/rpi5/aarch64-unknown-none/debug/aselsan_kernel",
      "cd build/rpi5 && shasum -a 256 -c SHA256SUMS",
      "shasum -a 256 build/rpi5/aselsanos-rpi5.img target/rpi5/aarch64-unknown-none/debug/aselsan_kernel build/rpi5/SHA256SUMS",
    ],
    terminalSessionsNote:
      "Sıra 33'ün özgün stdout/stderr arşivi tutulmadı. Aşağıdaki oturumlar aynı sabit c065bbd7…db5f kaynak ve artefakt üzerinde 20 Ağustos 2026'da yeniden çalıştırıldı. Filtre kullanılan oturumlarda filtre komutun içinde görünür; workspace testi yalnız suite sonuç satırlarını gösterir.",
    terminalSessions: [
      {
        id: "fmt",
        title: "Rust biçim kapısı",
        commandLines: ["cargo fmt --all -- --check"],
        outputLines: [],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "workspace-tests",
        title: "Workspace test matrisi · 52/52",
        commandLines: ["cargo test --workspace"],
        outputLines: [
          "Finished `test` profile [optimized + debuginfo] target(s) in 0.02s",
          "running 0 tests",
          "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 4 tests",
          "test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 13 tests",
          "test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 1 test",
          "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 19 tests",
          "test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 5 tests",
          "test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 10 tests",
          "test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
          "running 0 tests",
          "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
        ],
        exitCode: 0,
        outputMode: "selected",
        outputNote:
          "Tam Cargo çıktısındaki suite başlangıç ve sonuç satırları; tek tek test adları bu önizlemede gösterilmez.",
      },
      {
        id: "pmm-tests",
        title: "G7b PMM hedef testleri",
        commandLines: [
          "cargo test -p aselsan_microkernel_simulation --test rpi5_g7b_pmm",
        ],
        outputLines: [
          "running 5 tests",
          "test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
        ],
        exitCode: 0,
        outputMode: "selected",
        outputNote: "Cargo çıktısının sonuç bloğu.",
      },
      {
        id: "uart-tests",
        title: "G7b UART doğrulayıcı testleri",
        commandLines: [
          "cargo test -p aselsan_microkernel_simulation --test rpi5_g7b_uart",
        ],
        outputLines: [
          "running 10 tests",
          "test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s",
        ],
        exitCode: 0,
        outputMode: "selected",
        outputNote: "Cargo çıktısının sonuç bloğu.",
      },
      {
        id: "qemu-build",
        title: "QEMU kernel derlemesi",
        commandLines: [
          "set -o pipefail",
          "make kernel 2>&1 | grep -E '^(>>>|warning: .*generated|    Finished)'",
        ],
        outputLines: [
          "    Finished `release` profile [optimized] target(s) in 0.05s",
          "    Finished `release` profile [optimized] target(s) in 0.00s",
          ">>> ASELSAN Kernel derleniyor (QEMU virt)...",
          'warning: `aselsan_kernel` (bin "aselsan_kernel") generated 226 warnings (run `cargo fix --bin "aselsan_kernel" -p aselsan_kernel` to apply 24 suggestions)',
          "    Finished `dev` profile [optimized + debuginfo] target(s) in 0.05s",
        ],
        exitCode: 0,
        outputMode: "filtered",
        outputNote: "Çıktı, komutta görünen grep deseniyle filtrelendi.",
      },
      {
        id: "qemu-smoke",
        title: "QEMU runtime smoke",
        commandLines: ["set -o pipefail", "make verify-qemu 2>&1 | tail -n 1"],
        outputLines: [
          "QEMU smoke PASS: hello ELF + IPC ELF + scheduler SEC 5; fault marker yok",
        ],
        exitCode: 0,
        outputMode: "filtered",
        outputNote: "Komut yalnız son sonuç satırını gösterir.",
      },
      {
        id: "rpi4-build",
        title: "Raspberry Pi 4 kernel derlemesi",
        commandLines: [
          "set -o pipefail",
          "make kernel-rpi4 2>&1 | grep -E '^(>>>|warning: .*generated|    Finished)'",
        ],
        outputLines: [
          "    Finished `release` profile [optimized] target(s) in 0.04s",
          "    Finished `release` profile [optimized] target(s) in 0.00s",
          ">>> ASELSAN Kernel derleniyor (Raspberry Pi 4 - BCM2711)...",
          'warning: `aselsan_kernel` (bin "aselsan_kernel") generated 214 warnings (run `cargo fix --bin "aselsan_kernel" -p aselsan_kernel` to apply 24 suggestions)',
          "    Finished `dev` profile [optimized + debuginfo] target(s) in 0.05s",
        ],
        exitCode: 0,
        outputMode: "filtered",
        outputNote: "Çıktı, komutta görünen grep deseniyle filtrelendi.",
      },
      {
        id: "rpi5-build",
        title: "Raspberry Pi 5 kernel derlemesi",
        commandLines: [
          "set -o pipefail",
          "make kernel-rpi5 2>&1 | grep -E '^(>>>|warning: .*generated|    Finished)'",
        ],
        outputLines: [
          "    Finished `release` profile [optimized] target(s) in 0.04s",
          "    Finished `release` profile [optimized] target(s) in 0.00s",
          ">>> ASELSAN Kernel derleniyor (Raspberry Pi 5 - BCM2712)...",
          'warning: `aselsan_kernel` (bin "aselsan_kernel") generated 159 warnings (run `cargo fix --bin "aselsan_kernel" -p aselsan_kernel` to apply 22 suggestions)',
          "    Finished `dev` profile [optimized + debuginfo] target(s) in 0.05s",
        ],
        exitCode: 0,
        outputMode: "filtered",
        outputNote: "Çıktı, komutta görünen grep deseniyle filtrelendi.",
      },
      {
        id: "marker-isolation",
        title: "Board marker izolasyonu",
        commandLines: [
          "for board in qemu rpi4 rpi5; do",
          '  elf="target/$board/aarch64-unknown-none/debug/aselsan_kernel"',
          "  printf '%s ' \"$board\"",
          "  for marker in 'ASELSAN/G7B0 RANGES=' 'ASELSAN/G7BERR' 'ASELSAN/BOOT7B PMM=OK'; do",
          '    strings "$elf" | awk -v marker="$marker" \'index($0, marker) { count++ } END { printf "%d ", count + 0 }\'',
          "  done",
          "  printf '\\n'",
          "done",
        ],
        outputLines: ["qemu 0 0 0 ", "rpi4 0 0 0 ", "rpi5 1 1 1 "],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "image",
        title: "RPi5 imaj ve paket kapısı",
        commandLines: [
          "set -o pipefail",
          "make image-rpi5 2>&1 | grep -E '^(    Finished|>>>|warning: .*generated|PASS:|firmware/bcm|/.*llvm-objcopy|cp |aselsanos-rpi5\\.img:|bcm2712-rpi-5-b\\.dtb:|config\\.txt:|✅|   SHA256:|-rw)'",
        ],
        outputLines: [
          "    Finished `release` profile [optimized] target(s) in 0.04s",
          "    Finished `release` profile [optimized] target(s) in 0.00s",
          ">>> ASELSAN Kernel derleniyor (Raspberry Pi 5 - BCM2712)...",
          'warning: `aselsan_kernel` (bin "aselsan_kernel") generated 159 warnings (run `cargo fix --bin "aselsan_kernel" -p aselsan_kernel` to apply 22 suggestions)',
          "    Finished `dev` profile [optimized + debuginfo] target(s) in 0.06s",
          "firmware/bcm2712-rpi-5-b.dtb: OK",
          "PASS: RPi5 PMM publish SCTLR_EL1 + ISB sonrasında; _start_rust pre-MMU gövdesinde exclusive atomik yok",
          "/Users/onderozturk/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/bin/llvm-objcopy -O binary target/rpi5/aarch64-unknown-none/debug/aselsan_kernel build/rpi5/aselsanos-rpi5.img",
          "cp firmware/bcm2712-rpi-5-b.dtb build/rpi5/bcm2712-rpi-5-b.dtb",
          "cp firmware/config.txt build/rpi5/config.txt",
          "aselsanos-rpi5.img: OK",
          "bcm2712-rpi-5-b.dtb: OK",
          "config.txt: OK",
          "✅ RPi5 imajı: build/rpi5/aselsanos-rpi5.img",
          "   SHA256: c065bbd704d836cd84f7ba9515bacd67664a947337d76a704643d6a58d17db5f  aselsanos-rpi5.img",
          "-rw-r--r--@ 1 onderozturk  staff   248B Aug 20 12:18 build/rpi5/SHA256SUMS",
          "-rwxr-xr-x@ 1 onderozturk  staff   137K Aug 20 12:18 build/rpi5/aselsanos-rpi5.img",
          "-rw-r--r--@ 1 onderozturk  staff    77K Aug 20 12:18 build/rpi5/bcm2712-rpi-5-b.dtb",
          "-rw-r--r--@ 1 onderozturk  staff   501B Aug 20 12:18 build/rpi5/config.txt",
        ],
        exitCode: 0,
        outputMode: "filtered",
        outputNote: "Çıktı, komutta görünen grep deseniyle filtrelendi.",
      },
      {
        id: "pre-mmu-gate",
        title: "Pre-MMU exclusive-atomik disassembly kapısı",
        commandLines: [
          'OBJDUMP=$(find "$(rustc --print sysroot)" -name llvm-objdump -print -quit)',
          "printf '%s\\n' \"$OBJDUMP\"",
          'sh scripts/verify-rpi5-pre-mmu-atomics.sh "$OBJDUMP" target/rpi5/aarch64-unknown-none/debug/aselsan_kernel',
        ],
        outputLines: [
          "/Users/onderozturk/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/bin/llvm-objdump",
          "PASS: RPi5 PMM publish SCTLR_EL1 + ISB sonrasında; _start_rust pre-MMU gövdesinde exclusive atomik yok",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "fixture-validator",
        title: "Strict G7b UART fixture doğrulaması",
        commandLines: [
          "cargo run --quiet -p aselsan_microkernel_simulation --example verify_rpi5_g7b_log -- simulation/tests/fixtures/rpi5_g7b_uart_pass.log",
        ],
        outputLines: [
          "G7b UART evidence PASS: regions=3 total_frames=155000 remaining_frames=154999 frame=0x18c5000 boot7_ticks=300 g7b_base_ticks=300 g7b_delta=100",
          "G7b exclusion-scope limitation: host checks DTB+heap+guard ranges; kernel/reserved/CMA range lists are not logged",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "manifest",
        title: "Üç dosyalı SHA256 manifesti",
        commandLines: ["cd build/rpi5", "shasum -a 256 -c SHA256SUMS"],
        outputLines: [
          "aselsanos-rpi5.img: OK",
          "bcm2712-rpi-5-b.dtb: OK",
          "config.txt: OK",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "hashes",
        title: "Artefakt SHA-256 değerleri",
        commandLines: [
          "shasum -a 256 build/rpi5/aselsanos-rpi5.img target/rpi5/aarch64-unknown-none/debug/aselsan_kernel build/rpi5/bcm2712-rpi-5-b.dtb build/rpi5/config.txt build/rpi5/SHA256SUMS",
        ],
        outputLines: [
          "c065bbd704d836cd84f7ba9515bacd67664a947337d76a704643d6a58d17db5f  build/rpi5/aselsanos-rpi5.img",
          "45b95ee8cdd49596e2d446f9dabce5839707506d6c2bab56d983bd62dd9fedd9  target/rpi5/aarch64-unknown-none/debug/aselsan_kernel",
          "40a2fbe9c29e8b9a4912cf726a943068defb779fc052ec38e457a79c58abca00  build/rpi5/bcm2712-rpi-5-b.dtb",
          "1248275cdc6f6ce951ce0ff2183471d194c5b9bb58c3dc3f66efa9156f91d76b  build/rpi5/config.txt",
          "6eb474f17acc8f0968f040892856a6e3140e1d66f3f98618362b589d28192bb5  build/rpi5/SHA256SUMS",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
    ],
    limitations: [
      "Yeni c065bbd7…db5f paket henüz fiziksel microSD'ye yazılmadı. Gücü kesilmiş kartta sıra 32'de data abort veren eski 7f0ba2b9…1720e2 imajı bulunuyor; exact disk kimliği yeniden çözülerek reflash gerekir.",
      "Bu kaynak/build düzeltmesi gerçek Raspberry Pi 5 G7b PASS değildir. Reflash sonrası G7B0 ve BOOT7B marker'larının temiz UART10 capture'ında strict validator'dan geçmesi gerekir.",
      "Son başarılı fiziksel runtime sınırı G7a BOOT7 SCHED=OK ORDER=ABAB STEPS=4 TICKS=202 olarak kalır.",
      "Düzeltme yalnız pre-MMU exclusive-atomic data abort nedenini hedefler; tek-frame G7b smoke kapsamını exhaustion, free/reuse, bütün RAM, EL0, preemption veya SMP iddiasına genişletmez.",
    ],
  },
snippet sha256: 53ead60a5b15file sha256: 9726dbf00f84
Focused test komutu
cargo test -p aselsan_microkernel_simulation --test rpi5_g7b_pmm
Registry schema v5 · generator website/scripts/generate-code-gates.mjs · Tam SHA-256: 3050638b71a684d8f8f947a8a6faa237a17fa8db5dc0db04fb207b668b462af9