std: xous: take eh_frame address from main args
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 <sean@xobs.io>
This commit is contained in:
parent
2a533df5bd
commit
a6b8de68a6
1 changed files with 28 additions and 1 deletions
|
@ -7,6 +7,28 @@ use crate::marker::PhantomData;
|
||||||
use crate::os::xous::ffi::Error as XousError;
|
use crate::os::xous::ffi::Error as XousError;
|
||||||
use crate::path::{self, PathBuf};
|
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))]
|
#[cfg(not(test))]
|
||||||
mod c_compat {
|
mod c_compat {
|
||||||
use crate::os::xous::ffi::exit;
|
use crate::os::xous::ffi::exit;
|
||||||
|
@ -20,7 +42,12 @@ mod c_compat {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[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() });
|
exit(unsafe { main() });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue