From 697ad7be80dab3316ecbe0a5c528f61c240e45e1 Mon Sep 17 00:00:00 2001 From: ParantezTech Date: Mon, 29 Jun 2026 14:31:37 +0300 Subject: [PATCH] [libs] Add NP entitlement validation --- .../Np/NpEntitlementAccessExports.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/SharpEmu.Libs/Np/NpEntitlementAccessExports.cs diff --git a/src/SharpEmu.Libs/Np/NpEntitlementAccessExports.cs b/src/SharpEmu.Libs/Np/NpEntitlementAccessExports.cs new file mode 100644 index 0000000..f6387ca --- /dev/null +++ b/src/SharpEmu.Libs/Np/NpEntitlementAccessExports.cs @@ -0,0 +1,51 @@ +// Copyright (C) 2026 SharpEmu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +using SharpEmu.HLE; + +namespace SharpEmu.Libs.Np; + +public static class NpEntitlementAccessExports +{ + private const int BootParamClearSize = 0x20; + + [SysAbiExport( + Nid = "jO8DM8oyego", + ExportName = "sceNpEntitlementAccessInitialize", + Target = Generation.Gen4 | Generation.Gen5, + LibraryName = "libSceNpEntitlementAccess")] + public static int NpEntitlementAccessInitialize(CpuContext ctx) + { + var initParam = ctx[CpuRegister.Rdi]; + var bootParam = ctx[CpuRegister.Rsi]; + + if (bootParam != 0) + { + Span clear = stackalloc byte[BootParamClearSize]; + clear.Clear(); + if (!ctx.Memory.TryWrite(bootParam, clear)) + { + return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT); + } + } + + TraceNpEntitlementAccess($"initialize init=0x{initParam:X16} boot=0x{bootParam:X16}"); + return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_OK); + } + + private static int SetReturn(CpuContext ctx, OrbisGen2Result result) + { + ctx[CpuRegister.Rax] = unchecked((ulong)(int)result); + return (int)result; + } + + private static void TraceNpEntitlementAccess(string message) + { + if (!string.Equals(Environment.GetEnvironmentVariable("SHARPEMU_LOG_NP"), "1", StringComparison.Ordinal)) + { + return; + } + + Console.Error.WriteLine($"[LOADER][TRACE] np.entitlement.{message}"); + } +}