elfloader: remove loading cantrip-builtins Bug: 294433731 Change-Id: Ie320618b920c9d6aa456721eb0d4dbf940d0c373
diff --git a/capsules/src/elfloader_capsule.rs b/capsules/src/elfloader_capsule.rs index 42ace5c..64157af 100644 --- a/capsules/src/elfloader_capsule.rs +++ b/capsules/src/elfloader_capsule.rs
@@ -27,7 +27,7 @@ page_len: u32, state: Cell<ElfLoaderState>, phantom: PhantomData<&'a ()>, - tasks: Cell<[(LoadTasks, bool); 9]>, + tasks: Cell<[(LoadTasks, bool); 7]>, current_task: OptionalCell<LoadTasks>, sel4_state: Cell<SEL4State>, } @@ -36,8 +36,7 @@ enum LoadTasks { FindFile(&'static str /* name */), LoadElfHeaders(&'static str /* name */), - LoadElf(&'static str /* name */, u32 /* offset */), - LoadBinary(&'static str /* name */, u32 /* base */), + LoadElf(&'static str /* name */), StartSmc, } @@ -45,8 +44,6 @@ struct SEL4State { kernel_offset: u32, capdl_loader_offset: u32, - cantrip_builtins_offset: u32, - cantrip_builtins_size: u32, kernel_entry_point: u32, capdl_loader_entry_point: u32, kernel_headers: [Option<Elf32Phdr>; 4], @@ -62,8 +59,6 @@ SEL4State { kernel_offset: 0, capdl_loader_offset: 0, - cantrip_builtins_offset: 0, - cantrip_builtins_size: 0, kernel_entry_point: 0, capdl_loader_entry_point: 0, kernel_headers: [None, None, None, None], @@ -76,28 +71,6 @@ } } -// Should I be part of self? -static LOAD_SEL4_TASKS: [(LoadTasks, bool); 9] = [ - (LoadTasks::FindFile("kernel"), false), - (LoadTasks::FindFile("capdl-loader"), false), - (LoadTasks::FindFile("cantrip-builtins"), false), - (LoadTasks::LoadElfHeaders("kernel"), false), - (LoadTasks::LoadElfHeaders("capdl-loader"), false), - (LoadTasks::LoadElf("kernel", 0), false), - ( - LoadTasks::LoadElf( - "capdl-loader", - 0, /* this should get mutated after previous */ - ), - false, - ), - // Hack: load the builtins bundle into the last .5M of memory; this - // can go away when the Mailbox protocol supports fetching files in - // the bundle from flash. - (LoadTasks::LoadBinary("cantrip-builtins", 0x50380000), false), - (LoadTasks::StartSmc, false), -]; - #[derive(Clone, Copy, PartialEq)] enum ElfLoaderState { Idle, @@ -118,12 +91,6 @@ u32, /* offset_in_page */ u32, /* already loaded */ ), - LoadBinary( - &'static str, /* name */ - u32, /* base */ - u32, /* cursor */ - u32, /* bytes_read */ - ), } impl<'a, F: hil::flash::Flash> ElfLoaderCapsule<'a, F> { @@ -138,7 +105,15 @@ page_len: 0, state: Cell::new(ElfLoaderState::Idle), phantom: PhantomData, - tasks: Cell::new(LOAD_SEL4_TASKS.clone()), + tasks: Cell::new([ + (LoadTasks::FindFile("kernel"), false), + (LoadTasks::FindFile("capdl-loader"), false), + (LoadTasks::LoadElfHeaders("kernel"), false), + (LoadTasks::LoadElfHeaders("capdl-loader"), false), + (LoadTasks::LoadElf("kernel"), false), + (LoadTasks::LoadElf("capdl-loader"), false), + (LoadTasks::StartSmc, false), + ]), current_task: OptionalCell::empty(), sel4_state: Cell::new(SEL4State::default()), } @@ -182,7 +157,7 @@ self.current_task.map_or_else( || { - // dprintf!("no current task\r\n"); + dprintf!("No current task\r\n"); loop {} }, |task| match task { @@ -192,11 +167,11 @@ LoadTasks::LoadElfHeaders(file) => { self.load_elf_headers(file); } - LoadTasks::LoadElf("kernel", _) => { + LoadTasks::LoadElf("kernel") => { dprintf!("Loading seL4 kernel\r\n"); self.load_elf("kernel", 0); } - LoadTasks::LoadElf("capdl-loader", _) => { + LoadTasks::LoadElf("capdl-loader") => { dprintf!("Loading capdl-loader to the page after seL4\r\n"); let sel4_pend = matcha_utils::round_up_to_page(matcha_utils::elf_loader::elf_phys_max_opt( @@ -208,10 +183,6 @@ ); self.load_elf("capdl-loader", offset); } - LoadTasks::LoadBinary(name, base) => { - dprintf!("Loading {} to {:X}\r\n", name, base); - self.load_binary(name, *base); - } LoadTasks::StartSmc => { // NB: ui_p_reg_start & co. come from the code in seL4 // the processes these values. @@ -276,16 +247,17 @@ } } } - _ => { - panic!("225"); - } + _ => panic!("225"), }, ); } pub fn load_sel4(&self) { - // May be able to remove this, if we clean up after done. - let tasks = LOAD_SEL4_TASKS.clone(); + // Reset task list to start over. + let mut tasks = self.tasks.get(); + for i in 0..tasks.len() { + tasks[i].1 = false; + } self.tasks.replace(tasks); self.run_next_task(); } @@ -298,30 +270,14 @@ "capdl-loader" => self.state.set(ElfLoaderState::LoadElfHeader( self.sel4_state.get().capdl_loader_offset, )), - _ => { - panic!("207"); - } + _ => panic!("207"), } match self.state.get() { - ElfLoaderState::LoadElfHeader(cursor) => { - self.read_page(cursor); - } - _ => { - panic!("214"); - } + ElfLoaderState::LoadElfHeader(cursor) => self.read_page(cursor), + _ => panic!("214"), } } - fn load_binary(&self, name: &'static str, base: u32) { - let cursor = match name { - "cantrip-builtins" => self.sel4_state.get().cantrip_builtins_offset, - _ => panic!("258"), - }; - let new_state = ElfLoaderState::LoadBinary(name, base, cursor, 0); - self.state.set(new_state); - self.read_page(cursor); - } - fn load_elf(&self, name: &'static str, offset: u32) { let phdr = match name { "kernel" => self.sel4_state.get().kernel_headers[0].unwrap(), @@ -359,16 +315,16 @@ ); match name { "kernel" => { - let mut sel4_state = self.sel4_state.get(); - sel4_state.kernel_bss_start = bss_start; - sel4_state.kernel_bss_size = bss_size; - self.sel4_state.replace(sel4_state); + let mut sel4_state = self.sel4_state.get(); + sel4_state.kernel_bss_start = bss_start; + sel4_state.kernel_bss_size = bss_size; + self.sel4_state.replace(sel4_state); }, "capdl-loader" => { - let mut sel4_state = self.sel4_state.get(); - sel4_state.capdl_bss_start = bss_start; - sel4_state.capdl_bss_size = bss_size; - self.sel4_state.replace(sel4_state); + let mut sel4_state = self.sel4_state.get(); + sel4_state.capdl_bss_start = bss_start; + sel4_state.capdl_bss_size = bss_size; + self.sel4_state.replace(sel4_state); }, _ => panic!("349"), }; @@ -404,9 +360,7 @@ sel4_state.capdl_loader_entry_point = elf_header.e_entry; self.sel4_state.replace(sel4_state); } - _ => { - panic!("290"); - } + _ => panic!("290"), }; }); match self.state.get() { @@ -418,18 +372,13 @@ 0, )); } - _ => { - panic!("245"); - } + _ => panic!("245"), } }); match self.state.get() { - ElfLoaderState::LoadProgramHeaderTable(cursor, _, _, _) => { - self.read_page(cursor); - } - _ => { - panic!("254"); - } + ElfLoaderState::LoadProgramHeaderTable(cursor, ..) => + self.read_page(cursor), + _ => panic!("254"), } } @@ -461,9 +410,7 @@ Some(slot) => { sel4_state.kernel_headers[slot] = Some(phdr); } - None => { - panic!("380"); - } + None => panic!("380"), } self.sel4_state.replace(sel4_state); } @@ -480,22 +427,16 @@ Some(slot) => { sel4_state.capdl_loader_headers[slot] = Some(phdr); } - None => { - panic!("380"); - } + None => panic!("380"), } self.sel4_state.replace(sel4_state); } - _ => { - panic!("317"); - } + _ => panic!("317"), }; }); } } - _ => { - panic!("335"); - } + _ => panic!("335"), }; }); match self.state.get() { @@ -513,56 +454,7 @@ self.run_next_task(); } } - _ => { - panic!("375"); - } - } - } - - fn load_binary_callback(&self) { - match self.state.get() { - ElfLoaderState::LoadBinary(name, base, cursor, bytes_read) => { - let size = match name { - "cantrip-builtins" => self.sel4_state.get().cantrip_builtins_size, - _ => panic!("463"), - }; - self.read_page.map(|page| { - let mut_page = page.as_mut(); - let remaining = size - bytes_read; - let bytes_in_this_page = core::cmp::min(remaining, self.page_len); - smc_ram_memcpy( - &mut mut_page[0..], - base + bytes_read, - bytes_in_this_page as usize, - ); - }); - - let new_state = if (bytes_read + self.page_len) >= size { - ElfLoaderState::Idle - } else { - ElfLoaderState::LoadBinary( - name, - base, - cursor + self.page_len, - bytes_read + self.page_len, - ) - }; - self.state.set(new_state); - match self.state.get() { - ElfLoaderState::Idle => { - self.run_next_task(); - } - ElfLoaderState::LoadBinary(_, _, cursor, _) => { - self.read_page(cursor); - } - _ => { - panic!("477"); - } - }; - } - _ => { - panic!("464"); - } + _ => panic!("375"), } } @@ -600,9 +492,7 @@ let segments = match name { "kernel" => self.sel4_state.get().kernel_headers, "capdl-loader" => self.sel4_state.get().capdl_loader_headers, - _ => { - panic!("461"); - } + _ => panic!("461"), }; let next_index = index + 1; let mut last_segment = false; @@ -637,9 +527,7 @@ } } } - _ => { - panic!("445"); - } + _ => panic!("445"), } } @@ -650,7 +538,6 @@ match self.state.get() { ElfLoaderState::FindingFile(name, cursor) => { let found_file = tar_header.name().contains(name); - let size = tar_header.size(); self.current_task.map(|task| match task { LoadTasks::FindFile(_file) => { if found_file { @@ -662,10 +549,6 @@ "capdl-loader" => { sel4_state.capdl_loader_offset = cursor + self.page_len; } - "cantrip-builtins" => { - sel4_state.cantrip_builtins_offset = cursor + self.page_len; - sel4_state.cantrip_builtins_size = size; - } _ => {} } self.sel4_state.replace(sel4_state); @@ -677,7 +560,7 @@ .set(ElfLoaderState::FindingFile(name, new_cursor)); } } - LoadTasks::LoadElf(_file, _) => { + LoadTasks::LoadElf(_file) => { if found_file { self.state .set(ElfLoaderState::LoadElfHeader(cursor + self.page_len)); @@ -688,30 +571,18 @@ .set(ElfLoaderState::FindingFile(name, new_cursor)); } } - _ => { - panic!("487"); - } + _ => panic!("487"), }) } - _ => { - panic!("491"); - } + _ => panic!("491"), }; }); match self.state.get() { - ElfLoaderState::FindingFile(_, cursor) => { - self.read_page(cursor); - } - ElfLoaderState::LoadElfHeader(cursor) => { - self.read_page(cursor); - } - ElfLoaderState::Idle => { - self.run_next_task(); - } - _ => { - panic!("507"); - } + ElfLoaderState::FindingFile(_, cursor) => self.read_page(cursor), + ElfLoaderState::LoadElfHeader(cursor) => self.read_page(cursor), + ElfLoaderState::Idle => self.run_next_task(), + _ => panic!("507"), } } @@ -739,6 +610,7 @@ if self.fpga { self.load_sel4(); } else { + dprintf!("Simulation; bypass loading from SPI flash\r\n"); self.mailbox_hal.map(|mb| { matcha_utils::load_sel4(mb); }); @@ -767,24 +639,14 @@ self.read_page.replace(read_page); self.flash_busy.set(false); match self.state.get() { - ElfLoaderState::FindingFile(_, _) => { - self.find_file_callback(); - } - ElfLoaderState::LoadElfHeader(_) => { - self.load_elf_header_callback(); - } - ElfLoaderState::LoadProgramHeaderTable(_, _, _, _) => { - self.load_program_header_table_callback(); - } - ElfLoaderState::LoadSegmentsNew(_, _, _, _, _, _, _) => { - self.load_segment_callback(); - } - ElfLoaderState::LoadBinary(_, _, _, _) => { - self.load_binary_callback(); - } - _ => { - panic!("583"); - } + ElfLoaderState::FindingFile(..) => self.find_file_callback(), + ElfLoaderState::LoadElfHeader(..) => + self.load_elf_header_callback(), + ElfLoaderState::LoadProgramHeaderTable(..) => + self.load_program_header_table_callback(), + ElfLoaderState::LoadSegmentsNew(..) => + self.load_segment_callback(), + _ => panic!("583"), } } fn write_complete(