Code style fixes and nits on the HLE project (#355)

* Some style fixes and nits on ITimeZoneService

* Remove some unneeded usings

* Remove the Ryujinx.HLE.OsHle.Handles namespace

* Remove hbmenu automatic load on process exit

* Rename Ns to Device, rename Os to System, rename SystemState to State

* Move Exceptions and Utilities out of OsHle

* Rename OsHle to HOS

* Rename OsHle folder to HOS

* IManagerDisplayService and ISystemDisplayService style fixes

* BsdError shouldn't be public

* Add a empty new line before using static

* Remove unused file

* Some style fixes on NPDM

* Exit gracefully when the application is closed

* Code style fixes on IGeneralService

* Add 0x prefix on values printed as hex

* Small improvements on finalization code

* Move ProcessId and ThreadId out of AThreadState

* Rename VFs to FileSystem

* FsAccessHeader shouldn't be public. Also fix file names casing

* More case changes on NPDM

* Remove unused files

* Move using to the correct place on NPDM

* Use properties on KernelAccessControlMmio

* Address PR feedback
This commit is contained in:
gdkchan 2018-08-16 20:47:36 -03:00 committed by GitHub
parent 182d716867
commit 521751795a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
258 changed files with 1574 additions and 1546 deletions

View file

@ -18,8 +18,6 @@ namespace ChocolArm64
public event EventHandler WorkFinished; public event EventHandler WorkFinished;
public int ThreadId => ThreadState.ThreadId;
private int IsExecuting; private int IsExecuting;
public AThread(ATranslator Translator, AMemory Memory, long EntryPoint) public AThread(ATranslator Translator, AMemory Memory, long EntryPoint)

View file

@ -41,7 +41,7 @@ namespace ChocolArm64.Memory
} }
} }
private Dictionary<int, ArmMonitor> Monitors; private Dictionary<AThreadState, ArmMonitor> Monitors;
private ConcurrentDictionary<long, IntPtr> ObservedPages; private ConcurrentDictionary<long, IntPtr> ObservedPages;
@ -53,7 +53,7 @@ namespace ChocolArm64.Memory
public AMemory(IntPtr Ram) public AMemory(IntPtr Ram)
{ {
Monitors = new Dictionary<int, ArmMonitor>(); Monitors = new Dictionary<AThreadState, ArmMonitor>();
ObservedPages = new ConcurrentDictionary<long, IntPtr>(); ObservedPages = new ConcurrentDictionary<long, IntPtr>();
@ -75,7 +75,7 @@ namespace ChocolArm64.Memory
{ {
ClearExclusive(State); ClearExclusive(State);
Monitors.Remove(State.ThreadId); Monitors.Remove(State);
} }
} }
@ -93,11 +93,11 @@ namespace ChocolArm64.Memory
} }
} }
if (!Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon)) if (!Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{ {
ThreadMon = new ArmMonitor(); ThreadMon = new ArmMonitor();
Monitors.Add(ThreadState.ThreadId, ThreadMon); Monitors.Add(ThreadState, ThreadMon);
} }
ThreadMon.Position = Position; ThreadMon.Position = Position;
@ -113,7 +113,7 @@ namespace ChocolArm64.Memory
Monitor.Enter(Monitors); Monitor.Enter(Monitors);
if (!Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon)) if (!Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{ {
return false; return false;
} }
@ -130,7 +130,7 @@ namespace ChocolArm64.Memory
public void ClearExclusiveForStore(AThreadState ThreadState) public void ClearExclusiveForStore(AThreadState ThreadState)
{ {
if (Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon)) if (Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{ {
ThreadMon.ExState = false; ThreadMon.ExState = false;
} }
@ -142,7 +142,7 @@ namespace ChocolArm64.Memory
{ {
lock (Monitors) lock (Monitors)
{ {
if (Monitors.TryGetValue(ThreadState.ThreadId, out ArmMonitor ThreadMon)) if (Monitors.TryGetValue(ThreadState, out ArmMonitor ThreadMon))
{ {
ThreadMon.ExState = false; ThreadMon.ExState = false;
} }

View file

@ -40,9 +40,6 @@ namespace ChocolArm64.State
public bool Zero; public bool Zero;
public bool Negative; public bool Negative;
public int ProcessId;
public int ThreadId;
public bool Running { get; set; } public bool Running { get; set; }
public long TpidrEl0 { get; set; } public long TpidrEl0 { get; set; }
@ -100,6 +97,11 @@ namespace ChocolArm64.State
TickCounter.Start(); TickCounter.Start();
} }
internal bool Synchronize()
{
return Running;
}
internal void OnBreak(long Position, int Imm) internal void OnBreak(long Position, int Imm)
{ {
Break?.Invoke(this, new AInstExceptionEventArgs(Position, Imm)); Break?.Invoke(this, new AInstExceptionEventArgs(Position, Imm));

View file

@ -110,6 +110,8 @@ namespace ChocolArm64.Translation
if (OpcIndex == 0) if (OpcIndex == 0)
{ {
MarkLabel(GetLabel(CurrBlock.Position)); MarkLabel(GetLabel(CurrBlock.Position));
EmitSynchronization();
} }
CurrOp.Emitter(this); CurrOp.Emitter(this);
@ -117,6 +119,25 @@ namespace ChocolArm64.Translation
ILBlock.Add(new AILBarrier()); ILBlock.Add(new AILBarrier());
} }
private void EmitSynchronization()
{
EmitLdarg(ATranslatedSub.StateArgIdx);
EmitPrivateCall(typeof(AThreadState), nameof(AThreadState.Synchronize));
EmitLdc_I4(0);
AILLabel LblContinue = new AILLabel();
Emit(OpCodes.Bne_Un_S, LblContinue);
EmitLdc_I8(0);
Emit(OpCodes.Ret);
MarkLabel(LblContinue);
}
public bool TryOptEmitSubroutineCall() public bool TryOptEmitSubroutineCall()
{ {
if (CurrBlock.Next == null) if (CurrBlock.Next == null)

View file

@ -1,6 +1,8 @@
using System;
namespace Ryujinx.Audio namespace Ryujinx.Audio
{ {
public interface IAalOutput public interface IAalOutput : IDisposable
{ {
int OpenTrack(int SampleRate, int Channels, ReleaseCallback Callback); int OpenTrack(int SampleRate, int Channels, ReleaseCallback Callback);

View file

@ -8,7 +8,7 @@ using System.Threading;
namespace Ryujinx.Audio.OpenAL namespace Ryujinx.Audio.OpenAL
{ {
public class OpenALAudioOut : IAalOutput public class OpenALAudioOut : IAalOutput, IDisposable
{ {
private const int MaxTracks = 256; private const int MaxTracks = 256;
@ -222,10 +222,17 @@ namespace Ryujinx.Audio.OpenAL
Td.CallReleaseCallbackIfNeeded(); Td.CallReleaseCallbackIfNeeded();
} }
//If it's not slept it will waste cycles //If it's not slept it will waste cycles.
Thread.Sleep(10); Thread.Sleep(10);
} }
while (KeepPolling); while (KeepPolling);
foreach (Track Td in Tracks.Values)
{
Td.Dispose();
}
Tracks.Clear();
} }
public int OpenTrack(int SampleRate, int Channels, ReleaseCallback Callback) public int OpenTrack(int SampleRate, int Channels, ReleaseCallback Callback)
@ -342,5 +349,18 @@ namespace Ryujinx.Audio.OpenAL
return PlaybackState.Stopped; return PlaybackState.Stopped;
} }
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool Disposing)
{
if (Disposing)
{
KeepPolling = false;
}
}
} }
} }

View file

@ -1,4 +1,3 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.Graphics.Gal namespace Ryujinx.Graphics.Gal

View file

@ -1,4 +1,3 @@
using OpenTK;
using OpenTK.Graphics.OpenGL; using OpenTK.Graphics.OpenGL;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View file

@ -1,6 +1,5 @@
using OpenTK.Graphics.OpenGL; using OpenTK.Graphics.OpenGL;
using System; using System;
using System.Collections.Generic;
namespace Ryujinx.Graphics.Gal.OpenGL namespace Ryujinx.Graphics.Gal.OpenGL
{ {

View file

@ -1,7 +1,6 @@
using OpenTK.Graphics.OpenGL; using OpenTK.Graphics.OpenGL;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace Ryujinx.Graphics.Gal.OpenGL namespace Ryujinx.Graphics.Gal.OpenGL
{ {

View file

@ -1,6 +1,4 @@
using System; using static Ryujinx.Graphics.Gal.Shader.ShaderDecodeHelper;
using static Ryujinx.Graphics.Gal.Shader.ShaderDecodeHelper;
namespace Ryujinx.Graphics.Gal.Shader namespace Ryujinx.Graphics.Gal.Shader
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.OsHle.Exceptions namespace Ryujinx.HLE.Exceptions
{ {
public class GuestBrokeExecutionException : Exception public class GuestBrokeExecutionException : Exception
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.Loaders.Npdm namespace Ryujinx.HLE.Exceptions
{ {
public class InvalidNpdmException : Exception public class InvalidNpdmException : Exception
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.OsHle.Exceptions namespace Ryujinx.HLE.Exceptions
{ {
public class UndefinedInstructionException : Exception public class UndefinedInstructionException : Exception
{ {

View file

@ -140,7 +140,7 @@ namespace Ryujinx.HLE.Gpu.Texture
} }
} }
throw new NotImplementedException(Texture.Format.ToString()); throw new NotImplementedException("0x" + Texture.Format.ToString("x2"));
} }
public static int CompressedTextureSize(int TextureWidth, int TextureHeight, int BlockWidth, int BlockHeight, int Bpb) public static int CompressedTextureSize(int TextureWidth, int TextureHeight, int BlockWidth, int BlockHeight, int Bpb)

View file

@ -47,7 +47,7 @@ namespace Ryujinx.HLE.Gpu.Texture
case GalTextureFormat.Astc2D10x6: return Read16BptCompressedTexture(Memory, Texture, 10, 6); case GalTextureFormat.Astc2D10x6: return Read16BptCompressedTexture(Memory, Texture, 10, 6);
} }
throw new NotImplementedException(Texture.Format.ToString()); throw new NotImplementedException("0x" + Texture.Format.ToString("x2"));
} }
private unsafe static byte[] Read1Bpp(IAMemory Memory, TextureInfo Texture) private unsafe static byte[] Read1Bpp(IAMemory Memory, TextureInfo Texture)

View file

@ -1,6 +1,4 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using Ryujinx.Graphics.Gal;
using System;
namespace Ryujinx.HLE.Gpu.Texture namespace Ryujinx.HLE.Gpu.Texture
{ {

View file

@ -2,7 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace Ryujinx.HLE.OsHle.Diagnostics namespace Ryujinx.HLE.HOS.Diagnostics
{ {
static class Demangler static class Demangler
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
static class ErrorCode static class ErrorCode
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
enum ErrorModule enum ErrorModule
{ {

View file

@ -1,10 +1,10 @@
using Ryujinx.HLE.Memory; using Ryujinx.HLE.Memory;
using Ryujinx.HLE.OsHle.Utilities;
using Ryujinx.HLE.Resource; using Ryujinx.HLE.Resource;
using Ryujinx.HLE.Utilities;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Font namespace Ryujinx.HLE.HOS.Font
{ {
class SharedFontManager class SharedFontManager
{ {
@ -34,7 +34,7 @@ namespace Ryujinx.HLE.OsHle.Font
Memory = Device.Memory; Memory = Device.Memory;
FontsPath = Path.Combine(Device.VFs.GetSystemPath(), "fonts"); FontsPath = Path.Combine(Device.FileSystem.GetSystemPath(), "fonts");
} }
public void EnsureInitialized() public void EnsureInitialized()

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Font namespace Ryujinx.HLE.HOS.Font
{ {
public enum SharedFontType public enum SharedFontType
{ {

View file

@ -1,7 +1,7 @@
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
class GlobalStateTable class GlobalStateTable
{ {

View file

@ -1,7 +1,7 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using System.Text; using System.Text;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
static class Homebrew static class Homebrew
{ {

View file

@ -1,27 +1,27 @@
using Ryujinx.HLE.HOS.Font;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.Loaders.Executables; using Ryujinx.HLE.Loaders.Executables;
using Ryujinx.HLE.Loaders.Npdm; using Ryujinx.HLE.Loaders.Npdm;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Font;
using Ryujinx.HLE.OsHle.Handles;
using Ryujinx.HLE.OsHle.SystemState;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
public class Horizon : IDisposable public class Horizon : IDisposable
{ {
internal const int HidSize = 0x40000; internal const int HidSize = 0x40000;
internal const int FontSize = 0x1100000; internal const int FontSize = 0x1100000;
private Switch Ns; private Switch Device;
private KProcessScheduler Scheduler; private KProcessScheduler Scheduler;
private ConcurrentDictionary<int, Process> Processes; private ConcurrentDictionary<int, Process> Processes;
public SystemStateMgr SystemState { get; private set; } public SystemStateMgr State { get; private set; }
internal KSharedMemory HidSharedMem { get; private set; } internal KSharedMemory HidSharedMem { get; private set; }
internal KSharedMemory FontSharedMem { get; private set; } internal KSharedMemory FontSharedMem { get; private set; }
@ -30,18 +30,18 @@ namespace Ryujinx.HLE.OsHle
internal KEvent VsyncEvent { get; private set; } internal KEvent VsyncEvent { get; private set; }
public Horizon(Switch Ns) public Horizon(Switch Device)
{ {
this.Ns = Ns; this.Device = Device;
Scheduler = new KProcessScheduler(Ns.Log); Scheduler = new KProcessScheduler(Device.Log);
Processes = new ConcurrentDictionary<int, Process>(); Processes = new ConcurrentDictionary<int, Process>();
SystemState = new SystemStateMgr(); State = new SystemStateMgr();
if (!Ns.Memory.Allocator.TryAllocate(HidSize, out long HidPA) || if (!Device.Memory.Allocator.TryAllocate(HidSize, out long HidPA) ||
!Ns.Memory.Allocator.TryAllocate(FontSize, out long FontPA)) !Device.Memory.Allocator.TryAllocate(FontSize, out long FontPA))
{ {
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
@ -49,7 +49,7 @@ namespace Ryujinx.HLE.OsHle
HidSharedMem = new KSharedMemory(HidPA, HidSize); HidSharedMem = new KSharedMemory(HidPA, HidSize);
FontSharedMem = new KSharedMemory(FontPA, FontSize); FontSharedMem = new KSharedMemory(FontPA, FontSize);
Font = new SharedFontManager(Ns, FontSharedMem.PA); Font = new SharedFontManager(Device, FontSharedMem.PA);
VsyncEvent = new KEvent(); VsyncEvent = new KEvent();
} }
@ -58,7 +58,7 @@ namespace Ryujinx.HLE.OsHle
{ {
if (RomFsFile != null) if (RomFsFile != null)
{ {
Ns.VFs.LoadRomFs(RomFsFile); Device.FileSystem.LoadRomFs(RomFsFile);
} }
string NpdmFileName = Path.Combine(ExeFsDir, "main.npdm"); string NpdmFileName = Path.Combine(ExeFsDir, "main.npdm");
@ -67,7 +67,7 @@ namespace Ryujinx.HLE.OsHle
if (File.Exists(NpdmFileName)) if (File.Exists(NpdmFileName))
{ {
Ns.Log.PrintInfo(LogClass.Loader, $"Loading main.npdm..."); Device.Log.PrintInfo(LogClass.Loader, $"Loading main.npdm...");
using (FileStream Input = new FileStream(NpdmFileName, FileMode.Open)) using (FileStream Input = new FileStream(NpdmFileName, FileMode.Open))
{ {
@ -76,7 +76,7 @@ namespace Ryujinx.HLE.OsHle
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.Loader, $"NPDM file not found, using default values!"); Device.Log.PrintWarning(LogClass.Loader, $"NPDM file not found, using default values!");
} }
Process MainProcess = MakeProcess(MetaData); Process MainProcess = MakeProcess(MetaData);
@ -90,7 +90,7 @@ namespace Ryujinx.HLE.OsHle
continue; continue;
} }
Ns.Log.PrintInfo(LogClass.Loader, $"Loading {Path.GetFileNameWithoutExtension(File)}..."); Device.Log.PrintInfo(LogClass.Loader, $"Loading {Path.GetFileNameWithoutExtension(File)}...");
using (FileStream Input = new FileStream(File, FileMode.Open)) using (FileStream Input = new FileStream(File, FileMode.Open))
{ {
@ -124,18 +124,20 @@ namespace Ryujinx.HLE.OsHle
bool IsNro = Path.GetExtension(FilePath).ToLower() == ".nro"; bool IsNro = Path.GetExtension(FilePath).ToLower() == ".nro";
string Name = Path.GetFileNameWithoutExtension(FilePath); string Name = Path.GetFileNameWithoutExtension(FilePath);
string SwitchFilePath = Ns.VFs.SystemPathToSwitchPath(FilePath); string SwitchFilePath = Device.FileSystem.SystemPathToSwitchPath(FilePath);
if (IsNro && (SwitchFilePath == null || !SwitchFilePath.StartsWith("sdmc:/"))) if (IsNro && (SwitchFilePath == null || !SwitchFilePath.StartsWith("sdmc:/")))
{ {
string SwitchPath = $"sdmc:/switch/{Name}{Homebrew.TemporaryNroSuffix}"; string SwitchPath = $"sdmc:/switch/{Name}{Homebrew.TemporaryNroSuffix}";
string TempPath = Ns.VFs.SwitchPathToSystemPath(SwitchPath); string TempPath = Device.FileSystem.SwitchPathToSystemPath(SwitchPath);
string SwitchDir = Path.GetDirectoryName(TempPath); string SwitchDir = Path.GetDirectoryName(TempPath);
if (!Directory.Exists(SwitchDir)) if (!Directory.Exists(SwitchDir))
{ {
Directory.CreateDirectory(SwitchDir); Directory.CreateDirectory(SwitchDir);
} }
File.Copy(FilePath, TempPath, true); File.Copy(FilePath, TempPath, true);
FilePath = TempPath; FilePath = TempPath;
@ -169,7 +171,7 @@ namespace Ryujinx.HLE.OsHle
ProcessId++; ProcessId++;
} }
Process = new Process(Ns, Scheduler, ProcessId, MetaData); Process = new Process(Device, Scheduler, ProcessId, MetaData);
Processes.TryAdd(ProcessId, Process); Processes.TryAdd(ProcessId, Process);
} }
@ -186,42 +188,24 @@ namespace Ryujinx.HLE.OsHle
internal void ExitProcess(int ProcessId) internal void ExitProcess(int ProcessId)
{ {
if (Processes.TryGetValue(ProcessId, out Process Process) && Process.NeedsHbAbi) if (Processes.TryRemove(ProcessId, out Process Process))
{ {
string NextNro = Homebrew.ReadHbAbiNextLoadPath(Process.Memory, Process.HbAbiDataPosition);
Ns.Log.PrintInfo(LogClass.Loader, $"HbAbi NextLoadPath {NextNro}");
if (NextNro == string.Empty)
{
NextNro = "sdmc:/hbmenu.nro";
}
NextNro = NextNro.Replace("sdmc:", string.Empty);
NextNro = Ns.VFs.GetFullPath(Ns.VFs.GetSdCardPath(), NextNro);
if (File.Exists(NextNro))
{
LoadProgram(NextNro);
}
}
if (Processes.TryRemove(ProcessId, out Process))
{
Process.StopAllThreadsAsync();
Process.Dispose(); Process.Dispose();
if (Processes.Count == 0) if (Processes.Count == 0)
{ {
Ns.OnFinish(EventArgs.Empty); Unload();
Device.Unload();
} }
} }
} }
internal bool TryGetProcess(int ProcessId, out Process Process) private void Unload()
{ {
return Processes.TryGetValue(ProcessId, out Process); VsyncEvent.Dispose();
Scheduler.Dispose();
} }
public void Dispose() public void Dispose()
@ -235,13 +219,8 @@ namespace Ryujinx.HLE.OsHle
{ {
foreach (Process Process in Processes.Values) foreach (Process Process in Processes.Values)
{ {
Process.StopAllThreadsAsync();
Process.Dispose(); Process.Dispose();
} }
VsyncEvent.Dispose();
Scheduler.Dispose();
} }
} }
} }

View file

@ -2,7 +2,7 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
class IdDictionary class IdDictionary
{ {

View file

@ -1,6 +1,6 @@
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
struct IpcBuffDesc struct IpcBuffDesc
{ {

View file

@ -1,7 +1,7 @@
using System; using System;
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
class IpcHandleDesc class IpcHandleDesc
{ {

View file

@ -1,9 +1,9 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using Ryujinx.HLE.OsHle.Handles; using Ryujinx.HLE.HOS.Kernel;
using System; using System;
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
static class IpcHandler static class IpcHandler
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
abstract class IpcMagic abstract class IpcMagic
{ {

View file

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
class IpcMessage class IpcMessage
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
enum IpcMessageType enum IpcMessageType
{ {

View file

@ -1,6 +1,6 @@
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
struct IpcPtrBuffDesc struct IpcPtrBuffDesc
{ {

View file

@ -1,6 +1,6 @@
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
struct IpcRecvListBuffDesc struct IpcRecvListBuffDesc
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Ipc namespace Ryujinx.HLE.HOS.Ipc
{ {
delegate long ServiceProcessRequest(ServiceCtx Context); delegate long ServiceProcessRequest(ServiceCtx Context);
} }

View file

@ -1,10 +1,9 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.OsHle.Handles;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
static class AddressArbiter static class AddressArbiter
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
enum AddressSpaceType enum AddressSpaceType
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KEvent : KSynchronizationObject { } class KEvent : KSynchronizationObject { }
} }

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KMemoryBlock class KMemoryBlock
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KMemoryInfo class KMemoryInfo
{ {

View file

@ -1,12 +1,11 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using Ryujinx.HLE.Memory; using Ryujinx.HLE.Memory;
using Ryujinx.HLE.OsHle.Kernel;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KMemoryManager class KMemoryManager
{ {
@ -43,7 +42,7 @@ namespace Ryujinx.HLE.OsHle.Handles
public KMemoryManager(Process Process) public KMemoryManager(Process Process)
{ {
CpuMemory = Process.Memory; CpuMemory = Process.Memory;
Allocator = Process.Ns.Memory.Allocator; Allocator = Process.Device.Memory.Allocator;
long CodeRegionSize; long CodeRegionSize;
long MapRegionSize; long MapRegionSize;

View file

@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KProcessHandleTable class KProcessHandleTable
{ {

View file

@ -3,7 +3,7 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Threading; using System.Threading;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KProcessScheduler : IDisposable class KProcessScheduler : IDisposable
{ {
@ -124,6 +124,16 @@ namespace Ryujinx.HLE.OsHle.Handles
AllThreads[Thread].WaitSync.Set(); AllThreads[Thread].WaitSync.Set();
} }
public void ForceWakeUp(KThread Thread)
{
if (AllThreads.TryGetValue(Thread, out SchedulerThread SchedThread))
{
SchedThread.WaitSync.Set();
SchedThread.WaitActivity.Set();
SchedThread.WaitSched.Set();
}
}
public void ChangeCore(KThread Thread, int IdealCore, int CoreMask) public void ChangeCore(KThread Thread, int IdealCore, int CoreMask)
{ {
lock (SchedLock) lock (SchedLock)

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Services; using Ryujinx.HLE.HOS.Services;
using System; using System;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KSession : IDisposable class KSession : IDisposable
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KSharedMemory class KSharedMemory
{ {

View file

@ -1,7 +1,7 @@
using System; using System;
using System.Threading; using System.Threading;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KSynchronizationObject : IDisposable class KSynchronizationObject : IDisposable
{ {

View file

@ -1,7 +1,7 @@
using ChocolArm64; using ChocolArm64;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KThread : KSynchronizationObject class KThread : KSynchronizationObject
{ {
@ -33,18 +33,20 @@ namespace Ryujinx.HLE.OsHle.Handles
public long LastPc { get; set; } public long LastPc { get; set; }
public int ThreadId => Thread.ThreadId; public int ThreadId { get; private set; }
public KThread( public KThread(
AThread Thread, AThread Thread,
Process Process, Process Process,
int ProcessorId, int ProcessorId,
int Priority) int Priority,
int ThreadId)
{ {
this.Thread = Thread; this.Thread = Thread;
this.Process = Process; this.Process = Process;
this.ProcessorId = ProcessorId; this.ProcessorId = ProcessorId;
this.IdealCore = ProcessorId; this.IdealCore = ProcessorId;
this.ThreadId = ThreadId;
MutexWaiters = new List<KThread>(); MutexWaiters = new List<KThread>();

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KTlsPageManager class KTlsPageManager
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class KTransferMemory class KTransferMemory
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
static class KernelErr static class KernelErr
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
[Flags] [Flags]
enum MemoryAttribute : byte enum MemoryAttribute : byte

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
[Flags] [Flags]
enum MemoryPermission : byte enum MemoryPermission : byte

View file

@ -1,6 +1,6 @@
using System; using System;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS.Kernel
{ {
[Flags] [Flags]
enum MemoryState : uint enum MemoryState : uint

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
static class NsTimeConverter static class NsTimeConverter
{ {

View file

@ -1,7 +1,7 @@
using System; using System;
using System.Threading; using System.Threading;
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class SchedulerThread : IDisposable class SchedulerThread : IDisposable
{ {

View file

@ -2,13 +2,12 @@ using ChocolArm64.Events;
using ChocolArm64.Memory; using ChocolArm64.Memory;
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
partial class SvcHandler partial class SvcHandler
{ {
@ -16,7 +15,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
private Dictionary<int, SvcFunc> SvcFuncs; private Dictionary<int, SvcFunc> SvcFuncs;
private Switch Ns; private Switch Device;
private Process Process; private Process Process;
private AMemory Memory; private AMemory Memory;
@ -27,7 +26,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
private static Random Rng; private static Random Rng;
public SvcHandler(Switch Ns, Process Process) public SvcHandler(Switch Device, Process Process)
{ {
SvcFuncs = new Dictionary<int, SvcFunc>() SvcFuncs = new Dictionary<int, SvcFunc>()
{ {
@ -73,7 +72,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ 0x34, SvcWaitForAddress } { 0x34, SvcWaitForAddress }
}; };
this.Ns = Ns; this.Device = Device;
this.Process = Process; this.Process = Process;
this.Memory = Process.Memory; this.Memory = Process.Memory;
@ -93,19 +92,19 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (SvcFuncs.TryGetValue(e.Id, out SvcFunc Func)) if (SvcFuncs.TryGetValue(e.Id, out SvcFunc Func))
{ {
Ns.Log.PrintDebug(LogClass.KernelSvc, $"{Func.Method.Name} called."); Device.Log.PrintDebug(LogClass.KernelSvc, $"{Func.Method.Name} called.");
Func(ThreadState); Func(ThreadState);
Process.Scheduler.Reschedule(Process.GetThread(ThreadState.Tpidr)); Process.Scheduler.Reschedule(Process.GetThread(ThreadState.Tpidr));
Ns.Log.PrintDebug(LogClass.KernelSvc, $"{Func.Method.Name} ended."); Device.Log.PrintDebug(LogClass.KernelSvc, $"{Func.Method.Name} ended.");
} }
else else
{ {
Process.PrintStackTrace(ThreadState); Process.PrintStackTrace(ThreadState);
throw new NotImplementedException(e.Id.ToString("x4")); throw new NotImplementedException($"0x{e.Id:x4}");
} }
} }

View file

@ -1,10 +1,9 @@
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
partial class SvcHandler partial class SvcHandler
{ {
@ -14,7 +13,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((Size & 0x1fffff) != 0 || Size != (uint)Size) if ((Size & 0x1fffff) != 0 || Size != (uint)Size)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Heap size 0x{Size:x16} is not aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Heap size 0x{Size:x16} is not aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -31,7 +30,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
} }
@ -42,7 +41,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Position)) if (!PageAligned(Position))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -51,7 +50,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -66,7 +65,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Attributes != AttributeMask || if (Attributes != AttributeMask ||
(Attributes | MemoryAttribute.Uncached) != MemoryAttribute.Uncached) (Attributes | MemoryAttribute.Uncached) != MemoryAttribute.Uncached)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, "Invalid memory attributes!"); Device.Log.PrintWarning(LogClass.KernelSvc, "Invalid memory attributes!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMaskValue); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMaskValue);
@ -81,7 +80,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
else else
{ {
@ -99,7 +98,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Src | Dst)) if (!PageAligned(Src | Dst))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, "Addresses are not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, "Addresses are not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -108,7 +107,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -117,7 +116,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Src + Size) <= (ulong)Src || (ulong)(Dst + Size) <= (ulong)Dst) if ((ulong)(Src + Size) <= (ulong)Src || (ulong)(Dst + Size) <= (ulong)Dst)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, "Addresses outside of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, "Addresses outside of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -126,7 +125,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideAddrSpace(Src, Size)) if (!InsideAddrSpace(Src, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Src address 0x{Src:x16} out of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Src address 0x{Src:x16} out of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -135,7 +134,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideNewMapRegion(Dst, Size)) if (!InsideNewMapRegion(Dst, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Dst address 0x{Dst:x16} out of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Dst address 0x{Dst:x16} out of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange);
@ -146,7 +145,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
ThreadState.X0 = (ulong)Result; ThreadState.X0 = (ulong)Result;
@ -160,7 +159,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Src | Dst)) if (!PageAligned(Src | Dst))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, "Addresses are not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, "Addresses are not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -169,7 +168,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -178,7 +177,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Src + Size) <= (ulong)Src || (ulong)(Dst + Size) <= (ulong)Dst) if ((ulong)(Src + Size) <= (ulong)Src || (ulong)(Dst + Size) <= (ulong)Dst)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, "Addresses outside of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, "Addresses outside of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -187,7 +186,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideAddrSpace(Src, Size)) if (!InsideAddrSpace(Src, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Src address 0x{Src:x16} out of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Src address 0x{Src:x16} out of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -196,7 +195,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideNewMapRegion(Dst, Size)) if (!InsideNewMapRegion(Dst, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Dst address 0x{Dst:x16} out of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Dst address 0x{Dst:x16} out of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange);
@ -207,7 +206,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
ThreadState.X0 = (ulong)Result; ThreadState.X0 = (ulong)Result;
@ -241,7 +240,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Position)) if (!PageAligned(Position))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -250,7 +249,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -259,7 +258,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Position + Size) <= (ulong)Position) if ((ulong)(Position + Size) <= (ulong)Position)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -270,7 +269,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((Permission | MemoryPermission.Write) != MemoryPermission.ReadAndWrite) if ((Permission | MemoryPermission.Write) != MemoryPermission.ReadAndWrite)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid permission {Permission}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid permission {Permission}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidPermission); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidPermission);
@ -281,7 +280,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (SharedMemory == null) if (SharedMemory == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid shared memory handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid shared memory handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -290,7 +289,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideAddrSpace(Position, Size) || InsideMapRegion(Position, Size) || InsideHeapRegion(Position, Size)) if (!InsideAddrSpace(Position, Size) || InsideMapRegion(Position, Size) || InsideHeapRegion(Position, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} out of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} out of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -299,7 +298,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (SharedMemory.Size != Size) if (SharedMemory.Size != Size)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} does not match shared memory size 0x{SharedMemory.Size:16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} does not match shared memory size 0x{SharedMemory.Size:16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -310,7 +309,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
ThreadState.X0 = (ulong)Result; ThreadState.X0 = (ulong)Result;
@ -324,7 +323,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Position)) if (!PageAligned(Position))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -333,7 +332,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -342,7 +341,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Position + Size) <= (ulong)Position) if ((ulong)(Position + Size) <= (ulong)Position)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -353,7 +352,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (SharedMemory == null) if (SharedMemory == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid shared memory handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid shared memory handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -362,7 +361,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideAddrSpace(Position, Size) || InsideMapRegion(Position, Size) || InsideHeapRegion(Position, Size)) if (!InsideAddrSpace(Position, Size) || InsideMapRegion(Position, Size) || InsideHeapRegion(Position, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} out of range!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} out of range!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -373,7 +372,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
ThreadState.X0 = (ulong)Result; ThreadState.X0 = (ulong)Result;
@ -386,7 +385,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Position)) if (!PageAligned(Position))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -395,7 +394,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -404,7 +403,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Position + Size) <= (ulong)Position) if ((ulong)(Position + Size) <= (ulong)Position)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -415,7 +414,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Permission > MemoryPermission.ReadAndWrite || Permission == MemoryPermission.Write) if (Permission > MemoryPermission.ReadAndWrite || Permission == MemoryPermission.Write)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid permission {Permission}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid permission {Permission}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidPermission); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidPermission);
@ -439,7 +438,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Position)) if (!PageAligned(Position))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -448,7 +447,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -457,7 +456,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Position + Size) <= (ulong)Position) if ((ulong)(Position + Size) <= (ulong)Position)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -466,7 +465,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideAddrSpace(Position, Size)) if (!InsideAddrSpace(Position, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Position:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Position:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -477,7 +476,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
ThreadState.X0 = (ulong)Result; ThreadState.X0 = (ulong)Result;
@ -490,7 +489,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Position)) if (!PageAligned(Position))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Address 0x{Position:x16} is not page aligned!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -499,7 +498,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!PageAligned(Size) || Size == 0) if (!PageAligned(Size) || Size == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Size 0x{Size:x16} is not page aligned or is zero!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidSize);
@ -508,7 +507,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((ulong)(Position + Size) <= (ulong)Position) if ((ulong)(Position + Size) <= (ulong)Position)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid region address 0x{Position:x16} / size 0x{Size:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -517,7 +516,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (!InsideAddrSpace(Position, Size)) if (!InsideAddrSpace(Position, Size))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Position:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Position:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
@ -528,7 +527,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Result != 0) if (Result != 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Operation failed with error 0x{Result:x}!");
} }
ThreadState.X0 = (ulong)Result; ThreadState.X0 = (ulong)Result;

View file

@ -1,16 +1,15 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.Exceptions;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Services;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Exceptions;
using Ryujinx.HLE.OsHle.Handles;
using Ryujinx.HLE.OsHle.Ipc;
using Ryujinx.HLE.OsHle.Services;
using System; using System;
using System.Threading; using System.Threading;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
partial class SvcHandler partial class SvcHandler
{ {
@ -20,7 +19,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
private void SvcExitProcess(AThreadState ThreadState) private void SvcExitProcess(AThreadState ThreadState)
{ {
Ns.Os.ExitProcess(ThreadState.ProcessId); Device.System.ExitProcess(Process.ProcessId);
} }
private void SvcClearEvent(AThreadState ThreadState) private void SvcClearEvent(AThreadState ThreadState)
@ -40,7 +39,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Obj == null) if (Obj == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -75,7 +74,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid event handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid event handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -87,10 +86,10 @@ namespace Ryujinx.HLE.OsHle.Kernel
int HandlesCount = (int)ThreadState.X2; int HandlesCount = (int)ThreadState.X2;
ulong Timeout = ThreadState.X3; ulong Timeout = ThreadState.X3;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"HandlesPtr = " + HandlesPtr .ToString("x16") + ", " + "HandlesPtr = 0x" + HandlesPtr .ToString("x16") + ", " +
"HandlesCount = " + HandlesCount.ToString("x8") + ", " + "HandlesCount = 0x" + HandlesCount.ToString("x8") + ", " +
"Timeout = " + Timeout .ToString("x16")); "Timeout = 0x" + Timeout .ToString("x16"));
if ((uint)HandlesCount > 0x40) if ((uint)HandlesCount > 0x40)
{ {
@ -111,7 +110,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (SyncObj == null) if (SyncObj == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -175,7 +174,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Thread == null) if (Thread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{ThreadHandle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{ThreadHandle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -240,7 +239,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr); IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr);
long Result = IpcHandler.IpcCall(Ns, Process, Memory, Session, Cmd, CmdPtr); long Result = IpcHandler.IpcCall(Device, Process, Memory, Session, Cmd, CmdPtr);
Thread.Yield(); Thread.Yield();
@ -250,7 +249,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid session handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid session handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -274,7 +273,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
string Str = AMemoryHelper.ReadAsciiString(Memory, Position, Size); string Str = AMemoryHelper.ReadAsciiString(Memory, Position, Size);
Ns.Log.PrintWarning(LogClass.KernelSvc, Str); Device.Log.PrintWarning(LogClass.KernelSvc, Str);
ThreadState.X0 = 0; ThreadState.X0 = 0;
} }
@ -321,11 +320,11 @@ namespace Ryujinx.HLE.OsHle.Kernel
break; break;
case 6: case 6:
ThreadState.X1 = (ulong)Process.Ns.Memory.Allocator.TotalAvailableSize; ThreadState.X1 = (ulong)Process.Device.Memory.Allocator.TotalAvailableSize;
break; break;
case 7: case 7:
ThreadState.X1 = (ulong)Process.Ns.Memory.Allocator.TotalUsedSize; ThreadState.X1 = (ulong)Process.Device.Memory.Allocator.TotalUsedSize;
break; break;
case 8: case 8:
@ -365,7 +364,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
default: default:
Process.PrintStackTrace(ThreadState); Process.PrintStackTrace(ThreadState);
throw new NotImplementedException($"SvcGetInfo: {InfoType} {Handle:x8} {InfoId}"); throw new NotImplementedException($"SvcGetInfo: {InfoType} 0x{Handle:x8} {InfoId}");
} }
ThreadState.X0 = 0; ThreadState.X0 = 0;

View file

@ -1,11 +1,10 @@
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using System.Threading; using System.Threading;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
partial class SvcHandler partial class SvcHandler
{ {
@ -19,7 +18,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if ((uint)Priority > 0x3f) if ((uint)Priority > 0x3f)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid priority 0x{Priority:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid priority 0x{Priority:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidPriority); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidPriority);
@ -33,7 +32,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else if ((uint)ProcessorId > 3) else if ((uint)ProcessorId > 3)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core id 0x{ProcessorId:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core id 0x{ProcessorId:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidCoreId); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidCoreId);
@ -66,7 +65,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -83,7 +82,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ {
ulong TimeoutNs = ThreadState.X0; ulong TimeoutNs = ThreadState.X0;
Ns.Log.PrintDebug(LogClass.KernelSvc, "Timeout = " + TimeoutNs.ToString("x16")); Device.Log.PrintDebug(LogClass.KernelSvc, "Timeout = 0x" + TimeoutNs.ToString("x16"));
KThread CurrThread = Process.GetThread(ThreadState.Tpidr); KThread CurrThread = Process.GetThread(ThreadState.Tpidr);
@ -114,7 +113,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -125,9 +124,9 @@ namespace Ryujinx.HLE.OsHle.Kernel
int Handle = (int)ThreadState.X0; int Handle = (int)ThreadState.X0;
int Priority = (int)ThreadState.X1; int Priority = (int)ThreadState.X1;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"Handle = " + Handle .ToString("x8") + ", " + "Handle = 0x" + Handle .ToString("x8") + ", " +
"Priority = " + Priority.ToString("x8")); "Priority = 0x" + Priority.ToString("x8"));
KThread Thread = GetThread(ThreadState.Tpidr, Handle); KThread Thread = GetThread(ThreadState.Tpidr, Handle);
@ -139,7 +138,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -149,7 +148,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ {
int Handle = (int)ThreadState.X2; int Handle = (int)ThreadState.X2;
Ns.Log.PrintDebug(LogClass.KernelSvc, "Handle = " + Handle.ToString("x8")); Device.Log.PrintDebug(LogClass.KernelSvc, "Handle = 0x" + Handle.ToString("x8"));
KThread Thread = GetThread(ThreadState.Tpidr, Handle); KThread Thread = GetThread(ThreadState.Tpidr, Handle);
@ -161,7 +160,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -173,10 +172,10 @@ namespace Ryujinx.HLE.OsHle.Kernel
int IdealCore = (int)ThreadState.X1; int IdealCore = (int)ThreadState.X1;
long CoreMask = (long)ThreadState.X2; long CoreMask = (long)ThreadState.X2;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"Handle = " + Handle .ToString("x8") + ", " + "Handle = 0x" + Handle .ToString("x8") + ", " +
"IdealCore = " + IdealCore.ToString("x8") + ", " + "IdealCore = 0x" + IdealCore.ToString("x8") + ", " +
"CoreMask = " + CoreMask .ToString("x16")); "CoreMask = 0x" + CoreMask .ToString("x16"));
KThread Thread = GetThread(ThreadState.Tpidr, Handle); KThread Thread = GetThread(ThreadState.Tpidr, Handle);
@ -193,7 +192,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ {
if ((IdealCore | 2) != -1) if ((IdealCore | 2) != -1)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core id 0x{IdealCore:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core id 0x{IdealCore:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidCoreId); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidCoreId);
@ -202,7 +201,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else if ((CoreMask & (1 << IdealCore)) == 0) else if ((CoreMask & (1 << IdealCore)) == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core mask 0x{CoreMask:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core mask 0x{CoreMask:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMaskValue); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMaskValue);
@ -212,7 +211,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Thread == null) if (Thread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -224,7 +223,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
//-3 is used as "don't update", the old IdealCore value is kept. //-3 is used as "don't update", the old IdealCore value is kept.
if (IdealCore == -3 && (CoreMask & (1 << Thread.IdealCore)) == 0) if (IdealCore == -3 && (CoreMask & (1 << Thread.IdealCore)) == 0)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core mask 0x{CoreMask:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid core mask 0x{CoreMask:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMaskValue); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMaskValue);
@ -254,7 +253,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -275,7 +274,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
} }
else else
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
} }
@ -290,7 +289,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Thread == null) if (Thread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -299,7 +298,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Process.GetThread(ThreadState.Tpidr) == Thread) if (Process.GetThread(ThreadState.Tpidr) == Thread)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Thread handle 0x{Handle:x8} is current thread!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Thread handle 0x{Handle:x8} is current thread!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidThread); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidThread);

View file

@ -1,11 +1,10 @@
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using System; using System;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Kernel namespace Ryujinx.HLE.HOS.Kernel
{ {
partial class SvcHandler partial class SvcHandler
{ {
@ -17,23 +16,23 @@ namespace Ryujinx.HLE.OsHle.Kernel
long MutexAddress = (long)ThreadState.X1; long MutexAddress = (long)ThreadState.X1;
int WaitThreadHandle = (int)ThreadState.X2; int WaitThreadHandle = (int)ThreadState.X2;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"OwnerThreadHandle = " + OwnerThreadHandle.ToString("x8") + ", " + "OwnerThreadHandle = 0x" + OwnerThreadHandle.ToString("x8") + ", " +
"MutexAddress = " + MutexAddress .ToString("x16") + ", " + "MutexAddress = 0x" + MutexAddress .ToString("x16") + ", " +
"WaitThreadHandle = " + WaitThreadHandle .ToString("x8")); "WaitThreadHandle = 0x" + WaitThreadHandle .ToString("x8"));
if (IsPointingInsideKernel(MutexAddress)) if (IsPointingInsideKernel(MutexAddress))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid mutex address 0x{MutexAddress:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid mutex address 0x{MutexAddress:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
return; return;
} }
if (IsWordAddressUnaligned(MutexAddress)) if (IsAddressNotWordAligned(MutexAddress))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned mutex address 0x{MutexAddress:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned mutex address 0x{MutexAddress:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -44,7 +43,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (OwnerThread == null) if (OwnerThread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid owner thread handle 0x{OwnerThreadHandle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid owner thread handle 0x{OwnerThreadHandle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -55,7 +54,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (WaitThread == null) if (WaitThread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid requesting thread handle 0x{WaitThreadHandle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid requesting thread handle 0x{WaitThreadHandle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -73,20 +72,20 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ {
long MutexAddress = (long)ThreadState.X0; long MutexAddress = (long)ThreadState.X0;
Ns.Log.PrintDebug(LogClass.KernelSvc, "MutexAddress = " + MutexAddress.ToString("x16")); Device.Log.PrintDebug(LogClass.KernelSvc, "MutexAddress = 0x" + MutexAddress.ToString("x16"));
if (IsPointingInsideKernel(MutexAddress)) if (IsPointingInsideKernel(MutexAddress))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid mutex address 0x{MutexAddress:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid mutex address 0x{MutexAddress:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
return; return;
} }
if (IsWordAddressUnaligned(MutexAddress)) if (IsAddressNotWordAligned(MutexAddress))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned mutex address 0x{MutexAddress:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned mutex address 0x{MutexAddress:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -105,24 +104,24 @@ namespace Ryujinx.HLE.OsHle.Kernel
int ThreadHandle = (int)ThreadState.X2; int ThreadHandle = (int)ThreadState.X2;
ulong Timeout = ThreadState.X3; ulong Timeout = ThreadState.X3;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"MutexAddress = " + MutexAddress .ToString("x16") + ", " + "MutexAddress = 0x" + MutexAddress .ToString("x16") + ", " +
"CondVarAddress = " + CondVarAddress.ToString("x16") + ", " + "CondVarAddress = 0x" + CondVarAddress.ToString("x16") + ", " +
"ThreadHandle = " + ThreadHandle .ToString("x8") + ", " + "ThreadHandle = 0x" + ThreadHandle .ToString("x8") + ", " +
"Timeout = " + Timeout .ToString("x16")); "Timeout = 0x" + Timeout .ToString("x16"));
if (IsPointingInsideKernel(MutexAddress)) if (IsPointingInsideKernel(MutexAddress))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid mutex address 0x{MutexAddress:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid mutex address 0x{MutexAddress:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
return; return;
} }
if (IsWordAddressUnaligned(MutexAddress)) if (IsAddressNotWordAligned(MutexAddress))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned mutex address 0x{MutexAddress:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned mutex address 0x{MutexAddress:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -133,7 +132,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (Thread == null) if (Thread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{ThreadHandle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{ThreadHandle:x8}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
@ -157,9 +156,9 @@ namespace Ryujinx.HLE.OsHle.Kernel
long CondVarAddress = (long)ThreadState.X0; long CondVarAddress = (long)ThreadState.X0;
int Count = (int)ThreadState.X1; int Count = (int)ThreadState.X1;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"CondVarAddress = " + CondVarAddress.ToString("x16") + ", " + "CondVarAddress = 0x" + CondVarAddress.ToString("x16") + ", " +
"Count = " + Count .ToString("x8")); "Count = 0x" + Count .ToString("x8"));
KThread CurrThread = Process.GetThread(ThreadState.Tpidr); KThread CurrThread = Process.GetThread(ThreadState.Tpidr);
@ -179,7 +178,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ {
int MutexValue = Memory.ReadInt32(MutexAddress); int MutexValue = Memory.ReadInt32(MutexAddress);
Ns.Log.PrintDebug(LogClass.KernelSvc, "MutexValue = " + MutexValue.ToString("x8")); Device.Log.PrintDebug(LogClass.KernelSvc, "MutexValue = 0x" + MutexValue.ToString("x8"));
if (MutexValue != (OwnerThreadHandle | MutexHasListenersMask)) if (MutexValue != (OwnerThreadHandle | MutexHasListenersMask))
{ {
@ -192,7 +191,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
InsertWaitingMutexThreadUnsafe(OwnerThreadHandle, WaitThread); InsertWaitingMutexThreadUnsafe(OwnerThreadHandle, WaitThread);
} }
Ns.Log.PrintDebug(LogClass.KernelSvc, "Entering wait state..."); Device.Log.PrintDebug(LogClass.KernelSvc, "Entering wait state...");
Process.Scheduler.EnterWait(CurrThread); Process.Scheduler.EnterWait(CurrThread);
} }
@ -204,24 +203,24 @@ namespace Ryujinx.HLE.OsHle.Kernel
int Value = (int)ThreadState.X2; int Value = (int)ThreadState.X2;
ulong Timeout = ThreadState.X3; ulong Timeout = ThreadState.X3;
Ns.Log.PrintDebug(LogClass.KernelSvc, Device.Log.PrintDebug(LogClass.KernelSvc,
"Address = " + Address.ToString("x16") + ", " + "Address = 0x" + Address.ToString("x16") + ", " +
"ArbitrationType = " + Type .ToString() + ", " + "ArbitrationType = 0x" + Type .ToString() + ", " +
"Value = " + Value .ToString("x8") + ", " + "Value = 0x" + Value .ToString("x8") + ", " +
"Timeout = " + Timeout.ToString("x16")); "Timeout = 0x" + Timeout.ToString("x16"));
if (IsPointingInsideKernel(Address)) if (IsPointingInsideKernel(Address))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address 0x{Address:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address 0x{Address:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm);
return; return;
} }
if (IsWordAddressUnaligned(Address)) if (IsAddressNotWordAligned(Address))
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned address 0x{Address:x16}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Unaligned address 0x{Address:x16}!");
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidAddress);
@ -282,13 +281,13 @@ namespace Ryujinx.HLE.OsHle.Kernel
Process.Scheduler.WakeUp(OwnerThread); Process.Scheduler.WakeUp(OwnerThread);
Ns.Log.PrintDebug(LogClass.KernelSvc, "Gave mutex to thread id " + OwnerThread.ThreadId + "!"); Device.Log.PrintDebug(LogClass.KernelSvc, "Gave mutex to thread id " + OwnerThread.ThreadId + "!");
} }
else else
{ {
Memory.WriteInt32ToSharedAddr(MutexAddress, 0); Memory.WriteInt32ToSharedAddr(MutexAddress, 0);
Ns.Log.PrintDebug(LogClass.KernelSvc, "No threads waiting mutex!"); Device.Log.PrintDebug(LogClass.KernelSvc, "No threads waiting mutex!");
} }
} }
} }
@ -313,7 +312,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
Process.ThreadArbiterList.Add(WaitThread); Process.ThreadArbiterList.Add(WaitThread);
} }
Ns.Log.PrintDebug(LogClass.KernelSvc, "Entering wait state..."); Device.Log.PrintDebug(LogClass.KernelSvc, "Entering wait state...");
if (Timeout != ulong.MaxValue) if (Timeout != ulong.MaxValue)
{ {
@ -333,7 +332,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
Process.ThreadArbiterList.Remove(WaitThread); Process.ThreadArbiterList.Remove(WaitThread);
Ns.Log.PrintDebug(LogClass.KernelSvc, "Timed out..."); Device.Log.PrintDebug(LogClass.KernelSvc, "Timed out...");
return false; return false;
} }
@ -361,7 +360,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (WaitThread == null) if (WaitThread == null)
{ {
Ns.Log.PrintDebug(LogClass.KernelSvc, "No more threads to wake up!"); Device.Log.PrintDebug(LogClass.KernelSvc, "No more threads to wake up!");
break; break;
} }
@ -393,7 +392,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
MutexValue = Memory.ReadInt32(MutexAddress); MutexValue = Memory.ReadInt32(MutexAddress);
} }
Ns.Log.PrintDebug(LogClass.KernelSvc, "MutexValue = " + MutexValue.ToString("x8")); Device.Log.PrintDebug(LogClass.KernelSvc, "MutexValue = 0x" + MutexValue.ToString("x8"));
if (MutexValue == 0) if (MutexValue == 0)
{ {
@ -437,7 +436,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
if (OwnerThread == null) if (OwnerThread == null)
{ {
Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{OwnerThreadHandle:x8}!"); Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{OwnerThreadHandle:x8}!");
return; return;
} }
@ -516,7 +515,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
return ((ulong)Address + 0x1000000000) < 0xffffff000; return ((ulong)Address + 0x1000000000) < 0xffffff000;
} }
private bool IsWordAddressUnaligned(long Address) private bool IsAddressNotWordAligned(long Address)
{ {
return (Address & 3) != 0; return (Address & 3) != 0;
} }

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Handles namespace Ryujinx.HLE.HOS.Kernel
{ {
class ThreadQueue class ThreadQueue
{ {

View file

@ -2,30 +2,29 @@ using ChocolArm64;
using ChocolArm64.Events; using ChocolArm64.Events;
using ChocolArm64.Memory; using ChocolArm64.Memory;
using ChocolArm64.State; using ChocolArm64.State;
using Ryujinx.HLE.Exceptions;
using Ryujinx.HLE.HOS.Diagnostics;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.HOS.Services.Nv;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.Loaders; using Ryujinx.HLE.Loaders;
using Ryujinx.HLE.Loaders.Executables; using Ryujinx.HLE.Loaders.Executables;
using Ryujinx.HLE.Loaders.Npdm; using Ryujinx.HLE.Loaders.Npdm;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Diagnostics; using Ryujinx.HLE.Utilities;
using Ryujinx.HLE.OsHle.Exceptions;
using Ryujinx.HLE.OsHle.Handles;
using Ryujinx.HLE.OsHle.Kernel;
using Ryujinx.HLE.OsHle.Services.Nv;
using Ryujinx.HLE.OsHle.SystemState;
using Ryujinx.HLE.OsHle.Utilities;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
class Process : IDisposable class Process : IDisposable
{ {
private const int TickFreq = 19_200_000; private const int TickFreq = 19_200_000;
public Switch Ns { get; private set; } public Switch Device { get; private set; }
public bool NeedsHbAbi { get; private set; } public bool NeedsHbAbi { get; private set; }
@ -57,8 +56,6 @@ namespace Ryujinx.HLE.OsHle
private ConcurrentDictionary<long, KThread> Threads; private ConcurrentDictionary<long, KThread> Threads;
private KThread MainThread;
private List<Executable> Executables; private List<Executable> Executables;
private Dictionary<long, string> SymbolTable; private Dictionary<long, string> SymbolTable;
@ -69,14 +66,14 @@ namespace Ryujinx.HLE.OsHle
private bool Disposed; private bool Disposed;
public Process(Switch Ns, KProcessScheduler Scheduler, int ProcessId, Npdm MetaData) public Process(Switch Device, KProcessScheduler Scheduler, int ProcessId, Npdm MetaData)
{ {
this.Ns = Ns; this.Device = Device;
this.Scheduler = Scheduler; this.Scheduler = Scheduler;
this.MetaData = MetaData; this.MetaData = MetaData;
this.ProcessId = ProcessId; this.ProcessId = ProcessId;
Memory = new AMemory(Ns.Memory.RamPointer); Memory = new AMemory(Device.Memory.RamPointer);
MemoryManager = new KMemoryManager(this); MemoryManager = new KMemoryManager(this);
@ -90,7 +87,7 @@ namespace Ryujinx.HLE.OsHle
AppletState = new AppletStateMgr(); AppletState = new AppletStateMgr();
SvcHandler = new SvcHandler(Ns, this); SvcHandler = new SvcHandler(Device, this);
Threads = new ConcurrentDictionary<long, KThread>(); Threads = new ConcurrentDictionary<long, KThread>();
@ -106,7 +103,7 @@ namespace Ryujinx.HLE.OsHle
throw new ObjectDisposedException(nameof(Process)); throw new ObjectDisposedException(nameof(Process));
} }
Ns.Log.PrintInfo(LogClass.Loader, $"Image base at 0x{ImageBase:x16}."); Device.Log.PrintInfo(LogClass.Loader, $"Image base at 0x{ImageBase:x16}.");
Executable Executable = new Executable(Program, MemoryManager, Memory, ImageBase); Executable Executable = new Executable(Program, MemoryManager, Memory, ImageBase);
@ -156,7 +153,7 @@ namespace Ryujinx.HLE.OsHle
return false; return false;
} }
MainThread = HandleTable.GetData<KThread>(Handle); KThread MainThread = HandleTable.GetData<KThread>(Handle);
if (NeedsHbAbi) if (NeedsHbAbi)
{ {
@ -170,7 +167,7 @@ namespace Ryujinx.HLE.OsHle
MemoryState.MappedMemory, MemoryState.MappedMemory,
MemoryPermission.ReadAndWrite); MemoryPermission.ReadAndWrite);
string SwitchPath = Ns.VFs.SystemPathToSwitchPath(Executables[0].FilePath); string SwitchPath = Device.FileSystem.SystemPathToSwitchPath(Executables[0].FilePath);
Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle, SwitchPath); Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle, SwitchPath);
@ -183,24 +180,6 @@ namespace Ryujinx.HLE.OsHle
return true; return true;
} }
public void StopAllThreadsAsync()
{
if (Disposed)
{
throw new ObjectDisposedException(nameof(Process));
}
if (MainThread != null)
{
MainThread.Thread.StopExecution();
}
foreach (KThread Thread in Threads.Values)
{
Thread.Thread.StopExecution();
}
}
public int MakeThread( public int MakeThread(
long EntryPoint, long EntryPoint,
long StackTop, long StackTop,
@ -215,18 +194,16 @@ namespace Ryujinx.HLE.OsHle
AThread CpuThread = new AThread(GetTranslator(), Memory, EntryPoint); AThread CpuThread = new AThread(GetTranslator(), Memory, EntryPoint);
KThread Thread = new KThread(CpuThread, this, ProcessorId, Priority); long Tpidr = GetFreeTls();
int ThreadId = (int)((Tpidr - MemoryManager.TlsIoRegionStart) / 0x200) + 1;
KThread Thread = new KThread(CpuThread, this, ProcessorId, Priority, ThreadId);
Thread.LastPc = EntryPoint; Thread.LastPc = EntryPoint;
int Handle = HandleTable.OpenHandle(Thread); int Handle = HandleTable.OpenHandle(Thread);
long Tpidr = GetFreeTls();
int ThreadId = (int)((Tpidr - MemoryManager.TlsIoRegionStart) / 0x200) + 1;
CpuThread.ThreadState.ProcessId = ProcessId;
CpuThread.ThreadState.ThreadId = ThreadId;
CpuThread.ThreadState.CntfrqEl0 = TickFreq; CpuThread.ThreadState.CntfrqEl0 = TickFreq;
CpuThread.ThreadState.Tpidr = Tpidr; CpuThread.ThreadState.Tpidr = Tpidr;
@ -330,7 +307,7 @@ namespace Ryujinx.HLE.OsHle
} }
} }
Ns.Log.PrintDebug(LogClass.Cpu, $"Executing at 0x{e.Position:x16} {e.SubName} {NsoName}"); Device.Log.PrintDebug(LogClass.Cpu, $"Executing at 0x{e.Position:x16} {e.SubName} {NsoName}");
} }
public void PrintStackTrace(AThreadState ThreadState) public void PrintStackTrace(AThreadState ThreadState)
@ -355,7 +332,7 @@ namespace Ryujinx.HLE.OsHle
Trace.AppendLine(" " + SubName + " (" + GetNsoNameAndAddress(Position) + ")"); Trace.AppendLine(" " + SubName + " (" + GetNsoNameAndAddress(Position) + ")");
} }
Ns.Log.PrintInfo(LogClass.Cpu, Trace.ToString()); Device.Log.PrintInfo(LogClass.Cpu, Trace.ToString());
} }
private string GetNsoNameAndAddress(long Position) private string GetNsoNameAndAddress(long Position)
@ -390,12 +367,7 @@ namespace Ryujinx.HLE.OsHle
if (Threads.Count == 0) if (Threads.Count == 0)
{ {
if (ShouldDispose) Device.System.ExitProcess(ProcessId);
{
Dispose();
}
Ns.Os.ExitProcess(ProcessId);
} }
} }
@ -409,25 +381,10 @@ namespace Ryujinx.HLE.OsHle
return Thread; return Thread;
} }
public void Dispose() private void Unload()
{ {
Dispose(true); if (Disposed || Threads.Count > 0)
}
protected virtual void Dispose(bool Disposing)
{ {
if (Disposing && !Disposed)
{
//If there is still some thread running, disposing the objects is not
//safe as the thread may try to access those resources. Instead, we set
//the flag to have the Process disposed when all threads finishes.
//Note: This may not happen if the guest code gets stuck on a infinite loop.
if (Threads.Count > 0)
{
ShouldDispose = true;
Ns.Log.PrintInfo(LogClass.Loader, $"Process {ProcessId} waiting all threads terminate...");
return; return;
} }
@ -441,16 +398,40 @@ namespace Ryujinx.HLE.OsHle
} }
} }
INvDrvServices.UnloadProcess(this);
AppletState.Dispose();
if (NeedsHbAbi && Executables.Count > 0 && Executables[0].FilePath.EndsWith(Homebrew.TemporaryNroSuffix)) if (NeedsHbAbi && Executables.Count > 0 && Executables[0].FilePath.EndsWith(Homebrew.TemporaryNroSuffix))
{ {
File.Delete(Executables[0].FilePath); File.Delete(Executables[0].FilePath);
} }
INvDrvServices.UnloadProcess(this); Device.Log.PrintInfo(LogClass.Loader, $"Process {ProcessId} exiting...");
}
AppletState.Dispose(); public void Dispose()
{
Dispose(true);
}
Ns.Log.PrintInfo(LogClass.Loader, $"Process {ProcessId} exiting..."); protected virtual void Dispose(bool Disposing)
{
if (Disposing)
{
if (Threads.Count > 0)
{
foreach (KThread Thread in Threads.Values)
{
Thread.Thread.StopExecution();
Scheduler.ForceWakeUp(Thread);
}
}
else
{
Unload();
}
} }
} }
} }

