summaryrefslogtreecommitdiffstats
path: root/library/std/src/sys/xous/os.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
commit9918693037dce8aa4bb6f08741b6812923486c18 (patch)
tree21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /library/std/src/sys/xous/os.rs
parentReleasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff)
downloadrustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz
rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/std/src/sys/xous/os.rs')
-rw-r--r--library/std/src/sys/xous/os.rs29
1 files changed, 28 insertions, 1 deletions
diff --git a/library/std/src/sys/xous/os.rs b/library/std/src/sys/xous/os.rs
index 3d19fa4b3..8d2eaee8a 100644
--- a/library/std/src/sys/xous/os.rs
+++ b/library/std/src/sys/xous/os.rs
@@ -8,6 +8,28 @@ 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;
extern "C" {
@@ -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() });
}