1use platform;
2
3pub struct Stack {
4 mem: *mut [u8]
5}
6
7unsafe impl Send for Stack {}
8
9impl Stack {
10 pub fn new(stack_size: usize) -> Stack {
11 let mem = platform::setup_stack(stack_size + *platform::PAGE_SIZE);
13 unsafe {
14 platform::setup_stack_guard_page(mem);
15 }
16 Stack {
17 mem: mem
18 }
19 }
20
21 pub fn initial_rsp(&self) -> usize {
22 let mem = unsafe { &mut *self.mem };
23 &mut mem[0] as *mut u8 as usize + mem.len()
24 }
25
26 pub fn get_mem(&self) -> *mut [u8] {
27 self.mem
28 }
29}
30
31impl Drop for Stack {
32 fn drop(&mut self) {
33 unsafe {
34 platform::free_stack(self.mem);
35 }
36 }
37}