Skip to content

Commit

Permalink
std: xous: take eh_frame address from main args
Browse files Browse the repository at this point in the history
The main() function takes an argument that contains the eh_frame
address. Implement `unwinding` support by looking for unwinding data at
this address.

Signed-off-by: Sean Cross <[email protected]>
  • Loading branch information
xobs committed Dec 6, 2023
1 parent 2a533df commit a6b8de6
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion library/std/src/sys/xous/os.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 7,28 @@ use crate::marker::PhantomData;
use crate::os::xous::ffi::Error as XousError;
use crate::path::{self, PathBuf};

#[cfg(not(test))]
#[cfg(feature = "panic_unwind")]
mod eh_unwinding {
pub(crate) struct EhFrameFinder(usize /* eh_frame */);
pub(crate) static mut EH_FRAME_SETTINGS: EhFrameFinder = EhFrameFinder(0);
impl EhFrameFinder {
pub(crate) unsafe fn init(&mut self, eh_frame: usize) {
unsafe {
EH_FRAME_SETTINGS.0 = eh_frame;
}
}
}
unsafe impl unwind::EhFrameFinder for EhFrameFinder {
fn find(&self, _pc: usize) -> Option<unwind::FrameInfo> {
Some(unwind::FrameInfo {
text_base: None,
kind: unwind::FrameInfoKind::EhFrame(self.0),
})
}
}
}

#[cfg(not(test))]
mod c_compat {
use crate::os::xous::ffi::exit;
Expand All @@ -20,7 42,12 @@ mod c_compat {
}

#[no_mangle]
pub extern "C" fn _start() {
pub extern "C" fn _start(eh_frame: usize) {
#[cfg(feature = "panic_unwind")]
unsafe {
super::eh_unwinding::EH_FRAME_SETTINGS.init(eh_frame);
unwind::set_custom_eh_frame_finder(&super::eh_unwinding::EH_FRAME_SETTINGS).ok();
}
exit(unsafe { main() });
}

Expand Down

0 comments on commit a6b8de6

Please sign in to comment.