ASELSANMicrokernel
S25 · SOURCE-BOUND GATE EVIDENCE

RPi5 G7a CPU0 kooperatif scheduler paketi hazırlandı

Operations --test hedefi → simulation public mod g7a_uart bağı → kaynak kesiti Bu sayfa yalnız S25 kapısına aittir; komşu kapıların kaynakları bu kabulün içine katılmaz.

S25Focused kod testiOperations id exactsource SHA exacttest target exact

operation: rpi5-g7a-cooperative-scheduler-package-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 öğesiL68–L293
simulation/src/g7a_uart.rs::verify_transcript

/// Validate a complete G7a physical UART transcript.
///
/// `SEC` lines are optional. If present, they must start at second 1, remain
/// contiguous, and satisfy `ticks == second * 100` for every sample.
pub fn verify_transcript(input: &[u8]) -> Result<G7aEvidence, ValidationError> {
    let leading_nuls = input.iter().take_while(|&&byte| byte == 0).count();
    let mut errors = Vec::new();
    if leading_nuls > 5 {
        errors.push(format!(
            "leading NUL prefix exceeds capture allowance: observed {leading_nuls}, maximum 5"
        ));
    }

    // Some UART capture stacks prepend a short NUL run while opening the port.
    // Only that bounded prefix is ignored; NULs after transcript text begins are
    // evidence corruption and are rejected by the control-byte scan below.
    let payload = &input[leading_nuls..];
    let transcript = match std::str::from_utf8(payload) {
        Ok(value) => value,
        Err(error) => {
            errors.push(format!("transcript is not valid UTF-8: {error}"));
            return Err(ValidationError { messages: errors });
        }
    };

    for (payload_offset, character) in transcript.char_indices() {
        if character.is_control() && !matches!(character, '\n' | '\r' | '\t') {
            let offset = leading_nuls + payload_offset;
            if character.is_ascii() {
                errors.push(format!(
                    "forbidden control byte 0x{:02x} at byte offset {offset}",
                    character as u32
                ));
            } else {
                errors.push(format!(
                    "forbidden Unicode control U+{:04X} at byte offset {offset}",
                    character as u32
                ));
            }
        }
    }

    let mut sequence = Vec::new();
    let mut counts: BTreeMap<&'static str, usize> = EXPECTED_SEQUENCE
        .iter()
        .copied()
        .map(|name| (name, 0))
        .collect();
    let mut start_ticks = None;
    let mut end_ticks = None;
    let mut sec_samples = Vec::new();

    for (index, raw_line) in transcript.lines().enumerate() {
        let line_number = index + 1;
        let line = raw_line.trim_end_matches('\r').trim();
        let lowercase = line.to_ascii_lowercase();

        for marker in FORBIDDEN_MARKERS {
            if lowercase.contains(marker) {
                errors.push(format!("line {line_number}: forbidden marker {marker:?}"));
            }
        }
        if lowercase.contains("[exc]") || lowercase.contains("bilinmeyen irq") {
            errors.push(format!(
                "line {line_number}: forbidden exception/unknown IRQ marker"
            ));
        }

        if line.starts_with("[SEC") {
            match parse_sec(line) {
                Ok((second, ticks)) => sec_samples.push((line_number, second, ticks)),
                Err(reason) => errors.push(format!("line {line_number}: {reason}")),
            }
        }

        let label = if line.starts_with("ASELSAN/BOOT0") {
            require_exact(line, "ASELSAN/BOOT0 BCM2712", line_number, &mut errors);
            Some("BOOT0")
        } else if line.starts_with("ASELSAN/BOOT1") {
            if line != "ASELSAN/BOOT1 CurrentEL=1" && line != "ASELSAN/BOOT1 CurrentEL=2" {
                errors.push(format!("line {line_number}: invalid BOOT1 marker {line:?}"));
            }
            Some("BOOT1")
        } else if line.starts_with("ASELSAN/BOOT2") {
            require_exact(line, "ASELSAN/BOOT2 EL1", line_number, &mut errors);
            Some("BOOT2")
        } else if line.starts_with("ASELSAN/BOOT3") {
            require_exact(line, "ASELSAN/BOOT3 DTB=OK", line_number, &mut errors);
            Some("BOOT3")
        } else if line.starts_with("ASELSAN/BOOT4") {
            require_exact(line, "ASELSAN/BOOT4 MMU=ON", line_number, &mut errors);
            Some("BOOT4")
        } else if line.starts_with("ASELSAN/BOOT5") {
            match parse_fields(line, "ASELSAN/BOOT5") {
                Ok(fields) => {
                    require_field(&fields, "GIC+TIMER", "OK", line_number, &mut errors);
                    require_field(&fields, "ticks", "100", line_number, &mut errors);
                }
                Err(reason) => errors.push(format!("line {line_number}: {reason}")),
            }
            Some("BOOT5")
        } else if line.starts_with("ASELSAN/BOOT6") {
            match parse_fields(line, "ASELSAN/BOOT6") {
                Ok(fields) => {
                    require_field(&fields, "DT+RAM+HEAP", "OK", line_number, &mut errors);
                    require_field(&fields, "BOX", "0xa5a51234", line_number, &mut errors);
                }
                Err(reason) => errors.push(format!("line {line_number}: {reason}")),
            }
            Some("BOOT6")
        } else if line.starts_with("ASELSAN/G7S0") {
            match parse_fields(line, "ASELSAN/G7S0") {
                Ok(fields) => {
                    require_field(&fields, "FPEN", "3", line_number, &mut errors);
                    require_field(&fields, "CPU", "0", line_number, &mut errors);
                    require_field(&fields, "MODE", "COOP", line_number, &mut errors);
                    require_field(&fields, "TASKS", "2", line_number, &mut errors);
                    start_ticks =
                        parse_tick_field(&fields, "START_TICKS", line_number, &mut errors);
                }
                Err(reason) => errors.push(format!("line {line_number}: {reason}")),
            }
            Some("G7S0")
        } else if line.starts_with("ASELSAN/G7S1") {
            match parse_fields(line, "ASELSAN/G7S1") {
                Ok(fields) => {
                    let task = fields.get("TASK").copied();
                    let step = fields.get("STEP").copied();
                    match (task, step) {
                        (Some("A"), Some("1")) => Some("A1"),
                        (Some("B"), Some("1")) => Some("B1"),
                        (Some("A"), Some("2")) => Some("A2"),
                        (Some("B"), Some("2")) => Some("B2"),
                        _ => {
                            errors.push(format!(
                                "line {line_number}: unexpected G7S1 TASK/STEP pair"
                            ));
                            None
                        }
                    }
                }
                Err(reason) => {
                    errors.push(format!("line {line_number}: {reason}"));
                    None
                }
            }
        } else if has_marker_tag(line, "ASELSAN/BOOT7") {
            match parse_fields(line, "ASELSAN/BOOT7") {
                Ok(fields) => {
                    require_field(&fields, "SCHED", "OK", line_number, &mut errors);
                    require_field(&fields, "ORDER", "ABAB", line_number, &mut errors);
                    require_field(&fields, "STEPS", "4", line_number, &mut errors);
                    end_ticks = parse_tick_field(&fields, "TICKS", line_number, &mut errors);
                }
                Err(reason) => errors.push(format!("line {line_number}: {reason}")),
            }
            Some("BOOT7")
        } else {
            if (line.starts_with("ASELSAN/BOOT") || line.starts_with("ASELSAN/G7S"))
                && !has_marker_tag(line, "ASELSAN/BOOT7B")
                && !has_marker_tag(line, "ASELSAN/BOOT7C")
                && !has_marker_tag(line, "ASELSAN/BOOT7D")
                && !has_marker_tag(line, "ASELSAN/BOOT8")
                && !has_marker_tag(line, "ASELSAN/BOOT8B")
                && !has_marker_tag(line, "ASELSAN/BOOT8C")
                && !has_marker_tag(line, "ASELSAN/BOOT8D")
            {
                errors.push(format!(
                    "line {line_number}: unexpected milestone marker {line:?}"
                ));
            }
            None
        };

        if let Some(label) = label {
            sequence.push(label);
            *counts.get_mut(label).expect("known evidence label") += 1;
        }
    }

    for expected in EXPECTED_SEQUENCE {
        let count = counts[expected];
        if count != 1 {
            errors.push(format!(
                "marker {expected} must occur exactly once, observed {count}"
            ));
        }
    }
    if sequence != EXPECTED_SEQUENCE {
        errors.push(format!(
            "milestone order mismatch: expected {}, observed {}",
            EXPECTED_SEQUENCE.join(" -> "),
            sequence.join(" -> ")
        ));
    }

    validate_sec_samples(&sec_samples, &mut errors);

    match (start_ticks, end_ticks) {
        (Some(start), Some(end)) if end >= start => {
            let delta = end - start;
            if delta < 100 {
                errors.push(format!(
                    "timer progress is too short: start={start}, end={end}, delta={delta} (<100)"
                ));
            }
        }
        (Some(start), Some(end)) => {
            errors.push(format!("timer moved backwards: start={start}, end={end}"))
        }
        _ => {}
    }

    if errors.is_empty() {
        let start_ticks = start_ticks.expect("validated G7S0 has START_TICKS");
        let end_ticks = end_ticks.expect("validated BOOT7 has TICKS");
        Ok(G7aEvidence {
            start_ticks,
            end_ticks,
            sec_samples: sec_samples.len(),
        })
    } else {
        Err(ValidationError { messages: errors })
    }
}
snippet sha256: e6423a32ed3ffile sha256: 2e993631a83b
02 · Doğrulayan test kodu

