sel4_kit/
ipc_buffer.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//! IPC Buffer
//!
//! 默认情况下 IPC_Buffer 在程序结尾后的一个页中
//!
//! 可以调用 [init_ipc_buffer] 初始化 IPC Buffer
//!
//! > Warning: 请注意 IPC Buffer 是 TLS 数据,请为每个线程都分配独占的一块内存
//!
use core::ptr;

use sel4::CapTypeForFrameObjectOfFixedSize;

/// 初始化 ipc_buffer
pub fn init_ipc_buffer() {
    sel4::set_ipc_buffer(get_ipc_buffer());
}

/// 获取 ipc_buffer 指针
///
/// 此指针在程序的结尾,ipc_buffer 是一块线程独占内存,暂时考虑为可变引用结构
/// NOTICE: 如果后续需要修改为其他结构也可以尝试正常工作
pub fn get_ipc_buffer() -> &'static mut sel4::IpcBuffer {
    unsafe {
        unsafe extern "C" {
            static _end: usize;
        }
        ((ptr::addr_of!(_end) as usize)
            .next_multiple_of(sel4::cap_type::Granule::FRAME_OBJECT_TYPE.bytes())
            as *mut sel4::IpcBuffer)
            .as_mut()
            .unwrap()
    }
}