Skip to content

Commit d84184a

Browse files
authored
Merge pull request #874 from mkroening/env-no-tls
refactor: remove get_tls_* functions
2 parents 9888a27 + 2cb192e commit d84184a

File tree

6 files changed

+21
-107
lines changed

6 files changed

+21
-107
lines changed

src/arch/aarch64/kernel/mod.rs

-38
Original file line numberDiff line numberDiff line change
@@ -75,44 +75,6 @@ pub fn get_limit() -> usize {
7575
boot_info().hardware_info.phys_addr_range.end as usize
7676
}
7777

78-
pub fn get_tls_start() -> VirtAddr {
79-
VirtAddr(
80-
boot_info()
81-
.load_info
82-
.tls_info
83-
.as_ref()
84-
.map(|tls_info| tls_info.start)
85-
.unwrap_or_default(),
86-
)
87-
}
88-
89-
pub fn get_tls_filesz() -> usize {
90-
boot_info()
91-
.load_info
92-
.tls_info
93-
.as_ref()
94-
.map(|tls_info| tls_info.filesz)
95-
.unwrap_or_default() as usize
96-
}
97-
98-
pub fn get_tls_memsz() -> usize {
99-
boot_info()
100-
.load_info
101-
.tls_info
102-
.as_ref()
103-
.map(|tls_info| tls_info.memsz)
104-
.unwrap_or_default() as usize
105-
}
106-
107-
pub fn get_tls_align() -> usize {
108-
boot_info()
109-
.load_info
110-
.tls_info
111-
.as_ref()
112-
.map(|tls_info| tls_info.align)
113-
.unwrap_or_default() as usize
114-
}
115-
11678
#[cfg(feature = "smp")]
11779
pub fn get_possible_cpus() -> u32 {
11880
CPU_ONLINE.load(Ordering::Acquire)

src/arch/aarch64/kernel/scheduler.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::arch::aarch64::kernel::CURRENT_STACK_ADDRESS;
1313
use crate::arch::aarch64::mm::paging::{BasePageSize, PageSize, PageTableEntryFlags};
1414
use crate::arch::aarch64::mm::{PhysAddr, VirtAddr};
1515
use crate::scheduler::task::{Task, TaskFrame};
16-
use crate::{env, DEFAULT_STACK_SIZE, KERNEL_STACK_SIZE};
16+
use crate::{kernel, DEFAULT_STACK_SIZE, KERNEL_STACK_SIZE};
1717

1818
#[derive(Debug)]
1919
#[repr(C, packed)]
@@ -264,21 +264,20 @@ pub struct TaskTLS {
264264

265265
impl TaskTLS {
266266
fn from_environment() -> Option<Box<Self>> {
267-
if env::get_tls_memsz() == 0 {
268-
return None;
269-
}
267+
let tls_info = kernel::boot_info().load_info.tls_info?;
268+
assert_ne!(tls_info.memsz, 0);
270269

271270
// Get TLS initialization image
272271
let tls_init_image = {
273-
let tls_init_data = env::get_tls_start().as_ptr::<u8>();
274-
let tls_init_len = env::get_tls_filesz();
272+
let tls_init_data = ptr::from_exposed_addr(tls_info.start.try_into().unwrap());
273+
let tls_init_len = tls_info.filesz.try_into().unwrap();
275274

276275
// SAFETY: We will have to trust the environment here.
277276
unsafe { slice::from_raw_parts(tls_init_data, tls_init_len) }
278277
};
279278

280-
let off = core::cmp::max(16, env::get_tls_align()) - 16;
281-
let block_len = env::get_tls_memsz() + off;
279+
let off = core::cmp::max(16, usize::try_from(tls_info.align).unwrap()) - 16;
280+
let block_len = usize::try_from(tls_info.memsz).unwrap() + off;
282281
let len = block_len + mem::size_of::<Box<[Dtv; 2]>>();
283282

284283
let layout = Layout::from_size_align(len, 16).unwrap();

src/arch/x86_64/kernel/mod.rs

-38
Original file line numberDiff line numberDiff line change
@@ -67,44 +67,6 @@ pub fn get_limit() -> usize {
6767
boot_info().hardware_info.phys_addr_range.end as usize
6868
}
6969

70-
pub fn get_tls_start() -> VirtAddr {
71-
VirtAddr(
72-
boot_info()
73-
.load_info
74-
.tls_info
75-
.as_ref()
76-
.map(|tls_info| tls_info.start)
77-
.unwrap_or_default(),
78-
)
79-
}
80-
81-
pub fn get_tls_filesz() -> usize {
82-
boot_info()
83-
.load_info
84-
.tls_info
85-
.as_ref()
86-
.map(|tls_info| tls_info.filesz)
87-
.unwrap_or_default() as usize
88-
}
89-
90-
pub fn get_tls_memsz() -> usize {
91-
boot_info()
92-
.load_info
93-
.tls_info
94-
.as_ref()
95-
.map(|tls_info| tls_info.memsz)
96-
.unwrap_or_default() as usize
97-
}
98-
99-
pub fn get_tls_align() -> usize {
100-
boot_info()
101-
.load_info
102-
.tls_info
103-
.as_ref()
104-
.map(|tls_info| tls_info.align)
105-
.unwrap_or_default() as usize
106-
}
107-
10870
pub fn get_mbinfo() -> VirtAddr {
10971
match boot_info().platform_info {
11072
PlatformInfo::Multiboot {

src/arch/x86_64/kernel/scheduler.rs

+12-16
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::arch::x86_64::mm::paging::{
1414
};
1515
use crate::arch::x86_64::mm::{PhysAddr, VirtAddr};
1616
use crate::config::*;
17-
use crate::env;
17+
use crate::kernel;
1818
use crate::scheduler::task::{Task, TaskFrame};
1919

2020
#[repr(C, packed)]
@@ -235,33 +235,29 @@ pub struct TaskTLS {
235235
}
236236

237237
impl TaskTLS {
238+
// For details on thread-local storage data structures see
239+
//
240+
// “ELF Handling For Thread-Local Storage” Section 3.4.6: x86-64 Specific Definitions for Run-Time Handling of TLS
241+
// https://akkadia.org/drepper/tls.pdf
238242
fn from_environment() -> Option<Box<Self>> {
239-
// For details on thread-local storage data structures see
240-
//
241-
// “ELF Handling For Thread-Local Storage” Section 3.4.6: x86-64 Specific Definitions for Run-Time Handling of TLS
242-
// https://akkadia.org/drepper/tls.pdf
243-
244-
let tls_len = env::get_tls_memsz();
245-
246-
if env::get_tls_memsz() == 0 {
247-
return None;
248-
}
243+
let tls_info = kernel::boot_info().load_info.tls_info?;
244+
assert_ne!(tls_info.memsz, 0);
249245

250246
// Get TLS initialization image
251247
let tls_init_image = {
252-
let tls_init_data = env::get_tls_start().as_ptr::<u8>();
253-
let tls_init_len = env::get_tls_filesz();
248+
let tls_init_data = ptr::from_exposed_addr(tls_info.start.try_into().unwrap());
249+
let tls_init_len = tls_info.filesz.try_into().unwrap();
254250

255251
// SAFETY: We will have to trust the environment here.
256252
unsafe { slice::from_raw_parts(tls_init_data, tls_init_len) }
257253
};
258254

259255
// Allocate TLS block
260256
let mut block = {
261-
let tls_align = env::get_tls_align();
262-
263257
// As described in “ELF Handling For Thread-Local Storage”
264-
let tls_offset = tls_len.align_up(tls_align);
258+
let tls_offset = usize::try_from(tls_info.memsz)
259+
.unwrap()
260+
.align_up(usize::try_from(tls_info.align).unwrap());
265261

266262
// To access TLS blocks on x86-64, TLS offsets are *subtracted* from the thread register value.
267263
// So the thread pointer needs to be `block_ptr + tls_offset`.

src/env.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ use hermit_entry::boot_info::PlatformInfo;
1111
use hermit_sync::OnceCell;
1212

1313
pub use crate::arch::kernel::{
14-
get_base_address, get_cmdline, get_cmdsize, get_image_size, get_ram_address, get_tls_align,
15-
get_tls_filesz, get_tls_memsz, get_tls_start,
14+
get_base_address, get_cmdline, get_cmdsize, get_image_size, get_ram_address,
1615
};
1716
use crate::kernel::boot_info;
1817

src/lib.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,7 @@ fn boot_processor_main() -> ! {
314314
info!("BSS starts at {:p}", unsafe {
315315
core::ptr::addr_of_mut!(__bss_start)
316316
});
317-
info!(
318-
"TLS starts at {:p} (size {} Bytes)",
319-
env::get_tls_start(),
320-
env::get_tls_memsz()
321-
);
317+
info!("tls_info = {:#x?}", kernel::boot_info().load_info.tls_info);
322318
arch::boot_processor_init();
323319
scheduler::add_current_core();
324320

0 commit comments

Comments
 (0)