mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-18 05:52:05 +00:00
53 lines
1.6 KiB
Rust
53 lines
1.6 KiB
Rust
extern crate psm;
|
|
|
|
use std::panic;
|
|
|
|
const CHAIN_DEPTH: usize = 16;
|
|
|
|
psm::psm_stack_manipulation! {
|
|
yes {
|
|
use std::alloc;
|
|
const STACK_ALIGN: usize = 4096;
|
|
// Generating backraces (because of RUST_BACKTRACE) create a few quite large frames, so it is
|
|
// important, that all frames have sufficient amount of available memory to not run over the
|
|
// stack...
|
|
const FRAME_SIZE: usize = 4096 * 10;
|
|
|
|
fn panic_chain(depth: usize) {
|
|
if depth == 0 {
|
|
panic!("full chain!");
|
|
} else {
|
|
unsafe {
|
|
let layout = alloc::Layout::from_size_align(FRAME_SIZE, STACK_ALIGN).unwrap();
|
|
let new_stack = alloc::alloc(layout);
|
|
assert!(!new_stack.is_null(), "allocations must succeed!");
|
|
let p = psm::on_stack(new_stack, FRAME_SIZE, || {
|
|
panic::catch_unwind(|| {
|
|
panic_chain(depth - 1);
|
|
})
|
|
});
|
|
alloc::dealloc(new_stack, layout);
|
|
p.map_err(panic::resume_unwind).unwrap()
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
panic_chain(CHAIN_DEPTH);
|
|
}
|
|
|
|
#[test]
|
|
fn run_example() {
|
|
assert!(panic::catch_unwind(|| {
|
|
panic_chain(CHAIN_DEPTH);
|
|
}).is_err(), "Panic did not propagate!");
|
|
}
|
|
}
|
|
|
|
no {
|
|
fn main() {
|
|
eprintln!("Stack manipulation not supported by this target");
|
|
}
|
|
}
|
|
}
|