internal static ulong map_in(Multiboot.Module mod) { if (mod.virt_base_addr != 0) { return(mod.virt_base_addr); } mod.virt_base_addr = map_in(mod.base_addr, mod.length, mod.name); return(mod.virt_base_addr); }
internal static Process LoadELFModule(string name, Multiboot.Header mboot, SymbolTable stab, Dictionary <string, Process> running_processes, ulong stack_size, object[] parameters) { Multiboot.Module mod = find_module(mboot.modules, name); if (mod == null || mod.length == 0) { throw new Exception("Module: " + name + " not found"); } ulong mod_vaddr = map_in(mod); return(LoadELFModule(mod_vaddr, mod.length, name, mboot, stab, running_processes, stack_size, parameters)); }
internal static void LoadELFLibrary(string name, Multiboot.Header mboot, SymbolTable stab) { Formatter.Write("Loading library: ", arch.BootInfoOutput); Formatter.Write(name, arch.BootInfoOutput); Formatter.Write("... ", arch.BootInfoOutput); Multiboot.Module mod = find_module(mboot.modules, name); ulong mod_vaddr = map_in(mod); ulong load_vaddr = ElfReader.LoadModule(arch.VirtualRegions, arch.VirtMem, stab, mod_vaddr, mod.base_addr, name); ElfReader.LoadSymbols(stab, mod_vaddr, load_vaddr); Formatter.WriteLine("done", arch.BootInfoOutput); Formatter.Write(name, arch.DebugOutput); Formatter.Write(" library loaded, load address: ", arch.DebugOutput); Formatter.Write(load_vaddr, "X", arch.DebugOutput); Formatter.WriteLine(arch.DebugOutput); }