Files
RedBear-OS/src/header/dl-tls/mod.rs
T
2019-04-21 15:45:55 -06:00

46 lines
1.2 KiB
Rust

//! dl-tls implementation for Redox
use ld_so::tcb::Tcb;
use platform::types::*;
#[repr(C)]
pub struct dl_tls_index {
pub ti_module: u64,
pub ti_offset: u64,
}
#[no_mangle]
pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void {
trace!(
"__tls_get_addr({:p}: {:#x}, {:#x})",
ti,
(*ti).ti_module,
(*ti).ti_offset
);
if let Some(tcb) = Tcb::current() {
if let Some(tls) = tcb.tls() {
if let Some(masters) = tcb.masters() {
if let Some(master) = masters.get((*ti).ti_module as usize) {
let addr = tls
.as_mut_ptr()
.add(master.offset + (*ti).ti_offset as usize);
trace!(
"__tls_get_addr({:p}: {:#x}, {:#x}) = {:p}",
ti,
(*ti).ti_module,
(*ti).ti_offset,
addr
);
return addr as *mut c_void;
}
}
}
}
panic!(
"__tls_get_addr({:p}: {:#x}, {:#x}) failed",
ti,
(*ti).ti_module,
(*ti).ti_offset
);
}