Do not copy kernel-allocated TLS
This commit is contained in:
+7
-6
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user