Skip to content
Snippets Groups Projects
Verified Commit 83f89912 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Do not copy kernel-allocated TLS

parent b9e03cba
No related branches found
No related tags found
No related merge requests found
...@@ -55,6 +55,7 @@ impl Tcb { ...@@ -55,6 +55,7 @@ impl Tcb {
let (tls, tcb_page) = Self::os_new(size)?; let (tls, tcb_page) = Self::os_new(size)?;
let tcb_ptr = tcb_page.as_mut_ptr() as *mut Self; let tcb_ptr = tcb_page.as_mut_ptr() as *mut Self;
// println!("New TCB: {:p}", tcb_ptr);
ptr::write(tcb_ptr, Self { ptr::write(tcb_ptr, Self {
tls_end: tls.as_mut_ptr().add(tls.len()), tls_end: tls.as_mut_ptr().add(tls.len()),
tls_len: tls.len(), tls_len: tls.len(),
...@@ -111,12 +112,12 @@ impl Tcb { ...@@ -111,12 +112,12 @@ impl Tcb {
let range = master.range(); let range = master.range();
let data = master.data(); let data = master.data();
if let Some(tls_data) = tls.get_mut(range) { if let Some(tls_data) = tls.get_mut(range) {
println!( // println!(
"tls master {}: {:p}, {:#x}: {:p}, {:#x}", // "tls master {}: {:p}, {:#x}: {:p}, {:#x}",
i, // i,
data.as_ptr(), data.len(), // data.as_ptr(), data.len(),
tls_data.as_mut_ptr(), tls_data.len() // tls_data.as_mut_ptr(), tls_data.len()
); // );
tls_data.copy_from_slice(data); tls_data.copy_from_slice(data);
} else { } else {
......
...@@ -68,11 +68,15 @@ unsafe extern "C" fn pte_osThreadShim( ...@@ -68,11 +68,15 @@ unsafe extern "C" fn pte_osThreadShim(
tls_masters_ptr: *mut Master, tls_masters_ptr: *mut Master,
tls_masters_len: usize tls_masters_len: usize
) { ) {
let mut tcb = Tcb::new(tls_size).unwrap(); // The kernel allocated TLS does not have masters set, so do not attempt to copy it.
tcb.masters_ptr = tls_masters_ptr; // It will be copied by the kernel.
tcb.masters_len = tls_masters_len; if ! tls_masters_ptr.is_null() {
tcb.copy_masters().unwrap(); let mut tcb = Tcb::new(tls_size).unwrap();
tcb.activate(); tcb.masters_ptr = tls_masters_ptr;
tcb.masters_len = tls_masters_len;
tcb.copy_masters().unwrap();
tcb.activate();
}
// Wait until pte_osThreadStart // Wait until pte_osThreadStart
pte_osMutexLock(mutex); pte_osMutexLock(mutex);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment