diff --git a/l0dable/src/lib.rs b/l0dable/src/lib.rs
index e3960fdbedf7c0b89300226489f0022a53efa406..17623a48d716a0430743df255e82dca962dd948b 100644
--- a/l0dable/src/lib.rs
+++ b/l0dable/src/lib.rs
@@ -65,8 +65,9 @@ pub mod bindings {
 
     include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
 }
-use bindings::*;
 
+mod os;
+pub use os::*;
 mod display;
 pub use display::{Display, Color, LineStyle, FillStyle};
 mod buttons;
diff --git a/l0dable/src/os.rs b/l0dable/src/os.rs
new file mode 100644
index 0000000000000000000000000000000000000000..af7a2283924cf08464b0981f711d35b62753683c
--- /dev/null
+++ b/l0dable/src/os.rs
@@ -0,0 +1,23 @@
+use super::bindings::*;
+
+pub fn exec(path: &str) -> ! {
+    let mut pathbuf = super::str_to_cstr(path);
+    unsafe {
+        epic_exec(pathbuf.as_mut_ptr());
+    }
+    unreachable!()
+}
+
+pub fn exit(ret: i32) -> ! {
+    unsafe {
+        epic_exit(ret);
+    }
+    unreachable!()
+}
+
+pub fn system_reset() -> ! {
+    unsafe {
+        epic_system_reset();
+    }
+    unreachable!()
+}