public void MapMirror(long Src, long Dst, long Size, int Type) { Src = AMemoryHelper.PageRoundDown(Src); Dst = AMemoryHelper.PageRoundDown(Dst); Size = AMemoryHelper.PageRoundUp(Size); long PagesCount = Size / PageSize; while (PagesCount-- > 0) { PTEntry SrcEntry = GetPTEntry(Src); PTEntry DstEntry = GetPTEntry(Dst); DstEntry.Map = PTMap.Mapped; DstEntry.Type = Type; DstEntry.Perm = SrcEntry.Perm; SrcEntry.Perm = AMemoryPerm.None; SrcEntry.Attr |= 1; SetPTEntry(Src, SrcEntry); SetPTEntry(Dst, DstEntry); Src += PageSize; Dst += PageSize; } }
public void SetHeapSize(long Size, int Type) { //TODO: Return error when theres no enough space to allocate heap. Size = AMemoryHelper.PageRoundUp(Size); long Position = HeapAddr; if ((ulong)Size < (ulong)HeapSize) { //Try to free now free area if size is smaller than old size. Position += Size; while ((ulong)Size < (ulong)HeapSize) { Allocator.Free(Position); Position += PageSize; } } else { //Allocate extra needed size. Position += HeapSize; Size -= HeapSize; MapPhys(Position, Size, Type, AMemoryPerm.RW); } HeapSize = Size; }
public void LoadProgram(IExecutable Program) { Executable Executable = new Executable(Program, Memory, ImageBase); Executables.Add(Executable); ImageBase = AMemoryHelper.PageRoundUp(Executable.ImageEnd); }
public void LoadProgram(IExecutable Program) { Logging.Info($"Image base at 0x{ImageBase:x16}."); Executable Executable = new Executable(Program, Memory, ImageBase); Executables.Add(Executable); ImageBase = AMemoryHelper.PageRoundUp(Executable.ImageEnd); }
public void LoadProgram(IExecutable Program) { if (Disposed) { throw new ObjectDisposedException(nameof(Process)); } Logging.Info(LogClass.Loader, $"Image base at 0x{ImageBase:x16}."); Executable Executable = new Executable(Program, Memory, ImageBase); Executables.Add(Executable); ImageBase = AMemoryHelper.PageRoundUp(Executable.ImageEnd); }
public bool Run(bool NeedsHbAbi = false) { if (Disposed) { throw new ObjectDisposedException(nameof(Process)); } this.NeedsHbAbi = NeedsHbAbi; if (Executables.Count == 0) { return(false); } MakeSymbolTable(); MapRWMemRegion( MemoryRegions.MainStackAddress, MemoryRegions.MainStackSize, MemoryType.Normal); long StackTop = MemoryRegions.MainStackAddress + MemoryRegions.MainStackSize; int Handle = MakeThread(Executables[0].ImageBase, StackTop, 0, 44, 0); if (Handle == -1) { return(false); } MainThread = HandleTable.GetData <KThread>(Handle); if (NeedsHbAbi) { HbAbiDataPosition = AMemoryHelper.PageRoundUp(Executables[0].ImageEnd); string SwitchPath = Ns.VFs.SystemPathToSwitchPath(Executables[0].FilePath); Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle, SwitchPath); MainThread.Thread.ThreadState.X0 = (ulong)HbAbiDataPosition; MainThread.Thread.ThreadState.X1 = ulong.MaxValue; } Scheduler.StartThread(MainThread); return(true); }
public void Reprotect(long Position, long Size, AMemoryPerm Perm) { Position = AMemoryHelper.PageRoundDown(Position); Size = AMemoryHelper.PageRoundUp(Size); long PagesCount = Size / PageSize; while (PagesCount-- > 0) { PTEntry Entry = GetPTEntry(Position); Entry.Perm = Perm; SetPTEntry(Position, Entry); Position += PageSize; } }