From beedb746d9932b17cb66082398945cfd2cefc73f Mon Sep 17 00:00:00 2001 From: ParantezTech <12572227+par274@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:49 +0300 Subject: [PATCH] [Kernel] Expose the process argument count and vector Co-authored-by: Sekai <140012992+SekaixX@users.noreply.github.com> --- src/SharpEmu.HLE/HleDataSymbols.cs | 13 +++++++- .../Kernel/LibcProcessArgumentExports.cs | 31 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/SharpEmu.Libs/Kernel/LibcProcessArgumentExports.cs diff --git a/src/SharpEmu.HLE/HleDataSymbols.cs b/src/SharpEmu.HLE/HleDataSymbols.cs index 12d1e3f..92697dd 100644 --- a/src/SharpEmu.HLE/HleDataSymbols.cs +++ b/src/SharpEmu.HLE/HleDataSymbols.cs @@ -21,6 +21,7 @@ public static class HleDataSymbols private static readonly nint _stackChkGuardAddress = Allocate(sizeof(ulong) * 2); private static readonly nint _progNameBufferAddress = Allocate(ProgNameMaxBytes + 1); private static readonly nint _progNamePointerAddress = Allocate(nint.Size); + private static readonly nint _argumentVectorAddress = Allocate(nint.Size * 2); private static readonly nint _libcNeedFlagAddress = Allocate(sizeof(uint)); private static readonly nint _libcInternalNeedFlagAddress = Allocate(sizeof(uint)); @@ -55,6 +56,12 @@ public static class HleDataSymbols yield return LibcInternalNeedFlagNid; } + public static int ProcessArgumentCount => + _progNameBufferAddress != 0 && _argumentVectorAddress != 0 ? 1 : 0; + + public static ulong ProcessArgumentVectorAddress => + unchecked((ulong)_argumentVectorAddress); + public static void ConfigureProcessImageName(string? processImageName) { var effectiveName = string.IsNullOrWhiteSpace(processImageName) @@ -65,7 +72,9 @@ public static class HleDataSymbols lock (_gate) { - if (_progNameBufferAddress == 0 || _progNamePointerAddress == 0) + if (_progNameBufferAddress == 0 || + _progNamePointerAddress == 0 || + _argumentVectorAddress == 0) { return; } @@ -77,6 +86,8 @@ public static class HleDataSymbols Marshal.Copy(encodedName, 0, _progNameBufferAddress, byteCount); WritePointer(_progNamePointerAddress, _progNameBufferAddress); + WritePointer(_argumentVectorAddress, _progNameBufferAddress); + WritePointer(IntPtr.Add(_argumentVectorAddress, nint.Size), 0); } } diff --git a/src/SharpEmu.Libs/Kernel/LibcProcessArgumentExports.cs b/src/SharpEmu.Libs/Kernel/LibcProcessArgumentExports.cs new file mode 100644 index 0000000..9de33b1 --- /dev/null +++ b/src/SharpEmu.Libs/Kernel/LibcProcessArgumentExports.cs @@ -0,0 +1,31 @@ +// Copyright (C) 2026 SharpEmu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +using SharpEmu.HLE; + +namespace SharpEmu.Libs.Kernel; + +/// +/// Process-argument accessors exported by libKernel for the platform libc. +/// +public static class LibcProcessArgumentExports +{ + [SysAbiExport( + Nid = "iKJMWrAumPE", + ExportName = "getargc", + Target = Generation.Gen4 | Generation.Gen5, + LibraryName = "libKernel")] + public static int GetArgc(CpuContext ctx) => + ctx.SetReturn(HleDataSymbols.ProcessArgumentCount); + + [SysAbiExport( + Nid = "FJmglmTMdr4", + ExportName = "getargv", + Target = Generation.Gen4 | Generation.Gen5, + LibraryName = "libKernel")] + public static int GetArgv(CpuContext ctx) + { + ctx[CpuRegister.Rax] = HleDataSymbols.ProcessArgumentVectorAddress; + return (int)OrbisGen2Result.ORBIS_GEN2_OK; + } +}