private void SvcUnmapMemory(AThreadState ThreadState) { long Dst = (long)ThreadState.X0; long Src = (long)ThreadState.X1; long Size = (long)ThreadState.X2; if (!IsValidPosition(Src)) { Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid src address {Src:x16}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); return; } if (!IsValidMapPosition(Dst)) { Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid dst address {Dst:x16}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); return; } AMemoryMapInfo DstInfo = Memory.Manager.GetMapInfo(Dst); Memory.Manager.Unmap(Dst, Size, (int)MemoryType.MappedMemory); Memory.Manager.Reprotect(Src, Size, DstInfo.Perm); Memory.Manager.ClearAttrBit(Src, Size, 0); ThreadState.X0 = 0; }
private void SvcQueryMemory(AThreadState ThreadState) { long InfoPtr = (long)ThreadState.X0; long Position = (long)ThreadState.X2; AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position); if (MapInfo == null) { long AddrSpaceEnd = MemoryRegions.AddrSpaceStart + MemoryRegions.AddrSpaceSize; long ReservedSize = (long)(ulong.MaxValue - (ulong)AddrSpaceEnd) + 1; MapInfo = new AMemoryMapInfo(AddrSpaceEnd, ReservedSize, (int)MemoryType.Reserved, 0, AMemoryPerm.None); } Memory.WriteInt64(InfoPtr + 0x00, MapInfo.Position); Memory.WriteInt64(InfoPtr + 0x08, MapInfo.Size); Memory.WriteInt32(InfoPtr + 0x10, MapInfo.Type); Memory.WriteInt32(InfoPtr + 0x14, MapInfo.Attr); Memory.WriteInt32(InfoPtr + 0x18, (int)MapInfo.Perm); Memory.WriteInt32(InfoPtr + 0x1c, 0); Memory.WriteInt32(InfoPtr + 0x20, 0); Memory.WriteInt32(InfoPtr + 0x24, 0); //TODO: X1. ThreadState.X0 = 0; ThreadState.X1 = 0; }
private void SvcCreateTransferMemory(AThreadState ThreadState) { long Src = (long)ThreadState.X1; long Size = (long)ThreadState.X2; int Perm = (int)ThreadState.X3; if (!IsValidPosition(Src)) { Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Src:x16}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); return; } AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Src); Memory.Manager.Reprotect(Src, Size, (AMemoryPerm)Perm); HTransferMem TMem = new HTransferMem(Memory, MapInfo.Perm, Src, Size); ulong Handle = (ulong)Process.HandleTable.OpenHandle(TMem); ThreadState.X0 = 0; ThreadState.X1 = Handle; }
private void SvcMapMemory(AThreadState ThreadState) { long Dst = (long)ThreadState.X0; long Src = (long)ThreadState.X1; long Size = (long)ThreadState.X2; if (!IsValidPosition(Src)) { Logging.Warn(LogClass.KernelSvc, $"Tried to map Memory at invalid src address {Src:x16}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); return; } if (!IsValidMapPosition(Dst)) { Logging.Warn(LogClass.KernelSvc, $"Tried to map Memory at invalid dst address {Dst:x16}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); return; } AMemoryMapInfo SrcInfo = Memory.Manager.GetMapInfo(Src); Memory.Manager.Map(Dst, Size, (int)MemoryType.MappedMemory, SrcInfo.Perm); Memory.Manager.Reprotect(Src, Size, AMemoryPerm.None); Memory.Manager.SetAttrBit(Src, Size, 0); ThreadState.X0 = 0; }
public int Padding; //SBZ public MemoryInfo(AMemoryMapInfo MapInfo) { BaseAddress = MapInfo.Position; Size = MapInfo.Size; MemType = MapInfo.Type; MemAttr = 0; MemPerm = (int)MapInfo.Perm; IpcRefCount = 0; DeviceRefCount = 0; Padding = 0; }
private void SvcCreateTransferMemory(AThreadState ThreadState) { long Position = (long)ThreadState.X1; long Size = (long)ThreadState.X2; int Perm = (int)ThreadState.X3; AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position); Memory.Manager.Reprotect(Position, Size, (AMemoryPerm)Perm); HTransferMem HndData = new HTransferMem(Memory, MapInfo.Perm, Position, Size); int Handle = Ns.Os.Handles.GenerateId(HndData); ThreadState.X1 = (ulong)Handle; ThreadState.X0 = (int)SvcResult.Success; }
private static void SvcCreateTransferMemory(Switch Ns, ARegisters Registers, AMemory Memory) { long Position = (long)Registers.X1; long Size = (long)Registers.X2; int Perm = (int)Registers.X3; AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position); Memory.Manager.Reprotect(Position, Size, (AMemoryPerm)Perm); HTransferMem HndData = new HTransferMem(Memory, MapInfo.Perm, Position, Size); int Handle = Ns.Os.Handles.GenerateId(HndData); Registers.X1 = (ulong)Handle; Registers.X0 = (int)SvcResult.Success; }
private void SvcQueryMemory(AThreadState ThreadState) { long InfoPtr = (long)ThreadState.X0; long Position = (long)ThreadState.X2; AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position); MemoryInfo Info = new MemoryInfo(MapInfo); Memory.WriteInt64(InfoPtr + 0x00, Info.BaseAddress); Memory.WriteInt64(InfoPtr + 0x08, Info.Size); Memory.WriteInt32(InfoPtr + 0x10, Info.MemType); Memory.WriteInt32(InfoPtr + 0x14, Info.MemAttr); Memory.WriteInt32(InfoPtr + 0x18, Info.MemPerm); Memory.WriteInt32(InfoPtr + 0x1c, Info.IpcRefCount); Memory.WriteInt32(InfoPtr + 0x20, Info.DeviceRefCount); Memory.WriteInt32(InfoPtr + 0x24, Info.Padding); //TODO: X1. ThreadState.X0 = (int)SvcResult.Success; ThreadState.X1 = 0; }
private static void SvcQueryMemory(Switch Ns, ARegisters Registers, AMemory Memory) { long InfoPtr = (long)Registers.X0; long Position = (long)Registers.X2; AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position); MemoryInfo Info = new MemoryInfo(MapInfo); Memory.WriteInt64(InfoPtr + 0x00, Info.BaseAddress); Memory.WriteInt64(InfoPtr + 0x08, Info.Size); Memory.WriteInt32(InfoPtr + 0x10, Info.MemType); Memory.WriteInt32(InfoPtr + 0x14, Info.MemAttr); Memory.WriteInt32(InfoPtr + 0x18, Info.MemPerm); Memory.WriteInt32(InfoPtr + 0x1c, Info.IpcRefCount); Memory.WriteInt32(InfoPtr + 0x20, Info.DeviceRefCount); Memory.WriteInt32(InfoPtr + 0x24, Info.Padding); //TODO: X1. Registers.X0 = (int)SvcResult.Success; Registers.X1 = 0; }