summaryrefslogtreecommitdiffstats
path: root/debug/risc-v-gsp-rm-vm/harness
diff options
context:
space:
mode:
Diffstat (limited to 'debug/risc-v-gsp-rm-vm/harness')
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/control_discovery.py2
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/mutation_harness.py2
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/port_driver_versions.py4
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/port_new_device.py4
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/portability_matrix.py2
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/reach.py2
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/value_demos/_common.py16
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/value_demos/s06_inject_service.py5
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/value_demos/s07_version_diff.py6
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/value_demos/s09_grabbing_a_ghidra_address.py8
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/value_demos/s10_full_session_evidence.py22
-rw-r--r--debug/risc-v-gsp-rm-vm/harness/version_diff.py2
12 files changed, 48 insertions, 27 deletions
diff --git a/debug/risc-v-gsp-rm-vm/harness/control_discovery.py b/debug/risc-v-gsp-rm-vm/harness/control_discovery.py
index ca671d2..1eb4971 100644
--- a/debug/risc-v-gsp-rm-vm/harness/control_discovery.py
+++ b/debug/risc-v-gsp-rm-vm/harness/control_discovery.py
@@ -806,7 +806,7 @@ def render_markdown(report: dict, options: "DiscoveryOptions") -> str:
lines = [
"# risc-v-gsp-rm-debugger control discovery report",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/control_discovery.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/control_discovery.py`.",
"",
f"* format: `{FORMAT}`",
f"* surface: `{report['surface']}`",
diff --git a/debug/risc-v-gsp-rm-vm/harness/mutation_harness.py b/debug/risc-v-gsp-rm-vm/harness/mutation_harness.py
index 9b4d102..4ae2345 100644
--- a/debug/risc-v-gsp-rm-vm/harness/mutation_harness.py
+++ b/debug/risc-v-gsp-rm-vm/harness/mutation_harness.py
@@ -439,7 +439,7 @@ def write_summary(options: HarnessOptions, findings: list[dict]) -> str:
lines = [
"# risc-v-gsp-rm-debugger mutation findings",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/mutation_harness.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/mutation_harness.py`.",
"",
f"* format: `{FORMAT}`",
f"* kernel: `{options.kernel}`",
diff --git a/debug/risc-v-gsp-rm-vm/harness/port_driver_versions.py b/debug/risc-v-gsp-rm-vm/harness/port_driver_versions.py
index f12b8e9..2d7416d 100644
--- a/debug/risc-v-gsp-rm-vm/harness/port_driver_versions.py
+++ b/debug/risc-v-gsp-rm-vm/harness/port_driver_versions.py
@@ -875,7 +875,7 @@ def render_version_markdown(entry: dict) -> str:
lines = [
f"# risc-v-gsp-rm-debugger port version {entry['version']}",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/port_driver_versions.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/port_driver_versions.py`.",
"",
f"* status: **{entry['status']}**",
f"* baseline: `{entry.get('baseline')}`",
@@ -906,7 +906,7 @@ def render_sweep_markdown(report: dict) -> str:
lines = [
"# risc-v-gsp-rm-debugger driver-version port sweep",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/port_driver_versions.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/port_driver_versions.py`.",
"",
f"* format: `{report['format']}`",
f"* baseline: `{report['baseline']['version']}` (`{report['baseline']['path']}`)",
diff --git a/debug/risc-v-gsp-rm-vm/harness/port_new_device.py b/debug/risc-v-gsp-rm-vm/harness/port_new_device.py
index 8ed1a0c..cf24cc6 100644
--- a/debug/risc-v-gsp-rm-vm/harness/port_new_device.py
+++ b/debug/risc-v-gsp-rm-vm/harness/port_new_device.py
@@ -468,7 +468,7 @@ def render_checklist_markdown(checklist: dict) -> str:
lines = [
f"# risc-v-gsp-rm-debugger port checklist: {checklist['device']}",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/port_new_device.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/port_new_device.py`.",
"",
f"* firmware: `{checklist['firmware']}`",
f"* reference: `{checklist['reference']}`",
@@ -587,7 +587,7 @@ def render_report_markdown(report: dict) -> str:
lines = [
f"# risc-v-gsp-rm-debugger device port: {report['device']}",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/port_new_device.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/port_new_device.py`.",
"",
f"* format: `{report['format']}`",
f"* firmware: `{report['firmware']['path']}` ({report['firmware']['kind']}, "
diff --git a/debug/risc-v-gsp-rm-vm/harness/portability_matrix.py b/debug/risc-v-gsp-rm-vm/harness/portability_matrix.py
index 68ffdd3..a30bb7c 100644
--- a/debug/risc-v-gsp-rm-vm/harness/portability_matrix.py
+++ b/debug/risc-v-gsp-rm-vm/harness/portability_matrix.py
@@ -565,7 +565,7 @@ def render_markdown(report: dict, options: MatrixOptions) -> str:
lines = [
"# risc-v-gsp-rm-debugger portability delta report",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/portability_matrix.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/portability_matrix.py`.",
"",
f"* format: `{report['format']}` (risc-v-gsp-rm-debugger {_greeneye_version()})",
f"* backend: `{report['backend']}` (qemu available: {report['qemu_available']})",
diff --git a/debug/risc-v-gsp-rm-vm/harness/reach.py b/debug/risc-v-gsp-rm-vm/harness/reach.py
index 68934b1..5447364 100644
--- a/debug/risc-v-gsp-rm-vm/harness/reach.py
+++ b/debug/risc-v-gsp-rm-vm/harness/reach.py
@@ -673,7 +673,7 @@ def render_markdown(report: dict, options: ReachOptions) -> str:
lines = [
"# risc-v-gsp-rm-debugger reachability report",
"",
- "> TOOL IN DEVELOPMENT - NOT READY YET! Generated by `harness/reach.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/reach.py`.",
"",
f"* format: `{FORMAT}`",
f"* target: `{report['target']}` @ `{report['target_addr']:#x}`",
diff --git a/debug/risc-v-gsp-rm-vm/harness/value_demos/_common.py b/debug/risc-v-gsp-rm-vm/harness/value_demos/_common.py
index 0733c48..ebbc390 100644
--- a/debug/risc-v-gsp-rm-vm/harness/value_demos/_common.py
+++ b/debug/risc-v-gsp-rm-vm/harness/value_demos/_common.py
@@ -17,6 +17,7 @@ import json
import os
import shutil
import sys
+import tempfile
import time
HERE = os.path.dirname(os.path.abspath(__file__))
@@ -95,11 +96,24 @@ def artifact_dir(name: str) -> str:
return path
+def session_dir(root: str, label: str = "session") -> str:
+ """A unique recording dir under ``root``.
+
+ Demos share a fixed artifact root so their reports are discoverable, but
+ two concurrent demo runs (tests, agents) must never share one
+ ``events.jsonl`` or a reader can see a half-written recording.
+ """
+ os.makedirs(root, exist_ok=True)
+ return tempfile.mkdtemp(prefix=f"{label}-", dir=root)
+
+
def write_json(path: str, payload) -> str:
os.makedirs(os.path.dirname(path), exist_ok=True)
- with open(path, "w", encoding="utf-8") as fh:
+ tmp = f"{path}.tmp-{os.getpid()}"
+ with open(tmp, "w", encoding="utf-8") as fh:
json.dump(payload, fh, indent=2, sort_keys=True)
fh.write("\n")
+ os.replace(tmp, path)
return path
diff --git a/debug/risc-v-gsp-rm-vm/harness/value_demos/s06_inject_service.py b/debug/risc-v-gsp-rm-vm/harness/value_demos/s06_inject_service.py
index 04dd001..dc5949e 100644
--- a/debug/risc-v-gsp-rm-vm/harness/value_demos/s06_inject_service.py
+++ b/debug/risc-v-gsp-rm-vm/harness/value_demos/s06_inject_service.py
@@ -76,7 +76,8 @@ def run() -> dict:
C.write_json(os.path.join(out, "inject.json"), payload)
return payload
- session = ge.launch(kernel=C.DEMO_ELF, backend=backend, record=os.path.join(out, "session"), name="vd-s06")
+ session_dir = C.session_dir(out)
+ session = ge.launch(kernel=C.DEMO_ELF, backend=backend, record=session_dir, name="vd-s06")
try:
ctrl = session.symbols.lookup("gsp_ctrl")
session.run(duration=0.25)
@@ -96,7 +97,7 @@ def run() -> dict:
"remote": {"ping": remote_ping, "sum": remote_sum},
"via_firmware": {"ping": via_fw_ping, "sum": via_fw_sum},
"mailbox_command": C.INJECT_CMD_BASE + C.SERVICE_SLOT,
- "session": os.path.relpath(os.path.join(out, "session"), C.TOOL_ROOT),
+ "session": os.path.relpath(session_dir, C.TOOL_ROOT),
"question": "load/register/invoke a service blob end-to-end, both routes",
"answer": (
f"service loaded at {service.load_addr:#x}, slot {service.slot} "
diff --git a/debug/risc-v-gsp-rm-vm/harness/value_demos/s07_version_diff.py b/debug/risc-v-gsp-rm-vm/harness/value_demos/s07_version_diff.py
index eaad957..e752807 100644
--- a/debug/risc-v-gsp-rm-vm/harness/value_demos/s07_version_diff.py
+++ b/debug/risc-v-gsp-rm-vm/harness/value_demos/s07_version_diff.py
@@ -106,8 +106,10 @@ def run() -> dict:
schema = C.load_schema(ge)
results = {}
+ session_dirs = {}
for label, path in (("A", va), ("B", vb)):
- session = ge.launch(kernel=path, backend=backend, record=os.path.join(out, f"session-{label}"), name=f"vd-s07-{label}")
+ session_dirs[label] = C.session_dir(out, f"session-{label}")
+ session = ge.launch(kernel=path, backend=backend, record=session_dirs[label], name=f"vd-s07-{label}")
try:
ctrl = session.symbols.lookup("gsp_ctrl")
dispatches = []
@@ -134,7 +136,7 @@ def run() -> dict:
session.close()
compare_md = compare_sessions(
- os.path.join(out, "session-A"), os.path.join(out, "session-B"), symbols=session.symbols, max_rows=20
+ session_dirs["A"], session_dirs["B"], symbols=session.symbols, max_rows=20
)
C.write_text(os.path.join(out, "compare-sessions.md"), compare_md)
moved = sorted(
diff --git a/debug/risc-v-gsp-rm-vm/harness/value_demos/s09_grabbing_a_ghidra_address.py b/debug/risc-v-gsp-rm-vm/harness/value_demos/s09_grabbing_a_ghidra_address.py
index 1d30b58..5bd1efe 100644
--- a/debug/risc-v-gsp-rm-vm/harness/value_demos/s09_grabbing_a_ghidra_address.py
+++ b/debug/risc-v-gsp-rm-vm/harness/value_demos/s09_grabbing_a_ghidra_address.py
@@ -51,7 +51,8 @@ def run() -> dict:
backend = C.choose_backend("qemu")
out = C.artifact_dir("s09_grabbing_a_ghidra_address")
- names_tsv = os.path.join(out, "ghidra_names.tsv")
+ session_dir = C.session_dir(out)
+ names_tsv = os.path.join(session_dir, "ghidra_names.tsv")
facts = _ghidra_tsv(ge, names_tsv)
runtime_rpc_fault = ge.load_elf(C.DEMO_ELF)
addr_rpc_fault = None
@@ -95,7 +96,8 @@ def run() -> dict:
commands,
)
- session = ge.launch(kernel=C.DEMO_ELF, backend=backend, record=os.path.join(out, "session"), name="vd-s09")
+ session_dir = C.session_dir(out)
+ session = ge.launch(kernel=C.DEMO_ELF, backend=backend, record=session_dir, name="vd-s09")
try:
session.symbols.load_names_tsv(names_tsv, bias=BIAS)
ctrl = session.symbols.lookup("gsp_ctrl")
@@ -105,7 +107,7 @@ def run() -> dict:
session.run(duration=0.25)
session.memory.write_u64(ctrl + C.CTRL_MAILBOX, 6)
session.run(duration=0.25)
- hits_tsv = export_hits(os.path.join(out, "session"), os.path.join(out, "greeneye_hits.tsv"), symbols=session.symbols)
+ hits_tsv = export_hits(session_dir, os.path.join(session_dir, "greeneye_hits.tsv"), symbols=session.symbols)
payload = {
"success": len(hits) >= 1 and resolved == addr_rpc_fault,
"backend": backend,
diff --git a/debug/risc-v-gsp-rm-vm/harness/value_demos/s10_full_session_evidence.py b/debug/risc-v-gsp-rm-vm/harness/value_demos/s10_full_session_evidence.py
index f6cd48f..75d7b1e 100644
--- a/debug/risc-v-gsp-rm-vm/harness/value_demos/s10_full_session_evidence.py
+++ b/debug/risc-v-gsp-rm-vm/harness/value_demos/s10_full_session_evidence.py
@@ -67,7 +67,7 @@ def _trace_overhead(ge, out: str) -> dict:
import time
def timed(trace):
- record = os.path.join(out, "trace-off" if not trace else "trace-on")
+ record = C.session_dir(out, "trace-on" if trace else "trace-off")
start = time.monotonic()
session = ge.launch(kernel=C.DEMO_ELF, backend="native", record=record, trace=trace, name="vd-s10-trace")
run_start = time.monotonic()
@@ -134,19 +134,21 @@ def run() -> dict:
)
start = time.monotonic()
- session_a = _stimulus(ge, os.path.join(out, "session-A"), backend)
- session_b = _stimulus(ge, os.path.join(out, "session-B"), backend)
+ session_a_dir = C.session_dir(out, "session-A")
+ session_b_dir = C.session_dir(out, "session-B")
+ session_a = _stimulus(ge, session_a_dir, backend)
+ session_b = _stimulus(ge, session_b_dir, backend)
symbols = ge.SymbolDB()
symbols.load_elf(ge.load_elf(C.DEMO_ELF))
- report = render_summary(os.path.join(out, "session-A"), symbols=symbols, max_rows=30)
+ report = render_summary(session_a_dir, symbols=symbols, max_rows=30)
C.write_text(os.path.join(out, "analyze.md"), report)
- compare = compare_sessions(os.path.join(out, "session-A"), os.path.join(out, "session-B"), symbols=symbols, max_rows=30)
+ compare = compare_sessions(session_a_dir, session_b_dir, symbols=symbols, max_rows=30)
C.write_text(os.path.join(out, "compare.md"), compare)
- hits = export_hits(os.path.join(out, "session-A"), os.path.join(out, "greeneye_hits.tsv"), symbols=symbols)
+ hits = export_hits(session_a_dir, os.path.join(out, "greeneye_hits.tsv"), symbols=symbols)
trace = _trace_overhead(ge, out)
- size_a = _dir_size(os.path.join(out, "session-A"))
- size_b = _dir_size(os.path.join(out, "session-B"))
+ size_a = _dir_size(session_a_dir)
+ size_b = _dir_size(session_b_dir)
deltas_match = session_a["dispatches"] == session_b["dispatches"] and session_a["ping_reply"] == session_b["ping_reply"]
manifest = {
"format": "greeneye-value-evidence/1",
@@ -155,8 +157,8 @@ def run() -> dict:
"sha256": C.sha256_file(C.DEMO_ELF),
},
"sessions": {
- "a": {"path": os.path.relpath(os.path.join(out, "session-A"), C.TOOL_ROOT), "bytes": size_a, "sha256_manifest": C.sha256_file(os.path.join(out, "session-A", "events.jsonl"))},
- "b": {"path": os.path.relpath(os.path.join(out, "session-B"), C.TOOL_ROOT), "bytes": size_b, "sha256_manifest": C.sha256_file(os.path.join(out, "session-B", "events.jsonl"))},
+ "a": {"path": os.path.relpath(session_a_dir, C.TOOL_ROOT), "bytes": size_a, "sha256_manifest": C.sha256_file(os.path.join(session_a_dir, "events.jsonl"))},
+ "b": {"path": os.path.relpath(session_b_dir, C.TOOL_ROOT), "bytes": size_b, "sha256_manifest": C.sha256_file(os.path.join(session_b_dir, "events.jsonl"))},
},
"stimulus": {"commands": [1, 5], "arg0": 0x1234, "note": "PING then STATE"},
"observed": {"a": session_a, "b": session_b, "delta_match": deltas_match},
diff --git a/debug/risc-v-gsp-rm-vm/harness/version_diff.py b/debug/risc-v-gsp-rm-vm/harness/version_diff.py
index ccc6a15..8e57036 100644
--- a/debug/risc-v-gsp-rm-vm/harness/version_diff.py
+++ b/debug/risc-v-gsp-rm-vm/harness/version_diff.py
@@ -1225,7 +1225,7 @@ def render_markdown(report: dict, options: VersionDiffOptions) -> str:
lines = [
"# risc-v-gsp-rm-debugger version diff",
"",
- "> **# TOOL IN DEVELOPMENT - NOT READY YET!** Generated by `harness/version_diff.py`.",
+ "> Status: implemented, documented and tested (audit: docs/27-TOOL-AUDIT.md; value demos: docs/25-VALUE-VALIDATION.md). Generated by `harness/version_diff.py`.",
"",
f"* format: `{report['format']}`",
f"* targets: `{old['label']}` -> `{new['label']}`",