Do not copy kernel-allocated TLS

This commit is contained in:
Jeremy Soller
2019-04-20 10:36:18 -06:00
parent b9e03cbaed
commit 83f89912e0
2 changed files with 16 additions and 11 deletions
+7 -6
View File
@@ -55,6 +55,7 @@ impl Tcb {
let (tls, tcb_page) = Self::os_new(size)?;
let tcb_ptr = tcb_page.as_mut_ptr() as *mut Self;
// println!("New TCB: {:p}", tcb_ptr);
ptr::write(tcb_ptr, Self {
tls_end: tls.as_mut_ptr().add(tls.len()),
tls_len: tls.len(),
@@ -111,12 +112,12 @@ impl Tcb {
let range = master.range();
let data = master.data();
if let Some(tls_data) = tls.get_mut(range) {
println!(
"tls master {}: {:p}, {:#x}: {:p}, {:#x}",
i,
data.as_ptr(), data.len(),
tls_data.as_mut_ptr(), tls_data.len()
);
// println!(
// "tls master {}: {:p}, {:#x}: {:p}, {:#x}",
// i,
// data.as_ptr(), data.len(),
// tls_data.as_mut_ptr(), tls_data.len()
// );
tls_data.copy_from_slice(data);
} else {
+9 -5
View File
@@ -68,11 +68,15 @@ unsafe extern "C" fn pte_osThreadShim(
tls_masters_ptr: *mut Master,
tls_masters_len: usize
) {
let mut tcb = Tcb::new(tls_size).unwrap();
tcb.masters_ptr = tls_masters_ptr;
tcb.masters_len = tls_masters_len;
tcb.copy_masters().unwrap();
tcb.activate();
// The kernel allocated TLS does not have masters set, so do not attempt to copy it.
// It will be copied by the kernel.
if ! tls_masters_ptr.is_null() {
let mut tcb = Tcb::new(tls_size).unwrap();
tcb.masters_ptr = tls_masters_ptr;
tcb.masters_len = tls_masters_len;
tcb.copy_masters().unwrap();
tcb.activate();
}
// Wait until pte_osThreadStart
pte_osMutexLock(mutex);