summaryrefslogtreecommitdiffstats
path: root/bins
diff options
context:
space:
mode:
Diffstat (limited to 'bins')
-rw-r--r--bins/boom/Cargo.toml10
-rw-r--r--bins/boom/src/main.rs31
-rw-r--r--bins/hello/Cargo.toml10
-rw-r--r--bins/hello/src/main.rs33
4 files changed, 84 insertions, 0 deletions
diff --git a/bins/boom/Cargo.toml b/bins/boom/Cargo.toml
new file mode 100644
index 0000000..2d31886
--- /dev/null
+++ b/bins/boom/Cargo.toml
@@ -0,0 +1,10 @@
1[package]
2name = "boom"
3version.workspace = true
4edition.workspace = true
5
6[lints]
7workspace = true
8
9[dependencies]
10rsapi = { path = "../../rsapi" }
diff --git a/bins/boom/src/main.rs b/bins/boom/src/main.rs
new file mode 100644
index 0000000..0c3201b
--- /dev/null
+++ b/bins/boom/src/main.rs
@@ -0,0 +1,31 @@
1//! boom — crash-containment probe (ADR 0006 Phase 2 gate).
2//!
3//! Deliberately faults on an unmapped address. The kernel must kill only
4//! this task; the shell survives and `jobs` shows the corpse.
5
6#![no_std]
7#![no_main]
8
9#[panic_handler]
10fn panic(_info: &core::panic::PanicInfo) -> ! {
11 loop {
12 core::hint::spin_loop();
13 }
14}
15
16/// The image entry point — the loader jumps here with the ABI arguments.
17#[unsafe(no_mangle)]
18pub extern "C" fn efi_main(
19 _exports: &'static rsapi::Exports,
20 _argc: usize,
21 _argv: *const rsapi::Arg,
22) -> i32 {
23 // Canonical-but-unmapped address (below 2^47, above any RAM/MMIO):
24 // the page walk terminates at a not-present entry → #PF with
25 // CR2 = address. Same trick as the built-in `fault` command.
26 unsafe {
27 let p = 0x4000_0000_0000usize as *mut u64;
28 p.write_volatile(0xDEAD_BEEF);
29 }
30 0
31}
diff --git a/bins/hello/Cargo.toml b/bins/hello/Cargo.toml
new file mode 100644
index 0000000..ac71ded
--- /dev/null
+++ b/bins/hello/Cargo.toml
@@ -0,0 +1,10 @@
1[package]
2name = "hello"
3version.workspace = true
4edition.workspace = true
5
6[lints]
7workspace = true
8
9[dependencies]
10rsapi = { path = "../../rsapi" }
diff --git a/bins/hello/src/main.rs b/bins/hello/src/main.rs
new file mode 100644
index 0000000..d1d58df
--- /dev/null
+++ b/bins/hello/src/main.rs
@@ -0,0 +1,33 @@
1//! hello — the first rs-dos external binary (ADR 0006 Phase 2 gate).
2//!
3//! Prints one line through the injected Exports table and exits 0.
4//! Exercises the whole chain: PE32+ load, relocation, ABI call, task exit.
5
6#![no_std]
7#![no_main]
8
9use rsapi::Exports;
10
11#[panic_handler]
12fn panic(_info: &core::panic::PanicInfo) -> ! {
13 loop {
14 core::hint::spin_loop();
15 }
16}
17
18/// The image entry point — the loader jumps here with the ABI arguments
19/// (exports table, argc, argv). The conventional UEFI name is kept so
20/// the PE looks normal; the signature is the rs-dos ABI.
21#[unsafe(no_mangle)]
22pub extern "C" fn efi_main(exports: &'static Exports, _argc: usize, _argv: *const rsapi::Arg) -> i32 {
23 let msg = b"hello, world - from an external binary";
24 let line = rsapi::Line {
25 ptr: msg.as_ptr(),
26 len: msg.len(),
27 };
28 if (exports.put_line)(line) {
29 0
30 } else {
31 1
32 }
33}