Operations komutuna bağlı focused test

tam Rust öğesiL88–L105
simulation/tests/rpi5_g7a_uart.rs::scheduler_contract_fields_are_enforced

#[test]
fn scheduler_contract_fields_are_enforced() {
    for (from, to, expected_error) in [
        ("FPEN=3", "FPEN=0", "field FPEN expected"),
        ("CPU=0", "CPU=1", "field CPU expected"),
        ("MODE=COOP", "MODE=PREEMPT", "field MODE expected"),
        ("TASKS=2", "TASKS=3", "field TASKS expected"),
        ("ORDER=ABAB", "ORDER=AABB", "field ORDER expected"),
        ("STEPS=4", "STEPS=3", "field STEPS expected"),
    ] {
        let messages = failure_messages(PASS.replacen(from, to, 1));
        assert!(
            has_message(&messages, expected_error),
            "missing {expected_error:?} for mutation {from:?} -> {to:?}: {messages:?}"
        );
    }
}
snippet sha256: fbe7da8ccf4bfile sha256: 8026a5f171bc
03 · Kapı kimlik kaydı

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

tam Operations kaydıL34670–L34701
website/src/lib/operations.ts::rpi5-g7a-cooperative-scheduler-package-staged
  {
    id: "rpi5-g7a-cooperative-scheduler-package-staged",
    date: "2026-08-20",
    sequence: 25,
    status: "partial",
    title: "RPi5 G7a CPU0 kooperatif scheduler paketi hazırlandı",
    summary:
      "G6 fiziksel BOOT6 sınırı korunarak yalnız CPU0'da iki EL1 kernel görevinin açık yield noktalarıyla A1→B1→A2→B2 sırasını kanıtlayacak G7a yolu hazırlandı. Kod, fail-closed UART doğrulayıcısı, tam test matrisi ve 3/3 paket bütünlüğü geçti; 50a802e7…b266 imajı henüz microSD'ye yazılmadığı ve gerçek Pi 5'te BOOT7 alınmadığı için kayıt staged/partial tutuluyor.",
    evidence: [
      "G7a yolu MPIDR_EL1.Aff0 üzerinden CPU=0'ı ve CPACR_EL1.FPEN=3 readback'ini doğruluyor; iki sabit EL1 kernel görevi MODE=COOP sözleşmesiyle başlatılıyor.",
      "Görev A ve B yalnız açık yield_now çağrılarıyla A1, B1, A2, B2 marker'larını üretir. Atomic sıra sayacı beklenmeyen adımda G7ERR ORDER ile, yanlış CPU/FPEN/tick veya tekrar BOOT7 durumlarında ayrı G7ERR nedenleriyle fail-closed durur.",
      "Başarı sözleşmesi ASELSAN/G7S0 CPU=0 MODE=COOP TASKS=2 FPEN=3 START_TICKS=<n>, dört G7S1 adımı ve en az 100 ek tick sonrasında ASELSAN/BOOT7 SCHED=OK ORDER=ABAB STEPS=4 TICKS=<m> zinciridir.",
      "RPi5 timer IRQ yolu scheduler_tick çağırmadan çalışmaya devam eder; bu nedenle staged paket timer-preemptive scheduler, EL0 veya secondary-core kanıtı değildir. BOOT0–BOOT6 marker'ları G7a validator zincirinde regresyon ön koşulu olarak korunur.",
      "cargo test --workspace toplam 37/37 PASS verdi: 4 simülasyon davranış testi, 14 erken bellek testi ve 19 G7a UART validator testi. Validator; sıra/tekillik, sözleşme alanları, en az 100 tick farkı, SEC tutarlılığı, bounded leading NUL ve yasaklı fault marker negatif vakalarını kapsıyor.",
      "Tam make verify exit 0 verdi; QEMU runtime ile QEMU, RPi4 ve RPi5 build/image kapıları birlikte geçti.",
      "Yeni aselsanos-rpi5.img 131264 bayt ve SHA-256 50a802e7b1e3a791bb4386c2812ed051b844e44817c99066a248f76adec1b266 olarak üretildi.",
      "Sabitlenmiş bcm2712-rpi-5-b.dtb 78703 bayt / 40a2fbe9c29e8b9a4912cf726a943068defb779fc052ec38e457a79c58abca00 ve config.txt 501 bayt / 1248275cdc6f6ce951ce0ff2183471d194c5b9bb58c3dc3f66efa9156f91d76b olarak kaldı; SHA256SUMS imaj, DTB ve config için 3/3 OK verdi.",
    ],
    commands: [
      "make verify",
      "cargo test --workspace",
      "cargo test -p aselsan_microkernel_simulation --test rpi5_g7a_uart",
      "make image-rpi5",
      "cd build/rpi5 && shasum -a 256 -c SHA256SUMS",
    ],
    limitations: [
      "50a802e7…b266 G7a paketi henüz fiziksel microSD'ye yazılmadı; kartta son doğrulanan 5630758c…f26b G6 paketi bulunuyor.",
      "G7S0, A1/B1/A2/B2 ve BOOT7 marker'ları gerçek Raspberry Pi 5 UART10 kaydında henüz gözlenmedi; G7a fiziksel PASS değildir.",
      "Bu dilim yalnız CPU0 üzerinde iki EL1 kernel görevinin kooperatif context-switch smoke kanıtını hedefler. Kernel stack lifecycle/deallocation ve gerçek guard izolasyonu kanıtlanmaz.",
      "G7b reserved-aware fiziksel sayfa yöneticisi, G7c EL0 hello/SVC/exit, G7d timer-preemptive scheduling ve G8 PSCI/SMP ayrı fiziksel kapılar olarak açık kalır.",
    ],
  },
snippet sha256: 20b18beb42c6file sha256: 9726dbf00f84
Focused test komutu
cargo test -p aselsan_microkernel_simulation --test rpi5_g7a_uart
Registry schema v5 · generator website/scripts/generate-code-gates.mjs · Tam SHA-256: 3050638b71a684d8f8f947a8a6faa237a17fa8db5dc0db04fb207b668b462af9