0
0
Fork 0

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,9 +1,9 @@
using System; using System;
namespace Ryujinx.HLE.Loaders.Npdm namespace Ryujinx.HLE.Exceptions
{ {
public class InvalidNpdmException : Exception public class InvalidNpdmException : Exception
{ {
public InvalidNpdmException(string ExMsg) : base(ExMsg) { } public InvalidNpdmException(string ExMsg) : base(ExMsg) { }
} }
} }

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
{ {
@ -27,12 +26,12 @@ namespace Ryujinx.HLE.OsHle.Kernel
return 0; return 0;
} }
public static ulong WaitForAddressIfLessThan(Process Process, public static ulong WaitForAddressIfLessThan(Process Process,
AThreadState ThreadState, AThreadState ThreadState,
AMemory Memory, AMemory Memory,
long Address, long Address,
int Value, int Value,
ulong Timeout, ulong Timeout,
bool ShouldDecrement) bool ShouldDecrement)
{ {
Memory.SetExclusive(ThreadState, Address); Memory.SetExclusive(ThreadState, Address);
@ -75,11 +74,11 @@ namespace Ryujinx.HLE.OsHle.Kernel
return WaitForAddress(Process, ThreadState, Address, Timeout); return WaitForAddress(Process, ThreadState, Address, Timeout);
} }
public static ulong WaitForAddressIfEqual(Process Process, public static ulong WaitForAddressIfEqual(Process Process,
AThreadState ThreadState, AThreadState ThreadState,
AMemory Memory, AMemory Memory,
long Address, long Address,
int Value, int Value,
ulong Timeout) ulong Timeout)
{ {
if (Memory.ReadInt32(Address) != Value) if (Memory.ReadInt32(Address) != Value)

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,6 +381,35 @@ namespace Ryujinx.HLE.OsHle
return Thread; return Thread;
} }
private void Unload()
{
if (Disposed || Threads.Count > 0)
{
return;
}
Disposed = true;
foreach (object Obj in HandleTable.Clear())
{
if (Obj is KSession Session)
{
Session.Dispose();
}
}
INvDrvServices.UnloadProcess(this);
AppletState.Dispose();
if (NeedsHbAbi && Executables.Count > 0 && Executables[0].FilePath.EndsWith(Homebrew.TemporaryNroSuffix))
{
File.Delete(Executables[0].FilePath);
}
Device.Log.PrintInfo(LogClass.Loader, $"Process {ProcessId} exiting...");
}
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);
@ -416,41 +417,21 @@ namespace Ryujinx.HLE.OsHle
protected virtual void Dispose(bool Disposing) protected virtual void Dispose(bool Disposing)
{ {
if (Disposing && !Disposed) if (Disposing)
{ {
//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) if (Threads.Count > 0)
{ {
ShouldDispose = true; foreach (KThread Thread in Threads.Values)
Ns.Log.PrintInfo(LogClass.Loader, $"Process {ProcessId} waiting all threads terminate...");
return;
}
Disposed = true;
foreach (object Obj in HandleTable.Clear())
{
if (Obj is KSession Session)
{ {
Session.Dispose(); Thread.Thread.StopExecution();
Scheduler.ForceWakeUp(Thread);
} }
} }
else
if (NeedsHbAbi && Executables.Count > 0 && Executables[0].FilePath.EndsWith(Homebrew.TemporaryNroSuffix))
{ {
File.Delete(Executables[0].FilePath); Unload();
} }
INvDrvServices.UnloadProcess(this);
AppletState.Dispose();
Ns.Log.PrintInfo(LogClass.Loader, $"Process {ProcessId} exiting...");
} }
} }
} }

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,22 +36,22 @@ 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;
} }
@ -127,8 +127,8 @@ namespace Ryujinx.HLE.OsHle.Services.Am
public long SetScreenShotImageOrientation(ServiceCtx Context) public long SetScreenShotImageOrientation(ServiceCtx Context)
{ {
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