View file

@ -1,13 +1,13 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using Ryujinx.HLE.OsHle.Handles; using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Kernel;
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle namespace Ryujinx.HLE.HOS
{ {
class ServiceCtx class ServiceCtx
{ {
public Switch Ns { get; private set; } public Switch Device { get; private set; }
public Process Process { get; private set; } public Process Process { get; private set; }
public AMemory Memory { get; private set; } public AMemory Memory { get; private set; }
public KSession Session { get; private set; } public KSession Session { get; private set; }
@ -17,7 +17,7 @@ namespace Ryujinx.HLE.OsHle
public BinaryWriter ResponseData { get; private set; } public BinaryWriter ResponseData { get; private set; }
public ServiceCtx( public ServiceCtx(
Switch Ns, Switch Device,
Process Process, Process Process,
AMemory Memory, AMemory Memory,
KSession Session, KSession Session,
@ -26,7 +26,7 @@ namespace Ryujinx.HLE.OsHle
BinaryReader RequestData, BinaryReader RequestData,
BinaryWriter ResponseData) BinaryWriter ResponseData)
{ {
this.Ns = Ns; this.Device = Device;
this.Process = Process; this.Process = Process;
this.Memory = Memory; this.Memory = Memory;
this.Session = Session; this.Session = Session;

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Acc namespace Ryujinx.HLE.HOS.Services.Acc
{ {
static class AccErr static class AccErr
{ {

View file

@ -1,12 +1,11 @@
using ChocolArm64.Memory; using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc;
using Ryujinx.HLE.OsHle.SystemState;
using System.Collections.Generic; using System.Collections.Generic;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Services.Acc namespace Ryujinx.HLE.HOS.Services.Acc
{ {
class IAccountServiceForApplication : IpcService class IAccountServiceForApplication : IpcService
{ {
@ -31,7 +30,7 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
public long GetUserCount(ServiceCtx Context) public long GetUserCount(ServiceCtx Context)
{ {
Context.ResponseData.Write(Context.Ns.Os.SystemState.GetUserCount()); Context.ResponseData.Write(Context.Device.System.State.GetUserCount());
return 0; return 0;
} }
@ -42,19 +41,19 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
Context.RequestData.ReadInt64(), Context.RequestData.ReadInt64(),
Context.RequestData.ReadInt64()); Context.RequestData.ReadInt64());
Context.ResponseData.Write(Context.Ns.Os.SystemState.TryGetUser(Uuid, out _) ? 1 : 0); Context.ResponseData.Write(Context.Device.System.State.TryGetUser(Uuid, out _) ? 1 : 0);
return 0; return 0;
} }
public long ListAllUsers(ServiceCtx Context) public long ListAllUsers(ServiceCtx Context)
{ {
return WriteUserList(Context, Context.Ns.Os.SystemState.GetAllUsers()); return WriteUserList(Context, Context.Device.System.State.GetAllUsers());
} }
public long ListOpenUsers(ServiceCtx Context) public long ListOpenUsers(ServiceCtx Context)
{ {
return WriteUserList(Context, Context.Ns.Os.SystemState.GetOpenUsers()); return WriteUserList(Context, Context.Device.System.State.GetOpenUsers());
} }
private long WriteUserList(ServiceCtx Context, IEnumerable<UserProfile> Profiles) private long WriteUserList(ServiceCtx Context, IEnumerable<UserProfile> Profiles)
@ -84,7 +83,7 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
public long GetLastOpenedUser(ServiceCtx Context) public long GetLastOpenedUser(ServiceCtx Context)
{ {
UserProfile LastOpened = Context.Ns.Os.SystemState.LastOpenUser; UserProfile LastOpened = Context.Device.System.State.LastOpenUser;
LastOpened.Uuid.Write(Context.ResponseData); LastOpened.Uuid.Write(Context.ResponseData);
@ -97,9 +96,9 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
Context.RequestData.ReadInt64(), Context.RequestData.ReadInt64(),
Context.RequestData.ReadInt64()); Context.RequestData.ReadInt64());
if (!Context.Ns.Os.SystemState.TryGetUser(Uuid, out UserProfile Profile)) if (!Context.Device.System.State.TryGetUser(Uuid, out UserProfile Profile))
{ {
Context.Ns.Log.PrintWarning(LogClass.ServiceAcc, $"User 0x{Uuid} not found!"); Context.Device.Log.PrintWarning(LogClass.ServiceAcc, $"User 0x{Uuid} not found!");
return MakeError(ErrorModule.Account, AccErr.UserNotFound); return MakeError(ErrorModule.Account, AccErr.UserNotFound);
} }
@ -111,7 +110,7 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
public long InitializeApplicationInfo(ServiceCtx Context) public long InitializeApplicationInfo(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAcc, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,8 +1,8 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Acc namespace Ryujinx.HLE.HOS.Services.Acc
{ {
class IManagerForApplication : IpcService class IManagerForApplication : IpcService
{ {
@ -21,14 +21,14 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
public long CheckAvailability(ServiceCtx Context) public long CheckAvailability(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAcc, "Stubbed.");
return 0; return 0;
} }
public long GetAccountId(ServiceCtx Context) public long GetAccountId(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAcc, "Stubbed.");
Context.ResponseData.Write(0xcafeL); Context.ResponseData.Write(0xcafeL);

View file

@ -1,12 +1,12 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.Utilities;
using Ryujinx.HLE.OsHle.SystemState;
using Ryujinx.HLE.OsHle.Utilities;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace Ryujinx.HLE.OsHle.Services.Acc namespace Ryujinx.HLE.HOS.Services.Acc
{ {
class IProfile : IpcService class IProfile : IpcService
{ {
@ -29,7 +29,7 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
public long Get(ServiceCtx Context) public long Get(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAcc, "Stubbed.");
long Position = Context.Request.ReceiveBuff[0].Position; long Position = Context.Request.ReceiveBuff[0].Position;

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
static class AmErr static class AmErr
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
enum FocusState enum FocusState
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IAllSystemAppletProxiesService : IpcService class IAllSystemAppletProxiesService : IpcService
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IApplicationCreator : IpcService class IApplicationCreator : IpcService
{ {

View file

@ -1,8 +1,8 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IApplicationFunctions : IpcService class IApplicationFunctions : IpcService
{ {
@ -39,7 +39,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
long UIdLow = Context.RequestData.ReadInt64(); long UIdLow = Context.RequestData.ReadInt64();
long UIdHigh = Context.RequestData.ReadInt64(); long UIdHigh = Context.RequestData.ReadInt64();
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
Context.ResponseData.Write(0L); Context.ResponseData.Write(0L);
@ -48,7 +48,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long GetDesiredLanguage(ServiceCtx Context) public long GetDesiredLanguage(ServiceCtx Context)
{ {
Context.ResponseData.Write(Context.Ns.Os.SystemState.DesiredLanguageCode); Context.ResponseData.Write(Context.Device.System.State.DesiredLanguageCode);
return 0; return 0;
} }
@ -59,7 +59,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
string Result = GetFormattedErrorCode(ErrorCode); string Result = GetFormattedErrorCode(ErrorCode);
Context.Ns.Log.PrintInfo(LogClass.ServiceAm, $"Result = 0x{ErrorCode:x8} ({Result})."); Context.Device.Log.PrintInfo(LogClass.ServiceAm, $"Result = 0x{ErrorCode:x8} ({Result}).");
return 0; return 0;
} }
@ -90,7 +90,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long GetPseudoDeviceId(ServiceCtx Context) public long GetPseudoDeviceId(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
Context.ResponseData.Write(0L); Context.ResponseData.Write(0L);
Context.ResponseData.Write(0L); Context.ResponseData.Write(0L);
@ -100,7 +100,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long InitializeGamePlayRecording(ServiceCtx Context) public long InitializeGamePlayRecording(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -109,7 +109,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
int State = Context.RequestData.ReadInt32(); int State = Context.RequestData.ReadInt32();
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IApplicationProxy : IpcService class IApplicationProxy : IpcService
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IApplicationProxyService : IpcService class IApplicationProxyService : IpcService
{ {

View file

@ -1,8 +1,8 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IAudioController : IpcService class IAudioController : IpcService
{ {
@ -27,7 +27,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
float AppletVolume = Context.RequestData.ReadSingle(); float AppletVolume = Context.RequestData.ReadSingle();
float LibraryAppletVolume = Context.RequestData.ReadSingle(); float LibraryAppletVolume = Context.RequestData.ReadSingle();
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -36,7 +36,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
Context.ResponseData.Write(1f); Context.ResponseData.Write(1f);
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -45,7 +45,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
Context.ResponseData.Write(1f); Context.ResponseData.Write(1f);
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -55,7 +55,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
float Unknown0 = Context.RequestData.ReadSingle(); float Unknown0 = Context.RequestData.ReadSingle();
long Unknown1 = Context.RequestData.ReadInt64(); long Unknown1 = Context.RequestData.ReadInt64();
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -64,7 +64,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
float Unknown0 = Context.RequestData.ReadSingle(); float Unknown0 = Context.RequestData.ReadSingle();
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,11 +1,11 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
using static Ryujinx.HLE.OsHle.ErrorCode; using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class ICommonStateGetter : IpcService class ICommonStateGetter : IpcService
{ {
@ -57,7 +57,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long GetOperationMode(ServiceCtx Context) public long GetOperationMode(ServiceCtx Context)
{ {
OperationMode Mode = Context.Ns.Os.SystemState.DockedMode OperationMode Mode = Context.Device.System.State.DockedMode
? OperationMode.Docked ? OperationMode.Docked
: OperationMode.Handheld; : OperationMode.Handheld;
@ -68,7 +68,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long GetPerformanceMode(ServiceCtx Context) public long GetPerformanceMode(ServiceCtx Context)
{ {
Apm.PerformanceMode Mode = Context.Ns.Os.SystemState.DockedMode Apm.PerformanceMode Mode = Context.Device.System.State.DockedMode
? Apm.PerformanceMode.Docked ? Apm.PerformanceMode.Docked
: Apm.PerformanceMode.Handheld; : Apm.PerformanceMode.Handheld;
@ -81,7 +81,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
Context.ResponseData.Write((byte)0); //Unknown value. Context.ResponseData.Write((byte)0); //Unknown value.
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -107,7 +107,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle); Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle);
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IDebugFunctions : IpcService class IDebugFunctions : IpcService
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IDisplayController : IpcService class IDisplayController : IpcService
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IGlobalStateController : IpcService class IGlobalStateController : IpcService
{ {

View file

@ -1,9 +1,9 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IHomeMenuFunctions : IpcService class IHomeMenuFunctions : IpcService
{ {
@ -27,7 +27,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long RequestToGetForeground(ServiceCtx Context) public long RequestToGetForeground(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -38,7 +38,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle); Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle);
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,9 +1,9 @@
using Ryujinx.HLE.Logging; using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.OsHle.Handles; using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.Logging;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class ILibraryAppletAccessor : IpcService class ILibraryAppletAccessor : IpcService
{ {
@ -35,28 +35,28 @@ namespace Ryujinx.HLE.OsHle.Services.Am
Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle); Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle);
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
public long Start(ServiceCtx Context) public long Start(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
public long GetResult(ServiceCtx Context) public long GetResult(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
public long PushInData(ServiceCtx Context) public long PushInData(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class ILibraryAppletCreator : IpcService class ILibraryAppletCreator : IpcService
{ {

View file

@ -1,9 +1,9 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Handles;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class ISelfController : IpcService class ISelfController : IpcService
{ {
@ -36,21 +36,21 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long Exit(ServiceCtx Context) public long Exit(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
public long LockExit(ServiceCtx Context) public long LockExit(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
public long UnlockExit(ServiceCtx Context) public long UnlockExit(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -63,7 +63,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle); Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle);
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -72,7 +72,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
bool Enable = Context.RequestData.ReadByte() != 0 ? true : false; bool Enable = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -81,7 +81,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
bool Enable = Context.RequestData.ReadByte() != 0 ? true : false; bool Enable = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -90,7 +90,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
bool Enable = Context.RequestData.ReadByte() != 0 ? true : false; bool Enable = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -101,7 +101,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
bool Flag2 = Context.RequestData.ReadByte() != 0 ? true : false; bool Flag2 = Context.RequestData.ReadByte() != 0 ? true : false;
bool Flag3 = Context.RequestData.ReadByte() != 0 ? true : false; bool Flag3 = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -110,7 +110,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
bool Enable = Context.RequestData.ReadByte() != 0 ? true : false; bool Enable = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -119,7 +119,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
bool Enable = Context.RequestData.ReadByte() != 0 ? true : false; bool Enable = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -128,7 +128,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
int Orientation = Context.RequestData.ReadInt32(); int Orientation = Context.RequestData.ReadInt32();
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }
@ -137,7 +137,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
{ {
bool Enable = Context.RequestData.ReadByte() != 0 ? true : false; bool Enable = Context.RequestData.ReadByte() != 0 ? true : false;
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IStorage : IpcService class IStorage : IpcService
{ {

View file

@ -1,8 +1,8 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IStorageAccessor : IpcService class IStorageAccessor : IpcService
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class ISystemAppletProxy : IpcService class ISystemAppletProxy : IpcService
{ {

View file

@ -1,8 +1,8 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class IWindowController : IpcService class IWindowController : IpcService
{ {
@ -21,7 +21,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long GetAppletResourceUserId(ServiceCtx Context) public long GetAppletResourceUserId(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
Context.ResponseData.Write(0L); Context.ResponseData.Write(0L);
@ -30,7 +30,7 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long AcquireForegroundRights(ServiceCtx Context) public long AcquireForegroundRights(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
enum MessageInfo enum MessageInfo
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
enum OperationMode enum OperationMode
{ {

View file

@ -1,6 +1,6 @@
using System.IO; using System.IO;
namespace Ryujinx.HLE.OsHle.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
class StorageHelper class StorageHelper
{ {

View file

@ -1,7 +1,7 @@
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Apm namespace Ryujinx.HLE.HOS.Services.Apm
{ {
class IManager : IpcService class IManager : IpcService
{ {

View file

@ -1,8 +1,8 @@
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Apm namespace Ryujinx.HLE.HOS.Services.Apm
{ {
class ISession : IpcService class ISession : IpcService
{ {
@ -33,7 +33,7 @@ namespace Ryujinx.HLE.OsHle.Services.Apm
Context.ResponseData.Write((uint)PerformanceConfiguration.PerformanceConfiguration1); Context.ResponseData.Write((uint)PerformanceConfiguration.PerformanceConfiguration1);
Context.Ns.Log.PrintStub(LogClass.ServiceApm, "Stubbed."); Context.Device.Log.PrintStub(LogClass.ServiceApm, "Stubbed.");
return 0; return 0;
} }

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Apm namespace Ryujinx.HLE.HOS.Services.Apm
{ {
enum PerformanceConfiguration : uint enum PerformanceConfiguration : uint
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Apm namespace Ryujinx.HLE.HOS.Services.Apm
{ {
enum PerformanceMode enum PerformanceMode
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Aud namespace Ryujinx.HLE.HOS.Services.Aud
{ {
static class AudErr static class AudErr
{ {

View file

@ -1,6 +1,6 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.HLE.OsHle.Services.Aud.AudioOut namespace Ryujinx.HLE.HOS.Services.Aud.AudioOut
{ {
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
struct AudioOutData struct AudioOutData

View file

@ -1,11 +1,11 @@
using ChocolArm64.Memory; using ChocolArm64.Memory;
using Ryujinx.Audio; using Ryujinx.Audio;
using Ryujinx.HLE.OsHle.Handles; using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.HOS.Kernel;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.HLE.OsHle.Services.Aud.AudioOut namespace Ryujinx.HLE.HOS.Services.Aud.AudioOut
{ {
class IAudioOut : IpcService, IDisposable class IAudioOut : IpcService, IDisposable
{ {

View file

@ -1,4 +1,4 @@
namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer
{ {
static class AudioConsts static class AudioConsts
{ {

View file

@ -1,6 +1,6 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer
{ {
[StructLayout(LayoutKind.Sequential, Size = 0x10, Pack = 4)] [StructLayout(LayoutKind.Sequential, Size = 0x10, Pack = 4)]
struct BehaviorIn struct BehaviorIn

View file

@ -1,6 +1,6 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.HLE.OsHle.Services.Aud.AudioRenderer namespace Ryujinx.HLE.HOS.Services.Aud.AudioRenderer
{ {
[StructLayout(LayoutKind.Sequential, Size = 0xc, Pack = 1)] [StructLayout(LayoutKind.Sequential, Size = 0xc, Pack = 1)]
struct BiquadFilter struct BiquadFilter

Some files were not shown because too many files have changed in this diff Show more