From 0c6398abcba1187ec0c1e4f5c955df08b820d735 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 2 Aug 2020 14:32:20 -0600 Subject: [PATCH] Do not require allocation in static_init --- src/ld_so/mod.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/ld_so/mod.rs b/src/ld_so/mod.rs index efaf6bc5e9..88a4ce7ebe 100644 --- a/src/ld_so/mod.rs +++ b/src/ld_so/mod.rs @@ -1,3 +1,4 @@ +use core::{mem, ptr}; use goblin::elf::program_header::{self, program_header32, program_header64, ProgramHeader}; use self::tcb::{Master, Tcb}; @@ -11,6 +12,13 @@ mod library; pub mod linker; pub mod start; pub mod tcb; + +static mut STATIC_TCB_MASTER: Master = Master { + ptr: ptr::null_mut(), + len: 0, + offset: 0, +}; + pub fn static_init(sp: &'static Stack) { let mut phdr_opt = None; let mut phent_opt = None; @@ -61,15 +69,14 @@ pub fn static_init(sp: &'static Stack) { ph.p_memsz } as usize; - let tcb_master = Master { - ptr: ph.p_vaddr as usize as *const u8, - len: ph.p_filesz as usize, - offset: vsize - valign, - }; - unsafe { + STATIC_TCB_MASTER.ptr = ph.p_vaddr as usize as *const u8; + STATIC_TCB_MASTER.len = ph.p_filesz as usize; + STATIC_TCB_MASTER.offset = vsize - valign; + let tcb = Tcb::new(vsize).expect("failed to allocate TCB"); - tcb.set_masters(vec![tcb_master].into_boxed_slice()); + tcb.masters_ptr = &mut STATIC_TCB_MASTER; + tcb.masters_len = mem::size_of::(); tcb.copy_masters().expect("failed to copy TLS master data"); tcb.activate(); }