vmbase: Support Bionic errno, abort(), FORTIFY_SOURCE
Add support for fundamental dependencies of Bionic libc functions we are
about to need.
Bug: 256148034
Bug: 256827715
Test: m pvmfw_img && atest vmbase_example.integration_test
Change-Id: Ie85b45ad3ff8b3299a58e28dd87c9acc811f1a9f
diff --git a/vmbase/src/bionic.rs b/vmbase/src/bionic.rs
index 8b3a076..b4a2f7b 100644
--- a/vmbase/src/bionic.rs
+++ b/vmbase/src/bionic.rs
@@ -14,6 +14,11 @@
//! Low-level compatibility layer between baremetal Rust and Bionic C functions.
+use core::ffi::c_char;
+use core::ffi::c_int;
+use core::ffi::CStr;
+
+use crate::eprintln;
use crate::linker;
/// Reference to __stack_chk_guard.
@@ -23,3 +28,37 @@
extern "C" fn __stack_chk_fail() -> ! {
panic!("stack guard check failed");
}
+
+/// Called from C to cause abnormal program termination.
+#[no_mangle]
+extern "C" fn abort() -> ! {
+ panic!("C code called abort()")
+}
+
+/// Error number set and read by C functions.
+pub static mut ERRNO: c_int = 0;
+
+#[no_mangle]
+unsafe extern "C" fn __errno() -> *mut c_int {
+ &mut ERRNO as *mut _
+}
+
+/// Reports a fatal error detected by Bionic.
+///
+/// # Safety
+///
+/// Input strings `prefix` and `format` must be properly NULL-terminated.
+///
+/// # Note
+///
+/// This Rust functions is missing the last argument of its C/C++ counterpart, a va_list.
+#[no_mangle]
+unsafe extern "C" fn async_safe_fatal_va_list(prefix: *const c_char, format: *const c_char) {
+ let prefix = CStr::from_ptr(prefix);
+ let format = CStr::from_ptr(format);
+
+ if let (Ok(prefix), Ok(format)) = (prefix.to_str(), format.to_str()) {
+ // We don't bother with printf formatting.
+ eprintln!("FATAL BIONIC ERROR: {prefix}: \"{format}\" (unformatted)");
+ }
+}