S265 · SOURCE-BOUND GATE EVIDENCE
G8l: context-switch old-ASID read-access guard genişletmesi
Operations --test hedefi → focused test içindeki include_str!/#[path] bağı → kaynak kesiti Bu sayfa yalnız S265 kapısına aittir; komşu kapıların kaynakları bu kabulün içine katılmaz.
S265Focused kod testiOperations id exactsource SHA exacttest target exact
operation: g8l-s265-context-switch-old-asid-read-access-guard-expansion-partial
uygulama/model · focused test · Operations · 3 exact excerpt
sequence-bound=true · implementation-bound=true
01 · Testin bağlı olduğu uygulama/model kodu
Kapının yürüttüğü gerçek kaynak
tam Rust öğesiL6260–L6314
kernel/src/task/scheduler.rs::maybe_switch_to_task_address_space
/// M8.2 (18-agent audit fix) — TTBR0 switch policy.
///
/// KRİTİK: KERNEL_ROOT sabiti (0x4020_0000) `ROOT_PAGE_TABLE` statik
/// adresini garanti etmez (linker layout'a bağlı). Bu yüzden hardcoded
/// adrese write_ttbr0_to çağrısı kernel'in kendi mapping'lerini
/// kaybetmesine → silent hung'a neden oluyordu.
///
/// Yeni politika:
/// - is_user=false → TTBR0'a HİÇ dokunma (kernel zaten kendi root'unu
/// yüklü tutuyor; switch yapmaya gerek yok).
/// - is_user=true → write_ttbr0_to(task.page_table_root, task.asid)
/// ve eski user ASID'i invalidate et.
#[inline]
pub unsafe fn maybe_switch_to_task_address_space(task: &Task) {
if !task.is_user {
// Kernel task'leri her zaman kernel TTBR0'unu kullanır — switch ETME.
return;
}
#[cfg(feature = "board-rpi5")]
let s265_scheduler_read_access = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s264_context_switch_old_asid_read_access_guard_expansion::acquire_s265_production_scheduler_read_access()
.unwrap_or_else(|error| {
panic!(
"S265 context-switch old-ASID scheduler read access failed closed: {:?}",
error
)
});
let old_asid = (&*core::ptr::addr_of!(SCHEDULER))
.current_task
.as_ref()
.map_or(0, |t| t.asid);
#[cfg(feature = "board-rpi5")]
drop(s265_scheduler_read_access);
if old_asid != 0 && old_asid != task.asid {
crate::arch::aarch64::mmu::invalidate_asid(old_asid);
}
crate::arch::aarch64::mmu::write_ttbr0_to(task.page_table_root, task.asid);
// SP_EL0 is banked architectural state, not part of TaskContext. A task
// resuming through the assembly exception epilogue therefore needs its
// saved user stack installed at every scheduler transition.
core::arch::asm!(
"msr sp_el0, {user_sp}",
user_sp = in(reg) task.user_sp,
options(nomem, nostack, preserves_flags)
);
crate::kprintln!(
"[M8.2] TTBR0 switched → '{}' (root=0x{:x}, asid={}) [old_asid={}]",
task.name,
task.page_table_root.as_u64(),
task.asid,
old_asid
);
}snippet sha256: 5fdc7be93f4f…file sha256: 838dd474448c…
02 · Doğrulayan test kodu
Operations komutuna bağlı focused test
tam Rust öğesiL113–L139
simulation/tests/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s264_context_switch_old_asid_read_access_guard_expansion.rs::s265_old_asid_snapshot_is_owned_and_guard_drops_before_mmu_side_effects
#[test]
fn s265_old_asid_snapshot_is_owned_and_guard_drops_before_mmu_side_effects() {
let scheduler = include_str!("../../kernel/src/task/scheduler.rs");
let path = function_slice(
scheduler,
"pub unsafe fn maybe_switch_to_task_address_space(",
"pub unsafe fn switch_to_kernel_address_space()",
);
let guard = path
.find("let s265_scheduler_read_access")
.expect("S265 reader guard");
let read = path.find("addr_of!(SCHEDULER)").expect("old-ASID read");
let drop_guard = path
.find("drop(s265_scheduler_read_access)")
.expect("S265 reader drop");
let invalidate = path
.find("invalidate_asid(old_asid)")
.expect("old-ASID invalidation");
let ttbr0 = path
.find("write_ttbr0_to(task.page_table_root, task.asid)")
.expect("TTBR0 switch");
assert!(guard < read && read < drop_guard && drop_guard < invalidate && drop_guard < ttbr0);
assert_eq!(path.matches("addr_of!(SCHEDULER)").count(), 1);
assert!(!path.contains("addr_of_mut!("));
assert!(!path.contains("&'static"));
}snippet sha256: 8d6b73dd25fa…file sha256: 57e7a7451b28…
03 · Kapı kimlik kaydı
Operations sıra, kimlik ve başlık bağı
tam Operations kaydıL18245–L18302
website/src/lib/operations.ts::g8l-s265-context-switch-old-asid-read-access-guard-expansion-partial
{
id: "g8l-s265-context-switch-old-asid-read-access-guard-expansion-partial",
date: "2026-08-26",
sequence: 265,
status: "passed",
umbrella_status: "partial",
title: "G8l: context-switch old-ASID read-access guard genişletmesi",
summary:
"S265 12/12 PASS ile maybe_switch_to_task_address_space içindeki tek immutable old_asid scheduler okumasını mevcut production reader gate'ine aldı. old_asid scalar snapshot olarak reader altında kopyalanıyor; reader MMU invalidation, TTBR0 kurulumu ve diğer context-switch yan etkilerinden önce düşüyor. Coverage 36/111'den 37/111'e çıktı, 74 site unrouted kaldı. Writer'lar, exclusive wrapper ve whole-scheduler exclusion açık olduğundan umbrella PARTIAL kalır.",
evidence: [
"S265 focused kaynak kapısı iki byte-equal koşuda 12/12 PASS verdi: 127 B / SHA-256 7c5c027e04834587141f9fff89aea670906490a9f834012d2adbd7279dba720b.",
"Exact source coverage: 7 audit unit / 111 direct SCHEDULER site; previous=36, additional=1, guarded=37, unrouted=74. Routed read yalnız maybe_switch_to_task_address_space içindeki old_asid snapshot'ıdır.",
"old_asid reader altında scalar Copy olarak alınır; reader explicit drop ile invalidate_asid ve write_ttbr0_to öncesinde kapanır. Mutable scheduler alias'ı ve scheduler referans escape'i yoktur.",
"S238–S265 exact dependency matrisi iki bağımsız koşuda 29 grup / 387/387 PASS verdi: raw 2754 B / SHA-256 9473bb625533af635eeee9191ab5fdaa52864dd0e2bc156728d19679759439f9; süre-normalize 2899 B / SHA-256 5990cb989d44938da75bd58450025e45c757169d0bc06bc2b7c077376809af92.",
"Default/QEMU AArch64 check iki byte-equal koşuda PASS: 110646 B / 291 warning başlığı / SHA-256 c8c9d6ab3044d497d3ec207f203c5f5e53d2b3bb906f827f763b1989edb3e726. Zero-warning iddiası yoktur.",
"RPi5 normal/SMP profilleri ikişer byte-equal PASS: normal 360361 B / 701 warning / SHA-256 4741eb01d39023a2a2f45ef3a2c4666e230849098f3e139dedf45ad3f675007d; SMP 360303 B / 701 warning / SHA-256 edeea7bc0d17563c82689741d151596986aaaee44fd5c6d38589e623a93acac6.",
"make verify-qemu iki bağımsız koşuda PASS verdi: ilk 116084 B / SHA-256 1a63faa6464f6c069b8cd6cb744dc36612aaf191c655fefdc2e8a4a7051192cf, ikinci 116084 B / SHA-256 6cf281f402b4c0972fc1f7ea33cb57c3ced9ad261be1664be9a9f7baccdb8336. W^X 31/31, S130–S154, S154 1024 retirement, IPC 20/20, SEC5 ve kernel faults=0 korunur; QEMU board-rpi5-only reader route'unu çalıştırmaz.",
"Manifest-aware workspace audit'inde exact 7 tarihsel G8h assertion filtrelenerek 227 grup / 2141 PASS, 0 fail ölçüldü; filtresiz koşu frozen S96 exceptions.S identity mismatch nedeniyle exit 101 kaldı. Beklentiler gevşetilmedi ve full-workspace GREEN iddia edilmez.",
"S265 physical/device operations=0; RUNBOOK_EXECUTED_IN_S265=NO. Tarihsel S124 physical BOOT8H PASS ve tam operatör sırası görünür biçimde korunur.",
"Canlı marker: S265_12_OF_12_OLD_ASID_SCALAR_SNAPSHOT_READER_DROPPED_BEFORE_MMIO_CONTEXT_SWITCH_EFFECTS_PREVIOUS_36_OF_111_TOTAL_37_OF_111_GUARDED_74_UNROUTED_NO_WRITER_COVERAGE_NO_PRODUCTION_EXCLUSIVE_WRAPPER_NO_WHOLE_SCHEDULER_EXCLUSION_NO_RPI5_RUNTIME_INVOCATION_WORKSPACE_2141_PASS_7_HISTORICAL_G8H_ASSERTIONS_RED_NO_RUNBOOK_EXECUTED_IN_S265_VERIFIED.",
],
commands: [
"cargo test --quiet -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s264_context_switch_old_asid_read_access_guard_expansion -- --test-threads=1",
"cargo check --quiet -p aselsan_kernel --target aarch64-unknown-none",
"cargo check --quiet -p aselsan_kernel --target aarch64-unknown-none --no-default-features --features board-rpi5",
"cargo check --quiet -p aselsan_kernel --target aarch64-unknown-none --no-default-features --features board-rpi5,smp",
"make verify-qemu",
],
terminalSessions: [
{
id: "s265-g8l-context-switch-old-asid-read-access-guard-expansion",
title:
"G8l S265 context-switch old-ASID read-access guard genişletmesi",
commandLines: [
"cargo test --quiet -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s264_context_switch_old_asid_read_access_guard_expansion -- --test-threads=1",
"make verify-qemu",
],
outputLines: [
"test result: ok; S265 focused 1 group / 12 passed; 0 failed",
"coverage: previous 36 + additional 1 = 37/111 guarded; 74 unrouted",
"old_asid scalar snapshot copied under reader; reader dropped before invalidate_asid/write_ttbr0_to",
"QEMU common regression PASS: W^X 31/31 · S130–S154 · S154 retired 1024 · IPC 20/20 · SEC5 · kernel faults 0",
],
exitCode: 0,
outputMode: "selected",
},
],
terminalSessionsNote:
"S265 yalnız bir immutable scalar snapshot route'unu guard'lar; QEMU ortak regresyondur ve RPi5-only reader route'unun runtime invocation kanıtı değildir.",
limitations: [
"Toplam 37/111 scheduler erişimi guarded, 74 erişim unrouted kalır.",
"Bütün scheduler writer yolları, production exclusive wrapper, provider authority ve whole-scheduler exclusion proof yoktur.",
"QEMU ortak runtime regresyonudur; board-rpi5-only S265 reader route'unu çalıştırmaz.",
"Exact yedi tarihsel G8h assertion filtresiz workspace'i kırmızı tutar; full-workspace GREEN iddia edilmez.",
"Fiziksel RPi, CPU2/CPU3, hotplug, soak ve Generic SMP açık kalır.",
"S265 fiziksel/device operasyonu yapmadı; RUNBOOK_EXECUTED_IN_S265=NO.",
],
},snippet sha256: 083ff77cf7df…file sha256: 9726dbf00f84…
Focused test komutu
cargo test --quiet -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s264_context_switch_old_asid_read_access_guard_expansion -- --test-threads=1proof: docs/M8.1-RPi5-G8l-S265-Context-Switch-Old-ASID-Read-Access-Guard-Expansion-Proof.md
Registry schema v5 · generator
website/scripts/generate-code-gates.mjs · Tam SHA-256: 3050638b71a684d8f8f947a8a6faa237a17fa8db5dc0db04fb207b668b462af9