From 770a544b8f8a2a0c063bb7ab90daf038b40b5aa4 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 28 Jul 2026 19:01:47 -0400 Subject: [PATCH 001/205] improved dram timings --- .../oc/pcv/mariko/calculate_timings_mariko.cpp | 4 ++-- .../loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index fab24dbf..7514694b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -151,7 +151,7 @@ namespace ams::ldr::hoc::pcv::mariko { u32 tREFI = lowFreq ? C.low_t8_tREFI : C.t8_tREFI; refresh_raw = 0xFFFF; if (tREFI != 6) { - refresh_raw = CEIL(tREFpb_values[tREFI] / tCK_avg) - 0x40; + refresh_raw = ROUND(tREFpb_values[tREFI] / tCK_avg) - 0x40; refresh_raw = MIN(refresh_raw, static_cast(0xFFFF)); } @@ -172,7 +172,7 @@ namespace ams::ldr::hoc::pcv::mariko { quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; einput = quse - CEIL(9.928 / tCK_avg); - u32 qrst_duration = FLOOR(8.399 - tCK_avg); + u32 qrst_duration = FLOOR(1.375 / tCK_avg + 4.555); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 7dacbdbe..f154593c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -63,20 +63,23 @@ namespace ams::ldr::hoc::pcv::mariko { CalculateTimings(tCK_avg, table->rate_khz); + const u32 ras_cyc = MIN(GET_CYCLE_CEIL(tRAS), static_cast(0x7F)); + const u32 rp_cyc = GET_CYCLE_CEIL(tRPpb); + WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD)); WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD)); - WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast(0xB9))); - WRITE_PARAM_ALL_REG(table, emc_ras, MIN(GET_CYCLE_CEIL(tRAS), static_cast(0x7F))); + WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), ras_cyc + rp_cyc)); + WRITE_PARAM_ALL_REG(table, emc_ras, ras_cyc); WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD)); WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb)); WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab)); - WRITE_PARAM_ALL_REG(table, emc_rp, GET_CYCLE_CEIL(tRPpb)); + WRITE_PARAM_ALL_REG(table, emc_rp, rp_cyc); WRITE_PARAM_ALL_REG(table, emc_txsr, MIN(GET_CYCLE_CEIL(tXSR), static_cast(0x3fe))); WRITE_PARAM_ALL_REG(table, emc_txsrdll, MIN(GET_CYCLE_CEIL(tXSR), static_cast(0x3fe))); WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW)); WRITE_PARAM_ALL_REG(table, emc_trpab, MIN(GET_CYCLE_CEIL(tRPab), static_cast(0x3F))); WRITE_PARAM_ALL_REG(table, emc_tckesr, GET_CYCLE_CEIL(tSR)); - WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(7.425) + 2); + WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(tXP) + 2); WRITE_PARAM_ALL_REG(table, emc_tpd, GET_CYCLE_CEIL(tXP)); WRITE_PARAM_ALL_REG(table, emc_tclkstop, tCLKSTOP); WRITE_PARAM_ALL_REG(table, emc_r2p, tR2P); @@ -97,7 +100,7 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_pdex2rd, pdex2rw); WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); - WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.05)); + WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.75) - 2); WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); From f45c9b29330606f1be7f0b118f7bb6f2a01739d0 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 28 Jul 2026 19:24:40 -0400 Subject: [PATCH 002/205] perfect quse_width also perfects quse, einput, einput_duration and qsafe --- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 7514694b..ee8f1b7b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -168,7 +168,7 @@ namespace ams::ldr::hoc::pcv::mariko { rdv = RL + FLOOR((5.105 / tCK_avg) + 17.017); qpop = rdv - 14; - quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); + quse_width = CEIL(MAX(4.7760/tCK + 4.110, 5.1060/tCK + 3.170)) - FLOOR(2.55/tCK); quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; einput = quse - CEIL(9.928 / tCK_avg); From db5ae4efd4db3ee117de6e5ddaa3b339fdef4f24 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 28 Jul 2026 19:28:49 -0400 Subject: [PATCH 003/205] fix compile error --- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index ee8f1b7b..fe63c2f1 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -168,7 +168,7 @@ namespace ams::ldr::hoc::pcv::mariko { rdv = RL + FLOOR((5.105 / tCK_avg) + 17.017); qpop = rdv - 14; - quse_width = CEIL(MAX(4.7760/tCK + 4.110, 5.1060/tCK + 3.170)) - FLOOR(2.55/tCK); + quse_width = CEIL(MAX(4.7760 / tCK_avg + 4.110, 5.1060 / tCK_avg + 3.170)) - FLOOR(2.55 / tCK_avg); quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; einput = quse - CEIL(9.928 / tCK_avg); From e626d0c4f836f43338d2813286027e287509107d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 29 Jul 2026 11:22:54 -0400 Subject: [PATCH 004/205] perfect pdex2rw --- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index fe63c2f1..ec4011d1 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -191,7 +191,7 @@ namespace ams::ldr::hoc::pcv::mariko { u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); + pdex2rw = CEIL(7.4870 / tCK_avg + 1.0257) + FLOOR(1.7410 / tCK_avg + 0.03) + FLOOR(1.0 / tCK_avg); tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; From 119099984d6f28a031cbcbbe7c4ae5f2df38817d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 29 Jul 2026 15:52:16 -0400 Subject: [PATCH 005/205] more timing improvements --- .../pcv/mariko/calculate_timings_mariko.cpp | 20 ++++++++++--------- .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 8 ++++---- .../source/oc/pcv/mariko/timing_tables.cpp | 13 ++++++++++-- .../source/oc/pcv/mariko/timing_tables.hpp | 2 +- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index ec4011d1..40a0644d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -20,8 +20,8 @@ namespace ams::ldr::hoc::pcv::mariko { - void GetRext() { - if (auto r = FindRext()) { + void GetRext(u32 freq) { + if (auto r = FindRext(freq)) { rext = r->rext; return; } @@ -46,7 +46,7 @@ namespace ams::ldr::hoc::pcv::mariko { } void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1862'400) { /* 1866tRWL */ + if (freq > 1600'000 && freq <= 1896'000) { /* 1866tRWL */ latency += latencyStep * 2; } else { /* 2133tRWL */ latency += latencyStep * 3; @@ -130,7 +130,7 @@ namespace ams::ldr::hoc::pcv::mariko { HandleLatency(freq); - GetRext(); + GetRext(freq); /* At 1333WL, for some reason (incorrect ram timing config in mtc table?), tRP causes crashes at high reductions - 2 seems to be the most common limit. */ /* This is a lazy workaround until I find the issue... */ @@ -162,17 +162,19 @@ namespace ams::ldr::hoc::pcv::mariko { tRPab = tRPpb + 3; tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (tRTW * 3) + finetRTW; + tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.1022 / tCK_avg) + 0.2750) - FLOOR((1.4996 / tCK_avg) + 0.0020) - (tRTW * 3) + finetRTW; tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); rdv = RL + FLOOR((5.105 / tCK_avg) + 17.017); qpop = rdv - 14; - quse_width = CEIL(MAX(4.7760 / tCK_avg + 4.110, 5.1060 / tCK_avg + 3.170)) - FLOOR(2.55 / tCK_avg); - quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); + u32 quseSum = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782) + + FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); + quse_width = CEIL(MAX((4.7760 / tCK_avg) + 4.110, (5.1060 / tCK_avg) + 3.170)) - FLOOR(2.55 / tCK_avg); + quse = quseSum - quse_width; einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; einput = quse - CEIL(9.928 / tCK_avg); - u32 qrst_duration = FLOOR(1.375 / tCK_avg + 4.555); + u32 qrst_duration = FLOOR((1.375 / tCK_avg) + 4.555); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); @@ -191,7 +193,7 @@ namespace ams::ldr::hoc::pcv::mariko { u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - pdex2rw = CEIL(7.4870 / tCK_avg + 1.0257) + FLOOR(1.7410 / tCK_avg + 0.03) + FLOOR(1.0 / tCK_avg); + pdex2rw = CEIL((7.4870 / tCK_avg) + 1.0257) + FLOOR((1.7410 / tCK_avg) + 0.03) + FLOOR(1.0 / tCK_avg); tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index f154593c..36d1392d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -56,19 +56,19 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_cfg, 0xF3200000); } - u32 trefbw = refresh_raw + 0x40; - trefbw = MIN(trefbw, static_cast(0x3FFF)); - const u32 dyn_self_ref_control = (static_cast(7605.0 / tCK_avg) + 260) | (table->burst_regs.emc_dyn_self_ref_control & 0xffff0000); CalculateTimings(tCK_avg, table->rate_khz); + u32 trefbw = refresh_raw + 0x40; + trefbw = MIN(trefbw, static_cast(0x3FFF)); + const u32 ras_cyc = MIN(GET_CYCLE_CEIL(tRAS), static_cast(0x7F)); const u32 rp_cyc = GET_CYCLE_CEIL(tRPpb); WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD)); WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD)); - WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), ras_cyc + rp_cyc)); + WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), ras_cyc + rp_cyc)); WRITE_PARAM_ALL_REG(table, emc_ras, ras_cyc); WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD)); WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb)); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp index ecb4d47f..039f8799 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp @@ -20,6 +20,11 @@ namespace ams::ldr::hoc::pcv::mariko { const ReplacePatch g_rext_table[] = { + {1'633'000, 0x17}, {1'666'000, 0x18}, {1'700'000, 0x18}, + {1'733'000, 0x18}, {1'766'000, 0x18}, {1'800'000, 0x1A}, + {1'833'000, 0x1A}, {1'866'000, 0x1A}, {1'900'000, 0x19}, + {1'933'000, 0x19}, {1'966'000, 0x19}, {2'000'000, 0x19}, + {2'033'000, 0x19}, {2'066'000, 0x19}, {2'100'000, 0x1A}, {2'133'000, 0x1A}, {2'166'000, 0x19}, {2'200'000, 0x19}, {2'233'000, 0x19}, {2'266'000, 0x1A}, {2'300'000, 0x1B}, {2'333'000, 0x1B}, {2'366'000, 0x1B}, {2'400'000, 0x1B}, @@ -31,13 +36,17 @@ namespace ams::ldr::hoc::pcv::mariko { {2'933'000, 0x1C}, {2'966'000, 0x1D}, {3'000'000, 0x1D}, {3'033'000, 0x1D}, {3'066'000, 0x1D}, {3'100'000, 0x1D}, {3'133'000, 0x1D}, {3'166'000, 0x1C}, {3'200'000, 0x1C}, + {3'233'000, 0x1E}, {3'266'000, 0x1F}, {3'300'000, 0x1E}, + {3'333'000, 0x1F}, {3'366'000, 0x1F}, {3'400'000, 0x1F}, + {3'433'000, 0x1F}, {3'466'000, 0x1F}, {3'500'000, 0x1E}, }; + const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]); - const ReplacePatch *FindRext() { + const ReplacePatch *FindRext(u32 rate_khz) { for (u32 i = 0; i < g_rext_table_size; i++) { - if (g_rext_table[i].freq >= C.marikoEmcMaxClock) { + if (g_rext_table[i].freq >= rate_khz) { return &g_rext_table[i]; } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp index d682000e..0b84b2f9 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp @@ -26,6 +26,6 @@ namespace ams::ldr::hoc::pcv::mariko { extern const ReplacePatch g_rext_table[]; extern const u32 g_rext_table_size; - const ReplacePatch *FindRext(); + const ReplacePatch *FindRext(u32 rate_khz); } From b093b32b297482f23f38550b69b793352afeb751 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 29 Jul 2026 19:06:10 -0400 Subject: [PATCH 006/205] perfect ram timings --- .../loader/source/oc/mtc_timing_value.hpp | 2 +- .../pcv/mariko/calculate_timings_mariko.cpp | 31 +++++++++++++++++-- .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 2 ++ .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- Source/hoc-clk/sysmodule/src/file/kip.cpp | 3 ++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 7b23d587..e3263abe 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -113,7 +113,7 @@ namespace ams::ldr::hoc { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRAS_values = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 }; - const std::array tRRD_values = { /*10.0,*/ 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; /* 10.0 is used for <2133mhz; do we care? 8gb uses 7.5 tRRD on >=1331. */ + const std::array tRRD_values = { 10.0, 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; const std::array tRFC_values = { 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40 }; const std::array tWTR_values = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; const std::array tREFpb_values = { 3900, 5850, 7800, 11700, 15600, 99999 }; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 40a0644d..7b5d3f0f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -15,18 +15,42 @@ */ #include +#include "../pcv.hpp" #include "../../mtc_timing_value.hpp" #include "timing_tables.hpp" namespace ams::ldr::hoc::pcv::mariko { + double GetMaxTrrd(u32 freq) { + DramId id = GetDramId(); + + if (freq >= 1866'000) { + return 7.5; + } + + switch (id) { + case HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE ... IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE: + case IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE: + case HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE: + case IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL: + case HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL: + case AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL: + case IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB ... AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB: + return 7.5; + default: + break; + } + + return 10.0; + } + void GetRext(u32 freq) { if (auto r = FindRext(freq)) { rext = r->rext; return; } - /* > 3200 */ + /* Fallback */ rext = 0x1E; } @@ -46,9 +70,10 @@ namespace ams::ldr::hoc::pcv::mariko { } void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1896'000) { /* 1866tRWL */ + if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ latency += latencyStep * 2; } else { /* 2133tRWL */ + // Note: JEDEC/Datasheet mandates 2133 for >1866, even if <2133 latency += latencyStep * 3; } } @@ -139,7 +164,7 @@ namespace ams::ldr::hoc::pcv::mariko { tRCD = tRCD_values[lowFreq ? C.low_t1_tRCD : C.t1_tRCD]; tRPpb = tRP_values[lowFreq ? C.low_t2_tRP : C.t2_tRP]; tRAS = tRAS_values[lowFreq ? C.low_t3_tRAS : C.t3_tRAS]; - tRRD = tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD]; + tRRD = MIN(tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD], GetMaxTrrd(freq)); tRFCpb = tRFC_values[lowFreq ? C.low_t5_tRFC : C.t5_tRFC]; u32 tRTW = lowFreq ? C.low_t6_tRTW : C.t6_tRTW; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index 99531813..4cafea52 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -26,6 +26,8 @@ namespace ams::ldr::hoc::pcv::mariko { + DramId GetDramId(); + void MtcGenerateFreqTables(); Result MemFreqMtcTable(u32 *ptr); Result MemFreqDvbTable(u32 *ptr); diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 616f8e7e..639e54d4 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1342,7 +1342,7 @@ class RamTimingsSubmenuGui : public MiscGui { addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 4f5f675a..97aa4771 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -367,6 +367,9 @@ namespace kip { config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l"); } config::SetConfigValues(&configValues, true); + if(previousVersion < 300 && version >= 300) { + configValues.values[KipConfigValue_t4_tRRD]++; // tRRD needs to be increased by one for equivalent timing + } } } // namespace kip From f76b737299335ebf12f8b727f4bd7e20e50a881d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 29 Jul 2026 19:25:11 -0400 Subject: [PATCH 007/205] trrd "fix" revert --- .../stratosphere/loader/source/oc/mtc_timing_value.hpp | 2 +- Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- Source/hoc-clk/sysmodule/src/file/kip.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index e3263abe..173f21b7 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -113,7 +113,7 @@ namespace ams::ldr::hoc { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRAS_values = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 }; - const std::array tRRD_values = { 10.0, 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; + const std::array tRRD_values = { 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; const std::array tRFC_values = { 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40 }; const std::array tWTR_values = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; const std::array tREFpb_values = { 3900, 5850, 7800, 11700, 15600, 99999 }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 639e54d4..616f8e7e 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1342,7 +1342,7 @@ class RamTimingsSubmenuGui : public MiscGui { addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 7, 1)); + addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 97aa4771..46a5cfb8 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -368,7 +368,7 @@ namespace kip { } config::SetConfigValues(&configValues, true); if(previousVersion < 300 && version >= 300) { - configValues.values[KipConfigValue_t4_tRRD]++; // tRRD needs to be increased by one for equivalent timing + } } From 3150692690d5cdac7e8f93a67ea7a1481494dd78 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 29 Jul 2026 19:26:18 -0400 Subject: [PATCH 008/205] Update calculate_timings_mariko.cpp --- .../pcv/mariko/calculate_timings_mariko.cpp | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 7b5d3f0f..6e2c6d08 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -21,29 +21,6 @@ namespace ams::ldr::hoc::pcv::mariko { - double GetMaxTrrd(u32 freq) { - DramId id = GetDramId(); - - if (freq >= 1866'000) { - return 7.5; - } - - switch (id) { - case HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE ... IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE: - case IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE: - case HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE: - case IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL: - case HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL: - case AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL: - case IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB ... AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB: - return 7.5; - default: - break; - } - - return 10.0; - } - void GetRext(u32 freq) { if (auto r = FindRext(freq)) { rext = r->rext; @@ -164,7 +141,7 @@ namespace ams::ldr::hoc::pcv::mariko { tRCD = tRCD_values[lowFreq ? C.low_t1_tRCD : C.t1_tRCD]; tRPpb = tRP_values[lowFreq ? C.low_t2_tRP : C.t2_tRP]; tRAS = tRAS_values[lowFreq ? C.low_t3_tRAS : C.t3_tRAS]; - tRRD = MIN(tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD], GetMaxTrrd(freq)); + tRRD = tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD]; tRFCpb = tRFC_values[lowFreq ? C.low_t5_tRFC : C.t5_tRFC]; u32 tRTW = lowFreq ? C.low_t6_tRTW : C.t6_tRTW; From 734ed0c95432f452e6fccff0d7d31cb4eec51e38 Mon Sep 17 00:00:00 2001 From: Souldbminer <162390887+souldbminerr@users.noreply.github.com> Date: Wed, 29 Jul 2026 19:38:15 -0400 Subject: [PATCH 009/205] Update README.md --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 46bd07f8..3050571b 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration to ## Default clocks * **CPU:** Up to 1963MHz (Mariko) / 1785MHz (Erista) -* **GPU:** Up to 1075MHz (Mariko) / 921MHz (Erista) -* **RAM:** Up to 1866/2133MHz (Mariko) / 1600MHz (Erista) +* **GPU:** Up to 1152MHz (Mariko) / 921MHz (Erista) +* **RAM:** Up to 2133MHz (Mariko) / 1600MHz (Erista) * Over/undervolting support * Built-in configurator * Compatible with most homebrew @@ -86,8 +86,13 @@ Refer to COMPILATION.md ## Clock table ### MEM clocks (mhz) - -* 3200 → max on mariko, JEDEC. +* 3400 → max on mariko. +* 3366 +* 3333 +* 3300 +* 3266 +* 3233 +* 3200 → JEDEC. * 3166 * 3133 * 3100 From 497fc64d7cb112b0ee8ee5088f100b2c8791fe10 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 11:24:53 -0400 Subject: [PATCH 010/205] more timing improvement --- .../pcv/erista/calculate_timings_erista.cpp | 8 +++--- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 10 +++---- .../pcv/mariko/calculate_timings_mariko.cpp | 27 +++++++++---------- .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 8 +++--- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index fc6ae8f8..70fd9055 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -120,10 +120,10 @@ namespace ams::ldr::hoc::pcv::erista { CalculateMrw2(); tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; + tR2W = (2 * WL) + (3 * FLOOR(48.0 / WL)) - 2 + FLOOR((5.6563 / tCK_avg) + 0.2575) - (C.t6_tRTW * 3) + finetRTW; tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; wdv = WL; @@ -134,8 +134,8 @@ namespace ams::ldr::hoc::pcv::erista { u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); - tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; + pdex2rw = CEIL((7.5 / tCK_avg) + 0.998) + FLOOR(1.75 / tCK_avg) + FLOOR(1.0 / tCK_avg); + tCLKSTOP = FLOOR(MIN(8.4996 / tCK_avg, 23.0)) + 7.0 + MIN(CEIL(1.75 / tCK_avg) - 3.0, 1.0); const double tMMRI = tRCD + (tCK_avg * 3); pdex2mrr = tMMRI + 10; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index 6b2d4321..d1ea3a9b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -94,7 +94,7 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW)); WRITE_PARAM_ALL_REG(table, emc_trpab, MIN(GET_CYCLE_CEIL(tRPab), static_cast(0x3F))); WRITE_PARAM_ALL_REG(table, emc_tckesr, GET_CYCLE_CEIL(tSR)); - WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(7.425) + 2); + WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(tXP) + MIN(GET_CYCLE_CEIL(1.75) - 2, 2u)); WRITE_PARAM_ALL_REG(table, emc_tpd, GET_CYCLE_CEIL(tXP)); WRITE_PARAM_ALL_REG(table, emc_tclkstop, tCLKSTOP); WRITE_PARAM_ALL_REG(table, emc_r2p, tR2P); @@ -109,11 +109,11 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_dyn_self_ref_control, dyn_self_ref_control); WRITE_PARAM_ALL_REG(table, emc_pdex2wr, pdex2rw); WRITE_PARAM_ALL_REG(table, emc_pdex2rd, pdex2rw); - WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); + WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); - WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.05)); - WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); - WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); + WRITE_PARAM_ALL_REG(table, emc_pdex2cke, MAX(GET_CYCLE_CEIL(1.75) - 2, 2u)); + WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(1.75)); + WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.5)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 6e2c6d08..5ee68ad0 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -164,27 +164,26 @@ namespace ams::ldr::hoc::pcv::mariko { tRPab = tRPpb + 3; tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.1022 / tCK_avg) + 0.2750) - FLOOR((1.4996 / tCK_avg) + 0.0020) - (tRTW * 3) + finetRTW; - tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); + tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.106 / tCK_avg) + 0.260) - FLOOR((1.5 / tCK_avg) + 0.002) - (tRTW * 3) + finetRTW; + tRTM = FLOOR((10.0 + RL) + (3.500 / tCK_avg)) + FLOOR(7.498 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); - rdv = RL + FLOOR((5.105 / tCK_avg) + 17.017); + rdv = RL + FLOOR((5.109 / tCK_avg) + 17.003); qpop = rdv - 14; - u32 quseSum = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782) - + FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); - quse_width = CEIL(MAX((4.7760 / tCK_avg) + 4.110, (5.1060 / tCK_avg) + 3.170)) - FLOOR(2.55 / tCK_avg); + u32 quseSum = RL + FLOOR(5.110 / tCK_avg) + 4; + quse_width = CEIL(MAX((4.8210 / tCK_avg) + 4.001, (5.0860 / tCK_avg) + 3.235)) - FLOOR(2.55 / tCK_avg); quse = quseSum - quse_width; - einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; - einput = quse - CEIL(9.928 / tCK_avg); - u32 qrst_duration = FLOOR((1.375 / tCK_avg) + 4.555); + einput_duration = FLOOR(9.994 / tCK_avg) + 5.0 + quse_width; + einput = quse - (FLOOR(9.994 / tCK_avg) + 1); + u32 qrst_duration = FLOOR((1.398 / tCK_avg) + 4.5); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; - tWTM = CEIL(WL + ((7.570 / tCK_avg) + 8.753)); + tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + tW2R = FLOOR(MAX((5.087 / tCK_avg) + 1.030, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + tWTM = CEIL(WL + ((7.498 / tCK_avg) + 9.005)); tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; wdv = WL; @@ -195,9 +194,9 @@ namespace ams::ldr::hoc::pcv::mariko { u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - pdex2rw = CEIL((7.4870 / tCK_avg) + 1.0257) + FLOOR((1.7410 / tCK_avg) + 0.03) + FLOOR(1.0 / tCK_avg); + pdex2rw = CEIL((7.5 / tCK_avg) + 0.998) + FLOOR(1.75 / tCK_avg) + FLOOR(1.0 / tCK_avg); - tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; + tCLKSTOP = FLOOR(MIN(8.4996 / tCK_avg, 23.0)) + 7.0 + MIN(CEIL(1.75 / tCK_avg) - 3.0, 1.0); u32 tMMRI = tRCD + (tCK_avg * 3); pdex2mrr = tMMRI + 10; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 36d1392d..dc1b3402 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -79,7 +79,7 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW)); WRITE_PARAM_ALL_REG(table, emc_trpab, MIN(GET_CYCLE_CEIL(tRPab), static_cast(0x3F))); WRITE_PARAM_ALL_REG(table, emc_tckesr, GET_CYCLE_CEIL(tSR)); - WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(tXP) + 2); + WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(tXP) + MIN(GET_CYCLE_CEIL(1.75) - 2, 2u)); WRITE_PARAM_ALL_REG(table, emc_tpd, GET_CYCLE_CEIL(tXP)); WRITE_PARAM_ALL_REG(table, emc_tclkstop, tCLKSTOP); WRITE_PARAM_ALL_REG(table, emc_r2p, tR2P); @@ -98,11 +98,11 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_dyn_self_ref_control, dyn_self_ref_control); WRITE_PARAM_ALL_REG(table, emc_pdex2wr, pdex2rw); WRITE_PARAM_ALL_REG(table, emc_pdex2rd, pdex2rw); - WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); + WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); - WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.75) - 2); + WRITE_PARAM_ALL_REG(table, emc_pdex2cke, MAX(GET_CYCLE_CEIL(1.75) - 2, 2u)); WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); - WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); + WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.5)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); WRITE_PARAM_ALL_REG(table, emc_einput, einput); From 969f548231e46a09ef788ed211586e10784a9e06 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 12:31:24 -0400 Subject: [PATCH 011/205] perfect quse_width --- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 5ee68ad0..a13868f5 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -171,7 +171,7 @@ namespace ams::ldr::hoc::pcv::mariko { rdv = RL + FLOOR((5.109 / tCK_avg) + 17.003); qpop = rdv - 14; u32 quseSum = RL + FLOOR(5.110 / tCK_avg) + 4; - quse_width = CEIL(MAX((4.8210 / tCK_avg) + 4.001, (5.0860 / tCK_avg) + 3.235)) - FLOOR(2.55 / tCK_avg); + quse_width = CEIL(MAX((4.7980 / tCK_avg) + 4.046, (5.0680 / tCK_avg) + 3.276)) - FLOOR(2.55 / tCK_avg); quse = quseSum - quse_width; einput_duration = FLOOR(9.994 / tCK_avg) + 5.0 + quse_width; einput = quse - (FLOOR(9.994 / tCK_avg) + 1); From df305437f739b0a86d29bde25e4c3dabf5de5e33 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 15:09:03 -0400 Subject: [PATCH 012/205] Update calculate_timings_mariko.cpp --- .../source/oc/pcv/mariko/calculate_timings_mariko.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index a13868f5..e4ce9a01 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -164,8 +164,8 @@ namespace ams::ldr::hoc::pcv::mariko { tRPab = tRPpb + 3; tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.106 / tCK_avg) + 0.260) - FLOOR((1.5 / tCK_avg) + 0.002) - (tRTW * 3) + finetRTW; - tRTM = FLOOR((10.0 + RL) + (3.500 / tCK_avg)) + FLOOR(7.498 / tCK_avg); + tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.036 / tCK_avg) + 0.418) - FLOOR((1.476 / tCK_avg) + 0.05) - (tRTW * 3) + finetRTW; + tRTM = FLOOR((10.0 + RL) + (3.496 / tCK_avg)) + FLOOR(7.430 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); rdv = RL + FLOOR((5.109 / tCK_avg) + 17.003); @@ -182,8 +182,8 @@ namespace ams::ldr::hoc::pcv::mariko { qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.087 / tCK_avg) + 1.030, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; - tWTM = CEIL(WL + ((7.498 / tCK_avg) + 9.005)); + tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + tWTM = CEIL(WL + ((7.386 / tCK_avg) + 9.150)); tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; wdv = WL; From ff084e2f31b61a22b1c9075cea2361c698f72e0c Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 15:34:42 -0400 Subject: [PATCH 013/205] add uart log flag --- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 56 ++++++++++++------- .../hoc-clk/sysmodule/src/file/file_utils.hpp | 2 + 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 1de9ae5c..eb73f14a 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -45,21 +45,26 @@ namespace fileUtils { LockableMutex g_csv_mutex; std::atomic_bool g_has_initialized = false; bool g_log_enabled = false; + bool g_uart_enabled = false; std::uint64_t g_last_flag_check = 0; + bool FlagExists(const char *path) { + FILE *file = fopen(path, "r"); + if (file) { + fclose(file); + return true; + } + return false; + } + void RefreshFlags(bool force) { std::uint64_t now = armTicksToNs(armGetSystemTick()); if (!force && (now - g_last_flag_check) < FILE_FLAG_CHECK_INTERVAL_NS) { return; } - FILE *file = fopen(FILE_LOG_FLAG_PATH, "r"); - if (file) { - g_log_enabled = true; - fclose(file); - } else { - g_log_enabled = false; - } + g_log_enabled = FlagExists(FILE_LOG_FLAG_PATH); + g_uart_enabled = FlagExists(FILE_UART_FLAG_PATH); g_last_flag_check = now; } @@ -78,9 +83,23 @@ namespace fileUtils { return g_log_enabled; } + bool IsUartEnabled() { + return g_uart_enabled; + } + void LogLine(const char *format, ...) { std::scoped_lock lock{ g_log_mutex }; + if (!g_has_initialized) { + return; + } + + RefreshFlags(false); + + if (!g_log_enabled && !g_uart_enabled) { + return; + } + va_list args; va_start(args, format); @@ -99,21 +118,19 @@ namespace fileUtils { buff[len] = '\0'; // Debug UART log - svcOutputDebugString(buff, len); + if (g_uart_enabled) { + svcOutputDebugString(buff, len); + } - if (g_has_initialized) { - RefreshFlags(false); + if (g_log_enabled) { + FILE *file = fopen(FILE_LOG_FILE_PATH, "a"); - if (g_log_enabled) { - FILE *file = fopen(FILE_LOG_FILE_PATH, "a"); + if (file) { + timespec now = {}; + clock_gettime(CLOCK_REALTIME, &now); - if (file) { - timespec now = {}; - clock_gettime(CLOCK_REALTIME, &now); - - fprintf(file, "[%luls] %s", now.tv_sec - bootTimeS, buff); - fclose(file); - } + fprintf(file, "[%luls] %s", now.tv_sec - bootTimeS, buff); + fclose(file); } } } @@ -222,6 +239,7 @@ namespace fileUtils { g_has_initialized = false; g_log_enabled = false; + g_uart_enabled = false; fsdevUnmountAll(); fsExit(); diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index 80460f46..69991f86 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -38,6 +38,7 @@ #define FILE_FLAG_CHECK_INTERVAL_NS (10000ULL * 1000000000ULL) #define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv" #define FILE_LOG_FLAG_PATH FILE_CONFIG_DIR "/log.flag" +#define FILE_UART_FLAG_PATH FILE_CONFIG_DIR "/uart.flag" #define FILE_LOG_FILE_PATH FILE_CONFIG_DIR "/log.txt" namespace fileUtils { @@ -46,6 +47,7 @@ namespace fileUtils { Result Initialize(); bool IsInitialized(); bool IsLogEnabled(); + bool IsUartEnabled(); void InitializeAsync(); void LogLine(const char *format, ...); void WriteContextToCsv(const HocClkContext *context); From aae77e058523d87e291e6b086df1f732b12abfa5 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 16:29:19 -0400 Subject: [PATCH 014/205] more timings --- .../loader/source/oc/mtc_timing_value.hpp | 10 +++++++++ .../pcv/erista/calculate_timings_erista.cpp | 15 ++++++++++++- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 21 ++++++++----------- .../pcv/mariko/calculate_timings_mariko.cpp | 4 ++-- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 173f21b7..29d79ab9 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -94,6 +94,16 @@ namespace ams::ldr::hoc { inline u32 tWTPDEN; inline u32 tW2R; + inline u32 rdv; + inline u32 qpop; + inline u32 quse_width; + inline u32 quse; + inline u32 einput_duration; + inline u32 einput; + inline u32 qrst; + inline u32 ibdly; + inline u32 qsafe; + inline u32 wdv; inline u32 wsv; inline u32 wev; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 70fd9055..ba77b3e1 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -120,12 +120,25 @@ namespace ams::ldr::hoc::pcv::erista { CalculateMrw2(); tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = (2 * WL) + (3 * FLOOR(48.0 / WL)) - 2 + FLOOR((5.6563 / tCK_avg) + 0.2575) - (C.t6_tRTW * 3) + finetRTW; + tR2W = (2 * WL) + (2 * FLOOR(48.0 / WL)) + 4 + FLOOR((5.653 / tCK_avg) + 0.265) - FLOOR(2.0 / tCK_avg) - (C.t6_tRTW * 3) + finetRTW; tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + rdv = RL + FLOOR((5.678 / tCK_avg) + 18.962); + qpop = rdv - 16; + u32 quseSum = RL + FLOOR(5.659 / tCK_avg) + 4; + quse_width = CEIL((5.363 / tCK_avg) + 4.020) - FLOOR(3.100 / tCK_avg); + quse = quseSum - quse_width; + einput_duration = FLOOR(9.998 / tCK_avg) + 5.0 + quse_width; + einput = quse - (FLOOR(9.998 / tCK_avg) + 1); + u32 qrst_duration = FLOOR((1.398 / tCK_avg) + 4.5); + u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); + qrst = PACK_U32(qrst_duration, qrstLow); + ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); + qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); + wdv = WL; wsv = WL - 2; wev = 0xA + (WL - 14); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index d1ea3a9b..e1144184 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -112,13 +112,12 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_pdex2cke, MAX(GET_CYCLE_CEIL(1.75) - 2, 2u)); - WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(1.75)); + WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.5)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); /* Accept imperfection or prepare for suffering. */ - // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) // WRITE_PARAM_ALL_REG(table, emc_einput, einput); // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); @@ -133,17 +132,15 @@ namespace ams::ldr::hoc::pcv::erista { // WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); // WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); // WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); - // WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); - // WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); - // WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); - // WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); - // WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); - // WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); - // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); - // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); + WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); + WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); + WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); + WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); + WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); + WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); + WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); + WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); - // table->dram_timings.rl = RL; - // #endif constexpr double MC_ARB_DIV = 4.0; constexpr u32 MC_ARB_SFA = 2; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index e4ce9a01..d63f5bfb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -173,8 +173,8 @@ namespace ams::ldr::hoc::pcv::mariko { u32 quseSum = RL + FLOOR(5.110 / tCK_avg) + 4; quse_width = CEIL(MAX((4.7980 / tCK_avg) + 4.046, (5.0680 / tCK_avg) + 3.276)) - FLOOR(2.55 / tCK_avg); quse = quseSum - quse_width; - einput_duration = FLOOR(9.994 / tCK_avg) + 5.0 + quse_width; - einput = quse - (FLOOR(9.994 / tCK_avg) + 1); + einput_duration = FLOOR(9.998 / tCK_avg) + 5.0 + quse_width; + einput = quse - (FLOOR(9.998 / tCK_avg) + 1); u32 qrst_duration = FLOOR((1.398 / tCK_avg) + 4.5); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); From 4415749779f9747c60a537d7135edbd017794b68 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 16:34:25 -0400 Subject: [PATCH 015/205] screw ram timings --- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index e1144184..8a3bcb04 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -132,14 +132,14 @@ namespace ams::ldr::hoc::pcv::erista { // WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); // WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); // WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); - WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); - WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); - WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); - WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); - WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); - WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); - WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); - WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); + // WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); + // WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); + // WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); + // WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); + // WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); + // WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); + // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); + // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); constexpr double MC_ARB_DIV = 4.0; From f25f6a85dbae16081a090f507a44439a253123c7 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 16:42:49 -0400 Subject: [PATCH 016/205] fix w2r --- .../loader/source/oc/pcv/erista/calculate_timings_erista.cpp | 2 +- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index ba77b3e1..34ca1ae3 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -124,7 +124,7 @@ namespace ams::ldr::hoc::pcv::erista { tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + tW2R = FLOOR(MAX((5.087 / tCK_avg) + 1.030, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; rdv = RL + FLOOR((5.678 / tCK_avg) + 18.962); qpop = rdv - 16; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index d63f5bfb..4ad8e3a0 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -182,7 +182,7 @@ namespace ams::ldr::hoc::pcv::mariko { qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + tW2R = FLOOR(MAX((5.087 / tCK_avg) + 1.030, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; tWTM = CEIL(WL + ((7.386 / tCK_avg) + 9.150)); tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; From 4582e07d396c34dff0eaa29edef84ce4cc87a261 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 16:52:45 -0400 Subject: [PATCH 017/205] Update calculate_timings_mariko.cpp --- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 4ad8e3a0..c1b3825e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -164,7 +164,7 @@ namespace ams::ldr::hoc::pcv::mariko { tRPab = tRPpb + 3; tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.036 / tCK_avg) + 0.418) - FLOOR((1.476 / tCK_avg) + 0.05) - (tRTW * 3) + finetRTW; + tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.036 / tCK_avg) + 0.418) - FLOOR((1.5 / tCK_avg) + 0.002) - (tRTW * 3) + finetRTW; tRTM = FLOOR((10.0 + RL) + (3.496 / tCK_avg)) + FLOOR(7.430 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); From 8476969576be51acf82686a19d784d3bedc983e2 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 30 Jul 2026 18:22:47 -0400 Subject: [PATCH 018/205] revert timings more recalculation must be done --- .../loader/source/oc/mtc_timing_value.hpp | 12 +----- .../pcv/erista/calculate_timings_erista.cpp | 23 +++-------- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 11 +++-- .../pcv/mariko/calculate_timings_mariko.cpp | 41 +++++++++---------- .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 23 +++++------ .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 2 - .../source/oc/pcv/mariko/timing_tables.cpp | 13 +----- .../source/oc/pcv/mariko/timing_tables.hpp | 2 +- 8 files changed, 45 insertions(+), 82 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 29d79ab9..7b23d587 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -94,16 +94,6 @@ namespace ams::ldr::hoc { inline u32 tWTPDEN; inline u32 tW2R; - inline u32 rdv; - inline u32 qpop; - inline u32 quse_width; - inline u32 quse; - inline u32 einput_duration; - inline u32 einput; - inline u32 qrst; - inline u32 ibdly; - inline u32 qsafe; - inline u32 wdv; inline u32 wsv; inline u32 wev; @@ -123,7 +113,7 @@ namespace ams::ldr::hoc { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRAS_values = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 }; - const std::array tRRD_values = { 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; + const std::array tRRD_values = { /*10.0,*/ 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; /* 10.0 is used for <2133mhz; do we care? 8gb uses 7.5 tRRD on >=1331. */ const std::array tRFC_values = { 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40 }; const std::array tWTR_values = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; const std::array tREFpb_values = { 3900, 5850, 7800, 11700, 15600, 99999 }; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 34ca1ae3..fc6ae8f8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -120,24 +120,11 @@ namespace ams::ldr::hoc::pcv::erista { CalculateMrw2(); tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = (2 * WL) + (2 * FLOOR(48.0 / WL)) + 4 + FLOOR((5.653 / tCK_avg) + 0.265) - FLOOR(2.0 / tCK_avg) - (C.t6_tRTW * 3) + finetRTW; + tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.087 / tCK_avg) + 1.030, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; - - rdv = RL + FLOOR((5.678 / tCK_avg) + 18.962); - qpop = rdv - 16; - u32 quseSum = RL + FLOOR(5.659 / tCK_avg) + 4; - quse_width = CEIL((5.363 / tCK_avg) + 4.020) - FLOOR(3.100 / tCK_avg); - quse = quseSum - quse_width; - einput_duration = FLOOR(9.998 / tCK_avg) + 5.0 + quse_width; - einput = quse - (FLOOR(9.998 / tCK_avg) + 1); - u32 qrst_duration = FLOOR((1.398 / tCK_avg) + 4.5); - u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); - qrst = PACK_U32(qrst_duration, qrstLow); - ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); - qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); + tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; wdv = WL; wsv = WL - 2; @@ -147,8 +134,8 @@ namespace ams::ldr::hoc::pcv::erista { u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - pdex2rw = CEIL((7.5 / tCK_avg) + 0.998) + FLOOR(1.75 / tCK_avg) + FLOOR(1.0 / tCK_avg); - tCLKSTOP = FLOOR(MIN(8.4996 / tCK_avg, 23.0)) + 7.0 + MIN(CEIL(1.75 / tCK_avg) - 3.0, 1.0); + pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); + tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; const double tMMRI = tRCD + (tCK_avg * 3); pdex2mrr = tMMRI + 10; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index 8a3bcb04..6b2d4321 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -94,7 +94,7 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW)); WRITE_PARAM_ALL_REG(table, emc_trpab, MIN(GET_CYCLE_CEIL(tRPab), static_cast(0x3F))); WRITE_PARAM_ALL_REG(table, emc_tckesr, GET_CYCLE_CEIL(tSR)); - WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(tXP) + MIN(GET_CYCLE_CEIL(1.75) - 2, 2u)); + WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(7.425) + 2); WRITE_PARAM_ALL_REG(table, emc_tpd, GET_CYCLE_CEIL(tXP)); WRITE_PARAM_ALL_REG(table, emc_tclkstop, tCLKSTOP); WRITE_PARAM_ALL_REG(table, emc_r2p, tR2P); @@ -109,15 +109,16 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_dyn_self_ref_control, dyn_self_ref_control); WRITE_PARAM_ALL_REG(table, emc_pdex2wr, pdex2rw); WRITE_PARAM_ALL_REG(table, emc_pdex2rd, pdex2rw); - WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.75)); + WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); - WRITE_PARAM_ALL_REG(table, emc_pdex2cke, MAX(GET_CYCLE_CEIL(1.75) - 2, 2u)); + WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.05)); WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); - WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.5)); + WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); /* Accept imperfection or prepare for suffering. */ + // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) // WRITE_PARAM_ALL_REG(table, emc_einput, einput); // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); @@ -141,6 +142,8 @@ namespace ams::ldr::hoc::pcv::erista { // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); + // table->dram_timings.rl = RL; + // #endif constexpr double MC_ARB_DIV = 4.0; constexpr u32 MC_ARB_SFA = 2; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index c1b3825e..fab24dbf 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -15,19 +15,18 @@ */ #include -#include "../pcv.hpp" #include "../../mtc_timing_value.hpp" #include "timing_tables.hpp" namespace ams::ldr::hoc::pcv::mariko { - void GetRext(u32 freq) { - if (auto r = FindRext(freq)) { + void GetRext() { + if (auto r = FindRext()) { rext = r->rext; return; } - /* Fallback */ + /* > 3200 */ rext = 0x1E; } @@ -47,10 +46,9 @@ namespace ams::ldr::hoc::pcv::mariko { } void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ + if (freq > 1600'000 && freq <= 1862'400) { /* 1866tRWL */ latency += latencyStep * 2; } else { /* 2133tRWL */ - // Note: JEDEC/Datasheet mandates 2133 for >1866, even if <2133 latency += latencyStep * 3; } } @@ -132,7 +130,7 @@ namespace ams::ldr::hoc::pcv::mariko { HandleLatency(freq); - GetRext(freq); + GetRext(); /* At 1333WL, for some reason (incorrect ram timing config in mtc table?), tRP causes crashes at high reductions - 2 seems to be the most common limit. */ /* This is a lazy workaround until I find the issue... */ @@ -153,7 +151,7 @@ namespace ams::ldr::hoc::pcv::mariko { u32 tREFI = lowFreq ? C.low_t8_tREFI : C.t8_tREFI; refresh_raw = 0xFFFF; if (tREFI != 6) { - refresh_raw = ROUND(tREFpb_values[tREFI] / tCK_avg) - 0x40; + refresh_raw = CEIL(tREFpb_values[tREFI] / tCK_avg) - 0x40; refresh_raw = MIN(refresh_raw, static_cast(0xFFFF)); } @@ -164,26 +162,25 @@ namespace ams::ldr::hoc::pcv::mariko { tRPab = tRPpb + 3; tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = RL + 2 * (FLOOR(48.0 / WL) - 2) + CEIL((5.036 / tCK_avg) + 0.418) - FLOOR((1.5 / tCK_avg) + 0.002) - (tRTW * 3) + finetRTW; - tRTM = FLOOR((10.0 + RL) + (3.496 / tCK_avg)) + FLOOR(7.430 / tCK_avg); + tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (tRTW * 3) + finetRTW; + tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); - rdv = RL + FLOOR((5.109 / tCK_avg) + 17.003); + rdv = RL + FLOOR((5.105 / tCK_avg) + 17.017); qpop = rdv - 14; - u32 quseSum = RL + FLOOR(5.110 / tCK_avg) + 4; - quse_width = CEIL(MAX((4.7980 / tCK_avg) + 4.046, (5.0680 / tCK_avg) + 3.276)) - FLOOR(2.55 / tCK_avg); - quse = quseSum - quse_width; - einput_duration = FLOOR(9.998 / tCK_avg) + 5.0 + quse_width; - einput = quse - (FLOOR(9.998 / tCK_avg) + 1); - u32 qrst_duration = FLOOR((1.398 / tCK_avg) + 4.5); + quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); + quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); + einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; + einput = quse - CEIL(9.928 / tCK_avg); + u32 qrst_duration = FLOOR(8.399 - tCK_avg); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.800 / tCK_avg) + MAX(RL + (2.550 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.087 / tCK_avg) + 1.030, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; - tWTM = CEIL(WL + ((7.386 / tCK_avg) + 9.150)); + tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + tWTM = CEIL(WL + ((7.570 / tCK_avg) + 8.753)); tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; wdv = WL; @@ -194,9 +191,9 @@ namespace ams::ldr::hoc::pcv::mariko { u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - pdex2rw = CEIL((7.5 / tCK_avg) + 0.998) + FLOOR(1.75 / tCK_avg) + FLOOR(1.0 / tCK_avg); + pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); - tCLKSTOP = FLOOR(MIN(8.4996 / tCK_avg, 23.0)) + 7.0 + MIN(CEIL(1.75 / tCK_avg) - 3.0, 1.0); + tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; u32 tMMRI = tRCD + (tCK_avg * 3); pdex2mrr = tMMRI + 10; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index dc1b3402..7dacbdbe 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -56,30 +56,27 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_cfg, 0xF3200000); } + u32 trefbw = refresh_raw + 0x40; + trefbw = MIN(trefbw, static_cast(0x3FFF)); + const u32 dyn_self_ref_control = (static_cast(7605.0 / tCK_avg) + 260) | (table->burst_regs.emc_dyn_self_ref_control & 0xffff0000); CalculateTimings(tCK_avg, table->rate_khz); - u32 trefbw = refresh_raw + 0x40; - trefbw = MIN(trefbw, static_cast(0x3FFF)); - - const u32 ras_cyc = MIN(GET_CYCLE_CEIL(tRAS), static_cast(0x7F)); - const u32 rp_cyc = GET_CYCLE_CEIL(tRPpb); - WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD)); WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD)); - WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), ras_cyc + rp_cyc)); - WRITE_PARAM_ALL_REG(table, emc_ras, ras_cyc); + WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast(0xB9))); + WRITE_PARAM_ALL_REG(table, emc_ras, MIN(GET_CYCLE_CEIL(tRAS), static_cast(0x7F))); WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD)); WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb)); WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab)); - WRITE_PARAM_ALL_REG(table, emc_rp, rp_cyc); + WRITE_PARAM_ALL_REG(table, emc_rp, GET_CYCLE_CEIL(tRPpb)); WRITE_PARAM_ALL_REG(table, emc_txsr, MIN(GET_CYCLE_CEIL(tXSR), static_cast(0x3fe))); WRITE_PARAM_ALL_REG(table, emc_txsrdll, MIN(GET_CYCLE_CEIL(tXSR), static_cast(0x3fe))); WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW)); WRITE_PARAM_ALL_REG(table, emc_trpab, MIN(GET_CYCLE_CEIL(tRPab), static_cast(0x3F))); WRITE_PARAM_ALL_REG(table, emc_tckesr, GET_CYCLE_CEIL(tSR)); - WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(tXP) + MIN(GET_CYCLE_CEIL(1.75) - 2, 2u)); + WRITE_PARAM_ALL_REG(table, emc_tcke, GET_CYCLE_CEIL(7.425) + 2); WRITE_PARAM_ALL_REG(table, emc_tpd, GET_CYCLE_CEIL(tXP)); WRITE_PARAM_ALL_REG(table, emc_tclkstop, tCLKSTOP); WRITE_PARAM_ALL_REG(table, emc_r2p, tR2P); @@ -98,11 +95,11 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_dyn_self_ref_control, dyn_self_ref_control); WRITE_PARAM_ALL_REG(table, emc_pdex2wr, pdex2rw); WRITE_PARAM_ALL_REG(table, emc_pdex2rd, pdex2rw); - WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.75)); + WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); - WRITE_PARAM_ALL_REG(table, emc_pdex2cke, MAX(GET_CYCLE_CEIL(1.75) - 2, 2u)); + WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.05)); WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); - WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.5)); + WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); WRITE_PARAM_ALL_REG(table, emc_einput, einput); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index 4cafea52..99531813 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -26,8 +26,6 @@ namespace ams::ldr::hoc::pcv::mariko { - DramId GetDramId(); - void MtcGenerateFreqTables(); Result MemFreqMtcTable(u32 *ptr); Result MemFreqDvbTable(u32 *ptr); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp index 039f8799..ecb4d47f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp @@ -20,11 +20,6 @@ namespace ams::ldr::hoc::pcv::mariko { const ReplacePatch g_rext_table[] = { - {1'633'000, 0x17}, {1'666'000, 0x18}, {1'700'000, 0x18}, - {1'733'000, 0x18}, {1'766'000, 0x18}, {1'800'000, 0x1A}, - {1'833'000, 0x1A}, {1'866'000, 0x1A}, {1'900'000, 0x19}, - {1'933'000, 0x19}, {1'966'000, 0x19}, {2'000'000, 0x19}, - {2'033'000, 0x19}, {2'066'000, 0x19}, {2'100'000, 0x1A}, {2'133'000, 0x1A}, {2'166'000, 0x19}, {2'200'000, 0x19}, {2'233'000, 0x19}, {2'266'000, 0x1A}, {2'300'000, 0x1B}, {2'333'000, 0x1B}, {2'366'000, 0x1B}, {2'400'000, 0x1B}, @@ -36,17 +31,13 @@ namespace ams::ldr::hoc::pcv::mariko { {2'933'000, 0x1C}, {2'966'000, 0x1D}, {3'000'000, 0x1D}, {3'033'000, 0x1D}, {3'066'000, 0x1D}, {3'100'000, 0x1D}, {3'133'000, 0x1D}, {3'166'000, 0x1C}, {3'200'000, 0x1C}, - {3'233'000, 0x1E}, {3'266'000, 0x1F}, {3'300'000, 0x1E}, - {3'333'000, 0x1F}, {3'366'000, 0x1F}, {3'400'000, 0x1F}, - {3'433'000, 0x1F}, {3'466'000, 0x1F}, {3'500'000, 0x1E}, }; - const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]); - const ReplacePatch *FindRext(u32 rate_khz) { + const ReplacePatch *FindRext() { for (u32 i = 0; i < g_rext_table_size; i++) { - if (g_rext_table[i].freq >= rate_khz) { + if (g_rext_table[i].freq >= C.marikoEmcMaxClock) { return &g_rext_table[i]; } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp index 0b84b2f9..d682000e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp @@ -26,6 +26,6 @@ namespace ams::ldr::hoc::pcv::mariko { extern const ReplacePatch g_rext_table[]; extern const u32 g_rext_table_size; - const ReplacePatch *FindRext(u32 rate_khz); + const ReplacePatch *FindRext(); } From 55552b67ef462080b705472cc4369530ab8b4d4d Mon Sep 17 00:00:00 2001 From: XiaoYee Moon Date: Mon, 3 Aug 2026 23:13:59 +0800 Subject: [PATCH 019/205] update zh-cn translation --- Source/hoc-clk/overlay/lang/zh-cn.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/hoc-clk/overlay/lang/zh-cn.json b/Source/hoc-clk/overlay/lang/zh-cn.json index 225aaeff..538c4178 100644 --- a/Source/hoc-clk/overlay/lang/zh-cn.json +++ b/Source/hoc-clk/overlay/lang/zh-cn.json @@ -35,6 +35,8 @@ "Unsafe Max": "危险最大值", "Absolute Max": "绝对最大值", "Handheld Safe Max": "掌机安全最大值", + "HOS Default": "原厂默认", + "HOC Default": "HOC默认", "General Settings": "通用设置", "Governor Settings": "调频器设置", @@ -181,7 +183,7 @@ "96.6% limit": "使用率最高96.6%", "99.7% limit": "使用率最高99.7%", " Setting GPU Clocks past": "警告:未进行合理降压的前提下,", - "1305MHz without a proper undervolt": "将GPU频率拉到1228MHz以上(1305MHz),", + "1305MHz without a proper undervolt": "将GPU频率拉到1305MHz以上", "can cause degradation or damage": "会加速硬件老化损耗,", "to your console!": "甚至对主机造成永久性硬件损坏!", "1075MHz without UV, 1152MHz on SLT": "无降压1075MHz,SLT下1152MHz", From 2375210feea306e60dbdb60d68ff9d149f5440fc Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 3 Aug 2026 20:37:10 +0200 Subject: [PATCH 020/205] ldr: fix rext --- .../source/oc/pcv/mariko/calculate_timings_mariko.cpp | 10 ++++------ .../loader/source/oc/pcv/mariko/pcv_mariko.cpp | 3 +-- .../loader/source/oc/pcv/mariko/timing_tables.cpp | 4 ++-- .../loader/source/oc/pcv/mariko/timing_tables.hpp | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index fab24dbf..c6efaa0f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -20,8 +20,8 @@ namespace ams::ldr::hoc::pcv::mariko { - void GetRext() { - if (auto r = FindRext()) { + void GetRext(u32 freq) { + if (auto r = FindRext(freq)) { rext = r->rext; return; } @@ -46,7 +46,7 @@ namespace ams::ldr::hoc::pcv::mariko { } void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1862'400) { /* 1866tRWL */ + if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ latency += latencyStep * 2; } else { /* 2133tRWL */ latency += latencyStep * 3; @@ -130,10 +130,8 @@ namespace ams::ldr::hoc::pcv::mariko { HandleLatency(freq); - GetRext(); + GetRext(freq); - /* At 1333WL, for some reason (incorrect ram timing config in mtc table?), tRP causes crashes at high reductions - 2 seems to be the most common limit. */ - /* This is a lazy workaround until I find the issue... */ const bool lowFreq = freq < C.timingEmcTbreak; tRCD = tRCD_values[lowFreq ? C.low_t1_tRCD : C.t1_tRCD]; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index c2644620..331d988d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -315,6 +315,7 @@ namespace ams::ldr::hoc::pcv::mariko { cmd.val = val; Result res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); i2csessionClose(&_session); + return res; } @@ -350,8 +351,6 @@ namespace ams::ldr::hoc::pcv::mariko { Result resultI2C = I2cSet_U8(I2cDevice_Max77812_2, 0x25, (emc_uv - uv_min) / uv_step); i2cExit(); - R_SUCCEED(); - return resultI2C; } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp index ecb4d47f..117fa995 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp @@ -35,9 +35,9 @@ namespace ams::ldr::hoc::pcv::mariko { const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]); - const ReplacePatch *FindRext() { + const ReplacePatch *FindRext(u32 freq) { for (u32 i = 0; i < g_rext_table_size; i++) { - if (g_rext_table[i].freq >= C.marikoEmcMaxClock) { + if (g_rext_table[i].freq >= freq) { return &g_rext_table[i]; } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp index d682000e..1fe42bd9 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp @@ -26,6 +26,6 @@ namespace ams::ldr::hoc::pcv::mariko { extern const ReplacePatch g_rext_table[]; extern const u32 g_rext_table_size; - const ReplacePatch *FindRext(); + const ReplacePatch *FindRext(u32 freq); } From bfe8d3a9135da22c6418ec16fdb597e41fa08988 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 3 Aug 2026 20:53:42 +0200 Subject: [PATCH 021/205] ldr: major refactor part 2 --- .../source/oc/pcv/mariko/pcv_mariko.hpp | 239 ------------------ .../source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 1 + .../source/oc/pcv/mariko/pcv_mariko_cpu.hpp | 37 +++ .../source/oc/pcv/mariko/pcv_mariko_gpu.cpp | 1 + .../source/oc/pcv/mariko/pcv_mariko_gpu.hpp | 48 ++++ .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 1 + .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 154 +++++++++++ .../stratosphere/loader/source/oc/pcv/pcv.hpp | 3 + 8 files changed, 245 insertions(+), 239 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index 33b7ed09..00bda587 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -28,90 +28,6 @@ namespace ams::ldr::hoc::pcv::mariko { extern u32 *nsoStart; - constexpr cvb_entry_t CpuCvbTableDefault[] = { - { 204000, { 721589, -12695, 27 }, { } }, - { 306000, { 747134, -14195, 27 }, { } }, - { 408000, { 776324, -15705, 27 }, { } }, - { 510000, { 809160, -17205, 27 }, { } }, - { 612000, { 845641, -18715, 27 }, { } }, - { 714000, { 885768, -20215, 27 }, { } }, - { 816000, { 929540, -21725, 27 }, { } }, - { 918000, { 976958, -23225, 27 }, { } }, - { 1020000, { 1028021, -24725, 27 }, { 1120000 } }, - { 1122000, { 1082730, -26235, 27 }, { 1120000 } }, - { 1224000, { 1141084, -27735, 27 }, { 1120000 } }, - { 1326000, { 1203084, -29245, 27 }, { 1120000 } }, - { 1428000, { 1268729, -30745, 27 }, { 1120000 } }, - { 1581000, { 1374032, -33005, 27 }, { 1120000 } }, - { 1683000, { 1448791, -34505, 27 }, { 1120000 } }, - { 1785000, { 1527196, -36015, 27 }, { 1120000 } }, - { 1887000, { 1609246, -37515, 27 }, { 1120000 } }, - { 1963500, { 1675751, -38635, 27 }, { 1120000 } }, - { }, - }; - - constexpr u32 CpuClkOfficial = 1963'500; - constexpr u32 CpuVoltOfficial = 1120; - constexpr u32 CpuHighVminOfficial = 850; - constexpr u32 CpuVminOfficial = 620; - constexpr u32 CpuTune0Low = 0xFFCF; - - static const u32 cpuVoltagePatchValues[] = { 850, 38, 1120, 1000, 100, 1000, 0 }; - static const s32 cpuVoltagePatchOffsets[] = { -2, -1, 5, 6, 7, 8, 9 }; - static_assert(sizeof(cpuVoltagePatchValues) == sizeof(cpuVoltagePatchOffsets), "Invalid cpuVoltagePatch size"); - - static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 }; - - static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, }; - - constexpr cvb_entry_t GpuCvbTableDefault[] = { - // GPUB01_NA_CVB_TABLE - { 76800, {}, { 610000, } }, - { 153600, {}, { 610000, } }, - { 230400, {}, { 610000, } }, - { 307200, {}, { 610000, } }, - { 384000, {}, { 610000, } }, - { 460800, {}, { 610000, } }, - { 537600, {}, { 801688, -10900, -163, 298, -10599, 162, } }, - { 614400, {}, { 824214, -5743, -452, 238, -6325, 81, } }, - { 691200, {}, { 848830, -3903, -552, 119, -4030, -2, } }, - { 768000, {}, { 891575, -4409, -584, 0, -2849, 39, } }, - { 844800, {}, { 940071, -5367, -602, -60, -63, -93, } }, - { 921600, {}, { 986765, -6637, -614, -179, 1905, -13, } }, - { 998400, {}, { 1098475, -13529, -497, -179, 3626, 9, } }, - { 1075200, {}, { 1163644, -12688, -648, 0, 1077, 40, } }, - { 1152000, {}, { 1204812, -9908, -830, 0, 1469, 110, } }, - { 1228800, {}, { 1277303, -11675, -859, 0, 3722, 313, } }, - { 1267200, {}, { 1335531, -12567, -867, 0, 3681, 559, } }, - { }, - }; - - constexpr u32 GpuClkPllMax = 1300'000'000; - constexpr u32 GpuClkPllLimit = 2'600'000; - constexpr u32 GpuVminOfficial = 610; - - static const u32 gpuDVFSPattern[] = { 1050, 1000, 100, 1000, 10, }; - static const u32 gpuVoltThermalPattern[] = { 800, 1120, 0, 610, 1120, 20000, 610, 1120, 30000, 610, 1120, 50000, 610, 1120, 70000, 610, 1120, 90000, }; - static_assert(sizeof(gpuVoltThermalPattern) == 72, "Invalid gpuVoltThermalPattern"); - - /* GPU Max Clock asm Pattern: - * - * MOV W11, #0x1000 MOV (wide immediate) 0x1000 0xB (11) - * sf | opc | | hw | imm16 | Rd - * #31 |30 29|28 27 26 25 24 23|22 21|20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 |4 3 2 1 0 - * 0 | 1 0 | 1 0 0 1 0 1| 0 0| 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 |0 1 0 1 1 - * - * MOVK W11, #0xE, LSL#16 16 0xE 0xB (11) - * sf | opc | | hw | imm16 | Rd - * #31 |30 29|28 27 26 25 24 23|22 21|20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 |4 3 2 1 0 - * 0 | 1 1 | 1 0 0 1 0 1| 0 1| 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 |0 1 0 1 1 - */ - inline constexpr u32 GpuAsmPattern[] = { 0x52820000, 0x72A001C0 }; - - inline bool GpuMaxClockPatternFn(u32 *ptr32) { - return asm_compare_no_rd(*ptr32, GpuAsmPattern[0]); - } - struct DvbEntry { u64 freq; u32 volt[4] = {}; @@ -147,160 +63,6 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 SocVoltLimitMaxDefaultIndex = 17; static const u32 socVoltLimitArray[DvfsTableEntryCount] = { 637, 650, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1025, 1050, }; - constexpr u32 EmcListDefault[] = { 204000, 1331200, 1600000, }; - constexpr u32 EmcListSizeDefault = std::size(EmcListDefault); - constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1; - - constexpr u32 EmcClkOSAlt = 1331'200; - constexpr u32 EmcClkPllmLimit = 2133'000'000; - constexpr u32 EmcVddqDefault = 600'000; - constexpr u32 MemVdd2Default = 1100'000; - - constexpr u32 MTC_TABLE_REV = 3; - constexpr u32 MtcTableCountDefault = 3; - - constexpr size_t MtcFullTableSize = sizeof(MarikoMtcTable) * MtcTableCountDefault; - constexpr u32 MtcFullTableCount = 17; - - /* These dramids were copied from Hekate -- see /bdk/mem/sdram.h */ - enum DramId : u64 { - HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE = 3, - AULA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE = 5, - IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE = 6, - - IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 8, - IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 9, - IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 10, - IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE = 11, - - HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 12, - HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 13, - HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 14, - HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE = 15, - - IOWA_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 17, - IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 18, - HOAG_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 19, - - IOWA_4GB_SAMSUNG_K4U6E3S4AB_MGCL = 20, - HOAG_4GB_SAMSUNG_K4U6E3S4AB_MGCL = 21, - AULA_4GB_SAMSUNG_K4U6E3S4AB_MGCL = 22, - - HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 23, - AULA_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 24, - - IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTF = 25, - HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTF = 26, - AULA_4GB_MICRON_MT53E512M32D2NP_046_WTF = 27, - - AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 28, - - IOWA_4GB_HYNIX_H54G46CYRBX267 = 29, - HOAG_4GB_HYNIX_H54G46CYRBX267 = 30, - AULA_4GB_HYNIX_H54G46CYRBX267 = 31, - - IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB = 32, - HOAG_4GB_MICRON_MT53E512M32D1NP_046_WTB = 33, - AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB = 34, - }; - - enum MtcTableIndex { - T210b0SdevEmcDvfsTableS4gb01 = 0, /* (Unused) Samsung 4Gb */ - T210b0SdevEmcDvfsTableS4gb03 = 1, /* Samsung AM-MGCJ 4Gb */ - T210b0SdevEmcDvfsTableS8gb03 = 2, /* (Unused) Samsung 4Gb */ - T210b0SdevEmcDvfsTableH4gb03 = 3, /* Hynix NME 4Gb */ - T210b0SdevEmcDvfsTableM4gb03 = 4, /* Micron WT:F 4Gb */ - T210b0SdevEmcDvfsTableS4gbY01 = 5, /* (Unused) Samsung 4Gb */ - T210b0SdevEmcDvfsTableS1y4gbY01 = 6, /* (Unused) Samsung 4Gb */ - T210b0SdevEmcDvfsTableS1y8gbY01 = 7, /* (Unused) Samsung 4Gb */ - T210b0SdevEmcDvfsTableS1y4gbX03 = 8, /* Samsung AA-MGCL 4Gb */ - T210b0SdevEmcDvfsTableS1y8gbX03 = 9, /* Samsung AA-MGCL 8Gb */ - T210b0SdevEmcDvfsTableS1y4gb01 = 10, /* (Unused) Samsung 4Gb */ - T210b0SdevEmcDvfsTableM1y4gb01 = 11, /* Micron WT:E 4Gb */ - T210b0SdevEmcDvfsTableH1y4gb01 = 12, /* Hynix NEE 4Gb */ - T210b0SdevEmcDvfsTableS1y8gb04 = 13, /* Samsung AM-MGCJ 8Gb */ - T210b0SdevEmcDvfsTableS1z4gb01 = 14, /* Samsung AB-MGCL 4Gb */ - T210b0SdevEmcDvfsTableH1a4gb01 = 15, /* Hynix x267 4Gb */ - T210b0SdevEmcDvfsTableM1a4gb01 = 16, /* Micron WT:B 8Gb */ - MtcTableIndex_Invalid = 17, - }; - - struct MtcDramIndex { - DramId dramId; - MtcTableIndex index; - }; - - const inline MtcDramIndex mtcIndexTable[] = { - { HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE, T210b0SdevEmcDvfsTableH1y4gb01, }, - { AULA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE, T210b0SdevEmcDvfsTableH1y4gb01, }, - { IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE, T210b0SdevEmcDvfsTableH1y4gb01, }, - { IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ, T210b0SdevEmcDvfsTableS4gb03, }, - { IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ, T210b0SdevEmcDvfsTableS1y8gb04, }, - { IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME, T210b0SdevEmcDvfsTableH4gb03, }, - { IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE, T210b0SdevEmcDvfsTableM1y4gb01, }, - { HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ, T210b0SdevEmcDvfsTableS4gb03, }, - { HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ, T210b0SdevEmcDvfsTableS1y8gb04, }, - { HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME, T210b0SdevEmcDvfsTableH4gb03, }, - { HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE, T210b0SdevEmcDvfsTableM1y4gb01, }, - { IOWA_4GB_SAMSUNG_K4U6E3S4AA_MGCL, T210b0SdevEmcDvfsTableS1y4gbX03, }, - { IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL, T210b0SdevEmcDvfsTableS1y8gbX03, }, - { HOAG_4GB_SAMSUNG_K4U6E3S4AA_MGCL, T210b0SdevEmcDvfsTableS1y4gbX03, }, - { IOWA_4GB_SAMSUNG_K4U6E3S4AB_MGCL, T210b0SdevEmcDvfsTableS1z4gb01, }, - { HOAG_4GB_SAMSUNG_K4U6E3S4AB_MGCL, T210b0SdevEmcDvfsTableS1y8gb04, }, - { AULA_4GB_SAMSUNG_K4U6E3S4AB_MGCL, T210b0SdevEmcDvfsTableS1y8gb04, }, - { HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL, T210b0SdevEmcDvfsTableS1y8gbX03, }, - { AULA_4GB_SAMSUNG_K4U6E3S4AA_MGCL, T210b0SdevEmcDvfsTableS1y4gbX03, }, - { IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTF, T210b0SdevEmcDvfsTableM4gb03, }, - { HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTF, T210b0SdevEmcDvfsTableM4gb03, }, - { AULA_4GB_MICRON_MT53E512M32D2NP_046_WTF, T210b0SdevEmcDvfsTableM4gb03, }, - { AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL, T210b0SdevEmcDvfsTableS1y8gbX03, }, - { IOWA_4GB_HYNIX_H54G46CYRBX267, T210b0SdevEmcDvfsTableH1a4gb01, }, - { HOAG_4GB_HYNIX_H54G46CYRBX267, T210b0SdevEmcDvfsTableH1a4gb01, }, - { AULA_4GB_HYNIX_H54G46CYRBX267, T210b0SdevEmcDvfsTableH1a4gb01, }, - { IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB, T210b0SdevEmcDvfsTableM1a4gb01, }, - { HOAG_4GB_MICRON_MT53E512M32D1NP_046_WTB, T210b0SdevEmcDvfsTableM1a4gb01, }, - { AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB, T210b0SdevEmcDvfsTableM1a4gb01, }, - }; - - /* - 710006abfc 40 01 1f d6 br x10 - */ - - /* - 710006ac28 a0 03 00 90 adrp x0,0x71000de000 - 710006ac2c 00 80 16 91 add x0=>SdevEmcDvfsTableS4gb01,x0,#0x5a0 - */ - - /* Br */ - /* - | Z | OP | Fixed | A | M | RN | RM - 31 30 29 28 27 26 25 | 24 23 | 22 | 21 20 19 18 17 16 15 14 13 12 |11 | 10 | 9 8 7 6 5 | 4 3 2 1 0 - 1 1 0 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 Rn 0 0 0 0 0 - Z op A M Rm - */ - - /* Adrp */ - /* - OP | ImmLow | | ImmHigh | RD - 31 | 30 29 | 28 27 26 25 24 | 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 | 4 3 2 1 0 - */ - - /* ADD (immediate) */ - /* - SF | OP | S | Fixed value | Sh | Imm12 | RN | RD - 31 | 30 | 29 | 28 27 26 25 24 23 | 22 | 21 20 19 18 17 16 15 14 13 12 11 10 | 9 8 7 6 5 | 4 3 2 1 0 - */ - - constexpr u32 MtcBrAsm = 0xD61F0140; - constexpr u32 MtcMovAsm = 0x52800068; - constexpr u32 MtcAdrpAsm = 0x900003A0; - constexpr u32 MtcAddAsm = 0x91168000; - - ALWAYS_INLINE bool MemMtcGetGetTablePatternFn(u32 *ptr) { - /* This builds an address that gets returned, so the register must be x0 by convention. */ - return AsmCompareAddNoImm12(*ptr, MtcAddAsm); - } - constexpr u32 EmcCountCmpAsm = 0x7100851F; /* cmp w?,#0x21 (subs wzr,w?,#0x21) */ /* @@ -425,7 +187,6 @@ namespace ams::ldr::hoc::pcv::mariko { return true; } - void Patch(uintptr_t mapped_nso, size_t nso_size); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 01400c9d..4bc8cb93 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -21,6 +21,7 @@ */ #include "../pcv.hpp" +#include "pcv_mariko_cpu.hpp" namespace ams::ldr::hoc::pcv::mariko { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp index f6a570d4..d572857e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp @@ -26,6 +26,43 @@ namespace ams::ldr::hoc::pcv::mariko { + constexpr cvb_entry_t CpuCvbTableDefault[] = { + { 204000, { 721589, -12695, 27 }, { } }, + { 306000, { 747134, -14195, 27 }, { } }, + { 408000, { 776324, -15705, 27 }, { } }, + { 510000, { 809160, -17205, 27 }, { } }, + { 612000, { 845641, -18715, 27 }, { } }, + { 714000, { 885768, -20215, 27 }, { } }, + { 816000, { 929540, -21725, 27 }, { } }, + { 918000, { 976958, -23225, 27 }, { } }, + { 1020000, { 1028021, -24725, 27 }, { 1120000 } }, + { 1122000, { 1082730, -26235, 27 }, { 1120000 } }, + { 1224000, { 1141084, -27735, 27 }, { 1120000 } }, + { 1326000, { 1203084, -29245, 27 }, { 1120000 } }, + { 1428000, { 1268729, -30745, 27 }, { 1120000 } }, + { 1581000, { 1374032, -33005, 27 }, { 1120000 } }, + { 1683000, { 1448791, -34505, 27 }, { 1120000 } }, + { 1785000, { 1527196, -36015, 27 }, { 1120000 } }, + { 1887000, { 1609246, -37515, 27 }, { 1120000 } }, + { 1963500, { 1675751, -38635, 27 }, { 1120000 } }, + { }, + }; + + constexpr u32 CpuClkOfficial = 1963'500; + constexpr u32 CpuVoltOfficial = 1120; + constexpr u32 CpuHighVminOfficial = 850; + constexpr u32 CpuVminOfficial = 620; + constexpr u32 CpuTune0Low = 0xFFCF; + + static const u32 cpuVoltagePatchValues[] = { 850, 38, 1120, 1000, 100, 1000, 0 }; + static const s32 cpuVoltagePatchOffsets[] = { -2, -1, 5, 6, 7, 8, 9 }; + static_assert(sizeof(cpuVoltagePatchValues) == sizeof(cpuVoltagePatchOffsets), "Invalid cpuVoltagePatch size"); + + static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 }; + + static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, }; + + Result CpuFreqVdd(u32 *ptr); Result CpuVoltDVFS(u32 *ptr); Result CpuVoltThermals(u32 *ptr); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp index 5b6c1286..89a68aef 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp @@ -22,6 +22,7 @@ #include "../pcv.hpp" #include "../pcv_asm.hpp" +#include "pcv_mariko_gpu.hpp" namespace ams::ldr::hoc::pcv::mariko { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp index f5e4c33f..a56a5ff2 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp @@ -26,6 +26,54 @@ namespace ams::ldr::hoc::pcv::mariko { + constexpr cvb_entry_t GpuCvbTableDefault[] = { + // GPUB01_NA_CVB_TABLE + { 76800, {}, { 610000, } }, + { 153600, {}, { 610000, } }, + { 230400, {}, { 610000, } }, + { 307200, {}, { 610000, } }, + { 384000, {}, { 610000, } }, + { 460800, {}, { 610000, } }, + { 537600, {}, { 801688, -10900, -163, 298, -10599, 162, } }, + { 614400, {}, { 824214, -5743, -452, 238, -6325, 81, } }, + { 691200, {}, { 848830, -3903, -552, 119, -4030, -2, } }, + { 768000, {}, { 891575, -4409, -584, 0, -2849, 39, } }, + { 844800, {}, { 940071, -5367, -602, -60, -63, -93, } }, + { 921600, {}, { 986765, -6637, -614, -179, 1905, -13, } }, + { 998400, {}, { 1098475, -13529, -497, -179, 3626, 9, } }, + { 1075200, {}, { 1163644, -12688, -648, 0, 1077, 40, } }, + { 1152000, {}, { 1204812, -9908, -830, 0, 1469, 110, } }, + { 1228800, {}, { 1277303, -11675, -859, 0, 3722, 313, } }, + { 1267200, {}, { 1335531, -12567, -867, 0, 3681, 559, } }, + { }, + }; + + constexpr u32 GpuClkPllMax = 1300'000'000; + constexpr u32 GpuClkPllLimit = 2'600'000; + constexpr u32 GpuVminOfficial = 610; + + static const u32 gpuDVFSPattern[] = { 1050, 1000, 100, 1000, 10, }; + static const u32 gpuVoltThermalPattern[] = { 800, 1120, 0, 610, 1120, 20000, 610, 1120, 30000, 610, 1120, 50000, 610, 1120, 70000, 610, 1120, 90000, }; + static_assert(sizeof(gpuVoltThermalPattern) == 72, "Invalid gpuVoltThermalPattern"); + + /* GPU Max Clock asm Pattern: + * + * MOV W11, #0x1000 MOV (wide immediate) 0x1000 0xB (11) + * sf | opc | | hw | imm16 | Rd + * #31 |30 29|28 27 26 25 24 23|22 21|20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 |4 3 2 1 0 + * 0 | 1 0 | 1 0 0 1 0 1| 0 0| 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 |0 1 0 1 1 + * + * MOVK W11, #0xE, LSL#16 16 0xE 0xB (11) + * sf | opc | | hw | imm16 | Rd + * #31 |30 29|28 27 26 25 24 23|22 21|20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 |4 3 2 1 0 + * 0 | 1 1 | 1 0 0 1 0 1| 0 1| 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 |0 1 0 1 1 + */ + inline constexpr u32 GpuAsmPattern[] = { 0x52820000, 0x72A001C0 }; + + inline bool GpuMaxClockPatternFn(u32 *ptr32) { + return asm_compare_no_rd(*ptr32, GpuAsmPattern[0]); + } + Result GpuVoltDVFS(u32 *ptr); Result GpuVoltThermals(u32 *ptr); Result GpuFreqMaxAsm(u32 *ptr32); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 7dacbdbe..bba99ec6 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -23,6 +23,7 @@ #include "../pcv.hpp" #include "../../mtc_timing_value.hpp" #include "calculate_timings_mariko.hpp" +#include "pcv_mariko_mtc.hpp" namespace ams::ldr::hoc::pcv::mariko { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index 99531813..3072b1cf 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -26,6 +26,160 @@ namespace ams::ldr::hoc::pcv::mariko { + constexpr u32 EmcListDefault[] = { 204000, 1331200, 1600000, }; + constexpr u32 EmcListSizeDefault = std::size(EmcListDefault); + constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1; + + constexpr u32 EmcClkOSAlt = 1331'200; + constexpr u32 EmcClkPllmLimit = 2133'000'000; + constexpr u32 EmcVddqDefault = 600'000; + constexpr u32 MemVdd2Default = 1100'000; + + constexpr u32 MTC_TABLE_REV = 3; + constexpr u32 MtcTableCountDefault = 3; + + constexpr size_t MtcFullTableSize = sizeof(MarikoMtcTable) * MtcTableCountDefault; + constexpr u32 MtcFullTableCount = 17; + + /* These dramids were copied from Hekate -- see /bdk/mem/sdram.h */ + enum DramId : u64 { + HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE = 3, + AULA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE = 5, + IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE = 6, + + IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 8, + IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 9, + IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 10, + IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE = 11, + + HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 12, + HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 13, + HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 14, + HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE = 15, + + IOWA_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 17, + IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 18, + HOAG_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 19, + + IOWA_4GB_SAMSUNG_K4U6E3S4AB_MGCL = 20, + HOAG_4GB_SAMSUNG_K4U6E3S4AB_MGCL = 21, + AULA_4GB_SAMSUNG_K4U6E3S4AB_MGCL = 22, + + HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 23, + AULA_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 24, + + IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTF = 25, + HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTF = 26, + AULA_4GB_MICRON_MT53E512M32D2NP_046_WTF = 27, + + AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 28, + + IOWA_4GB_HYNIX_H54G46CYRBX267 = 29, + HOAG_4GB_HYNIX_H54G46CYRBX267 = 30, + AULA_4GB_HYNIX_H54G46CYRBX267 = 31, + + IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB = 32, + HOAG_4GB_MICRON_MT53E512M32D1NP_046_WTB = 33, + AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB = 34, + }; + + enum MtcTableIndex { + T210b0SdevEmcDvfsTableS4gb01 = 0, /* (Unused) Samsung 4Gb */ + T210b0SdevEmcDvfsTableS4gb03 = 1, /* Samsung AM-MGCJ 4Gb */ + T210b0SdevEmcDvfsTableS8gb03 = 2, /* (Unused) Samsung 4Gb */ + T210b0SdevEmcDvfsTableH4gb03 = 3, /* Hynix NME 4Gb */ + T210b0SdevEmcDvfsTableM4gb03 = 4, /* Micron WT:F 4Gb */ + T210b0SdevEmcDvfsTableS4gbY01 = 5, /* (Unused) Samsung 4Gb */ + T210b0SdevEmcDvfsTableS1y4gbY01 = 6, /* (Unused) Samsung 4Gb */ + T210b0SdevEmcDvfsTableS1y8gbY01 = 7, /* (Unused) Samsung 4Gb */ + T210b0SdevEmcDvfsTableS1y4gbX03 = 8, /* Samsung AA-MGCL 4Gb */ + T210b0SdevEmcDvfsTableS1y8gbX03 = 9, /* Samsung AA-MGCL 8Gb */ + T210b0SdevEmcDvfsTableS1y4gb01 = 10, /* (Unused) Samsung 4Gb */ + T210b0SdevEmcDvfsTableM1y4gb01 = 11, /* Micron WT:E 4Gb */ + T210b0SdevEmcDvfsTableH1y4gb01 = 12, /* Hynix NEE 4Gb */ + T210b0SdevEmcDvfsTableS1y8gb04 = 13, /* Samsung AM-MGCJ 8Gb */ + T210b0SdevEmcDvfsTableS1z4gb01 = 14, /* Samsung AB-MGCL 4Gb */ + T210b0SdevEmcDvfsTableH1a4gb01 = 15, /* Hynix x267 4Gb */ + T210b0SdevEmcDvfsTableM1a4gb01 = 16, /* Micron WT:B 8Gb */ + MtcTableIndex_Invalid = 17, + }; + + struct MtcDramIndex { + DramId dramId; + MtcTableIndex index; + }; + + const inline MtcDramIndex mtcIndexTable[] = { + { HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE, T210b0SdevEmcDvfsTableH1y4gb01, }, + { AULA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE, T210b0SdevEmcDvfsTableH1y4gb01, }, + { IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE, T210b0SdevEmcDvfsTableH1y4gb01, }, + { IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ, T210b0SdevEmcDvfsTableS4gb03, }, + { IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ, T210b0SdevEmcDvfsTableS1y8gb04, }, + { IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME, T210b0SdevEmcDvfsTableH4gb03, }, + { IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE, T210b0SdevEmcDvfsTableM1y4gb01, }, + { HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ, T210b0SdevEmcDvfsTableS4gb03, }, + { HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ, T210b0SdevEmcDvfsTableS1y8gb04, }, + { HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME, T210b0SdevEmcDvfsTableH4gb03, }, + { HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE, T210b0SdevEmcDvfsTableM1y4gb01, }, + { IOWA_4GB_SAMSUNG_K4U6E3S4AA_MGCL, T210b0SdevEmcDvfsTableS1y4gbX03, }, + { IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL, T210b0SdevEmcDvfsTableS1y8gbX03, }, + { HOAG_4GB_SAMSUNG_K4U6E3S4AA_MGCL, T210b0SdevEmcDvfsTableS1y4gbX03, }, + { IOWA_4GB_SAMSUNG_K4U6E3S4AB_MGCL, T210b0SdevEmcDvfsTableS1z4gb01, }, + { HOAG_4GB_SAMSUNG_K4U6E3S4AB_MGCL, T210b0SdevEmcDvfsTableS1y8gb04, }, + { AULA_4GB_SAMSUNG_K4U6E3S4AB_MGCL, T210b0SdevEmcDvfsTableS1y8gb04, }, + { HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL, T210b0SdevEmcDvfsTableS1y8gbX03, }, + { AULA_4GB_SAMSUNG_K4U6E3S4AA_MGCL, T210b0SdevEmcDvfsTableS1y4gbX03, }, + { IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTF, T210b0SdevEmcDvfsTableM4gb03, }, + { HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTF, T210b0SdevEmcDvfsTableM4gb03, }, + { AULA_4GB_MICRON_MT53E512M32D2NP_046_WTF, T210b0SdevEmcDvfsTableM4gb03, }, + { AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL, T210b0SdevEmcDvfsTableS1y8gbX03, }, + { IOWA_4GB_HYNIX_H54G46CYRBX267, T210b0SdevEmcDvfsTableH1a4gb01, }, + { HOAG_4GB_HYNIX_H54G46CYRBX267, T210b0SdevEmcDvfsTableH1a4gb01, }, + { AULA_4GB_HYNIX_H54G46CYRBX267, T210b0SdevEmcDvfsTableH1a4gb01, }, + { IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB, T210b0SdevEmcDvfsTableM1a4gb01, }, + { HOAG_4GB_MICRON_MT53E512M32D1NP_046_WTB, T210b0SdevEmcDvfsTableM1a4gb01, }, + { AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB, T210b0SdevEmcDvfsTableM1a4gb01, }, + }; + + /* + 710006abfc 40 01 1f d6 br x10 + */ + + /* + 710006ac28 a0 03 00 90 adrp x0,0x71000de000 + 710006ac2c 00 80 16 91 add x0=>SdevEmcDvfsTableS4gb01,x0,#0x5a0 + */ + + /* Br */ + /* + | Z | OP | Fixed | A | M | RN | RM + 31 30 29 28 27 26 25 | 24 23 | 22 | 21 20 19 18 17 16 15 14 13 12 |11 | 10 | 9 8 7 6 5 | 4 3 2 1 0 + 1 1 0 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 Rn 0 0 0 0 0 + Z op A M Rm + */ + + /* Adrp */ + /* + OP | ImmLow | | ImmHigh | RD + 31 | 30 29 | 28 27 26 25 24 | 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 | 4 3 2 1 0 + */ + + /* ADD (immediate) */ + /* + SF | OP | S | Fixed value | Sh | Imm12 | RN | RD + 31 | 30 | 29 | 28 27 26 25 24 23 | 22 | 21 20 19 18 17 16 15 14 13 12 11 10 | 9 8 7 6 5 | 4 3 2 1 0 + */ + + constexpr u32 MtcBrAsm = 0xD61F0140; + constexpr u32 MtcMovAsm = 0x52800068; + constexpr u32 MtcAdrpAsm = 0x900003A0; + constexpr u32 MtcAddAsm = 0x91168000; + + ALWAYS_INLINE bool MemMtcGetGetTablePatternFn(u32 *ptr) { + /* This builds an address that gets returned, so the register must be x0 by convention. */ + return AsmCompareAddNoImm12(*ptr, MtcAddAsm); + } + void MtcGenerateFreqTables(); Result MemFreqMtcTable(u32 *ptr); Result MemFreqDvbTable(u32 *ptr); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp index c50f55a8..9807c4a6 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp @@ -29,6 +29,9 @@ #include "erista/pcv_erista.hpp" #include "mariko/pcv_mariko.hpp" +#include "mariko/pcv_mariko_cpu.hpp" +#include "mariko/pcv_mariko_gpu.hpp" +#include "mariko/pcv_mariko_mtc.hpp" #include "pcv_hook.hpp" From eaad7b1d899715ecce3aba73868449504fb6212e Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 3 Aug 2026 17:42:55 -0400 Subject: [PATCH 022/205] default JEDEC step mode --- Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp | 2 +- .../stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 5ba70a8f..8563a0d0 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -40,7 +40,7 @@ volatile CustomizeTable C = { /* Available: 33MHz step rate, 66MHz step rate, 100MHz step rate, 133MHz step rate and jedec. */ /* Jedec freqs are 1333MHz, 1600MHz, 1866MHz, 2133MHz, 2400MHz, 2666MHz, 2933MHz, 3200MHz. */ -.stepMode = StepMode_33MHz, +.stepMode = StepMode_Jedec, .marikoEmcMaxClock = 2133000, /* Requires the EMC DVFS 63-entry patches (EMC DVFS Count / EMC SoC LUT). */ .marikoEmcVddqVolt = 600000, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index bba99ec6..d230a276 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -300,7 +300,7 @@ namespace ams::ldr::hoc::pcv::mariko { } void MtcGenerateJedecTable() { - const u32 jedecFreqs[] = { 1866000, 1996000, 2133000, 2400000, 2666000, 2933000, 3200000 }; + const u32 jedecFreqs[] = { 1866000, 1996800, 2133000, 2400000, 2666000, 2933000, 3200000 }; constexpr u32 JedecFreqCount = std::size(jedecFreqs); for (u32 i = 0; i < JedecFreqCount; ++i) { From 842957654525031b060449af9cf6d8038ce5be75 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 4 Aug 2026 23:38:56 +0200 Subject: [PATCH 023/205] ldr: slight w2r timing fix --- .../loader/source/oc/pcv/erista/calculate_timings_erista.cpp | 3 ++- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index fc6ae8f8..a07982aa 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -124,7 +124,8 @@ namespace ams::ldr::hoc::pcv::erista { tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + const s32 wlToRl = static_cast(WL) - static_cast(RL); + tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * wlToRl), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; wdv = WL; wsv = WL - 2; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index c6efaa0f..12915327 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -177,7 +177,8 @@ namespace ams::ldr::hoc::pcv::mariko { qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + const s32 wlToRl = static_cast(WL) - static_cast(RL); + tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * wlToRl), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; tWTM = CEIL(WL + ((7.570 / tCK_avg) + 8.753)); tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; From 3b650952db4d9b5ae1d58d4de50404d750e6cfda Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:13:15 +0200 Subject: [PATCH 024/205] overlay: jumpToItem fix --- Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp index 7364711e..645720c0 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp @@ -450,14 +450,8 @@ void AppProfileGui::listUI() this->addProfileUI(HocClkProfile_HandheldChargingUSB); } -std::string jumpItemString = "Edit App Profile"; - void AppProfileGui::changeTo(std::uint64_t applicationId) { - if (applicationId == HOCCLK_GLOBAL_PROFILE_TID) { - jumpItemString = "Edit Global Profile"; - } - HocClkTitleProfileList* profileList = new HocClkTitleProfileList; Result rc = hocclkIpcGetProfiles(applicationId, profileList); if(R_FAILED(rc)) @@ -487,5 +481,5 @@ void AppProfileGui::update() } std::string AppProfileGui::getJumpToItemName() { - return jumpItemString; -} \ No newline at end of file + return this->applicationId == HOCCLK_GLOBAL_PROFILE_TID ? "Edit Global Profile" : "Edit App Profile"; +} From 8a3e34948a8954b15a55cf1e776f95eb552690d0 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:25:46 +0200 Subject: [PATCH 025/205] Readme: move clock table to a separate file + add missing frequencies --- CLOCKS.md | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 117 ++------------------------------------------------- 2 files changed, 128 insertions(+), 113 deletions(-) create mode 100644 CLOCKS.md diff --git a/CLOCKS.md b/CLOCKS.md new file mode 100644 index 00000000..7673076e --- /dev/null +++ b/CLOCKS.md @@ -0,0 +1,124 @@ +# Clock table + +### MEM clocks (mhz) +* 3400 → max on mariko. +* 3366 +* 3333 +* 3300 +* 3266 +* 3233 +* 3200 → JEDEC. +* 3166 +* 3133 +* 3100 +* 3066 +* 3033 +* 3000 +* 2966 +* 2933 → JEDEC. +* 2900 +* 2866 +* 2833 +* 2800 +* 2766 +* 2733 +* 2700 +* 2666 → JEDEC. +* 2633 +* 2600 +* 2566 +* 2533 +* 2500 +* 2466 +* 2433 +* 2400 → max on erista, JEDEC. +* 2366 +* 2333 +* 2300 +* 2266 +* 2233 +* 2200 +* 2166 +* 2133 → Mariko JEDEC standard max (4266 Modules) +* 2100 +* 2066 +* 2033 +* 2000 +* 1996 → JEDEC standard +* 1966 +* 1933 +* 1900 +* 1866 → Mariko JEDEC standard max (3733 Modules) +* 1833 +* 1800 +* 1766 +* 1733 +* 1700 +* 1666 +* 1633 +* 1600 → official docked, boost mode, Erista JEDEC standard max (3200 Modules), JEDEC. +* 1331 → official handheld, JEDEC. +* 1065 → Erista only +* 800 → Erista only +* 665 → Erista only +* 408 → Erista only +* 204 → sleep mode +* 102 → Erista only +* 68 → Erista only +* 40 → Erista only + +### CPU clocks (mhz) +* 2703 → mariko absolute max, dangerous +* 2601 → unsafe +* 2499 +* 2397 → mariko safe max with UV (low speedo) +* 2295 +* 2193 +* 2091 +* 1963 → mariko no UV max clock +* 1887 +* 1785 → erista no UV max clock, boost mode +* 1683 +* 1581 +* 1428 +* 1326 +* 1224 → sdev oc +* 1122 +* 1020 → official docked & handheld +* 918 +* 816 +* 714 +* 612 → sleep mode + +### GPU clocks (mhz) +* 1536 → absolute max clock on mariko. Dangerous +* 1497 → max mariko unsafe clock +* 1459 +* 1420 +* 1382 → Max mariko "safe" clock +* 1344 +* 1305 +* 1267 → NVIDIA T214(mariko) rating +* 1228 → mariko High UV safe clock +* 1152 → mariko hiOpt-15mV max clock +* 1075 → mariko hiOpt max clock. absolute max clock on erista. very dangerous +* 998 → NVIDIA T210 (erista) rating +* 960 (erista only) → erista high uv/hiOpt-15mV safe max clock +* 921 → erista no UV max clock +* 844 +* 768 → official docked +* 691 +* 614 +* 537 +* 460 → max handheld +* 384 → official handheld +* 307 → official handheld +* 230 +* 153 +* 76 → boost mode + +**Notes:** +1. On Erista, CPU in handheld is capped to 1581MHz +2. GPU overclock is capped at 460MHz on erista in handheld +3. On Mariko, cap with hiOpt is 614MHz, with hiOpt-15mV it is 691MHz and with High UV it's 768MHz +4. Clocks higher than 768MHz on erista need the official charger is plugged in. diff --git a/README.md b/README.md index 3050571b..95f62d69 100644 --- a/README.md +++ b/README.md @@ -83,122 +83,13 @@ We don't accept donations. Put your spare cash into a charity instead :) Refer to COMPILATION.md --- -## Clock table -### MEM clocks (mhz) -* 3400 → max on mariko. -* 3366 -* 3333 -* 3300 -* 3266 -* 3233 -* 3200 → JEDEC. -* 3166 -* 3133 -* 3100 -* 3066 -* 3033 -* 3000 -* 2966 -* 2933 → JEDEC. -* 2900 -* 2866 -* 2833 -* 2800 -* 2766 -* 2733 -* 2700 -* 2666 → JEDEC. -* 2633 -* 2600 -* 2566 -* 2533 -* 2500 -* 2466 -* 2433 -* 2400 → max on erista, JEDEC. -* 2366 -* 2333 -* 2300 -* 2266 -* 2233 -* 2200 -* 2166 -* 2133 → Mariko JEDEC standard max (4266 Modules) -* 2100 -* 2066 -* 2033 -* 2000 -* 1996 → JEDEC standard -* 1966 -* 1933 -* 1900 -* 1866 → Mariko JEDEC standard max (3733 Modules) -* 1833 -* 1800 -* 1766 -* 1733 -* 1700 -* 1666 -* 1633 -* 1600 → official docked, boost mode, Erista JEDEC standard max (3200 Modules), JEDEC. -* 1331 → official handheld, JEDEC. -* 1065 -* 800 -* 665 +
+

Clock table

-### CPU clocks (mhz) -* 2703 → mariko absolute max, dangerous -* 2601 → unsafe -* 2499 -* 2397 → mariko safe max with UV (low speedo) -* 2295 -* 2193 -* 2091 -* 1963 → mariko no UV max clock -* 1887 -* 1785 → erista no UV max clock, boost mode -* 1683 -* 1581 -* 1428 -* 1326 -* 1224 → sdev oc -* 1122 -* 1020 → official docked & handheld -* 918 -* 816 -* 714 -* 612 → sleep mode +See [CLOCKS.md](CLOCKS.md) for the full list of available MEM, CPU, and GPU clocks. -### GPU clocks (mhz) -* 1536 → absolute max clock on mariko. Dangerous -* 1497 → max mariko unsafe clock -* 1382 → Max mariko "safe" clock -* 1305 -* 1267 → NVIDIA T214(mariko) rating -* 1228 → mariko High UV safe clock -* 1152 → mariko hiOpt-15mV max clock -* 1075 → mariko hiOpt max clock. absolute max clock on erista. very dangerous -* 998 → NVIDIA T210 (erista) rating -* 960 (erista only) → erista high uv/hiOpt-15mV safe max clock -* 921 → erista no UV max clock -* 844 -* 768 → official docked -* 691 -* 614 -* 537 -* 460 → max handheld -* 384 → official handheld -* 307 → official handheld -* 230 -* 153 -* 76 → boost mode - -**Notes:** -1. On Erista, CPU in handheld is capped to 1581MHz -2. GPU overclock is capped at 460MHz on erista in handheld -3. On Mariko, cap with hiOpt is 614MHz, with hiOpt-15mV it is 691MHz and with High UV it's 768MHz -4. Clocks higher than 768MHz on erista need the official charger is plugged in. +
--- From f0e1541d3846ce3a5f82f1d7fcb4b1f72963cb3f Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:27:43 +0200 Subject: [PATCH 026/205] Readme: having clock table in the same file is prettier --- CLOCKS.md | 124 ------------------------------------------------------ README.md | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 125 deletions(-) delete mode 100644 CLOCKS.md diff --git a/CLOCKS.md b/CLOCKS.md deleted file mode 100644 index 7673076e..00000000 --- a/CLOCKS.md +++ /dev/null @@ -1,124 +0,0 @@ -# Clock table - -### MEM clocks (mhz) -* 3400 → max on mariko. -* 3366 -* 3333 -* 3300 -* 3266 -* 3233 -* 3200 → JEDEC. -* 3166 -* 3133 -* 3100 -* 3066 -* 3033 -* 3000 -* 2966 -* 2933 → JEDEC. -* 2900 -* 2866 -* 2833 -* 2800 -* 2766 -* 2733 -* 2700 -* 2666 → JEDEC. -* 2633 -* 2600 -* 2566 -* 2533 -* 2500 -* 2466 -* 2433 -* 2400 → max on erista, JEDEC. -* 2366 -* 2333 -* 2300 -* 2266 -* 2233 -* 2200 -* 2166 -* 2133 → Mariko JEDEC standard max (4266 Modules) -* 2100 -* 2066 -* 2033 -* 2000 -* 1996 → JEDEC standard -* 1966 -* 1933 -* 1900 -* 1866 → Mariko JEDEC standard max (3733 Modules) -* 1833 -* 1800 -* 1766 -* 1733 -* 1700 -* 1666 -* 1633 -* 1600 → official docked, boost mode, Erista JEDEC standard max (3200 Modules), JEDEC. -* 1331 → official handheld, JEDEC. -* 1065 → Erista only -* 800 → Erista only -* 665 → Erista only -* 408 → Erista only -* 204 → sleep mode -* 102 → Erista only -* 68 → Erista only -* 40 → Erista only - -### CPU clocks (mhz) -* 2703 → mariko absolute max, dangerous -* 2601 → unsafe -* 2499 -* 2397 → mariko safe max with UV (low speedo) -* 2295 -* 2193 -* 2091 -* 1963 → mariko no UV max clock -* 1887 -* 1785 → erista no UV max clock, boost mode -* 1683 -* 1581 -* 1428 -* 1326 -* 1224 → sdev oc -* 1122 -* 1020 → official docked & handheld -* 918 -* 816 -* 714 -* 612 → sleep mode - -### GPU clocks (mhz) -* 1536 → absolute max clock on mariko. Dangerous -* 1497 → max mariko unsafe clock -* 1459 -* 1420 -* 1382 → Max mariko "safe" clock -* 1344 -* 1305 -* 1267 → NVIDIA T214(mariko) rating -* 1228 → mariko High UV safe clock -* 1152 → mariko hiOpt-15mV max clock -* 1075 → mariko hiOpt max clock. absolute max clock on erista. very dangerous -* 998 → NVIDIA T210 (erista) rating -* 960 (erista only) → erista high uv/hiOpt-15mV safe max clock -* 921 → erista no UV max clock -* 844 -* 768 → official docked -* 691 -* 614 -* 537 -* 460 → max handheld -* 384 → official handheld -* 307 → official handheld -* 230 -* 153 -* 76 → boost mode - -**Notes:** -1. On Erista, CPU in handheld is capped to 1581MHz -2. GPU overclock is capped at 460MHz on erista in handheld -3. On Mariko, cap with hiOpt is 614MHz, with hiOpt-15mV it is 691MHz and with High UV it's 768MHz -4. Clocks higher than 768MHz on erista need the official charger is plugged in. diff --git a/README.md b/README.md index 95f62d69..8b1886b8 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,128 @@ Refer to COMPILATION.md

Clock table

-See [CLOCKS.md](CLOCKS.md) for the full list of available MEM, CPU, and GPU clocks. +### MEM clocks (mhz) +* 3400 → max on mariko. +* 3366 +* 3333 +* 3300 +* 3266 +* 3233 +* 3200 → JEDEC. +* 3166 +* 3133 +* 3100 +* 3066 +* 3033 +* 3000 +* 2966 +* 2933 → JEDEC. +* 2900 +* 2866 +* 2833 +* 2800 +* 2766 +* 2733 +* 2700 +* 2666 → JEDEC. +* 2633 +* 2600 +* 2566 +* 2533 +* 2500 +* 2466 +* 2433 +* 2400 → max on erista, JEDEC. +* 2366 +* 2333 +* 2300 +* 2266 +* 2233 +* 2200 +* 2166 +* 2133 → Mariko JEDEC standard max (4266 Modules) +* 2100 +* 2066 +* 2033 +* 2000 +* 1996 → JEDEC standard +* 1966 +* 1933 +* 1900 +* 1866 → Mariko JEDEC standard max (3733 Modules) +* 1833 +* 1800 +* 1766 +* 1733 +* 1700 +* 1666 +* 1633 +* 1600 → official docked, boost mode, Erista JEDEC standard max (3200 Modules), JEDEC. +* 1331 → official handheld, JEDEC. +* 1065 → Erista only +* 800 → Erista only +* 665 → Erista only +* 408 → Erista only +* 204 → sleep mode +* 102 → Erista only +* 68 → Erista only +* 40 → Erista only + +### CPU clocks (mhz) +* 2703 → mariko absolute max, dangerous +* 2601 → unsafe +* 2499 +* 2397 → mariko safe max with UV (low speedo) +* 2295 +* 2193 +* 2091 +* 1963 → mariko no UV max clock +* 1887 +* 1785 → erista no UV max clock, boost mode +* 1683 +* 1581 +* 1428 +* 1326 +* 1224 → sdev oc +* 1122 +* 1020 → official docked & handheld +* 918 +* 816 +* 714 +* 612 → sleep mode + +### GPU clocks (mhz) +* 1536 → absolute max clock on mariko. Dangerous +* 1497 → max mariko unsafe clock +* 1459 +* 1420 +* 1382 → Max mariko "safe" clock +* 1344 +* 1305 +* 1267 → NVIDIA T214(mariko) rating +* 1228 → mariko High UV safe clock +* 1152 → mariko hiOpt-15mV max clock +* 1075 → mariko hiOpt max clock. absolute max clock on erista. very dangerous +* 998 → NVIDIA T210 (erista) rating +* 960 (erista only) → erista high uv/hiOpt-15mV safe max clock +* 921 → erista no UV max clock +* 844 +* 768 → official docked +* 691 +* 614 +* 537 +* 460 → max handheld +* 384 → official handheld +* 307 → official handheld +* 230 +* 153 +* 76 → boost mode + +**Notes:** +1. On Erista, CPU in handheld is capped to 1581MHz +2. GPU overclock is capped at 460MHz on erista in handheld +3. On Mariko, cap with hiOpt is 614MHz, with hiOpt-15mV it is 691MHz and with High UV it's 768MHz +4. Clocks higher than 768MHz on erista need the official charger is plugged in.
From c870ee9f5778760719f8ee4473aebe8cb26d260d Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:34:47 +0200 Subject: [PATCH 027/205] Readme: update credits --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b1886b8..060c33bb 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,8 @@ Refer to COMPILATION.md * **Dominatorul, Samybigio, Arcdelta, Miki, Happy, Winnerboi77, Blaise, Alvise, agjeococh, frost, letum00, and Xenshen** - Testing * **Samybigio2011, Miki** - Italian translations * **angelblaster** - Korean translations -* **q1332348216-glitch** - Chinese translations +* **q1332348216-glitch, nangongjing1, xinluochenjiang** - Chinese translations * **th3-ne0undr5c0r** - French translations +* **redraz** - Russian translations +* **Niklas080208** - JSON language support for sysmodule notifications. * **Nvidia** - [Tegra X1 Technical Reference Manual](https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual), soctherm driver, L4T From 0643e3c2bcd721b10081ce93a3f1fbc067de3f95 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:35:47 +0200 Subject: [PATCH 028/205] Readme: don't forget the other hero --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 060c33bb..65bde463 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ Refer to COMPILATION.md --- ## Credits -* **Lightos's Cat** - Cat +* **Lightos's Cats** - Cats * **Souldbminer** - hoc-clk and loader development * **Lightos** - Loader patches development, hoc-clk development, guides * **TDRR** - HOC Logo Design From 21f94d724a12158acc886e2f41db88be1d0383ac Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 11 Aug 2026 11:22:43 -0400 Subject: [PATCH 029/205] add GPU registers --- Source/hoc-clk/sysmodule/src/soc/registers.h | 3304 +++++++++++++++++- 1 file changed, 3303 insertions(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index f6f11b06..e546b375 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -545,4 +545,3306 @@ #define PLLA1_BASE 0x6a4 #define PLLDP_BASE 0x590 -#define OSC_HZ 38400000ULL \ No newline at end of file +#define OSC_HZ 38400000ULL + +#define GPU_BUS_BAR0_WINDOW 0x00001700 +#define GPU_BUS_BAR0_WINDOW_BASE_SHIFT 0x00000000 +#define GPU_BUS_BAR0_WINDOW_BASE_FIELDMASK 0x00ffffff +#define GPU_BUS_BAR0_WINDOW_TARGET_VID_MEM_F 0x00000000 +#define GPU_BUS_BAR0_WINDOW_TARGET_SYS_MEM_COHERENT_F 0x02000000 +#define GPU_BUS_BAR0_WINDOW_TARGET_SYS_MEM_NONCOHERENT_F 0x03000000 +#define GPU_BUS_BAR0_WINDOW_TARGET_BAR0_WINDOW_BASE_SHIFT_V 0x00000010 +#define GPU_BUS_BAR1_BLOCK 0x00001704 +#define GPU_BUS_BAR1_BLOCK_PTR_SHIFT 0x00000000 +#define GPU_BUS_BAR1_BLOCK_PTR_FIELDMASK 0x0fffffff +#define GPU_BUS_BAR1_BLOCK_TARGET_VID_MEM_F 0x00000000 +#define GPU_BUS_BAR1_BLOCK_TARGET_SYS_MEM_COH_F 0x20000000 +#define GPU_BUS_BAR1_BLOCK_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_BUS_BAR1_BLOCK_MODE_VIRTUAL_F 0x80000000 +#define GPU_BUS_BAR2_BLOCK 0x00001714 +#define GPU_BUS_BAR2_BLOCK_PTR_SHIFT 0x00000000 +#define GPU_BUS_BAR2_BLOCK_PTR_FIELDMASK 0x0fffffff +#define GPU_BUS_BAR2_BLOCK_TARGET_VID_MEM_F 0x00000000 +#define GPU_BUS_BAR2_BLOCK_TARGET_SYS_MEM_COH_F 0x20000000 +#define GPU_BUS_BAR2_BLOCK_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_BUS_BAR2_BLOCK_MODE_VIRTUAL_F 0x80000000 +#define GPU_BUS_BAR1_BLOCK_PTR_SHIFT_V 0x0000000c +#define GPU_BUS_BAR2_BLOCK_PTR_SHIFT_V 0x0000000c +#define GPU_BUS_BIND_STATUS 0x00001710 +#define GPU_BUS_BIND_STATUS_BAR1_PENDING_SHIFT 0x00000000 +#define GPU_BUS_BIND_STATUS_BAR1_PENDING_FIELDMASK 0x00000001 +#define GPU_BUS_BIND_STATUS_BAR1_PENDING_EMPTY_F 0x00000000 +#define GPU_BUS_BIND_STATUS_BAR1_PENDING_BUSY_F 0x00000001 +#define GPU_BUS_BIND_STATUS_BAR1_OUTSTANDING_SHIFT 0x00000001 +#define GPU_BUS_BIND_STATUS_BAR1_OUTSTANDING_FIELDMASK 0x00000001 +#define GPU_BUS_BIND_STATUS_BAR1_OUTSTANDING_FALSE_F 0x00000000 +#define GPU_BUS_BIND_STATUS_BAR1_OUTSTANDING_TRUE_F 0x00000002 +#define GPU_BUS_BIND_STATUS_BAR2_PENDING_SHIFT 0x00000002 +#define GPU_BUS_BIND_STATUS_BAR2_PENDING_FIELDMASK 0x00000001 +#define GPU_BUS_BIND_STATUS_BAR2_PENDING_EMPTY_F 0x00000000 +#define GPU_BUS_BIND_STATUS_BAR2_PENDING_BUSY_F 0x00000004 +#define GPU_BUS_BIND_STATUS_BAR2_OUTSTANDING_SHIFT 0x00000003 +#define GPU_BUS_BIND_STATUS_BAR2_OUTSTANDING_FIELDMASK 0x00000001 +#define GPU_BUS_BIND_STATUS_BAR2_OUTSTANDING_FALSE_F 0x00000000 +#define GPU_BUS_BIND_STATUS_BAR2_OUTSTANDING_TRUE_F 0x00000008 +#define GPU_BUS_INTR_0 0x00001100 +#define GPU_BUS_INTR_0_PRI_SQUASH_MASK 0x00000002 +#define GPU_BUS_INTR_0_PRI_SQUASH_SHIFT 0x00000001 +#define GPU_BUS_INTR_0_PRI_SQUASH_FIELDMASK 0x00000001 +#define GPU_BUS_INTR_0_PRI_FECSERR_MASK 0x00000004 +#define GPU_BUS_INTR_0_PRI_FECSERR_SHIFT 0x00000002 +#define GPU_BUS_INTR_0_PRI_FECSERR_FIELDMASK 0x00000001 +#define GPU_BUS_INTR_0_PRI_TIMEOUT_MASK 0x00000008 +#define GPU_BUS_INTR_0_PRI_TIMEOUT_SHIFT 0x00000003 +#define GPU_BUS_INTR_0_PRI_TIMEOUT_FIELDMASK 0x00000001 +#define GPU_BUS_INTR_EN_0 0x00001140 +#define GPU_BUS_INTR_EN_0_PRI_SQUASH_MASK 0x00000002 +#define GPU_BUS_INTR_EN_0_PRI_SQUASH_SHIFT 0x00000001 +#define GPU_BUS_INTR_EN_0_PRI_SQUASH_FIELDMASK 0x00000001 +#define GPU_BUS_INTR_EN_0_PRI_FECSERR_MASK 0x00000004 +#define GPU_BUS_INTR_EN_0_PRI_FECSERR_SHIFT 0x00000002 +#define GPU_BUS_INTR_EN_0_PRI_FECSERR_FIELDMASK 0x00000001 +#define GPU_BUS_INTR_EN_0_PRI_TIMEOUT_MASK 0x00000008 +#define GPU_BUS_INTR_EN_0_PRI_TIMEOUT_SHIFT 0x00000003 +#define GPU_BUS_INTR_EN_0_PRI_TIMEOUT_FIELDMASK 0x00000001 + +#define GPU_CCSR_CHANNEL_INST__BASE 0x00800000 +#define GPU_CCSR_CHANNEL_INST__STRIDE 0x00000008 +#define GPU_CCSR_CHANNEL_INST(i) (0x00800000 + (i) * 0x00000008) +#define GPU_CCSR_CHANNEL_INST__SIZE_1_V 0x00000200 +#define GPU_CCSR_CHANNEL_INST_PTR_SHIFT 0x00000000 +#define GPU_CCSR_CHANNEL_INST_PTR_FIELDMASK 0x0fffffff +#define GPU_CCSR_CHANNEL_INST_TARGET_VID_MEM_F 0x00000000 +#define GPU_CCSR_CHANNEL_INST_TARGET_SYS_MEM_COH_F 0x20000000 +#define GPU_CCSR_CHANNEL_INST_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_CCSR_CHANNEL_INST_BIND_FALSE_F 0x00000000 +#define GPU_CCSR_CHANNEL_INST_BIND_TRUE_F 0x80000000 +#define GPU_CCSR_CHANNEL__BASE 0x00800004 +#define GPU_CCSR_CHANNEL__STRIDE 0x00000008 +#define GPU_CCSR_CHANNEL(i) (0x00800004 + (i) * 0x00000008) +#define GPU_CCSR_CHANNEL__SIZE_1_V 0x00000200 +#define GPU_CCSR_CHANNEL_ENABLE_SHIFT 0x00000000 +#define GPU_CCSR_CHANNEL_ENABLE_FIELDMASK 0x00000001 +#define GPU_CCSR_CHANNEL_ENABLE_SET_SHIFT 0x0000000a +#define GPU_CCSR_CHANNEL_ENABLE_SET_FIELDMASK 0x00000001 +#define GPU_CCSR_CHANNEL_ENABLE_SET_TRUE_F 0x00000400 +#define GPU_CCSR_CHANNEL_ENABLE_CLR_TRUE_F 0x00000800 +#define GPU_CCSR_CHANNEL_STATUS_SHIFT 0x00000018 +#define GPU_CCSR_CHANNEL_STATUS_FIELDMASK 0x0000000f +#define GPU_CCSR_CHANNEL_BUSY_SHIFT 0x0000001c +#define GPU_CCSR_CHANNEL_BUSY_FIELDMASK 0x00000001 + +#define GPU_CE2_INTR_STATUS 0x00106908 +#define GPU_CE2_INTR_STATUS_BLOCKPIPE_PENDING_F 0x00000001 +#define GPU_CE2_INTR_STATUS_BLOCKPIPE_RESET_F 0x00000001 +#define GPU_CE2_INTR_STATUS_NONBLOCKPIPE_PENDING_F 0x00000002 +#define GPU_CE2_INTR_STATUS_NONBLOCKPIPE_RESET_F 0x00000002 +#define GPU_CE2_INTR_STATUS_LAUNCHERR_PENDING_F 0x00000004 +#define GPU_CE2_INTR_STATUS_LAUNCHERR_RESET_F 0x00000004 + +#define GPU_CTXSW_PROG_FECS_HEADER_V 0x00000100 +#define GPU_CTXSW_PROG_MAIN_IMAGE_NUM_GPCS_O 0x00000008 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CTL_O 0x0000000c +#define GPU_CTXSW_PROG_MAIN_IMAGE_CTL_CDE_ENABLED_F 0x00000400 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CTL_CDE_DISABLED_F 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PATCH_COUNT_O 0x00000010 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_ID_O 0x000000f0 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PATCH_ADR_LO_O 0x00000014 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PATCH_ADR_HI_O 0x00000018 +#define GPU_CTXSW_PROG_MAIN_IMAGE_ZCULL_O 0x0000001c +#define GPU_CTXSW_PROG_MAIN_IMAGE_ZCULL_MODE_NO_CTXSW_V 0x00000001 +#define GPU_CTXSW_PROG_MAIN_IMAGE_ZCULL_MODE_SEPARATE_BUFFER_V 0x00000002 +#define GPU_CTXSW_PROG_MAIN_IMAGE_ZCULL_PTR_O 0x00000020 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_O 0x00000028 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_MODE_MASK 0x00000007 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_MODE_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_MODE_FIELDMASK 0x00000007 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_MODE_NO_CTXSW_F 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_SMPC_MODE_MASK 0x00000038 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_SMPC_MODE_SHIFT 0x00000003 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_SMPC_MODE_FIELDMASK 0x00000007 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_SMPC_MODE_CTXSW_F 0x00000008 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_SMPC_MODE_NO_CTXSW_F 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_PC_SAMPLING_SHIFT 0x00000006 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_PC_SAMPLING_FIELDMASK 0x00000001 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_PC_SAMPLING_MASK 0x00000040 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PM_PTR_O 0x0000002c +#define GPU_CTXSW_PROG_MAIN_IMAGE_NUM_SAVE_OPS_O 0x000000f4 +#define GPU_CTXSW_PROG_MAIN_IMAGE_NUM_RESTORE_OPS_O 0x000000f8 +#define GPU_CTXSW_PROG_MAIN_IMAGE_MAGIC_VALUE_O 0x000000fc +#define GPU_CTXSW_PROG_MAIN_IMAGE_MAGIC_VALUE_V_VALUE_V 0x600dc0de +#define GPU_CTXSW_PROG_LOCAL_PRIV_REGISTER_CTL_O 0x0000000c +#define GPU_CTXSW_PROG_LOCAL_PRIV_REGISTER_CTL_OFFSET_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_LOCAL_PRIV_REGISTER_CTL_OFFSET_FIELDMASK 0x0000ffff +#define GPU_CTXSW_PROG_LOCAL_IMAGE_PPC_INFO_O 0x000000f4 +#define GPU_CTXSW_PROG_LOCAL_IMAGE_PPC_INFO_NUM_PPCS_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_LOCAL_IMAGE_PPC_INFO_NUM_PPCS_FIELDMASK 0x0000ffff +#define GPU_CTXSW_PROG_LOCAL_IMAGE_PPC_INFO_PPC_MASK_SHIFT 0x00000010 +#define GPU_CTXSW_PROG_LOCAL_IMAGE_PPC_INFO_PPC_MASK_FIELDMASK 0x0000ffff +#define GPU_CTXSW_PROG_LOCAL_IMAGE_NUM_TPCS_O 0x000000f8 +#define GPU_CTXSW_PROG_LOCAL_MAGIC_VALUE_O 0x000000fc +#define GPU_CTXSW_PROG_LOCAL_MAGIC_VALUE_V_VALUE_V 0xad0becab +#define GPU_CTXSW_PROG_MAIN_EXTENDED_BUFFER_CTL_O 0x000000ec +#define GPU_CTXSW_PROG_MAIN_EXTENDED_BUFFER_CTL_OFFSET_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_EXTENDED_BUFFER_CTL_OFFSET_FIELDMASK 0x0000ffff +#define GPU_CTXSW_PROG_MAIN_EXTENDED_BUFFER_CTL_SIZE_SHIFT 0x00000010 +#define GPU_CTXSW_PROG_MAIN_EXTENDED_BUFFER_CTL_SIZE_FIELDMASK 0x000000ff +#define GPU_CTXSW_PROG_EXTENDED_BUFFER_SEGMENTS_SIZE_IN_BYTES_V 0x00000100 +#define GPU_CTXSW_PROG_EXTENDED_MARKER_SIZE_IN_BYTES_V 0x00000004 +#define GPU_CTXSW_PROG_EXTENDED_SM_DSM_PERF_COUNTER_REGISTER_STRIDE_V 0x00000000 +#define GPU_CTXSW_PROG_EXTENDED_SM_DSM_PERF_COUNTER_CONTROL_REGISTER_STRIDE_V 0x00000002 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_O 0x000000a0 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_MODE_SIZE 0x00000002 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_MODE_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_MODE_FIELDMASK 0x00000003 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_MODE_MASK 0x00000003 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_MODE_ALLOW_ALL_F 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_CONFIG_MODE_USE_MAP_F 0x00000002 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_ADDR_LO_O 0x000000a4 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PRIV_ACCESS_MAP_ADDR_HI_O 0x000000a8 +#define GPU_CTXSW_PROG_MAIN_IMAGE_MISC_OPTIONS_O 0x0000003c +#define GPU_CTXSW_PROG_MAIN_IMAGE_MISC_OPTIONS_VERIF_FEATURES_MASK 0x00000008 +#define GPU_CTXSW_PROG_MAIN_IMAGE_MISC_OPTIONS_VERIF_FEATURES_SHIFT 0x00000003 +#define GPU_CTXSW_PROG_MAIN_IMAGE_MISC_OPTIONS_VERIF_FEATURES_FIELDMASK 0x00000001 +#define GPU_CTXSW_PROG_MAIN_IMAGE_MISC_OPTIONS_VERIF_FEATURES_DISABLED_F 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_CONTROL_O 0x000000ac +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_CONTROL_NUM_RECORDS_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_CONTROL_NUM_RECORDS_FIELDMASK 0x0000ffff +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_O 0x000000b0 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_V_MASK 0x0fffffff +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_V_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_V_FIELDMASK 0x0fffffff +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_TARGET_MASK 0x30000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_TARGET_SHIFT 0x0000001c +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_TARGET_FIELDMASK 0x00000003 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_TARGET_VID_MEM_F 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_TARGET_SYS_MEM_COHERENT_F 0x20000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_HI_TARGET_SYS_MEM_NONCOHERENT_F 0x30000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_O 0x000000b4 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_V_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_CONTEXT_TIMESTAMP_BUFFER_PTR_V_FIELDMASK 0xffffffff +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_RECORD_SIZE_IN_BYTES_V 0x00000080 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_RECORD_SIZE_IN_WORDS_V 0x00000020 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_MAGIC_VALUE_LO_O 0x00000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_MAGIC_VALUE_LO_V_VALUE_V 0x00000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_MAGIC_VALUE_HI_O 0x00000004 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_MAGIC_VALUE_HI_V_VALUE_V 0x600dbeef +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_CONTEXT_ID_O 0x00000008 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_CONTEXT_PTR_O 0x0000000c +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_NEW_CONTEXT_ID_O 0x00000010 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_NEW_CONTEXT_PTR_O 0x00000014 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_LO_O 0x00000018 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_O 0x0000001c +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_V_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_V_FIELDMASK 0x00ffffff +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_SHIFT 0x00000018 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FIELDMASK 0x000000ff +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_MASK 0xff000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_CTXSW_REQ_BY_HOST_V 0x00000001 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_CTXSW_REQ_BY_HOST_F 0x01000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_V 0x00000002 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_F 0x02000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_WFI_V 0x0000000a +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_WFI_F 0x0a000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_GFXP_V 0x0000000b +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_GFXP_F 0x0b000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_CTAP_V 0x0000000c +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_CTAP_F 0x0c000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_CILP_V 0x0000000d +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_FE_ACK_CILP_F 0x0d000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_SAVE_END_V 0x00000003 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_SAVE_END_F 0x03000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_RESTORE_START_V 0x00000004 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_RESTORE_START_F 0x04000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_CONTEXT_START_V 0x00000005 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_CONTEXT_START_F 0x05000000 +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_INVALID_TIMESTAMP_V 0x000000ff +#define GPU_CTXSW_PROG_RECORD_TIMESTAMP_TIMESTAMP_HI_TAG_INVALID_TIMESTAMP_F 0xff000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PREEMPTION_OPTIONS_O 0x00000060 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PREEMPTION_OPTIONS_CONTROL_SHIFT 0x00000000 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PREEMPTION_OPTIONS_CONTROL_FIELDMASK 0x00000003 +#define GPU_CTXSW_PROG_MAIN_IMAGE_PREEMPTION_OPTIONS_CONTROL_CTA_ENABLED_F 0x00000001 + +#define GPU_FB_FBHUB_NUM_ACTIVE_LTCS 0x00100800 +#define GPU_FB_MMU_CTRL 0x00100c80 +#define GPU_FB_MMU_CTRL_VM_PG_SIZE_SHIFT 0x00000000 +#define GPU_FB_MMU_CTRL_VM_PG_SIZE_FIELDMASK 0x00000001 +#define GPU_FB_MMU_CTRL_VM_PG_SIZE_128KB_F 0x00000000 +#define GPU_FB_MMU_CTRL_VM_PG_SIZE_64KB_F 0x00000001 +#define GPU_FB_MMU_CTRL_PRI_FIFO_EMPTY_SHIFT 0x0000000f +#define GPU_FB_MMU_CTRL_PRI_FIFO_EMPTY_FIELDMASK 0x00000001 +#define GPU_FB_MMU_CTRL_PRI_FIFO_EMPTY_FALSE_F 0x00000000 +#define GPU_FB_MMU_CTRL_PRI_FIFO_SPACE_SHIFT 0x00000010 +#define GPU_FB_MMU_CTRL_PRI_FIFO_SPACE_FIELDMASK 0x000000ff +#define GPU_FB_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_SHIFT 0x0000000b +#define GPU_FB_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_FIELDMASK 0x00000001 +#define GPU_FB_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_TRUE_F 0x00000800 +#define GPU_FB_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_FALSE_F 0x00000000 +#define GPU_FB_MMU_CTRL_USE_FULL_COMP_TAG_LINE_SHIFT 0x0000000c +#define GPU_FB_MMU_CTRL_USE_FULL_COMP_TAG_LINE_FIELDMASK 0x00000001 +#define GPU_FB_MMU_CTRL_USE_FULL_COMP_TAG_LINE_TRUE_F 0x00001000 +#define GPU_FB_PRIV_MMU_PHY_SECURE 0x00100ce4 +#define GPU_FB_MMU_INVALIDATE_PDB 0x00100cb8 +#define GPU_FB_MMU_INVALIDATE_PDB_APERTURE_VID_MEM_F 0x00000000 +#define GPU_FB_MMU_INVALIDATE_PDB_APERTURE_SYS_MEM_F 0x00000002 +#define GPU_FB_MMU_INVALIDATE_PDB_ADDR_SHIFT 0x00000004 +#define GPU_FB_MMU_INVALIDATE_PDB_ADDR_FIELDMASK 0x0fffffff +#define GPU_FB_MMU_INVALIDATE 0x00100cbc +#define GPU_FB_MMU_INVALIDATE_ALL_VA_TRUE_F 0x00000001 +#define GPU_FB_MMU_INVALIDATE_ALL_PDB_TRUE_F 0x00000002 +#define GPU_FB_MMU_INVALIDATE_TRIGGER_SIZE 0x00000001 +#define GPU_FB_MMU_INVALIDATE_TRIGGER_SHIFT 0x0000001f +#define GPU_FB_MMU_INVALIDATE_TRIGGER_FIELDMASK 0x00000001 +#define GPU_FB_MMU_INVALIDATE_TRIGGER_MASK 0x80000000 +#define GPU_FB_MMU_INVALIDATE_TRIGGER_TRUE_F 0x80000000 +#define GPU_FB_MMU_DEBUG_WR 0x00100cc8 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_SIZE 0x00000002 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_SHIFT 0x00000000 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_FIELDMASK 0x00000003 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_MASK 0x00000003 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_VID_MEM_F 0x00000000 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_SYS_MEM_COH_F 0x00000002 +#define GPU_FB_MMU_DEBUG_WR_APERTURE_SYS_MEM_NCOH_F 0x00000003 +#define GPU_FB_MMU_DEBUG_WR_VOL_FALSE_F 0x00000000 +#define GPU_FB_MMU_DEBUG_WR_VOL_TRUE_V 0x00000001 +#define GPU_FB_MMU_DEBUG_WR_VOL_TRUE_F 0x00000004 +#define GPU_FB_MMU_DEBUG_WR_ADDR_SHIFT 0x00000004 +#define GPU_FB_MMU_DEBUG_WR_ADDR_FIELDMASK 0x0fffffff +#define GPU_FB_MMU_DEBUG_WR_ADDR_ALIGNMENT_V 0x0000000c +#define GPU_FB_MMU_DEBUG_RD 0x00100ccc +#define GPU_FB_MMU_DEBUG_RD_APERTURE_VID_MEM_F 0x00000000 +#define GPU_FB_MMU_DEBUG_RD_APERTURE_SYS_MEM_COH_F 0x00000002 +#define GPU_FB_MMU_DEBUG_RD_APERTURE_SYS_MEM_NCOH_F 0x00000003 +#define GPU_FB_MMU_DEBUG_RD_VOL_FALSE_F 0x00000000 +#define GPU_FB_MMU_DEBUG_RD_ADDR_SHIFT 0x00000004 +#define GPU_FB_MMU_DEBUG_RD_ADDR_FIELDMASK 0x0fffffff +#define GPU_FB_MMU_DEBUG_RD_ADDR_ALIGNMENT_V 0x0000000c +#define GPU_FB_MMU_DEBUG_CTRL 0x00100cc4 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_SHIFT 0x00000010 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_FIELDMASK 0x00000001 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_MASK 0x00010000 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_ENABLED_V 0x00000001 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_ENABLED_F 0x00010000 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_DISABLED_V 0x00000000 +#define GPU_FB_MMU_DEBUG_CTRL_DEBUG_DISABLED_F 0x00000000 +#define GPU_FB_MMU_VPR_INFO 0x00100cd0 +#define GPU_FB_MMU_VPR_INFO_INDEX_SHIFT 0x00000000 +#define GPU_FB_MMU_VPR_INFO_INDEX_FIELDMASK 0x00000003 +#define GPU_FB_MMU_VPR_INFO_INDEX_ADDR_LO_V 0x00000000 +#define GPU_FB_MMU_VPR_INFO_INDEX_ADDR_HI_V 0x00000001 +#define GPU_FB_MMU_VPR_INFO_INDEX_CYA_LO_V 0x00000002 +#define GPU_FB_MMU_VPR_INFO_INDEX_CYA_HI_V 0x00000003 +#define GPU_FB_MMU_VPR_INFO_FETCH_SHIFT 0x00000002 +#define GPU_FB_MMU_VPR_INFO_FETCH_FIELDMASK 0x00000001 +#define GPU_FB_MMU_VPR_INFO_FETCH_FALSE_V 0x00000000 +#define GPU_FB_MMU_VPR_INFO_FETCH_TRUE_V 0x00000001 +#define GPU_FB_MMU_WPR_INFO 0x00100cd4 +#define GPU_FB_MMU_WPR_INFO_INDEX_SHIFT 0x00000000 +#define GPU_FB_MMU_WPR_INFO_INDEX_FIELDMASK 0x0000000f +#define GPU_FB_MMU_WPR_INFO_INDEX_ALLOW_READ_V 0x00000000 +#define GPU_FB_MMU_WPR_INFO_INDEX_ALLOW_WRITE_V 0x00000001 +#define GPU_FB_MMU_WPR_INFO_INDEX_WPR1_ADDR_LO_V 0x00000002 +#define GPU_FB_MMU_WPR_INFO_INDEX_WPR1_ADDR_HI_V 0x00000003 +#define GPU_FB_MMU_WPR_INFO_INDEX_WPR2_ADDR_LO_V 0x00000004 +#define GPU_FB_MMU_WPR_INFO_INDEX_WPR2_ADDR_HI_V 0x00000005 + +#define GPU_FIFO_BAR1_BASE 0x00002254 +#define GPU_FIFO_BAR1_BASE_PTR_SHIFT 0x00000000 +#define GPU_FIFO_BAR1_BASE_PTR_FIELDMASK 0x0fffffff +#define GPU_FIFO_BAR1_BASE_PTR_ALIGN_SHIFT_V 0x0000000c +#define GPU_FIFO_BAR1_BASE_VALID_FALSE_F 0x00000000 +#define GPU_FIFO_BAR1_BASE_VALID_TRUE_F 0x10000000 +#define GPU_FIFO_RUNLIST_BASE 0x00002270 +#define GPU_FIFO_RUNLIST_BASE_PTR_SHIFT 0x00000000 +#define GPU_FIFO_RUNLIST_BASE_PTR_FIELDMASK 0x0fffffff +#define GPU_FIFO_RUNLIST_BASE_TARGET_VID_MEM_F 0x00000000 +#define GPU_FIFO_RUNLIST_BASE_TARGET_SYS_MEM_COH_F 0x20000000 +#define GPU_FIFO_RUNLIST_BASE_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_FIFO_RUNLIST 0x00002274 +#define GPU_FIFO_RUNLIST_ENGINE_SHIFT 0x00000014 +#define GPU_FIFO_RUNLIST_ENGINE_FIELDMASK 0x0000000f +#define GPU_FIFO_ENG_RUNLIST_BASE__BASE 0x00002280 +#define GPU_FIFO_ENG_RUNLIST_BASE__STRIDE 0x00000008 +#define GPU_FIFO_ENG_RUNLIST_BASE(i) (0x00002280 + (i) * 0x00000008) +#define GPU_FIFO_ENG_RUNLIST_BASE__SIZE_1_V 0x00000001 +#define GPU_FIFO_ENG_RUNLIST__BASE 0x00002284 +#define GPU_FIFO_ENG_RUNLIST__STRIDE 0x00000008 +#define GPU_FIFO_ENG_RUNLIST(i) (0x00002284 + (i) * 0x00000008) +#define GPU_FIFO_ENG_RUNLIST__SIZE_1_V 0x00000001 +#define GPU_FIFO_ENG_RUNLIST_LENGTH_SHIFT 0x00000000 +#define GPU_FIFO_ENG_RUNLIST_LENGTH_FIELDMASK 0x0000ffff +#define GPU_FIFO_ENG_RUNLIST_LENGTH_MAX_V 0x0000ffff +#define GPU_FIFO_ENG_RUNLIST_PENDING_TRUE_F 0x00100000 +#define GPU_FIFO_PB_TIMESLICE__BASE 0x00002350 +#define GPU_FIFO_PB_TIMESLICE__STRIDE 0x00000004 +#define GPU_FIFO_PB_TIMESLICE(i) (0x00002350 + (i) * 0x00000004) +#define GPU_FIFO_PB_TIMESLICE_TIMEOUT_16_F 0x00000010 +#define GPU_FIFO_PB_TIMESLICE_TIMESCALE_0_F 0x00000000 +#define GPU_FIFO_PB_TIMESLICE_ENABLE_TRUE_F 0x10000000 +#define GPU_FIFO_PBDMA_MAP__BASE 0x00002390 +#define GPU_FIFO_PBDMA_MAP__STRIDE 0x00000004 +#define GPU_FIFO_PBDMA_MAP(i) (0x00002390 + (i) * 0x00000004) +#define GPU_FIFO_INTR_0 0x00002100 +#define GPU_FIFO_INTR_0_BIND_ERROR_PENDING_F 0x00000001 +#define GPU_FIFO_INTR_0_BIND_ERROR_RESET_F 0x00000001 +#define GPU_FIFO_INTR_0_SCHED_ERROR_PENDING_F 0x00000100 +#define GPU_FIFO_INTR_0_SCHED_ERROR_RESET_F 0x00000100 +#define GPU_FIFO_INTR_0_CHSW_ERROR_PENDING_F 0x00010000 +#define GPU_FIFO_INTR_0_CHSW_ERROR_RESET_F 0x00010000 +#define GPU_FIFO_INTR_0_FB_FLUSH_TIMEOUT_PENDING_F 0x00800000 +#define GPU_FIFO_INTR_0_FB_FLUSH_TIMEOUT_RESET_F 0x00800000 +#define GPU_FIFO_INTR_0_LB_ERROR_PENDING_F 0x01000000 +#define GPU_FIFO_INTR_0_LB_ERROR_RESET_F 0x01000000 +#define GPU_FIFO_INTR_0_DROPPED_MMU_FAULT_PENDING_F 0x08000000 +#define GPU_FIFO_INTR_0_DROPPED_MMU_FAULT_RESET_F 0x08000000 +#define GPU_FIFO_INTR_0_MMU_FAULT_PENDING_F 0x10000000 +#define GPU_FIFO_INTR_0_PBDMA_INTR_PENDING_F 0x20000000 +#define GPU_FIFO_INTR_0_RUNLIST_EVENT_PENDING_F 0x40000000 +#define GPU_FIFO_INTR_0_CHANNEL_INTR_PENDING_F 0x80000000 +#define GPU_FIFO_INTR_EN_0 0x00002140 +#define GPU_FIFO_INTR_EN_0_SCHED_ERROR_SHIFT 0x00000008 +#define GPU_FIFO_INTR_EN_0_SCHED_ERROR_FIELDMASK 0x00000001 +#define GPU_FIFO_INTR_EN_0_SCHED_ERROR_MASK 0x00000100 +#define GPU_FIFO_INTR_EN_0_MMU_FAULT_SHIFT 0x0000001c +#define GPU_FIFO_INTR_EN_0_MMU_FAULT_FIELDMASK 0x00000001 +#define GPU_FIFO_INTR_EN_0_MMU_FAULT_MASK 0x10000000 +#define GPU_FIFO_INTR_EN_1 0x00002528 +#define GPU_FIFO_INTR_BIND_ERROR 0x0000252c +#define GPU_FIFO_INTR_SCHED_ERROR 0x0000254c +#define GPU_FIFO_INTR_SCHED_ERROR_CODE_SHIFT 0x00000000 +#define GPU_FIFO_INTR_SCHED_ERROR_CODE_FIELDMASK 0x000000ff +#define GPU_FIFO_INTR_SCHED_ERROR_CODE_CTXSW_TIMEOUT_V 0x0000000a +#define GPU_FIFO_INTR_CHSW_ERROR 0x0000256c +#define GPU_FIFO_INTR_MMU_FAULT_ID 0x0000259c +#define GPU_FIFO_INTR_MMU_FAULT_ENG_ID_GRAPHICS_V 0x00000000 +#define GPU_FIFO_INTR_MMU_FAULT_ENG_ID_GRAPHICS_F 0x00000000 +#define GPU_FIFO_INTR_MMU_FAULT_INST__BASE 0x00002800 +#define GPU_FIFO_INTR_MMU_FAULT_INST__STRIDE 0x00000010 +#define GPU_FIFO_INTR_MMU_FAULT_INST(i) (0x00002800 + (i) * 0x00000010) +#define GPU_FIFO_INTR_MMU_FAULT_INST_PTR_SHIFT 0x00000000 +#define GPU_FIFO_INTR_MMU_FAULT_INST_PTR_FIELDMASK 0x0fffffff +#define GPU_FIFO_INTR_MMU_FAULT_INST_PTR_ALIGN_SHIFT_V 0x0000000c +#define GPU_FIFO_INTR_MMU_FAULT_LO__BASE 0x00002804 +#define GPU_FIFO_INTR_MMU_FAULT_LO__STRIDE 0x00000010 +#define GPU_FIFO_INTR_MMU_FAULT_LO(i) (0x00002804 + (i) * 0x00000010) +#define GPU_FIFO_INTR_MMU_FAULT_HI__BASE 0x00002808 +#define GPU_FIFO_INTR_MMU_FAULT_HI__STRIDE 0x00000010 +#define GPU_FIFO_INTR_MMU_FAULT_HI(i) (0x00002808 + (i) * 0x00000010) +#define GPU_FIFO_INTR_MMU_FAULT_INFO__BASE 0x0000280c +#define GPU_FIFO_INTR_MMU_FAULT_INFO__STRIDE 0x00000010 +#define GPU_FIFO_INTR_MMU_FAULT_INFO(i) (0x0000280c + (i) * 0x00000010) +#define GPU_FIFO_INTR_MMU_FAULT_INFO_TYPE_SHIFT 0x00000000 +#define GPU_FIFO_INTR_MMU_FAULT_INFO_TYPE_FIELDMASK 0x0000000f +#define GPU_FIFO_INTR_MMU_FAULT_INFO_ENGINE_SUBID_SHIFT 0x00000006 +#define GPU_FIFO_INTR_MMU_FAULT_INFO_ENGINE_SUBID_FIELDMASK 0x00000001 +#define GPU_FIFO_INTR_MMU_FAULT_INFO_ENGINE_SUBID_GPC_V 0x00000000 +#define GPU_FIFO_INTR_MMU_FAULT_INFO_ENGINE_SUBID_HUB_V 0x00000001 +#define GPU_FIFO_INTR_MMU_FAULT_INFO_CLIENT_SHIFT 0x00000008 +#define GPU_FIFO_INTR_MMU_FAULT_INFO_CLIENT_FIELDMASK 0x0000003f +#define GPU_FIFO_INTR_PBDMA_ID 0x000025a0 +#define GPU_FIFO_INTR_PBDMA_ID_STATUS_FIELDMASK 0x00000001 +#define GPU_FIFO_INTR_PBDMA_ID_STATUS__SHIFT_BASE 0x00000000 +#define GPU_FIFO_INTR_PBDMA_ID_STATUS__SHIFT_STRIDE 0x00000001 +#define GPU_FIFO_INTR_PBDMA_ID_STATUS__SHIFT_I(i) (0 + (i) * 1) +#define GPU_FIFO_INTR_PBDMA_ID_STATUS__SIZE_1_V 0x00000001 +#define GPU_FIFO_INTR_RUNLIST 0x00002a00 +#define GPU_FIFO_FB_TIMEOUT 0x00002a04 +#define GPU_FIFO_FB_TIMEOUT_PERIOD_MASK 0x3fffffff +#define GPU_FIFO_FB_TIMEOUT_PERIOD_SHIFT 0x00000000 +#define GPU_FIFO_FB_TIMEOUT_PERIOD_FIELDMASK 0x3fffffff +#define GPU_FIFO_FB_TIMEOUT_PERIOD_MAX_F 0x3fffffff +#define GPU_FIFO_ERROR_SCHED_DISABLE 0x0000262c +#define GPU_FIFO_SCHED_DISABLE 0x00002630 +#define GPU_FIFO_SCHED_DISABLE_RUNLIST_FIELDMASK 0x00000001 +#define GPU_FIFO_SCHED_DISABLE_RUNLIST__SHIFT_BASE 0x00000000 +#define GPU_FIFO_SCHED_DISABLE_RUNLIST__SHIFT_STRIDE 0x00000001 +#define GPU_FIFO_SCHED_DISABLE_RUNLIST__SHIFT_I(i) (0 + (i) * 1) +#define GPU_FIFO_SCHED_DISABLE_TRUE_V 0x00000001 +#define GPU_FIFO_PREEMPT 0x00002634 +#define GPU_FIFO_PREEMPT_PENDING_TRUE_F 0x00100000 +#define GPU_FIFO_PREEMPT_TYPE_CHANNEL_F 0x00000000 +#define GPU_FIFO_PREEMPT_TYPE_TSG_F 0x01000000 +#define GPU_FIFO_PREEMPT_CHID_SHIFT 0x00000000 +#define GPU_FIFO_PREEMPT_CHID_FIELDMASK 0x00000fff +#define GPU_FIFO_PREEMPT_ID_SHIFT 0x00000000 +#define GPU_FIFO_PREEMPT_ID_FIELDMASK 0x00000fff +#define GPU_FIFO_TRIGGER_MMU_FAULT__BASE 0x00002a30 +#define GPU_FIFO_TRIGGER_MMU_FAULT__STRIDE 0x00000004 +#define GPU_FIFO_TRIGGER_MMU_FAULT(i) (0x00002a30 + (i) * 0x00000004) +#define GPU_FIFO_TRIGGER_MMU_FAULT_ID_SHIFT 0x00000000 +#define GPU_FIFO_TRIGGER_MMU_FAULT_ID_FIELDMASK 0x0000001f +#define GPU_FIFO_TRIGGER_MMU_FAULT_ENABLE_SHIFT 0x00000008 +#define GPU_FIFO_TRIGGER_MMU_FAULT_ENABLE_FIELDMASK 0x00000001 +#define GPU_FIFO_ENGINE_STATUS__BASE 0x00002640 +#define GPU_FIFO_ENGINE_STATUS__STRIDE 0x00000008 +#define GPU_FIFO_ENGINE_STATUS(i) (0x00002640 + (i) * 0x00000008) +#define GPU_FIFO_ENGINE_STATUS__SIZE_1_V 0x00000002 +#define GPU_FIFO_ENGINE_STATUS_ID_SHIFT 0x00000000 +#define GPU_FIFO_ENGINE_STATUS_ID_FIELDMASK 0x00000fff +#define GPU_FIFO_ENGINE_STATUS_ID_TYPE_SHIFT 0x0000000c +#define GPU_FIFO_ENGINE_STATUS_ID_TYPE_FIELDMASK 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_ID_TYPE_CHID_V 0x00000000 +#define GPU_FIFO_ENGINE_STATUS_ID_TYPE_TSGID_V 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_SHIFT 0x0000000d +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_FIELDMASK 0x00000007 +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_INVALID_V 0x00000000 +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_VALID_V 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_CTXSW_LOAD_V 0x00000005 +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_CTXSW_SAVE_V 0x00000006 +#define GPU_FIFO_ENGINE_STATUS_CTX_STATUS_CTXSW_SWITCH_V 0x00000007 +#define GPU_FIFO_ENGINE_STATUS_NEXT_ID_SHIFT 0x00000010 +#define GPU_FIFO_ENGINE_STATUS_NEXT_ID_FIELDMASK 0x00000fff +#define GPU_FIFO_ENGINE_STATUS_NEXT_ID_TYPE_SHIFT 0x0000001c +#define GPU_FIFO_ENGINE_STATUS_NEXT_ID_TYPE_FIELDMASK 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_NEXT_ID_TYPE_CHID_V 0x00000000 +#define GPU_FIFO_ENGINE_STATUS_FAULTED_SHIFT 0x0000001e +#define GPU_FIFO_ENGINE_STATUS_FAULTED_FIELDMASK 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_FAULTED_TRUE_V 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_ENGINE_SHIFT 0x0000001f +#define GPU_FIFO_ENGINE_STATUS_ENGINE_FIELDMASK 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_ENGINE_IDLE_V 0x00000000 +#define GPU_FIFO_ENGINE_STATUS_ENGINE_BUSY_V 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_CTXSW_SHIFT 0x0000000f +#define GPU_FIFO_ENGINE_STATUS_CTXSW_FIELDMASK 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_CTXSW_IN_PROGRESS_V 0x00000001 +#define GPU_FIFO_ENGINE_STATUS_CTXSW_IN_PROGRESS_F 0x00008000 +#define GPU_FIFO_PBDMA_STATUS__BASE 0x00003080 +#define GPU_FIFO_PBDMA_STATUS__STRIDE 0x00000004 +#define GPU_FIFO_PBDMA_STATUS(i) (0x00003080 + (i) * 0x00000004) +#define GPU_FIFO_PBDMA_STATUS__SIZE_1_V 0x00000001 +#define GPU_FIFO_PBDMA_STATUS_ID_SHIFT 0x00000000 +#define GPU_FIFO_PBDMA_STATUS_ID_FIELDMASK 0x00000fff +#define GPU_FIFO_PBDMA_STATUS_ID_TYPE_SHIFT 0x0000000c +#define GPU_FIFO_PBDMA_STATUS_ID_TYPE_FIELDMASK 0x00000001 +#define GPU_FIFO_PBDMA_STATUS_ID_TYPE_CHID_V 0x00000000 +#define GPU_FIFO_PBDMA_STATUS_ID_TYPE_TSGID_V 0x00000001 +#define GPU_FIFO_PBDMA_STATUS_CHAN_STATUS_SHIFT 0x0000000d +#define GPU_FIFO_PBDMA_STATUS_CHAN_STATUS_FIELDMASK 0x00000007 +#define GPU_FIFO_PBDMA_STATUS_CHAN_STATUS_VALID_V 0x00000001 +#define GPU_FIFO_PBDMA_STATUS_CHAN_STATUS_CHSW_LOAD_V 0x00000005 +#define GPU_FIFO_PBDMA_STATUS_CHAN_STATUS_CHSW_SAVE_V 0x00000006 +#define GPU_FIFO_PBDMA_STATUS_CHAN_STATUS_CHSW_SWITCH_V 0x00000007 +#define GPU_FIFO_PBDMA_STATUS_NEXT_ID_SHIFT 0x00000010 +#define GPU_FIFO_PBDMA_STATUS_NEXT_ID_FIELDMASK 0x00000fff +#define GPU_FIFO_PBDMA_STATUS_NEXT_ID_TYPE_SHIFT 0x0000001c +#define GPU_FIFO_PBDMA_STATUS_NEXT_ID_TYPE_FIELDMASK 0x00000001 +#define GPU_FIFO_PBDMA_STATUS_NEXT_ID_TYPE_CHID_V 0x00000000 +#define GPU_FIFO_PBDMA_STATUS_CHSW_SHIFT 0x0000000f +#define GPU_FIFO_PBDMA_STATUS_CHSW_FIELDMASK 0x00000001 +#define GPU_FIFO_PBDMA_STATUS_CHSW_IN_PROGRESS_V 0x00000001 + +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE 0x00070004 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_PENDING_SHIFT 0x00000000 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_PENDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_PENDING_BUSY_V 0x00000001 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_PENDING_BUSY_F 0x00000001 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_OUTSTANDING_SHIFT 0x00000001 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_OUTSTANDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_L2_SYSTEM_INVALIDATE_OUTSTANDING_TRUE_V 0x00000001 +#define GPU_FLUSH_L2_FLUSH_DIRTY 0x00070010 +#define GPU_FLUSH_L2_FLUSH_DIRTY_PENDING_SHIFT 0x00000000 +#define GPU_FLUSH_L2_FLUSH_DIRTY_PENDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_L2_FLUSH_DIRTY_PENDING_EMPTY_V 0x00000000 +#define GPU_FLUSH_L2_FLUSH_DIRTY_PENDING_EMPTY_F 0x00000000 +#define GPU_FLUSH_L2_FLUSH_DIRTY_PENDING_BUSY_V 0x00000001 +#define GPU_FLUSH_L2_FLUSH_DIRTY_PENDING_BUSY_F 0x00000001 +#define GPU_FLUSH_L2_FLUSH_DIRTY_OUTSTANDING_SHIFT 0x00000001 +#define GPU_FLUSH_L2_FLUSH_DIRTY_OUTSTANDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_L2_FLUSH_DIRTY_OUTSTANDING_FALSE_V 0x00000000 +#define GPU_FLUSH_L2_FLUSH_DIRTY_OUTSTANDING_FALSE_F 0x00000000 +#define GPU_FLUSH_L2_FLUSH_DIRTY_OUTSTANDING_TRUE_V 0x00000001 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS 0x0007000c +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_PENDING_SHIFT 0x00000000 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_PENDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_PENDING_EMPTY_V 0x00000000 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_PENDING_EMPTY_F 0x00000000 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_PENDING_BUSY_V 0x00000001 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_PENDING_BUSY_F 0x00000001 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_OUTSTANDING_SHIFT 0x00000001 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_OUTSTANDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_OUTSTANDING_FALSE_V 0x00000000 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_OUTSTANDING_FALSE_F 0x00000000 +#define GPU_FLUSH_L2_CLEAN_COMPTAGS_OUTSTANDING_TRUE_V 0x00000001 +#define GPU_FLUSH_FB_FLUSH 0x00070000 +#define GPU_FLUSH_FB_FLUSH_PENDING_SHIFT 0x00000000 +#define GPU_FLUSH_FB_FLUSH_PENDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_FB_FLUSH_PENDING_BUSY_V 0x00000001 +#define GPU_FLUSH_FB_FLUSH_PENDING_BUSY_F 0x00000001 +#define GPU_FLUSH_FB_FLUSH_OUTSTANDING_SHIFT 0x00000001 +#define GPU_FLUSH_FB_FLUSH_OUTSTANDING_FIELDMASK 0x00000001 +#define GPU_FLUSH_FB_FLUSH_OUTSTANDING_TRUE_V 0x00000001 + +#define GPU_FUSE_STATUS_OPT_TPC_GPC__BASE 0x00021c38 +#define GPU_FUSE_STATUS_OPT_TPC_GPC__STRIDE 0x00000004 +#define GPU_FUSE_STATUS_OPT_TPC_GPC(i) (0x00021c38 + (i) * 0x00000004) +#define GPU_FUSE_CTRL_OPT_TPC_GPC__BASE 0x00021838 +#define GPU_FUSE_CTRL_OPT_TPC_GPC__STRIDE 0x00000004 +#define GPU_FUSE_CTRL_OPT_TPC_GPC(i) (0x00021838 + (i) * 0x00000004) +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP 0x00021944 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_DATA_SHIFT 0x00000000 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_DATA_FIELDMASK 0x00000003 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_DATA_MASK 0x00000003 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_OVERRIDE 0x00021948 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_OVERRIDE_DATA_SHIFT 0x00000000 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_OVERRIDE_DATA_FIELDMASK 0x00000001 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_OVERRIDE_DATA_MASK 0x00000001 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_OVERRIDE_DATA_YES_F 0x00000001 +#define GPU_FUSE_CTRL_OPT_RAM_SVOP_PDP_OVERRIDE_DATA_NO_F 0x00000000 +#define GPU_FUSE_STATUS_OPT_FBIO 0x00021c14 +#define GPU_FUSE_STATUS_OPT_FBIO_DATA_SHIFT 0x00000000 +#define GPU_FUSE_STATUS_OPT_FBIO_DATA_FIELDMASK 0x0000ffff +#define GPU_FUSE_STATUS_OPT_FBIO_DATA_MASK 0x0000ffff +#define GPU_FUSE_STATUS_OPT_ROP_L2_FBP__BASE 0x00021d70 +#define GPU_FUSE_STATUS_OPT_ROP_L2_FBP__STRIDE 0x00000004 +#define GPU_FUSE_STATUS_OPT_ROP_L2_FBP(i) (0x00021d70 + (i) * 0x00000004) +#define GPU_FUSE_STATUS_OPT_FBP 0x00021d38 +#define GPU_FUSE_STATUS_OPT_FBP_IDX_FIELDMASK 0x00000001 +#define GPU_FUSE_STATUS_OPT_FBP_IDX__SHIFT_BASE 0x00000000 +#define GPU_FUSE_STATUS_OPT_FBP_IDX__SHIFT_STRIDE 0x00000000 +#define GPU_FUSE_STATUS_OPT_FBP_IDX__SHIFT_I(i) (0 + (i) * 0) +#define GPU_FUSE_OPT_SEC_DEBUG_EN 0x00021218 +#define GPU_FUSE_OPT_PRIV_SEC_EN 0x00021434 + +#define GPU_GMMU_PDE_APERTURE_BIG_W 0x00000000 +#define GPU_GMMU_PDE_APERTURE_BIG_INVALID_F 0x00000000 +#define GPU_GMMU_PDE_APERTURE_BIG_VIDEO_MEMORY_F 0x00000001 +#define GPU_GMMU_PDE_APERTURE_BIG_SYS_MEM_COH_F 0x00000002 +#define GPU_GMMU_PDE_APERTURE_BIG_SYS_MEM_NCOH_F 0x00000003 +#define GPU_GMMU_PDE_SIZE_W 0x00000000 +#define GPU_GMMU_PDE_SIZE_FULL_F 0x00000000 +#define GPU_GMMU_PDE_ADDRESS_BIG_SYS_SHIFT 0x00000004 +#define GPU_GMMU_PDE_ADDRESS_BIG_SYS_FIELDMASK 0x0fffffff +#define GPU_GMMU_PDE_ADDRESS_BIG_SYS_W 0x00000000 +#define GPU_GMMU_PDE_APERTURE_SMALL_W 0x00000001 +#define GPU_GMMU_PDE_APERTURE_SMALL_INVALID_F 0x00000000 +#define GPU_GMMU_PDE_APERTURE_SMALL_VIDEO_MEMORY_F 0x00000001 +#define GPU_GMMU_PDE_APERTURE_SMALL_SYS_MEM_COH_F 0x00000002 +#define GPU_GMMU_PDE_APERTURE_SMALL_SYS_MEM_NCOH_F 0x00000003 +#define GPU_GMMU_PDE_VOL_SMALL_W 0x00000001 +#define GPU_GMMU_PDE_VOL_SMALL_TRUE_F 0x00000004 +#define GPU_GMMU_PDE_VOL_SMALL_FALSE_F 0x00000000 +#define GPU_GMMU_PDE_VOL_BIG_W 0x00000001 +#define GPU_GMMU_PDE_VOL_BIG_TRUE_F 0x00000008 +#define GPU_GMMU_PDE_VOL_BIG_FALSE_F 0x00000000 +#define GPU_GMMU_PDE_ADDRESS_SMALL_SYS_SHIFT 0x00000004 +#define GPU_GMMU_PDE_ADDRESS_SMALL_SYS_FIELDMASK 0x0fffffff +#define GPU_GMMU_PDE_ADDRESS_SMALL_SYS_W 0x00000001 +#define GPU_GMMU_PDE_ADDRESS_SHIFT_V 0x0000000c +#define GPU_GMMU_PDE__SIZE_V 0x00000008 +#define GPU_GMMU_PTE__SIZE_V 0x00000008 +#define GPU_GMMU_PTE_VALID_W 0x00000000 +#define GPU_GMMU_PTE_VALID_TRUE_F 0x00000001 +#define GPU_GMMU_PTE_VALID_FALSE_F 0x00000000 +#define GPU_GMMU_PTE_PRIVILEGE_W 0x00000000 +#define GPU_GMMU_PTE_PRIVILEGE_TRUE_F 0x00000002 +#define GPU_GMMU_PTE_PRIVILEGE_FALSE_F 0x00000000 +#define GPU_GMMU_PTE_ADDRESS_SYS_SHIFT 0x00000004 +#define GPU_GMMU_PTE_ADDRESS_SYS_FIELDMASK 0x0fffffff +#define GPU_GMMU_PTE_ADDRESS_SYS_W 0x00000000 +#define GPU_GMMU_PTE_VOL_W 0x00000001 +#define GPU_GMMU_PTE_VOL_TRUE_F 0x00000001 +#define GPU_GMMU_PTE_VOL_FALSE_F 0x00000000 +#define GPU_GMMU_PTE_APERTURE_W 0x00000001 +#define GPU_GMMU_PTE_APERTURE_VIDEO_MEMORY_F 0x00000000 +#define GPU_GMMU_PTE_APERTURE_SYS_MEM_COH_F 0x00000004 +#define GPU_GMMU_PTE_APERTURE_SYS_MEM_NCOH_F 0x00000006 +#define GPU_GMMU_PTE_READ_ONLY_W 0x00000000 +#define GPU_GMMU_PTE_READ_ONLY_TRUE_F 0x00000004 +#define GPU_GMMU_PTE_WRITE_DISABLE_W 0x00000001 +#define GPU_GMMU_PTE_WRITE_DISABLE_TRUE_F 0x80000000 +#define GPU_GMMU_PTE_READ_DISABLE_W 0x00000001 +#define GPU_GMMU_PTE_READ_DISABLE_TRUE_F 0x40000000 +#define GPU_GMMU_PTE_COMPTAGLINE_SIZE 0x00000011 +#define GPU_GMMU_PTE_COMPTAGLINE_SHIFT 0x0000000c +#define GPU_GMMU_PTE_COMPTAGLINE_FIELDMASK 0x0001ffff +#define GPU_GMMU_PTE_COMPTAGLINE_W 0x00000001 +#define GPU_GMMU_PTE_ADDRESS_SHIFT_V 0x0000000c +#define GPU_GMMU_PTE_KIND_SHIFT 0x00000004 +#define GPU_GMMU_PTE_KIND_FIELDMASK 0x000000ff +#define GPU_GMMU_PTE_KIND_W 0x00000001 +#define GPU_GMMU_PTE_KIND_INVALID_V 0x000000ff +#define GPU_GMMU_PTE_KIND_PITCH_V 0x00000000 +#define GPU_GMMU_PTE_KIND_Z16_V 0x00000001 +#define GPU_GMMU_PTE_KIND_Z16_2C_V 0x00000002 +#define GPU_GMMU_PTE_KIND_Z16_MS2_2C_V 0x00000003 +#define GPU_GMMU_PTE_KIND_Z16_MS4_2C_V 0x00000004 +#define GPU_GMMU_PTE_KIND_Z16_MS8_2C_V 0x00000005 +#define GPU_GMMU_PTE_KIND_Z16_MS16_2C_V 0x00000006 +#define GPU_GMMU_PTE_KIND_Z16_2Z_V 0x00000007 +#define GPU_GMMU_PTE_KIND_Z16_MS2_2Z_V 0x00000008 +#define GPU_GMMU_PTE_KIND_Z16_MS4_2Z_V 0x00000009 +#define GPU_GMMU_PTE_KIND_Z16_MS8_2Z_V 0x0000000a +#define GPU_GMMU_PTE_KIND_Z16_MS16_2Z_V 0x0000000b +#define GPU_GMMU_PTE_KIND_Z16_4CZ_V 0x0000000c +#define GPU_GMMU_PTE_KIND_Z16_MS2_4CZ_V 0x0000000d +#define GPU_GMMU_PTE_KIND_Z16_MS4_4CZ_V 0x0000000e +#define GPU_GMMU_PTE_KIND_Z16_MS8_4CZ_V 0x0000000f +#define GPU_GMMU_PTE_KIND_Z16_MS16_4CZ_V 0x00000010 +#define GPU_GMMU_PTE_KIND_S8Z24_V 0x00000011 +#define GPU_GMMU_PTE_KIND_S8Z24_1Z_V 0x00000012 +#define GPU_GMMU_PTE_KIND_S8Z24_MS2_1Z_V 0x00000013 +#define GPU_GMMU_PTE_KIND_S8Z24_MS4_1Z_V 0x00000014 +#define GPU_GMMU_PTE_KIND_S8Z24_MS8_1Z_V 0x00000015 +#define GPU_GMMU_PTE_KIND_S8Z24_MS16_1Z_V 0x00000016 +#define GPU_GMMU_PTE_KIND_S8Z24_2CZ_V 0x00000017 +#define GPU_GMMU_PTE_KIND_S8Z24_MS2_2CZ_V 0x00000018 +#define GPU_GMMU_PTE_KIND_S8Z24_MS4_2CZ_V 0x00000019 +#define GPU_GMMU_PTE_KIND_S8Z24_MS8_2CZ_V 0x0000001a +#define GPU_GMMU_PTE_KIND_S8Z24_MS16_2CZ_V 0x0000001b +#define GPU_GMMU_PTE_KIND_S8Z24_2CS_V 0x0000001c +#define GPU_GMMU_PTE_KIND_S8Z24_MS2_2CS_V 0x0000001d +#define GPU_GMMU_PTE_KIND_S8Z24_MS4_2CS_V 0x0000001e +#define GPU_GMMU_PTE_KIND_S8Z24_MS8_2CS_V 0x0000001f +#define GPU_GMMU_PTE_KIND_S8Z24_MS16_2CS_V 0x00000020 +#define GPU_GMMU_PTE_KIND_S8Z24_4CSZV_V 0x00000021 +#define GPU_GMMU_PTE_KIND_S8Z24_MS2_4CSZV_V 0x00000022 +#define GPU_GMMU_PTE_KIND_S8Z24_MS4_4CSZV_V 0x00000023 +#define GPU_GMMU_PTE_KIND_S8Z24_MS8_4CSZV_V 0x00000024 +#define GPU_GMMU_PTE_KIND_S8Z24_MS16_4CSZV_V 0x00000025 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC12_V 0x00000026 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC4_V 0x00000027 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC8_V 0x00000028 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC24_V 0x00000029 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC12_1ZV_V 0x0000002e +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC4_1ZV_V 0x0000002f +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC8_1ZV_V 0x00000030 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC24_1ZV_V 0x00000031 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC12_2CS_V 0x00000032 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC4_2CS_V 0x00000033 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC8_2CS_V 0x00000034 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC24_2CS_V 0x00000035 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC12_2CZV_V 0x0000003a +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC4_2CZV_V 0x0000003b +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC8_2CZV_V 0x0000003c +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC24_2CZV_V 0x0000003d +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC12_2ZV_V 0x0000003e +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC4_2ZV_V 0x0000003f +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC8_2ZV_V 0x00000040 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC24_2ZV_V 0x00000041 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC12_4CSZV_V 0x00000042 +#define GPU_GMMU_PTE_KIND_V8Z24_MS4_VC4_4CSZV_V 0x00000043 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC8_4CSZV_V 0x00000044 +#define GPU_GMMU_PTE_KIND_V8Z24_MS8_VC24_4CSZV_V 0x00000045 +#define GPU_GMMU_PTE_KIND_Z24S8_V 0x00000046 +#define GPU_GMMU_PTE_KIND_Z24S8_1Z_V 0x00000047 +#define GPU_GMMU_PTE_KIND_Z24S8_MS2_1Z_V 0x00000048 +#define GPU_GMMU_PTE_KIND_Z24S8_MS4_1Z_V 0x00000049 +#define GPU_GMMU_PTE_KIND_Z24S8_MS8_1Z_V 0x0000004a +#define GPU_GMMU_PTE_KIND_Z24S8_MS16_1Z_V 0x0000004b +#define GPU_GMMU_PTE_KIND_Z24S8_2CS_V 0x0000004c +#define GPU_GMMU_PTE_KIND_Z24S8_MS2_2CS_V 0x0000004d +#define GPU_GMMU_PTE_KIND_Z24S8_MS4_2CS_V 0x0000004e +#define GPU_GMMU_PTE_KIND_Z24S8_MS8_2CS_V 0x0000004f +#define GPU_GMMU_PTE_KIND_Z24S8_MS16_2CS_V 0x00000050 +#define GPU_GMMU_PTE_KIND_Z24S8_2CZ_V 0x00000051 +#define GPU_GMMU_PTE_KIND_Z24S8_MS2_2CZ_V 0x00000052 +#define GPU_GMMU_PTE_KIND_Z24S8_MS4_2CZ_V 0x00000053 +#define GPU_GMMU_PTE_KIND_Z24S8_MS8_2CZ_V 0x00000054 +#define GPU_GMMU_PTE_KIND_Z24S8_MS16_2CZ_V 0x00000055 +#define GPU_GMMU_PTE_KIND_Z24S8_4CSZV_V 0x00000056 +#define GPU_GMMU_PTE_KIND_Z24S8_MS2_4CSZV_V 0x00000057 +#define GPU_GMMU_PTE_KIND_Z24S8_MS4_4CSZV_V 0x00000058 +#define GPU_GMMU_PTE_KIND_Z24S8_MS8_4CSZV_V 0x00000059 +#define GPU_GMMU_PTE_KIND_Z24S8_MS16_4CSZV_V 0x0000005a +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC12_V 0x0000005b +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC4_V 0x0000005c +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC8_V 0x0000005d +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC24_V 0x0000005e +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC12_1ZV_V 0x00000063 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC4_1ZV_V 0x00000064 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC8_1ZV_V 0x00000065 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC24_1ZV_V 0x00000066 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC12_2CS_V 0x00000067 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC4_2CS_V 0x00000068 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC8_2CS_V 0x00000069 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC24_2CS_V 0x0000006a +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC12_2CZV_V 0x0000006f +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC4_2CZV_V 0x00000070 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC8_2CZV_V 0x00000071 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC24_2CZV_V 0x00000072 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC12_2ZV_V 0x00000073 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC4_2ZV_V 0x00000074 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC8_2ZV_V 0x00000075 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC24_2ZV_V 0x00000076 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC12_4CSZV_V 0x00000077 +#define GPU_GMMU_PTE_KIND_Z24V8_MS4_VC4_4CSZV_V 0x00000078 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC8_4CSZV_V 0x00000079 +#define GPU_GMMU_PTE_KIND_Z24V8_MS8_VC24_4CSZV_V 0x0000007a +#define GPU_GMMU_PTE_KIND_ZF32_V 0x0000007b +#define GPU_GMMU_PTE_KIND_ZF32_1Z_V 0x0000007c +#define GPU_GMMU_PTE_KIND_ZF32_MS2_1Z_V 0x0000007d +#define GPU_GMMU_PTE_KIND_ZF32_MS4_1Z_V 0x0000007e +#define GPU_GMMU_PTE_KIND_ZF32_MS8_1Z_V 0x0000007f +#define GPU_GMMU_PTE_KIND_ZF32_MS16_1Z_V 0x00000080 +#define GPU_GMMU_PTE_KIND_ZF32_2CS_V 0x00000081 +#define GPU_GMMU_PTE_KIND_ZF32_MS2_2CS_V 0x00000082 +#define GPU_GMMU_PTE_KIND_ZF32_MS4_2CS_V 0x00000083 +#define GPU_GMMU_PTE_KIND_ZF32_MS8_2CS_V 0x00000084 +#define GPU_GMMU_PTE_KIND_ZF32_MS16_2CS_V 0x00000085 +#define GPU_GMMU_PTE_KIND_ZF32_2CZ_V 0x00000086 +#define GPU_GMMU_PTE_KIND_ZF32_MS2_2CZ_V 0x00000087 +#define GPU_GMMU_PTE_KIND_ZF32_MS4_2CZ_V 0x00000088 +#define GPU_GMMU_PTE_KIND_ZF32_MS8_2CZ_V 0x00000089 +#define GPU_GMMU_PTE_KIND_ZF32_MS16_2CZ_V 0x0000008a +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_V 0x0000008b +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_V 0x0000008c +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_V 0x0000008d +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_V 0x0000008e +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_1CS_V 0x0000008f +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_1CS_V 0x00000090 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_1CS_V 0x00000091 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_1CS_V 0x00000092 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_1ZV_V 0x00000097 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_1ZV_V 0x00000098 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_1ZV_V 0x00000099 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_1ZV_V 0x0000009a +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_1CZV_V 0x0000009b +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_1CZV_V 0x0000009c +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_1CZV_V 0x0000009d +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_1CZV_V 0x0000009e +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_2CS_V 0x0000009f +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_2CS_V 0x000000a0 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_2CS_V 0x000000a1 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_2CS_V 0x000000a2 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_2CSZV_V 0x000000a3 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_2CSZV_V 0x000000a4 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_2CSZV_V 0x000000a5 +#define GPU_GMMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_2CSZV_V 0x000000a6 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_V 0x000000a7 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_V 0x000000a8 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_V 0x000000a9 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_V 0x000000aa +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_1CS_V 0x000000ab +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_1CS_V 0x000000ac +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_1CS_V 0x000000ad +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_1CS_V 0x000000ae +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_1ZV_V 0x000000b3 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_1ZV_V 0x000000b4 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_1ZV_V 0x000000b5 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_1ZV_V 0x000000b6 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_1CZV_V 0x000000b7 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_1CZV_V 0x000000b8 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_1CZV_V 0x000000b9 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_1CZV_V 0x000000ba +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_2CS_V 0x000000bb +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_2CS_V 0x000000bc +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_2CS_V 0x000000bd +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_2CS_V 0x000000be +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_2CSZV_V 0x000000bf +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_2CSZV_V 0x000000c0 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_2CSZV_V 0x000000c1 +#define GPU_GMMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_2CSZV_V 0x000000c2 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_V 0x000000c3 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_1CS_V 0x000000c4 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS2_1CS_V 0x000000c5 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS4_1CS_V 0x000000c6 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS8_1CS_V 0x000000c7 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS16_1CS_V 0x000000c8 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_2CSZV_V 0x000000ce +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS2_2CSZV_V 0x000000cf +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS4_2CSZV_V 0x000000d0 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS8_2CSZV_V 0x000000d1 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS16_2CSZV_V 0x000000d2 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_2CS_V 0x000000d3 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS2_2CS_V 0x000000d4 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS4_2CS_V 0x000000d5 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS8_2CS_V 0x000000d6 +#define GPU_GMMU_PTE_KIND_ZF32_X24S8_MS16_2CS_V 0x000000d7 +#define GPU_GMMU_PTE_KIND_GENERIC_16BX2_V 0x000000fe +#define GPU_GMMU_PTE_KIND_C32_2C_V 0x000000d8 +#define GPU_GMMU_PTE_KIND_C32_2CBR_V 0x000000d9 +#define GPU_GMMU_PTE_KIND_C32_2CBA_V 0x000000da +#define GPU_GMMU_PTE_KIND_C32_2CRA_V 0x000000db +#define GPU_GMMU_PTE_KIND_C32_2BRA_V 0x000000dc +#define GPU_GMMU_PTE_KIND_C32_MS2_2C_V 0x000000dd +#define GPU_GMMU_PTE_KIND_C32_MS2_2CBR_V 0x000000de +#define GPU_GMMU_PTE_KIND_C32_MS2_2CRA_V 0x000000cc +#define GPU_GMMU_PTE_KIND_C32_MS4_2C_V 0x000000df +#define GPU_GMMU_PTE_KIND_C32_MS4_2CBR_V 0x000000e0 +#define GPU_GMMU_PTE_KIND_C32_MS4_2CBA_V 0x000000e1 +#define GPU_GMMU_PTE_KIND_C32_MS4_2CRA_V 0x000000e2 +#define GPU_GMMU_PTE_KIND_C32_MS4_2BRA_V 0x000000e3 +#define GPU_GMMU_PTE_KIND_C32_MS8_MS16_2C_V 0x000000e4 +#define GPU_GMMU_PTE_KIND_C32_MS8_MS16_2CRA_V 0x000000e5 +#define GPU_GMMU_PTE_KIND_C64_2C_V 0x000000e6 +#define GPU_GMMU_PTE_KIND_C64_2CBR_V 0x000000e7 +#define GPU_GMMU_PTE_KIND_C64_2CBA_V 0x000000e8 +#define GPU_GMMU_PTE_KIND_C64_2CRA_V 0x000000e9 +#define GPU_GMMU_PTE_KIND_C64_2BRA_V 0x000000ea +#define GPU_GMMU_PTE_KIND_C64_MS2_2C_V 0x000000eb +#define GPU_GMMU_PTE_KIND_C64_MS2_2CBR_V 0x000000ec +#define GPU_GMMU_PTE_KIND_C64_MS2_2CRA_V 0x000000cd +#define GPU_GMMU_PTE_KIND_C64_MS4_2C_V 0x000000ed +#define GPU_GMMU_PTE_KIND_C64_MS4_2CBR_V 0x000000ee +#define GPU_GMMU_PTE_KIND_C64_MS4_2CBA_V 0x000000ef +#define GPU_GMMU_PTE_KIND_C64_MS4_2CRA_V 0x000000f0 +#define GPU_GMMU_PTE_KIND_C64_MS4_2BRA_V 0x000000f1 +#define GPU_GMMU_PTE_KIND_C64_MS8_MS16_2C_V 0x000000f2 +#define GPU_GMMU_PTE_KIND_C64_MS8_MS16_2CRA_V 0x000000f3 +#define GPU_GMMU_PTE_KIND_C128_2C_V 0x000000f4 +#define GPU_GMMU_PTE_KIND_C128_2CR_V 0x000000f5 +#define GPU_GMMU_PTE_KIND_C128_MS2_2C_V 0x000000f6 +#define GPU_GMMU_PTE_KIND_C128_MS2_2CR_V 0x000000f7 +#define GPU_GMMU_PTE_KIND_C128_MS4_2C_V 0x000000f8 +#define GPU_GMMU_PTE_KIND_C128_MS4_2CR_V 0x000000f9 +#define GPU_GMMU_PTE_KIND_C128_MS8_MS16_2C_V 0x000000fa +#define GPU_GMMU_PTE_KIND_C128_MS8_MS16_2CR_V 0x000000fb +#define GPU_GMMU_PTE_KIND_X8C24_V 0x000000fc +#define GPU_GMMU_PTE_KIND_PITCH_NO_SWIZZLE_V 0x000000fd +#define GPU_GMMU_PTE_KIND_SMSKED_MESSAGE_V 0x000000ca +#define GPU_GMMU_PTE_KIND_SMHOST_MESSAGE_V 0x000000cb +#define GPU_GMMU_PTE_KIND_S8_V 0x0000002a +#define GPU_GMMU_PTE_KIND_S8_2S_V 0x0000002b + +#define GPU_GR_INTR 0x00400100 +#define GPU_GR_INTR_NOTIFY_PENDING_F 0x00000001 +#define GPU_GR_INTR_NOTIFY_RESET_F 0x00000001 +#define GPU_GR_INTR_SEMAPHORE_PENDING_F 0x00000002 +#define GPU_GR_INTR_SEMAPHORE_RESET_F 0x00000002 +#define GPU_GR_INTR_ILLEGAL_METHOD_PENDING_F 0x00000010 +#define GPU_GR_INTR_ILLEGAL_METHOD_RESET_F 0x00000010 +#define GPU_GR_INTR_ILLEGAL_NOTIFY_PENDING_F 0x00000040 +#define GPU_GR_INTR_ILLEGAL_NOTIFY_RESET_F 0x00000040 +#define GPU_GR_INTR_FIRMWARE_METHOD_SHIFT 0x00000008 +#define GPU_GR_INTR_FIRMWARE_METHOD_FIELDMASK 0x00000001 +#define GPU_GR_INTR_FIRMWARE_METHOD_PENDING_F 0x00000100 +#define GPU_GR_INTR_FIRMWARE_METHOD_RESET_F 0x00000100 +#define GPU_GR_INTR_ILLEGAL_CLASS_PENDING_F 0x00000020 +#define GPU_GR_INTR_ILLEGAL_CLASS_RESET_F 0x00000020 +#define GPU_GR_INTR_FECS_ERROR_PENDING_F 0x00080000 +#define GPU_GR_INTR_FECS_ERROR_RESET_F 0x00080000 +#define GPU_GR_INTR_CLASS_ERROR_PENDING_F 0x00100000 +#define GPU_GR_INTR_CLASS_ERROR_RESET_F 0x00100000 +#define GPU_GR_INTR_EXCEPTION_PENDING_F 0x00200000 +#define GPU_GR_INTR_EXCEPTION_RESET_F 0x00200000 +#define GPU_GR_FECS_INTR 0x00400144 +#define GPU_GR_CLASS_ERROR 0x00400110 +#define GPU_GR_CLASS_ERROR_CODE_SHIFT 0x00000000 +#define GPU_GR_CLASS_ERROR_CODE_FIELDMASK 0x0000ffff +#define GPU_GR_INTR_NONSTALL 0x00400120 +#define GPU_GR_INTR_NONSTALL_TRAP_PENDING_F 0x00000002 +#define GPU_GR_INTR_EN 0x0040013c +#define GPU_GR_EXCEPTION 0x00400108 +#define GPU_GR_EXCEPTION_FE_MASK 0x00000001 +#define GPU_GR_EXCEPTION_FE_SHIFT 0x00000000 +#define GPU_GR_EXCEPTION_FE_FIELDMASK 0x00000001 +#define GPU_GR_EXCEPTION_GPC_MASK 0x01000000 +#define GPU_GR_EXCEPTION_GPC_SHIFT 0x00000018 +#define GPU_GR_EXCEPTION_GPC_FIELDMASK 0x00000001 +#define GPU_GR_EXCEPTION_MEMFMT_MASK 0x00000002 +#define GPU_GR_EXCEPTION_MEMFMT_SHIFT 0x00000001 +#define GPU_GR_EXCEPTION_MEMFMT_FIELDMASK 0x00000001 +#define GPU_GR_EXCEPTION_DS_MASK 0x00000010 +#define GPU_GR_EXCEPTION_DS_SHIFT 0x00000004 +#define GPU_GR_EXCEPTION_DS_FIELDMASK 0x00000001 +#define GPU_GR_EXCEPTION1 0x00400118 +#define GPU_GR_EXCEPTION1_GPC_0_PENDING_F 0x00000001 +#define GPU_GR_EXCEPTION2 0x0040011c +#define GPU_GR_EXCEPTION_EN 0x00400138 +#define GPU_GR_EXCEPTION_EN_FE_MASK 0x00000001 +#define GPU_GR_EXCEPTION_EN_FE_SHIFT 0x00000000 +#define GPU_GR_EXCEPTION_EN_FE_FIELDMASK 0x00000001 +#define GPU_GR_EXCEPTION1_EN 0x00400130 +#define GPU_GR_EXCEPTION2_EN 0x00400134 +#define GPU_GR_GPFIFO_CTL 0x00400500 +#define GPU_GR_GPFIFO_CTL_ACCESS_SHIFT 0x00000000 +#define GPU_GR_GPFIFO_CTL_ACCESS_FIELDMASK 0x00000001 +#define GPU_GR_GPFIFO_CTL_ACCESS_DISABLED_F 0x00000000 +#define GPU_GR_GPFIFO_CTL_ACCESS_ENABLED_F 0x00000001 +#define GPU_GR_GPFIFO_CTL_SEMAPHORE_ACCESS_SHIFT 0x00000010 +#define GPU_GR_GPFIFO_CTL_SEMAPHORE_ACCESS_FIELDMASK 0x00000001 +#define GPU_GR_GPFIFO_CTL_SEMAPHORE_ACCESS_ENABLED_V 0x00000001 +#define GPU_GR_GPFIFO_CTL_SEMAPHORE_ACCESS_ENABLED_F 0x00010000 +#define GPU_GR_GPFIFO_STATUS 0x00400504 +#define GPU_GR_TRAPPED_ADDR 0x00400704 +#define GPU_GR_TRAPPED_ADDR_MTHD_SHIFT 0x00000002 +#define GPU_GR_TRAPPED_ADDR_MTHD_FIELDMASK 0x00000fff +#define GPU_GR_TRAPPED_ADDR_SUBCH_SHIFT 0x00000010 +#define GPU_GR_TRAPPED_ADDR_SUBCH_FIELDMASK 0x00000007 +#define GPU_GR_TRAPPED_DATA_LO 0x00400708 +#define GPU_GR_TRAPPED_DATA_HI 0x0040070c +#define GPU_GR_STATUS 0x00400700 +#define GPU_GR_STATUS_FE_METHOD_UPPER_SHIFT 0x00000001 +#define GPU_GR_STATUS_FE_METHOD_UPPER_FIELDMASK 0x00000001 +#define GPU_GR_STATUS_FE_METHOD_LOWER_SHIFT 0x00000002 +#define GPU_GR_STATUS_FE_METHOD_LOWER_FIELDMASK 0x00000001 +#define GPU_GR_STATUS_FE_METHOD_LOWER_IDLE_V 0x00000000 +#define GPU_GR_STATUS_FE_GI_SHIFT 0x00000015 +#define GPU_GR_STATUS_FE_GI_FIELDMASK 0x00000001 +#define GPU_GR_STATUS_MASK 0x00400610 +#define GPU_GR_STATUS_1 0x00400604 +#define GPU_GR_STATUS_2 0x00400608 +#define GPU_GR_ENGINE_STATUS 0x0040060c +#define GPU_GR_ENGINE_STATUS_VALUE_BUSY_F 0x00000001 +#define GPU_GR_PRI_BE0_BECS_BE_EXCEPTION 0x00410204 +#define GPU_GR_PRI_BE0_BECS_BE_EXCEPTION_EN 0x00410208 +#define GPU_GR_PRI_GPC0_GPCCS_GPC_EXCEPTION 0x00502c90 +#define GPU_GR_PRI_GPC0_GPCCS_GPC_EXCEPTION_EN 0x00502c94 +#define GPU_GR_PRI_GPC0_TPC0_TPCCS_TPC_EXCEPTION 0x00504508 +#define GPU_GR_PRI_GPC0_TPC0_TPCCS_TPC_EXCEPTION_EN 0x0050450c +#define GPU_GR_ACTIVITY_0 0x00400380 +#define GPU_GR_ACTIVITY_1 0x00400384 +#define GPU_GR_ACTIVITY_2 0x00400388 +#define GPU_GR_ACTIVITY_4 0x00400390 +#define GPU_GR_PRI_GPC0_GCC_DBG 0x00501000 +#define GPU_GR_PRI_GPCS_GCC_DBG 0x00419000 +#define GPU_GR_PRI_GPCS_GCC_DBG_INVALIDATE_MASK 0x00000002 +#define GPU_GR_PRI_GPCS_GCC_DBG_INVALIDATE_SHIFT 0x00000001 +#define GPU_GR_PRI_GPCS_GCC_DBG_INVALIDATE_FIELDMASK 0x00000001 +#define GPU_GR_PRI_GPC0_TPC0_SM_CACHE_CONTROL 0x005046a4 +#define GPU_GR_PRI_GPCS_TPCS_SM_CACHE_CONTROL 0x00419ea4 +#define GPU_GR_PRI_GPCS_TPCS_SM_CACHE_CONTROL_INVALIDATE_CACHE_MASK 0x00000001 +#define GPU_GR_PRI_GPCS_TPCS_SM_CACHE_CONTROL_INVALIDATE_CACHE_SHIFT 0x00000000 +#define GPU_GR_PRI_GPCS_TPCS_SM_CACHE_CONTROL_INVALIDATE_CACHE_FIELDMASK 0x00000001 +#define GPU_GR_PRI_SKED_ACTIVITY 0x00407054 +#define GPU_GR_PRI_GPC0_GPCCS_GPC_ACTIVITY0 0x00502c80 +#define GPU_GR_PRI_GPC0_GPCCS_GPC_ACTIVITY1 0x00502c84 +#define GPU_GR_PRI_GPC0_GPCCS_GPC_ACTIVITY2 0x00502c88 +#define GPU_GR_PRI_GPC0_GPCCS_GPC_ACTIVITY3 0x00502c8c +#define GPU_GR_PRI_GPC0_TPC0_TPCCS_TPC_ACTIVITY_0 0x00504500 +#define GPU_GR_PRI_GPC0_TPC1_TPCCS_TPC_ACTIVITY_0 0x00504d00 +#define GPU_GR_PRI_GPC0_TPCS_TPCCS_TPC_ACTIVITY_0 0x00501d00 +#define GPU_GR_PRI_GPCS_GPCCS_GPC_ACTIVITY_0 0x0041ac80 +#define GPU_GR_PRI_GPCS_GPCCS_GPC_ACTIVITY_1 0x0041ac84 +#define GPU_GR_PRI_GPCS_GPCCS_GPC_ACTIVITY_2 0x0041ac88 +#define GPU_GR_PRI_GPCS_GPCCS_GPC_ACTIVITY_3 0x0041ac8c +#define GPU_GR_PRI_GPCS_TPC0_TPCCS_TPC_ACTIVITY_0 0x0041c500 +#define GPU_GR_PRI_GPCS_TPC1_TPCCS_TPC_ACTIVITY_0 0x0041cd00 +#define GPU_GR_PRI_GPCS_TPCS_TPCCS_TPC_ACTIVITY_0 0x00419d00 +#define GPU_GR_PRI_BE0_BECS_BE_ACTIVITY0 0x00410200 +#define GPU_GR_PRI_BE1_BECS_BE_ACTIVITY0 0x00410600 +#define GPU_GR_PRI_BES_BECS_BE_ACTIVITY0 0x00408a00 +#define GPU_GR_PRI_DS_MPIPE_STATUS 0x00405858 +#define GPU_GR_PRI_FE_GO_IDLE_ON_STATUS 0x00404150 +#define GPU_GR_PRI_FE_GO_IDLE_CHECK 0x00404158 +#define GPU_GR_PRI_FE_GO_IDLE_INFO 0x00404194 +#define GPU_GR_PRI_GPC0_TPC0_TEX_M_TEX_SUBUNITS_STATUS 0x00504238 +#define GPU_GR_PRI_BE0_CROP_STATUS1 0x00410134 +#define GPU_GR_PRI_BES_CROP_STATUS1 0x00408934 +#define GPU_GR_PRI_BE0_ZROP_STATUS 0x00410048 +#define GPU_GR_PRI_BE0_ZROP_STATUS2 0x0041004c +#define GPU_GR_PRI_BES_ZROP_STATUS 0x00408848 +#define GPU_GR_PRI_BES_ZROP_STATUS2 0x0040884c +#define GPU_GR_PIPE_BUNDLE_ADDRESS 0x00400200 +#define GPU_GR_PIPE_BUNDLE_ADDRESS_VALUE_SHIFT 0x00000000 +#define GPU_GR_PIPE_BUNDLE_ADDRESS_VALUE_FIELDMASK 0x0000ffff +#define GPU_GR_PIPE_BUNDLE_DATA 0x00400204 +#define GPU_GR_PIPE_BUNDLE_CONFIG 0x00400208 +#define GPU_GR_PIPE_BUNDLE_CONFIG_OVERRIDE_PIPE_MODE_DISABLED_F 0x00000000 +#define GPU_GR_PIPE_BUNDLE_CONFIG_OVERRIDE_PIPE_MODE_ENABLED_F 0x80000000 +#define GPU_GR_FE_HWW_ESR 0x00404000 +#define GPU_GR_FE_HWW_ESR_RESET_ACTIVE_F 0x40000000 +#define GPU_GR_FE_HWW_ESR_EN_ENABLE_F 0x80000000 +#define GPU_GR_FE_GO_IDLE_TIMEOUT 0x00404154 +#define GPU_GR_FE_GO_IDLE_TIMEOUT_COUNT_SHIFT 0x00000000 +#define GPU_GR_FE_GO_IDLE_TIMEOUT_COUNT_FIELDMASK 0xffffffff +#define GPU_GR_FE_GO_IDLE_TIMEOUT_COUNT_DISABLED_F 0x00000000 +#define GPU_GR_FE_GO_IDLE_TIMEOUT_COUNT_PROD_F 0x00000800 +#define GPU_GR_FE_OBJECT_TABLE__BASE 0x00404200 +#define GPU_GR_FE_OBJECT_TABLE__STRIDE 0x00000004 +#define GPU_GR_FE_OBJECT_TABLE(i) (0x00404200 + (i) * 0x00000004) +#define GPU_GR_FE_OBJECT_TABLE_NVCLASS_SHIFT 0x00000000 +#define GPU_GR_FE_OBJECT_TABLE_NVCLASS_FIELDMASK 0x0000ffff +#define GPU_GR_FE_TPC_FS 0x004041c4 +#define GPU_GR_PRI_MME_SHADOW_RAW_INDEX 0x00404488 +#define GPU_GR_PRI_MME_SHADOW_RAW_INDEX_WRITE_TRIGGER_F 0x80000000 +#define GPU_GR_PRI_MME_SHADOW_RAW_DATA 0x0040448c +#define GPU_GR_MME_HWW_ESR 0x00404490 +#define GPU_GR_MME_HWW_ESR_RESET_ACTIVE_F 0x40000000 +#define GPU_GR_MME_HWW_ESR_EN_ENABLE_F 0x80000000 +#define GPU_GR_MEMFMT_HWW_ESR 0x00404600 +#define GPU_GR_MEMFMT_HWW_ESR_RESET_ACTIVE_F 0x40000000 +#define GPU_GR_MEMFMT_HWW_ESR_EN_ENABLE_F 0x80000000 +#define GPU_GR_FECS_CPUCTL 0x00409100 +#define GPU_GR_FECS_CPUCTL_STARTCPU_SHIFT 0x00000001 +#define GPU_GR_FECS_CPUCTL_STARTCPU_FIELDMASK 0x00000001 +#define GPU_GR_FECS_CPUCTL_ALIAS 0x00409130 +#define GPU_GR_FECS_CPUCTL_ALIAS_STARTCPU_SHIFT 0x00000001 +#define GPU_GR_FECS_CPUCTL_ALIAS_STARTCPU_FIELDMASK 0x00000001 +#define GPU_GR_FECS_DMACTL 0x0040910c +#define GPU_GR_FECS_DMACTL_REQUIRE_CTX_SHIFT 0x00000000 +#define GPU_GR_FECS_DMACTL_REQUIRE_CTX_FIELDMASK 0x00000001 +#define GPU_GR_FECS_DMACTL_DMEM_SCRUBBING_MASK 0x00000002 +#define GPU_GR_FECS_DMACTL_DMEM_SCRUBBING_SHIFT 0x00000001 +#define GPU_GR_FECS_DMACTL_DMEM_SCRUBBING_FIELDMASK 0x00000001 +#define GPU_GR_FECS_DMACTL_IMEM_SCRUBBING_MASK 0x00000004 +#define GPU_GR_FECS_DMACTL_IMEM_SCRUBBING_SHIFT 0x00000002 +#define GPU_GR_FECS_DMACTL_IMEM_SCRUBBING_FIELDMASK 0x00000001 +#define GPU_GR_FECS_OS 0x00409080 +#define GPU_GR_FECS_IDLESTATE 0x0040904c +#define GPU_GR_FECS_MAILBOX0 0x00409040 +#define GPU_GR_FECS_MAILBOX1 0x00409044 +#define GPU_GR_FECS_IRQSTAT 0x00409008 +#define GPU_GR_FECS_IRQMODE 0x0040900c +#define GPU_GR_FECS_IRQMASK 0x00409018 +#define GPU_GR_FECS_IRQDEST 0x0040901c +#define GPU_GR_FECS_CURCTX 0x00409050 +#define GPU_GR_FECS_NXTCTX 0x00409054 +#define GPU_GR_FECS_ENGCTL 0x004090a4 +#define GPU_GR_FECS_DEBUG1 0x00409090 +#define GPU_GR_FECS_DEBUGINFO 0x00409094 +#define GPU_GR_FECS_ICD_CMD 0x00409200 +#define GPU_GR_FECS_ICD_CMD_OPC_SIZE 0x00000004 +#define GPU_GR_FECS_ICD_CMD_OPC_SHIFT 0x00000000 +#define GPU_GR_FECS_ICD_CMD_OPC_FIELDMASK 0x0000000f +#define GPU_GR_FECS_ICD_CMD_OPC_MASK 0x0000000f +#define GPU_GR_FECS_ICD_CMD_OPC_RREG_F 0x00000008 +#define GPU_GR_FECS_ICD_CMD_OPC_RSTAT_F 0x0000000e +#define GPU_GR_FECS_ICD_CMD_IDX_SHIFT 0x00000008 +#define GPU_GR_FECS_ICD_CMD_IDX_FIELDMASK 0x0000001f +#define GPU_GR_FECS_ICD_RDATA 0x0040920c +#define GPU_GR_FECS_IMEMC__BASE 0x00409180 +#define GPU_GR_FECS_IMEMC__STRIDE 0x00000010 +#define GPU_GR_FECS_IMEMC(i) (0x00409180 + (i) * 0x00000010) +#define GPU_GR_FECS_IMEMC_OFFS_SHIFT 0x00000002 +#define GPU_GR_FECS_IMEMC_OFFS_FIELDMASK 0x0000003f +#define GPU_GR_FECS_IMEMC_BLK_SHIFT 0x00000008 +#define GPU_GR_FECS_IMEMC_BLK_FIELDMASK 0x000000ff +#define GPU_GR_FECS_IMEMC_AINCW_SHIFT 0x00000018 +#define GPU_GR_FECS_IMEMC_AINCW_FIELDMASK 0x00000001 +#define GPU_GR_FECS_IMEMD__BASE 0x00409184 +#define GPU_GR_FECS_IMEMD__STRIDE 0x00000010 +#define GPU_GR_FECS_IMEMD(i) (0x00409184 + (i) * 0x00000010) +#define GPU_GR_FECS_IMEMT__BASE 0x00409188 +#define GPU_GR_FECS_IMEMT__STRIDE 0x00000010 +#define GPU_GR_FECS_IMEMT(i) (0x00409188 + (i) * 0x00000010) +#define GPU_GR_FECS_IMEMT_TAG_SHIFT 0x00000000 +#define GPU_GR_FECS_IMEMT_TAG_FIELDMASK 0x0000ffff +#define GPU_GR_FECS_DMEMC__BASE 0x004091c0 +#define GPU_GR_FECS_DMEMC__STRIDE 0x00000008 +#define GPU_GR_FECS_DMEMC(i) (0x004091c0 + (i) * 0x00000008) +#define GPU_GR_FECS_DMEMC_OFFS_SIZE 0x00000006 +#define GPU_GR_FECS_DMEMC_OFFS_SHIFT 0x00000002 +#define GPU_GR_FECS_DMEMC_OFFS_FIELDMASK 0x0000003f +#define GPU_GR_FECS_DMEMC_OFFS_MASK 0x000000fc +#define GPU_GR_FECS_DMEMC_BLK_SHIFT 0x00000008 +#define GPU_GR_FECS_DMEMC_BLK_FIELDMASK 0x000000ff +#define GPU_GR_FECS_DMEMC_AINCW_SHIFT 0x00000018 +#define GPU_GR_FECS_DMEMC_AINCW_FIELDMASK 0x00000001 +#define GPU_GR_FECS_DMEMD__BASE 0x004091c4 +#define GPU_GR_FECS_DMEMD__STRIDE 0x00000008 +#define GPU_GR_FECS_DMEMD(i) (0x004091c4 + (i) * 0x00000008) +#define GPU_GR_FECS_DMATRFBASE 0x00409110 +#define GPU_GR_FECS_DMATRFMOFFS 0x00409114 +#define GPU_GR_FECS_DMATRFFBOFFS 0x0040911c +#define GPU_GR_FECS_DMATRFCMD 0x00409118 +#define GPU_GR_FECS_DMATRFCMD_IMEM_SHIFT 0x00000004 +#define GPU_GR_FECS_DMATRFCMD_IMEM_FIELDMASK 0x00000001 +#define GPU_GR_FECS_DMATRFCMD_WRITE_SHIFT 0x00000005 +#define GPU_GR_FECS_DMATRFCMD_WRITE_FIELDMASK 0x00000001 +#define GPU_GR_FECS_DMATRFCMD_SIZE_SHIFT 0x00000008 +#define GPU_GR_FECS_DMATRFCMD_SIZE_FIELDMASK 0x00000007 +#define GPU_GR_FECS_DMATRFCMD_CTXDMA_SHIFT 0x0000000c +#define GPU_GR_FECS_DMATRFCMD_CTXDMA_FIELDMASK 0x00000007 +#define GPU_GR_FECS_BOOTVEC 0x00409104 +#define GPU_GR_FECS_BOOTVEC_VEC_SHIFT 0x00000000 +#define GPU_GR_FECS_BOOTVEC_VEC_FIELDMASK 0xffffffff +#define GPU_GR_FECS_FALCON_HWCFG 0x00409108 +#define GPU_GR_GPCS_GPCCS_FALCON_HWCFG 0x0041a108 +#define GPU_GR_FECS_FALCON_RM 0x00409084 +#define GPU_GR_FECS_CURRENT_CTX 0x00409b00 +#define GPU_GR_FECS_CURRENT_CTX_PTR_SHIFT 0x00000000 +#define GPU_GR_FECS_CURRENT_CTX_PTR_FIELDMASK 0x0fffffff +#define GPU_GR_FECS_CURRENT_CTX_TARGET_SIZE 0x00000002 +#define GPU_GR_FECS_CURRENT_CTX_TARGET_SHIFT 0x0000001c +#define GPU_GR_FECS_CURRENT_CTX_TARGET_FIELDMASK 0x00000003 +#define GPU_GR_FECS_CURRENT_CTX_TARGET_MASK 0x30000000 +#define GPU_GR_FECS_CURRENT_CTX_TARGET_VID_MEM_F 0x00000000 +#define GPU_GR_FECS_CURRENT_CTX_TARGET_SYS_MEM_COH_F 0x20000000 +#define GPU_GR_FECS_CURRENT_CTX_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_GR_FECS_CURRENT_CTX_VALID_SIZE 0x00000001 +#define GPU_GR_FECS_CURRENT_CTX_VALID_SHIFT 0x0000001f +#define GPU_GR_FECS_CURRENT_CTX_VALID_FIELDMASK 0x00000001 +#define GPU_GR_FECS_CURRENT_CTX_VALID_MASK 0x80000000 +#define GPU_GR_FECS_CURRENT_CTX_VALID_FALSE_F 0x00000000 +#define GPU_GR_FECS_METHOD_DATA 0x00409500 +#define GPU_GR_FECS_METHOD_PUSH 0x00409504 +#define GPU_GR_FECS_METHOD_PUSH_ADR_SHIFT 0x00000000 +#define GPU_GR_FECS_METHOD_PUSH_ADR_FIELDMASK 0x00000fff +#define GPU_GR_FECS_METHOD_PUSH_ADR_BIND_POINTER_V 0x00000003 +#define GPU_GR_FECS_METHOD_PUSH_ADR_BIND_POINTER_F 0x00000003 +#define GPU_GR_FECS_METHOD_PUSH_ADR_DISCOVER_IMAGE_SIZE_V 0x00000010 +#define GPU_GR_FECS_METHOD_PUSH_ADR_WFI_GOLDEN_SAVE_V 0x00000009 +#define GPU_GR_FECS_METHOD_PUSH_ADR_RESTORE_GOLDEN_V 0x00000015 +#define GPU_GR_FECS_METHOD_PUSH_ADR_DISCOVER_ZCULL_IMAGE_SIZE_V 0x00000016 +#define GPU_GR_FECS_METHOD_PUSH_ADR_DISCOVER_PM_IMAGE_SIZE_V 0x00000025 +#define GPU_GR_FECS_METHOD_PUSH_ADR_DISCOVER_REGLIST_IMAGE_SIZE_V 0x00000030 +#define GPU_GR_FECS_METHOD_PUSH_ADR_SET_REGLIST_BIND_INSTANCE_V 0x00000031 +#define GPU_GR_FECS_METHOD_PUSH_ADR_SET_REGLIST_VIRTUAL_ADDRESS_V 0x00000032 +#define GPU_GR_FECS_METHOD_PUSH_ADR_STOP_CTXSW_V 0x00000038 +#define GPU_GR_FECS_METHOD_PUSH_ADR_START_CTXSW_V 0x00000039 +#define GPU_GR_FECS_METHOD_PUSH_ADR_SET_WATCHDOG_TIMEOUT_F 0x00000021 +#define GPU_GR_FECS_METHOD_PUSH_ADR_WRITE_TIMESTAMP_RECORD_V 0x0000003d +#define GPU_GR_FECS_METHOD_PUSH_ADR_HALT_PIPELINE_V 0x00000004 +#define GPU_GR_FECS_HOST_INT_STATUS 0x00409c18 +#define GPU_GR_FECS_HOST_INT_STATUS_FAULT_DURING_CTXSW_SHIFT 0x00000010 +#define GPU_GR_FECS_HOST_INT_STATUS_FAULT_DURING_CTXSW_FIELDMASK 0x00000001 +#define GPU_GR_FECS_HOST_INT_STATUS_UMIMP_FIRMWARE_METHOD_SHIFT 0x00000011 +#define GPU_GR_FECS_HOST_INT_STATUS_UMIMP_FIRMWARE_METHOD_FIELDMASK 0x00000001 +#define GPU_GR_FECS_HOST_INT_STATUS_UMIMP_ILLEGAL_METHOD_SHIFT 0x00000012 +#define GPU_GR_FECS_HOST_INT_STATUS_UMIMP_ILLEGAL_METHOD_FIELDMASK 0x00000001 +#define GPU_GR_FECS_HOST_INT_STATUS_CTXSW_INTR_SHIFT 0x00000000 +#define GPU_GR_FECS_HOST_INT_STATUS_CTXSW_INTR_FIELDMASK 0x0000ffff +#define GPU_GR_FECS_HOST_INT_CLEAR 0x00409c20 +#define GPU_GR_FECS_HOST_INT_CLEAR_CTXSW_INTR1_SHIFT 0x00000001 +#define GPU_GR_FECS_HOST_INT_CLEAR_CTXSW_INTR1_FIELDMASK 0x00000001 +#define GPU_GR_FECS_HOST_INT_CLEAR_CTXSW_INTR1_CLEAR_F 0x00000002 +#define GPU_GR_FECS_HOST_INT_ENABLE 0x00409c24 +#define GPU_GR_FECS_HOST_INT_ENABLE_CTXSW_INTR1_ENABLE_F 0x00000002 +#define GPU_GR_FECS_HOST_INT_ENABLE_FAULT_DURING_CTXSW_ENABLE_F 0x00010000 +#define GPU_GR_FECS_HOST_INT_ENABLE_UMIMP_FIRMWARE_METHOD_ENABLE_F 0x00020000 +#define GPU_GR_FECS_HOST_INT_ENABLE_UMIMP_ILLEGAL_METHOD_ENABLE_F 0x00040000 +#define GPU_GR_FECS_HOST_INT_ENABLE_WATCHDOG_ENABLE_F 0x00080000 +#define GPU_GR_FECS_CTXSW_RESET_CTL 0x00409614 +#define GPU_GR_FECS_CTXSW_RESET_CTL_SYS_HALT_DISABLED_F 0x00000000 +#define GPU_GR_FECS_CTXSW_RESET_CTL_GPC_HALT_DISABLED_F 0x00000000 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_HALT_DISABLED_F 0x00000000 +#define GPU_GR_FECS_CTXSW_RESET_CTL_SYS_ENGINE_RESET_DISABLED_F 0x00000010 +#define GPU_GR_FECS_CTXSW_RESET_CTL_GPC_ENGINE_RESET_DISABLED_F 0x00000020 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_ENGINE_RESET_DISABLED_F 0x00000040 +#define GPU_GR_FECS_CTXSW_RESET_CTL_SYS_CONTEXT_RESET_ENABLED_F 0x00000000 +#define GPU_GR_FECS_CTXSW_RESET_CTL_SYS_CONTEXT_RESET_DISABLED_F 0x00000100 +#define GPU_GR_FECS_CTXSW_RESET_CTL_GPC_CONTEXT_RESET_ENABLED_F 0x00000000 +#define GPU_GR_FECS_CTXSW_RESET_CTL_GPC_CONTEXT_RESET_DISABLED_F 0x00000200 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_CONTEXT_RESET_SIZE 0x00000001 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_CONTEXT_RESET_SHIFT 0x0000000a +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_CONTEXT_RESET_FIELDMASK 0x00000001 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_CONTEXT_RESET_MASK 0x00000400 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_CONTEXT_RESET_ENABLED_F 0x00000000 +#define GPU_GR_FECS_CTXSW_RESET_CTL_BE_CONTEXT_RESET_DISABLED_F 0x00000400 +#define GPU_GR_FECS_CTX_STATE_STORE_MAJOR_REV_ID 0x0040960c +#define GPU_GR_FECS_CTXSW_MAILBOX__BASE 0x00409800 +#define GPU_GR_FECS_CTXSW_MAILBOX__STRIDE 0x00000004 +#define GPU_GR_FECS_CTXSW_MAILBOX(i) (0x00409800 + (i) * 0x00000004) +#define GPU_GR_FECS_CTXSW_MAILBOX__SIZE_1_V 0x00000010 +#define GPU_GR_FECS_CTXSW_MAILBOX_VALUE_SHIFT 0x00000000 +#define GPU_GR_FECS_CTXSW_MAILBOX_VALUE_FIELDMASK 0xffffffff +#define GPU_GR_FECS_CTXSW_MAILBOX_VALUE_PASS_V 0x00000001 +#define GPU_GR_FECS_CTXSW_MAILBOX_VALUE_FAIL_V 0x00000002 +#define GPU_GR_FECS_CTXSW_MAILBOX_SET__BASE 0x004098c0 +#define GPU_GR_FECS_CTXSW_MAILBOX_SET__STRIDE 0x00000004 +#define GPU_GR_FECS_CTXSW_MAILBOX_SET(i) (0x004098c0 + (i) * 0x00000004) +#define GPU_GR_FECS_CTXSW_MAILBOX_SET_VALUE_SHIFT 0x00000000 +#define GPU_GR_FECS_CTXSW_MAILBOX_SET_VALUE_FIELDMASK 0xffffffff +#define GPU_GR_FECS_CTXSW_MAILBOX_CLEAR__BASE 0x00409840 +#define GPU_GR_FECS_CTXSW_MAILBOX_CLEAR__STRIDE 0x00000004 +#define GPU_GR_FECS_CTXSW_MAILBOX_CLEAR(i) (0x00409840 + (i) * 0x00000004) +#define GPU_GR_FECS_CTXSW_MAILBOX_CLEAR_VALUE_SHIFT 0x00000000 +#define GPU_GR_FECS_CTXSW_MAILBOX_CLEAR_VALUE_FIELDMASK 0xffffffff +#define GPU_GR_FECS_FS 0x00409604 +#define GPU_GR_FECS_FS_NUM_AVAILABLE_GPCS_SIZE 0x00000005 +#define GPU_GR_FECS_FS_NUM_AVAILABLE_GPCS_SHIFT 0x00000000 +#define GPU_GR_FECS_FS_NUM_AVAILABLE_GPCS_FIELDMASK 0x0000001f +#define GPU_GR_FECS_FS_NUM_AVAILABLE_GPCS_MASK 0x0000001f +#define GPU_GR_FECS_FS_NUM_AVAILABLE_FBPS_SIZE 0x00000005 +#define GPU_GR_FECS_FS_NUM_AVAILABLE_FBPS_SHIFT 0x00000010 +#define GPU_GR_FECS_FS_NUM_AVAILABLE_FBPS_FIELDMASK 0x0000001f +#define GPU_GR_FECS_FS_NUM_AVAILABLE_FBPS_MASK 0x001f0000 +#define GPU_GR_FECS_CFG 0x00409620 +#define GPU_GR_FECS_CFG_IMEM_SZ_SHIFT 0x00000000 +#define GPU_GR_FECS_CFG_IMEM_SZ_FIELDMASK 0x000000ff +#define GPU_GR_FECS_RC_LANES 0x00409880 +#define GPU_GR_FECS_RC_LANES_NUM_CHAINS_SIZE 0x00000006 +#define GPU_GR_FECS_RC_LANES_NUM_CHAINS_SHIFT 0x00000000 +#define GPU_GR_FECS_RC_LANES_NUM_CHAINS_FIELDMASK 0x0000003f +#define GPU_GR_FECS_RC_LANES_NUM_CHAINS_MASK 0x0000003f +#define GPU_GR_FECS_CTXSW_STATUS_1 0x00409400 +#define GPU_GR_FECS_CTXSW_STATUS_1_ARB_BUSY_SIZE 0x00000001 +#define GPU_GR_FECS_CTXSW_STATUS_1_ARB_BUSY_SHIFT 0x0000000c +#define GPU_GR_FECS_CTXSW_STATUS_1_ARB_BUSY_FIELDMASK 0x00000001 +#define GPU_GR_FECS_CTXSW_STATUS_1_ARB_BUSY_MASK 0x00001000 +#define GPU_GR_FECS_ARB_CTX_ADR 0x00409a24 +#define GPU_GR_FECS_NEW_CTX 0x00409b04 +#define GPU_GR_FECS_NEW_CTX_PTR_SIZE 0x0000001c +#define GPU_GR_FECS_NEW_CTX_PTR_SHIFT 0x00000000 +#define GPU_GR_FECS_NEW_CTX_PTR_FIELDMASK 0x0fffffff +#define GPU_GR_FECS_NEW_CTX_PTR_MASK 0x0fffffff +#define GPU_GR_FECS_NEW_CTX_TARGET_SIZE 0x00000002 +#define GPU_GR_FECS_NEW_CTX_TARGET_SHIFT 0x0000001c +#define GPU_GR_FECS_NEW_CTX_TARGET_FIELDMASK 0x00000003 +#define GPU_GR_FECS_NEW_CTX_TARGET_MASK 0x30000000 +#define GPU_GR_FECS_NEW_CTX_TARGET_VID_MEM_F 0x00000000 +#define GPU_GR_FECS_NEW_CTX_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_GR_FECS_NEW_CTX_VALID_SIZE 0x00000001 +#define GPU_GR_FECS_NEW_CTX_VALID_SHIFT 0x0000001f +#define GPU_GR_FECS_NEW_CTX_VALID_FIELDMASK 0x00000001 +#define GPU_GR_FECS_NEW_CTX_VALID_MASK 0x80000000 +#define GPU_GR_FECS_ARB_CTX_PTR 0x00409a0c +#define GPU_GR_FECS_ARB_CTX_PTR_PTR_SIZE 0x0000001c +#define GPU_GR_FECS_ARB_CTX_PTR_PTR_SHIFT 0x00000000 +#define GPU_GR_FECS_ARB_CTX_PTR_PTR_FIELDMASK 0x0fffffff +#define GPU_GR_FECS_ARB_CTX_PTR_PTR_MASK 0x0fffffff +#define GPU_GR_FECS_ARB_CTX_PTR_TARGET_SIZE 0x00000002 +#define GPU_GR_FECS_ARB_CTX_PTR_TARGET_SHIFT 0x0000001c +#define GPU_GR_FECS_ARB_CTX_PTR_TARGET_FIELDMASK 0x00000003 +#define GPU_GR_FECS_ARB_CTX_PTR_TARGET_MASK 0x30000000 +#define GPU_GR_FECS_ARB_CTX_PTR_TARGET_VID_MEM_F 0x00000000 +#define GPU_GR_FECS_ARB_CTX_PTR_TARGET_SYS_MEM_NCOH_F 0x30000000 +#define GPU_GR_FECS_ARB_CTX_CMD 0x00409a10 +#define GPU_GR_FECS_ARB_CTX_CMD_CMD_SIZE 0x00000005 +#define GPU_GR_FECS_ARB_CTX_CMD_CMD_SHIFT 0x00000000 +#define GPU_GR_FECS_ARB_CTX_CMD_CMD_FIELDMASK 0x0000001f +#define GPU_GR_FECS_ARB_CTX_CMD_CMD_MASK 0x0000001f +#define GPU_GR_FECS_CTXSW_STATUS_FE_0 0x00409c00 +#define GPU_GR_GPC0_GPCCS_CTXSW_STATUS_GPC_0 0x00502c04 +#define GPU_GR_GPC0_GPCCS_CTXSW_STATUS_1 0x00502400 +#define GPU_GR_FECS_CTXSW_IDLESTATE 0x00409420 +#define GPU_GR_GPC0_GPCCS_CTXSW_IDLESTATE 0x00502420 +#define GPU_GR_RSTR2D_GPC_MAP0 0x0040780c +#define GPU_GR_RSTR2D_GPC_MAP1 0x00407810 +#define GPU_GR_RSTR2D_GPC_MAP2 0x00407814 +#define GPU_GR_RSTR2D_GPC_MAP3 0x00407818 +#define GPU_GR_RSTR2D_GPC_MAP4 0x0040781c +#define GPU_GR_RSTR2D_GPC_MAP5 0x00407820 +#define GPU_GR_RSTR2D_MAP_TABLE_CFG 0x004078bc +#define GPU_GR_RSTR2D_MAP_TABLE_CFG_ROW_OFFSET_SHIFT 0x00000000 +#define GPU_GR_RSTR2D_MAP_TABLE_CFG_ROW_OFFSET_FIELDMASK 0x000000ff +#define GPU_GR_RSTR2D_MAP_TABLE_CFG_NUM_ENTRIES_SHIFT 0x00000008 +#define GPU_GR_RSTR2D_MAP_TABLE_CFG_NUM_ENTRIES_FIELDMASK 0x000000ff +#define GPU_GR_PD_HWW_ESR 0x00406018 +#define GPU_GR_PD_HWW_ESR_RESET_ACTIVE_F 0x40000000 +#define GPU_GR_PD_HWW_ESR_EN_ENABLE_F 0x80000000 +#define GPU_GR_PD_NUM_TPC_PER_GPC__BASE 0x00406028 +#define GPU_GR_PD_NUM_TPC_PER_GPC__STRIDE 0x00000004 +#define GPU_GR_PD_NUM_TPC_PER_GPC(i) (0x00406028 + (i) * 0x00000004) +#define GPU_GR_PD_NUM_TPC_PER_GPC__SIZE_1_V 0x00000004 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT0_SHIFT 0x00000000 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT0_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT1_SHIFT 0x00000004 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT1_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT2_SHIFT 0x00000008 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT2_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT3_SHIFT 0x0000000c +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT3_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT4_SHIFT 0x00000010 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT4_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT5_SHIFT 0x00000014 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT5_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT6_SHIFT 0x00000018 +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT6_FIELDMASK 0x0000000f +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT7_SHIFT 0x0000001c +#define GPU_GR_PD_NUM_TPC_PER_GPC_COUNT7_FIELDMASK 0x0000000f +#define GPU_GR_PD_AB_DIST_CFG0 0x004064c0 +#define GPU_GR_PD_AB_DIST_CFG0_TIMESLICE_ENABLE_EN_F 0x80000000 +#define GPU_GR_PD_AB_DIST_CFG0_TIMESLICE_ENABLE_DIS_F 0x00000000 +#define GPU_GR_PD_AB_DIST_CFG1 0x004064c4 +#define GPU_GR_PD_AB_DIST_CFG1_MAX_BATCHES_INIT_F 0x0000ffff +#define GPU_GR_PD_AB_DIST_CFG1_MAX_OUTPUT_SHIFT 0x00000010 +#define GPU_GR_PD_AB_DIST_CFG1_MAX_OUTPUT_FIELDMASK 0x0000ffff +#define GPU_GR_PD_AB_DIST_CFG1_MAX_OUTPUT_GRANULARITY_V 0x00000080 +#define GPU_GR_PD_AB_DIST_CFG2 0x004064c8 +#define GPU_GR_PD_AB_DIST_CFG2_TOKEN_LIMIT_SHIFT 0x00000000 +#define GPU_GR_PD_AB_DIST_CFG2_TOKEN_LIMIT_FIELDMASK 0x00000fff +#define GPU_GR_PD_AB_DIST_CFG2_TOKEN_LIMIT_INIT_V 0x000001c0 +#define GPU_GR_PD_AB_DIST_CFG2_STATE_LIMIT_SHIFT 0x00000010 +#define GPU_GR_PD_AB_DIST_CFG2_STATE_LIMIT_FIELDMASK 0x00000fff +#define GPU_GR_PD_AB_DIST_CFG2_STATE_LIMIT_SCC_BUNDLE_GRANULARITY_V 0x00000020 +#define GPU_GR_PD_AB_DIST_CFG2_STATE_LIMIT_MIN_GPM_FIFO_DEPTHS_V 0x00000182 +#define GPU_GR_PD_PAGEPOOL 0x004064cc +#define GPU_GR_PD_PAGEPOOL_TOTAL_PAGES_SHIFT 0x00000000 +#define GPU_GR_PD_PAGEPOOL_TOTAL_PAGES_FIELDMASK 0x000000ff +#define GPU_GR_PD_PAGEPOOL_VALID_TRUE_F 0x80000000 +#define GPU_GR_PD_DIST_SKIP_TABLE__BASE 0x004064d0 +#define GPU_GR_PD_DIST_SKIP_TABLE__STRIDE 0x00000004 +#define GPU_GR_PD_DIST_SKIP_TABLE(i) (0x004064d0 + (i) * 0x00000004) +#define GPU_GR_PD_DIST_SKIP_TABLE__SIZE_1_V 0x00000008 +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N0_MASK_SHIFT 0x00000000 +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N0_MASK_FIELDMASK 0x000000ff +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N1_MASK_SHIFT 0x00000008 +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N1_MASK_FIELDMASK 0x000000ff +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N2_MASK_SHIFT 0x00000010 +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N2_MASK_FIELDMASK 0x000000ff +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N3_MASK_SHIFT 0x00000018 +#define GPU_GR_PD_DIST_SKIP_TABLE_GPC_4N3_MASK_FIELDMASK 0x000000ff +#define GPU_GR_DS_DEBUG 0x00405800 +#define GPU_GR_DS_DEBUG_TIMESLICE_MODE_DISABLE_F 0x00000000 +#define GPU_GR_DS_DEBUG_TIMESLICE_MODE_ENABLE_F 0x08000000 +#define GPU_GR_DS_ZBC_COLOR_R 0x00405804 +#define GPU_GR_DS_ZBC_COLOR_R_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_COLOR_R_VAL_FIELDMASK 0xffffffff +#define GPU_GR_DS_ZBC_COLOR_G 0x00405808 +#define GPU_GR_DS_ZBC_COLOR_G_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_COLOR_G_VAL_FIELDMASK 0xffffffff +#define GPU_GR_DS_ZBC_COLOR_B 0x0040580c +#define GPU_GR_DS_ZBC_COLOR_B_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_COLOR_B_VAL_FIELDMASK 0xffffffff +#define GPU_GR_DS_ZBC_COLOR_A 0x00405810 +#define GPU_GR_DS_ZBC_COLOR_A_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_COLOR_A_VAL_FIELDMASK 0xffffffff +#define GPU_GR_DS_ZBC_COLOR_FMT 0x00405814 +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_FIELDMASK 0x0000007f +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_INVALID_F 0x00000000 +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_ZERO_V 0x00000001 +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_UNORM_ONE_V 0x00000002 +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_RF32_GF32_BF32_AF32_V 0x00000004 +#define GPU_GR_DS_ZBC_COLOR_FMT_VAL_A8_B8_G8_R8_V 0x00000028 +#define GPU_GR_DS_ZBC_Z 0x00405818 +#define GPU_GR_DS_ZBC_Z_VAL_SIZE 0x00000020 +#define GPU_GR_DS_ZBC_Z_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_Z_VAL_FIELDMASK 0xffffffff +#define GPU_GR_DS_ZBC_Z_VAL_MASK 0xffffffff +#define GPU_GR_DS_ZBC_Z_VAL__INIT_V 0x00000000 +#define GPU_GR_DS_ZBC_Z_VAL__INIT_F 0x00000000 +#define GPU_GR_DS_ZBC_Z_FMT 0x0040581c +#define GPU_GR_DS_ZBC_Z_FMT_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_Z_FMT_VAL_FIELDMASK 0x00000001 +#define GPU_GR_DS_ZBC_Z_FMT_VAL_INVALID_F 0x00000000 +#define GPU_GR_DS_ZBC_Z_FMT_VAL_FP32_V 0x00000001 +#define GPU_GR_DS_ZBC_TBL_INDEX 0x00405820 +#define GPU_GR_DS_ZBC_TBL_INDEX_VAL_SHIFT 0x00000000 +#define GPU_GR_DS_ZBC_TBL_INDEX_VAL_FIELDMASK 0x0000000f +#define GPU_GR_DS_ZBC_TBL_LD 0x00405824 +#define GPU_GR_DS_ZBC_TBL_LD_SELECT_C_F 0x00000000 +#define GPU_GR_DS_ZBC_TBL_LD_SELECT_Z_F 0x00000001 +#define GPU_GR_DS_ZBC_TBL_LD_ACTION_WRITE_F 0x00000000 +#define GPU_GR_DS_ZBC_TBL_LD_TRIGGER_ACTIVE_F 0x00000004 +#define GPU_GR_DS_TGA_CONSTRAINTLOGIC 0x00405830 +#define GPU_GR_DS_TGA_CONSTRAINTLOGIC_BETA_CBSIZE_SHIFT 0x00000010 +#define GPU_GR_DS_TGA_CONSTRAINTLOGIC_BETA_CBSIZE_FIELDMASK 0x0000ffff +#define GPU_GR_DS_TGA_CONSTRAINTLOGIC_ALPHA_CBSIZE_SHIFT 0x00000000 +#define GPU_GR_DS_TGA_CONSTRAINTLOGIC_ALPHA_CBSIZE_FIELDMASK 0x0000ffff +#define GPU_GR_DS_HWW_ESR 0x00405840 +#define GPU_GR_DS_HWW_ESR_RESET_SIZE 0x00000001 +#define GPU_GR_DS_HWW_ESR_RESET_SHIFT 0x0000001e +#define GPU_GR_DS_HWW_ESR_RESET_FIELDMASK 0x00000001 +#define GPU_GR_DS_HWW_ESR_RESET_MASK 0x40000000 +#define GPU_GR_DS_HWW_ESR_RESET_TASK_V 0x00000001 +#define GPU_GR_DS_HWW_ESR_RESET_TASK_F 0x40000000 +#define GPU_GR_DS_HWW_ESR_EN_ENABLED_F 0x80000000 +#define GPU_GR_DS_HWW_ESR_2 0x00405848 +#define GPU_GR_DS_HWW_ESR_2_RESET_SIZE 0x00000001 +#define GPU_GR_DS_HWW_ESR_2_RESET_SHIFT 0x0000001e +#define GPU_GR_DS_HWW_ESR_2_RESET_FIELDMASK 0x00000001 +#define GPU_GR_DS_HWW_ESR_2_RESET_MASK 0x40000000 +#define GPU_GR_DS_HWW_ESR_2_RESET_TASK_V 0x00000001 +#define GPU_GR_DS_HWW_ESR_2_RESET_TASK_F 0x40000000 +#define GPU_GR_DS_HWW_ESR_2_EN_ENABLED_F 0x80000000 +#define GPU_GR_DS_HWW_REPORT_MASK 0x00405844 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH0_ERR_REPORT_F 0x00000001 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH1_ERR_REPORT_F 0x00000002 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH2_ERR_REPORT_F 0x00000004 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH3_ERR_REPORT_F 0x00000008 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH4_ERR_REPORT_F 0x00000010 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH5_ERR_REPORT_F 0x00000020 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH6_ERR_REPORT_F 0x00000040 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH7_ERR_REPORT_F 0x00000080 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH8_ERR_REPORT_F 0x00000100 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH9_ERR_REPORT_F 0x00000200 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH10_ERR_REPORT_F 0x00000400 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH11_ERR_REPORT_F 0x00000800 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH12_ERR_REPORT_F 0x00001000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH13_ERR_REPORT_F 0x00002000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH14_ERR_REPORT_F 0x00004000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH15_ERR_REPORT_F 0x00008000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH16_ERR_REPORT_F 0x00010000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH17_ERR_REPORT_F 0x00020000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH18_ERR_REPORT_F 0x00040000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH19_ERR_REPORT_F 0x00080000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH20_ERR_REPORT_F 0x00100000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH21_ERR_REPORT_F 0x00200000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH22_ERR_REPORT_F 0x00400000 +#define GPU_GR_DS_HWW_REPORT_MASK_SPH23_ERR_REPORT_F 0x00800000 +#define GPU_GR_DS_HWW_REPORT_MASK_2 0x0040584c +#define GPU_GR_DS_HWW_REPORT_MASK_2_SPH24_ERR_REPORT_F 0x00000001 +#define GPU_GR_DS_NUM_TPC_PER_GPC__BASE 0x00405870 +#define GPU_GR_DS_NUM_TPC_PER_GPC__STRIDE 0x00000004 +#define GPU_GR_DS_NUM_TPC_PER_GPC(i) (0x00405870 + (i) * 0x00000004) +#define GPU_GR_SCC_BUNDLE_CB_BASE 0x00408004 +#define GPU_GR_SCC_BUNDLE_CB_BASE_ADDR_39_8_SHIFT 0x00000000 +#define GPU_GR_SCC_BUNDLE_CB_BASE_ADDR_39_8_FIELDMASK 0xffffffff +#define GPU_GR_SCC_BUNDLE_CB_BASE_ADDR_39_8_ALIGN_BITS_V 0x00000008 +#define GPU_GR_SCC_BUNDLE_CB_SIZE 0x00408008 +#define GPU_GR_SCC_BUNDLE_CB_SIZE_DIV_256B_SHIFT 0x00000000 +#define GPU_GR_SCC_BUNDLE_CB_SIZE_DIV_256B_FIELDMASK 0x000007ff +#define GPU_GR_SCC_BUNDLE_CB_SIZE_DIV_256B__PROD_V 0x00000018 +#define GPU_GR_SCC_BUNDLE_CB_SIZE_DIV_256B_BYTE_GRANULARITY_V 0x00000100 +#define GPU_GR_SCC_BUNDLE_CB_SIZE_VALID_FALSE_V 0x00000000 +#define GPU_GR_SCC_BUNDLE_CB_SIZE_VALID_FALSE_F 0x00000000 +#define GPU_GR_SCC_BUNDLE_CB_SIZE_VALID_TRUE_F 0x80000000 +#define GPU_GR_SCC_PAGEPOOL_BASE 0x0040800c +#define GPU_GR_SCC_PAGEPOOL_BASE_ADDR_39_8_SHIFT 0x00000000 +#define GPU_GR_SCC_PAGEPOOL_BASE_ADDR_39_8_FIELDMASK 0xffffffff +#define GPU_GR_SCC_PAGEPOOL_BASE_ADDR_39_8_ALIGN_BITS_V 0x00000008 +#define GPU_GR_SCC_PAGEPOOL 0x00408010 +#define GPU_GR_SCC_PAGEPOOL_TOTAL_PAGES_SHIFT 0x00000000 +#define GPU_GR_SCC_PAGEPOOL_TOTAL_PAGES_FIELDMASK 0x000000ff +#define GPU_GR_SCC_PAGEPOOL_TOTAL_PAGES_HWMAX_V 0x00000000 +#define GPU_GR_SCC_PAGEPOOL_TOTAL_PAGES_HWMAX_VALUE_V 0x00000080 +#define GPU_GR_SCC_PAGEPOOL_TOTAL_PAGES_BYTE_GRANULARITY_V 0x00000100 +#define GPU_GR_SCC_PAGEPOOL_MAX_VALID_PAGES_SIZE 0x00000008 +#define GPU_GR_SCC_PAGEPOOL_MAX_VALID_PAGES_SHIFT 0x00000008 +#define GPU_GR_SCC_PAGEPOOL_MAX_VALID_PAGES_FIELDMASK 0x000000ff +#define GPU_GR_SCC_PAGEPOOL_MAX_VALID_PAGES_MASK 0x0000ff00 +#define GPU_GR_SCC_PAGEPOOL_VALID_TRUE_F 0x80000000 +#define GPU_GR_SCC_INIT 0x0040802c +#define GPU_GR_SCC_INIT_RAM_TRIGGER_F 0x00000001 +#define GPU_GR_SCC_HWW_ESR 0x00408030 +#define GPU_GR_SCC_HWW_ESR_RESET_ACTIVE_F 0x40000000 +#define GPU_GR_SCC_HWW_ESR_EN_ENABLE_F 0x80000000 +#define GPU_GR_SKED_HWW_ESR 0x00407020 +#define GPU_GR_SKED_HWW_ESR_RESET_ACTIVE_F 0x40000000 +#define GPU_GR_CWD_FS 0x00405b00 +#define GPU_GR_CWD_FS_NUM_GPCS_SHIFT 0x00000000 +#define GPU_GR_CWD_FS_NUM_GPCS_FIELDMASK 0x000000ff +#define GPU_GR_CWD_FS_NUM_TPCS_SHIFT 0x00000008 +#define GPU_GR_CWD_FS_NUM_TPCS_FIELDMASK 0x000000ff +#define GPU_GR_CWD_GPC_TPC_ID__BASE 0x00405b60 +#define GPU_GR_CWD_GPC_TPC_ID__STRIDE 0x00000004 +#define GPU_GR_CWD_GPC_TPC_ID(i) (0x00405b60 + (i) * 0x00000004) +#define GPU_GR_CWD_GPC_TPC_ID_TPC0_SIZE 0x00000004 +#define GPU_GR_CWD_GPC_TPC_ID_TPC0_SHIFT 0x00000000 +#define GPU_GR_CWD_GPC_TPC_ID_TPC0_FIELDMASK 0x0000000f +#define GPU_GR_CWD_GPC_TPC_ID_GPC0_SIZE 0x00000004 +#define GPU_GR_CWD_GPC_TPC_ID_GPC0_SHIFT 0x00000004 +#define GPU_GR_CWD_GPC_TPC_ID_GPC0_FIELDMASK 0x0000000f +#define GPU_GR_CWD_GPC_TPC_ID_TPC1_SHIFT 0x00000008 +#define GPU_GR_CWD_GPC_TPC_ID_TPC1_FIELDMASK 0x0000000f +#define GPU_GR_CWD_SM_ID__BASE 0x00405ba0 +#define GPU_GR_CWD_SM_ID__STRIDE 0x00000004 +#define GPU_GR_CWD_SM_ID(i) (0x00405ba0 + (i) * 0x00000004) +#define GPU_GR_CWD_SM_ID__SIZE_1_V 0x00000006 +#define GPU_GR_CWD_SM_ID_TPC0_SHIFT 0x00000000 +#define GPU_GR_CWD_SM_ID_TPC0_FIELDMASK 0x000000ff +#define GPU_GR_CWD_SM_ID_TPC1_SHIFT 0x00000008 +#define GPU_GR_CWD_SM_ID_TPC1_FIELDMASK 0x000000ff +#define GPU_GR_GPC0_FS_GPC 0x00502608 +#define GPU_GR_GPC0_FS_GPC_NUM_AVAILABLE_TPCS_SHIFT 0x00000000 +#define GPU_GR_GPC0_FS_GPC_NUM_AVAILABLE_TPCS_FIELDMASK 0x0000001f +#define GPU_GR_GPC0_FS_GPC_NUM_AVAILABLE_ZCULLS_SHIFT 0x00000010 +#define GPU_GR_GPC0_FS_GPC_NUM_AVAILABLE_ZCULLS_FIELDMASK 0x0000001f +#define GPU_GR_GPC0_CFG 0x00502620 +#define GPU_GR_GPC0_CFG_IMEM_SZ_SHIFT 0x00000000 +#define GPU_GR_GPC0_CFG_IMEM_SZ_FIELDMASK 0x000000ff +#define GPU_GR_GPCCS_RC_LANES 0x00502880 +#define GPU_GR_GPCCS_RC_LANES_NUM_CHAINS_SIZE 0x00000006 +#define GPU_GR_GPCCS_RC_LANES_NUM_CHAINS_SHIFT 0x00000000 +#define GPU_GR_GPCCS_RC_LANES_NUM_CHAINS_FIELDMASK 0x0000003f +#define GPU_GR_GPCCS_RC_LANES_NUM_CHAINS_MASK 0x0000003f +#define GPU_GR_GPCCS_RC_LANE_SIZE__BASE 0x00502910 +#define GPU_GR_GPCCS_RC_LANE_SIZE__STRIDE 0x00000000 +#define GPU_GR_GPCCS_RC_LANE_SIZE(i) (0x00502910 + (i) * 0x00000000) +#define GPU_GR_GPCCS_RC_LANE_SIZE__SIZE_1_V 0x00000010 +#define GPU_GR_GPCCS_RC_LANE_SIZE_V_SIZE 0x00000018 +#define GPU_GR_GPCCS_RC_LANE_SIZE_V_SHIFT 0x00000000 +#define GPU_GR_GPCCS_RC_LANE_SIZE_V_FIELDMASK 0x00ffffff +#define GPU_GR_GPCCS_RC_LANE_SIZE_V_MASK 0x00ffffff +#define GPU_GR_GPCCS_RC_LANE_SIZE_V_0_V 0x00000000 +#define GPU_GR_GPCCS_RC_LANE_SIZE_V_0_F 0x00000000 +#define GPU_GR_GPC0_ZCULL_FS 0x00500910 +#define GPU_GR_GPC0_ZCULL_FS_NUM_SMS_SHIFT 0x00000000 +#define GPU_GR_GPC0_ZCULL_FS_NUM_SMS_FIELDMASK 0x000001ff +#define GPU_GR_GPC0_ZCULL_FS_NUM_ACTIVE_BANKS_SHIFT 0x00000010 +#define GPU_GR_GPC0_ZCULL_FS_NUM_ACTIVE_BANKS_FIELDMASK 0x0000000f +#define GPU_GR_GPC0_ZCULL_RAM_ADDR 0x00500914 +#define GPU_GR_GPC0_ZCULL_RAM_ADDR_TILES_PER_HYPERTILE_ROW_PER_GPC_SHIFT 0x00000000 +#define GPU_GR_GPC0_ZCULL_RAM_ADDR_TILES_PER_HYPERTILE_ROW_PER_GPC_FIELDMASK 0x0000000f +#define GPU_GR_GPC0_ZCULL_RAM_ADDR_ROW_OFFSET_SHIFT 0x00000008 +#define GPU_GR_GPC0_ZCULL_RAM_ADDR_ROW_OFFSET_FIELDMASK 0x0000000f +#define GPU_GR_GPC0_ZCULL_SM_NUM_RCP 0x00500918 +#define GPU_GR_GPC0_ZCULL_SM_NUM_RCP_CONSERVATIVE_SHIFT 0x00000000 +#define GPU_GR_GPC0_ZCULL_SM_NUM_RCP_CONSERVATIVE_FIELDMASK 0x00ffffff +#define GPU_GR_GPC0_ZCULL_SM_NUM_RCP_CONSERVATIVE__MAX_V 0x00800000 +#define GPU_GR_GPC0_ZCULL_TOTAL_RAM_SIZE 0x00500920 +#define GPU_GR_GPC0_ZCULL_TOTAL_RAM_SIZE_NUM_ALIQUOTS_SHIFT 0x00000000 +#define GPU_GR_GPC0_ZCULL_TOTAL_RAM_SIZE_NUM_ALIQUOTS_FIELDMASK 0x0000ffff +#define GPU_GR_GPC0_ZCULL_ZCSIZE__BASE 0x00500a04 +#define GPU_GR_GPC0_ZCULL_ZCSIZE__STRIDE 0x00000020 +#define GPU_GR_GPC0_ZCULL_ZCSIZE(i) (0x00500a04 + (i) * 0x00000020) +#define GPU_GR_GPC0_ZCULL_ZCSIZE_HEIGHT_SUBREGION__MULTIPLE_V 0x00000040 +#define GPU_GR_GPC0_ZCULL_ZCSIZE_WIDTH_SUBREGION__MULTIPLE_V 0x00000010 +#define GPU_GR_GPC0_GPM_PD_SM_ID__BASE 0x00500c10 +#define GPU_GR_GPC0_GPM_PD_SM_ID__STRIDE 0x00000004 +#define GPU_GR_GPC0_GPM_PD_SM_ID(i) (0x00500c10 + (i) * 0x00000004) +#define GPU_GR_GPC0_GPM_PD_SM_ID_ID_SHIFT 0x00000000 +#define GPU_GR_GPC0_GPM_PD_SM_ID_ID_FIELDMASK 0x000000ff +#define GPU_GR_GPC0_GPM_PD_PES_TPC_ID_MASK__BASE 0x00500c30 +#define GPU_GR_GPC0_GPM_PD_PES_TPC_ID_MASK__STRIDE 0x00000004 +#define GPU_GR_GPC0_GPM_PD_PES_TPC_ID_MASK(i) (0x00500c30 + (i) * 0x00000004) +#define GPU_GR_GPC0_GPM_PD_PES_TPC_ID_MASK_MASK_SHIFT 0x00000000 +#define GPU_GR_GPC0_GPM_PD_PES_TPC_ID_MASK_MASK_FIELDMASK 0x000000ff +#define GPU_GR_GPC0_TPC0_PE_CFG_SMID 0x00504088 +#define GPU_GR_GPC0_TPC0_PE_CFG_SMID_VALUE_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_PE_CFG_SMID_VALUE_FIELDMASK 0x0000ffff +#define GPU_GR_GPC0_TPC0_SM_CFG 0x00504698 +#define GPU_GR_GPC0_TPC0_SM_CFG_SM_ID_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_CFG_SM_ID_FIELDMASK 0x0000ffff +#define GPU_GR_GPC0_TPC0_SM_ARCH 0x0050469c +#define GPU_GR_GPC0_TPC0_SM_ARCH_WARP_COUNT_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_ARCH_WARP_COUNT_FIELDMASK 0x000000ff +#define GPU_GR_GPC0_TPC0_SM_ARCH_SPA_VERSION_SHIFT 0x00000008 +#define GPU_GR_GPC0_TPC0_SM_ARCH_SPA_VERSION_FIELDMASK 0x00000fff +#define GPU_GR_GPC0_TPC0_SM_ARCH_SM_VERSION_SHIFT 0x00000014 +#define GPU_GR_GPC0_TPC0_SM_ARCH_SM_VERSION_FIELDMASK 0x00000fff +#define GPU_GR_GPC0_PPC0_PES_VSC_STREM 0x00503018 +#define GPU_GR_GPC0_PPC0_PES_VSC_STREM_MASTER_PE_MASK 0x00000001 +#define GPU_GR_GPC0_PPC0_PES_VSC_STREM_MASTER_PE_SHIFT 0x00000000 +#define GPU_GR_GPC0_PPC0_PES_VSC_STREM_MASTER_PE_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_PPC0_PES_VSC_STREM_MASTER_PE_TRUE_F 0x00000001 +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_SIZE 0x005030c0 +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_SIZE_V_SHIFT 0x00000000 +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_SIZE_V_FIELDMASK 0x0000ffff +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_SIZE_V_MASK 0x0000ffff +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_SIZE_V_DEFAULT_V 0x00000400 +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_SIZE_V_GRANULARITY_V 0x00000020 +#define GPU_GR_GPC0_PPC0_CBM_BETA_CB_OFFSET 0x005030f4 +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_SIZE 0x005030e4 +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_SIZE_V_SHIFT 0x00000000 +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_SIZE_V_FIELDMASK 0x0000ffff +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_SIZE_V_MASK 0x0000ffff +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_SIZE_V_DEFAULT_V 0x00000800 +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_SIZE_V_GRANULARITY_V 0x00000020 +#define GPU_GR_GPC0_PPC0_CBM_ALPHA_CB_OFFSET 0x005030f8 +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2 0x00419a3c +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2_LG_RD_COALESCE_EN_SHIFT 0x00000002 +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2_LG_RD_COALESCE_EN_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2_LG_RD_COALESCE_EN_MASK 0x00000004 +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2_SU_RD_COALESCE_EN_SHIFT 0x00000004 +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2_SU_RD_COALESCE_EN_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_TEX_M_DBG2_SU_RD_COALESCE_EN_MASK 0x00000010 +#define GPU_GR_GPCCS_FALCON_ADDR 0x0041a0ac +#define GPU_GR_GPCCS_FALCON_ADDR_LSB_SIZE 0x00000006 +#define GPU_GR_GPCCS_FALCON_ADDR_LSB_SHIFT 0x00000000 +#define GPU_GR_GPCCS_FALCON_ADDR_LSB_FIELDMASK 0x0000003f +#define GPU_GR_GPCCS_FALCON_ADDR_LSB_MASK 0x0000003f +#define GPU_GR_GPCCS_FALCON_ADDR_LSB_INIT_V 0x00000000 +#define GPU_GR_GPCCS_FALCON_ADDR_LSB_INIT_F 0x00000000 +#define GPU_GR_GPCCS_FALCON_ADDR_MSB_SIZE 0x00000006 +#define GPU_GR_GPCCS_FALCON_ADDR_MSB_SHIFT 0x00000006 +#define GPU_GR_GPCCS_FALCON_ADDR_MSB_FIELDMASK 0x0000003f +#define GPU_GR_GPCCS_FALCON_ADDR_MSB_MASK 0x00000fc0 +#define GPU_GR_GPCCS_FALCON_ADDR_MSB_INIT_V 0x00000000 +#define GPU_GR_GPCCS_FALCON_ADDR_MSB_INIT_F 0x00000000 +#define GPU_GR_GPCCS_FALCON_ADDR_EXT_SIZE 0x0000000c +#define GPU_GR_GPCCS_FALCON_ADDR_EXT_SHIFT 0x00000000 +#define GPU_GR_GPCCS_FALCON_ADDR_EXT_FIELDMASK 0x00000fff +#define GPU_GR_GPCCS_FALCON_ADDR_EXT_MASK 0x00000fff +#define GPU_GR_GPCCS_CPUCTL 0x0041a100 +#define GPU_GR_GPCCS_CPUCTL_STARTCPU_SHIFT 0x00000001 +#define GPU_GR_GPCCS_CPUCTL_STARTCPU_FIELDMASK 0x00000001 +#define GPU_GR_GPCCS_DMACTL 0x0041a10c +#define GPU_GR_GPCCS_DMACTL_REQUIRE_CTX_SHIFT 0x00000000 +#define GPU_GR_GPCCS_DMACTL_REQUIRE_CTX_FIELDMASK 0x00000001 +#define GPU_GR_GPCCS_DMACTL_DMEM_SCRUBBING_MASK 0x00000002 +#define GPU_GR_GPCCS_DMACTL_DMEM_SCRUBBING_SHIFT 0x00000001 +#define GPU_GR_GPCCS_DMACTL_DMEM_SCRUBBING_FIELDMASK 0x00000001 +#define GPU_GR_GPCCS_DMACTL_IMEM_SCRUBBING_MASK 0x00000004 +#define GPU_GR_GPCCS_DMACTL_IMEM_SCRUBBING_SHIFT 0x00000002 +#define GPU_GR_GPCCS_DMACTL_IMEM_SCRUBBING_FIELDMASK 0x00000001 +#define GPU_GR_GPCCS_IMEMC__BASE 0x0041a180 +#define GPU_GR_GPCCS_IMEMC__STRIDE 0x00000010 +#define GPU_GR_GPCCS_IMEMC(i) (0x0041a180 + (i) * 0x00000010) +#define GPU_GR_GPCCS_IMEMC_OFFS_SHIFT 0x00000002 +#define GPU_GR_GPCCS_IMEMC_OFFS_FIELDMASK 0x0000003f +#define GPU_GR_GPCCS_IMEMC_BLK_SHIFT 0x00000008 +#define GPU_GR_GPCCS_IMEMC_BLK_FIELDMASK 0x000000ff +#define GPU_GR_GPCCS_IMEMC_AINCW_SHIFT 0x00000018 +#define GPU_GR_GPCCS_IMEMC_AINCW_FIELDMASK 0x00000001 +#define GPU_GR_GPCCS_IMEMD__BASE 0x0041a184 +#define GPU_GR_GPCCS_IMEMD__STRIDE 0x00000010 +#define GPU_GR_GPCCS_IMEMD(i) (0x0041a184 + (i) * 0x00000010) +#define GPU_GR_GPCCS_IMEMT__BASE 0x0041a188 +#define GPU_GR_GPCCS_IMEMT__STRIDE 0x00000010 +#define GPU_GR_GPCCS_IMEMT(i) (0x0041a188 + (i) * 0x00000010) +#define GPU_GR_GPCCS_IMEMT__SIZE_1_V 0x00000004 +#define GPU_GR_GPCCS_IMEMT_TAG_SHIFT 0x00000000 +#define GPU_GR_GPCCS_IMEMT_TAG_FIELDMASK 0x0000ffff +#define GPU_GR_GPCCS_DMEMC__BASE 0x0041a1c0 +#define GPU_GR_GPCCS_DMEMC__STRIDE 0x00000008 +#define GPU_GR_GPCCS_DMEMC(i) (0x0041a1c0 + (i) * 0x00000008) +#define GPU_GR_GPCCS_DMEMC_OFFS_SHIFT 0x00000002 +#define GPU_GR_GPCCS_DMEMC_OFFS_FIELDMASK 0x0000003f +#define GPU_GR_GPCCS_DMEMC_BLK_SHIFT 0x00000008 +#define GPU_GR_GPCCS_DMEMC_BLK_FIELDMASK 0x000000ff +#define GPU_GR_GPCCS_DMEMC_AINCW_SHIFT 0x00000018 +#define GPU_GR_GPCCS_DMEMC_AINCW_FIELDMASK 0x00000001 +#define GPU_GR_GPCCS_DMEMD__BASE 0x0041a1c4 +#define GPU_GR_GPCCS_DMEMD__STRIDE 0x00000008 +#define GPU_GR_GPCCS_DMEMD(i) (0x0041a1c4 + (i) * 0x00000008) +#define GPU_GR_GPCCS_CTXSW_MAILBOX__BASE 0x0041a800 +#define GPU_GR_GPCCS_CTXSW_MAILBOX__STRIDE 0x00000004 +#define GPU_GR_GPCCS_CTXSW_MAILBOX(i) (0x0041a800 + (i) * 0x00000004) +#define GPU_GR_GPCCS_CTXSW_MAILBOX_VALUE_SHIFT 0x00000000 +#define GPU_GR_GPCCS_CTXSW_MAILBOX_VALUE_FIELDMASK 0xffffffff +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE 0x00418e24 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE_ADDR_39_8_SIZE 0x00000020 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE_ADDR_39_8_SHIFT 0x00000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE_ADDR_39_8_FIELDMASK 0xffffffff +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE_ADDR_39_8_MASK 0xffffffff +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE_ADDR_39_8_INIT_V 0x00000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_BASE_ADDR_39_8_INIT_F 0x00000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE 0x00418e28 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_DIV_256B_SIZE 0x0000000b +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_DIV_256B_SHIFT 0x00000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_DIV_256B_FIELDMASK 0x000007ff +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_DIV_256B_MASK 0x000007ff +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_DIV_256B_INIT_V 0x00000018 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_DIV_256B_INIT_F 0x00000018 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_SIZE 0x00000001 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_SHIFT 0x0000001f +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_MASK 0x80000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_FALSE_V 0x00000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_FALSE_F 0x00000000 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_TRUE_V 0x00000001 +#define GPU_GR_GPCS_SWDX_BUNDLE_CB_SIZE_VALID_TRUE_F 0x80000000 +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE__BASE 0x00418ea0 +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE__STRIDE 0x00000004 +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE(i) (0x00418ea0 + (i) * 0x00000004) +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE_V_SHIFT 0x00000000 +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE_V_FIELDMASK 0x0000ffff +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE_V_MASK 0x0000ffff +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE_DIV3_SHIFT 0x00000010 +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE_DIV3_FIELDMASK 0x0000ffff +#define GPU_GR_GPCS_SWDX_TC_BETA_CB_SIZE_DIV3_MASK 0xffff0000 +#define GPU_GR_GPCS_SWDX_RM_PAGEPOOL 0x00418e30 +#define GPU_GR_GPCS_SWDX_RM_PAGEPOOL_TOTAL_PAGES_SHIFT 0x00000000 +#define GPU_GR_GPCS_SWDX_RM_PAGEPOOL_TOTAL_PAGES_FIELDMASK 0x000000ff +#define GPU_GR_GPCS_SWDX_RM_PAGEPOOL_VALID_TRUE_F 0x80000000 +#define GPU_GR_GPCS_SETUP_ATTRIB_CB_BASE 0x00418810 +#define GPU_GR_GPCS_SETUP_ATTRIB_CB_BASE_ADDR_39_12_SHIFT 0x00000000 +#define GPU_GR_GPCS_SETUP_ATTRIB_CB_BASE_ADDR_39_12_FIELDMASK 0x0fffffff +#define GPU_GR_GPCS_SETUP_ATTRIB_CB_BASE_ADDR_39_12_ALIGN_BITS_V 0x0000000c +#define GPU_GR_GPCS_SETUP_ATTRIB_CB_BASE_VALID_TRUE_F 0x80000000 +#define GPU_GR_CRSTR_GPC_MAP0 0x00418b08 +#define GPU_GR_CRSTR_GPC_MAP0_TILE0_SHIFT 0x00000000 +#define GPU_GR_CRSTR_GPC_MAP0_TILE0_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP0_TILE1_SHIFT 0x00000005 +#define GPU_GR_CRSTR_GPC_MAP0_TILE1_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP0_TILE2_SHIFT 0x0000000a +#define GPU_GR_CRSTR_GPC_MAP0_TILE2_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP0_TILE3_SHIFT 0x0000000f +#define GPU_GR_CRSTR_GPC_MAP0_TILE3_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP0_TILE4_SHIFT 0x00000014 +#define GPU_GR_CRSTR_GPC_MAP0_TILE4_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP0_TILE5_SHIFT 0x00000019 +#define GPU_GR_CRSTR_GPC_MAP0_TILE5_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP1 0x00418b0c +#define GPU_GR_CRSTR_GPC_MAP1_TILE6_SHIFT 0x00000000 +#define GPU_GR_CRSTR_GPC_MAP1_TILE6_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP1_TILE7_SHIFT 0x00000005 +#define GPU_GR_CRSTR_GPC_MAP1_TILE7_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP1_TILE8_SHIFT 0x0000000a +#define GPU_GR_CRSTR_GPC_MAP1_TILE8_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP1_TILE9_SHIFT 0x0000000f +#define GPU_GR_CRSTR_GPC_MAP1_TILE9_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP1_TILE10_SHIFT 0x00000014 +#define GPU_GR_CRSTR_GPC_MAP1_TILE10_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP1_TILE11_SHIFT 0x00000019 +#define GPU_GR_CRSTR_GPC_MAP1_TILE11_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP2 0x00418b10 +#define GPU_GR_CRSTR_GPC_MAP2_TILE12_SHIFT 0x00000000 +#define GPU_GR_CRSTR_GPC_MAP2_TILE12_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP2_TILE13_SHIFT 0x00000005 +#define GPU_GR_CRSTR_GPC_MAP2_TILE13_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP2_TILE14_SHIFT 0x0000000a +#define GPU_GR_CRSTR_GPC_MAP2_TILE14_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP2_TILE15_SHIFT 0x0000000f +#define GPU_GR_CRSTR_GPC_MAP2_TILE15_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP2_TILE16_SHIFT 0x00000014 +#define GPU_GR_CRSTR_GPC_MAP2_TILE16_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP2_TILE17_SHIFT 0x00000019 +#define GPU_GR_CRSTR_GPC_MAP2_TILE17_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP3 0x00418b14 +#define GPU_GR_CRSTR_GPC_MAP3_TILE18_SHIFT 0x00000000 +#define GPU_GR_CRSTR_GPC_MAP3_TILE18_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP3_TILE19_SHIFT 0x00000005 +#define GPU_GR_CRSTR_GPC_MAP3_TILE19_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP3_TILE20_SHIFT 0x0000000a +#define GPU_GR_CRSTR_GPC_MAP3_TILE20_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP3_TILE21_SHIFT 0x0000000f +#define GPU_GR_CRSTR_GPC_MAP3_TILE21_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP3_TILE22_SHIFT 0x00000014 +#define GPU_GR_CRSTR_GPC_MAP3_TILE22_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP3_TILE23_SHIFT 0x00000019 +#define GPU_GR_CRSTR_GPC_MAP3_TILE23_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP4 0x00418b18 +#define GPU_GR_CRSTR_GPC_MAP4_TILE24_SHIFT 0x00000000 +#define GPU_GR_CRSTR_GPC_MAP4_TILE24_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP4_TILE25_SHIFT 0x00000005 +#define GPU_GR_CRSTR_GPC_MAP4_TILE25_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP4_TILE26_SHIFT 0x0000000a +#define GPU_GR_CRSTR_GPC_MAP4_TILE26_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP4_TILE27_SHIFT 0x0000000f +#define GPU_GR_CRSTR_GPC_MAP4_TILE27_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP4_TILE28_SHIFT 0x00000014 +#define GPU_GR_CRSTR_GPC_MAP4_TILE28_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP4_TILE29_SHIFT 0x00000019 +#define GPU_GR_CRSTR_GPC_MAP4_TILE29_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP5 0x00418b1c +#define GPU_GR_CRSTR_GPC_MAP5_TILE30_SHIFT 0x00000000 +#define GPU_GR_CRSTR_GPC_MAP5_TILE30_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP5_TILE31_SHIFT 0x00000005 +#define GPU_GR_CRSTR_GPC_MAP5_TILE31_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP5_TILE32_SHIFT 0x0000000a +#define GPU_GR_CRSTR_GPC_MAP5_TILE32_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP5_TILE33_SHIFT 0x0000000f +#define GPU_GR_CRSTR_GPC_MAP5_TILE33_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP5_TILE34_SHIFT 0x00000014 +#define GPU_GR_CRSTR_GPC_MAP5_TILE34_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_GPC_MAP5_TILE35_SHIFT 0x00000019 +#define GPU_GR_CRSTR_GPC_MAP5_TILE35_FIELDMASK 0x00000007 +#define GPU_GR_CRSTR_MAP_TABLE_CFG 0x00418bb8 +#define GPU_GR_CRSTR_MAP_TABLE_CFG_ROW_OFFSET_SHIFT 0x00000000 +#define GPU_GR_CRSTR_MAP_TABLE_CFG_ROW_OFFSET_FIELDMASK 0x000000ff +#define GPU_GR_CRSTR_MAP_TABLE_CFG_NUM_ENTRIES_SHIFT 0x00000008 +#define GPU_GR_CRSTR_MAP_TABLE_CFG_NUM_ENTRIES_FIELDMASK 0x000000ff +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0 0x00418980 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_0_SHIFT 0x00000000 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_0_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_1_SHIFT 0x00000004 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_1_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_2_SHIFT 0x00000008 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_2_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_3_SHIFT 0x0000000c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_3_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_4_SHIFT 0x00000010 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_4_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_5_SHIFT 0x00000014 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_5_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_6_SHIFT 0x00000018 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_6_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_7_SHIFT 0x0000001c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP0_TILE_7_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1 0x00418984 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_8_SHIFT 0x00000000 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_8_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_9_SHIFT 0x00000004 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_9_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_10_SHIFT 0x00000008 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_10_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_11_SHIFT 0x0000000c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_11_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_12_SHIFT 0x00000010 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_12_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_13_SHIFT 0x00000014 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_13_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_14_SHIFT 0x00000018 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_14_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_15_SHIFT 0x0000001c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP1_TILE_15_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2 0x00418988 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_16_SHIFT 0x00000000 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_16_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_17_SHIFT 0x00000004 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_17_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_18_SHIFT 0x00000008 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_18_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_19_SHIFT 0x0000000c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_19_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_20_SHIFT 0x00000010 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_20_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_21_SHIFT 0x00000014 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_21_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_22_SHIFT 0x00000018 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_22_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_23_SIZE 0x00000003 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_23_SHIFT 0x0000001c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_23_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP2_TILE_23_MASK 0x70000000 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3 0x0041898c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_24_SHIFT 0x00000000 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_24_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_25_SHIFT 0x00000004 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_25_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_26_SHIFT 0x00000008 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_26_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_27_SHIFT 0x0000000c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_27_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_28_SHIFT 0x00000010 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_28_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_29_SHIFT 0x00000014 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_29_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_30_SHIFT 0x00000018 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_30_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_31_SHIFT 0x0000001c +#define GPU_GR_GPCS_ZCULL_SM_IN_GPC_NUMBER_MAP3_TILE_31_FIELDMASK 0x00000007 +#define GPU_GR_GPCS_GPM_PD_CFG 0x00418c6c +#define GPU_GR_GPCS_GPM_PD_CFG_TIMESLICE_MODE_DISABLE_F 0x00000000 +#define GPU_GR_GPCS_GPM_PD_CFG_TIMESLICE_MODE_ENABLE_F 0x00000001 +#define GPU_GR_GPCS_GCC_PAGEPOOL_BASE 0x00419004 +#define GPU_GR_GPCS_GCC_PAGEPOOL_BASE_ADDR_39_8_SHIFT 0x00000000 +#define GPU_GR_GPCS_GCC_PAGEPOOL_BASE_ADDR_39_8_FIELDMASK 0xffffffff +#define GPU_GR_GPCS_GCC_PAGEPOOL 0x00419008 +#define GPU_GR_GPCS_GCC_PAGEPOOL_TOTAL_PAGES_SHIFT 0x00000000 +#define GPU_GR_GPCS_GCC_PAGEPOOL_TOTAL_PAGES_FIELDMASK 0x000000ff +#define GPU_GR_GPCS_TPCS_PE_VAF 0x0041980c +#define GPU_GR_GPCS_TPCS_PE_VAF_FAST_MODE_SWITCH_TRUE_F 0x00000010 +#define GPU_GR_GPCS_TPCS_PE_PIN_CB_GLOBAL_BASE_ADDR 0x00419848 +#define GPU_GR_GPCS_TPCS_PE_PIN_CB_GLOBAL_BASE_ADDR_V_SHIFT 0x00000000 +#define GPU_GR_GPCS_TPCS_PE_PIN_CB_GLOBAL_BASE_ADDR_V_FIELDMASK 0x0fffffff +#define GPU_GR_GPCS_TPCS_PE_PIN_CB_GLOBAL_BASE_ADDR_VALID_SHIFT 0x0000001c +#define GPU_GR_GPCS_TPCS_PE_PIN_CB_GLOBAL_BASE_ADDR_VALID_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_PE_PIN_CB_GLOBAL_BASE_ADDR_VALID_TRUE_F 0x10000000 +#define GPU_GR_GPCS_TPCS_MPC_VTG_DEBUG 0x00419c00 +#define GPU_GR_GPCS_TPCS_MPC_VTG_DEBUG_TIMESLICE_MODE_DISABLED_F 0x00000000 +#define GPU_GR_GPCS_TPCS_MPC_VTG_DEBUG_TIMESLICE_MODE_ENABLED_F 0x00000008 +#define GPU_GR_GPCS_TPCS_MPC_VTG_CB_GLOBAL_BASE_ADDR 0x00419c2c +#define GPU_GR_GPCS_TPCS_MPC_VTG_CB_GLOBAL_BASE_ADDR_V_SHIFT 0x00000000 +#define GPU_GR_GPCS_TPCS_MPC_VTG_CB_GLOBAL_BASE_ADDR_V_FIELDMASK 0x0fffffff +#define GPU_GR_GPCS_TPCS_MPC_VTG_CB_GLOBAL_BASE_ADDR_VALID_SHIFT 0x0000001c +#define GPU_GR_GPCS_TPCS_MPC_VTG_CB_GLOBAL_BASE_ADDR_VALID_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_MPC_VTG_CB_GLOBAL_BASE_ADDR_VALID_TRUE_F 0x10000000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK 0x00419e44 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_STACK_ERROR_REPORT_F 0x00000002 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_API_STACK_ERROR_REPORT_F 0x00000004 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_RET_EMPTY_STACK_ERROR_REPORT_F 0x00000008 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_PC_WRAP_REPORT_F 0x00000010 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_MISALIGNED_PC_REPORT_F 0x00000020 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_PC_OVERFLOW_REPORT_F 0x00000040 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_MISALIGNED_IMMC_ADDR_REPORT_F 0x00000080 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_MISALIGNED_REG_REPORT_F 0x00000100 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_ILLEGAL_INSTR_ENCODING_REPORT_F 0x00000200 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_ILLEGAL_SPH_INSTR_COMBO_REPORT_F 0x00000400 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_ILLEGAL_INSTR_PARAM_REPORT_F 0x00000800 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_INVALID_CONST_ADDR_REPORT_F 0x00001000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_OOR_REG_REPORT_F 0x00002000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_OOR_ADDR_REPORT_F 0x00004000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_MISALIGNED_ADDR_REPORT_F 0x00008000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_INVALID_ADDR_SPACE_REPORT_F 0x00010000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_ILLEGAL_INSTR_PARAM2_REPORT_F 0x00020000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_INVALID_CONST_ADDR_LDC_REPORT_F 0x00040000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_MMU_FAULT_REPORT_F 0x00800000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_STACK_OVERFLOW_REPORT_F 0x00400000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_GEOMETRY_SM_ERROR_REPORT_F 0x00080000 +#define GPU_GR_GPCS_TPCS_SM_HWW_WARP_ESR_REPORT_MASK_DIVERGENT_REPORT_F 0x00100000 +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR_REPORT_MASK 0x00504644 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK 0x00419e4c +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_SM_TO_SM_FAULT_REPORT_F 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_L1_ERROR_REPORT_F 0x00000002 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_MULTIPLE_WARP_ERRORS_REPORT_F 0x00000004 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_PHYSICAL_STACK_OVERFLOW_ERROR_REPORT_F 0x00000008 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_BPT_INT_REPORT_F 0x00000010 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_BPT_PAUSE_REPORT_F 0x00000020 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_REPORT_MASK_SINGLE_STEP_COMPLETE_REPORT_F 0x00000040 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_REPORT_MASK 0x0050464c +#define GPU_GR_GPCS_TPCS_TPCCS_TPC_EXCEPTION_EN 0x00419d0c +#define GPU_GR_GPCS_TPCS_TPCCS_TPC_EXCEPTION_EN_SM_ENABLED_F 0x00000002 +#define GPU_GR_GPCS_TPCS_TPCCS_TPC_EXCEPTION_EN_TEX_ENABLED_F 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_EN 0x0050450c +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_EN_SM_ENABLED_F 0x00000002 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_EN_SM_SHIFT 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_EN_SM_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_GPCCS_GPC_EXCEPTION_EN 0x0041ac94 +#define GPU_GR_GPCS_GPCCS_GPC_EXCEPTION_EN_TPC_SHIFT 0x00000010 +#define GPU_GR_GPCS_GPCCS_GPC_EXCEPTION_EN_TPC_FIELDMASK 0x000000ff +#define GPU_GR_GPC0_GPCCS_GPC_EXCEPTION 0x00502c90 +#define GPU_GR_GPC0_GPCCS_GPC_EXCEPTION_TPC_SHIFT 0x00000010 +#define GPU_GR_GPC0_GPCCS_GPC_EXCEPTION_TPC_FIELDMASK 0x000000ff +#define GPU_GR_GPC0_GPCCS_GPC_EXCEPTION_TPC_0_PENDING_V 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION 0x00504508 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_TEX_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_TEX_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_TEX_PENDING_V 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_SM_SHIFT 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_SM_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_TPCCS_TPC_EXCEPTION_SM_PENDING_V 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0 0x00504610 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_MASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_ON_V 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_ON_F 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_OFF_V 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_DEBUGGER_MODE_OFF_F 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_TRIGGER_ENABLE_F 0x80000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_TRIGGER_DISABLE_F 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_ENABLE_F 0x00000008 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_DISABLE_F 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_RUN_TRIGGER_TASK_F 0x40000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_WARP_MASK 0x00000002 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_WARP_SHIFT 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_WARP_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_WARP_DISABLE_F 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_SM_MASK 0x00000004 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_SM_SHIFT 0x00000002 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_SM_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_SM_DISABLE_F 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_SM_STOP_ON_ANY_WARP_DISABLE_V 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_CONTROL0_STOP_ON_ANY_SM_STOP_ON_ANY_SM_DISABLE_V 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_WARP_VALID_MASK 0x00504614 +#define GPU_GR_GPC0_TPC0_SM_WARP_VALID_MASK_1 0x00504618 +#define GPU_GR_GPC0_TPC0_SM_WARP_VALID_MASK_2 0x0050461c +#define GPU_GR_GPC0_TPC0_SM_DBGR_BPT_PAUSE_MASK 0x00504624 +#define GPU_GR_GPC0_TPC0_SM_DBGR_BPT_PAUSE_MASK_1 0x00504628 +#define GPU_GR_GPC0_TPC0_SM_DBGR_BPT_PAUSE_MASK_2 0x00504750 +#define GPU_GR_GPC0_TPC0_SM_DBGR_BPT_TRAP_MASK 0x00504634 +#define GPU_GR_GPC0_TPC0_SM_DBGR_BPT_TRAP_MASK_1 0x00504638 +#define GPU_GR_GPC0_TPC0_SM_DBGR_BPT_TRAP_MASK_2 0x00504758 +#define GPU_GR_GPCS_TPCS_SM_DBGR_BPT_PAUSE_MASK 0x00419e24 +#define GPU_GR_GPC0_TPC0_SM_DBGR_STATUS0 0x0050460c +#define GPU_GR_GPC0_TPC0_SM_DBGR_STATUS0_SM_IN_TRAP_MODE_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_DBGR_STATUS0_SM_IN_TRAP_MODE_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_STATUS0_LOCKED_DOWN_SHIFT 0x00000004 +#define GPU_GR_GPC0_TPC0_SM_DBGR_STATUS0_LOCKED_DOWN_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DBGR_STATUS0_LOCKED_DOWN_TRUE_V 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR 0x00419e50 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_BPT_INT_PENDING_F 0x00000010 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_BPT_PAUSE_PENDING_F 0x00000020 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_SINGLE_STEP_COMPLETE_PENDING_F 0x00000040 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_SM_TO_SM_FAULT_PENDING_F 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_L1_ERROR_PENDING_F 0x00000002 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_MULTIPLE_WARP_ERRORS_PENDING_F 0x00000004 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_PHYSICAL_STACK_OVERFLOW_ERROR_PENDING_F 0x00000008 +#define GPU_GR_GPCS_TPCS_SM_HWW_GLOBAL_ESR_TIMEOUT_ERROR_PENDING_F 0x80000000 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR 0x00504650 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_BPT_INT_PENDING_F 0x00000010 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_BPT_PAUSE_PENDING_F 0x00000020 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_SINGLE_STEP_COMPLETE_PENDING_F 0x00000040 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_SM_TO_SM_FAULT_PENDING_F 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_L1_ERROR_PENDING_F 0x00000002 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_MULTIPLE_WARP_ERRORS_PENDING_F 0x00000004 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_PHYSICAL_STACK_OVERFLOW_ERROR_PENDING_F 0x00000008 +#define GPU_GR_GPC0_TPC0_SM_HWW_GLOBAL_ESR_TIMEOUT_ERROR_PENDING_F 0x80000000 +#define GPU_GR_GPC0_TPC0_TEX_M_HWW_ESR 0x00504224 +#define GPU_GR_GPC0_TPC0_TEX_M_HWW_ESR_INTR_PENDING_F 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR 0x00504648 +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR_ERROR_SHIFT 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR_ERROR_FIELDMASK 0x0000ffff +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR_ERROR_NONE_V 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR_ERROR_NONE_F 0x00000000 +#define GPU_GR_GPC0_TPC0_SM_HWW_WARP_ESR_PC 0x00504654 +#define GPU_GR_GPC0_TPC0_SM_HALFCTL_CTRL 0x00504770 +#define GPU_GR_GPCS_TPCS_SM_HALFCTL_CTRL 0x00419f70 +#define GPU_GR_GPCS_TPCS_SM_HALFCTL_CTRL_SCTL_READ_QUAD_CTL_MASK 0x00000010 +#define GPU_GR_GPCS_TPCS_SM_HALFCTL_CTRL_SCTL_READ_QUAD_CTL_SHIFT 0x00000004 +#define GPU_GR_GPCS_TPCS_SM_HALFCTL_CTRL_SCTL_READ_QUAD_CTL_FIELDMASK 0x00000001 +#define GPU_GR_GPC0_TPC0_SM_DEBUG_SFE_CONTROL 0x0050477c +#define GPU_GR_GPCS_TPCS_SM_DEBUG_SFE_CONTROL 0x00419f7c +#define GPU_GR_GPCS_TPCS_SM_DEBUG_SFE_CONTROL_READ_HALF_CTL_MASK 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_DEBUG_SFE_CONTROL_READ_HALF_CTL_SHIFT 0x00000000 +#define GPU_GR_GPCS_TPCS_SM_DEBUG_SFE_CONTROL_READ_HALF_CTL_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_PES_VSC_VPC 0x0041be08 +#define GPU_GR_GPCS_TPCS_PES_VSC_VPC_FAST_MODE_SWITCH_TRUE_F 0x00000004 +#define GPU_GR_PPCS_WWDX_MAP_GPC_MAP0 0x0041bf00 +#define GPU_GR_PPCS_WWDX_MAP_GPC_MAP1 0x0041bf04 +#define GPU_GR_PPCS_WWDX_MAP_GPC_MAP2 0x0041bf08 +#define GPU_GR_PPCS_WWDX_MAP_GPC_MAP3 0x0041bf0c +#define GPU_GR_PPCS_WWDX_MAP_GPC_MAP4 0x0041bf10 +#define GPU_GR_PPCS_WWDX_MAP_GPC_MAP5 0x0041bf14 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG 0x0041bfd0 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_ROW_OFFSET_SHIFT 0x00000000 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_ROW_OFFSET_FIELDMASK 0x000000ff +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_NUM_ENTRIES_SHIFT 0x00000008 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_NUM_ENTRIES_FIELDMASK 0x000000ff +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_NORMALIZED_NUM_ENTRIES_SHIFT 0x00000010 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_NORMALIZED_NUM_ENTRIES_FIELDMASK 0x0000001f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_NORMALIZED_SHIFT_VALUE_SHIFT 0x00000015 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_NORMALIZED_SHIFT_VALUE_FIELDMASK 0x00000007 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_COEFF5_MOD_VALUE_SHIFT 0x00000018 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG_COEFF5_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_GPCS_PPCS_WWDX_SM_NUM_RCP 0x0041bfd4 +#define GPU_GR_GPCS_PPCS_WWDX_SM_NUM_RCP_CONSERVATIVE_SHIFT 0x00000000 +#define GPU_GR_GPCS_PPCS_WWDX_SM_NUM_RCP_CONSERVATIVE_FIELDMASK 0x00ffffff +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2 0x0041bfe4 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF6_MOD_VALUE_SHIFT 0x00000000 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF6_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF7_MOD_VALUE_SHIFT 0x00000005 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF7_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF8_MOD_VALUE_SHIFT 0x0000000a +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF8_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF9_MOD_VALUE_SHIFT 0x0000000f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF9_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF10_MOD_VALUE_SHIFT 0x00000014 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF10_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF11_MOD_VALUE_SHIFT 0x00000019 +#define GPU_GR_PPCS_WWDX_MAP_TABLE_CFG2_COEFF11_MOD_VALUE_FIELDMASK 0x0000001f +#define GPU_GR_BES_ZROP_SETTINGS 0x00408850 +#define GPU_GR_BES_ZROP_SETTINGS_NUM_ACTIVE_LTCS_SHIFT 0x00000000 +#define GPU_GR_BES_ZROP_SETTINGS_NUM_ACTIVE_LTCS_FIELDMASK 0x0000000f +#define GPU_GR_BE0_CROP_DEBUG3 0x00410108 +#define GPU_GR_BES_CROP_DEBUG3 0x00408908 +#define GPU_GR_BES_CROP_DEBUG3_COMP_VDC_4TO2_DISABLE_MASK 0x80000000 +#define GPU_GR_BES_CROP_DEBUG3_COMP_VDC_4TO2_DISABLE_SHIFT 0x0000001f +#define GPU_GR_BES_CROP_DEBUG3_COMP_VDC_4TO2_DISABLE_FIELDMASK 0x00000001 +#define GPU_GR_BES_CROP_SETTINGS 0x00408958 +#define GPU_GR_BES_CROP_SETTINGS_NUM_ACTIVE_LTCS_SHIFT 0x00000000 +#define GPU_GR_BES_CROP_SETTINGS_NUM_ACTIVE_LTCS_FIELDMASK 0x0000000f +#define GPU_GR_ZCULL_BYTES_PER_ALIQUOT_PER_GPU_V 0x00000020 +#define GPU_GR_ZCULL_SAVE_RESTORE_HEADER_BYTES_PER_GPC_V 0x00000020 +#define GPU_GR_ZCULL_SAVE_RESTORE_SUBREGION_HEADER_BYTES_PER_GPC_V 0x000000c0 +#define GPU_GR_ZCULL_SUBREGION_QTY_V 0x00000010 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL_SEL0 0x00504604 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL_SEL1 0x00504608 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL0 0x0050465c +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL1 0x00504660 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL2 0x00504664 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL3 0x00504668 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL4 0x0050466c +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_CONTROL5 0x00504658 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER0_CONTROL 0x00504730 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER1_CONTROL 0x00504734 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER2_CONTROL 0x00504738 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER3_CONTROL 0x0050473c +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER4_CONTROL 0x00504740 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER5_CONTROL 0x00504744 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER6_CONTROL 0x00504748 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER7_CONTROL 0x0050474c +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_STATUS_S1 0x00504678 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER_STATUS1 0x00504694 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER0_S0 0x005046f0 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER0_S1 0x00504700 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER1_S0 0x005046f4 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER1_S1 0x00504704 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER2_S0 0x005046f8 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER2_S1 0x00504708 +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER3_S0 0x005046fc +#define GPU_GR_PRI_GPC0_TPC0_SM_DSM_PERF_COUNTER3_S1 0x0050470c +#define GPU_GR_FE_PWR_MODE 0x00404170 +#define GPU_GR_FE_PWR_MODE_MODE_AUTO_F 0x00000000 +#define GPU_GR_FE_PWR_MODE_MODE_FORCE_ON_F 0x00000002 +#define GPU_GR_FE_PWR_MODE_REQ_SHIFT 0x00000004 +#define GPU_GR_FE_PWR_MODE_REQ_FIELDMASK 0x00000001 +#define GPU_GR_FE_PWR_MODE_REQ_SEND_F 0x00000010 +#define GPU_GR_FE_PWR_MODE_REQ_DONE_V 0x00000000 +#define GPU_GR_GPCS_PRI_MMU_CTRL 0x00418880 +#define GPU_GR_GPCS_PRI_MMU_CTRL_VM_PG_SIZE_MASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_VM_PG_SIZE_SHIFT 0x00000000 +#define GPU_GR_GPCS_PRI_MMU_CTRL_VM_PG_SIZE_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_MASK 0x00000800 +#define GPU_GR_GPCS_PRI_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_SHIFT 0x0000000b +#define GPU_GR_GPCS_PRI_MMU_CTRL_USE_PDB_BIG_PAGE_SIZE_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_USE_FULL_COMP_TAG_LINE_MASK 0x00001000 +#define GPU_GR_GPCS_PRI_MMU_CTRL_USE_FULL_COMP_TAG_LINE_SHIFT 0x0000000c +#define GPU_GR_GPCS_PRI_MMU_CTRL_USE_FULL_COMP_TAG_LINE_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_VOL_FAULT_MASK 0x00000002 +#define GPU_GR_GPCS_PRI_MMU_CTRL_VOL_FAULT_SHIFT 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_VOL_FAULT_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_COMP_FAULT_MASK 0x00000004 +#define GPU_GR_GPCS_PRI_MMU_CTRL_COMP_FAULT_SHIFT 0x00000002 +#define GPU_GR_GPCS_PRI_MMU_CTRL_COMP_FAULT_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MISS_GRAN_MASK 0x00000018 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MISS_GRAN_SHIFT 0x00000003 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MISS_GRAN_FIELDMASK 0x00000003 +#define GPU_GR_GPCS_PRI_MMU_CTRL_CACHE_MODE_MASK 0x00000060 +#define GPU_GR_GPCS_PRI_MMU_CTRL_CACHE_MODE_SHIFT 0x00000005 +#define GPU_GR_GPCS_PRI_MMU_CTRL_CACHE_MODE_FIELDMASK 0x00000003 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_APERTURE_MASK 0x30000000 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_APERTURE_SHIFT 0x0000001c +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_APERTURE_FIELDMASK 0x00000003 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_VOL_MASK 0x40000000 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_VOL_SHIFT 0x0000001e +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_VOL_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_DISABLE_MASK 0x80000000 +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_DISABLE_SHIFT 0x0000001f +#define GPU_GR_GPCS_PRI_MMU_CTRL_MMU_DISABLE_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_PM_UNIT_MASK 0x00418890 +#define GPU_GR_GPCS_PRI_MMU_PM_REQ_MASK 0x00418894 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL 0x004188b0 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_MASK 0x00010000 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_SHIFT 0x00000010 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_ENABLED_V 0x00000001 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_ENABLED_F 0x00010000 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_DISABLED_V 0x00000000 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_CTRL_DEBUG_DISABLED_F 0x00000000 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_WR 0x004188b4 +#define GPU_GR_GPCS_PRI_MMU_DEBUG_RD 0x004188b8 +#define GPU_GR_GPCS_MMU_NUM_ACTIVE_LTCS 0x004188ac +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0 0x00419e10 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_DEBUGGER_MODE_SHIFT 0x00000000 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_DEBUGGER_MODE_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_DEBUGGER_MODE_ON_V 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_STOP_TRIGGER_MASK 0x80000000 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_STOP_TRIGGER_SHIFT 0x0000001f +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_STOP_TRIGGER_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_STOP_TRIGGER_ENABLE_F 0x80000000 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_STOP_TRIGGER_DISABLE_F 0x00000000 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_MASK 0x00000008 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_SHIFT 0x00000003 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_ENABLE_F 0x00000008 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_SINGLE_STEP_MODE_DISABLE_F 0x00000000 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_RUN_TRIGGER_MASK 0x40000000 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_RUN_TRIGGER_SHIFT 0x0000001e +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_RUN_TRIGGER_FIELDMASK 0x00000001 +#define GPU_GR_GPCS_TPCS_SM_DBGR_CONTROL0_RUN_TRIGGER_TASK_F 0x40000000 + +#define GPU_LTC_PLTCG_BASE_V 0x00140000 +#define GPU_LTC_PLTCG_EXTENT_V 0x0017ffff +#define GPU_LTC_LTC0_LTSS_V 0x00140200 +#define GPU_LTC_LTC0_LTS0_V 0x00140400 +#define GPU_LTC_LTCS_LTSS_V 0x0017e200 +#define GPU_LTC_LTCS_LTS0_CBC_CTRL1 0x0014046c +#define GPU_LTC_LTC0_LTS0_DSTG_CFG0 0x00140518 +#define GPU_LTC_LTCS_LTSS_DSTG_CFG0 0x0017e318 +#define GPU_LTC_LTCS_LTSS_DSTG_CFG0_VDC_4TO2_DISABLE_MASK 0x00008000 +#define GPU_LTC_LTCS_LTSS_DSTG_CFG0_VDC_4TO2_DISABLE_SHIFT 0x0000000f +#define GPU_LTC_LTCS_LTSS_DSTG_CFG0_VDC_4TO2_DISABLE_FIELDMASK 0x00000001 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1 0x00140494 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_WAYS_SHIFT 0x00000000 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_WAYS_FIELDMASK 0x0000ffff +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_SETS_SHIFT 0x00000010 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_SETS_FIELDMASK 0x00000003 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_SETS_ALL_V 0x00000000 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_SETS_HALF_V 0x00000001 +#define GPU_LTC_LTC0_LTS0_TSTG_CFG1_ACTIVE_SETS_QUARTER_V 0x00000002 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1 0x0017e26c +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1_CLEAN_ACTIVE_F 0x00000001 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1_INVALIDATE_ACTIVE_F 0x00000002 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1_CLEAR_SHIFT 0x00000002 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1_CLEAR_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1_CLEAR_ACTIVE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL1_CLEAR_ACTIVE_F 0x00000004 +#define GPU_LTC_LTC0_LTS0_CBC_CTRL1 0x0014046c +#define GPU_LTC_LTCS_LTSS_CBC_CTRL2 0x0017e270 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL2_CLEAR_LOWER_BOUND_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL2_CLEAR_LOWER_BOUND_FIELDMASK 0x0001ffff +#define GPU_LTC_LTCS_LTSS_CBC_CTRL3 0x0017e274 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL3_CLEAR_UPPER_BOUND_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_CBC_CTRL3_CLEAR_UPPER_BOUND_FIELDMASK 0x0001ffff +#define GPU_LTC_LTCS_LTSS_CBC_CTRL3_CLEAR_UPPER_BOUND_INIT_V 0x0001ffff +#define GPU_LTC_LTCS_LTSS_CBC_BASE 0x0017e278 +#define GPU_LTC_LTCS_LTSS_CBC_BASE_ALIGNMENT_SHIFT_V 0x0000000b +#define GPU_LTC_LTCS_LTSS_CBC_BASE_ADDRESS_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_CBC_BASE_ADDRESS_FIELDMASK 0x03ffffff +#define GPU_LTC_LTCS_LTSS_CBC_NUM_ACTIVE_LTCS 0x0017e27c +#define GPU_LTC_LTCS_MISC_LTC_NUM_ACTIVE_LTCS 0x0017e000 +#define GPU_LTC_LTCS_LTSS_CBC_PARAM 0x0017e280 +#define GPU_LTC_LTCS_LTSS_CBC_PARAM_COMPTAGS_PER_CACHE_LINE_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_CBC_PARAM_COMPTAGS_PER_CACHE_LINE_FIELDMASK 0x0000ffff +#define GPU_LTC_LTCS_LTSS_CBC_PARAM_CACHE_LINE_SIZE_SHIFT 0x00000018 +#define GPU_LTC_LTCS_LTSS_CBC_PARAM_CACHE_LINE_SIZE_FIELDMASK 0x0000000f +#define GPU_LTC_LTCS_LTSS_CBC_PARAM_SLICES_PER_LTC_SHIFT 0x0000001c +#define GPU_LTC_LTCS_LTSS_CBC_PARAM_SLICES_PER_LTC_FIELDMASK 0x0000000f +#define GPU_LTC_LTCS_LTSS_TSTG_SET_MGMT 0x0017e2ac +#define GPU_LTC_LTCS_LTSS_TSTG_SET_MGMT_MAX_WAYS_EVICT_LAST_SHIFT 0x00000010 +#define GPU_LTC_LTCS_LTSS_TSTG_SET_MGMT_MAX_WAYS_EVICT_LAST_FIELDMASK 0x0000001f +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_INDEX 0x0017e338 +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_INDEX_ADDRESS_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_INDEX_ADDRESS_FIELDMASK 0x0000000f +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_COLOR_CLEAR_VALUE__BASE 0x0017e33c +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_COLOR_CLEAR_VALUE__STRIDE 0x00000004 +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_COLOR_CLEAR_VALUE(i) (0x0017e33c + (i) * 0x00000004) +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_COLOR_CLEAR_VALUE__SIZE_1_V 0x00000004 +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_DEPTH_CLEAR_VALUE 0x0017e34c +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_DEPTH_CLEAR_VALUE_FIELD_SIZE 0x00000020 +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_DEPTH_CLEAR_VALUE_FIELD_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_DEPTH_CLEAR_VALUE_FIELD_FIELDMASK 0xffffffff +#define GPU_LTC_LTCS_LTSS_DSTG_ZBC_DEPTH_CLEAR_VALUE_FIELD_MASK 0xffffffff +#define GPU_LTC_LTCS_LTSS_TSTG_SET_MGMT_2 0x0017e2b0 +#define GPU_LTC_LTCS_LTSS_TSTG_SET_MGMT_2_L2_BYPASS_MODE_ENABLED_F 0x10000000 +#define GPU_LTC_LTCS_LTSS_G_ELPG 0x0017e214 +#define GPU_LTC_LTCS_LTSS_G_ELPG_FLUSH_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_G_ELPG_FLUSH_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_G_ELPG_FLUSH_PENDING_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_G_ELPG_FLUSH_PENDING_F 0x00000001 +#define GPU_LTC_LTC0_LTSS_G_ELPG 0x00140214 +#define GPU_LTC_LTC0_LTSS_G_ELPG_FLUSH_SHIFT 0x00000000 +#define GPU_LTC_LTC0_LTSS_G_ELPG_FLUSH_FIELDMASK 0x00000001 +#define GPU_LTC_LTC0_LTSS_G_ELPG_FLUSH_PENDING_V 0x00000001 +#define GPU_LTC_LTC0_LTSS_G_ELPG_FLUSH_PENDING_F 0x00000001 +#define GPU_LTC_LTC1_LTSS_G_ELPG 0x00142214 +#define GPU_LTC_LTC1_LTSS_G_ELPG_FLUSH_SHIFT 0x00000000 +#define GPU_LTC_LTC1_LTSS_G_ELPG_FLUSH_FIELDMASK 0x00000001 +#define GPU_LTC_LTC1_LTSS_G_ELPG_FLUSH_PENDING_V 0x00000001 +#define GPU_LTC_LTC1_LTSS_G_ELPG_FLUSH_PENDING_F 0x00000001 +#define GPU_LTC_LTCS_LTSS_INTR 0x0017e20c +#define GPU_LTC_LTCS_LTSS_INTR_EN_EVICTED_CB_MASK 0x00100000 +#define GPU_LTC_LTCS_LTSS_INTR_EN_EVICTED_CB_SHIFT 0x00000014 +#define GPU_LTC_LTCS_LTSS_INTR_EN_EVICTED_CB_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_INTR_EN_ILLEGAL_COMPSTAT_ACCESS_MASK 0x40000000 +#define GPU_LTC_LTCS_LTSS_INTR_EN_ILLEGAL_COMPSTAT_ACCESS_SHIFT 0x0000001e +#define GPU_LTC_LTCS_LTSS_INTR_EN_ILLEGAL_COMPSTAT_ACCESS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_INTR_EN_ILLEGAL_COMPSTAT_MASK 0x00200000 +#define GPU_LTC_LTCS_LTSS_INTR_EN_ILLEGAL_COMPSTAT_SHIFT 0x00000015 +#define GPU_LTC_LTCS_LTSS_INTR_EN_ILLEGAL_COMPSTAT_FIELDMASK 0x00000001 +#define GPU_LTC_LTC0_LTS0_INTR 0x0014040c +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0 0x0017e2a0 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_PENDING_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_PENDING_F 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_MAX_CYCLES_BETWEEN_INVALIDATES_SHIFT 0x00000008 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_MAX_CYCLES_BETWEEN_INVALIDATES_FIELDMASK 0x0000000f +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_MAX_CYCLES_BETWEEN_INVALIDATES_3_V 0x00000003 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_MAX_CYCLES_BETWEEN_INVALIDATES_3_F 0x00000300 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_LAST_CLASS_SHIFT 0x0000001c +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_LAST_CLASS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_LAST_CLASS_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_LAST_CLASS_TRUE_F 0x10000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_NORMAL_CLASS_SHIFT 0x0000001d +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_NORMAL_CLASS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_NORMAL_CLASS_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_NORMAL_CLASS_TRUE_F 0x20000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_FIRST_CLASS_SHIFT 0x0000001e +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_FIRST_CLASS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_FIRST_CLASS_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT0_INVALIDATE_EVICT_FIRST_CLASS_TRUE_F 0x40000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1 0x0017e2a4 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_SHIFT 0x00000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_PENDING_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_PENDING_F 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_MAX_CYCLES_BETWEEN_CLEANS_SHIFT 0x00000008 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_MAX_CYCLES_BETWEEN_CLEANS_FIELDMASK 0x0000000f +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_MAX_CYCLES_BETWEEN_CLEANS_3_V 0x00000003 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_MAX_CYCLES_BETWEEN_CLEANS_3_F 0x00000300 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_WAIT_FOR_FB_TO_PULL_SHIFT 0x00000010 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_WAIT_FOR_FB_TO_PULL_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_WAIT_FOR_FB_TO_PULL_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_WAIT_FOR_FB_TO_PULL_TRUE_F 0x00010000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_LAST_CLASS_SHIFT 0x0000001c +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_LAST_CLASS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_LAST_CLASS_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_LAST_CLASS_TRUE_F 0x10000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_NORMAL_CLASS_SHIFT 0x0000001d +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_NORMAL_CLASS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_NORMAL_CLASS_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_NORMAL_CLASS_TRUE_F 0x20000000 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_FIRST_CLASS_SHIFT 0x0000001e +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_FIRST_CLASS_FIELDMASK 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_FIRST_CLASS_TRUE_V 0x00000001 +#define GPU_LTC_LTCS_LTSS_TSTG_CMGMT1_CLEAN_EVICT_FIRST_CLASS_TRUE_F 0x40000000 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT0 0x001402a0 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT0_INVALIDATE_SHIFT 0x00000000 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT0_INVALIDATE_FIELDMASK 0x00000001 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT0_INVALIDATE_PENDING_V 0x00000001 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT0_INVALIDATE_PENDING_F 0x00000001 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT1 0x001402a4 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT1_CLEAN_SHIFT 0x00000000 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT1_CLEAN_FIELDMASK 0x00000001 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT1_CLEAN_PENDING_V 0x00000001 +#define GPU_LTC_LTC0_LTSS_TSTG_CMGMT1_CLEAN_PENDING_F 0x00000001 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT0 0x001422a0 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT0_INVALIDATE_SHIFT 0x00000000 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT0_INVALIDATE_FIELDMASK 0x00000001 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT0_INVALIDATE_PENDING_V 0x00000001 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT0_INVALIDATE_PENDING_F 0x00000001 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT1 0x001422a4 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT1_CLEAN_SHIFT 0x00000000 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT1_CLEAN_FIELDMASK 0x00000001 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT1_CLEAN_PENDING_V 0x00000001 +#define GPU_LTC_LTC1_LTSS_TSTG_CMGMT1_CLEAN_PENDING_F 0x00000001 + +#define GPU_MC_BOOT_0 0x00000000 +#define GPU_MC_BOOT_0_ARCHITECTURE_SHIFT 0x00000018 +#define GPU_MC_BOOT_0_ARCHITECTURE_FIELDMASK 0x0000001f +#define GPU_MC_BOOT_0_IMPLEMENTATION_SHIFT 0x00000014 +#define GPU_MC_BOOT_0_IMPLEMENTATION_FIELDMASK 0x0000000f +#define GPU_MC_BOOT_0_MAJOR_REVISION_SHIFT 0x00000004 +#define GPU_MC_BOOT_0_MAJOR_REVISION_FIELDMASK 0x0000000f +#define GPU_MC_BOOT_0_MINOR_REVISION_SHIFT 0x00000000 +#define GPU_MC_BOOT_0_MINOR_REVISION_FIELDMASK 0x0000000f +#define GPU_MC_INTR__BASE 0x00000100 +#define GPU_MC_INTR__STRIDE 0x00000004 +#define GPU_MC_INTR(i) (0x00000100 + (i) * 0x00000004) +#define GPU_MC_INTR_PFIFO_PENDING_F 0x00000100 +#define GPU_MC_INTR_PMU_PENDING_F 0x01000000 +#define GPU_MC_INTR_LTC_PENDING_F 0x02000000 +#define GPU_MC_INTR_PRIV_RING_PENDING_F 0x40000000 +#define GPU_MC_INTR_PBUS_PENDING_F 0x10000000 +#define GPU_MC_INTR_MASK_0 0x00000640 +#define GPU_MC_INTR_MASK_0_PMU_ENABLED_F 0x01000000 +#define GPU_MC_INTR_EN_0 0x00000140 +#define GPU_MC_INTR_EN_0_INTA_DISABLED_F 0x00000000 +#define GPU_MC_INTR_EN_0_INTA_HARDWARE_F 0x00000001 +#define GPU_MC_INTR_MASK_1 0x00000644 +#define GPU_MC_INTR_MASK_1_PMU_SIZE 0x00000001 +#define GPU_MC_INTR_MASK_1_PMU_SHIFT 0x00000018 +#define GPU_MC_INTR_MASK_1_PMU_FIELDMASK 0x00000001 +#define GPU_MC_INTR_MASK_1_PMU_MASK 0x01000000 +#define GPU_MC_INTR_MASK_1_PMU_ENABLED_F 0x01000000 +#define GPU_MC_INTR_EN_1 0x00000144 +#define GPU_MC_INTR_EN_1_INTA_DISABLED_F 0x00000000 +#define GPU_MC_INTR_EN_1_INTA_HARDWARE_F 0x00000001 +#define GPU_MC_ENABLE 0x00000200 +#define GPU_MC_ENABLE_XBAR_ENABLED_F 0x00000004 +#define GPU_MC_ENABLE_L2_ENABLED_F 0x00000008 +#define GPU_MC_ENABLE_PMEDIA_SIZE 0x00000001 +#define GPU_MC_ENABLE_PMEDIA_SHIFT 0x00000004 +#define GPU_MC_ENABLE_PMEDIA_FIELDMASK 0x00000001 +#define GPU_MC_ENABLE_PMEDIA_MASK 0x00000010 +#define GPU_MC_ENABLE_PRIV_RING_ENABLED_F 0x00000020 +#define GPU_MC_ENABLE_CE0_MASK 0x00000040 +#define GPU_MC_ENABLE_CE0_SHIFT 0x00000006 +#define GPU_MC_ENABLE_CE0_FIELDMASK 0x00000001 +#define GPU_MC_ENABLE_PFIFO_ENABLED_F 0x00000100 +#define GPU_MC_ENABLE_PGRAPH_ENABLED_F 0x00001000 +#define GPU_MC_ENABLE_PWR_SHIFT 0x0000000d +#define GPU_MC_ENABLE_PWR_FIELDMASK 0x00000001 +#define GPU_MC_ENABLE_PWR_DISABLED_V 0x00000000 +#define GPU_MC_ENABLE_PWR_ENABLED_F 0x00002000 +#define GPU_MC_ENABLE_PFB_ENABLED_F 0x00100000 +#define GPU_MC_ENABLE_CE2_MASK 0x00200000 +#define GPU_MC_ENABLE_CE2_SHIFT 0x00000015 +#define GPU_MC_ENABLE_CE2_FIELDMASK 0x00000001 +#define GPU_MC_ENABLE_CE2_ENABLED_F 0x00200000 +#define GPU_MC_ENABLE_BLG_ENABLED_F 0x08000000 +#define GPU_MC_ENABLE_PERFMON_ENABLED_F 0x10000000 +#define GPU_MC_ENABLE_HUB_ENABLED_F 0x20000000 +#define GPU_MC_INTR_LTC 0x0000017c +#define GPU_MC_ENABLE_PB 0x00000204 +#define GPU_MC_ENABLE_PB_0_SIZE 0x00000001 +#define GPU_MC_ENABLE_PB_0_SHIFT 0x00000000 +#define GPU_MC_ENABLE_PB_0_FIELDMASK 0x00000001 +#define GPU_MC_ENABLE_PB_0_MASK 0x00000001 +#define GPU_MC_ENABLE_PB_0_ENABLED_V 0x00000001 +#define GPU_MC_ENABLE_PB_SEL_FIELDMASK 0x00000001 +#define GPU_MC_ENABLE_PB_SEL__SHIFT_BASE 0x00000000 +#define GPU_MC_ENABLE_PB_SEL__SHIFT_STRIDE 0x00000001 +#define GPU_MC_ENABLE_PB_SEL__SHIFT_I(i) (0 + (i) * 1) +#define GPU_MC_ELPG_ENABLE 0x0000020c +#define GPU_MC_ELPG_ENABLE_XBAR_ENABLED_F 0x00000004 +#define GPU_MC_ELPG_ENABLE_PFB_ENABLED_F 0x00100000 +#define GPU_MC_ELPG_ENABLE_HUB_ENABLED_F 0x20000000 + +#define GPU_PBDMA_GP_ENTRY1 0x10000004 +#define GPU_PBDMA_GP_ENTRY1_GET_HI_SHIFT 0x00000000 +#define GPU_PBDMA_GP_ENTRY1_GET_HI_FIELDMASK 0x000000ff +#define GPU_PBDMA_GP_ENTRY1_LENGTH_SHIFT 0x0000000a +#define GPU_PBDMA_GP_ENTRY1_LENGTH_FIELDMASK 0x001fffff +#define GPU_PBDMA_GP_BASE__BASE 0x00040048 +#define GPU_PBDMA_GP_BASE__STRIDE 0x00002000 +#define GPU_PBDMA_GP_BASE(i) (0x00040048 + (i) * 0x00002000) +#define GPU_PBDMA_GP_BASE__SIZE_1_V 0x00000001 +#define GPU_PBDMA_GP_BASE_OFFSET_SHIFT 0x00000003 +#define GPU_PBDMA_GP_BASE_OFFSET_FIELDMASK 0x1fffffff +#define GPU_PBDMA_GP_BASE_RSVD_SIZE 0x00000003 +#define GPU_PBDMA_GP_BASE_HI__BASE 0x0004004c +#define GPU_PBDMA_GP_BASE_HI__STRIDE 0x00002000 +#define GPU_PBDMA_GP_BASE_HI(i) (0x0004004c + (i) * 0x00002000) +#define GPU_PBDMA_GP_BASE_HI_OFFSET_SHIFT 0x00000000 +#define GPU_PBDMA_GP_BASE_HI_OFFSET_FIELDMASK 0x000000ff +#define GPU_PBDMA_GP_BASE_HI_LIMIT2_SHIFT 0x00000010 +#define GPU_PBDMA_GP_BASE_HI_LIMIT2_FIELDMASK 0x0000001f +#define GPU_PBDMA_GP_FETCH__BASE 0x00040050 +#define GPU_PBDMA_GP_FETCH__STRIDE 0x00002000 +#define GPU_PBDMA_GP_FETCH(i) (0x00040050 + (i) * 0x00002000) +#define GPU_PBDMA_GP_GET__BASE 0x00040014 +#define GPU_PBDMA_GP_GET__STRIDE 0x00002000 +#define GPU_PBDMA_GP_GET(i) (0x00040014 + (i) * 0x00002000) +#define GPU_PBDMA_GP_PUT__BASE 0x00040000 +#define GPU_PBDMA_GP_PUT__STRIDE 0x00002000 +#define GPU_PBDMA_GP_PUT(i) (0x00040000 + (i) * 0x00002000) +#define GPU_PBDMA_PB_FETCH__BASE 0x00040054 +#define GPU_PBDMA_PB_FETCH__STRIDE 0x00002000 +#define GPU_PBDMA_PB_FETCH(i) (0x00040054 + (i) * 0x00002000) +#define GPU_PBDMA_PB_FETCH_HI__BASE 0x00040058 +#define GPU_PBDMA_PB_FETCH_HI__STRIDE 0x00002000 +#define GPU_PBDMA_PB_FETCH_HI(i) (0x00040058 + (i) * 0x00002000) +#define GPU_PBDMA_GET__BASE 0x00040018 +#define GPU_PBDMA_GET__STRIDE 0x00002000 +#define GPU_PBDMA_GET(i) (0x00040018 + (i) * 0x00002000) +#define GPU_PBDMA_GET_HI__BASE 0x0004001c +#define GPU_PBDMA_GET_HI__STRIDE 0x00002000 +#define GPU_PBDMA_GET_HI(i) (0x0004001c + (i) * 0x00002000) +#define GPU_PBDMA_PUT__BASE 0x0004005c +#define GPU_PBDMA_PUT__STRIDE 0x00002000 +#define GPU_PBDMA_PUT(i) (0x0004005c + (i) * 0x00002000) +#define GPU_PBDMA_PUT_HI__BASE 0x00040060 +#define GPU_PBDMA_PUT_HI__STRIDE 0x00002000 +#define GPU_PBDMA_PUT_HI(i) (0x00040060 + (i) * 0x00002000) +#define GPU_PBDMA_FORMATS__BASE 0x0004009c +#define GPU_PBDMA_FORMATS__STRIDE 0x00002000 +#define GPU_PBDMA_FORMATS(i) (0x0004009c + (i) * 0x00002000) +#define GPU_PBDMA_FORMATS_GP_FERMI0_F 0x00000000 +#define GPU_PBDMA_FORMATS_PB_FERMI1_F 0x00000100 +#define GPU_PBDMA_FORMATS_MP_FERMI0_F 0x00000000 +#define GPU_PBDMA_PB_HEADER__BASE 0x00040084 +#define GPU_PBDMA_PB_HEADER__STRIDE 0x00002000 +#define GPU_PBDMA_PB_HEADER(i) (0x00040084 + (i) * 0x00002000) +#define GPU_PBDMA_PB_HEADER_PRIV_USER_F 0x00000000 +#define GPU_PBDMA_PB_HEADER_METHOD_ZERO_F 0x00000000 +#define GPU_PBDMA_PB_HEADER_SUBCHANNEL_ZERO_F 0x00000000 +#define GPU_PBDMA_PB_HEADER_LEVEL_MAIN_F 0x00000000 +#define GPU_PBDMA_PB_HEADER_FIRST_TRUE_F 0x00400000 +#define GPU_PBDMA_PB_HEADER_TYPE_INC_F 0x20000000 +#define GPU_PBDMA_PB_HEADER_TYPE_NON_INC_F 0x60000000 +#define GPU_PBDMA_HDR_SHADOW__BASE 0x00040118 +#define GPU_PBDMA_HDR_SHADOW__STRIDE 0x00002000 +#define GPU_PBDMA_HDR_SHADOW(i) (0x00040118 + (i) * 0x00002000) +#define GPU_PBDMA_SUBDEVICE__BASE 0x00040094 +#define GPU_PBDMA_SUBDEVICE__STRIDE 0x00002000 +#define GPU_PBDMA_SUBDEVICE(i) (0x00040094 + (i) * 0x00002000) +#define GPU_PBDMA_SUBDEVICE_ID_SHIFT 0x00000000 +#define GPU_PBDMA_SUBDEVICE_ID_FIELDMASK 0x00000fff +#define GPU_PBDMA_SUBDEVICE_STATUS_ACTIVE_F 0x10000000 +#define GPU_PBDMA_SUBDEVICE_CHANNEL_DMA_ENABLE_F 0x20000000 +#define GPU_PBDMA_METHOD0__BASE 0x000400c0 +#define GPU_PBDMA_METHOD0__STRIDE 0x00002000 +#define GPU_PBDMA_METHOD0(i) (0x000400c0 + (i) * 0x00002000) +#define GPU_PBDMA_METHOD0_FIFO_SIZE_V 0x00000004 +#define GPU_PBDMA_METHOD0_ADDR_SHIFT 0x00000002 +#define GPU_PBDMA_METHOD0_ADDR_FIELDMASK 0x00000fff +#define GPU_PBDMA_METHOD0_SUBCH_SHIFT 0x00000010 +#define GPU_PBDMA_METHOD0_SUBCH_FIELDMASK 0x00000007 +#define GPU_PBDMA_METHOD0_FIRST_TRUE_F 0x00400000 +#define GPU_PBDMA_METHOD0_VALID_TRUE_F 0x80000000 +#define GPU_PBDMA_METHOD1__BASE 0x000400c8 +#define GPU_PBDMA_METHOD1__STRIDE 0x00002000 +#define GPU_PBDMA_METHOD1(i) (0x000400c8 + (i) * 0x00002000) +#define GPU_PBDMA_METHOD2__BASE 0x000400d0 +#define GPU_PBDMA_METHOD2__STRIDE 0x00002000 +#define GPU_PBDMA_METHOD2(i) (0x000400d0 + (i) * 0x00002000) +#define GPU_PBDMA_METHOD3__BASE 0x000400d8 +#define GPU_PBDMA_METHOD3__STRIDE 0x00002000 +#define GPU_PBDMA_METHOD3(i) (0x000400d8 + (i) * 0x00002000) +#define GPU_PBDMA_DATA0__BASE 0x000400c4 +#define GPU_PBDMA_DATA0__STRIDE 0x00002000 +#define GPU_PBDMA_DATA0(i) (0x000400c4 + (i) * 0x00002000) +#define GPU_PBDMA_TARGET__BASE 0x000400ac +#define GPU_PBDMA_TARGET__STRIDE 0x00002000 +#define GPU_PBDMA_TARGET(i) (0x000400ac + (i) * 0x00002000) +#define GPU_PBDMA_TARGET_ENGINE_SW_F 0x0000001f +#define GPU_PBDMA_ACQUIRE__BASE 0x00040030 +#define GPU_PBDMA_ACQUIRE__STRIDE 0x00002000 +#define GPU_PBDMA_ACQUIRE(i) (0x00040030 + (i) * 0x00002000) +#define GPU_PBDMA_ACQUIRE_RETRY_MAN_2_F 0x00000002 +#define GPU_PBDMA_ACQUIRE_RETRY_EXP_2_F 0x00000100 +#define GPU_PBDMA_ACQUIRE_TIMEOUT_EXP_SHIFT 0x0000000b +#define GPU_PBDMA_ACQUIRE_TIMEOUT_EXP_FIELDMASK 0x0000000f +#define GPU_PBDMA_ACQUIRE_TIMEOUT_EXP_MAX_V 0x0000000f +#define GPU_PBDMA_ACQUIRE_TIMEOUT_EXP_MAX_F 0x00007800 +#define GPU_PBDMA_ACQUIRE_TIMEOUT_MAN_SHIFT 0x0000000f +#define GPU_PBDMA_ACQUIRE_TIMEOUT_MAN_FIELDMASK 0x0000ffff +#define GPU_PBDMA_ACQUIRE_TIMEOUT_MAN_MAX_V 0x0000ffff +#define GPU_PBDMA_ACQUIRE_TIMEOUT_MAN_MAX_F 0x7fff8000 +#define GPU_PBDMA_ACQUIRE_TIMEOUT_EN_ENABLE_F 0x80000000 +#define GPU_PBDMA_ACQUIRE_TIMEOUT_EN_DISABLE_F 0x00000000 +#define GPU_PBDMA_STATUS__BASE 0x00040100 +#define GPU_PBDMA_STATUS__STRIDE 0x00002000 +#define GPU_PBDMA_STATUS(i) (0x00040100 + (i) * 0x00002000) +#define GPU_PBDMA_CHANNEL__BASE 0x00040120 +#define GPU_PBDMA_CHANNEL__STRIDE 0x00002000 +#define GPU_PBDMA_CHANNEL(i) (0x00040120 + (i) * 0x00002000) +#define GPU_PBDMA_SIGNATURE__BASE 0x00040010 +#define GPU_PBDMA_SIGNATURE__STRIDE 0x00002000 +#define GPU_PBDMA_SIGNATURE(i) (0x00040010 + (i) * 0x00002000) +#define GPU_PBDMA_SIGNATURE_HW_VALID_F 0x0000face +#define GPU_PBDMA_SIGNATURE_SW_ZERO_F 0x00000000 +#define GPU_PBDMA_USERD__BASE 0x00040008 +#define GPU_PBDMA_USERD__STRIDE 0x00002000 +#define GPU_PBDMA_USERD(i) (0x00040008 + (i) * 0x00002000) +#define GPU_PBDMA_USERD_TARGET_VID_MEM_F 0x00000000 +#define GPU_PBDMA_USERD_TARGET_SYS_MEM_COH_F 0x00000002 +#define GPU_PBDMA_USERD_TARGET_SYS_MEM_NCOH_F 0x00000003 +#define GPU_PBDMA_USERD_ADDR_SHIFT 0x00000009 +#define GPU_PBDMA_USERD_ADDR_FIELDMASK 0x007fffff +#define GPU_PBDMA_USERD_HI__BASE 0x0004000c +#define GPU_PBDMA_USERD_HI__STRIDE 0x00002000 +#define GPU_PBDMA_USERD_HI(i) (0x0004000c + (i) * 0x00002000) +#define GPU_PBDMA_USERD_HI_ADDR_SHIFT 0x00000000 +#define GPU_PBDMA_USERD_HI_ADDR_FIELDMASK 0x000000ff +#define GPU_PBDMA_HCE_CTRL__BASE 0x000400e4 +#define GPU_PBDMA_HCE_CTRL__STRIDE 0x00002000 +#define GPU_PBDMA_HCE_CTRL(i) (0x000400e4 + (i) * 0x00002000) +#define GPU_PBDMA_HCE_CTRL_HCE_PRIV_MODE_YES_F 0x00000020 +#define GPU_PBDMA_INTR_0__BASE 0x00040108 +#define GPU_PBDMA_INTR_0__STRIDE 0x00002000 +#define GPU_PBDMA_INTR_0(i) (0x00040108 + (i) * 0x00002000) +#define GPU_PBDMA_INTR_0_MEMREQ_SHIFT 0x00000000 +#define GPU_PBDMA_INTR_0_MEMREQ_FIELDMASK 0x00000001 +#define GPU_PBDMA_INTR_0_MEMREQ_PENDING_F 0x00000001 +#define GPU_PBDMA_INTR_0_MEMACK_TIMEOUT_PENDING_F 0x00000002 +#define GPU_PBDMA_INTR_0_MEMACK_EXTRA_PENDING_F 0x00000004 +#define GPU_PBDMA_INTR_0_MEMDAT_TIMEOUT_PENDING_F 0x00000008 +#define GPU_PBDMA_INTR_0_MEMDAT_EXTRA_PENDING_F 0x00000010 +#define GPU_PBDMA_INTR_0_MEMFLUSH_PENDING_F 0x00000020 +#define GPU_PBDMA_INTR_0_MEMOP_PENDING_F 0x00000040 +#define GPU_PBDMA_INTR_0_LBCONNECT_PENDING_F 0x00000080 +#define GPU_PBDMA_INTR_0_LBREQ_PENDING_F 0x00000100 +#define GPU_PBDMA_INTR_0_LBACK_TIMEOUT_PENDING_F 0x00000200 +#define GPU_PBDMA_INTR_0_LBACK_EXTRA_PENDING_F 0x00000400 +#define GPU_PBDMA_INTR_0_LBDAT_TIMEOUT_PENDING_F 0x00000800 +#define GPU_PBDMA_INTR_0_LBDAT_EXTRA_PENDING_F 0x00001000 +#define GPU_PBDMA_INTR_0_GPFIFO_PENDING_F 0x00002000 +#define GPU_PBDMA_INTR_0_GPPTR_PENDING_F 0x00004000 +#define GPU_PBDMA_INTR_0_GPENTRY_PENDING_F 0x00008000 +#define GPU_PBDMA_INTR_0_GPCRC_PENDING_F 0x00010000 +#define GPU_PBDMA_INTR_0_PBPTR_PENDING_F 0x00020000 +#define GPU_PBDMA_INTR_0_PBENTRY_PENDING_F 0x00040000 +#define GPU_PBDMA_INTR_0_PBCRC_PENDING_F 0x00080000 +#define GPU_PBDMA_INTR_0_XBARCONNECT_PENDING_F 0x00100000 +#define GPU_PBDMA_INTR_0_METHOD_PENDING_F 0x00200000 +#define GPU_PBDMA_INTR_0_METHODCRC_PENDING_F 0x00400000 +#define GPU_PBDMA_INTR_0_DEVICE_PENDING_F 0x00800000 +#define GPU_PBDMA_INTR_0_SEMAPHORE_PENDING_F 0x02000000 +#define GPU_PBDMA_INTR_0_ACQUIRE_PENDING_F 0x04000000 +#define GPU_PBDMA_INTR_0_PRI_PENDING_F 0x08000000 +#define GPU_PBDMA_INTR_0_NO_CTXSW_SEG_PENDING_F 0x20000000 +#define GPU_PBDMA_INTR_0_PBSEG_PENDING_F 0x40000000 +#define GPU_PBDMA_INTR_0_SIGNATURE_PENDING_F 0x80000000 +#define GPU_PBDMA_INTR_1__BASE 0x00040148 +#define GPU_PBDMA_INTR_1__STRIDE 0x00002000 +#define GPU_PBDMA_INTR_1(i) (0x00040148 + (i) * 0x00002000) +#define GPU_PBDMA_INTR_EN_0__BASE 0x0004010c +#define GPU_PBDMA_INTR_EN_0__STRIDE 0x00002000 +#define GPU_PBDMA_INTR_EN_0(i) (0x0004010c + (i) * 0x00002000) +#define GPU_PBDMA_INTR_EN_0_LBREQ_ENABLED_F 0x00000100 +#define GPU_PBDMA_INTR_EN_1__BASE 0x0004014c +#define GPU_PBDMA_INTR_EN_1__STRIDE 0x00002000 +#define GPU_PBDMA_INTR_EN_1(i) (0x0004014c + (i) * 0x00002000) +#define GPU_PBDMA_INTR_STALL__BASE 0x0004013c +#define GPU_PBDMA_INTR_STALL__STRIDE 0x00002000 +#define GPU_PBDMA_INTR_STALL(i) (0x0004013c + (i) * 0x00002000) +#define GPU_PBDMA_INTR_STALL_LBREQ_ENABLED_F 0x00000100 +#define GPU_PBDMA_UDMA_NOP 0x00000008 +#define GPU_PBDMA_SYNCPOINTA__BASE 0x000400a4 +#define GPU_PBDMA_SYNCPOINTA__STRIDE 0x00002000 +#define GPU_PBDMA_SYNCPOINTA(i) (0x000400a4 + (i) * 0x00002000) +#define GPU_PBDMA_SYNCPOINTA_PAYLOAD_SHIFT 0x00000000 +#define GPU_PBDMA_SYNCPOINTA_PAYLOAD_FIELDMASK 0xffffffff +#define GPU_PBDMA_SYNCPOINTB__BASE 0x000400a8 +#define GPU_PBDMA_SYNCPOINTB__STRIDE 0x00002000 +#define GPU_PBDMA_SYNCPOINTB(i) (0x000400a8 + (i) * 0x00002000) +#define GPU_PBDMA_SYNCPOINTB_OP_SHIFT 0x00000000 +#define GPU_PBDMA_SYNCPOINTB_OP_FIELDMASK 0x00000003 +#define GPU_PBDMA_SYNCPOINTB_OP_WAIT_V 0x00000000 +#define GPU_PBDMA_SYNCPOINTB_WAIT_SWITCH_SHIFT 0x00000004 +#define GPU_PBDMA_SYNCPOINTB_WAIT_SWITCH_FIELDMASK 0x00000001 +#define GPU_PBDMA_SYNCPOINTB_WAIT_SWITCH_EN_V 0x00000001 +#define GPU_PBDMA_SYNCPOINTB_SYNCPT_INDEX_SHIFT 0x00000008 +#define GPU_PBDMA_SYNCPOINTB_SYNCPT_INDEX_FIELDMASK 0x000000ff +#define GPU_PBDMA_RUNLIST_TIMESLICE__BASE 0x000400f8 +#define GPU_PBDMA_RUNLIST_TIMESLICE__STRIDE 0x00002000 +#define GPU_PBDMA_RUNLIST_TIMESLICE(i) (0x000400f8 + (i) * 0x00002000) +#define GPU_PBDMA_RUNLIST_TIMESLICE_TIMEOUT_128_F 0x00000080 +#define GPU_PBDMA_RUNLIST_TIMESLICE_TIMESCALE_3_F 0x00003000 +#define GPU_PBDMA_RUNLIST_TIMESLICE_ENABLE_TRUE_F 0x10000000 + +#define GPU_PERF_PMASYS_CONTROL 0x001b4000 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_STATUS_SHIFT 0x00000004 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_STATUS_FIELDMASK 0x00000001 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_STATUS_OVERFLOWED_V 0x00000001 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_STATUS_OVERFLOWED_F 0x00000010 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_CLEAR_STATUS_SHIFT 0x00000005 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_CLEAR_STATUS_FIELDMASK 0x00000001 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_CLEAR_STATUS_DOIT_V 0x00000001 +#define GPU_PERF_PMASYS_CONTROL_MEMBUF_CLEAR_STATUS_DOIT_F 0x00000020 +#define GPU_PERF_PMASYS_MEM_BLOCK 0x001b4070 +#define GPU_PERF_PMASYS_MEM_BLOCK_BASE_SHIFT 0x00000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_BASE_FIELDMASK 0x0fffffff +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_SHIFT 0x0000001c +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_FIELDMASK 0x00000003 +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_LFB_V 0x00000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_LFB_F 0x00000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_SYS_COH_V 0x00000002 +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_SYS_COH_F 0x20000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_SYS_NCOH_V 0x00000003 +#define GPU_PERF_PMASYS_MEM_BLOCK_TARGET_SYS_NCOH_F 0x30000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_VALID_SHIFT 0x0000001f +#define GPU_PERF_PMASYS_MEM_BLOCK_VALID_FIELDMASK 0x00000001 +#define GPU_PERF_PMASYS_MEM_BLOCK_VALID_TRUE_V 0x00000001 +#define GPU_PERF_PMASYS_MEM_BLOCK_VALID_TRUE_F 0x80000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_VALID_FALSE_V 0x00000000 +#define GPU_PERF_PMASYS_MEM_BLOCK_VALID_FALSE_F 0x00000000 +#define GPU_PERF_PMASYS_OUTBASE 0x001b4074 +#define GPU_PERF_PMASYS_OUTBASE_PTR_SHIFT 0x00000005 +#define GPU_PERF_PMASYS_OUTBASE_PTR_FIELDMASK 0x07ffffff +#define GPU_PERF_PMASYS_OUTBASEUPPER 0x001b4078 +#define GPU_PERF_PMASYS_OUTBASEUPPER_PTR_SHIFT 0x00000000 +#define GPU_PERF_PMASYS_OUTBASEUPPER_PTR_FIELDMASK 0x000000ff +#define GPU_PERF_PMASYS_OUTSIZE 0x001b407c +#define GPU_PERF_PMASYS_OUTSIZE_NUMBYTES_SHIFT 0x00000005 +#define GPU_PERF_PMASYS_OUTSIZE_NUMBYTES_FIELDMASK 0x07ffffff +#define GPU_PERF_PMASYS_MEM_BYTES 0x001b4084 +#define GPU_PERF_PMASYS_MEM_BYTES_NUMBYTES_SHIFT 0x00000004 +#define GPU_PERF_PMASYS_MEM_BYTES_NUMBYTES_FIELDMASK 0x0fffffff +#define GPU_PERF_PMASYS_MEM_BUMP 0x001b4088 +#define GPU_PERF_PMASYS_MEM_BUMP_NUMBYTES_SHIFT 0x00000004 +#define GPU_PERF_PMASYS_MEM_BUMP_NUMBYTES_FIELDMASK 0x0fffffff +#define GPU_PERF_PMASYS_ENGINESTATUS 0x001b40a4 +#define GPU_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY_SHIFT 0x00000004 +#define GPU_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY_FIELDMASK 0x00000001 +#define GPU_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY_EMPTY_V 0x00000001 +#define GPU_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY_EMPTY_F 0x00000010 + +#define GPU_PRAM_DATA032__BASE 0x00700000 +#define GPU_PRAM_DATA032__STRIDE 0x00000004 +#define GPU_PRAM_DATA032(i) (0x00700000 + (i) * 0x00000004) + +#define GPU_PRI_RINGMASTER_COMMAND 0x0012004c +#define GPU_PRI_RINGMASTER_COMMAND_CMD_MASK 0x0000003f +#define GPU_PRI_RINGMASTER_COMMAND_CMD_SHIFT 0x00000000 +#define GPU_PRI_RINGMASTER_COMMAND_CMD_FIELDMASK 0x0000003f +#define GPU_PRI_RINGMASTER_COMMAND_CMD_NO_CMD_V 0x00000000 +#define GPU_PRI_RINGMASTER_COMMAND_CMD_START_RING_F 0x00000001 +#define GPU_PRI_RINGMASTER_COMMAND_CMD_ACK_INTERRUPT_F 0x00000002 +#define GPU_PRI_RINGMASTER_COMMAND_CMD_ENUMERATE_STATIONS_F 0x00000003 +#define GPU_PRI_RINGMASTER_COMMAND_CMD_ENUMERATE_STATIONS_BC_GRP_ALL_F 0x00000000 +#define GPU_PRI_RINGMASTER_COMMAND_DATA 0x00120048 +#define GPU_PRI_RINGMASTER_START_RESULTS 0x00120050 +#define GPU_PRI_RINGMASTER_START_RESULTS_CONNECTIVITY_SHIFT 0x00000000 +#define GPU_PRI_RINGMASTER_START_RESULTS_CONNECTIVITY_FIELDMASK 0x00000001 +#define GPU_PRI_RINGMASTER_START_RESULTS_CONNECTIVITY_PASS_V 0x00000001 +#define GPU_PRI_RINGMASTER_INTR_STATUS0 0x00120058 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_RING_START_CONN_FAULT_SHIFT 0x00000000 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_RING_START_CONN_FAULT_FIELDMASK 0x00000001 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_DISCONNECT_FAULT_SHIFT 0x00000001 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_DISCONNECT_FAULT_FIELDMASK 0x00000001 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_OVERFLOW_FAULT_SHIFT 0x00000002 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_OVERFLOW_FAULT_FIELDMASK 0x00000001 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_GBL_WRITE_ERROR_SYS_SHIFT 0x00000008 +#define GPU_PRI_RINGMASTER_INTR_STATUS0_GBL_WRITE_ERROR_SYS_FIELDMASK 0x00000001 +#define GPU_PRI_RINGMASTER_INTR_STATUS1 0x0012005c +#define GPU_PRI_RINGMASTER_GLOBAL_CTL 0x00120060 +#define GPU_PRI_RINGMASTER_GLOBAL_CTL_RING_RESET_ASSERTED_F 0x00000001 +#define GPU_PRI_RINGMASTER_GLOBAL_CTL_RING_RESET_DEASSERTED_F 0x00000000 +#define GPU_PRI_RINGMASTER_ENUM_FBP 0x00120074 +#define GPU_PRI_RINGMASTER_ENUM_FBP_COUNT_SHIFT 0x00000000 +#define GPU_PRI_RINGMASTER_ENUM_FBP_COUNT_FIELDMASK 0x0000001f +#define GPU_PRI_RINGMASTER_ENUM_GPC 0x00120078 +#define GPU_PRI_RINGMASTER_ENUM_GPC_COUNT_SHIFT 0x00000000 +#define GPU_PRI_RINGMASTER_ENUM_GPC_COUNT_FIELDMASK 0x0000001f +#define GPU_PRI_RINGMASTER_ENUM_LTC 0x0012006c +#define GPU_PRI_RINGMASTER_ENUM_LTC_COUNT_SHIFT 0x00000000 +#define GPU_PRI_RINGMASTER_ENUM_LTC_COUNT_FIELDMASK 0x0000001f + +#define GPU_PRI_RINGSTATION_GPC_MASTER_CONFIG__BASE 0x00128300 +#define GPU_PRI_RINGSTATION_GPC_MASTER_CONFIG__STRIDE 0x00000004 +#define GPU_PRI_RINGSTATION_GPC_MASTER_CONFIG(i) (0x00128300 + (i) * 0x00000004) +#define GPU_PRI_RINGSTATION_GPC_GPC0_PRIV_ERROR_ADR 0x00128120 +#define GPU_PRI_RINGSTATION_GPC_GPC0_PRIV_ERROR_WRDAT 0x00128124 +#define GPU_PRI_RINGSTATION_GPC_GPC0_PRIV_ERROR_INFO 0x00128128 +#define GPU_PRI_RINGSTATION_GPC_GPC0_PRIV_ERROR_CODE 0x0012812c + +#define GPU_PRI_RINGSTATION_SYS_MASTER_CONFIG__BASE 0x00122300 +#define GPU_PRI_RINGSTATION_SYS_MASTER_CONFIG__STRIDE 0x00000004 +#define GPU_PRI_RINGSTATION_SYS_MASTER_CONFIG(i) (0x00122300 + (i) * 0x00000004) +#define GPU_PRI_RINGSTATION_SYS_DECODE_CONFIG 0x00122204 +#define GPU_PRI_RINGSTATION_SYS_DECODE_CONFIG_RING_MASK 0x00000007 +#define GPU_PRI_RINGSTATION_SYS_DECODE_CONFIG_RING_SHIFT 0x00000000 +#define GPU_PRI_RINGSTATION_SYS_DECODE_CONFIG_RING_FIELDMASK 0x00000007 +#define GPU_PRI_RINGSTATION_SYS_DECODE_CONFIG_RING_DROP_ON_RING_NOT_STARTED_F 0x00000001 +#define GPU_PRI_RINGSTATION_SYS_PRIV_ERROR_ADR 0x00122120 +#define GPU_PRI_RINGSTATION_SYS_PRIV_ERROR_WRDAT 0x00122124 +#define GPU_PRI_RINGSTATION_SYS_PRIV_ERROR_INFO 0x00122128 +#define GPU_PRI_RINGSTATION_SYS_PRIV_ERROR_CODE 0x0012212c + +#define GPU_PROJ_GPC_BASE_V 0x00500000 +#define GPU_PROJ_GPC_SHARED_BASE_V 0x00418000 +#define GPU_PROJ_GPC_STRIDE_V 0x00008000 +#define GPU_PROJ_LTC_STRIDE_V 0x00002000 +#define GPU_PROJ_LTS_STRIDE_V 0x00000200 +#define GPU_PROJ_FBPA_STRIDE_V 0x00001000 +#define GPU_PROJ_PPC_IN_GPC_BASE_V 0x00003000 +#define GPU_PROJ_PPC_IN_GPC_SHARED_BASE_V 0x00003e00 +#define GPU_PROJ_PPC_IN_GPC_STRIDE_V 0x00000200 +#define GPU_PROJ_ROP_BASE_V 0x00410000 +#define GPU_PROJ_ROP_SHARED_BASE_V 0x00408800 +#define GPU_PROJ_ROP_STRIDE_V 0x00000400 +#define GPU_PROJ_TPC_IN_GPC_BASE_V 0x00004000 +#define GPU_PROJ_TPC_IN_GPC_STRIDE_V 0x00000800 +#define GPU_PROJ_TPC_IN_GPC_SHARED_BASE_V 0x00001800 +#define GPU_PROJ_HOST_NUM_ENGINES_V 0x00000002 +#define GPU_PROJ_HOST_NUM_PBDMA_V 0x00000001 +#define GPU_PROJ_SCAL_LITTER_NUM_TPC_PER_GPC_V 0x00000002 +#define GPU_PROJ_SCAL_LITTER_NUM_FBPS_V 0x00000001 +#define GPU_PROJ_SCAL_LITTER_NUM_FBPAS_V 0x00000001 +#define GPU_PROJ_SCAL_LITTER_NUM_GPCS_V 0x00000001 +#define GPU_PROJ_SCAL_LITTER_NUM_PES_PER_GPC_V 0x00000001 +#define GPU_PROJ_SCAL_LITTER_NUM_TPCS_PER_PES_V 0x00000002 +#define GPU_PROJ_SCAL_LITTER_NUM_ZCULL_BANKS_V 0x00000004 +#define GPU_PROJ_SCAL_MAX_GPCS_V 0x00000020 +#define GPU_PROJ_SCAL_MAX_TPC_PER_GPC_V 0x00000008 + +#define GPU_PWR_FALCON_IRQSSET 0x0010a000 +#define GPU_PWR_FALCON_IRQSSET_SWGEN0_SET_F 0x00000040 +#define GPU_PWR_FALCON_IRQSCLR 0x0010a004 +#define GPU_PWR_FALCON_IRQSTAT 0x0010a008 +#define GPU_PWR_FALCON_IRQSTAT_HALT_TRUE_F 0x00000010 +#define GPU_PWR_FALCON_IRQSTAT_EXTERR_TRUE_F 0x00000020 +#define GPU_PWR_FALCON_IRQSTAT_SWGEN0_TRUE_F 0x00000040 +#define GPU_PWR_FALCON_IRQMODE 0x0010a00c +#define GPU_PWR_FALCON_IRQMSET 0x0010a010 +#define GPU_PWR_FALCON_IRQMSET_GPTMR_SHIFT 0x00000000 +#define GPU_PWR_FALCON_IRQMSET_GPTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_WDTMR_SHIFT 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_WDTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_MTHD_SHIFT 0x00000002 +#define GPU_PWR_FALCON_IRQMSET_MTHD_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_CTXSW_SHIFT 0x00000003 +#define GPU_PWR_FALCON_IRQMSET_CTXSW_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_HALT_SHIFT 0x00000004 +#define GPU_PWR_FALCON_IRQMSET_HALT_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_EXTERR_SHIFT 0x00000005 +#define GPU_PWR_FALCON_IRQMSET_EXTERR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_SWGEN0_SHIFT 0x00000006 +#define GPU_PWR_FALCON_IRQMSET_SWGEN0_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMSET_SWGEN1_SHIFT 0x00000007 +#define GPU_PWR_FALCON_IRQMSET_SWGEN1_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR 0x0010a014 +#define GPU_PWR_FALCON_IRQMCLR_GPTMR_SHIFT 0x00000000 +#define GPU_PWR_FALCON_IRQMCLR_GPTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_WDTMR_SHIFT 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_WDTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_MTHD_SHIFT 0x00000002 +#define GPU_PWR_FALCON_IRQMCLR_MTHD_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_CTXSW_SHIFT 0x00000003 +#define GPU_PWR_FALCON_IRQMCLR_CTXSW_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_HALT_SHIFT 0x00000004 +#define GPU_PWR_FALCON_IRQMCLR_HALT_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_EXTERR_SHIFT 0x00000005 +#define GPU_PWR_FALCON_IRQMCLR_EXTERR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_SWGEN0_SHIFT 0x00000006 +#define GPU_PWR_FALCON_IRQMCLR_SWGEN0_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_SWGEN1_SHIFT 0x00000007 +#define GPU_PWR_FALCON_IRQMCLR_SWGEN1_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQMCLR_EXT_SHIFT 0x00000008 +#define GPU_PWR_FALCON_IRQMCLR_EXT_FIELDMASK 0x000000ff +#define GPU_PWR_FALCON_IRQMASK 0x0010a018 +#define GPU_PWR_FALCON_IRQDEST 0x0010a01c +#define GPU_PWR_FALCON_IRQDEST_HOST_GPTMR_SHIFT 0x00000000 +#define GPU_PWR_FALCON_IRQDEST_HOST_GPTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_WDTMR_SHIFT 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_WDTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_MTHD_SHIFT 0x00000002 +#define GPU_PWR_FALCON_IRQDEST_HOST_MTHD_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_CTXSW_SHIFT 0x00000003 +#define GPU_PWR_FALCON_IRQDEST_HOST_CTXSW_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_HALT_SHIFT 0x00000004 +#define GPU_PWR_FALCON_IRQDEST_HOST_HALT_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_EXTERR_SHIFT 0x00000005 +#define GPU_PWR_FALCON_IRQDEST_HOST_EXTERR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_SWGEN0_SHIFT 0x00000006 +#define GPU_PWR_FALCON_IRQDEST_HOST_SWGEN0_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_SWGEN1_SHIFT 0x00000007 +#define GPU_PWR_FALCON_IRQDEST_HOST_SWGEN1_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_HOST_EXT_SHIFT 0x00000008 +#define GPU_PWR_FALCON_IRQDEST_HOST_EXT_FIELDMASK 0x000000ff +#define GPU_PWR_FALCON_IRQDEST_TARGET_GPTMR_SHIFT 0x00000010 +#define GPU_PWR_FALCON_IRQDEST_TARGET_GPTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_WDTMR_SHIFT 0x00000011 +#define GPU_PWR_FALCON_IRQDEST_TARGET_WDTMR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_MTHD_SHIFT 0x00000012 +#define GPU_PWR_FALCON_IRQDEST_TARGET_MTHD_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_CTXSW_SHIFT 0x00000013 +#define GPU_PWR_FALCON_IRQDEST_TARGET_CTXSW_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_HALT_SHIFT 0x00000014 +#define GPU_PWR_FALCON_IRQDEST_TARGET_HALT_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_EXTERR_SHIFT 0x00000015 +#define GPU_PWR_FALCON_IRQDEST_TARGET_EXTERR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_SWGEN0_SHIFT 0x00000016 +#define GPU_PWR_FALCON_IRQDEST_TARGET_SWGEN0_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_SWGEN1_SHIFT 0x00000017 +#define GPU_PWR_FALCON_IRQDEST_TARGET_SWGEN1_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IRQDEST_TARGET_EXT_SHIFT 0x00000018 +#define GPU_PWR_FALCON_IRQDEST_TARGET_EXT_FIELDMASK 0x000000ff +#define GPU_PWR_FALCON_CURCTX 0x0010a050 +#define GPU_PWR_FALCON_NXTCTX 0x0010a054 +#define GPU_PWR_FALCON_MAILBOX0 0x0010a040 +#define GPU_PWR_FALCON_MAILBOX1 0x0010a044 +#define GPU_PWR_FALCON_ITFEN 0x0010a048 +#define GPU_PWR_FALCON_ITFEN_CTXEN_ENABLE_F 0x00000001 +#define GPU_PWR_FALCON_IDLESTATE 0x0010a04c +#define GPU_PWR_FALCON_IDLESTATE_FALCON_BUSY_SHIFT 0x00000000 +#define GPU_PWR_FALCON_IDLESTATE_FALCON_BUSY_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IDLESTATE_EXT_BUSY_SHIFT 0x00000001 +#define GPU_PWR_FALCON_IDLESTATE_EXT_BUSY_FIELDMASK 0x00007fff +#define GPU_PWR_FALCON_OS 0x0010a080 +#define GPU_PWR_FALCON_ENGCTL 0x0010a0a4 +#define GPU_PWR_FALCON_CPUCTL 0x0010a100 +#define GPU_PWR_FALCON_CPUCTL_STARTCPU_SHIFT 0x00000001 +#define GPU_PWR_FALCON_CPUCTL_STARTCPU_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_CPUCTL_HALT_INTR_SHIFT 0x00000004 +#define GPU_PWR_FALCON_CPUCTL_HALT_INTR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_CPUCTL_HALT_INTR_MASK 0x00000010 +#define GPU_PWR_FALCON_CPUCTL_CPUCTL_ALIAS_EN_SHIFT 0x00000006 +#define GPU_PWR_FALCON_CPUCTL_CPUCTL_ALIAS_EN_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_CPUCTL_CPUCTL_ALIAS_EN_MASK 0x00000040 +#define GPU_PWR_FALCON_CPUCTL_ALIAS 0x0010a130 +#define GPU_PWR_FALCON_CPUCTL_ALIAS_STARTCPU_SHIFT 0x00000001 +#define GPU_PWR_FALCON_CPUCTL_ALIAS_STARTCPU_FIELDMASK 0x00000001 +#define GPU_PWR_PMU_SCPCTL_STAT 0x0010ac08 +#define GPU_PWR_PMU_SCPCTL_STAT_DEBUG_MODE_SHIFT 0x00000014 +#define GPU_PWR_PMU_SCPCTL_STAT_DEBUG_MODE_FIELDMASK 0x00000001 +#define GPU_PWR_PMU_SCPCTL_STAT_DEBUG_MODE_MASK 0x00100000 +#define GPU_PWR_FALCON_IMEMC__BASE 0x0010a180 +#define GPU_PWR_FALCON_IMEMC__STRIDE 0x00000010 +#define GPU_PWR_FALCON_IMEMC(i) (0x0010a180 + (i) * 0x00000010) +#define GPU_PWR_FALCON_IMEMC_OFFS_SHIFT 0x00000002 +#define GPU_PWR_FALCON_IMEMC_OFFS_FIELDMASK 0x0000003f +#define GPU_PWR_FALCON_IMEMC_BLK_SHIFT 0x00000008 +#define GPU_PWR_FALCON_IMEMC_BLK_FIELDMASK 0x000000ff +#define GPU_PWR_FALCON_IMEMC_AINCW_SHIFT 0x00000018 +#define GPU_PWR_FALCON_IMEMC_AINCW_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_IMEMD__BASE 0x0010a184 +#define GPU_PWR_FALCON_IMEMD__STRIDE 0x00000010 +#define GPU_PWR_FALCON_IMEMD(i) (0x0010a184 + (i) * 0x00000010) +#define GPU_PWR_FALCON_IMEMT__BASE 0x0010a188 +#define GPU_PWR_FALCON_IMEMT__STRIDE 0x00000010 +#define GPU_PWR_FALCON_IMEMT(i) (0x0010a188 + (i) * 0x00000010) +#define GPU_PWR_FALCON_SCTL 0x0010a240 +#define GPU_PWR_FALCON_MMU_PHYS_SEC 0x00100ce4 +#define GPU_PWR_FALCON_BOOTVEC 0x0010a104 +#define GPU_PWR_FALCON_BOOTVEC_VEC_SHIFT 0x00000000 +#define GPU_PWR_FALCON_BOOTVEC_VEC_FIELDMASK 0xffffffff +#define GPU_PWR_FALCON_DMACTL 0x0010a10c +#define GPU_PWR_FALCON_DMACTL_DMEM_SCRUBBING_MASK 0x00000002 +#define GPU_PWR_FALCON_DMACTL_DMEM_SCRUBBING_SHIFT 0x00000001 +#define GPU_PWR_FALCON_DMACTL_DMEM_SCRUBBING_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_DMACTL_IMEM_SCRUBBING_MASK 0x00000004 +#define GPU_PWR_FALCON_DMACTL_IMEM_SCRUBBING_SHIFT 0x00000002 +#define GPU_PWR_FALCON_DMACTL_IMEM_SCRUBBING_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_HWCFG 0x0010a108 +#define GPU_PWR_FALCON_HWCFG_IMEM_SIZE_SHIFT 0x00000000 +#define GPU_PWR_FALCON_HWCFG_IMEM_SIZE_FIELDMASK 0x000001ff +#define GPU_PWR_FALCON_HWCFG_DMEM_SIZE_SHIFT 0x00000009 +#define GPU_PWR_FALCON_HWCFG_DMEM_SIZE_FIELDMASK 0x000001ff +#define GPU_PWR_FALCON_DMATRFBASE 0x0010a110 +#define GPU_PWR_FALCON_DMATRFMOFFS 0x0010a114 +#define GPU_PWR_FALCON_DMATRFCMD 0x0010a118 +#define GPU_PWR_FALCON_DMATRFCMD_IMEM_SHIFT 0x00000004 +#define GPU_PWR_FALCON_DMATRFCMD_IMEM_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_DMATRFCMD_WRITE_SHIFT 0x00000005 +#define GPU_PWR_FALCON_DMATRFCMD_WRITE_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_DMATRFCMD_SIZE_SHIFT 0x00000008 +#define GPU_PWR_FALCON_DMATRFCMD_SIZE_FIELDMASK 0x00000007 +#define GPU_PWR_FALCON_DMATRFCMD_CTXDMA_SHIFT 0x0000000c +#define GPU_PWR_FALCON_DMATRFCMD_CTXDMA_FIELDMASK 0x00000007 +#define GPU_PWR_FALCON_DMATRFFBOFFS 0x0010a11c +#define GPU_PWR_FALCON_EXTERRADDR 0x0010a168 +#define GPU_PWR_FALCON_EXTERRSTAT 0x0010a16c +#define GPU_PWR_FALCON_EXTERRSTAT_VALID_MASK 0x80000000 +#define GPU_PWR_FALCON_EXTERRSTAT_VALID_SHIFT 0x0000001f +#define GPU_PWR_FALCON_EXTERRSTAT_VALID_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_EXTERRSTAT_VALID_TRUE_V 0x00000001 +#define GPU_PWR_PMU_FALCON_ICD_CMD 0x0010a200 +#define GPU_PWR_PMU_FALCON_ICD_CMD_OPC_SIZE 0x00000004 +#define GPU_PWR_PMU_FALCON_ICD_CMD_OPC_SHIFT 0x00000000 +#define GPU_PWR_PMU_FALCON_ICD_CMD_OPC_FIELDMASK 0x0000000f +#define GPU_PWR_PMU_FALCON_ICD_CMD_OPC_MASK 0x0000000f +#define GPU_PWR_PMU_FALCON_ICD_CMD_OPC_RREG_F 0x00000008 +#define GPU_PWR_PMU_FALCON_ICD_CMD_OPC_RSTAT_F 0x0000000e +#define GPU_PWR_PMU_FALCON_ICD_CMD_IDX_SHIFT 0x00000008 +#define GPU_PWR_PMU_FALCON_ICD_CMD_IDX_FIELDMASK 0x0000001f +#define GPU_PWR_PMU_FALCON_ICD_RDATA 0x0010a20c +#define GPU_PWR_FALCON_DMEMC__BASE 0x0010a1c0 +#define GPU_PWR_FALCON_DMEMC__STRIDE 0x00000008 +#define GPU_PWR_FALCON_DMEMC(i) (0x0010a1c0 + (i) * 0x00000008) +#define GPU_PWR_FALCON_DMEMC_OFFS_SHIFT 0x00000002 +#define GPU_PWR_FALCON_DMEMC_OFFS_FIELDMASK 0x0000003f +#define GPU_PWR_FALCON_DMEMC_OFFS_MASK 0x000000fc +#define GPU_PWR_FALCON_DMEMC_BLK_SHIFT 0x00000008 +#define GPU_PWR_FALCON_DMEMC_BLK_FIELDMASK 0x000000ff +#define GPU_PWR_FALCON_DMEMC_BLK_MASK 0x0000ff00 +#define GPU_PWR_FALCON_DMEMC_AINCW_SHIFT 0x00000018 +#define GPU_PWR_FALCON_DMEMC_AINCW_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_DMEMC_AINCR_SHIFT 0x00000019 +#define GPU_PWR_FALCON_DMEMC_AINCR_FIELDMASK 0x00000001 +#define GPU_PWR_FALCON_DMEMD__BASE 0x0010a1c4 +#define GPU_PWR_FALCON_DMEMD__STRIDE 0x00000008 +#define GPU_PWR_FALCON_DMEMD(i) (0x0010a1c4 + (i) * 0x00000008) +#define GPU_PWR_PMU_NEW_INSTBLK 0x0010a480 +#define GPU_PWR_PMU_NEW_INSTBLK_PTR_SHIFT 0x00000000 +#define GPU_PWR_PMU_NEW_INSTBLK_PTR_FIELDMASK 0x0fffffff +#define GPU_PWR_PMU_NEW_INSTBLK_TARGET_FB_F 0x00000000 +#define GPU_PWR_PMU_NEW_INSTBLK_TARGET_SYS_COH_F 0x20000000 +#define GPU_PWR_PMU_NEW_INSTBLK_TARGET_SYS_NCOH_F 0x30000000 +#define GPU_PWR_PMU_NEW_INSTBLK_VALID_SHIFT 0x0000001e +#define GPU_PWR_PMU_NEW_INSTBLK_VALID_FIELDMASK 0x00000001 +#define GPU_PWR_PMU_MUTEX_ID 0x0010a488 +#define GPU_PWR_PMU_MUTEX_ID_VALUE_SHIFT 0x00000000 +#define GPU_PWR_PMU_MUTEX_ID_VALUE_FIELDMASK 0x000000ff +#define GPU_PWR_PMU_MUTEX_ID_VALUE_INIT_V 0x00000000 +#define GPU_PWR_PMU_MUTEX_ID_VALUE_NOT_AVAIL_V 0x000000ff +#define GPU_PWR_PMU_MUTEX_ID_RELEASE 0x0010a48c +#define GPU_PWR_PMU_MUTEX_ID_RELEASE_VALUE_SHIFT 0x00000000 +#define GPU_PWR_PMU_MUTEX_ID_RELEASE_VALUE_FIELDMASK 0x000000ff +#define GPU_PWR_PMU_MUTEX_ID_RELEASE_VALUE_MASK 0x000000ff +#define GPU_PWR_PMU_MUTEX_ID_RELEASE_VALUE_INIT_V 0x00000000 +#define GPU_PWR_PMU_MUTEX_ID_RELEASE_VALUE_INIT_F 0x00000000 +#define GPU_PWR_PMU_MUTEX__BASE 0x0010a580 +#define GPU_PWR_PMU_MUTEX__STRIDE 0x00000004 +#define GPU_PWR_PMU_MUTEX(i) (0x0010a580 + (i) * 0x00000004) +#define GPU_PWR_PMU_MUTEX__SIZE_1_V 0x00000010 +#define GPU_PWR_PMU_MUTEX_VALUE_SHIFT 0x00000000 +#define GPU_PWR_PMU_MUTEX_VALUE_FIELDMASK 0x000000ff +#define GPU_PWR_PMU_MUTEX_VALUE_INITIAL_LOCK_F 0x00000000 +#define GPU_PWR_PMU_QUEUE_HEAD__BASE 0x0010a4a0 +#define GPU_PWR_PMU_QUEUE_HEAD__STRIDE 0x00000004 +#define GPU_PWR_PMU_QUEUE_HEAD(i) (0x0010a4a0 + (i) * 0x00000004) +#define GPU_PWR_PMU_QUEUE_HEAD__SIZE_1_V 0x00000004 +#define GPU_PWR_PMU_QUEUE_HEAD_ADDRESS_SHIFT 0x00000000 +#define GPU_PWR_PMU_QUEUE_HEAD_ADDRESS_FIELDMASK 0xffffffff +#define GPU_PWR_PMU_QUEUE_TAIL__BASE 0x0010a4b0 +#define GPU_PWR_PMU_QUEUE_TAIL__STRIDE 0x00000004 +#define GPU_PWR_PMU_QUEUE_TAIL(i) (0x0010a4b0 + (i) * 0x00000004) +#define GPU_PWR_PMU_QUEUE_TAIL__SIZE_1_V 0x00000004 +#define GPU_PWR_PMU_QUEUE_TAIL_ADDRESS_SHIFT 0x00000000 +#define GPU_PWR_PMU_QUEUE_TAIL_ADDRESS_FIELDMASK 0xffffffff +#define GPU_PWR_PMU_MSGQ_HEAD 0x0010a4c8 +#define GPU_PWR_PMU_MSGQ_HEAD_VAL_SHIFT 0x00000000 +#define GPU_PWR_PMU_MSGQ_HEAD_VAL_FIELDMASK 0xffffffff +#define GPU_PWR_PMU_MSGQ_TAIL 0x0010a4cc +#define GPU_PWR_PMU_MSGQ_TAIL_VAL_SHIFT 0x00000000 +#define GPU_PWR_PMU_MSGQ_TAIL_VAL_FIELDMASK 0xffffffff +#define GPU_PWR_PMU_IDLE_MASK__BASE 0x0010a504 +#define GPU_PWR_PMU_IDLE_MASK__STRIDE 0x00000010 +#define GPU_PWR_PMU_IDLE_MASK(i) (0x0010a504 + (i) * 0x00000010) +#define GPU_PWR_PMU_IDLE_MASK_GR_ENABLED_F 0x00000001 +#define GPU_PWR_PMU_IDLE_MASK_CE_2_ENABLED_F 0x00200000 +#define GPU_PWR_PMU_IDLE_COUNT__BASE 0x0010a508 +#define GPU_PWR_PMU_IDLE_COUNT__STRIDE 0x00000010 +#define GPU_PWR_PMU_IDLE_COUNT(i) (0x0010a508 + (i) * 0x00000010) +#define GPU_PWR_PMU_IDLE_COUNT_VALUE_SHIFT 0x00000000 +#define GPU_PWR_PMU_IDLE_COUNT_VALUE_FIELDMASK 0x7fffffff +#define GPU_PWR_PMU_IDLE_COUNT_RESET_SHIFT 0x0000001f +#define GPU_PWR_PMU_IDLE_COUNT_RESET_FIELDMASK 0x00000001 +#define GPU_PWR_PMU_IDLE_CTRL__BASE 0x0010a50c +#define GPU_PWR_PMU_IDLE_CTRL__STRIDE 0x00000010 +#define GPU_PWR_PMU_IDLE_CTRL(i) (0x0010a50c + (i) * 0x00000010) +#define GPU_PWR_PMU_IDLE_CTRL_VALUE_MASK 0x00000003 +#define GPU_PWR_PMU_IDLE_CTRL_VALUE_SHIFT 0x00000000 +#define GPU_PWR_PMU_IDLE_CTRL_VALUE_FIELDMASK 0x00000003 +#define GPU_PWR_PMU_IDLE_CTRL_VALUE_BUSY_F 0x00000002 +#define GPU_PWR_PMU_IDLE_CTRL_VALUE_ALWAYS_F 0x00000003 +#define GPU_PWR_PMU_IDLE_CTRL_FILTER_MASK 0x00000004 +#define GPU_PWR_PMU_IDLE_CTRL_FILTER_SHIFT 0x00000002 +#define GPU_PWR_PMU_IDLE_CTRL_FILTER_FIELDMASK 0x00000001 +#define GPU_PWR_PMU_IDLE_CTRL_FILTER_DISABLED_F 0x00000000 +#define GPU_PWR_PMU_IDLE_MASK_SUPP__BASE 0x0010a9f0 +#define GPU_PWR_PMU_IDLE_MASK_SUPP__STRIDE 0x00000008 +#define GPU_PWR_PMU_IDLE_MASK_SUPP(i) (0x0010a9f0 + (i) * 0x00000008) +#define GPU_PWR_PMU_IDLE_MASK_1_SUPP__BASE 0x0010a9f4 +#define GPU_PWR_PMU_IDLE_MASK_1_SUPP__STRIDE 0x00000008 +#define GPU_PWR_PMU_IDLE_MASK_1_SUPP(i) (0x0010a9f4 + (i) * 0x00000008) +#define GPU_PWR_PMU_IDLE_CTRL_SUPP__BASE 0x0010aa30 +#define GPU_PWR_PMU_IDLE_CTRL_SUPP__STRIDE 0x00000008 +#define GPU_PWR_PMU_IDLE_CTRL_SUPP(i) (0x0010aa30 + (i) * 0x00000008) +#define GPU_PWR_PMU_DEBUG__BASE 0x0010a5c0 +#define GPU_PWR_PMU_DEBUG__STRIDE 0x00000004 +#define GPU_PWR_PMU_DEBUG(i) (0x0010a5c0 + (i) * 0x00000004) +#define GPU_PWR_PMU_DEBUG__SIZE_1_V 0x00000004 +#define GPU_PWR_PMU_MAILBOX__BASE 0x0010a450 +#define GPU_PWR_PMU_MAILBOX__STRIDE 0x00000004 +#define GPU_PWR_PMU_MAILBOX(i) (0x0010a450 + (i) * 0x00000004) +#define GPU_PWR_PMU_MAILBOX__SIZE_1_V 0x0000000c +#define GPU_PWR_PMU_BAR0_ADDR 0x0010a7a0 +#define GPU_PWR_PMU_BAR0_DATA 0x0010a7a4 +#define GPU_PWR_PMU_BAR0_CTL 0x0010a7ac +#define GPU_PWR_PMU_BAR0_TIMEOUT 0x0010a7a8 +#define GPU_PWR_PMU_BAR0_FECS_ERROR 0x0010a988 +#define GPU_PWR_PMU_BAR0_ERROR_STATUS 0x0010a7b0 +#define GPU_PWR_PMU_PG_IDLEFILTH__BASE 0x0010a6c0 +#define GPU_PWR_PMU_PG_IDLEFILTH__STRIDE 0x00000004 +#define GPU_PWR_PMU_PG_IDLEFILTH(i) (0x0010a6c0 + (i) * 0x00000004) +#define GPU_PWR_PMU_PG_PPUIDLEFILTH__BASE 0x0010a6e8 +#define GPU_PWR_PMU_PG_PPUIDLEFILTH__STRIDE 0x00000004 +#define GPU_PWR_PMU_PG_PPUIDLEFILTH(i) (0x0010a6e8 + (i) * 0x00000004) +#define GPU_PWR_PMU_PG_IDLE_CNT__BASE 0x0010a710 +#define GPU_PWR_PMU_PG_IDLE_CNT__STRIDE 0x00000004 +#define GPU_PWR_PMU_PG_IDLE_CNT(i) (0x0010a710 + (i) * 0x00000004) +#define GPU_PWR_PMU_PG_INTREN__BASE 0x0010a760 +#define GPU_PWR_PMU_PG_INTREN__STRIDE 0x00000004 +#define GPU_PWR_PMU_PG_INTREN(i) (0x0010a760 + (i) * 0x00000004) +#define GPU_PWR_FBIF_TRANSCFG__BASE 0x0010ae00 +#define GPU_PWR_FBIF_TRANSCFG__STRIDE 0x00000004 +#define GPU_PWR_FBIF_TRANSCFG(i) (0x0010ae00 + (i) * 0x00000004) +#define GPU_PWR_FBIF_TRANSCFG_TARGET_LOCAL_FB_F 0x00000000 +#define GPU_PWR_FBIF_TRANSCFG_TARGET_COHERENT_SYSMEM_F 0x00000001 +#define GPU_PWR_FBIF_TRANSCFG_TARGET_NONCOHERENT_SYSMEM_F 0x00000002 +#define GPU_PWR_FBIF_TRANSCFG_MEM_TYPE_SIZE 0x00000001 +#define GPU_PWR_FBIF_TRANSCFG_MEM_TYPE_SHIFT 0x00000002 +#define GPU_PWR_FBIF_TRANSCFG_MEM_TYPE_FIELDMASK 0x00000001 +#define GPU_PWR_FBIF_TRANSCFG_MEM_TYPE_MASK 0x00000004 +#define GPU_PWR_FBIF_TRANSCFG_MEM_TYPE_VIRTUAL_F 0x00000000 +#define GPU_PWR_FBIF_TRANSCFG_MEM_TYPE_PHYSICAL_F 0x00000004 + +#define GPU_RAM_IN_RAMFC_SIZE 0x00001000 +#define GPU_RAM_IN_RAMFC_W 0x00000000 +#define GPU_RAM_IN_PAGE_DIR_BASE_TARGET_SHIFT 0x00000000 +#define GPU_RAM_IN_PAGE_DIR_BASE_TARGET_FIELDMASK 0x00000003 +#define GPU_RAM_IN_PAGE_DIR_BASE_TARGET_W 0x00000080 +#define GPU_RAM_IN_PAGE_DIR_BASE_TARGET_VID_MEM_F 0x00000000 +#define GPU_RAM_IN_PAGE_DIR_BASE_TARGET_SYS_MEM_COH_F 0x00000002 +#define GPU_RAM_IN_PAGE_DIR_BASE_TARGET_SYS_MEM_NCOH_F 0x00000003 +#define GPU_RAM_IN_PAGE_DIR_BASE_VOL_W 0x00000080 +#define GPU_RAM_IN_PAGE_DIR_BASE_VOL_TRUE_F 0x00000004 +#define GPU_RAM_IN_BIG_PAGE_SIZE_SHIFT 0x0000000b +#define GPU_RAM_IN_BIG_PAGE_SIZE_FIELDMASK 0x00000001 +#define GPU_RAM_IN_BIG_PAGE_SIZE_MASK 0x00000800 +#define GPU_RAM_IN_BIG_PAGE_SIZE_W 0x00000080 +#define GPU_RAM_IN_BIG_PAGE_SIZE_128KB_F 0x00000000 +#define GPU_RAM_IN_BIG_PAGE_SIZE_64KB_F 0x00000800 +#define GPU_RAM_IN_PAGE_DIR_BASE_LO_SHIFT 0x0000000c +#define GPU_RAM_IN_PAGE_DIR_BASE_LO_FIELDMASK 0x000fffff +#define GPU_RAM_IN_PAGE_DIR_BASE_LO_W 0x00000080 +#define GPU_RAM_IN_PAGE_DIR_BASE_HI_SHIFT 0x00000000 +#define GPU_RAM_IN_PAGE_DIR_BASE_HI_FIELDMASK 0x000000ff +#define GPU_RAM_IN_PAGE_DIR_BASE_HI_W 0x00000081 +#define GPU_RAM_IN_ADR_LIMIT_LO_SHIFT 0x0000000c +#define GPU_RAM_IN_ADR_LIMIT_LO_FIELDMASK 0x000fffff +#define GPU_RAM_IN_ADR_LIMIT_LO_W 0x00000082 +#define GPU_RAM_IN_ADR_LIMIT_HI_SHIFT 0x00000000 +#define GPU_RAM_IN_ADR_LIMIT_HI_FIELDMASK 0x000000ff +#define GPU_RAM_IN_ADR_LIMIT_HI_W 0x00000083 +#define GPU_RAM_IN_ENGINE_CS_W 0x00000084 +#define GPU_RAM_IN_ENGINE_CS_WFI_V 0x00000000 +#define GPU_RAM_IN_ENGINE_CS_WFI_F 0x00000000 +#define GPU_RAM_IN_ENGINE_CS_FG_V 0x00000001 +#define GPU_RAM_IN_ENGINE_CS_FG_F 0x00000008 +#define GPU_RAM_IN_GR_CS_W 0x00000084 +#define GPU_RAM_IN_GR_CS_WFI_F 0x00000000 +#define GPU_RAM_IN_GR_WFI_TARGET_W 0x00000084 +#define GPU_RAM_IN_GR_WFI_MODE_W 0x00000084 +#define GPU_RAM_IN_GR_WFI_MODE_PHYSICAL_V 0x00000000 +#define GPU_RAM_IN_GR_WFI_MODE_PHYSICAL_F 0x00000000 +#define GPU_RAM_IN_GR_WFI_MODE_VIRTUAL_V 0x00000001 +#define GPU_RAM_IN_GR_WFI_MODE_VIRTUAL_F 0x00000004 +#define GPU_RAM_IN_GR_WFI_PTR_LO_SHIFT 0x0000000c +#define GPU_RAM_IN_GR_WFI_PTR_LO_FIELDMASK 0x000fffff +#define GPU_RAM_IN_GR_WFI_PTR_LO_W 0x00000084 +#define GPU_RAM_IN_GR_WFI_PTR_HI_SHIFT 0x00000000 +#define GPU_RAM_IN_GR_WFI_PTR_HI_FIELDMASK 0x000000ff +#define GPU_RAM_IN_GR_WFI_PTR_HI_W 0x00000085 +#define GPU_RAM_IN_BASE_SHIFT_V 0x0000000c +#define GPU_RAM_IN_ALLOC_SIZE_V 0x00001000 +#define GPU_RAM_FC_SIZE_VAL_V 0x00000200 +#define GPU_RAM_FC_GP_PUT_W 0x00000000 +#define GPU_RAM_FC_USERD_W 0x00000002 +#define GPU_RAM_FC_USERD_HI_W 0x00000003 +#define GPU_RAM_FC_SIGNATURE_W 0x00000004 +#define GPU_RAM_FC_GP_GET_W 0x00000005 +#define GPU_RAM_FC_PB_GET_W 0x00000006 +#define GPU_RAM_FC_PB_GET_HI_W 0x00000007 +#define GPU_RAM_FC_PB_TOP_LEVEL_GET_W 0x00000008 +#define GPU_RAM_FC_PB_TOP_LEVEL_GET_HI_W 0x00000009 +#define GPU_RAM_FC_ACQUIRE_W 0x0000000c +#define GPU_RAM_FC_SEMAPHOREA_W 0x0000000e +#define GPU_RAM_FC_SEMAPHOREB_W 0x0000000f +#define GPU_RAM_FC_SEMAPHOREC_W 0x00000010 +#define GPU_RAM_FC_SEMAPHORED_W 0x00000011 +#define GPU_RAM_FC_GP_BASE_W 0x00000012 +#define GPU_RAM_FC_GP_BASE_HI_W 0x00000013 +#define GPU_RAM_FC_GP_FETCH_W 0x00000014 +#define GPU_RAM_FC_PB_FETCH_W 0x00000015 +#define GPU_RAM_FC_PB_FETCH_HI_W 0x00000016 +#define GPU_RAM_FC_PB_PUT_W 0x00000017 +#define GPU_RAM_FC_PB_PUT_HI_W 0x00000018 +#define GPU_RAM_FC_PB_HEADER_W 0x00000021 +#define GPU_RAM_FC_PB_COUNT_W 0x00000022 +#define GPU_RAM_FC_SUBDEVICE_W 0x00000025 +#define GPU_RAM_FC_FORMATS_W 0x00000027 +#define GPU_RAM_FC_SYNCPOINTA_W 0x00000029 +#define GPU_RAM_FC_SYNCPOINTB_W 0x0000002a +#define GPU_RAM_FC_TARGET_W 0x0000002b +#define GPU_RAM_FC_HCE_CTRL_W 0x00000039 +#define GPU_RAM_FC_CHID_W 0x0000003a +#define GPU_RAM_FC_CHID_ID_SHIFT 0x00000000 +#define GPU_RAM_FC_CHID_ID_FIELDMASK 0x00000fff +#define GPU_RAM_FC_CHID_ID_W 0x00000000 +#define GPU_RAM_FC_RUNLIST_TIMESLICE_W 0x0000003e +#define GPU_RAM_USERD_BASE_SHIFT_V 0x00000009 +#define GPU_RAM_USERD_CHAN_SIZE_V 0x00000200 +#define GPU_RAM_USERD_PUT_W 0x00000010 +#define GPU_RAM_USERD_GET_W 0x00000011 +#define GPU_RAM_USERD_REF_W 0x00000012 +#define GPU_RAM_USERD_PUT_HI_W 0x00000013 +#define GPU_RAM_USERD_REF_THRESHOLD_W 0x00000014 +#define GPU_RAM_USERD_TOP_LEVEL_GET_W 0x00000016 +#define GPU_RAM_USERD_TOP_LEVEL_GET_HI_W 0x00000017 +#define GPU_RAM_USERD_GET_HI_W 0x00000018 +#define GPU_RAM_USERD_GP_GET_W 0x00000022 +#define GPU_RAM_USERD_GP_PUT_W 0x00000023 +#define GPU_RAM_USERD_GP_TOP_LEVEL_GET_W 0x00000016 +#define GPU_RAM_USERD_GP_TOP_LEVEL_GET_HI_W 0x00000017 +#define GPU_RAM_RL_ENTRY_SIZE_V 0x00000008 +#define GPU_RAM_RL_ENTRY_CHID_SHIFT 0x00000000 +#define GPU_RAM_RL_ENTRY_CHID_FIELDMASK 0x00000fff +#define GPU_RAM_RL_ENTRY_ID_SHIFT 0x00000000 +#define GPU_RAM_RL_ENTRY_ID_FIELDMASK 0x00000fff +#define GPU_RAM_RL_ENTRY_TYPE_SHIFT 0x0000000d +#define GPU_RAM_RL_ENTRY_TYPE_FIELDMASK 0x00000001 +#define GPU_RAM_RL_ENTRY_TYPE_CHID_F 0x00000000 +#define GPU_RAM_RL_ENTRY_TYPE_TSG_F 0x00002000 +#define GPU_RAM_RL_ENTRY_TIMESLICE_SCALE_SHIFT 0x0000000e +#define GPU_RAM_RL_ENTRY_TIMESLICE_SCALE_FIELDMASK 0x0000000f +#define GPU_RAM_RL_ENTRY_TIMESLICE_SCALE_3_F 0x0000c000 +#define GPU_RAM_RL_ENTRY_TIMESLICE_TIMEOUT_SHIFT 0x00000012 +#define GPU_RAM_RL_ENTRY_TIMESLICE_TIMEOUT_FIELDMASK 0x000000ff +#define GPU_RAM_RL_ENTRY_TIMESLICE_TIMEOUT_128_F 0x02000000 +#define GPU_RAM_RL_ENTRY_TSG_LENGTH_SHIFT 0x0000001a +#define GPU_RAM_RL_ENTRY_TSG_LENGTH_FIELDMASK 0x0000003f + +#define GPU_THERM_USE_A 0x00020798 +#define GPU_THERM_USE_A_EXT_THERM_0_ENABLE_F 0x00000001 +#define GPU_THERM_USE_A_EXT_THERM_1_ENABLE_F 0x00000002 +#define GPU_THERM_USE_A_EXT_THERM_2_ENABLE_F 0x00000004 +#define GPU_THERM_EVT_EXT_THERM_0 0x00020700 +#define GPU_THERM_EVT_EXT_THERM_0_SLOW_FACTOR_SHIFT 0x00000008 +#define GPU_THERM_EVT_EXT_THERM_0_SLOW_FACTOR_FIELDMASK 0x0000003f +#define GPU_THERM_EVT_EXT_THERM_0_SLOW_FACTOR_INIT_V 0x00000000 +#define GPU_THERM_EVT_EXT_THERM_1 0x00020704 +#define GPU_THERM_EVT_EXT_THERM_1_SLOW_FACTOR_SHIFT 0x00000008 +#define GPU_THERM_EVT_EXT_THERM_1_SLOW_FACTOR_FIELDMASK 0x0000003f +#define GPU_THERM_EVT_EXT_THERM_1_SLOW_FACTOR_INIT_V 0x00000000 +#define GPU_THERM_EVT_EXT_THERM_2 0x00020708 +#define GPU_THERM_EVT_EXT_THERM_2_SLOW_FACTOR_SHIFT 0x00000008 +#define GPU_THERM_EVT_EXT_THERM_2_SLOW_FACTOR_FIELDMASK 0x0000003f +#define GPU_THERM_EVT_EXT_THERM_2_SLOW_FACTOR_INIT_V 0x00000000 +#define GPU_THERM_WEIGHT_1 0x00020024 +#define GPU_THERM_CONFIG1 0x00020050 +#define GPU_THERM_CONFIG2 0x00020130 +#define GPU_THERM_CONFIG2_SLOWDOWN_FACTOR_EXTENDED_SHIFT 0x00000018 +#define GPU_THERM_CONFIG2_SLOWDOWN_FACTOR_EXTENDED_FIELDMASK 0x00000001 +#define GPU_THERM_CONFIG2_GRAD_ENABLE_SHIFT 0x0000001f +#define GPU_THERM_CONFIG2_GRAD_ENABLE_FIELDMASK 0x00000001 +#define GPU_THERM_GATE_CTRL__BASE 0x00020200 +#define GPU_THERM_GATE_CTRL__STRIDE 0x00000004 +#define GPU_THERM_GATE_CTRL(i) (0x00020200 + (i) * 0x00000004) +#define GPU_THERM_GATE_CTRL_ENG_CLK_MASK 0x00000003 +#define GPU_THERM_GATE_CTRL_ENG_CLK_SHIFT 0x00000000 +#define GPU_THERM_GATE_CTRL_ENG_CLK_FIELDMASK 0x00000003 +#define GPU_THERM_GATE_CTRL_ENG_CLK_RUN_F 0x00000000 +#define GPU_THERM_GATE_CTRL_ENG_CLK_AUTO_F 0x00000001 +#define GPU_THERM_GATE_CTRL_ENG_CLK_STOP_F 0x00000002 +#define GPU_THERM_GATE_CTRL_BLK_CLK_MASK 0x0000000c +#define GPU_THERM_GATE_CTRL_BLK_CLK_SHIFT 0x00000002 +#define GPU_THERM_GATE_CTRL_BLK_CLK_FIELDMASK 0x00000003 +#define GPU_THERM_GATE_CTRL_BLK_CLK_RUN_F 0x00000000 +#define GPU_THERM_GATE_CTRL_BLK_CLK_AUTO_F 0x00000004 +#define GPU_THERM_GATE_CTRL_ENG_PWR_MASK 0x00000030 +#define GPU_THERM_GATE_CTRL_ENG_PWR_SHIFT 0x00000004 +#define GPU_THERM_GATE_CTRL_ENG_PWR_FIELDMASK 0x00000003 +#define GPU_THERM_GATE_CTRL_ENG_PWR_AUTO_F 0x00000010 +#define GPU_THERM_GATE_CTRL_ENG_PWR_OFF_V 0x00000002 +#define GPU_THERM_GATE_CTRL_ENG_PWR_OFF_F 0x00000020 +#define GPU_THERM_GATE_CTRL_ENG_IDLE_FILT_EXP_SHIFT 0x00000008 +#define GPU_THERM_GATE_CTRL_ENG_IDLE_FILT_EXP_FIELDMASK 0x0000001f +#define GPU_THERM_GATE_CTRL_ENG_IDLE_FILT_EXP_MASK 0x00001f00 +#define GPU_THERM_GATE_CTRL_ENG_IDLE_FILT_MANT_SHIFT 0x0000000d +#define GPU_THERM_GATE_CTRL_ENG_IDLE_FILT_MANT_FIELDMASK 0x00000007 +#define GPU_THERM_GATE_CTRL_ENG_IDLE_FILT_MANT_MASK 0x0000e000 +#define GPU_THERM_GATE_CTRL_ENG_DELAY_BEFORE_SHIFT 0x00000010 +#define GPU_THERM_GATE_CTRL_ENG_DELAY_BEFORE_FIELDMASK 0x0000000f +#define GPU_THERM_GATE_CTRL_ENG_DELAY_BEFORE_MASK 0x000f0000 +#define GPU_THERM_GATE_CTRL_ENG_DELAY_AFTER_SHIFT 0x00000014 +#define GPU_THERM_GATE_CTRL_ENG_DELAY_AFTER_FIELDMASK 0x0000000f +#define GPU_THERM_GATE_CTRL_ENG_DELAY_AFTER_MASK 0x00f00000 +#define GPU_THERM_FECS_IDLE_FILTER 0x00020288 +#define GPU_THERM_FECS_IDLE_FILTER_VALUE_MASK 0xffffffff +#define GPU_THERM_FECS_IDLE_FILTER_VALUE_SHIFT 0x00000000 +#define GPU_THERM_FECS_IDLE_FILTER_VALUE_FIELDMASK 0xffffffff +#define GPU_THERM_HUBMMU_IDLE_FILTER 0x0002028c +#define GPU_THERM_HUBMMU_IDLE_FILTER_VALUE_MASK 0xffffffff +#define GPU_THERM_HUBMMU_IDLE_FILTER_VALUE_SHIFT 0x00000000 +#define GPU_THERM_HUBMMU_IDLE_FILTER_VALUE_FIELDMASK 0xffffffff +#define GPU_THERM_CLK_SLOWDOWN__BASE 0x00020160 +#define GPU_THERM_CLK_SLOWDOWN__STRIDE 0x00000004 +#define GPU_THERM_CLK_SLOWDOWN(i) (0x00020160 + (i) * 0x00000004) +#define GPU_THERM_CLK_SLOWDOWN_IDLE_FACTOR_SHIFT 0x00000010 +#define GPU_THERM_CLK_SLOWDOWN_IDLE_FACTOR_FIELDMASK 0x0000003f +#define GPU_THERM_CLK_SLOWDOWN_IDLE_FACTOR_MASK 0x003f0000 +#define GPU_THERM_CLK_SLOWDOWN_IDLE_FACTOR_DISABLED_F 0x00000000 +#define GPU_THERM_GRAD_STEPPING_TABLE__BASE 0x000202c8 +#define GPU_THERM_GRAD_STEPPING_TABLE__STRIDE 0x00000004 +#define GPU_THERM_GRAD_STEPPING_TABLE(i) (0x000202c8 + (i) * 0x00000004) +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_SHIFT 0x00000000 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_FIELDMASK 0x0000003f +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_MASK 0x0000003f +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_FPDIV_BY1P5_F 0x00000001 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_FPDIV_BY2_F 0x00000002 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_FPDIV_BY4_F 0x00000006 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR0_FPDIV_BY8_F 0x0000000e +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR1_SHIFT 0x00000006 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR1_FIELDMASK 0x0000003f +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR1_MASK 0x00000fc0 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR2_SHIFT 0x0000000c +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR2_FIELDMASK 0x0000003f +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR2_MASK 0x0003f000 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR3_SHIFT 0x00000012 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR3_FIELDMASK 0x0000003f +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR3_MASK 0x00fc0000 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR4_SHIFT 0x00000018 +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR4_FIELDMASK 0x0000003f +#define GPU_THERM_GRAD_STEPPING_TABLE_SLOWDOWN_FACTOR4_MASK 0x3f000000 +#define GPU_THERM_GRAD_STEPPING0 0x000202c0 +#define GPU_THERM_GRAD_STEPPING0_FEATURE_SIZE 0x00000001 +#define GPU_THERM_GRAD_STEPPING0_FEATURE_SHIFT 0x00000000 +#define GPU_THERM_GRAD_STEPPING0_FEATURE_FIELDMASK 0x00000001 +#define GPU_THERM_GRAD_STEPPING0_FEATURE_MASK 0x00000001 +#define GPU_THERM_GRAD_STEPPING0_FEATURE_ENABLE_F 0x00000001 +#define GPU_THERM_GRAD_STEPPING1 0x000202c4 +#define GPU_THERM_GRAD_STEPPING1_PDIV_DURATION_SHIFT 0x00000000 +#define GPU_THERM_GRAD_STEPPING1_PDIV_DURATION_FIELDMASK 0x0001ffff +#define GPU_THERM_CLK_TIMING__BASE 0x000203c0 +#define GPU_THERM_CLK_TIMING__STRIDE 0x00000004 +#define GPU_THERM_CLK_TIMING(i) (0x000203c0 + (i) * 0x00000004) +#define GPU_THERM_CLK_TIMING_GRAD_SLOWDOWN_SHIFT 0x00000010 +#define GPU_THERM_CLK_TIMING_GRAD_SLOWDOWN_FIELDMASK 0x00000001 +#define GPU_THERM_CLK_TIMING_GRAD_SLOWDOWN_MASK 0x00010000 +#define GPU_THERM_CLK_TIMING_GRAD_SLOWDOWN_ENABLED_F 0x00010000 + +#define GPU_TIMER_PRI_TIMEOUT 0x00009080 +#define GPU_TIMER_PRI_TIMEOUT_PERIOD_SHIFT 0x00000000 +#define GPU_TIMER_PRI_TIMEOUT_PERIOD_FIELDMASK 0x00ffffff +#define GPU_TIMER_PRI_TIMEOUT_PERIOD_MASK 0x00ffffff +#define GPU_TIMER_PRI_TIMEOUT_EN_SHIFT 0x0000001f +#define GPU_TIMER_PRI_TIMEOUT_EN_FIELDMASK 0x00000001 +#define GPU_TIMER_PRI_TIMEOUT_EN_MASK 0x80000000 +#define GPU_TIMER_PRI_TIMEOUT_EN_EN_ENABLED_F 0x80000000 +#define GPU_TIMER_PRI_TIMEOUT_EN_EN_DISABLED_F 0x00000000 +#define GPU_TIMER_PRI_TIMEOUT_SAVE_0 0x00009084 +#define GPU_TIMER_PRI_TIMEOUT_SAVE_1 0x00009088 +#define GPU_TIMER_PRI_TIMEOUT_FECS_ERRCODE 0x0000908c +#define GPU_TIMER_TIME_0 0x00009400 +#define GPU_TIMER_TIME_1 0x00009410 + +#define GPU_TOP_NUM_GPCS 0x00022430 +#define GPU_TOP_NUM_GPCS_VALUE_SHIFT 0x00000000 +#define GPU_TOP_NUM_GPCS_VALUE_FIELDMASK 0x0000001f +#define GPU_TOP_TPC_PER_GPC 0x00022434 +#define GPU_TOP_TPC_PER_GPC_VALUE_SHIFT 0x00000000 +#define GPU_TOP_TPC_PER_GPC_VALUE_FIELDMASK 0x0000001f +#define GPU_TOP_NUM_FBPS 0x00022438 +#define GPU_TOP_NUM_FBPS_VALUE_SHIFT 0x00000000 +#define GPU_TOP_NUM_FBPS_VALUE_FIELDMASK 0x0000001f +#define GPU_TOP_LTC_PER_FBP 0x00022450 +#define GPU_TOP_LTC_PER_FBP_VALUE_SHIFT 0x00000000 +#define GPU_TOP_LTC_PER_FBP_VALUE_FIELDMASK 0x0000001f +#define GPU_TOP_SLICES_PER_LTC 0x0002245c +#define GPU_TOP_SLICES_PER_LTC_VALUE_SHIFT 0x00000000 +#define GPU_TOP_SLICES_PER_LTC_VALUE_FIELDMASK 0x0000001f +#define GPU_TOP_NUM_LTCS 0x00022454 +#define GPU_TOP_DEVICE_INFO__BASE 0x00022700 +#define GPU_TOP_DEVICE_INFO__STRIDE 0x00000004 +#define GPU_TOP_DEVICE_INFO(i) (0x00022700 + (i) * 0x00000004) +#define GPU_TOP_DEVICE_INFO__SIZE_1_V 0x00000040 +#define GPU_TOP_DEVICE_INFO_CHAIN_SHIFT 0x0000001f +#define GPU_TOP_DEVICE_INFO_CHAIN_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_CHAIN_ENABLE_V 0x00000001 +#define GPU_TOP_DEVICE_INFO_ENGINE_ENUM_SHIFT 0x0000001a +#define GPU_TOP_DEVICE_INFO_ENGINE_ENUM_FIELDMASK 0x0000000f +#define GPU_TOP_DEVICE_INFO_RUNLIST_ENUM_SHIFT 0x00000015 +#define GPU_TOP_DEVICE_INFO_RUNLIST_ENUM_FIELDMASK 0x0000000f +#define GPU_TOP_DEVICE_INFO_INTR_ENUM_SHIFT 0x0000000f +#define GPU_TOP_DEVICE_INFO_INTR_ENUM_FIELDMASK 0x0000001f +#define GPU_TOP_DEVICE_INFO_RESET_ENUM_SHIFT 0x00000009 +#define GPU_TOP_DEVICE_INFO_RESET_ENUM_FIELDMASK 0x0000001f +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_SHIFT 0x00000002 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_FIELDMASK 0x1fffffff +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_GRAPHICS_V 0x00000000 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_GRAPHICS_F 0x00000000 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_COPY0_V 0x00000001 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_COPY0_F 0x00000004 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_COPY1_V 0x00000002 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_COPY1_F 0x00000008 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_COPY2_V 0x00000003 +#define GPU_TOP_DEVICE_INFO_TYPE_ENUM_COPY2_F 0x0000000c +#define GPU_TOP_DEVICE_INFO_ENGINE_SHIFT 0x00000005 +#define GPU_TOP_DEVICE_INFO_ENGINE_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_RUNLIST_SHIFT 0x00000004 +#define GPU_TOP_DEVICE_INFO_RUNLIST_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_INTR_SHIFT 0x00000003 +#define GPU_TOP_DEVICE_INFO_INTR_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_RESET_SHIFT 0x00000002 +#define GPU_TOP_DEVICE_INFO_RESET_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_ENTRY_SHIFT 0x00000000 +#define GPU_TOP_DEVICE_INFO_ENTRY_FIELDMASK 0x00000003 +#define GPU_TOP_DEVICE_INFO_ENTRY_NOT_VALID_V 0x00000000 +#define GPU_TOP_DEVICE_INFO_ENTRY_ENUM_V 0x00000002 +#define GPU_TOP_DEVICE_INFO_ENTRY_ENGINE_TYPE_V 0x00000003 +#define GPU_TOP_DEVICE_INFO_ENTRY_DATA_V 0x00000001 +#define GPU_TOP_DEVICE_INFO_DATA_TYPE_SHIFT 0x0000001e +#define GPU_TOP_DEVICE_INFO_DATA_TYPE_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_DATA_TYPE_ENUM2_V 0x00000000 +#define GPU_TOP_DEVICE_INFO_DATA_PRI_BASE_SHIFT 0x0000000c +#define GPU_TOP_DEVICE_INFO_DATA_PRI_BASE_FIELDMASK 0x000007ff +#define GPU_TOP_DEVICE_INFO_DATA_PRI_BASE_ALIGN_V 0x0000000c +#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_ENUM_SHIFT 0x00000003 +#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_ENUM_FIELDMASK 0x0000001f +#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_SHIFT 0x00000002 +#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_FIELDMASK 0x00000001 +#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_VALID_V 0x00000001 \ No newline at end of file From fb5b8c61c64fa8068c0e4fa6a0caf68432d8c1df Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 11 Aug 2026 11:29:19 -0400 Subject: [PATCH 030/205] add GCPLL trim registers --- Source/hoc-clk/sysmodule/src/soc/registers.h | 154 ++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index e546b375..6a2f3564 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -3847,4 +3847,156 @@ #define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_ENUM_FIELDMASK 0x0000001f #define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_SHIFT 0x00000002 #define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_FIELDMASK 0x00000001 -#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_VALID_V 0x00000001 \ No newline at end of file +#define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_VALID_V 0x00000001 + +#define TRIM_SYS_GPCPLL_CFG 0x00137000 +#define TRIM_SYS_GPCPLL_CFG_ENABLE_MASK 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_ENABLE_SHIFT 0x00000000 +#define TRIM_SYS_GPCPLL_CFG_ENABLE_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_ENABLE_NO_F 0x00000000 +#define TRIM_SYS_GPCPLL_CFG_ENABLE_YES_F 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_IDDQ_MASK 0x00000002 +#define TRIM_SYS_GPCPLL_CFG_IDDQ_SHIFT 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_IDDQ_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_IDDQ_POWER_ON_V 0x00000000 +#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_MASK 0x00000004 +#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_SHIFT 0x00000002 +#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_ENABLE_F 0x00000004 +#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_DISABLE_F 0x00000000 +#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_MASK 0x00000010 +#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_SHIFT 0x00000004 +#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_POWER_ON_F 0x00000000 +#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_POWER_OFF_F 0x00000010 +#define TRIM_SYS_GPCPLL_CFG_PLL_LOCK_SHIFT 0x00000011 +#define TRIM_SYS_GPCPLL_CFG_PLL_LOCK_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_CFG_PLL_LOCK_TRUE_F 0x00020000 +#define TRIM_SYS_GPCPLL_COEFF 0x00137004 +#define TRIM_SYS_GPCPLL_COEFF_MDIV_SHIFT 0x00000000 +#define TRIM_SYS_GPCPLL_COEFF_MDIV_FIELDMASK 0x000000ff +#define TRIM_SYS_GPCPLL_COEFF_MDIV_MASK 0x000000ff +#define TRIM_SYS_GPCPLL_COEFF_NDIV_SHIFT 0x00000008 +#define TRIM_SYS_GPCPLL_COEFF_NDIV_FIELDMASK 0x000000ff +#define TRIM_SYS_GPCPLL_COEFF_NDIV_MASK 0x0000ff00 +#define TRIM_SYS_GPCPLL_COEFF_PLDIV_SHIFT 0x00000010 +#define TRIM_SYS_GPCPLL_COEFF_PLDIV_FIELDMASK 0x0000003f +#define TRIM_SYS_GPCPLL_COEFF_PLDIV_MASK 0x003f0000 +#define TRIM_SYS_SEL_VCO 0x00137100 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_MASK 0x00000001 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_SHIFT 0x00000000 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_FIELDMASK 0x00000001 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_INIT_V 0x00000000 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_INIT_F 0x00000000 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_BYPASS_F 0x00000000 +#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_VCO_F 0x00000001 +#define TRIM_SYS_GPC2CLK_OUT 0x00137250 +#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_SIZE 0x00000006 +#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_SHIFT 0x00000000 +#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_FIELDMASK 0x0000003f +#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_MASK 0x0000003f +#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_BY31_F 0x0000003c +#define TRIM_SYS_GPC2CLK_OUT_VCODIV_SIZE 0x00000006 +#define TRIM_SYS_GPC2CLK_OUT_VCODIV_SHIFT 0x00000008 +#define TRIM_SYS_GPC2CLK_OUT_VCODIV_FIELDMASK 0x0000003f +#define TRIM_SYS_GPC2CLK_OUT_VCODIV_MASK 0x00003f00 +#define TRIM_SYS_GPC2CLK_OUT_VCODIV_BY1_F 0x00000000 +#define TRIM_SYS_GPC2CLK_OUT_SDIV14_MASK 0x80000000 +#define TRIM_SYS_GPC2CLK_OUT_SDIV14_SHIFT 0x0000001f +#define TRIM_SYS_GPC2CLK_OUT_SDIV14_FIELDMASK 0x00000001 +#define TRIM_SYS_GPC2CLK_OUT_SDIV14_INDIV4_MODE_F 0x80000000 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG__BASE 0x00134124 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG__STRIDE 0x00000200 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG(i) (0x00134124 + (i) * 0x00000200) +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_NOOFIPCLKS_SHIFT 0x00000000 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_NOOFIPCLKS_FIELDMASK 0x00003fff +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_WRITE_EN_ASSERTED_F 0x00010000 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_ENABLE_ASSERTED_F 0x00100000 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_RESET_ASSERTED_F 0x01000000 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT__BASE 0x00134128 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT__STRIDE 0x00000200 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT(i) (0x00134128 + (i) * 0x00000200) +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT_VALUE_SHIFT 0x00000000 +#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT_VALUE_FIELDMASK 0x000fffff +#define TRIM_SYS_GPCPLL_CFG2 0x0013700c +#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_SHIFT 0x00000000 +#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_FIELDMASK 0x000000ff +#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_MASK 0x000000ff +#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_SHIFT 0x00000008 +#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_FIELDMASK 0x000000ff +#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x0000ff00 +#define TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_SHIFT 0x00000018 +#define TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_FIELDMASK 0x000000ff +#define TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_MASK 0xff000000 +#define TRIM_SYS_GPCPLL_CFG3 0x00137018 +#define TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_SHIFT 0x00000000 +#define TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_FIELDMASK 0x000001ff +#define TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_MASK 0x000001ff +#define TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_SHIFT 0x00000010 +#define TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_FIELDMASK 0x000000ff +#define TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_MASK 0x00ff0000 +#define TRIM_SYS_GPCPLL_CFG3_DFS_TESTOUT_SHIFT 0x00000018 +#define TRIM_SYS_GPCPLL_CFG3_DFS_TESTOUT_FIELDMASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS0 0x00137010 +#define TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_SHIFT 0x00000000 +#define TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_FIELDMASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_SHIFT 0x00000008 +#define TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_FIELDMASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_MASK 0x00007f00 +#define TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_SHIFT 0x00000010 +#define TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_FIELDMASK 0x0000003f +#define TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_MASK 0x003f0000 +#define TRIM_SYS_GPCPLL_DVFS0_MODE_MASK 0x10000000 +#define TRIM_SYS_GPCPLL_DVFS0_MODE_SHIFT 0x0000001c +#define TRIM_SYS_GPCPLL_DVFS0_MODE_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS0_MODE_DVFSPLL_F 0x00000000 +#define TRIM_SYS_GPCPLL_DVFS1 0x00137014 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_SHIFT 0x00000000 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_FIELDMASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_MASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_MASK 0x00000080 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_SHIFT 0x00000007 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_SHIFT 0x00000008 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_FIELDMASK 0x0000007f +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_MASK 0x00007f00 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_MASK 0x00008000 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_SHIFT 0x0000000f +#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_SHIFT 0x00000010 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_FIELDMASK 0x00000fff +#define TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_MASK 0x0fff0000 +#define TRIM_SYS_GPCPLL_DVFS1_EN_SDM_MASK 0x10000000 +#define TRIM_SYS_GPCPLL_DVFS1_EN_SDM_SHIFT 0x0000001c +#define TRIM_SYS_GPCPLL_DVFS1_EN_SDM_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_MASK 0x20000000 +#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_SHIFT 0x0000001d +#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_MASK 0x40000000 +#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_SHIFT 0x0000001e +#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS1_DFS_CAL_DONE_SHIFT 0x0000001f +#define TRIM_SYS_GPCPLL_DVFS1_DFS_CAL_DONE_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_DVFS2 0x00137020 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x0013701c +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_MASK 0x00400000 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_SHIFT 0x00000016 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_YES_F 0x00400000 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_NO_F 0x00000000 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_MASK 0x80000000 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_SHIFT 0x0000001f +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_FIELDMASK 0x00000001 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_YES_F 0x80000000 +#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_NO_F 0x00000000 +#define TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG 0x001328a0 +#define TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_SHIFT 0x00000018 +#define TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_FIELDMASK 0x00000001 +#define TRIM_GPC_BCAST_GPCPLL_DVFS2 0x00132820 +#define TRIM_SYS_BYPASSCTRL 0x00137340 +#define TRIM_SYS_BYPASSCTRL_GPCPLL_MASK 0x00000001 +#define TRIM_SYS_BYPASSCTRL_GPCPLL_SHIFT 0x00000000 +#define TRIM_SYS_BYPASSCTRL_GPCPLL_FIELDMASK 0x00000001 +#define TRIM_SYS_BYPASSCTRL_GPCPLL_BYPASSCLK_F 0x00000001 +#define TRIM_SYS_BYPASSCTRL_GPCPLL_VCO_F 0x00000000 \ No newline at end of file From e321a18479d1a5bb0aed185988c9203b9c54a2bb Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 11 Aug 2026 16:47:28 -0400 Subject: [PATCH 031/205] Update registers.h --- Source/hoc-clk/sysmodule/src/soc/registers.h | 302 +++++++++---------- 1 file changed, 151 insertions(+), 151 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index 6a2f3564..8e2be21d 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -3849,154 +3849,154 @@ #define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_FIELDMASK 0x00000001 #define GPU_TOP_DEVICE_INFO_DATA_FAULT_ID_VALID_V 0x00000001 -#define TRIM_SYS_GPCPLL_CFG 0x00137000 -#define TRIM_SYS_GPCPLL_CFG_ENABLE_MASK 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_ENABLE_SHIFT 0x00000000 -#define TRIM_SYS_GPCPLL_CFG_ENABLE_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_ENABLE_NO_F 0x00000000 -#define TRIM_SYS_GPCPLL_CFG_ENABLE_YES_F 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_IDDQ_MASK 0x00000002 -#define TRIM_SYS_GPCPLL_CFG_IDDQ_SHIFT 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_IDDQ_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_IDDQ_POWER_ON_V 0x00000000 -#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_MASK 0x00000004 -#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_SHIFT 0x00000002 -#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_ENABLE_F 0x00000004 -#define TRIM_SYS_GPCPLL_CFG_SYNC_MODE_DISABLE_F 0x00000000 -#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_MASK 0x00000010 -#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_SHIFT 0x00000004 -#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_POWER_ON_F 0x00000000 -#define TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_POWER_OFF_F 0x00000010 -#define TRIM_SYS_GPCPLL_CFG_PLL_LOCK_SHIFT 0x00000011 -#define TRIM_SYS_GPCPLL_CFG_PLL_LOCK_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_CFG_PLL_LOCK_TRUE_F 0x00020000 -#define TRIM_SYS_GPCPLL_COEFF 0x00137004 -#define TRIM_SYS_GPCPLL_COEFF_MDIV_SHIFT 0x00000000 -#define TRIM_SYS_GPCPLL_COEFF_MDIV_FIELDMASK 0x000000ff -#define TRIM_SYS_GPCPLL_COEFF_MDIV_MASK 0x000000ff -#define TRIM_SYS_GPCPLL_COEFF_NDIV_SHIFT 0x00000008 -#define TRIM_SYS_GPCPLL_COEFF_NDIV_FIELDMASK 0x000000ff -#define TRIM_SYS_GPCPLL_COEFF_NDIV_MASK 0x0000ff00 -#define TRIM_SYS_GPCPLL_COEFF_PLDIV_SHIFT 0x00000010 -#define TRIM_SYS_GPCPLL_COEFF_PLDIV_FIELDMASK 0x0000003f -#define TRIM_SYS_GPCPLL_COEFF_PLDIV_MASK 0x003f0000 -#define TRIM_SYS_SEL_VCO 0x00137100 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_MASK 0x00000001 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_SHIFT 0x00000000 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_FIELDMASK 0x00000001 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_INIT_V 0x00000000 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_INIT_F 0x00000000 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_BYPASS_F 0x00000000 -#define TRIM_SYS_SEL_VCO_GPC2CLK_OUT_VCO_F 0x00000001 -#define TRIM_SYS_GPC2CLK_OUT 0x00137250 -#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_SIZE 0x00000006 -#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_SHIFT 0x00000000 -#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_FIELDMASK 0x0000003f -#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_MASK 0x0000003f -#define TRIM_SYS_GPC2CLK_OUT_BYPDIV_BY31_F 0x0000003c -#define TRIM_SYS_GPC2CLK_OUT_VCODIV_SIZE 0x00000006 -#define TRIM_SYS_GPC2CLK_OUT_VCODIV_SHIFT 0x00000008 -#define TRIM_SYS_GPC2CLK_OUT_VCODIV_FIELDMASK 0x0000003f -#define TRIM_SYS_GPC2CLK_OUT_VCODIV_MASK 0x00003f00 -#define TRIM_SYS_GPC2CLK_OUT_VCODIV_BY1_F 0x00000000 -#define TRIM_SYS_GPC2CLK_OUT_SDIV14_MASK 0x80000000 -#define TRIM_SYS_GPC2CLK_OUT_SDIV14_SHIFT 0x0000001f -#define TRIM_SYS_GPC2CLK_OUT_SDIV14_FIELDMASK 0x00000001 -#define TRIM_SYS_GPC2CLK_OUT_SDIV14_INDIV4_MODE_F 0x80000000 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG__BASE 0x00134124 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG__STRIDE 0x00000200 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG(i) (0x00134124 + (i) * 0x00000200) -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_NOOFIPCLKS_SHIFT 0x00000000 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_NOOFIPCLKS_FIELDMASK 0x00003fff -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_WRITE_EN_ASSERTED_F 0x00010000 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_ENABLE_ASSERTED_F 0x00100000 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_RESET_ASSERTED_F 0x01000000 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT__BASE 0x00134128 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT__STRIDE 0x00000200 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT(i) (0x00134128 + (i) * 0x00000200) -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT_VALUE_SHIFT 0x00000000 -#define TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT_VALUE_FIELDMASK 0x000fffff -#define TRIM_SYS_GPCPLL_CFG2 0x0013700c -#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_SHIFT 0x00000000 -#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_FIELDMASK 0x000000ff -#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_MASK 0x000000ff -#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_SHIFT 0x00000008 -#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_FIELDMASK 0x000000ff -#define TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x0000ff00 -#define TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_SHIFT 0x00000018 -#define TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_FIELDMASK 0x000000ff -#define TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_MASK 0xff000000 -#define TRIM_SYS_GPCPLL_CFG3 0x00137018 -#define TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_SHIFT 0x00000000 -#define TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_FIELDMASK 0x000001ff -#define TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_MASK 0x000001ff -#define TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_SHIFT 0x00000010 -#define TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_FIELDMASK 0x000000ff -#define TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_MASK 0x00ff0000 -#define TRIM_SYS_GPCPLL_CFG3_DFS_TESTOUT_SHIFT 0x00000018 -#define TRIM_SYS_GPCPLL_CFG3_DFS_TESTOUT_FIELDMASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS0 0x00137010 -#define TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_SHIFT 0x00000000 -#define TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_FIELDMASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_SHIFT 0x00000008 -#define TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_FIELDMASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_MASK 0x00007f00 -#define TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_SHIFT 0x00000010 -#define TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_FIELDMASK 0x0000003f -#define TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_MASK 0x003f0000 -#define TRIM_SYS_GPCPLL_DVFS0_MODE_MASK 0x10000000 -#define TRIM_SYS_GPCPLL_DVFS0_MODE_SHIFT 0x0000001c -#define TRIM_SYS_GPCPLL_DVFS0_MODE_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS0_MODE_DVFSPLL_F 0x00000000 -#define TRIM_SYS_GPCPLL_DVFS1 0x00137014 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_SHIFT 0x00000000 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_FIELDMASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_MASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_MASK 0x00000080 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_SHIFT 0x00000007 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_SHIFT 0x00000008 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_FIELDMASK 0x0000007f -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_MASK 0x00007f00 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_MASK 0x00008000 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_SHIFT 0x0000000f -#define TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_SHIFT 0x00000010 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_FIELDMASK 0x00000fff -#define TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_MASK 0x0fff0000 -#define TRIM_SYS_GPCPLL_DVFS1_EN_SDM_MASK 0x10000000 -#define TRIM_SYS_GPCPLL_DVFS1_EN_SDM_SHIFT 0x0000001c -#define TRIM_SYS_GPCPLL_DVFS1_EN_SDM_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_MASK 0x20000000 -#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_SHIFT 0x0000001d -#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_MASK 0x40000000 -#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_SHIFT 0x0000001e -#define TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS1_DFS_CAL_DONE_SHIFT 0x0000001f -#define TRIM_SYS_GPCPLL_DVFS1_DFS_CAL_DONE_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_DVFS2 0x00137020 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x0013701c -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_MASK 0x00400000 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_SHIFT 0x00000016 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_YES_F 0x00400000 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_NO_F 0x00000000 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_MASK 0x80000000 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_SHIFT 0x0000001f -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_FIELDMASK 0x00000001 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_YES_F 0x80000000 -#define TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_NO_F 0x00000000 -#define TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG 0x001328a0 -#define TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_SHIFT 0x00000018 -#define TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_FIELDMASK 0x00000001 -#define TRIM_GPC_BCAST_GPCPLL_DVFS2 0x00132820 -#define TRIM_SYS_BYPASSCTRL 0x00137340 -#define TRIM_SYS_BYPASSCTRL_GPCPLL_MASK 0x00000001 -#define TRIM_SYS_BYPASSCTRL_GPCPLL_SHIFT 0x00000000 -#define TRIM_SYS_BYPASSCTRL_GPCPLL_FIELDMASK 0x00000001 -#define TRIM_SYS_BYPASSCTRL_GPCPLL_BYPASSCLK_F 0x00000001 -#define TRIM_SYS_BYPASSCTRL_GPCPLL_VCO_F 0x00000000 \ No newline at end of file +#define GPU_TRIM_SYS_GPCPLL_CFG 0x00137000 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENABLE_MASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENABLE_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENABLE_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENABLE_NO_F 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENABLE_YES_F 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_IDDQ_MASK 0x00000002 +#define GPU_TRIM_SYS_GPCPLL_CFG_IDDQ_SHIFT 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_IDDQ_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_IDDQ_POWER_ON_V 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG_SYNC_MODE_MASK 0x00000004 +#define GPU_TRIM_SYS_GPCPLL_CFG_SYNC_MODE_SHIFT 0x00000002 +#define GPU_TRIM_SYS_GPCPLL_CFG_SYNC_MODE_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_SYNC_MODE_ENABLE_F 0x00000004 +#define GPU_TRIM_SYS_GPCPLL_CFG_SYNC_MODE_DISABLE_F 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_MASK 0x00000010 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_SHIFT 0x00000004 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_POWER_ON_F 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG_ENB_LCKDET_POWER_OFF_F 0x00000010 +#define GPU_TRIM_SYS_GPCPLL_CFG_PLL_LOCK_SHIFT 0x00000011 +#define GPU_TRIM_SYS_GPCPLL_CFG_PLL_LOCK_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_CFG_PLL_LOCK_TRUE_F 0x00020000 +#define GPU_TRIM_SYS_GPCPLL_COEFF 0x00137004 +#define GPU_TRIM_SYS_GPCPLL_COEFF_MDIV_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_COEFF_MDIV_FIELDMASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_COEFF_MDIV_MASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_COEFF_NDIV_SHIFT 0x00000008 +#define GPU_TRIM_SYS_GPCPLL_COEFF_NDIV_FIELDMASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_COEFF_NDIV_MASK 0x0000ff00 +#define GPU_TRIM_SYS_GPCPLL_COEFF_PLDIV_SHIFT 0x00000010 +#define GPU_TRIM_SYS_GPCPLL_COEFF_PLDIV_FIELDMASK 0x0000003f +#define GPU_TRIM_SYS_GPCPLL_COEFF_PLDIV_MASK 0x003f0000 +#define GPU_TRIM_SYS_SEL_VCO 0x00137100 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_MASK 0x00000001 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_SHIFT 0x00000000 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_INIT_V 0x00000000 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_INIT_F 0x00000000 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_BYPASS_F 0x00000000 +#define GPU_TRIM_SYS_SEL_VCO_GPC2CLK_OUT_VCO_F 0x00000001 +#define GPU_TRIM_SYS_GPC2CLK_OUT 0x00137250 +#define GPU_TRIM_SYS_GPC2CLK_OUT_BYPDIV_SIZE 0x00000006 +#define GPU_TRIM_SYS_GPC2CLK_OUT_BYPDIV_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPC2CLK_OUT_BYPDIV_FIELDMASK 0x0000003f +#define GPU_TRIM_SYS_GPC2CLK_OUT_BYPDIV_MASK 0x0000003f +#define GPU_TRIM_SYS_GPC2CLK_OUT_BYPDIV_BY31_F 0x0000003c +#define GPU_TRIM_SYS_GPC2CLK_OUT_VCODIV_SIZE 0x00000006 +#define GPU_TRIM_SYS_GPC2CLK_OUT_VCODIV_SHIFT 0x00000008 +#define GPU_TRIM_SYS_GPC2CLK_OUT_VCODIV_FIELDMASK 0x0000003f +#define GPU_TRIM_SYS_GPC2CLK_OUT_VCODIV_MASK 0x00003f00 +#define GPU_TRIM_SYS_GPC2CLK_OUT_VCODIV_BY1_F 0x00000000 +#define GPU_TRIM_SYS_GPC2CLK_OUT_SDIV14_MASK 0x80000000 +#define GPU_TRIM_SYS_GPC2CLK_OUT_SDIV14_SHIFT 0x0000001f +#define GPU_TRIM_SYS_GPC2CLK_OUT_SDIV14_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPC2CLK_OUT_SDIV14_INDIV4_MODE_F 0x80000000 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG__BASE 0x00134124 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG__STRIDE 0x00000200 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG(i) (0x00134124 + (i) * 0x00000200) +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_NOOFIPCLKS_SHIFT 0x00000000 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_NOOFIPCLKS_FIELDMASK 0x00003fff +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_WRITE_EN_ASSERTED_F 0x00010000 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_ENABLE_ASSERTED_F 0x00100000 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CFG_RESET_ASSERTED_F 0x01000000 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT__BASE 0x00134128 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT__STRIDE 0x00000200 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT(i) (0x00134128 + (i) * 0x00000200) +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT_VALUE_SHIFT 0x00000000 +#define GPU_TRIM_GPC_CLK_CNTR_NCGPCCLK_CNT_VALUE_FIELDMASK 0x000fffff +#define GPU_TRIM_SYS_GPCPLL_CFG2 0x0013700c +#define GPU_TRIM_SYS_GPCPLL_CFG2_SDM_DIN_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG2_SDM_DIN_FIELDMASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_CFG2_SDM_DIN_MASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_SHIFT 0x00000008 +#define GPU_TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_FIELDMASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x0000ff00 +#define GPU_TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_SHIFT 0x00000018 +#define GPU_TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_FIELDMASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_CFG2_PLL_STEPA_MASK 0xff000000 +#define GPU_TRIM_SYS_GPCPLL_CFG3 0x00137018 +#define GPU_TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_FIELDMASK 0x000001ff +#define GPU_TRIM_SYS_GPCPLL_CFG3_VCO_CTRL_MASK 0x000001ff +#define GPU_TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_SHIFT 0x00000010 +#define GPU_TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_FIELDMASK 0x000000ff +#define GPU_TRIM_SYS_GPCPLL_CFG3_PLL_STEPB_MASK 0x00ff0000 +#define GPU_TRIM_SYS_GPCPLL_CFG3_DFS_TESTOUT_SHIFT 0x00000018 +#define GPU_TRIM_SYS_GPCPLL_CFG3_DFS_TESTOUT_FIELDMASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS0 0x00137010 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_FIELDMASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_SHIFT 0x00000008 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_FIELDMASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_DET_MAX_MASK 0x00007f00 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_SHIFT 0x00000010 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_FIELDMASK 0x0000003f +#define GPU_TRIM_SYS_GPCPLL_DVFS0_DFS_DC_OFFSET_MASK 0x003f0000 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_MODE_MASK 0x10000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_MODE_SHIFT 0x0000001c +#define GPU_TRIM_SYS_GPCPLL_DVFS0_MODE_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS0_MODE_DVFSPLL_F 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1 0x00137014 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_SHIFT 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_FIELDMASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_DET_MASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_MASK 0x00000080 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_SHIFT 0x00000007 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_STRB_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_SHIFT 0x00000008 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_FIELDMASK 0x0000007f +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_CAL_MASK 0x00007f00 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_MASK 0x00008000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_SHIFT 0x0000000f +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_EXT_SEL_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_SHIFT 0x00000010 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_FIELDMASK 0x00000fff +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_CTRL_MASK 0x0fff0000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_SDM_MASK 0x10000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_SDM_SHIFT 0x0000001c +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_SDM_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_DFS_MASK 0x20000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_DFS_SHIFT 0x0000001d +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_DFS_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_MASK 0x40000000 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_SHIFT 0x0000001e +#define GPU_TRIM_SYS_GPCPLL_DVFS1_EN_DFS_CAL_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_CAL_DONE_SHIFT 0x0000001f +#define GPU_TRIM_SYS_GPCPLL_DVFS1_DFS_CAL_DONE_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_DVFS2 0x00137020 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x0013701c +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_MASK 0x00400000 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_SHIFT 0x00000016 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_YES_F 0x00400000 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_SLOWDOWN_USING_PLL_NO_F 0x00000000 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_MASK 0x80000000 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_SHIFT 0x0000001f +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_YES_F 0x80000000 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN_EN_DYNRAMP_NO_F 0x00000000 +#define GPU_TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG 0x001328a0 +#define GPU_TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_SHIFT 0x00000018 +#define GPU_TRIM_GPC_BCAST_GPCPLL_NDIV_SLOWDOWN_DEBUG_PLL_DYNRAMP_DONE_SYNCED_FIELDMASK 0x00000001 +#define GPU_TRIM_GPC_BCAST_GPCPLL_DVFS2 0x00132820 +#define GPU_TRIM_SYS_BYPASSCTRL 0x00137340 +#define GPU_TRIM_SYS_BYPASSCTRL_GPCPLL_MASK 0x00000001 +#define GPU_TRIM_SYS_BYPASSCTRL_GPCPLL_SHIFT 0x00000000 +#define GPU_TRIM_SYS_BYPASSCTRL_GPCPLL_FIELDMASK 0x00000001 +#define GPU_TRIM_SYS_BYPASSCTRL_GPCPLL_BYPASSCLK_F 0x00000001 +#define GPU_TRIM_SYS_BYPASSCTRL_GPCPLL_VCO_F 0x00000000 \ No newline at end of file From 5b70938f9105c0e30f38511c50564fa82b3213d7 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 13 Aug 2026 18:40:51 -0400 Subject: [PATCH 032/205] nvservices debug unlock + license change --- .../loader/source/ldr_process_creation.cpp | 8 +- .../loader/source/oc/nvsrv/nvsrv.cpp | 102 ++++++++++++++++++ .../loader/source/oc/nvsrv/nvsrv.hpp | 23 ++++ .../loader/source/oc/oc_common.hpp | 1 + .../loader/source/oc/oc_loader.hpp | 1 + .../source/oc/pcv/mariko/pcv_mariko.cpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_cpu.hpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_gpu.cpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_gpu.hpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 2 +- .../src/ui/gui/global_override_gui.cpp | 2 +- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 2 +- .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 2 +- .../hoc-clk/sysmodule/src/mapping/mem_map.hpp | 2 +- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 2 +- Source/hoc-clk/sysmodule/src/mgr/governor.hpp | 2 +- 18 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.hpp diff --git a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp index 0baf0b56..09cafb2d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp @@ -121,9 +121,10 @@ namespace ams::ldr { /* Global NSO header cache. */ NsoHeader g_nso_headers[Nso_Count]; - /* Pcv/Ptm check cache */ + /* Pcv/Ptm/NvServices check cache */ bool g_is_pcv; bool g_is_ptm; + bool g_is_nvsrv; /* Global Zstd decompression context. */ constexpr size_t ZstdDctxWorkspaceSize = 0x176E8; @@ -379,6 +380,7 @@ namespace ams::ldr { /* Check if NCA is PCV or PTM */ g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; + g_is_nvsrv = meta->aci->program_id == ncm::SystemProgramId::NvServices; /* If we have data to validate, validate it. */ if (meta->check_verification_data) { @@ -752,6 +754,10 @@ namespace ams::ldr { if (g_is_ptm) { hoc::ptm::Patch(map_address, nso_size); } + + if (g_is_nvsrv) { + hoc::nvsrv::Patch(map_address, nso_size, nso_address); + } } /* Set permissions. */ diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp new file mode 100644 index 00000000..19e6bfcf --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "nvsrv.hpp" + +namespace ams::ldr::hoc::nvsrv { + + namespace { + + /* NvServices device names */ + constexpr char DbgGpuPath[] = "/dev/nvhost-dbg-gpu"; + constexpr char ProfGpuPath[] = "/dev/nvhost-prof-gpu"; + + /* Permission offset to patch */ + constexpr size_t DevTablePermOffset = 0x68; + + uintptr_t FindBytes(uintptr_t start, uintptr_t end, const void *needle, size_t len) { + const u8 *pat = reinterpret_cast(needle); + for (uintptr_t addr = start; addr + len <= end; ++addr) { + if (std::memcmp(reinterpret_cast(addr), pat, len) == 0) { + return addr; + } + } + return 0; + } + + /* Unlock the devices */ + Result UnlockDevicePermission(uintptr_t mapped_nso, size_t nso_size, uintptr_t nso_address, const char *path, const char *description) { + const size_t path_len = std::strlen(path) + 1; + + const uintptr_t str_addr = FindBytes(mapped_nso, mapped_nso + nso_size, path, path_len); + if (str_addr == 0) { + LOGGING("nvsrv: %s path string not found (nso_size=%lx)", description, static_cast(nso_size)); + R_THROW(ldr::ResultInvalidNvsrvDevTable()); + } + + const uintptr_t str_offset = str_addr - mapped_nso; + const uintptr_t candidates[] = { str_offset, nso_address + str_offset }; + + uintptr_t entry_addr = 0; + for (uintptr_t ptr = mapped_nso; entry_addr == 0 && ptr + sizeof(uintptr_t) <= mapped_nso + nso_size; ptr += sizeof(uintptr_t)) { + const uintptr_t val = *reinterpret_cast(ptr); + for (uintptr_t cand : candidates) { + if (val == cand) { + entry_addr = ptr; + break; + } + } + } + if (entry_addr == 0) { + LOGGING("nvsrv: %s str@+%lx has no referencing table entry", description, + static_cast(str_offset), static_cast(candidates[0]), static_cast(candidates[1])); + R_THROW(ldr::ResultInvalidNvsrvDevTable()); + } + + const uintptr_t perm_addr = entry_addr + DevTablePermOffset; + if (perm_addr + sizeof(uintptr_t) > mapped_nso + nso_size) { + LOGGING("nvsrv: %s entry@+%lx perm field out of bounds", description, static_cast(entry_addr - mapped_nso)); + R_THROW(ldr::ResultInvalidNvsrvDevTable()); + } + + uintptr_t *perm = reinterpret_cast(perm_addr); + LOGGING("nvsrv: %s entry@+%lx perm@+%lx was %lx", description, + static_cast(entry_addr - mapped_nso), + static_cast(perm_addr - mapped_nso), + static_cast(*perm)); + + PATCH_OFFSET(perm, static_cast(0)); + R_SUCCEED(); + } + + } + + void Patch(uintptr_t mapped_nso, size_t nso_size, uintptr_t nso_address) { + struct { + const char *path; + const char *description; + } targets[] = { + { DbgGpuPath, "dbg-gpu" }, + { ProfGpuPath, "prof-gpu" }, + }; + + for (auto &t : targets) { + const Result res = UnlockDevicePermission(mapped_nso, nso_size, nso_address, t.path, t.description); + LOGGING("nvsrv: %s unlock%s", t.description, R_SUCCEEDED(res) ? "ed" : " skipped"); + } + } + +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.hpp new file mode 100644 index 00000000..4c551a33 --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.hpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "../oc_common.hpp" + +namespace ams::ldr::hoc::nvsrv { + void Patch(uintptr_t mapped_nso, size_t nso_size, uintptr_t nso_address); +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 9440aaf8..2e79da3b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -94,6 +94,7 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(HookPayloadEscapes, 1028); R_DEFINE_ERROR_RESULT(HookDataOutOfMemory, 1029); R_DEFINE_ERROR_RESULT(HookUnavailable, 1030); + R_DEFINE_ERROR_RESULT(InvalidNvsrvDevTable, 1031); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_loader.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_loader.hpp index 4396226a..717f95bb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_loader.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_loader.hpp @@ -21,3 +21,4 @@ #include "oc_common.hpp" #include "pcv/pcv.hpp" #include "ptm/ptm.hpp" +#include "nvsrv/nvsrv.hpp" \ No newline at end of file diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 331d988d..0c65ea57 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 4bc8cb93..64e48b70 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp index d572857e..d44f90b4 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp index 89a68aef..8ad01318 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp index a56a5ff2..4c00ba74 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index d230a276..e848a628 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index 3072b1cf..031dff24 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -5,7 +5,7 @@ * * Copyright (c) B3711 * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp index 25a8cd0f..3c16758b 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp @@ -1,6 +1,6 @@ /* * - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index eb73f14a..8af7e964 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index 860df53d..ae34021a 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp index d2f76373..6cb6e1be 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 3bd87f44..670f2636 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp index 0622eee1..d9f2cb43 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Souldbminer and Horizon OC Contributors + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, From 62127a4383491bd68ec7b10efb851ce15426ad8f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 13 Aug 2026 18:44:22 -0400 Subject: [PATCH 033/205] quick fix --- Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp index 19e6bfcf..3660289d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp @@ -62,7 +62,7 @@ namespace ams::ldr::hoc::nvsrv { } if (entry_addr == 0) { LOGGING("nvsrv: %s str@+%lx has no referencing table entry", description, - static_cast(str_offset), static_cast(candidates[0]), static_cast(candidates[1])); + static_cast(str_offset)); R_THROW(ldr::ResultInvalidNvsrvDevTable()); } From 539cd5846465dc48f08a69432a7cc901897cc00c Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 13 Aug 2026 19:11:00 -0400 Subject: [PATCH 034/205] verbosity patch rework --- .../loader/source/oc/customize.cpp | 12 +++++- .../loader/source/oc/customize.hpp | 4 +- .../loader/source/oc/oc_common.hpp | 1 - .../source/oc/pcv/mariko/pcv_mariko.cpp | 42 +++++++++---------- .../source/oc/pcv/mariko/pcv_mariko.hpp | 2 +- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 8563a0d0..4550d8ea 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -132,7 +132,7 @@ volatile CustomizeTable C = { AUTO /* 153 */, AUTO /* 192 */, AUTO /* 230 */, - AUTO /* 269 */, + AUTO /* 268 */, AUTO /* 307 */, AUTO /* 346 */, AUTO /* 384 */, @@ -219,6 +219,16 @@ volatile CustomizeTable C = { .fineTune_t6_tRTW = 0, .fineTune_t7_tWTR = 0, +/* Debugging options */ + +/* PCV Log Verbosity */ +/* -1: Nothing */ +/* 0: Basic logging */ +/* 1: More advanced logging */ +/* 2: All logging excluding MMIO */ +/* 3: All logging including MMIO */ +.pcvLogVerbosity = 2, + /* You shouldn't have to anything past here. */ .eristaCpuDvfsTable = { { 204000, { 721094, }, { } }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index a898e20b..2e8be644 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -132,7 +132,9 @@ struct CustomizeTable { u32 fineTune_t6_tRTW; u32 fineTune_t7_tWTR; - u32 reserved[60]; + u32 pcvLogVerbosity; + + u32 reserved[58]; CustomizeCpuDvfsTable eristaCpuDvfsTable; CustomizeCpuDvfsTable eristaCpuDvfsTableSLT; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 2e79da3b..374730c8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -32,7 +32,6 @@ #endif #define HOC_PCV_NVLOG_PATCH 1 -#define HOC_PCV_FORCE_VERBOSITY 1 #include "customize.hpp" #include "oc_log.hpp" diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 0c65ea57..9a1937c6 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -142,29 +142,27 @@ namespace ams::ldr::hoc::pcv::mariko { /* Redirect the call sites as patching the actual function causes crash */ const uintptr_t roStart = g_pcv_cave + g_pcv_cave_size; /* module .rodata start */ size_t patchedSites = 0; - if (HOC_PCV_NVLOG_PATCH) { - for (u32 *p = nsoStart; reinterpret_cast(p + 1) <= textEnd; ++p) { - if (!AsmIsBl(*p)) { - continue; - } - const uintptr_t pc = reinterpret_cast(p); - if (AsmBranchTarget(*p, pc) != nvlog_addr) { - continue; - } - bool isFmtCall = false; - for (u32 j = 1; j <= 8 && reinterpret_cast(p - j) >= reinterpret_cast(nsoStart); ++j) { - const u32 w = *(p - j); - if (AsmIsAdrp(w) && asm_get_rd(w) == 0) { /* adrp x0, */ - const uintptr_t wpc = pc - j * 4; - const uintptr_t tgtPage = (wpc & ~static_cast(0xFFFu)) + static_cast(AsmAdrpPageOffset(w)); - if (tgtPage >= (roStart & ~static_cast(0xFFFu))) { isFmtCall = true; break; } - } - } - if (isFmtCall) { - PATCH_OFFSET(p, AsmMakeBl(pc, helper)); - ++patchedSites; + for (u32 *p = nsoStart; reinterpret_cast(p + 1) <= textEnd; ++p) { + if (!AsmIsBl(*p)) { + continue; + } + const uintptr_t pc = reinterpret_cast(p); + if (AsmBranchTarget(*p, pc) != nvlog_addr) { + continue; + } + bool isFmtCall = false; + for (u32 j = 1; j <= 8 && reinterpret_cast(p - j) >= reinterpret_cast(nsoStart); ++j) { + const u32 w = *(p - j); + if (AsmIsAdrp(w) && asm_get_rd(w) == 0) { /* adrp x0, */ + const uintptr_t wpc = pc - j * 4; + const uintptr_t tgtPage = (wpc & ~static_cast(0xFFFu)) + static_cast(AsmAdrpPageOffset(w)); + if (tgtPage >= (roStart & ~static_cast(0xFFFu))) { isFmtCall = true; break; } } } + if (isFmtCall) { + PATCH_OFFSET(p, AsmMakeBl(pc, helper)); + ++patchedSites; + } } LOGGING("NvLogRedirect: stub@+%lx vsnprintf@+%lx helper@+%lx instr=%zu sites=%zu", @@ -221,7 +219,7 @@ namespace ams::ldr::hoc::pcv::mariko { #if HOC_UART_LOG /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ Result ForceVerbosity(u32 *ptr) { - PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(HOC_PCV_FORCE_VERBOSITY))); /* movz w0,#level */ + PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(C.pcvLogVerbosity))); /* movz w0,#level */ PATCH_OFFSET(&ptr[1], RetIns); /* ret */ R_SUCCEED(); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index 00bda587..95ac2a89 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -151,7 +151,7 @@ namespace ams::ldr::hoc::pcv::mariko { } inline bool ForceVerbosityPatternFn(u32 *ptr) { - if (HOC_PCV_FORCE_VERBOSITY == 0 || g_pcv_cave == 0) { + if (g_pcv_cave == 0) { return false; } if (reinterpret_cast(ptr + 11) > g_pcv_cave) { /* .text only */ From 836e24c82e59c513cff791d1fee05e7a5370c475 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 13 Aug 2026 20:03:53 -0400 Subject: [PATCH 035/205] more debug feature --- .../loader/source/oc/customize.cpp | 2 +- .../loader/source/oc/oc_common.hpp | 2 - .../source/oc/pcv/mariko/pcv_mariko.cpp | 6 +- Source/hoc-clk/build.sh | 18 ++++-- Source/hoc-clk/common/include/hocclk/config.h | 5 +- Source/hoc-clk/overlay/Makefile | 5 ++ Source/hoc-clk/overlay/src/main.cpp | 4 +- .../hoc-clk/overlay/src/ui/gui/base_gui.cpp | 6 +- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 55 ++++++++++++++++++- Source/hoc-clk/sysmodule/src/file/kip.cpp | 3 + Source/hoc-clk/sysmodule/src/file/kip.hpp | 8 ++- build.sh | 20 ++++--- 12 files changed, 111 insertions(+), 23 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 4550d8ea..dae3037f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -222,7 +222,7 @@ volatile CustomizeTable C = { /* Debugging options */ /* PCV Log Verbosity */ -/* -1: Nothing */ +/* 0xFF: Nothing */ /* 0: Basic logging */ /* 1: More advanced logging */ /* 2: All logging excluding MMIO */ diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 374730c8..bbaaeb97 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -31,8 +31,6 @@ #define HOC_UART_LOG 0 #endif -#define HOC_PCV_NVLOG_PATCH 1 - #include "customize.hpp" #include "oc_log.hpp" diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 9a1937c6..1a3d162c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -219,8 +219,10 @@ namespace ams::ldr::hoc::pcv::mariko { #if HOC_UART_LOG /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ Result ForceVerbosity(u32 *ptr) { - PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(C.pcvLogVerbosity))); /* movz w0,#level */ - PATCH_OFFSET(&ptr[1], RetIns); /* ret */ + if(C.pcvLogVerbosity != 0xff) { + PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(C.pcvLogVerbosity))); /* movz w0,#level */ + PATCH_OFFSET(&ptr[1], RetIns); /* ret */ + } R_SUCCEED(); } #endif diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index dea28f0b..b3de7e5f 100644 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -4,10 +4,20 @@ set -e ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIST_DIR="$ROOT_DIR/dist" CORES="$(nproc --all)" +OVERLAY_DEBUG=0 -if [[ -n "$1" ]]; then - DIST_DIR="$1" -fi +for arg in "$@"; do + case "$arg" in + -d|--debug) + OVERLAY_DEBUG=1 + ;; + "") + ;; + *) + DIST_DIR="$arg" + ;; + esac +done echo echo "*** Compiling hoc-clk ***" @@ -25,7 +35,7 @@ cp -vf "$ROOT_DIR/sysmodule/toolbox.json" "$DIST_DIR/atmosphere/contents/$TITLE_ echo echo "*** Compiling hoc-clk-overlay ***" pushd "$ROOT_DIR/overlay" -make -j$CORES +make -j$CORES OVERLAY_DEBUG=$OVERLAY_DEBUG popd > /dev/null mkdir -p "$DIST_DIR/switch/.overlays" diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index cbf37c06..0e6868c5 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -228,6 +228,8 @@ typedef enum { KipConfigValue_t6_tRTW_fine_tune, KipConfigValue_t7_tWTR_fine_tune, + KipConfigValue_PcvDebugVerbosity, + KipCrc32, HocClkConfigValue_EnumMax, } HocClkConfigValue; @@ -512,7 +514,7 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_g_volt_e_1075200: return pretty ? "Erista GPU Volt 1075 MHz" : "g_volt_e_1075200"; case KipConfigValue_t6_tRTW_fine_tune: return pretty ? "t6 - tRTW Fine Tune" : "t6_tRTW_fine_tune"; case KipConfigValue_t7_tWTR_fine_tune: return pretty ? "t7 - tWTR Fine Tune" : "t7_tWTR_fine_tune"; - + case KipConfigValue_PcvDebugVerbosity: return pretty ? "Pcv Debug Verbosity" : "debug_verbosity"; case KipConfigValue_g_soc_volt_1866000: return pretty ? "Mariko SOC Volt 1866 MHz" : "g_soc_volt_1866000"; case KipConfigValue_g_soc_volt_2000000: return pretty ? "Mariko SOC Volt 2000 MHz" : "g_soc_volt_2000000"; case KipConfigValue_g_soc_volt_2133000: return pretty ? "Mariko SOC Volt 2133 MHz" : "g_soc_volt_2133000"; @@ -780,6 +782,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_AulaDisplayColorPreset: case HocClkConfigValue_AutoRamCpuCpuOCFreq: case HocClkConfigValue_AutoRamCpuRamOCThreshold: + case KipConfigValue_PcvDebugVerbosity: return true; case HocClkConfigValue_BatteryChargeCurrent: return ((input >= 1024) && (input <= 3072)) || !input; diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index 1542d854..dfa799a0 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -26,6 +26,8 @@ DATA := data ../assets INCLUDES := ../common/include EXEFS_SRC := exefs_src IS_MINIMAL := 0 +OVERLAY_DEBUG ?= 0 + APP_TITLE := Horizon OC NO_ICON := 1 @@ -46,6 +48,9 @@ TARGET_VERSION := $(APP_VERSION) # options for code generation #--------------------------------------------------------------------------------- DEFINES := -DDISABLE_IPC -DTARGET="\"$(TARGET)\"" -DTARGET_VERSION="\"$(TARGET_VERSION)\"" -DIS_MINIMAL=$(IS_MINIMAL) +ifeq ($(OVERLAY_DEBUG),1) + DEFINES += -DOVERLAY_DEBUG +endif ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE diff --git a/Source/hoc-clk/overlay/src/main.cpp b/Source/hoc-clk/overlay/src/main.cpp index 1024dac5..cfd977f1 100644 --- a/Source/hoc-clk/overlay/src/main.cpp +++ b/Source/hoc-clk/overlay/src/main.cpp @@ -96,6 +96,7 @@ class AppOverlay : public tsl::Overlay { ""); } + #ifndef OVERLAY_DEBUG HocClkContext context = {}; if (R_SUCCEEDED(hocclkIpcGetCurrentContext(&context)) && context.rebootRequired) { return initially("Horizon OC has been updated.\n\n" @@ -104,7 +105,8 @@ class AppOverlay : public tsl::Overlay { "to finish applying the update.", ""); } - + #endif + return initially(); } }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp index 894253e8..1d69efdc 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp @@ -71,6 +71,7 @@ std::string getVersionString() { static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(7, 15, 15, 15); static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(2, 8, 11, 15); static constexpr tsl::Color STATIC_TEAL = tsl::Color(7, 15, 15, 15); + const std::string name = " Horizon OC"; static s32 drawDynamicUltraText(tsl::gfx::Renderer *renderer, s32 startX, s32 y, u32 fontSize, const tsl::Color &staticColor, @@ -131,8 +132,11 @@ void BaseGui::preDraw(tsl::gfx::Renderer *renderer) { renderer->drawBitmap(LOGO_X, LOGO_Y_REAL - LOGO_LABEL_FONT_SIZE, LOGO_IMG_W, LOGO_IMG_H, hoc_rgba); drawDynamicUltraText(renderer, LOGO_TEXT_X, TEXT_Y, LOGO_LABEL_FONT_SIZE, STATIC_TEAL, false); - + #ifdef OVERLAY_DEBUG + static const std::string versionStr = "Version " + getVersionString() + " \"Athena (debug)\""; + #else static const std::string versionStr = "Version " + getVersionString() + " \"Athena\""; + #endif static constexpr tsl::Color versionColor(9, 9, 9, 15); static constexpr s32 vx = LOGO_TEXT_X + 15; static constexpr s32 vy = TEXT_Y + 18; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 616f8e7e..399c9700 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -66,7 +66,9 @@ class CpuSubmenuGui; class GpuSubmenuGui; class GpuCustomTableSubmenuGui; class ExperimentalSettingsSubMenuGui; - +#ifdef OVERLAY_DEBUG +class DebugSettingsSubMenuGui; +#endif MiscGui::MiscGui() { this->configList = new HocClkConfigValueList{}; } @@ -735,7 +737,18 @@ void MiscGui::listUI() { experimentalSubMenu->setValue(R_ARROW); this->listElement->addItem(experimentalSubMenu); } - + #ifdef OVERLAY_DEBUG + tsl::elm::ListItem *debugSubMenu = new tsl::elm::ListItem("Debug Settings"); + debugSubMenu->setClickListener([](u64 keys) { + if (keys & HidNpadButton_A) { + tsl::swapTo(); + return true; + } + return false; + }); + debugSubMenu->setValue(R_ARROW); + this->listElement->addItem(debugSubMenu); + #endif if (!lastItemName.empty()) { this->listElement->jumpToItem(lastItemName); } @@ -928,6 +941,44 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { } }; +#ifdef OVERLAY_DEBUG +class DebugSettingsSubMenuGui : public MiscGui { + public: + DebugSettingsSubMenuGui() { + } + + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { + if (keysDown & KEY_B) { + triggerExitFeedback(); + lastItemName = "Debug Settings"; + tsl::swapTo(); + return true; + } + return false; + } + + protected: + void listUI() override { + Result rc = hocclkIpcGetConfigValues(this->configList); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("Debug Settings")); + ValueThresholds thresholdsDisabled(0, 0); + std::vector VerbosityList = { + NamedValue("Disabled", 0xff), NamedValue("0", 0), NamedValue("1", 1), + NamedValue("2", 2), NamedValue("3", 3), + }; + + addConfigButton(KipConfigValue_PcvDebugVerbosity, "PCV Log Verbosity", ValueRange(0, 0, 1, "", 0), + "Verbosity", &thresholdsDisabled, {}, VerbosityList, false, true); + } +}; + +#endif + class GovernorSettingsSubMenuGui : public MiscGui { public: GovernorSettingsSubMenuGui() { diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 46a5cfb8..45aa22bd 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -145,6 +145,7 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune)); CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune)); + CUST_WRITE_FIELD_BATCH(&table, pcvLogVerbosity, config::GetConfigValue(KipConfigValue_PcvDebugVerbosity)); if (!cust_write_table_f(fp, &table)) { fclose(fp); @@ -329,6 +330,8 @@ namespace kip { configValues.values[KipConfigValue_t7_tWTR_fine_tune] = cust_get_tWTR_fine_tune(&table); configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table); + configValues.values[KipConfigValue_PcvDebugVerbosity] = cust_get_log_verbosity(&table); + if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { if (config::SetConfigValues(&configValues, true)) { fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 408047ee..75f802dd 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -99,8 +99,10 @@ namespace kip { u32 t6_tRTW_fine_tune; u32 t7_tWTR_fine_tune; + + u32 pcvLogVerbosity; - u32 reserved[60]; + u32 reserved[58]; } CustomizeTable; #define CUST_MAGIC "CUST" @@ -505,6 +507,10 @@ namespace kip { return CUST_GET_FIELD(t, t7_tWTR_fine_tune); } + static inline u32 cust_get_log_verbosity(const CustomizeTable *t) { + return CUST_GET_FIELD(t, pcvLogVerbosity); + } + static inline u32 cust_get_read_latency_1333(const CustomizeTable *t) { return CUST_GET_FIELD(t, readLatency1333); } diff --git a/build.sh b/build.sh index 98c816e7..95846d70 100644 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ LDR_MAKE="nx_release" LDR_SET=0 NO_EXO=0 JOBS="" -UART_LOGGING=0 +DEBUG_BUILD=0 ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIST_DIR="$ROOT_DIR/dist" @@ -19,8 +19,8 @@ while [ $# -gt 0 ]; do LDR_MAKE="${1#*=}" LDR_SET=1 ;; - -u|--uart) - UART_LOGGING=1 + -d|--debug) + DEBUG_BUILD=1 ;; --no-exo) NO_EXO=1 @@ -40,7 +40,7 @@ while [ $# -gt 0 ]; do shift done -if [ "$UART_LOGGING" -eq 1 ] && [ "$LDR_SET" -eq 0 ]; then +if [ "$DEBUG_BUILD" -eq 1 ] && [ "$LDR_SET" -eq 0 ]; then LDR_MAKE="nx_audit" fi @@ -55,8 +55,8 @@ if [ "$NO_EXO" -eq 1 ]; then echo "NO_EXO = 1" fi -if [ "$UART_LOGGING" -eq 1 ]; then - echo "UART_LOGGING = 1 (loader build: $LDR_MAKE, UART logging enabled)" +if [ "$DEBUG_BUILD" -eq 1 ]; then + echo "DEBUG_BUILD = 1 (loader build: $LDR_MAKE, debug build =)" fi CORES="$(nproc --all)" @@ -144,7 +144,7 @@ done echo echo "*** Compiling loader ***" cd build/atmosphere/stratosphere/loader || exit 1 -make -j$JOBS HOC_UART_LOG=$UART_LOGGING "$LDR_MAKE" +make -j$JOBS HOC_UART_LOG=$DEBUG_BUILD "$LDR_MAKE" hactool -t kip1 "out/nintendo_nx_arm64_armv8a/$LDR_BUILD_PATH/loader.kip" --uncompress=hoc.kip cd "$ROOT_DIR" # exit cp -v build/atmosphere/stratosphere/loader/hoc.kip dist/atmosphere/kips/hoc.kip @@ -165,7 +165,11 @@ if [ -n "$ATMOSPHERE_CCACHE" ]; then fi cd Source/hoc-clk/ -./build.sh +if [ "$DEBUG_BUILD" -eq 1 ]; then + ./build.sh "" -d +else + ./build.sh +fi cp -r dist/ ../../ cd "$ROOT_DIR" From e0ef50f7f5bf5e83dfb3fe5d4f69e2341db27942 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 14 Aug 2026 15:18:25 -0400 Subject: [PATCH 036/205] fix nvservices patch compile error --- .../Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp index 3660289d..274e47e3 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/nvsrv/nvsrv.cpp @@ -38,7 +38,7 @@ namespace ams::ldr::hoc::nvsrv { } /* Unlock the devices */ - Result UnlockDevicePermission(uintptr_t mapped_nso, size_t nso_size, uintptr_t nso_address, const char *path, const char *description) { + Result UnlockDevicePermission(uintptr_t mapped_nso, size_t nso_size, uintptr_t nso_address, const char *path, [[maybe_unused]] const char *description) { const size_t path_len = std::strlen(path) + 1; const uintptr_t str_addr = FindBytes(mapped_nso, mapped_nso + nso_size, path, path_len); @@ -94,7 +94,7 @@ namespace ams::ldr::hoc::nvsrv { }; for (auto &t : targets) { - const Result res = UnlockDevicePermission(mapped_nso, nso_size, nso_address, t.path, t.description); + [[maybe_unused]] const Result res = UnlockDevicePermission(mapped_nso, nso_size, nso_address, t.path, t.description); LOGGING("nvsrv: %s unlock%s", t.description, R_SUCCEEDED(res) ? "ed" : " skipped"); } } From 0f70e65d9873d1ed8e6fcb4c30c1ff4709f5f1ad Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 14 Aug 2026 16:31:42 -0400 Subject: [PATCH 037/205] whoops wrong branch --- .../loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp index 8ad01318..1e7e72c2 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp @@ -63,6 +63,15 @@ namespace ams::ldr::hoc::pcv::mariko { PATCH_OFFSET(ptr + 12, C.marikoGpuVmin); } + if (C.marikoGpuVmax) { + PATCH_OFFSET(ptr - 2, C.marikoGpuVmax); + PATCH_OFFSET(ptr + 1, C.marikoGpuVmax); + PATCH_OFFSET(ptr + 4, C.marikoGpuVmax); + PATCH_OFFSET(ptr + 7, C.marikoGpuVmax); + PATCH_OFFSET(ptr + 10, C.marikoGpuVmax); + PATCH_OFFSET(ptr + 13, C.marikoGpuVmax); + } + R_SUCCEED(); } From ffab12ccd3685908497825868ebec5aa24cb3a01 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 14 Aug 2026 16:33:46 -0400 Subject: [PATCH 038/205] Revert "whoops wrong branch" This reverts commit 0f70e65d9873d1ed8e6fcb4c30c1ff4709f5f1ad. --- .../loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp index 1e7e72c2..8ad01318 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp @@ -63,15 +63,6 @@ namespace ams::ldr::hoc::pcv::mariko { PATCH_OFFSET(ptr + 12, C.marikoGpuVmin); } - if (C.marikoGpuVmax) { - PATCH_OFFSET(ptr - 2, C.marikoGpuVmax); - PATCH_OFFSET(ptr + 1, C.marikoGpuVmax); - PATCH_OFFSET(ptr + 4, C.marikoGpuVmax); - PATCH_OFFSET(ptr + 7, C.marikoGpuVmax); - PATCH_OFFSET(ptr + 10, C.marikoGpuVmax); - PATCH_OFFSET(ptr + 13, C.marikoGpuVmax); - } - R_SUCCEED(); } From 490a207bbb467d72accd8aba0ce761c467b70862 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 14 Aug 2026 16:34:48 -0400 Subject: [PATCH 039/205] Update pcv_mariko_gpu.cpp --- .../loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp index 8ad01318..1b12b250 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp @@ -63,6 +63,15 @@ namespace ams::ldr::hoc::pcv::mariko { PATCH_OFFSET(ptr + 12, C.marikoGpuVmin); } + // if (C.marikoGpuVmax) { + // PATCH_OFFSET(ptr - 2, C.marikoGpuVmax); + // PATCH_OFFSET(ptr + 1, C.marikoGpuVmax); + // PATCH_OFFSET(ptr + 4, C.marikoGpuVmax); + // PATCH_OFFSET(ptr + 7, C.marikoGpuVmax); + // PATCH_OFFSET(ptr + 10, C.marikoGpuVmax); + // PATCH_OFFSET(ptr + 13, C.marikoGpuVmax); + // } + R_SUCCEED(); } From 73b1e397e686d315f4281f414f7e254cb78ba006 Mon Sep 17 00:00:00 2001 From: redraz Date: Sat, 15 Aug 2026 05:44:58 +0300 Subject: [PATCH 040/205] Update Russian translation --- Source/hoc-clk/overlay/lang/ru.json | 69 +++++++++++++++++++---------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/Source/hoc-clk/overlay/lang/ru.json b/Source/hoc-clk/overlay/lang/ru.json index d3b36cb2..027d23e0 100644 --- a/Source/hoc-clk/overlay/lang/ru.json +++ b/Source/hoc-clk/overlay/lang/ru.json @@ -7,6 +7,7 @@ "Do Not Override": "Не менять", "No Override": "Не менять", "Do not override": "Не менять", + "Auto": "Авто", "Disabled": "Отключено", "Enabled": "Включено", "Enabled (Default)": "Включено (По умолчанию)", @@ -50,36 +51,37 @@ "Experimental Settings": "Экспериментальные", "Experimental": "Экспериментальный", - " Settings marked in blue": "Настройки помеченные синим", - "don't require a reboot to apply!": "не требуют перезагрузки для применения!", + " Settings marked in blue": " Настройки синего цвета", + "don't require a reboot to apply!": "применяются без перезагрузки!", "You can also press  to show": "Нажмите  для просмотра", - "information about each setting.": "информацию о каждом параметре.", + "information about each setting.": "информации по каждому параметру.", - " Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", - "and may not work correctly or at all!": "и могут не работать правильно или вообще!", - "Here be dragons!": "Здесь будут драконы!", + " Experimental Settings are incomplete ": " Экспериментальные настройки", + "and may not work correctly or at all!": "могут работать плохо или никак.", + "Here be dragons!": "Используйте на свой страх и риск!", - "RAM Voltage Display Mode": "Показ вольтажа RAM", - "RAM Display Unit": "Показ единицы измерения RAM", + "RAM Voltage Display Mode": "Вольтаж RAM (Показываемый)", + "RAM Display Unit": "Единица измерения RAM (Показываемая)", "Polling Interval": "Интервал опроса", "Enable Experimental Settings": "Экспериментальные настройки", "Mariko Middle Clocks": "Средние частоты Mariko", "Live CPU Undervolt": "Андервольт CPU в реальном времени", + "Live GPU Volt Request": "Изменение вольтажей GPU в реальном времени", "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", "GPU Scheduling Override": "Перезапись планировщика", "GPU Boot Volt": "Вольтаж GPU при загрузке", "GPU Boot Voltage": "Вольтаж GPU при загрузке", "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", - " Overriding the charge current": "Изменение зарядного тока", + " Overriding the charge current": " Изменение зарядного тока", "can be dangerous and may cause": "может быть опасным и может", "damage to your battery or charger!": "повредить аккумулятор или зарядку!", - " Overriding the input current": "Изменение входного тока", - "limit increases power draw from": "повышает потребление от зарядки", - "your charger. And board stress ": "и вызывает напряжение на плате.", + "Charge Current Override": "Перезапись зарядного тока", + " Overriding the input current": " Изменение входного тока", + "limit increases power draw from": "повышает расход от зарядки", + "your charger. And board stress ": "и создаёт нагрузку на плате.", "use 1500mA max.": "Используйте максимум 1500 мА.", "Input Current Limit Override": "Перезапись лимита входного тока", - "Charge Current Override": "Перезапись зарядного тока", "Display Color Preset": "Пресет цвета дисплея", "Basic": "Базовый", "Saturated": "Насыщенный", @@ -88,14 +90,15 @@ "Vivid": "Яркий", "CPU Governor Minimum Frequency": "Минимальная частота говернора CPU", - " Usage of unsafe display": "Использование не безопасной", - "refresh rates may cause stress": "частоты обновления экрана", - "or damage to your display! ": "может повредить ваш экран!", - "Proceed at your own risk!": "Действуйте на свой страх и риск!", + " Usage of unsafe display": " Использование небезопасной", + "refresh rates may cause stress": "частоты обновления экрана может", + "or damage to your display! ": "нагружать или повредить ваш экран!", + "Proceed at your own risk!": "Используйте на свой страх и риск!", "Display Refresh Rate Changing": "Изменение герцовки экрана", + "Max Handheld Display": "Макс. в портативе", "Max Handheld Display Hz": "Макс. в портативе", "Display Clock": "Частота экрана", - " Adjust the display voltage": "Настраивайте вольтаж экрана", + " Adjust the display voltage": " Настраивайте вольтаж экрана", "with caution to avoid damage": "с осторожностью во избежание", "to your display panel! ": "повреждений экрана!", "Display Voltage": "Вольтаж экрана", @@ -120,6 +123,7 @@ "RAM Latency Editor": "Редактор задержек", "RAM Timing Reductions": "Настройка таймингов", "SOC Voltage Table": "Таблица вольтажей SoC", + "SOC Custom Voltages": "Пользовательские вольтажи SoC", "Memory Timings": "Тайминги RAM", "Advanced": "Расширенные", "t6 tRTW Fine Tune": "Точная настройка t6 tRTW", @@ -129,6 +133,15 @@ "Memory Latencies": "Задержки памяти", "Read Latency": "Задержка чтения", "Write Latency": "Задержка записи", + "Latency Graph": "График задержек", + "Latency Max": "Макс. задержка", + "1333 Latency Max": "1333 макс. задержка", + "1600 Latency Max": "1600 макс. задержка", + "1866 Latency Max": "1866 макс. задержка", + "2133 Latency Max": "2133 макс. задержка", + "Read": "Чтение", + "Write": "Запись", + "Same": "Одинаково", "High speedo needed!": "Для высоких speedo", "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (нужны невероятные speedo/PLL)", "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (нужны невероятные speedo/PLL)", @@ -148,7 +161,7 @@ "CPU VMIN": "Мин. вольтаж", "CPU Max Voltage": "Макс. вольтаж", "CPU Max Clock": "Макс. частота", - "Extreme UV Table": "Экстримальная", + "Extreme UV Table": "Экстремальная", "CPU UV Table": "Таблица андервольта", "CPU Low UV": "Андервольт нижних частот", "CPU High UV": "Андервольт верхних частот", @@ -173,7 +186,7 @@ "Official Service": "Официальная служба", "96.6% limit": "≤96,6%", "99.7% limit": "≤99,7%", - " Setting GPU Clocks past": "Установка частот GPU выше", + " Setting GPU Clocks past": " Установка частот GPU выше", "1228MHz without a proper undervolt": "1228 МГц без хорошего андервольта", "can cause degradation or damage": "может вызвать деградацию железа", "to your console!": "или повредить вашу консоль!", @@ -213,14 +226,22 @@ "DRAM Module: ": "Модуль DRAM: ", "Software Info": "Информация о программе", "KIP version:": "Версия KIP:", + "KIP status:": "Статус KIP:", "sys-dock status:": "Статус sys-dock:", "SaltyNX status:": "Статус SaltyNX:", "RR Display status:": "Статус RR Display:", "Wafer Position:": "Расположение на «Wafer»:", + "General Info": "Общая информация", "IDDQ:": "IDDQ:", - "Module: ": "Module:", + "Module: ": "Module: ", "Board": "Board", + "Loaded": "Подгружен", + "MEM": "RAM", + "Memory": "RAM", "Display": "Дисплей", + "Governor": "Говернор", + "Releases": "Релизы", + "Status": "Статус", "Developers": "Разработчики", "Contributors": "Внесли вклад", @@ -232,7 +253,7 @@ "%u.%u%u mV": "%u.%u%u мВ", "Compiling with minimal features": "Собрано с урезанием функций", "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", - "Auto": "Авто", + "Horizon OC\nKip opening failed": "Horizon OC\nНе удалось открыть KIP", "Horizon OC\nKip read failed": "Horizon OC\nНе удалось прочитать KIP", "Horizon OC\nOutdated kip detected!\nPlease update Horizon OC": "Horizon OC\nОбнаружен устаревший KIP!\nОбновите Horizon OC", @@ -244,7 +265,7 @@ "Horizon OC has been installed": "Horizon OC установлен", "Horizon OC\nConfig Buffer Mismatch": "Horizon OC\nНесоответствие буфера конфигурации", "Horizon OC\nDeactivated frequency.\nReboot to apply.": "Horizon OC\nЧастота отключена.\nПерезагрузите для применения.", - "Horizon OC\nSecmon read failed!\n This may be a hardware issue!": "Horizon OC\nОшибка чтения Secmon!\n Возможно, проблема с оборудованием!", + "Horizon OC\nSecmon read failed!\n This may be a hardware issue!": "Horizon OC\nОшибка чтения Secmon!\n Возможно, аппаратная проблема!", "Horizon OC\nFailed to write I2C\nwhile setting vddq": "Horizon OC\nОшибка записи I2C\nпри установке VDDQ", - "Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC": "Horizon OC\nНесовпадение версии KIP\nПереустановите Horizon OC" + "Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC": "Horizon OC\nНесоответствие версии KIP\nПереустановите Horizon OC" } From caa92493d5101f2cc5c35c7374e966b448f6d662 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 16 Aug 2026 17:19:12 -0400 Subject: [PATCH 041/205] incorrect dram tsensor fix --- Source/hoc-clk/sysmodule/src/board/board_sensor.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index 3e88eba3..b451075a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -90,7 +90,11 @@ namespace board { } case HocClkThermalSensor_MEM: { if (board::GetSocType() == HocClkSocType_Mariko && tsensor::IsInitialized() && tsensor::ReadAotag() > 0) { - millis = (temps.pllx * 0.10f) + (tsensor::ReadAotag() * 0.90f); + if(board::GetConsoleType() == HocClkConsoleType_Aula) { // Aula has a misplaced thermal sensor that makes tBoard report too high + millis = tsensor::ReadAotag(); + } else { // On other consoles it's placed correctly so avoid relying on AOTAG + millis = (tsensor::ReadAotag() * 0.40f) + (tmp451TempPcb() * 0.6f); + } } else { millis = board::GetSocType() == HocClkSocType_Mariko ? temps.pllx : temps.mem; } From 60f1f4a6951130e61678bac1c9d7c04c6d7971b2 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 17 Aug 2026 11:50:53 -0400 Subject: [PATCH 042/205] Update ldr_process_creation.cpp --- .../stratosphere/loader/source/ldr_process_creation.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp index 09cafb2d..9c7bc4f1 100644 --- a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp @@ -755,8 +755,9 @@ namespace ams::ldr { hoc::ptm::Patch(map_address, nso_size); } + // TODO: figure out the cause of crashes with nvsrv patches if (g_is_nvsrv) { - hoc::nvsrv::Patch(map_address, nso_size, nso_address); + // hoc::nvsrv::Patch(map_address, nso_size, nso_address); } } From de817b05a032d9f5a5b6c1fc695004d69d4f8ae1 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 18 Aug 2026 15:01:23 -0400 Subject: [PATCH 043/205] add 2805mhz cpu/1235 vmax reasoning before anyone yells at us: we did testing on very good speedo and found that they can hold 2805@1200-1235 so it's justifable to add it if people can do it. INA current measurement of 2703 proves that it draws only 3A so 2805 wont be much different (even if it overdraws it draws from vddq which is fine) 1235mV is also not known to have caused degratation (even long therm we havent got reports from just 1235). 1275 was what was reported to cause cpu damage. --- README.md | 3 ++- .../loader/source/oc/customize.cpp | 21 ++++++++++++------- .../source/oc/pcv/mariko/pcv_mariko_cpu.hpp | 5 +++-- Source/hoc-clk/overlay/src/ui/gui/labels.cpp | 4 ++-- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 6 ++++-- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 65bde463..f1032e8a 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,8 @@ Refer to COMPILATION.md * 40 → Erista only ### CPU clocks (mhz) -* 2703 → mariko absolute max, dangerous +* 2805 → mariko absolute max, dangerous +* 2703 * 2601 → unsafe * 2499 * 2397 → mariko safe max with UV (low speedo) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index dae3037f..3f8b2214 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -26,7 +26,7 @@ #define DISABLED 0 #define DEACTIVATED_GPU_FREQ 2000 #define GPU_MIN_MIN_VOLT 480000 -#define CPU_MAX_MAX_VOLT 1200000 +#define CPU_MAX_MAX_VOLT 1235000 namespace ams::ldr::hoc { @@ -100,13 +100,14 @@ volatile CustomizeTable C = { /* 1120mV is NVIDIA rating */ .marikoCpuMaxVolt = 1120, -/* Supported values: 1963500, 2091000, 2193000, 2295000, 2397000, 2499000, 2601000, 2703000. */ -/* 1963500 is official rating of T214/Mariko, fully safe. */ -/* 2091000-2295000 is a slight OC which should work on all units, but no guarantees. */ -/* 2397000 is the max safe OC for most average units with tuned undervolt. */ -/* 2499000 should be used with caution. */ -/* 2601000 exceeds pmic limit on most consoles. */ -/* 2703000 is potentially dangerous and not advised. */ +/* Supported values: 1963500, 2091000, 2193000, 2295000, 2397000, 2499000, 2601000, 2703000, 2805000. */ +/* 1963500 is official rating of T214/Mariko, fully safe. */ +/* 2091000-2295000 is a slight OC which should work on all units, but no guarantees. */ +/* 2397000 is the max safe OC for most average units with tuned undervolt. */ +/* 2499000 should be used with caution. */ +/* 2601000 exceeds pmic limit on most consoles. */ +/* 2703000 is potentially dangerous and not advised. */ +/* 2805000 can only be ran on the best of consoles and may be dangerous due to the voltage requirement */ .marikoCpuMaxClock = 1963500, .eristaCpuBoostClock = 1785000, /* Default boost clock */ @@ -328,6 +329,7 @@ volatile CustomizeTable C = { { 2499000, { 1580725, -35815, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2601000, { 1702903, -36675, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2703000, { 1770375, -37515, 113, }, { CPU_MAX_MAX_VOLT, } }, + { 2805000, { 1838820, -37707, 113, }, { CPU_MAX_MAX_VOLT, } }, }, .marikoCpuDvfsTable1581Tbreak { @@ -356,6 +358,7 @@ volatile CustomizeTable C = { { 2499000, { 1736856, -35286, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2601000, { 1787838, -35967, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2703000, { 1838820, -36648, 113, }, { CPU_MAX_MAX_VOLT, } }, + { 2805000, { 1908891, -37707, 113, }, { CPU_MAX_MAX_VOLT, } }, }, .marikoCpuDvfsTable1683Tbreak { @@ -384,6 +387,7 @@ volatile CustomizeTable C = { { 2499000, { 1736856, -35286, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2601000, { 1787838, -35967, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2703000, { 1838820, -36648, 113, }, { CPU_MAX_MAX_VOLT, } }, + { 2805000, { 1908891, -37707, 113, }, { CPU_MAX_MAX_VOLT, } }, }, .marikoCpuDvfsTableExtreme { @@ -412,6 +416,7 @@ volatile CustomizeTable C = { { 2499000, { 1580725, -35815, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2601000, { 1702903, -36675, 113, }, { CPU_MAX_MAX_VOLT, } }, { 2703000, { 1775375, -37515, 113, }, { CPU_MAX_MAX_VOLT, } }, + { 2805000, { 1838820, -37707, 113, }, { CPU_MAX_MAX_VOLT, } }, }, .eristaGpuDvfsTable = { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp index d44f90b4..0ab58912 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp @@ -59,8 +59,9 @@ namespace ams::ldr::hoc::pcv::mariko { static_assert(sizeof(cpuVoltagePatchValues) == sizeof(cpuVoltagePatchOffsets), "Invalid cpuVoltagePatch size"); static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 }; - - static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, }; + + /* Refer to customize.cpp for more information */ + static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, 2'805'000 }; Result CpuFreqVdd(u32 *ptr); diff --git a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp index 55f59189..8beaac19 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp @@ -21,12 +21,12 @@ std::map cpu_freq_label_m = { { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, - { 1963000000, "Safe Max" }, { 2397000000, "Unsafe Max" }, { 2703000000, "Absolute Max" }, + { 1963000000, "Safe Max" }, { 2397000000, "Unsafe Max" }, { 2805000000, "Absolute Max" }, }; std::map cpu_freq_label_m_uv = { { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, - { 2397000000, "Safe Max" }, { 2499000000, "Unsafe Max" }, { 2703000000, "Absolute Max" }, + { 2397000000, "Safe Max" }, { 2499000000, "Unsafe Max" }, { 2805000000, "Absolute Max" }, }; std::map cpu_freq_label_e = { diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 399c9700..e85e2332 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2170,12 +2170,13 @@ class CpuSubmenuGui : public MiscGui { {}, false, true); ValueThresholds mCpuVoltThresholds(1160, 1180); - addConfigButton(KipConfigValue_marikoCpuMaxVolt, "CPU Max Voltage", ValueRange(1000, 1200, 5, "mV", 1), "CPU Max Voltage", + addConfigButton(KipConfigValue_marikoCpuMaxVolt, "CPU Max Voltage", ValueRange(1000, 1235, 5, "mV", 1), "CPU Max Voltage", &mCpuVoltThresholds, {}, {}, false, true); std::vector maxClkOptions = { NamedValue("1963 MHz", 1963500, "Rating"), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000, "Safe Max"), NamedValue("2499 MHz", 2499000, "Unsafe Max"), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000, "Absolute Max"), + NamedValue("2397 MHz", 2397000, "Safe Max"), NamedValue("2499 MHz", 2499000, "Unsafe Max"), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), + NamedValue("2805 MHz", 2805000, "Absolute Max"), }; addConfigButton(KipConfigValue_marikoCpuMaxClock, "CPU Max Clock", ValueRange(0, 0, 1, "", 1), "CPU Max Clock", @@ -2187,6 +2188,7 @@ class CpuSubmenuGui : public MiscGui { NamedValue("1581 MHz", 1581000), NamedValue("1683 MHz", 1683000, "Default"), NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), + NamedValue("2805 MHz", 2805000), }; addConfigButton(KipConfigValue_marikoCpuBoostClock, "CPU Boost Clock", ValueRange(0, 0, 1, "", 1), "CPU Boost Clock", From de2369023acc907c46bd32b52fe09da602a40db0 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 18 Aug 2026 15:01:51 -0400 Subject: [PATCH 044/205] update validators --- Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index dca615fc..7552fb99 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -148,11 +148,11 @@ namespace ams::ldr::hoc::pcv { Validator validators[] = { { C.eristaCpuBoostClock, 1020'000, 2397'000, panic::Cpu, true }, - { C.marikoCpuBoostClock, 1020'000, 2703'000, panic::Cpu, true }, + { C.marikoCpuBoostClock, 1020'000, 2805'000, panic::Cpu, true }, { C.eristaCpuMaxVolt, 1000, 1260, panic::Cpu, }, - { C.marikoCpuMaxVolt, 1000, 1200, panic::Cpu, }, + { C.marikoCpuMaxVolt, 1000, 1235, panic::Cpu, }, { eristaCpuDvfsMaxFreq, 1785'000, 2397'000, panic::Cpu, }, - { marikoCpuDvfsMaxFreq, 1785'000, 2703'000, panic::Cpu, }, + { marikoCpuDvfsMaxFreq, 1785'000, 2805'000, panic::Cpu, }, { C.commonEmcMemVolt, 912'500, 1350'000, panic::Emc, }, /* Official vmax for the RAMs is 1400-1500mV */ { C.eristaEmcMaxClock, 1600'000, 2600'000, panic::Emc, }, { C.marikoEmcMaxClock, 1600'000, 3500'000, panic::Emc, }, From 864d5d6aa85a9852e6021c4cfa42098742960cea Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 18 Aug 2026 15:03:27 -0400 Subject: [PATCH 045/205] config: erista doesn't have vmax (for now), so remove it --- Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index e85e2332..1b47ea9c 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2372,8 +2372,10 @@ class GpuSubmenuGui : public MiscGui { addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, false, true); ValueThresholds MgpuVmaxThresholds(805, 850); - addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 960, 5, "mV", 1), "GPU Maximum Voltage", - &MgpuVmaxThresholds, {}, {}, false, true); + if(IsMariko()) { + addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 960, 5, "mV", 1), "GPU Maximum Voltage", + &MgpuVmaxThresholds, {}, {}, false, true); + } } std::vector gpuOffset = { From 7d6868b94333d0b55f50d77e515425d925ce7170 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 18 Aug 2026 15:06:26 -0400 Subject: [PATCH 046/205] Update main.cpp --- Source/hoc-clk/overlay/src/main.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/hoc-clk/overlay/src/main.cpp b/Source/hoc-clk/overlay/src/main.cpp index cfd977f1..9bf14977 100644 --- a/Source/hoc-clk/overlay/src/main.cpp +++ b/Source/hoc-clk/overlay/src/main.cpp @@ -96,16 +96,16 @@ class AppOverlay : public tsl::Overlay { ""); } - #ifndef OVERLAY_DEBUG - HocClkContext context = {}; - if (R_SUCCEEDED(hocclkIpcGetCurrentContext(&context)) && context.rebootRequired) { - return initially("Horizon OC has been updated.\n\n" - "\n" - "Please reboot your console\n\n" - "to finish applying the update.", - ""); - } - #endif + // #ifndef OVERLAY_DEBUG + // HocClkContext context = {}; + // if (R_SUCCEEDED(hocclkIpcGetCurrentContext(&context)) && context.rebootRequired) { + // return initially("Horizon OC has been updated.\n\n" + // "\n" + // "Please reboot your console\n\n" + // "to finish applying the update.", + // ""); + // } + // #endif return initially(); } From 62a2cfd65a1f0ffbd35699ade442b797ce595814 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:01:42 +0200 Subject: [PATCH 047/205] remove unneeded dependencies --- Source/hoc-clk/build.sh | 0 Source/hoc-clk/overlay/Makefile | 2 +- build.sh | 0 3 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 Source/hoc-clk/build.sh mode change 100644 => 100755 build.sh diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh old mode 100644 new mode 100755 diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index dfa799a0..9b9be7a2 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -74,7 +74,7 @@ CXXFLAGS := $(CFLAGS) -fno-exceptions -std=gnu++23 ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map),-wrap,__cxa_throw -Wl,-wrap,_Unwind_Resume -Wl,-wrap,__gxx_personality_v0 -LIBS := -lcurl -lz -lminizip -lmbedtls -lmbedx509 -lmbedcrypto -ljansson -lnx +LIBS := -lcurl -lz -lminizip -lnx #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 From c0096686d8c67fd4125680e22aa882c7af5906eb Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:48:02 +0200 Subject: [PATCH 048/205] refactor assembly patching --- .../source/oc/pcv/erista/pcv_erista_gpu.cpp | 10 +- .../source/oc/pcv/erista/pcv_erista_gpu.hpp | 2 +- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 13 +- .../source/oc/pcv/erista/pcv_erista_mtc.hpp | 3 +- .../source/oc/pcv/mariko/pcv_mariko.cpp | 241 ++++---- .../source/oc/pcv/mariko/pcv_mariko.hpp | 49 +- .../source/oc/pcv/mariko/pcv_mariko_gpu.cpp | 10 +- .../source/oc/pcv/mariko/pcv_mariko_gpu.hpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 12 +- .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 2 +- .../loader/source/oc/pcv/pcv_asm.hpp | 549 +++++++----------- 11 files changed, 391 insertions(+), 502 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp index 937af7d7..bb17e547 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp @@ -56,13 +56,13 @@ namespace ams::ldr::hoc::pcv::erista { Result GpuFreqMaxAsm(u32 *ptr32) { // Check if both two instructions match the pattern u32 ins1 = *ptr32, ins2 = *(ptr32 + 1); - if (!(asm_compare_no_rd(ins1, GpuAsmPattern[0]) && asm_compare_no_rd(ins2, GpuAsmPattern[1]))) { + if (!(_asm::Ignoring(ins1, GpuAsmPattern[0], _asm::field::Rd) && _asm::Ignoring(ins2, GpuAsmPattern[1], _asm::field::Rd))) { R_THROW(ldr::ResultInvalidGpuFreqMaxPattern()); } // Both instructions should operate on the same register - u8 rd = asm_get_rd(ins1); - if (rd != asm_get_rd(ins2)) { + u8 rd = _asm::Get(ins1, _asm::field::Rd); + if (rd != _asm::Get(ins2, _asm::field::Rd)) { R_THROW(ldr::ResultInvalidGpuFreqMaxPattern()); } @@ -83,8 +83,8 @@ namespace ams::ldr::hoc::pcv::erista { } u32 asm_patch[2] = { - asm_set_rd(asm_set_imm16(GpuAsmPattern[0], max_clock), rd), - asm_set_rd(asm_set_imm16(GpuAsmPattern[1], max_clock >> 16), rd) + _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, max_clock}), + _asm::Encode(_asm::op::MovkW, {_asm::field::Rd, rd}, {_asm::field::Imm16, max_clock >> 16}, {_asm::field::Hw, 1}) }; PATCH_OFFSET(ptr32, asm_patch[0]); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp index cc964628..9decf0db 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp @@ -51,7 +51,7 @@ namespace ams::ldr::hoc::pcv::erista { inline constexpr u32 GpuAsmPattern[] = { 0x52820000, 0x72A001C0 }; inline bool GpuMaxClockPatternFn(u32 *ptr32) { - return asm_compare_no_rd(*ptr32, GpuAsmPattern[0]); + return _asm::Ignoring(*ptr32, GpuAsmPattern[0], _asm::field::Rd); }; constexpr cvb_entry_t GpuCvbTableDefault[] = { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index 6b2d4321..452dfd4b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -447,27 +447,28 @@ namespace ams::ldr::hoc::pcv::erista { R_UNLESS(ptr - MovOffset >= nsoStart, ldr::ResultInvalidMtcTablePattern()); u32 adrp = *(ptr - AddrpOffset); - R_UNLESS(AsmCompareAdrpNoImm(adrp, MtcAdrpAsm), ldr::ResultInvalidMtcTablePattern()); + R_UNLESS(_asm::Ignoring(adrp, MtcAdrpAsm, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo), ldr::ResultInvalidMtcTablePattern()); - /* Check for the branch instruction above the cbz to ensure we are patching the right location*/ + /* Check for the branch instruction above the cbz to ensure we are patching the right location. */ + /* Only the opcode is checked; the call target varies by firmware (0x97ffae64 on one build). */ u32 bl = *(ptr - BlOffset); - R_UNLESS(AsmBlCompareOpcodeOnly(bl, MtcBlIns), ldr::ResultInvalidMtcTablePattern()); + R_UNLESS(_asm::IsOp(bl, _asm::op::Bl, _asm::field::Imm26), ldr::ResultInvalidMtcTablePattern()); /* Check for the mov that actually sets the mtc table count. */ u32 mov = *(ptr - MovOffset); bool foundMov = false; - foundMov = asm_compare_no_rd(mov, MtcMovAsm); + foundMov = _asm::Ignoring(mov, MtcMovAsm, _asm::field::Rd); if (!foundMov) { mov = *(ptr + MovOffsetOld); /* Check old firmware offset. */ - foundMov = asm_compare_no_rd(mov, MtcMovAsm); + foundMov = _asm::Ignoring(mov, MtcMovAsm, _asm::field::Rd); } R_UNLESS(foundMov, ldr::ResultInvalidMtcTablePattern()); constexpr u32 PrologueWindow = 140; - u32 *functionPrologue = FindFnPrologue(ptr, PrologueWindow, nsoStart); + u32 *functionPrologue = _asm::FindFnPrologue(ptr, PrologueWindow, nsoStart); R_UNLESS(functionPrologue != nullptr, ldr::ResultInvalidMtcTablePattern()); getMtcTableCache.getEristaMtcTableFnSite = functionPrologue; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.hpp index 5c1c5100..fa2a2bba 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.hpp @@ -73,12 +73,11 @@ namespace ams::ldr::hoc::pcv::erista { constexpr u32 MtcBrAsm = 0xD61F0140; constexpr u32 MtcMovAsm = 0x52800148; constexpr u32 MtcAdrpAsm = 0xD0000081; - constexpr u32 MtcBlIns = 0x97ffae64; constexpr u32 MtcAddAsm = 0x91131821; ALWAYS_INLINE bool MemMtcGetGetTablePatternFn(u32 *ptr) { /* This builds an address that gets returned, so the register must be x0 by convention. */ - return AsmCompareAddNoImm12(*ptr, MtcAddAsm); + return _asm::Ignoring(*ptr, MtcAddAsm, _asm::field::Imm12); } Result MemFreqMtcTable(u32 *ptr); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 1a3d162c..c3040cc3 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -76,19 +76,20 @@ namespace ams::ldr::hoc::pcv::mariko { uintptr_t nvlog_addr = 0; for (u32 *p = nsoStart; reinterpret_cast(p + 2) <= textEnd; ++p) { const uintptr_t pc = reinterpret_cast(p); - if (!AsmIsAdrp(p[0])) { + if (!_asm::IsOp(p[0], _asm::op::Adrp, _asm::field::Rd, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo)) { continue; } - const uintptr_t adrpPage = (pc & ~static_cast(0xFFFu)) + static_cast(AsmAdrpPageOffset(p[0])); - if (adrpPage != (strAddr & ~static_cast(0xFFFu))) { + if (_asm::TargetAdrp(p[0], pc) != (strAddr & ~static_cast(0xFFFu))) { continue; } - const u32 reg = asm_get_rd(p[0]); - if (!(AsmIsAddImm64(p[1]) && asm_get_rd(p[1]) == reg && AsmGetRn(p[1]) == reg && AsmGetImm12(p[1]) == (strAddr & 0xFFFu))) { + const u32 adrpReg = _asm::Get(p[0], _asm::field::Rd); + if (!(_asm::IsOp(p[1], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) + && _asm::Get(p[1], _asm::field::Rd) == adrpReg && _asm::Get(p[1], _asm::field::Rn) == adrpReg + && _asm::Get(p[1], _asm::field::Imm12) == (strAddr & 0xFFFu))) { continue; } for (u32 k = 2; k <= 12 && (pc + (k + 1) * 4) <= textEnd; ++k) { - if (AsmIsBl(p[k])) { nvlog_addr = AsmBranchTarget(p[k], pc + k * 4); break; } + if (_asm::IsOp(p[k], _asm::op::Bl, _asm::field::Imm26)) { nvlog_addr = _asm::Target26(p[k], pc + k * 4); break; } } if (nvlog_addr != 0) { break; @@ -109,77 +110,81 @@ namespace ams::ldr::hoc::pcv::mariko { size_t n = 0; auto emit = [&](u32 ins) { t[n] = ins; ++n; }; - emit(AsmMakeSubImm64(31, 31, 0x200)); - emit(AsmMakeStpImm64(0, 1, 31, 0x100)); - emit(AsmMakeStpImm64(2, 3, 31, 0x110)); - emit(AsmMakeStpImm64(4, 5, 31, 0x120)); - emit(AsmMakeStpImm64(6, 7, 31, 0x130)); - emit(AsmMakeStpqImm(0, 1, 31, 0x140)); - emit(AsmMakeStpqImm(2, 3, 31, 0x160)); - emit(AsmMakeStpqImm(4, 5, 31, 0x180)); - emit(AsmMakeStpqImm(6, 7, 31, 0x1A0)); - emit(AsmMakeStrImm64(30, 31, 0x1E0)); - emit(AsmMakeAddImm64(9, 31, 0x200)); emit(AsmMakeStrImm64(9, 31, 0x1C0)); /* __stack */ - emit(AsmMakeAddImm64(9, 31, 0x140)); emit(AsmMakeStrImm64(9, 31, 0x1C8)); /* __gr_top */ - emit(AsmMakeAddImm64(9, 31, 0x1C0)); emit(AsmMakeStrImm64(9, 31, 0x1D0)); /* __vr_top */ - emit(AsmMakeMovnW(9, 0x37)); emit(AsmMakeStrImm32(9, 31, 0x1D8)); /* __gr_offs = -56 */ - emit(AsmMakeMovnW(9, 0x7F)); emit(AsmMakeStrImm32(9, 31, 0x1DC)); /* __vr_offs = -128 */ - emit(AsmMakeAddImm64(0, 31, 0x00)); /* mov x0,sp (buf) */ - emit(AsmMakeMovzW(1, 0x100)); /* size = 0x100 */ - emit(AsmMakeLdrImm64(2, 31, 0x100)); /* fmt (saved x0) */ - emit(AsmMakeAddImm64(3, 31, 0x1C0)); /* ap */ - emit(AsmMakeBl(helper + n * 4, vsnprintf_addr)); - emit(AsmMakeMovReg(1, 0)); /* len = retval */ - emit(AsmMakeCmpImm32(1, 0x100)); - { const size_t at = n; emit(AsmMakeBCond(helper + at * 4, helper + (at + 2) * 4, 0x3u)); } /* b.lo +2 */ - emit(AsmMakeMovzW(1, 0xFF)); /* clamp len */ - emit(AsmMakeAddImm64(0, 31, 0x00)); /* mov x0,sp (str) */ - emit(AsmMakeSvc(0x27)); /* svcOutputDebugString */ - emit(AsmMakeLdrImm64(30, 31, 0x1E0)); - emit(AsmMakeAddImm64(31, 31, 0x200)); - emit(RetIns); + using namespace _asm::field; + constexpr u32 SP = _asm::reg::Sp; + + emit(_asm::Encode(_asm::op::SubImm64, {Rd, SP}, {Rn, SP}, {Imm12, 0x200})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 0}, {Rt2, 1}, {Rn, SP}, {PairOff8, 0x100})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 2}, {Rt2, 3}, {Rn, SP}, {PairOff8, 0x110})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 4}, {Rt2, 5}, {Rn, SP}, {PairOff8, 0x120})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 6}, {Rt2, 7}, {Rn, SP}, {PairOff8, 0x130})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 0}, {Rt2, 1}, {Rn, SP}, {PairOff16, 0x140})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 2}, {Rt2, 3}, {Rn, SP}, {PairOff16, 0x160})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 4}, {Rt2, 5}, {Rn, SP}, {PairOff16, 0x180})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 6}, {Rt2, 7}, {Rn, SP}, {PairOff16, 0x1A0})); + emit(_asm::Encode(_asm::op::StrImm64, {Rt, _asm::reg::Lr}, {Rn, SP}, {Off8, 0x1E0})); + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x200})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1C0})); /* __stack */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x140})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1C8})); /* __gr_top */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x1C0})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1D0})); /* __vr_top */ + emit(_asm::Encode(_asm::op::MovnW, {Rd, 9}, {Imm16, 0x37})); emit(_asm::Encode(_asm::op::StrImm32, {Rt, 9}, {Rn, SP}, {Off4, 0x1D8})); /* __gr_offs = -56 */ + emit(_asm::Encode(_asm::op::MovnW, {Rd, 9}, {Imm16, 0x7F})); emit(_asm::Encode(_asm::op::StrImm32, {Rt, 9}, {Rn, SP}, {Off4, 0x1DC})); /* __vr_offs = -128 */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 0}, {Rn, SP}, {Imm12, 0x00})); /* mov x0,sp (buf) */ + emit(_asm::Encode(_asm::op::MovzW, {Rd, 1}, {Imm16, 0x100})); /* size = 0x100 */ + emit(_asm::Encode(_asm::op::LdrImm64, {Rt, 2}, {Rn, SP}, {Off8, 0x100})); /* fmt (saved x0) */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 3}, {Rn, SP}, {Imm12, 0x1C0})); /* ap */ + emit(_asm::Retarget26(_asm::op::Bl, helper + n * 4, vsnprintf_addr)); + emit(_asm::MovReg64(1, 0)); /* len = retval */ + emit(_asm::CmpImm32(1, 0x100)); + { /* b.lo +2 */ + const size_t at = n; + emit(_asm::Retarget19(_asm::Encode(_asm::op::BCond, {BCond, _asm::cond::Lo}), helper + at * 4, helper + (at + 2) * 4)); + } + emit(_asm::Encode(_asm::op::MovzW, {Rd, 1}, {Imm16, 0xFF})); /* clamp len */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 0}, {Rn, SP}, {Imm12, 0x00})); /* mov x0,sp (str) */ + emit(_asm::Encode(_asm::op::Svc, {Imm16, 0x27})); /* svcOutputDebugString */ + emit(_asm::Encode(_asm::op::LdrImm64, {Rt, _asm::reg::Lr}, {Rn, SP}, {Off8, 0x1E0})); + emit(_asm::Encode(_asm::op::AddImm64, {Rd, SP}, {Rn, SP}, {Imm12, 0x200})); + emit(_asm::RetIns); /* Redirect the call sites as patching the actual function causes crash */ const uintptr_t roStart = g_pcv_cave + g_pcv_cave_size; /* module .rodata start */ size_t patchedSites = 0; for (u32 *p = nsoStart; reinterpret_cast(p + 1) <= textEnd; ++p) { - if (!AsmIsBl(*p)) { + if (!_asm::IsOp(*p, _asm::op::Bl, _asm::field::Imm26)) { continue; } const uintptr_t pc = reinterpret_cast(p); - if (AsmBranchTarget(*p, pc) != nvlog_addr) { + if (_asm::Target26(*p, pc) != nvlog_addr) { continue; } bool isFmtCall = false; for (u32 j = 1; j <= 8 && reinterpret_cast(p - j) >= reinterpret_cast(nsoStart); ++j) { const u32 w = *(p - j); - if (AsmIsAdrp(w) && asm_get_rd(w) == 0) { /* adrp x0, */ - const uintptr_t wpc = pc - j * 4; - const uintptr_t tgtPage = (wpc & ~static_cast(0xFFFu)) + static_cast(AsmAdrpPageOffset(w)); + if (_asm::IsOp(w, _asm::op::Adrp, _asm::field::Rd, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo) && _asm::Get(w, _asm::field::Rd) == 0) { /* adrp x0, */ + const uintptr_t tgtPage = _asm::TargetAdrp(w, pc - j * 4); if (tgtPage >= (roStart & ~static_cast(0xFFFu))) { isFmtCall = true; break; } } } if (isFmtCall) { - PATCH_OFFSET(p, AsmMakeBl(pc, helper)); + PATCH_OFFSET(p, _asm::Retarget26(_asm::op::Bl, pc, helper)); ++patchedSites; } } - LOGGING("NvLogRedirect: stub@+%lx vsnprintf@+%lx helper@+%lx instr=%zu sites=%zu", - nvlog_addr - mapped_nso, vsnprintf_addr - mapped_nso, helper - mapped_nso, n, patchedSites); + LOGGING("NvLogRedirect: stub@+%lx vsnprintf@+%lx helper@+%lx instr=%zu sites=%zu", nvlog_addr - mapped_nso, vsnprintf_addr - mapped_nso, helper - mapped_nso, n, patchedSites); R_SUCCEED(); } #endif /* Relocate C2/C3Bus to avoid issues*/ Result BusFreqReloc(u32 *ptr) { - const u32 busReg = AsmGetRn(ptr[0]); /* ldr Xbuf,[Xbus,#0x10] : bus struct pointer */ - const u32 bufReg = asm_get_rd(ptr[0]); /* : freq-buffer arg */ - const u32 bufOff = AsmGetLdStImm64Off(ptr[0]); /* : bus->freqBuf offset */ - const u32 cntReg = asm_get_rd(ptr[1]); /* add Xcnt,Xbus,#0x18 : arg2 (&count) */ - const u32 railReg = asm_get_rd(ptr[2]); /* str Xrail,[Xbus,#0x50]: arg0 (rail) */ + const u32 busReg = _asm::Get(ptr[0], _asm::field::Rn); /* ldr Xbuf,[Xbus,#0x10] : bus struct pointer */ + const u32 bufReg = _asm::Get(ptr[0], _asm::field::Rt); /* : freq-buffer arg */ + const u32 bufOff = _asm::Get(ptr[0], _asm::field::Off8); /* : bus->freqBuf offset */ + const u32 cntReg = _asm::Get(ptr[1], _asm::field::Rd); /* add Xcnt,Xbus,#0x18 : arg2 (&count) */ + const u32 railReg = _asm::Get(ptr[2], _asm::field::Rt); /* str Xrail,[Xbus,#0x50]: arg0 (rail) */ u32 *call = ptr + 3; /* the bl to relocate */ - const uintptr_t realFn = AsmBranchTarget(*call, reinterpret_cast(call)); + const uintptr_t realFn = _asm::Target26(*call, reinterpret_cast(call)); /* Pick 3 scratch registers */ u32 s[3], sc = 0; @@ -197,21 +202,21 @@ namespace ams::ldr::hoc::pcv::mariko { u32 *t = reinterpret_cast(tramp); size_t n = 0; auto emit = [&](u32 ins) { t[n] = ins; ++n; }; - emit(AsmMakeAdrp(tramp + n * 4, region, s[0])); /* adrp s0, */ - emit(AsmMakeAddImm64(s[0], s[0], region & 0xFFFu)); /* add s0,s0,#lo */ - emit(AsmMakeLdrImm32(s[1], s[0], 0x00)); /* s1 = counter */ - emit(AsmMakeAddImm64(s[2], s[1], 1)); /* s2 = counter+1 */ - emit(AsmMakeStrImm32(s[2], s[0], 0x00)); /* counter++ */ - emit(AsmMakeAddImm64(s[0], s[0], 0x10)); /* s0 = region+0x10 (buffers) */ - emit(AsmMakeAddShiftedReg64(bufReg, s[0], s[1], 10)); /* Xbuf = s0 + counter*0x400 */ - emit(AsmMakeStrImm64(bufReg, busReg, bufOff)); /* bus[freqBuf] = Xbuf */ - emit(AsmMakeB(tramp + n * 4, realFn)); /* tail-call the real function */ + using namespace _asm::field; + emit(_asm::RetargetAdrp(_asm::Encode(_asm::op::Adrp, {Rd, s[0]}), tramp + n * 4, region)); /* adrp s0, */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, s[0]}, {Rn, s[0]}, {Imm12, region & 0xFFFu})); /* add s0,s0,#lo */ + emit(_asm::Encode(_asm::op::LdrImm32, {Rt, s[1]}, {Rn, s[0]}, {Off4, 0x00})); /* s1 = counter */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, s[2]}, {Rn, s[1]}, {Imm12, 1})); /* s2 = counter+1 */ + emit(_asm::Encode(_asm::op::StrImm32, {Rt, s[2]}, {Rn, s[0]}, {Off4, 0x00})); /* counter++ */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, s[0]}, {Rn, s[0]}, {Imm12, 0x10})); /* s0 = region+0x10 (buffers) */ + emit(_asm::Encode(_asm::op::AddShifted64, {Rd, bufReg}, {Rn, s[0]}, {Rm, s[1]}, {Imm6, 10})); /* Xbuf = s0 + counter*0x400 */ + emit(_asm::Encode(_asm::op::StrImm64, {Rt, bufReg}, {Rn, busReg}, {Off8, bufOff})); /* bus[freqBuf] = Xbuf */ + emit(_asm::Retarget26(_asm::op::B, tramp + n * 4, realFn)); /* tail-call the real function */ - PATCH_OFFSET(call, AsmMakeBl(reinterpret_cast(call), tramp)); + PATCH_OFFSET(call, _asm::Retarget26(_asm::op::Bl, reinterpret_cast(call), tramp)); const uintptr_t base = reinterpret_cast(nsoStart); (void) base; - LOGGING("BusFreqReloc: call@+%lx -> tramp@+%lx realfn@+%lx (bus=x%u buf=x%u off=0x%x scratch=x%u,x%u,x%u)", - reinterpret_cast(call) - base, tramp - base, realFn - base, busReg, bufReg, bufOff, s[0], s[1], s[2]); + LOGGING("BusFreqReloc: call@+%lx -> tramp@+%lx realfn@+%lx (bus=x%u buf=x%u off=0x%x scratch=x%u,x%u,x%u)", reinterpret_cast(call) - base, tramp - base, realFn - base, busReg, bufReg, bufOff, s[0], s[1], s[2]); R_SUCCEED(); } @@ -219,9 +224,9 @@ namespace ams::ldr::hoc::pcv::mariko { #if HOC_UART_LOG /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ Result ForceVerbosity(u32 *ptr) { - if(C.pcvLogVerbosity != 0xff) { - PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(C.pcvLogVerbosity))); /* movz w0,#level */ - PATCH_OFFSET(&ptr[1], RetIns); /* ret */ + i f(C.pcvLogVerbosity != 0xff) { + PATCH_OFFSET(&ptr[0], _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, 0}, {_asm::field::Imm16, C.pcvLogVerbosity})); /* movz w0,#level */ + PATCH_OFFSET(&ptr[1], _asm::RetIns); /* ret */ } R_SUCCEED(); } @@ -231,40 +236,40 @@ namespace ams::ldr::hoc::pcv::mariko { Result EmcSocLutReloc(u32 *ptr) { constexpr u32 Window = 48; - u32 *freqStore = ScanAssembly(ptr - Window, Window, EmcSocFreqStoreAsm, asm_compare_no_rd); /* str x?,[x8,#0x18] */ - u32 *voltStore = ScanAssembly(ptr - Window, Window, EmcSocVoltStoreAsm, asm_compare_no_rd); /* str w?,[x8,#0x48] */ - u32 *readLoad = ScanAssembly(ptr - Window, Window, EmcSocReadLoadAsm, asm_compare_no_rd); /* ldr w?,[x9,#0x48] */ + using namespace _asm::field; + + u32 *freqStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocFreqStoreAsm, Rt); /* str x?,[x8,#0x18] */ + u32 *voltStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocVoltStoreAsm, Rt); /* str w?,[x8,#0x48] */ + u32 *readLoad = _asm::ScanAssembly(ptr - Window, Window, EmcSocReadLoadAsm, Rt); /* ldr w?,[x9,#0x48] */ R_UNLESS(freqStore && voltStore && readLoad, ldr::ResultInvalidEmcSocLut()); u32 *voltBase = voltStore - 2; /* `add Xb,Xsrc,Xi,LSL#2` (a cmn sits between it and store) */ - R_UNLESS(AsmIsAddShiftedReg64(*voltBase) && asm_get_rd(*voltBase) == AsmGetRn(*voltStore), - ldr::ResultInvalidEmcSocLut()); + R_UNLESS(_asm::IsOp(*voltBase, _asm::op::AddShifted64, Rd, Rn, Rm, Imm6) && _asm::Get(*voltBase, Rd) == _asm::Get(*voltStore, Rn), ldr::ResultInvalidEmcSocLut()); /* adrp Xl ; add Xl,Xl,#off ; ... ; str Xl,[rail,#0x120] */ - const u32 lutReg = asm_get_rd(ptr[0]); - const u32 railReg = AsmGetRn(ptr[0]); - R_UNLESS(AsmIsAdrp(ptr[-3]) && asm_get_rd(ptr[-3]) == lutReg, ldr::ResultInvalidEmcSocLut()); - R_UNLESS(AsmIsAddImm64(ptr[-2]) && asm_get_rd(ptr[-2]) == lutReg && AsmGetRn(ptr[-2]) == lutReg, - ldr::ResultInvalidEmcSocLut()); + const u32 lutReg = _asm::Get(ptr[0], Rt); + const u32 railReg = _asm::Get(ptr[0], Rn); + R_UNLESS(_asm::IsOp(ptr[-3], _asm::op::Adrp, Rd, ImmAdrpHi, ImmAdrpLo) && _asm::Get(ptr[-3], Rd) == lutReg, ldr::ResultInvalidEmcSocLut()); + R_UNLESS(_asm::IsOp(ptr[-2], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[-2], Rd) == lutReg && _asm::Get(ptr[-2], Rn) == lutReg, ldr::ResultInvalidEmcSocLut()); - const u32 srcBase = AsmGetRn(*voltBase); /* rail ptr at +0x20 */ - const u32 wBase = asm_get_rd(*voltBase); /* base reg */ - const u32 wIdx = AsmGetRm(*voltBase); /* loop index */ + const u32 srcBase = _asm::Get(*voltBase, Rn); /* rail ptr at +0x20 */ + const u32 wBase = _asm::Get(*voltBase, Rd); /* base reg */ + const u32 wIdx = _asm::Get(*voltBase, Rm); /* loop index */ - PATCH_OFFSET(freqStore, NopIns); /* Unneeded */ - PATCH_OFFSET(voltBase, AsmMakeLdrImm64(wBase, srcBase, 0x20)); /* ldr Xb,[Xsrc,#0x20] (rail) */ - PATCH_OFFSET(voltStore - 1, AsmMakeAddImm64(wBase, wBase, 0x18)); /* add Xb,Xb,#0x18 (was cmn) */ - PATCH_OFFSET(voltStore, AsmSetLdStRegOffset(*voltStore, wIdx)); /* str Wv,[Xb,Xi,LSL#2] -> rail+0x18+i*4 */ - PATCH_OFFSET(voltStore + 1, NopIns); /* Unneeded */ + PATCH_OFFSET(freqStore, _asm::NopIns); /* Unneeded */ + PATCH_OFFSET(voltBase, _asm::Encode(_asm::op::LdrImm64, {Rt, wBase}, {Rn, srcBase}, {Off8, 0x20})); /* ldr Xb,[Xsrc,#0x20] (rail) */ + PATCH_OFFSET(voltStore - 1, _asm::Encode(_asm::op::AddImm64, {Rd, wBase}, {Rn, wBase}, {Imm12, 0x18})); /* add Xb,Xb,#0x18 (was cmn) */ + PATCH_OFFSET(voltStore, _asm::ToRegOffset(*voltStore, wIdx)); /* str Wv,[Xb,Xi,LSL#2] -> rail+0x18+i*4 */ + PATCH_OFFSET(voltStore + 1, _asm::NopIns); /* Unneeded */ /* rail+0x18 as the socMinLut pointer. */ - PATCH_OFFSET(ptr - 3, NopIns); - PATCH_OFFSET(ptr - 2, AsmMakeAddImm64(lutReg, railReg, 0x18));/* add Xl,rail,#0x18 */ + PATCH_OFFSET(ptr - 3, _asm::NopIns); + PATCH_OFFSET(ptr - 2, _asm::Encode(_asm::op::AddImm64, {Rd, lutReg}, {Rn, railReg}, {Imm12, 0x18})); /* add Xl,rail,#0x18 */ /* Drop the abort branch in case of a bad read */ for (u32 i = 1; i <= 4; ++i) { - if (AsmIsBCond(readLoad[i])) { - PATCH_OFFSET(&readLoad[i], NopIns); + if (_asm::IsOp(readLoad[i], _asm::op::BCond, Imm19, BCond)) { + PATCH_OFFSET(&readLoad[i], _asm::NopIns); break; } } @@ -275,7 +280,7 @@ namespace ams::ldr::hoc::pcv::mariko { R_UNLESS(EmcDvfsCountPatternFn(ptr), ldr::ResultInvalidEmcDvfsCount()); /* cmp w?,#0x21 -> cmp w?,#EmcDvfsTableEntryCount */ - PATCH_OFFSET(ptr, AsmSubsSetImm12(*ptr, static_cast(EmcDvfsTableEntryCount))); + PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); R_SUCCEED(); } @@ -284,8 +289,8 @@ namespace ams::ldr::hoc::pcv::mariko { R_UNLESS(EmcRateListPatternFn(ptr), ldr::ResultInvalidEmcRateList()); /* The csel's Rm holds the 32 cap. */ - const u32 capReg = AsmGetRm(ptr[1]); - const u32 capMov = AsmMakeMovzW(capReg, 0x20); /* movz w,#0x20 */ + const u32 capReg = _asm::Get(ptr[1], _asm::field::Rm); + const u32 capMov = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, capReg}, {_asm::field::Imm16, 0x20}); /* movz w,#0x20 */ u32 *movPtr = nullptr; for (u32 i = 1; i <= 16; ++i) { @@ -297,8 +302,8 @@ namespace ams::ldr::hoc::pcv::mariko { R_UNLESS(movPtr, ldr::ResultInvalidEmcRateList()); /* min(maxCount, 32) -> min(maxCount, EmcDvfsTableEntryCount). */ - PATCH_OFFSET(ptr, AsmSubsSetImm12(*ptr, static_cast(EmcDvfsTableEntryCount))); /* cmp w?,#64 */ - PATCH_OFFSET(movPtr, asm_set_imm16(*movPtr, static_cast(EmcDvfsTableEntryCount))); /* movz w?,#64 */ + PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); /* cmp w?,#64 */ + PATCH_OFFSET(movPtr, _asm::Set(*movPtr, _asm::field::Imm16, EmcDvfsTableEntryCount)); /* movz w?,#64 */ R_SUCCEED(); } @@ -384,44 +389,47 @@ namespace ams::ldr::hoc::pcv::mariko { } Result SocVoltAsm(u32 *compareSpeedos) { + using namespace _asm::field; + constexpr u32 VoltageScanLimit = 10; /* Might actually be speedo id. */ - u32 *writeProcessId = ScanAssembly(compareSpeedos, VoltageScanLimit, SocVoltWriteProcessIdAsm, asm_compare_no_rd); + u32 *writeProcessId = _asm::ScanAssembly(compareSpeedos, VoltageScanLimit, SocVoltWriteProcessIdAsm, Rd); R_UNLESS(writeProcessId != nullptr, ldr::ResultInvalidSocVoltPattern()); - u8 writeProcessIdRd = asm_get_rd(*writeProcessId); + u8 writeProcessIdRd = _asm::Get(*writeProcessId, Rd); /* This writes 1050mV. */ - u32 *writeVoltage = ScanAssembly(writeProcessId, VoltageScanLimit, SocVoltWriteVoltageAsm, asm_compare_no_rd); + u32 *writeVoltage = _asm::ScanAssembly(writeProcessId, VoltageScanLimit, SocVoltWriteVoltageAsm, Rd); R_UNLESS(writeVoltage != nullptr, ldr::ResultInvalidSocVoltPattern()); - u8 writeVoltageRd = asm_get_rd(*writeVoltage); + u8 writeVoltageRd = _asm::Get(*writeVoltage, Rd); /* A csel instruction is used to select the soc voltage limit register. */ /* We care about its destination register since that is used for verification. */ constexpr u32 VoltageSelectScanLimit = 24; - u32 *selectVoltage = ScanAssembly(writeVoltage, VoltageSelectScanLimit, SocVoltSelectRegisterAsm, AsmCompareCselNoReg); + u32 *selectVoltage = _asm::ScanAssembly(writeVoltage, VoltageSelectScanLimit, SocVoltSelectRegisterAsm, Rd, Rn, Rm); R_UNLESS(selectVoltage != nullptr, ldr::ResultInvalidSocVoltPattern()); /* Todo: check rm and rn? */ - u8 selectVoltageRd = asm_get_rd(*selectVoltage); + u8 selectVoltageRd = _asm::Get(*selectVoltage, Rd); /* rdCsel is then multiplied by 1000 to convert to uV. */ /* This is pretty far down the function. */ constexpr u32 MultiplierScanLimit = 200; - u32 *multiplier = ScanAssembly(selectVoltage, MultiplierScanLimit, SocVoltMultiplyVoltsAsm, AsmCompareMullNoReg); + u32 *multiplier = _asm::ScanAssembly(selectVoltage, MultiplierScanLimit, SocVoltMultiplyVoltsAsm, Rd, Rn, Rm); R_UNLESS(multiplier != nullptr, ldr::ResultInvalidSocVoltPattern()); - u8 multiplierRn = AsmGetMullRn(*multiplier); - u8 multiplierRm = AsmGetMullRm(*multiplier); + u8 multiplierRn = _asm::Get(*multiplier, Rn); + u8 multiplierRm = _asm::Get(*multiplier, Rm); /* One of the two registers has to be rdCsel. */ R_UNLESS((multiplierRn == selectVoltageRd) || (multiplierRm == selectVoltageRd), ldr::ResultInvalidSocVoltPattern()); - u8 multiplierRd = asm_get_rd(*multiplier); + u8 multiplierRd = _asm::Get(*multiplier, Rd); /* Subs instruction is then used to verify against absolute limit. */ - u32 limitValidationPattern = AsmSubsSetRn(SocVoltValidateLimitAsm, multiplierRd); - u32 *limitValidation = ScanAssembly(multiplier, VoltageScanLimit, limitValidationPattern, AsmSubsCompareNoReg); + /* NB: Rn is written into the pattern and then ignored by the comparison; only Rm is matched. */ + u32 limitValidationPattern = _asm::Set(SocVoltValidateLimitAsm, Rn, multiplierRd); + u32 *limitValidation = _asm::ScanAssembly(multiplier, VoltageScanLimit, limitValidationPattern, Rd, Rn); R_UNLESS(limitValidation != nullptr, ldr::ResultInvalidSocVoltPattern()); /* There is a b.gt instruction right after (checks for socVoltageCap < socVoltageMax). */ u32 *branchToAbort = limitValidation + 1; - R_UNLESS(AsmCompareBrConNoImm19(*branchToAbort, SocVoltBranchToAbortAsm), ldr::ResultInvalidSocVoltPattern()); + R_UNLESS(_asm::Ignoring(*branchToAbort, SocVoltBranchToAbortAsm, Imm19), ldr::ResultInvalidSocVoltPattern()); if (!C.marikoSocVmax || C.marikoSocVmax <= 1000) { R_SKIP(); @@ -429,7 +437,7 @@ namespace ams::ldr::hoc::pcv::mariko { /* Adjust 1598 speedo minimum to ensure it always goes down process id 0 branch. */ /* 2200 should be high enough :D */ - u32 compareSpeedosPatch = AsmSubsSetImm12(*compareSpeedos, 2200); + u32 compareSpeedosPatch = _asm::Set(*compareSpeedos, Imm12, 2200); PATCH_OFFSET(compareSpeedos, compareSpeedosPatch); u32 socSpeedo = 0; @@ -438,15 +446,15 @@ namespace ams::ldr::hoc::pcv::mariko { /* Adjust processId from 0 to [process id of switch booting this]. */ /* We're overwriting the orr instruction entirly. */ u32 processId = GetSocProcessId(socSpeedo); - u32 writeProcessIdPatch = asm_set_rd(asm_set_imm16(SocVoltWriteVoltageAsm, processId), writeProcessIdRd); + u32 writeProcessIdPatch = _asm::Encode(_asm::op::MovzW, {Rd, writeProcessIdRd}, {Imm16, processId}); PATCH_OFFSET(writeProcessId, writeProcessIdPatch); /* Adjust voltage limit. */ - u32 voltageLimitPatch = asm_set_rd(asm_set_imm16(SocVoltWriteVoltageAsm, C.marikoSocVmax), writeVoltageRd); + u32 voltageLimitPatch = _asm::Encode(_asm::op::MovzW, {Rd, writeVoltageRd}, {Imm16, C.marikoSocVmax}); PATCH_OFFSET(writeVoltage, voltageLimitPatch); /* Branches to an abort if limits are invalid -- we patch the branch instruction with NOP. */ - PATCH_OFFSET(branchToAbort, NopIns); + PATCH_OFFSET(branchToAbort, _asm::NopIns); R_SUCCEED(); } @@ -479,7 +487,8 @@ namespace ams::ldr::hoc::pcv::mariko { /* Reject cmd11 GetDvfsTable. */ for (u32 i = 1; i <= 24; ++i) { const u32 w = ptr[i]; - if (AsmIsSubX29Imm(w) && AsmGetImm12(w) >= 0x20u) { /* sub x?,x29,#>=0x20 */ + if (_asm::IsOp(w, _asm::op::SubImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) + && _asm::Get(w, _asm::field::Rn) == _asm::reg::Fp && _asm::Get(w, _asm::field::Imm12) >= 0x20u) { /* sub x?,x29,#>=0x20 */ R_THROW(ldr::ResultInvalidEmcRateList()); } } @@ -487,7 +496,7 @@ namespace ams::ldr::hoc::pcv::mariko { /* mov x,x2 */ u32 descReg = 0xFFu; for (u32 i = 1; i <= 24; ++i) { - if (AsmIsMovReg(ptr[i], 2)) { descReg = asm_get_rd(ptr[i]); break; } + if (_asm::Ignoring(ptr[i], _asm::MovReg64(0, 2), _asm::field::Rd)) { descReg = _asm::Get(ptr[i], _asm::field::Rd); break; } } R_UNLESS(descReg != 0xFFu, ldr::ResultInvalidEmcRateList()); @@ -495,9 +504,9 @@ namespace ams::ldr::hoc::pcv::mariko { u32 *adds[8]; u32 addImm[8]; u32 nAdds = 0; for (u32 i = 1; i <= 24 && nAdds < 8; ++i) { const u32 w = ptr[i]; - if (AsmIsAddSpImm(w)) { /* add x?,sp,#imm12 (shift 0) */ + if (_asm::IsOp(w, _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(w, _asm::field::Rn) == _asm::reg::Sp) { /* add x?,sp,#imm12 (shift 0) */ adds[nAdds] = ptr + i; - addImm[nAdds] = AsmGetImm12(w); + addImm[nAdds] = _asm::Get(w, _asm::field::Imm12); ++nAdds; } } @@ -508,15 +517,17 @@ namespace ams::ldr::hoc::pcv::mariko { if (a != b && addImm[a] == addImm[b]) { dup = true; break; } } if (dup) { - PATCH_OFFSET(adds[a], AsmMakeLdrImm64(asm_get_rd(*adds[a]), descReg, 0)); /* ldr x?,[x] */ + PATCH_OFFSET(adds[a], _asm::Encode(_asm::op::LdrImm64, {_asm::field::Rt, _asm::Get(*adds[a], _asm::field::Rd)}, + {_asm::field::Rn, descReg}, + {_asm::field::Off8, 0})); /* ldr x?,[x] */ ++patched; } } R_UNLESS(patched == 2, ldr::ResultInvalidEmcRateList()); /* min(maxCount, 32) -> min(maxCount, EmcDvfsTableEntryCount) */ - PATCH_OFFSET(ptr, AsmSubsSetImm12(*ptr, static_cast(EmcDvfsTableEntryCount))); /* cmp w?,#64 */ - PATCH_OFFSET(ptr + movzI, asm_set_imm16(*(ptr + movzI), static_cast(EmcDvfsTableEntryCount))); /* movz w?,#64 */ + PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); /* cmp w?,#64 */ + PATCH_OFFSET(ptr + movzI, _asm::Set(*(ptr + movzI), _asm::field::Imm16, EmcDvfsTableEntryCount)); /* movz w?,#64 */ R_SUCCEED(); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index 95ac2a89..97f6bcab 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -56,7 +56,7 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 SocVoltBranchToAbortAsm = 0x540020AC; /* B.ge Branches to abort if limits are invalid. */ ALWAYS_INLINE bool SocVoltPatternFn(u32 *ptr) { - return asm_compare_no_rd(*ptr, SocVoltCompareSpeedoAsm); + return _asm::Ignoring(*ptr, SocVoltCompareSpeedoAsm, _asm::field::Rd); } constexpr u32 SocVoltLimitOfficial = 1050; @@ -77,13 +77,14 @@ namespace ams::ldr::hoc::pcv::mariko { inline bool EmcDvfsCountPatternFn(u32 *ptr) { /* Local context: cbz w?, ; cmp w?,#0x21 ; b.cs */ - return asm_compare_no_rd(*ptr, EmcCountCmpAsm) && AsmCompareBrConNoImm19(*(ptr + 1), 0x54000002) /* b.cs */ - && AsmCbzCompareOpcodeOnly(*(ptr - 1), 0x34000000); /* cbz */ + return _asm::Ignoring(*ptr, EmcCountCmpAsm, _asm::field::Rd) + && _asm::Ignoring(*(ptr + 1), _asm::Encode(_asm::op::BCond, {_asm::field::BCond, _asm::cond::Cs}), _asm::field::Imm19) /* b.cs */ + && _asm::IsOp(*(ptr - 1), _asm::op::Cbz, _asm::field::Imm19, _asm::field::Rt); /* cbz */ } inline bool EmcSocLutPatternFn(u32 *ptr) { - return asm_compare_no_rd(*ptr, EmcSocLutPtrStoreAsm) /* str x?,[x0,#0x120] */ - && asm_compare_no_rd(*(ptr + 1), EmcSocLutCountStoreAsm); /* str w?,[x0,#0x154] */ + return _asm::Ignoring(*ptr, EmcSocLutPtrStoreAsm, _asm::field::Rt) /* str x?,[x0,#0x120] */ + && _asm::Ignoring(*(ptr + 1), EmcSocLutCountStoreAsm, _asm::field::Rt); /* str w?,[x0,#0x154] */ } /* @@ -94,16 +95,16 @@ namespace ams::ldr::hoc::pcv::mariko { cmp w?,#0x20 ; (maxCount) csel w?,,,lt ; min(maxCount, 32) - bl + bl <_asm::Get*DvfsFreqTable> */ constexpr u32 EmcRateCapCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ constexpr u32 EmcRateCapCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt */ inline bool EmcRateListPatternFn(u32 *ptr) { - return AsmSubsCompareNoReg(*ptr, EmcRateCapCmpAsm) /* cmp w?,#0x20 */ - && AsmCompareCselNoReg(*(ptr + 1), EmcRateCapCselAsm) /* csel w?,w?,w?,lt */ - && (AsmGetRn(*ptr) == AsmGetRn(*(ptr + 1))) /* min(reg, 0x20) */ - && AsmBlCompareOpcodeOnly(*(ptr + 2), 0x94000000); /* bl */ + return _asm::Ignoring(*ptr, EmcRateCapCmpAsm, _asm::field::Rd, _asm::field::Rn) /* cmp w?,#0x20 */ + && _asm::Ignoring(*(ptr + 1), EmcRateCapCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) /* csel w?,w?,w?,lt */ + && (_asm::Get(*ptr, _asm::field::Rn) == _asm::Get(*(ptr + 1), _asm::field::Rn)) /* min(reg, 0x20) */ + && _asm::IsOp(*(ptr + 2), _asm::op::Bl, _asm::field::Imm26); /* bl <_asm::Get*DvfsFreqTable> */ } constexpr u32 EmcRateSessCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ @@ -111,14 +112,14 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 EmcRateSessCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt (opcode + cond) */ inline bool EmcRateSessFindClamp(u32 *ptr, u32 *out_c, u32 *out_cap, u32 *out_movz_i) { - if (!AsmSubsCompareNoReg(ptr[0], EmcRateSessCmpAsm)) return false; /* cmp w,#0x20 */ - const u32 c = AsmGetRn(ptr[0]); + if (!_asm::Ignoring(ptr[0], EmcRateSessCmpAsm, _asm::field::Rd, _asm::field::Rn)) return false; /* cmp w,#0x20 */ + const u32 c = _asm::Get(ptr[0], _asm::field::Rn); for (u32 i = 1; i <= 14; ++i) { const u32 w = ptr[i]; - if (AsmCompareCselNoReg(w, EmcRateSessCselAsm) && AsmGetRn(w) == c && asm_get_rd(w) == c) { - const u32 cap = AsmGetRm(w); + if (_asm::Ignoring(w, EmcRateSessCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) && _asm::Get(w, _asm::field::Rn) == c && _asm::Get(w, _asm::field::Rd) == c) { + const u32 cap = _asm::Get(w, _asm::field::Rm); for (u32 j = 1; j < i; ++j) { - if ((ptr[j] & 0xFFFFFFE0u) == EmcRateSessMovAsm && asm_get_rd(ptr[j]) == cap) { + if (_asm::Ignoring(ptr[j], EmcRateSessMovAsm, _asm::field::Rd) && _asm::Get(ptr[j], _asm::field::Rd) == cap) { if (out_c) *out_c = c; if (out_cap) *out_cap = cap; if (out_movz_i) *out_movz_i = j; @@ -142,12 +143,12 @@ namespace ams::ldr::hoc::pcv::mariko { if (reinterpret_cast(ptr + 4) > g_pcv_cave) { /* the call site lives in .text */ return false; } - if (!(AsmIsLdrImm64(ptr[0]) && AsmGetLdStImm64Off(ptr[0]) == 0x10)) return false; /* ldr Xbuf,[Xbus,#0x10] */ - if (!(AsmIsAddImm64(ptr[1]) && AsmGetImm12(ptr[1]) == 0x18)) return false; /* add Xcnt,Xbus,#0x18 */ - if (!(AsmIsStrImm64(ptr[2]) && AsmGetLdStImm64Off(ptr[2]) == 0x50)) return false; /* str Xrail,[Xbus,#0x50]*/ - if (!AsmIsBl(ptr[3])) return false; /* bl GetDvfsRailUnique */ - const u32 bus = AsmGetRn(ptr[0]); - return AsmGetRn(ptr[1]) == bus && AsmGetRn(ptr[2]) == bus; + if (!(_asm::IsOp(ptr[0], _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) && _asm::Get(ptr[0], _asm::field::Off8) == 0x10)) return false; /* ldr Xbuf,[Xbus,#0x10] */ + if (!(_asm::IsOp(ptr[1], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(ptr[1], _asm::field::Imm12) == 0x18)) return false; /* add Xcnt,Xbus,#0x18 */ + if (!(_asm::IsOp(ptr[2], _asm::op::StrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) && _asm::Get(ptr[2], _asm::field::Off8) == 0x50)) return false; /* str Xrail,[Xbus,#0x50]*/ + if (!_asm::IsOp(ptr[3], _asm::op::Bl, _asm::field::Imm26)) return false; /* bl GetDvfsRailUnique */ + const u32 bus = _asm::Get(ptr[0], _asm::field::Rn); + return _asm::Get(ptr[1], _asm::field::Rn) == bus && _asm::Get(ptr[2], _asm::field::Rn) == bus; } inline bool ForceVerbosityPatternFn(u32 *ptr) { @@ -158,9 +159,9 @@ namespace ams::ldr::hoc::pcv::mariko { return false; } if (ptr[0] != 0xA9BE7BFDu || ptr[1] != 0xF9000BF3u || ptr[2] != 0x910003FDu) return false; /* stp/str/mov x29,sp */ - if (!(AsmIsAddImm64(ptr[3]) && asm_get_rd(ptr[3]) == 0 && AsmGetRn(ptr[3]) == 29)) return false; /* add x0,x29,#imm */ - if (!(AsmIsAddImm64(ptr[4]) && asm_get_rd(ptr[4]) == 19 && AsmGetRn(ptr[4]) == 29)) return false; /* add x19,x29,#imm */ - if (AsmGetImm12(ptr[3]) != AsmGetImm12(ptr[4]) || !AsmIsBl(ptr[5])) return false; + if (!(_asm::IsOp(ptr[3], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(ptr[3], _asm::field::Rd) == 0 && _asm::Get(ptr[3], _asm::field::Rn) == _asm::reg::Fp)) return false; /* add x0,x29,#imm */ + if (!(_asm::IsOp(ptr[4], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(ptr[4], _asm::field::Rd) == 19 && _asm::Get(ptr[4], _asm::field::Rn) == _asm::reg::Fp)) return false; /* add x19,x29,#imm */ + if (_asm::Get(ptr[3], _asm::field::Imm12) != _asm::Get(ptr[4], _asm::field::Imm12) || !_asm::IsOp(ptr[5], _asm::op::Bl, _asm::field::Imm26)) return false; for (u32 j = 6; j <= 10; ++j) { if (ptr[j] == 0x7100001Fu) { /* cmp w0,#0 */ return true; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp index 1b12b250..2826f485 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.cpp @@ -78,13 +78,13 @@ namespace ams::ldr::hoc::pcv::mariko { Result GpuFreqMaxAsm(u32 *ptr32) { // Check if both two instructions match the pattern u32 ins1 = *ptr32, ins2 = *(ptr32 + 1); - if (!(asm_compare_no_rd(ins1, GpuAsmPattern[0]) && asm_compare_no_rd(ins2, GpuAsmPattern[1]))) { + if (!(_asm::Ignoring(ins1, GpuAsmPattern[0], _asm::field::Rd) && _asm::Ignoring(ins2, GpuAsmPattern[1], _asm::field::Rd))) { R_THROW(ldr::ResultInvalidGpuFreqMaxPattern()); } // Both instructions should operate on the same register - u8 rd = asm_get_rd(ins1); - if (rd != asm_get_rd(ins2)) { + u8 rd = _asm::Get(ins1, _asm::field::Rd); + if (rd != _asm::Get(ins2, _asm::field::Rd)) { R_THROW(ldr::ResultInvalidGpuFreqMaxPattern()); } @@ -111,8 +111,8 @@ namespace ams::ldr::hoc::pcv::mariko { } u32 asm_patch[2] = { - asm_set_rd(asm_set_imm16(GpuAsmPattern[0], max_clock), rd), - asm_set_rd(asm_set_imm16(GpuAsmPattern[1], max_clock >> 16), rd) + _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, max_clock}), + _asm::Encode(_asm::op::MovkW, {_asm::field::Rd, rd}, {_asm::field::Imm16, max_clock >> 16}, {_asm::field::Hw, 1}) }; PATCH_OFFSET(ptr32, asm_patch[0]); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp index 4c00ba74..4f87b6ab 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_gpu.hpp @@ -71,7 +71,7 @@ namespace ams::ldr::hoc::pcv::mariko { inline constexpr u32 GpuAsmPattern[] = { 0x52820000, 0x72A001C0 }; inline bool GpuMaxClockPatternFn(u32 *ptr32) { - return asm_compare_no_rd(*ptr32, GpuAsmPattern[0]); + return _asm::Ignoring(*ptr32, GpuAsmPattern[0], _asm::field::Rd); } Result GpuVoltDVFS(u32 *ptr); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index e848a628..0898b6dd 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -652,23 +652,23 @@ namespace ams::ldr::hoc::pcv::mariko { R_UNLESS(ptr - BrOffset >= nsoStart, ldr::ResultInvalidMtcTablePattern()); u32 adrp = *(ptr - AddpOffset); - R_UNLESS(AsmCompareAdrpNoImm(adrp, MtcAdrpAsm), ldr::ResultInvalidMtcTablePattern()); + R_UNLESS(_asm::Ignoring(adrp, MtcAdrpAsm, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo), ldr::ResultInvalidMtcTablePattern()); /* We don't check for matching register because both registers must be x0 in order to pass the previous checks. */ /* The correct instructions will always be x0 since the mtcTable pointer is returned. */ /* Pray this does not break. */ u32 br = *(ptr - BrOffset); - R_UNLESS(AsmCompareBrNoRd(br, MtcBrAsm), ldr::ResultInvalidMtcTablePattern()); + R_UNLESS(_asm::Ignoring(br, MtcBrAsm, _asm::field::Rn), ldr::ResultInvalidMtcTablePattern()); /* Pray this does not break either. */ u32 mov = *(ptr - MovOffset); - R_UNLESS(asm_compare_no_rd(mov, MtcMovAsm), ldr::ResultInvalidMtcTablePattern()); + R_UNLESS(_asm::Ignoring(mov, MtcMovAsm, _asm::field::Rd), ldr::ResultInvalidMtcTablePattern()); - u8 movRd = asm_get_rd(mov); - u32 movCountPatch = asm_set_rd(asm_set_imm16(MtcMovAsm, newEmcList.size()), movRd); + u8 movRd = _asm::Get(mov, _asm::field::Rd); + u32 movCountPatch = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, movRd}, {_asm::field::Imm16, newEmcList.size()}); - PATCH_OFFSET(ptr - BrOffset, NopIns); + PATCH_OFFSET(ptr - BrOffset, _asm::NopIns); PATCH_OFFSET(ptr - MovOffset, movCountPatch); R_SUCCEED(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index 031dff24..ff05dbf5 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -177,7 +177,7 @@ namespace ams::ldr::hoc::pcv::mariko { ALWAYS_INLINE bool MemMtcGetGetTablePatternFn(u32 *ptr) { /* This builds an address that gets returned, so the register must be x0 by convention. */ - return AsmCompareAddNoImm12(*ptr, MtcAddAsm); + return _asm::Ignoring(*ptr, MtcAddAsm, _asm::field::Imm12); } void MtcGenerateFreqTables(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp index 4f9f22f7..f852a2ee 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp @@ -22,11 +22,215 @@ #include -namespace ams::ldr::hoc::pcv { +namespace ams::ldr::hoc::pcv::_asm { constexpr u32 NopIns = 0xD503201F; + constexpr u32 RetIns = 0xD65F03C0; - template + constexpr u32 GetField(u32 ins, u8 lsb, u8 width) { + return (ins >> lsb) & ((1u << width) - 1u); + } + + constexpr u32 SetField(u32 ins, u8 lsb, u8 width, u32 val) { + const u32 mask = ((1u << width) - 1u) << lsb; + return (ins & ~mask) | ((val << lsb) & mask); + } + + constexpr u32 FieldMask(u8 lsb, u8 width) { + return ((1u << width) - 1u) << lsb; + } + + constexpr s64 SignExtend(u64 v, u32 bits) { + const u32 pad = 64u - bits; + return static_cast(v << pad) >> pad; + } + + namespace field { + struct Descriptor { + u8 lsb; + u8 width; + u8 shift = 0; + }; + + constexpr Descriptor Rd { 0, 5}; /* destination register */ + constexpr Descriptor Rn { 5, 5}; /* first source register */ + constexpr Descriptor Rm {16, 5}; /* second source register */ + constexpr Descriptor Ra {10, 5}; /* accumulator register */ + constexpr Descriptor Rt { 0, 5}; /* load/store transfer register */ + constexpr Descriptor Rt2 {10, 5}; /* second transfer register of a pair */ + + constexpr Descriptor Cond {12, 4}; /* condition code (CSEL) */ + constexpr Descriptor BCond { 0, 4}; /* condition code (B.cond) */ + constexpr Descriptor Hw {21, 2}; /* MOVZ/MOVK/MOVN shift */ + + constexpr Descriptor Sh {22, 1}; + constexpr Descriptor Shift {22, 2}; /* ADD/SUB (shifted register) shift type */ + constexpr Descriptor Imm6 {10, 6}; /* ADD/SUB (shifted register) shift amount */ + + constexpr Descriptor Imm16 { 5, 16}; /* MOVZ/MOVK/MOVN immediate */ + constexpr Descriptor Imm12 {10, 12}; /* ADD/SUB (immediate) */ + constexpr Descriptor Imm19 { 5, 19}; /* B.cond / CBZ / CBNZ immediate */ + constexpr Descriptor Imm26 { 0, 26}; /* B / BL immediate */ + + constexpr Descriptor ImmAdrpHi { 5, 19}; + constexpr Descriptor ImmAdrpLo {29, 2}; + + constexpr Descriptor Off1 {10, 12, 0}; /* LDRB/STRB */ + constexpr Descriptor Off4 {10, 12, 2}; /* 32-bit LDR/STR */ + constexpr Descriptor Off8 {10, 12, 3}; /* 64-bit LDR/STR */ + + constexpr Descriptor PairOff8 {15, 7, 3}; /* X pairs */ + constexpr Descriptor PairOff16 {15, 7, 4}; /* Q pairs */ + } + + /* Regs that read as a name in the encoding. */ + namespace reg { + constexpr u32 Fp = 29; + constexpr u32 Lr = 30; + constexpr u32 Sp = 31; + constexpr u32 Wzr = 31; + constexpr u32 Xzr = 31; + } + + namespace cond { + constexpr u32 Eq = 0x0, Ne = 0x1, Cs = 0x2, Cc = 0x3, + Mi = 0x4, Pl = 0x5, Vs = 0x6, Vc = 0x7, + Hi = 0x8, Ls = 0x9, Ge = 0xA, Lt = 0xB, + Gt = 0xC, Le = 0xD, Al = 0xE; + constexpr u32 Hs = Cs, Lo = Cc; + } + + /* Base opcodes. */ + /* Either pair with Encode or Ignoring. */ + namespace op { + constexpr u32 AddImm32 = 0x11000000; + constexpr u32 AddImm64 = 0x91000000; + constexpr u32 SubImm64 = 0xD1000000; + constexpr u32 SubsImm32 = 0x71000000; + constexpr u32 SubsImm64 = 0xF1000000; + + constexpr u32 MovzW = 0x52800000; + constexpr u32 MovkW = 0x72800000; + constexpr u32 MovnW = 0x12800000; + + constexpr u32 AddShifted64 = 0x8B000000; + constexpr u32 OrrShifted32 = 0x2A000000; + constexpr u32 OrrShifted64 = 0xAA000000; + constexpr u32 SubsShifted32 = 0x6B000000; + + constexpr u32 Csel32 = 0x1A800000; + constexpr u32 Madd32 = 0x1B000000; + + constexpr u32 LdrbImm = 0x39400000; + constexpr u32 StrbImm = 0x39000000; + constexpr u32 LdrImm32 = 0xB9400000; + constexpr u32 StrImm32 = 0xB9000000; + constexpr u32 LdrImm64 = 0xF9400000; + constexpr u32 StrImm64 = 0xF9000000; + + constexpr u32 StpImm64 = 0xA9000000; + constexpr u32 StpPreImm64 = 0xA9800000; + constexpr u32 StpImmQ = 0xAD000000; + + constexpr u32 B = 0x14000000; + constexpr u32 Bl = 0x94000000; + constexpr u32 BCond = 0x54000000; + constexpr u32 Cbz = 0x34000000; + constexpr u32 Br = 0xD61F0000; + + constexpr u32 Adrp = 0x90000000; + constexpr u32 Svc = 0xD4000001; + } + + constexpr u32 Get(u32 ins, field::Descriptor f) { + return GetField(ins, f.lsb, f.width) << f.shift; + } + + constexpr u32 Set(u32 ins, field::Descriptor f, u64 val) { + return SetField(ins, f.lsb, f.width, static_cast(val >> f.shift)); + } + + template + constexpr bool Ignoring(u32 a, u32 b, Fs... fields) { + const u32 mask = (0u | ... | FieldMask(fields.lsb, fields.width)); + return (a & ~mask) == (b & ~mask); + } + + inline constexpr auto IgnoringRd = [](u32 a, u32 b) { + return Ignoring(a, b, field::Rd); + }; + + template + constexpr bool IsOp(u32 ins, u32 baseOpcode, Fs... variableFields) { + return Ignoring(ins, baseOpcode, variableFields...); + } + + struct FieldValue { + field::Descriptor f; + u64 val; + }; + + constexpr u32 Encode(u32 base, FieldValue a) { + return Set(base, a.f, a.val); + } + + constexpr u32 Encode(u32 base, FieldValue a, FieldValue b) { + return Encode(Encode(base, a), b); + } + + constexpr u32 Encode(u32 base, FieldValue a, FieldValue b, FieldValue c) { + return Encode(Encode(base, a, b), c); + } + + constexpr u32 Encode(u32 base, FieldValue a, FieldValue b, FieldValue c, FieldValue d) { + return Encode(Encode(base, a, b, c), d); + } + + constexpr u32 Encode(u32 base, FieldValue a, FieldValue b, FieldValue c, FieldValue d, FieldValue e) { + return Encode(Encode(base, a, b, c, d), e); + } + + constexpr uintptr_t Target26(u32 ins, uintptr_t pc) { + return static_cast(static_cast(pc) + SignExtend(static_cast(Get(ins, field::Imm26)) << 2, 28)); + } + + constexpr u32 Retarget26(u32 ins, uintptr_t pc, uintptr_t target) { + return Set(ins, field::Imm26, static_cast((static_cast(target) - static_cast(pc)) >> 2)); + } + + constexpr uintptr_t Target19(u32 ins, uintptr_t pc) { + return static_cast(static_cast(pc) + SignExtend(static_cast(Get(ins, field::Imm19)) << 2, 21)); + } + + constexpr u32 Retarget19(u32 ins, uintptr_t pc, uintptr_t target) { + return Set(ins, field::Imm19, static_cast((static_cast(target) - static_cast(pc)) >> 2)); + } + + constexpr uintptr_t TargetAdrp(u32 ins, uintptr_t pc) { + const u64 imm21 = (static_cast(Get(ins, field::ImmAdrpHi)) << 2) | Get(ins, field::ImmAdrpLo); + return static_cast(static_cast(pc & ~static_cast(0xFFF)) + SignExtend(imm21 << 12, 33)); + } + + constexpr u32 RetargetAdrp(u32 ins, uintptr_t pc, uintptr_t target) { + const s64 delta = static_cast(target & ~static_cast(0xFFF)) - static_cast(pc & ~static_cast(0xFFF)); + const u32 imm21 = static_cast((delta >> 12) & 0x1FFFFF); + return Set(Set(ins, field::ImmAdrpHi, imm21 >> 2), field::ImmAdrpLo, imm21 & 0x3u); + } + + constexpr u32 MovReg64(u32 rd, u32 rm) { + return Encode(op::OrrShifted64, {field::Rd, rd}, {field::Rn, reg::Xzr}, {field::Rm, rm}); + } + + constexpr u32 CmpImm32(u32 rn, u32 imm12) { + return Encode(op::SubsImm32, {field::Rd, reg::Wzr}, {field::Rn, rn}, {field::Imm12, imm12}); + } + + constexpr u32 ToRegOffset(u32 ldstImm, u32 rm) { + constexpr u32 Keep = 0xC0C00000u | FieldMask(field::Rt.lsb, field::Rt.width) | FieldMask(field::Rn.lsb, field::Rn.width); + return ((ldstImm & Keep) | 0x38207800u) | ((rm & 0x1Fu) << field::Rm.lsb); + } + + template requires (!std::is_same_v, field::Descriptor>) u32 *ScanAssembly(u32 *ptr, u32 scanLimit, u32 pattern, Compare comp) { for (u32 i = 0; i < scanLimit; ++i) { if (comp(pattern, ptr[i])) { @@ -36,341 +240,14 @@ namespace ams::ldr::hoc::pcv { return nullptr; } - inline auto asm_compare_no_rd = [](u32 ins1, u32 ins2) { - return ((ins1 ^ ins2) >> 5) == 0; - }; - - inline auto asm_get_rd = [](u32 ins) { - return ins & ((1 << 5) - 1); - }; - - /* Rn (bits 9:5) and Rm (bits 20:16) to get registers. */ - inline auto AsmGetRn = [](u32 ins) -> u32 { return (ins >> 5) & 0x1Fu; }; - inline auto AsmGetRm = [](u32 ins) -> u32 { return (ins >> 16) & 0x1Fu; }; - - /* Add (shifted register), 64-bit: sf=1 op=0 S=0 01011 shift(2) 0 Rm imm6 Rn Rd. */ - inline auto AsmIsAddShiftedReg64 = [](u32 ins) { - return (ins & 0xFF200000u) == 0x8B000000u; - }; - - inline auto asm_set_rd = [](u32 ins, u8 rd) { - return (ins & 0xFFFFFFE0) | (rd & 0x1F); - }; - - inline auto asm_set_imm16 = [](u32 ins, u16 imm) { - return (ins & 0xFFE0001F) | ((imm & 0xFFFF) << 5); - }; - - inline auto AsmGetImm16 = [](u32 ins) { - return static_cast((ins >> 5) & 0xFFFF); - }; - - inline auto AsmCompareBrNoRd = [](u32 ins1, u32 ins2) { - constexpr u32 RegMask = ~(((1 << 5) - 1) << 5); - return ((ins1 & RegMask) ^ (ins2 & RegMask)) == 0; - }; - - inline auto AsmCompareAddNoImm12 = [](u32 ins1, u32 ins2) { - constexpr u32 Imm12Mask = ~(((1 << 12) - 1) << 10); - return ((ins1 & Imm12Mask) ^ (ins2 & Imm12Mask)) == 0; - }; - - inline auto AsmCompareAdrpNoImm = [](u32 ins1, u32 ins2) { - constexpr u32 ImmMask = ~((((1 << 2) - 1) << 29) | (((1 << 19) - 1) << 5)); - return ((ins1 & ImmMask) ^ (ins2 & ImmMask)) == 0; - }; - - /* Csel (Conditional Select) */ - /* - SF | Op | S | | RM | Cond | 0 | 0 | Rn | Rd - 31 | 30 | 29 | 28 27 26 25 24 23 | 20 19 18 17 16 | 15 14 13 12 | 11 | 10 | 9 8 7 6 5 | 4 3 2 1 0 - */ - inline auto AsmCbzCompareOpcodeOnly = [](u32 ins1, u32 ins2) { - return ((ins1 ^ ins2) >> 24) == 0; - }; - - inline auto AsmBlCompareOpcodeOnly = [](u32 ins1, u32 ins2) { - return ((ins1 ^ ins2) >> 26) == 0; - }; - - inline auto AsmIsAdrX0 = [](u32 ins) { - return (ins & 0x9F00001Fu) == 0x10000000u; - }; - - inline auto AsmAdrTarget = [](u32 ins, uintptr_t pc) -> uintptr_t { - s64 imm = static_cast((((ins >> 5) & 0x7FFFFu) << 2) | ((ins >> 29) & 0x3u)); - imm = (imm << 43) >> 43; - return static_cast(static_cast(pc) + imm); - }; - - /* adrp Rd, target */ - inline auto AsmMakeAdrp = [](uintptr_t pc, uintptr_t target, u32 rd) -> u32 { - const s64 delta = static_cast(target & ~static_cast(0xFFF)) - - static_cast(pc & ~static_cast(0xFFF)); - const u32 imm = static_cast((delta >> 12) & 0x1FFFFF); /* 21-bit page */ - const u32 immlo = imm & 0x3; - const u32 immhi = (imm >> 2) & 0x7FFFF; - return 0x90000000u | (immlo << 29) | (immhi << 5) | (rd & 0x1Fu); - }; - - inline auto AsmSetAdrTarget = [](u32 ins, uintptr_t pc, uintptr_t target) -> u32 { - const s64 delta = static_cast(target) - static_cast(pc); - const u32 immlo = static_cast(delta & 0x3); - const u32 immhi = static_cast((delta >> 2) & 0x7FFFF); - return (ins & ~((0x3u << 29) | (0x7FFFFu << 5))) | (immlo << 29) | (immhi << 5); - }; - - /* adrp: bit31=1, bits 28:24 = 10000. */ - inline auto AsmIsAdrp = [](u32 ins) -> bool { - return (ins & 0x9F000000u) == 0x90000000u; - }; - - inline auto AsmAdrpPageOffset = [](u32 ins) -> s64 { - s64 imm = static_cast((((ins >> 5) & 0x7FFFFu) << 2) | ((ins >> 29) & 0x3u)); - imm = (imm << 43) >> 43; /* sign-extend the 21-bit immediate */ - return imm << 12; - }; - - /* add (immediate), 64-bit: sf=1 op=0 S=0 100010 sh imm12 Rn Rd. */ - inline auto AsmIsAddImm64 = [](u32 ins) -> bool { - return (ins & 0xFF800000u) == 0x91000000u; - }; - - inline auto AsmGetImm12 = [](u32 ins) -> u32 { - return (ins >> 10) & 0xFFFu; - }; - - inline auto AsmMakeAddImm64 = [](u32 rd, u32 rn, u32 imm12) -> u32 { - return 0x91000000u | ((imm12 & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rd & 0x1Fu); - }; - - /* movz Wd,#imm16 (no shift). */ - inline auto AsmMakeMovzW = [](u32 rd, u16 imm16) -> u32 { - return 0x52800000u | (static_cast(imm16) << 5) | (rd & 0x1Fu); - }; - - /* mov Xd,Xm == orr Xd,XZR,Xm. */ - inline auto AsmMakeMovReg = [](u32 rd, u32 rm) -> u32 { - return 0xAA0003E0u | ((rm & 0x1Fu) << 16) | (rd & 0x1Fu); - }; - - /* ldr Xt,[Xn,#byteOff] */ - inline auto AsmMakeLdrImm64 = [](u32 rt, u32 rn, u32 byteOff) -> u32 { - return 0xF9400000u | (((byteOff / 8u) & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rt & 0x1Fu); - }; - - /* b (PC-relative, +-128MB). */ - inline auto AsmMakeB = [](uintptr_t pc, uintptr_t target) -> u32 { - const s64 off = (static_cast(target) - static_cast(pc)) >> 2; - return 0x14000000u | (static_cast(off) & 0x03FFFFFFu); - }; - - /* b. (cond: LO/CC=0x3, LE=0xD, NE=0x1, ...). */ - inline auto AsmMakeBCond = [](uintptr_t pc, uintptr_t target, u32 cond) -> u32 { - const s64 off = (static_cast(target) - static_cast(pc)) >> 2; - return 0x54000000u | ((static_cast(off) & 0x7FFFFu) << 5) | (cond & 0xFu); - }; - - /* sub Xd,Xn,#imm12 (shift 0). */ - inline auto AsmMakeSubImm64 = [](u32 rd, u32 rn, u32 imm12) -> u32 { - return 0xD1000000u | ((imm12 & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rd & 0x1Fu); - }; - - /* cmp Wn,#imm12 == subs WZR,Wn,#imm12. */ - inline auto AsmMakeCmpImm32 = [](u32 rn, u32 imm12) -> u32 { - return 0x7100001Fu | ((imm12 & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5); - }; - - /* str Wt,[Xn,#byteOff] (32-bit, unsigned scaled by 4). */ - inline auto AsmMakeStrImm32 = [](u32 rt, u32 rn, u32 byteOff) -> u32 { - return 0xB9000000u | (((byteOff / 4u) & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rt & 0x1Fu); - }; - - /* ldr Wt,[Xn,#byteOff] (32-bit, unsigned scaled by 4). */ - inline auto AsmMakeLdrImm32 = [](u32 rt, u32 rn, u32 byteOff) -> u32 { - return 0xB9400000u | (((byteOff / 4u) & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rt & 0x1Fu); - }; - - /* add Xd,Xn,Xm,LSL #shift (64-bit shifted register, shift 0-63). */ - inline auto AsmMakeAddShiftedReg64 = [](u32 rd, u32 rn, u32 rm, u32 shift) -> u32 { - return 0x8B000000u | ((rm & 0x1Fu) << 16) | ((shift & 0x3Fu) << 10) | ((rn & 0x1Fu) << 5) | (rd & 0x1Fu); - }; - - /* stp Xt1,Xt2,[Xn,#imm] (signed offset, scaled by 8). */ - inline auto AsmMakeStpImm64 = [](u32 rt1, u32 rt2, u32 rn, s32 imm) -> u32 { - return 0xA9000000u | ((static_cast(imm / 8) & 0x7Fu) << 15) | ((rt2 & 0x1Fu) << 10) | ((rn & 0x1Fu) << 5) | (rt1 & 0x1Fu); - }; - - /* stp Qt1,Qt2,[Xn,#imm] (128-bit SIMD, signed offset scaled by 16). */ - inline auto AsmMakeStpqImm = [](u32 qt1, u32 qt2, u32 rn, s32 imm) -> u32 { - return 0xAD000000u | ((static_cast(imm / 16) & 0x7Fu) << 15) | ((qt2 & 0x1Fu) << 10) | ((rn & 0x1Fu) << 5) | (qt1 & 0x1Fu); - }; - - /* str Xt,[Xn,#byteOff] (unsigned scaled by 8). */ - inline auto AsmMakeStrImm64 = [](u32 rt, u32 rn, u32 byteOff) -> u32 { - return 0xF9000000u | (((byteOff / 8u) & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rt & 0x1Fu); - }; - - /* movn Wd,#imm16 (no shift): loads ~imm16, e.g. movn Wd,#0x37 == -56. */ - inline auto AsmMakeMovnW = [](u32 rd, u16 imm16) -> u32 { - return 0x12800000u | (static_cast(imm16) << 5) | (rd & 0x1Fu); - }; - - /* bl (PC-relative, +-128MB). */ - inline auto AsmMakeBl = [](uintptr_t pc, uintptr_t target) -> u32 { - const s64 off = (static_cast(target) - static_cast(pc)) >> 2; - return 0x94000000u | (static_cast(off) & 0x03FFFFFFu); - }; - - /* svc #imm16. */ - inline auto AsmMakeSvc = [](u16 imm16) -> u32 { - return 0xD4000001u | (static_cast(imm16) << 5); - }; - - constexpr u32 RetIns = 0xD65F03C0u; /* ret (x30) */ - - /* ldrb Wt,[Xn,#imm] (unsigned byte, scale 1). */ - inline auto AsmMakeLdrbImm = [](u32 rt, u32 rn, u32 byteOff) -> u32 { - return 0x39400000u | ((byteOff & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rt & 0x1Fu); - }; - - /* cbz Wt,. */ - inline auto AsmMakeCbz = [](uintptr_t pc, uintptr_t target, u32 rt) -> u32 { - const s64 off = (static_cast(target) - static_cast(pc)) >> 2; - return 0x34000000u | ((static_cast(off) & 0x7FFFFu) << 5) | (rt & 0x1Fu); - }; - - /* strb Wt,[Xn,#imm] (unsigned byte, scale 1). */ - inline auto AsmMakeStrbImm = [](u32 rt, u32 rn, u32 byteOff) -> u32 { - return 0x39000000u | ((byteOff & 0xFFFu) << 10) | ((rn & 0x1Fu) << 5) | (rt & 0x1Fu); - }; - - /* mov Xd,X == orr Xd,XZR,X (matches any Rd). */ - inline auto AsmIsMovReg = [](u32 ins, u32 rm) -> bool { - return (ins & 0xFFFFFFE0u) == (0xAA0003E0u | ((rm & 0x1Fu) << 16)); - }; - - /* add Xd,sp,#imm12 (shift 0). */ - inline auto AsmIsAddSpImm = [](u32 ins) -> bool { - return (ins & 0xFFC003E0u) == 0x910003E0u; - }; - - /* sub Xd,x29,#imm12 (shift 0). */ - inline auto AsmIsSubX29Imm = [](u32 ins) -> bool { - return (ins & 0xFFC003E0u) == 0xD10003A0u; - }; - - inline auto AsmIsB = [](u32 ins) -> bool { return (ins & 0xFC000000u) == 0x14000000u; }; /* b */ - inline auto AsmIsBl = [](u32 ins) -> bool { return (ins & 0xFC000000u) == 0x94000000u; }; /* bl */ - inline auto AsmIsBCond = [](u32 ins) -> bool { return (ins & 0xFF000010u) == 0x54000000u; }; /* b.c */ - - /* ldr/str Xt,[Xn,#imm] (64-bit, unsigned scaled offset). */ - inline auto AsmIsLdrImm64 = [](u32 ins) -> bool { return (ins & 0xFFC00000u) == 0xF9400000u; }; - inline auto AsmIsStrImm64 = [](u32 ins) -> bool { return (ins & 0xFFC00000u) == 0xF9000000u; }; - inline auto AsmGetLdStImm64Off = [](u32 ins) -> u32 { return ((ins >> 10) & 0xFFFu) * 8u; }; - - /* Byte target address of a b/bl at pc. */ - inline auto AsmBranchTarget = [](u32 ins, uintptr_t pc) -> uintptr_t { - s64 off = static_cast((ins & 0x03FFFFFFu) << 2); - off = (off << 36) >> 36; /* sign-extend the 28-bit branch offset */ - return static_cast(static_cast(pc) + off); - }; - - /* Rewrite a scaled immediate-offset load/store (`op Wt,[Xn,#imm]`) into its register-offset form */ - inline auto AsmSetLdStRegOffset = [](u32 ldstImm, u32 rm) -> u32 { - return (ldstImm & 0xC0C003FFu) | 0x38207800u | ((rm & 0x1Fu) << 16); - }; - - inline auto AsmIsLdpX = [](u32 ins) { - return (ins & 0xFE400000u) == 0xA8400000u; - }; - - inline bool AsmComparePrologue(u32 ins1, u32 ins2, u32 ins3, u32 cmp1, u32 cmp2, u32 cmp3) { - constexpr u32 StpImmMask = ~((((1u << 7) - 1u) << 15)); - - bool firstMatch = (ins1 & StpImmMask) == (cmp1 & StpImmMask); - - constexpr u32 StpRegsImmMask = ~(((1u << 5) - 1u) |(((1u << 5) - 1u) << 10) | (((1u << 7) - 1u) << 15)); - - bool secondMatch = (ins2 & StpRegsImmMask) == (cmp2 & StpRegsImmMask); - - constexpr u32 MovMask = ~((1u << 5) - 1u); - - bool thirdMatch = (ins3 & MovMask) == (cmp3 & MovMask); - - return firstMatch && secondMatch && thirdMatch; + template + u32 *ScanAssembly(u32 *ptr, u32 scanLimit, u32 pattern, Fs... ignoreFields) { + return ScanAssembly(ptr, scanLimit, pattern, [=](u32 a, u32 b) ALWAYS_INLINE_LAMBDA { return Ignoring(a, b, ignoreFields...); }); } - inline auto AsmCompareCselNoReg = [](u32 ins1, u32 ins2) { - constexpr u32 ClearReg = ~(((1 << 10) - 1) | (((1 << 5) - 1) << 16)); - return ((ins1 & ClearReg) ^ (ins2 & ClearReg)) == 0; - }; - - /* Mul */ - /* - SF | Op54 | Op31 | RM | o0 | RA | RN | RD - 31 | 30 29 28 27 26 25 24 | 23 22 21 | 20 19 18 17 16 | 15 | 14 13 12 11 10 | 9 8 7 6 5 | 4 3 2 1 0 - */ - inline auto AsmCompareMullNoReg = [](u32 ins1, u32 ins2) { - constexpr u32 ClearReg = ~(((1 << 10) - 1) | (((1 << 5) - 1) << 16)); - return ((ins1 & ClearReg) ^ (ins2 & ClearReg)) == 0; - }; - - /* Mul */ - /* MUL W11, W24, W26 */ - /* multiplies by 1000, mV -> uV */ - /* - SF | Op54 | Op31 | RM | o0 | RA | RN | RD - 31 | 30 29 28 27 26 25 24 | 23 22 21 | 20 19 18 17 16 | 15 | 14 13 12 11 10 | 9 8 7 6 5 | 4 3 2 1 0 - */ - inline auto AsmGetMullRn = [](u32 ins) { - constexpr u32 Mask = ((1 << 5) - 1) << 5; - return (ins & Mask) >> 5; - }; - - inline auto AsmGetMullRm = [](u32 ins) { - constexpr u32 Mask = ((1 << 5) - 1) << 16; - return (ins & Mask) >> 16; - }; - - /* Subs (Shifted register) */ - /* - SF | Op | S | | Shift | 0 | RM | Imm6 | Rn | Rd - 31 | 30 | 29 | 28 27 26 25 24 | 23 22 | 21 | 20 19 18 17 16 | 15 14 13 12 11 10 | 9 8 7 6 5 | 4 3 2 1 0 - */ - inline auto AsmSubsSetRn = [](u32 ins, u8 rn) { - constexpr u32 RnMaskClear = ~(((1u << 5) - 1u) << 5); - constexpr u32 RnMaskSet = (1u << 5) - 1u; - - return (ins & RnMaskClear) | ((static_cast(rn) & RnMaskSet) << 5); - }; - - /* Subs (Immediate) */ - - /* - SF | Op | S | | Sh | Imm12 | Rn | Rd - 31 | 30 | 29 | 28 27 26 25 24 23 | 22 | 21 20 19 18 17 16 15 14 13 12 11 10 | 9 8 7 6 5 | 4 3 2 1 0 - */ - inline auto AsmSubsSetImm12 = [](u32 ins, u16 imm12) { - constexpr u32 ClearMask = ~(((1u << 12) - 1) << 10); - constexpr u32 SetImm12Mask = ( 1u << 12) - 1; - - return (ins & ClearMask) | ((imm12 & SetImm12Mask) << 10); - }; - - inline auto AsmSubsCompareNoReg = [](u32 ins1, u32 ins2) { - return ((ins1 ^ ins2) >> 10) == 0; - }; - - inline auto AsmCompareBrConNoImm19 = [](u32 ins1, u32 ins2) { - constexpr u32 ClearImm19 = ~(((1 << 19) - 1) << 5); - return (ins1 & ClearImm19) == (ins2 & ClearImm19); - }; - - inline bool AsmIsFramePush(u32 ins) { - constexpr u32 FramePushMask = 0xFFC07FFF; - constexpr u32 FramePushValue = 0xA9807BFD; - return (ins & FramePushMask) == FramePushValue; + constexpr bool IsFramePush(u32 ins) { + constexpr u32 Pattern = Encode(op::StpPreImm64, {field::Rt, reg::Fp}, {field::Rt2, reg::Lr}, {field::Rn, reg::Sp}); + return Ignoring(ins, Pattern, field::PairOff8); } inline u32 *FindFnPrologue(u32 *ptr, u32 margin, u32 *nsoStart) { @@ -380,7 +257,7 @@ namespace ams::ldr::hoc::pcv { break; } - if (AsmIsFramePush(*candidate)) { + if (IsFramePush(*candidate)) { return candidate; } } From 8174c6fb7aae953ba93019e14428054b52e50830 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 20 Aug 2026 21:42:58 +0200 Subject: [PATCH 049/205] pcv::mariko: change rdv timing formular to match specifications according to t124 --- .../stratosphere/loader/source/oc/mtc_timing_value.hpp | 6 ++++++ .../source/oc/pcv/mariko/calculate_timings_mariko.cpp | 6 +++++- .../loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 7b23d587..8cedcaf2 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -38,6 +38,7 @@ namespace ams::ldr::hoc { /* DQS output access time from CK_t/CK_c. */ const double tDQSCK_max = 3.5; + /* Write preamble. (tCK) */ const u32 tWPRE = 2; @@ -59,6 +60,11 @@ namespace ams::ldr::hoc { /* Write recovery time. */ const u32 tWR = 18; + /* TODO: Add comments (lazy) */ + const double chip_delay = 1.109; /* ps. */ + const double round_trip_delay = 0.5; /* ps. */ + const double fly_by_time = chip_delay + round_trip_delay; + namespace pcv::erista { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 12915327..65387c9c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -164,8 +164,12 @@ namespace ams::ldr::hoc::pcv::mariko { tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); - rdv = RL + FLOOR((5.105 / tCK_avg) + 17.017); + /* Read data valid: Read command -> data ready to be latched into the registers. */ + rdv = RL + 16 + CEIL((fly_by_time + tDQSCK_max) / tCK_avg); + + /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ qpop = rdv - 14; + quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 0898b6dd..4b2c6531 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -36,6 +36,8 @@ namespace ams::ldr::hoc::pcv::mariko { * https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual * Section 18.11.1: MC Registers * Section 18.11.2: EMC Registers + * + * Additional information from reverse-engineering public Tegra K1 (T124) memory characterization tools. */ #define WRITE_PARAM_ALL_REG(TABLE, PARAM, VALUE) \ From ecdfd417e3605d4235ec0cbcb4670043f0b8bd38 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 20 Aug 2026 21:45:54 +0200 Subject: [PATCH 050/205] use correct units --- .../stratosphere/loader/source/oc/mtc_timing_value.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 8cedcaf2..53abc922 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -61,8 +61,8 @@ namespace ams::ldr::hoc { const u32 tWR = 18; /* TODO: Add comments (lazy) */ - const double chip_delay = 1.109; /* ps. */ - const double round_trip_delay = 0.5; /* ps. */ + const double chip_delay = 1.109; /* ns. */ + const double round_trip_delay = 0.5; /* ns. */ const double fly_by_time = chip_delay + round_trip_delay; namespace pcv::erista { From c7ca572d713dcf49f99aeceab915bdad0f2c3b58 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 15:51:25 -0400 Subject: [PATCH 051/205] improve update feature with changelogs --- .../hoc-clk/overlay/src/ui/gui/info_gui.cpp | 15 ++- Source/hoc-clk/overlay/src/ui/gui/info_gui.h | 4 + .../overlay/src/ui/gui/update_confirm_gui.cpp | 55 +++++++++ .../overlay/src/ui/gui/update_confirm_gui.h | 41 +++++++ .../hoc-clk/overlay/src/ui/gui/update_gui.cpp | 106 +++++++++++++++++- .../hoc-clk/overlay/src/ui/gui/update_gui.h | 18 ++- 6 files changed, 231 insertions(+), 8 deletions(-) create mode 100644 Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.cpp create mode 100644 Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.h diff --git a/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp index 3a339d5b..32d1e3ce 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp @@ -64,23 +64,26 @@ static std::vector wrapText(const std::string &text, s32 maxWidth) return lines; } -void InfoGui::listUI() { - this->listElement->addItem(new tsl::elm::CategoryHeader(m_title)); - +void addWrappedTextItems(tsl::elm::List *list, const std::vector ¶graphs) { const s32 maxWidth = tsl::cfg::FramebufferWidth - MARGIN_L - MARGIN_R; - for (const auto ¶ : m_strings) { + for (const auto ¶ : paragraphs) { for (const auto &lineText : wrapText(para, maxWidth)) { auto *d = new FocusableDrawer([lineText](tsl::gfx::Renderer *r, s32 x, s32 y, s32 w, s32 h) { r->drawString((lineText + "\n").c_str(), false, x + MARGIN_L, y + LINE_H - 5, TEXT_SIZE, tsl::style::color::ColorText); }); d->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, LINE_H); - this->listElement->addItem(d, LINE_H); + list->addItem(d, LINE_H); } // paragraph gap auto *gap = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); gap->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, PARA_GAP); - this->listElement->addItem(gap, PARA_GAP); + list->addItem(gap, PARA_GAP); } } + +void InfoGui::listUI() { + this->listElement->addItem(new tsl::elm::CategoryHeader(m_title)); + addWrappedTextItems(this->listElement, m_strings); +} diff --git a/Source/hoc-clk/overlay/src/ui/gui/info_gui.h b/Source/hoc-clk/overlay/src/ui/gui/info_gui.h index 0721060d..dfb5339d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/info_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/info_gui.h @@ -21,6 +21,10 @@ #include "base_menu_gui.h" +// Word-wraps and appends `paragraphs` to `list` as CustomDrawer text items, +// using the same layout/rendering rules InfoGui uses for its body text. +void addWrappedTextItems(tsl::elm::List *list, const std::vector ¶graphs); + class InfoGui : public BaseMenuGui { public: InfoGui(std::string title, std::vector strings); diff --git a/Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.cpp new file mode 100644 index 00000000..8341bd99 --- /dev/null +++ b/Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "update_confirm_gui.h" +#include "info_gui.h" +#include "update_gui.h" + +#include + +UpdateConfirmGui::UpdateConfirmGui(UpdateGui *parent, int packageIndex, std::string packageName, + std::string tag, std::vector changelog) + : m_parent(parent), m_packageIndex(packageIndex), m_packageName(std::move(packageName)), + m_tag(std::move(tag)), m_changelog(std::move(changelog)) { +} + +void UpdateConfirmGui::listUI() { + std::string header = m_packageName; + if (!m_tag.empty()) + header += " " + m_tag; + this->listElement->addItem(new tsl::elm::CategoryHeader(header)); + + addWrappedTextItems(this->listElement, m_changelog); + + this->listElement->addItem(new tsl::elm::CategoryHeader("Confirm")); + + auto *installItem = new tsl::elm::ListItem("Install Update"); + installItem->setValue(""); + installItem->setClickListener([this](u64 keys) -> bool { + if ((keys & HidNpadButton_A) == HidNpadButton_A) { + m_parent->startJob(m_packageIndex, false); + tsl::goBack(); + return true; + } + return false; + }); + this->listElement->addItem(installItem); +} + +bool UpdateConfirmGui::handleInput(u64, u64, const HidTouchState &, + HidAnalogStickState, HidAnalogStickState) { + return false; +} diff --git a/Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.h b/Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.h new file mode 100644 index 00000000..3439f0fc --- /dev/null +++ b/Source/hoc-clk/overlay/src/ui/gui/update_confirm_gui.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include + +#include "base_menu_gui.h" + +class UpdateGui; + +class UpdateConfirmGui : public BaseMenuGui { +public: + UpdateConfirmGui(UpdateGui *parent, int packageIndex, std::string packageName, + std::string tag, std::vector changelog); + ~UpdateConfirmGui() = default; + + void listUI() override; + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, + HidAnalogStickState leftJoy, HidAnalogStickState rightJoy) override; + +private: + UpdateGui *m_parent; + int m_packageIndex; + std::string m_packageName; + std::string m_tag; + std::vector m_changelog; +}; diff --git a/Source/hoc-clk/overlay/src/ui/gui/update_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/update_gui.cpp index 7160c946..c56c8d5c 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/update_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/update_gui.cpp @@ -17,12 +17,14 @@ #include "update_gui.h" #include "ult_ext.h" #include "base_menu_gui.h" +#include "update_confirm_gui.h" #include "../format.h" #include "../style.h" #include #include #include +#include #include @@ -131,6 +133,29 @@ void UpdateGui::startJob(int packageIndex, bool extractOnly) { } } +void UpdateGui::startChangelogFetch(int packageIndex) { + if (isBusy()) return; + + m_activePackage = packageIndex; + m_resultMessage.clear(); + m_changelogTag.clear(); + m_changelogLines.clear(); + + ult::abortDownload.store(false, std::memory_order_release); + + m_stage.store(UpdateStage::FetchingChangelog, std::memory_order_release); + + if (R_SUCCEEDED(threadCreate(&m_thread, fetchChangelogEntry, this, + nullptr, 0x8000, 0x20, -2))) { + m_threadActive = true; + threadStart(&m_thread); + } else { + m_resultMessage = "Failed to create thread"; + m_stage.store(UpdateStage::Failed, std::memory_order_release); + m_threadActive = false; + } +} + void UpdateGui::requestCancel() { ult::abortDownload.store(true, std::memory_order_release); ult::abortUnzip.store(true, std::memory_order_release); @@ -186,6 +211,55 @@ void UpdateGui::jobBody() { m_stage.store(UpdateStage::Done, std::memory_order_release); } +/* static */ void UpdateGui::fetchChangelogEntry(void *arg) { + static_cast(arg)->fetchChangelogBody(); +} + +void UpdateGui::fetchChangelogBody() { + ult::createDirectory("sdmc:/config/horizon-oc/"); + + bool ok = ult::downloadFile(kReleaseApiUrl, kReleaseInfoPath, false, false); + if (!ok || ult::abortDownload.load(std::memory_order_acquire)) { + m_resultMessage = ult::abortDownload.load(std::memory_order_acquire) + ? "Changelog fetch cancelled" + : "Could not fetch changelog -- check network"; + m_stage.store( + ult::abortDownload.load() ? UpdateStage::Cancelled : UpdateStage::Failed, + std::memory_order_release); + return; + } + + std::unique_ptr root(ult::readJsonFromFile(kReleaseInfoPath)); + std::remove(kReleaseInfoPath); + + if (!root) { + m_resultMessage = "Could not parse changelog"; + m_stage.store(UpdateStage::Failed, std::memory_order_release); + return; + } + + m_changelogTag = ult::getStringFromJson(root.get(), "tag_name"); + const std::string body = ult::getStringFromJson(root.get(), "body"); + + m_changelogLines.clear(); + size_t pos = 0; + while (pos <= body.size()) { + size_t nl = body.find('\n', pos); + std::string line = (nl == std::string::npos) ? body.substr(pos) : body.substr(pos, nl - pos); + if (!line.empty() && line.back() == '\r') + line.pop_back(); + if (!line.empty()) + m_changelogLines.push_back(line); + if (nl == std::string::npos) + break; + pos = nl + 1; + } + if (m_changelogLines.empty()) + m_changelogLines.push_back("No changelog available for this release."); + + m_stage.store(UpdateStage::ChangelogReady, std::memory_order_release); +} + void UpdateGui::listUI() { BaseMenuGui::refresh(); @@ -201,7 +275,12 @@ void UpdateGui::listUI() { item->setClickListener([this, idx](u64 keys) -> bool { if (isBusy()) return false; if (keys & HidNpadButton_A) { - startJob(idx, false); + if (ult::limitedMemory) { + m_status->setState(4, 100, kPackages[idx].displayName, + "Updates cannot be performed on a 4MB overlay heap"); + return true; + } + startChangelogFetch(idx); return true; } return false; @@ -242,6 +321,24 @@ void UpdateGui::pollJob() { return; } + if (stage == UpdateStage::FetchingChangelog) { + m_status->setState(6, 0, pkgName, "Fetching changelog..."); + if (m_items[m_activePackage]) + m_items[m_activePackage]->setValue("..."); + return; + } + + if (stage == UpdateStage::ChangelogReady) { + reapThread(); + m_stage.store(UpdateStage::Idle, std::memory_order_release); + m_status->setState(0, 0, "", ""); + if (m_items[m_activePackage]) + m_items[m_activePackage]->setValue(""); + + m_pendingChangelogConfirm = true; + return; + } + int panelStage = (stage == UpdateStage::Done) ? 3 : (stage == UpdateStage::Failed) ? 4 : 5; @@ -263,6 +360,13 @@ bool UpdateGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoy, HidAnalogStickState rightJoy) { + if (m_pendingChangelogConfirm) { + m_pendingChangelogConfirm = false; + tsl::changeTo(this, m_activePackage, kPackages[m_activePackage].displayName, + m_changelogTag, m_changelogLines); + return true; + } + if ((keysDown & HidNpadButton_R) && isBusy()) { requestCancel(); return true; diff --git a/Source/hoc-clk/overlay/src/ui/gui/update_gui.h b/Source/hoc-clk/overlay/src/ui/gui/update_gui.h index f81e821b..17b5dd04 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/update_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/update_gui.h @@ -19,6 +19,7 @@ #include #include +#include #include "base_menu_gui.h" @@ -35,6 +36,8 @@ public: bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoy, HidAnalogStickState rightJoy) override; + void startJob(int packageIndex, bool extractOnly); + private: enum class UpdateStage { Idle, @@ -43,6 +46,8 @@ private: Done, Failed, Cancelled, + FetchingChangelog, + ChangelogReady, }; struct PackageInfo { @@ -56,11 +61,14 @@ private: {"Horizon OC + Extensions", "https://github.com/Horizon-OC/Horizon-OC/releases/latest/download/dist_ext.zip", "sdmc:/config/horizon-oc/dist_ext.zip"}, }; + static constexpr const char *kReleaseApiUrl = "https://api.github.com/repos/Horizon-OC/Horizon-OC/releases/latest"; + static constexpr const char *kReleaseInfoPath = "sdmc:/config/horizon-oc/release_info.json"; + bool isBusy() const { return m_stage.load(std::memory_order_acquire) != UpdateStage::Idle; } - void startJob(int packageIndex, bool extractOnly); + void startChangelogFetch(int packageIndex); void requestCancel(); void reapThread(); void pollJob(); @@ -68,6 +76,9 @@ private: static void jobEntry(void *arg); void jobBody(); + static void fetchChangelogEntry(void *arg); + void fetchChangelogBody(); + std::atomic m_stage{UpdateStage::Idle}; int m_activePackage = -1; bool m_extractOnly = false; @@ -75,6 +86,11 @@ private: Thread m_thread{}; std::string m_resultMessage; + std::string m_changelogTag; + std::vector m_changelogLines; + + bool m_pendingChangelogConfirm = false; + tsl::elm::ListItem *m_items[2] = {nullptr, nullptr}; UpdateStatusPanel *m_status = nullptr; From 2a505211aad71f48fdcd6e83f9af7372b4c3c369 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 16:10:45 -0400 Subject: [PATCH 052/205] gm20b driver bugfixes --- Source/hoc-clk/sysmodule/src/soc/gm20b.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp index e2a4e158..9bf3a7e5 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp @@ -27,12 +27,12 @@ namespace gm20b { #define GPU_SIZE 0x1000000 #define GPU_TRIM_SYS_GPCPLL_CFG 0x00 #define GPU_TRIM_SYS_GPCPLL_COEFF 0x04 -#define GPU_TRIM_SYS_GPCPLL_CFG2 0x08 -#define GPU_TRIM_SYS_GPCPLL_CFG3 0x0C +#define GPU_TRIM_SYS_GPCPLL_CFG2 0x0C +#define GPU_TRIM_SYS_GPCPLL_CFG3 0x18 #define GPU_TRIM_SYS_GPCPLL_DVFS0 0x10 #define GPU_TRIM_SYS_GPCPLL_DVFS1 0x14 #define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x1C -#define GPU_TRIM_SYS_SEL_VCO 0x2C +#define GPU_TRIM_SYS_SEL_VCO 0x100 #define GPU_TRIM_SYS_GPC2CLK_OUT 0x250 #define GPC_BCAST(x) (*(volatile u32 *)(gpu_base + 0x132800ul + (x))) @@ -47,7 +47,7 @@ namespace gm20b { #define GPCPLL_CFG_LOCK BIT(17) #define GPCPLL_CFG2_SDM_DIN_MASK 0x000000FFu -#define GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x007FFF00u +#define GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x0000FF00u #define GPCPLL_CFG2_STEPA_SHIFT 24 #define GPCPLL_CFG2_STEPA_MASK 0xFF000000u @@ -57,7 +57,7 @@ namespace gm20b { #define GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007Fu #define NDIV_SLOWDOWN_SLOWDOWN_USING_PLL BIT(22) -#define NDIV_SLOWDOWN_EN_DYNRAMP BIT(23) +#define NDIV_SLOWDOWN_EN_DYNRAMP BIT(31) #define DYNRAMP_DONE_SYNCED BIT(24) From 15fbc69b3736a6dbba04baa5bf9c8a405c55f8a7 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 16:52:15 -0400 Subject: [PATCH 053/205] lower max mem volt on mariko it's unnessesary and useless on mariko --- Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 1b47ea9c..4fb0492d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1183,7 +1183,7 @@ class RamSubmenuGui : public MiscGui { }; ValueThresholds vdd2Thresholds(IsMariko() ? 1212500 : 1237500, IsMariko() ? 1250000 : 1275000); - addConfigButton(KipConfigValue_commonEmcMemVolt, "RAM VDD2 Voltage", ValueRange(912500, 1350000, 12500, "mV", 1000, 1), "Voltage", + addConfigButton(KipConfigValue_commonEmcMemVolt, "RAM VDD2 Voltage", ValueRange(912500, IsMariko ? 1275000 : 1350000, 12500, "mV", 1000, 1), "Voltage", &vdd2Thresholds, emc_voltage_label, noNamedValues, false, true); if (IsMariko()) { From fe9c4f1920afbcdbc59a9d8071afbbd69fa80c66 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 16:53:30 -0400 Subject: [PATCH 054/205] Update misc_gui.cpp --- Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 4fb0492d..a241bfc8 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -909,7 +909,7 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { NamedValue("100mA", 100), NamedValue("150mA", 150), NamedValue("500mA", 500), - NamedValue("900mA", 900, "Hoag Default"), + NamedValue("900mA", 900, "Default (Lite)"), NamedValue("1200mA", 1200, "Default"), NamedValue("1500mA", 1500), NamedValue("2000mA", 2000), From 9645159b55201f3899b7fa9e53c4426deb44b405 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 16:56:59 -0400 Subject: [PATCH 055/205] Update misc_gui.cpp --- Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index a241bfc8..dad9c7a1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1183,7 +1183,7 @@ class RamSubmenuGui : public MiscGui { }; ValueThresholds vdd2Thresholds(IsMariko() ? 1212500 : 1237500, IsMariko() ? 1250000 : 1275000); - addConfigButton(KipConfigValue_commonEmcMemVolt, "RAM VDD2 Voltage", ValueRange(912500, IsMariko ? 1275000 : 1350000, 12500, "mV", 1000, 1), "Voltage", + addConfigButton(KipConfigValue_commonEmcMemVolt, "RAM VDD2 Voltage", ValueRange(912500, IsMariko() ? 1275000 : 1350000, 12500, "mV", 1000, 1), "Voltage", &vdd2Thresholds, emc_voltage_label, noNamedValues, false, true); if (IsMariko()) { From 850c3331282a2ff6fd355b1fbeedf7981a0a0001 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 20 Aug 2026 23:57:59 +0200 Subject: [PATCH 056/205] Update pcv_mariko.cpp --- .../stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index c3040cc3..9702a7eb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -224,7 +224,7 @@ namespace ams::ldr::hoc::pcv::mariko { #if HOC_UART_LOG /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ Result ForceVerbosity(u32 *ptr) { - i f(C.pcvLogVerbosity != 0xff) { + if (C.pcvLogVerbosity != 0xff) { PATCH_OFFSET(&ptr[0], _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, 0}, {_asm::field::Imm16, C.pcvLogVerbosity})); /* movz w0,#level */ PATCH_OFFSET(&ptr[1], _asm::RetIns); /* ret */ } From 50336ec6875877a9e01e4d98bbf184a977a4ec7b Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 18:41:25 -0400 Subject: [PATCH 057/205] add ram timing presets in the menu --- Source/hoc-clk/overlay/src/ui/format.h | 43 +++++ .../hoc-clk/overlay/src/ui/gui/about_gui.cpp | 45 +---- Source/hoc-clk/overlay/src/ui/gui/about_gui.h | 3 - .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 181 ++++++++++++++++++ 4 files changed, 225 insertions(+), 47 deletions(-) diff --git a/Source/hoc-clk/overlay/src/ui/format.h b/Source/hoc-clk/overlay/src/ui/format.h index f8900b06..216bbee6 100644 --- a/Source/hoc-clk/overlay/src/ui/format.h +++ b/Source/hoc-clk/overlay/src/ui/format.h @@ -72,6 +72,49 @@ static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit) return formatListFreqMem(hz / 1000000, unit); } +static inline std::string formatRamModule(uint8_t dramID) { + switch (dramID) { + case 0: return "HB-MGCH 4GB"; + case 4: return "HM-MGCH 6GB"; + case 7: return "HM-MGXX 8GB"; + + case 1: return "NLE 4GB"; + case 2: return "WT:C 4GB"; + + case 3: + case 5 ... 6: return "NEE 4GB"; + + case 8: + case 12: return "AM-MGCJ 4GB"; + case 9: + case 13: return "AM-MGCJ 8GB"; + + case 10: + case 14: return "NME 4GB"; + + case 11: + case 15: return "WT:E 4GB"; + + case 17: + case 19: + case 24: return "AA-MGCL 4GB"; + + case 18: + case 23: + case 28: return "AA-MGCL 8GB"; + + case 20 ... 22: return "AB-MGCL 4GB"; + + case 25 ... 27: return "WT:F 4GB"; + + case 29 ... 31: return "x267 4GB"; + + case 32 ... 34: return "WT:B 4GB"; + + default: return "Unknown"; + } +} + static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit) { uint32_t mhz = khz / 1000; uint32_t mts = khz / 500; diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 523a8d40..2960e7b9 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -191,49 +191,6 @@ void AboutGui::listUI() lastItemName = ""; } -std::string AboutGui::formatRamModule() { - switch (this->context->dramID) { - case 0: return "HB-MGCH 4GB"; - case 4: return "HM-MGCH 6GB"; - case 7: return "HM-MGXX 8GB"; - - case 1: return "NLE 4GB"; - case 2: return "WT:C 4GB"; - - case 3: - case 5 ... 6: return "NEE 4GB"; - - case 8: - case 12: return "AM-MGCJ 4GB"; - case 9: - case 13: return "AM-MGCJ 8GB"; - - case 10: - case 14: return "NME 4GB"; - - case 11: - case 15: return "WT:E 4GB"; - - case 17: - case 19: - case 24: return "AA-MGCL 4GB"; - - case 18: - case 23: - case 28: return "AA-MGCL 8GB"; - - case 20 ... 22: return "AB-MGCL 4GB"; - - case 25 ... 27: return "WT:F 4GB"; - - case 29 ... 31: return "x267 4GB"; - - case 32 ... 34: return "WT:B 4GB"; - - default: return "Unknown"; - } -} - void AboutGui::update() { BaseMenuGui::update(); @@ -255,7 +212,7 @@ void AboutGui::refresh() sprintf(strings[1], "%u/%u/%u", this->context->iddq[HocClkSpeedo_CPU], this->context->iddq[HocClkSpeedo_GPU], this->context->iddq[HocClkSpeedo_SOC]); SpeedoItem->setValue(strings[0]); IddqItem->setValue(strings[1]); - DramModule->setValue(formatRamModule()); + DramModule->setValue(formatRamModule(this->context->dramID)); // custRevItem->setValue(std::to_string(this->context->custRev)); diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.h b/Source/hoc-clk/overlay/src/ui/gui/about_gui.h index 49d71d67..27d7f455 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.h @@ -36,7 +36,4 @@ public: void listUI() override; void update() override; void refresh() override; - -private: - std::string formatRamModule(); }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index dad9c7a1..7212408b 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -60,6 +60,7 @@ class DisplaySubMenuGui; class SafetySubMenuGui; class RamSubmenuGui; class RamTimingsSubmenuGui; +class RamTimingPresetsSubmenuGui; class RamLatenciesSubmenuGui; class SocCustomTableSubmenuGui; class CpuSubmenuGui; @@ -1365,6 +1366,67 @@ class RamSubmenuGui : public MiscGui { } }; +struct RamTimingPresetSet { + uint32_t t[8]; +}; + +struct RamTimingPresetRow { + std::initializer_list dramIds; + RamTimingPresetSet common; + RamTimingPresetSet st; +}; + +static const RamTimingPresetRow kMarikoRamTimingPresets[] = { + { { 32, 33, 34 }, { { 4, 4, 5, 4, 2, 6, 5, 6 } }, { { 6, 6, 7, 5, 2, 6, 5, 6 } } }, // WT:B + { { 3, 5, 6, 29, 30, 31 }, { { 3, 3, 2, 1, 5, 5, 4, 6 } }, { { 4, 4, 4, 2, 7, 6, 5, 6 } } }, // NEE / x267 + { { 17, 19, 24 }, { { 4, 4, 5, 4, 5, 5, 6, 6 } }, { { 4, 4, 8, 5, 5, 6, 7, 6 } } }, // AA-MGCL 4GB + { { 11, 15 }, { { 2, 2, 2, 1, 4, 4, 4, 6 } }, { { 3, 5, 3, 2, 5, 4, 5, 6 } } }, // WT:E + { { 8, 12 }, { { 3, 2, 4, 1, 4, 4, 4, 6 } }, { { 4, 3, 8, 1, 5, 4, 4, 6 } } }, // AM-MGCJ 4GB + { { 25, 26, 27 }, { { 4, 4, 2, 4, 4, 6, 3, 6 } }, { { 5, 5, 4, 4, 5, 6, 5, 6 } } }, // WT:F + { { 20, 21, 22 }, { { 4, 4, 4, 3, 4, 5, 6, 6 } }, { { 4, 4, 8, 4, 5, 6, 8, 6 } } }, // AB-MGCL + { { 10, 14 }, { { 2, 2, 3, 0, 1, 2, 2, 6 } }, { { 5, 3, 4, 1, 8, 3, 3, 6 } } }, // NME +}; + +static const RamTimingPresetSet kEristaCommonTiming = { { 4, 4, 4, 0, 1, 5, 4, 6 } }; +static const RamTimingPresetSet kEristaSTTiming = { { 4, 5, 9, 1, 2, 6, 4, 6 } }; + +// 8GB DRAM modules are commonly used for ram upgrade +// and are not representative of the actual ram in the console +// Theoretically you could do it via MRR Vendor registers +// but thats for the future +static bool isEightGigRamID(u8 dramID) { + switch (dramID) { + case 7: + case 9: + case 13: + case 18: + case 23: + case 28: + return true; + default: + return false; + } +} + +static const RamTimingPresetRow *findMarikoRamTimingPreset(u8 dramID) { + for (const auto &row : kMarikoRamTimingPresets) { + for (auto id : row.dramIds) { + if (id == dramID) + return &row; + } + } + return nullptr; +} + +static void applyRamTimingPreset(HocClkConfigValueList *configList, const RamTimingPresetSet &set) { + static constexpr HocClkConfigValue keys[8] = { + KipConfigValue_t1_tRCD, KipConfigValue_t2_tRP, KipConfigValue_t3_tRAS, KipConfigValue_t4_tRRD, + KipConfigValue_t5_tRFC, KipConfigValue_t6_tRTW, KipConfigValue_t7_tWTR, KipConfigValue_t8_tREFI, + }; + for (int i = 0; i < 8; i++) + configList->values[keys[i]] = set.t[i]; +} + class RamTimingsSubmenuGui : public MiscGui { public: RamTimingsSubmenuGui() { @@ -1390,6 +1452,17 @@ class RamTimingsSubmenuGui : public MiscGui { } this->listElement->addItem(new CompactCategoryHeader("Memory Timings")); + tsl::elm::ListItem *timingPresetsSubMenu = new tsl::elm::ListItem("Timing Presets"); + timingPresetsSubMenu->setClickListener([](u64 keys) { + if (keys & HidNpadButton_A) { + tsl::swapTo(); + return true; + } + return false; + }); + timingPresetsSubMenu->setValue(R_ARROW); + this->listElement->addItem(timingPresetsSubMenu); + addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); @@ -1605,6 +1678,114 @@ class RamTimingsSubmenuGui : public MiscGui { { "-2", "-1", " 0", "+1", "+2" }); addMappedConfigTrackbar(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", { 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u }, { "-3", "-2", "-1", " 0", "+1", "+2", "+3" }); + + if (!lastItemName.empty()) { + this->listElement->jumpToItem(lastItemName); + } + lastItemName = ""; + } +}; + +class RamTimingPresetsSubmenuGui : public MiscGui { + public: + RamTimingPresetsSubmenuGui() { + } + + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { + if (keysDown & KEY_B) { + triggerExitFeedback(); + lastItemName = "Timing Presets"; + tsl::swapTo(); + return true; + } + return false; + } + + protected: + void listUI() override { + Result rc = hocclkIpcGetConfigValues(this->configList); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + + if (!this->context) { + this->context = new HocClkContext; + } + Result crc = hocclkIpcGetCurrentContext(this->context); + if (R_FAILED(crc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetCurrentContext", crc); + return; + } + u8 dramID = this->context->dramID; + this->listElement->addItem(new CompactCategoryHeader("Timing Presets: " + formatRamModule(dramID))); + + tsl::elm::CustomDrawer *presetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + renderer->drawString("\uE150 Timing presets are only a baseline and", false, x + 20, y + 30, 18, tsl::style::color::ColorText); + renderer->drawString("may need adjustment for your particular", false, x + 20, y + 50, 18, tsl::style::color::ColorText); + renderer->drawString("DRAM Module", false, x + 20, y + 70, 18, tsl::style::color::ColorText); + }); + presetWarning->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 90); + this->listElement->addItem(presetWarning); + + const RamTimingPresetSet *presetCommon = nullptr; + const RamTimingPresetSet *presetST = nullptr; + if (!isEightGigRamID(dramID)) { + if (IsMariko()) { + const RamTimingPresetRow *row = findMarikoRamTimingPreset(dramID); + if (row) { + presetCommon = &row->common; + presetST = &row->st; + } + } else { + presetCommon = &kEristaCommonTiming; + presetST = &kEristaSTTiming; + } + } + + if (presetCommon && presetST) { + tsl::elm::ListItem *commonPresetBtn = new tsl::elm::ListItem("Apply Common Preset"); + commonPresetBtn->setClickListener([this, presetCommon](u64 keys) { + if (!(keys & HidNpadButton_A)) + return false; + applyRamTimingPreset(this->configList, *presetCommon); + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + shouldSaveKip = true; + lastItemName = "Timing Presets"; + tsl::swapTo(); + return true; + }); + this->listElement->addItem(commonPresetBtn); + + tsl::elm::ListItem *stPresetBtn = new tsl::elm::ListItem("Apply Super Tight (ST) Preset"); + stPresetBtn->setClickListener([this, presetST](u64 keys) { + if (!(keys & HidNpadButton_A)) + return false; + applyRamTimingPreset(this->configList, *presetST); + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + shouldSaveKip = true; + lastItemName = "Timing Presets"; + tsl::swapTo(); + return true; + }); + this->listElement->addItem(stPresetBtn); + } else { + tsl::elm::CustomDrawer *noPresetText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + renderer->drawString("Timing presets are not available", false, x + 20, y + 30, 18, tsl::style::color::ColorText); + renderer->drawString("for your RAM module.", false, x + 20, y + 50, 18, tsl::style::color::ColorText); + }); + noPresetText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 70); + this->listElement->addItem(noPresetText); + } } }; From 4c0370d4a6514b0af84e2f4580426a97f8dece39 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 18:44:22 -0400 Subject: [PATCH 058/205] add isFirstLoad to context --- Source/hoc-clk/common/include/hocclk/clock_manager.h | 5 +++-- Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index fcc8ec2b..83079c48 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -83,9 +83,10 @@ typedef struct { u16 kipVersion; bool isKipLoaded; bool rebootRequired; - + bool isFirstLoad; + // Reserved for future use - u8 reserved[0x359]; + u8 reserved[0x358]; } HocClkContext; typedef struct diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index a4e75ca5..15bb3f82 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -818,7 +818,8 @@ namespace clockManager { gContext.dramID = board::GetDramID(); gContext.isDram8GB = board::IsDram8GB(); gContext.consoleType = board::GetConsoleType(); - + gContext.isFirstLoad = config::GetConfigValue(HocClkConfigValue_IsFirstLoad); + board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); gContext.gpuSchedulingMode = (GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling); From e528efc6d18d353c9b61e535e12a052fc1196d7f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 19:24:04 -0400 Subject: [PATCH 059/205] vdd2/vddq ram display mode --- Source/hoc-clk/common/include/hocclk/board.h | 1 + Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp | 4 ++++ Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 1 + 3 files changed, 6 insertions(+) diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 944e7271..45b576d8 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -162,6 +162,7 @@ typedef enum { typedef enum { RamDisplayMode_VDD2 = 0, RamDisplayMode_VDDQ, + RamDisplayMode_VDD2VDDQ, RamDisplayMode_EnumMax, } RamDisplayMode; diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp index aaee65e8..593ad1a4 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp @@ -284,6 +284,10 @@ void BaseMenuGui::refresh() { sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U, (context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U); break; + case RamDisplayMode_VDD2VDDQ: + sprintf(displayStrings[10], "%u/%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, + context->voltages[HocClkVoltage_EMCVDDQ] / 1000U); + break; default: strcpy(displayStrings[10], "N/A"); break; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 7212408b..936c9423 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -785,6 +785,7 @@ class GeneralSettingsSubMenuGui : public MiscGui { std::vector ramVoltDispModes = { NamedValue("VDD2", RamDisplayMode_VDD2), NamedValue("VDDQ", RamDisplayMode_VDDQ), + NamedValue("VDD2/VDDQ", RamDisplayMode_VDD2VDDQ), }; if (IsMariko()) { From e5765e70ab6da243d11d561cc430964d59dfadd9 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 20 Aug 2026 20:32:55 -0400 Subject: [PATCH 060/205] fix cpu read benchmark --- Source/Benchmark-Toolbox/source/bench.c | 312 ++++++++++++++---------- 1 file changed, 186 insertions(+), 126 deletions(-) diff --git a/Source/Benchmark-Toolbox/source/bench.c b/Source/Benchmark-Toolbox/source/bench.c index 40286586..36a492f7 100644 --- a/Source/Benchmark-Toolbox/source/bench.c +++ b/Source/Benchmark-Toolbox/source/bench.c @@ -8,7 +8,6 @@ */ #include -#include #include #include #include @@ -24,110 +23,174 @@ #define ALIGN_PADDING 0x100000 #define CACHE_LINE_SIZE 128 -struct f_data { - void (*func)(int64_t *, int64_t *, int); - int64_t *arg1; - int64_t *arg2; - int arg3; -}; +#define BW_MAX_THREADS 4 -static pthread_cond_t p_ready, p_start; -static pthread_mutex_t p_lock; -static pthread_t *p_worker = NULL; -static struct f_data *worker_data = NULL; -static int p_worker_not_ready, p_workers_ready; +typedef void (*bench_kernel_fn)(int64_t *dst, int64_t *src, long size); -static void *thread_func(void *data) { - struct f_data *d = data; - pthread_mutex_lock(&p_lock); - p_worker_not_ready--; - if (!p_worker_not_ready) - pthread_cond_signal(&p_ready); - while (p_workers_ready != 1) - pthread_cond_wait(&p_start, &p_lock); - pthread_mutex_unlock(&p_lock); - (d->func)(d->arg1, d->arg2, d->arg3); - pthread_exit(NULL); -} +struct bw_pool; -static void parallel_run(void) { - pthread_mutex_lock(&p_lock); - p_workers_ready = 1; - pthread_mutex_unlock(&p_lock); - pthread_cond_broadcast(&p_start); -} +typedef struct { + Thread thread; + Semaphore start; + struct bw_pool *pool; + bench_kernel_fn func; + int64_t *dst; + int64_t *src; + long size; + int core; + bool created; +} bw_worker_t; -static void parallel_init(int threads) { - pthread_attr_t attr; - pthread_cond_init(&p_ready, NULL); - pthread_cond_init(&p_start, NULL); - pthread_mutex_init(&p_lock, NULL); - p_worker_not_ready = threads; - p_workers_ready = 0; - pthread_attr_init(&attr); - if (!p_worker || !worker_data) { - p_worker = malloc(threads * sizeof(pthread_t)); - worker_data = malloc(threads * sizeof(struct f_data)); +typedef struct bw_pool { + bw_worker_t workers[BW_MAX_THREADS]; + Semaphore done; + int threads; + bool ok; +} bw_pool_t; + +static void bw_worker_entry(void *arg) { + bw_worker_t *w = (bw_worker_t *)arg; + bw_pool_t *p = w->pool; + /* Best-effort pin to own core. */ + svcSetThreadCoreMask(CUR_THREAD_HANDLE, w->core, (u64)1 << w->core); + for (;;) { + semaphoreWait(&w->start); + bench_kernel_fn f = w->func; + if (!f) + break; + f(w->dst, w->src, w->size); + semaphoreSignal(&p->done); } +} + +static bool bw_pool_init(bw_pool_t *p, int threads) { + memset(p, 0, sizeof(*p)); + if (threads > BW_MAX_THREADS) + threads = BW_MAX_THREADS; + p->threads = threads; + semaphoreInit(&p->done, 0); + s32 prio = 0x2C; + svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); + for (int i = 0; i < threads; i++) { + bw_worker_t *w = &p->workers[i]; + w->core = i; + w->func = NULL; + w->pool = p; + semaphoreInit(&w->start, 0); + if (R_FAILED(threadCreate(&w->thread, bw_worker_entry, w, NULL, 0x8000, prio, i))) + return false; + w->created = true; + if (R_FAILED(threadStart(&w->thread))) + return false; + } + p->ok = true; + return true; +} + +static void bw_pool_free(bw_pool_t *p) { + for (int i = 0; i < p->threads; i++) { + bw_worker_t *w = &p->workers[i]; + if (w->created) { + w->func = NULL; /* shutdown */ + semaphoreSignal(&w->start); + } + } + for (int i = 0; i < p->threads; i++) { + bw_worker_t *w = &p->workers[i]; + if (w->created) { + threadWaitForExit(&w->thread); + threadClose(&w->thread); + w->created = false; + } + } + p->ok = false; +} + +static double bw_run_once(bw_pool_t *p, bench_kernel_fn f, int64_t *dstbuf, int64_t *srcbuf, long size) { + int threads = p->threads; + for (int i = 0; i < threads; i++) { + bw_worker_t *w = &p->workers[i]; + w->func = f; + w->dst = dstbuf + (size * i) / (long)sizeof(int64_t); + w->src = srcbuf + (size * i) / (long)sizeof(int64_t); + w->size = size; + } + uint64_t t0 = armGetSystemTick(); for (int i = 0; i < threads; i++) - pthread_create(p_worker + i, &attr, thread_func, worker_data + i); - pthread_mutex_lock(&p_lock); - while (p_worker_not_ready != 0) - pthread_cond_wait(&p_ready, &p_lock); - pthread_mutex_unlock(&p_lock); + semaphoreSignal(&p->workers[i].start); + for (int i = 0; i < threads; i++) + semaphoreWait(&p->done); + uint64_t t1 = armGetSystemTick(); + return (double)armTicksToNs(t1 - t0) / 1000000000.0; } -static void aligned_block_copy(int64_t *__restrict dst_, int64_t *__restrict src, int size) { - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - while ((size -= 64) >= 0) { - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - } -} +#define BW_GPR_CLOBBERS \ + "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18" -static void aligned_block_fetch(int64_t *__restrict dst, int64_t *__restrict src_, int size) { - volatile int64_t *src = src_; - (void)dst; - while ((size -= 64) >= 0) { - *src++; - *src++; - *src++; - *src++; - *src++; - *src++; - *src++; - *src++; - } +static void aligned_block_copy(int64_t *dst, int64_t *src, long size) { + __asm__ __volatile__( + "1:\n" + "ldp x3, x4, [%[s], #0x00]\n" + "ldp x5, x6, [%[s], #0x10]\n" + "ldp x7, x8, [%[s], #0x20]\n" + "ldp x9, x10, [%[s], #0x30]\n" + "ldp x11, x12, [%[s], #0x40]\n" + "ldp x13, x14, [%[s], #0x50]\n" + "ldp x15, x16, [%[s], #0x60]\n" + "ldp x17, x18, [%[s], #0x70]\n" + "add %[s], %[s], #0x80\n" + "stp x3, x4, [%[d], #0x00]\n" + "stp x5, x6, [%[d], #0x10]\n" + "stp x7, x8, [%[d], #0x20]\n" + "stp x9, x10, [%[d], #0x30]\n" + "stp x11, x12, [%[d], #0x40]\n" + "stp x13, x14, [%[d], #0x50]\n" + "stp x15, x16, [%[d], #0x60]\n" + "stp x17, x18, [%[d], #0x70]\n" + "add %[d], %[d], #0x80\n" + "subs %[n], %[n], #0x80\n" + "b.gt 1b\n" + : [s] "+r"(src), [d] "+r"(dst), [n] "+r"(size) + : + : BW_GPR_CLOBBERS, "cc", "memory"); } - -static void aligned_block_fill(int64_t *__restrict dst_, int64_t *__restrict src, int size) { - volatile int64_t *dst = dst_; - int64_t data = *src; - while ((size -= 64) >= 0) { - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - } +static void aligned_block_fetch(int64_t *dst, int64_t *src, long size) { + (void)src; + __asm__ __volatile__( + "1:\n" + "ldp x3, x4, [%[p], #0x00]\n" + "ldp x5, x6, [%[p], #0x10]\n" + "ldp x7, x8, [%[p], #0x20]\n" + "ldp x9, x10, [%[p], #0x30]\n" + "ldp x11, x12, [%[p], #0x40]\n" + "ldp x13, x14, [%[p], #0x50]\n" + "ldp x15, x16, [%[p], #0x60]\n" + "ldp x17, x18, [%[p], #0x70]\n" + "add %[p], %[p], #0x80\n" + "subs %[n], %[n], #0x80\n" + "b.gt 1b\n" + : [p] "+r"(dst), [n] "+r"(size) + : + : BW_GPR_CLOBBERS, "cc", "memory"); +} +static void aligned_block_fill(int64_t *dst, int64_t *src, long size) { + (void)src; + __asm__ __volatile__( + "1:\n" + "stp x3, x4, [%[d], #0x00]\n" + "stp x5, x6, [%[d], #0x10]\n" + "stp x7, x8, [%[d], #0x20]\n" + "stp x9, x10, [%[d], #0x30]\n" + "stp x11, x12, [%[d], #0x40]\n" + "stp x13, x14, [%[d], #0x50]\n" + "stp x15, x16, [%[d], #0x60]\n" + "stp x17, x18, [%[d], #0x70]\n" + "add %[d], %[d], #0x80\n" + "subs %[n], %[n], #0x80\n" + "b.gt 1b\n" + : [d] "+r"(dst), [n] "+r"(size) + : + : BW_GPR_CLOBBERS, "cc", "memory"); } static double gettime(void) { @@ -136,9 +199,12 @@ static double gettime(void) { return (double)((int64_t)tv.tv_sec * 1000000 + tv.tv_usec) / 1000000.; } -static double bandwidth_bench_helper(int threads, int64_t *dstbuf, int64_t *srcbuf, int size, void (*f)(int64_t *, int64_t *, int)) { +static double bandwidth_bench_helper(bw_pool_t *pool, int threads, int64_t *dstbuf, int64_t *srcbuf, long size, bench_kernel_fn f) { int i, loopcount, innerloopcount, n; - double t, t1, t2, speed, maxspeed, s, s0, s1, s2; + double t, speed, maxspeed, s, s0, s1, s2; + + if (!pool || !pool->ok) + return 0.; s = s0 = s1 = s2 = 0.; maxspeed = 0.; @@ -148,21 +214,8 @@ static double bandwidth_bench_helper(int threads, int64_t *dstbuf, int64_t *srcb t = 0.; do { loopcount += innerloopcount; - for (i = 0; i < innerloopcount; i++) { - parallel_init(threads); - for (int pt = 0; pt < threads; pt++) { - (worker_data + pt)->func = f; - (worker_data + pt)->arg1 = dstbuf + size * pt / sizeof(int64_t); - (worker_data + pt)->arg2 = srcbuf + size * pt / sizeof(int64_t); - (worker_data + pt)->arg3 = size; - } - t1 = gettime(); - parallel_run(); - for (int pt = 0; pt < threads; pt++) - pthread_join(p_worker[pt], NULL); - t2 = gettime(); - t += t2 - t1; - } + for (i = 0; i < innerloopcount; i++) + t += bw_run_once(pool, f, dstbuf, srcbuf, size); innerloopcount *= 2; } while (t < 0.5); @@ -306,13 +359,16 @@ void bench_run_full(bench_results_t *out, bench_progress_fn progress, void *user int64_t *srcbuf, *dstbuf; void *poolbuf = alloc_nonaliased_buffers((void **)&srcbuf, size * threads, (void **)&dstbuf, size * threads, NULL, 0); + bw_pool_t bw; + bw_pool_init(&bw, threads); STEP("CPU copy", 0.40f); - out->cpu_copy = bandwidth_bench_helper(threads, dstbuf, srcbuf, size, aligned_block_copy); + out->cpu_copy = bandwidth_bench_helper(&bw, threads, dstbuf, srcbuf, size, aligned_block_copy); STEP("CPU read", 0.55f); - out->cpu_read = bandwidth_bench_helper(threads, dstbuf, srcbuf, size, aligned_block_fetch); + out->cpu_read = bandwidth_bench_helper(&bw, threads, dstbuf, srcbuf, size, aligned_block_fetch); STEP("CPU write", 0.70f); - out->cpu_write = bandwidth_bench_helper(threads, dstbuf, srcbuf, size, aligned_block_fill); + out->cpu_write = bandwidth_bench_helper(&bw, threads, dstbuf, srcbuf, size, aligned_block_fill); + bw_pool_free(&bw); free(poolbuf); STEP("Latency", 0.85f); @@ -325,9 +381,10 @@ void bench_run_full(bench_results_t *out, bench_progress_fn progress, void *user struct bench_ctx { int phase; bool is_4gb; - void *pool; + void *buf; int64_t *src; int64_t *dst; + bw_pool_t bw; }; bench_ctx *bench_begin(void) { @@ -335,7 +392,8 @@ bench_ctx *bench_begin(void) { if (!c) return NULL; c->is_4gb = (appletGetAppletType() == AppletType_Application); - c->pool = alloc_nonaliased_buffers((void **)&c->src, SIZE * 3, (void **)&c->dst, SIZE * 3, NULL, 0); + c->buf = alloc_nonaliased_buffers((void **)&c->src, SIZE * 3, (void **)&c->dst, SIZE * 3, NULL, 0); + bw_pool_init(&c->bw, 3); return c; } @@ -349,24 +407,25 @@ bool bench_step(bench_ctx *c, bench_results_t *out, const char **label, float *f *frac = 0.25f; break; case 1: - out->cpu_copy = bandwidth_bench_helper(threads, c->dst, c->src, size, aligned_block_copy); + out->cpu_copy = bandwidth_bench_helper(&c->bw, threads, c->dst, c->src, size, aligned_block_copy); *label = "CPU copy"; *frac = 0.45f; break; case 2: - out->cpu_read = bandwidth_bench_helper(threads, c->dst, c->src, size, aligned_block_fetch); + out->cpu_read = bandwidth_bench_helper(&c->bw, threads, c->dst, c->src, size, aligned_block_fetch); *label = "CPU read"; *frac = 0.60f; break; case 3: - out->cpu_write = bandwidth_bench_helper(threads, c->dst, c->src, size, aligned_block_fill); + out->cpu_write = bandwidth_bench_helper(&c->bw, threads, c->dst, c->src, size, aligned_block_fill); *label = "CPU write"; *frac = 0.75f; break; case 4: - if (c->pool) { - free(c->pool); - c->pool = NULL; + bw_pool_free(&c->bw); + if (c->buf) { + free(c->buf); + c->buf = NULL; } latency_bench(&out->l2_ns, &out->ram_ns); *label = "Latency"; @@ -384,7 +443,8 @@ bool bench_step(bench_ctx *c, bench_results_t *out, const char **label, float *f void bench_end(bench_ctx *c) { if (!c) return; - if (c->pool) - free(c->pool); + bw_pool_free(&c->bw); + if (c->buf) + free(c->buf); free(c); -} +} \ No newline at end of file From 7e67859c84d0ee20a070d38e4e47630b00f7e0a8 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 21 Aug 2026 12:40:19 -0400 Subject: [PATCH 061/205] remove retro remake dispay support and more ui cohesion --- .../common/include/hocclk/clock_manager.h | 3 +-- .../hoc-clk/overlay/src/ui/gui/about_gui.cpp | 10 -------- .../overlay/src/ui/gui/app_profile_gui.cpp | 4 ++-- .../overlay/src/ui/gui/base_menu_gui.cpp | 2 +- .../src/ui/gui/config_info_strings.cpp | 1 + .../src/ui/gui/global_override_gui.cpp | 4 ++-- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 24 +++++++++---------- Source/hoc-clk/sysmodule/src/board/board.cpp | 6 +---- Source/hoc-clk/sysmodule/src/board/board.hpp | 1 - .../sysmodule/src/hos/integrations.cpp | 5 ---- .../sysmodule/src/hos/integrations.hpp | 2 +- .../sysmodule/src/mgr/clock_manager.cpp | 1 - 12 files changed, 20 insertions(+), 43 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 83079c48..21e47646 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -70,7 +70,6 @@ typedef struct { GpuSchedulingMode gpuSchedulingMode; bool isSysDockInstalled; bool isSaltyNXInstalled; - bool isUsingRetroSuper; u8 maxDisplayFreq; u8 dramID; bool isDram8GB; @@ -84,7 +83,7 @@ typedef struct { bool isKipLoaded; bool rebootRequired; bool isFirstLoad; - + // Reserved for future use u8 reserved[0x358]; } HocClkContext; diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 2960e7b9..2febf53f 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -31,7 +31,6 @@ tsl::elm::ListItem* IddqItem = NULL; tsl::elm::ListItem* DramModule = NULL; tsl::elm::ListItem* sysdockStatusItem = NULL; tsl::elm::ListItem* saltyNXStatusItem = NULL; -tsl::elm::ListItem* RETROStatusItem = NULL; tsl::elm::ListItem* waferCordsItem = NULL; tsl::elm::ListItem* ramVoltItem = NULL; tsl::elm::ListItem* eristaPLLXItem = NULL; @@ -141,12 +140,6 @@ void AboutGui::listUI() new tsl::elm::ListItem("Wafer Position:"); this->listElement->addItem(waferCordsItem); - if(IsHoag()) { - RETROStatusItem = - new tsl::elm::ListItem("RR Display status:"); - this->listElement->addItem(RETROStatusItem); - } - this->listElement->addItem( new tsl::elm::CategoryHeader("Software Info") ); @@ -224,9 +217,6 @@ void AboutGui::refresh() saltyNXStatusItem->setValue(this->context->isSaltyNXInstalled ? "Installed" : "Not Installed"); - if(IsHoag()) - RETROStatusItem->setValue(this->context->isUsingRetroSuper ? "Installed" : "Not Installed"); - sprintf(strings[2], "X: %d Y: %d", this->context->waferX, this->context->waferY); waferCordsItem->setValue(strings[2]); diff --git a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp index 645720c0..9781b3ee 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp @@ -309,7 +309,7 @@ public: static constexpr struct { const char* label; int shift; } kAll[] = { {"CPU", 0}, {"GPU", 8}, {"VRR", 16} }; - int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] || this->context->isUsingRetroSuper || this->context->profile == HocClkProfile_Docked ? 3 : 2; + int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] && profile != HocClkProfile_Docked ? 3 : 2; for (int i = 0; i < count; i++) { u8 cur = (this->profileList->mhzMap[this->profile][HocClkModule_Governor] >> kAll[i].shift) & 0xFF; @@ -367,7 +367,7 @@ void AppProfileGui::addProfileUI(HocClkProfile profile) if(configList.values[HocClkConfigValue_OverwriteRefreshRate]) { if(profile != HocClkProfile_Docked) { - this->addModuleListItemValue(profile, HocClkModule_Display, "Display", IsAula() ? 45 : 40, configList.values[HocClkConfigValue_MaxDisplayClockH], this->context->isUsingRetroSuper ? 5 : 1, " Hz", 1, 0, lcdThresholds); + this->addModuleListItemValue(profile, HocClkModule_Display, "Display", IsAula() ? 45 : 40, configList.values[HocClkConfigValue_MaxDisplayClockH], 1, " Hz", 1, 0, lcdThresholds); } else { if(IsAula() && this->context->isSysDockInstalled) { std::vector dockedFreqs = { diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp index 593ad1a4..106bf7f6 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp @@ -61,7 +61,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer *renderer) { // All constants pre-calculated and cached const char *labels[] = { "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", - "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() || this->context->isUsingRetroSuper ? "OLED" : "LCD", + "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() ? "OLED" : "LCD", "FPS", "RES" }; static constexpr u32 dataPositions[6] = { 63 - 3 + 3, 200 - 1, 344 - 1 - 3, 200 - 1, 342 - 1, 321 - 1 }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 5fa73752..543af644 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -45,6 +45,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Options:", "- VDD2 - Display VDD2 voltage", "- VDDQ - Display VDDQ voltage", + "- VDD2/VDDQ - Display both voltages, but without decimal place", "Default: VDD2" }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp index 3c16758b..6bf7ae20 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp @@ -320,7 +320,7 @@ public: static constexpr struct { const char* label; int shift; } kAll[] = { {"CPU", 0}, {"GPU", 8}, {"VRR", 16} }; - int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] || this->context->isUsingRetroSuper ? 3 : 2; + int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] && this->context->profile != HocClkProfile_Docked ? 3 : 2; for (int i = 0; i < count; i++) { u8 cur = (this->packed >> kAll[i].shift) & 0xFF; @@ -375,7 +375,7 @@ void GlobalOverrideGui::listUI() #if IS_MINIMAL == 0 ValueThresholds lcdThresholds(60, 65); if(configList.values[HocClkConfigValue_OverwriteRefreshRate]) - this->addModuleListItemValue(HocClkModule_Display, "Display", IsAula() ? 45 : 40, configList.values[HocClkConfigValue_MaxDisplayClockH], this->context->isUsingRetroSuper ? 5 : 1, " Hz", 1, 0, lcdThresholds); + this->addModuleListItemValue(HocClkModule_Display, "Display", IsAula() ? 45 : 40, configList.values[HocClkConfigValue_MaxDisplayClockH], 1, " Hz", 1, 0, lcdThresholds); #endif this->addGovernorSection(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 936c9423..ed2326e1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1048,20 +1048,18 @@ class DisplaySubMenuGui : public MiscGui { this->listElement->addItem(new CompactCategoryHeader("Display Settings")); addConfigToggle(HocClkConfigValue_OverwriteRefreshRate, nullptr); - if (!this->context->isUsingRetroSuper) { - tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { - renderer->drawString("\uE150 Usage of unsafe display", false, x + 20, y + 30, 18, tsl::style::color::ColorText); - renderer->drawString("refresh rates may cause stress", false, x + 20, y + 50, 18, tsl::style::color::ColorText); - renderer->drawString("or damage to your display! ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); - renderer->drawString("Proceed at your own risk!", false, x + 20, y + 90, 18, tsl::style::color::ColorText); - }); + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + renderer->drawString("\uE150 Usage of unsafe display", false, x + 20, y + 30, 18, tsl::style::color::ColorText); + renderer->drawString("refresh rates may cause stress", false, x + 20, y + 50, 18, tsl::style::color::ColorText); + renderer->drawString("or damage to your display! ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); + renderer->drawString("Proceed at your own risk!", false, x + 20, y + 90, 18, tsl::style::color::ColorText); + }); - warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); - this->listElement->addItem(warningText); - ValueThresholds displayThresholds(60, 65); - addConfigButton(HocClkConfigValue_MaxDisplayClockH, "Max Handheld Display Hz", ValueRange(60, IsAula() ? 65 : 75, 1, " Hz", 1), - "Display Clock", &displayThresholds, {}, {}, false); - } + warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); + this->listElement->addItem(warningText); + ValueThresholds displayThresholds(60, 65); + addConfigButton(HocClkConfigValue_MaxDisplayClockH, "Max Handheld Display Hz", ValueRange(60, IsAula() ? 65 : 75, 1, " Hz", 1), + "Display Clock", &displayThresholds, {}, {}, false); if (!IsAula()) { tsl::elm::CustomDrawer *warningTextDV = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Adjust the display voltage", false, x + 20, y + 30, 18, tsl::style::color::ColorText); diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index bc79045d..8923374a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -193,7 +193,7 @@ namespace board { display::DisplayRefreshConfig cfg = { .clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr, .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), - .isRetroSUPER = integrations::GetRETROSuperStatus() }; + .isRetroSUPER = false }; display::Initialize(&cfg); CacheDfllData(); @@ -270,8 +270,4 @@ namespace board { return speedoBracket; } - bool IsUsingRetroSuperDisplay() { - return false; /* stub for now. */ - } - } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 453d5fa0..0a50622b 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -58,6 +58,5 @@ namespace board { bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); - bool IsUsingRetroSuperDisplay(); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index 88dade23..e566c3d0 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -88,11 +88,6 @@ namespace integrations { return stat("sdmc:/atmosphere/contents/0000000000534C56/flags/boot2.flag", &st) == 0; } - bool GetRETROSuperStatus() { - struct stat st = { 0 }; - return stat("sdmc:/config/horizon-oc/retro.flag", &st) == 0; // TODO: unhardcode this - } - void LoadSaltyNX() { if (!CheckSaltyNXPort()) return; diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp index fe5a8c0f..1e808c85 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp @@ -61,7 +61,7 @@ namespace integrations { bool GetSysDockState(); bool GetSaltyNXState(); - bool GetRETROSuperStatus(); + void LoadSaltyNX(); u8 GetSaltyNXFPS(); u16 GetSaltyNXResolutionHeight(); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 15bb3f82..c035c11e 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -830,7 +830,6 @@ namespace clockManager { integrations::LoadSaltyNX(); } - gContext.isUsingRetroSuper = integrations::GetRETROSuperStatus(); governor::startThreads(); } From 90efad8dde804a8294e3b3538429d2fe116f88a1 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 21 Aug 2026 12:42:45 -0400 Subject: [PATCH 062/205] erista dvb overlay changes --- .../src/ui/gui/config_info_strings.cpp | 24 ++++++++++++------- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 13 ++++++---- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 543af644..ea290e95 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -189,15 +189,21 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, }; case KipConfigValue_emcDvbShift: - return { - "Each level adds/removes 25mV from the SOC Voltage table", - "Consoles are bracketed by SoC Speedo. The brackets are as follows:", - " - Speedo 1487-1598: Bracket 0", - " - Speedo 1598-1709: Bracket 1", - " - Speedo 1709-1820: Bracket 2", - "Default: 0" - }; - + if(isMariko) { + return { + "Each level adds/removes 25mV from the SOC Voltage table", + "Consoles are bracketed by SoC Speedo. The brackets are as follows:", + " - Speedo 1487-1598: Bracket 0", + " - Speedo 1598-1709: Bracket 1", + " - Speedo 1709-1820: Bracket 2", + "Default: 0" + }; + } else { + return { + "Each level adds 25mV from the SOC Voltage table", + "Default: 0" + }; + } case KipConfigValue_marikoSocVmax: return { "The maximum available SOC Voltage that the DVB-adjusted table can use", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index ed2326e1..78af64d4 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1141,10 +1141,15 @@ class RamSubmenuGui : public MiscGui { std::vector noNamedValues = {}; this->listElement->addItem(new CompactCategoryHeader("RAM Settings")); - - addMappedConfigTrackbar(KipConfigValue_emcDvbShift, "DVB Shift", - { 0xFFFFFFFCu, 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u }, - { "-4", "-3", "-2", "-1", " 0", "1", "2", "3", "4", "5", "6", "7", "8" }); + if(IsMariko()) { + addMappedConfigTrackbar(KipConfigValue_emcDvbShift, "DVB Shift", + { 0xFFFFFFFCu, 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u }, + { "-4", "-3", "-2", "-1", "0", "1", "2", "3", "4", "5", "6", "7", "8" }); + } else { + addMappedConfigTrackbar(KipConfigValue_emcDvbShift, "DVB Shift", + { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u }, + { "0", "1", "2", "3", "4", "5", "6", "7", "8" }); + } if (IsMariko()) { u32 socSpeedo = this->context->speedos[HocClkSpeedo_SOC]; From 160e2483a6194c1e5e7622beac35c082e19ef2ac Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 21 Aug 2026 15:11:01 -0400 Subject: [PATCH 063/205] 1574mhz gpu + 995mV vmax refer to 2805mhz commit to reasoning --- .../stratosphere/loader/source/oc/customize.cpp | 17 ++++++++++------- .../stratosphere/loader/source/oc/customize.hpp | 4 ++-- .../stratosphere/loader/source/oc/pcv/pcv.cpp | 4 ++-- Source/hoc-clk/common/include/hocclk/config.h | 3 +++ Source/hoc-clk/overlay/src/ui/gui/labels.cpp | 6 +++--- Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 14 ++++++++++---- Source/hoc-clk/sysmodule/src/file/kip.cpp | 9 +++++---- Source/hoc-clk/sysmodule/src/file/kip.hpp | 10 ++++++---- 8 files changed, 41 insertions(+), 26 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 3f8b2214..dc0a21b5 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -182,6 +182,7 @@ volatile CustomizeTable C = { DEACTIVATED_GPU_FREQ /* 1459 (Disabled by default) */, DEACTIVATED_GPU_FREQ /* 1497 (Disabled by default) */, DEACTIVATED_GPU_FREQ /* 1536 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1574 (Disabled by default) */, }, /* Override soc voltage brackets. */ @@ -586,13 +587,14 @@ volatile CustomizeTable C = { { 1152000, { }, { 1180029, -14534, -830, 0, 1469, 110 } }, { 1228800, { }, { 1238293, -16383, -859, 0, 3722, 313 } }, { 1267200, { }, { 1276399, -17475, -867, 0, 3681, 559 } }, - { 1305600, { }, { } }, - { 1344000, { }, { } }, - { 1382400, { }, { } }, - { 1420800, { }, { } }, - { 1459200, { }, { } }, - { 1497600, { }, { } }, - { 1536000, { }, { } }, + { 1305600, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1344000, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1382400, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1420800, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1459200, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1497600, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1536000, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1574400, { }, { 0, 0, 0, 0, 0, 0 } }, }, .marikoGpuDvfsTableHighUV = { @@ -620,6 +622,7 @@ volatile CustomizeTable C = { { 1459200, { }, { 0, 0, 0, 0, 0, 0 } }, { 1497600, { }, { 0, 0, 0, 0, 0, 0 } }, { 1536000, { }, { 0, 0, 0, 0, 0, 0 } }, + { 1574400, { }, { 0, 0, 0, 0, 0, 0 } }, }, }; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index 2e8be644..c34cfbcb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -126,7 +126,7 @@ struct CustomizeTable { s32 commonGpuVoltOffset; u32 eristaGpuVoltArray[27]; - u32 marikoGpuVoltArray[24]; + u32 marikoGpuVoltArray[25]; s32 marikoSocVoltArray[28]; u32 fineTune_t6_tRTW; @@ -134,7 +134,7 @@ struct CustomizeTable { u32 pcvLogVerbosity; - u32 reserved[58]; + u32 reserved[57]; CustomizeCpuDvfsTable eristaCpuDvfsTable; CustomizeCpuDvfsTable eristaCpuDvfsTableSLT; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index 7552fb99..bd35f3bd 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -159,8 +159,8 @@ namespace ams::ldr::hoc::pcv { { C.marikoEmcVddqVolt, 400'000, 750'000, panic::Emc, }, { C.marikoSocVmax, 1000, 1200, panic::Emc, }, { eristaGpuDvfsMaxFreq, 768'000, 1152'000, panic::Gpu, }, - { marikoGpuDvfsMaxFreq, 768'000, 1536'000, panic::Gpu, }, - { C.marikoGpuVmax, 800, 960, panic::Gpu, }, + { marikoGpuDvfsMaxFreq, 768'000, 1574'400, panic::Gpu, }, + { C.marikoGpuVmax, 800, 995, panic::Gpu, }, /* Official GPU vMax is 1050mV */ }; for (auto &v : validators) { diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 0e6868c5..c9262f81 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -167,6 +167,7 @@ typedef enum { KipConfigValue_g_volt_1459200, KipConfigValue_g_volt_1497600, KipConfigValue_g_volt_1536000, + KipConfigValue_g_volt_1574400, KipConfigValue_g_volt_e_76800, KipConfigValue_g_volt_e_115200, @@ -483,6 +484,7 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_g_volt_1459200: return pretty ? "Mariko GPU Volt 1459 MHz" : "g_volt_1459200"; case KipConfigValue_g_volt_1497600: return pretty ? "Mariko GPU Volt 1497 MHz" : "g_volt_1497600"; case KipConfigValue_g_volt_1536000: return pretty ? "Mariko GPU Volt 1536 MHz" : "g_volt_1536000"; + case KipConfigValue_g_volt_1574400: return pretty ? "Mariko GPU Volt 1574 MHz" : "g_volt_1574400"; // Erista GPU voltages (27) case KipConfigValue_g_volt_e_76800: return pretty ? "Erista GPU Volt 76 MHz" : "g_volt_e_76800"; @@ -712,6 +714,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_g_volt_1459200: case KipConfigValue_g_volt_1497600: case KipConfigValue_g_volt_1536000: + case KipConfigValue_g_volt_1574400: case KipConfigValue_g_volt_e_76800: case KipConfigValue_g_volt_e_115200: case KipConfigValue_g_volt_e_153600: diff --git a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp index 8beaac19..cd83e4a9 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp @@ -59,19 +59,19 @@ std::map gpu_freq_label_m = { std::map gpu_freq_label_m_slt = { { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, { 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, - { 1075200000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, + { 1075200000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1574400000, "Absolute Max" }, }; std::map gpu_freq_label_m_hiopt = { { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, { 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, - { 1152000000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, + { 1152000000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1574400000, "Absolute Max" }, }; std::map gpu_freq_label_m_highuv = { { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 384000000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, - { 1228800000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, + { 1228800000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1574400000, "Absolute Max" }, }; std::map *marikoUV[5]{ diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 78af64d4..12091974 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2558,7 +2558,7 @@ class GpuSubmenuGui : public MiscGui { false, true); ValueThresholds MgpuVmaxThresholds(805, 850); if(IsMariko()) { - addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 960, 5, "mV", 1), "GPU Maximum Voltage", + addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 995, 5, "mV", 1), "GPU Maximum Voltage", &MgpuVmaxThresholds, {}, {}, false, true); } } @@ -2665,7 +2665,7 @@ class GpuCustomTableSubmenuGui : public MiscGui { this->listElement->addItem(new CompactCategoryHeader("GPU Custom Table (mV)")); - ValueThresholds MgpuVmaxThresholds(800, 850); + ValueThresholds MgpuVmaxThresholds(825, 900); ValueThresholds EgpuVmaxThresholds(950, 975); std::vector mGpuVolts = { @@ -2688,7 +2688,9 @@ class GpuCustomTableSubmenuGui : public MiscGui { NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), - NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), + NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), + NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), NamedValue("990mV", 990), + NamedValue("995mV", 995), }; std::vector eGpuVolts = { @@ -2728,7 +2730,8 @@ class GpuCustomTableSubmenuGui : public MiscGui { NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), NamedValue("945mV", 945), - NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), + NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), NamedValue("970mV", 970), + NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), NamedValue("990mV", 990), NamedValue("995mV", 995), }; std::vector eGpuVolts_noAuto = { @@ -2810,6 +2813,9 @@ class GpuCustomTableSubmenuGui : public MiscGui { &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); addGpuFreqVoltageButton(KipConfigValue_g_volt_1536000, "1536.0MHz", 1'536'000'000, ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); + addGpuFreqVoltageButton(KipConfigValue_g_volt_1574400, "1574.4MHz", 1'574'400'000, ValueRange(0, 0, 0, "0", 1), "Voltage", + &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); + } } } else { diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 45aa22bd..bb6169cf 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -131,7 +131,7 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, config::GetConfigValue(KipConfigValue_commonGpuVoltOffset)); - for (int i = 0; i < 24; i++) { + for (int i = 0; i < 25; i++) { table.marikoGpuVoltArray[i] = config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_76800 + i)); } @@ -315,7 +315,7 @@ namespace kip { configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table); configValues.values[KipConfigValue_commonGpuVoltOffset] = cust_get_common_gpu_offset(&table); - for (int i = 0; i < 24; i++) { + for (int i = 0; i < 25; i++) { configValues.values[KipConfigValue_g_volt_76800 + i] = cust_get_mariko_gpu_volt(&table, i); } @@ -369,10 +369,11 @@ namespace kip { config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit"); config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l"); } - config::SetConfigValues(&configValues, true); if(previousVersion < 300 && version >= 300) { - + configValues.values[KipConfigValue_g_volt_1574400] = 2000; } + config::SetConfigValues(&configValues, true); + } } // namespace kip diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 75f802dd..5c022144 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -94,7 +94,7 @@ namespace kip { u32 commonGpuVoltOffset; u32 eristaGpuVoltArray[27]; - u32 marikoGpuVoltArray[24]; + u32 marikoGpuVoltArray[25]; s32 marikoSocVoltArray[28]; u32 t6_tRTW_fine_tune; @@ -102,7 +102,7 @@ namespace kip { u32 pcvLogVerbosity; - u32 reserved[58]; + u32 reserved[57]; } CustomizeTable; #define CUST_MAGIC "CUST" @@ -395,7 +395,7 @@ namespace kip { } static inline bool cust_set_mariko_gpu_volt(const char *p, int idx, u32 v) { - if (idx < 0 || idx >= 24) + if (idx < 0 || idx >= 25) return false; CustomizeTable t; if (!cust_read_table(p, &t)) @@ -607,7 +607,7 @@ namespace kip { } static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable *t, int idx) { - if (!t || idx < 0 || idx >= 24) + if (!t || idx < 0 || idx >= 25) return 0; return t->marikoGpuVoltArray[idx]; } @@ -685,6 +685,7 @@ namespace kip { DECL_MARIKO_GPU_VOLT_HELPER(1459200, 21) DECL_MARIKO_GPU_VOLT_HELPER(1497600, 22) DECL_MARIKO_GPU_VOLT_HELPER(1536000, 23) + DECL_MARIKO_GPU_VOLT_HELPER(1574400, 24) DECL_MARIKO_SOC_VOLT_HELPER(1866000, 0) DECL_MARIKO_SOC_VOLT_HELPER(2000000, 1) @@ -790,6 +791,7 @@ namespace kip { DECL_MARIKO_GPU_VOLT_GET(1459200, 21) DECL_MARIKO_GPU_VOLT_GET(1497600, 22) DECL_MARIKO_GPU_VOLT_GET(1536000, 23) + DECL_MARIKO_GPU_VOLT_GET(1574400, 24) DECL_MARIKO_SOC_VOLT_GET(1866000, 0) DECL_MARIKO_SOC_VOLT_GET(2000000, 1) From c5fcc6c051359655e0c59e6b84044485318adad7 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 21 Aug 2026 23:52:56 +0200 Subject: [PATCH 064/205] pcv/erista: improve timings (rdv & qpop) --- .../loader/source/oc/mtc_timing_value.hpp | 28 +++++++++++-- .../pcv/erista/calculate_timings_erista.cpp | 15 ++++++- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 40 +++++++++---------- .../pcv/mariko/calculate_timings_mariko.cpp | 2 +- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 10 ++++- 5 files changed, 67 insertions(+), 28 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 53abc922..15eaea19 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -60,10 +60,7 @@ namespace ams::ldr::hoc { /* Write recovery time. */ const u32 tWR = 18; - /* TODO: Add comments (lazy) */ - const double chip_delay = 1.109; /* ns. */ - const double round_trip_delay = 0.5; /* ns. */ - const double fly_by_time = chip_delay + round_trip_delay; + const double roundTripDelay = 0.5; /* ns. */ namespace pcv::erista { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; @@ -96,6 +93,16 @@ namespace ams::ldr::hoc { inline u32 tR2W; inline u32 rext; + inline u32 rdv; + inline u32 qpop; + inline u32 quse_width; + inline u32 quse; + inline u32 einput_duration; + inline u32 einput; + inline u32 qrst; + inline u32 ibdly; + inline u32 qsafe; + inline u32 tW2P; inline u32 tWTPDEN; inline u32 tW2R; @@ -113,6 +120,12 @@ namespace ams::ldr::hoc { inline double pdex2mrr; inline u8 mrw2; + + namespace { + double chipDelay = 1.165; /* Guessed. */ + } + + const double flyByTime = chipDelay + roundTripDelay; } namespace pcv::mariko { @@ -176,6 +189,13 @@ namespace ams::ldr::hoc { inline u32 pdex2mrr; inline u8 mrw2; + + /* TODO: Add comments (lazy) */ + namespace { + const double chipDelay = 1.109; /* ns. */ + } + + const double flyByTime = chipDelay + roundTripDelay; } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index a07982aa..0d5c8900 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -95,7 +95,7 @@ namespace ams::ldr::hoc::pcv::erista { u32 wlIndex = 0; for (u32 i = 0; i < std::size(rlMapDBI); ++i) { - if (rlMapDBI[i] == 32) { + if (rlMapDBI[i] == RL) { rlIndex = i; break; } @@ -122,6 +122,19 @@ namespace ams::ldr::hoc::pcv::erista { tR2P = CEIL((RL * 0.426) - 2.0); tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; + rdv = RL + 19 + CEIL((flyByTime + tDQSCK_max) / tCK_avg); + qpop = rdv - 16; + + quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); + quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); + einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; + einput = quse - CEIL(9.928 / tCK_avg); + u32 qrst_duration = FLOOR(8.399 - tCK_avg); + u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); + qrst = PACK_U32(qrst_duration, qrstLow); + ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); + qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); + tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); const s32 wlToRl = static_cast(WL) - static_cast(RL); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index 452dfd4b..362c31a5 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -112,37 +112,37 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.05)); - WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(14.0)); + WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(1.75)); /* todo verify. guessed. */ WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); /* Accept imperfection or prepare for suffering. */ // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) - // WRITE_PARAM_ALL_REG(table, emc_einput, einput); - // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); + WRITE_PARAM_ALL_REG(table, emc_einput, einput); + WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); - // WRITE_PARAM_ALL_REG(table, emc_ibdly, ibdly); - // WRITE_PARAM_ALL_REG(table, emc_wdv_mask, wdv); - // WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); - // WRITE_PARAM_ALL_REG(table, emc_quse, quse); + WRITE_PARAM_ALL_REG(table, emc_ibdly, ibdly); + WRITE_PARAM_ALL_REG(table, emc_wdv_mask, wdv); + WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); + WRITE_PARAM_ALL_REG(table, emc_quse, quse); WRITE_PARAM_ALL_REG(table, emc_wdv, wdv); WRITE_PARAM_ALL_REG(table, emc_wsv, wsv); WRITE_PARAM_ALL_REG(table, emc_wev, wev); - // WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); - // WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); - // WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); - // WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); - // WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); - // WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); - // WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); - // WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); - // WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); - // WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); - // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); - // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); + WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); + WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); + WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); + WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); + WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); + WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); + WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); + WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); + WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); + WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); + WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); + WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); - // table->dram_timings.rl = RL; + table->dram_timings.rl = RL; // #endif constexpr double MC_ARB_DIV = 4.0; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 65387c9c..ef09d423 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -165,7 +165,7 @@ namespace ams::ldr::hoc::pcv::mariko { tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); /* Read data valid: Read command -> data ready to be latched into the registers. */ - rdv = RL + 16 + CEIL((fly_by_time + tDQSCK_max) / tCK_avg); + rdv = RL + 16 + CEIL((flyByTime + tDQSCK_max) / tCK_avg); /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ qpop = rdv - 14; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 12091974..3a5682fc 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1252,6 +1252,11 @@ class RamSubmenuGui : public MiscGui { NamedValue("2361 MHz", 2361600), NamedValue("2380 MHz", 2380800), NamedValue("2400 MHz", 2400000, "JEDEC."), + NamedValue("2419 MHz", 2419200), + NamedValue("2438 MHz", 2438400), + NamedValue("2457 MHz", 2457600), + NamedValue("2476 MHz", 2476800), + NamedValue("2496 MHz", 2496000), }; } else { emcMaxClock = { @@ -1880,7 +1885,8 @@ class RamLatenciesSubmenuGui : public MiscGui { kFreqOptions = { 1633000, 1666000, 1700000, 1733000, 1800000, 1833000, 1862400, 1881600, 1900800, 1920000, 1939200, 1958400, 1977600, 1996800, 2016000, 2035200, 2054400, 2073600, 2092800, 2112000, 2131200, 2150400, 2169600, 2188800, - 2208000, 2227200, 2246400, 2265600, 2284800, 2304000, 2323200, 2342400, 2361600, 2380800, 2400000, + 2208000, 2227200, 2246400, 2265600, 2284800, 2304000, 2323200, 2342400, 2361600, 2380800, 2400000, 2419200, + 2438400, 2457600, 2476800, 2496000, }; } @@ -2730,7 +2736,7 @@ class GpuCustomTableSubmenuGui : public MiscGui { NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), NamedValue("945mV", 945), - NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), NamedValue("970mV", 970), + NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), NamedValue("990mV", 990), NamedValue("995mV", 995), }; From 7fea98a72def19a255c8dc5803b9699cb01bef4e Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 24 Aug 2026 23:25:50 +0200 Subject: [PATCH 065/205] Exos: add exception vectors and flow controller access patches --- ..._define_exception_vectors_access_table.inc | 25 + ...on_define_flow_controller_access_table.inc | 25 + ...on_exception_vectors_access_table_data.inc | 1040 +++++++++++++++++ ...cmon_flow_controller_access_table_data.inc | 1040 +++++++++++++++++ .../secmon_smc_register_access.cpp | 16 +- build.sh | 18 +- 6 files changed, 2151 insertions(+), 13 deletions(-) create mode 100644 Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc create mode 100644 Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc create mode 100644 Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc create mode 100644 Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc diff --git a/Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc b/Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc new file mode 100644 index 00000000..2c06ea01 --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc @@ -0,0 +1,25 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define __ACCESS_TABLE_NAME__ ExceptionVectorsAccessTable +#define __ACCESS_TABLE_ADDRESS__ MemoryRegionPhysicalDeviceExceptionVectors.GetAddress() +#define __ACCESS_TABLE_INC__ "secmon_exception_vectors_access_table_data.inc" + +#include "secmon_define_access_table.inc" + +#undef __ACCESS_TABLE_INC__ +#undef __ACCESS_TABLE_ADDRESS__ +#undef __ACCESS_TABLE_NAME__ diff --git a/Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc b/Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc new file mode 100644 index 00000000..99589e76 --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc @@ -0,0 +1,25 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define __ACCESS_TABLE_NAME__ FlowControllerAccessTable +#define __ACCESS_TABLE_ADDRESS__ MemoryRegionPhysicalDeviceFlowController.GetAddress() +#define __ACCESS_TABLE_INC__ "secmon_flow_controller_access_table_data.inc" + +#include "secmon_define_access_table.inc" + +#undef __ACCESS_TABLE_INC__ +#undef __ACCESS_TABLE_ADDRESS__ +#undef __ACCESS_TABLE_NAME__ diff --git a/Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc b/Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc new file mode 100644 index 00000000..a3718c5e --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc @@ -0,0 +1,1040 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +SetRegisterAllowed(0x0); +SetRegisterAllowed(0x4); +SetRegisterAllowed(0x8); +SetRegisterAllowed(0xC); +SetRegisterAllowed(0x10); +SetRegisterAllowed(0x14); +SetRegisterAllowed(0x18); +SetRegisterAllowed(0x1C); +SetRegisterAllowed(0x20); +SetRegisterAllowed(0x24); +SetRegisterAllowed(0x28); +SetRegisterAllowed(0x2C); +SetRegisterAllowed(0x30); +SetRegisterAllowed(0x34); +SetRegisterAllowed(0x38); +SetRegisterAllowed(0x3C); +SetRegisterAllowed(0x40); +SetRegisterAllowed(0x44); +SetRegisterAllowed(0x48); +SetRegisterAllowed(0x4C); +SetRegisterAllowed(0x50); +SetRegisterAllowed(0x54); +SetRegisterAllowed(0x58); +SetRegisterAllowed(0x5C); +SetRegisterAllowed(0x60); +SetRegisterAllowed(0x64); +SetRegisterAllowed(0x68); +SetRegisterAllowed(0x6C); +SetRegisterAllowed(0x70); +SetRegisterAllowed(0x74); +SetRegisterAllowed(0x78); +SetRegisterAllowed(0x7C); +SetRegisterAllowed(0x80); +SetRegisterAllowed(0x84); +SetRegisterAllowed(0x88); +SetRegisterAllowed(0x8C); +SetRegisterAllowed(0x90); +SetRegisterAllowed(0x94); +SetRegisterAllowed(0x98); +SetRegisterAllowed(0x9C); +SetRegisterAllowed(0xA0); +SetRegisterAllowed(0xA4); +SetRegisterAllowed(0xA8); +SetRegisterAllowed(0xAC); +SetRegisterAllowed(0xB0); +SetRegisterAllowed(0xB4); +SetRegisterAllowed(0xB8); +SetRegisterAllowed(0xBC); +SetRegisterAllowed(0xC0); +SetRegisterAllowed(0xC4); +SetRegisterAllowed(0xC8); +SetRegisterAllowed(0xCC); +SetRegisterAllowed(0xD0); +SetRegisterAllowed(0xD4); +SetRegisterAllowed(0xD8); +SetRegisterAllowed(0xDC); +SetRegisterAllowed(0xE0); +SetRegisterAllowed(0xE4); +SetRegisterAllowed(0xE8); +SetRegisterAllowed(0xEC); +SetRegisterAllowed(0xF0); +SetRegisterAllowed(0xF4); +SetRegisterAllowed(0xF8); +SetRegisterAllowed(0xFC); +SetRegisterAllowed(0x100); +SetRegisterAllowed(0x104); +SetRegisterAllowed(0x108); +SetRegisterAllowed(0x10C); +SetRegisterAllowed(0x110); +SetRegisterAllowed(0x114); +SetRegisterAllowed(0x118); +SetRegisterAllowed(0x11C); +SetRegisterAllowed(0x120); +SetRegisterAllowed(0x124); +SetRegisterAllowed(0x128); +SetRegisterAllowed(0x12C); +SetRegisterAllowed(0x130); +SetRegisterAllowed(0x134); +SetRegisterAllowed(0x138); +SetRegisterAllowed(0x13C); +SetRegisterAllowed(0x140); +SetRegisterAllowed(0x144); +SetRegisterAllowed(0x148); +SetRegisterAllowed(0x14C); +SetRegisterAllowed(0x150); +SetRegisterAllowed(0x154); +SetRegisterAllowed(0x158); +SetRegisterAllowed(0x15C); +SetRegisterAllowed(0x160); +SetRegisterAllowed(0x164); +SetRegisterAllowed(0x168); +SetRegisterAllowed(0x16C); +SetRegisterAllowed(0x170); +SetRegisterAllowed(0x174); +SetRegisterAllowed(0x178); +SetRegisterAllowed(0x17C); +SetRegisterAllowed(0x180); +SetRegisterAllowed(0x184); +SetRegisterAllowed(0x188); +SetRegisterAllowed(0x18C); +SetRegisterAllowed(0x190); +SetRegisterAllowed(0x194); +SetRegisterAllowed(0x198); +SetRegisterAllowed(0x19C); +SetRegisterAllowed(0x1A0); +SetRegisterAllowed(0x1A4); +SetRegisterAllowed(0x1A8); +SetRegisterAllowed(0x1AC); +SetRegisterAllowed(0x1B0); +SetRegisterAllowed(0x1B4); +SetRegisterAllowed(0x1B8); +SetRegisterAllowed(0x1BC); +SetRegisterAllowed(0x1C0); +SetRegisterAllowed(0x1C4); +SetRegisterAllowed(0x1C8); +SetRegisterAllowed(0x1CC); +SetRegisterAllowed(0x1D0); +SetRegisterAllowed(0x1D4); +SetRegisterAllowed(0x1D8); +SetRegisterAllowed(0x1DC); +SetRegisterAllowed(0x1E0); +SetRegisterAllowed(0x1E4); +SetRegisterAllowed(0x1E8); +SetRegisterAllowed(0x1EC); +SetRegisterAllowed(0x1F0); +SetRegisterAllowed(0x1F4); +SetRegisterAllowed(0x1F8); +SetRegisterAllowed(0x1FC); +SetRegisterAllowed(0x200); +SetRegisterAllowed(0x204); +SetRegisterAllowed(0x208); +SetRegisterAllowed(0x20C); +SetRegisterAllowed(0x210); +SetRegisterAllowed(0x214); +SetRegisterAllowed(0x218); +SetRegisterAllowed(0x21C); +SetRegisterAllowed(0x220); +SetRegisterAllowed(0x224); +SetRegisterAllowed(0x228); +SetRegisterAllowed(0x22C); +SetRegisterAllowed(0x230); +SetRegisterAllowed(0x234); +SetRegisterAllowed(0x238); +SetRegisterAllowed(0x23C); +SetRegisterAllowed(0x240); +SetRegisterAllowed(0x244); +SetRegisterAllowed(0x248); +SetRegisterAllowed(0x24C); +SetRegisterAllowed(0x250); +SetRegisterAllowed(0x254); +SetRegisterAllowed(0x258); +SetRegisterAllowed(0x25C); +SetRegisterAllowed(0x260); +SetRegisterAllowed(0x264); +SetRegisterAllowed(0x268); +SetRegisterAllowed(0x26C); +SetRegisterAllowed(0x270); +SetRegisterAllowed(0x274); +SetRegisterAllowed(0x278); +SetRegisterAllowed(0x27C); +SetRegisterAllowed(0x280); +SetRegisterAllowed(0x284); +SetRegisterAllowed(0x288); +SetRegisterAllowed(0x28C); +SetRegisterAllowed(0x290); +SetRegisterAllowed(0x294); +SetRegisterAllowed(0x298); +SetRegisterAllowed(0x29C); +SetRegisterAllowed(0x2A0); +SetRegisterAllowed(0x2A4); +SetRegisterAllowed(0x2A8); +SetRegisterAllowed(0x2AC); +SetRegisterAllowed(0x2B0); +SetRegisterAllowed(0x2B4); +SetRegisterAllowed(0x2B8); +SetRegisterAllowed(0x2BC); +SetRegisterAllowed(0x2C0); +SetRegisterAllowed(0x2C4); +SetRegisterAllowed(0x2C8); +SetRegisterAllowed(0x2CC); +SetRegisterAllowed(0x2D0); +SetRegisterAllowed(0x2D4); +SetRegisterAllowed(0x2D8); +SetRegisterAllowed(0x2DC); +SetRegisterAllowed(0x2E0); +SetRegisterAllowed(0x2E4); +SetRegisterAllowed(0x2E8); +SetRegisterAllowed(0x2EC); +SetRegisterAllowed(0x2F0); +SetRegisterAllowed(0x2F4); +SetRegisterAllowed(0x2F8); +SetRegisterAllowed(0x2FC); +SetRegisterAllowed(0x300); +SetRegisterAllowed(0x304); +SetRegisterAllowed(0x308); +SetRegisterAllowed(0x30C); +SetRegisterAllowed(0x310); +SetRegisterAllowed(0x314); +SetRegisterAllowed(0x318); +SetRegisterAllowed(0x31C); +SetRegisterAllowed(0x320); +SetRegisterAllowed(0x324); +SetRegisterAllowed(0x328); +SetRegisterAllowed(0x32C); +SetRegisterAllowed(0x330); +SetRegisterAllowed(0x334); +SetRegisterAllowed(0x338); +SetRegisterAllowed(0x33C); +SetRegisterAllowed(0x340); +SetRegisterAllowed(0x344); +SetRegisterAllowed(0x348); +SetRegisterAllowed(0x34C); +SetRegisterAllowed(0x350); +SetRegisterAllowed(0x354); +SetRegisterAllowed(0x358); +SetRegisterAllowed(0x35C); +SetRegisterAllowed(0x360); +SetRegisterAllowed(0x364); +SetRegisterAllowed(0x368); +SetRegisterAllowed(0x36C); +SetRegisterAllowed(0x370); +SetRegisterAllowed(0x374); +SetRegisterAllowed(0x378); +SetRegisterAllowed(0x37C); +SetRegisterAllowed(0x380); +SetRegisterAllowed(0x384); +SetRegisterAllowed(0x388); +SetRegisterAllowed(0x38C); +SetRegisterAllowed(0x390); +SetRegisterAllowed(0x394); +SetRegisterAllowed(0x398); +SetRegisterAllowed(0x39C); +SetRegisterAllowed(0x3A0); +SetRegisterAllowed(0x3A4); +SetRegisterAllowed(0x3A8); +SetRegisterAllowed(0x3AC); +SetRegisterAllowed(0x3B0); +SetRegisterAllowed(0x3B4); +SetRegisterAllowed(0x3B8); +SetRegisterAllowed(0x3BC); +SetRegisterAllowed(0x3C0); +SetRegisterAllowed(0x3C4); +SetRegisterAllowed(0x3C8); +SetRegisterAllowed(0x3CC); +SetRegisterAllowed(0x3D0); +SetRegisterAllowed(0x3D4); +SetRegisterAllowed(0x3D8); +SetRegisterAllowed(0x3DC); +SetRegisterAllowed(0x3E0); +SetRegisterAllowed(0x3E4); +SetRegisterAllowed(0x3E8); +SetRegisterAllowed(0x3EC); +SetRegisterAllowed(0x3F0); +SetRegisterAllowed(0x3F4); +SetRegisterAllowed(0x3F8); +SetRegisterAllowed(0x3FC); +SetRegisterAllowed(0x400); +SetRegisterAllowed(0x404); +SetRegisterAllowed(0x408); +SetRegisterAllowed(0x40C); +SetRegisterAllowed(0x410); +SetRegisterAllowed(0x414); +SetRegisterAllowed(0x418); +SetRegisterAllowed(0x41C); +SetRegisterAllowed(0x420); +SetRegisterAllowed(0x424); +SetRegisterAllowed(0x428); +SetRegisterAllowed(0x42C); +SetRegisterAllowed(0x430); +SetRegisterAllowed(0x434); +SetRegisterAllowed(0x438); +SetRegisterAllowed(0x43C); +SetRegisterAllowed(0x440); +SetRegisterAllowed(0x444); +SetRegisterAllowed(0x448); +SetRegisterAllowed(0x44C); +SetRegisterAllowed(0x450); +SetRegisterAllowed(0x454); +SetRegisterAllowed(0x458); +SetRegisterAllowed(0x45C); +SetRegisterAllowed(0x460); +SetRegisterAllowed(0x464); +SetRegisterAllowed(0x468); +SetRegisterAllowed(0x46C); +SetRegisterAllowed(0x470); +SetRegisterAllowed(0x474); +SetRegisterAllowed(0x478); +SetRegisterAllowed(0x47C); +SetRegisterAllowed(0x480); +SetRegisterAllowed(0x484); +SetRegisterAllowed(0x488); +SetRegisterAllowed(0x48C); +SetRegisterAllowed(0x490); +SetRegisterAllowed(0x494); +SetRegisterAllowed(0x498); +SetRegisterAllowed(0x49C); +SetRegisterAllowed(0x4A0); +SetRegisterAllowed(0x4A4); +SetRegisterAllowed(0x4A8); +SetRegisterAllowed(0x4AC); +SetRegisterAllowed(0x4B0); +SetRegisterAllowed(0x4B4); +SetRegisterAllowed(0x4B8); +SetRegisterAllowed(0x4BC); +SetRegisterAllowed(0x4C0); +SetRegisterAllowed(0x4C4); +SetRegisterAllowed(0x4C8); +SetRegisterAllowed(0x4CC); +SetRegisterAllowed(0x4D0); +SetRegisterAllowed(0x4D4); +SetRegisterAllowed(0x4D8); +SetRegisterAllowed(0x4DC); +SetRegisterAllowed(0x4E0); +SetRegisterAllowed(0x4E4); +SetRegisterAllowed(0x4E8); +SetRegisterAllowed(0x4EC); +SetRegisterAllowed(0x4F0); +SetRegisterAllowed(0x4F4); +SetRegisterAllowed(0x4F8); +SetRegisterAllowed(0x4FC); +SetRegisterAllowed(0x500); +SetRegisterAllowed(0x504); +SetRegisterAllowed(0x508); +SetRegisterAllowed(0x50C); +SetRegisterAllowed(0x510); +SetRegisterAllowed(0x514); +SetRegisterAllowed(0x518); +SetRegisterAllowed(0x51C); +SetRegisterAllowed(0x520); +SetRegisterAllowed(0x524); +SetRegisterAllowed(0x528); +SetRegisterAllowed(0x52C); +SetRegisterAllowed(0x530); +SetRegisterAllowed(0x534); +SetRegisterAllowed(0x538); +SetRegisterAllowed(0x53C); +SetRegisterAllowed(0x540); +SetRegisterAllowed(0x544); +SetRegisterAllowed(0x548); +SetRegisterAllowed(0x54C); +SetRegisterAllowed(0x550); +SetRegisterAllowed(0x554); +SetRegisterAllowed(0x558); +SetRegisterAllowed(0x55C); +SetRegisterAllowed(0x560); +SetRegisterAllowed(0x564); +SetRegisterAllowed(0x568); +SetRegisterAllowed(0x56C); +SetRegisterAllowed(0x570); +SetRegisterAllowed(0x574); +SetRegisterAllowed(0x578); +SetRegisterAllowed(0x57C); +SetRegisterAllowed(0x580); +SetRegisterAllowed(0x584); +SetRegisterAllowed(0x588); +SetRegisterAllowed(0x58C); +SetRegisterAllowed(0x590); +SetRegisterAllowed(0x594); +SetRegisterAllowed(0x598); +SetRegisterAllowed(0x59C); +SetRegisterAllowed(0x5A0); +SetRegisterAllowed(0x5A4); +SetRegisterAllowed(0x5A8); +SetRegisterAllowed(0x5AC); +SetRegisterAllowed(0x5B0); +SetRegisterAllowed(0x5B4); +SetRegisterAllowed(0x5B8); +SetRegisterAllowed(0x5BC); +SetRegisterAllowed(0x5C0); +SetRegisterAllowed(0x5C4); +SetRegisterAllowed(0x5C8); +SetRegisterAllowed(0x5CC); +SetRegisterAllowed(0x5D0); +SetRegisterAllowed(0x5D4); +SetRegisterAllowed(0x5D8); +SetRegisterAllowed(0x5DC); +SetRegisterAllowed(0x5E0); +SetRegisterAllowed(0x5E4); +SetRegisterAllowed(0x5E8); +SetRegisterAllowed(0x5EC); +SetRegisterAllowed(0x5F0); +SetRegisterAllowed(0x5F4); +SetRegisterAllowed(0x5F8); +SetRegisterAllowed(0x5FC); +SetRegisterAllowed(0x600); +SetRegisterAllowed(0x604); +SetRegisterAllowed(0x608); +SetRegisterAllowed(0x60C); +SetRegisterAllowed(0x610); +SetRegisterAllowed(0x614); +SetRegisterAllowed(0x618); +SetRegisterAllowed(0x61C); +SetRegisterAllowed(0x620); +SetRegisterAllowed(0x624); +SetRegisterAllowed(0x628); +SetRegisterAllowed(0x62C); +SetRegisterAllowed(0x630); +SetRegisterAllowed(0x634); +SetRegisterAllowed(0x638); +SetRegisterAllowed(0x63C); +SetRegisterAllowed(0x640); +SetRegisterAllowed(0x644); +SetRegisterAllowed(0x648); +SetRegisterAllowed(0x64C); +SetRegisterAllowed(0x650); +SetRegisterAllowed(0x654); +SetRegisterAllowed(0x658); +SetRegisterAllowed(0x65C); +SetRegisterAllowed(0x660); +SetRegisterAllowed(0x664); +SetRegisterAllowed(0x668); +SetRegisterAllowed(0x66C); +SetRegisterAllowed(0x670); +SetRegisterAllowed(0x674); +SetRegisterAllowed(0x678); +SetRegisterAllowed(0x67C); +SetRegisterAllowed(0x680); +SetRegisterAllowed(0x684); +SetRegisterAllowed(0x688); +SetRegisterAllowed(0x68C); +SetRegisterAllowed(0x690); +SetRegisterAllowed(0x694); +SetRegisterAllowed(0x698); +SetRegisterAllowed(0x69C); +SetRegisterAllowed(0x6A0); +SetRegisterAllowed(0x6A4); +SetRegisterAllowed(0x6A8); +SetRegisterAllowed(0x6AC); +SetRegisterAllowed(0x6B0); +SetRegisterAllowed(0x6B4); +SetRegisterAllowed(0x6B8); +SetRegisterAllowed(0x6BC); +SetRegisterAllowed(0x6C0); +SetRegisterAllowed(0x6C4); +SetRegisterAllowed(0x6C8); +SetRegisterAllowed(0x6CC); +SetRegisterAllowed(0x6D0); +SetRegisterAllowed(0x6D4); +SetRegisterAllowed(0x6D8); +SetRegisterAllowed(0x6DC); +SetRegisterAllowed(0x6E0); +SetRegisterAllowed(0x6E4); +SetRegisterAllowed(0x6E8); +SetRegisterAllowed(0x6EC); +SetRegisterAllowed(0x6F0); +SetRegisterAllowed(0x6F4); +SetRegisterAllowed(0x6F8); +SetRegisterAllowed(0x6FC); +SetRegisterAllowed(0x700); +SetRegisterAllowed(0x704); +SetRegisterAllowed(0x708); +SetRegisterAllowed(0x70C); +SetRegisterAllowed(0x710); +SetRegisterAllowed(0x714); +SetRegisterAllowed(0x718); +SetRegisterAllowed(0x71C); +SetRegisterAllowed(0x720); +SetRegisterAllowed(0x724); +SetRegisterAllowed(0x728); +SetRegisterAllowed(0x72C); +SetRegisterAllowed(0x730); +SetRegisterAllowed(0x734); +SetRegisterAllowed(0x738); +SetRegisterAllowed(0x73C); +SetRegisterAllowed(0x740); +SetRegisterAllowed(0x744); +SetRegisterAllowed(0x748); +SetRegisterAllowed(0x74C); +SetRegisterAllowed(0x750); +SetRegisterAllowed(0x754); +SetRegisterAllowed(0x758); +SetRegisterAllowed(0x75C); +SetRegisterAllowed(0x760); +SetRegisterAllowed(0x764); +SetRegisterAllowed(0x768); +SetRegisterAllowed(0x76C); +SetRegisterAllowed(0x770); +SetRegisterAllowed(0x774); +SetRegisterAllowed(0x778); +SetRegisterAllowed(0x77C); +SetRegisterAllowed(0x780); +SetRegisterAllowed(0x784); +SetRegisterAllowed(0x788); +SetRegisterAllowed(0x78C); +SetRegisterAllowed(0x790); +SetRegisterAllowed(0x794); +SetRegisterAllowed(0x798); +SetRegisterAllowed(0x79C); +SetRegisterAllowed(0x7A0); +SetRegisterAllowed(0x7A4); +SetRegisterAllowed(0x7A8); +SetRegisterAllowed(0x7AC); +SetRegisterAllowed(0x7B0); +SetRegisterAllowed(0x7B4); +SetRegisterAllowed(0x7B8); +SetRegisterAllowed(0x7BC); +SetRegisterAllowed(0x7C0); +SetRegisterAllowed(0x7C4); +SetRegisterAllowed(0x7C8); +SetRegisterAllowed(0x7CC); +SetRegisterAllowed(0x7D0); +SetRegisterAllowed(0x7D4); +SetRegisterAllowed(0x7D8); +SetRegisterAllowed(0x7DC); +SetRegisterAllowed(0x7E0); +SetRegisterAllowed(0x7E4); +SetRegisterAllowed(0x7E8); +SetRegisterAllowed(0x7EC); +SetRegisterAllowed(0x7F0); +SetRegisterAllowed(0x7F4); +SetRegisterAllowed(0x7F8); +SetRegisterAllowed(0x7FC); +SetRegisterAllowed(0x800); +SetRegisterAllowed(0x804); +SetRegisterAllowed(0x808); +SetRegisterAllowed(0x80C); +SetRegisterAllowed(0x810); +SetRegisterAllowed(0x814); +SetRegisterAllowed(0x818); +SetRegisterAllowed(0x81C); +SetRegisterAllowed(0x820); +SetRegisterAllowed(0x824); +SetRegisterAllowed(0x828); +SetRegisterAllowed(0x82C); +SetRegisterAllowed(0x830); +SetRegisterAllowed(0x834); +SetRegisterAllowed(0x838); +SetRegisterAllowed(0x83C); +SetRegisterAllowed(0x840); +SetRegisterAllowed(0x844); +SetRegisterAllowed(0x848); +SetRegisterAllowed(0x84C); +SetRegisterAllowed(0x850); +SetRegisterAllowed(0x854); +SetRegisterAllowed(0x858); +SetRegisterAllowed(0x85C); +SetRegisterAllowed(0x860); +SetRegisterAllowed(0x864); +SetRegisterAllowed(0x868); +SetRegisterAllowed(0x86C); +SetRegisterAllowed(0x870); +SetRegisterAllowed(0x874); +SetRegisterAllowed(0x878); +SetRegisterAllowed(0x87C); +SetRegisterAllowed(0x880); +SetRegisterAllowed(0x884); +SetRegisterAllowed(0x888); +SetRegisterAllowed(0x88C); +SetRegisterAllowed(0x890); +SetRegisterAllowed(0x894); +SetRegisterAllowed(0x898); +SetRegisterAllowed(0x89C); +SetRegisterAllowed(0x8A0); +SetRegisterAllowed(0x8A4); +SetRegisterAllowed(0x8A8); +SetRegisterAllowed(0x8AC); +SetRegisterAllowed(0x8B0); +SetRegisterAllowed(0x8B4); +SetRegisterAllowed(0x8B8); +SetRegisterAllowed(0x8BC); +SetRegisterAllowed(0x8C0); +SetRegisterAllowed(0x8C4); +SetRegisterAllowed(0x8C8); +SetRegisterAllowed(0x8CC); +SetRegisterAllowed(0x8D0); +SetRegisterAllowed(0x8D4); +SetRegisterAllowed(0x8D8); +SetRegisterAllowed(0x8DC); +SetRegisterAllowed(0x8E0); +SetRegisterAllowed(0x8E4); +SetRegisterAllowed(0x8E8); +SetRegisterAllowed(0x8EC); +SetRegisterAllowed(0x8F0); +SetRegisterAllowed(0x8F4); +SetRegisterAllowed(0x8F8); +SetRegisterAllowed(0x8FC); +SetRegisterAllowed(0x900); +SetRegisterAllowed(0x904); +SetRegisterAllowed(0x908); +SetRegisterAllowed(0x90C); +SetRegisterAllowed(0x910); +SetRegisterAllowed(0x914); +SetRegisterAllowed(0x918); +SetRegisterAllowed(0x91C); +SetRegisterAllowed(0x920); +SetRegisterAllowed(0x924); +SetRegisterAllowed(0x928); +SetRegisterAllowed(0x92C); +SetRegisterAllowed(0x930); +SetRegisterAllowed(0x934); +SetRegisterAllowed(0x938); +SetRegisterAllowed(0x93C); +SetRegisterAllowed(0x940); +SetRegisterAllowed(0x944); +SetRegisterAllowed(0x948); +SetRegisterAllowed(0x94C); +SetRegisterAllowed(0x950); +SetRegisterAllowed(0x954); +SetRegisterAllowed(0x958); +SetRegisterAllowed(0x95C); +SetRegisterAllowed(0x960); +SetRegisterAllowed(0x964); +SetRegisterAllowed(0x968); +SetRegisterAllowed(0x96C); +SetRegisterAllowed(0x970); +SetRegisterAllowed(0x974); +SetRegisterAllowed(0x978); +SetRegisterAllowed(0x97C); +SetRegisterAllowed(0x980); +SetRegisterAllowed(0x984); +SetRegisterAllowed(0x988); +SetRegisterAllowed(0x98C); +SetRegisterAllowed(0x990); +SetRegisterAllowed(0x994); +SetRegisterAllowed(0x998); +SetRegisterAllowed(0x99C); +SetRegisterAllowed(0x9A0); +SetRegisterAllowed(0x9A4); +SetRegisterAllowed(0x9A8); +SetRegisterAllowed(0x9AC); +SetRegisterAllowed(0x9B0); +SetRegisterAllowed(0x9B4); +SetRegisterAllowed(0x9B8); +SetRegisterAllowed(0x9BC); +SetRegisterAllowed(0x9C0); +SetRegisterAllowed(0x9C4); +SetRegisterAllowed(0x9C8); +SetRegisterAllowed(0x9CC); +SetRegisterAllowed(0x9D0); +SetRegisterAllowed(0x9D4); +SetRegisterAllowed(0x9D8); +SetRegisterAllowed(0x9DC); +SetRegisterAllowed(0x9E0); +SetRegisterAllowed(0x9E4); +SetRegisterAllowed(0x9E8); +SetRegisterAllowed(0x9EC); +SetRegisterAllowed(0x9F0); +SetRegisterAllowed(0x9F4); +SetRegisterAllowed(0x9F8); +SetRegisterAllowed(0x9FC); +SetRegisterAllowed(0xA00); +SetRegisterAllowed(0xA04); +SetRegisterAllowed(0xA08); +SetRegisterAllowed(0xA0C); +SetRegisterAllowed(0xA10); +SetRegisterAllowed(0xA14); +SetRegisterAllowed(0xA18); +SetRegisterAllowed(0xA1C); +SetRegisterAllowed(0xA20); +SetRegisterAllowed(0xA24); +SetRegisterAllowed(0xA28); +SetRegisterAllowed(0xA2C); +SetRegisterAllowed(0xA30); +SetRegisterAllowed(0xA34); +SetRegisterAllowed(0xA38); +SetRegisterAllowed(0xA3C); +SetRegisterAllowed(0xA40); +SetRegisterAllowed(0xA44); +SetRegisterAllowed(0xA48); +SetRegisterAllowed(0xA4C); +SetRegisterAllowed(0xA50); +SetRegisterAllowed(0xA54); +SetRegisterAllowed(0xA58); +SetRegisterAllowed(0xA5C); +SetRegisterAllowed(0xA60); +SetRegisterAllowed(0xA64); +SetRegisterAllowed(0xA68); +SetRegisterAllowed(0xA6C); +SetRegisterAllowed(0xA70); +SetRegisterAllowed(0xA74); +SetRegisterAllowed(0xA78); +SetRegisterAllowed(0xA7C); +SetRegisterAllowed(0xA80); +SetRegisterAllowed(0xA84); +SetRegisterAllowed(0xA88); +SetRegisterAllowed(0xA8C); +SetRegisterAllowed(0xA90); +SetRegisterAllowed(0xA94); +SetRegisterAllowed(0xA98); +SetRegisterAllowed(0xA9C); +SetRegisterAllowed(0xAA0); +SetRegisterAllowed(0xAA4); +SetRegisterAllowed(0xAA8); +SetRegisterAllowed(0xAAC); +SetRegisterAllowed(0xAB0); +SetRegisterAllowed(0xAB4); +SetRegisterAllowed(0xAB8); +SetRegisterAllowed(0xABC); +SetRegisterAllowed(0xAC0); +SetRegisterAllowed(0xAC4); +SetRegisterAllowed(0xAC8); +SetRegisterAllowed(0xACC); +SetRegisterAllowed(0xAD0); +SetRegisterAllowed(0xAD4); +SetRegisterAllowed(0xAD8); +SetRegisterAllowed(0xADC); +SetRegisterAllowed(0xAE0); +SetRegisterAllowed(0xAE4); +SetRegisterAllowed(0xAE8); +SetRegisterAllowed(0xAEC); +SetRegisterAllowed(0xAF0); +SetRegisterAllowed(0xAF4); +SetRegisterAllowed(0xAF8); +SetRegisterAllowed(0xAFC); +SetRegisterAllowed(0xB00); +SetRegisterAllowed(0xB04); +SetRegisterAllowed(0xB08); +SetRegisterAllowed(0xB0C); +SetRegisterAllowed(0xB10); +SetRegisterAllowed(0xB14); +SetRegisterAllowed(0xB18); +SetRegisterAllowed(0xB1C); +SetRegisterAllowed(0xB20); +SetRegisterAllowed(0xB24); +SetRegisterAllowed(0xB28); +SetRegisterAllowed(0xB2C); +SetRegisterAllowed(0xB30); +SetRegisterAllowed(0xB34); +SetRegisterAllowed(0xB38); +SetRegisterAllowed(0xB3C); +SetRegisterAllowed(0xB40); +SetRegisterAllowed(0xB44); +SetRegisterAllowed(0xB48); +SetRegisterAllowed(0xB4C); +SetRegisterAllowed(0xB50); +SetRegisterAllowed(0xB54); +SetRegisterAllowed(0xB58); +SetRegisterAllowed(0xB5C); +SetRegisterAllowed(0xB60); +SetRegisterAllowed(0xB64); +SetRegisterAllowed(0xB68); +SetRegisterAllowed(0xB6C); +SetRegisterAllowed(0xB70); +SetRegisterAllowed(0xB74); +SetRegisterAllowed(0xB78); +SetRegisterAllowed(0xB7C); +SetRegisterAllowed(0xB80); +SetRegisterAllowed(0xB84); +SetRegisterAllowed(0xB88); +SetRegisterAllowed(0xB8C); +SetRegisterAllowed(0xB90); +SetRegisterAllowed(0xB94); +SetRegisterAllowed(0xB98); +SetRegisterAllowed(0xB9C); +SetRegisterAllowed(0xBA0); +SetRegisterAllowed(0xBA4); +SetRegisterAllowed(0xBA8); +SetRegisterAllowed(0xBAC); +SetRegisterAllowed(0xBB0); +SetRegisterAllowed(0xBB4); +SetRegisterAllowed(0xBB8); +SetRegisterAllowed(0xBBC); +SetRegisterAllowed(0xBC0); +SetRegisterAllowed(0xBC4); +SetRegisterAllowed(0xBC8); +SetRegisterAllowed(0xBCC); +SetRegisterAllowed(0xBD0); +SetRegisterAllowed(0xBD4); +SetRegisterAllowed(0xBD8); +SetRegisterAllowed(0xBDC); +SetRegisterAllowed(0xBE0); +SetRegisterAllowed(0xBE4); +SetRegisterAllowed(0xBE8); +SetRegisterAllowed(0xBEC); +SetRegisterAllowed(0xBF0); +SetRegisterAllowed(0xBF4); +SetRegisterAllowed(0xBF8); +SetRegisterAllowed(0xBFC); +SetRegisterAllowed(0xC00); +SetRegisterAllowed(0xC04); +SetRegisterAllowed(0xC08); +SetRegisterAllowed(0xC0C); +SetRegisterAllowed(0xC10); +SetRegisterAllowed(0xC14); +SetRegisterAllowed(0xC18); +SetRegisterAllowed(0xC1C); +SetRegisterAllowed(0xC20); +SetRegisterAllowed(0xC24); +SetRegisterAllowed(0xC28); +SetRegisterAllowed(0xC2C); +SetRegisterAllowed(0xC30); +SetRegisterAllowed(0xC34); +SetRegisterAllowed(0xC38); +SetRegisterAllowed(0xC3C); +SetRegisterAllowed(0xC40); +SetRegisterAllowed(0xC44); +SetRegisterAllowed(0xC48); +SetRegisterAllowed(0xC4C); +SetRegisterAllowed(0xC50); +SetRegisterAllowed(0xC54); +SetRegisterAllowed(0xC58); +SetRegisterAllowed(0xC5C); +SetRegisterAllowed(0xC60); +SetRegisterAllowed(0xC64); +SetRegisterAllowed(0xC68); +SetRegisterAllowed(0xC6C); +SetRegisterAllowed(0xC70); +SetRegisterAllowed(0xC74); +SetRegisterAllowed(0xC78); +SetRegisterAllowed(0xC7C); +SetRegisterAllowed(0xC80); +SetRegisterAllowed(0xC84); +SetRegisterAllowed(0xC88); +SetRegisterAllowed(0xC8C); +SetRegisterAllowed(0xC90); +SetRegisterAllowed(0xC94); +SetRegisterAllowed(0xC98); +SetRegisterAllowed(0xC9C); +SetRegisterAllowed(0xCA0); +SetRegisterAllowed(0xCA4); +SetRegisterAllowed(0xCA8); +SetRegisterAllowed(0xCAC); +SetRegisterAllowed(0xCB0); +SetRegisterAllowed(0xCB4); +SetRegisterAllowed(0xCB8); +SetRegisterAllowed(0xCBC); +SetRegisterAllowed(0xCC0); +SetRegisterAllowed(0xCC4); +SetRegisterAllowed(0xCC8); +SetRegisterAllowed(0xCCC); +SetRegisterAllowed(0xCD0); +SetRegisterAllowed(0xCD4); +SetRegisterAllowed(0xCD8); +SetRegisterAllowed(0xCDC); +SetRegisterAllowed(0xCE0); +SetRegisterAllowed(0xCE4); +SetRegisterAllowed(0xCE8); +SetRegisterAllowed(0xCEC); +SetRegisterAllowed(0xCF0); +SetRegisterAllowed(0xCF4); +SetRegisterAllowed(0xCF8); +SetRegisterAllowed(0xCFC); +SetRegisterAllowed(0xD00); +SetRegisterAllowed(0xD04); +SetRegisterAllowed(0xD08); +SetRegisterAllowed(0xD0C); +SetRegisterAllowed(0xD10); +SetRegisterAllowed(0xD14); +SetRegisterAllowed(0xD18); +SetRegisterAllowed(0xD1C); +SetRegisterAllowed(0xD20); +SetRegisterAllowed(0xD24); +SetRegisterAllowed(0xD28); +SetRegisterAllowed(0xD2C); +SetRegisterAllowed(0xD30); +SetRegisterAllowed(0xD34); +SetRegisterAllowed(0xD38); +SetRegisterAllowed(0xD3C); +SetRegisterAllowed(0xD40); +SetRegisterAllowed(0xD44); +SetRegisterAllowed(0xD48); +SetRegisterAllowed(0xD4C); +SetRegisterAllowed(0xD50); +SetRegisterAllowed(0xD54); +SetRegisterAllowed(0xD58); +SetRegisterAllowed(0xD5C); +SetRegisterAllowed(0xD60); +SetRegisterAllowed(0xD64); +SetRegisterAllowed(0xD68); +SetRegisterAllowed(0xD6C); +SetRegisterAllowed(0xD70); +SetRegisterAllowed(0xD74); +SetRegisterAllowed(0xD78); +SetRegisterAllowed(0xD7C); +SetRegisterAllowed(0xD80); +SetRegisterAllowed(0xD84); +SetRegisterAllowed(0xD88); +SetRegisterAllowed(0xD8C); +SetRegisterAllowed(0xD90); +SetRegisterAllowed(0xD94); +SetRegisterAllowed(0xD98); +SetRegisterAllowed(0xD9C); +SetRegisterAllowed(0xDA0); +SetRegisterAllowed(0xDA4); +SetRegisterAllowed(0xDA8); +SetRegisterAllowed(0xDAC); +SetRegisterAllowed(0xDB0); +SetRegisterAllowed(0xDB4); +SetRegisterAllowed(0xDB8); +SetRegisterAllowed(0xDBC); +SetRegisterAllowed(0xDC0); +SetRegisterAllowed(0xDC4); +SetRegisterAllowed(0xDC8); +SetRegisterAllowed(0xDCC); +SetRegisterAllowed(0xDD0); +SetRegisterAllowed(0xDD4); +SetRegisterAllowed(0xDD8); +SetRegisterAllowed(0xDDC); +SetRegisterAllowed(0xDE0); +SetRegisterAllowed(0xDE4); +SetRegisterAllowed(0xDE8); +SetRegisterAllowed(0xDEC); +SetRegisterAllowed(0xDF0); +SetRegisterAllowed(0xDF4); +SetRegisterAllowed(0xDF8); +SetRegisterAllowed(0xDFC); +SetRegisterAllowed(0xE00); +SetRegisterAllowed(0xE04); +SetRegisterAllowed(0xE08); +SetRegisterAllowed(0xE0C); +SetRegisterAllowed(0xE10); +SetRegisterAllowed(0xE14); +SetRegisterAllowed(0xE18); +SetRegisterAllowed(0xE1C); +SetRegisterAllowed(0xE20); +SetRegisterAllowed(0xE24); +SetRegisterAllowed(0xE28); +SetRegisterAllowed(0xE2C); +SetRegisterAllowed(0xE30); +SetRegisterAllowed(0xE34); +SetRegisterAllowed(0xE38); +SetRegisterAllowed(0xE3C); +SetRegisterAllowed(0xE40); +SetRegisterAllowed(0xE44); +SetRegisterAllowed(0xE48); +SetRegisterAllowed(0xE4C); +SetRegisterAllowed(0xE50); +SetRegisterAllowed(0xE54); +SetRegisterAllowed(0xE58); +SetRegisterAllowed(0xE5C); +SetRegisterAllowed(0xE60); +SetRegisterAllowed(0xE64); +SetRegisterAllowed(0xE68); +SetRegisterAllowed(0xE6C); +SetRegisterAllowed(0xE70); +SetRegisterAllowed(0xE74); +SetRegisterAllowed(0xE78); +SetRegisterAllowed(0xE7C); +SetRegisterAllowed(0xE80); +SetRegisterAllowed(0xE84); +SetRegisterAllowed(0xE88); +SetRegisterAllowed(0xE8C); +SetRegisterAllowed(0xE90); +SetRegisterAllowed(0xE94); +SetRegisterAllowed(0xE98); +SetRegisterAllowed(0xE9C); +SetRegisterAllowed(0xEA0); +SetRegisterAllowed(0xEA4); +SetRegisterAllowed(0xEA8); +SetRegisterAllowed(0xEAC); +SetRegisterAllowed(0xEB0); +SetRegisterAllowed(0xEB4); +SetRegisterAllowed(0xEB8); +SetRegisterAllowed(0xEBC); +SetRegisterAllowed(0xEC0); +SetRegisterAllowed(0xEC4); +SetRegisterAllowed(0xEC8); +SetRegisterAllowed(0xECC); +SetRegisterAllowed(0xED0); +SetRegisterAllowed(0xED4); +SetRegisterAllowed(0xED8); +SetRegisterAllowed(0xEDC); +SetRegisterAllowed(0xEE0); +SetRegisterAllowed(0xEE4); +SetRegisterAllowed(0xEE8); +SetRegisterAllowed(0xEEC); +SetRegisterAllowed(0xEF0); +SetRegisterAllowed(0xEF4); +SetRegisterAllowed(0xEF8); +SetRegisterAllowed(0xEFC); +SetRegisterAllowed(0xF00); +SetRegisterAllowed(0xF04); +SetRegisterAllowed(0xF08); +SetRegisterAllowed(0xF0C); +SetRegisterAllowed(0xF10); +SetRegisterAllowed(0xF14); +SetRegisterAllowed(0xF18); +SetRegisterAllowed(0xF1C); +SetRegisterAllowed(0xF20); +SetRegisterAllowed(0xF24); +SetRegisterAllowed(0xF28); +SetRegisterAllowed(0xF2C); +SetRegisterAllowed(0xF30); +SetRegisterAllowed(0xF34); +SetRegisterAllowed(0xF38); +SetRegisterAllowed(0xF3C); +SetRegisterAllowed(0xF40); +SetRegisterAllowed(0xF44); +SetRegisterAllowed(0xF48); +SetRegisterAllowed(0xF4C); +SetRegisterAllowed(0xF50); +SetRegisterAllowed(0xF54); +SetRegisterAllowed(0xF58); +SetRegisterAllowed(0xF5C); +SetRegisterAllowed(0xF60); +SetRegisterAllowed(0xF64); +SetRegisterAllowed(0xF68); +SetRegisterAllowed(0xF6C); +SetRegisterAllowed(0xF70); +SetRegisterAllowed(0xF74); +SetRegisterAllowed(0xF78); +SetRegisterAllowed(0xF7C); +SetRegisterAllowed(0xF80); +SetRegisterAllowed(0xF84); +SetRegisterAllowed(0xF88); +SetRegisterAllowed(0xF8C); +SetRegisterAllowed(0xF90); +SetRegisterAllowed(0xF94); +SetRegisterAllowed(0xF98); +SetRegisterAllowed(0xF9C); +SetRegisterAllowed(0xFA0); +SetRegisterAllowed(0xFA4); +SetRegisterAllowed(0xFA8); +SetRegisterAllowed(0xFAC); +SetRegisterAllowed(0xFB0); +SetRegisterAllowed(0xFB4); +SetRegisterAllowed(0xFB8); +SetRegisterAllowed(0xFBC); +SetRegisterAllowed(0xFC0); +SetRegisterAllowed(0xFC4); +SetRegisterAllowed(0xFC8); +SetRegisterAllowed(0xFCC); +SetRegisterAllowed(0xFD0); +SetRegisterAllowed(0xFD4); +SetRegisterAllowed(0xFD8); +SetRegisterAllowed(0xFDC); +SetRegisterAllowed(0xFE0); +SetRegisterAllowed(0xFE4); +SetRegisterAllowed(0xFE8); +SetRegisterAllowed(0xFEC); +SetRegisterAllowed(0xFF0); +SetRegisterAllowed(0xFF4); +SetRegisterAllowed(0xFF8); +SetRegisterAllowed(0xFFC); diff --git a/Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc b/Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc new file mode 100644 index 00000000..a3718c5e --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc @@ -0,0 +1,1040 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +SetRegisterAllowed(0x0); +SetRegisterAllowed(0x4); +SetRegisterAllowed(0x8); +SetRegisterAllowed(0xC); +SetRegisterAllowed(0x10); +SetRegisterAllowed(0x14); +SetRegisterAllowed(0x18); +SetRegisterAllowed(0x1C); +SetRegisterAllowed(0x20); +SetRegisterAllowed(0x24); +SetRegisterAllowed(0x28); +SetRegisterAllowed(0x2C); +SetRegisterAllowed(0x30); +SetRegisterAllowed(0x34); +SetRegisterAllowed(0x38); +SetRegisterAllowed(0x3C); +SetRegisterAllowed(0x40); +SetRegisterAllowed(0x44); +SetRegisterAllowed(0x48); +SetRegisterAllowed(0x4C); +SetRegisterAllowed(0x50); +SetRegisterAllowed(0x54); +SetRegisterAllowed(0x58); +SetRegisterAllowed(0x5C); +SetRegisterAllowed(0x60); +SetRegisterAllowed(0x64); +SetRegisterAllowed(0x68); +SetRegisterAllowed(0x6C); +SetRegisterAllowed(0x70); +SetRegisterAllowed(0x74); +SetRegisterAllowed(0x78); +SetRegisterAllowed(0x7C); +SetRegisterAllowed(0x80); +SetRegisterAllowed(0x84); +SetRegisterAllowed(0x88); +SetRegisterAllowed(0x8C); +SetRegisterAllowed(0x90); +SetRegisterAllowed(0x94); +SetRegisterAllowed(0x98); +SetRegisterAllowed(0x9C); +SetRegisterAllowed(0xA0); +SetRegisterAllowed(0xA4); +SetRegisterAllowed(0xA8); +SetRegisterAllowed(0xAC); +SetRegisterAllowed(0xB0); +SetRegisterAllowed(0xB4); +SetRegisterAllowed(0xB8); +SetRegisterAllowed(0xBC); +SetRegisterAllowed(0xC0); +SetRegisterAllowed(0xC4); +SetRegisterAllowed(0xC8); +SetRegisterAllowed(0xCC); +SetRegisterAllowed(0xD0); +SetRegisterAllowed(0xD4); +SetRegisterAllowed(0xD8); +SetRegisterAllowed(0xDC); +SetRegisterAllowed(0xE0); +SetRegisterAllowed(0xE4); +SetRegisterAllowed(0xE8); +SetRegisterAllowed(0xEC); +SetRegisterAllowed(0xF0); +SetRegisterAllowed(0xF4); +SetRegisterAllowed(0xF8); +SetRegisterAllowed(0xFC); +SetRegisterAllowed(0x100); +SetRegisterAllowed(0x104); +SetRegisterAllowed(0x108); +SetRegisterAllowed(0x10C); +SetRegisterAllowed(0x110); +SetRegisterAllowed(0x114); +SetRegisterAllowed(0x118); +SetRegisterAllowed(0x11C); +SetRegisterAllowed(0x120); +SetRegisterAllowed(0x124); +SetRegisterAllowed(0x128); +SetRegisterAllowed(0x12C); +SetRegisterAllowed(0x130); +SetRegisterAllowed(0x134); +SetRegisterAllowed(0x138); +SetRegisterAllowed(0x13C); +SetRegisterAllowed(0x140); +SetRegisterAllowed(0x144); +SetRegisterAllowed(0x148); +SetRegisterAllowed(0x14C); +SetRegisterAllowed(0x150); +SetRegisterAllowed(0x154); +SetRegisterAllowed(0x158); +SetRegisterAllowed(0x15C); +SetRegisterAllowed(0x160); +SetRegisterAllowed(0x164); +SetRegisterAllowed(0x168); +SetRegisterAllowed(0x16C); +SetRegisterAllowed(0x170); +SetRegisterAllowed(0x174); +SetRegisterAllowed(0x178); +SetRegisterAllowed(0x17C); +SetRegisterAllowed(0x180); +SetRegisterAllowed(0x184); +SetRegisterAllowed(0x188); +SetRegisterAllowed(0x18C); +SetRegisterAllowed(0x190); +SetRegisterAllowed(0x194); +SetRegisterAllowed(0x198); +SetRegisterAllowed(0x19C); +SetRegisterAllowed(0x1A0); +SetRegisterAllowed(0x1A4); +SetRegisterAllowed(0x1A8); +SetRegisterAllowed(0x1AC); +SetRegisterAllowed(0x1B0); +SetRegisterAllowed(0x1B4); +SetRegisterAllowed(0x1B8); +SetRegisterAllowed(0x1BC); +SetRegisterAllowed(0x1C0); +SetRegisterAllowed(0x1C4); +SetRegisterAllowed(0x1C8); +SetRegisterAllowed(0x1CC); +SetRegisterAllowed(0x1D0); +SetRegisterAllowed(0x1D4); +SetRegisterAllowed(0x1D8); +SetRegisterAllowed(0x1DC); +SetRegisterAllowed(0x1E0); +SetRegisterAllowed(0x1E4); +SetRegisterAllowed(0x1E8); +SetRegisterAllowed(0x1EC); +SetRegisterAllowed(0x1F0); +SetRegisterAllowed(0x1F4); +SetRegisterAllowed(0x1F8); +SetRegisterAllowed(0x1FC); +SetRegisterAllowed(0x200); +SetRegisterAllowed(0x204); +SetRegisterAllowed(0x208); +SetRegisterAllowed(0x20C); +SetRegisterAllowed(0x210); +SetRegisterAllowed(0x214); +SetRegisterAllowed(0x218); +SetRegisterAllowed(0x21C); +SetRegisterAllowed(0x220); +SetRegisterAllowed(0x224); +SetRegisterAllowed(0x228); +SetRegisterAllowed(0x22C); +SetRegisterAllowed(0x230); +SetRegisterAllowed(0x234); +SetRegisterAllowed(0x238); +SetRegisterAllowed(0x23C); +SetRegisterAllowed(0x240); +SetRegisterAllowed(0x244); +SetRegisterAllowed(0x248); +SetRegisterAllowed(0x24C); +SetRegisterAllowed(0x250); +SetRegisterAllowed(0x254); +SetRegisterAllowed(0x258); +SetRegisterAllowed(0x25C); +SetRegisterAllowed(0x260); +SetRegisterAllowed(0x264); +SetRegisterAllowed(0x268); +SetRegisterAllowed(0x26C); +SetRegisterAllowed(0x270); +SetRegisterAllowed(0x274); +SetRegisterAllowed(0x278); +SetRegisterAllowed(0x27C); +SetRegisterAllowed(0x280); +SetRegisterAllowed(0x284); +SetRegisterAllowed(0x288); +SetRegisterAllowed(0x28C); +SetRegisterAllowed(0x290); +SetRegisterAllowed(0x294); +SetRegisterAllowed(0x298); +SetRegisterAllowed(0x29C); +SetRegisterAllowed(0x2A0); +SetRegisterAllowed(0x2A4); +SetRegisterAllowed(0x2A8); +SetRegisterAllowed(0x2AC); +SetRegisterAllowed(0x2B0); +SetRegisterAllowed(0x2B4); +SetRegisterAllowed(0x2B8); +SetRegisterAllowed(0x2BC); +SetRegisterAllowed(0x2C0); +SetRegisterAllowed(0x2C4); +SetRegisterAllowed(0x2C8); +SetRegisterAllowed(0x2CC); +SetRegisterAllowed(0x2D0); +SetRegisterAllowed(0x2D4); +SetRegisterAllowed(0x2D8); +SetRegisterAllowed(0x2DC); +SetRegisterAllowed(0x2E0); +SetRegisterAllowed(0x2E4); +SetRegisterAllowed(0x2E8); +SetRegisterAllowed(0x2EC); +SetRegisterAllowed(0x2F0); +SetRegisterAllowed(0x2F4); +SetRegisterAllowed(0x2F8); +SetRegisterAllowed(0x2FC); +SetRegisterAllowed(0x300); +SetRegisterAllowed(0x304); +SetRegisterAllowed(0x308); +SetRegisterAllowed(0x30C); +SetRegisterAllowed(0x310); +SetRegisterAllowed(0x314); +SetRegisterAllowed(0x318); +SetRegisterAllowed(0x31C); +SetRegisterAllowed(0x320); +SetRegisterAllowed(0x324); +SetRegisterAllowed(0x328); +SetRegisterAllowed(0x32C); +SetRegisterAllowed(0x330); +SetRegisterAllowed(0x334); +SetRegisterAllowed(0x338); +SetRegisterAllowed(0x33C); +SetRegisterAllowed(0x340); +SetRegisterAllowed(0x344); +SetRegisterAllowed(0x348); +SetRegisterAllowed(0x34C); +SetRegisterAllowed(0x350); +SetRegisterAllowed(0x354); +SetRegisterAllowed(0x358); +SetRegisterAllowed(0x35C); +SetRegisterAllowed(0x360); +SetRegisterAllowed(0x364); +SetRegisterAllowed(0x368); +SetRegisterAllowed(0x36C); +SetRegisterAllowed(0x370); +SetRegisterAllowed(0x374); +SetRegisterAllowed(0x378); +SetRegisterAllowed(0x37C); +SetRegisterAllowed(0x380); +SetRegisterAllowed(0x384); +SetRegisterAllowed(0x388); +SetRegisterAllowed(0x38C); +SetRegisterAllowed(0x390); +SetRegisterAllowed(0x394); +SetRegisterAllowed(0x398); +SetRegisterAllowed(0x39C); +SetRegisterAllowed(0x3A0); +SetRegisterAllowed(0x3A4); +SetRegisterAllowed(0x3A8); +SetRegisterAllowed(0x3AC); +SetRegisterAllowed(0x3B0); +SetRegisterAllowed(0x3B4); +SetRegisterAllowed(0x3B8); +SetRegisterAllowed(0x3BC); +SetRegisterAllowed(0x3C0); +SetRegisterAllowed(0x3C4); +SetRegisterAllowed(0x3C8); +SetRegisterAllowed(0x3CC); +SetRegisterAllowed(0x3D0); +SetRegisterAllowed(0x3D4); +SetRegisterAllowed(0x3D8); +SetRegisterAllowed(0x3DC); +SetRegisterAllowed(0x3E0); +SetRegisterAllowed(0x3E4); +SetRegisterAllowed(0x3E8); +SetRegisterAllowed(0x3EC); +SetRegisterAllowed(0x3F0); +SetRegisterAllowed(0x3F4); +SetRegisterAllowed(0x3F8); +SetRegisterAllowed(0x3FC); +SetRegisterAllowed(0x400); +SetRegisterAllowed(0x404); +SetRegisterAllowed(0x408); +SetRegisterAllowed(0x40C); +SetRegisterAllowed(0x410); +SetRegisterAllowed(0x414); +SetRegisterAllowed(0x418); +SetRegisterAllowed(0x41C); +SetRegisterAllowed(0x420); +SetRegisterAllowed(0x424); +SetRegisterAllowed(0x428); +SetRegisterAllowed(0x42C); +SetRegisterAllowed(0x430); +SetRegisterAllowed(0x434); +SetRegisterAllowed(0x438); +SetRegisterAllowed(0x43C); +SetRegisterAllowed(0x440); +SetRegisterAllowed(0x444); +SetRegisterAllowed(0x448); +SetRegisterAllowed(0x44C); +SetRegisterAllowed(0x450); +SetRegisterAllowed(0x454); +SetRegisterAllowed(0x458); +SetRegisterAllowed(0x45C); +SetRegisterAllowed(0x460); +SetRegisterAllowed(0x464); +SetRegisterAllowed(0x468); +SetRegisterAllowed(0x46C); +SetRegisterAllowed(0x470); +SetRegisterAllowed(0x474); +SetRegisterAllowed(0x478); +SetRegisterAllowed(0x47C); +SetRegisterAllowed(0x480); +SetRegisterAllowed(0x484); +SetRegisterAllowed(0x488); +SetRegisterAllowed(0x48C); +SetRegisterAllowed(0x490); +SetRegisterAllowed(0x494); +SetRegisterAllowed(0x498); +SetRegisterAllowed(0x49C); +SetRegisterAllowed(0x4A0); +SetRegisterAllowed(0x4A4); +SetRegisterAllowed(0x4A8); +SetRegisterAllowed(0x4AC); +SetRegisterAllowed(0x4B0); +SetRegisterAllowed(0x4B4); +SetRegisterAllowed(0x4B8); +SetRegisterAllowed(0x4BC); +SetRegisterAllowed(0x4C0); +SetRegisterAllowed(0x4C4); +SetRegisterAllowed(0x4C8); +SetRegisterAllowed(0x4CC); +SetRegisterAllowed(0x4D0); +SetRegisterAllowed(0x4D4); +SetRegisterAllowed(0x4D8); +SetRegisterAllowed(0x4DC); +SetRegisterAllowed(0x4E0); +SetRegisterAllowed(0x4E4); +SetRegisterAllowed(0x4E8); +SetRegisterAllowed(0x4EC); +SetRegisterAllowed(0x4F0); +SetRegisterAllowed(0x4F4); +SetRegisterAllowed(0x4F8); +SetRegisterAllowed(0x4FC); +SetRegisterAllowed(0x500); +SetRegisterAllowed(0x504); +SetRegisterAllowed(0x508); +SetRegisterAllowed(0x50C); +SetRegisterAllowed(0x510); +SetRegisterAllowed(0x514); +SetRegisterAllowed(0x518); +SetRegisterAllowed(0x51C); +SetRegisterAllowed(0x520); +SetRegisterAllowed(0x524); +SetRegisterAllowed(0x528); +SetRegisterAllowed(0x52C); +SetRegisterAllowed(0x530); +SetRegisterAllowed(0x534); +SetRegisterAllowed(0x538); +SetRegisterAllowed(0x53C); +SetRegisterAllowed(0x540); +SetRegisterAllowed(0x544); +SetRegisterAllowed(0x548); +SetRegisterAllowed(0x54C); +SetRegisterAllowed(0x550); +SetRegisterAllowed(0x554); +SetRegisterAllowed(0x558); +SetRegisterAllowed(0x55C); +SetRegisterAllowed(0x560); +SetRegisterAllowed(0x564); +SetRegisterAllowed(0x568); +SetRegisterAllowed(0x56C); +SetRegisterAllowed(0x570); +SetRegisterAllowed(0x574); +SetRegisterAllowed(0x578); +SetRegisterAllowed(0x57C); +SetRegisterAllowed(0x580); +SetRegisterAllowed(0x584); +SetRegisterAllowed(0x588); +SetRegisterAllowed(0x58C); +SetRegisterAllowed(0x590); +SetRegisterAllowed(0x594); +SetRegisterAllowed(0x598); +SetRegisterAllowed(0x59C); +SetRegisterAllowed(0x5A0); +SetRegisterAllowed(0x5A4); +SetRegisterAllowed(0x5A8); +SetRegisterAllowed(0x5AC); +SetRegisterAllowed(0x5B0); +SetRegisterAllowed(0x5B4); +SetRegisterAllowed(0x5B8); +SetRegisterAllowed(0x5BC); +SetRegisterAllowed(0x5C0); +SetRegisterAllowed(0x5C4); +SetRegisterAllowed(0x5C8); +SetRegisterAllowed(0x5CC); +SetRegisterAllowed(0x5D0); +SetRegisterAllowed(0x5D4); +SetRegisterAllowed(0x5D8); +SetRegisterAllowed(0x5DC); +SetRegisterAllowed(0x5E0); +SetRegisterAllowed(0x5E4); +SetRegisterAllowed(0x5E8); +SetRegisterAllowed(0x5EC); +SetRegisterAllowed(0x5F0); +SetRegisterAllowed(0x5F4); +SetRegisterAllowed(0x5F8); +SetRegisterAllowed(0x5FC); +SetRegisterAllowed(0x600); +SetRegisterAllowed(0x604); +SetRegisterAllowed(0x608); +SetRegisterAllowed(0x60C); +SetRegisterAllowed(0x610); +SetRegisterAllowed(0x614); +SetRegisterAllowed(0x618); +SetRegisterAllowed(0x61C); +SetRegisterAllowed(0x620); +SetRegisterAllowed(0x624); +SetRegisterAllowed(0x628); +SetRegisterAllowed(0x62C); +SetRegisterAllowed(0x630); +SetRegisterAllowed(0x634); +SetRegisterAllowed(0x638); +SetRegisterAllowed(0x63C); +SetRegisterAllowed(0x640); +SetRegisterAllowed(0x644); +SetRegisterAllowed(0x648); +SetRegisterAllowed(0x64C); +SetRegisterAllowed(0x650); +SetRegisterAllowed(0x654); +SetRegisterAllowed(0x658); +SetRegisterAllowed(0x65C); +SetRegisterAllowed(0x660); +SetRegisterAllowed(0x664); +SetRegisterAllowed(0x668); +SetRegisterAllowed(0x66C); +SetRegisterAllowed(0x670); +SetRegisterAllowed(0x674); +SetRegisterAllowed(0x678); +SetRegisterAllowed(0x67C); +SetRegisterAllowed(0x680); +SetRegisterAllowed(0x684); +SetRegisterAllowed(0x688); +SetRegisterAllowed(0x68C); +SetRegisterAllowed(0x690); +SetRegisterAllowed(0x694); +SetRegisterAllowed(0x698); +SetRegisterAllowed(0x69C); +SetRegisterAllowed(0x6A0); +SetRegisterAllowed(0x6A4); +SetRegisterAllowed(0x6A8); +SetRegisterAllowed(0x6AC); +SetRegisterAllowed(0x6B0); +SetRegisterAllowed(0x6B4); +SetRegisterAllowed(0x6B8); +SetRegisterAllowed(0x6BC); +SetRegisterAllowed(0x6C0); +SetRegisterAllowed(0x6C4); +SetRegisterAllowed(0x6C8); +SetRegisterAllowed(0x6CC); +SetRegisterAllowed(0x6D0); +SetRegisterAllowed(0x6D4); +SetRegisterAllowed(0x6D8); +SetRegisterAllowed(0x6DC); +SetRegisterAllowed(0x6E0); +SetRegisterAllowed(0x6E4); +SetRegisterAllowed(0x6E8); +SetRegisterAllowed(0x6EC); +SetRegisterAllowed(0x6F0); +SetRegisterAllowed(0x6F4); +SetRegisterAllowed(0x6F8); +SetRegisterAllowed(0x6FC); +SetRegisterAllowed(0x700); +SetRegisterAllowed(0x704); +SetRegisterAllowed(0x708); +SetRegisterAllowed(0x70C); +SetRegisterAllowed(0x710); +SetRegisterAllowed(0x714); +SetRegisterAllowed(0x718); +SetRegisterAllowed(0x71C); +SetRegisterAllowed(0x720); +SetRegisterAllowed(0x724); +SetRegisterAllowed(0x728); +SetRegisterAllowed(0x72C); +SetRegisterAllowed(0x730); +SetRegisterAllowed(0x734); +SetRegisterAllowed(0x738); +SetRegisterAllowed(0x73C); +SetRegisterAllowed(0x740); +SetRegisterAllowed(0x744); +SetRegisterAllowed(0x748); +SetRegisterAllowed(0x74C); +SetRegisterAllowed(0x750); +SetRegisterAllowed(0x754); +SetRegisterAllowed(0x758); +SetRegisterAllowed(0x75C); +SetRegisterAllowed(0x760); +SetRegisterAllowed(0x764); +SetRegisterAllowed(0x768); +SetRegisterAllowed(0x76C); +SetRegisterAllowed(0x770); +SetRegisterAllowed(0x774); +SetRegisterAllowed(0x778); +SetRegisterAllowed(0x77C); +SetRegisterAllowed(0x780); +SetRegisterAllowed(0x784); +SetRegisterAllowed(0x788); +SetRegisterAllowed(0x78C); +SetRegisterAllowed(0x790); +SetRegisterAllowed(0x794); +SetRegisterAllowed(0x798); +SetRegisterAllowed(0x79C); +SetRegisterAllowed(0x7A0); +SetRegisterAllowed(0x7A4); +SetRegisterAllowed(0x7A8); +SetRegisterAllowed(0x7AC); +SetRegisterAllowed(0x7B0); +SetRegisterAllowed(0x7B4); +SetRegisterAllowed(0x7B8); +SetRegisterAllowed(0x7BC); +SetRegisterAllowed(0x7C0); +SetRegisterAllowed(0x7C4); +SetRegisterAllowed(0x7C8); +SetRegisterAllowed(0x7CC); +SetRegisterAllowed(0x7D0); +SetRegisterAllowed(0x7D4); +SetRegisterAllowed(0x7D8); +SetRegisterAllowed(0x7DC); +SetRegisterAllowed(0x7E0); +SetRegisterAllowed(0x7E4); +SetRegisterAllowed(0x7E8); +SetRegisterAllowed(0x7EC); +SetRegisterAllowed(0x7F0); +SetRegisterAllowed(0x7F4); +SetRegisterAllowed(0x7F8); +SetRegisterAllowed(0x7FC); +SetRegisterAllowed(0x800); +SetRegisterAllowed(0x804); +SetRegisterAllowed(0x808); +SetRegisterAllowed(0x80C); +SetRegisterAllowed(0x810); +SetRegisterAllowed(0x814); +SetRegisterAllowed(0x818); +SetRegisterAllowed(0x81C); +SetRegisterAllowed(0x820); +SetRegisterAllowed(0x824); +SetRegisterAllowed(0x828); +SetRegisterAllowed(0x82C); +SetRegisterAllowed(0x830); +SetRegisterAllowed(0x834); +SetRegisterAllowed(0x838); +SetRegisterAllowed(0x83C); +SetRegisterAllowed(0x840); +SetRegisterAllowed(0x844); +SetRegisterAllowed(0x848); +SetRegisterAllowed(0x84C); +SetRegisterAllowed(0x850); +SetRegisterAllowed(0x854); +SetRegisterAllowed(0x858); +SetRegisterAllowed(0x85C); +SetRegisterAllowed(0x860); +SetRegisterAllowed(0x864); +SetRegisterAllowed(0x868); +SetRegisterAllowed(0x86C); +SetRegisterAllowed(0x870); +SetRegisterAllowed(0x874); +SetRegisterAllowed(0x878); +SetRegisterAllowed(0x87C); +SetRegisterAllowed(0x880); +SetRegisterAllowed(0x884); +SetRegisterAllowed(0x888); +SetRegisterAllowed(0x88C); +SetRegisterAllowed(0x890); +SetRegisterAllowed(0x894); +SetRegisterAllowed(0x898); +SetRegisterAllowed(0x89C); +SetRegisterAllowed(0x8A0); +SetRegisterAllowed(0x8A4); +SetRegisterAllowed(0x8A8); +SetRegisterAllowed(0x8AC); +SetRegisterAllowed(0x8B0); +SetRegisterAllowed(0x8B4); +SetRegisterAllowed(0x8B8); +SetRegisterAllowed(0x8BC); +SetRegisterAllowed(0x8C0); +SetRegisterAllowed(0x8C4); +SetRegisterAllowed(0x8C8); +SetRegisterAllowed(0x8CC); +SetRegisterAllowed(0x8D0); +SetRegisterAllowed(0x8D4); +SetRegisterAllowed(0x8D8); +SetRegisterAllowed(0x8DC); +SetRegisterAllowed(0x8E0); +SetRegisterAllowed(0x8E4); +SetRegisterAllowed(0x8E8); +SetRegisterAllowed(0x8EC); +SetRegisterAllowed(0x8F0); +SetRegisterAllowed(0x8F4); +SetRegisterAllowed(0x8F8); +SetRegisterAllowed(0x8FC); +SetRegisterAllowed(0x900); +SetRegisterAllowed(0x904); +SetRegisterAllowed(0x908); +SetRegisterAllowed(0x90C); +SetRegisterAllowed(0x910); +SetRegisterAllowed(0x914); +SetRegisterAllowed(0x918); +SetRegisterAllowed(0x91C); +SetRegisterAllowed(0x920); +SetRegisterAllowed(0x924); +SetRegisterAllowed(0x928); +SetRegisterAllowed(0x92C); +SetRegisterAllowed(0x930); +SetRegisterAllowed(0x934); +SetRegisterAllowed(0x938); +SetRegisterAllowed(0x93C); +SetRegisterAllowed(0x940); +SetRegisterAllowed(0x944); +SetRegisterAllowed(0x948); +SetRegisterAllowed(0x94C); +SetRegisterAllowed(0x950); +SetRegisterAllowed(0x954); +SetRegisterAllowed(0x958); +SetRegisterAllowed(0x95C); +SetRegisterAllowed(0x960); +SetRegisterAllowed(0x964); +SetRegisterAllowed(0x968); +SetRegisterAllowed(0x96C); +SetRegisterAllowed(0x970); +SetRegisterAllowed(0x974); +SetRegisterAllowed(0x978); +SetRegisterAllowed(0x97C); +SetRegisterAllowed(0x980); +SetRegisterAllowed(0x984); +SetRegisterAllowed(0x988); +SetRegisterAllowed(0x98C); +SetRegisterAllowed(0x990); +SetRegisterAllowed(0x994); +SetRegisterAllowed(0x998); +SetRegisterAllowed(0x99C); +SetRegisterAllowed(0x9A0); +SetRegisterAllowed(0x9A4); +SetRegisterAllowed(0x9A8); +SetRegisterAllowed(0x9AC); +SetRegisterAllowed(0x9B0); +SetRegisterAllowed(0x9B4); +SetRegisterAllowed(0x9B8); +SetRegisterAllowed(0x9BC); +SetRegisterAllowed(0x9C0); +SetRegisterAllowed(0x9C4); +SetRegisterAllowed(0x9C8); +SetRegisterAllowed(0x9CC); +SetRegisterAllowed(0x9D0); +SetRegisterAllowed(0x9D4); +SetRegisterAllowed(0x9D8); +SetRegisterAllowed(0x9DC); +SetRegisterAllowed(0x9E0); +SetRegisterAllowed(0x9E4); +SetRegisterAllowed(0x9E8); +SetRegisterAllowed(0x9EC); +SetRegisterAllowed(0x9F0); +SetRegisterAllowed(0x9F4); +SetRegisterAllowed(0x9F8); +SetRegisterAllowed(0x9FC); +SetRegisterAllowed(0xA00); +SetRegisterAllowed(0xA04); +SetRegisterAllowed(0xA08); +SetRegisterAllowed(0xA0C); +SetRegisterAllowed(0xA10); +SetRegisterAllowed(0xA14); +SetRegisterAllowed(0xA18); +SetRegisterAllowed(0xA1C); +SetRegisterAllowed(0xA20); +SetRegisterAllowed(0xA24); +SetRegisterAllowed(0xA28); +SetRegisterAllowed(0xA2C); +SetRegisterAllowed(0xA30); +SetRegisterAllowed(0xA34); +SetRegisterAllowed(0xA38); +SetRegisterAllowed(0xA3C); +SetRegisterAllowed(0xA40); +SetRegisterAllowed(0xA44); +SetRegisterAllowed(0xA48); +SetRegisterAllowed(0xA4C); +SetRegisterAllowed(0xA50); +SetRegisterAllowed(0xA54); +SetRegisterAllowed(0xA58); +SetRegisterAllowed(0xA5C); +SetRegisterAllowed(0xA60); +SetRegisterAllowed(0xA64); +SetRegisterAllowed(0xA68); +SetRegisterAllowed(0xA6C); +SetRegisterAllowed(0xA70); +SetRegisterAllowed(0xA74); +SetRegisterAllowed(0xA78); +SetRegisterAllowed(0xA7C); +SetRegisterAllowed(0xA80); +SetRegisterAllowed(0xA84); +SetRegisterAllowed(0xA88); +SetRegisterAllowed(0xA8C); +SetRegisterAllowed(0xA90); +SetRegisterAllowed(0xA94); +SetRegisterAllowed(0xA98); +SetRegisterAllowed(0xA9C); +SetRegisterAllowed(0xAA0); +SetRegisterAllowed(0xAA4); +SetRegisterAllowed(0xAA8); +SetRegisterAllowed(0xAAC); +SetRegisterAllowed(0xAB0); +SetRegisterAllowed(0xAB4); +SetRegisterAllowed(0xAB8); +SetRegisterAllowed(0xABC); +SetRegisterAllowed(0xAC0); +SetRegisterAllowed(0xAC4); +SetRegisterAllowed(0xAC8); +SetRegisterAllowed(0xACC); +SetRegisterAllowed(0xAD0); +SetRegisterAllowed(0xAD4); +SetRegisterAllowed(0xAD8); +SetRegisterAllowed(0xADC); +SetRegisterAllowed(0xAE0); +SetRegisterAllowed(0xAE4); +SetRegisterAllowed(0xAE8); +SetRegisterAllowed(0xAEC); +SetRegisterAllowed(0xAF0); +SetRegisterAllowed(0xAF4); +SetRegisterAllowed(0xAF8); +SetRegisterAllowed(0xAFC); +SetRegisterAllowed(0xB00); +SetRegisterAllowed(0xB04); +SetRegisterAllowed(0xB08); +SetRegisterAllowed(0xB0C); +SetRegisterAllowed(0xB10); +SetRegisterAllowed(0xB14); +SetRegisterAllowed(0xB18); +SetRegisterAllowed(0xB1C); +SetRegisterAllowed(0xB20); +SetRegisterAllowed(0xB24); +SetRegisterAllowed(0xB28); +SetRegisterAllowed(0xB2C); +SetRegisterAllowed(0xB30); +SetRegisterAllowed(0xB34); +SetRegisterAllowed(0xB38); +SetRegisterAllowed(0xB3C); +SetRegisterAllowed(0xB40); +SetRegisterAllowed(0xB44); +SetRegisterAllowed(0xB48); +SetRegisterAllowed(0xB4C); +SetRegisterAllowed(0xB50); +SetRegisterAllowed(0xB54); +SetRegisterAllowed(0xB58); +SetRegisterAllowed(0xB5C); +SetRegisterAllowed(0xB60); +SetRegisterAllowed(0xB64); +SetRegisterAllowed(0xB68); +SetRegisterAllowed(0xB6C); +SetRegisterAllowed(0xB70); +SetRegisterAllowed(0xB74); +SetRegisterAllowed(0xB78); +SetRegisterAllowed(0xB7C); +SetRegisterAllowed(0xB80); +SetRegisterAllowed(0xB84); +SetRegisterAllowed(0xB88); +SetRegisterAllowed(0xB8C); +SetRegisterAllowed(0xB90); +SetRegisterAllowed(0xB94); +SetRegisterAllowed(0xB98); +SetRegisterAllowed(0xB9C); +SetRegisterAllowed(0xBA0); +SetRegisterAllowed(0xBA4); +SetRegisterAllowed(0xBA8); +SetRegisterAllowed(0xBAC); +SetRegisterAllowed(0xBB0); +SetRegisterAllowed(0xBB4); +SetRegisterAllowed(0xBB8); +SetRegisterAllowed(0xBBC); +SetRegisterAllowed(0xBC0); +SetRegisterAllowed(0xBC4); +SetRegisterAllowed(0xBC8); +SetRegisterAllowed(0xBCC); +SetRegisterAllowed(0xBD0); +SetRegisterAllowed(0xBD4); +SetRegisterAllowed(0xBD8); +SetRegisterAllowed(0xBDC); +SetRegisterAllowed(0xBE0); +SetRegisterAllowed(0xBE4); +SetRegisterAllowed(0xBE8); +SetRegisterAllowed(0xBEC); +SetRegisterAllowed(0xBF0); +SetRegisterAllowed(0xBF4); +SetRegisterAllowed(0xBF8); +SetRegisterAllowed(0xBFC); +SetRegisterAllowed(0xC00); +SetRegisterAllowed(0xC04); +SetRegisterAllowed(0xC08); +SetRegisterAllowed(0xC0C); +SetRegisterAllowed(0xC10); +SetRegisterAllowed(0xC14); +SetRegisterAllowed(0xC18); +SetRegisterAllowed(0xC1C); +SetRegisterAllowed(0xC20); +SetRegisterAllowed(0xC24); +SetRegisterAllowed(0xC28); +SetRegisterAllowed(0xC2C); +SetRegisterAllowed(0xC30); +SetRegisterAllowed(0xC34); +SetRegisterAllowed(0xC38); +SetRegisterAllowed(0xC3C); +SetRegisterAllowed(0xC40); +SetRegisterAllowed(0xC44); +SetRegisterAllowed(0xC48); +SetRegisterAllowed(0xC4C); +SetRegisterAllowed(0xC50); +SetRegisterAllowed(0xC54); +SetRegisterAllowed(0xC58); +SetRegisterAllowed(0xC5C); +SetRegisterAllowed(0xC60); +SetRegisterAllowed(0xC64); +SetRegisterAllowed(0xC68); +SetRegisterAllowed(0xC6C); +SetRegisterAllowed(0xC70); +SetRegisterAllowed(0xC74); +SetRegisterAllowed(0xC78); +SetRegisterAllowed(0xC7C); +SetRegisterAllowed(0xC80); +SetRegisterAllowed(0xC84); +SetRegisterAllowed(0xC88); +SetRegisterAllowed(0xC8C); +SetRegisterAllowed(0xC90); +SetRegisterAllowed(0xC94); +SetRegisterAllowed(0xC98); +SetRegisterAllowed(0xC9C); +SetRegisterAllowed(0xCA0); +SetRegisterAllowed(0xCA4); +SetRegisterAllowed(0xCA8); +SetRegisterAllowed(0xCAC); +SetRegisterAllowed(0xCB0); +SetRegisterAllowed(0xCB4); +SetRegisterAllowed(0xCB8); +SetRegisterAllowed(0xCBC); +SetRegisterAllowed(0xCC0); +SetRegisterAllowed(0xCC4); +SetRegisterAllowed(0xCC8); +SetRegisterAllowed(0xCCC); +SetRegisterAllowed(0xCD0); +SetRegisterAllowed(0xCD4); +SetRegisterAllowed(0xCD8); +SetRegisterAllowed(0xCDC); +SetRegisterAllowed(0xCE0); +SetRegisterAllowed(0xCE4); +SetRegisterAllowed(0xCE8); +SetRegisterAllowed(0xCEC); +SetRegisterAllowed(0xCF0); +SetRegisterAllowed(0xCF4); +SetRegisterAllowed(0xCF8); +SetRegisterAllowed(0xCFC); +SetRegisterAllowed(0xD00); +SetRegisterAllowed(0xD04); +SetRegisterAllowed(0xD08); +SetRegisterAllowed(0xD0C); +SetRegisterAllowed(0xD10); +SetRegisterAllowed(0xD14); +SetRegisterAllowed(0xD18); +SetRegisterAllowed(0xD1C); +SetRegisterAllowed(0xD20); +SetRegisterAllowed(0xD24); +SetRegisterAllowed(0xD28); +SetRegisterAllowed(0xD2C); +SetRegisterAllowed(0xD30); +SetRegisterAllowed(0xD34); +SetRegisterAllowed(0xD38); +SetRegisterAllowed(0xD3C); +SetRegisterAllowed(0xD40); +SetRegisterAllowed(0xD44); +SetRegisterAllowed(0xD48); +SetRegisterAllowed(0xD4C); +SetRegisterAllowed(0xD50); +SetRegisterAllowed(0xD54); +SetRegisterAllowed(0xD58); +SetRegisterAllowed(0xD5C); +SetRegisterAllowed(0xD60); +SetRegisterAllowed(0xD64); +SetRegisterAllowed(0xD68); +SetRegisterAllowed(0xD6C); +SetRegisterAllowed(0xD70); +SetRegisterAllowed(0xD74); +SetRegisterAllowed(0xD78); +SetRegisterAllowed(0xD7C); +SetRegisterAllowed(0xD80); +SetRegisterAllowed(0xD84); +SetRegisterAllowed(0xD88); +SetRegisterAllowed(0xD8C); +SetRegisterAllowed(0xD90); +SetRegisterAllowed(0xD94); +SetRegisterAllowed(0xD98); +SetRegisterAllowed(0xD9C); +SetRegisterAllowed(0xDA0); +SetRegisterAllowed(0xDA4); +SetRegisterAllowed(0xDA8); +SetRegisterAllowed(0xDAC); +SetRegisterAllowed(0xDB0); +SetRegisterAllowed(0xDB4); +SetRegisterAllowed(0xDB8); +SetRegisterAllowed(0xDBC); +SetRegisterAllowed(0xDC0); +SetRegisterAllowed(0xDC4); +SetRegisterAllowed(0xDC8); +SetRegisterAllowed(0xDCC); +SetRegisterAllowed(0xDD0); +SetRegisterAllowed(0xDD4); +SetRegisterAllowed(0xDD8); +SetRegisterAllowed(0xDDC); +SetRegisterAllowed(0xDE0); +SetRegisterAllowed(0xDE4); +SetRegisterAllowed(0xDE8); +SetRegisterAllowed(0xDEC); +SetRegisterAllowed(0xDF0); +SetRegisterAllowed(0xDF4); +SetRegisterAllowed(0xDF8); +SetRegisterAllowed(0xDFC); +SetRegisterAllowed(0xE00); +SetRegisterAllowed(0xE04); +SetRegisterAllowed(0xE08); +SetRegisterAllowed(0xE0C); +SetRegisterAllowed(0xE10); +SetRegisterAllowed(0xE14); +SetRegisterAllowed(0xE18); +SetRegisterAllowed(0xE1C); +SetRegisterAllowed(0xE20); +SetRegisterAllowed(0xE24); +SetRegisterAllowed(0xE28); +SetRegisterAllowed(0xE2C); +SetRegisterAllowed(0xE30); +SetRegisterAllowed(0xE34); +SetRegisterAllowed(0xE38); +SetRegisterAllowed(0xE3C); +SetRegisterAllowed(0xE40); +SetRegisterAllowed(0xE44); +SetRegisterAllowed(0xE48); +SetRegisterAllowed(0xE4C); +SetRegisterAllowed(0xE50); +SetRegisterAllowed(0xE54); +SetRegisterAllowed(0xE58); +SetRegisterAllowed(0xE5C); +SetRegisterAllowed(0xE60); +SetRegisterAllowed(0xE64); +SetRegisterAllowed(0xE68); +SetRegisterAllowed(0xE6C); +SetRegisterAllowed(0xE70); +SetRegisterAllowed(0xE74); +SetRegisterAllowed(0xE78); +SetRegisterAllowed(0xE7C); +SetRegisterAllowed(0xE80); +SetRegisterAllowed(0xE84); +SetRegisterAllowed(0xE88); +SetRegisterAllowed(0xE8C); +SetRegisterAllowed(0xE90); +SetRegisterAllowed(0xE94); +SetRegisterAllowed(0xE98); +SetRegisterAllowed(0xE9C); +SetRegisterAllowed(0xEA0); +SetRegisterAllowed(0xEA4); +SetRegisterAllowed(0xEA8); +SetRegisterAllowed(0xEAC); +SetRegisterAllowed(0xEB0); +SetRegisterAllowed(0xEB4); +SetRegisterAllowed(0xEB8); +SetRegisterAllowed(0xEBC); +SetRegisterAllowed(0xEC0); +SetRegisterAllowed(0xEC4); +SetRegisterAllowed(0xEC8); +SetRegisterAllowed(0xECC); +SetRegisterAllowed(0xED0); +SetRegisterAllowed(0xED4); +SetRegisterAllowed(0xED8); +SetRegisterAllowed(0xEDC); +SetRegisterAllowed(0xEE0); +SetRegisterAllowed(0xEE4); +SetRegisterAllowed(0xEE8); +SetRegisterAllowed(0xEEC); +SetRegisterAllowed(0xEF0); +SetRegisterAllowed(0xEF4); +SetRegisterAllowed(0xEF8); +SetRegisterAllowed(0xEFC); +SetRegisterAllowed(0xF00); +SetRegisterAllowed(0xF04); +SetRegisterAllowed(0xF08); +SetRegisterAllowed(0xF0C); +SetRegisterAllowed(0xF10); +SetRegisterAllowed(0xF14); +SetRegisterAllowed(0xF18); +SetRegisterAllowed(0xF1C); +SetRegisterAllowed(0xF20); +SetRegisterAllowed(0xF24); +SetRegisterAllowed(0xF28); +SetRegisterAllowed(0xF2C); +SetRegisterAllowed(0xF30); +SetRegisterAllowed(0xF34); +SetRegisterAllowed(0xF38); +SetRegisterAllowed(0xF3C); +SetRegisterAllowed(0xF40); +SetRegisterAllowed(0xF44); +SetRegisterAllowed(0xF48); +SetRegisterAllowed(0xF4C); +SetRegisterAllowed(0xF50); +SetRegisterAllowed(0xF54); +SetRegisterAllowed(0xF58); +SetRegisterAllowed(0xF5C); +SetRegisterAllowed(0xF60); +SetRegisterAllowed(0xF64); +SetRegisterAllowed(0xF68); +SetRegisterAllowed(0xF6C); +SetRegisterAllowed(0xF70); +SetRegisterAllowed(0xF74); +SetRegisterAllowed(0xF78); +SetRegisterAllowed(0xF7C); +SetRegisterAllowed(0xF80); +SetRegisterAllowed(0xF84); +SetRegisterAllowed(0xF88); +SetRegisterAllowed(0xF8C); +SetRegisterAllowed(0xF90); +SetRegisterAllowed(0xF94); +SetRegisterAllowed(0xF98); +SetRegisterAllowed(0xF9C); +SetRegisterAllowed(0xFA0); +SetRegisterAllowed(0xFA4); +SetRegisterAllowed(0xFA8); +SetRegisterAllowed(0xFAC); +SetRegisterAllowed(0xFB0); +SetRegisterAllowed(0xFB4); +SetRegisterAllowed(0xFB8); +SetRegisterAllowed(0xFBC); +SetRegisterAllowed(0xFC0); +SetRegisterAllowed(0xFC4); +SetRegisterAllowed(0xFC8); +SetRegisterAllowed(0xFCC); +SetRegisterAllowed(0xFD0); +SetRegisterAllowed(0xFD4); +SetRegisterAllowed(0xFD8); +SetRegisterAllowed(0xFDC); +SetRegisterAllowed(0xFE0); +SetRegisterAllowed(0xFE4); +SetRegisterAllowed(0xFE8); +SetRegisterAllowed(0xFEC); +SetRegisterAllowed(0xFF0); +SetRegisterAllowed(0xFF4); +SetRegisterAllowed(0xFF8); +SetRegisterAllowed(0xFFC); diff --git a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp index 88757041..d42f6583 100644 --- a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp +++ b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp @@ -99,16 +99,20 @@ namespace ams::secmon::smc { #include "secmon_define_pmc_access_table.inc" #include "secmon_define_mc_access_table.inc" #include "secmon_define_emc_access_table.inc" + #include "secmon_define_flow_controller_access_table.inc" + #include "secmon_define_exception_vectors_access_table.inc" #include "secmon_define_rtc_pmc_access_table.inc" #include "secmon_define_mc01_access_table.inc" constexpr const AccessTableEntry AccessTables[] = { - { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, - { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, - { EmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExternalMemoryController.GetAddress(), EmcAccessTable::Address, EmcAccessTable::Size, }, - { RtcPmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceRtcPmc.GetAddress(), RtcPmcAccessTable::Address, RtcPmcAccessTable::Size, }, - { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, - { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController1.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController1.GetAddress(), Mc01AccessTable::Size, }, + { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, + { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, + { EmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExternalMemoryController.GetAddress(), EmcAccessTable::Address, EmcAccessTable::Size, }, + { FlowControllerAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceFlowController.GetAddress(), FlowControllerAccessTable::Address, FlowControllerAccessTable::Size, }, + { ExceptionVectorsAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExceptionVectors.GetAddress(), ExceptionVectorsAccessTable::Address, ExceptionVectorsAccessTable::Size, }, + { RtcPmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceRtcPmc.GetAddress(), RtcPmcAccessTable::Address, RtcPmcAccessTable::Size, }, + { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, + { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController1.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController1.GetAddress(), Mc01AccessTable::Size, }, }; constexpr bool IsAccessAllowed(const AccessTableEntry &entry, uintptr_t address) { diff --git a/build.sh b/build.sh index 95846d70..31712ab7 100755 --- a/build.sh +++ b/build.sh @@ -110,13 +110,17 @@ if [ "$NO_EXO" -eq 0 ]; then EXO_DEST="build/atmosphere/exosphere/program/source/smc" LIBEXO_DEST="build/atmosphere/libraries/libexosphere/include/exosphere/secmon" - cp -v "$EXO_SRC/secmon_emc_access_table_data.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_define_emc_access_table.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_rtc_pmc_access_table_data.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_define_rtc_pmc_access_table.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_smc_register_access.cpp" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_smc_handler.cpp" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_memory_layout.hpp" "$LIBEXO_DEST/" + cp -v "$EXO_SRC/secmon_define_emc_access_table.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_emc_access_table_data.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_define_rtc_pmc_access_table.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_rtc_pmc_access_table_data.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_define_flow_controller_access_table.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_flow_controller_access_table_data.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_define_exception_vectors_access_table.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_exception_vectors_access_table_data.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_smc_register_access.cpp" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_smc_handler.cpp" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_memory_layout.hpp" "$LIBEXO_DEST/" fi CCACHE_MKS="build/atmosphere/libraries/config/common.mk From bd468f087deb35460cfa704e90950048ed9aa480 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 24 Aug 2026 21:21:50 -0400 Subject: [PATCH 066/205] hocclk: add bpmpfw loading --- Source/hoc-clk/bpmpfw/Makefile | 44 +++++ Source/hoc-clk/bpmpfw/bpmpfw.ld | 151 ++++++++++++++++++ Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 0 -> 272 bytes Source/hoc-clk/bpmpfw/source/main.cpp | 9 ++ Source/hoc-clk/bpmpfw/source/regs.hpp | 42 +++++ Source/hoc-clk/bpmpfw/source/start.s | 65 ++++++++ Source/hoc-clk/build.sh | 9 ++ Source/hoc-clk/sysmodule/Makefile | 2 +- Source/hoc-clk/sysmodule/src/board/board.cpp | 12 +- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 +- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 140 ++++++++++++++++ Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp | 23 +++ .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 24 +++ .../hoc-clk/sysmodule/src/mapping/mem_map.hpp | 2 + 14 files changed, 522 insertions(+), 3 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/Makefile create mode 100644 Source/hoc-clk/bpmpfw/bpmpfw.ld create mode 100644 Source/hoc-clk/bpmpfw/out/bpmpfw.bin create mode 100644 Source/hoc-clk/bpmpfw/source/main.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/regs.hpp create mode 100644 Source/hoc-clk/bpmpfw/source/start.s create mode 100644 Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp create mode 100644 Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp diff --git a/Source/hoc-clk/bpmpfw/Makefile b/Source/hoc-clk/bpmpfw/Makefile new file mode 100644 index 00000000..0631e56b --- /dev/null +++ b/Source/hoc-clk/bpmpfw/Makefile @@ -0,0 +1,44 @@ +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif +include $(DEVKITARM)/base_rules + +TARGET := bpmpfw +BUILDDIR := build +OUTPUTDIR := out +SOURCEDIR := source + +OBJS := $(BUILDDIR)/start.o $(BUILDDIR)/main.o + +ARCH := -march=armv4t -mtune=arm7tdmi -mthumb-interwork +CXXFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -fno-exceptions -fno-rtti \ + -fno-unwind-tables -fno-threadsafe-statics -ffunction-sections -fdata-sections \ + -fomit-frame-pointer -std=gnu++20 -Wall -Wextra $(CUSTOMDEFINES) +ASFLAGS := $(ARCH) -g +LDFLAGS := $(ARCH) -nostartfiles -nodefaultlibs -Wl,--nmagic,--gc-sections \ + -T $(SOURCEDIR)/../bpmpfw.ld -lgcc + +BIN_TARGET := $(OUTPUTDIR)/$(TARGET).bin + +.PHONY: all clean + +all: $(BIN_TARGET) + +$(BIN_TARGET): $(BUILDDIR)/$(TARGET).elf + @mkdir -p $(OUTPUTDIR) + $(OBJCOPY) -S -O binary $< $@ + +$(BUILDDIR)/$(TARGET).elf: $(OBJS) + @$(CXX) $(LDFLAGS) $(OBJS) -o $@ + +$(BUILDDIR)/%.o: $(SOURCEDIR)/%.cpp | $(BUILDDIR) + @$(CXX) $(CXXFLAGS) -I$(SOURCEDIR) -c $< -o $@ + +$(BUILDDIR)/%.o: $(SOURCEDIR)/%.s | $(BUILDDIR) + @$(CXX) $(ASFLAGS) -I$(SOURCEDIR) -c $< -o $@ + +$(BUILDDIR): + @mkdir -p $(BUILDDIR) + +clean: + @rm -rf $(BUILDDIR) $(OUTPUTDIR) diff --git a/Source/hoc-clk/bpmpfw/bpmpfw.ld b/Source/hoc-clk/bpmpfw/bpmpfw.ld new file mode 100644 index 00000000..dc63a2ad --- /dev/null +++ b/Source/hoc-clk/bpmpfw/bpmpfw.ld @@ -0,0 +1,151 @@ +OUTPUT_ARCH(arm) +ENTRY(reset) + +MEMORY +{ + bpmpfw : ORIGIN = 0x40004000, LENGTH = 32K +} + +SECTIONS +{ + PROVIDE(__start__ = ORIGIN(bpmpfw)); + . = __start__; + __code_start = . ; + + .vectors : + { + KEEP (*(.vectors .vectors.*)) + . = ALIGN(8); + } >bpmpfw + + .text : + { + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(.text .stub .text.* .gnu.linkonce.t.*) + . = ALIGN(8); + } >bpmpfw + + .init : + { + KEEP( *(.init) ) + . = ALIGN(8); + } >bpmpfw + + .plt : + { + *(.plt) + *(.iplt) + . = ALIGN(8); + } >bpmpfw + + .fini : + { + KEEP( *(.fini) ) + . = ALIGN(8); + } >bpmpfw + + . = ALIGN(8); + __rodata_start = . ; + + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + . = ALIGN(8); + } >bpmpfw + + .eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } >bpmpfw + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } >bpmpfw + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >bpmpfw + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } >bpmpfw + + .hash : { *(.hash) } >bpmpfw + + . = ALIGN(8); + __data_start = . ; + + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } >bpmpfw + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >bpmpfw + .gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } >bpmpfw + .exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } >bpmpfw + + .preinit_array ALIGN(8) : + { + PROVIDE (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + } >bpmpfw + + .init_array ALIGN(8) : + { + PROVIDE (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE (__init_array_end = .); + } >bpmpfw + + .fini_array ALIGN(8) : + { + PROVIDE (__fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE (__fini_array_end = .); + } >bpmpfw + + .ctors ALIGN(8) : + { + KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >bpmpfw + + .dtors ALIGN(8) : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >bpmpfw + + __got_start__ = .; + + .got : { *(.got) *(.igot) } >bpmpfw + .got.plt : { *(.got.plt) *(.igot.plt) } >bpmpfw + + __got_end__ = .; + + .data ALIGN(8) : + { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } >bpmpfw + + __bss_start__ = .; + .bss ALIGN(8) : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(16); + } >bpmpfw + __bss_end__ = .; + + __end__ = ABSOLUTE(.) ; + + __stack_top = ORIGIN(bpmpfw) + LENGTH(bpmpfw) - 0x10; + + /DISCARD/ : { *(.group .comment .note .interp .ARM.attributes) } + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } +} diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin new file mode 100644 index 0000000000000000000000000000000000000000..8f7b8bdf1930cf30adf7cd862c2737682ba60da6 GIT binary patch literal 272 zcmWe)V0fhh#L)r^9_uj7f2yM}|7nQ9q^AlD!jJ#_|Ig(h(Dam1;KNe}hQP-^{{NQ} z0Llv(%zw&a(Dd~0|NpN(I50RcBrp^JVZsRp28RP5G#+36p!vAs!u+QdK=UdD=09an zSn!yUA>bh+1H&p7g@z};f%;M$=08mdnE#ZOA><)5NStBH6aEJa9t!-|fA|w9f9wDM z*B(IqG6wyR7zHjr0ol*Nz`!M;QBpOs$oIM`}(^zCv12ey)O3fNy}VTR0a30|Nj>N_6%B literal 0 HcmV?d00001 diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp new file mode 100644 index 00000000..bcbb764d --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -0,0 +1,9 @@ +#include "regs.hpp" + +extern "C" void main() { + UartPuts("[bpmpfw]: Hello from BPMP-FW\n"); + + for (;;) { + FlowCtlrHaltUsec(200); + } +} diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp new file mode 100644 index 00000000..dc7d3761 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -0,0 +1,42 @@ +#pragma once +#include + +using u8 = std::uint8_t; +using u16 = std::uint16_t; +using u32 = std::uint32_t; + +#define MMIO32(addr) (*reinterpret_cast(addr)) + +constexpr u32 FlowCtlrBase = 0x60007000; +constexpr u32 FlowCtlrHaltCopEvents = 0x004; + +constexpr u32 HaltModeWaitEvent = (2u << 29); +constexpr u32 HaltUsec = (0u << 24); + +inline void FlowCtlrHaltUsec(u32 usec) { + MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | (usec & 0xFFFFFFu); +} + +constexpr u32 UartBBase = 0x70006040; +constexpr u32 UartThr = 0x00; +constexpr u32 UartLsr = 0x14; +constexpr u32 UartLsrThre = (1u << 5); + +inline void UartPutc(char c) { + while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) + ; + MMIO32(UartBBase + UartThr) = static_cast(static_cast(c)); +} + +inline void UartPuts(const char *s) { + while (*s) { + UartPutc(*s++); + } +} + +inline void UartPutHex32(u32 v) { + static const char digits[] = "0123456789ABCDEF"; + for (int i = 28; i >= 0; i -= 4) { + UartPutc(digits[(v >> i) & 0xF]); + } +} diff --git a/Source/hoc-clk/bpmpfw/source/start.s b/Source/hoc-clk/bpmpfw/source/start.s new file mode 100644 index 00000000..afabaa9c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/start.s @@ -0,0 +1,65 @@ +.section .vectors, "ax", %progbits +.align 3 +.global reset +reset: + b _start + b _panic + +.section .text.start, "ax", %progbits +.align 3 +.global _start +.extern main +_start: + /* Mask IRQ + FIQ, enter SVC mode. */ + msr cpsr_f, #0xC0 + msr cpsr_cf, #0xD3 + + /* Set the stack pointer. */ + ldr sp, =__stack_top + + /* Zero .bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 +1: + cmp r0, r1 + bge 2f + str r2, [r0], #4 + b 1b +2: + + /* Run global constructors. */ + ldr r4, =__init_array_start + ldr r5, =__init_array_end +3: + cmp r4, r5 + bge 4f + ldr r0, [r4], #4 + mov lr, pc + bx r0 + b 3b +4: + + bl main + +.global _panic +_panic: + ldr r0, =0x70006040 /* UART_B_BASE */ + adr r3, _panic_msg +7: + ldrb r1, [r3], #1 + cmp r1, #0 + beq _panic_hang +8: + ldr r2, [r0, #0x14] /* UART_LSR */ + tst r2, #0x20 /* UART_LSR_THRE */ + beq 8b + str r1, [r0] + b 7b + +_panic_msg: + .asciz "[bpmpfw] PANIC\n" + .align 2 + +_panic_hang: + b _panic_hang diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index b3de7e5f..f06780ec 100755 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -42,6 +42,15 @@ mkdir -p "$DIST_DIR/switch/.overlays" cp -vf "$ROOT_DIR/overlay/out/horizon-oc-overlay.ovl" "$DIST_DIR/switch/.overlays/horizon-oc-overlay.ovl" echo +echo "*** Compiling bpmpfw ***" +pushd "$ROOT_DIR/bpmpfw" +make -j$CORES +popd > /dev/null + +mkdir -p "$DIST_DIR/config/horizon-oc" +cp -vf "$ROOT_DIR/bpmpfw/out/bpmpfw.bin" "$DIST_DIR/config/horizon-oc/bpmpfw.bin" +echo + echo "*** Copying assets ***" mkdir -p "$DIST_DIR/config/horizon-oc" cp -vf "$ROOT_DIR/config.ini.template" "$DIST_DIR/config/horizon-oc/config.ini.template" diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index 03b7eb07..01693f80 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -22,7 +22,7 @@ CONFIG_DIR := horizon-oc BUILD := build OUTDIR := out RESOURCES := res -SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util +SOURCES := src src/hos src/i2c src/ipc src/board src/bpmp src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util DATA := data INCLUDES := ../common/include src/hos src/soc src/i2c src/util src/pwr src/ipc EXEFS_SRC := exefs_src diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 8923374a..8bfeb2bb 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -35,6 +35,7 @@ #include #include +#include "../bpmp/bpmp.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/file_utils.hpp" #include "../hos/apm_ext.h" @@ -52,7 +53,7 @@ namespace board { - u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; + u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr; HocClkSocType gSocType; u8 gDramID; @@ -153,6 +154,10 @@ namespace board { rc = QueryMemoryMapping(&fuseVirtAddr, 0x7000F000, 0x1000); ASSERT_RESULT_OK(rc, "QueryMemoryMapping (fuse)"); + rc = QueryMemoryMapping(&sysVirtAddr, 0x6000C000, 0x1000); + ASSERT_RESULT_OK(rc, "QueryMemoryMapping (sys)"); + actmonVirtAddr = sysVirtAddr + 0x800; + FetchHardwareInfos(); Result nvCheck = 1; @@ -173,6 +178,11 @@ namespace board { tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG + Result bpmpfwRc = bpmp::StartBpmfwExecution(); + if (R_FAILED(bpmpfwRc)) { + fileUtils::LogLine("[bpmp] StartBpmfwExecution failed: 0x%x", bpmpfwRc); + } + // PMC exosphere check SecmonArgs args = {}; args.X[0] = 0xF0000002; diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 0a50622b..313400af 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -42,7 +42,7 @@ #define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0)) namespace board { - extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; + extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr; extern HocClkSocType gSocType; extern u8 gDramID; extern HocClkConsoleType gConsoleType; diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp new file mode 100644 index 00000000..e7390bdc --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include + +#include "../board/board.hpp" +#include "../file/file_utils.hpp" +#include "../mapping/mem_map.hpp" +#include "bpmp.hpp" + +namespace bpmp { + + namespace { + + constexpr u64 FlowCtlrPhysBase = 0x60007000; + constexpr u64 EvpPhysBase = 0x6000F000; + + constexpr u32 ClkRstRstDevLSet = 0x300; + constexpr u32 ClkRstRstDevLClr = 0x304; + constexpr u32 RstDevLCopRstBit = (1u << 1); /* SWR_COP_RST */ + + constexpr u32 ApbMiscSlaveSecurityReg0 = 0xC00; + constexpr u32 ApbMiscSlaveSecurityReg1 = 0xC04; + constexpr u32 ApbMiscSlaveSecurityReg2 = 0xC08; + + /* Relative to actmonVirtAddr */ + constexpr u32 ActmonCopCtrl = 0xC0; + constexpr u32 ActmonCopIntrStatus = 0xE4; + + constexpr u32 EvpCopResetVector = 0x200; + constexpr u32 EvpCopUndefVector = 0x204; + constexpr u32 EvpCopSwiVector = 0x208; + constexpr u32 EvpCopPrefetchAbortVector = 0x20C; + constexpr u32 EvpCopDataAbortVector = 0x210; + constexpr u32 EvpCopRsvdVector = 0x214; + constexpr u32 EvpCopIrqVector = 0x218; + constexpr u32 EvpCopFiqVector = 0x21C; + + constexpr u32 FlowCtlrHaltCopEvents = 0x004; + constexpr u32 FlowModeNone = 0x00000000; + + constexpr u64 FwIramPhysBase = 0x40004000; + constexpr u32 FwStagingSize = 0x8000; + + alignas(4096) u8 s_fwStageBuf[FwStagingSize]; + + inline volatile u32 &Mmio(u64 base_va, u32 offset) { + return *reinterpret_cast(base_va + offset); + } + + } // namespace + + Result StartBpmfwExecution() { + if (!IsPatchedExosphere()) { + fileUtils::LogLine("[bpmp] Cannot start without patched exosphere"); + return (Result)1; + } + + std::memset(s_fwStageBuf, 0, sizeof(s_fwStageBuf)); + + FILE *f = fopen("sdmc:/config/horizon-oc/bpmpfw.bin", "rb"); + if (!f) { + fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin not found"); + return (Result)1; + } + + const size_t fw_size = fread(s_fwStageBuf, 1, sizeof(s_fwStageBuf), f); + fclose(f); + + if (fw_size == 0) { + fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin is empty"); + return (Result)1; + } + + fileUtils::LogLine("[bpmp] StartBpmfwExecution: loaded %zu bytes, loading at 0x%llx", + fw_size, static_cast(FwIramPhysBase)); + + /* Set BPMP reset */ + Mmio(board::clkVirtAddr, ClkRstRstDevLSet) = RstDevLCopRstBit; + + /* Grant BPMP access to all a bunch of registers that are useful */ + Mmio(board::apbVirtAddr, ApbMiscSlaveSecurityReg0) = 0; + Mmio(board::apbVirtAddr, ApbMiscSlaveSecurityReg1) = 0; + Mmio(board::apbVirtAddr, ApbMiscSlaveSecurityReg2) = 0; + + /* Set up exeption vectors for bpmp */ + const u32 fw_reset_vector = static_cast(FwIramPhysBase + 0x0); + const u32 fw_panic_vector = static_cast(FwIramPhysBase + 0x4); + + SmcReadWriteRegister(EvpPhysBase + EvpCopResetVector, 0xFFFFFFFF, fw_reset_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopUndefVector, 0xFFFFFFFF, fw_panic_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopSwiVector, 0xFFFFFFFF, fw_panic_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopPrefetchAbortVector, 0xFFFFFFFF, fw_panic_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopDataAbortVector, 0xFFFFFFFF, fw_panic_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopRsvdVector, 0xFFFFFFFF, fw_panic_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopIrqVector, 0xFFFFFFFF, fw_panic_vector); + SmcReadWriteRegister(EvpPhysBase + EvpCopFiqVector, 0xFFFFFFFF, fw_panic_vector); + + /* Disable actmon monitoring to avoid hang on FW >4.0.0 */ + Mmio(board::actmonVirtAddr, ActmonCopCtrl) = 0; + Mmio(board::actmonVirtAddr, ActmonCopIntrStatus) = Mmio(board::actmonVirtAddr, ActmonCopIntrStatus); + + /* Load the BPMPFW into iram per page. TODO: determine if this is nessesary */ + constexpr size_t PageSize = 4096; + for (size_t ofs = 0; ofs < fw_size; ofs += PageSize) { + const size_t chunk = (fw_size - ofs) < PageSize ? (fw_size - ofs) : PageSize; + + Result copy_rc = SmcCopyToIram(FwIramPhysBase + ofs, s_fwStageBuf + ofs, static_cast(chunk)); + if (R_FAILED(copy_rc)) { + fileUtils::LogLine("[bpmp] SmcCopyToIram failed at +0x%zx: 0x%x", ofs, copy_rc); + return copy_rc; + } + } + + /* Clear BPMP reset. */ + Mmio(board::clkVirtAddr, ClkRstRstDevLClr) = RstDevLCopRstBit; + + /* Clear the halt written by bootloader. */ + SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0xFFFFFFFF, FlowModeNone); + + return 0; + } + +} // namespace bpmp diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp new file mode 100644 index 00000000..e860f662 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include + +namespace bpmp { + Result StartBpmfwExecution(); +} diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index ae34021a..08d3a9d3 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -65,4 +65,28 @@ Result SmcCopyToIram(uintptr_t dest, const void *src, u32 size) { rc = (26u | ((u32)args.X[0] << 9u)); } return rc; +} + +bool IsPatchedExosphere() { + constexpr u64 EvpPhysBase = 0x6000F000; + constexpr u64 EvpCopResetVector = 0x200; + + SecmonArgs args = {}; + args.X[0] = 0xF0000002; + args.X[1] = EvpPhysBase + EvpCopResetVector; + args.X[2] = 0; + args.X[3] = 0; + svcCallSecureMonitor(&args); + + return args.X[0] == 0; +} + +u32 SmcReadWriteRegister(u64 phys_addr, u32 mask, u32 value) { + SecmonArgs args = {}; + args.X[0] = 0xF0000002; + args.X[1] = phys_addr; + args.X[2] = mask; + args.X[3] = value; + svcCallSecureMonitor(&args); + return (u32)args.X[1]; } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp index 6cb6e1be..fa5900aa 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp @@ -22,3 +22,5 @@ Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size); Result MapAddress(u64 &va, const u64 &physAddr, const char *name); Result SmcCopyFromIram(void *dest, uintptr_t src, u32 size); Result SmcCopyToIram(uintptr_t dest, const void *src, u32 size); +bool IsPatchedExosphere(); +u32 SmcReadWriteRegister(u64 phys_addr, u32 mask, u32 value); From a3b84004775cf1748696618838a121aee2d159dd Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 24 Aug 2026 21:42:25 -0400 Subject: [PATCH 067/205] make sleep mode work --- .../secmon_smc_power_management.cpp | 571 ++++++++++++++++++ Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 272 -> 256 bytes Source/hoc-clk/bpmpfw/source/main.cpp | 4 +- Source/hoc-clk/bpmpfw/source/regs.hpp | 2 +- .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 26 +- .../sysmodule/src/mgr/clock_manager.cpp | 18 + build.sh | 1 + 7 files changed, 609 insertions(+), 13 deletions(-) create mode 100644 Source/Atmosphere-Patches/secmon_smc_power_management.cpp diff --git a/Source/Atmosphere-Patches/secmon_smc_power_management.cpp b/Source/Atmosphere-Patches/secmon_smc_power_management.cpp new file mode 100644 index 00000000..4d2214da --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_smc_power_management.cpp @@ -0,0 +1,571 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include +#include "../secmon_cache.hpp" +#include "../secmon_cpu_context.hpp" +#include "../secmon_error.hpp" +#include "../secmon_misc.hpp" +#include "secmon_smc_power_management.hpp" +#include "secmon_smc_se_lock.hpp" + +#include "sc7fw_bin.h" + +namespace ams::secmon { + + /* Declare assembly functionality. */ + void *GetCoreExceptionStackVirtual(); + +} + +namespace ams::secmon::smc { + + /* Declare assembly power-management functionality. */ + void PivotStackAndInvoke(void *stack, void (*function)()); + void FinalizePowerOff(); + + namespace { + + constexpr inline const uintptr_t PMC = MemoryRegionVirtualDevicePmc.GetAddress(); + constexpr inline const uintptr_t APB_MISC = MemoryRegionVirtualDeviceApbMisc.GetAddress(); + constexpr inline const uintptr_t GPIO = MemoryRegionVirtualDeviceGpio.GetAddress(); + constexpr inline const uintptr_t CLK_RST = MemoryRegionVirtualDeviceClkRst.GetAddress(); + constexpr inline const uintptr_t EVP = secmon::MemoryRegionVirtualDeviceExceptionVectors.GetAddress(); + constexpr inline const uintptr_t FLOW_CTLR = MemoryRegionVirtualDeviceFlowController.GetAddress(); + constexpr inline const uintptr_t AHB_ARBC = MemoryRegionVirtualDeviceSystem.GetAddress(); + + constexpr inline uintptr_t CommonSmcStackTop = MemoryRegionVirtualTzramVolatileData.GetEndAddress() - (0x80 * (NumCores - 1)); + + enum PowerStateType { + PowerStateType_StandBy = 0, + PowerStateType_PowerDown = 1, + }; + + enum PowerStateId { + PowerStateId_Sc7 = 27, + }; + + /* http://infocenter.arm.com/help/topic/com.arm.doc.den0022d/Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf Page 46 */ + struct SuspendCpuPowerState { + using StateId = util::BitPack32::Field< 0, 16, PowerStateId>; + using StateType = util::BitPack32::Field<16, 1, PowerStateType>; + using PowerLevel = util::BitPack32::Field<24, 2, u32>; + }; + + constinit bool g_charger_hi_z_mode_enabled = false; + + constinit const reg::BitsMask CpuPowerGateStatusMasks[NumCores] = { + PMC_REG_BITS_MASK(PWRGATE_STATUS_CE0), + PMC_REG_BITS_MASK(PWRGATE_STATUS_CE1), + PMC_REG_BITS_MASK(PWRGATE_STATUS_CE2), + PMC_REG_BITS_MASK(PWRGATE_STATUS_CE3), + }; + + constinit const APBDEV_PMC_PWRGATE_TOGGLE_PARTID CpuPowerGateTogglePartitionIds[NumCores] = { + APBDEV_PMC_PWRGATE_TOGGLE_PARTID_CE0, + APBDEV_PMC_PWRGATE_TOGGLE_PARTID_CE1, + APBDEV_PMC_PWRGATE_TOGGLE_PARTID_CE2, + APBDEV_PMC_PWRGATE_TOGGLE_PARTID_CE3, + }; + + bool IsCpuPoweredOn(const reg::BitsMask mask) { + return reg::HasValue(PMC + APBDEV_PMC_PWRGATE_STATUS, REG_BITS_VALUE_FROM_MASK(mask, APBDEV_PMC_PWRGATE_STATUS_STATUS_ON)); + } + + void PowerOnCpu(const reg::BitsMask mask, u32 toggle_partid) { + /* If the cpu is already on, we have nothing to do. */ + if (IsCpuPoweredOn(mask)) { + return; + } + + /* Wait until nothing is being powergated. */ + int timeout = 5000; + while (true) { + if (reg::HasValue(PMC + APBDEV_PMC_PWRGATE_TOGGLE, PMC_REG_BITS_ENUM(PWRGATE_TOGGLE_START, DISABLE))) { + break; + } + + util::WaitMicroSeconds(1); + if ((--timeout) < 0) { + /* NOTE: Nintendo doesn't do any error handling here... */ + return; + } + } + + /* Toggle on the cpu partition. */ + reg::Write(PMC + APBDEV_PMC_PWRGATE_TOGGLE, PMC_REG_BITS_ENUM (PWRGATE_TOGGLE_START, ENABLE), + PMC_REG_BITS_VALUE(PWRGATE_TOGGLE_PARTID, toggle_partid)); + + /* Wait up to 5000 us for the powergate to complete. */ + timeout = 5000; + while (true) { + if (IsCpuPoweredOn(mask)) { + break; + } + + util::WaitMicroSeconds(1); + if ((--timeout) < 0) { + /* NOTE: Nintendo doesn't do any error handling here... */ + return; + } + } + } + + void ResetCpu(int which_core) { + reg::Write(CLK_RST + CLK_RST_CONTROLLER_RST_CPUG_CMPLX_SET, REG_BITS_VALUE(which_core + 0x00, 1, 1), /* CPURESETn */ + REG_BITS_VALUE(which_core + 0x10, 1, 1)); /* CORERESETn */ + } + + void StartCpu(int which_core) { + reg::Write(CLK_RST + CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR, REG_BITS_VALUE(which_core + 0x00, 1, 1), /* CPURESETn */ + REG_BITS_VALUE(which_core + 0x10, 1, 1)); /* CORERESETn */ + } + + void PowerOffCpuImpl() { + /* Get the current core id. */ + const auto core_id = hw::GetCurrentCoreId(); + + /* Configure the flow controller to prepare for shutting down the current core. */ + flow::SetCpuCsr(core_id, FLOW_CTLR_CPUN_CSR_ENABLE_EXT_POWERGATE_CPU_ONLY); + flow::SetHaltCpuEvents(core_id, false); + flow::SetCc4Ctrl(core_id, 0); + + /* Save the core's context for restoration on next power-on. */ + SaveDebugRegisters(); + SetCoreOff(); + + /* Ensure there are no pending memory transactions prior to our power-down. */ + FlushEntireDataCache(); + + /* Finalize our powerdown and wait for an interrupt. */ + FinalizePowerOff(); + } + + void ValidateSocStateForSuspend() { + /* Validate that all other cores are off. */ + AMS_ABORT_UNLESS(reg::HasValue(PMC + APBDEV_PMC_PWRGATE_STATUS, PMC_REG_BITS_VALUE(PWRGATE_STATUS_CE123, 0))); + + /* Horizon-OC: Halt BPMP here as hoc-clk may be running it, and if it's running there will be a panic. */ + const bool jtag = IsJtagEnabled(); + reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM (HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), + FLOW_REG_BITS_ENUM_SEL(HALT_COP_EVENTS_JTAG, jtag, ENABLED, DISABLED)); + + /* Validate that the bpmp is appropriately halted. */ + AMS_ABORT_UNLESS(reg::Read(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS) == reg::Encode(FLOW_REG_BITS_ENUM (HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), + FLOW_REG_BITS_ENUM_SEL(HALT_COP_EVENTS_JTAG, jtag, ENABLED, DISABLED))); + + /* Further validations aren't guaranteed on < 6.0.0. */ + if (GetTargetFirmware() < TargetFirmware_6_0_0) { + return; + } + + /* Validate that USB2, APB-DMA, AHB-DMA are held in reset. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_REG_BITS_ENUM(RST_DEVICES_H_SWR_USB2_RST, ENABLE), + CLK_RST_REG_BITS_ENUM(RST_DEVICES_H_SWR_APBDMA_RST, ENABLE), + CLK_RST_REG_BITS_ENUM(RST_DEVICES_H_SWR_AHBDMA_RST, ENABLE))); + + /* Validate that USBD is held in reset. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_RST_DEVICES_L, CLK_RST_REG_BITS_ENUM(RST_DEVICES_L_SWR_USBD_RST, ENABLE))); + + /* Validate that AHB-DMA, USB, USB2, COP are not allowed to arbitrate on the AHB. */ + AMS_ABORT_UNLESS(reg::HasValue(AHB_ARBC + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE), + AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_AHBDMA, DISABLE), + AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_USB, DISABLE), + AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_USB2, DISABLE))); + + /* Validate that the GPIO controller has clock enabled. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_CLK_OUT_ENB_L, CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_L_CLK_ENB_GPIO, ENABLE))); + + /* Validate that both FUSE and KFUSE have clock enabled. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_H_CLK_ENB_FUSE, ENABLE), + CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_H_CLK_ENB_KFUSE, ENABLE))); + + /* Validate that all of IRAM has clock enabled. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_CLK_OUT_ENB_U, CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_U_CLK_ENB_IRAMA, ENABLE), + CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_U_CLK_ENB_IRAMB, ENABLE), + CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_U_CLK_ENB_IRAMC, ENABLE), + CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_U_CLK_ENB_IRAMD, ENABLE))); + + /* Validate that ACTMON has clock enabled. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_CLK_OUT_ENB_V, CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_V_CLK_ENB_ACTMON, ENABLE))); + + /* Validate that ENTROPY has clock enabled. */ + AMS_ABORT_UNLESS(reg::HasValue(CLK_RST + CLK_RST_CONTROLLER_CLK_OUT_ENB_W, CLK_RST_REG_BITS_ENUM(CLK_OUT_ENB_W_CLK_ENB_ENTROPY, ENABLE))); + } + + void GenerateCryptographicallyRandomBytes(void * const dst, int size) { + /* Flush the region we're about to fill to ensure consistency with the SE. */ + hw::FlushDataCache(dst, size); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Generate random bytes. */ + se::GenerateRandomBytes(dst, size); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Flush to ensure the CPU sees consistent data for the region. */ + hw::FlushDataCache(dst, size); + hw::DataSynchronizationBarrierInnerShareable(); + } + + void SaveSecureContextForErista() { + /* Generate a random key source. */ + util::AlignedBuffer key_source; + GenerateCryptographicallyRandomBytes(key_source, se::AesBlockSize); + + const u32 * const key_source_32 = reinterpret_cast(static_cast(key_source)); + + /* Ensure that the key source registers are not locked. */ + AMS_ABORT_UNLESS(pmc::GetSecureRegisterLockState(pmc::SecureRegister_KeySourceReadWrite) != pmc::LockState::Locked); + + /* Write the key source, lock writes to the key source, and verify that the key source is write-locked. */ + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH24, key_source_32[0]); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH25, key_source_32[1]); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH26, key_source_32[2]); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH27, key_source_32[3]); + pmc::LockSecureRegister(pmc::SecureRegister_KeySourceWrite); + AMS_ABORT_UNLESS(pmc::GetSecureRegisterLockState(pmc::SecureRegister_KeySourceWrite) == pmc::LockState::Locked); + + /* Verify the key source is correct in registers, and read-lock the key source registers. */ + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH24) == key_source_32[0]); + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH25) == key_source_32[1]); + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH26) == key_source_32[2]); + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH27) == key_source_32[3]); + pmc::LockSecureRegister(pmc::SecureRegister_KeySourceRead); + + /* Ensure that the key source registers are locked. */ + AMS_ABORT_UNLESS(pmc::GetSecureRegisterLockState(pmc::SecureRegister_KeySourceReadWrite) == pmc::LockState::Locked); + + /* Generate a random kek into keyslot 2. */ + se::SetRandomKey(pkg1::AesKeySlot_TzramSaveKek); + + /* Verify that the se is in a validate state, context save, and validate again. */ + { + se::ValidateErrStatus(); + ON_SCOPE_EXIT { se::ValidateErrStatus(); }; + + { + /* Transition to non-secure mode for the duration of the context save operation. */ + se::SetSecure(false); + ON_SCOPE_EXIT { se::SetSecure(true); }; + + /* Get a pointer to the context storage. */ + se::Context * const context = MemoryRegionVirtualDramSecureDataStoreSecurityEngineState.GetPointer(); + static_assert(MemoryRegionVirtualDramSecureDataStoreSecurityEngineState.GetSize() == sizeof(*context)); + + /* Save the context. */ + se::SaveContext(context); + + /* Ensure that the cpu sees consistent data. */ + hw::FlushDataCache(context, sizeof(*context)); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Write the context pointer to pmc scratch, so that the bootrom will restore it on wake. */ + reg::Write(PMC + APBDEV_PMC_SCRATCH43, MemoryRegionPhysicalDramSecureDataStoreSecurityEngineState.GetAddress()); + } + } + + /* Clear keyslot 3, and then derive the save key. */ + se::ClearAesKeySlot(pkg1::AesKeySlot_TzramSaveKey); + se::SetEncryptedAesKey256(pkg1::AesKeySlot_TzramSaveKey, pkg1::AesKeySlot_TzramSaveKek, key_source, se::AesBlockSize); + + /* Declare a temporary block to be used as both iv and mac. */ + u32 temp_block[se::AesBlockSize / sizeof(u32)] = {}; + + /* Ensure that the SE sees consistent data for tzram. */ + const void * const tzram_save_src = MemoryRegionVirtualTzramReadOnlyAlias.GetPointer() + MemoryRegionVirtualTzramVolatileData.GetSize() + MemoryRegionVirtualTzramVolatileStack.GetSize(); + void * const tzram_save_dst = MemoryRegionVirtualIramSc7Work.GetPointer(); + constexpr size_t TzramSaveSize = MemoryRegionVirtualDramSecureDataStoreTzram.GetSize(); + + hw::FlushDataCache(tzram_save_src, TzramSaveSize); + hw::FlushDataCache(tzram_save_dst, TzramSaveSize); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Encrypt tzram using our random key. */ + se::EncryptAes256Cbc(tzram_save_dst, TzramSaveSize, pkg1::AesKeySlot_TzramSaveKey, tzram_save_src, TzramSaveSize, temp_block, se::AesBlockSize); + hw::FlushDataCache(tzram_save_dst, TzramSaveSize); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Copy the data from work space to the secure storage destination. */ + void * const tzram_store_dst = MemoryRegionVirtualDramSecureDataStoreTzram.GetPointer(); + std::memcpy(tzram_store_dst, tzram_save_dst, TzramSaveSize); + hw::FlushDataCache(tzram_store_dst, TzramSaveSize); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Compute cmac of tzram into our temporary block. */ + se::ComputeAes256Cmac(temp_block, se::AesBlockSize, pkg1::AesKeySlot_TzramSaveKey, tzram_save_src, TzramSaveSize); + + /* Ensure that the cmac registers are not locked. */ + AMS_ABORT_UNLESS(pmc::GetSecureRegisterLockState(pmc::SecureRegister_CmacReadWrite) != pmc::LockState::Locked); + + /* Write the cmac, lock writes to the cmac, and verify that the cmac is write-locked. */ + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH112, temp_block[0]); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH113, temp_block[1]); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH114, temp_block[2]); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH115, temp_block[3]); + pmc::LockSecureRegister(pmc::SecureRegister_CmacWrite); + AMS_ABORT_UNLESS(pmc::GetSecureRegisterLockState(pmc::SecureRegister_CmacWrite) == pmc::LockState::Locked); + + /* Verify the key source is correct in registers, and read-lock the key source registers. */ + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH112) == temp_block[0]); + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH113) == temp_block[1]); + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH114) == temp_block[2]); + AMS_ABORT_UNLESS(reg::Read(PMC + APBDEV_PMC_SECURE_SCRATCH115) == temp_block[3]); + pmc::LockSecureRegister(pmc::SecureRegister_CmacRead); + + /* Ensure that the key source registers are locked. */ + AMS_ABORT_UNLESS(pmc::GetSecureRegisterLockState(pmc::SecureRegister_CmacReadWrite) == pmc::LockState::Locked); + } + + void SaveSecureContextForMariko() { + /* Save security engine context to TZRAM SE carveout (inaccessible to cpu). */ + se::SaveContextAutomatic(); + + /* Save TZRAM to shadow-TZRAM in always-on power domain. */ + se::SaveTzramAutomatic(); + } + + void SaveSecureContext() { + /* Save the appropriate secure context. */ + const auto soc_type = GetSocType(); + if (soc_type == fuse::SocType_Erista) { + SaveSecureContextForErista(); + } else /* if (soc_type == fuse::SocType_Mariko) */ { + SaveSecureContextForMariko(); + } + + /* Save the debug code. */ + #if defined(AMS_BUILD_FOR_DEBUGGING) || defined(AMS_BUILD_FOR_AUDITING) + { + const void * const debug_code_src = MemoryRegionVirtualDebugCode.GetPointer(); + void * const debug_code_dst = MemoryRegionVirtualDramDebugDataStore.GetPointer(); + std::memcpy(debug_code_dst, debug_code_src, MemoryRegionVirtualDebugCode.GetSize()); + hw::FlushDataCache(debug_code_dst, MemoryRegionVirtualDebugCode.GetSize()); + hw::DataSynchronizationBarrierInnerShareable(); + } + #endif + } + + void LoadAndStartSc7BpmpFirmware() { + /* Set BPMP reset. */ + reg::Write(CLK_RST + CLK_RST_CONTROLLER_RST_DEV_L_SET, CLK_RST_REG_BITS_ENUM(RST_DEV_L_SET_SET_COP_RST, ENABLE)); + + /* Set the PMC as insecure, so that the BPMP firmware can access it. */ + reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, DISABLE)); + + /* Set the exception vectors for the bpmp. RESET should point to RESET, all others should point to generic exception/panic. */ + constexpr const u32 Sc7FirmwareResetVector = static_cast(MemoryRegionPhysicalIramSc7Firmware.GetAddress() + 0x0); + constexpr const u32 Sc7FirmwarePanicVector = static_cast(MemoryRegionPhysicalIramSc7Firmware.GetAddress() + 0x4); + + reg::Write(EVP + EVP_COP_RESET_VECTOR, Sc7FirmwareResetVector); + reg::Write(EVP + EVP_COP_UNDEF_VECTOR, Sc7FirmwarePanicVector); + reg::Write(EVP + EVP_COP_SWI_VECTOR, Sc7FirmwarePanicVector); + reg::Write(EVP + EVP_COP_PREFETCH_ABORT_VECTOR, Sc7FirmwarePanicVector); + reg::Write(EVP + EVP_COP_DATA_ABORT_VECTOR, Sc7FirmwarePanicVector); + reg::Write(EVP + EVP_COP_RSVD_VECTOR, Sc7FirmwarePanicVector); + reg::Write(EVP + EVP_COP_IRQ_VECTOR, Sc7FirmwarePanicVector); + reg::Write(EVP + EVP_COP_FIQ_VECTOR, Sc7FirmwarePanicVector); + + /* Disable activity monitor bpmp monitoring, so that we don't panic upon bpmp wake. */ + actmon::StopMonitoringBpmp(); + + /* Load the bpmp firmware. */ + void * const sc7fw_load_address = MemoryRegionVirtualIramSc7Firmware.GetPointer(); + std::memcpy(sc7fw_load_address, sc7fw_bin, sc7fw_bin_size); + hw::FlushDataCache(sc7fw_load_address, sc7fw_bin_size); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Ensure that the bpmp firmware was loaded. */ + AMS_ABORT_UNLESS(crypto::IsSameBytes(sc7fw_load_address, sc7fw_bin, sc7fw_bin_size)); + + /* Clear BPMP reset. */ + reg::Write(CLK_RST + CLK_RST_CONTROLLER_RST_DEV_L_CLR, CLK_RST_REG_BITS_ENUM(RST_DEV_L_CLR_CLR_COP_RST, ENABLE)); + + /* Start the bpmp. */ + reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_NONE)); + } + + void SaveSecureContextAndSuspend() { + /* Ensure there are no pending memory transactions before we continue */ + FlushEntireDataCache(); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Save all secure context (security engine state + tzram). */ + SaveSecureContext(); + + /* Load and start the sc7 firmware on the bpmp. */ + if (GetTargetFirmware() >= TargetFirmware_2_0_0) { + LoadAndStartSc7BpmpFirmware(); + } + + /* Log our suspension. */ + /* NOTE: Nintendo only does this on dev, but we will always do it. */ + if (true /* !pkg1::IsProduction() */) { + log::Initialize(secmon::GetLogPort(), secmon::GetLogBaudRate(), secmon::GetLogFlags()); + log::SendText("OYASUMI\n", 8); + log::Flush(); + } + + /* If we're on erista, configure the bootrom to allow our custom warmboot firmware. */ + if (GetSocType() == fuse::SocType_Erista) { + reg::Write(PMC + APBDEV_PMC_SCRATCH31, 0x2202E012); + reg::Write(PMC + APBDEV_PMC_SCRATCH32, 0x6001DC28); + } + + /* Finalize our powerdown and wait for an interrupt. */ + FinalizePowerOff(); + } + + SmcResult SuspendCpuImpl(SmcArguments &args) { + /* Decode arguments. */ + const util::BitPack32 power_state = { static_cast(args.r[1]) }; + const uintptr_t entry_point = args.r[2]; + const uintptr_t context_id = args.r[3]; + + const auto state_type = power_state.Get(); + const auto state_id = power_state.Get(); + + const auto core_id = hw::GetCurrentCoreId(); + + /* Validate arguments. */ + SMC_R_UNLESS(state_type == PowerStateType_PowerDown, PsciDenied); + SMC_R_UNLESS(state_id == PowerStateId_Sc7, PsciDenied); + + /* Orchestrate charger transition to Hi-Z mode if needed. */ + if (IsChargerHiZModeEnabled()) { + /* Ensure we can do comms over i2c-1. */ + clkrst::EnableI2c1Clock(); + + /* If the charger isn't in hi-z mode, perform a transition. */ + if (!charger::IsHiZMode()) { + charger::EnterHiZMode(); + + /* Wait up to 50ms for the transition to complete. */ + const auto start_time = util::GetMicroSeconds(); + auto current_time = start_time; + while ((current_time - start_time) <= 50'000) { + if (auto intr_status = reg::Read(GPIO + 0x634); (intr_status & 1) == 0) { + /* Wait 256 us to ensure the transition completes. */ + util::WaitMicroSeconds(256); + break; + } + current_time = util::GetMicroSeconds(); + } + } + + /* Disable i2c-1, since we're done communicating over it. */ + clkrst::DisableI2c1Clock(); + } + + /* Enable wake event detection. */ + pmc::EnableWakeEventDetection(); + + /* Ensure that i2c-5 is usable for communicating with the pmic. */ + clkrst::EnableI2c5Clock(); + i2c::Initialize(i2c::Port_5); + + /* Orchestrate sleep entry with the pmic. */ + pmic::EnableSleep(); + + /* Ensure that the soc is in a state valid for us to suspend. */ + if (GetTargetFirmware() >= TargetFirmware_2_0_0) { + ValidateSocStateForSuspend(); + } + + /* Configure the pmc for sc7 entry. */ + pmc::ConfigureForSc7Entry(); + + /* Configure the flow controller for sc7 entry. */ + flow::SetCc4Ctrl(core_id, 0); + flow::SetHaltCpuEvents(core_id, false); + flow::ClearL2FlushControl(); + flow::SetCpuCsr(core_id, FLOW_CTLR_CPUN_CSR_ENABLE_EXT_POWERGATE_CPU_TURNOFF_CPURAIL); + + /* Save the entry context. */ + SetEntryContext(core_id, entry_point, context_id); + + /* Configure the cpu context for reset. */ + SaveDebugRegisters(); + SetCoreOff(); + SetResetExpected(true); + + /* Switch to use the common smc stack (all other cores are off), and perform suspension. */ + PivotStackAndInvoke(reinterpret_cast(CommonSmcStackTop), SaveSecureContextAndSuspend); + + /* This code will never be reached. */ + __builtin_unreachable(); + } + + } + + void PowerOffCpu() { + /* Get the current core id. */ + const auto core_id = hw::GetCurrentCoreId(); + + /* Note that we're expecting a reset for the current core. */ + SetResetExpected(true); + + /* If we're on the final core, shut down directly. Otherwise, invoke with special stack. */ + if (core_id == NumCores - 1) { + PowerOffCpuImpl(); + } else { + PivotStackAndInvoke(GetCoreExceptionStackVirtual(), PowerOffCpuImpl); + } + + /* This code will never be reached. */ + __builtin_unreachable(); + } + + SmcResult SmcPowerOffCpu(SmcArguments &args) { + AMS_UNUSED(args); + + PowerOffCpu(); + } + + SmcResult SmcPowerOnCpu(SmcArguments &args) { + /* Get and validate the core to power on. */ + const int which_core = args.r[1]; + SMC_R_UNLESS(0 <= which_core && which_core < NumCores, PsciInvalidParameters); + + /* Ensure the core isn't already on. */ + SMC_R_UNLESS(!IsCoreOn(which_core), PsciAlreadyOn); + + /* Save the entry context. */ + SetEntryContext(which_core, args.r[2], args.r[3]); + + /* Reset the cpu. */ + ResetCpu(which_core); + + /* Turn on the core. */ + PowerOnCpu(CpuPowerGateStatusMasks[which_core], CpuPowerGateTogglePartitionIds[which_core]); + + /* Start the core. */ + StartCpu(which_core); + + return SmcResult::PsciSuccess; + } + + SmcResult SmcSuspendCpu(SmcArguments &args) { + return LockSecurityEngineAndInvoke(args, SuspendCpuImpl); + } + + bool IsChargerHiZModeEnabled() { + return g_charger_hi_z_mode_enabled; + } + + void SetChargerHiZModeEnabled(bool en) { + g_charger_hi_z_mode_enabled = en; + } + +} diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 8f7b8bdf1930cf30adf7cd862c2737682ba60da6..c6d35308e322f2761369c563bf5e403edcee3fe5 100644 GIT binary patch delta 67 zcmbQh)W9Uj$H4GP0f?go7Ccs9nEzB^qM*FMzyJSVJ#b)fU`SvnU;u)N0UnI^CeC!` NWpD%v!tlhG>Hyt`6lVYc delta 83 zcmZo*n!qF|#K7=M1&E^s7ChErnEzB~qM*EjfWrKz0tWM+vKTZy{rms_s}Bwg4h#tl e1wfc^f`P$dqJszHt%;q^yaJ944sbm2raAz%`Wu}9 diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index bcbb764d..e08baa22 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -3,7 +3,5 @@ extern "C" void main() { UartPuts("[bpmpfw]: Hello from BPMP-FW\n"); - for (;;) { - FlowCtlrHaltUsec(200); - } + for (;;); } diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index dc7d3761..00efd9eb 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -13,7 +13,7 @@ constexpr u32 FlowCtlrHaltCopEvents = 0x004; constexpr u32 HaltModeWaitEvent = (2u << 29); constexpr u32 HaltUsec = (0u << 24); -inline void FlowCtlrHaltUsec(u32 usec) { +[[maybe_unused]] inline void FlowCtlrHaltUsec(u32 usec) { MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | (usec & 0xFFFFFFu); } diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index 08d3a9d3..f0d52b4d 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -68,17 +68,25 @@ Result SmcCopyToIram(uintptr_t dest, const void *src, u32 size) { } bool IsPatchedExosphere() { - constexpr u64 EvpPhysBase = 0x6000F000; - constexpr u64 EvpCopResetVector = 0x200; + static bool checked = false; + static bool patched = false; - SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = EvpPhysBase + EvpCopResetVector; - args.X[2] = 0; - args.X[3] = 0; - svcCallSecureMonitor(&args); + if (!checked) { + constexpr u64 EvpPhysBase = 0x6000F000; + constexpr u64 EvpCopResetVector = 0x200; - return args.X[0] == 0; + SecmonArgs args = {}; + args.X[0] = 0xF0000002; + args.X[1] = EvpPhysBase + EvpCopResetVector; + args.X[2] = 0; + args.X[3] = 0; + svcCallSecureMonitor(&args); + + patched = (args.X[0] == 0); + checked = true; + } + + return patched; } u32 SmcReadWriteRegister(u64 phys_addr, u32 mask, u32 value) { diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index c035c11e..cfe53c29 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -30,6 +30,7 @@ #include #include "../board/board.hpp" +#include "../bpmp/bpmp.hpp" #include "../display/aula.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" @@ -40,6 +41,7 @@ #include "../hos/process_management.hpp" #include "../i2c/i2cDrv.h" #include "../ipc/ipc_service.hpp" +#include "../mapping/mem_map.hpp" #include "../soc/gm20b.hpp" #include "../util/lockable_mutex.h" #include "clock_manager.hpp" @@ -355,6 +357,22 @@ namespace clockManager { if (++tick > 10) { tick = 0; + // Restart BPMP after sleep. + if (IsPatchedExosphere()) { + constexpr u32 FlowCtlrPhysBase = 0x60007000; + constexpr u32 FlowCtlrHaltCopEvents = 0x004; + constexpr u32 HaltCopEventsModeShift = 29; + constexpr u32 HaltCopEventsModeStop = 2; + + u32 haltReg = SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0, 0); + if ((haltReg >> HaltCopEventsModeShift) == HaltCopEventsModeStop) { + Result rc = bpmp::StartBpmfwExecution(); + if (R_FAILED(rc)) { + fileUtils::LogLine("[bpmp] restart after sleep failed: 0x%x", rc); + } + } + } + if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); } diff --git a/build.sh b/build.sh index 31712ab7..edceb3b6 100755 --- a/build.sh +++ b/build.sh @@ -120,6 +120,7 @@ if [ "$NO_EXO" -eq 0 ]; then cp -v "$EXO_SRC/secmon_exception_vectors_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_smc_register_access.cpp" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_smc_handler.cpp" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_smc_power_management.cpp" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_memory_layout.hpp" "$LIBEXO_DEST/" fi From ea288b1e9a8eeb7f4dd07710fe285ed87ba5213b Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 24 Aug 2026 22:00:10 -0400 Subject: [PATCH 068/205] attempt to fix fs journaling crashes --- Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index cfe53c29..c1d5103b 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -359,6 +359,7 @@ namespace clockManager { // Restart BPMP after sleep. if (IsPatchedExosphere()) { + svcSleepThread(1'000'000'000); constexpr u32 FlowCtlrPhysBase = 0x60007000; constexpr u32 FlowCtlrHaltCopEvents = 0x004; constexpr u32 HaltCopEventsModeShift = 29; From 76606501292cbe7142768f3a75670ad25be67b22 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 24 Aug 2026 22:00:33 -0400 Subject: [PATCH 069/205] raise to 1.5S --- Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index c1d5103b..223692ab 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -359,7 +359,7 @@ namespace clockManager { // Restart BPMP after sleep. if (IsPatchedExosphere()) { - svcSleepThread(1'000'000'000); + svcSleepThread(1'500'000'000); constexpr u32 FlowCtlrPhysBase = 0x60007000; constexpr u32 FlowCtlrHaltCopEvents = 0x004; constexpr u32 HaltCopEventsModeShift = 29; From b20d20edff99a3bfa7c358a3dd2132cf3eb7e7b2 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 13:37:05 -0400 Subject: [PATCH 070/205] more bpmpfw shenanigans --- Source/hoc-clk/bpmpfw/Makefile | 31 +- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 256 -> 2392 bytes Source/hoc-clk/bpmpfw/source/libc/LICENSE | 21 ++ .../bpmpfw/source/libc/include/assert.h | 6 + .../source/libc/include/fslc/fslc_assert.h | 35 ++ .../source/libc/include/fslc/fslc_stdio.h | 74 ++++ .../source/libc/include/fslc/fslc_stdlib.h | 25 ++ .../source/libc/include/fslc/fslc_string.h | 50 +++ .../bpmpfw/source/libc/include/fslc/stdlibx.h | 23 ++ .../bpmpfw/source/libc/include/fslc/stringx.h | 33 ++ .../bpmpfw/source/libc/include/stdio.h | 6 + .../bpmpfw/source/libc/include/stdlib.h | 6 + .../bpmpfw/source/libc/include/string.h | 6 + .../bpmpfw/source/libc/src/fslc_bsearch.c | 12 + .../bpmpfw/source/libc/src/fslc_bsearch_i.c | 31 ++ .../bpmpfw/source/libc/src/fslc_fprintf.c | 10 + .../bpmpfw/source/libc/src/fslc_fputc.c | 12 + .../bpmpfw/source/libc/src/fslc_fputs.c | 15 + .../bpmpfw/source/libc/src/fslc_fputs_impl.c | 13 + .../bpmpfw/source/libc/src/fslc_memcmp.c | 38 ++ .../bpmpfw/source/libc/src/fslc_memcpy.c | 40 ++ .../bpmpfw/source/libc/src/fslc_memmove.c | 69 ++++ .../bpmpfw/source/libc/src/fslc_memset.c | 22 ++ .../bpmpfw/source/libc/src/fslc_memset_l.c | 31 ++ .../bpmpfw/source/libc/src/fslc_printf.c | 10 + .../bpmpfw/source/libc/src/fslc_putchar.c | 6 + .../bpmpfw/source/libc/src/fslc_puts.c | 21 ++ .../bpmpfw/source/libc/src/fslc_stdout.c | 3 + .../bpmpfw/source/libc/src/fslc_strchr.c | 10 + .../bpmpfw/source/libc/src/fslc_strcmp.c | 8 + .../bpmpfw/source/libc/src/fslc_strcpy.c | 8 + .../bpmpfw/source/libc/src/fslc_strcpy_e.c | 10 + .../bpmpfw/source/libc/src/fslc_strlen.c | 9 + .../bpmpfw/source/libc/src/fslc_strncmp.c | 8 + .../bpmpfw/source/libc/src/fslc_strncpy.c | 9 + .../bpmpfw/source/libc/src/fslc_strncpy_e.c | 9 + .../source/libc/src/fslc_strncpy_impl.c | 10 + .../bpmpfw/source/libc/src/fslc_strpbrk.c | 14 + .../bpmpfw/source/libc/src/fslc_strspn.c | 18 + .../bpmpfw/source/libc/src/fslc_strstr.c | 23 ++ .../bpmpfw/source/libc/src/fslc_strtok_r.c | 27 ++ .../bpmpfw/source/libc/src/fslc_vfprintf.c | 347 ++++++++++++++++++ .../bpmpfw/source/libc/src/fslc_vprintf.c | 6 + .../hoc-clk/bpmpfw/source/libc_platform.cpp | 18 + .../hoc-clk/bpmpfw/source/libc_platform.hpp | 3 + Source/hoc-clk/bpmpfw/source/main.cpp | 7 +- Source/hoc-clk/bpmpfw/source/regs.hpp | 5 + Source/hoc-clk/sysmodule/perms.json | 2 +- Source/hoc-clk/sysmodule/src/board/board.cpp | 3 + Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 76 ++++ Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp | 3 + .../hoc-clk/sysmodule/src/file/file_utils.cpp | 2 +- Source/hoc-clk/sysmodule/src/main.cpp | 2 +- .../sysmodule/src/mgr/clock_manager.cpp | 19 - 54 files changed, 1275 insertions(+), 30 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/source/libc/LICENSE create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/assert.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/stdio.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/string.h create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c create mode 100644 Source/hoc-clk/bpmpfw/source/libc_platform.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/libc_platform.hpp diff --git a/Source/hoc-clk/bpmpfw/Makefile b/Source/hoc-clk/bpmpfw/Makefile index 0631e56b..7af3a478 100644 --- a/Source/hoc-clk/bpmpfw/Makefile +++ b/Source/hoc-clk/bpmpfw/Makefile @@ -8,15 +8,26 @@ BUILDDIR := build OUTPUTDIR := out SOURCEDIR := source -OBJS := $(BUILDDIR)/start.o $(BUILDDIR)/main.o +LIBCDIR := $(SOURCEDIR)/libc -ARCH := -march=armv4t -mtune=arm7tdmi -mthumb-interwork +CPP_SOURCES := $(wildcard $(SOURCEDIR)/*.cpp) +C_SOURCES := $(wildcard $(LIBCDIR)/src/*.c) +S_SOURCES := $(wildcard $(SOURCEDIR)/*.s) + +OBJS := $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(CPP_SOURCES)) \ + $(patsubst $(LIBCDIR)/src/%.c,$(BUILDDIR)/libc/%.o,$(C_SOURCES)) \ + $(patsubst $(SOURCEDIR)/%.s,$(BUILDDIR)/%.o,$(S_SOURCES)) + +ARCH := -march=armv4t -mtune=arm7tdmi -mthumb-interwork +INCLUDE := -I$(SOURCEDIR) -I$(LIBCDIR)/include -I$(LIBCDIR)/include/fslc +CFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -ffunction-sections -fdata-sections \ + -fomit-frame-pointer -std=gnu11 -Wall -Wextra $(CUSTOMDEFINES) CXXFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -fno-exceptions -fno-rtti \ -fno-unwind-tables -fno-threadsafe-statics -ffunction-sections -fdata-sections \ -fomit-frame-pointer -std=gnu++20 -Wall -Wextra $(CUSTOMDEFINES) -ASFLAGS := $(ARCH) -g -LDFLAGS := $(ARCH) -nostartfiles -nodefaultlibs -Wl,--nmagic,--gc-sections \ - -T $(SOURCEDIR)/../bpmpfw.ld -lgcc +ASFLAGS := $(ARCH) -g +LDFLAGS := $(ARCH) -nostartfiles -nodefaultlibs -Wl,--nmagic,--gc-sections \ + -T $(SOURCEDIR)/../bpmpfw.ld -lgcc BIN_TARGET := $(OUTPUTDIR)/$(TARGET).bin @@ -32,13 +43,19 @@ $(BUILDDIR)/$(TARGET).elf: $(OBJS) @$(CXX) $(LDFLAGS) $(OBJS) -o $@ $(BUILDDIR)/%.o: $(SOURCEDIR)/%.cpp | $(BUILDDIR) - @$(CXX) $(CXXFLAGS) -I$(SOURCEDIR) -c $< -o $@ + @$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ + +$(BUILDDIR)/libc/%.o: $(LIBCDIR)/src/%.c | $(BUILDDIR)/libc + @$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ $(BUILDDIR)/%.o: $(SOURCEDIR)/%.s | $(BUILDDIR) - @$(CXX) $(ASFLAGS) -I$(SOURCEDIR) -c $< -o $@ + @$(CXX) $(ASFLAGS) $(INCLUDE) -c $< -o $@ $(BUILDDIR): @mkdir -p $(BUILDDIR) +$(BUILDDIR)/libc: | $(BUILDDIR) + @mkdir -p $(BUILDDIR)/libc + clean: @rm -rf $(BUILDDIR) $(OUTPUTDIR) diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index c6d35308e322f2761369c563bf5e403edcee3fe5..04f7484e7fc185549b63c040cb54d97b64e7ef0b 100644 GIT binary patch literal 2392 zcmcguU1$_n6h5=Fo2=_ND~T$ z&2A(pSsjSyxycLFXH#U=#vCDdg7}hp52RFko6$(<0 zDCmd7bv|V&mlS24gbmrn>fFvPiiPS zo0yA>_jSVZ{08ay&FmX{4AG~455uvXb7_|28QFcRj{0Qny@5Ke#bt+X1%~wWiz;K6 zlx2;=?}(1uCH)?Fq^CH)31DL^B)uSpn5(fjVGsHlIi(wchbo?*5}Q

G?t)9S-I4Lc%%i8#1ebbLDs#USEwkBEl<#7c|31 zvzXEs?^z?PF?OoBDueiG*l>>0uus_=RfFKT+k==W=7lH@hr%qhU%ucQBCG#GtPkNY z6LDi+9BV1|E`^`+y=zmbAzL;B8qHxXSV+Y3IEWxd><(j@k(emnSsb0ai{ zQZH&S?Ur;q*WL93@o8D7pwBw^jf)TN%Fi0)$8Zm+nsyDRPd$QtZP4nks0nj4#8usf zn7r1HwVlvWXqn1Jt`?9Z8*4vfydqBd<}b%2k>}ToqN*1YK|DW#UMec0ok1G^QOP=jhEJVO#Tk3Vh=Q_uz4CbxBZ}hUuGLIG((KpD(Urj=iD;KmC(=gcpsQ3>y@bc>E=k6jRnd5 z(#zVkipsFEnzac%9APX!+*;HnxQ%^M+{#5W{{e zP3c#FLr`h9RpCB3SJtiYWmJYGRX$c{p6QpS_$qkp$)YqXFUVLPwYEDYiE+h!b~0wj z1bXRAbBi2)wqGKaG;*do(RNs-;UfiopGR#(Wk8X0RrRhbR?m>Lz^udY2|=T?L%><> z3u_`siry-=I@|NRz|Ewg*%CNy`yZPPkxd_LHZxzmGZ(VERV(u0`nc21;?A;W)q~{4 zHDPY+qk1$zCkEwJ3ovrc)*#1gfUh&c%vh7+gkKNdN$hQjYBGqk^SJlmYr^=G!2a8< zyYb!t-c`6)`P_X7BZkS!!rI`aVeS4j<-s_fi zf_CtC!C0J*&+wgO;f(nk>)-#28e;!yaST0u1!uyxAc;I=>_L2!G*!Pz$jbAbIJfJy z+?%<5-Mejf!%JH>rHH>_7QP^d@BAztr}p5xW!D>T@9C)7Z$H>|;NbqZUbhz~aQ>6% mAu)gZ*S3QH#h-2r`{w6&&u^Tce+p*RpY4zn{aYPE{Qd*>2y(vw delta 133 zcmca1)WGDx$H4GP0f?go7Ccs9nEzBkVgAz)gGo;n7=$1H`Tw8GL7?d=qriu!3=Dyf zfBgS1_3!`xR}UN*92gQ93K)Q3as-D5)4l(b7jZb5FgOCmk+1_$O>|O0Zb4dktd)XC YYEDkRLRwLNu7Xp5Z-A~_I2TYq0B_AMdjJ3c diff --git a/Source/hoc-clk/bpmpfw/source/libc/LICENSE b/Source/hoc-clk/bpmpfw/source/libc/LICENSE new file mode 100644 index 00000000..3ea91fc4 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016 Jurģis Brigmanis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/assert.h b/Source/hoc-clk/bpmpfw/source/libc/include/assert.h new file mode 100644 index 00000000..a022cf62 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/assert.h @@ -0,0 +1,6 @@ +#ifndef _STD_ASSERT_H +#define _STD_ASSERT_H + +#include "fslc/fslc_assert.h" + +#endif /* _STD_ASSERT_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h new file mode 100644 index 00000000..131498df --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h @@ -0,0 +1,35 @@ +#ifndef FSLC_ASSERT_H +#define FSLC_ASSERT_H + +#ifndef ALT_FSLC_NAMES + +#define fslc_assert assert + +#endif /* ALT_FSLC_NAMES */ + + +#ifdef NDEBUG + +#define fslc_assert(expr) ((void)0) + +#else /* NDEBUG */ + +/* Note: __PRETTY_FUNCTION__ is GCC specific */ +#define fslc_assert(expr) ((expr) ? (void)0 : __fslc_assert_fail(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__)) + +#endif /* NDEBUG */ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + + void __fslc_assert_fail(const char *expr, const char *file, unsigned int line, const char *func); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FSLC_ASSERT_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h new file mode 100644 index 00000000..ffdc222d --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h @@ -0,0 +1,74 @@ +#ifndef FSLC_STDIO_H +#define FSLC_STDIO_H + +#include +#include + +#ifndef ALT_FSLC_NAMES + +#define FSLC_FILE FILE +#define fslc_stdout stdout +#define fslc_stdin stdin +#define fslc_putchar putchar +#define fslc_fputc fputc +#define fslc_fputs fputs +#define fslc_puts puts + +#define fslc_vfprintf vfprintf +#define fslc_vprintf vprintf +#define fslc_fprintf fprintf +#define fslc_printf printf + +#define fslc_fwrite fwrite +#define fslc_fread fread + +#define fslc_getc getc +#define fslc_getchar getchar +#define fslc_ungetc ungetc +#define fslc_fgets fgets + +#endif /* ALT_FSLC_NAMES */ + +typedef struct _FSLC_FILE FSLC_FILE; + +struct _FSLC_FILE +{ + void *user_ptr; + int (*putc)(int c, FSLC_FILE *stream); + int (*getc)(FSLC_FILE *stream); + void (*pre_output)(FSLC_FILE *stream); + void (*post_output)(FSLC_FILE *stream); + int ungetc_buf; +}; + +extern FSLC_FILE *fslc_stdout; +extern FSLC_FILE *fslc_stdin; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + int fslc_putchar(int c); + int fslc_fputc(int c, FSLC_FILE *stream); + int fslc_fputs(const char *str, FSLC_FILE *stream); + int fslc_puts(const char *str); + + int fslc_vfprintf(FSLC_FILE *stream, const char *format, va_list arg); + int fslc_vprintf(const char *format, va_list arg); + int fslc_fprintf(FSLC_FILE *stream, const char *format, ...); + int fslc_printf(const char *format, ...); + + size_t fslc_fwrite(const void *ptr, size_t size, size_t count, FSLC_FILE *stream); + size_t fslc_fread(void *ptr, size_t size, size_t count, FSLC_FILE *stream); + + int fslc_getc(FSLC_FILE *stream); + int fslc_getchar(void); + int fslc_ungetc(int c, FSLC_FILE *stream); + char *fslc_fgets(char *str, int num, FSLC_FILE *stream); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + + +#endif /* FSLC_STDIO_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h new file mode 100644 index 00000000..021b67aa --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h @@ -0,0 +1,25 @@ +#ifndef FSLC_STDLIB_H +#define FSLC_STDLIB_H + +#include + +#ifndef ALT_FSLC_NAMES + +#define fslc_bsearch bsearch + +#endif /* ALT_FSLC_NAMES */ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + + void *fslc_bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FSLC_STDLIB_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h new file mode 100644 index 00000000..a869054d --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h @@ -0,0 +1,50 @@ +#ifndef FSLC_STRING_H +#define FSLC_STRING_H + +#include + +#ifndef ALT_FSLC_NAMES +#define fslc_memset memset +#define fslc_memcpy memcpy +#define fslc_memmove memmove +#define fslc_memcmp memcmp + +#define fslc_strlen strlen +#define fslc_strcpy strcpy +#define fslc_strncpy strncpy +#define fslc_strcmp strcmp +#define fslc_strncmp strncmp +#define fslc_strchr strchr +#define fslc_strstr strstr +#define fslc_strpbrk strpbrk +#define fslc_strspn strspn +#define fslc_strtok_r strtok_r + +#endif /* ALT_FSLC_NAMES */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + void *fslc_memset(void *ptr, int value, size_t num); + void *fslc_memcpy(void *dest, const void *src, size_t len); + void *fslc_memmove(void *dest, const void *src, size_t len); + int fslc_memcmp(const void *ptr1, const void *ptr2, size_t num); + + size_t fslc_strlen(const char *str); + char *fslc_strcpy(char *dest, const char *src); + char *fslc_strncpy(char *dest, const char *src, size_t len); + int fslc_strcmp(const char *str1, const char *str2); + int fslc_strncmp(const char *str1, const char *str2, size_t num); + char *fslc_strchr(const char *str, int c); + char *fslc_strstr(const char *search_in, const char *search_for); + char *fslc_strpbrk(const char *str, const char *delim); + size_t fslc_strspn(const char *str, const char *delim); + char *fslc_strtok_r(char *str, const char *delim, char **save_p); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + + +#endif /* FSLC_STRING_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h new file mode 100644 index 00000000..2b86a1a4 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h @@ -0,0 +1,23 @@ +#ifndef FSLC_STDLIBX_H +#define FSLC_STDLIBX_H + +#include + +#ifndef ALT_FSLC_NAMES + +#define fslc_bsearch_i bsearch_i + +#endif /* ALT_FSLC_NAMES */ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + int fslc_bsearch_i(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FSLC_STDLIBX_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h new file mode 100644 index 00000000..193d8913 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h @@ -0,0 +1,33 @@ +#ifndef FSLC_STRINGX_H +#define FSLC_STRINGX_H + +#include + +#ifndef ALT_FSLC_NAMES + +#define fslc_memset_l memset_l +#define fslc_strcpy_e strcpy_e +#define fslc_strncpy_e strncpy_e + +#endif /* ALT_FSLC_NAMES */ + +#if __SIZEOF_LONG__ == 4 +#define memset_32 memset_l +#elif __SIZEOF_LONG__ == 8 +#define memset_32(A, V, S) memset_l(A, (((unsigned long)(V)<<32)|(V)), S) +#endif + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + void *fslc_memset_l(void *ptr, unsigned long value, size_t num); + char *fslc_strcpy_e(char *dest, const char *src); + char *fslc_strncpy_e(char *dest, const char *src, size_t len); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FSLC_STRINGX_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/stdio.h b/Source/hoc-clk/bpmpfw/source/libc/include/stdio.h new file mode 100644 index 00000000..fb4853f2 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/stdio.h @@ -0,0 +1,6 @@ +#ifndef _STD_STDIO_H +#define _STD_STDIO_H + +#include "fslc/fslc_stdio.h" + +#endif /* _STD_STDIO_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h b/Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h new file mode 100644 index 00000000..34259177 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h @@ -0,0 +1,6 @@ +#ifndef _STD_STDLIB_H +#define _STD_STDLIB_H + +#include "fslc/fslc_stdlib.h" + +#endif /* _STD_STDLIB_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/string.h b/Source/hoc-clk/bpmpfw/source/libc/include/string.h new file mode 100644 index 00000000..c35eec9c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/include/string.h @@ -0,0 +1,6 @@ +#ifndef _STD_STRING_H +#define _STD_STRING_H + +#include "fslc/fslc_string.h" + +#endif /* _STD_STRING_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c new file mode 100644 index 00000000..1f25f704 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c @@ -0,0 +1,12 @@ +#include "fslc_stdlib.h" +#include "stdlibx.h" + +void *fslc_bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)) +{ + int sidx = fslc_bsearch_i(key, base, num, size, cmp_proc); + + if (sidx < 0) + return NULL; + + return (char *)base + (sidx * size); +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c new file mode 100644 index 00000000..52cf54b4 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c @@ -0,0 +1,31 @@ +#include + +int fslc_bsearch_i(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)) +{ + int lo = 0; + int hi = num - 1; + + char *cbase = (char *)base; + + while (lo <= hi) + { + int i = lo + ((hi - lo) >> 1); + + char *ptr = cbase + (i * size); + int cmp = cmp_proc(key, ptr); + + if (cmp == 0) + return i; + + if (cmp > 0) + { + lo = i + 1; + } + else + { + hi = i - 1; + } + } + + return ~lo; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c new file mode 100644 index 00000000..688d5912 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c @@ -0,0 +1,10 @@ +#include "fslc_stdio.h" + +int fslc_fprintf(FSLC_FILE *stream, const char *format, ...) +{ + va_list args; + va_start(args, format); + int r = fslc_vfprintf(stream, format, args); + va_end(args); + return r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c new file mode 100644 index 00000000..2745b827 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c @@ -0,0 +1,12 @@ +#include "fslc_stdio.h" + +int fslc_fputc(int c, FSLC_FILE *stream) +{ + if (stream->pre_output) stream->pre_output(stream); + + int r = stream->putc(c, stream); + + if (stream->post_output) stream->post_output(stream); + + return r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c new file mode 100644 index 00000000..be8d13a9 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c @@ -0,0 +1,15 @@ +#include "fslc_stdio.h" + +int _fslc_fputs_impl(const char *str, FSLC_FILE *stream); + +int fslc_fputs(const char *str, FSLC_FILE *stream) +{ + if (stream->pre_output) stream->pre_output(stream); + + int r = _fslc_fputs_impl(str, stream); + + if (stream->post_output) stream->post_output(stream); + + return r; +} + diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c new file mode 100644 index 00000000..9743de6b --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c @@ -0,0 +1,13 @@ +#include "fslc_stdio.h" + +int _fslc_fputs_impl(const char *str, FSLC_FILE *stream) +{ + int res = 0; + for (;*str; ++str) + { + int pr = stream->putc(*str, stream); + if (pr < 0) return pr; + ++res; + } + return res; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c new file mode 100644 index 00000000..6719b878 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c @@ -0,0 +1,38 @@ +#include "fslc_string.h" +#include + +int fslc_memcmp(const void *ptr1, const void *ptr2, size_t num) +{ + unsigned char *b_p1 = (unsigned char *)ptr1; + unsigned char *b_p2 = (unsigned char *)ptr2; + + for (;((uintptr_t)b_p1 & (sizeof(long)-1)) && num > 0; ++b_p1, ++b_p2, --num) + { + if (*b_p1 != *b_p2) + { + return *b_p1 > *b_p2 ? 1 : -1; + } + } + + unsigned long *w_p1 = (unsigned long *)b_p1; + unsigned long *w_p2 = (unsigned long *)b_p2; + for (;num >= sizeof(unsigned long); ++w_p1, ++w_p2, num -= sizeof(unsigned long)) + { + if (*w_p1 != *w_p2) + { + return *w_p1 > *w_p2 ? 1 : -1; + } + } + + b_p1 = (unsigned char *)w_p1; + b_p2 = (unsigned char *)w_p2; + for (; num > 0; ++b_p1, ++b_p2, --num) + { + if (*b_p1 != *b_p2) + { + return *b_p1 > *b_p2 ? 1 : -1; + } + } + + return 0; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c new file mode 100644 index 00000000..2383248c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c @@ -0,0 +1,40 @@ +#include "fslc_string.h" +#include + +void *fslc_memcpy(void *dest, const void *src, size_t len) +{ + /* Copy byte-by-byte up to word-aligned. + * + * There's a possibility, that src and dest have different offsets + * to word boundary and can not both be used efficiently. + * + * In this case we use align to dest argument, because it then can be + * written in one operation, instead of read-modify-write of 2 words. + * + * Most of the time both parameters should be word-aligned, however. + */ + unsigned char *b_src = (unsigned char *)src; + unsigned char *b_dst = (unsigned char *)dest; + for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && len > 0; b_src++, b_dst++, len--) + { + *b_dst = *b_src; + } + + /* Then all word-aligned */ + unsigned long *w_src = (unsigned long*)b_src; + unsigned long *w_dst = (unsigned long*)b_dst; + for (;len >= sizeof(unsigned long); w_src++, w_dst++, len -= sizeof(unsigned long)) + { + *w_dst = *w_src; + } + + /* And byte-by-byte the rest */ + b_src = (unsigned char *)w_src; + b_dst = (unsigned char *)w_dst; + for (; len > 0; b_src++, b_dst++, len--) + { + *b_dst = *b_src; + } + + return dest; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c new file mode 100644 index 00000000..68426ca6 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c @@ -0,0 +1,69 @@ +#include "fslc_string.h" +#include + +void *fslc_memmove(void *dest, const void *src, size_t len) +{ + unsigned char *b_dst = (unsigned char *)dest; + unsigned char *b_src = (unsigned char *)src; + + /* Need to check if memory regions overlaps. Then if the dest address is + * larger than source, we need to copy backwards (or else source regions + * ending will be overwritten by writes to dest, before they are read). + * + * In other cases it works identically as memcpy(). Same considerations + * about address alignment applies here. + */ + if ( b_dst < b_src + len && b_dst > b_src) + { + b_src += len; + b_dst += len; + + /* Byte-by-byte down to word-aligned. */ + for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && len > 0; ) + { + b_src--, b_dst--, len--; + *b_dst = *b_src; + } + + /* Then all word-aligned */ + unsigned long *w_src = (unsigned long*)b_src; + unsigned long *w_dst = (unsigned long*)b_dst; + for (;len >= sizeof(unsigned long); ) + { + w_src--, w_dst--, len -= sizeof(unsigned long); + *w_dst = *w_src; + } + + /* And byte-by-byte the rest */ + b_src = (unsigned char *)w_src; + b_dst = (unsigned char *)w_dst; + for (; len > 0; ) + { + b_src--, b_dst--, len--; + *b_dst = *b_src; + } + } else { + /* Byte-by-byte up to word-aligned. */ + for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && len > 0; b_src++, b_dst++, len--) + { + *b_dst = *b_src; + } + + /* Then all word-aligned */ + unsigned long *w_src = (unsigned long *)b_src; + unsigned long *w_dst = (unsigned long *)b_dst; + for (;len >= sizeof(unsigned long); w_src++, w_dst++, len -= sizeof(unsigned long)) + { + *w_dst = *w_src; + } + + /* And byte-by-byte the rest */ + b_src = (unsigned char *)w_src; + b_dst = (unsigned char *)w_dst; + for (; len > 0; b_src++, b_dst++, len--) + { + *b_dst = *b_src; + } + } + return dest; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c new file mode 100644 index 00000000..321211f8 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c @@ -0,0 +1,22 @@ +#include "fslc_string.h" +#include "stringx.h" + +void *fslc_memset(void *ptr, int value, size_t num) +{ + /* Will use memset_l() to actually fill the memory region. If value is non-zero, we need + * to replicate lowest byte to all the long's bytes. + */ + if (value) + { + unsigned char c_val = value; + unsigned long l_val = (c_val << 0) | (c_val << 8) | (c_val << 16) | (c_val << 24); + + #if __SIZEOF_LONG__ == 8 + l_val |= l_val << 32; + #endif + + return fslc_memset_l(ptr, l_val, num); + } + else + return fslc_memset_l(ptr, value, num); +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c new file mode 100644 index 00000000..f4d46336 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c @@ -0,0 +1,31 @@ +#include "stringx.h" +#include + +void *fslc_memset_l(void *ptr, unsigned long value, size_t num) +{ + unsigned char *b_src = (unsigned char *)&value; + unsigned char *b_dst = (unsigned char *)ptr; + + /* Byte by byte - to aligned word address */ + b_src += ((uintptr_t)b_dst & (sizeof(unsigned long)-1)); + for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && num > 0; b_dst++,b_src++,num--) + { + *b_dst = *b_src; + } + + /* All aligned */ + unsigned long *w_dst = (unsigned long *)b_dst; + for (;num >= sizeof(unsigned long); w_dst++,num -= sizeof(unsigned long)) + { + *w_dst= value; + } + + /* Unaligned ending */ + b_src = (unsigned char *)&value; + b_dst = (unsigned char *)w_dst; + for (; num > 0; b_dst++,b_src++,num--) + { + *b_dst = *b_src; + } + return ptr; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c new file mode 100644 index 00000000..2609e377 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c @@ -0,0 +1,10 @@ +#include "fslc_stdio.h" + +int fslc_printf(const char *format, ...) +{ + va_list args; + va_start(args, format); + int r = fslc_vfprintf(fslc_stdout, format, args); + va_end(args); + return r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c new file mode 100644 index 00000000..d4c1a54d --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c @@ -0,0 +1,6 @@ +#include "fslc_stdio.h" + +int fslc_putchar(int c) +{ + return fslc_fputc(c, fslc_stdout); +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c new file mode 100644 index 00000000..c1f5d94c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c @@ -0,0 +1,21 @@ +#include "fslc_stdio.h" + +int _fslc_fputs_impl(const char *str, FSLC_FILE *stream); + +int fslc_puts(const char *str) +{ + if (fslc_stdout->pre_output) fslc_stdout->pre_output(fslc_stdout); + + int r = _fslc_fputs_impl(str, fslc_stdout); + + if (r >= 0) + { + int nlr = fslc_stdout->putc('\n', fslc_stdout); + if (nlr < 0) + r = nlr; + } + + if (fslc_stdout->post_output) fslc_stdout->post_output(fslc_stdout); + + return r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c new file mode 100644 index 00000000..5418196a --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c @@ -0,0 +1,3 @@ +#include "fslc_stdio.h" + +FSLC_FILE *fslc_stdout; diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c new file mode 100644 index 00000000..cf3e239c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c @@ -0,0 +1,10 @@ +#include "fslc_string.h" + +char *fslc_strchr(const char *str, int c) +{ + for (;*str; ++str) + if (*str == c) + return (char *)str; + + return NULL; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c new file mode 100644 index 00000000..216e147a --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c @@ -0,0 +1,8 @@ +#include "fslc_string.h" + +int fslc_strcmp(const char *str1, const char *str2) +{ + for( ; *str1 && *str1 == *str2; ++str1, ++str2); + + return *((unsigned char *)str1) - *((unsigned char *)str2); +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c new file mode 100644 index 00000000..e0fe5011 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c @@ -0,0 +1,8 @@ +#include "fslc_string.h" +#include "stringx.h" + +char *fslc_strcpy(char *dest, const char *src) +{ + fslc_strcpy_e(dest, src); + return dest; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c new file mode 100644 index 00000000..313243a5 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c @@ -0,0 +1,10 @@ +#include "stringx.h" + +char *fslc_strcpy_e(char *dest, const char *src) +{ + for(; *src; ++src, ++dest) + *dest = *src; + + *dest = 0; + return dest; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c new file mode 100644 index 00000000..15543224 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c @@ -0,0 +1,9 @@ +#include "fslc_string.h" + +size_t fslc_strlen(const char *str) +{ + size_t res = 0; + for(; *str; ++str) ++res; + + return res; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c new file mode 100644 index 00000000..3ad69714 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c @@ -0,0 +1,8 @@ +#include "fslc_string.h" + +int fslc_strncmp(const char *str1, const char *str2, size_t num) +{ + for( ; *str1 && *str1 == *str2 && num > 1; ++str1, ++str2, --num); + + return *((unsigned char *)str1) - *((unsigned char *)str2); +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c new file mode 100644 index 00000000..13e74f4a --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c @@ -0,0 +1,9 @@ +#include "fslc_string.h" + +char *_fslc_strncpy_impl(char *dest, const char *src, size_t len); + +char *fslc_strncpy(char *dest, const char *src, size_t len) +{ + _fslc_strncpy_impl(dest, src, len); + return dest; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c new file mode 100644 index 00000000..b0ab743e --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c @@ -0,0 +1,9 @@ +#include "stringx.h" + +char *_fslc_strncpy_impl(char *dest, const char *src, size_t len); + +char *fslc_strncpy_e(char *dest, const char *src, size_t len) +{ + char *r = _fslc_strncpy_impl(dest, src, len); + return *r ? r + 1: r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c new file mode 100644 index 00000000..76e80a3c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c @@ -0,0 +1,10 @@ +#include + +char *_fslc_strncpy_impl(char *dest, const char *src, size_t len) +{ + for(; *src && len > 1; ++src, ++dest, --len) + *dest = *src; + + *dest = *src; + return dest; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c new file mode 100644 index 00000000..743b5256 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c @@ -0,0 +1,14 @@ +#include "fslc_string.h" + +char *fslc_strpbrk(const char *str, const char *delim) +{ + for (; *str; ++str) + { + const char *d; + for (d = delim; *d; ++d) + if (*str == *d) + return (char *)str; + } + + return NULL; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c new file mode 100644 index 00000000..583a0d2d --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c @@ -0,0 +1,18 @@ +#include "fslc_string.h" + +size_t fslc_strspn(const char *str, const char *delim) +{ + size_t r; + + for (r = 0; *str; ++str, ++r) + { + const char *d; + for (d = delim; *d; ++d) + if (*str == *d) // skip to next if found + break; + + if (*d == 0) // inner loop exited on \0 - char was not there + break; + } + return r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c new file mode 100644 index 00000000..99966c97 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c @@ -0,0 +1,23 @@ +#include "fslc_string.h" + +char *fslc_strstr(const char *search_in, const char *search_for) +{ + while (*search_in) + { + char *rc = fslc_strchr(search_in, search_for[0]); // find first char + + if (rc) + { + const char *si = rc + 1, *sf = search_for + 1; // search strcmp-style from second char + for( ; *si && *si == *sf; ++si, ++sf); + + if (*sf == 0) return rc; // end of search-for - found result + + search_in = rc + 1; // not this one, continue from next char + } + else + return NULL; // did not find first char - exit + } + + return NULL; // reached end of source - did not find +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c new file mode 100644 index 00000000..5859eb5e --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c @@ -0,0 +1,27 @@ +#include "fslc_string.h" + +char *fslc_strtok_r(char *str, const char *delim, char **save_p) +{ + if (str) + *save_p = str; + + if (*save_p == NULL) + return NULL; + + char *r = *save_p + fslc_strspn(*save_p, delim); + + char *p = fslc_strpbrk(r, delim); + + if (p) + { + *(p++) = 0; + *save_p = p; + } + else + { + if (*r == 0) r = NULL; + *save_p = NULL; + } + + return r; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c new file mode 100644 index 00000000..53424299 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c @@ -0,0 +1,347 @@ +#include "fslc_stdio.h" + +/* There'a a funny behaviour of va_list and va_arg() macros: + * - on x86_64 compiler generates a branch of some sort for each va_arg() macro. Normally it is not a problem, + * however it kinda screws up branch coverage analysis. Therefore I decided to move va_arg() accesses into + * dedicated functions, minimizing the issue to one untaken branch per access function. + * - passing va_list by value works fine on x86_64, but makes some tests to fail on i386. It seems that modifications + * done by va_arg() is not passed back to caller. Subsequent calls to va_arg() or access functions returns wrong + * values on that platform. + * - OK, then. Let's pass pointer to va_list instead. Not so fast. Works fine on i386, but fails to compile on + * x86_64. Fine! Wrapping va_list into a dedicated struct and passing around pointer to it. + * + * Why such a fuss about a few untaken branches in tests? Well, just because! Also, if I ever decide to refactor + * _fslc_vfprintf_impl() - the case statement is getting a bit long and messy, it should make things easier if + * argument list can be passed around freely (as opposed to using it from single function). + */ + +struct va_list_w +{ + va_list arg; +}; + +/* Prototype for printf's internal implementation */ +static int _fslc_vfprintf_impl(FSLC_FILE *stream, const char *format, struct va_list_w *args); + + +/* Main exported function */ +int fslc_vfprintf(FSLC_FILE *stream, const char *format, va_list arg) +{ + if (stream->pre_output) stream->pre_output(stream); + + struct va_list_w argw; + va_copy(argw.arg, arg); // can not assign directly, should make a copy + + int res = _fslc_vfprintf_impl(stream, format, &argw); + + va_end(argw.arg); // and free it after use + + if (stream->post_output) stream->post_output(stream); + + return res; +} + +/* Prototype to private FSLIBC function - implemented elsewhere */ +int _fslc_fputs_impl(const char *str, FSLC_FILE *stream); + + +/* Prototypes for internal functions */ +static int _fslc_put_sint_l(signed long v, FSLC_FILE *stream); +static int _fslc_put_uint_l(unsigned long v, FSLC_FILE *stream); +static int _fslc_put_hex_l(unsigned long v, FSLC_FILE *stream, char alpha); + +static int _get_sint_arg(struct va_list_w *arg); +static unsigned _get_uint_arg(struct va_list_w *arg); +static long long _get_slonglong_arg(struct va_list_w *arg); +static unsigned long long _get_ulonglong_arg(struct va_list_w *arg); +static void *_get_ptr_arg(struct va_list_w *arg); + +/* There are some considerations when formatting Integers for output: + * - on 32-bit systems integers will mostly be 32 bits long, except when one REALLY + * wants to print long long. It should be more optimal to use 32-bit calculations + * when possible and invoke 64-bit only when needed. To support that we provide 2 + * separate implementations. + * - on 64-bit systems may be 32 or 64 bits, but there is no real benefit from + * using shorter bit size. Hence common implementation. + * - this library does not aim to support systems with shorter integer sizes (like 16-bit) + * but it it did, it would probably make sense to provide optimized ports for these cases + * as well. + * + * Buffer size calculations: + * Max UInt32 fits in 10 bytes (+1 for zero terminator) decimal + * 2**32 - 1 == 4294967295z + * FFFFFFFFz + * 01234567890 + * + * Max UInt64 fits in 10 bytes (and +1 for \0) + * 2**64 -1 == 18446744073709551615z + * FFFFFFFFFFFFFFFFz + * 012345678901234567890 + */ + +#define BUFSIZE_LONG_LONG_DECIMAL 20 +#define BUFSIZE_LONG_HEX (__SIZEOF_LONG__ * 2) +#define BUFSIZE_LONG_LONG_HEX (__SIZEOF_LONG_LONG__ * 2) +#if __SIZEOF_LONG__ == 4 + +#define BUFSIZE_LONG_DECIMAL 10 +static int _fslc_put_sint_ll(signed long long v, FSLC_FILE *stream); +static int _fslc_put_uint_ll(unsigned long long v, FSLC_FILE *stream); +static int _fslc_put_hex_ll(unsigned long long v, FSLC_FILE *stream, char alpha); + +#define _get_slong_arg _get_sint_arg +#define _get_ulong_arg _get_uint_arg + +#elif __SIZEOF_LONG__ == 8 + +#define BUFSIZE_LONG_DECIMAL BUFSIZE_LONG_LONG_DECIMAL +#define _fslc_put_sint_ll _fslc_put_sint_l +#define _fslc_put_uint_ll _fslc_put_uint_l +#define _fslc_put_hex_ll _fslc_put_hex_l + +#define _get_slong_arg _get_slonglong_arg +#define _get_ulong_arg _get_ulonglong_arg + +#endif + +#define FLAG_LONG 1 +#define FLAG_VERYLONG 3 + +static int _fslc_vfprintf_impl(FSLC_FILE *stream, const char *format, struct va_list_w *arg) +{ + int res = 0; + int pr; + const char *c; + + for (c = format; *c; ++c) + { + if (*c == '%') + { + int flags = 0; + + for (;;) + { + ++c; + switch (*c) + { + case 's': + pr = _fslc_fputs_impl((const char *)_get_ptr_arg(arg), stream); + if (pr < 0) return pr; + res += pr; + break; + + case 'c': + pr = stream->putc(_get_sint_arg(arg), stream); + if (pr < 0) return pr; + ++res; + break; + + case '%': + pr = stream->putc('%', stream); + if (pr < 0) return pr; + ++res; + break; + + case 'i': + case 'd': + if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) + pr = _fslc_put_sint_ll(_get_slonglong_arg(arg), stream); + else if (flags & FLAG_LONG) + pr = _fslc_put_sint_l(_get_slong_arg(arg), stream); + else + pr = _fslc_put_sint_l(_get_sint_arg(arg), stream); + + if (pr < 0) return pr; + res += pr; + break; + + case 'u': + if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) + pr = _fslc_put_uint_ll(_get_ulonglong_arg(arg), stream); + else if (flags & FLAG_LONG) + pr = _fslc_put_uint_l(_get_ulong_arg(arg), stream); + else + pr = _fslc_put_uint_l(_get_uint_arg(arg), stream); + + if (pr < 0) return pr; + res += pr; + break; + + case 'x': + if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) + pr = _fslc_put_hex_ll(_get_ulonglong_arg(arg), stream, 'a'); + else if (flags & FLAG_LONG) + pr = _fslc_put_hex_l(_get_ulong_arg(arg), stream, 'a'); + else + pr = _fslc_put_hex_l(_get_uint_arg(arg), stream, 'a'); + + if (pr < 0) return pr; + res += pr; + break; + + case 'X': + if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) + pr = _fslc_put_hex_ll(_get_ulonglong_arg(arg), stream, 'A'); + else if (flags & FLAG_LONG) + pr = _fslc_put_hex_l(_get_ulong_arg(arg), stream, 'A'); + else + pr = _fslc_put_hex_l(_get_uint_arg(arg), stream, 'A'); + + if (pr < 0) return pr; + res += pr; + break; + + case 'p': + pr = _fslc_fputs_impl("0x", stream); + if (pr < 0) return pr; + res += pr; + + pr = _fslc_put_hex_l(_get_ulong_arg(arg), stream, 'a'); + + if (pr < 0) return pr; + res += pr; + break; + + case 'l': + if (flags & FLAG_LONG) + flags |= FLAG_VERYLONG; + else + flags |= FLAG_LONG; + continue; + } + break; + } + } else { + pr = stream->putc(*c, stream); + if (pr < 0) return pr; + ++res; + } + } + + return res; +} + +static int _get_sint_arg(struct va_list_w *arg) +{ + return va_arg(arg->arg, signed int); +} + +static unsigned _get_uint_arg(struct va_list_w *arg) +{ + return va_arg(arg->arg, unsigned int); +} + +static long long _get_slonglong_arg(struct va_list_w *arg) +{ + return va_arg(arg->arg, signed long long); +} + +static unsigned long long _get_ulonglong_arg(struct va_list_w *arg) +{ + return va_arg(arg->arg, unsigned long long); +} + +static void *_get_ptr_arg(struct va_list_w *arg) +{ + return va_arg(arg->arg, void *); +} + +static int _fslc_put_sint_l(signed long v, FSLC_FILE *stream) +{ + if (v < 0) + { + int pr = stream->putc('-', stream); + if (pr < 0) return pr; + + pr = _fslc_put_uint_l(-v, stream); + if (pr < 0) return pr; + + return pr+1; + } else + return _fslc_put_uint_l(v, stream); +} + +static int _fslc_put_uint_l(unsigned long v, FSLC_FILE *stream) +{ + char dbuff[BUFSIZE_LONG_DECIMAL+1], *p; + + dbuff[BUFSIZE_LONG_DECIMAL] = 0; + + for (p = dbuff + BUFSIZE_LONG_DECIMAL; v ; v /= 10) + { + *(--p) = (v % 10) + '0'; + } + + if (*p == 0) *(--p) = '0'; + + return _fslc_fputs_impl(p, stream); +} + +static int _fslc_put_hex_l(unsigned long v, FSLC_FILE *stream, char alpha) +{ + char dbuff[BUFSIZE_LONG_HEX+1], *p; + + dbuff[BUFSIZE_LONG_HEX] = 0; + + for (p = dbuff + BUFSIZE_LONG_HEX; v ; v >>= 4) + { + char digit = (v & 0xF); + *(--p) = digit < 10 ? digit + '0' : digit - 10 + alpha; + } + + if (*p == 0) *(--p) = '0'; + + return _fslc_fputs_impl(p, stream); +} + +#if __SIZEOF_LONG__ == 4 + +static int _fslc_put_sint_ll(signed long long v, FSLC_FILE *stream) +{ + if (v < 0) + { + int pr = stream->putc('-', stream); + if (pr < 0) return pr; + + pr = _fslc_put_uint_ll(-v, stream); + if (pr < 0) return pr; + + return pr+1; + } else + return _fslc_put_uint_ll(v, stream); +} + +static int _fslc_put_uint_ll(unsigned long long v, FSLC_FILE *stream) +{ + char dbuff[BUFSIZE_LONG_LONG_DECIMAL+1], *p; + + dbuff[BUFSIZE_LONG_LONG_DECIMAL] = 0; + + for (p = dbuff + BUFSIZE_LONG_LONG_DECIMAL; v ; v /= 10) + { + *(--p) = (v % 10) + '0'; + } + + if (*p == 0) *(--p) = '0'; + + return _fslc_fputs_impl(p, stream); +} + +static int _fslc_put_hex_ll(unsigned long long v, FSLC_FILE *stream, char alpha) +{ + char dbuff[BUFSIZE_LONG_LONG_HEX+1], *p; + + dbuff[BUFSIZE_LONG_LONG_HEX] = 0; + + for (p = dbuff + BUFSIZE_LONG_LONG_HEX; v ; v >>= 4) + { + char digit = (v & 0xF); + *(--p) = digit < 10 ? digit + '0' : digit - 10 + alpha; + } + + if (*p == 0) *(--p) = '0'; + + return _fslc_fputs_impl(p, stream); +} + +#endif diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c new file mode 100644 index 00000000..6f5abd1e --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c @@ -0,0 +1,6 @@ +#include "fslc_stdio.h" + +int fslc_vprintf(const char *format, va_list arg) +{ + return fslc_vfprintf(fslc_stdout, format, arg); +} diff --git a/Source/hoc-clk/bpmpfw/source/libc_platform.cpp b/Source/hoc-clk/bpmpfw/source/libc_platform.cpp new file mode 100644 index 00000000..3f3efc4c --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc_platform.cpp @@ -0,0 +1,18 @@ +#include + +#include "regs.hpp" + +namespace { + + int UartStreamPutc(int c, FILE *) { + UartPutc(static_cast(c)); + return c; + } + + FILE g_uartStdout = { nullptr, UartStreamPutc, nullptr, nullptr, nullptr, -1 }; + +} // namespace + +void InitializeLibc() { + stdout = &g_uartStdout; +} diff --git a/Source/hoc-clk/bpmpfw/source/libc_platform.hpp b/Source/hoc-clk/bpmpfw/source/libc_platform.hpp new file mode 100644 index 00000000..4268a9c5 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/libc_platform.hpp @@ -0,0 +1,3 @@ +#pragma once + +void InitializeLibc(); diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index e08baa22..4e57d8db 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -1,7 +1,12 @@ +#include + +#include "libc_platform.hpp" #include "regs.hpp" extern "C" void main() { - UartPuts("[bpmpfw]: Hello from BPMP-FW\n"); + InitializeLibc(); + + printf("[hoc-bpmpfw] Starting bpmpfw\n"); for (;;); } diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index 00efd9eb..4f8d5965 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -7,6 +7,11 @@ using u32 = std::uint32_t; #define MMIO32(addr) (*reinterpret_cast(addr)) +constexpr u32 FwRamStart = 0x40004000; +constexpr u32 FwRamEnd = 0x4000C000; +constexpr u32 WorkRamStart = FwRamEnd; +constexpr u32 WorkRamEnd = 0x40010000; + constexpr u32 FlowCtlrBase = 0x60007000; constexpr u32 FlowCtlrHaltCopEvents = 0x004; diff --git a/Source/hoc-clk/sysmodule/perms.json b/Source/hoc-clk/sysmodule/perms.json index 01728ddf..57e821af 100644 --- a/Source/hoc-clk/sysmodule/perms.json +++ b/Source/hoc-clk/sysmodule/perms.json @@ -3,7 +3,7 @@ "title_id": "0x00FF0000636C6BFF", "title_id_range_min": "0x00FF0000636C6BFF", "title_id_range_max": "0x00FF0000636C6BFF", - "main_thread_stack_size": "0x0000C000", + "main_thread_stack_size": "0x0000F000", "main_thread_priority": 16, "default_cpu_id": 3, "process_category": 1, diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 8bfeb2bb..da191e6d 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -182,6 +182,7 @@ namespace board { if (R_FAILED(bpmpfwRc)) { fileUtils::LogLine("[bpmp] StartBpmfwExecution failed: 0x%x", bpmpfwRc); } + bpmp::StartSleepMonitorThread(); // PMC exosphere check SecmonArgs args = {}; @@ -211,6 +212,8 @@ namespace board { } void Exit() { + bpmp::StopSleepMonitorThread(); + if (HOSSVC_HAS_CLKRST) { clkrstExit(); } else { diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index e7390bdc..41c0792b 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -64,6 +64,38 @@ namespace bpmp { return *reinterpret_cast(base_va + offset); } + // Late in the boot chain, otherwise a fatal will occur from invalid boot state + constexpr u32 pscDependencies[] = { PscPmModuleId_Olsc }; + constexpr PscPmModuleId PscModuleId = (PscPmModuleId)705; + + PscPmModule s_pscModule; + bool s_pscPrepared = false; + Thread s_pscThread; + bool s_pscExit = false; + + void PscThreadFunc(void *) { + while (!s_pscExit) { + Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); + if (R_FAILED(rc)) { + continue; // Timeout + } + + PscPmState state; + u32 flags; + rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); + if (R_SUCCEEDED(rc)) { + if (state == PscPmState_Awake) { + Result wrc = StartBpmfwExecution(); + if (R_FAILED(wrc)) { + fileUtils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); + } + } + + pscPmModuleAcknowledge(&s_pscModule, state); + } + } + } + } // namespace Result StartBpmfwExecution() { @@ -137,4 +169,48 @@ namespace bpmp { return 0; } + void StartSleepMonitorThread() { + if (!IsPatchedExosphere()) { + fileUtils::LogLine("[bpmp] Cant start BPMP without exosphere patch"); + return; + } + + Result rc = pscmInitialize(); + if (R_FAILED(rc)) { + fileUtils::LogLine("[bpmp] pscmInitialize failed: 0x%x", rc); + return; + } + + rc = pscmGetPmModule(&s_pscModule, PscModuleId, pscDependencies, sizeof(pscDependencies) / sizeof(u32), true); + if (R_FAILED(rc)) { + fileUtils::LogLine("[bpmp] pscmGetPmModule failed: 0x%x", rc); + pscmExit(); + return; + } + s_pscPrepared = true; + + rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); + if (R_FAILED(rc)) { + fileUtils::LogLine("[bpmp] failed to create psc thread: 0x%x", rc); + return; + } + threadStart(&s_pscThread); + } + + void StopSleepMonitorThread() { + if (!s_pscPrepared) { + return; + } + + s_pscExit = true; + eventFire(&s_pscModule.event); + threadWaitForExit(&s_pscThread); + threadClose(&s_pscThread); + + pscPmModuleFinalize(&s_pscModule); + pscPmModuleClose(&s_pscModule); + pscmExit(); + s_pscPrepared = false; + } + } // namespace bpmp diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp index e860f662..7a57069c 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp @@ -20,4 +20,7 @@ namespace bpmp { Result StartBpmfwExecution(); + + void StartSleepMonitorThread(); + void StopSleepMonitorThread(); } diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 8af7e964..f519a198 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -103,7 +103,7 @@ namespace fileUtils { va_list args; va_start(args, format); - char buff[0xfff]; + char buff[0x200]; int len = vsnprintf(buff, sizeof(buff), format, args); va_end(args); diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index f7c5b0c1..f2452f05 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -38,7 +38,7 @@ #include "mgr/clock_manager.hpp" -#define INNER_HEAP_SIZE 0x40000 +#define INNER_HEAP_SIZE 0x48000 extern "C" { void virtmemSetup(void); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 223692ab..c035c11e 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -30,7 +30,6 @@ #include #include "../board/board.hpp" -#include "../bpmp/bpmp.hpp" #include "../display/aula.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" @@ -41,7 +40,6 @@ #include "../hos/process_management.hpp" #include "../i2c/i2cDrv.h" #include "../ipc/ipc_service.hpp" -#include "../mapping/mem_map.hpp" #include "../soc/gm20b.hpp" #include "../util/lockable_mutex.h" #include "clock_manager.hpp" @@ -357,23 +355,6 @@ namespace clockManager { if (++tick > 10) { tick = 0; - // Restart BPMP after sleep. - if (IsPatchedExosphere()) { - svcSleepThread(1'500'000'000); - constexpr u32 FlowCtlrPhysBase = 0x60007000; - constexpr u32 FlowCtlrHaltCopEvents = 0x004; - constexpr u32 HaltCopEventsModeShift = 29; - constexpr u32 HaltCopEventsModeStop = 2; - - u32 haltReg = SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0, 0); - if ((haltReg >> HaltCopEventsModeShift) == HaltCopEventsModeStop) { - Result rc = bpmp::StartBpmfwExecution(); - if (R_FAILED(rc)) { - fileUtils::LogLine("[bpmp] restart after sleep failed: 0x%x", rc); - } - } - } - if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); } From 1990b1b66c913ed592f96249d243438e859f7a5f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 14:33:58 -0400 Subject: [PATCH 071/205] hocclk bpmp: communication --- Source/hoc-clk/bpmpfw/Makefile | 3 +- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 2392 -> 2672 bytes .../hoc-clk/bpmpfw/source/libc_platform.cpp | 23 ++++++++++- .../hoc-clk/bpmpfw/source/libc_platform.hpp | 17 ++++++++ Source/hoc-clk/bpmpfw/source/main.cpp | 37 +++++++++++++++++- Source/hoc-clk/bpmpfw/source/regs.hpp | 24 ++++++++++++ Source/hoc-clk/bpmpfw/source/start.s | 19 +++++++++ Source/hoc-clk/common/include/hocclk/board.h | 3 ++ Source/hoc-clk/common/include/hocclk/bpmp.h | 35 +++++++++++++++++ .../common/include/hocclk/clock_manager.h | 6 ++- .../hoc-clk/overlay/src/ui/gui/about_gui.cpp | 5 +++ Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 14 +++++++ Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp | 4 ++ .../sysmodule/src/mgr/clock_manager.cpp | 3 ++ 14 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 Source/hoc-clk/common/include/hocclk/bpmp.h diff --git a/Source/hoc-clk/bpmpfw/Makefile b/Source/hoc-clk/bpmpfw/Makefile index 7af3a478..4cd0257a 100644 --- a/Source/hoc-clk/bpmpfw/Makefile +++ b/Source/hoc-clk/bpmpfw/Makefile @@ -19,7 +19,8 @@ OBJS := $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(CPP_SOURCES)) \ $(patsubst $(SOURCEDIR)/%.s,$(BUILDDIR)/%.o,$(S_SOURCES)) ARCH := -march=armv4t -mtune=arm7tdmi -mthumb-interwork -INCLUDE := -I$(SOURCEDIR) -I$(LIBCDIR)/include -I$(LIBCDIR)/include/fslc +COMMONDIR := ../common/include +INCLUDE := -I$(SOURCEDIR) -I$(LIBCDIR)/include -I$(LIBCDIR)/include/fslc -I$(COMMONDIR) CFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -ffunction-sections -fdata-sections \ -fomit-frame-pointer -std=gnu11 -Wall -Wextra $(CUSTOMDEFINES) CXXFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -fno-exceptions -fno-rtti \ diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 04f7484e7fc185549b63c040cb54d97b64e7ef0b..64a8fc50d76a503f72dbbc973358177158f46b40 100644 GIT binary patch delta 515 zcmXw0O=uHQ5T4l|T+1qt7_cN@A4X52K4@=V*7Q;qqRk>A_0mhlf=Vu)deD&GG?et= zMUkZ7)l=~xA}px41gao-+0G3Bv#30ap>H>t}mmt26#QGgudZyMuwW1E1rTLFjH!4#U3FN`rkD@# z)MkU!3F?uuEh+agz4fhh|FcSL}c=(NVToPi$_fqTqzaqGpuEI|;@g z$Nxy9^yeW_@6{!%754U*@R4j_71!k|Ud5JtP4=q%jB6Omrgal%RkT@|b%PpUAUrAMeT!?hLMMYj*. + * + */ + #include #include "regs.hpp" @@ -9,7 +26,11 @@ namespace { return c; } - FILE g_uartStdout = { nullptr, UartStreamPutc, nullptr, nullptr, nullptr, -1 }; + void UartStreamPostOutput(FILE *) { + UartFlush(); + } + + FILE g_uartStdout = { nullptr, UartStreamPutc, nullptr, nullptr, UartStreamPostOutput, -1 }; } // namespace diff --git a/Source/hoc-clk/bpmpfw/source/libc_platform.hpp b/Source/hoc-clk/bpmpfw/source/libc_platform.hpp index 4268a9c5..f29c8b03 100644 --- a/Source/hoc-clk/bpmpfw/source/libc_platform.hpp +++ b/Source/hoc-clk/bpmpfw/source/libc_platform.hpp @@ -1,3 +1,20 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + #pragma once void InitializeLibc(); diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index 4e57d8db..d329e669 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -1,12 +1,47 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + #include +#include #include "libc_platform.hpp" #include "regs.hpp" +#include + +namespace { + + HocClkBpmpSharedInfo &SharedInfo() { + return *reinterpret_cast(WorkRamStart); + } + +} // namespace + extern "C" void main() { InitializeLibc(); printf("[hoc-bpmpfw] Starting bpmpfw\n"); - for (;;); + HocClkBpmpSharedInfo &info = SharedInfo(); + memset(&info, 0, sizeof(info)); + info.status = 0; + info.magic = HOCCLK_BPMP_MAGIC; // written last + + for (;;) { + + } } diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index 4f8d5965..a39389b2 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -1,3 +1,20 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + #pragma once #include @@ -26,6 +43,7 @@ constexpr u32 UartBBase = 0x70006040; constexpr u32 UartThr = 0x00; constexpr u32 UartLsr = 0x14; constexpr u32 UartLsrThre = (1u << 5); +constexpr u32 UartLsrTmty = (1u << 6); inline void UartPutc(char c) { while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) @@ -33,6 +51,12 @@ inline void UartPutc(char c) { MMIO32(UartBBase + UartThr) = static_cast(static_cast(c)); } +// Waits for the byte to be fully transmitted +inline void UartFlush() { + while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) + ; +} + inline void UartPuts(const char *s) { while (*s) { UartPutc(*s++); diff --git a/Source/hoc-clk/bpmpfw/source/start.s b/Source/hoc-clk/bpmpfw/source/start.s index afabaa9c..83f2e136 100644 --- a/Source/hoc-clk/bpmpfw/source/start.s +++ b/Source/hoc-clk/bpmpfw/source/start.s @@ -1,3 +1,22 @@ +/* + * Copyright (c) Atmosphere-NX + * + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + .section .vectors, "ax", %progbits .align 3 .global reset diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 45b576d8..389ba513 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -30,7 +30,10 @@ #include #include #include +#ifdef __SWITCH__ // Wont be defined in BPMP-FW #include +#endif + typedef enum { HocClkSocType_Erista = 0, // T210, found in Icosa and Copper diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h new file mode 100644 index 00000000..b5cb8f4b --- /dev/null +++ b/Source/hoc-clk/common/include/hocclk/bpmp.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include +#include "board.h" + +#define HOCCLK_BPMP_MAGIC 0x42504D50 // 'BPMP' + +/* + * Shared with BPMP-FW + * Any 64 bit data type is not permitted. + */ +typedef struct { + u32 magic; // should be HOCCLK_BPMP_MAGIC once bpmpfw is running + u32 status; // Reserved for error codes and such + u32 reserved[6]; +} HocClkBpmpSharedInfo; + +static_assert(sizeof(HocClkBpmpSharedInfo) == 0x20); diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 21e47646..f2338354 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -29,6 +29,7 @@ #include #include "board.h" +#include "bpmp.h" typedef struct { @@ -84,6 +85,9 @@ typedef struct { bool rebootRequired; bool isFirstLoad; + // Populated from bpmpfw's work-RAM via SmcCopyFromIram (see HocClkBpmpSharedInfo above). + HocClkBpmpSharedInfo bpmpInfo; + // Reserved for future use u8 reserved[0x358]; } HocClkContext; @@ -100,4 +104,4 @@ typedef struct #define HOCCLK_GLOBAL_PROFILE_TID 0xA111111111111111 -static_assert(sizeof(HocClkContext) == 0x500); \ No newline at end of file +static_assert(sizeof(HocClkContext) == 0x520); diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 2febf53f..f36b012b 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -43,6 +43,7 @@ tsl::elm::ListItem* bqtempitem = NULL; tsl::elm::ListItem* aotagTempItem = NULL; tsl::elm::ListItem* cTypeItem = NULL; tsl::elm::ListItem* creditsItem = NULL; +tsl::elm::ListItem* bpmpStatusItem = NULL; #define R_ARROW "\u2192" @@ -147,6 +148,9 @@ void AboutGui::listUI() // custRevItem = new tsl::elm::ListItem("CUST revision:"); // this->listElement->addItem(custRevItem); + bpmpStatusItem = new tsl::elm::ListItem("BPMP Status:"); + this->listElement->addItem(bpmpStatusItem); + kipVersionItem = new tsl::elm::ListItem("KIP version:"); this->listElement->addItem(kipVersionItem); @@ -272,6 +276,7 @@ void AboutGui::refresh() bqtempitem->setValue(strings[10]); cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); + bpmpStatusItem->setValue(this->context->bpmpInfo.magic == HOCCLK_BPMP_MAGIC ? "Enabled" : "Disabled"); } class CreditsSubMenu : public AboutGui { diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 41c0792b..9485e559 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -20,6 +20,7 @@ #include #include "../board/board.hpp" +#include "../file/config.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "bpmp.hpp" @@ -57,9 +58,12 @@ namespace bpmp { constexpr u64 FwIramPhysBase = 0x40004000; constexpr u32 FwStagingSize = 0x8000; + constexpr u64 WorkRamPhysBase = FwIramPhysBase + FwStagingSize; // matches bpmpfw's WorkRamStart alignas(4096) u8 s_fwStageBuf[FwStagingSize]; + HocClkBpmpSharedInfo s_sharedInfo = {}; + inline volatile u32 &Mmio(u64 base_va, u32 offset) { return *reinterpret_cast(base_va + offset); } @@ -213,4 +217,14 @@ namespace bpmp { s_pscPrepared = false; } + const HocClkBpmpSharedInfo *GetSharedInfo() { + if (!IsPatchedExosphere()) { + s_sharedInfo = {}; + return &s_sharedInfo; + } + + SmcCopyFromIram(&s_sharedInfo, WorkRamPhysBase, sizeof(s_sharedInfo)); + return &s_sharedInfo; + } + } // namespace bpmp diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp index 7a57069c..43d8bb32 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp @@ -18,9 +18,13 @@ #pragma once #include +#include + namespace bpmp { Result StartBpmfwExecution(); void StartSleepMonitorThread(); void StopSleepMonitorThread(); + + const HocClkBpmpSharedInfo *GetSharedInfo(); } diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index c035c11e..770dc65a 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -30,6 +30,7 @@ #include #include "../board/board.hpp" +#include "../bpmp/bpmp.hpp" #include "../display/aula.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" @@ -626,6 +627,8 @@ namespace clockManager { bool RefreshContext() { bool hasChanged = false; + gContext.bpmpInfo = *bpmp::GetSharedInfo(); + std::uint32_t mode = 0; Result rc = apmExtGetCurrentPerformanceConfiguration(&mode); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); From eba557371120d14f30e78e50c7c323eb578acd62 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 25 Aug 2026 20:40:32 +0200 Subject: [PATCH 072/205] Refactor busReloc to use hooks. Also add sd logging and temporarily remove new Erista timings; they're still slightly too explosive. Todo: Rename stuff and fix uart redirect. --- .../stratosphere/loader/source/oc/oc_log.cpp | 59 ++++++++++ .../stratosphere/loader/source/oc/oc_log.hpp | 2 + .../pcv/erista/calculate_timings_erista.cpp | 2 +- .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 34 +++--- .../source/oc/pcv/mariko/pcv_mariko.cpp | 109 +++++++++--------- .../source/oc/pcv/mariko/pcv_mariko.hpp | 11 ++ .../loader/source/oc/pcv/pcv_asm.hpp | 22 +++- .../loader/source/oc/pcv/pcv_common.hpp | 24 ++++ .../loader/source/oc/pcv/pcv_hook.hpp | 13 ++- 9 files changed, 200 insertions(+), 76 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.cpp index 6fccc8e4..1335f1a6 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.cpp @@ -155,4 +155,63 @@ namespace ams::ldr::hoc { while(true) { } #endif } + + namespace { + constexpr size_t SdLogBufferSize = 0x1000; + char sdLogBuffer[SdLogBufferSize]; + size_t workingLength = 0; + } + + void SdLog(const char *data, ...) { + if (workingLength >= SdLogBufferSize - 1) { + return; + } + + va_list args; + va_start(args, data); + s32 res = vsnprintf(sdLogBuffer + workingLength, SdLogBufferSize - workingLength, data, args); + va_end(args); + + if (res < 0) { + return; + } + + workingLength = std::min(workingLength + static_cast(res), SdLogBufferSize - 1); + } + + void SaveLog() { + static bool saved = false; + if (workingLength == 0 || saved) { + return; + } + + if (!cfg::IsSdCardInitialized()) { + return; + } + + if (R_FAILED(fs::MountSdCard("sdmc"))) { + return; + } + + ON_SCOPE_EXIT { fs::Unmount("sdmc"); }; + + constexpr const char *Path = "sdmc:/config/horizon-oc/ldr_log.txt"; + + R_DISCARD(fs::DeleteFile(Path)); + if (R_FAILED(fs::CreateFile(Path, workingLength))) { + return; + } + + fs::FileHandle file; + if (R_FAILED(fs::OpenFile(std::addressof(file), Path, fs::OpenMode_Write))) { + return; + } + ON_SCOPE_EXIT { fs::CloseFile(file); }; + + if (R_FAILED(fs::WriteFile(file, 0, sdLogBuffer, workingLength, fs::WriteOption::Flush))) { + return; + } + saved = true; + } + } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.hpp index 6522ee13..8a1ed243 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_log.hpp @@ -23,6 +23,8 @@ namespace ams::ldr::hoc { Result SmcCopyToIram(uintptr_t dest, const void *src, u32 size); void Log(const char *data, ...); + void SdLog(const char *data, ...); + void SaveLog(); void ViewLog(); /* Emit a formatted line over the kernel debug UART via svcOutputDebugString. diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 0d5c8900..04ec6830 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -95,7 +95,7 @@ namespace ams::ldr::hoc::pcv::erista { u32 wlIndex = 0; for (u32 i = 0; i < std::size(rlMapDBI); ++i) { - if (rlMapDBI[i] == RL) { + if (rlMapDBI[i] == 32) { rlIndex = i; break; } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index 362c31a5..7a4a1b4d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -119,28 +119,28 @@ namespace ams::ldr::hoc::pcv::erista { /* Accept imperfection or prepare for suffering. */ // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) - WRITE_PARAM_ALL_REG(table, emc_einput, einput); - WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); - WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); + // WRITE_PARAM_ALL_REG(table, emc_einput, einput); + // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); + // WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); WRITE_PARAM_ALL_REG(table, emc_ibdly, ibdly); WRITE_PARAM_ALL_REG(table, emc_wdv_mask, wdv); - WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); - WRITE_PARAM_ALL_REG(table, emc_quse, quse); + // WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); + // WRITE_PARAM_ALL_REG(table, emc_quse, quse); WRITE_PARAM_ALL_REG(table, emc_wdv, wdv); WRITE_PARAM_ALL_REG(table, emc_wsv, wsv); WRITE_PARAM_ALL_REG(table, emc_wev, wev); - WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); - WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); - WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); - WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); - WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); - WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); - WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); - WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); - WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); - WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); - WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); - WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); + // WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); + // WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); + // WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); + // WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); + // WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); + // WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); + // WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); + // WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); + // WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); + // WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); + // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); + // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); table->dram_timings.rl = RL; // #endif diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 9702a7eb..1223493b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -34,20 +34,19 @@ namespace ams::ldr::hoc::pcv::mariko { u32 *nsoStart; namespace { - size_t g_nso_size = 0; - uintptr_t g_cave_cursor = 0; + struct { + u32 *site = nullptr; + } busInitCache; } - static uintptr_t CaveReserve(size_t count) { - if (g_pcv_cave == 0 || g_cave_cursor == 0) { - return 0; - } - if (g_cave_cursor + count * sizeof(u32) > g_pcv_cave + g_pcv_cave_size) { - return 0; - } - const uintptr_t entry = g_cave_cursor; - g_cave_cursor += count * sizeof(u32); - return entry; + DEFINE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); + + namespace { + size_t g_nso_size = 0; + } + + [[maybe_unused]] static uintptr_t CaveReserve(size_t count) { + return reinterpret_cast(Hooks().Reserve(count)); } #if HOC_UART_LOG @@ -176,50 +175,27 @@ namespace ams::ldr::hoc::pcv::mariko { } #endif - /* Relocate C2/C3Bus to avoid issues*/ - Result BusFreqReloc(u32 *ptr) { - const u32 busReg = _asm::Get(ptr[0], _asm::field::Rn); /* ldr Xbuf,[Xbus,#0x10] : bus struct pointer */ - const u32 bufReg = _asm::Get(ptr[0], _asm::field::Rt); /* : freq-buffer arg */ - const u32 bufOff = _asm::Get(ptr[0], _asm::field::Off8); /* : bus->freqBuf offset */ - const u32 cntReg = _asm::Get(ptr[1], _asm::field::Rd); /* add Xcnt,Xbus,#0x18 : arg2 (&count) */ - const u32 railReg = _asm::Get(ptr[2], _asm::field::Rt); /* str Xrail,[Xbus,#0x50]: arg0 (rail) */ - u32 *call = ptr + 3; /* the bl to relocate */ - const uintptr_t realFn = _asm::Target26(*call, reinterpret_cast(call)); + HOOK_PAYLOAD_FN u64 BusFreqExtendImpl(SharedClkBus *bus) { + HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); - /* Pick 3 scratch registers */ - u32 s[3], sc = 0; - for (u32 r = 9; r <= 15 && sc < 3; ++r) { - if (r != busReg && r != bufReg && r != cntReg && r != railReg) { - s[sc++] = r; - } - } - R_UNLESS(sc == 3, ldr::ResultInvalidBusFreqReloc()); + u32 *table = data->busData.next; + bus->allowedFreqTable = table; + data->busData.next = table + EmcDvfsTableEntryCount; - const uintptr_t tramp = CaveReserve(9); - R_UNLESS(tramp != 0, ldr::ResultInvalidBusFreqReloc()); - - const uintptr_t region = g_pcv_scratch + HocBusFreqBufOffset; /* [0]=counter, +0x10 + i*0x400 = bufs */ - u32 *t = reinterpret_cast(tramp); - size_t n = 0; - auto emit = [&](u32 ins) { t[n] = ins; ++n; }; - using namespace _asm::field; - emit(_asm::RetargetAdrp(_asm::Encode(_asm::op::Adrp, {Rd, s[0]}), tramp + n * 4, region)); /* adrp s0, */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, s[0]}, {Rn, s[0]}, {Imm12, region & 0xFFFu})); /* add s0,s0,#lo */ - emit(_asm::Encode(_asm::op::LdrImm32, {Rt, s[1]}, {Rn, s[0]}, {Off4, 0x00})); /* s1 = counter */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, s[2]}, {Rn, s[1]}, {Imm12, 1})); /* s2 = counter+1 */ - emit(_asm::Encode(_asm::op::StrImm32, {Rt, s[2]}, {Rn, s[0]}, {Off4, 0x00})); /* counter++ */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, s[0]}, {Rn, s[0]}, {Imm12, 0x10})); /* s0 = region+0x10 (buffers) */ - emit(_asm::Encode(_asm::op::AddShifted64, {Rd, bufReg}, {Rn, s[0]}, {Rm, s[1]}, {Imm6, 10})); /* Xbuf = s0 + counter*0x400 */ - emit(_asm::Encode(_asm::op::StrImm64, {Rt, bufReg}, {Rn, busReg}, {Off8, bufOff})); /* bus[freqBuf] = Xbuf */ - emit(_asm::Retarget26(_asm::op::B, tramp + n * 4, realFn)); /* tail-call the real function */ - - PATCH_OFFSET(call, _asm::Retarget26(_asm::op::Bl, reinterpret_cast(call), tramp)); - const uintptr_t base = reinterpret_cast(nsoStart); - (void) base; - LOGGING("BusFreqReloc: call@+%lx -> tramp@+%lx realfn@+%lx (bus=x%u buf=x%u off=0x%x scratch=x%u,x%u,x%u)", reinterpret_cast(call) - base, tramp - base, realFn - base, busReg, bufReg, bufOff, s[0], s[1], s[2]); - R_SUCCEED(); + /* Call the original function. */ + return reinterpret_cast(data->busData.originalFnCallback)(bus); } + /* Relocate and extend C2/C3Bus to avoid issues (likely buffer overflow) */ + Result BusFreqReloc(u32 *ptr) { + constexpr u32 PrologueMargin = 140; + u32 *functionPrologue = _asm::FindFnPrologue(ptr, PrologueMargin, nsoStart); + R_UNLESS(functionPrologue != nullptr, ldr::ResultInvalidBusFreqReloc()); + + busInitCache.site = functionPrologue; + + R_SUCCEED(); + } #if HOC_UART_LOG /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ @@ -531,12 +507,35 @@ namespace ams::ldr::hoc::pcv::mariko { R_SUCCEED(); } + Result SharedClkBusInstallHooks(HookPayloadData *data) { + R_UNLESS(busInitCache.site != nullptr, ldr::ResultInvalidBusFreqReloc()); + + uintptr_t originalFn = 0; + R_TRY(INSTALL_IMPL_HOOK_ORIG(busInitCache.site, BusFreqExtendImpl, &originalFn)); + data->busData.originalFnCallback = originalFn; + data->busData.next = reinterpret_cast(Hooks().ToVa(data->busData.table[0])); + + R_SUCCEED(); + } + + Result InstallHooks() { + R_TRY(Hooks().CheckEnabled()); + + R_TRY(Hooks().CopyPayload()); + + auto *data = Hooks().BindData(m_HookPayloadData); + R_UNLESS(data != nullptr, ldr::ResultHookDataOutOfMemory()); + + R_TRY(SharedClkBusInstallHooks(data)); + + R_SUCCEED(); + } + void Patch(uintptr_t mapped_nso, size_t nso_size) { nsoStart = reinterpret_cast(mapped_nso); g_pcv_scratch = mapped_nso + nso_size - HocPcvScratchSize; g_nso_size = nso_size; - g_cave_cursor = g_pcv_cave; /* start the .text-cave bump allocator (0 if unavailable) */ MtcGenerateFreqTables(); @@ -593,6 +592,10 @@ namespace ams::ldr::hoc::pcv::mariko { CRASH(entry.description); } } + + if (R_FAILED(InstallHooks())) { + panic::SmcError(panic::Patch); + } } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index 97f6bcab..cc99ba21 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -26,6 +26,17 @@ namespace ams::ldr::hoc::pcv::mariko { + constexpr u32 BusFreqTableCount = 2; + + struct HookPayloadData { + struct { + u32 *next; /* Save the bytes. */ + uintptr_t originalFnCallback; + u32 table[BusFreqTableCount][EmcDvfsTableEntryCount]; /* Original bus table size: 32. */ + } busData; + }; + DECLARE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); + extern u32 *nsoStart; struct DvbEntry { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp index f852a2ee..c5d030a8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp @@ -245,11 +245,25 @@ namespace ams::ldr::hoc::pcv::_asm { return ScanAssembly(ptr, scanLimit, pattern, [=](u32 a, u32 b) ALWAYS_INLINE_LAMBDA { return Ignoring(a, b, ignoreFields...); }); } - constexpr bool IsFramePush(u32 ins) { + constexpr bool IsFramePushPre(u32 ins) { constexpr u32 Pattern = Encode(op::StpPreImm64, {field::Rt, reg::Fp}, {field::Rt2, reg::Lr}, {field::Rn, reg::Sp}); return Ignoring(ins, Pattern, field::PairOff8); } + constexpr bool IsFramePushOffset(u32 ins) { + constexpr u32 Pattern = Encode(op::StpImm64, {field::Rt, reg::Fp}, {field::Rt2, reg::Lr}, {field::Rn, reg::Sp}); + return Ignoring(ins, Pattern, field::PairOff8); + } + + constexpr bool IsSpSubImm(u32 ins) { + constexpr u32 Pattern = Encode(op::SubImm64, {field::Rd, reg::Sp}, {field::Rn, reg::Sp}); + return Ignoring(ins, Pattern, field::Imm12); + } + + constexpr bool IsFramePush(u32 ins) { + return IsFramePushPre(ins) || IsFramePushOffset(ins); + } + inline u32 *FindFnPrologue(u32 *ptr, u32 margin, u32 *nsoStart) { for (u32 i = 0; i <= margin; ++i) { u32 *candidate = ptr - i; @@ -257,9 +271,13 @@ namespace ams::ldr::hoc::pcv::_asm { break; } - if (IsFramePush(*candidate)) { + if (IsFramePushPre(*candidate)) { return candidate; } + + if (IsFramePushOffset(*candidate) && candidate - 1 >= nsoStart && IsSpSubImm(candidate[-1])) { + return candidate - 1; + } } return nullptr; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index 1d3b9232..c888e77d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -163,6 +163,30 @@ namespace ams::ldr::hoc::pcv { }; static_assert(sizeof(CvbMeta) == 0x78); + struct SubClockStub { + u8 _unknown[0x48]; + }; + + struct SharedClkBus { + u64 moduleId; + u32 currentRateHz; + u32 padding0; + u32 *allowedFreqTable; + u32 allowedFreqCount; + u32 padding1; + SubClockStub *subClocksTable; + u32 subClockCount; + u32 padding2; + void *unk30; + void *clockSource; + u32 targetRateHz; + u32 saveDivFlag; + u32 idleRateHz; /* Unsure. */ + u32 alwaysOnFlag; + u64 clockSession; + }; + static_assert(sizeof(SharedClkBus) == 0x58); + constexpr u32 CpuClkOSLimit = 1785'000; constexpr u32 GpuClkOsLimit = 921'600; constexpr u32 EmcClkOSLimit = 1600'000; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp index fcc6a47a..d4a5eca5 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp @@ -18,7 +18,8 @@ #include "../oc_common.hpp" -#define HOOK_PAYLOAD_FN __attribute__((section("hoc_hookpayload"), used, noinline, visibility("hidden"))) +/* aligned(4) is the ARM64 instruction alignment. This saves some memory over 16 byte padding */ +#define HOOK_PAYLOAD_FN __attribute__((section("hoc_hookpayload"), used, noinline, visibility("hidden"), aligned(4))) /* Inline asm because fuck compilers: GCC refuses to put a variable and a function in the same section. */ /* It wants alloc+write for one and alloc+exec for the other. */ @@ -147,6 +148,10 @@ namespace ams::ldr::hoc::pcv { } uintptr_t CaveVa() const { return ToVa(reinterpret_cast(m_cave)); } + uintptr_t CaveBase() const { return m_cave; } + + /* Todo remove? */ + u32 *Reserve(size_t words) { return this->AllocCode(words); } Result CopyPayload() { R_TRY(this->CheckEnabled()); @@ -284,6 +289,8 @@ namespace ams::ldr::hoc::pcv { Result ValidatePayloadFn(const void *fn) const { constexpr u32 MaxInstructions = 512; constexpr u32 RetInsn = 0xD65F03C0u; + constexpr u32 BrMask = 0xFFFFFC1Fu; + constexpr u32 BrInsn = 0xD61F0000u; const uintptr_t lo = m_payload; const uintptr_t hi = m_payload + m_payload_sz; @@ -302,7 +309,7 @@ namespace ams::ldr::hoc::pcv { const u32 insn = insns[i]; const uintptr_t site = base + i * sizeof(u32); - if (insn == RetInsn) { + if (insn == RetInsn || (insn & BrMask) == BrInsn) { R_SUCCEED(); } @@ -334,7 +341,7 @@ namespace ams::ldr::hoc::pcv { private: u32 *AllocCode(size_t words) { const size_t bytes = words * sizeof(u32); - if (!this->IsEnabled() || m_used + bytes > m_cave_size) { + if (!this->IsEnabled() || m_payload == 0 || m_used + bytes > m_cave_size) { return nullptr; } From f9ed6c84b9bf929195b9009b429497c99bebb79f Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 25 Aug 2026 20:45:42 +0200 Subject: [PATCH 073/205] pcv: nvm, didn't like the alignment --- .../loader/source/oc/pcv/pcv_common.hpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index c888e77d..bdda0361 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -168,22 +168,22 @@ namespace ams::ldr::hoc::pcv { }; struct SharedClkBus { - u64 moduleId; - u32 currentRateHz; - u32 padding0; + u64 moduleId; + u32 currentRateHz; + u32 padding0; u32 *allowedFreqTable; - u32 allowedFreqCount; - u32 padding1; + u32 allowedFreqCount; + u32 padding1; SubClockStub *subClocksTable; - u32 subClockCount; - u32 padding2; + u32 subClockCount; + u32 padding2; void *unk30; void *clockSource; - u32 targetRateHz; - u32 saveDivFlag; - u32 idleRateHz; /* Unsure. */ - u32 alwaysOnFlag; - u64 clockSession; + u32 targetRateHz; + u32 saveDivFlag; + u32 idleRateHz; /* Unsure. */ + u32 alwaysOnFlag; + u64 clockSession; }; static_assert(sizeof(SharedClkBus) == 0x58); From ba072736752e55c585db5ed2de281ad8a491f7b3 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 14:49:57 -0400 Subject: [PATCH 074/205] bpmpfw reliability fix --- .gitignore | 1 + Source/hoc-clk/build.sh | 18 +++++++++--------- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 22 ++++++++-------------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 76dc4eee..5ec2190f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build Source/hekate dist/* !dist/.gitignore +Source/hoc-clk/sysmodule/data/bpmpfw.bin diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index f06780ec..74634101 100755 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -20,6 +20,15 @@ for arg in "$@"; do done echo +echo "*** Compiling bpmpfw ***" +pushd "$ROOT_DIR/bpmpfw" +make -j$CORES +popd > /dev/null + +mkdir -p "$ROOT_DIR/sysmodule/data" +cp -vf "$ROOT_DIR/bpmpfw/out/bpmpfw.bin" "$ROOT_DIR/sysmodule/data/bpmpfw.bin" +echo + echo "*** Compiling hoc-clk ***" TITLE_ID="$(grep -oP '"title_id":\s*"0x\K(\w+)' "$ROOT_DIR/sysmodule/perms.json")" @@ -42,15 +51,6 @@ mkdir -p "$DIST_DIR/switch/.overlays" cp -vf "$ROOT_DIR/overlay/out/horizon-oc-overlay.ovl" "$DIST_DIR/switch/.overlays/horizon-oc-overlay.ovl" echo -echo "*** Compiling bpmpfw ***" -pushd "$ROOT_DIR/bpmpfw" -make -j$CORES -popd > /dev/null - -mkdir -p "$DIST_DIR/config/horizon-oc" -cp -vf "$ROOT_DIR/bpmpfw/out/bpmpfw.bin" "$DIST_DIR/config/horizon-oc/bpmpfw.bin" -echo - echo "*** Copying assets ***" mkdir -p "$DIST_DIR/config/horizon-oc" cp -vf "$ROOT_DIR/config.ini.template" "$DIST_DIR/config/horizon-oc/config.ini.template" diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 9485e559..5ca299f5 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -15,7 +15,6 @@ * */ -#include #include #include @@ -25,6 +24,8 @@ #include "../mapping/mem_map.hpp" #include "bpmp.hpp" +#include "bpmpfw_bin.h" + namespace bpmp { namespace { @@ -60,6 +61,7 @@ namespace bpmp { constexpr u32 FwStagingSize = 0x8000; constexpr u64 WorkRamPhysBase = FwIramPhysBase + FwStagingSize; // matches bpmpfw's WorkRamStart + /* secmon will return error unless we apply thiss workaround */ alignas(4096) u8 s_fwStageBuf[FwStagingSize]; HocClkBpmpSharedInfo s_sharedInfo = {}; @@ -108,23 +110,15 @@ namespace bpmp { return (Result)1; } - std::memset(s_fwStageBuf, 0, sizeof(s_fwStageBuf)); - - FILE *f = fopen("sdmc:/config/horizon-oc/bpmpfw.bin", "rb"); - if (!f) { - fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin not found"); + const size_t fw_size = bpmpfw_bin_size; + if (fw_size == 0 || fw_size > FwStagingSize) { + fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw of %zu bytes is invalid (should not happen)!", fw_size); return (Result)1; } - const size_t fw_size = fread(s_fwStageBuf, 1, sizeof(s_fwStageBuf), f); - fclose(f); + std::memcpy(s_fwStageBuf, bpmpfw_bin, fw_size); - if (fw_size == 0) { - fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin is empty"); - return (Result)1; - } - - fileUtils::LogLine("[bpmp] StartBpmfwExecution: loaded %zu bytes, loading at 0x%llx", + fileUtils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx", fw_size, static_cast(FwIramPhysBase)); /* Set BPMP reset */ From 85bfed0604dd013098574b9d6671b6820de49907 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 14:54:06 -0400 Subject: [PATCH 075/205] lower fs reads during early warmboot --- Source/hoc-clk/sysmodule/src/file/file_utils.cpp | 14 ++------------ Source/hoc-clk/sysmodule/src/file/file_utils.hpp | 1 - 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index f519a198..107a2b73 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -46,7 +46,6 @@ namespace fileUtils { std::atomic_bool g_has_initialized = false; bool g_log_enabled = false; bool g_uart_enabled = false; - std::uint64_t g_last_flag_check = 0; bool FlagExists(const char *path) { FILE *file = fopen(path, "r"); @@ -57,16 +56,9 @@ namespace fileUtils { return false; } - void RefreshFlags(bool force) { - std::uint64_t now = armTicksToNs(armGetSystemTick()); - if (!force && (now - g_last_flag_check) < FILE_FLAG_CHECK_INTERVAL_NS) { - return; - } - + void RefreshFlags() { g_log_enabled = FlagExists(FILE_LOG_FLAG_PATH); g_uart_enabled = FlagExists(FILE_UART_FLAG_PATH); - - g_last_flag_check = now; } void InitializeThreadFunc(void *args) { @@ -94,8 +86,6 @@ namespace fileUtils { return; } - RefreshFlags(false); - if (!g_log_enabled && !g_uart_enabled) { return; } @@ -223,7 +213,7 @@ namespace fileUtils { } if (R_SUCCEEDED(rc)) { - RefreshFlags(true); + RefreshFlags(); g_has_initialized = true; LogLine("=== hoc-clk " TARGET_VERSION " ==="); LogLine("by m4xw, natinusala, p-sam, Souldbminer, Lightos_ and Dominatorul"); diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index 69991f86..f2ab4b2a 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -35,7 +35,6 @@ #include #define FILE_CONFIG_DIR "/config/" CONFIG_DIR -#define FILE_FLAG_CHECK_INTERVAL_NS (10000ULL * 1000000000ULL) #define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv" #define FILE_LOG_FLAG_PATH FILE_CONFIG_DIR "/log.flag" #define FILE_UART_FLAG_PATH FILE_CONFIG_DIR "/uart.flag" From cbdd35b0beb5d808ba61be31cb90d888944e104b Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 15:01:26 -0400 Subject: [PATCH 076/205] stop ticking during intermittent sleep --- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 11 +++++++++++ Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp | 3 +++ Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 5ca299f5..f5171082 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -15,6 +15,7 @@ * */ +#include #include #include @@ -79,6 +80,8 @@ namespace bpmp { Thread s_pscThread; bool s_pscExit = false; + std::atomic_bool s_isAwake = true; + void PscThreadFunc(void *) { while (!s_pscExit) { Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); @@ -95,6 +98,10 @@ namespace bpmp { if (R_FAILED(wrc)) { fileUtils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); } + + s_isAwake = true; + } else if (state == PscPmState_ReadySleep) { + s_isAwake = false; } pscPmModuleAcknowledge(&s_pscModule, state); @@ -221,4 +228,8 @@ namespace bpmp { return &s_sharedInfo; } + bool IsAwake() { + return s_isAwake; + } + } // namespace bpmp diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp index 43d8bb32..f89810bb 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp @@ -27,4 +27,7 @@ namespace bpmp { void StopSleepMonitorThread(); const HocClkBpmpSharedInfo *GetSharedInfo(); + + // Always true on stock exosphere + bool IsAwake(); } diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 770dc65a..79fd11f6 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -879,6 +879,11 @@ namespace clockManager { } void WaitForNextTick() { + if (!bpmp::IsAwake()) { + svcSleepThread(250 * 1000000ULL); // 250ms + return; + } + if (board::GetHz(HocClkModule_MEM) > 665000000) svcSleepThread(config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); else From ba75b02c52451d5a3b63d7d739273a4dbfaf7392 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 15:20:11 -0400 Subject: [PATCH 077/205] hopefully fix mariko bpmp panic issue once and for all(?) --- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index f5171082..37b673a5 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -43,9 +43,14 @@ namespace bpmp { constexpr u32 ApbMiscSlaveSecurityReg2 = 0xC08; /* Relative to actmonVirtAddr */ + constexpr u32 ActmonGlbPeriodCtrl = 0x004; constexpr u32 ActmonCopCtrl = 0xC0; + constexpr u32 ActmonCopUpperWmark = 0xC4; constexpr u32 ActmonCopIntrStatus = 0xE4; + constexpr u32 ActmonGlbPeriodCtrlUsec = (1u << 8); + constexpr u32 ActmonCopCtrlStockArmed = (1u << 31) | (1u << 30) | (1u << 18); + constexpr u32 EvpCopResetVector = 0x200; constexpr u32 EvpCopUndefVector = 0x204; constexpr u32 EvpCopSwiVector = 0x208; @@ -55,8 +60,11 @@ namespace bpmp { constexpr u32 EvpCopIrqVector = 0x218; constexpr u32 EvpCopFiqVector = 0x21C; + constexpr u32 StockBpmpExceptionVector = 0x7D000000; + constexpr u32 FlowCtlrHaltCopEvents = 0x004; constexpr u32 FlowModeNone = 0x00000000; + constexpr u32 FlowModeStop = (2u << 29); constexpr u64 FwIramPhysBase = 0x40004000; constexpr u32 FwStagingSize = 0x8000; @@ -82,6 +90,24 @@ namespace bpmp { std::atomic_bool s_isAwake = true; + void RestoreStockState() { + SmcReadWriteRegister(EvpPhysBase + EvpCopResetVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopUndefVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopSwiVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopPrefetchAbortVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopDataAbortVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopRsvdVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopIrqVector, 0xFFFFFFFF, StockBpmpExceptionVector); + SmcReadWriteRegister(EvpPhysBase + EvpCopFiqVector, 0xFFFFFFFF, StockBpmpExceptionVector); + + SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0xFFFFFFFF, FlowModeStop); + + Mmio(board::actmonVirtAddr, ActmonGlbPeriodCtrl) = ActmonGlbPeriodCtrlUsec; + Mmio(board::actmonVirtAddr, ActmonCopUpperWmark) = 0; + Mmio(board::actmonVirtAddr, ActmonCopIntrStatus) = Mmio(board::actmonVirtAddr, ActmonCopIntrStatus); + Mmio(board::actmonVirtAddr, ActmonCopCtrl) = ActmonCopCtrlStockArmed; + } + void PscThreadFunc(void *) { while (!s_pscExit) { Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); @@ -94,6 +120,7 @@ namespace bpmp { rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); if (R_SUCCEEDED(rc)) { if (state == PscPmState_Awake) { + svcSleepThread(500'000'000); // 500ms Result wrc = StartBpmfwExecution(); if (R_FAILED(wrc)) { fileUtils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); @@ -101,6 +128,7 @@ namespace bpmp { s_isAwake = true; } else if (state == PscPmState_ReadySleep) { + RestoreStockState(); s_isAwake = false; } From dd59deeefaaa11e187762177157ed97d3a55654a Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 25 Aug 2026 21:25:01 +0200 Subject: [PATCH 078/205] clkmgr: (hack) prevent emc freq list mismatch with 64 lut freq hack --- Source/hoc-clk/sysmodule/src/file/kip.cpp | 12 ++++++++++++ Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp | 7 +++++-- Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index bb6169cf..e1e63d5a 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -219,6 +219,18 @@ namespace kip { // return; // } + /* Hack: Get the actually applied and in use emc max clock for 64 lut freq hack. */ + /* I hate this. */ + /* Don't fetch frequency if it's already set or we would overwrite it. */ + /* This technically only applies to Mariko *for now*. */ + if (clockManager::patchedEmcMaxClock == 0) { + if (board::GetSocType() == HocClkSocType_Mariko) { + clockManager::patchedEmcMaxClock = cust_get_mariko_emc_max(&table); + } else { + clockManager::patchedEmcMaxClock = cust_get_erista_emc_max(&table); + } + } + if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { MigrateKipData(cust_get_cust_rev(&table), cust_get_kip_version(&table)); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index c035c11e..9448fc6b 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -53,6 +53,9 @@ namespace clockManager { LockableMutex gContextMutex; HocClkContext gContext = {}; FreqTable gFreqTable[HocClkModule_EnumMax]; + /* Hack: Fixes emc 64 lut freq list hack edge case. */ + /* The clock in the config may differ from the actual max clock, so it's read out from the kip before migration or any other potential overwrite. */ + u32 patchedEmcMaxClock = {}; std::uint64_t gLastTempLogNs = 0; std::uint64_t gLastFreqLogNs = 0; std::uint64_t gLastPowerLogNs = 0; @@ -297,7 +300,7 @@ namespace clockManager { /* Since it is a pain to patch the vtables in ipc we can just hack the freqs in. You can still set them. */ constexpr u64 EmcClkOSLimitHz = 1600000ULL * 1000; // 1600 MHz - const u64 maxHz = static_cast(config::GetConfigValue(KipConfigValue_marikoEmcMaxClock)) * 1000; + const u64 maxHz = patchedEmcMaxClock * 1000; if (module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && kip::kipAvailable && maxHz >= EmcClkOSLimitHz && config::GetConfigValue(KipConfigValue_stepMode) == 4 /* 33 MHz */) { @@ -819,7 +822,7 @@ namespace clockManager { gContext.isDram8GB = board::IsDram8GB(); gContext.consoleType = board::GetConsoleType(); gContext.isFirstLoad = config::GetConfigValue(HocClkConfigValue_IsFirstLoad); - + board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); gContext.gpuSchedulingMode = (GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp index 6caee007..7dccdc8e 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp @@ -45,6 +45,7 @@ namespace clockManager { extern LockableMutex gContextMutex; extern HocClkContext gContext; extern FreqTable gFreqTable[HocClkModule_EnumMax]; + extern u32 patchedEmcMaxClock; extern std::uint64_t gLastTempLogNs; extern std::uint64_t gLastFreqLogNs; extern std::uint64_t gLastPowerLogNs; From 49244b3baf366cf7bdc942244f4bbd258420356d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 15:59:52 -0400 Subject: [PATCH 079/205] move soctherm poll to bpmp --- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 2672 -> 2920 bytes Source/hoc-clk/bpmpfw/source/defs.hpp | 26 ++++++++++ Source/hoc-clk/bpmpfw/source/main.cpp | 11 ++++- Source/hoc-clk/bpmpfw/source/regs.hpp | 15 ++++-- Source/hoc-clk/bpmpfw/source/sensors.hpp | 34 +++++++++++++ Source/hoc-clk/common/include/hocclk/bpmp.h | 10 ++-- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 2 +- .../sysmodule/src/tsensor/soctherm.cpp | 45 +++--------------- 8 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/source/defs.hpp create mode 100644 Source/hoc-clk/bpmpfw/source/sensors.hpp diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 64a8fc50d76a503f72dbbc973358177158f46b40..bb044fdeb9d40ab74f7d8e8381c11087e2885c08 100644 GIT binary patch delta 414 zcmXZXy-UMT5CHJY^RuC78jCmxzP2cW6{C|lMY|M(5>Ujkih_tAq2egEC1VFA>fn+$ z=`2oe)kz_uf5Lmj2emGafo2Ke{^UtVLT zl!c(NupOA##XlG?^)T->0Lh9+&kDW&(MN%NQXDP33WVe N%z_F3VPhR(`~udToT>l- delta 166 zcmaDM_CdrWiizP>4iF1C=)RO@V0f*KQV=|a~T80 y&Yn4Q#=vWG5SJh0q{$1pocTZs8^DS|8YX|@Qk$&7ts~;$05lK^GJx#=KmY(. + * + */ + +#pragma once +#include + +using u8 = std::uint8_t; +using u16 = std::uint16_t; +using u32 = std::uint32_t; +using s8 = std::int8_t; +using s16 = std::int16_t; +using s32 = std::int32_t; diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index d329e669..72a25d0f 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -20,6 +20,7 @@ #include "libc_platform.hpp" #include "regs.hpp" +#include "sensors.hpp" #include @@ -34,7 +35,7 @@ namespace { extern "C" void main() { InitializeLibc(); - printf("[hoc-bpmpfw] Starting bpmpfw\n"); + printf("[hoc-bpmpfw]: Starting bpmpfw\n"); HocClkBpmpSharedInfo &info = SharedInfo(); memset(&info, 0, sizeof(info)); @@ -42,6 +43,14 @@ extern "C" void main() { info.magic = HOCCLK_BPMP_MAGIC; // written last for (;;) { + const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); + const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); + info.tempCpu = TranslateSocthermTemp(static_cast(temp1 >> 16)); + info.tempGpu = TranslateSocthermTemp(static_cast(temp1)); + info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); + info.tempPllx = TranslateSocthermTemp(static_cast(temp2)); + + usleep(250000); // 250ms } } diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index a39389b2..24adffa2 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -16,11 +16,7 @@ */ #pragma once -#include - -using u8 = std::uint8_t; -using u16 = std::uint16_t; -using u32 = std::uint32_t; +#include "defs.hpp" #define MMIO32(addr) (*reinterpret_cast(addr)) @@ -39,6 +35,15 @@ constexpr u32 HaltUsec = (0u << 24); MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | (usec & 0xFFFFFFu); } +constexpr u32 TmrBase = 0x60005000; +constexpr u32 TimerUsCntr1Us = 0x10; + +[[maybe_unused]] inline void usleep(u32 us) { + const u32 start = MMIO32(TmrBase + TimerUsCntr1Us); + while ((MMIO32(TmrBase + TimerUsCntr1Us) - start) <= us) + ; +} + constexpr u32 UartBBase = 0x70006040; constexpr u32 UartThr = 0x00; constexpr u32 UartLsr = 0x14; diff --git a/Source/hoc-clk/bpmpfw/source/sensors.hpp b/Source/hoc-clk/bpmpfw/source/sensors.hpp new file mode 100644 index 00000000..64aad219 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/sensors.hpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include "regs.hpp" + +constexpr u32 SocthermBase = 0x700E2000; +constexpr u32 SocthermSensorTemp1 = 0x1C8; +constexpr u32 SocthermSensorTemp2 = 0x1CC; + +inline s32 TranslateSocthermTemp(u16 val) { + s32 t = ((val >> 8) & 0xFF) * 1000; + if (val & (1u << 7)) { + t += 500; + } + if (val & (1u << 0)) { + t = -t; + } + return t; +} diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h index b5cb8f4b..d2b5f862 100644 --- a/Source/hoc-clk/common/include/hocclk/bpmp.h +++ b/Source/hoc-clk/common/include/hocclk/bpmp.h @@ -27,9 +27,13 @@ * Any 64 bit data type is not permitted. */ typedef struct { - u32 magic; // should be HOCCLK_BPMP_MAGIC once bpmpfw is running - u32 status; // Reserved for error codes and such - u32 reserved[6]; + u32 magic; // should be HOCCLK_BPMP_MAGIC once bpmpfw is running + u32 status; // Reserved for error codes and such + s32 tempCpu; + s32 tempGpu; + s32 tempMem; + s32 tempPllx; + u32 reserved[2]; } HocClkBpmpSharedInfo; static_assert(sizeof(HocClkBpmpSharedInfo) == 0x20); diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 37b673a5..35a2a175 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -127,7 +127,7 @@ namespace bpmp { } s_isAwake = true; - } else if (state == PscPmState_ReadySleep) { + } else if (state == PscPmState_ReadySleep || state == PscPmState_ReadyShutdown) { RestoreStockState(); s_isAwake = false; } diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index 6a053f46..af56a833 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -24,6 +24,7 @@ #include #include "../board/board.hpp" +#include "../bpmp/bpmp.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "soctherm.hpp" @@ -413,15 +414,6 @@ namespace tsensor { bool isMariko; } // namespace - bool IsDisabledThroughSleep() { - return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || - !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM); - } - - bool IsSensorEnabled() { - return ReadReg(socthermVa, TSENSOR_TSENSOR_CLKEN); - } - void EnableSensor(const TSensor *sensor, u32 sensorIdx) { u32 val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT; WriteReg(socthermVa, sensor->base + SENSOR_CONFIG0, val); @@ -434,21 +426,6 @@ namespace tsensor { WriteReg(socthermVa, sensor->base + SENSOR_CONFIG2, calib[sensorIdx]); } - s32 TranslateTemp(u16 val) { - s32 t; - - t = ((val & READBACK_VALUE_MASK) >> READBACK_VALUE_SHIFT) * 1000; - if (val & READBACK_ADD_HALF) { - t += 500; - } - - if (val & READBACK_NEGATE) { - t *= -1; - } - - return t; - } - void StartSensors() { u32 pdiv, hotspot; @@ -474,23 +451,15 @@ namespace tsensor { } void ReadTSensors(TSensorTemps &temps) { - if (IsDisabledThroughSleep()) { + const HocClkBpmpSharedInfo *bpmpInfo = bpmp::GetSharedInfo(); + if (bpmpInfo->magic != HOCCLK_BPMP_MAGIC) { return; } - if (!IsSensorEnabled()) { - StartSensors(); - } - - temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); - temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); - temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK); - - if (board::GetSocType() == HocClkSocType_Erista) { - temps.mem = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) >> 16); - } else { - temps.mem = -1; - } + temps.cpu = bpmpInfo->tempCpu; + temps.gpu = bpmpInfo->tempGpu; + temps.pllx = bpmpInfo->tempPllx; + temps.mem = (board::GetSocType() == HocClkSocType_Erista) ? bpmpInfo->tempMem : bpmpInfo->tempPllx; } void InitializeSoctherm() { From b8f728ac0aee000d9efa54b0e7495c1fd05e6782 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 16:08:32 -0400 Subject: [PATCH 080/205] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5ec2190f..24f4283c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ Source/hekate dist/* !dist/.gitignore Source/hoc-clk/sysmodule/data/bpmpfw.bin +Source/hoc-clk/bpmpfw/out/bpmpfw.bin From 1b9156fbd645c05316c363e10f0dbb2f6cf3a106 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 18:54:58 -0400 Subject: [PATCH 081/205] soctherm coldboot fix --- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 2920 -> 2912 bytes Source/hoc-clk/bpmpfw/source/main.cpp | 33 +++++++++++++++++++------- Source/hoc-clk/bpmpfw/source/regs.hpp | 25 ++++++++++++------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index bb044fdeb9d40ab74f7d8e8381c11087e2885c08..3ac590debb7b3214ac017937e0764872ab8c9476 100644 GIT binary patch delta 447 zcmXw#Jxjw-6oyY?ixNMGN$4O2Z<9d>#kh%!XD)iiQ6z#xf4~iw3tFdcZt;Zbfx~;w<>k4Y_cOWuHvlPU6COz0d`B|()S&3pbt)Ew^9mi$-S%LgNtn=aM16H0qcs_LPwZ+ z8vCU>%gp=CpQo{$)wt=RF4MTV=xY)f+$_^LTJMPV{xJi!u4RjD)-H~{Q))|?=(Uj3 z+-sv>D$A(%;wMQK-jZYp9@K!$c^)1LHDtnv0O&nP z4N0o?M)KjLVPOvMQ4|qWlnAiGBgK^t!Y5^WHjT=|PUCXJk)rFHqm*1Q1#c1x0S!*ODqT&QjnoPQ3N4hvBz{GRdhr8SAs@^# zih<>p^=fJy>PN1a~=*yz7OV5PrlZGT|GlHqUEM6-@7Xh_-;&W93c!yKNAu1Z4X9D*3={1_r+M!k|NiP4iiLns)v z%`)CdIv=H8Av4)~V9IksoFj1T_zY`vcF9F=4e*)H&pt=-jXlW+5l wqfc!4ps{zbwX?|{jVu7H?62?a@9w>3b$-a6ulX|*)q+(68&41A;2dM!10EKvFaQ7m diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index 72a25d0f..af007fe3 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -32,6 +32,21 @@ namespace { } // namespace +void MainLoop(HocClkBpmpSharedInfo &info) { + for (;;) { + const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); + const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); + + info.tempCpu = TranslateSocthermTemp(static_cast(temp1 >> 16)); + info.tempGpu = TranslateSocthermTemp(static_cast(temp1)); + info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); + info.tempPllx = TranslateSocthermTemp(static_cast(temp2)); + // printf("tmr=%u\n", MMIO32(TmrBase + TimerUsCntr1Us)); + msleep(500); + //printf("[hoc-bpmpfw]: Done logging\n"); + } +} + extern "C" void main() { InitializeLibc(); @@ -42,15 +57,15 @@ extern "C" void main() { info.status = 0; info.magic = HOCCLK_BPMP_MAGIC; // written last - for (;;) { - const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); - const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); + /* If the main loop exits then it is a panic or invalid state */ + MainLoop(info); - info.tempCpu = TranslateSocthermTemp(static_cast(temp1 >> 16)); - info.tempGpu = TranslateSocthermTemp(static_cast(temp1)); - info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); - info.tempPllx = TranslateSocthermTemp(static_cast(temp2)); + printf("[hoc-bpmpfw]: PANIC\n"); + /* Clear the magic so sysmodule knows of a panic */ + info.magic = 0x0; - usleep(250000); // 250ms - } + /* Give a panic code */ + info.status = ~0; + for(;;) + ; } diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index 24adffa2..b287c27b 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -29,21 +29,28 @@ constexpr u32 FlowCtlrBase = 0x60007000; constexpr u32 FlowCtlrHaltCopEvents = 0x004; constexpr u32 HaltModeWaitEvent = (2u << 29); -constexpr u32 HaltUsec = (0u << 24); +constexpr u32 HaltMsec = (1u << 24); +constexpr u32 HaltUsec = (1u << 25); +constexpr u32 HaltMaxCnt = 0xFF; -[[maybe_unused]] inline void FlowCtlrHaltUsec(u32 usec) { - MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | (usec & 0xFFFFFFu); +[[maybe_unused]] inline void usleep(u32 us) { + while (us) { + const u32 delay = (us > HaltMaxCnt) ? HaltMaxCnt : us; + us -= delay; + MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | delay; + } +} +[[maybe_unused]] inline void msleep(u32 ms) { + while (ms) { + const u32 delay = (ms > HaltMaxCnt) ? HaltMaxCnt : ms; + ms -= delay; + MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltMsec | delay; + } } constexpr u32 TmrBase = 0x60005000; constexpr u32 TimerUsCntr1Us = 0x10; -[[maybe_unused]] inline void usleep(u32 us) { - const u32 start = MMIO32(TmrBase + TimerUsCntr1Us); - while ((MMIO32(TmrBase + TimerUsCntr1Us) - start) <= us) - ; -} - constexpr u32 UartBBase = 0x70006040; constexpr u32 UartThr = 0x00; constexpr u32 UartLsr = 0x14; From 209ff7afd8437c6863fd76fd9689e0eff8de0dbd Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 18:56:28 -0400 Subject: [PATCH 082/205] unused comments + u64 --- Source/hoc-clk/bpmpfw/source/defs.hpp | 2 ++ Source/hoc-clk/bpmpfw/source/main.cpp | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/source/defs.hpp b/Source/hoc-clk/bpmpfw/source/defs.hpp index 80bc15cd..6c2b8730 100644 --- a/Source/hoc-clk/bpmpfw/source/defs.hpp +++ b/Source/hoc-clk/bpmpfw/source/defs.hpp @@ -21,6 +21,8 @@ using u8 = std::uint8_t; using u16 = std::uint16_t; using u32 = std::uint32_t; +using u64 = std::uint64_t; using s8 = std::int8_t; using s16 = std::int16_t; using s32 = std::int32_t; +using s64 = std::int64_t; diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index af007fe3..f604f063 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -41,9 +41,8 @@ void MainLoop(HocClkBpmpSharedInfo &info) { info.tempGpu = TranslateSocthermTemp(static_cast(temp1)); info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); info.tempPllx = TranslateSocthermTemp(static_cast(temp2)); - // printf("tmr=%u\n", MMIO32(TmrBase + TimerUsCntr1Us)); + msleep(500); - //printf("[hoc-bpmpfw]: Done logging\n"); } } From ac41a498e129a5ee3e9cf35f03327b3522265160 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 19:19:19 -0400 Subject: [PATCH 083/205] fix soctherm-BPMP --- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 2912 -> 2968 bytes Source/hoc-clk/bpmpfw/source/main.cpp | 3 ++- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 3ac590debb7b3214ac017937e0764872ab8c9476..61766ba1ec27f24d8e81d98268537af1a9222190 100644 GIT binary patch delta 428 zcmX|-y-UMT6vgk0E!HR!La0SLylRCE7E^I>P}<-kxD<*g6rr>fT#CUDa4D@xEw0+3 z9fZEsMThI8>kO6HG(4ZhE`7ub3O5L)e!@; zBO(g(LX>%L2xtaJwwUKEm0cn?#92U=3eKTzXyv?Y=V{R0Ld1wYp^jE8m+@OvPDOJR)% z2a=cvPy*V7ry;|KJfEU0?NhdFYBraQyc<%k#h33dKKuR{s620h1;rRP&~FlpkZ%7| zI+&g*VDLH^3=Z4-a-QVc5Ax1NP!&T3bp^^6!77}cl+TYVr`02RUa4B??Ul>Pu#STa I0C%&+Z?>nUKL7v# delta 354 zcmXw#ze>YU6vj`|7PbE2_O`Sj1#gq3gJRvfnbf7AAXv~fEnTH~fnpLex=5fnNOMP> z`vSU&#H|l-!{rXv7jTOwRENVk-{IqT_|9WP)a{uLt7j}?9ep(czS|J17wn92353fg z>IrHiciSQVM4pyR1}zJIU>cg{IjeXI^bmanl|iden3=E`XD)b9;NvEmEA!c)CO zrP0UU=IQjnryA6xalzB%WUj)iu>dlpB|8+Mz4mSrPZ{Vnku$vv(NCps426z7u*P)F ztoEgerb720N~L+o(;drGL2o3Atw01Vp5}19RF!7#I}Q+5mD5v9$wrjmp&Ij|iPoU^ z>L<(gKeB8EE;zvU+{KgTYMQgyE!=EunV9o4NfH*_mIvB(^j1Er<@w#eALM_q9B`xV Gw(|=sXN61v diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index f604f063..2da95075 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -36,7 +36,7 @@ void MainLoop(HocClkBpmpSharedInfo &info) { for (;;) { const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); - + info.tempCpu = TranslateSocthermTemp(static_cast(temp1 >> 16)); info.tempGpu = TranslateSocthermTemp(static_cast(temp1)); info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); @@ -60,6 +60,7 @@ extern "C" void main() { MainLoop(info); printf("[hoc-bpmpfw]: PANIC\n"); + /* Clear the magic so sysmodule knows of a panic */ info.magic = 0x0; diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 35a2a175..bf1824cf 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -23,6 +23,7 @@ #include "../file/config.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" +#include "../tsensor/soctherm.hpp" #include "bpmp.hpp" #include "bpmpfw_bin.h" @@ -121,6 +122,10 @@ namespace bpmp { if (R_SUCCEEDED(rc)) { if (state == PscPmState_Awake) { svcSleepThread(500'000'000); // 500ms + + /* I have no clue why this is needed as it wasn't needed before ¯\(ツ)/¯ */ + tsensor::InitializeSoctherm(); + Result wrc = StartBpmfwExecution(); if (R_FAILED(wrc)) { fileUtils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); From dca14e4767ed19dc1d10c1aad43e49fbf4fb85e8 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 19:21:06 -0400 Subject: [PATCH 084/205] Update about_gui.cpp --- Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index f36b012b..a0dd851a 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -276,7 +276,7 @@ void AboutGui::refresh() bqtempitem->setValue(strings[10]); cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); - bpmpStatusItem->setValue(this->context->bpmpInfo.magic == HOCCLK_BPMP_MAGIC ? "Enabled" : "Disabled"); + bpmpStatusItem->setValue(this->context->bpmpInfo.magic == HOCCLK_BPMP_MAGIC ? "Enabled" : "Halted"); } class CreditsSubMenu : public AboutGui { From d8c6a86bb0052b021918274daa097ea4cdcc92bd Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 11:56:56 -0400 Subject: [PATCH 085/205] real freqs + ram load on bpmp gpu freq is excluded due to smmu issue (carveout?) --- Source/hoc-clk/bpmpfw/Makefile | 5 +- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 2968 -> 5008 bytes Source/hoc-clk/bpmpfw/source/actmon.hpp | 99 ++++++ Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp | 152 +++++++++ Source/hoc-clk/bpmpfw/source/freq.hpp | 79 +++++ Source/hoc-clk/bpmpfw/source/main.cpp | 24 +- Source/hoc-clk/common/include/hocclk/bpmp.h | 12 +- .../common/include/hocclk/clock_manager.h | 2 +- Source/hoc-clk/sysmodule/src/board/board.cpp | 1 - .../sysmodule/src/board/board_freq.cpp | 8 +- .../sysmodule/src/board/board_freq.hpp | 1 - .../sysmodule/src/board/board_load.cpp | 14 +- .../sysmodule/src/board/board_profile.cpp | 1 - .../sysmodule/src/board/board_sensor.cpp | 1 - Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 33 ++ Source/hoc-clk/sysmodule/src/file/config.cpp | 1 - .../hoc-clk/sysmodule/src/file/file_utils.cpp | 1 - .../hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 1 - Source/hoc-clk/sysmodule/src/soc/t210.c | 297 ------------------ Source/hoc-clk/sysmodule/src/soc/t210.h | 47 --- 20 files changed, 411 insertions(+), 368 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/source/actmon.hpp create mode 100644 Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp create mode 100644 Source/hoc-clk/bpmpfw/source/freq.hpp delete mode 100644 Source/hoc-clk/sysmodule/src/soc/t210.c delete mode 100644 Source/hoc-clk/sysmodule/src/soc/t210.h diff --git a/Source/hoc-clk/bpmpfw/Makefile b/Source/hoc-clk/bpmpfw/Makefile index 4cd0257a..ddfe3882 100644 --- a/Source/hoc-clk/bpmpfw/Makefile +++ b/Source/hoc-clk/bpmpfw/Makefile @@ -28,7 +28,8 @@ CXXFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -fno-exceptions -fno-rtti \ -fomit-frame-pointer -std=gnu++20 -Wall -Wextra $(CUSTOMDEFINES) ASFLAGS := $(ARCH) -g LDFLAGS := $(ARCH) -nostartfiles -nodefaultlibs -Wl,--nmagic,--gc-sections \ - -T $(SOURCEDIR)/../bpmpfw.ld -lgcc + -T $(SOURCEDIR)/../bpmpfw.ld +LDLIBS := -lgcc BIN_TARGET := $(OUTPUTDIR)/$(TARGET).bin @@ -41,7 +42,7 @@ $(BIN_TARGET): $(BUILDDIR)/$(TARGET).elf $(OBJCOPY) -S -O binary $< $@ $(BUILDDIR)/$(TARGET).elf: $(OBJS) - @$(CXX) $(LDFLAGS) $(OBJS) -o $@ + @$(CXX) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ $(BUILDDIR)/%.o: $(SOURCEDIR)/%.cpp | $(BUILDDIR) @$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 61766ba1ec27f24d8e81d98268537af1a9222190..4681bab6323048e8d6d6b4642ca5e57ede0e4405 100644 GIT binary patch delta 2545 zcmah~ZD?E98Gi4FQ`r&Gjij}X2+fh4QWs)!-MT}|+)eg88q>5@qmZnuW3roM8KkWj z0?VIruXLSwftG2xHtR~$d$OfaN`HiQzrx0p(89WUkQE9UIjo8I!#~C-X*caT zSN58YhRIy(J$k>M`+hvUZAPXK}a010!fqL5y)Oi*tIvyzdV4zaAK8LD25g}evYMrw$Q2D7q z4X)|frATdJO)pVi5P_OPu;F%~c54unjX&>p2X;H5`kY0Hj&y=GT|d!)0bti0=qOOj zuo;H`Zubm)b3I?kQ*KjzmuTg86sb=QS|RxS){WG7HdJHqTV!6OSUXfM4$KV|tp!M} zC3p$OQ`A($2=rCKkLX~fP?^Qc@puU_0C0RVRNq6wYe;B2Tvj3f6>^2~m{8FvoFfg! z<#G9uN~COeUX_5-MKGJVB%GhanaHk+u2soqi25r;VlP#wWz6MprW#d-YrmM>>$M=A zz>_aVD!(~WPG#hVgJ#y9rb-);N~6$qaRym@Rc|-HkfAr1_jKyc7rN^}P-kaUmuj)a z_-L2$p~-wRHr<-A9bbLg?H1ldED=8JG4aXzl}ny81z& z+FSH+z^{xZr*rXLdO|<+;AHq>3{Eu4OC203vl&E@iFsQk-yLC#Dz4Uj2kLHS0{eh5KI z+CJmMJ{vbmGs4sX5s#>z9fHp6%f(iCJ!Uo@+5up+pql2apkh-rQ6*0Y*M>tdbdcc1 zoz3i64vU99AU2!Lvjxn;N%VC|u^~*De+qK%oXBgs)NMM#n`-;7o`X}#92|6)bhSJ^ z1Q)5TXJ82fcCy#|_L9^c?8^e+|87c!Tq1q|TR+gaE`@`Y))(2YZPVU|I(d ziR_+KM<<~}(k|_bZ5PAoVmP;ZL2Om_37dTh)g3`;K*>M?6m8(L2vDmgtqcN`|KO4` z>|DGR%m31vyah901Jq~Ra;nQVcMO+Xh>jmAMFNh+Ze)CU&TYwaUh+1!akiFn+GjV5JmKs=re5^_F|SPU0H!p-=;ou9GB z1r3~BZ$bUL+r9a}Nss=&qzpt18-1(%UHjMZ2VO|{fo+=8T%kE4Q|j?VM$A*@I-brv zb-mmHTAemEcT{qd8M;L@p~*TSW)SqduNiZO*{Z#}$=ZL{z>^^7KQAvY@2Q2)59~ER z`YgOWFqzOcU!!hK-xZx6RV3PL+4}A1Dacie9FYU{=bj+CnF1+MedLCP%fS|BRqD#i zoiz0bPT$#99h^Z`xxxL5po-=Z{*X~cJLk?S+&rUSC)#DAts5NfNz>x6>(zIZ$J)OJ9;V6!F2EP%=K@d;*TLFUala}+b(1CTpJ_Iz-J`)@0Y~j+qw;`?S z`@#YF5j_**Ee6u{9+d|>n+ZE7F?{c1agRm=N9|x&7DZq64PjIkJ5+t6W7PL|{(;NJ zrj{7n1KxOIUOqfMFZ-Nx;^Aj-2Dm(c<(Ih}1F$qzh2>lVumdp$ba3_2URBoP-b9P_ zHJ~p?U0KsZiGdzul=EW3bhaj80XhTl1 zpLd8p`kO(%&-~k=eQD<_`b#2fJA9_{_26KYsp4Y&NWJOg;8x z<;4E#cYZigo1S8`hYr7R?9e0biTh3r=qPuxn>l>^(6OFbcwpmw?ApJ&-g@TuCa97i Lz`yH|yZHPEv``-I delta 464 zcmX|;ze~eV5XUbuYAqs<7_>--SFM=AV&deWm^umVP%Ma0gkn(~6oWs&rC1XcMvK7;C9Ry)b70j_AKA<+lv&WR8=_Nah{w|# z(azq87-4}zS@4XAvuMpc3*7OFFPpCKnk5W8eSb_!1;I&<$1k2WotfUWhb8|9}yQ;Ba-3ab+0+zY8L` z+^g|uK^p53R06Hb(~uEDk@rw$hLlZYHHXVa(O1a1_zc6bhcJ8t8XvO3hH?Tg(7f)q zCApq!_6@A|$4gjwYPZ{KId6-s$b~PjMV8FyS_~CkERt0QyL7NuIo#gd-(9DNo4dBT eFnQcHvuNVpi#p-uhtv2&Kasb<`tv*JLyT_>)~-PS diff --git a/Source/hoc-clk/bpmpfw/source/actmon.hpp b/Source/hoc-clk/bpmpfw/source/actmon.hpp new file mode 100644 index 00000000..9a607c4e --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/actmon.hpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include "freq.hpp" +#include "regs.hpp" + +#include + +namespace actmon { + + constexpr u32 ActmonBase = 0x6000C800; + constexpr u32 ActmonDevBase = ActmonBase + 0x80; + constexpr u32 ActmonDevSize = 0x40; + + constexpr u32 ActmonGlbStatus = 0x0; + constexpr u32 ActmonGlbPeriodCtrl = 0x4; + constexpr u32 ActmonMccpuMonAct = (1u << 8); + constexpr u32 ActmonMcallMonAct = (1u << 9); + + constexpr u32 ActmonDevCtrlKVal3 = (3u << 10); + constexpr u32 ActmonDevCtrlEnbPeriodic = (1u << 18); + constexpr u32 ActmonDevCtrlEnb = (1u << 31); + + constexpr u32 ActmonPeriodMs = 20; + + enum ActmonDev : u32 { + DevCpu = 0, + DevBpmp, + DevAhb, + DevApb, + DevCpuFreq, + DevMcAll, + DevMcCpu, + }; + + constexpr u32 DevCtrl = 0x00; + constexpr u32 DevInitAvg = 0x0C; + constexpr u32 DevCountWeight = 0x18; + constexpr u32 DevAvgCount = 0x20; + + inline u32 DevReg(ActmonDev dev, u32 off) { + return ActmonDevBase + (static_cast(dev) * ActmonDevSize) + off; + } + + inline void EnableDev(ActmonDev dev, u32 freqKhz, u32 weight) { + MMIO32(DevReg(dev, DevInitAvg)) = freqKhz * ActmonPeriodMs / 2; + MMIO32(DevReg(dev, DevCountWeight)) = weight; + MMIO32(DevReg(dev, DevCtrl)) = ActmonDevCtrlEnb | ActmonDevCtrlEnbPeriodic | ActmonDevCtrlKVal3; + } + + inline void Init() { + const u32 emcFreqKhz = static_cast(freq::MeasurePtoFreqHz(freq::ClkPtoEmc, 1) / 1000); + + if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMcallMonAct)) { + MMIO32(ActmonBase + ActmonGlbPeriodCtrl) = (ActmonPeriodMs - 1) & 0xFF; + EnableDev(DevMcAll, emcFreqKhz, 256 * 4); + } + + if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMccpuMonAct)) { + EnableDev(DevMcCpu, emcFreqKhz, 256 * 4); + } + } + + inline void Update(HocClkBpmpSharedInfo &info) { + const u32 emcFreqKhz = info.freqMem; + if (emcFreqKhz == 0) { + return; + } + + const u32 avgAll = MMIO32(DevReg(DevMcAll, DevAvgCount)); + const u32 avgCpu = MMIO32(DevReg(DevMcCpu, DevAvgCount)); + + // Get 1000 -> 100.0. + info.emcLoadAll = static_cast((static_cast(avgAll) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); + info.emcLoadCpu = static_cast((static_cast(avgCpu) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); + + info.emcBwAll = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadAll) / 1000000); + info.emcBwCpu = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadCpu) / 1000000); + + // Not 100% accurate but should be enough. + info.emcBwGpu = (info.emcBwAll > info.emcBwCpu) ? (info.emcBwAll - info.emcBwCpu) : 0; + } + +} // namespace actmon diff --git a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp new file mode 100644 index 00000000..ca106eb8 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2019-2025 CTCaer + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include "regs.hpp" + +// NOTE: MMU won't allow access to gpu address space (smmu carveout issue?) +namespace bpmpMmu { + + constexpr u32 CacheBase = 0x50040000; + + constexpr u32 CacheConfig = 0x000; + constexpr u32 CfgEnableCache = (1u << 0); + constexpr u32 CfgForceWriteThrough = (1u << 3); + constexpr u32 CfgMmuTagModeShift = 8; + constexpr u32 TagModeParallel = 0; + constexpr u32 CfgTagChkAbrtOnErr = (1u << 14); + + constexpr u32 MaintReq = 0x028; + constexpr u32 MaintReqWayBitmapAll = (0xFu << 8); + + constexpr u32 IntClear = 0x044; + constexpr u32 IntRawEvent = 0x048; + constexpr u32 IntMaintDone = (1u << 0); + + constexpr u32 MmuFallbackEntry = 0x0A0; + constexpr u32 MmuShadowCopyMask = 0x0A4; + + constexpr u32 MmuCfg = 0x0AC; + constexpr u32 MmuCfgSeqEn = (1u << 1); + constexpr u32 MmuCfgTlbEn = (1u << 2); + constexpr u32 MmuCfgAbortStoreLast = (1u << 4); + + constexpr u32 MmuCmd = 0x0B0; + constexpr u32 MmuCmdInit = 1; + constexpr u32 MmuCmdCopyShadow = 2; + + constexpr u32 ShadowEntryBase = CacheBase + 0x400; + + constexpr u32 MmuEnCached = (1u << 0); + constexpr u32 MmuEnExec = (1u << 1); + constexpr u32 MmuEnRead = (1u << 2); + constexpr u32 MmuEnWrite = (1u << 3); + + constexpr u32 MaintCleanInvalidWay = 19; + constexpr u32 MaintInvalidWay = 18; + + constexpr u32 CacheLineSize = 0x20; + + constexpr u32 DramStart = 0x80000000; + constexpr u32 IramBase = 0x40000000; + constexpr u32 IramEnd = 0x4003FFFF; + + struct MmuEntry { + u32 startAddr; + u32 endAddr; + u32 attr; + }; + + constexpr MmuEntry Entries[] = { + { DramStart, 0xFFFFFFFF, MmuEnRead | MmuEnWrite | MmuEnExec | MmuEnCached }, + { IramBase, IramEnd, MmuEnRead | MmuEnWrite | MmuEnExec | MmuEnCached }, + }; + + inline u32 AlignUp(u32 x, u32 a) { + return (x + a - 1) & ~(a - 1); + } + inline u32 AlignDown(u32 x, u32 a) { + return x & ~(a - 1); + } + + inline void Maintenance(u32 op, bool force) { + if (!force && !(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { + return; + } + + MMIO32(CacheBase + IntClear) = IntMaintDone; + + // Blocking operation. + MMIO32(CacheBase + MaintReq) = MaintReqWayBitmapAll | op; + + while (!(MMIO32(CacheBase + IntRawEvent) & IntMaintDone)) + ; + + MMIO32(CacheBase + IntClear) = MMIO32(CacheBase + IntRawEvent); + } + + inline void SetEntry(u32 idx, const MmuEntry &entry) { + MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x0) = AlignUp(entry.startAddr, CacheLineSize); + MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x4) = AlignDown(entry.endAddr, CacheLineSize); + MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x8) = entry.attr; + + MMIO32(CacheBase + MmuShadowCopyMask) |= (1u << idx); + } + + inline void Enable() { + if (MMIO32(CacheBase + CacheConfig) & CfgEnableCache) { + return; + } + + // Init BPMP MMU. + MMIO32(CacheBase + MmuCmd) = MmuCmdInit; + MMIO32(CacheBase + MmuFallbackEntry) = MmuEnRead | MmuEnWrite | MmuEnExec; // RWX for non-defined regions. + MMIO32(CacheBase + MmuCfg) = MmuCfgSeqEn | MmuCfgTlbEn | MmuCfgAbortStoreLast; + + // Init BPMP MMU entries. + MMIO32(CacheBase + MmuShadowCopyMask) = 0; + for (u32 idx = 0; idx < sizeof(Entries) / sizeof(Entries[0]); idx++) { + SetEntry(idx, Entries[idx]); + } + + MMIO32(CacheBase + MmuCmd) = MmuCmdCopyShadow; + + // Invalidate cache. + Maintenance(MaintInvalidWay, true); + + // Enable cache. + MMIO32(CacheBase + CacheConfig) = CfgEnableCache | CfgForceWriteThrough | + (TagModeParallel << CfgMmuTagModeShift) | CfgTagChkAbrtOnErr; + + // HW bug. Invalidate cache again. + Maintenance(MaintInvalidWay, false); + } + + inline void Disable() { + if (!(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { + return; + } + + // Clean and invalidate cache. + Maintenance(MaintCleanInvalidWay, false); + + // Disable cache. + MMIO32(CacheBase + CacheConfig) = 0; + } + +} // namespace bpmpMmu diff --git a/Source/hoc-clk/bpmpfw/source/freq.hpp b/Source/hoc-clk/bpmpfw/source/freq.hpp new file mode 100644 index 00000000..eea8e9a4 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/freq.hpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include "regs.hpp" + +#include + +namespace freq { + + constexpr u32 CarBase = 0x60006000; + constexpr u32 CarPtoClkCntCntl = 0x60; + constexpr u32 CarPtoClkCntStatus = 0x64; + + constexpr u32 PtoCntEn = (1u << 9); + constexpr u32 PtoCntRst = (1u << 10); + constexpr u32 PtoClkEnable = (1u << 13); + constexpr u32 PtoSrcSelShift = 14; + constexpr u32 PtoDivSelDiv1 = (1u << 23); + constexpr u32 PtoClkCntBusy = (1u << 31); + constexpr u32 PtoClkCntMask = 0xFFFFFF; + + constexpr u32 ClkPtoCclkGDiv2 = 0x13; + constexpr u32 ClkPtoEmc = 0x24; + + inline u64 MeasurePtoFreqHz(u32 srcId, u32 multiplier) { + constexpr u32 win = 16; + constexpr u32 osc = 32768; + + const u32 val = (srcId << PtoSrcSelShift) | PtoDivSelDiv1 | PtoClkEnable | (win - 1); + + MMIO32(CarBase + CarPtoClkCntCntl) = val; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntRst; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + MMIO32(CarBase + CarPtoClkCntCntl) = val; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntEn; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep((1000000u * win / osc) + 12 + 2); // 502us + + while (MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntBusy) + ; + + const u32 cnt = MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntMask; + + MMIO32(CarBase + CarPtoClkCntCntl) = 0; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + return (static_cast(cnt) * multiplier * osc) / win; + } + + inline void Update(HocClkBpmpSharedInfo &info) { + info.freqMem = static_cast(MeasurePtoFreqHz(ClkPtoEmc, 1) / 1000); + info.freqCpu = static_cast(MeasurePtoFreqHz(ClkPtoCclkGDiv2, 2) / 1000); + } + +} // namespace freq diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index 2da95075..43e74416 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -18,6 +18,9 @@ #include #include +#include "actmon.hpp" +#include "bpmp_mmu.hpp" +#include "freq.hpp" #include "libc_platform.hpp" #include "regs.hpp" #include "sensors.hpp" @@ -34,6 +37,10 @@ namespace { void MainLoop(HocClkBpmpSharedInfo &info) { for (;;) { + if (info.exitRequested) { + break; + } + const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); @@ -42,11 +49,23 @@ void MainLoop(HocClkBpmpSharedInfo &info) { info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); info.tempPllx = TranslateSocthermTemp(static_cast(temp2)); - msleep(500); + freq::Update(info); + actmon::Update(info); + + msleep(250); } + + /* Deinit MMU otherwise sleep will fatal. */ + bpmpMmu::Disable(); + info.magic = 0x0; + + for (;;) + ; } extern "C" void main() { + bpmpMmu::Enable(); + InitializeLibc(); printf("[hoc-bpmpfw]: Starting bpmpfw\n"); @@ -54,6 +73,9 @@ extern "C" void main() { HocClkBpmpSharedInfo &info = SharedInfo(); memset(&info, 0, sizeof(info)); info.status = 0; + + actmon::Init(); + info.magic = HOCCLK_BPMP_MAGIC; // written last /* If the main loop exits then it is a panic or invalid state */ diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h index d2b5f862..c064f835 100644 --- a/Source/hoc-clk/common/include/hocclk/bpmp.h +++ b/Source/hoc-clk/common/include/hocclk/bpmp.h @@ -33,7 +33,15 @@ typedef struct { s32 tempGpu; s32 tempMem; s32 tempPllx; - u32 reserved[2]; + u32 freqCpu; // kHz + u32 freqMem; // kHz + u32 emcLoadAll; + u32 emcLoadCpu; + u32 emcBwAll; + u32 emcBwCpu; + u32 emcBwGpu; + u32 exitRequested; // Request BPMP-FW to shutdown for sleep mode + u32 reserved[1]; } HocClkBpmpSharedInfo; -static_assert(sizeof(HocClkBpmpSharedInfo) == 0x20); +static_assert(sizeof(HocClkBpmpSharedInfo) == 0x3C); diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index f2338354..766412cb 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -89,7 +89,7 @@ typedef struct { HocClkBpmpSharedInfo bpmpInfo; // Reserved for future use - u8 reserved[0x358]; + u8 reserved[0x33C]; } HocClkContext; typedef struct diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index da191e6d..049ec75a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include #include "../bpmp/bpmp.hpp" diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 8386d8ef..81128498 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -28,9 +28,9 @@ #include #include #include -#include #include +#include "../bpmp/bpmp.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" #include "../file/errors.hpp" @@ -179,13 +179,13 @@ namespace board { u32 hz = 0; switch (module) { case HocClkModule_CPU: - return t210ClkCpuFreq(); + return bpmp::GetSharedInfo()->freqCpu * 1000; case HocClkModule_GPU: - return t210ClkGpuFreq(); + return bpmp::GetSharedInfo()->freqGpu * 1000; case HocClkModule_MEM: return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB() - : t210ClkMemFreq(); + : bpmp::GetSharedInfo()->freqMem * 1000; case HocClkModule_Display: return GetDisplayRate(hz); default: diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp index fa774cbe..b0a91b6f 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include "../file/errors.hpp" diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index bf814453..669f46d2 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -33,9 +33,9 @@ #include #include #include -#include #include +#include "../bpmp/bpmp.hpp" #include "../hos/apm_ext.h" #include "board.hpp" #include "board_misc.hpp" @@ -116,9 +116,9 @@ namespace board { u32 GetPartLoad(HocClkPartLoad loadSource) { switch (loadSource) { case HocClkPartLoad_EMC: - return t210EmcLoadAll(); + return bpmp::GetSharedInfo()->emcLoadAll; case HocClkPartLoad_EMCCpu: - return t210EmcLoadCpu(); + return bpmp::GetSharedInfo()->emcLoadCpu; case HocClkPartLoad_GPU: return gpuLoad; case HocClkPartLoad_CPUMax: @@ -130,13 +130,13 @@ namespace board { case HocClkPartLoad_FAN: return GetFanLevel(); case HocClkPartLoad_RamBWAll: - return t210EmcBwAll(); + return bpmp::GetSharedInfo()->emcBwAll; case HocClkPartLoad_RamBWCpu: - return t210EmcBwCpu(); + return bpmp::GetSharedInfo()->emcBwCpu; case HocClkPartLoad_RamBWGpu: - return t210EmcBwGpu(); + return bpmp::GetSharedInfo()->emcBwGpu; case HocClkPartLoad_RamBWPeak: - return t210EmcBwPeak(); + return static_cast((static_cast(bpmp::GetSharedInfo()->freqMem) * 16) / 1000); default: ASSERT_ENUM_VALID(HocClkPartLoad, loadSource); } diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp index 6d7da57e..eadeba8a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include "../hos/apm_ext.h" diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index b451075a..1a274050 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include "../file/config.hpp" diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index bf1824cf..7c626409 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -16,6 +16,7 @@ */ #include +#include #include #include @@ -91,7 +92,39 @@ namespace bpmp { std::atomic_bool s_isAwake = true; + + /* Must be called to prevent secmon/erpt panic on wake */ + void RequestBpmpExitAndWait() { + if (!IsPatchedExosphere()) { + return; + } + + const u32 one = 1; + Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, exitRequested), &one, sizeof(one)); + if (R_FAILED(rc)) { + fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: SmcCopyToIram failed: 0x%x", rc); + return; + } + + constexpr int MaxAttempts = 20; + constexpr u64 PollIntervalNs = 20'000'000; // 20ms + + HocClkBpmpSharedInfo info = {}; + for (int i = 0; i < MaxAttempts; i++) { + svcSleepThread(PollIntervalNs); + + rc = SmcCopyFromIram(&info, WorkRamPhysBase, sizeof(info)); + if (R_SUCCEEDED(rc) && info.magic != HOCCLK_BPMP_MAGIC) { + return; + } + } + + fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: BPMP timeout (cannot sleep)"); + } + void RestoreStockState() { + RequestBpmpExitAndWait(); + SmcReadWriteRegister(EvpPhysBase + EvpCopResetVector, 0xFFFFFFFF, StockBpmpExceptionVector); SmcReadWriteRegister(EvpPhysBase + EvpCopUndefVector, 0xFFFFFFFF, StockBpmpExceptionVector); SmcReadWriteRegister(EvpPhysBase + EvpCopSwiVector, 0xFFFFFFFF, StockBpmpExceptionVector); diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index d911cebb..018571a5 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 107a2b73..169eb87b 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include "../hos/apm_ext.h" diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index f6230f69..f1e01d9b 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include "../file/config.hpp" diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.c b/Source/hoc-clk/sysmodule/src/soc/t210.c deleted file mode 100644 index d787976f..00000000 --- a/Source/hoc-clk/sysmodule/src/soc/t210.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (c) 2020-2023 CTCaer - * Copyright (c) 2023 p-sam - * Copyright (c) 2023 Lineon - * Copyright (c) 2026 Souldbminer - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "t210.h" - -#define WAIT_NS 1000000000UL - -#define usleep(x) svcSleepThread(1000UL * x) - -#define GPU_TRIM_SYS_GPCPLL_COEFF 0x4 -#define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(g_gpu_base + 0x137000ul + (x))) - -#define CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL 0x60 -#define CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS 0x64 -#define CLK_RST_CONTROLLER_CLK_OUT_ENB_X 0x280 -#define CLK_RST_CONTROLLER_RST_DEVICES_X 0x28C - -/*! PTO_CLK_CNT */ -#define PTO_REF_CLK_WIN_CFG_MASK 0xF -#define PTO_REF_CLK_WIN_CFG_16P 0xF -#define PTO_CNT_EN BIT(9) -#define PTO_CNT_RST BIT(10) -#define PTO_CLK_ENABLE BIT(13) -#define PTO_SRC_SEL_SHIFT 14 -#define PTO_SRC_SEL_MASK 0x1FF -#define PTO_DIV_SEL_MASK (3 << 23) -#define PTO_DIV_SEL_GATED (0 << 23) -#define PTO_DIV_SEL_DIV1 (1 << 23) -#define PTO_DIV_SEL_DIV2_RISING (2 << 23) -#define PTO_DIV_SEL_DIV2_FALLING (3 << 23) -#define PTO_DIV_SEL_CPU_EARLY (0 << 23) -#define PTO_DIV_SEL_CPU_LATE (1 << 23) - -#define PTO_CLK_CNT_BUSY BIT(31) -#define PTO_CLK_CNT 0xFFFFFF -#define CLK_PTO_CCLK_G_DIV2 0x13 -#define CLK_PTO_EMC 0x24 - -#define CLOCK(x) (*(volatile u32 *)(g_clk_base + (x))) - -/* Actmon Global registers */ -#define ACTMON_GLB_STATUS 0x0 -#define ACTMON_MCCPU_MON_ACT BIT(8) -#define ACTMON_MCALL_MON_ACT BIT(9) -#define ACTMON_CPU_FREQ_MON_ACT BIT(10) -#define ACTMON_BPMP_MON_ACT BIT(14) -#define ACTMON_CPU_MON_ACT BIT(15) - -#define ACTMON_GLB_PERIOD_CTRL 0x4 -#define ACTMON_GLB_PERIOD_USEC BIT(8) -#define ACTMON_GLB_PERIOD_SAMPLE(n) (((n) - 1) & 0xFF) - -/* Actmon Device Registers */ -#define ACTMON_DEV_SIZE 0x40 -/* Actmon CTRL */ -#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10) -#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18) -#define ACTMON_DEV_CTRL_ENB BIT(31) - -#define ACTMON_PERIOD_MS 20 -#define DEV_COUNT_WEIGHT 1024 - -#define ACTMON_BASE (g_act_base + 0x800) -#define ACTMON_DEV_BASE (ACTMON_BASE + 0x80) -#define ACTMON(x) (*(volatile u32 *)(ACTMON_BASE + (x))) - -typedef enum _actmon_dev_t { - ACTMON_DEV_CPU, - ACTMON_DEV_BPMP, - ACTMON_DEV_AHB, - ACTMON_DEV_APB, - ACTMON_DEV_CPU_FREQ, - ACTMON_DEV_MC_ALL, - ACTMON_DEV_MC_CPU, - - ACTMON_DEV_NUM, -} actmon_dev_t; - -typedef struct _actmon_dev_reg_t { - vu32 ctrl; - vu32 upper_wnark; - vu32 lower_wmark; - vu32 init_avg; - vu32 avg_upper_wmark; - vu32 avg_lower_wmark; - vu32 count_weight; - vu32 count; - vu32 avg_count; - vu32 intr_status; - vu32 ctrl2; - vu32 rsvd[5]; -} actmon_dev_reg_t; - -static uintptr_t g_clk_base = 0; -static uintptr_t g_gpu_base = 0; -static uintptr_t g_act_base = 0; -static u64 g_update_ticks = 0; -static u32 g_cpu_freq = 0; -static u32 g_gpu_freq = 0; -static u32 g_mem_freq = 0; -static u32 g_emc_lall = 0; -static u32 g_emc_lcpu = 0; -static u32 g_emc_bw_all = 0; -static u32 g_emc_bw_cpu = 0; -static u32 g_emc_bw_gpu = 0; - -static u32 _clock_get_dev_freq(u32 id, u32 multiplier) { - const u32 pto_win = 16; - const u32 pto_osc = 32768; - - u32 val = ((id & PTO_SRC_SEL_MASK) << PTO_SRC_SEL_SHIFT) | PTO_DIV_SEL_DIV1 | PTO_CLK_ENABLE | (pto_win - 1); - CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val; - (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep(2); - - CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_RST; - (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep(2); - - CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val; - (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep(2); - - CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_EN; - (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep((1000000ULL * pto_win / pto_osc) + 12 + 2); // 502 us. - - while (CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT_BUSY) - ; - - u32 cnt = CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT; - - CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = 0; - (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep(2); - - u32 freq_khz = (u64)cnt * multiplier * pto_osc / pto_win; - - return freq_khz; -} - -static void _actmon_dev_enable(actmon_dev_t dev, u32 freq, u32 weight) { - actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); - - regs->init_avg = (u32)freq * ACTMON_PERIOD_MS / 2; - regs->count_weight = weight; - - regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC | ACTMON_DEV_CTRL_K_VAL(3); // 8 samples average. -} - -static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) { - actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); - - return regs->avg_count; -} - -static inline Result _svcQueryMemoryMappingFallback(u64 *virtaddr, u64 physaddr, u64 size) { - if (hosversionAtLeast(10, 0, 0)) { - u64 out_size; - return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); - } else { - return svcLegacyQueryIoMapping(virtaddr, physaddr, size); - } -} - -static void _clock_update_freqs(void) { - u64 ticks = armGetSystemTick(); - if (armTicksToNs(ticks - g_update_ticks) <= WAIT_NS) { - return; - } - - g_update_ticks = ticks; - - if (!g_clk_base) { - _svcQueryMemoryMappingFallback(&g_clk_base, 0x60006000ul, 0x1000); - } - - if (!g_clk_base) { - return; - } - - g_mem_freq = _clock_get_dev_freq(CLK_PTO_EMC, 1); - g_cpu_freq = _clock_get_dev_freq(CLK_PTO_CCLK_G_DIV2, 2); - - if (!g_gpu_base) { - _svcQueryMemoryMappingFallback(&g_gpu_base, 0x57000000ul, 0x1000000); - } - - if (!g_gpu_base) { - return; - } - - bool gpu_enabled = (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_X) & BIT(24)) && !(CLOCK(CLK_RST_CONTROLLER_RST_DEVICES_X) & BIT(24)); - if (!gpu_enabled) { - return; - } - - if (!g_act_base) { - _svcQueryMemoryMappingFallback(&g_act_base, 0x6000C000ul, 0x1000); - } - - if (!g_act_base) { - return; - } - - const u32 osc = 38400000; - u32 coeff = GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF); - u32 divm = coeff & 0xFF; - u32 divn = (coeff >> 8) & 0xFF; - u32 divp = (coeff >> 16) & 0x3F; - g_gpu_freq = osc * divn / (divm * divp) / 2; - - u32 emc_freq = g_mem_freq / 1000; - - // Check if actmon is disabled - if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCALL_MON_ACT)) { - ACTMON(ACTMON_GLB_PERIOD_CTRL) = ACTMON_GLB_PERIOD_SAMPLE(ACTMON_PERIOD_MS); - _actmon_dev_enable(ACTMON_DEV_MC_ALL, emc_freq, 256 * 4); - } - - // Check if actmon is disabled - if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCCPU_MON_ACT)) - _actmon_dev_enable(ACTMON_DEV_MC_CPU, emc_freq, 256 * 4); - - // Get 1000 -> 100.0. - g_emc_lall = (u64)_actmon_dev_get_count_avg(ACTMON_DEV_MC_ALL) * 10 * 100 / (emc_freq * ACTMON_PERIOD_MS); - g_emc_lcpu = (u64)_actmon_dev_get_count_avg(ACTMON_DEV_MC_CPU) * 10 * 100 / (emc_freq * ACTMON_PERIOD_MS); - - // TODO: use PLL instead of actmon - // Avoid floating point arithematic - g_emc_bw_all = (u64)emc_freq * 16 * g_emc_lall / 1000000; - g_emc_bw_cpu = (u64)emc_freq * 16 * g_emc_lcpu / 1000000; - - // Not 100% accurate but should be enough - g_emc_bw_gpu = g_emc_bw_all - g_emc_bw_cpu; -} - -u32 t210ClkCpuFreq(void) { - _clock_update_freqs(); - return g_cpu_freq; -} - -u32 t210ClkMemFreq(void) { - _clock_update_freqs(); - return g_mem_freq; -} - -u32 t210ClkGpuFreq(void) { - _clock_update_freqs(); - return g_gpu_freq; -} - -u32 t210EmcLoadAll() { - _clock_update_freqs(); - return g_emc_lall; -} - -u32 t210EmcLoadCpu() { - _clock_update_freqs(); - return g_emc_lcpu; -} - -u32 t210EmcBwAll() { - _clock_update_freqs(); - return g_emc_bw_all; -} - -u32 t210EmcBwCpu() { - _clock_update_freqs(); - return g_emc_bw_cpu; -} - -u32 t210EmcBwGpu() { - _clock_update_freqs(); - return g_emc_bw_gpu; -} - -u32 t210EmcBwPeak() { - _clock_update_freqs(); - return ((u64)g_mem_freq * 16) / 1000000; -} \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.h b/Source/hoc-clk/sysmodule/src/soc/t210.h deleted file mode 100644 index 2ad618f6..00000000 --- a/Source/hoc-clk/sysmodule/src/soc/t210.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* -------------------------------------------------------------------------- - * "THE BEER-WARE LICENSE" (Revision 42): - * , , - * wrote this file. As long as you retain this notice you can do whatever you - * want with this stuff. If you meet any of us some day, and you think this - * stuff is worth it, you can buy us a beer in return. - The sys-clk authors - * -------------------------------------------------------------------------- - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -u32 t210ClkCpuFreq(void); -u32 t210ClkMemFreq(void); -u32 t210ClkGpuFreq(void); -u32 t210EmcLoadAll(void); -u32 t210EmcLoadCpu(void); -u32 t210EmcBwAll(void); -u32 t210EmcBwCpu(void); -u32 t210EmcBwGpu(void); -u32 t210EmcBwPeak(void); - -#ifdef __cplusplus -} -#endif From a36d861e492b935a7a77bb908ad3b5ac902d94bc Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 11:59:52 -0400 Subject: [PATCH 086/205] actually fix gpu real hz --- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 5008 -> 4568 bytes Source/hoc-clk/sysmodule/src/board/board.cpp | 5 +++- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 +- .../sysmodule/src/board/board_freq.cpp | 23 ++++++++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 4681bab6323048e8d6d6b4642ca5e57ede0e4405..cf996ae1c5f7f84edd3eefaf94286bafe89673c1 100644 GIT binary patch delta 782 zcmYjP!Alfj6n`^2t?nW@trle=v$oV0l2a@cVlavaD+@P4q=PKjrQ2S*ba7?V?U1p{ z*P?{_g?w>?$y}$ z2<9hKOmzT;G8di0N8<<&K z(w>QL`f@U3mzij?NqHG`G#>x{Ow?mcBGxRV1`#hKn|dxGdW{P=$NOOTvdB4W0a882 z<}uFv$MxS4GsdF_@GP8>!A6e^e(AJ-g-YDeTy7*?&JkXjClL_MyA9iEM8%zAdx2Mm z#UEo}t}L6+smi(X0*BpRGv`(LU;s@)BUDWkl|d4jzN$=xWscEwa1j}A5XFZO-H!=A z*n+<&18Y!ld-9FH7N7U^q-xp{$7~rG))H^xz49S@oh`4#0zQVd&U4D4qbvhgIRLkR zkija*^g9`>TuS;8a4EaQKQTd7R26=!gY&-Ps33zK*dv%wx=?EIODYbEBxkJ9k3wyy z#A|Ab_9AEO<?QS=DlygQp>40chElU>`rS`rpuj#wlS~ND*W(w@ek9xgc#*M2k x^5&R+>riZ)BWKkf`K?_d>{Bg%?yn}syHY8_NgaiAngTfYhRJCGe5QdzoPT49LAC$@ delta 1242 zcmZ`&QD_`h6umP$O|vn&lWYWC3%*TlyF#_o8gS8wyXy*#wHUh4TErSt68h27r3eOp zcDHM@3Kb`P4b`BX7YHc*66049+=xHI3ZY*SBFtpGA8mf}C6ZRh^EO)vQXf3tz3<+8 z?tS;&v$EUW7f)GqXFv8wGx3s{&Ci@lnPO??gT2PRnfWIwtG35Qs&h+toU!YC*tx<6 zCBu7B)T8C1bCF*qTK}Fr{?nj!A{Bn;cs$%Mc?fY=5ht3G9mv9wOr7{{q85voG|Elr1vzOQkcO44=(cPgP@#6CE)}E!yP=Ii+p|>Z)eXxCY&|^O?dGiPOG*u8!f9#7JlD~MU=9_8# zk9dUmgqIMj?OLCM?WtyiE%7DyDiz$+HV3iaszBSGzFtwm=c%+GgE8YYIGgq`l`8xO zj&m>8d~G9F1p@amQo(+=(YAlBf#_sFxsj@aLWgp=M}d|z%~?kmT?(^c#fH#$TP$f$ zxvfH9Pr2Qh^2!4!q-oRClMdRLeYJ47zuuFgbp%2dO6f)6nT{z(pe@D@s|0X@V zJ?XZb58vl4fi6Y)+m7c&R7swojS-WYG?ptQXp<l zkB`3cPQEl!6yp<<=PyjWd`R&=lAa9dlMJ7+~lWyd&KHrQN_>!SU=^#+RpkN Ha)k8{+I;rm diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 049ec75a..692d83c5 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -52,7 +52,7 @@ namespace board { - u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr; + u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr; HocClkSocType gSocType; u8 gDramID; @@ -157,6 +157,9 @@ namespace board { ASSERT_RESULT_OK(rc, "QueryMemoryMapping (sys)"); actmonVirtAddr = sysVirtAddr + 0x800; + rc = QueryMemoryMapping(&gpuVirtAddr, 0x57000000, 0x1000000); + ASSERT_RESULT_OK(rc, "QueryMemoryMapping (gpu)"); + FetchHardwareInfos(); Result nvCheck = 1; diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 313400af..e1d57ea5 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -42,7 +42,7 @@ #define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0)) namespace board { - extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr; + extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr; extern HocClkSocType gSocType; extern u8 gDramID; extern HocClkConsoleType gConsoleType; diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 81128498..16e0f98c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -180,8 +180,27 @@ namespace board { switch (module) { case HocClkModule_CPU: return bpmp::GetSharedInfo()->freqCpu * 1000; - case HocClkModule_GPU: - return bpmp::GetSharedInfo()->freqGpu * 1000; + case HocClkModule_GPU: { + constexpr u32 ClkOutEnbX = 0x280; + constexpr u32 RstDevicesX = 0x28C; + constexpr u32 GpuBit = (1u << 24); + + const bool gpuEnabled = (*reinterpret_cast(clkVirtAddr + ClkOutEnbX) & GpuBit) && + !(*reinterpret_cast(clkVirtAddr + RstDevicesX) & GpuBit); + if (!gpuEnabled) { + return 0; + } + + const u32 coeff = *reinterpret_cast(gpuVirtAddr + 0x137004); + const u32 divm = coeff & 0xFF; + const u32 divn = (coeff >> 8) & 0xFF; + const u32 divp = (coeff >> 16) & 0x3F; + if (divm == 0 || divp == 0) { + return 0; + } + + return static_cast((static_cast(38400000) * divn) / (divm * divp) / 2); + } case HocClkModule_MEM: return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB() From 3d2719f1b6ec6a3205f00b4fb014290ca4f11e0a Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 12:53:59 -0400 Subject: [PATCH 087/205] I REFUSE --- Source/Atmosphere-Patches/secmon_setup.cpp | 1289 ++++++++++++++++++++ build.sh | 2 + 2 files changed, 1291 insertions(+) create mode 100644 Source/Atmosphere-Patches/secmon_setup.cpp diff --git a/Source/Atmosphere-Patches/secmon_setup.cpp b/Source/Atmosphere-Patches/secmon_setup.cpp new file mode 100644 index 00000000..4cf37b3a --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_setup.cpp @@ -0,0 +1,1289 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include +#include "secmon_setup.hpp" +#include "secmon_error.hpp" +#include "secmon_map.hpp" +#include "secmon_cpu_context.hpp" +#include "secmon_mariko_fatal_error.hpp" +#include "secmon_interrupt_handler.hpp" +#include "secmon_misc.hpp" +#include "smc/secmon_random_cache.hpp" +#include "smc/secmon_smc_power_management.hpp" +#include "smc/secmon_smc_se_lock.hpp" + +namespace ams::secmon { + + namespace { + + constexpr inline const uintptr_t TIMER = secmon::MemoryRegionVirtualDeviceTimer.GetAddress(); + constexpr inline const uintptr_t SYSTEM = secmon::MemoryRegionVirtualDeviceSystem.GetAddress(); + constexpr inline const uintptr_t APB_MISC = secmon::MemoryRegionVirtualDeviceApbMisc.GetAddress(); + constexpr inline const uintptr_t FLOW_CTLR = secmon::MemoryRegionVirtualDeviceFlowController.GetAddress(); + constexpr inline const uintptr_t PMC = secmon::MemoryRegionVirtualDevicePmc.GetAddress(); + constexpr inline const uintptr_t MC = secmon::MemoryRegionVirtualDeviceMemoryController.GetAddress(); + constexpr inline const uintptr_t EVP = secmon::MemoryRegionVirtualDeviceExceptionVectors.GetAddress(); + constexpr inline const uintptr_t CLK_RST = secmon::MemoryRegionVirtualDeviceClkRst.GetAddress(); + + alignas(8) constinit u8 g_se_aes_key_slot_test_vector[se::AesBlockSize] = {}; + + struct Carveout { + uintptr_t address; + size_t size; + }; + + constinit Carveout g_kernel_carveouts[KernelCarveoutCount] = { + { secmon::MemoryRegionDramDefaultKernelCarveout.GetAddress(), secmon::MemoryRegionDramDefaultKernelCarveout.GetSize(), }, + { 0, 0, }, + }; + + constinit bool g_is_cold_boot = true; + + constinit se::StickyBits ExpectedSeStickyBits = { + .se_security = (1 << 0), /* SE_HARD_SETTING */ + .tzram_security = 0, + .crypto_security_perkey = (1 << pkg1::AesKeySlot_UserEnd) - 1, + .crypto_keytable_access = { + (0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 0: User keyslot. KEY. KEYUSE, UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. UIVREAD, OIVREAD, KEYREAD disabled. */ + (0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 1: User keyslot. KEY. KEYUSE, UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. UIVREAD, OIVREAD, KEYREAD disabled. */ + (0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 2: User keyslot. KEY. KEYUSE, UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. UIVREAD, OIVREAD, KEYREAD disabled. */ + (0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 3: User keyslot. KEY. KEYUSE, UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. UIVREAD, OIVREAD, KEYREAD disabled. */ + (0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 4: User keyslot. KEY. KEYUSE, UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. UIVREAD, OIVREAD, KEYREAD disabled. */ + (0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 5: User keyslot. KEY. KEYUSE, UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. UIVREAD, OIVREAD, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 6: Unused keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 7: Unused keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (0 << 7) | (0 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 8: Temp keyslot. KEY. UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. KEYUSE, UIVREAD, OIVREAD, KEYREAD disabled. */ + (0 << 7) | (0 << 6) | (1 << 5) | (0 << 4) | (1 << 3) | (0 << 2) | (1 << 1) | (0 << 0), /* 9: SmcTemp keyslot. KEY. UIVUPDATE, OIVUPDATE, KEYUPDATE enabled. KEYUSE, UIVREAD, OIVREAD, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 10: Wrap1 keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (0 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 11: Wrap2 keyslot. KEY. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 12: DMaster keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 13: Master keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 14: Unused keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + (1 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0), /* 13: Device keyslot. KEK. KEYUSE, UIVUPDATE, UIVREAD, OIVUPDATE, OIVREAD, KEYUPDATE, KEYREAD disabled. */ + }, + .rsa_security_perkey = 0, + .rsa_keytable_access = { + (0 << 2) | (1 << 1) | (0 << 0), /* KEYUSE/KEYREAD disabled, KEYUPDATE enabled. */ + (0 << 2) | (1 << 1) | (0 << 0), /* KEYUSE/KEYREAD disabled, KEYUPDATE enabled. */ + }, + }; + + void InitializeConfigurationContext() { + /* Get the global context. */ + auto &ctx = ::ams::secmon::impl::GetConfigurationContext(); + + /* Clear the context to zero. */ + std::memset(std::addressof(ctx), 0, sizeof(ctx)); + + /* If the storage context is valid, we want to copy it to the global context. */ + if (const auto &storage_ctx = *MemoryRegionPhysicalDramMonitorConfiguration.GetPointer(); storage_ctx.IsValid()) { + ctx.secmon_cfg.CopyFrom(storage_ctx); + ctx.emummc_cfg = storage_ctx.emummc_cfg; + } else { + /* If we don't have a valid storage context, we can just use the default one. */ + ctx.secmon_cfg = DefaultSecureMonitorConfiguration; + } + + /* Cache the fuse info for quick access. */ + ctx.secmon_cfg.SetFuseInfo(); + } + + void GenerateSecurityEngineAesKeySlotTestVector(void *dst, size_t size) { + /* Clear the output. */ + AMS_ABORT_UNLESS(size == se::AesBlockSize); + std::memset(dst, 0, se::AesBlockSize); + + /* Ensure output is seen as cleared by the se. */ + hw::FlushDataCache(dst, se::AesBlockSize); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Declare a block. */ + alignas(8) u8 empty_block[se::AesBlockSize]; + + /* Iteratively transform an empty block. */ + #define TRANSFORM_WITH_KEY(key) \ + __builtin_memset(empty_block, 0, sizeof(empty_block)); \ + se::SetEncryptedAesKey256(pkg1::AesKeySlot_Temporary, key, empty_block, sizeof(empty_block)); \ + se::DecryptAes128(dst, se::AesBlockSize, pkg1::AesKeySlot_Temporary, dst, se::AesBlockSize) + + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_RandomForUserWrap); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_RandomForKeyStorageWrap); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_Master); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_DeviceMaster); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_Device); + + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_RandomForUserWrap); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_RandomForKeyStorageWrap); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_Master); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_DeviceMaster); + TRANSFORM_WITH_KEY(pkg1::AesKeySlot_Device); + + /* Ensure output is seen correctly by the cpu. */ + hw::FlushDataCache(dst, se::AesBlockSize); + hw::DataSynchronizationBarrierInnerShareable(); + + /* Clear the temporary key slot. */ + se::ClearAesKeySlot(pkg1::AesKeySlot_Temporary); + } + + void VerifySecurityEngineStickyBits() { + /* On mariko, an extra sticky bit is set. */ + if (GetSocType() == fuse::SocType_Mariko) { + ExpectedSeStickyBits.se_security |= (1 << 5); + } else /* if (GetSocType() == fuse::SocType_Erista) */ { + /* Erista does not support DST_KEYTABLE_ONLY, and so all keys will have the bit clear. */ + for (size_t i = 0; i < util::size(ExpectedSeStickyBits.crypto_keytable_access); ++i) { + ExpectedSeStickyBits.crypto_keytable_access[i] &= ~(1 << 7); + } + } + + if (!se::ValidateStickyBits(ExpectedSeStickyBits)) { + SetError(pkg1::ErrorInfo_InvalidSecurityEngineStickyBits); + AMS_ABORT("Invalid sticky bits"); + } + } + + void VerifySecurityEngineAesKeySlotTestVector() { + alignas(8) u8 test_vector[se::AesBlockSize]; + GenerateSecurityEngineAesKeySlotTestVector(test_vector, sizeof(test_vector)); + + AMS_ABORT_UNLESS(crypto::IsSameBytes(g_se_aes_key_slot_test_vector, test_vector, se::AesBlockSize)); + } + + void ClearAesKeySlots() { + /* Clear all non-secure monitor keys. */ + for (int i = 0; i < pkg1::AesKeySlot_SecmonStart; ++i) { + se::ClearAesKeySlot(i); + } + + /* Clear the secure-monitor temporary keys. */ + se::ClearAesKeySlot(pkg1::AesKeySlot_Temporary); + se::ClearAesKeySlot(pkg1::AesKeySlot_Smc); + } + + void ClearRsaKeySlots() { + /* Clear all rsa keyslots. */ + for (int i = 0; i < se::RsaKeySlotCount; ++i) { + se::ClearRsaKeySlot(i); + } + } + + void SetupKernelCarveouts() { + #define MC_ENABLE_CLIENT_ACCESS(INDEX, WHICH) MC_REG_BITS_ENUM(CLIENT_ACCESS##INDEX##_##WHICH, ENABLE) + + constexpr u32 ClientAccess0 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(0, PTCR), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAY0A), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAY0AB), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAY0B), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAY0BB), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAY0C), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAY0CB), + MC_ENABLE_CLIENT_ACCESS(0, AFIR), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAYHC), + MC_ENABLE_CLIENT_ACCESS(0, DISPLAYHCB), + MC_ENABLE_CLIENT_ACCESS(0, HDAR), + MC_ENABLE_CLIENT_ACCESS(0, HOST1XDMAR), + MC_ENABLE_CLIENT_ACCESS(0, HOST1XR), + MC_ENABLE_CLIENT_ACCESS(0, NVENCSRD), + MC_ENABLE_CLIENT_ACCESS(0, PPCSAHBDMAR), + MC_ENABLE_CLIENT_ACCESS(0, PPCSAHBSLVR)); + + constexpr u32 ClientAccess1 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(1, MPCORER), + MC_ENABLE_CLIENT_ACCESS(1, NVENCSWR), + MC_ENABLE_CLIENT_ACCESS(1, AFIW), + MC_ENABLE_CLIENT_ACCESS(1, HDAW), + MC_ENABLE_CLIENT_ACCESS(1, HOST1XW), + MC_ENABLE_CLIENT_ACCESS(1, MPCOREW), + MC_ENABLE_CLIENT_ACCESS(1, PPCSAHBDMAW), + MC_ENABLE_CLIENT_ACCESS(1, PPCSAHBSLVW)); + + constexpr u32 ClientAccess2 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(2, XUSB_HOSTR), + MC_ENABLE_CLIENT_ACCESS(2, XUSB_HOSTW), + MC_ENABLE_CLIENT_ACCESS(2, XUSB_DEVR), + MC_ENABLE_CLIENT_ACCESS(2, XUSB_DEVW)); + + constexpr u32 ClientAccess2_100 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(2, XUSB_HOSTR), + MC_ENABLE_CLIENT_ACCESS(2, XUSB_HOSTW), + MC_ENABLE_CLIENT_ACCESS(2, XUSB_DEVR), + MC_ENABLE_CLIENT_ACCESS(2, XUSB_DEVW), + MC_ENABLE_CLIENT_ACCESS(2, TSECSRD), + MC_ENABLE_CLIENT_ACCESS(2, TSECSWR)); + + constexpr u32 ClientAccess3 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(3, SDMMCRA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCRAA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCRAB), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCWA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCWAA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCWAB), + MC_ENABLE_CLIENT_ACCESS(3, VICSRD), + MC_ENABLE_CLIENT_ACCESS(3, VICSWR), + MC_ENABLE_CLIENT_ACCESS(3, DISPLAYD), + MC_ENABLE_CLIENT_ACCESS(3, APER), + MC_ENABLE_CLIENT_ACCESS(3, APEW), + MC_ENABLE_CLIENT_ACCESS(3, NVJPGSRD), + MC_ENABLE_CLIENT_ACCESS(3, NVJPGSWR)); + + constexpr u32 ClientAccess3_100 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(3, SDMMCRA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCRAA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCRAB), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCWA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCWAA), + MC_ENABLE_CLIENT_ACCESS(3, SDMMCWAB), + MC_ENABLE_CLIENT_ACCESS(3, VICSRD), + MC_ENABLE_CLIENT_ACCESS(3, VICSWR), + MC_ENABLE_CLIENT_ACCESS(3, DISPLAYD), + MC_ENABLE_CLIENT_ACCESS(3, NVDECSRD), + MC_ENABLE_CLIENT_ACCESS(3, NVDECSWR), + MC_ENABLE_CLIENT_ACCESS(3, APER), + MC_ENABLE_CLIENT_ACCESS(3, APEW), + MC_ENABLE_CLIENT_ACCESS(3, NVJPGSRD), + MC_ENABLE_CLIENT_ACCESS(3, NVJPGSWR)); + + constexpr u32 ClientAccess4 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(4, SESRD), + MC_ENABLE_CLIENT_ACCESS(4, SESWR)); + + constexpr u32 ClientAccess4_800 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(4, SESRD), + MC_ENABLE_CLIENT_ACCESS(4, SESWR), + MC_ENABLE_CLIENT_ACCESS(4, TSECRDB), + MC_ENABLE_CLIENT_ACCESS(4, TSECWRB)); + + + constexpr u32 ClientAccess4_100 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(4, SESRD), + MC_ENABLE_CLIENT_ACCESS(4, SESWR)); + + #undef MC_ENABLE_CLIENT_ACCESS + + constexpr u32 ForceInternalAccess0 = reg::Encode(MC_REG_BITS_ENUM(CLIENT_ACCESS0_AVPCARM7R, ENABLE)); + constexpr u32 ForceInternalAccess0_100 = 0; + + constexpr u32 ForceInternalAccess1 = reg::Encode(MC_REG_BITS_ENUM(CLIENT_ACCESS1_AVPCARM7W, ENABLE)); + constexpr u32 ForceInternalAccess1_100 = 0; + + constexpr u32 CarveoutConfig = reg::Encode(MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_IS_WPR, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_FORCE_APERTURE_ID_MATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ALLOW_APERTURE_ID_MISMATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_RD_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_WR_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_SEND_CFG_TO_GPU, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_VALUE(SECURITY_CARVEOUT_CFG0_APERTURE_ID, 0), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL3, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL3, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ADDRESS_TYPE, ANY_ADDRESS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_LOCK_MODE, LOCKED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_PROTECT_MODE, TZ_SECURE)); + + constexpr u32 CarveoutConfig_100 = reg::Encode(MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_IS_WPR, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_FORCE_APERTURE_ID_MATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ALLOW_APERTURE_ID_MISMATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_RD_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_WR_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_SEND_CFG_TO_GPU, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_VALUE(SECURITY_CARVEOUT_CFG0_APERTURE_ID, 0), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL3, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL3, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ADDRESS_TYPE, ANY_ADDRESS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_LOCK_MODE, LOCKED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_PROTECT_MODE, TZ_SECURE)); + + const u32 target_fw = GetTargetFirmware(); + u32 client_access_2; + u32 client_access_3; + u32 client_access_4; + u32 carveout_config; + if (target_fw >= TargetFirmware_8_1_0) { + client_access_2 = ClientAccess2; + client_access_3 = ClientAccess3; + client_access_4 = ClientAccess4; + carveout_config = CarveoutConfig; + } else if (target_fw >= TargetFirmware_8_0_0) { + client_access_2 = ClientAccess2; + client_access_3 = ClientAccess3; + client_access_4 = ClientAccess4_800; + carveout_config = CarveoutConfig; + } else { + client_access_2 = ClientAccess2_100; + client_access_3 = ClientAccess3_100; + client_access_4 = ClientAccess4_100; + carveout_config = CarveoutConfig_100; + } + + /* Configure carveout 4. */ + reg::Write(MC + MC_SECURITY_CARVEOUT4_BOM, g_kernel_carveouts[0].address >> 0); + reg::Write(MC + MC_SECURITY_CARVEOUT4_BOM_HI, g_kernel_carveouts[0].address >> 32); + reg::Write(MC + MC_SECURITY_CARVEOUT4_SIZE_128KB, g_kernel_carveouts[0].size / 128_KB); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_ACCESS0, ClientAccess0); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_ACCESS1, ClientAccess1); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_ACCESS2, client_access_2); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_ACCESS3, client_access_3); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_ACCESS4, client_access_4); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS0, (target_fw >= TargetFirmware_4_0_0) ? ForceInternalAccess0 : ForceInternalAccess0_100); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS1, (target_fw >= TargetFirmware_4_0_0) ? ForceInternalAccess1 : ForceInternalAccess1_100); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS2, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS4, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT4_CFG0, carveout_config); + + /* Configure carveout 5. */ + reg::Write(MC + MC_SECURITY_CARVEOUT5_BOM, g_kernel_carveouts[1].address >> 0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_BOM_HI, g_kernel_carveouts[1].address >> 32); + reg::Write(MC + MC_SECURITY_CARVEOUT5_SIZE_128KB, g_kernel_carveouts[1].size / 128_KB); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_ACCESS0, ClientAccess0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_ACCESS1, ClientAccess1); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_ACCESS2, client_access_2); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_ACCESS3, client_access_3); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_ACCESS4, client_access_4); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS2, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS4, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT5_CFG0, carveout_config); + } + + void ConfigureSlaveSecurity() { + u32 reg0, reg1, reg2; + if (GetTargetFirmware() > TargetFirmware_1_0_0) { + reg0 = reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(0, SATA_AUX, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, DTV, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, QSPI, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, SE, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, SATA, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, LA, ENABLE)); + + reg1 = reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(1, SPI1, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI2, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI3, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI5, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI6, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, I2C6, ENABLE)); + + reg2 = reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(2, SDMMC3, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(2, DDS, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(2, DP2, ENABLE)); + + const auto hw_type = GetHardwareType(); + + /* Switch Lite can't use HDMI, so set CEC to secure on hoag. */ + if (hw_type == fuse::HardwareType_Hoag) { + reg0 |= reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(0, CEC, ENABLE)); + } + + /* Icosa, Iowa, and Aula all set I2C4 to be secure. */ + if (hw_type == fuse::HardwareType_Icosa && hw_type == fuse::HardwareType_Iowa && hw_type == fuse::HardwareType_Aula) { + reg1 |= reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(1, I2C4, ENABLE)); + + } + + /* Hoag additionally sets UART_B to secure. */ + if (hw_type == fuse::HardwareType_Hoag) { + reg1 |= reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(1, UART_B, ENABLE)); + } + + /* Copper and Calcio lack a lot of hardware, so set the corresponding registers to secure for them. */ + if (hw_type == fuse::HardwareType_Calcio || hw_type == fuse::HardwareType_Copper) { + reg1 |= reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(1, UART_B, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, UART_C, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI4, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, I2C2, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, I2C3, ENABLE)); + + /* Copper/Calcio have no gamecard reader, and thus set SDMMC2 as secure. */ + reg2 |= reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(2, SDMMC2, ENABLE)); + } + + /* Mariko hardware types (not Icosa or Copper) additionally set mariko-only mmio (SE2, PKA1, FEK) as secure. */ + if (hw_type != fuse::HardwareType_Icosa && hw_type != fuse::HardwareType_Copper) { + reg2 |= reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(2, SE2, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(2, PKA1, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(2, FEK, ENABLE)); + } + } else { + reg0 = reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(0, SATA_AUX, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, DTV, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, QSPI, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, SATA, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(0, LA, ENABLE)); + + reg1 = reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(1, SPI1, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI2, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI3, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI5, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, SPI6, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, I2C6, ENABLE)); + + reg2 = reg::Encode(SLAVE_SECURITY_REG_BITS_ENUM(2, DDS, ENABLE), + REG_BITS_VALUE(5, 1, 1), /* Note: Bit 5 is not documented in TRM. */ + REG_BITS_VALUE(4, 1, 1)); /* Note: Bit 4 is not documented in TRM. */ + } + + reg::Write(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, reg0); + reg::Write(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, reg1); + reg::Write(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG2_0, reg2); + } + + void SetupSecureRegisters() { + /* Configure timers 5-8 and watchdog timers 0-3 as secure. */ + // reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), + // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); + + /* Lock cluster switching, to prevent usage of the A53 cores. */ + reg::Write(FLOW_CTLR + FLOW_CTLR_BPMP_CLUSTER_CONTROL, FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER_LOCK, ENABLE), + FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_CLUSTER_SWITCH_ENABLE, DISABLE), + FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER, FAST)); + + /* Enable flow controller debug qualifier for legacy FIQs. */ + reg::Write(FLOW_CTLR + FLOW_CTLR_FLOW_DBG_QUAL, FLOW_REG_BITS_ENUM(FLOW_DBG_QUAL_FIQ2CCPLEX_ENABLE, ENABLE)); + + /* Configure the PMC to disable deep power-down. */ + reg::Write(PMC + APBDEV_PMC_DPD_ENABLE, PMC_REG_BITS_ENUM(DPD_ENABLE_TSC_MULT_EN, DISABLE), + PMC_REG_BITS_ENUM(DPD_ENABLE_ON, DISABLE)); + + /* Configure the video protect region. */ + reg::Write(MC + MC_VIDEO_PROTECT_GPU_OVERRIDE_0, 1); + reg::Write(MC + MC_VIDEO_PROTECT_GPU_OVERRIDE_1, 0); + reg::Write(MC + MC_VIDEO_PROTECT_BOM, 0); + reg::Write(MC + MC_VIDEO_PROTECT_SIZE_MB, 0); + reg::Write(MC + MC_VIDEO_PROTECT_REG_CTRL, MC_REG_BITS_ENUM(VIDEO_PROTECT_REG_CTRL_VIDEO_PROTECT_ALLOW_TZ_WRITE, DISABLED), + MC_REG_BITS_ENUM(VIDEO_PROTECT_REG_CTRL_VIDEO_PROTECT_WRITE_ACCESS, DISABLED)); + + /* Configure the SEC carveout. */ + reg::Write(MC + MC_SEC_CARVEOUT_BOM, 0); + reg::Write(MC + MC_SEC_CARVEOUT_SIZE_MB, 0); + reg::Write(MC + MC_SEC_CARVEOUT_REG_CTRL, MC_REG_BITS_ENUM(SEC_CARVEOUT_REG_CTRL_SEC_CARVEOUT_WRITE_ACCESS, DISABLED)); + + /* Configure the MTS carveout. */ + reg::Write(MC + MC_MTS_CARVEOUT_BOM, 0); + reg::Write(MC + MC_MTS_CARVEOUT_SIZE_MB, 0); + reg::Write(MC + MC_MTS_CARVEOUT_ADR_HI, 0); + reg::Write(MC + MC_MTS_CARVEOUT_REG_CTRL, MC_REG_BITS_ENUM(MTS_CARVEOUT_REG_CTRL_MTS_CARVEOUT_WRITE_ACCESS, DISABLED)); + + /* Configure the security carveout. */ + reg::Write(MC + MC_SECURITY_CFG0, MC_REG_BITS_VALUE(SECURITY_CFG0_SECURITY_BOM, 0)); + reg::Write(MC + MC_SECURITY_CFG1, MC_REG_BITS_VALUE(SECURITY_CFG1_SECURITY_SIZE, 0)); + reg::Write(MC + MC_SECURITY_CFG3, MC_REG_BITS_VALUE(SECURITY_CFG3_SECURITY_BOM_HI, 3)); + + /* Configure security carveout 1. */ + reg::Write(MC + MC_SECURITY_CARVEOUT1_BOM, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_BOM_HI, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_SIZE_128KB, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_ACCESS2, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_ACCESS4, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS2, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS4, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT1_CFG0, MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_IS_WPR, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_FORCE_APERTURE_ID_MATCH, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ALLOW_APERTURE_ID_MISMATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_RD_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_WR_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_SEND_CFG_TO_GPU, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_VALUE(SECURITY_CARVEOUT_CFG0_APERTURE_ID, 0), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL3, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL0, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL3, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL0, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ADDRESS_TYPE, UNTRANSLATED_ONLY), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_LOCK_MODE, LOCKED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_PROTECT_MODE, LOCKBIT_SECURE)); + + /* Security carveout 2 will be configured later by SetupGpuCarveout, after magic values are written to configure gpu/tsec. */ + + /* Configure carveout 3. */ + reg::Write(MC + MC_SECURITY_CARVEOUT3_BOM, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_BOM_HI, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_SIZE_128KB, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_ACCESS2, MC_REG_BITS_ENUM (CLIENT_ACCESS2_GPUSRD, ENABLE), + MC_REG_BITS_ENUM (CLIENT_ACCESS2_GPUSWR, ENABLE)); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_ACCESS4, MC_REG_BITS_ENUM (CLIENT_ACCESS4_GPUSRD2, ENABLE), + MC_REG_BITS_ENUM (CLIENT_ACCESS4_GPUSWR2, ENABLE)); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS2, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS4, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT3_CFG0, MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_IS_WPR, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_FORCE_APERTURE_ID_MATCH, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ALLOW_APERTURE_ID_MISMATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_RD_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_WR_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_SEND_CFG_TO_GPU, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_VALUE(SECURITY_CARVEOUT_CFG0_APERTURE_ID, 3), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL3, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL2, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL0, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL3, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL2, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL1, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ADDRESS_TYPE, UNTRANSLATED_ONLY), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_LOCK_MODE, LOCKED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_PROTECT_MODE, LOCKBIT_SECURE)); + + /* If we're cold-booting and on 1.0.0, alter the default carveout size. */ + if (g_is_cold_boot && GetTargetFirmware() <= TargetFirmware_1_0_0) { + g_kernel_carveouts[0].size = 200 * 128_KB; + } + + /* NOTE: Here Nintendo configures the two kernel carveouts; we will do this later, to allow fusee to continue using AVP_CACHE. */ + /* SetupKernelCarveouts(); */ + + /* Configure slave register security. */ + ConfigureSlaveSecurity(); + } + + void SetupSmmu() { + /* Turn on SMMU translation for all devices. */ + reg::Write(MC + MC_SMMU_TRANSLATION_ENABLE_0, ~0u); + reg::Write(MC + MC_SMMU_TRANSLATION_ENABLE_1, ~0u); + reg::Write(MC + MC_SMMU_TRANSLATION_ENABLE_2, ~0u); + reg::Write(MC + MC_SMMU_TRANSLATION_ENABLE_3, ~0u); + reg::Write(MC + MC_SMMU_TRANSLATION_ENABLE_4, ~0u); + + /* On modern firmware, configure ASIDs 1-3 as secure, and all others as non-secure. */ + if (GetTargetFirmware() >= TargetFirmware_4_0_0) { + reg::Write(MC + MC_SMMU_ASID_SECURITY, MC_REG_BITS_ENUM(SMMU_ASID_SECURITY_SECURE_ASIDS_1, SECURE), + MC_REG_BITS_ENUM(SMMU_ASID_SECURITY_SECURE_ASIDS_2, SECURE), + MC_REG_BITS_ENUM(SMMU_ASID_SECURITY_SECURE_ASIDS_3, SECURE)); + } else { + /* Legacy firmware accesses the MC directly, though, and so correspondingly we must allow ASIDs to be edited by non-secure world. */ + reg::Write(MC + MC_SMMU_ASID_SECURITY, 0); + } + + reg::Write(MC + MC_SMMU_ASID_SECURITY_1, 0); + reg::Write(MC + MC_SMMU_ASID_SECURITY_2, 0); + reg::Write(MC + MC_SMMU_ASID_SECURITY_3, 0); + reg::Write(MC + MC_SMMU_ASID_SECURITY_4, 0); + reg::Write(MC + MC_SMMU_ASID_SECURITY_5, 0); + reg::Write(MC + MC_SMMU_ASID_SECURITY_6, 0); + reg::Write(MC + MC_SMMU_ASID_SECURITY_7, 0); + + /* Initialize the PTB registers to zero .*/ + reg::Write(MC + MC_SMMU_PTB_ASID, 0); + reg::Write(MC + MC_SMMU_PTB_DATA, 0); + + /* Configure the TLB and PTC, then read TLB_CONFIG to ensure configuration takes. */ + reg::Write(MC + MC_SMMU_TLB_CONFIG, MC_REG_BITS_ENUM (SMMU_TLB_CONFIG_TLB_HIT_UNDER_MISS, ENABLE), + MC_REG_BITS_ENUM (SMMU_TLB_CONFIG_TLB_ROUND_ROBIN_ARBITRATION, ENABLE), + MC_REG_BITS_VALUE(SMMU_TLB_CONFIG_TLB_ACTIVE_LINES, 0x30)); + + reg::Write(MC + MC_SMMU_PTC_CONFIG, MC_REG_BITS_ENUM (SMMU_PTC_CONFIG_PTC_CACHE_ENABLE, ENABLE), + MC_REG_BITS_VALUE(SMMU_PTC_CONFIG_PTC_REQ_LIMIT, 8), + MC_REG_BITS_VALUE(SMMU_PTC_CONFIG_PTC_INDEX_MAP, 0x3F)); + + reg::Read (MC + MC_SMMU_TLB_CONFIG); + + /* Flush the entire page table cache, and read TLB_CONFIG to ensure the flush takes. */ + reg::Write(MC + MC_SMMU_PTC_FLUSH_0, 0); + reg::Read (MC + MC_SMMU_TLB_CONFIG); + + /* Flush the entire translation lookaside buffer, and read TLB_CONFIG to ensure the flush takes. */ + reg::Write(MC + MC_SMMU_TLB_FLUSH, 0); + reg::Read (MC + MC_SMMU_TLB_CONFIG); + + /* Enable the SMMU, and read TLB_CONFIG to ensure the enable takes. */ + reg::Write(MC + MC_SMMU_CONFIG, MC_REG_BITS_ENUM (SMMU_CONFIG_SMMU_ENABLE, ENABLE)); + reg::Read (MC + MC_SMMU_TLB_CONFIG); + } + + void SetupSecureEl2AndEl1SystemRegisters() { + /* Setup actlr_el2 and actlr_el3. */ + { + util::BitPack32 actlr = {}; + + actlr.Set(1); /* Enable access to cpuactlr from lower EL. */ + actlr.Set(1); /* Enable access to cpuectlr from lower EL. */ + actlr.Set(1); /* Enable access to l2ctlr from lower EL. */ + actlr.Set(1); /* Enable access to l2actlr from lower EL. */ + actlr.Set(1); /* Enable access to l2ectlr from lower EL. */ + + HW_CPU_SET_ACTLR_EL3(actlr); + HW_CPU_SET_ACTLR_EL2(actlr); + } + + /* Setup hcr_el2. */ + { + util::BitPack64 hcr = {}; + + hcr.Set(1); /* EL1 is aarch64 mode. */ + + HW_CPU_SET_HCR_EL2(hcr); + } + + /* Configure all domain access permissions as manager. */ + HW_CPU_SET_DACR32_EL2(~0u); + + /* Setup sctlr_el1. */ + { + util::BitPack64 sctlr = { hw::SctlrEl1::Res1 }; + + sctlr.Set(0); /* Globally disable the MMU. */ + sctlr.Set(0); /* Disable alignment fault checking. */ + sctlr.Set(0); /* Globally disable the data and unified caches. */ + sctlr.Set(1); /* Enable stack alignment checking. */ + sctlr.Set(1); /* Enable el0 stack alignment checking. */ + sctlr.Set(1); /* Enable cp15 barrier operations. */ + sctlr.Set(0); /* Disable ThumbEE. */ + sctlr.Set(0); /* Enable itd instructions. */ + sctlr.Set(0); /* Enable setend instruction. */ + sctlr.Set(0); /* Disable el0 interrupt mask access. */ + sctlr.Set(0); /* Globally disable the instruction cache. */ + sctlr.Set(0); /* Disable el0 access to dc zva instruction. */ + sctlr.Set(1); /* wfi instructions in el0 trap. */ + sctlr.Set(1); /* wfe instructions in el0 trap. */ + sctlr.Set(0); /* Do not force writable pages to be ExecuteNever. */ + sctlr.Set(0); /* Data accesses in el0 are little endian. */ + sctlr.Set(0); /* Exceptions should be little endian. */ + sctlr.Set(0); /* Disable el0 access to dc cvau, dc civac, dc cvac, ic ivau. */ + + HW_CPU_SET_SCTLR_EL1(sctlr); + } + + /* Setup sctlr_el2. */ + { + util::BitPack64 sctlr = { hw::SctlrEl2::Res1 }; + + sctlr.Set(0); /* Globally disable the MMU. */ + sctlr.Set(0); /* Disable alignment fault checking. */ + sctlr.Set(0); /* Globally disable the data and unified caches. */ + sctlr.Set(1); /* Enable stack alignment checking. */ + sctlr.Set(0); /* Globally disable the instruction cache. */ + sctlr.Set(0); /* Do not force writable pages to be ExecuteNever. */ + sctlr.Set(0); /* Exceptions should be little endian. */ + + HW_CPU_SET_SCTLR_EL2(sctlr); + } + + /* Ensure instruction consistency. */ + hw::InstructionSynchronizationBarrier(); + } + + void SetupNonSecureSystemRegisters(u32 tsc_frequency) { + /* Set cntfrq_el0. */ + HW_CPU_SET_CNTFRQ_EL0(tsc_frequency); + + /* Set cnthctl_el2. */ + { + util::BitPack32 cnthctl = {}; + + cnthctl.Set(1); /* Do not trap accesses to cntpct_el0. */ + cnthctl.Set(1); /* Do not trap accesses to cntp_ctl_el0, cntp_cval_el0, and cntp_tval_el0. */ + cnthctl.Set(0); /* Disable the event stream. */ + cnthctl.Set(0); /* Trigger events on 0 -> 1 transition. */ + cnthctl.Set(0); /* Select bit0 of cntpct_el0 as the event stream trigger. */ + + HW_CPU_SET_CNTHCTL_EL2(cnthctl); + } + + /* Ensure instruction consistency. */ + hw::InstructionSynchronizationBarrier(); + } + + void SetupGpuCarveout() { + /* Configure carveout 2. */ + reg::Write(MC + MC_SECURITY_CARVEOUT2_BOM, static_cast(MemoryRegionDramGpuCarveout.GetAddress() >> 0)); + reg::Write(MC + MC_SECURITY_CARVEOUT2_BOM_HI, static_cast(MemoryRegionDramGpuCarveout.GetAddress() >> BITSIZEOF(u32))); + reg::Write(MC + MC_SECURITY_CARVEOUT2_SIZE_128KB, MemoryRegionDramGpuCarveout.GetSize() / 128_KB); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_ACCESS2, MC_REG_BITS_ENUM (CLIENT_ACCESS2_GPUSRD, ENABLE), + MC_REG_BITS_ENUM (CLIENT_ACCESS2_GPUSWR, ENABLE), + MC_REG_BITS_ENUM (CLIENT_ACCESS2_TSECSRD, ENABLE)); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_ACCESS4, MC_REG_BITS_ENUM (CLIENT_ACCESS4_GPUSRD2, ENABLE), + MC_REG_BITS_ENUM (CLIENT_ACCESS4_GPUSWR2, ENABLE)); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS0, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS1, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS2, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS3, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS4, 0); + reg::Write(MC + MC_SECURITY_CARVEOUT2_CFG0, MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_IS_WPR, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_FORCE_APERTURE_ID_MATCH, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ALLOW_APERTURE_ID_MISMATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_RD_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_WR_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_SEND_CFG_TO_GPU, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_VALUE(SECURITY_CARVEOUT_CFG0_APERTURE_ID, 2), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL3, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL2, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL0, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL3, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL2, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL1, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ADDRESS_TYPE, UNTRANSLATED_ONLY), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_LOCK_MODE, LOCKED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_PROTECT_MODE, LOCKBIT_SECURE)); + } + + void DisableArc() { + /* Configure IRAM top/bottom to point to memory ends (disabling redirection). */ + reg::Write(MC + MC_IRAM_BOM, MC_REG_BITS_VALUE(IRAM_BOM_IRAM_BOM, (~0u))); + reg::Write(MC + MC_IRAM_TOM, MC_REG_BITS_VALUE(IRAM_TOM_IRAM_TOM, ( 0u))); + + /* Lock the IRAM aperture. */ + reg::ReadWrite(MC + MC_IRAM_REG_CTRL, MC_REG_BITS_ENUM(IRAM_REG_CTRL_IRAM_CFG_WRITE_ACCESS, DISABLED)); + + /* Disable the ARC clock gate override. */ + reg::ReadWrite(CLK_RST + CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD, CLK_RST_REG_BITS_ENUM(LVL2_CLK_GATE_OVRD_ARC_CLK_OVR_ON, OFF)); + + /* Read IRAM REG CTRL to make sure our writes take. */ + reg::Read(MC + MC_IRAM_REG_CTRL); + } + + void DisableUntranslatedDeviceMemoryAccess() { + /* If we can (mariko only), disable GMMU accesses that bypass the SMMU. */ + /* Additionally, force all untranslated acccesses to hit one of the carveouts. */ + if (GetSocType() == fuse::SocType_Mariko) { + reg::Write(MC + MC_UNTRANSLATED_REGION_CHECK, MC_REG_BITS_ENUM(UNTRANSLATED_REGION_CHECK_UNTRANSLATED_REGION_CHECK_ACCESS, DISABLED), + MC_REG_BITS_ENUM(UNTRANSLATED_REGION_CHECK_REQUIRE_UNTRANSLATED_CLIENTS_HIT_CARVEOUT, ENABLED), + MC_REG_BITS_ENUM(UNTRANSLATED_REGION_CHECK_REQUIRE_UNTRANSLATED_GPU_HIT_CARVEOUT, ENABLED)); + } + } + + void FinalizeCarveoutSecureScratchRegisters() { + /* Define carveout scratch values. */ + constexpr uintptr_t WarmbootCarveoutAddress = MemoryRegionDram.GetAddress(); + constexpr size_t WarmbootCarveoutSize = 128_KB; + + #define MC_ENABLE_CLIENT_ACCESS(INDEX, WHICH) MC_REG_BITS_ENUM(CLIENT_ACCESS##INDEX##_##WHICH, ENABLE) + + constexpr u32 WarmbootCarveoutClientAccess0 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(0, AVPCARM7R), + MC_ENABLE_CLIENT_ACCESS(0, PPCSAHBSLVR)); + + constexpr u32 WarmbootCarveoutClientAccess1 = reg::Encode(MC_ENABLE_CLIENT_ACCESS(1, AVPCARM7W)); + + #undef MC_ENABLE_CLIENT_ACCESS + + constexpr u32 WarmbootCarveoutForceInternalAccess0 = reg::Encode(MC_REG_BITS_ENUM(CLIENT_ACCESS0_AVPCARM7R, ENABLE), + MC_REG_BITS_ENUM(CLIENT_ACCESS0_PPCSAHBSLVR, ENABLE)); + + constexpr u32 WarmbootCarveoutForceInternalAccess1 = reg::Encode(MC_REG_BITS_ENUM(CLIENT_ACCESS1_AVPCARM7W, ENABLE)); + + constexpr u32 WarmbootCarveoutConfig = reg::Encode(MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_IS_WPR, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_FORCE_APERTURE_ID_MATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ALLOW_APERTURE_ID_MISMATCH, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_RD_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_TZ_GLOBAL_WR_EN, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_SEND_CFG_TO_GPU, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_WRITE_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL3, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL2, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL1, ENABLE_CHECKS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_DISABLE_READ_CHECK_ACCESS_LEVEL0, ENABLE_CHECKS), + MC_REG_BITS_VALUE(SECURITY_CARVEOUT_CFG0_APERTURE_ID, 0), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL3, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_WRITE_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL3, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL2, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL1, DISABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_READ_ACCESS_LEVEL0, ENABLED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_ADDRESS_TYPE, ANY_ADDRESS), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_LOCK_MODE, UNLOCKED), + MC_REG_BITS_ENUM (SECURITY_CARVEOUT_CFG0_PROTECT_MODE, LOCKBIT_SECURE)); + + /* Save the carveout values into secure scratch. */ + + /* Save MC_SECURITY_CARVEOUT4_BOM. */ + reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH51, REG_BITS_VALUE( 0, 15, WarmbootCarveoutAddress >> 17)); + + /* Save MC_SECURITY_CARVEOUT4_BOM_HI. */ + reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH16, REG_BITS_VALUE(30, 2, WarmbootCarveoutAddress >> 32)); + + /* Save MC_SECURITY_CARVEOUT4_SIZE_128KB. */ + reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH55, REG_BITS_VALUE(12, 12, WarmbootCarveoutSize / 128_KB)); + + /* Save MC_SECURITY_CARVEOUT4_CLIENT_ACCESS. */ + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH74, WarmbootCarveoutClientAccess0); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH75, WarmbootCarveoutClientAccess1); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH76, 0); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH77, 0); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH78, 0); + + /* Save MC_SECURITY_CARVEOUT4_FORCE_INTERNAL_ACCESS. */ + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH99, WarmbootCarveoutForceInternalAccess0); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH100, WarmbootCarveoutForceInternalAccess1); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH101, 0); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH102, 0); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH103, 0); + + /* Save MC_SECURITY_CARVEOUT4_CFG0. */ + reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH39, REG_BITS_VALUE(0, 27, WarmbootCarveoutConfig)); + } + + void EnableBpmpSmmu() { + /* Define the ASID contents. */ + constexpr int BpmpAsid = 1; + constexpr uintptr_t BpmpAsidPde = MemoryRegionPhysicalDeviceSecurityEngine.GetAddress(); + + /* Configure the ASID. */ + reg::Write(MC + MC_SMMU_PTB_ASID, MC_REG_BITS_VALUE(SMMU_PTB_ASID_CURRENT_ASID, BpmpAsid)); + + reg::Write(MC + MC_SMMU_PTB_DATA, MC_REG_BITS_VALUE(SMMU_PTB_DATA_ASID_PDE_BASE, BpmpAsidPde / 4_KB), + MC_REG_BITS_ENUM (SMMU_PTB_DATA_ASID_NONSECURE, DISABLE), + MC_REG_BITS_ENUM (SMMU_PTB_DATA_ASID_WRITABLE, DISABLE), + MC_REG_BITS_ENUM (SMMU_PTB_DATA_ASID_READABLE, DISABLE)); + + /* Configure the BPMP and PPCS1 to use the asid. */ + reg::Write(MC + MC_SMMU_AVPC_ASID, MC_REG_BITS_ENUM(SMMU_AVPC_ASID_AVPC_SMMU_ENABLE, ENABLE), MC_REG_BITS_VALUE(SMMU_AVPC_ASID_AVPC_ASID, BpmpAsid)); + reg::Write(MC + MC_SMMU_PPCS1_ASID, MC_REG_BITS_ENUM(SMMU_PPCS1_ASID_PPCS1_SMMU_ENABLE, ENABLE), MC_REG_BITS_VALUE(SMMU_PPCS1_ASID_PPCS1_ASID, BpmpAsid)); + + /* Flush the entire page table cache, and read TLB_CONFIG to ensure the flush takes. */ + reg::Write(MC + MC_SMMU_PTC_FLUSH_0, 0); + reg::Read (MC + MC_SMMU_TLB_CONFIG); + + /* Flush the entire translation lookaside buffer, and read TLB_CONFIG to ensure the flush takes. */ + reg::Write(MC + MC_SMMU_TLB_FLUSH, 0); + reg::Read (MC + MC_SMMU_TLB_CONFIG); + } + + void ValidateResetExpected() { + /* We're coming out of reset, so check that we expected to come out of reset. */ + if (!IsResetExpected()) { + secmon::SetError(pkg1::ErrorInfo_UnexpectedReset); + AMS_ABORT("unexpected reset"); + } + SetResetExpected(false); + } + + void ActmonInterruptHandler() { + SetError(pkg1::ErrorInfo_ActivityMonitorInterrupt); + AMS_ABORT("actmon observed bpmp wakeup"); + } + + void ExitChargerHiZMode() { + /* Setup I2c-1. */ + pinmux::SetupI2c1(); + clkrst::EnableI2c1Clock(); + + /* Initialize I2c-1. */ + i2c::Initialize(i2c::Port_1); + + /* Exit Hi-Z mode. */ + charger::ExitHiZMode(); + + /* Disable clock to I2c-1. */ + clkrst::DisableI2c1Clock(); + } + + bool IsExitLp0() { + return reg::Read(MC + MC_SECURITY_CFG3) == 0; + } + + void SetupLogForBoot() { + log::Initialize(secmon::GetLogPort(), secmon::GetLogBaudRate(), secmon::GetLogFlags()); + log::SendText("OHAYO\n", 6); + log::Flush(); + } + + void LogExitLp0() { + /* NOTE: Nintendo only does this on dev, but we will always do it. */ + if (true /* !pkg1::IsProduction() */) { + SetupLogForBoot(); + } + } + + void SetupForLp0Exit() { + /* Exit HiZ mode in charger, if we need to. */ + const auto target_fw = GetTargetFirmware(); + const bool force_exit_hiz_mode = (target_fw < TargetFirmware_4_0_0) || (target_fw < TargetFirmware_8_0_0 && fuse::GetHardwareType() == fuse::HardwareType_Icosa); + if (force_exit_hiz_mode || smc::IsChargerHiZModeEnabled()) { + ExitChargerHiZMode(); + } + + /* Refill the random cache, which is volatile and thus wiped on warmboot. */ + smc::FillRandomCache(); + + /* Unlock the security engine. */ + secmon::smc::UnlockSecurityEngine(); + } + + } + + void Setup1() { + /* Load the global configuration context. */ + InitializeConfigurationContext(); + + /* Initialize uart for logging. */ + SetupLogForBoot(); + + /* Initialize the security engine. */ + se::Initialize(); + + /* Initialize the gic. */ + gic::InitializeCommon(); + } + + void Setup1ForWarmboot() { + /* Initialize the security engine. */ + se::Initialize(); + + /* Initialize the gic. */ + gic::InitializeCommon(); + } + + void SaveSecurityEngineAesKeySlotTestVector() { + GenerateSecurityEngineAesKeySlotTestVector(g_se_aes_key_slot_test_vector, sizeof(g_se_aes_key_slot_test_vector)); + } + + void SetupSocSecurity() { + /* Set the fuse visibility. */ + clkrst::SetFuseVisibility(true); + + /* Set fuses as only secure-writable. */ + fuse::SetWriteSecureOnly(); + + /* Lockout the fuses. */ + fuse::Lockout(); + + /* Set the security engine to secure mode. */ + se::SetSecure(true); + + /* Verify the security engine's sticky bits. */ + VerifySecurityEngineStickyBits(); + + /* Verify the security engine's Aes slots contain correct contents. */ + VerifySecurityEngineAesKeySlotTestVector(); + + /* Clear aes keyslots. */ + ClearAesKeySlots(); + + /* Clear rsa keyslots. */ + ClearRsaKeySlots(); + + /* Overwrite keys that we want to be random with random contents. */ + se::InitializeRandom(); + se::ConfigureAutomaticContextSave(); + se::SetRandomKey(pkg1::AesKeySlot_Temporary); + se::GenerateSrk(); + se::SetRandomKey(pkg1::AesKeySlot_TzramSaveKek); + + /* Initialize pmc secure scratch. */ + if (GetSocType() == fuse::SocType_Erista) { + pmc::InitializeRandomScratch(); + } + pmc::LockSecureRegister(pmc::SecureRegister_Srk); + + /* Setup secure registers. */ + SetupSecureRegisters(); + + /* Setup the smmu. */ + SetupSmmu(); + + /* Clear the cpu reset vector. */ + reg::Write(EVP + EVP_CPU_RESET_VECTOR, 0); + + /* Configure the SB registers to our start address. */ + constexpr u32 ResetVectorLow = static_cast((PhysicalTzramProgramResetVector >> 0)); + constexpr u32 ResetVectorHigh = static_cast((PhysicalTzramProgramResetVector >> BITSIZEOF(u32))); + + /* Write our reset vector to the secure boot registers. */ + reg::Write(secmon::MemoryRegionVirtualDeviceSystem.GetAddress() + SB_AA64_RESET_LOW, ResetVectorLow | 1); + reg::Write(secmon::MemoryRegionVirtualDeviceSystem.GetAddress() + SB_AA64_RESET_HIGH, ResetVectorHigh); + + /* Disable non-secure writes to the reset vector. */ + reg::Write(secmon::MemoryRegionVirtualDeviceSystem.GetAddress() + SB_CSR, SB_REG_BITS_ENUM(CSR_NS_RST_VEC_WR_DIS, DISABLE)); + + /* Read back SB_CSR to make sure our non-secure write disable takes. */ + reg::Read(secmon::MemoryRegionVirtualDeviceSystem.GetAddress() + SB_CSR); + + /* Write our reset vector to scratch registers used by warmboot, and lock those scratch registers. */ + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH34, ResetVectorLow); + reg::Write(PMC + APBDEV_PMC_SECURE_SCRATCH35, ResetVectorHigh); + pmc::LockSecureRegister(pmc::SecureRegister_ResetVector); + + /* Setup the security engine interrupt. */ + constexpr int SecurityEngineInterruptId = 90; + constexpr u8 SecurityEngineInterruptCoreMask = (1 << 3); + gic::SetPriority (SecurityEngineInterruptId, gic::HighestPriority); + gic::SetInterruptGroup(SecurityEngineInterruptId, 0); + gic::SetEnable (SecurityEngineInterruptId, true); + gic::SetSpiTargetCpu (SecurityEngineInterruptId, SecurityEngineInterruptCoreMask); + gic::SetSpiMode (SecurityEngineInterruptId, gic::InterruptMode_Level); + + /* Setup the activity monitor interrupt. */ + constexpr int ActivityMonitorInterruptId = 77; + constexpr u8 ActivityMonitorInterruptCoreMask = (1 << 3); + gic::SetPriority (ActivityMonitorInterruptId, gic::HighestPriority); + gic::SetInterruptGroup(ActivityMonitorInterruptId, 0); + gic::SetEnable (ActivityMonitorInterruptId, true); + gic::SetSpiTargetCpu (ActivityMonitorInterruptId, ActivityMonitorInterruptCoreMask); + gic::SetSpiMode (ActivityMonitorInterruptId, gic::InterruptMode_Level); + + /* Setup the mariko fatal error interrupt. */ + constexpr u8 MarikoFatalInterruptCoreMask = 0b1111; + gic::SetPriority (MarikoFatalErrorInterruptId, gic::HighestPriority); + gic::SetInterruptGroup(MarikoFatalErrorInterruptId, 0); + gic::SetEnable (MarikoFatalErrorInterruptId, true); + gic::SetSpiTargetCpu (MarikoFatalErrorInterruptId, 0); + gic::SetSpiMode (MarikoFatalErrorInterruptId, gic::InterruptMode_Level); + + /* If we're coldboot, perform one-time setup. */ + if (g_is_cold_boot) { + /* Register all interrupt handlers. */ + SetInterruptHandler(SecurityEngineInterruptId, SecurityEngineInterruptCoreMask, se::HandleInterrupt); + SetInterruptHandler(ActivityMonitorInterruptId, ActivityMonitorInterruptCoreMask, actmon::HandleInterrupt); + SetInterruptHandler(MarikoFatalErrorInterruptId, MarikoFatalInterruptCoreMask, secmon::HandleMarikoFatalErrorInterrupt); + + /* We're expecting the other cores to come out of reset. */ + for (int i = 1; i < NumCores; ++i) { + SetResetExpected(i, true); + } + + /* We only coldboot once. */ + g_is_cold_boot = false; + } + } + + void SetupSocSecurityWarmboot() { + /* Check that we're allowed to continue. */ + ValidateResetExpected(); + + /* Unmap the tzram identity mapping. */ + UnmapTzram(); + + /* If we're exiting LP0, there's a little more work for us to do. */ + if (IsExitLp0()) { + /* Log that we're exiting LP0. */ + LogExitLp0(); + + /* Perform initial setup. */ + Setup1ForWarmboot(); + + /* Generate a random srk. */ + se::GenerateSrk(); + + /* Setup the Soc security. */ + SetupSocSecurity(); + + /* Set the PMC and MC as secure-only. */ + SetupPmcAndMcSecure(); + + /* Perform Lp0-exit specific init. */ + SetupForLp0Exit(); + + /* Setup the Soc protections. */ + SetupSocProtections(); + } + + /* Perform remaining CPU initialization. */ + SetupCpuCoreContext(); + SetupCpuSErrorDebug(); + } + + void SetupSocProtections() { + /* Setup the GPU carveout. */ + // SetupGpuCarveout(); + + /* Configure the two kernel carveouts. */ + SetupKernelCarveouts(); + + /* Disable the ARC. */ + DisableArc(); + + /* Disable untranslated memory accesses by devices. */ + DisableUntranslatedDeviceMemoryAccess(); + + /* Further protections aren't applied on <= 1.0.0. */ + if (GetTargetFirmware() <= TargetFirmware_1_0_0) { + return; + } + + /* Finalize and lock the carveout scratch registers. */ + FinalizeCarveoutSecureScratchRegisters(); + pmc::LockSecureRegister(pmc::SecureRegister_Carveout); + + /* Clear all the BPMP exception vectors to a fixed value. */ + constexpr u32 BpmpExceptionVector = 0x7D000000; + reg::Write(EVP + EVP_COP_RESET_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_UNDEF_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_SWI_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_PREFETCH_ABORT_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_DATA_ABORT_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_RSVD_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_IRQ_VECTOR, BpmpExceptionVector); + reg::Write(EVP + EVP_COP_FIQ_VECTOR, BpmpExceptionVector); + + /* Disable arbitration for the bpmp. */ + // reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); + + /* Turn on the SMMU for the BPMP. */ + // EnableBpmpSmmu(); + + /* Wait until the flow controller reports that the BPMP is halted. */ + while (!reg::HasValue(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP))) { + util::WaitMicroSeconds(1); + } + + /* Enable clock to the activity monitor. */ + clkrst::EnableActmonClock(); + + /* If JTAG is disabled, disable JTAG. */ + if (!secmon::IsJtagEnabled()) { + reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), + FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_JTAG, DISABLED)); + + /* Turn on the activity monitor to prevent booting up the bpmp. */ + actmon::StartMonitoringBpmp(ActmonInterruptHandler); + } + } + + void SetupPmcAndMcSecure() { + const auto target_fw = GetTargetFirmware(); + + // if (target_fw >= TargetFirmware_2_0_0) { + // /* Set the PMC secure. */ + // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); + // } + + if (target_fw >= TargetFirmware_4_0_0) { + /* Set the MC secure. */ + reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, MC1, ENABLE), + SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); + } + } + + void SetupCpuCoreContext() { + /* Get the tsc frequency. */ + const u32 tsc_frequency = reg::Read(MemoryRegionVirtualDeviceSysCtr0.GetAddress() + SYSCTR0_CNTFID0); + + /* Setup the secure EL2/EL1 system registers. */ + SetupSecureEl2AndEl1SystemRegisters(); + + /* Setup the non-secure system registers. */ + SetupNonSecureSystemRegisters(tsc_frequency); + + /* Reset the cpu flow controller registers. */ + flow::ResetCpuRegisters(hw::GetCurrentCoreId()); + + /* Initialize the core unique gic registers. */ + gic::InitializeCoreUnique(); + + /* Configure cpu fiq. */ + constexpr int FiqInterruptId = 28; + gic::SetPriority (FiqInterruptId, gic::HighestPriority); + gic::SetInterruptGroup(FiqInterruptId, 0); + gic::SetEnable (FiqInterruptId, true); + + /* Restore the cpu's debug registers. */ + RestoreDebugRegisters(); + } + + void SetupCpuSErrorDebug() { + /* Get whether we should enable SError debug. */ + const auto &bc_data = secmon::GetBootConfig().data; + const bool enabled = bc_data.IsDevelopmentFunctionEnabled() && bc_data.IsSErrorDebugEnabled(); + + /* Get and set scr_el3. */ + { + util::BitPack32 scr; + HW_CPU_GET_SCR_EL3(scr); + + scr.Set(enabled ? 0 : 1); + HW_CPU_SET_SCR_EL3(scr); + } + + /* Prevent reordering instructions around this call. */ + hw::InstructionSynchronizationBarrier(); + } + + void SetKernelCarveoutRegion(int index, uintptr_t address, size_t size) { + /* Configure the carveout. */ + auto &carveout = g_kernel_carveouts[index]; + carveout.address = address; + carveout.size = size; + + SetupKernelCarveouts(); + } + +} \ No newline at end of file diff --git a/build.sh b/build.sh index edceb3b6..29b842fa 100755 --- a/build.sh +++ b/build.sh @@ -108,8 +108,10 @@ if [ "$NO_EXO" -eq 0 ]; then echo "*** Patching exosphere ***" EXO_SRC="Source/Atmosphere-Patches" EXO_DEST="build/atmosphere/exosphere/program/source/smc" + EXO_PROGRAM_DEST="build/atmosphere/exosphere/program/source" LIBEXO_DEST="build/atmosphere/libraries/libexosphere/include/exosphere/secmon" + cp -v "$EXO_SRC/secmon_setup.cpp" "$EXO_PROGRAM_DEST/" cp -v "$EXO_SRC/secmon_define_emc_access_table.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_emc_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_define_rtc_pmc_access_table.inc" "$EXO_DEST/" From 04f2b9c6cc310eb922bf01c994489c9a4fa052d3 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:55:20 +0200 Subject: [PATCH 088/205] properly add bpmpfw to .gitignore --- .gitignore | 3 +-- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 4568 -> 0 bytes 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 Source/hoc-clk/bpmpfw/out/bpmpfw.bin diff --git a/.gitignore b/.gitignore index 24f4283c..8514104a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,4 @@ build Source/hekate dist/* !dist/.gitignore -Source/hoc-clk/sysmodule/data/bpmpfw.bin -Source/hoc-clk/bpmpfw/out/bpmpfw.bin +bpmpfw.bin diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin deleted file mode 100644 index cf996ae1c5f7f84edd3eefaf94286bafe89673c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4568 zcmcgvYit}>6+W{wcGm7RJ6V~)X(b9v z6_E(3Vt2=>Nr@ZBj!7R$capXOg-Qe=1S&0T5*`H{?T`McrSaaGbM86cdERq>sngsH9&=S$kv*w2I~^|G(0^VKb!wI$rO1z#j{DIS z1wTrB!;h|VWuy&bE&b?(?oHFE<0;XA8Je67R zsg9WTRHdwz#~f7pEI+2T5VdN+%#&El31BQJw^Dj%4SHgFW9VA%&}Jdq zwI@`SHb=Vcud3R9_qt3eN{G$UunOwm)oSN6(7gk=2|V!evxGSApb6#kURhEHD`i#9 zR3esBX!3(MSNf5GxE$?dzxdH@I?WfrOTCjSVWuO*qO%<`v_HbP*@C>sDyu}+502S> zV4U;R^wpkv_4l5tEaTW>-x|coY>$?3e(@fyAP2CAR{6n`!Vk>BlIr+FNl|ABzIgsz z>^C=M@1+FMI?9uq>e)+gXhevGOQum+yruvAfEcgYM0v=Vxhec1j7e)$ z6|_2kH)M1%f2sifbX4rxCKItdA~)R)TB4~v($_R(rlamY;G$7gO57zWTaqRCh-EWh zH~1{be_&-P?WR#P$QiQlN@wg*8C8?u zG3+BXx;gF#Wu}8SdCU(U1+DjCKX_zWR_dVjh*5Qx^BI1c0^g&9MaeWO_`!4du9F}1 z7Dj9IF_r_27p6W39yt6obfIYOyfJmE;K zuAFr#dXs2~dtf{IUmkslT={+1hvXgH|2i48*(1@`IH0 zgLdwT*rSP&@E_Ic@qAp@ntONHOe3=K&b^Psa9FkUw3aDaS_dBV;YJ@|dJ?s5SYt}J ztT1VzUac{UW7K2~rJLY0=%3RnuPd!`dR9jrY4*C%04AbM5%<63%vjivr{kMR^q3Bu zhO;izE5Ams+ZP)0h%zglG-Pqsq~QR4vQu|J6JDr`5vkjWkmb!IX223AY)@*H7ia4_ zHwFKFm!1^$pEqQ`>OnlXH)U*Ku#UiAlZx~30oZ5)7xd0r_-&jE0`{_xxko2}aXI!j z+2cV*o>6UVQ^gNj#r0u^#=?{|!xs8d)OQN;kPjD{{)nhq#w!Tn zO;m+m>N|BJ(1ff01zmZ_%fz;^U99Ue?7a+f?tM3nO`^5E9R6O7t20lN~Dz5rxwfYd}u=N8uS0cEd_?P|zmn_1`OkaIcg{v_ycpeD~uPfzpNWj4+( z7Z_1HiJTww!G74>hT1`>>$PR(##A52J?BT_r)7nto@<6&LwxTN|8&DYT5eC+s7cKk z39rJw6{x|#Atr32CeErAh#S*JLEDNvLfwTne6$#X|D`E3o`njp6i{$ISMe%9A& z68$*h+JX+2$#uedz8S|1b@wdg_Q>DDhbDLp@yfm!YaCVJ9m@y@`31NXNei|c~1FN1%Up)S50(?>zSzoyHN zmRLpP+)2zs=#{t+B$0z0FHKAYJ#=20~{->9>~%v6Ot;=giov;mAd#{ z^zl`m)GHfhqJUW2n(epmj!{N20mv~xo@-*|m1@qD-VD{}ZQDDm)p zkROL9HuMVg7acQ9C(Fc{rIRJwiDdiD=>I$qk=uVBnC5wI;rYg-dN1XByzb&Wfi2DA zMM)0#Qhzm{uXY~uhvl#O4AEeMFvr1XTpxpw!)FzZ<6Oaa&@m(5DDCl$;T3DKPkuG* zxYi3gaGzOood??x0WG~t}F(6?l;oHor>s=2u8G;ZvB4f ztt{2r&IjLJGf$NK?snL$b8|pr3$en}Fc^;|FoID@Ezra3kBhL|c z^h2D*cyG*#%Pr(YG8frNKWkY-U7Crt;b)UrTR2zkgr7CAPTKo%F23{{>P51ALr)|$ z{89XO`#oRZ-XF(*(B8ar+x!q43c3wJK8TUfZ3 XMfF^$e!C%b%@8@Uc-o3}6@UK+S+fmf From 8514d3c95b1b3f973fe70aba166b6651b14ced88 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:56:08 +0200 Subject: [PATCH 089/205] add proper quse timing --- .../pcv/erista/calculate_timings_erista.cpp | 20 ++++++++++++++++--- .../pcv/mariko/calculate_timings_mariko.cpp | 17 +++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 04ec6830..7562a721 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -122,11 +122,25 @@ namespace ams::ldr::hoc::pcv::erista { tR2P = CEIL((RL * 0.426) - 2.0); tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; - rdv = RL + 19 + CEIL((flyByTime + tDQSCK_max) / tCK_avg); - qpop = rdv - 16; + u32 fullRoundDelay = CEIL((flyByTime + tDQSCK_max) / tCK_avg); + rdv = RL + fullRoundDelay + 19; + qpop = rdv - 16; + + constexpr double TrimmerStepPs = 3.0; + constexpr double MaxTrimmerSteps = 96.0; + + double tCkAvgPs = tCK_avg * 1000.0; + double tckDerated = tCkAvgPs * 0.85; + u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); + double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; + u32 fullTripDerating = fullRoundDelay - CEIL((flyByTime + tDQSCK_max - deratedNsDelay) / tCK_avg); + u32 readEyeStart = FLOOR((flyByTime + 0.94) / tCK_avg) + RL; + + /* Data valid window, quse aligns with the start of the read eye (probably). */ + /* DQS needs to be logically and'ed with quse in order to be valid. */ + quse = readEyeStart + fullTripDerating - 2; quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); - quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; einput = quse - CEIL(9.928 / tCK_avg); u32 qrst_duration = FLOOR(8.399 - tCK_avg); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index ef09d423..abdac84d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -164,12 +164,27 @@ namespace ams::ldr::hoc::pcv::mariko { tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); + u32 fullRoundDelay = CEIL((flyByTime + tDQSCK_max) / tCK_avg); /* Read data valid: Read command -> data ready to be latched into the registers. */ - rdv = RL + 16 + CEIL((flyByTime + tDQSCK_max) / tCK_avg); + rdv = RL + fullRoundDelay + 16; /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ qpop = rdv - 14; + constexpr double TrimmerStepPs = 3.0; + constexpr double MaxTrimmerSteps = 96.0; + + double tCkAvgPs = tCK_avg * 1000.0; + double tckDerated = tCkAvgPs * 0.85; + u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); + double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; + u32 fullTripDerating = fullRoundDelay - CEIL((flyByTime + tDQSCK_max - deratedNsDelay) / tCK_avg); + u32 readEyeStart = FLOOR((flyByTime + 0.94) / tCK_avg) + RL; + + /* Data valid window, quse aligns with the start of the read eye (probably). */ + /* DQS needs to be logically and'ed with quse in order to be valid. */ + quse = readEyeStart + fullTripDerating - 2; + quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; From 638fe68535ac6ae5d5cf38ebd5f9f3e21d96ade6 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 20:03:41 +0200 Subject: [PATCH 090/205] fix wunused warnings --- Source/Atmosphere-Patches/secmon_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere-Patches/secmon_setup.cpp b/Source/Atmosphere-Patches/secmon_setup.cpp index 4cf37b3a..2103820a 100644 --- a/Source/Atmosphere-Patches/secmon_setup.cpp +++ b/Source/Atmosphere-Patches/secmon_setup.cpp @@ -754,7 +754,7 @@ namespace ams::secmon { hw::InstructionSynchronizationBarrier(); } - void SetupGpuCarveout() { + [[maybe_unused]] void SetupGpuCarveout() { /* Configure carveout 2. */ reg::Write(MC + MC_SECURITY_CARVEOUT2_BOM, static_cast(MemoryRegionDramGpuCarveout.GetAddress() >> 0)); reg::Write(MC + MC_SECURITY_CARVEOUT2_BOM_HI, static_cast(MemoryRegionDramGpuCarveout.GetAddress() >> BITSIZEOF(u32))); @@ -900,7 +900,7 @@ namespace ams::secmon { reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH39, REG_BITS_VALUE(0, 27, WarmbootCarveoutConfig)); } - void EnableBpmpSmmu() { + [[maybe_unused]] void EnableBpmpSmmu() { /* Define the ASID contents. */ constexpr int BpmpAsid = 1; constexpr uintptr_t BpmpAsidPde = MemoryRegionPhysicalDeviceSecurityEngine.GetAddress(); From b16337df8953fe2b0045572186c773ebc6bb99dd Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 20:22:51 +0200 Subject: [PATCH 091/205] add secmon patch diff --- Source/Atmosphere-Patches/diff/README.MD | 1 + .../diff/secmon_memory_layout.diff | 55 +++++++++++++++++++ .../Atmosphere-Patches/diff/secmon_setup.diff | 48 ++++++++++++++++ .../diff/secmon_smc_handler.diff | 2 + .../diff/secmon_smc_power_management.diff | 9 +++ .../diff/secmon_smc_register_access.diff | 19 +++++++ 6 files changed, 134 insertions(+) create mode 100644 Source/Atmosphere-Patches/diff/README.MD create mode 100644 Source/Atmosphere-Patches/diff/secmon_memory_layout.diff create mode 100644 Source/Atmosphere-Patches/diff/secmon_setup.diff create mode 100644 Source/Atmosphere-Patches/diff/secmon_smc_handler.diff create mode 100644 Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff create mode 100644 Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff diff --git a/Source/Atmosphere-Patches/diff/README.MD b/Source/Atmosphere-Patches/diff/README.MD new file mode 100644 index 00000000..e43f3005 --- /dev/null +++ b/Source/Atmosphere-Patches/diff/README.MD @@ -0,0 +1 @@ +This contains a diff all modifications done to exosphere diff --git a/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff b/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff new file mode 100644 index 00000000..4daf88e7 --- /dev/null +++ b/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff @@ -0,0 +1,55 @@ +131,156c131,157 +< #define AMS_SECMON_FOREACH_DEVICE_REGION(HANDLER, ...) \ +< HANDLER(GicDistributor, Empty, UINT64_C(0x50041000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(GicCpuInterface, GicDistributor, UINT64_C(0x50042000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ +< HANDLER(Uart, GicCpuInterface, UINT64_C(0x70006000), UINT64_C(0x1000), false, ## __VA_ARGS__) \ +< HANDLER(ClkRst, Uart, UINT64_C(0x60006000), UINT64_C(0x1000), false, ## __VA_ARGS__) \ +< HANDLER(RtcPmc, ClkRst, UINT64_C(0x7000E000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(Timer, RtcPmc, UINT64_C(0x60005000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(System, Timer, UINT64_C(0x6000C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(SecurityEngine, System, UINT64_C(0x70012000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ +< HANDLER(SecurityEngine2, SecurityEngine, UINT64_C(0x70412000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ +< HANDLER(SysCtr0, SecurityEngine2, UINT64_C(0x700F0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(MemoryController, SysCtr0, UINT64_C(0x70019000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(FuseKFuse, MemoryController, UINT64_C(0x7000F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(ApbMisc, FuseKFuse, UINT64_C(0x70000000), UINT64_C(0x4000), true, ## __VA_ARGS__) \ +< HANDLER(FlowController, ApbMisc, UINT64_C(0x60007000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(BootloaderParams, FlowController, UINT64_C(0x40000000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(I2c5, BootloaderParams, UINT64_C(0x7000D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(Gpio, I2c5, UINT64_C(0x6000D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(I2c1, Gpio, UINT64_C(0x7000C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(ExceptionVectors, I2c1, UINT64_C(0x6000F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(MemoryController0, ExceptionVectors, UINT64_C(0x7001C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(MemoryController1, MemoryController0, UINT64_C(0x7001D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(Sdmmc, MemoryController1, UINT64_C(0x700B0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(Disp1, Sdmmc, UINT64_C(0x54200000), UINT64_C(0x3000), true, ## __VA_ARGS__) \ +< HANDLER(Dsi, Disp1, UINT64_C(0x54300000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +< HANDLER(MipiCal, Dsi, UINT64_C(0x700E3000), UINT64_C(0x1000), true, ## __VA_ARGS__) +--- +> #define AMS_SECMON_FOREACH_DEVICE_REGION(HANDLER, ...) \ +> HANDLER(GicDistributor, Empty, UINT64_C(0x50041000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(GicCpuInterface, GicDistributor, UINT64_C(0x50042000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ +> HANDLER(Uart, GicCpuInterface, UINT64_C(0x70006000), UINT64_C(0x1000), false, ## __VA_ARGS__) \ +> HANDLER(ClkRst, Uart, UINT64_C(0x60006000), UINT64_C(0x1000), false, ## __VA_ARGS__) \ +> HANDLER(RtcPmc, ClkRst, UINT64_C(0x7000E000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(Timer, RtcPmc, UINT64_C(0x60005000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(System, Timer, UINT64_C(0x6000C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(SecurityEngine, System, UINT64_C(0x70012000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ +> HANDLER(SecurityEngine2, SecurityEngine, UINT64_C(0x70412000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ +> HANDLER(SysCtr0, SecurityEngine2, UINT64_C(0x700F0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(MemoryController, SysCtr0, UINT64_C(0x70019000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(ExternalMemoryController, MemoryController, UINT64_C(0x7001b000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(FuseKFuse, ExternalMemoryController, UINT64_C(0x7000F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(ApbMisc, FuseKFuse, UINT64_C(0x70000000), UINT64_C(0x4000), true, ## __VA_ARGS__) \ +> HANDLER(FlowController, ApbMisc, UINT64_C(0x60007000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(BootloaderParams, FlowController, UINT64_C(0x40000000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(I2c5, BootloaderParams, UINT64_C(0x7000D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(Gpio, I2c5, UINT64_C(0x6000D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(I2c1, Gpio, UINT64_C(0x7000C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(ExceptionVectors, I2c1, UINT64_C(0x6000F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(MemoryController0, ExceptionVectors, UINT64_C(0x7001C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(MemoryController1, MemoryController0, UINT64_C(0x7001D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(Sdmmc, MemoryController1, UINT64_C(0x700B0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(Disp1, Sdmmc, UINT64_C(0x54200000), UINT64_C(0x3000), true, ## __VA_ARGS__) \ +> HANDLER(Dsi, Disp1, UINT64_C(0x54300000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(MipiCal, Dsi, UINT64_C(0x700E3000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ diff --git a/Source/Atmosphere-Patches/diff/secmon_setup.diff b/Source/Atmosphere-Patches/diff/secmon_setup.diff new file mode 100644 index 00000000..3b56edd9 --- /dev/null +++ b/Source/Atmosphere-Patches/diff/secmon_setup.diff @@ -0,0 +1,48 @@ +467,474c467,474 +< reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), +< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); +--- +> // reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), +> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); +757c757 +< void SetupGpuCarveout() { +--- +> [[maybe_unused]] void SetupGpuCarveout() { +903c903 +< void EnableBpmpSmmu() { +--- +> [[maybe_unused]] void EnableBpmpSmmu() { +1165c1165 +< SetupGpuCarveout(); +--- +> // SetupGpuCarveout(); +1197c1197 +< reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); +--- +> // reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); +1200c1200 +< EnableBpmpSmmu(); +--- +> // EnableBpmpSmmu(); +1223,1226c1223,1226 +< if (target_fw >= TargetFirmware_2_0_0) { +< /* Set the PMC secure. */ +< reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); +< } +--- +> // if (target_fw >= TargetFirmware_2_0_0) { +> // /* Set the PMC secure. */ +> // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); +> // } diff --git a/Source/Atmosphere-Patches/diff/secmon_smc_handler.diff b/Source/Atmosphere-Patches/diff/secmon_smc_handler.diff new file mode 100644 index 00000000..ee25f585 --- /dev/null +++ b/Source/Atmosphere-Patches/diff/secmon_smc_handler.diff @@ -0,0 +1,2 @@ +154a155 +> { 0xF0000005, Restriction_None, SmcShowError }, diff --git a/Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff b/Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff new file mode 100644 index 00000000..78251361 --- /dev/null +++ b/Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff @@ -0,0 +1,9 @@ +160c160 +< /* Validate that the bpmp is appropriately halted. */ +--- +> /* Horizon-OC: Halt BPMP here as hoc-clk may be running it, and if it's running there will be a panic. */ +161a162,165 +> reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM (HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), +> FLOW_REG_BITS_ENUM_SEL(HALT_COP_EVENTS_JTAG, jtag, ENABLED, DISABLED)); +> +> /* Validate that the bpmp is appropriately halted. */ diff --git a/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff b/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff new file mode 100644 index 00000000..0817bad4 --- /dev/null +++ b/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff @@ -0,0 +1,19 @@ +100a101,104 +> #include "secmon_define_emc_access_table.inc" +> #include "secmon_define_flow_controller_access_table.inc" +> #include "secmon_define_exception_vectors_access_table.inc" +> #include "secmon_define_rtc_pmc_access_table.inc" +104,107c108,115 +< { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, +< { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, +< { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, +< { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController1.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController1.GetAddress(), Mc01AccessTable::Size, }, +--- +> { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, +> { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, +> { EmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExternalMemoryController.GetAddress(), EmcAccessTable::Address, EmcAccessTable::Size, }, +> { FlowControllerAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceFlowController.GetAddress(), FlowControllerAccessTable::Address, FlowControllerAccessTable::Size, }, +> { ExceptionVectorsAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExceptionVectors.GetAddress(), ExceptionVectorsAccessTable::Address, ExceptionVectorsAccessTable::Size, }, +> { RtcPmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceRtcPmc.GetAddress(), RtcPmcAccessTable::Address, RtcPmcAccessTable::Size, }, +> { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, +> { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController1.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController1.GetAddress(), Mc01AccessTable::Size, }, From 0a9f412c51dccbff39d1dc4a46c3a3b8226b2015 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 20:40:09 +0200 Subject: [PATCH 092/205] ldr: add erista rext timings --- .../pcv/erista/calculate_timings_erista.cpp | 31 +++++++++++++++++++ .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 8 ----- .../source/oc/pcv/mariko/timing_tables.cpp | 4 +-- .../source/oc/pcv/mariko/timing_tables.hpp | 11 ++----- .../loader/source/oc/pcv/pcv_common.hpp | 5 +++ 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 7562a721..c9094c8b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -18,6 +18,36 @@ namespace ams::ldr::hoc::pcv::erista { + /* Dumped from bpmp fw mtc table (l4t). */ + const RextPatch g_rext_table[] = { + {1'633'000, 0x17}, {1'728'000, 0x17}, {1'795'200, 0x19}, + {1'862'400, 0x1A}, {1'894'400, 0x1A}, {1'932'800, 0x1A}, + {1'958'400, 0x1A}, {1'996'800, 0x1A}, {2'035'200, 0x1A}, + {2'064'000, 0x19}, {2'099'200, 0x19}, {2'131'200, 0x1A}, + {2'163'200, 0x1A}, {2'188'800, 0x1A}, {2'227'200, 0x1A}, + {2'265'600, 0x1B}, {2'291'200, 0x1B}, {2'329'600, 0x1A}, + {2'361'600, 0x1A}, + }; + + const RextPatch *LookupRext(u32 freq) { + for (u32 i = 0; i < std::size(g_rext_table); i++) { + if (g_rext_table[i].freq >= freq) { + return &g_rext_table[i]; + } + } + return nullptr; + } + + void GetRext(u32 freq) { + if (auto r = LookupRext(freq)) { + rext = r->rext; + return; + } + + /* > 3200 */ + rext = 0x1E; + } + void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) { latency += index * latencyStep; } @@ -117,6 +147,7 @@ namespace ams::ldr::hoc::pcv::erista { WL = WL_1331; HandleLatency(freq); + GetRext(freq); CalculateMrw2(); tR2P = CEIL((RL * 0.426) - 2.0); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index 7a4a1b4d..d1aefb8d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -66,14 +66,6 @@ namespace ams::ldr::hoc::pcv::erista { refresh_raw = MIN(refresh_raw, static_cast(0xFFFF)); } - if (table->rate_khz > 3200000) { - rext = 30; - } else if (table->rate_khz >= 2133001) { - rext = 28; - } else { - rext = 26; - } - u32 trefbw = refresh_raw + 0x40; trefbw = MIN(trefbw, static_cast(0x3FFF)); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp index 117fa995..dea73cfc 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp @@ -19,7 +19,7 @@ namespace ams::ldr::hoc::pcv::mariko { - const ReplacePatch g_rext_table[] = { + const RextPatch g_rext_table[] = { {2'133'000, 0x1A}, {2'166'000, 0x19}, {2'200'000, 0x19}, {2'233'000, 0x19}, {2'266'000, 0x1A}, {2'300'000, 0x1B}, {2'333'000, 0x1B}, {2'366'000, 0x1B}, {2'400'000, 0x1B}, @@ -35,7 +35,7 @@ namespace ams::ldr::hoc::pcv::mariko { const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]); - const ReplacePatch *FindRext(u32 freq) { + const RextPatch *FindRext(u32 freq) { for (u32 i = 0; i < g_rext_table_size; i++) { if (g_rext_table[i].freq >= freq) { return &g_rext_table[i]; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp index 1fe42bd9..a1aa7f0a 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp @@ -19,13 +19,8 @@ namespace ams::ldr::hoc::pcv::mariko { - struct ReplacePatch { - u32 freq; - u32 rext; - }; - - extern const ReplacePatch g_rext_table[]; - extern const u32 g_rext_table_size; - const ReplacePatch *FindRext(u32 freq); + extern const RextPatch g_rext_table[]; + extern const u32 g_rext_table_size; + const RextPatch *FindRext(u32 freq); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index bdda0361..49a60aa3 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -187,6 +187,11 @@ namespace ams::ldr::hoc::pcv { }; static_assert(sizeof(SharedClkBus) == 0x58); + struct RextPatch { + u32 freq; + u32 rext; + }; + constexpr u32 CpuClkOSLimit = 1785'000; constexpr u32 GpuClkOsLimit = 921'600; constexpr u32 EmcClkOSLimit = 1600'000; From 4cf2aab7557e178214b2db7a7e8d49f9ceac0858 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 20:46:39 +0200 Subject: [PATCH 093/205] pcv: act2pden was correct --- .../stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index d1aefb8d..c0265464 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -104,7 +104,7 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_pchg2pden, GET_CYCLE_CEIL(1.763)); WRITE_PARAM_ALL_REG(table, emc_ar2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_pdex2cke, GET_CYCLE_CEIL(1.05)); - WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(1.75)); /* todo verify. guessed. */ + WRITE_PARAM_ALL_REG(table, emc_act2pden, GET_CYCLE_CEIL(1.75)); WRITE_PARAM_ALL_REG(table, emc_cke2pden, GET_CYCLE_CEIL(8.499)); WRITE_PARAM_ALL_REG(table, emc_pdex2mrr, GET_CYCLE_CEIL(pdex2mrr)); WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); From 2a60fe1a0409d42abe5852369a3dae2c19721391 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 26 Aug 2026 21:04:00 +0200 Subject: [PATCH 094/205] ldr: fix rext fallback --- .../loader/source/oc/pcv/erista/calculate_timings_erista.cpp | 4 ++-- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index c9094c8b..1a40676f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -44,8 +44,8 @@ namespace ams::ldr::hoc::pcv::erista { return; } - /* > 3200 */ - rext = 0x1E; + /* Fallback */ + rext = 0x1A; } void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index abdac84d..7aa207cd 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -26,7 +26,7 @@ namespace ams::ldr::hoc::pcv::mariko { return; } - /* > 3200 */ + /* Fallback */ rext = 0x1E; } From 30951359934565bcc023d2b64d24fe333232ed31 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 15:18:51 -0400 Subject: [PATCH 095/205] prevent exosphere patch from crashing nvsrv --- .../Atmosphere-Patches/diff/secmon_setup.diff | 57 +++++++------------ Source/Atmosphere-Patches/secmon_setup.cpp | 43 +++++++------- 2 files changed, 41 insertions(+), 59 deletions(-) diff --git a/Source/Atmosphere-Patches/diff/secmon_setup.diff b/Source/Atmosphere-Patches/diff/secmon_setup.diff index 3b56edd9..5b796e03 100644 --- a/Source/Atmosphere-Patches/diff/secmon_setup.diff +++ b/Source/Atmosphere-Patches/diff/secmon_setup.diff @@ -1,41 +1,7 @@ -467,474c467,474 -< reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), -< TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); +1221c1221 +< const auto target_fw = GetTargetFirmware(); --- -> // reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), -> // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); -757c757 -< void SetupGpuCarveout() { ---- -> [[maybe_unused]] void SetupGpuCarveout() { -903c903 -< void EnableBpmpSmmu() { ---- -> [[maybe_unused]] void EnableBpmpSmmu() { -1165c1165 -< SetupGpuCarveout(); ---- -> // SetupGpuCarveout(); -1197c1197 -< reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); ---- -> // reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); -1200c1200 -< EnableBpmpSmmu(); ---- -> // EnableBpmpSmmu(); +> // const auto target_fw = GetTargetFirmware(); 1223,1226c1223,1226 < if (target_fw >= TargetFirmware_2_0_0) { < /* Set the PMC secure. */ @@ -43,6 +9,21 @@ < } --- > // if (target_fw >= TargetFirmware_2_0_0) { -> // /* Set the PMC secure. */ +> // /* Set the PMC secure. */ I REFUSE > // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); > // } +1228,1233c1228,1234 +< if (target_fw >= TargetFirmware_4_0_0) { +< /* Set the MC secure. */ +< reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), +< SLAVE_SECURITY_REG_BITS_ENUM(1, MC1, ENABLE), +< SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); +< } +--- +> // if (target_fw >= TargetFirmware_4_0_0) { +> // /* Set the MC secure. */ I REFUSE +> // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), +> // SLAVE_SECURITY_REG_BITS_ENUM(1, MC1, ENABLE), +> // SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); +> // } +> return; diff --git a/Source/Atmosphere-Patches/secmon_setup.cpp b/Source/Atmosphere-Patches/secmon_setup.cpp index 2103820a..af6c3ed8 100644 --- a/Source/Atmosphere-Patches/secmon_setup.cpp +++ b/Source/Atmosphere-Patches/secmon_setup.cpp @@ -464,14 +464,14 @@ namespace ams::secmon { void SetupSecureRegisters() { /* Configure timers 5-8 and watchdog timers 0-3 as secure. */ - // reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), - // TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); + reg::Write(TIMER + TIMER_SHARED_TIMER_SECURE_CFG, TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR5, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR6, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR7, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_TMR8, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT0, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT1, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT2, ENABLE), + TIMER_REG_BITS_ENUM(SHARED_TIMER_SECURE_CFG_WDT3, ENABLE)); /* Lock cluster switching, to prevent usage of the A53 cores. */ reg::Write(FLOW_CTLR + FLOW_CTLR_BPMP_CLUSTER_CONTROL, FLOW_REG_BITS_ENUM(BPMP_CLUSTER_CONTROL_ACTIVE_CLUSTER_LOCK, ENABLE), @@ -754,7 +754,7 @@ namespace ams::secmon { hw::InstructionSynchronizationBarrier(); } - [[maybe_unused]] void SetupGpuCarveout() { + void SetupGpuCarveout() { /* Configure carveout 2. */ reg::Write(MC + MC_SECURITY_CARVEOUT2_BOM, static_cast(MemoryRegionDramGpuCarveout.GetAddress() >> 0)); reg::Write(MC + MC_SECURITY_CARVEOUT2_BOM_HI, static_cast(MemoryRegionDramGpuCarveout.GetAddress() >> BITSIZEOF(u32))); @@ -900,7 +900,7 @@ namespace ams::secmon { reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH39, REG_BITS_VALUE(0, 27, WarmbootCarveoutConfig)); } - [[maybe_unused]] void EnableBpmpSmmu() { + void EnableBpmpSmmu() { /* Define the ASID contents. */ constexpr int BpmpAsid = 1; constexpr uintptr_t BpmpAsidPde = MemoryRegionPhysicalDeviceSecurityEngine.GetAddress(); @@ -1162,7 +1162,7 @@ namespace ams::secmon { void SetupSocProtections() { /* Setup the GPU carveout. */ - // SetupGpuCarveout(); + SetupGpuCarveout(); /* Configure the two kernel carveouts. */ SetupKernelCarveouts(); @@ -1194,10 +1194,10 @@ namespace ams::secmon { reg::Write(EVP + EVP_COP_FIQ_VECTOR, BpmpExceptionVector); /* Disable arbitration for the bpmp. */ - // reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); + reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); /* Turn on the SMMU for the BPMP. */ - // EnableBpmpSmmu(); + EnableBpmpSmmu(); /* Wait until the flow controller reports that the BPMP is halted. */ while (!reg::HasValue(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP))) { @@ -1218,19 +1218,20 @@ namespace ams::secmon { } void SetupPmcAndMcSecure() { - const auto target_fw = GetTargetFirmware(); + // const auto target_fw = GetTargetFirmware(); // if (target_fw >= TargetFirmware_2_0_0) { - // /* Set the PMC secure. */ + // /* Set the PMC secure. */ I REFUSE // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); // } - if (target_fw >= TargetFirmware_4_0_0) { - /* Set the MC secure. */ - reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), - SLAVE_SECURITY_REG_BITS_ENUM(1, MC1, ENABLE), - SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); - } + // if (target_fw >= TargetFirmware_4_0_0) { + // /* Set the MC secure. */ I REFUSE + // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), + // SLAVE_SECURITY_REG_BITS_ENUM(1, MC1, ENABLE), + // SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); + // } + return; } void SetupCpuCoreContext() { From 0262236d2cd194dc0c81d68ad510c76240cb5ee8 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 15:22:10 -0400 Subject: [PATCH 096/205] bpmpfw: system panic on panic --- Source/hoc-clk/bpmpfw/source/main.cpp | 13 ++++------ Source/hoc-clk/bpmpfw/source/start.s | 35 ++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index 43e74416..f4203f96 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -27,6 +27,8 @@ #include +extern "C" [[noreturn]] void _panic_reboot(); + namespace { HocClkBpmpSharedInfo &SharedInfo() { @@ -82,12 +84,7 @@ extern "C" void main() { MainLoop(info); printf("[hoc-bpmpfw]: PANIC\n"); - - /* Clear the magic so sysmodule knows of a panic */ - info.magic = 0x0; - - /* Give a panic code */ - info.status = ~0; - for(;;) - ; + + /* Kill execution */ + _panic_reboot(); } diff --git a/Source/hoc-clk/bpmpfw/source/start.s b/Source/hoc-clk/bpmpfw/source/start.s index 83f2e136..8c5c758f 100644 --- a/Source/hoc-clk/bpmpfw/source/start.s +++ b/Source/hoc-clk/bpmpfw/source/start.s @@ -68,17 +68,50 @@ _panic: 7: ldrb r1, [r3], #1 cmp r1, #0 - beq _panic_hang + beq 9f 8: ldr r2, [r0, #0x14] /* UART_LSR */ tst r2, #0x20 /* UART_LSR_THRE */ beq 8b str r1, [r0] b 7b +9: + ldr r2, [r0, #0x14] /* UART_LSR */ + tst r2, #0x40 /* UART_LSR_TMTY */ + beq 9b + b _panic_reboot _panic_msg: .asciz "[bpmpfw] PANIC\n" .align 2 +.global _panic_reboot +_panic_reboot: + ldr r0, =0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */ + ldr r1, =0xF8F00000 /* Panic code. */ + str r1, [r0] + + ldr r4, =0x60005000 /* TMR_BASE */ + + /* Write the magic */ + ldr r1, =0xC45A + str r1, [r4, #0x18C] + + /* Disable the counters */ + mov r1, #0x2 + str r1, [r4, #0x188] + + /* Start periodic timer */ + ldr r1, =0xC0000000 + str r1, [r4, #0x080] + + /* Set reboot source to the timer we started */ + ldr r1, =0x8019 + str r1, [r4, #0x180] + + /* Enable the counters */ + mov r1, #0x1 + str r1, [r4, #0x188] + _panic_hang: b _panic_hang From 3141d0ea2e1df1f53bb404092bca432bd8856d07 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 15:29:41 -0400 Subject: [PATCH 097/205] move AOTAG to BPMP --- Source/hoc-clk/bpmpfw/source/aotag.hpp | 57 +++++++++++++++++++ Source/hoc-clk/bpmpfw/source/main.cpp | 2 + Source/hoc-clk/common/include/hocclk/bpmp.h | 2 +- .../hoc-clk/sysmodule/src/tsensor/aotag.cpp | 20 +------ 4 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/source/aotag.hpp diff --git a/Source/hoc-clk/bpmpfw/source/aotag.hpp b/Source/hoc-clk/bpmpfw/source/aotag.hpp new file mode 100644 index 00000000..1e159139 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/aotag.hpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2014 - 2017, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include "regs.hpp" + +#include + +namespace aotag { + + constexpr u32 PmcBase = 0x7000E400; + constexpr u32 PmcTsensorStatus1 = 0x4AC; + + constexpr u32 Status1ValidBit = (1u << 31); + constexpr u32 Status1AbsShift = 8; + constexpr u32 Status1AbsMask = 0xFF; + constexpr u32 Status1FracBit = (1u << 7); + constexpr u32 Status1SignBit = (1u << 0); + + constexpr s32 InvalidSentinel = -125; + + inline void Update(HocClkBpmpSharedInfo &info) { + const u32 regval = MMIO32(PmcBase + PmcTsensorStatus1); + + if (!(regval & Status1ValidBit)) { + info.tempAO = InvalidSentinel; + return; + } + + const u32 abs = (regval >> Status1AbsShift) & Status1AbsMask; + const bool frac = (regval & Status1FracBit) != 0; + const bool negative = (regval & Status1SignBit) != 0; + + s32 temp = static_cast(abs) * 1000 + (frac ? 500 : 0); + if (negative) { + temp = -temp; + } + + info.tempAO = temp; + } + +} // namespace aotag diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index f4203f96..5dc4023b 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -19,6 +19,7 @@ #include #include "actmon.hpp" +#include "aotag.hpp" #include "bpmp_mmu.hpp" #include "freq.hpp" #include "libc_platform.hpp" @@ -53,6 +54,7 @@ void MainLoop(HocClkBpmpSharedInfo &info) { freq::Update(info); actmon::Update(info); + aotag::Update(info); msleep(250); } diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h index c064f835..30c82ccd 100644 --- a/Source/hoc-clk/common/include/hocclk/bpmp.h +++ b/Source/hoc-clk/common/include/hocclk/bpmp.h @@ -41,7 +41,7 @@ typedef struct { u32 emcBwCpu; u32 emcBwGpu; u32 exitRequested; // Request BPMP-FW to shutdown for sleep mode - u32 reserved[1]; + s32 tempAO; } HocClkBpmpSharedInfo; static_assert(sizeof(HocClkBpmpSharedInfo) == 0x3C); diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp index fbf03091..87aa66b2 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp @@ -22,6 +22,7 @@ #include +#include "../bpmp/bpmp.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "aotag.hpp" @@ -214,24 +215,7 @@ namespace tsensor { return -126; } - u32 regval = 0, abs = 0, fraction = 0, valid = 0, sign = 0; - s32 temp = 0; - regval = ReadPmcReg(PMC_TSENSOR_STATUS1); - valid = REG_GET(regval, STATUS1_TEMP_VALID); - - if (!valid) { - return -125; - } - - abs = REG_GET(regval, STATUS1_TEMP_ABS); - fraction = REG_GET(regval, STATUS1_TEMP_FRAC); - sign = REG_GET(regval, STATUS1_TEMP_SIGN); - temp = (abs * 1000) + (fraction * 500); - if (sign) { - temp = (-1) * (temp); - } - - return temp; + return bpmp::GetSharedInfo()->tempAO; } bool IsInitialized() { From b6fcd6072c3f0c4cdb68a96c554a600c8ab6b1e7 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 15:49:17 -0400 Subject: [PATCH 098/205] move pllmb measurement to bpmp --- Source/hoc-clk/bpmpfw/source/main.cpp | 2 + Source/hoc-clk/bpmpfw/source/pllmb.hpp | 95 ++++++++++++++ Source/hoc-clk/common/include/hocclk/bpmp.h | 3 +- .../src/ui/gui/config_info_strings.cpp | 9 -- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 7 -- .../sysmodule/src/board/board_freq.cpp | 5 +- Source/hoc-clk/sysmodule/src/soc/pllmb.cpp | 116 ------------------ Source/hoc-clk/sysmodule/src/soc/pllmb.hpp | 31 ----- 8 files changed, 100 insertions(+), 168 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/source/pllmb.hpp delete mode 100644 Source/hoc-clk/sysmodule/src/soc/pllmb.cpp delete mode 100644 Source/hoc-clk/sysmodule/src/soc/pllmb.hpp diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index 5dc4023b..b3f49cea 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -23,6 +23,7 @@ #include "bpmp_mmu.hpp" #include "freq.hpp" #include "libc_platform.hpp" +#include "pllmb.hpp" #include "regs.hpp" #include "sensors.hpp" @@ -55,6 +56,7 @@ void MainLoop(HocClkBpmpSharedInfo &info) { freq::Update(info); actmon::Update(info); aotag::Update(info); + info.freqMemPll = static_cast(pllmb::MeasureRamClockHz() / 1000); msleep(250); } diff --git a/Source/hoc-clk/bpmpfw/source/pllmb.hpp b/Source/hoc-clk/bpmpfw/source/pllmb.hpp new file mode 100644 index 00000000..706b2993 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/pllmb.hpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) Souldbminer + * Copyright (c) KazushiMe + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once +#include "freq.hpp" +#include "regs.hpp" + +namespace pllmb { + + constexpr u32 PtoPllm = 2; + constexpr u32 PtoPllmb = 37; + + constexpr u32 PllmMisc2 = 0x9C; + constexpr u32 PllmMisc2PllmBit = (1u << 8); + constexpr u32 PllmMisc2PllmbBit = (1u << 9); + + constexpr u32 PtoCyclePeriod = (1u << 31); // PTO_CLK_CNT_STATUS busy bit + + inline u64 MeasurePtoHz(u32 ptoId, u32 divider, u32 preselReg, u32 preselMask) { + u32 preselOrigBit = 0; + + if (preselReg) { + u32 val = MMIO32(freq::CarBase + preselReg); + usleep(10); + preselOrigBit = val & preselMask; + val &= ~preselMask; + val |= preselMask; + MMIO32(freq::CarBase + preselReg) = val; + usleep(10); + } + + constexpr u32 cycleCount = 16; + const u32 savedCntl = MMIO32(freq::CarBase + freq::CarPtoClkCntCntl); + + u32 val = freq::PtoDivSelDiv1 | freq::PtoClkEnable | (cycleCount - 1); + val |= ptoId << freq::PtoSrcSelShift; + + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntRst; + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntEn; + usleep(500); + + while (MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & PtoCyclePeriod) + ; + + u32 cnt = MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & freq::PtoClkCntMask; + cnt *= divider; + + const u64 rateHz = (static_cast(cnt) * 32768) / cycleCount; + + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = savedCntl; + usleep(10); + + if (preselReg) { + u32 val2 = MMIO32(freq::CarBase + preselReg); + usleep(10); + val2 &= ~preselMask; + val2 |= preselOrigBit; + MMIO32(freq::CarBase + preselReg) = val2; + usleep(10); + } + + return rateHz; + } + + inline u64 MeasureRamClockHz() { + const u64 pllmbHz = MeasurePtoHz(PtoPllmb, 2, PllmMisc2, PllmMisc2PllmbBit); + if (pllmbHz != 0) { + return pllmbHz; + } + return MeasurePtoHz(PtoPllm, 2, PllmMisc2, PllmMisc2PllmBit); + } + +} // namespace pllmb diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h index 30c82ccd..016719c6 100644 --- a/Source/hoc-clk/common/include/hocclk/bpmp.h +++ b/Source/hoc-clk/common/include/hocclk/bpmp.h @@ -35,6 +35,7 @@ typedef struct { s32 tempPllx; u32 freqCpu; // kHz u32 freqMem; // kHz + u32 freqMemPll; // kHz u32 emcLoadAll; u32 emcLoadCpu; u32 emcBwAll; @@ -44,4 +45,4 @@ typedef struct { s32 tempAO; } HocClkBpmpSharedInfo; -static_assert(sizeof(HocClkBpmpSharedInfo) == 0x3C); +static_assert(sizeof(HocClkBpmpSharedInfo) == 0x40); diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index ea290e95..e6fbcc31 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -76,15 +76,6 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: INI" }; - case HocClkConfigValue_MemoryFrequencyMeasurementMode: - return { - "How the RAM real frequency is measured", - "Options:", - "- PLL: Measure from PLLMB and PLLM (more accurate)", - "- Actmon: Measure from Actmon (less accurate)", - "Default: PLL" - }; - case HocClkConfigValue_BatteryChargeCurrent: return { "Overrides the charge current to the battery. Use with caution!", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 3a5682fc..a5be9c83 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -857,13 +857,6 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { addConfigButton(HocClkConfigValue_GPUSchedulingMethod, "GPU Scheduling Override Method", ValueRange(0, 0, 1, "", 0), "GPU Scheduling Override Method", &thresholdsDisabled, {}, gpuSchedMethodValues, false); - std::vector ramRFMeasurementMethods = { - NamedValue("PLL", MemoryFrequencyMeasurementMode_PLL), - NamedValue("Actmon", MemoryFrequencyMeasurementMode_Actmon), - }; - addConfigButton(HocClkConfigValue_MemoryFrequencyMeasurementMode, "Memory Frequency Measurement Mode", ValueRange(0, 0, 1, "", 0), - "Memory Frequency Measurement Mode", &thresholdsDisabled, {}, ramRFMeasurementMethods, false); - tsl::elm::CustomDrawer *chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Overriding the charge current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("can be dangerous and may cause", false, x + 20, y + 50, 18, tsl::style::color::ColorText); diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 16e0f98c..7436e60c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -37,7 +37,6 @@ #include "../hos/apm_ext.h" #include "../i2c/i2cDrv.h" #include "../soc/gm20b.hpp" -#include "../soc/pllmb.hpp" #include "board.hpp" #include "board_name.hpp" #include @@ -202,9 +201,7 @@ namespace board { return static_cast((static_cast(38400000) * divn) / (divm * divp) / 2); } case HocClkModule_MEM: - return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL - ? pllmb::getRamClockRatePLLMB() - : bpmp::GetSharedInfo()->freqMem * 1000; + return bpmp::GetSharedInfo()->freqMemPll * 1000; case HocClkModule_Display: return GetDisplayRate(hz); default: diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp deleted file mode 100644 index c9ad36bb..00000000 --- a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) Souldbminer - * - * Copyright (c) KazushiMe - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "pllmb.hpp" - -namespace pllmb { -#define GET_BITS(VAL, HIGH, LOW) ((VAL & ((1UL << (HIGH + 1UL)) - 1UL)) >> LOW) -#define GET_BIT(VAL, BIT) GET_BITS(VAL, BIT, BIT) - - static inline volatile u32 ®(uintptr_t addr) { - return *reinterpret_cast(addr); - } - - // From jetson nano kernel - typedef enum { - /* divider = 2 */ - CLK_PLLX = 5, - CLK_PLLM = 2, - CLK_PLLMB = 37, - /* PLLX & PLLG are backup PLLs for CPU & GPU */ - /* divider = 1 */ - CLK_CCLK_G = 18, // A57 CPU cluster - CLK_EMC = 36, - } PTO_ID; // PLL Test Output Register ID - - /* See if GM20B clock GPC PLL regs are accessible. */ - -#define PLLX_MISC0 0xE4 -#define PLLM_MISC2 0x9C - - double ptoGetMHz(PTO_ID pto_id, u32 divider = 1, u32 presel_reg = 0, u32 presel_mask = 0) { - u32 pre_val, val, presel_val; - - if (presel_reg) { - val = REG(board::clkVirtAddr + presel_reg); - usleep(10); - presel_val = val & presel_mask; - val &= ~presel_mask; - val |= presel_mask; - REG(board::clkVirtAddr + presel_reg) = val; - usleep(10); - } - - constexpr u32 cycle_count = 16; - pre_val = REG(board::clkVirtAddr + 0x60); - val = BIT(23) | BIT(13) | (cycle_count - 1); - val |= pto_id << 14; - - REG(board::clkVirtAddr + 0x60) = val; - usleep(10); - REG(board::clkVirtAddr + 0x60) = val | BIT(10); - usleep(10); - REG(board::clkVirtAddr + 0x60) = val; - usleep(10); - REG(board::clkVirtAddr + 0x60) = val | BIT(9); - usleep(500); - - while (REG(board::clkVirtAddr + 0x64) & BIT(31)) - ; - - val = REG(board::clkVirtAddr + 0x64); - val &= 0xFFFFFF; - val *= divider; - - double rate_hz = (u64)val * 32768. / cycle_count; - usleep(10); - REG(board::clkVirtAddr + 0x60) = pre_val; - usleep(10); - - if (presel_reg) { - val = REG(board::clkVirtAddr + presel_reg); - usleep(10); - val &= ~presel_mask; - val |= presel_val; - REG(board::clkVirtAddr + presel_reg) = val; - usleep(10); - } - - return rate_hz; - } - - u64 getRamClockRatePLLMB() { - // printf("\n" - // "EMC: %6.1f MHz\n" - // "CCLK_G: %6.1f MHz\n" - // "PLLX: %6.1f MHz\n" - // "PLLM: %6.1f MHz\n" - // "PLLMB: %6.1f MHz\n", - // ptoGetMHz(CLK_EMC), - // ptoGetMHz(CLK_CCLK_G), - // ptoGetMHz(CLK_PLLX, 2, PLLX_MISC0, BIT(22)), - // ptoGetMHz(CLK_PLLM, 2, PLLM_MISC2, BIT(8)), - // ptoGetMHz(CLK_PLLMB, 2, PLLM_MISC2, BIT(9)) - // ); - - u32 pllmb = ptoGetMHz(CLK_PLLMB, 2, PLLM_MISC2, BIT(9)); - u32 pllm = ptoGetMHz(CLK_PLLM, 2, PLLM_MISC2, BIT(8)); - return pllmb == 0 ? pllm : pllmb; // pllmb is zeroed out at times, fallback to pllm - } -} // namespace pllmb \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp deleted file mode 100644 index e65472fd..00000000 --- a/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) Souldbminer - * - * Copyright (c) KazushiMe - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include -#include -#include -#include - -#include "../board/board.hpp" - -namespace pllmb { - - u64 getRamClockRatePLLMB(); -} \ No newline at end of file From 40ec8dee8cd912b607925b9ef3ef0525a83e368a Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 27 Aug 2026 20:33:02 +0200 Subject: [PATCH 099/205] ipc: allow mismatached provided buffer size as long as the stable region is covered --- Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index f1e01d9b..c51f8195 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -24,6 +24,7 @@ * -------------------------------------------------------------------------- */ +#include #include #include #include @@ -48,6 +49,8 @@ namespace ipcService { LockableMutex gThreadMutex; IpcServer gServer; + constexpr size_t gMinContextBufSize = offsetof(HocClkContext, stable) + sizeof(HocClkContext::stable); + Result GetApiVersion(u32 *out_version) { *out_version = HOCCLK_IPC_API_VERSION; return 0; @@ -60,8 +63,9 @@ namespace ipcService { return 0; } - Result GetCurrentContext(HocClkContext *out_ctx) { - *out_ctx = clockManager::GetCurrentContext(); + Result GetCurrentContext(void *out_buf, size_t bufSize) { + HocClkContext ctx = clockManager::GetCurrentContext(); + memcpy(out_buf, &ctx, bufSize < sizeof(ctx) ? bufSize : sizeof(ctx)); return 0; } @@ -162,8 +166,8 @@ namespace ipcService { case HocClkIpcCmd_GetCurrentContext: if (r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); - if (bufSize >= sizeof(HocClkContext)) { - return GetCurrentContext((HocClkContext *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + if (bufSize >= gMinContextBufSize) { + return GetCurrentContext(hipcGetBufferAddress(r->hipc.data.recv_buffers), bufSize); } } break; From 4023ae68381150e20a83034eed4e681df2adaa58 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 14:56:02 -0400 Subject: [PATCH 100/205] clean up pattern matching --- .../loader/source/oc/oc_common.hpp | 1 + .../source/oc/pcv/mariko/pcv_mariko.cpp | 86 +++++++++++++++++-- .../source/oc/pcv/mariko/pcv_mariko.hpp | 65 ++++++-------- 3 files changed, 105 insertions(+), 47 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index bbaaeb97..cb360cdb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -92,6 +92,7 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(HookDataOutOfMemory, 1029); R_DEFINE_ERROR_RESULT(HookUnavailable, 1030); R_DEFINE_ERROR_RESULT(InvalidNvsrvDevTable, 1031); + R_DEFINE_ERROR_RESULT(InvalidForceVerbosityPattern, 1032); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 1223493b..c1359830 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -42,7 +42,8 @@ namespace ams::ldr::hoc::pcv::mariko { DEFINE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); namespace { - size_t g_nso_size = 0; + size_t g_nso_size = 0; + bool g_payloadReady = false; /* set once Hooks().CopyPayload() has run (see Patch()) */ } [[maybe_unused]] static uintptr_t CaveReserve(size_t count) { @@ -57,6 +58,14 @@ namespace ams::ldr::hoc::pcv::mariko { const uintptr_t textEnd = g_pcv_cave; /* .text ends where the cave begins */ const uintptr_t vsnprintf_addr = reinterpret_cast(ptr); + { + using namespace _asm::field; + R_UNLESS(_asm::Ignoring(ptr[1], NvLogStpFpLrAsm, PairOff8), ldr::ResultInvalidNvLogRedirect()); /* stp x29,x30,[sp,#imm] */ + R_UNLESS(_asm::Ignoring(ptr[2], NvLogStrSpillAsm, Rt, Off8), ldr::ResultInvalidNvLogRedirect()); /* str x?,[sp,#imm] */ + R_UNLESS(_asm::Ignoring(ptr[3], NvLogMovFpAsm, Imm12), ldr::ResultInvalidNvLogRedirect()); /* add x29,sp,#imm */ + R_UNLESS(ptr[4] == NvLogCmpSizeAsm, ldr::ResultInvalidNvLogRedirect()); /* cmp x1,#0 */ + } + /* NvLog via the VDD_SOC log */ static const char Fmt[] = "%s(%s): DVFS request VDD_SOC %d mV\n"; constexpr size_t FmtLen = sizeof(Fmt) - 1; @@ -188,6 +197,15 @@ namespace ams::ldr::hoc::pcv::mariko { /* Relocate and extend C2/C3Bus to avoid issues (likely buffer overflow) */ Result BusFreqReloc(u32 *ptr) { + using namespace _asm::field; + + const u32 bus = _asm::Get(ptr[0], Rn); + R_UNLESS(_asm::IsOp(ptr[1], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[1], Imm12) == 0x18 && _asm::Get(ptr[1], Rn) == bus, + ldr::ResultInvalidBusFreqReloc()); /* add Xcnt,Xbus,#0x18 */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::StrImm64, Rt, Rn, Off8) && _asm::Get(ptr[2], Off8) == 0x50 && _asm::Get(ptr[2], Rn) == bus, + ldr::ResultInvalidBusFreqReloc()); /* str Xrail,[Xbus,#0x50] */ + R_UNLESS(_asm::IsOp(ptr[3], _asm::op::Bl, Imm26), ldr::ResultInvalidBusFreqReloc()); /* bl GetDvfsRailUniqueFreqList */ + constexpr u32 PrologueMargin = 140; u32 *functionPrologue = _asm::FindFnPrologue(ptr, PrologueMargin, nsoStart); R_UNLESS(functionPrologue != nullptr, ldr::ResultInvalidBusFreqReloc()); @@ -198,12 +216,47 @@ namespace ams::ldr::hoc::pcv::mariko { } #if HOC_UART_LOG + namespace { + struct { + u32 *sites[3] = {}; + u32 count = 0; + } forceVerbosityCache; + } + + HOOK_PAYLOAD_FN u32 ForceVerbosityImpl() { + HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); + return data->verbosityLevel; + } + /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ Result ForceVerbosity(u32 *ptr) { - if (C.pcvLogVerbosity != 0xff) { - PATCH_OFFSET(&ptr[0], _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, 0}, {_asm::field::Imm16, C.pcvLogVerbosity})); /* movz w0,#level */ - PATCH_OFFSET(&ptr[1], _asm::RetIns); /* ret */ + using namespace _asm::field; + + R_UNLESS(_asm::IsOp(ptr[1], _asm::op::StrImm64, Rt, Rn, Off8) && _asm::Get(ptr[1], Rn) == _asm::reg::Sp, + ldr::ResultInvalidForceVerbosityPattern()); /* str x?,[sp,#imm] */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::AddImm64, Rd, Rn, Imm12) + && _asm::Get(ptr[2], Rd) == _asm::reg::Fp && _asm::Get(ptr[2], Rn) == _asm::reg::Sp, + ldr::ResultInvalidForceVerbosityPattern()); /* add x29,sp,#imm */ + R_UNLESS(_asm::IsOp(ptr[3], _asm::op::AddImm64, Rn, Imm12) + && _asm::Get(ptr[3], Rd) == 0 && _asm::Get(ptr[3], Rn) == _asm::reg::Fp, + ldr::ResultInvalidForceVerbosityPattern()); /* add x0,x29,#imm */ + R_UNLESS(_asm::IsOp(ptr[4], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[4], Rn) == _asm::reg::Fp, + ldr::ResultInvalidForceVerbosityPattern()); /* add x?,x29,#imm */ + R_UNLESS(_asm::Get(ptr[3], Imm12) == _asm::Get(ptr[4], Imm12) + && _asm::IsOp(ptr[5], _asm::op::Bl, Imm26), + ldr::ResultInvalidForceVerbosityPattern()); + + bool foundCmp = false; + for (u32 j = 6; j <= 10; ++j) { + if (ptr[j] == 0x7100001Fu) { /* cmp w0,#0 */ + foundCmp = true; + break; + } } + R_UNLESS(foundCmp, ldr::ResultInvalidForceVerbosityPattern()); + + R_UNLESS(forceVerbosityCache.count < std::size(forceVerbosityCache.sites), ldr::ResultInvalidForceVerbosityPattern()); + forceVerbosityCache.sites[forceVerbosityCache.count++] = ptr; R_SUCCEED(); } #endif @@ -214,6 +267,8 @@ namespace ams::ldr::hoc::pcv::mariko { using namespace _asm::field; + R_UNLESS(_asm::Ignoring(ptr[1], EmcSocLutCountStoreAsm, Rt), ldr::ResultInvalidEmcSocLut()); /* str w?,[x0,#0x154] */ + u32 *freqStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocFreqStoreAsm, Rt); /* str x?,[x8,#0x18] */ u32 *voltStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocVoltStoreAsm, Rt); /* str w?,[x8,#0x48] */ u32 *readLoad = _asm::ScanAssembly(ptr - Window, Window, EmcSocReadLoadAsm, Rt); /* ldr w?,[x9,#0x48] */ @@ -253,7 +308,9 @@ namespace ams::ldr::hoc::pcv::mariko { } Result EmcDvfsCountLimit(u32 *ptr) { - R_UNLESS(EmcDvfsCountPatternFn(ptr), ldr::ResultInvalidEmcDvfsCount()); + R_UNLESS(_asm::IsOp(*(ptr - 1), _asm::op::Cbz, _asm::field::Imm19, _asm::field::Rt), ldr::ResultInvalidEmcDvfsCount()); /* cbz w?, */ + R_UNLESS(_asm::Ignoring(*(ptr + 1), _asm::Encode(_asm::op::BCond, {_asm::field::BCond, _asm::cond::Cs}), _asm::field::Imm19), + ldr::ResultInvalidEmcDvfsCount()); /* b.cs */ /* cmp w?,#0x21 -> cmp w?,#EmcDvfsTableEntryCount */ PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); @@ -261,8 +318,10 @@ namespace ams::ldr::hoc::pcv::mariko { } Result EmcRateListLimit(u32 *ptr) { - /* ptr = cmp w?,#0x20 ; ptr[1] = csel w?,w?,w?,lt (w? = min(maxCount, 32)) ; ptr[2] = bl */ - R_UNLESS(EmcRateListPatternFn(ptr), ldr::ResultInvalidEmcRateList()); + R_UNLESS(_asm::Ignoring(ptr[1], EmcRateCapCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) + && _asm::Get(ptr[0], _asm::field::Rn) == _asm::Get(ptr[1], _asm::field::Rn), + ldr::ResultInvalidEmcRateList()); /* csel w?,w?,w?,lt, min(reg, 0x20) */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::Bl, _asm::field::Imm26), ldr::ResultInvalidEmcRateList()); /* The csel's Rm holds the 32 cap. */ const u32 capReg = _asm::Get(ptr[1], _asm::field::Rm); @@ -521,13 +580,22 @@ namespace ams::ldr::hoc::pcv::mariko { Result InstallHooks() { R_TRY(Hooks().CheckEnabled()); - R_TRY(Hooks().CopyPayload()); + R_UNLESS(g_payloadReady, ldr::ResultUninitializedPatcher()); auto *data = Hooks().BindData(m_HookPayloadData); R_UNLESS(data != nullptr, ldr::ResultHookDataOutOfMemory()); R_TRY(SharedClkBusInstallHooks(data)); +#if HOC_UART_LOG + if (forceVerbosityCache.count != 0 && C.pcvLogVerbosity != 0xff) { + data->verbosityLevel = C.pcvLogVerbosity; + for (u32 i = 0; i < forceVerbosityCache.count; ++i) { + R_TRY(INSTALL_IMPL_HOOK(forceVerbosityCache.sites[i], ForceVerbosityImpl)); + } + } +#endif + R_SUCCEED(); } @@ -537,6 +605,8 @@ namespace ams::ldr::hoc::pcv::mariko { g_pcv_scratch = mapped_nso + nso_size - HocPcvScratchSize; g_nso_size = nso_size; + g_payloadReady = R_SUCCEEDED(Hooks().CopyPayload()); + MtcGenerateFreqTables(); u32 CpuCvbDefaultMaxFreq = static_cast(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index cc99ba21..a3381515 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -34,6 +34,9 @@ namespace ams::ldr::hoc::pcv::mariko { uintptr_t originalFnCallback; u32 table[BusFreqTableCount][EmcDvfsTableEntryCount]; /* Original bus table size: 32. */ } busData; +#if HOC_UART_LOG + u32 verbosityLevel; +#endif }; DECLARE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); @@ -84,18 +87,14 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 EmcSocLutCountStoreAsm = 0xB9015408; /* str w?,[x0,#0x154] (anchor) */ constexpr u32 EmcSocFreqStoreAsm = 0xF9000D00; /* str x?,[x8,#0x18] */ constexpr u32 EmcSocVoltStoreAsm = 0xB9004900; /* str w?,[x8,#0x48] (socMinLut[i]) */ - constexpr u32 EmcSocReadLoadAsm = 0xB9404929; /* ldr w?,[x9,#0x48] (socMinLut readback) */ + constexpr u32 EmcSocReadLoadAsm = 0xB9404929; /* ldr w?,[x9,#0x48] (socMinLut) */ inline bool EmcDvfsCountPatternFn(u32 *ptr) { - /* Local context: cbz w?, ; cmp w?,#0x21 ; b.cs */ - return _asm::Ignoring(*ptr, EmcCountCmpAsm, _asm::field::Rd) - && _asm::Ignoring(*(ptr + 1), _asm::Encode(_asm::op::BCond, {_asm::field::BCond, _asm::cond::Cs}), _asm::field::Imm19) /* b.cs */ - && _asm::IsOp(*(ptr - 1), _asm::op::Cbz, _asm::field::Imm19, _asm::field::Rt); /* cbz */ + return _asm::Ignoring(*ptr, EmcCountCmpAsm, _asm::field::Rd); } inline bool EmcSocLutPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, EmcSocLutPtrStoreAsm, _asm::field::Rt) /* str x?,[x0,#0x120] */ - && _asm::Ignoring(*(ptr + 1), EmcSocLutCountStoreAsm, _asm::field::Rt); /* str w?,[x0,#0x154] */ + return _asm::Ignoring(*ptr, EmcSocLutPtrStoreAsm, _asm::field::Rt); /* str x?,[x0,#0x120] */ } /* @@ -112,10 +111,7 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 EmcRateCapCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt */ inline bool EmcRateListPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, EmcRateCapCmpAsm, _asm::field::Rd, _asm::field::Rn) /* cmp w?,#0x20 */ - && _asm::Ignoring(*(ptr + 1), EmcRateCapCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) /* csel w?,w?,w?,lt */ - && (_asm::Get(*ptr, _asm::field::Rn) == _asm::Get(*(ptr + 1), _asm::field::Rn)) /* min(reg, 0x20) */ - && _asm::IsOp(*(ptr + 2), _asm::op::Bl, _asm::field::Imm26); /* bl <_asm::Get*DvfsFreqTable> */ + return _asm::Ignoring(*ptr, EmcRateCapCmpAsm, _asm::field::Rd, _asm::field::Rn); } constexpr u32 EmcRateSessCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ @@ -123,7 +119,6 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 EmcRateSessCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt (opcode + cond) */ inline bool EmcRateSessFindClamp(u32 *ptr, u32 *out_c, u32 *out_cap, u32 *out_movz_i) { - if (!_asm::Ignoring(ptr[0], EmcRateSessCmpAsm, _asm::field::Rd, _asm::field::Rn)) return false; /* cmp w,#0x20 */ const u32 c = _asm::Get(ptr[0], _asm::field::Rn); for (u32 i = 1; i <= 14; ++i) { const u32 w = ptr[i]; @@ -144,22 +139,18 @@ namespace ams::ldr::hoc::pcv::mariko { } inline bool EmcRateSessPatternFn(u32 *ptr) { - return EmcRateSessFindClamp(ptr, nullptr, nullptr, nullptr); + return _asm::Ignoring(*ptr, EmcRateSessCmpAsm, _asm::field::Rd, _asm::field::Rn); } inline bool BusFreqRelocPatternFn(u32 *ptr) { - if (g_pcv_scratch == 0 || g_pcv_cave == 0) { + if (g_pcv_cave == 0) { return false; } if (reinterpret_cast(ptr + 4) > g_pcv_cave) { /* the call site lives in .text */ return false; } - if (!(_asm::IsOp(ptr[0], _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) && _asm::Get(ptr[0], _asm::field::Off8) == 0x10)) return false; /* ldr Xbuf,[Xbus,#0x10] */ - if (!(_asm::IsOp(ptr[1], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(ptr[1], _asm::field::Imm12) == 0x18)) return false; /* add Xcnt,Xbus,#0x18 */ - if (!(_asm::IsOp(ptr[2], _asm::op::StrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) && _asm::Get(ptr[2], _asm::field::Off8) == 0x50)) return false; /* str Xrail,[Xbus,#0x50]*/ - if (!_asm::IsOp(ptr[3], _asm::op::Bl, _asm::field::Imm26)) return false; /* bl GetDvfsRailUnique */ - const u32 bus = _asm::Get(ptr[0], _asm::field::Rn); - return _asm::Get(ptr[1], _asm::field::Rn) == bus && _asm::Get(ptr[2], _asm::field::Rn) == bus; + return _asm::IsOp(*ptr, _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(*ptr, _asm::field::Off8) == 0x10; /* ldr Xbuf,[Xbus,#0x10] */ } inline bool ForceVerbosityPatternFn(u32 *ptr) { @@ -169,34 +160,30 @@ namespace ams::ldr::hoc::pcv::mariko { if (reinterpret_cast(ptr + 11) > g_pcv_cave) { /* .text only */ return false; } - if (ptr[0] != 0xA9BE7BFDu || ptr[1] != 0xF9000BF3u || ptr[2] != 0x910003FDu) return false; /* stp/str/mov x29,sp */ - if (!(_asm::IsOp(ptr[3], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(ptr[3], _asm::field::Rd) == 0 && _asm::Get(ptr[3], _asm::field::Rn) == _asm::reg::Fp)) return false; /* add x0,x29,#imm */ - if (!(_asm::IsOp(ptr[4], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(ptr[4], _asm::field::Rd) == 19 && _asm::Get(ptr[4], _asm::field::Rn) == _asm::reg::Fp)) return false; /* add x19,x29,#imm */ - if (_asm::Get(ptr[3], _asm::field::Imm12) != _asm::Get(ptr[4], _asm::field::Imm12) || !_asm::IsOp(ptr[5], _asm::op::Bl, _asm::field::Imm26)) return false; - for (u32 j = 6; j <= 10; ++j) { - if (ptr[j] == 0x7100001Fu) { /* cmp w0,#0 */ - return true; - } - } - return false; + return _asm::IsFramePushPre(*ptr); } - /* vsnprintf(buf,size,fmt,va_list) prologue */ - inline constexpr u32 NvLogVsnSig[] = { 0xD10483FFu, 0xA9107BFDu, 0xF9008BFCu, 0x910403FDu, 0xF100003Fu }; + /* + sub sp, sp, #imm + stp x29,x30,[sp,#imm] + str x?, [sp,#imm] + add x29,sp, #imm + subs xzr, x1, #0 + */ + constexpr u32 NvLogSubSpAsm = 0xD10003FFu; /* sub sp,sp,#0 */ + constexpr u32 NvLogStpFpLrAsm = 0xA9007BFDu; /* stp x29,x30,[sp,#0] */ + constexpr u32 NvLogStrSpillAsm = 0xF90003E0u; /* str x?,[sp,#0] */ + constexpr u32 NvLogMovFpAsm = 0x910003FDu; /* add x29,sp,#0 */ + constexpr u32 NvLogCmpSizeAsm = 0xF100003Fu; /* subs xzr,x1,#0 */ inline bool NvLogVsnprintfPatternFn(u32 *ptr) { if (HOC_UART_LOG == 0 || g_pcv_cave == 0) { return false; } - if (reinterpret_cast(ptr + std::size(NvLogVsnSig)) > g_pcv_cave) { /* must sit in .text */ + if (reinterpret_cast(ptr + 5) > g_pcv_cave) { /* must sit in .text */ return false; } - for (size_t k = 0; k < std::size(NvLogVsnSig); ++k) { - if (ptr[k] != NvLogVsnSig[k]) { - return false; - } - } - return true; + return _asm::Ignoring(*ptr, NvLogSubSpAsm, _asm::field::Imm12); } void Patch(uintptr_t mapped_nso, size_t nso_size); From 19f040ece1f66be513d6224809859d8f368b2674 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 15:13:17 -0400 Subject: [PATCH 101/205] =?UTF-8?q?=F0=9F=90=88=20has=20told=20me=20to=20c?= =?UTF-8?q?hange=20this?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/oc/pcv/mariko/pcv_mariko.cpp | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index c1359830..a7dcd47a 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -42,8 +42,7 @@ namespace ams::ldr::hoc::pcv::mariko { DEFINE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); namespace { - size_t g_nso_size = 0; - bool g_payloadReady = false; /* set once Hooks().CopyPayload() has run (see Patch()) */ + size_t g_nso_size = 0; } [[maybe_unused]] static uintptr_t CaveReserve(size_t count) { @@ -51,7 +50,13 @@ namespace ams::ldr::hoc::pcv::mariko { } #if HOC_UART_LOG - /* Redirect pcv's NvLog() calls to UART */ + namespace { + struct { + uintptr_t vsnprintf_addr = 0; + uintptr_t nvlog_addr = 0; + } nvLogCache; + } + Result NvLogUartRedirect(u32 *ptr) { const uintptr_t mapped_nso = reinterpret_cast(nsoStart); const size_t nso_size = g_nso_size; @@ -108,6 +113,17 @@ namespace ams::ldr::hoc::pcv::mariko { R_THROW(ldr::ResultInvalidNvLogRedirect()); } + nvLogCache.vsnprintf_addr = vsnprintf_addr; + nvLogCache.nvlog_addr = nvlog_addr; + R_SUCCEED(); + } + + Result InstallNvLogRedirect() { + const uintptr_t mapped_nso = reinterpret_cast(nsoStart); + const uintptr_t textEnd = g_pcv_cave; + const uintptr_t vsnprintf_addr = nvLogCache.vsnprintf_addr; + const uintptr_t nvlog_addr = nvLogCache.nvlog_addr; + const uintptr_t helper = CaveReserve(40); if (helper == 0) { LOGGING("NvLogRedirect: cave unavailable (cave=%lx size=%lx)", @@ -580,7 +596,7 @@ namespace ams::ldr::hoc::pcv::mariko { Result InstallHooks() { R_TRY(Hooks().CheckEnabled()); - R_UNLESS(g_payloadReady, ldr::ResultUninitializedPatcher()); + R_TRY(Hooks().CopyPayload()); auto *data = Hooks().BindData(m_HookPayloadData); R_UNLESS(data != nullptr, ldr::ResultHookDataOutOfMemory()); @@ -588,10 +604,14 @@ namespace ams::ldr::hoc::pcv::mariko { R_TRY(SharedClkBusInstallHooks(data)); #if HOC_UART_LOG + if (nvLogCache.nvlog_addr != 0) { + R_DISCARD(InstallNvLogRedirect()); + } + if (forceVerbosityCache.count != 0 && C.pcvLogVerbosity != 0xff) { data->verbosityLevel = C.pcvLogVerbosity; for (u32 i = 0; i < forceVerbosityCache.count; ++i) { - R_TRY(INSTALL_IMPL_HOOK(forceVerbosityCache.sites[i], ForceVerbosityImpl)); + R_DISCARD(INSTALL_IMPL_HOOK(forceVerbosityCache.sites[i], ForceVerbosityImpl)); } } #endif @@ -605,8 +625,6 @@ namespace ams::ldr::hoc::pcv::mariko { g_pcv_scratch = mapped_nso + nso_size - HocPcvScratchSize; g_nso_size = nso_size; - g_payloadReady = R_SUCCEEDED(Hooks().CopyPayload()); - MtcGenerateFreqTables(); u32 CpuCvbDefaultMaxFreq = static_cast(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq); From fc10a53bda81810b4693a1f729b88b34f94440d5 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 16:14:19 -0400 Subject: [PATCH 102/205] refuse to adhere to SMMU for BPMP-FW --- .../Atmosphere-Patches/diff/secmon_setup.diff | 22 +++++++++++++------ Source/Atmosphere-Patches/secmon_setup.cpp | 4 ++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Source/Atmosphere-Patches/diff/secmon_setup.diff b/Source/Atmosphere-Patches/diff/secmon_setup.diff index 5b796e03..c6626484 100644 --- a/Source/Atmosphere-Patches/diff/secmon_setup.diff +++ b/Source/Atmosphere-Patches/diff/secmon_setup.diff @@ -1,18 +1,21 @@ +903c903 +< void EnableBpmpSmmu() { +--- +> [[maybe_unused]] void EnableBpmpSmmu() { +1200c1200 +< EnableBpmpSmmu(); +--- +> // EnableBpmpSmmu(); I REFUSE 1221c1221 < const auto target_fw = GetTargetFirmware(); --- > // const auto target_fw = GetTargetFirmware(); -1223,1226c1223,1226 +1223,1233c1223,1234 < if (target_fw >= TargetFirmware_2_0_0) { < /* Set the PMC secure. */ < reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); < } ---- -> // if (target_fw >= TargetFirmware_2_0_0) { -> // /* Set the PMC secure. */ I REFUSE -> // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); -> // } -1228,1233c1228,1234 +< < if (target_fw >= TargetFirmware_4_0_0) { < /* Set the MC secure. */ < reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), @@ -20,6 +23,11 @@ < SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); < } --- +> // if (target_fw >= TargetFirmware_2_0_0) { +> // /* Set the PMC secure. */ I REFUSE +> // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); +> // } +> > // if (target_fw >= TargetFirmware_4_0_0) { > // /* Set the MC secure. */ I REFUSE > // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), diff --git a/Source/Atmosphere-Patches/secmon_setup.cpp b/Source/Atmosphere-Patches/secmon_setup.cpp index af6c3ed8..60949a4f 100644 --- a/Source/Atmosphere-Patches/secmon_setup.cpp +++ b/Source/Atmosphere-Patches/secmon_setup.cpp @@ -900,7 +900,7 @@ namespace ams::secmon { reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH39, REG_BITS_VALUE(0, 27, WarmbootCarveoutConfig)); } - void EnableBpmpSmmu() { + [[maybe_unused]] void EnableBpmpSmmu() { /* Define the ASID contents. */ constexpr int BpmpAsid = 1; constexpr uintptr_t BpmpAsidPde = MemoryRegionPhysicalDeviceSecurityEngine.GetAddress(); @@ -1197,7 +1197,7 @@ namespace ams::secmon { reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); /* Turn on the SMMU for the BPMP. */ - EnableBpmpSmmu(); + // EnableBpmpSmmu(); I REFUSE /* Wait until the flow controller reports that the BPMP is halted. */ while (!reg::HasValue(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP))) { From cbaa61385cca38e5a045ed2412ab3ec13fab2468 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 16:31:41 -0400 Subject: [PATCH 103/205] Revert "refuse to adhere to SMMU for BPMP-FW" This reverts commit fc10a53bda81810b4693a1f729b88b34f94440d5. --- .../Atmosphere-Patches/diff/secmon_setup.diff | 22 ++++++------------- Source/Atmosphere-Patches/secmon_setup.cpp | 4 ++-- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/Source/Atmosphere-Patches/diff/secmon_setup.diff b/Source/Atmosphere-Patches/diff/secmon_setup.diff index c6626484..5b796e03 100644 --- a/Source/Atmosphere-Patches/diff/secmon_setup.diff +++ b/Source/Atmosphere-Patches/diff/secmon_setup.diff @@ -1,21 +1,18 @@ -903c903 -< void EnableBpmpSmmu() { ---- -> [[maybe_unused]] void EnableBpmpSmmu() { -1200c1200 -< EnableBpmpSmmu(); ---- -> // EnableBpmpSmmu(); I REFUSE 1221c1221 < const auto target_fw = GetTargetFirmware(); --- > // const auto target_fw = GetTargetFirmware(); -1223,1233c1223,1234 +1223,1226c1223,1226 < if (target_fw >= TargetFirmware_2_0_0) { < /* Set the PMC secure. */ < reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); < } -< +--- +> // if (target_fw >= TargetFirmware_2_0_0) { +> // /* Set the PMC secure. */ I REFUSE +> // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); +> // } +1228,1233c1228,1234 < if (target_fw >= TargetFirmware_4_0_0) { < /* Set the MC secure. */ < reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), @@ -23,11 +20,6 @@ < SLAVE_SECURITY_REG_BITS_ENUM(1, MCB, ENABLE)); < } --- -> // if (target_fw >= TargetFirmware_2_0_0) { -> // /* Set the PMC secure. */ I REFUSE -> // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG0_0, SLAVE_SECURITY_REG_BITS_ENUM(0, PMC, ENABLE)); -> // } -> > // if (target_fw >= TargetFirmware_4_0_0) { > // /* Set the MC secure. */ I REFUSE > // reg::ReadWrite(APB_MISC + APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0, SLAVE_SECURITY_REG_BITS_ENUM(1, MC0, ENABLE), diff --git a/Source/Atmosphere-Patches/secmon_setup.cpp b/Source/Atmosphere-Patches/secmon_setup.cpp index 60949a4f..af6c3ed8 100644 --- a/Source/Atmosphere-Patches/secmon_setup.cpp +++ b/Source/Atmosphere-Patches/secmon_setup.cpp @@ -900,7 +900,7 @@ namespace ams::secmon { reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH39, REG_BITS_VALUE(0, 27, WarmbootCarveoutConfig)); } - [[maybe_unused]] void EnableBpmpSmmu() { + void EnableBpmpSmmu() { /* Define the ASID contents. */ constexpr int BpmpAsid = 1; constexpr uintptr_t BpmpAsidPde = MemoryRegionPhysicalDeviceSecurityEngine.GetAddress(); @@ -1197,7 +1197,7 @@ namespace ams::secmon { reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); /* Turn on the SMMU for the BPMP. */ - // EnableBpmpSmmu(); I REFUSE + EnableBpmpSmmu(); /* Wait until the flow controller reports that the BPMP is halted. */ while (!reg::HasValue(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP))) { From d06479af69c4c524b1c38f2b4c11ba2a2c880141 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:08:46 +0200 Subject: [PATCH 104/205] remove hoc-mon binaries --- .../Horizon-OC-Monitor/Horizon-OC-Monitor.elf | Bin 17096056 -> 0 bytes .../Horizon-OC-Monitor.nacp | Bin 16384 -> 0 bytes .../Horizon-OC-Monitor/Horizon-OC-Monitor.ovl | Bin 1011772 -> 0 bytes .../switch/.overlays/Horizon-OC-Monitor.ovl | Bin 1011772 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Source/Horizon-OC-Monitor/Horizon-OC-Monitor.elf delete mode 100644 Source/Horizon-OC-Monitor/Horizon-OC-Monitor.nacp delete mode 100644 Source/Horizon-OC-Monitor/Horizon-OC-Monitor.ovl delete mode 100644 Source/Horizon-OC-Monitor/out/switch/.overlays/Horizon-OC-Monitor.ovl diff --git a/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.elf b/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.elf deleted file mode 100644 index d0cbd027e9e47d5243d3bfcda3bc2ad4d07f6e32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17096056 zcmeFad3aPs*1%oeos|R#BoH>q0xE<>_9U|8b^?lnh(bFqIFp2cEOEmfMAHEmW)RKQ zoGWgd%Gbz@B6*~egAxy=gHIe zR-JRI&Z$%9oH|vvD4TNmB~FJ!MgF_C16XymVhk* zTLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL z1Z)Y|60jv;OTd_C16XymVhk*TLQKO zYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y| z60jv;OTd_C16XymVhk*TLQKOYzf#B zuq9wiz?Oh50b2sL1Z)Y|60jv;OTdGrF3;FlvM0gNsC@}`reOK zwG*y(8bMcYf0L_^zuDE--|ID}FF?7{rq(y`o6&Ew@j$F<{LiJ64Lwe!?4&I2>U<;3 zq4ac>_K)c^CXdMZx{JE)g08B_-&IW=+Qs}6zAwMxx)Cc6bWsOeyU6p%q%B=k()Z@` zC`VW@XS$}f_x;N0`{}+dH9yh6Ankv~U*!ET&n@A1~4d5uEEIID^7ClYfDea*0v@3!Lc@oRwjmfxp0Mn_|593mh$i zb8i^usmVX@+f9>=%3t7&j^M zcA(cUOmE%)Lhtlj=lWM3q4!}2dP!4^*&XP`h3P%^ztB6_f!_TQdN*{Sckg85(hl^F z0WbV6HR)M8_Dv|XM)WJ98+(BT2(6xeZ?JQJ1S{-LX9+%P#`e6jqlrfJs zs*qnWO*3LB-;t;pL3t0;^g#2;pF*3DUE{7f=<4ZL(FN^kDy~(bQ}4%U#_?p$I5T7W z3mHf5-+S4s&Xl>YJA7Y;LaC8*8P~LQ*WV+5XJ-7h<`}Z_F&^HnX}a*Z7aftYlRi6Q zynC{x%}{8w_hf-l4qT=;U0(rgnsT-VkloxU%{Z1I?QVUcyzTzILufbhF70&?rwSyi zx-&E0t~p-ltPz=hhD=hsSu$;(@2Y9%{i!ahu6I|>csfzljplc6oT|Hv@*dHu?&Pge zHE;90G)C2VsH=-tb!&N_jhs&pQAQDEr}3*_V{^R7q8NR-kG_fSdFktNbkQB9bSFFo zUH$xyIPacNt55B5Q4!1)n4a~!}q%JUcW=NN4T zk?+Y{C)X?lw+P(3Ox$=AcM-VmXr+H`;wGEzweUQa{{DcC_yF80a5jSbwuu*O;=KT# z1H6Blcs)$Kzw`Y0=}_H|#131)ONYN9@Hg7zFTunc3V-F`ePH7CHt}}wJeu|l#`Hz- zH1MW?=P~i3O}tCMYkL9@GDIGo+kckp6>zwxGUAa2>j!P`88)|y!V3WU_=kk%&4!C`Ma68 zsw(q*UGz}&PV`FjC;3XPrp%eriv97(9Fg%Xru~Ti%#n7H)9tj?f;@|&+{`~qPv+7; z(UVf@?r=KvN@ub;zpFM(HlC*~^sjCM^Q%FrU2}k$k4-(OlJua;Hx}}oazk?AyW7E?EFd6J&q zJ>R&8=k~2ayO#;~FZ!7gt8_PTOR1Y(lB{dD<{Qg+es+B_aQ#iVyBOzc=w$;}MITbs zU|pq8F{*ja)CL3RG~rf2uNc0E0rxs}bDg90hXVP=27LF!0jF`JLv1#Bt%}uy$25!A zrdaTQ&g*&LzYG4OuTL>nN2}edUyn9A`&HdLl-=^m6yp=hZha-%xM-8Adz-Q=H%&3R z#i-p^ZHhL!0as61_QokjJ7qZ=qmA|#RNY&Y^;kc}sG>}*k2V4uRb4Ut%iNxC6wto` z+nq)U{hJH#52d?w?_ABek>?#nF8UXqi;S7f#UEdB`WAwl^?trFjlK+d-)WSBdlT@h zGvamc`EKJDo>Z#(JLT2FC*zWx`FNf7QT!1l*0ZA#`>$<{Jm$ zZ)c;^7(_cY>r(afa?QwcM}cR_eaP=D9oqulP2jEmd%p29d_DGer!gFySHKDCnsKy2 za4a2bd)m^m*T7i}&bZI>jnCjG`*Wv}4bES|39Q$QPYa^Y@v+I`<9TrAfTMkxZ@B1N z!Iw^B065QqHMcMhZ(P> z;J%6OG(9%O$fU2$k3}1qe^7NL(3^WO-*||!c?X@wJm{JF;>AW0|16+i@eN`xEc^cr zW812V!WE9tH7m(pXX`rNx+5u z4?LB_Zx(Q-t*VaKtHy?HRg=t%pWCW*;9eEo+^QMl@?)s)Y3lT(4;VviR4?j z;YaGj{A61Ed`Z2@Pn_^0HapBulEu%b)SLXYyWvOb!~7_VpAV@Q8@ZDipm&dzoG zMKR;DoqCz;-ha7`)efn*=FDSFZgbAOOTEmQ;QMalXn7av!}ET(+w?7U)E80zNA&H} zITLmDmfKkMQ)o@#NYl1iA-Zm9oXn|8%^l!8tPZdyvmrMtA{Q%e$Vr?;t9b0e2i8D_Y(T}vSWl^ z<+#Lnh3BL05y1U?j8*{Wg+|XH^!{|I#J+9inbL1-EVj~bnJY_xdled!mJij_pO|9V z-M~=btTFkU_($Mw1bd+P=vcbt3EQmcz?ptRjl@r1B7VAJq&5;b%U=9e zVh?n%060^}E_WMqt2$91)-jLUbscuuk2@C3;y@i zi`=`bQM%GDvBoEV6mUNupZ&nem}GiK>ggjcF-+asD&u4EQ^5ELKVJa%9B>bLN9f+9 zONko0KOcu3z?tLlk;XWPjSc&kzgw}% z7V2xU!D^0X^vsvI$Le>=BFh)PNxj5O>F;VrX1d^8<1=!*HNRh>-t_ykG-KN~C-vd^ zJsW)Z*+~8K(67=oV}mC3;rTrk`B7g<{R`6mNX>|EkUW9qJ3HlCzH<%ro2W0!(2Seh zQg88h^I%KQ9;g0g>I2>2&-A@v{(4*dJwm<7-yZnedd|nBd~WeqM!m`3i||(^F-Vxd zI*Y%1sJHAF{0)%$i2btoyOny&e!*Xr#7YtSW$`zk`US{O-4A~mQXl5;A&b94>P3GN z0>sxjfNqh%K+Qg7J>4Z9%Y6tN4Iof}I%u}&7sy!KP!%9%0hs@HysUdh^WZ1?GEOo05w?m5zL z%U=D5b-mcDROkiCb;w#hg=dmKtnpI(KJpU*)??b4P+ezoDlh-EZ|C>qW%fC`wmNp53hQaS zWe@*N{oTkdFejDuyTcc_K>DcagzvAZ!&cU+<=MKLtksB&v>4^daH?Gc($(&=pySBk z0_Dk!(~dUfD^LH#g1uD}dX0;M*XIh<<{0GjpTxK;_Q$A-Z}^*kx?pd-y8nqSH#AH< zsQT|pRPn14;Ndqt8YbTPlY8&BM?zP~`gi)_WqZ8~zn$QCGBNkJ56oQ zXWo`P_|p}I@YqBStJR^#-D;FQu_v+Xs$VlMJ%Mp&Dm~BXFmqD{jBQDt+WcGeGSAt+ z6}~)IF($hwsm)dJm;_(ZyjLr=Yc0HPM2^8Ew{bAg!Cv>W?Ddn>%Y5miW$9|_6vK?G z%VoY;cEN+5Neurx;7q%XU3l5F3zpqpCw77Ums8Ignm8^+5B@pdxSQvOOo^|pIG}+3 z6a#k;aDSz}fa@atF!AEUjKg-;Vgc4-636SZN>h?`1|+hxGw`iXWW;ob-KL za}Pc6*L-tNW>R`j+O_=3jkMbUA5(y1o!h7@r|#7>!|ZFm%yY|MUI@QUz>NpaoZID2 zU0tPFF>!;y{XE_p37qhek{(6utQl5c#lBf`UJgBx^M$~fa>ix_u~k-I#r{}!)D2t) zaOVLhdtdLB^wa~N5dTVFtAr2B9yG#-1Adc%n@8Qos_uG~Cv1nBB)0##9f}9elxZBJD zD;4v6K~Uf`ot8`JIFhto)AX>xaah z0pd+lhvrBOYU$9Qgb#ewE#OLw^~Fc#Jl(zZBd0Nkc4dC_AtqJCqL!_ZvA6Wy~hkpf* z#2oSDbVeYnByu_h&{d}}=ZiZjC@WVdpUPN>*jCrjdv+q_Knk+Kzu?DuXbxW z`5gSleLOEE=bfhdw90;R+j8_@1Aj5^%?zVu zjkcA+m*GM)Vds$0d#z_7`+fsI)nW1XfW38PPOxDADms!^So5L@AA4@WcNiwzE0V!(S1=xSlm3`{U zBPUWT`<$7ry|!j)cJ4lG(%^2&gMPN{Q$h zs~^DMxPc2&HuO`6Z+}U=&RH72_?`4z|u)n`eVtZ@t)N;y-5x=9pX|&r2(63aL zp(iWv%s%|ddZY3ahY$Nxo131YA8U!L8H&z0v6b!k_J|H+mSv8`=>wIgiM=c7 z^An%qyC=lI(n22NwoI67RIP_Pcm1^oIOfAp{t)> ze@FX+oN=hEQ;QwUbHQK!h0`Z{=R1v%NBS?k>_+cIZ<@XjnR+q;KE)P_eQaV*1UVz% z2{?RbW@t4EoQ^gUJ=JCIi+%;sD;0&kXDl;{`s(}8Y1!*12B>S{H|ja&rrFQ(47{~K0kCtA2P_lD`;t zvM$Jpc~yqb^7c@kBlti3jb7&J*1EGhYr`n?lJRCBi4EsUms^6|OS5)i4i4MM+^CK_8!I_l(~Ah9!yrAbmViFpZ-GQhHh%J@Dl9g@SI}) zMff>9UKw+Rr}3J^a{WyQoQhhDH?4`Z88p-+FM56g_u zW|75f@NUY6_C%%uVhfR}?3s&P7ycOXdvC-Vn*Oo2s(lEUeGvphbaf?ouJAbAPMPLR(g*V1#P}Rz zT*UVjus<;exIFs$yYE7t1Lj!7wk|vw@@!_FSIz0JUw%Ba<_PopYT#sCWsDiyCuE#w zLgyH^G+OoD)r4PIhkT{{AboxEA7azxtW-b$yMBi+hzU@!%_?Tq>yjL8)9n7z$^fdhqY*G+^7&$X= z5MStk{upE!p?^NKPp!JNrbg^Ee)y!&WNcao3QhbuzV%9In!YF_U9bKH%~og@Lo*GU zP4rp(|4#CS!x@KDdCVbvcC#thzW#rlrPgUgb#vXWeXQu1-{i0uIpwoaJ7#q*^YaRXKtQKS5*}noA%luj6 z1*Tg;yl! zzR;$!nVYqpulLRzFjy_=JX9@V-CG-I%GJLsQN~Nx;`fk?#7NEXE4IJ~4?n=0JRfAt z60wP5i<)>2vi>>EJn1-YN8!bdOx}YRnHSB>i)L(8Bz`%=+z?*>O1;eIis}S?E&Ec> zBfAZO-uk=zK2^e5FKqbd$m^PI=jmUg|Kgi-y}k9rmn!2qo}W>DIIirSIf1`2m&(n? z_b)=<3pcC9wC^d6(Q?apZo*$MXBNLN_L6gRpDrzF_X3wjY@yze_($w|vVZ9zr`Yo> zD;`Sr-_1KQK-N31NKBOMUrbrL`7UFc?7x}!Dkt^kcqjW8N%P6wS3Ms>WkJ(OHdC_?$-1U@cl%=@T*h*s9gT%s*5G$P~KHTE$SK2vBdGxgV z_a1Qd%i6nWar+DHp|KIZIClYG3)+7NUwQCMjOKZO=Y9C+a`?UpSyWP9)gJQvQ~I`^ z`FN>}X|jI;?G_noY%c3yDVMY2d*4vLhiLn4v+eUsZ#t%9B-?pm~{y#(7(hCHRMqG(IDRST6TCt7ujC;70&nN#{A>x<*BX!Tz@RrkC9t;V*a zXU^HgRnU}p)4$v4%i!4&s*JmXb)n)M;K^C>`iso1=yavem3@?D&YGC?;GQSZn^W7O zu_@8|^C_w(N-1MYoHAmP@ICLv7%K)leXo_l*L#;3v8=}qvW8ZUynpoeI(@x{DBpnV zl+S9nk3Z@fr*E)>yqfZM&uAE`KNRhq8Ksu*iTD?>FJCY(^ zr0Om6mGK5`A7>ttAE~W&T-X7>V_$pvYfTzG{hveQpxD_tBlTC5({}~*8Zx??`GuO1|FOzmhRmg1-6eJX{6pC<@gjS97Q27=8Eoi!%2*@!XKWf+ z|E055o(CR2d?q=-3i2rxvB>riI`Z{2WlU?DmHXUNDtBAa74-+YI_eKzlV5+YL(M$& zxH4K&c~5rKZ@6Ch0?eNWv9qh`>l@X>bvZZfy-j(>K=%)nJr3Q|#S?Xi*LGhwT(4W# zFPGSUrr5mDDph}SmNJf(DkJoTs&8&l^{3`{t$F6mzPQ3Pb$j|3%)ijSxV--A_J;o` z5A-UkUc1!XFDV;CoJcN#@qZ#8dQAmUdT?}I>oj;R&(;6v@{JG3? z(eZ3#dT^Ci{{rhPp&gv7>aK@&)m%01_>(f8J^fEy;qrM~)L3~AjdvKKJpKwC#*37n zU|ybhQjKL_y>UtPVEyDfT0ME7+FqlF=_gvW`WS5Mt+W$dt>sp|t+Ly6EjQ^MmAw|( zlp&kI>&ml&{+7|-re~}^-Tn&WOj~zCKd?`Ym40^iYPmNfr!Ef?OUz?!D}A9KtAM#i zsc|PuRCX+MLeTM^4tXSJwP0JW9{&?^KTq8rJQeb!A%lqAGvHA>6`Q>Xn8KebB_k8O4zT%x1B)d5^Li7D#!^`9K(l-pDAD8MGxXP6@Im_MCJZrv+~WJ zsm9W7<0NQ2xb&Xf2WBMaZr`lN?Z=Pp$B*GJDviXpZm*53~};#r|$^kEIu=mTRn=e6kqxSb;Pt4mscg|H{9tq{u-ki zw{PpMzr*iRS0BAH+Vqc&IYnvuSJ)xeEETDN^YmtXWgRe2FYm1k%m0@4GKzv}> zS1ydP{D%0-vaqlG0H5;Z(nam7T$UdVl%4aHuMnq`A35tQH}NjM^4$);asy=@edRjd zJNn9Jr5;~NUZtWu!}5zyQx^7>6%k+Qqb$h07M>hoU->v?S_fa*hOcA|(rvuyulkz4 zavr|&Ygb=<<-GP-LP<_Q29dx0}AQ7W?%xUwN?K{d?bEw4gl;Us;IU#a9l&SC;Wy zG){R=M5%5ESfg%nW}Ck9N9N=k_{zJUS7T43W9NKjKmWc@EMHmv3t!o^A?z!gWA(6~ ztPuYg@s%C@WLlNV6<_(*g{-;mw|u317cd`R8N?o6@qp7eeX#Ofd(AmtnR~U<$Jx$W z@m-Gp#aAZbPsLYWEPe=IiEpjV_&YpN@+? zqdY?+@lzZ`&7oYQ$Z+#H< zm48&(cViQ!-4BVk#TJ(L4xbs|S$t*2)8~9;5@QoZuEfjOEC%m<^hzVeG}EnivxlEa71tX+n$#4fao9%e&V{9#9bDY^SS z>xb*&E8oOt{$IW_P^~;`#UJ1s8lL;PudEyOKl{qxJcTXASEjGX)pvOqTYTmF{6>7` z2Jm{qN204|)`yoNPkd!w6m#b?<*A^pH2iWg?TW9IIASt$qa6PB<14q|D~p)t;)8B_ zO8HLUE8h(J%D@m+_c*k@L(cii9hbX&>Hh!rl}(g?&Ahy1ks6DCZ0x;$u<0M!6REux zUnzc5d}S%^6yYn2R;cWo@s+FRo%5B!`_K8xhPhUsHoj!}${Ogi{x^MPJic-vzOoa( za?!AJzA^xe_{u)RRdzIdZ|UGGZ^RGoK5fM)zx0*AhDY(0^MMKB8&{$?E_~%+WVMj@ zZ}62GzH%sYTzsYI73=7V6RZk$mi1j7cO%`waU$OMqi-RB@Vi#5ZTCOkG<+ zJNV;QY3EdLOV;AMysT&Y;*aqM+2q?QqG*S;a77C3Y#*YQ)Ulq8v=j5%xpus?!#;S0 zb98ZOo~_(_AGHMH|iFDw3$*x?rVxfy=GqaD_|6-l&1PNt$e?XW7JHuzd5lagS8^pyvd*WEv;=YJN{& zpyl>u-By{5AACT04iR@%_ND#hv_Al!=~bSC2ef*=5nlXY!jz?l@V|#x5AH{AE~fwD z%kHHAy&T?|J;FQ$!aNlH4?H{`=Ant-|A~iQvFa)xJoLhz1m6pJo(}iFJly{T`X3DU z|0RC^ME_3-ztVr!F7d>Y(toe?f&N!5B^N;d%aqms1N8p@{pTAlGygd-RvG`{n`POX zx|jU?wMHoQF~(1HL2|H?laV}Z7sgO>u?@3Ap7o5q){iXN=q#z4T@? zf0F8Vr^`G~^}hm)#Cfg6l&xlNB%xJ%DdhQ`yoGll_l{@ei2zv8~$I zANgck2f00oD|0*v?~=FM;;O zp~ASlkRz^vvw`M%FAZNJ>mpa5Ea~s}Pv+NuRnkds$|I*$;5I_&ehaw!AI~?welp(} zj$io@xYl35mHh&4AaKmF)btMRNk6LkpKI^;)U!WcyPbZDkN^C(@%mRYl<^3>$l9oi zIDMt~JoqZU+VUYMSm*uO^dqVM)M@yyJH>yc`cKfG5c#BU*(W))DZk!$CBOab?rK*FY7#P2z@#D zE0<4VsWR;6abi)4%U0nN<@XQ#emkG*MB>|r$$Tv`ua=4WjC9@z5S2OWPLWo+6QfD52d~iPx4))=u{))`5^5* zgHE-fQ#v{&IgJ21^-wsTa5FyAU(uYW(U10q(9X;%EOws?Q+JvoVl8Z-aGQn z=~X6rmHrF8sv5z*5_V{s)cbd1-Px*#6I9oH4So^0k9`}q=bw_xA z4Lu57ppLkgr|OyP4K+Wp{F!vlx843FdOT8%J$!-Mz5hP#wMs{H>xZ=W;s`aCSfowH zFr%Wk9@slh-#0+{jxdM6h2ERQ7$>2B@d&;{=KW>p7hb52TmD(l$;Y1wBx?re zn0)FYHFoBOeES9cLZ`F!(c!F3hpVxVLYug%tz7S|t3BiN9nk*~`m1BK+%2phtFH`s zgl>bQkD0sM(E=^j)~`_3)X>{3+e#Vhsxk1_=AI)t=M?{6C=0NT#>Tg~$rni3Ta=|= z5gIGG^&;%`>R79driVMW(a-<#f3?xiUlVSl7J3e|jeh>;!flv)BU`17e*Q{}8#l^(Z#At1^$hk~2F@m6RLgsD6=G}J@@;?)seFT`iGnH}d zbF@7~tS$N6YV67xV(manu6`BsRAP?*%eSogqw;+W+)4U)g1lrUG*65t2gvUe(g*r1 zHZaouY}(hb=?^h?=fFqdqr{q1)siE9$wz`$`BP;a`TdH`*nln22x5P4xeD7w|F$#c z9ozX1_O{{apKM><*Wlpm8w}SU*#zoYV z4;z`@5HfW}>IK%F=k!HMY(jgZXm1Q-R7887PVZaE8nEr=;#~RWVP&DCOQ~bex%N&? zW&U9YJGK|op}pjAdqs^uZ|{8Cdw}-DwmH{L)Gt3x&KtRw?+AI&&)Ut;EzBLeBQ~40 zb_MINHpi2_^>pmtBji{|gBQ`$JY<c*gTOI0ADOFtYdFO#M^Q)N^*W;n*3^Ch8;YO{Bd)qM!Sicjefn zk;qH-436LfchDyOyN!6Iu{}spzPzlkO$o`{km0+Yd6f zE#25h$InO(KIvoSYrz)vB0p>8)~#;e9H53|N> z0A?t5K=7u8>3qw1F6sY0X8-Ro`~P}}{s%u&zHjJ%>e>EV-_p0T){@xua3%L?k=J3p z!*{6X`Y&yaq7Bh`$?>Go|3mbDSh(F`$3vb-zmL*y@gdcm<(Wf2{7tVwEjR1MZ;Y>!ZWfHKJu{*8Q?>{D%^ESYw`noX=s4C3%|o|`yp zB5S_Rl<%jUJ^b2o%Bv{Pru-k!FxLV1VIvu1(fJa_{}G>-dw}O1J7dSKgva=i!}MI* z$YqSa!Ec19`vzT^1Z?ylwcP!@KmS4OIQm$zd&DqZ&Ouy=A37L@JqYY{U`6*L?QzJ= z=L+j%r0ikJ&d}E!@MWI0qqAS5!*cE+o&0|%`aGVw5_yl|-AR2%c$ps~z^`R4iVyJe zE9>!3(+8Vpo&S}igG^gl4 z9uBQ}^xM!Hxz9+>0Czn9D`$b^-k&GAQ)evaE>95ewy!9DEsgWTclIP-%Y7*8p71@h zj2*xo_n@Xe);r>*da?7WyLJ3B3s2ucS|W53q^Y%Ij>;PUVc4 z@Ga*^<(!C|$(Qr?a{p0)v!u!CO3&=d+L72jNGu_+((a~er|<8q0pv_nN(%85eG`14 z!@1Nwzoa8Lk-Gn>9g$PyFCt&rpHO_aCvq;trlkg0*Ki)fmte`GC-Y3=``SjQuNm01 z3F^o})^Bo-HNbf?6{|M4&?oja+O~4`M)Igt%ZKY_3o>&a=WZi8pWY(gXb5(7v6-I_#WH^g1ze0Lz(wQiM+h%bkSCo z+bm|8)BH zr%9PsFM3g>dhYt#)Qgzb4>>~<(Th@aBz9TaEOJJvVrRDSyNO(OQA2mVGy1Ri7ut6I zZqa`^lUtrSM3=MiGDeX*fYJxCw+AnogA_RdwfSn`*7HrY#1Id8hwH=F21~$XOWCfxx0W+V9{zJ@*%_Dcj1Oa-5f5Lp$U{D#$mtWwZygu5+i1-a1JcAJDGh>aGt3zPwn@zV`Ibp*>@~(-63Qmzwtg z)mD{XY@U4=-AG%eYSK7!^WhJnHNo-R7pZ!iWA|MF_fA0f62|Uv`qAdr)R`>#1tCWU9Yx zIpeH(7~CCGnMdI6ovMua;3{z8vo^jdTSqTzzgd@~b1Jf?62HUQor-GYFY`fUnNc)E=R1LlKfL8IjBUyK z3C^Bxu5%b~Ls#?T;I>|RLs6Li9m-fhIcEuh@2yvR!|?YhV-DrS9KiS1%e`Uv70S4Q@?b$9 zo$;y_+8I@Ro6BD5uPJ97fbXL>RfXZ#D&tBMzOP=q)uR2wwt;$Zy)u49Ib#8QU&bN~ zzeyRBDK~SI1^x64zWX)%|GF|JQ7-!f!EOC?cT*UCyfShqXH4k-d3v!UEPv+7D9RZZ z;Lp>`9YZWSS2FuTqASa>fPt481xKE?=XJ)4hd$rtWSDmsMhaDYM2ZQ!nQmd6TD&$~a=e4$zAS zgv(x0#$hSjHbBO&(HuW*C}*#f@wEv%@GPv%vtWTT_>Ra|TmlR}Mc}{WU4EtgV8QwN zKY5q6Kp)jtm)ynd^uBswf~qgP)loCM%*oxFsWrz-des<(y=(dspG_i8`j^w8_g8#7 zmhaHH3(N>)D&wu+=GQc1_doc_+!555`R2U%|3YyKkUE{ zt3>afLTs+VRPwfjIz7h8ctO z@aKKy@TK54rLSZDm%jcT_*1j4sX1PHEwa9@hW(?I`&^FQMakUfW_}-Oeb2lI|L(@$ z`2XbewIau&XgBxcS>Ivalwf`HyPmpz&c5c|cw)n<%7^L)3u474H(vW|^kFOd!25pk zN=?WuxGhFs-piUlq8km4VWv;K3f*X;PS(6jsTccpuzM4H4%EjC;5JMTde*TwB`YKupnL+zfe>%Odkn7bN{c3_9_3% zS(D!yqw|E`ht(|1{EkO_FPtp_4@|mDNb(T&ieJn6C4}tVxf8;EU1brYdtQpO|ID+(L7XF?x$<;S)OVIn7G&-9! z4nZSh0CyA>bk^@aOCwQF2FA4A!%|fG8Xe8Lo1n8kMlW`cq09@{~Iu-j~Q>ll$VdxNecUd z#A_lW!K>iij04!`k@xC`k*4ncUf`}_t;SrE@`rhs`4ub-x91$CmkSL0XQqz_=6>Ey zAH|-H;54{L$vkSjN8s+U%4B@+;N6TR%B-@c@=^LN0<(&KqmP2SNZ!|2_0{V}={L%I zCANVvmijron{#lZ1>@d2O805(;XvsWZ@1v50JfgBjrEN#w)cU2mHX5!`8BMs^fGMl zRMuR4TVVPGxx3TH-+jybx8LSW%PDjvx5}C<@*VG5zT;*7>hdk`PQHU3`;%q6#UFgR z#p&zVPRBOl$u02>r2h--pRAAW>!X+t;zxS9FVHr0x`Z?R<+D`F5n$#a$!RT_kl0 z`NrWDQfJ-4@@+Er)loM{>b`Ir-?`+jIqU9#?_2mDi@FS{YvrD~6;fy2iO})`c{KXl zN9x{j8z)_I2OZxrvbHm}ah`(lN|w4^ZsW`fsk81%Xy40O3F;E1ZmrwkObB&-O}ro1 zbB=@Yik3Ro2W=~)F3GGr_Bv-Is5`^i@Zf!JasqOHTe4YqWCiU}cS7n`$v0)^?xx%S zq;*$Xo7ByA8(+E3-Br+3Vx9XqBz2{3@hO?ROFkC zAoov%$H8Td!xpJaka0M7H$_XbH4bk{-52a#yX2ea@Hn(s_g1_rb**YZ@duPyJ&7cr(>p z+kaEwkngxEg0iOP4mHU$Mb`A6eb1VH+PQNQZL^RuI&>8>mVKB}8>Sdn^FDS1_n{Q2 zy89?w#+@nTfb|EsGi6zLO^<9U(pl59wy!8)P0v}5J!#7vHLfIb2kGiBX{Vj?EnC}$ z7pE9In1dT%j5hD?l{Nj{;Oyl-2swv1s5(c_0=JBOz=AAQQ$#+XjC_FbeABDu-M#wF zuSOd;h1c}Afb$7!diIqnx-C!F`R;m8h&BC@%T!GhYx)ptdhs*O1Dvckxu*}_Kkuo0 z?Xj2DG_xf&Ng8)6RACQJA_pmV!)F&{!M=Y*!}?s^Nq=SE@;GtW zAlic8#!EQ6EaN>-8?NWUa}lsnMHlOL0Jm`6aD6<#%lOW1A3QxdK9 z9mwzdnW|*$h}t8iEh8Wi*FFadA&iL+mXDUmtQqr zZEhtNILTVEIeqn>=BBrfmMy$ECkU_SW1l|kuGI+MDg1foxb4r>mq)FAV#$*BnJ!g# z1NqVK_%2kxkesHgORKCK80)%1zUwYW9_0yA?r5#zj)aF@oHZktwtFCV#j*F2*=hST z1>2+6=DA$0O~9UZ#rOrU2!9~3?{WXR@S(UXXf*xUkG>tEAADEfS4Euvd`Pvk4kJ&O z(i(*R0c3x^Lm3ywD`RB~cSc2vFYDuP34d2q*`jhK*RnF?tT|Q|UlUs4%zdfJ;plT% zhd1eO1%1DbwNtkXEIuc|=d(M6&;G5|d_#WPm1OeS0H1>QIDBfzG0+~Wi}Yp2|In8J zXDn9%FKd@UoGU4G@&7g;x8<>#F~j9twZ+-B_5Dkgr!W0r@AgOl81oD#yvhIT^7&t! zzGvv$T4YvOIzFf4{5^{7+|1YFr}6o7@ZvQM35^6-w{QTydi3^6cQ-`dj}XYiM%HQR>wqw{;#2eQ%3V zqxC^rmL6c;=Ky}n4q_+nJh_hf^#=1No^s|$#R6}(en9ZCwGUbIr)@U4lJku{U)882 z?;eRIHA^I;0B?*L`8{#wxD(#xx?@@C4arHp+lfy)Sv(f>`EwdPCpH>8i% zi&~=e7kgN19T}S@FJ&ds`bNrR?N`(ityc%f>Qc9kvW3LB#j7r>DJqH4IbT=1@DuW7 z`3@iY-j<9XVk~OsY<1`hiueu!oFKdwU=NEPxvb{3wGN*=OL@^F(`rmO@Z!ox=$ojM z+#+_b&0RcBpUQosMac10`YY=RvD4-5ary$sD6@PM<+6rYfX%B0USKy+c1uaDZmy~2 z4wP!E{5x_AmDEY>zMv&mcW<@IpP_6)Nt}t>;LO(l$h&-Ry(w}XX`6l za?G-RlyRoY{GMFO7nE?H2k+$C8&_&0bSaZLwSqEJ_AT)yUIzO40A-gTpS@M7y1BNL z98N%JbkgskPW;#ltiR@T$*&O^$@q)h<|3OpUHHEms2}9M$ds#;|CVxD+b?M8q!(9N z{hJ4!IbAL>@fVaN=mO^fPS$sluW|=-(60o2HgK{glsOjX9ZEhomwqSvuQu_gTKMo3 z*EGSTQ2-4Yg9WT%=XCj%SueCFQqI|=#+BT2ti@_(`JBhEsmZ2%PM6EW{YcdBSl`*K zA4$2n_CrS1oCR6XlBnmhVvtx68ehxq7r8wCpAB@0wbx4axhEv3 z%}25|V-kB%lDo6wLh^yEdpI*gPA=L1Z*0iSRL!^n+j&DOIXURaITJ7V?DOuC9F^>; z$+tS;gJ0@LeK~er?Dki?Vrs-zU%!X7 z)UHcvsy+^l8AkmQqik;;-{icH&pmA3U6I&&*)HqO27~t-p)E2I8b4y=uBYvutk-Jc z=Ssfu6JKyYbeNOoUh^Sja}_Z1P3;KE(H*{@?(6@C@>##2CI7$Dx4;#;I=5=H{}_Hr z#`GlZH4s;RvPOK3GM-N0eiCSz`9X5mZs;_VI|vY4e@SdDdB8Eys)2WjF@E4TgE19< zJc)7bOAhc4l+8kx?FBBq*9x`!E8?q;>q!S~%X;!P+AQP$KPtjEjRyWl@MLf7bNqzN z$ENi0x>nG|v~}}SEc+*RubO)^wQXJWIh08*Mqo0y%X?};SN(Uxto+*4ZC&-^0CNDi z2Pu>JHnkv0cWV>PvNFnKzG>jNnJ)e0v+i#jO&#;ggl}pB zz93m2PMN@H+miK+0*B-i+XhF<3Q}0RICRgp6rJ;H=6B;_@4ejD@4|)?`?iU%y>>+p zeGmR$);9T0m+p2t^~vPxgs$jyHSa0lmv_=?w1OV`wVRyAmzwpx%P-eiXJ&l#!rwS= zfN!oPU>zlUoU)#nv^+~MPsp$F5-U7AHQLxl z8^<}1A$#L7jI(?@+k(zS^Zpe&D`!Z1><_IG9p4UI1^lS3-Syh9pZ;-eUx=aS`zzDjD^w$>fhDN|EEH%i9BS#z$~v~F9(00E@k*Wvn)s%`vxlAJ2S`` zkOJc0V~?)h^CSN!*qG@r9=$X1lcR4WuAZ6l$^N6q6JEakM2V~B#J8(w%6DKv{tqyB ztas)Q;kMHG|9gtqFGxG67MG-~c!p>5EV{&sMR9yjL+n*7&%LxIoN*|X+(}Um@U@P` z)#P%DCh+_g_gnDXK3X$=M7AXw|HlGykvoy9*xQ!>cTDaWXi1K$nX(%mlPA}B`PQvy z!M!JKz)IE!ikR~)VpCa{qJQbcib(9U#AI`|25$+&4z*Ou=6O>VkVWt*@!@qdFMTcH~eJtGbix;@`=`b=2*EOgSn=b3cUd5=7Iq#L1c z(!6tu5x~z0zR=95I!_n6hu-|}`wE4ItUDrqF)8lB+@VzZ&1Zbif**=Uhxn$sn~NMm z#``zsTzEsTSzDB=^yWC_*%PO_b*DV@{gRw%DmH6Vv>LNTbuaB4uRI?ns&0wY4SN6f zoVg?8`c@(vZ`G8gk2gNlXF^w_yhPdX_ixSl-sQ>~ z>Fkn~=IC51I-J4%+7~L;GEspGRtX)U zag=@z2A8v$W6Ee3nC{h81xwf0uITeAIwW+Z?N(Q(EV%=##nnCQIKQ>sVI(8E6-(&+hE{7*f}?+)X^!S=v7BI;iGD( z^D6m8HZ$e-g~P6^(mJcfE5R>H^UjP_(bEogpi=;y0nm95I&qGeY3fyniNEDG?!^H| z=t!HxuqRW1Js;TZzWofVRTGooGoh5TrJgI2&?D+T*;$&?meDy&A>T69rSv7v z*j$x@ys6u>^A_6eZni7(jZW0+<=X^&7Oqjw@x+yWM6SHq6_>RQ`ECznt}44pExrsp zcPVl&yBD2f|1}o)_o>e+S63BY=UTiF{)hbAbyXSi8_YNj{nm9=CC~3up0}89F46V8 zyVT+;=20`}nYJirX(Dop!%j<^k0P5OIStV_Qzk05bQpS(j~tz}bqsxo;N8sJxPrcP zp?o)e$Qy9kyE%J}`ogS(K4UPQx-F`6>2%~HdLV7copM`*S8&hPBeUt$3+%V(?{vmho>%jn z&o~O6oPq4jue2}E5qp-$d>qF3`7n9R}4LF_AtJ|5wAM@ABoKA9f&e{jx zO~@hMnV8@LK8n8w(f2~eB8xHUw)6I!657RqcY9EE1Kw5YU|b(oNz-X~(j90_5bGGYYzOC6w9~0@{KjB$ynFjSISQU zGmo~#zI)LxkPpCZzk_^Rpg%83=`joD zvig&~&WKC4Jdzm}akh$3Vj1kx=;+70ebt}ZCS26C1Q;T!N-d8#j zO5M=!qGha_0gXoPu1IrsEv-hDyW_RonT$`KvwLX<@7p?Sxl~cU6Jv3rfBtr%2B!+*+)-cZlMQ5d3Hr{-$6Qfy}b3$^W9R$o&9IU1Tt35S23#= zEV%Kl)+nt$K0a{$?^S%lP5iD_i3!qYty`tp&hUHFW_1k=U)9F<$hR-JEoYAEx{9D> z)w~6_=3GMm-Tiyb8W6*MHpn7Q#U%WG;GhJ2SHkLn7beKrQTo|k`n!{Fm@CzV{r}3} z&}DrfYp42**P%q`btYsC{CC^8zC0n9ZeU-q3>FiI?>JLGu zRK|*aeC5*WH&MS)#U^}3{~m^q4>b4QDUSKi{y8eI>+`WOx9p##bw2+(t#dT}c{Eq) z(s%K35&6ex>HX7G{xIfU{fhcm@EkQltA8Ikt)gF@I9vJXvcYSoI}%q(-`op_-n$N7o{v{cHgr}? z7;nP?{P4KJYj<>0OOkl+%KH)b;I)H#swL4pZ-BR$5vpF~;p(T==P?Jd9r#>FmZP7l zPZ%gVlTi90HXt57_#JUgR4=VQ5q-(SpY5W&$rY7Vs1i#%VF!d)XS%AFv;AG86!x3= zi22*%iq49L-acr_dn?~}#SD~sN9iKoo20&%)H}`hW~qlx2>j{P$AX*2ypZSrhqX5k zi~2|&|9cM30R~1?Wbi!;t5_c$!H>)Y&Ky(0dp8J z(U`FnsvLm z_bEe=<0$=Q;W?K$HezEM$o-SZ^xl7Dyq`1#JLGxKU41LoSn!DAc#_3C(8w@47Hcny%@AP%nw!!ay+PHVieMwD5XYK!z4#y7E z&fJHtC3cW@lB?jm9{4YGa#l6)?JVyuhsqpjbR7(R_JvV>oK+*x;f@S*R%eB&>MMO! z)s^0=>SCy>zGzX^*V5RtLw^z@bf2q^Y#-*Vy2}6C2C1qyEzat#@J$BisdTxo#XyA_s`_2GMQ^nf!_#&J_{YXD~P(- zOLxfnW|P?8GOri$?v|mAW2>i6+VHLImI}Vvda1cckkAb;t6>OEwsk-W^#OQ?tmZYUO*1`e_sgvEwkZf1sB3GR&eA4d=C{bg&NW}tCV7u7 zU065T)Z{nhmb9s5JbXx8b^R9nh@LwI{nz{Hs!rNk<{+`>ZsJT~$;+C*ESNk6dg8#{ zHKr!tDL97ScDsx#EBgz7Ac;KM-bdx&FP3wOvGu1QWA+pNYOI@BQ}b`t4HVooo>e)w z`5x}8a)_r{U4aa_6}ml*+?sJk-W)(bmXFFZm2b!}ZQ zOc!|-*WJ!5X!TBJza6$F-St z=rUq|4P$N&QaV!*GQ{W1v5I!=qrCIM%F?i;MJ9EM+&Tyvmn*!kj&?~|YmghfFt3IG zIl;+1{42P`0K2L)ph0dgaww`zT`*dyAEZE?NlmAb1f!6v4}1XmbU!>s9==Mio0KtH?)fJ7SBV>3fP63a_%x22gnU1he7lAq?=(MmxreiwJvqmPhlszT^LMSi%sPtim-vpq-E(L8R)49vcN6(O zV48E?>j1Q6dgP`dNj639{va^(Pg?+&0%z!w2jGw#e z8RI@xC-a$;SQi9dXsNFq-zv{H_r69wM|3K_evc}P&dpmme|K5rw*#23vAgh&k@HsK zY&)afqHoF%ao#MYPe#p(!ptkk^atL(%((vZV=re{4vGqqzRKa9;9Qax>a4Z>E+bK7 z9O6M#*E4UPLwBG<#*GSh)|N77ZloQm+aP4GftoVv68({@;z-J&nXc9d^JwmO7twHev!V`Qrn$caD8QI7I-i&|jd9}9I34{?+?hpPp?+%vYrf|FW! z{7FNK_6q4U%J(Jj9?Bn1`KOk|mhWY5cr8h#?kbEae#M9!ip&&19)HRR>>OL3kK7i- zvx(=TA*xKsJZ%HQ1;8roghtvD7MN{5C_d;QQ`+e88;%+_seCSIWBqKBO?(ewp{h2g|@-)yb#nn-ZZ}XX9z~{5tr=nML$3oIXvp z`KjDlJx0Z76+6}3H;@m`8+^(dzDle46XlL!ev5u+Lh%HpLZdfFgI3#@P3Y~%_f)+r zC^Hc~*2QViWM?(^6UI*BlEoXYt!Yuh<)fxZ3kW5M&}?pn*#a~+^0Th2y@I^yN-BY>vHoA z7FQKNy@-4z;%T=?K-p~G1j(1H%}Rqr6yVR(~QbI zk-VQTac(#QKO3YsA0h~L*iqfmV}i4t$ZJjPdq(npe@7KouD7`BTI1WClYP+4XifIz z;UDJnlT@{oH)+wrnpMXq)=XS9wPu1}Mol#HQ2it)dOhXvlX=ykTnWtIk>H}jM*qPN zq^>fP8Y{TE&HCX6WeqlGBud#s+7C{2`t3;wp`0_6bCbR6MOGD-*&W>{W9|@Tjn~i@ z8KPVVksX#DUs_Xod{NEKCe|d-rxzch*Asf#${q`Q6NBvh5YqH7j&D#up zzulTY@jJ>S{{`|R?|Jg;{yw2*F!@EEtY{B?BR@zR{=z)HJfsEg2d%1XWxK(NrM`O- zPCy$KhDcWeGKj=i5jcu&G>_{~d!^0t?=oQamcNIxC4VAvV(IaPHC{Nym$}CCjXp*0 zk$x7KSGSh=DK<}XMvj!{{bvBrQpUE{|3p{&AmyBqe~5*f$TK++j_zP4dyV zqc64KWmT*i`xE`Tj5@l7s<9WTqyOk`?z8lBL2EsaQBS_X>Z#`v{hYPHW?@XAmy7bq zG>bc^u%fmqY}N6ZHM7E0*z8~xHV0Z=$yi=-yr^dR@mV#?j?bp==hUnK-^&FC=sl6R zZ)Xirj)mYsM=B=`BXuR6A_=Zak58x(8eV>U8f8tb*%{6rB;$T1ed5LADPUa%9#76! z)h^1v0E`s|e^)U0yTrcX69#LR4`oO{t~_2?lLf4!fO)iCg*}+4!j>O*QTEK5^tSLp zk%wAo=_=*k*GeB-!PiO3o!CQ#O>2+b37s#BrOgIimguxRvvl!>pWyYU;q{ALli&XlK6~Gc$+sRYocuoPg!baw z!2W9WO2j<-UTj&W~49f=GQAd{CZMN0sMLgZ4o|u3jN}0&pIf|6%WsVf3%l)lcj%c z9@mtaQM;VB&Ewtg_0H<=k+a_=-6#6tp3ds8ki{P0`y65&e7+>5JX~*fKi^ZOww=+V z_z%8nL4~iXUdXq(GewD!>MXl+hxvUU)i#cfwcZQfwJXPy+= ze;E8ufv$(p7Y34E=$xy}rN7}@IPIHA8zwe3_Yu8kA?p7m^~Gj$X2uGX0xo%~d9nJ4l0aV5fwWo_N!;iu>a42-?+81EI(TIoxf3tuPigUELI2BWK#dns=%^6xox)#s4|iU%G0sBlAIClDaC8 zH(3mM%Dln15@ZRxC39gsvW3(k@si|BDGRu}$^Bos_v5|bWH;rFM3(hFccQ*p-u2RT z)$mft{T^Msz@ouF7TlX+9{9C={C3kIEfUxad|wSe`3X6=gzpVRRSf6-P5#yR_7iY_ zZRo0vy*J6+|G0hp7}Efa{bbfBzMPlH`H%Nuw+@f|p7qHO`G%@?qny=W2C6*x>8hJw z!)6Nka895zwHTYixgpL}3wvgZ*fY~?5qS^m!%WN4mE|jg)%1bgzh4mjG~c4i+!@hY ziWbp#9{;c&H_s1LWs5j(?MJ_i+HQP%m@;1EpFQcS&7-VoJ`3!peHGAM`;>2id+b^c z*HicdicbCZb)T)Qm7kOO=l1oXTcwW@pyA@5di1-)y5t8#d&h;Y!;3EU7yU0d5Dg9>}Z$*PgWi<0R)S>jGJipUyLuH4oQSe+ypDaE{2S zOk>%Ptm$?-%hGn1K9g2*M{O->BH=rSJ;Za-!~!X%z z53XDAE&sIF$7o+Awy||cZevTE(B4)%rM<1xQ}d59A)eShFyu_HhprqE!M}^_DX=SZ5s8j^Y5YEpd1VJ zm${M`Pcqdlz^`n{6m#8zN1*k0Nrw{K+JchX+Ts%1*(#IU*&G25&CGw<)f>lOAk8wV zC52|SD7KYXj$((dEi`FEVvPU4E5TH2+&8M&|1 zA?NKM7jG)}M}KEWSKeaB=?~rE_wudJ*0FElBg8mbz&USXL-`|XMHyp<#CM4Ijo4ZK zvA##YIB4;fF{$r#?-*uW&p4Hz;yRk2B4aoKUbB!fJ(}xH#`RM=lj(E#&URg-DQu8x z(*UlM!Ba?JPc4yjjPd>FfJAM^ZoBp-N#fg0w$!CgYFC$9?5p}tA-3847*$q49h;(! zrfHOY0KJEaa`f!ak5nF8g*Kyjz6igL@Js3If-lKGGk52wEPOjZr3hGN0pHVH=Pb`p zc?($PQQiRHxuXj)EnT0VvI3q{K;QYmgCeU)^LBzXS|Wqt=Q ze;~c&nDFu#lRENyeYpD$XS!b0>)k)84(@_@Rd)X(TV6c&858u%E#oMG`C%cal^Y`%>;F+o;}yebm@{=+i+M5LBpu%M+M; zKS)t!Vow-t@Nv5g7Iy&i^|H3k6j|#J3SahMvR*Tt%Q*81Y8Zz8mE z5B4ULRG`WGpVZg>jG7%m5_#`9coX>{i-dfZ>qDABGLi%yJxSKt!6al5&g@m;BTcGb z4C^a@_I(l-_b+c^kL#koi)M%ab%*aAL{D3w_cwj64={B=w)iJ9MVeo_xsp_2{bNWm zYZ@)$xsbncJqu6YfjvoYSHc|t2&-Tn5R6P5WU!c?Uedq3yTR=4<+@({CA{?GWa8wr zSABu`CSQ*YC%m^OGRGN1oMQz>cb)t>_Xz&il|Jj`I$QjMv2MXR`s57%oaG;1lj`Amq;4h0k99h3R*)2LsX@|7Chr#NW{0+3Hmuo=r59pnn(K~<3`m7x^ zIuraprE6z80DT6twh`Dzq2rM;a?7AADuD9-tAnfsNa592}NuQaKMe$-JW^p>tO zUaq{-JWk#(ZMOAwP_EF+Zy8rfz$dUI8$#WK(Lv7FPkYh9y6c$co887QaMriJA+vh9 zlI{qs(gv|plXgmbWvwCjmG?1x7o2bAT|EEuPjO$?ZRxC;L>GNGyu!cFf32#2IE}pn za@A#%uKE&Zm|f!R(Q}NclgKpZzhHURmOoveNs=pLc)XA@b-R z-H|)H!E;vCvFOMBaKmuB;8A7M+S{K5WRw04yJWMCKVb;Dzp zJF!LB2rt|`Bf2IITLgKZ3EiRhuD;MUv&bvcUFtCexpgRV>#!p5-XfcZ#%LOL6FSxp z(f)%py|c5Hxzc8v%ykla_bDmZVi}d?71mpi8J+9>*mJ+Ym@EuYeLsy>W!vx@GOG}G zXyL5l8)41`5yeF{7WVE9+K^+$?jw$M<-QyD!}YOR7oO*+SgnlINQ%_OYF~5hIiRbS zHy}y--GF3~*KHj$+t_@EhudCd?GeDfx&yv(DM0nzMtz@CUnsV9VTH4cEf(j3w#Bn* zIljzzADh zSXpksTd&Ov3r*7)$LlkUOON%3_e~VP8|6=&w?Oyb`=@DF;klOWoi%H*t7iW2NZX&{ zduhGr``FgS^wch)(`W|`wPikC=IEo41GQT6Ugv*3|DXQ754JKf zo`1xKMRcCiy7ki<3Oi{b`c&<6{`qD=7i}Nw^BepV!9RPgKDO=ADV~4A_$QKos=Fm? z16=*JIfhgX!&J-Lqr-a+v6vmD(P18YKvg`Y7$XTwP}GoP!3iUdJqk`LNFS1fjsl9O z7CWdbzT=Q%35g?)Jr#bHm30uyM6*ryF9hey*wYCj zPcP){XDIKH$lltk;96|fqIgsr}#S@pLOa#^?;D1mu}O=rRj_`!hYdeuW-g|5tiEeHT5(K#wz8>2Vh{IMzdt zI!88q=iliu{{N94_5Y$rT`N7tLSMg5kNSVnV<5Da-%5|;p|^jhNB#c;J+{L4EA;5) zf3nxC;FZuPb|5;}C+MEfqF39*^9i2uSr{j@)GcDjG2wr4(3(SN3R)ZOW3`;`o>BFb zF4)mSb<8`gGn;PQGq`F#e6A1t%!vR zT?0Qm;dKhx?3?MX6f^V?3a>k&5BBi7qtji*XO;w8V>w$(zckn?a-09+VC!DnkYl^d z#E=d(SVuC)-!o{`v9A6GYl7Wi%~@iwenUA8q%e!-SPyM&4a+e_$5-re-rkg79(7+Tc@Tz8{|KhP$bc*>BW4MLKmQY?0JhKkH z`*r$4PkE>B;;%9nOJD86e&7c6&F6b>`pL^LpX0mNPu5%JldOe>2Jkr#U#W90*v7o! zKVx=^nlZcB4USfT?^Vnz6P8%4zTira959{vVhhQS_d#i+j(uYcv5xH&V!hfe#QG7q ze`-mHRb)C-n9=bv|KwV-O$By?!zan&@L^9$+ABD&WPNu7+L#4x6ha&4duCSc(RHv) zgg&M~8xxZJO~as#Drn;%>)f8`e+IGE{rsnrV-3*8r+Q0PK6Zu~tjU%EyNH1JlxGhOl9 zL&h}VucAY?#BZo9FhZ5#v(k9Ea8k+zWpH0nI`>udTW68|t`$y52|&*=8$G}}u1C23 zSU4l4Nf%(+hpy*l;lz|^eW=NRUgres=9kEGhBamZ_gh#OiVsLvr8iyRyPI~N{-CnE z=+AxWN1yjAyRYOr0iFI!q$B9))|0yWch|;{qV-AIP<=P;N7YRW=DtpkUnFT2>Gz~- z>6xB+yM>-w{9xOlcaCGdc5S|{tQotbQuUR!cmUW!PSR`?8_z^f71k;F%lCzhw_$GWwMYczQkSDJN^7RemC)vIjSU zm^SDJ8_0Wo_GavbN{@2x;nCk8?B^D}y3F-9Id2TV&0#|BU1t z+(u#$wBHiU^T{{i;WN;ot}v9ntT}5xgqMffS(h;G1xMo*XDI7c<9DoIceYd2;~59z z@dy6ipl!K3|3PG|7g_sBd_DQr2##m_IcsmvcQzij_s~|NgZch%E&KDY1UeU%f(KLR zAT0>kW$$XX)mghJPnAjDPS`?DH#=*ixp%@Z#$~DuOERV!@~*zSRc2wt8A z&kHluj(6$HQ|O09cYJCZad393T08BzwG)4gScmom{P=!*wAP7pT9v)Krg%=UIcx9N zrD*$DHxDHlNz!*c-W!~l$^CMY$FG9xMv~zlx@Ww3b?B2MzvPoXl)REh*5Hj_>z+wP zey{GXb~q+wB>Km)Zw$N%;5Inkp@rHLG)HGO?)lVi+H>SL#&@vA1IuB1yoR0WxJA5Q z$a`zN)%M5eXie<3=Ds#atADQ|vJzjuX4 zFcy+x9NJ}U`eXV#wC(md&5j=C3eOF8y-n(y3`{reI$J5cUD=bgXwI0C`h3}w?o9f% z`fluLn|Sg)RekdVRr>;U-~7N?dt=XUc!x|B15acONg2cBe^RWJ1w7K%UYHr5wI|V$ zJt_ac>Es?C6?;#u4!bw`cL@J@+Z_9gf0yvjN5bpu1GT!imbx~ve?FA-Yw+Iwu?61q zz&ne7&jau6A6ww9jP0r^WC*GA9P`sFl#xmLCA{Zb;T`>7Qu&=M2yP6Kl4Wz&BSC2f;7eY}<$}@OFEDkDry$ z)VcdAB89Jh#P>?p`^w%`tIYVh9RmNa;lkUF+dsBTjBjnr?H}(=6#U6z_0mbh{&tDY$6IKnVSfv} zchj1eUWIOc39px4uk*i`PV1oc0&L)Lr8z;UiyAV+y2^lXkovZ z^GkRh)83(7px;OET*0&Oii>=&!XEkr&%!S*@qG)v7eWsO=)=8q{h#pbrH9SHD|x** z5FE-_mA*SeJA}^&jl4*{(ZIb9o#ZrZn{3#8EQ4nZ(l& z+iU)Qq$N(E@Y+P|8N?pMpR(9nIeM0u2iF!(t(ieO`#STDqq|mWa#pV-X3(BUW!=Y~ zfWhI=Cf7x4k45{~_5*7(wq+NIaq+}~*p$ba!)!WV*A;9~zGwdG&%AyKIY8#O-z>^V ztac32WRARtHOYgdg`6Yv0&n#UdIzJ3pO@OITlEn9Q6FEAB!Ry!`x zuJe=F%UZJLXg%#ZkL=}-Of(sJB(YT27m22*vFPj|4wMrV&A@@ zW4xA!4D>r>opH!Ok5KP;De$2xS@#D3KyAN{3yTnsXajK86zOp^4q z$gR<<2V?Wye#_3kBM*V!bTMq{NY|oM`)OTGy|fL1y|lx~HWB{4wSSI_uq|1bTyqe5Zc_ePyHew{Bh>#7 zkKt6V9Rmg;oq0=|9_d$??v2Fc~*`s`n z*-qrjJwdw$2K(ac$9{^jM4vZhOeeQFFkX8kbY0FF@+`$}<<&0}vNvge&i?b4owBRH z7?i!hxGW7H@5^>%XPck%rb4F@@O#bT&$=)j9eTt>n=KHV{*iGhnu&eJi1;KeXvxwI z1q)}?_;riZrY&^TlmN2>xYmZTcSybvY^f#Rgc(IOY4~X^o{?B{f;@r93{MloYcP32 zvALE!^JdJh$#TSKt{FXQgfGe-1P9BM-9sMvK4-?Aw)|^W%ZEb(Yc5=bOo;61n&8yik%wRjVsAtVkXuvanzT3hZ zM9%t8{M|c$CP6zQXNinexeYl4UcQNPgbysML!Zn2HRwE;xSpZJ!TOxN{2LjG<=3I> zENIj~{}}n^!?)ACn;PD!{Gad+Ss!3CcvRL12meUi5$2&cjy8|m!MCrzNX(A#iyFU| z|Ao)K#=CQ(duLCq{=22etc)c$d^HLl@HlJ9i>xKTWzBizn6rAztj*;YSx>ITZlM<1 z+!&vxF|KQ$BEQJSZ>)uXNd0%MpUyBIWc^f+oV)Sw&EsT!xtVxlcjx(tJ`ujc*$vvV zlP!5dNoPcFh%JHGE|)T{V~BO0uJo6&1Cy9tjmvpA1^q;cQ>B&?M{NRe ztyURTqv+?G%pGq{<=e@pbya7GAGn+OXwGKVoD~^W7le0aRr~+))y>z|p1XPO*t*;Q;q4X^v_(dIU8+CrCz0-7tO=sl#ZBR0j#5$n_Z0cnRatoh%?T;-KRA7I)0mv zbsV}il>9F~;@ny>H)Ct5&)}`ggEP0D>*%v}W!oWJn;ubH*OeVgYo4pyTJNLZdMenk z^-Npi)`l{7S_v>;WUStJd0p<@fm`OS4`TnG_6z=|EPkteI=1j)Z@THulw-TsSgfb9 zGaW*F5NuMzE{&X=a&lxr%C3>UQm|DVdl073tTfjMaL^3yy3x;v>Y!8N@Ep>q)DYwV zY!ez!OixT{$~ofMiE@bf%7Aa4GeL(J#aGD%BU5d<3S#&MCj7AN22y zXNVVxFVN)+LbK3d3G^#_*@M~JlKYn!3;5?hoiSCi{btd_XQF+ zufS5)WVYREI^5zrB>0u*Me&AbkY)Nb`DNUa`ky-T^Y>rE)09)|(KWSYO#RSCHMXUE zJ8|*E_7(r#EkBU_{>&NbJllxPOk6NeENke8Gx*e>H~2z(GkT@`&<1&neX*vTJuUlT zdS|M9D;=y-f9<=XEzhsiKO=Sul+(CD;!_&hdF(R9HsQ(F^v^u2_nb-itL0Ci{n2%n zvghtC3oGOECF<9v9G*pi-R4E`3FPcxo=tsM5qw>#;t4Zna_ zN8RZk;bTMj>4$Z5g^#7D={&KQmWe+ldeMBbBlonUB?bX4|csn}Kd2jBn}teuhc)V7}gDtJ%aaR)qg z`||oW#A9uFUyfb>ANkgfxqk}ZUQ*%z`t}F>Hp=*ht*2uu-*!j;{OyGp^d)>_Ps=fl zZ>O9;e|rvJh!uRpmd{bhH~oa4zdi3z)r^?A5_hpZ`YPo1Gm*}P_1woR<+zL<%)6%{>l#_7H08ADw{PQDGN8G+x3_(dQ2tAt zla^1p%qD#+Tm>6F&4S-%rF57elV9 zgDVl;$h3PFrc55(-+kH;>A=W8>_PDzX=16s>ZcGc!iyP=njW598gP4&8*mH<1yA62W z#P78Md+xADwY;9#9j_>y_x_XAH-Y$a`RwCQMDJdYuT8M>HHm+b$g)zW%oB;ksgwII z#HZUI9qhOep~l*XJrT!zk{zMKKF8jtbj0iw$?NFQnztkNqjq5F>`eV6I?yp#1!Wc4 z@ekp@>C7Y9$bO&e{AsV*y{?-xwJd@5#)Nv>JJiQny$^Y<$^%<~tB`t}0ql_}T~;%3 zZA`qMiA_hT&K)Ureww=U*z3^IB=B6yUZ>2lGPmvr&*zlcae%!_1x-obpXaL&tIn~v zD)N%pg6ed)`iUH`OF@^z+Txs9SCx+K(>Zen@!XZ8;ISdor(pNs_qZzCTsSS|CHiwD zG;x>zkfkCz-W7;E{S-0x#P>akw!KXZy|+}Tdl2Jo2;;33dwCt>XP3gi&{0}lNSSBh z&6~*EX8P0=J$fK1cLsS!v+jPKeN`8Ey)w{R)|F3z%Qqj<@{;O${Hy#Xe3zrC<0ELP zWq($g&Qi}_{+&uayXywIN7Qw4&!@f_GYV6tLjz*#J_;NO|Nmt@&6!4ze^ncBPTnv3}t6B*&FR;C_5EvC`%!J{f~wRt|HX1%q+RYoVLUZ93;b|7C_U?PPA6byprPL*vpSm;EM9O}IC$ z#LqD6MUpP#zBIl4{9wP@o5%&ep<6Jc$VfHJS*MTJZn7Z+W}hk@19DX_3S2p^B*?( z=hXIkB;>tbk7VEK`DjSTUXNy@Z@R2wtW|&TR(1+D_338kO($|d!t5x^$Jkyx8CF%E zb=H}(hOt?KtPs)ukCEwyAlFRz(I3Ap*zI<(- z_|08h&>fp-|Dw+*Ycuw!;urDb3PYLr&;_I0O3mAbXjghvd^E%-Ah1K6HUd8%_5{rr z=}!|fQ1fY39SyyO!`HBZpDQ}5<^cS|f%E)nXLV;?-GVMYbqg-AM!i7ZO7_xsk^X|N z`3m;Mqwx!Hx)N$Oq6>+`Mn7HG;c_K5Og-SC&B#af%x5E!WtzkA-xWTKFO=|yF8D%q z4XazQowB;Mty^$}YXWs$=9)--LFibXBvp~hQNwZ+1D}K-E*mVB} zn`}8V>bKZ*>m9N`5Vx?7d$POvG+G z5nJsQ-NRnUp4Sp>XI@XVO~E&PMYs{0%?4>suBxh{Ln z80tkQ7j_!hgbsAH$4L@;*m#|@%K7Ih6_qvX>-hJd^ih3E`8OT9c0dc_M^-9n;orM&<;x*^R2S_}$mhr+ zVa~;A<)=BDN$d|RgVhe?<;Lq7_;%Cg0MaGevzEMXD66ME!*$N;bA|v%9PxRZSu>Aj z5916v*Abt0ai8QG5^Qu|M)xDO2K#-Swcp9SRkD?Mm!>V#c-BVS-3_d%>Z5yWm9(jW z>t*tYuaW5I-QZdNxq*#JPu?~0UngwVt_1YfZUw|^vM#c)p8cBri&fY;{T|z*v*@vd zLR4+UH!2a^z%bdncA@i@H7+o^PQq*NL3YpA1zpy$?#Azpc@jUjORPt7RoNYQV>kF= zI%(w1!EimvIWsz!%8tJk(sp14VmsQj8KW7LtujNL$Ruqnz} z73U-8g9JFHMyaZ4b@}g43su#`aNSact^r&gl^BQhwDGBQXH`-_fcr*ZsJr_hRrNIc zJ3VNVKf21n67Q6_Btgt|^{1Jeu^az(wQA&i3G|;GSQoe7@&R^O0{<%dO~%Fw&oy$( zGOpq;bGIK&1Uh4ZN!A*_{1(PH>8Bu)%%u}}_Qg+3Y_T3Bzukpiu(()U(BbPvF!9Pc3O6p$vc{`mx-;d)}WRqWQ!Ed?*4LyMt|%E8F1I@R}` z5V403cX;#Hkzc+OFR;%L%9U>$u($nzdEA@lJ@V8URiD3Ne<|N9scR#3y(Rw1@*dmK zyWhVqFc8Z^-hF`$b1C_kk^fcRqw}3RpW|UfKPU3a-8#B=u)UV&7CELxZzrl7Jc2Xy%&5o>mYwX*o@NZ|*qmLPzv-?Im;7R1 zZU8S6oH}%!rMdD?fzp+I+4{XHr>1KD;zh^2F~kJEM(9@hN%TOXuUt_gc4e3l8nB~d zoa@ldozQoogg}{bx!o0zdh8V!!6C&oNL2gG8DU~HH@tc&Z~$n9kM|F z%NVmcS2ZoO4Dx&*q|Jc;E+4izH^cL6_t?;_$l9Dc(eoUG4-ac>e0@SgduZoRF0 zZEeNL9`{r;XOm(70O>p`3hen1Lb$5 z%$30Bv&LxKK6uog=ZffpY3q>(QEDs^l=*ky1QSJ#9?#iIADuJdP$vgVlxkIGoUu^g zIg{AnIk$6ipp?05^D@3iFVTm~y>|`Wl=FV;IQHM7{M8P0zYdwJrN3p&r@$Y=CuwER z4kl(^tor9{{j?Y7FPFUv{299#p0On$OG5Xy9mw3odn(0FJenA>E3gO8^d;8vOS&?# zX>g(IKgF8!b@n<=Gw04=ZC;`eyqv+mqxg2ksCHB|I=2Q>S7nC2?8HK~bu{H)k9Gc2 z`tWD}p93D)m#rUKHHEV$H+^C(k13vd>y)1JWGJVbr(FNb1&sHuJa^?iIv?uRZ7~FV z^uqK?&Z^Y;dU%ugKbPqJFYiJ};^|}d_-yRa**f5_>al}wsjCApMQ7^E;($l4_er~H zZvi%peTbX%EUR>Z+m;-3HRXs0yO1InO`J18>b2UpM;kS>=(L}R_l3x z{qOdr*MN0&0Y>jK?}bsgMC7=PbPUy#yM?90(ZDD)Tm@VDPT zeNxIYWifR|f623GNn{Zi3#7 z{$ISXtTep5gxDH()Pvwg5xgQ%yAzv-p+y3AaK=kws`oK(v!NfSjO&& zQL3sDpZ*h^y>)`Kw@!3Z)#rMsMsunDnd^r}$6b1PXw^kqPFyr+EeYLkPjohJo1iPx z&nUcQLa(!&_B}v*9$>%Imv_jojcv&{6qt7~&e(e?d#Ar@B1M6#_xfBlak*0#(MZ) z$yfTuk`&+Sw&3=c|LK%-fyi?r%ay7JQezX)2U7kT;{&NC^CMgGijCsa3AKt~SNv9FHI3J%97qUE1NWeN;Yf6CoC&^h;Y z-BXd?_c9hG8P^T19)jNn>$1aH_(_doy)qh~scihEa`2Z*TI`c|1fQv!_)K-0(=o5J z-r`uTI#}ZTm1Sz5AnRcKr#34;lO4S&u@oHf_?vtZ6lxl+Gnqm<2bsig4}C~7vd%dF zm4h4Wm*9JXo&~yIV3=NzV#l{gKfR#1vpy8-p&`dQ;cry6SZDPk{`at@I_nI4Xk7Tv ztl{09&VJTxd}ea+nHk-|&w3=;&w6T!pT{@zZTw_j3AH$4DPvf|kYlSkZ^n+!_+paI z5imWvSmp=c!=2oF)zE6Oomc^%-ftXA99utEEcXZe<-NaaH@x%XAbB6)nuOi8cV6-0 zYm(Aul^_!*=BRP_=`J|W*#YOk#R+9_?LWLCa&u6)#RjgO*=pQd^wUM!>d=K{y-piO z(LY;h&ozw z*D9`SWj_Mn!Asnmi64HI>w(2#R`C;0SQ2Kv2|msuGiAjDTFu}z6g_$|gFI&ZzQ%yFAWNVlfaji;9MdY|@NL4^$hWY2aWi`T0&Ljjyraiy@4>kp^A0WX z$;-jd=rB6nPXd(XX0pi?ppUYw0>&=vy9H9tXYfhvrz}T-(H|d0Q{lW6bK$(=nS7hV z`^WG*yND0%RlZ#Zrh7VsS+^}VTZi)fjU{GlA}O?gnAJZy%o=AIZSn=i&q941L3}@G z4|0r24se7P_AG8DHk!;^9I)hpZz#S{S@=S2g+_;Ala!4g)EmI}F*rO3d`aNVLK!~# zAX5-~czJ+s&XYp+Y@Ap#wXY|v@&{`Jv`$)O%!mMi(feBde0iMph+eZFF zVSx_u?TWJuHO;g8I!5;la0C}76*prGSK5YnYWVgG?gD`=2-vd0oiDKY0NbHt_QQbf zZQ|@F>cAQ0u;B2(HWb`hmQo)$3gNt;we)K!iL-x-50UR<;G8+qY&{5^M}f0@AG38# zhS}=o+o+{x>&ILjVJ3$KSi4(BnMT`*fsq^n-Z~e{zL?mT4<+W|W5D(XwD&r+_av}Y zL3?jQd)eSEkytHb^g7e4x=_<6(C+Ih#B>x|o&{`A0?R(?4uJkf1LtAr%17vrdV2z! zJI-v~!uL(UHnMLEY*YAllztXp_!(h7jsRfmV#x)z0ATY4HfWA`q;=@?vWZ2%2H5sO zb4Q`M*Xh%P(A+*~t|-}J8VPKN!CQA=6Fro2}WYX6s(yn#Xq;2k~JR$3d=L=+i>>tU`b-MEW#}v(n&YW7uC> z4{Sm7sfj)nyalxO=`irt4cN8;TPS;5qwpIy>3vN?GgH7@F5^+oZwjCv4};4C;MGKb zB?508VzM9zEKyV?KL z-p}q>xIIncj3=OXDvVZRuTj6B&JR9oc3q#-(Q^r~8SU(D`1Ht_P@ZLhZQ;Nrc(^1fb zd1;8XfxOZWYw*F8zSzc9a4&plUrNikPh1je6&guk+gG}+d~|_$-*-`7ncxg zED;}wDeMJ4EpWn{wgBf=;2hODzP179`s82_o$LcnA8>t%GT)#pt^&(?aDKrv?&m=# z^NRQJ?sL9>vN+V*y_HU`1IIqntH5^8z!tvLo#!fG%JINw_V6VK{-dklOPiAd9scl4 z4}2XsSH}w<{Ao0FoDChn0emB&<6-co$CE=$9MELh3mxae*9ER@;uZ;<2Y~M!a0C?= z0$*YA)4W^7cY*B~c_gE`@fFg2z-x&KTC3;!{Y5<>^A?^zwoK8^zSzMSKt%=xrzSu;_oQ% z4FxWNZyP?^zlOi{d=nT)E&ccYJ=}^vnct<4_c_C?*}x?8O_P#G)cyXMEE)G2fKMfy2wi4XkB$Lc>4J`2y^?{}$ z%6pUXEV7{=XTTK#pP_Je@kQRB;hoUgMBdGWzduQTXOP~8j~2y+Sxr7+*42C;0UpJ_ zdU~k8V=~ud%WzYY-RKDE83wQK;gK1KYpVAs;2H*8!sC%METe%fE7{jHf_bqD+=U^N z&C!LKe2SSLkeBMfyU0tQgYQqk_a**23a z;n14U=~njM@KZOr!P7bVb~AljMc;-|-!^ddD*c<#Gr)9M=1}^_%zrnTb4^MCvARs7lhRX2V8U;lr$<$vKno50y- zaP~3d`z>&`O>ma%Z%U$%_R>e#9+`4HIP2lz4Z*}dKGoXpO!{{S{X36;W&91Ne~0xn znl^*)li*v{N6E|qCTLUEY}b){q#v)mhffzi5Z>oeoEh*G>wE8dPWA)7#g<(3gWsbo zB));iU!M2|4qw*B=tBC)xeMYu@*{gwtiiWSybr}%_I-4mg-iYNrbi;n&amdWW<}+N zbdIo&V!d3%dU=k%W8Txm7`cIbdIp`oy-SGcH2YKNRUGr#!z^Ndr9>a@!lriIEn-!8 zb@^UBzVUDu_cGS2D_EN@XRW%EnBISWX<6iI)~6?kN%Ey9CP_=25{c3L%+b}vC<%8} zzJ2e)EtL5M?Uc3ZXk@|8oSps}ItFR)B=D8D_@zK;^KYPK+4tzTcw^wXm7^A%e0Vodh3o9(=U@kNA*&^*gO6ja_*i+sxiAr& zbO9#^?!w7RXw8ckFHZbcjas04LU7^-PF6=steIyyJKc+u8Lc?k?ZL_amp*2Lk2&CD zF8G)SKKutoSOacnqD^{)h)syBbtK zp&P+d5jsY}h3rwq0_PBAH1&m6M3;U)G;{!(sq@f`zia;C$H9+sJ%6|~(q`!3s(U+c zVLZIvyFb;kck!`D-|fBs6EN5f5m_>}Bu2$4?DB`QUl#|Td!0QH#}a*;Af?u=)g_gA zY;fXL<0bTgm(d4a<&1%!*tiOP3sbhJR$7JkLMThBj`Ad3$}4{+SYeJ5O9y@f-ExOKh>dc#^)Ba*ktv z|06hy{-|X?uPJ9o6+Ee76LdT&jo3c)$A0M#WP-<$QPCldMaCMN$-HA(vN^Cs1-oV* zUK^PYU9c`4*M{+YES~X99}frTX6QilbJ7*NKN0;q`|e^xQ-)oZ ztDp<}|GFTT?nv(cVeU=9sw%sN|Gm#)5|CNJb8H_5hd9pQ04Z`1vjK$^8nhA|aypJp za-2ZXw9w+HJ(l*0W@%78S!qQ*Bxq%218Q^6n}FbS6agoW1N?vM0A+pe^L+33UjOfZ z{m*snYwxr7J+F1Id)@0^!y@d-GM-e+;^WYL`xzd`L`+R&n}PZr8w{CbxvRo%$U&~= zjf~B2PS^BKGmYurK_@?EKKugScT{glzgyqY$GFrp-LK2YqkX9BD)Pv$@#V4;y6>*< z8uXLmZhms8!T6(Js831vP@hPBm`}!%oTHh zj$MxmKD7IDv2teH?$f2pr&IJwU?A(`toWhY%wD~;=NQxT=-&zMFgF6lhpgBNhof)% zEILzN(Xsn2dYJYpvh4m5-8JH`WV8^+shGQoGu<0v3l3hE;}hrJ9MAM|_>8N><}uxB zOwX9tHGLWQlLtNBADyTL>WI-AT^HS5y9fUu z(!NOab8GZr#6rP`?k;>^u(mHG&O_}kOR4lr>g-S2mB97{{SezTE;QT|)k`z4 zdfL#R|0%1UG0f-x>{a=O{^7l}b*t7I`t$z{>~paNEv@JIP3CL(t^Kr_(8vJNJk1^7 z9wp*8N_>ia0uMWn{lyga83p(gYfwA+Ji`8DmlEhR5&7^bCBUa6`{~cH+4yRSK3)9P zWl=^4y~TD0S|MYVqWY%Dc=@55J_$Lu+l)Ec{n%6WXJ0#jePScBs^9p3fdB6JSM0&H zn)&t&xbb<4YMdFO8XaM(OU9M7R5eQ8nm|AEeC}%llYH#q0p^$(U-q_rvIQo~@!=(O zbOrG#Wz1V)U^Is@_S2a+(ogC4SIi^1i(io&ZR4?xG424Zk~G+|XS|6`#6S4{*Ll{Q z);g~=`l(T`#INwKh|W(@Z!a0s;r5cz?zfk;ueYfknZx>y*2PDmt>~Uk*s&H{8$Woo zXWC(V?VNgS7PFRwBjU9!`= zP{j}0;b&O81Fe>KMlV`h*^;pl-6QEgaWM~{;@p?>n}Ry#Y_nc;LR`MO@R``jM`!}P znpxKEJjFc)eXX&rx-UAjQ}1s6P3e*nqVM9fTh&rpeMEVfPpBR#M@T1g{-3H5-WvJA zgNm~{MJ@4Ut*K_M31og(rKu&OS!;SB10eoENfK+%#gtp3Z--{rUto=1>>hu1I%-9{*hmo1ZtMkgS~i6$W1BBn@VV7t zPCw|wvz(pQ_DXV&)pt#~4IHZ=_S6Qw!KVw)kJI+rCCZ*_4$c5Y2c33HOpJ4}#9=b3 zCC4wg+fNcFqHeKTa%zLS{q(zhn?ih|WDom^U=RE8$KWS+xZA4_5CWI3fsJf?C7qI4 z+2!a%T=CN`8k0)kaf)9+KT-PgU!{MH^o6=GYXrD_mT?drH_6we_ca%?mOKLwCpvz| zsY7^6sYiSXJwiSc^+>)Z@-3u})^wqy3;sRbgEysbSCHD9g#d(T$MEZA)-OE1x;x)!KC8^|N@M3?*u-Mub#yW@daMG^u4T) z&z-lF3?R=H{FeW~-u{vUA7KY{wsP_vCSNtUbVA0wV@T{d{Ec1kSDhz=Rc8vga(VIX z@s1rzNfofGnnKwZbhd^Z;vwas?*?qouIAi5Pc6~Z+@Q*Qp0AM~+Icz0J^nH_)(rx~ zP}Ny)RGpP3)p<5bb#`POIkUr3a*pwDd>y}N^eKb3rh=~*sjCJ&t)m?^wDSyUE)zfJ z^sh?EBl!8>sPCL|n*N9`UX{+6a^|?`M7H9_8T!$r>zwjD_+N{UrOStuk{JAnUp%Um zjOYHi9+?C4a0vRgb+l1nC}jw|v0V;4j^Bv$2b7Y2d~d~tPUuHUymLdbnRiq1PcC_m zLoeFj*HB&*->Q#VT)~)5)!a&pvdeW=Ba(O<(I6{N0Mbl?$GK z?3dg5qGr9tDf|#L(RC&t4lgNszv3_V%8w663op@`ST(}8%!ICd&h;DXy6`Twdc`ch z>3r}nD>Uc=q*PuIooiPzwfhgSlOL4xFgN4}5c!TGG3Z zugRy6Vye=srQYDdujHRhJ>%gw3L@gQ*~~@ZfA%R|t@#G#r4`@s=p0*_gU;zm*ll#R zcI5e(uB%HfwU4{-WzXt6rAVBV_Hsmj@WjHTl6CMytKo-MzzaPMFEpPzQt@R{R_>F>rWSQxv*+wyw&fWvu@-k0q6O39RNN!Lzzq4ck{5OiHLV zq+*ky5_*lz#onW84=qR6#afAf!Axk4H~a3yM9v8g^>u2`ME`(o=U@zCqSY6Gtywh}4ExCFK-OeA?l4IyW zmqjZX=fS0`$agNok6ePzUSS^l0ehkC-i+aO!70{|de)vZ%w1^aky_TtrgZ$rLL2Ju zhu)=IoKEtyUmVwPzs33Z%*7uJnzi_YM<{#yRCiNBM1+fvo6o(Nu{;Y5gvO8NxehoS zdy>g54sOV`3 z>=YyVYqB;R%~;fnv!beNmeNeUj(A^@+6{-LG!h@0JIHJKM-+Zz`e@iClr}uy2Y$BD zP!Jxj{YKo7nZw1uep2Zx@qM+w;Wy?r=0h;`59E@zJmEc1dnYwkdmu7gdxNnR_`CRS zT_>L$*0V|QZkM1L*U*2e723x*UPmq`^XC%de1&h9*%QlL`V!ts=Ko)LIH40l6aMP2 zshvh_0R}tZ#kye26N#UlP@dO8pM{tE>YptcC!s^fcUVds(D7>aRiei)Yvl~~eAUeR zY0%YE&~y#Eh7-{AW@vgoyxG-FiZhRIt7$9v;`HJBtvpvN#+0Y@`jiXMi_3ZL_9pm@ zE5xZ1cwd25ABVB~LZ|(eY07`kl~WDbMwu|JTu#m$cP9 ziw|~re}#8Be)voWHy)#%|4aSXJ%?O_h6~{E%6RivqT%3vRTO)Y*Hh3uhqxu_ST6K{Z#k%4MY?(Dkd$Ly#4gUqD?$Cc( zW$1MvrZe(7GZ~A$(|MNjU#?{csRq*boqkW7uclsFLT;gL?p@TiR4hN{_Jknm_ zY&$$sZ}#pVYWAKr9N*4i*6qI%cb7g`Ix4a4^L1OtuCW%suvn!n&GKLH$v_$pVm<7R z>Y;u0HFEeix+ygCBD7QHyHgjI;s9@t0JmUhcKTC>&`zPP_0UhD zo6XQlp|cmEvuA)+Hgl~WI!d{v7l2!%Q7x6Z($GsSZFJGp5Eo573r)>{o<0v*>m!gC*w>pYh1?w(i`J1}Vl`NHj94Uk47t=Tc=Ggt7Y%0C z_KDzz;L*qfe>1G(xf;4qxkYh0hpMG&oLMUy+D99<3|Zs_rF1fP?`XwTd4aeH=oPvR zQcTXF#K7Fb++|)|KV&I|uPQCT59K?rn6;Vk9iLI(Nn=uJMR+%@@s)1cUEyL+)J+>b zh&$7RH>(w8jxjB^KLACFD9~6hw8?-XI3<3G%s< z?HEJ7HMPfY`0xaCDLBbBmwdo8UztnL_*LNl zR`CBc^J+Ki|9a+tUySCH#u?EX=Dm_=GvI4!O>DL zXqyB5XHClfjo4LddG`qQJPPjry|?DliSt5Ec!yato*tkXJ1*6XpMdwrNn;IgGs_$h z+|T0NUvS?%3k}D=tWOb~C0&G0Zb7$H)+Sk#gbv9X)xI{Z;_RtDvY&PrJZKaC44+_5 z$eQyY_bS#=f%h}OrJD6Mfi*Rm>y@{nv;w|wZo`jmM_+Q`LuMO(96Ykw(A16}&w(F3 z)zTzzqjG4R)&%aq3qDjHRZ4&6-Vwa0JZdTJ%X2gMKzvQo6BE^@m;_J6rs=TGkW$YY zK7{&;!Re0p{ZoMb$6bbKKlEyiQ+5OTSw$Qm9k7lHOVFMqHmvvp3$2LAzZw~0KgGWK zZqJ~%tPvtAl1p4R>eR_#Fxdq|fwY58mFMbo96CQC9IB+wq%z{?tvM&t> zr-YtXK~Lub?~{yGC9+dl6WZs*Fy1$^w*RA7l$I$xI`N3_fTyd6M}Gw!BX1XdWqxD- z)`@x=f$;_AVn%$7_Pilh(*)00ABE101ZU2%Hucb}K8L?sXD|cr%fPUbIeY*dkhLiw z+^m_=y{Tr7i#^SMU{~{sv5)pV{qvDFf(NzWfd_c7o474~$^XL8aLo`9p_zv*Cp0)Wq=$*X#eE;)?PCQ>=9q{K{9c_AyE893w zyZ^R9+7o& zF7;ANgjYSs7*_94N{jj@_9>!#;VWOCs`UAa=R?>~3Qy}~oK7=7!q=YEb@7QuzXCZy z$??~f(sbyagZ0@5AFU&4r%7+Hss}b1%#4}Lugb-Wb2;?yJI;zaVvl*1yU^!t*ul3DAZTtZei1_$J0s6e zEE=f2H*2W&pXL}1pGd$)_!OB}UCnQ9h%)^nsk^o31=l?3r^LQ-z)#4Y>Sm1rP3KOhrC^@Qv;oF=9i1g9dqnQ{~{^pj+{+ z2%cR8w}TmrOW^l|@dLFdjf1rNd0)f45r22BXQu}98Tj!^`tJm8wcx}CY{cPS0`FLhT;#e(0^MuF{FXk+AowT8Qa??&DW%(`)wd6hN{VP6$S z+a8`0Y7+bK5y0zVuU^__o`uG?#9=EB-2QXA$@IMBrH&x#2nL>O`F|07r4Pt{g3V9I zqB19U#~lwj8${uH{M-ss2WW}CBxZis9_@FbIS z-Kv)-EHbk~-W!<_q>HO~BwjU?BWU zaAs%I52X7A7>M8E$CesQNBA%0Sirg3mtQax%N&Nr3y&pp`8emXGKV|dG>0eht_ohO zayoHCz?BlpxQ8)015S)$Ji3CHpMnFP)EUV0?rdUO%^IMkn}=z{mJ4NnR5}p3ODFK= zvHL?zZ}aXG+9ZAjR*_F^;ZB2lf)kF|q|&oPlS-Y5Nu`(A-yr)gslJ9EPw@Of#&ith zDffT(j+3*m00i*6w2GxU~g}MN1F><}P@lhgY5g$`W40b-EclAWYvxZ;Ur|wf# z>$^+3Z@GV2(3Z}ewUlgMZph*6em3V7FVmjz9rrGh^TgBGE>`U-G(5}uLbaoH9P-;$ z+t(RR$KpqiZ$H4#HHZ2|SLG|5pM+TR;cwUIbSdC>&{?ZeqDSZG6g2a984c}ounx%C z(Fx*8#OGKx?53SP4-7x#yTA9L^XMXo{YEx>{gY{m6M4(nv+xO-YLNBr!|M%lo+KXRKe{8EOD3+B>@9ZUv+6~3 zKrH(+7JZ)?XgsKN@wwEklaCK$+Yn3Kik!GDzO>1t3v^&7o>7%%aX!bn`&R7cCDuE3 zhvw?HEG1W#`fvF;N88dJ`aQy18F(JQ6?N!HXtd7`KM_RS6ptB`vxjpg-k&q^0i20{ zh2NNo{2#~v0PJiAaD5f)XPh{~&v*n{FM9D~NBJ4oLesxl;%BVj3|tHHW%Xfi7=@Wp zK&nrV7!`fpNY3N*){~4;*0%c=c_W8HAA8HI_zpV3Ijo$G@8*BAE+{{OII(rQfc)OX z>&(&lIU3*t&`)thzK33bPIHXgBQfk$$35?@H>BnS81EsLHufcf%a`iXO+olHLp~|} z5u2gms+v;G`Fh0lmVx7-DW7rPUe8&31846eVgh}>F%gfCJ;QHGC!h7qfl;tj`x&3a zVU)u;z1S7p+-_g`k%F%S(III>PA+GP=NQA&R`}0Ec)rJYpNE`xM__cK+SwX)_-_Ws zCgk_86TbvptOgIA_z|jEh`hfIZ;r#Ko};`%rL(mbnR*TSCR1obV;*N)JH|#kHd)Be zg>K+A>beDZZKYktHh3Lm%q!4MINT5W9pJN!|BLy55?d&N*Flr7aappj@z*wZEx5zi zc#^gEE8^9)!pqY<6nK3WWdvTMeGX#_6-Yl{1t!NhU)%;QU%W)WWeTvG%>9JU2#k#Q zo6zMC*Xw{$KpTuSM{gI5JRGa{ijI})xVC4tVMLD6_z^G?omF+2E6-LsB^2E_c z2LPj;z-T!z0=I)c0yfqCjXt}9Q*Zb*fp+a4#%OA*dI=_@N z%=fb?*g8TBPLM7hxxs1j3Jq`oH=zwpz`k`Jk6M%ueU~~h#zV&gIV}x5;@iQq>x)}yKp^tSs);H4Ztqv*$->G@vnJ}U{y_so=Q&6JN4o>)hr}lqe7e4vISMX`4D=l1*erA)8TmY8UAHAL z`V4db7(B#*qc0emSzAsYP)c&31CyZxR~p!FzMmQ`_*9e3esjy%=zU6<^$hb}a1CFd z8M|0#1Wwl|yPC2a%OVdY(>9?2La)7mm*9UI^!Y)?IuKaZqeJ0EzZVmiG6wyL^T4bD znECSlBrv-+rxjj}!0T4#`#fN#l6OFWzxfXCy(2x%TLyTUjcqi*q<6QL-9!WCK?CLk zqZz=cN)63Fs|t+N-|2Ku7Yzt-R5SO*&RppAgE>LQcYx76=7+#2vyDzKr|l7}AzuNb zx7%nyf9#E3g9hkgynJ>+13qHzHv*fr=!=Y1IwRvTn)?H%b{Gi_5Euy!5ZFk2g$4+G zt^psBL4M|`4EzQ@;BI)1ubB_M;6rxauG+siyX2@gW9A1zN{9RrA6ugD^uvz={(gSl zk&g~qC+ie=7SRuWqT)G2rmC~1Z(o7#Vk`e*QVrITJJz5xX|%2^OJDRg`W98dtxy+i z-SF}TL!#nl9aymv9m`@^67)oECpdX^MDs5j0 z?ElAa8~d%jq(LA1wYRSo`av~+Hmtz_EXg^yzgXouqKJV zvaEmYYoC-MYu<1vgY~R^t#in_nb*3mNm;V4l^~DsuIS;?ml=(o%N^*sh%d@Fx91zu z&~Z72-rzTf*BT0$gD>q^joysEb;8l-_;0XodpmW}neSRM=21pFuPS#nT(L)CgN+U{ zKCpF;N_c{9*E82}rZu+Pb^RL7at3{(Dg#AdQhZB@uMc;0Hu2fw-06k=H+q}X@j=k) zqo(||Q@$2wJwA&Ro#}_7xhlRSK4|r4jc)TEbTv2No1j&P#;aKT^NQ}b#CnwcZ+H5$ zzX(frC1cyHS2h})8#$2rGZv%ibWhrt}$bP9X^F}ypD zzxCNJn}1)I4+AgN;#`AF(Z7Sm`7JuB0Ue1s=Ak$XNE?X0Xk>Hdni0&2$YyoTcKYiF z&5*V}OIz`kSzH&TINzadl~MFl+9`-fo}?Y@9$A*W3;Qy9UKy4swe$9d97v7Y2M+Vwb+br zij-H~@KfO7kaN>k-xM8OehNMZM++FA-G0j6<&4X6`kL1^E`2FSeCF1h%@(<5x*+PN3hY&|3LN4Ps2yV?wPaWBvxUNC%!_VUtaiu(BY?MB0Q(h z_Ted6$hRtu;aZuOQo0F!!Ai;#J)A0hdY<%mBbI=B(P^Vc(Ou}-ob(@Agii}|O(?z; zjH8OG^&L2y^DI``kDdUoFCCZIiX!hoZ~lU6U-1t8?8*EjZ>?VPhMMyl75j>6V#5i1 z*`rI|7<4Z1Wm$XyoDkpUl`Fc~rvxd^f7sQHXL%=jO)Bj|*V0(;KVmRs;cDtW~Z(O2V?BK$3et_NT2;L9@aBbz_@HfT$aMN^wbfw$$r zE}XpLt3t}|&i_@weH-u4%_-J-9oc+GZV-M$JRRlC=_pJO`9=R^=j;w&ZeI7M_m(KzoTl^4uR6Vd@p*8y z5MG11lChP!&)(CauusvbzrvIF!QNkPj@j?MWuF@4$fEAPwwNYK_nWFXbMe2`9O_nd zf_-i-{iwu$sQBv2+j+hS zefg2Gk$f`mzNHLwu3Z16oOzTZ^Y>KGkwvSR7m1YPMmam(l*3OA*E@4hq3c0C#0qeg zCAy4TY5OO%J=g2Y&AI|CbkZo*&a-FlJc>Iz7|B2ppJpI3?cUjf{HNAU}y#J2gUFQ3r=-p(4 zi{9lH{Lkqf{Mi3W@4y#3`0{^+-W~D$gWhGd(Yqf!Tj||B(7Vz9_vzg$^tqkh-9GCk zdiTIz=-mVVn%-@ojGO6QEam)8@0b^VqIVPihxCrI_;>W~;SbvB-AC|*UTraqB`ySO zp^NXq9~^#&gujcs$5Qmm7Tv}tpw;-;F5aY5^2I+`4nFlbYi_s|8S{7WbizkH?txA! zF+NN)2F6Wd9XhC}hhz=&;%sLoYsfxb2S+&P9y3_8pI6lUee9dOSbN-{-{Gp7Unsr= zk$2;Vm$q~+e&|`S=1?MzLIqbdBX_G zSoqicO)Y!G=QMi)#w@rP+lC`p{ws;i;_r8G zE`NtIFcKiA-MV!v`IHOoJUs$a_xX?<~<>c{_ZJl5s|_w^ts}*<1Ab z_^J_#{Y+kmqBA)@MUAu7jp&pW%tmg%X?a)p{?OueL4RJKw>_?8oTJ?>Zz(0k?%aEM z7S#>4Aiwr=biikh)a$bMqKx3DlAU4C$k>EAED7Kv`NZB1ABpR$*yma3>rln-kY4f2 z?*bmnI9(&2#S+G87~^y?8TG51pr@ z3>%$mdN+Hl&hvF-D$dH;$l?=~hSy?%GviZ%VKM?<@Y%uA-PN^xInveVz| z$IZ^=p<8~i*_!SnPVsm2wVt_Ior9me9*ngT;8@c~$%qUmtTjbjPY1a*%JfI1%4BOU-_ZXEs4NyIsUUQ>H~`l zl~zB9F97=&np^fZEw(t@VUvU|`1lJgdu#QGQrsM#;VU<{ zC?1Ym`zjebZddk9Wg9Lqd1%M0)M$L^u~Yu3Vg=% zyw7b}6g~qzh0QipV=N$P%AOUP+e|qBLw{Y-e?*4&FuZJts_QP5l1@1uOL9uRe_)+d^Gf{*$^c`9jBB^ydJvCRlUzl=Tzm>SF7a0?uY78SPbkJC&@r zKlv7Xtrgq_r@jhO_H1O&Yf_9ZU#jQwm=~NIem`BeaUlx;f%ptR^D|+wZr+N*@JLb92>3xjdHe%g6C`;(;B+6Swd12%^ z105^Wdpl;Z2FY4}g*>AFb3IR?ZL*dH7oW-3ZFEo$@oGX9eESQ%%Eca=c#e#{TX8kt zg}(lkhN?fbWMt{3kFDi=zFoIbXcc_if^Z+pqB_q)Lml+>HOg&(#>LRLM%LnUAB`%y zkVl+ND`%Cgi65wbuRB%0L)!+r>@6DZbeDB7xHyq@u$<=r_^?L)*XQZu`!eQJh$ELg zBO*>{sKnoFht)=4CGA|ryLNoK#+Xc^-${%|t1ez^Tc4i=-jEI-=|`};X=tXcNsLz$ zb107cNpR#Tz2T7HiO{lB1y5~0Mcak%S-z(wV?VOq2F5l~ALv>$!>MDNj4gd~qLWvx z@50!I6>nhd8o_mR?hC%hZ>JNzylo?x3(SMeS@ChF4(RRg{GAx)jDIERHsiPUA;#3C z1iR)#?PJUbdh&UO)L8Pq#_P@4`&qeNXb~umwRL1Lj?hin--eH{D+j)(4 z$~d2#hW`TQ>S@*m77~HxBB=KzOq%>Gqr+h+N z*MRNl|KeM?VH@@#zQ$IXznpYvM-2`!wXQKzzA1urf%m~t~bO$25rYpq+t3TGxQ( zd^Zu_ROKEtls-_ely`+OZt(L;oygfoPrcWnOO8=R5AocYwV@)oJi(|M@=vig6mb^* zQfPUChuR@O{;7J``VhbRdMdF$64IX?JooVl;l!)iGxt^9w5_!rmA%ox;~4O$VqIua zyd1gc(S~w{*4er+?wG7e@TXVcBNFwYu61DmwEQagEbBrt@Kmi+;shSDE?fmqGD#=v zLZVJt5UHPVHJW{12>T4-al7gb`Pe8xN4mP!1Q)*x&W}YljQ@;!moHh1(X}qf`f&bD zb>kW4fvgR8&YbyMcQ=h9m5o8ycWZ+i2Gi{j{x{xc|iaqkOO7-blSo+>z6Ux`8is{Ey>) zi2q^Szu?}D`zhZ4#9hwJKH*-&{|~sA^Zy0z`?zOwFXb-vE~Os1XK}|?wRob`&;N(G zTWGJ~L}*xfLfq;rsiBEssoA{$k^C9l-{&rRYn!-Na9_w>#aG2BDB?{2&I zdNV6Nu1MBSoQOw)Qw9sfwW(P8PQTg*3-kB(M- z4i&0XwpLxSm?FKFX=4iL=NwX-_vV_T)LbqLv(e zQ4PGw2a-D@&NB-A#O$Q#lWTFRqx_wLC#x`EhCl?}$=M7&VL2&B9o+mzDimJ^a)1 zpDeZ&l@?pxDT{4oy~QTyty0$s#`+}JCm%d$gEt(fa!LB*dmeP9k@9lsqm(&60Gp|{ ze9||$8*eR%GWZ7G?9or(C&SqokEqYV|ew6>vr++5?c z_P-vVNsJHlxFDG^dN{ccJImV-2?f9p$I>K1pjnCve z(G}0cPqvJeuWPJ)e;=!S*I4yPZ=Y)^dHG54kq}(`2=AtjVEuWvWAx-Fl@fu$ z)Eg~(+wss1T~sOmIKB+p%bkQy#;(ZGMGkQ6^%Dwq&z>$Fgwrc6O=g>=#EKqn`};|( z-#5!{&zmea+UI5^`L~h(54mn@?3U)V4~tF%n^Sym^~ZsHnsM;1NG+LzjzuqEl?n_5 zR%i8V4Bx80z{%fA9N&!j3yJZAuelg}52gdFOeNU*rtlN^8xeeMPW#LyJ6?niQx5tf z;;%_yA#f1+sK`GbM<3)~eF!+;$@(>U+xc7JYlUAu2dx)Bd6TT8@ezcMF#gLf>)o+; za>Eu+Z@z%-Q>Ms*keObG9_fKoroOAA40ziP#AE!U`?OOY?54+S#^bdsZNwy5NPjy322cO_cyknhT z@QK7a24hAZ|@t{?L%#5SHiPsT1}1)@uGEA^cs z22s&#NkxgOw*!0jj6Tp9B6n{QTEZ_P3K3 z#=l1#F!8r?z&lb~_QCdL6^W|fw;hzhuC`2F7%zHcBUEL`?`8MzE(#eW29Z-jia2}jLA(~;iqeX`zXfL zeMV$c&Iq3cDstZrw6BJAr^&y%ew4Ek-7eW5o+5vT2zcw|@cS;DPAU=_mqI^h(~rU% zgc>XgbeqUU9!iEzo68<@?JYnOR6$$@g;eFkTgsUUV6Sg$2Na%7`c|zgk6$wMe zlqbA&bwxtb*z$z`XkL+!b#HmXW?f#w3**ZZUi8RI*yNp;u-q>%AvcJ3o%0gzWz1ak z1KPcKx5Ue6)wwDIuXM!A5LrlaB|2MfzD>gKtOWk;yh<*xFQ?7jEpGOm%oj=9!_B*? zC+Sw-l&+F=S)*9zc{d{!eGKCLsH$=(V#=Rm{|G$(2lZF{ck7pRRqB_zbyL7;+N*YD z&d{Fb$+{4!pZ*j`oDgY8axU^1=7;boQ*^@9DSO<&dt#K+7y5Jpng3)@_VFGrxy1B3 z_D#qo9FvhXe1`03vIpPTOEQ0Feq(V)uurOyZ+|0JZnYcVyj|a{TU+-~|0&;|vN&f? zmT$hUZ*!h)mHqu7-yXF%=kC|@&Cm61-XiLw%x~q}WcaHQ@-4viZNV(+W54=2-+*OB z5HJ$>OdO%uhXbQ1V3cf4t>D5+{_dIzcD^Lq`m)Qd|r}o|6+We zmv8@Ke4dqW|6+Vr%eQ|qKDm7RKN%mv0T~||n+4=`;ZQ;=4$Wb#su=4i=u_6fQO?Pg z1Aqs5J-~nJuu;zC;Ko$al@D&4c`R*l$qAnzZow0 zx8a+>AKbXJt$*Ha@K1rB_5%LBfj>O)A9I=Yx_yq$X@mcE=1JVYga7}qy;1+ByK-+t==kUx>_S~gdY>77#7Zjx{86L!L>h6m^IIwz#eaaEV z-A8PKz8yen zbN3*J!P1>LXnTr|!JJciQT%@u|DJ?o18TK1z+zcBMY* zTJt#PMoy+aL0ngCzjD!!h{E<`0D6XxqANZR9dQe~;`7lF5AN@84#G|Z8Bt7{g|GXG~a{#*Kk}sHim1;2g27F)wP92ed zCzEdg{!agU`C`ZyXdMGjEA>U-N4ve9>22+Nl=`x$%b&I$R~2(QbslxqM?6{fN-^|r zEWQoW@NE!Io_p|Xpr>!aq#uXP!UA28d7ctz{+7PwsNU8w$W4Vex5DdRsa5_s*$^)}v3`nBl6A7hV}>#O>0#nwxB`xnvw?}JU$ zPy2`DpH#x~KhaO$x}&4c?;J3`3O^OmQJ4C(pJja{v53CFkMA$4r6d_Ytm*h+wcw{U z34g8k;h!}K8{ z{#y+e>OPA9;7Qmxn6U3zj_f#@_V1Vxk&UhcXB(W25MO@461VgP}E*ar^rM zb{s!q8`ms(@f{_y=+?Z$vlEH2ZNYDTvzH~loO&mb_rimcSGE4F|8m1mf6M3Y2;n-)Y-uDPH*~aFUJ;$CK(l-mg;@@ux_q#22c;8=#hNWKMTZm%Fe~(!4wY$9h zHvyX*^g$xn?@77aDgWlON5fkSU*;qR*Kq0^5J~Ls$8Le{Xx71Hg@(hrKpz(^(Q!_~ z{sNg$%EydHL)idV{N~$cO^HhfMuqI9bNg>Fs6u;z*LRDjeDEXVTuJ?6uNFc6R``aC zKVW+%woDPwxVy25I;r^P%bcEskE*NeRc_wPHm6yN+I>+y0GvXJd-mRpthl{1va$`> z?{vZ5FBtp3cHkYW#^b@8jzygS>{| z5OXZ|OZY6lFDlp^0Y3hW&1T7r@NCgX4rGsjoO|37p5K`vhi$7LbLkE!cJ>Wa+?F$Pg)C))J`&ttjtv@c_#V*DUgG1?wbj6#1|wjAe0GsWS=x-|x;?mMu8m8JngcY?{8Ke@{^70_q&k z^FrP);{7(B#Xc>9`{i+A#`Ni7#>bT~;~-+b9ih%JeJ7s<+~b3S%$vA}M}?XV{lm;3 zGVd-Shu=HH7S~9f7W_@TJ;RnQwBUWx?Vz8{%M@b-bq=J?$CfC@akTkf`Z<{A3G^|S z@AoeXGk%;JW=wuC%os?WRjxV%eZC{@h9K4aDD7y^Sg}g zc-!14-xY|?c}+0zC~!Jl--wR~BaaWms;r;k}Y%NRWYEbq?&cEB=@clUX8 zF}|zoV$7S^#i;fhdGr_Z#^a|%U>P1{aE)tdc#!#0Oc%y=c($BTm$cz*IKE2+XJ!7$ zn8YxC0?QAmvxGX+c@|uFp0;$(QH%q)^7vM{$Y9))YA`N)z+jAHT!U!W1pJB1S{WN0 zWd4z|o{S6yXALf#-ABM`anB!KXAu9$KjI(xsIM|ec$A-M>tMZN4+GC8V>>q;8@fZ-(@nyDE(<%l zD0mMqc#mm{mw6`kb6+YQd}^XpbRWh4b|>>$FCU}${t=&KNyMIfp7YQgY=5`22DHmB zh4wb5wd&A%cql{8(65vP-}KR3Icf*%I{VXxzY{<6BK+?quC4DqXxmS}cG0hD`gIIF zotiNEMVZo{77MZ|`gW0+5bt`m`q6LeOT`fS(wV*ptg`9LZ2EMG{zzZu&?kTT@^@l| zETAvMXNJ!WZ0k?w;wa#)#db1^EZWr{!Z1y8^(VyDA35{G_70PRt>fw+Sr}h%)pLkl z@pHxcOdM`mpt2q|(zkSETyyrqWp8`8=rrqp)zJrw#iQWx?y;6&k+8zx9SCuXtx- z7nnty4sZN=zeT=w{8mJk;;%L7*l)_Y*nakFdS9NWDE2Icvo6mOO@imyZ?x%m``^-} zQ}p(#P{pYhjES!5iQk8fsnIo2N{NLsYW?-m@OgViQHI29t)-lr$B^;oA%EJT*nzRV z%vEl(tK7+L<+it{B~O1C{&2xmVq=^_=6&{Hq2a`Xs!hiBB=YY=$c9fNA3uj2yxB)_ zT8X7`I=^%D@eQHTwFi}wwK`=G^KbVB`XYPvsq7ys`QIJClCN=A6}hy?+lTX=T}$7@ zrqkW}RK+T2GUqLa*BH(o!mowmVXfRfdXbOtOq>rk`*4Psr+4|gMUFcNAuW4R{Bs}& zMV7f+aO4i`Lo3*ej>QLfBl8rQqg6X%HzX2suX6XqMQ6a}6Ynz4dZpxgUCSm1`UPQg|!O>s8hN8{wXN=e3LUCExOMqj_T}=<2w7<3p)D~E0w0xdeMgqEnek@4=&T4MK$yA|M7xa zG<};=WZkVRI*0z#%su*|Gw3nQ>ZUk*imYy4>$#YU{4Emsn*|u>B5(Ga@nq9nowE15 z)#CJ@F}Udmcu4d$8kS?Th#dR~r@_u`y4E-y?v#_mH#yglalddhsp!(LBZ{tYUeOMN zrs;0zlDijO$0x~<*IPE}x)CSZQyDC00mLFNj^ezzJLkPNlez`B+pq_9#R5Ley_xZj zLFe*dAAIO~VDGnPOtiirHCpKUr&AWj3q22qoud|-@lk3UL%C8$ z?GDv`D}MdjW$iLAJJR02FTdUP9cAV)Z&osI#J{nuJ?%7B{LZ9;qbugi!e#5V}LQI)@ z&c=>mpZpp2$tO7f0FO(~5A}&|8OoXEMD(+cT5Pr8>>B2aj&qaB1FHQD=O0zaReLRS z!NI=reMNEZ3Q%l&D|FHCX6cHG-%z9Xg(=P)kvoC2HJo|WrQkn={i_8UCFd-@;H%hZ zNG$Ai=PiPM3JVc*8xha_#Gz~*tG1={b*^y1AAf;hDaW*b8 zelC0_293-ceV2qa8>B!x+A^w-p?6d3LOIo@oMxW`UM2oG(JA*l6N6)_s|7i24CB^UVs0@7B%-liG zNZ>5d0m6*U^{1OPm4Pw}7(R>+cuIdcyZd>GPvr%Ha8Y(}-L2eO{nl*O#`V zAC<(OI}1H%WDbLSKnJ=(2X1a_J019RiQ5)w+aK*x9iQJs2WFE$5d7`?=VYfxFeSV3pw%bF2gDIcwXU0xdWVEpQO8T*?tz&>dfN zt^8K2EqM-O%^DTjK4$W*o;6tN5xtJ~_ZD5^4+5v{q;01kqRZ4yKjygjIhW6c-SD2f z+v8G=hK58yKfZ>3$QgB=i+jr#I6|&a}-#y~@*i^C?{#N{n(6<)V z-8ymoD#PdgA?czQCA?g=&Nl@<>DwY^^xD!BF2uFV1D+D+qewco-dH=*21K%~RmND;^c};$$1WI0d~p1HA}S ziJ23q*gAi&iw=22SL9iwMx$@(d~DJm^aA^y5(QdujyinWXvJ*kgy5>siE~mWV^sG$ zjhNe{Z=(?_kW&O^_if6=20-}5i;Ph_jTqcUAIjS3!zk+9r$d*!jXt#V)6hF;gU-C7 zjW*Qt-&XX8O;(HE{jl&s!ZTc^zY6PNZmcr+!co<=9$tb^`ySlg&bk|kENv(FtBX~J ze2LF4f$is8$3$ODcC&v09`|R?^lj7C53U^eAVt`!h!ln6@>(g^pG= zGR%kEmgd-z6@}}xLnid}UrQiH_&uX;q>q@4PsQHaS@O=09H<>ND5d%Lj&k0OF891X zUg>jgaZ4{4&)JLkl4rl@p}D2|_4P`Bn7Bw18%fUE!*+Mqe&%_v8m0Zhb(w47&;)JS zlcA=Hs5tEm`!ExAh@L@tuS6{peS)z{yf&QjqJ|FA+{j-=Igi|@H|@s%uB7)My{Gt% zyS0ZFIIE`?jz4zs%{Xr8U@e67XG#Cqgdmf&S<>G^dhrXHZBEd-Schsc`gl#^Odm=M ziFuW=teBe=KQ~Y{AKR}seMY?Wovb^%`zb?2=F^eu%K`Wa8=~A0|HTKOr#TtQ0x#Cn z6^B=i8?kHGqx0xrFy%kY-tt<91TEVdtDR@enhJ?=w0yj+(LUZ*w|%_r?Az=g%g5Us zhsWC*-VcgCWeSNt9o#9}46JIZ#@kx({d-ECU~9Ril$>lBZ>!mW50bzMwo`fdIgglN zt2&_Ct_+x9J8cS#t~;pO8V{+q%5PO$-AUEf;^6tbYCC&{=WD9X(W2U<+#cY-IcU5Z zFh!dK9>Bxw9=p_IOG#PMjp56_-ts-N?GHVc<~;Q4q=~scHtk3BypLZ{-r-z*_l~BM zjrV<*bYr11eXHiRP&<}9S*tn_skJOtO2fUL)UX%2v1z}$F^#mfLoGLS0h6^Pp8YLZ z+VP*0Zgl%3>Bdgq5vDS)soFZyd9th93lT2gej%V}JBdiw{o+s0LSKkpyZ*{=4>O}LV&vt7i`<3)TsHVwf~ zB)%eF`o;3*Lq98TRux)Gue?7F_+&(%_P;lJ{?eQc3pgkEZPxs3Y-Pqh#l0Na#iz(E z_9Jup7ToIx4je%)@eOi|k9p4Iss`8Z*Wn+7`^dO{8tVx-JU}Z3CwJZ&qaB30|avx2FQuJ}FDA>;X$ zKK(+wrC&$rm-I>cA#+yx^bmd7f7@-^{WDZkJ#Cb^C9yHwfMKmUO4~W3oAwR;`2>1! za4504D8HUQ2ehRPCaui#TgBN9(3p9QFS_eNmB6WvI*i%C zsjaPHwDlI+YU>pTEE2SLNSjKXn}1YW@x+BW`wA4y!E&dS&! zNvyYzDJAd!h7CG%LHN9r@D>-~mBl~balOPT>TG_Bw%4H3_9}D@Ueq}hzT^B5%MI85 z3>%KinaM@2eKLMmWlsVhx?9dhSzihq(6le!NseYuUhpMrP9btJS#utVXqAi2K_=Fh zcCKK5E^E+Ry<6pD{o$jYLM~Pws02oF9;d(~or6bOaMvhj3^JF2T$$(H+!c2IYRCt{r5fr!BJLySZsPaU&^rAiUfD81yvie>rk|;HkzZ zpm`IxURr&1+24MhwCtbW%8iQ1C$t*$(2mVj<87p0_3$X?T-L#9tb9vIdGuN2_56IfIO6MxSu(B|vVaj_E)gzlc|IhH)*q9022xN#C19Rs}` zH_qe6RphGW9hI?BU0V0XzHRV)9C$trEZ1`-ssYwf!1F8k-lve)36Cr|DPz5eSgo(a zy9n+Gp3K5m?{}0bZA53QK-!7ERzc_&t?i%qbrSXCL(Y4lR_U`$gD~b4nYVU9UrDf~qb{L)C;5N!MO6PZ|LYcfZ$UIfcFf7n=y|c8A zO18F-n4y*Uq3+GKk2vO8=mhLTmvYj__%bC%)z^_qiSP~$^h@M2()TmKyB9t>Zsya@ z0QcufbCB}}%KW_S=AuqjD4;xiZL!-G$jJvZwjwp}H%k2sO9 zIFCPPDfv}VoJZh&ey-F-ADyo&`gE-teT+T#%k0@Dp4a(gc;v;b!TD`_Zt4-;#Pi_T zxqPKW=g}%F5}P{lvv`hlHNc{QxwjP_xoq)*CJVkGPGYMix>N@j4`@n+pI*+MTjr}# z_6<2pkFFu@wP4R8MK$I>M%`zE?b%>F+Hq+F zW6AiZ$k-nS26q1MBX;}tw~4XAyRS9mio82Vn)d%|_%HQKTdS_M3_1m0F8tp5oqzD= zA_r*EyB%&$6JETHH;+dbHJCUW?ByfjwW4m4RiV>TprTWGJAML3!Eb*Cza3pL%DD@f z)mda#&$wh(9*)n4;NNNEs2e*ilQlom`v+`2l9suxvEs#1PP-a#Xc|0sBL0|!Coijd zJU;6-L_PJ(I{sSYmEl)t-yOn@_aA8s=M(&nRBb|y!!#)%}*&>$}UAo z2}O@Lo2!hgnagy)hbia*57W_157R|>yQKY*+GMT;@Wgp$o0bDl-0fDIc01Qh#il*O zwVkUM^zIARhJL_h?wF96G5n8#{#68aG*85zmqP67O7>$5*qhoA*p0+51lb}ln+UQacbO~MWA@0znU7W=fyUt_$t*Q3s3`da7 zjnZ{&qe~&h_Ywf{mX~& zqyhM}4#dy(^|+zhxPt+vbf4R_4DVsu;<+Ivjd~XkR!YCh8*jTdT`B!y!+6^XY(PKX zG2T}8?s(h51LJL99vyG%PMbbG&i>)JQgS4i{ewd(`Ru}Y8}j;+Z}byvjp<6sCs7k@ zXLqQ!{jn2lbw;1)Q@d2#>DN`;$+uL_YP_OPv7cyRKXH=%MCFe>|Ek)~98+z5D7zQ^ z71@jIAw*6jYt38uRvp6nQor=TmM|Ur1J9*7Wvo96`-IP?>NcKb4}soo!5i!$BEC<$ zQOG`1=ar)+gXiu7<=}GnwXY%m(@ezJOjVaL*2jINO23k5r8`w((!fOTJx>UO! zy;N&_|ITP)YudoWBj^R~CU#g!^&S5YYi|M`RgpD*S9d4rY>}^BC?kxc`vf z(e&TQ{}_HJ@;@vgK|7g2Kcjl;vc50#_?uExvKALBz2op_j#gF ze?yL~YUX1E<9d%dJ3(CobJn>YUPkI_)Qu&tOy0x?wHn$L{mTya5W!(#aZ963afdsr zT+S^V#QJs=!DFkiO*jHQyS&}UX%m|LVM>QdM}~Bm`uflg`|(A(iml~?QEJ4?>?1Ne zsjyoESW^$E(o?-u>E`d*Q$RaJSDDFP`dg-ir*G8?}0Q^@7>tRQr=|;&*F#hqEJW z^;czlEb?iFHvdDzS|jV;#Jax_pW>9ZecESguR8qPi;>}8e$MY^XXNd%$nOh~->Z?| z`>P2XpE3B9zX;u#5=ibDWcZ!2>#R3Jg;CKWR~JGqUdN&ysHL37VkU zgJx^jp^G-gecpl{GBWNVWZeG9xZ{y=LxBZ)oKx)C1kTl_&O5x}$>b51*O70(2pCfMZgQF>+YnOzurYJvw{h8;7CB2R z3qn>#zO^9VmSHOx%s)PuGi>PNEy%Z<_IuK5pk-r`t%RosF^oCoNWoOTvUNf5NUG*%T@C2 z>&S_WJypg%o$-Ihy#?9QP)dGmo{dGeJj}C`)M>as$bD8@d=9$(a4dv=NB1~e>qFo3 z==(k3=o^Nh^6P(TgZ^X8#-mZ=w8>?jw9b5M0{Io^JZRh7>ZhceKliz5Y6a(fThK*D_l8!{uCj+>17N8WJC{xGMda@LAR-rE!1)DM<67*u zyWcV=)yckI{?o#YYelYY_!ob}F^%+k-4uMX!T*kZNfX`IHdd8>LwTh|mG0NCw$d_U zid4tiO4GrS3~czM-edP+=g--_C*HOfqDa`BQKBj?hujr{NBU;1V6 z@2$o7Kd8m}_tE;{tH`;_W82jDjq?4aT=hQ8wY^ z@I^d{t;3)B&I;U+Eo=I6hQ?S%8u^#HW9t28?~H$sa}(=Ed{R>E0S@muo!9qL&Njry zu<2LBohJ54a{gCL%%g8;w=O&0@io`~;EUO~-q-T?ewKFjMq)p2rq5?NQ&*fh%uH5} zeVh{%Gko8#6Vvh8RbhoGw~~(kGsJ&r1~FON_}FTHB4&`-@Rpe*UeL{HFD%9*=BCVQ zP`ji2y=4vK>PtVzDz#hci$COX>P_Q(F5T4FRmPa+qXWV&%4H`uM>aT-ZffF+!WMi! zxFFAqiO(^Hm^2^U=JM0*=_ho2ATu40D!2AO1mXrbJ>d3Y@Ezp*)>B6^AksN*}^xOQ%f z{e8C6$I2-6Ww9S|qTfo&O*Hvul{F>)NtZ`v8;Bt?2U)PfNcOPqh2F+g*>Ypg*>c-lvE?4D@y5{X)Jm;g zKYp+?ojrdgeU$cO{IZ5b=U|}CD8@9J?JSS@ZBa&3_;H!6<%YUO%FZ2W;;B#FQENS7>4h z@pu;aQs(ssTKX0|3;8Nl%2s>(_4IoBWl-h)<=GPNvzFMt7)+`>NuB`@>Hm4=H;H<^ zp zISprw1+*bP%-*x)k9WlW)!59)`o0Ri>(4wMW{-N7eh2#6Y6Y(8zQnj>?$U{MQ^1+* z6rJtOxDa>oQn^;mbdzNqmaTb++U*a zC*kLu2{kEXF30eUGyIyL`0vZPwa{~+>w@nG(ftbUCs8L5xnnu?AK`Z=aC%q9{yzU+ z`t#7YA8a|aBhOyZX;F!STk^U1a%5dd(y@OlkrAuSh#lPnZQ4kYs)Af$2!I$<8JW3%mgoG-5Gj$eW~6_ zGdA;<@4js>qKZ?jmFU~-cCVeO=$smOlK7&JyENP>F*1dId`JIA6AR!fx&pBiwPwXT zs?gEldtNdZ-Vh3pTEkje2yWIHo0gkBDQk+b7a4;tDo=&G?9l38==)0OMh$y~Rq&Os zlSTj5!ez&g=&Ofq&P~k!)@1BM+Tf?!O=u9YOMVx(LU`3W+Sql&^Ue!=%R-!fWo7()YEGDCe`Bt;-nX{9fRD zmHqk8=ql%&7uZGUG-J+ka&$e2zdra>hyQ)%1{fTa=7R?r#kPC)*AZ-|xh)7XhcrMJj$Hb+9jVECiNca&|gF`IJ}QNLkbM zyXeO*cj&6^V@)DwrbU_6F43W0Bxc$*{(WhG4)jZCq{I-4V($J*o9|#(^RUOFSZlf6NR zj6a^XhSPTL`$>DhC-#K>v~8~s^=2;(x3ngw81CgBy1&*2G^NHWV?MuMhC7ke%4NuUB2ITQ}o=@ z&smwnoE~Da=EIkIvd;fOEGl`P8!^}^@yW`FFZD0gs{B`Q_6uYj4>HcDF)D38GEM>4 z&LJts|88m7;~x4??j)Ce7CvaeYyh#Z+R@&1;@HeEg_id=&0AgfkNtffWG>p6S{MG? zlXUz?>TDt3kR3Va)}lIH&RIoV#4u!tuG`+6mV}%E583^1_ct$P>V9?at`|` zUCvoY+?t=MzlIoD6RH1@pW3~9$&H~&_4Q-O&+`1l>fZaQlZfne4w<3@ve1XriH4TP zQJz2XeD6r)pxN8^OiQJ_BXZEaloc78yA(8G1@e!`Bnu~A>fInyy@9N98Tn>aXmFvF ziJa3G`R4G}ZPQLs=1bXz`m&s$vOb}dg>Bn8tv7w_jqFo^TqW=Q;rGdVQAR(SFn)Mw3+9x3i3E!SSQx$J^Ykk#CN|?}T=ZLvBGXnUUGF-?a{$(>xz6 z^r}V4*Wkl%@U4%a(fO>mXxL? z0ehTPlYSc7VF|WwpKuntnX`#AJyqCw{;@vtvJ@U@C$7DZbc_{ zxJb_5LhRylhxWJT_ziaE5+h^o$o|$F-Bgc6)zVdloIzFGhi`&>DsA*CQ zhr|kz+*{x08AkZC#*4xXGp54B^GtzR_rjZ7g1Zt^Q}}cXaQXoK9td0$4NYB)G3_vY zJd$lIEr*s7pDDd4+m`ITu9nE{tNkaXlp<8Md+p2^dX0jSVG^Y zohDC^Av`M>JHs0t@5mr`j)waeFg=4wz%RcE2Z*E@Fuy6V& ze7BZ3a)H!w)XqDeV+<=4epiNnv3$Q0IsD9m^tv6bp5R?`^cL~7|8MZLl5cE@QD07|m$i%yvX;az7g>vSzX?CZ zKz(flx+;mWtH5osNvklj2dclXK$eaouanrdRv3d_#l(z@VBJXFi}1h-V}wibtno9p zI{ZUi#mF6RAZryPYgKS&6vcfpvX-Z2v~?4yl4mQ*UXD78ivl+HWPMRe8Lpi`|R z*LgVC_t04q`#8(6W>rKlbfZPAIY+aih@R+3H$(Tw^orL?TlUmas4MoBZG*6XSZ~<- z6ZaM5Mf_yV!iZLekf4bh4W;d{*QjgXLu<|V_Mvww!^c<7(qo|glUDb)9*9%cNrP06 zBdpoH)qYlqUy@g1D4kL@I#+BYE}*yH1D^lN`9L-A2+p|CLCrR)>^jqei0^rC%GaKC z=yr}SCm&Zfa$`GWx@AFXL|gm{&VZxo26NVsFPBDC5YsA{?=J@TU(Qh78{?xCfqu}P zrAoyYN%8^z#`&}fS}-vx!0{OQ;;PY)M&lpVg&c9gkZzQ?-0!Fj3h zXXtpCKYP?fgDIW>K4l%pMG%ZEYyCT2<@Rc-1;6(d3(jO+;AS7V&Xtk~Iro z^mNuyggW&I7%Ag~wmL$8?+`QvK zlkEw{$@ZMb(SwggCw{q~IWm>;Cj*m3Ip)Z$F6PMOx#q~rlrI7{E6Jyp#qVVN|4v2+ z#eHEg1{LDV9W*&ANBliK#=xvfaJ&%M23_}bTY0Rb?njf3{Q!QCX(#ceNyN`?3*)TD zwv#i66aSuLmD{n|lKGmjjTKBrcI1dL^>Xfe=+V z5gCbfyz5iqSVbcrMIqaG$o*b{94qqCT;v`N`6v?kNNkvdXT;H74zkfgWTQ-Eqkr<= z*bADaAMbAG+0Lj~tu%qW=$wtT{i3IK#im)h#wBW_X1C=Gr>FMBvB*w+v6~RtN8}#S zD?ah?U}q6}C|mvhI3GHnPrrnYWcqr~;w2{6K4UX|e{6?unsdDTERXTzu_wNtHb0Uz zfL<|=J#qhn?vA`|$jOYcf<3W!AL*sz7WQwpqwHDyT3IpMd$_e6g?1Gz2*+Sx&uzXDu#bf8i2 zp7(e*=X_u5oCMV)hc*8K*X)v{y)wsbd5^vP(QO@+^%Cp-Z!uBYXT6Dyjy&HET5!G+ zIsgsu(1zH1zYHzt&tB1;Wh;Fj+a+1=hgsvlVgGRhJB2yxlS*GOMFx@GdqiXC!H4)1 zRj~fQl=W{4%j#)S-KHXk{Dxn&(2{@t+p`WEUE*>@#)*zWa*ONsI$OwrHp-B@h5qgQ z4>sMsZ0>G{&GByf)jOq^1HMxF31{H;<&SnUpbyULYPOC}h|*FHMrqTdqP4!{F_-{f zekdwR%Yna!n9Qjsq0N1pwb2UT9TsTwbo>{$4#c+KIM|uRTo_eod0wLhuFdS*T7hpJ zk>3Nsai7_f>sVus4LO`agJaf?_h|T5>+|6^JFD)riqSfgJNsM8&Dhe0QYS2qbHIn& zX{Wv^ins^g?bh^hWI}K1b=9^es+u7%nLtPO|4LXY7lBL4SC{Ab3Lq zUpUm+%NGXK^M&Q1fpLeZD}14Ev|rp2_`;ITfpOy}Md>+rEk@rg1Ab+~9|hhGFe!jn z>}D@OSPRfoz!5t?mT!TJ@TToCkFMMAMSWrUA}ZpD?aHIgD6uD<5+9gZKPqY*{{D z`4)PN>PjPMdZoz^IUIl8HU8wb3oj|A{t4O;JFc%(cp-i!y9!iO;D~e7DrjLvwJ1iaWpVrawbGp4T3c-A$FGm< zw9M^Umzn9+15AX**>Wb<1;9Jv`oY(b{j-ezj(el>M^5R|D(5=m6Z*ewrzb6QAF=9s zcGaHR)89Ri^VdoC|K|dXPFF zaorQxRlCQ(tJaGD(?MOerPCrT1ucx0h2u?@{0JY*W#rb*{Ey>b@n45LB(_+-kGFoH zFE&t{luulj&MNK-@cJk4BChO=VssHgW5#Yy+WX?S(etBXAJn3r_v(-aGv@J>9Y!{u zu-UNp_j{^Wn5Wr;`dh!-Ztl?=zJ?z1XbrqhZSL+68$4fPCGI1pVl-zuq0HY~@X5a9 zjhJ3y*gFVQ74Xrn1Y}M|OmcW+8jui;YkxY=ll@BQzfSpcV5PZTNz-=Nj}T)4x-0 z@ih}a&N|A+e1{xFo!a!Z$GZ03TA6nXv=@UImz zy&D(?14F@6U&em6>4K3v?%kICqbX)%IAd)AuXwAXg(aJ@4rgr^tYP1TJP|ypW1Yx` zN3VIpg;yLQzk=|JIra2k&c|k_L}}uO@C5B^XYfjOXeOTV~P$=Y(~cP9PBi}?^mjvCeru8l0c~2RMI;wS8;E3nM@LX?ymVmTk2aeU^`G ze0Y1d$R%Hz>?3|OwbQbp8{g2UF7)BCU&AdAKNe;gb+Cu!tCXe|iMP?0JeYM{SJAi3 z`gym|r|I-*4Bu`^pHytDR+;PV(`5Q2Yo+)5o955`gFbyqpYrc+i}(@Qv^9@+9-*yD zWTX69-nJg0t*3bY6K&1^gSOtGttzA^Ge*`^i}NA%|3Uh=GKA@?!f`!w$TqU1bbkMk3wIvP+AqsO~D%zzg3*%csq{Z=KXsOw9920QT?b2#UgckD~h!Oc&DaCxZuW85pU3Ao)8=e}9^68XtB3f;x73#$F_Oom zoceD-M>_}Sk4)g5sl<_-Mx4pK`7NAZqAU4||C;71x9jX#*1Y-Q&b$SN(!4-Z?$lc? zoq3sl*1TI0PWDl5>|{&xmYZ^?-D=HqvvoCor^}Ix^V%xwsIVT6Jh6eg>ujmvTq%ke zVD@B_^?!rQBxD}p)8d1?eVD{vRPL%+&Q$`Hd$*1kHfzQKlT~8Rmm6u1@ypn=GJUK9 zhu^~>0J%rxoVC&x@JT>M5dX~!ygQ}Z$11-i-b1z7$5}|7YI9$w%&B~DrC!#&WU;)< zd^F?TO+4GkSP!KT0}~!3@_#hn_>?_dyPFmM9(d9w#!!r(!5-?$UQzxf|D4!Ti=Bmz zg9lA|?ztDhyKwY20(;q8jQ-8D&H!##pD?mV4|fROO8;LyLJkM6V!udZ`%X*>75!JD)H67o^V)jt@zqn<51<=LshhWb#hgcWbrCF4( z9zXK*Le70D`--w+aKnsjrm>ef+tQZ1jQ(Kru~Y2xzvb#`jjbRtO%h8Zayxa%wkqrZ z8>3^f7|b)iK)>SuZe(sA&+LZ5vt92;=GKH4MGP~j($4#pHF0l5t^wPZYGMz>LjU^m zKcly?@oN6N?2gFoIwF$z6OATs!Ul^oo*B==7Z>w=Bep+V-y5CVAN!v&6_#p2&-NPQ zqE6QK)%g+av6J4hDw3*J!artDVuq}ajn?VDB{@6$@JE*BFEgnJM&JE>Yk+2xX6;y zF0>h_x<82>k-R7CTl^zqc^@4|_o}P5(nQAn3}dUZ2wjXU36(b3vkrvs?VI0p#6Y z@v*=UIK3MS4s$h7CUF)*EVQFkH#sx@%1j;h3O!jzvS%PqJi3ggCG)w*{?5_94Rz^H zrPwh8|E=8Hu=n~6*mtMBCygOi&wc1-q3`&tqW1M$WOMmAcS^4C)@GuC0!`tp8cYK*xQ9^Uy<0z%_mp|vdJlP5{X(pA-qIBOHoSxnCHNkzny0=9&c{NN zhz%I-c@XKPBiy9`p7x^#vv}Kg$_w)KyQnIXn}X%Cp5h%dhoxdx~eWUIkws z0$=3%@AY247$04}_`rDxnc{H1SHAd|-#h+5zW5D#`|DjY#U$d{`utzW6ce=|r}GbF ziiz;?ugFLB{d92jcQQp4^1-?WnSxjl$PV!P@RFm{Jpzw=1=>A@bDd7`e32_wB-yOb z`l{T#70Nvs`Qkowm+T0S*;R3ERU)xI;NcB4vB4&iz1Pkf{1ZES%<(d}UBM5D_xut2 zBZ+G-wvheVM;(SA3jdSymrDE>#CGq`c>dk}o`j8p*gRBWi&_F7(s_QQm*;=3&y$zu zf5vYwuQoZ0saI`Ixy`F3MtcLV_43=j&Y$7eVm~1^L{<1Mx#k(yuHpPs^b?Xx%eZRI z`fBtF`RH;_5O1KWsm-0e1ieBy_EylFsyVi|GTEo`zQmYu5!V=-&y2UyIb%{g7exGw zoyV`SaRe<6VoJf^}_Xk<2ypD z#ol2`66Vmi5s%N9j6#Kbm$Z#sT~YafAU%fK^{QTrpK>is9q?h))Z4L-`Pt-?Nk zuE}Z6_vKv8&+!>^^elVj*U@iV=K3JV`Z_H)h}VC^?6mY%Zp+*No&`DsqJo^0iN9{K zBh%d=7tBud{y$)6Fr7NZCM)${v)u51&GG{G(~Y^7vp!bK+-6Sm+~!V8zOOZCZn%>( zYpZ3Iq0};5uKe%d_qX)vJ;Pp0CGUO0{R^gC%TYsV1@ZPnl)uBmLE8W0TU)8y*U#!f z$8mQ%WhQS->s!O#(({9G2EFs`>YfgX1LT#Xj1JaYoXGOuaz-la_Zstk;&I{#EO(D+6--{c3m}vmOPG4TM;&+qW{nE6S^sRuv(S;w3vB@ zkIdlxH^H@Q(ERAl3SJmd^2PwQwwSTVnD#&mrGF#oL%LC2Swwz{By7~ektZrg+1wV@ zLYLQW!5gr#a7;|~<{g!F)39Feav5$JY+M^N)28RHHu?Xseq4U* z4UguGt3#)>YbJFkwiSCqf7d4PJehusXH3Ku({s^IV7%MO6MeRgciaI1Kdg`2)OrJY zMpqT*Qddpp5_xw&wBYV{lemu|KeY5k;BpFI#}|RgDf}Gmzj?Zy*VlAp$=JK*M&_lM ze5S%f%Emlqt&CGWgm1+7=a1}lG{tSFZyDIiFN6n)>>)g6LGfc&BYGd~1Lq+OZykRQ)F@~i{x@N8+vGHW||c0bR^-G_Xa_VoQ_)~9`W z_5jbw-B$+R-ta(~^|}ww;(12yKIm}T^7u0AAbHk{XXNgavyZ}FW!6_rJWC|+0Cq`@ zpp6|2!R6=)YSx>A3-^WX?{n|PxvPiq`$ufR4`P=s>vnVsF@_i29O^MdxGJ&Dv5B4b zj;Ntxr#&1yAnX=*WpnkR?nwA*9`-y=_9P>WWmbpB(<3N!XOlYS>EZ)M$GH@vCMOWJHPKCF^iyALtKue;1JX%-iQAI1gKK<8k1M`KfS&cYjKS+}f+Soas(-WLOGd+X3;MFd&3VWtFajwvL_ z22I)jqr|gp?aCk*$}jXS-4vOXwq--aT4Q*s*p78KHOCh=|Jb_uwzuD%Z+{ydSa>;j zI|o{3WSmz`jY_7l)-QbL*(J8FLf58}2UTdEz8AlXhOCC}NIpD?rz_tX&38iiEpSN0 z9>Pit*&kWc8gP8sBpKy-r723pp zGAnz_`iQjKZHA@ppiIVDdDl2A8RuBWxhm>@t%UQPhH(}%=7#y6OrNV5CpOZ%`s(BK zp%059?qQtm80R+56^{D1!>3TjY1GHruYR0*-d)BiF|h6)Ps;7_m}qNZ#4nWFn9CJh zufvlh*XR}IRPy!-UFvj|Tsif$Nr5N3Kf6PpzNKz0b#2sbhP*tDs{B)lKz+XPqZSeR&eTeF|FQN4qBe#g2*R z4$*l_xjdKhlg9rpzlpxklj8H`R%rHOWG<;EbtE<=F{etT9f>RT8*;!?$ON0HBkiAx z^+7)K`m|q&H&4Bk=s%Shm+KmHCeR4|vgpX9j>rlPZ8r4l^MFoT1$9HHEB0dYjX$b; zxx;qC+W8iqfJC@eX**s!JX3(^{Q}=g70@ct;CIT;Wv<3<+8wxuf>?>ZDa$qcqpOs!24tDN^_!MBI{B zfvE|<^iIUST12e4*NJ`h2LFrwW3`=}`&1Y@XN3`mzH7|Nh`-`bW;ZmC6aILX_@(0lk~*>?7u9fyuh;-H`}JDN*ehk%7fN3k-dp1Epr zoIYW4xVGSX@iy^4PjG&H(B!yuoagDpM?}{pw9iFs(eC^G9SH{m92Z6@xBpyI(~FNl ztI-(+5`*;8qr?swL;VTFSo5e-C2>a=a&|a~{Q&!gTG>ZTKz>7;U=ePy6?;tr$p^c#bmQ`#u^_*YHNz@f+jOTD%$ zcl&k-Tpq0L?>>+;*jw;CaxG=8OY9+^R-bi9Kp)UbvgG)9i!x zQ7&?)#EF>2Izw(+)f_*-k0#8r`dl@~pHj^On-kA>AMtz(YCUQ3%vlmyuW0p;ESw>#mr|L=JlwxttPl8cy^^jJIw@L5`630 zvlITR19ZGg;#u$W-ne{I@rh`NJ==)ihnRceJ%gEhi9b6PUxEr1ob|7xHcoZ9xMEcthNA=WmcVbrD8ul9cRYS?ygMHb*8l1BBote7&9qd%`N`=IKMJp3YM_5{_P{geLQ52x;wt)?tL zUUf&upqKrE99>MmHqoy_%0!M{YkY2fC2(8F_ypeQ=g{3XD+wz1teZQ?Mx5QG(zT{0 zg*AD$(x%4npdyi{iQ9JzS^7G%wD6p=5Zmg9uwB2{%WtZ|CTE0^u9&C|>(kk@Jl#X3 z6+fVMEku?cgDhPUlvf*tf5>8F=~KwgV!M8hI!lnH$8%p{o?lzc{ZeG3<JmB`Zf%QIwY_OrSy{T#CNbI8(*kfkl1y|VNwWa%2@ z=0(WTmTq2I+JP)RLY^T@lW#?rr8go=e~2u-2w8e#u>VkhWN4UiIl7CQeB@LMvh<^u z=B_rX$ihC@i#N#93OI@^ZNU~$?1>e=01dKq3Nkb{jl0Ix%hE4%#!!U6K?nTkwyHAg zB4lZWjCe86w)f;r;`2aPe=$YGUE82a8)FZ35?Xu;TKtAFMyrXwPn*nMBPUSpmKZ|t zscs@maVCGPvO<-;uIJ?N!MW*Ii7kl-eI?LE1bGxS8>zJ|OV49)W4SvvNX%aC#H z$YLkqK?dbhSUJY#Ue?pNR_t8#y#Z%@mGtYB?D-i}6*_>|=>KKD=`l3VI=ksPVjf4t zy-qyQv%u<0uAj62$TNm9E=NQrd(f@QuTZ}A3HyPUOvXa#w;kTw0Lwsr`?3F&yyW@6 zc+#$8d$ZKox?JA%FqbLNp#|*qrJuU~z!K;@2Y-B}z_|7t`iE-EAZNZC9qK~Xks(sg z*|eT9zDYlC(a#ECasXIJKfAIXtLbM7*F2*sYY6;h=H`VFuTfvdF6|Fw{I2@(ccMQs zequL;H_YX!$Ux^0_|J>}`c&i~eNMOYtvKfN9OplI#Ezf2d0E7A=E}vpdCck4%xMC1 z+LJkLg{?p@V$Dop&$JsHsGJ3F{nfKe+RbKOrA;|Ak@3s9VqFWhyKVsb_(0QLuda1`Cmu3N^IK{2BHBM$z|%^NYO zQ8W5JZM$Y*zt@?*b)|1%;M)V(-elD!R_tWUItitBM`u zOr}nrsfo*ue6^VME%Lg&W8ixtlZyOH>`S-2SBngFK;C1oTFZF`F>b@(y5`yaHP;)! zNBW`rD(UN?b?V#nN!CMe%FVKGrp`HF*#O5&tn+igQTEG^^F3MTN7&CajL*(k?}o1h zm{i3NbqWnY9^T~wzT{K`zCnz)Fd`lJE?Q>0wuv>?2KcrGzT%6u-M_7N3Hf%8sc{g# zBdq5}B|jreG{9Hj_#1u818<)IZyogc&N#wTW&Pd_=aAcQ4&l2iBg7`V0cHZ{*t=kM z5tuz$53`HF>^tiI49*W`k8_giR<6R!KD&H}x5*wX4IR?ldfqlr>eSC;G4!x1oOw*Q zxlgkuWiJ0o`=?o#RpEo2DYSozcDM6R82xzfd(W=??>%Y41BLgs<=JU)bra=_kSi9+ zm3`a-xw4PTmn-|Y`Eq3+H&?Fg-)75|{ag;$V)k(&Q#7>s%vy=<{sHore@TPRJrqC1 zG0Dn7tXfB2va)iHR5E71a*`A2ia+yuit`bhzuKLN?7Wom?wc5cNkUDn=m^^@b0PL) zR|cYYnS?$f4?1P%3}iAoicYk*54+xpw6TJ{$`=JjN6nS~xm^r~LXov<&keD5o)n$a zHBedS^X^pIugL0@;MLW8b17H;miJa7I{Y2zcoUycSDdtE3njtj zsJ*(GWAz$r1o&;UH*u`wx2&s%f3c0Zdw#0u>vnv3s_5G|=1JzK5}TOVP@8ic^Tc_3 zq0Cza^VJ^s81d7Swq(A}13wG%C3BT(FqBIygB{Q)(H-qmja-U(6MfPOY%(j*qmVBq ztuO1fm^mt9tYyq4vFVZHOeL4-$34JP-n~R$rqRB@YTu;$>gUXxlSSsNf;sc&-3sOm zJ0H%Byf8Ys&g5(joIbe=PAAuKHpIM5WZp92W$Ao3pK&zIp}b?}yY~8dl=`0n%QEDY z(}hOoi8UtYsdmckN4o<1Glj`K^R_vGHcz!f&i~D`%d5X`D*Aw9GM0b!H>{O$$QWcy zGM?X$g}7430Vuj=tAz!KVeXPt+wKLhpAq-aFSR(McCrm(W{O#_O<%r3-K=U z_-Xc+hix|NQtW%)=YAOczQ)()4vka0-{d=DCo~e>d_Lb(`CS~NMDHDJY`o3buXGEx z(jUz=j5=j%tARr^I$-NxX*Lc;&s6dPzKWBP9RoZm#~&WiLC>eAd<%M8h?}sVeQeOx zd8;RIW?7`nu4Syz3)oy=WM0Niyf>!^{5l8!oJQ`n%fx&7n6u0x72+Dmvl?i_#{qI5 z>iU$qzQUURxRKn4xkOi8+l+hS^cCT!@hLpQ-I9Ckor>6N4dnjgRw}n8JbefKchdis z^9-XbebkIeeeo@fRbN(`0!qqnr5ravL#JS?y#PPcrye)1{k(SG>T|5068da01-d>3 zj*U%$TDeK~c@u<@BIWot80eg)(OO!jsFMs3$ zbXgfj6MM(zC4=w_oFAC9_b;8>X`6w0#sZULKz>jC{Us;j9g9r~dcBkEmF2zt9s9t4 z*njh074sLx{FP}c{%_3PE%4=6_N4}s!BKWFoV{y{l56WC`p(D(1$v5wtPhHlN0#dH0;HT zuw|M^+j-!}2K=@Uirhzkkh9!@VawLz3+g%>W&e~b0?NEQF6j{C$D0d}ey z*roV7UIBI)K@T}A`TYZQzLxm3H^77I{MT+!?#09(+NWB(*juKB`6IjX?8+AOK**WN zv{!l1hj4kyndG1BJY57_a27m5J7*S(e!<($nL=!eeUj=doIgi(#U?!n+QPFFYdF8B zo%Z0^S@?Md?VMlfZR6xhzGY5zc7=xT!@pL1qFrO;TrtSC44do|g}{PuknT*^F7g!schck?C+8$W-zpDc-;#*$SwF_gnZ_w(j#}V!16|y{iCq(} zM5a1#q$+nJ{^?PCr;2Z0;l7H!&S~Tzfw#wGvPyha@zKv`o!sKva-P|(FZhC7SB*_m zOh%XDcl1H>n0{sMAvEC>XGE8f!(N6SY~z0qI<@@R z1c$8c{}AWt%3;sCGwAP5ruaHC+Zjg4J5|t!Gh2+gv2)Z21A4wi9doQVpa&l{S3Lx` z^PvZV+d>nt<6bugnsA+OTmT;gU!K)*qLHh;MWqSuU}wCmxMAJn%h|xs1wXn>BnB_| zA$ZY%BfrOw=*yn81I(%Te4OT;N@Uhp-aE~EPr?f?)3@qa^2A5C#JT9@74}MPz_E&h)7JxTm z119<7ZcSi5frHpeNgH4DuFy51X+qn6PuDX3<4H5>@3-Rp7A2Q>-^KM4y^ZE2G05uK z^l8cF1jo|k1TP;rkf5J&Yf-?}E$DX* zuoQlFmU0tg7u*$Dk~pjG{=mTy)E}Dc0=Ah>A?jV8)dhWy>x~+ zCBUSSUPcZG_kPNLlQP!U<%Lp4ys;C+8w8dH;8jCe1TYzkOt^Jobb_p-ml?PCI-cSD zOP-INl#n2NZ4l3&;{IXk32w%6KOf#uX=;Lu-MZueb2At`%;fnb{kgeB_Vh9Ip+CNdzq(h z$yGgeh6J0+1^~$`}pR*pwpRViE-kq0s{5{69Y*IYwB3io6u{U_p5MKB`IR!eH zv329De<08H5W}NGklaVQK4ri4K^XTTa^KoDkoymtbKg|%HC=|=+=}~fxi`87!c#g# zs@yU7Vi}O(iW!p+GIT~+vpSKPmmo`5a87pyS=ys~by<2M&!0w?ermIyBL{iz(-yYU zQebs%qUs)p-Kr6pPiT|u|5G=q5#=pZ>HGLld`3MBXCfEZ6-9jhl(G^(GVM}IAa+iH z4*cdzFTqnk;QR8ftkd7ikqt7WwEI4IJ7IoO=~J719dnQ!4-Zt`+w<*e_<`8hN}T|{ z{VCtxz_&lwzuhS7Jl{UTxBX{w=D{~Zkw0e)P1@T#uCulfJz6p2c#l5F_sz(o(w3hI z+bHDG23b_vUeEX6qpp>2zC-=8m;}f3@T~6^a7Ikdg8twH`Ht`{4lfbjB<~2XVx8p* z@49XZaQqe9Q)u4K;{77CMwSS@8;pFLB7UM!uum$vnhy9zFDC#nYF{@r&mi`WnBly$xUG zEIQ>@#nUIgSEVhPA9Ml^k|;ScmJfH{fEK!ukL$kS+-w$SWyrDw9ba1s{mNKA(kU`C zal70%kWB~kJaaj|`AY4!ueZ4sdU*CfNB@4JC+8hvkJqZ?%=!O5UsF%vtH(S0|EYFQ z;T`1h-8Sm`x{PaYtwSc8A+upNED`{_2yI*4*&S>2WhWzp`W7_^JoD_>Qek1)!!(02J-t4w9|kebqAG>AG&P#SUqm=tg0Mc z2ki(R2#$>h2gv>D-qugW-+094{txZf&|leKMC<)+U9y_KMhjnujvwS3Iv+IoJJR;b zbND*H-3!f*4{n#WDj7nV_$#_zQKcuE{>@2T>0?zvk2&*@jn9^o?;>pJ`i;t1h_AnE z;2`4J95izt=9Od5U$^1c8|Ydl`*o9_!+p@#@p66J?zh<=0izD=M-mOhw;Kq&1CYmg zerb<#zlCmK(>&$em!zz<@3Kc>zEb+B-PO$9fh4sHeZ|iGj4|Kdl64%;cG=(<&G@Q< zM(XRV@b(xYOIkCAdl-WU{5%D|RkurW*D#I~O&@li*&{l^RxSr)I2*cZeHHjlu6CD` zJ?pI$>^F&jA$x%H;C!Mn&^3^A+e&z|oZDvCf8+YX{~k-_gG!GlbB^bi3zd5dV?m~M zG>oVEQO2{BIi!7AU$P&QZ=B>CBE$H|y8Ff^IoG}%`S z{FR_2cQmrZkJJ&}vzK0YWsq~wi)iS<*V67mX}5mg1b)cA>8LzEF3%(MabEi#S%>FG z;5H0&9#79wvluI+s9=XAz}%w$o`^nPC7 z;FU#-DZ4O+vMo~PrLC@4C}YeoQub$iG|3Niu@`m>3*oic9%KJ6CO3Ja_+w zZTJz7|C;zs#5O1d-Y;q70*>oW}@sXN%SuI4+V$?3D6y1nRAZ~9bC zpFTnloJqeH8W$fs5mH=h&uhKGF!#WQ1p4P|@+l{NgX`QLPuh18w$fpyF#IpvUP zBsYZQS$I9gu8seiyqNHZo5R%2j}Io@3^w_dFENbSc-ViOR%x?qXUzUnv#?)o6q=#c z40vd&_%Me?P1Ssm>o|+L*_vDmqvGajp;0rnxGv<>T9u)-NSMm~liHM?D(z6*Q<}N+ z1nqNjD{Kjvpk2-#qy3yjPKuZr8a6fVubQa6AHCyA6FDgdnCh~U!0#PTH{n+^k$svV z17)`8Z+#-JtG1Byy6Sh$Ju;f~w`MR`ZJ4XEP5i8qpQ0ylsR1t2fytY5BQ`uZ|LBH8 z=sL&0!`T8b+`wE-v8fSRQ7UZtu?~g9h?6!E8SVC5DX$DAbCnU}=eUo#65MHIhzyea zqSw0+Q>_#EPiH6TbMzK{$uu=dO=ONFKF3^Qy}U#{@kLLlpQG>U=cs@=s$!0O=C%Zf z4s6&XIAn?_uYjI?`j#i{2j=Km=BS7{+Ho&>&-yv~SF&B3@{V_oer1lnV~(;+!R2|( zQ8h8#ZOl660?l_h?8K)hIB{m6j6p}EX`w3bw z-|}>LTr)C9w}SGtZ-X+m*K%{TZOqa1s0@u5R_;U0(bm^IX>)*M7W5 z+afv>)?IJrVJkI;oqx&)aw%_3`Jc&tGbpbr zC!RQGqK&b|dWCV?k!dDmSRMBVH?~xA#^_&(+$`f3JHYomX%6hS&U|m%Yv0t>(T4Ns zi}0fP&|7D;VMK+=R@;^s4|_Whd!76pFOxrFXZv=VYJ87Y`L^0S?x1H~EppWr>wUW2 zm)Kp&IIq$NvAv1~zmf#U_&>yVOMv|aU@CG)f#_$D<*Ly=nLgkgLSzoguL;bdk+v}{ z*~%Flb{*bcKHnOciqHMZyI>v#%(t-Ly#gH-dMkRv57?7d(oXdWbkKpj_-1@fui?5?2%piup$R+Y_6+HYRI^bmJ^3!90F?{Oc<2JY0n;rsJWK4o5 z`{{3fQcK4J^*AE=vohI`u{#Ax0o;2SV&;^Q*&|*)Txy)vruvm0~oJVpd z{%Cz{lLozs$ZRjbPjq}n?)jAd{*T_r$lJOVk%d-Lhy1VX-Q?`Aaf#SKen{QJ)ZNLM zW(I!MYO~n5g_n$7g3b&+SGdKqYlgw*9>G<73!^tH$IYH?Bk^avyw%T9VKc0~oXXtM zhUiCxuhzm>lbF994;t4BZLF@x)eAp+)`|RW=h+YN)lA{5+34w#3~L?CZz8@&Zs4?p zSbJjsp2oF+Ya8l`PnqaR79gV;nTu7_yI+4Epg)&6xfNuqPx zw7H8z5p8YgV*Rh@LR)S9F92%4ka2Or%Z zH%oh-aW&Kv{%WFL4E0W0$7uiKpQ){YR&VN@a3v zE2Gld1)V+C3VM8v+zlN5 z1M5uf>kc!uN54+9tmrjOoAu43mb%eHEpw^+HS6>QIAgCAT>yAvG&lw#NA3^w?$u{A z-@mb5y*M3S5(qx;50rgUc*#u4qhk9o`qbMt`E-2vc(E|=HK z_w2_-z7Gc9?w0EncC@GK<$7Pro`H4^dImen`ahr6gPk61ux!L!sZ>7Y5~tY6xo5ha zoCElTD1UMea9v2wfscY)_E^mNNMwCWy!mCU{Rhc8;KzC4L-6N7;+!<*cLniy2ZM`+ zSiSliePTbBd;Aj3*3~qA z<7(pf_6+ovJxbi&JmUIR^ZWog3mU#JHad!!=u?Q7{){_s^}UUP3ztEM5~1;xjCGZq zy%N`3Yzv-+#$rqCD#i|B6?#Mux@g7oh3r+OjYQ;8sVDNihrK}*_6Y^Vu8w*-<+wci zjBkst$2sO~BiCXBc8&G997X`UFnnXAUs0?bC*`M@-)+q8C(M;%eu9XP9EDt($2_nf zOv_^)l7Qdq^!Ea`M~SMj%f@(Kqt9>Leiq^?=IlbAc|=dl`)}SZ3v-oWvnPD)Rmv0D zW7xRg%y?d9e2L2FD#KUB*@*iL<#???o&~s~cqVP_$EHfgEn`~_o?T#EiTLeBVe|DY zxF$A9@=W5@Uci@8{9}w$Y^8=LY^5f9N^W0rG~Uxjh51Y&j^{ItJ4ie7FLH6izo8PJ z+1??)rPYc*jsYz-r^2D5dmw8rqgC z{r|7`WgROUd&Lm7%fy(BO0DXv!W`rNCN?NOt|aVCgII%k2D8h?IyKv%cBlsMgj;}a=s$OCeo zvN&R4EAqWbS;N={)6XgDP9Bg0)JtJb^mWF#hJa&&hqRm4-$$O4R|2{;#3r^}%nx;j zqHB|NQO250wv#`h{_HoEd7H2-<@jNL)$JmC+fF&ERPg39&#O&AB{j@x7&aMgn3rY1 z-p)4?>*-%2a4m*EW$SZ`jU($Ilez7u_s!Q;$r?d1Qq|Xog~~rVxu*##qc+?9WVwL!{_*_(lu#VWL_a|;eCF6}^ytmBBbu#7vaIjl_UWd)( zb$FNeJ5g8c#j2qz5+A2w&D_1Vwhym#`U<2es{Y3H#EaTa$Ib-Yo zhq_zOB&HkQOWJEB2Hy=8L%hv1+%;1!>ykcW_M^j>2>sZ!xfofJRzALwe z9oX@HFJrTY-*@8__;fT@b$8f<(Ipkb%UL_}ow3clXT-1a-re;j&VnJ|PmlAZJ`o+C zS6<6J=IvK8{j$GrbB{4fjvMkGNm~cJZM`UECD=VKkaKFUj&?kHN72!)mNL#BCJ^JK z!Tx08W^|$=cS#xN6O$Imd9By}Wb$ghN7*7Nn{9Jv8Kumt)19(_?@>07GJzj_ac84^ zA4ey0+}sCT#0Mc0z9#W0B#(=|zYRK|c0E2+>__(Rs3LF9G{!Bz?;g8%zW(>|+oeB$ zGXB3y*`JJmq?G;1_*13qPsZO@%Kl{heJK0C9Y6D=k6*@qKktb>q@g}nOh;fLW0(I7 zbjC5o{3U1C}2WfP3vv$PN?J3?H91%gA~bF@j|S2T0#FJ-`YvW{PY`g>X6R|aJUDFeP! zbo}z_o~MFen<%@6uYkna2k6$yvuMGTq1h2mC`N#MLe2@PB0pAa$-+uz% zcctu4;JZ`G{sg{GDf<)nZkDn?f$s(>`xE%Cm9js9@3WNs-@;e$cP#KNP^vtS_jLSC z_2xR71FReHSEpaaK3@9u%w6>Bc`yB%F8#@dejPA@d-e2-{uO|;lcX$D?6#$>o_et#TGx*RBTxidFc>1pOpzfkIlj>(tk@4(aj}nb3*DA~ z@sIE)hBC5}d!RCxw?)RNfTlztD`3}trHnjKfeODZWQ$bC)9dZzffBlQ%3^Sy3&Ag; zsmVD8x>6mI>=a+*s-`Kvj$u7QceXj~n(&I><PRoV4y&ex7C3B!D6l6;b25aTiGdMU6_c?Cy6Lk`QV@iXe$X=J&ZLiR+A#l z*X8B5_02x8jQA0J^QoP&Wl(Q5_A>R`U!;w0tkrLhu{lQp^W)SlmUqW7h8*%M)`5== z;3Hi3&%R8~!$xo=dmuA&T>uTrbw2dnNK9X%ZZ28Qc^o_056GV3`Mwe60`!`6_6#YD z7Brt^U!buskaIsA%;UGzC(mGi5yLs+V|o5WvKD?dKnvgMj~$v?pU+r^nfFEwHa9$8 z7P=i;>Qg<~(SQ%FJ1`Y`Xu0O99Hj>&AHg5B6nwmSugxiQISOoppdGOrUCvfj0`tq% zukQ?PAK=~}sDCK)`Ze>~&%D-Pb07w2@1%o+-RERaV?KqyxtCm( zLT^H6LVF$g@={@rYuxyy$B6Sta01= z_y>1=1d%hTKbJk^2DH^kP;R+&zK=2I(g;s#qj>$340^fCzn4MP$e>fmATx70h5Y$7 zXB3G1`3!nH6gA#?3ORI&y7+6zLG6T%^%OGcC3ubV1}iud`RRZN&ej__z&z-)QRdAd zDmF&skK#Nx&ZYP!T2&UZKkne!ThP8g^l=3GsDnNZF~95WvghbD;+k~!?$D!)JagoG z>Ph(c6lYy+hfY3%b`F2}W_~mExGzK!8#Krx=VNMB`}7-Nz9(;x`D1Heb1i%#bzn4d zRehOHcX&^H#r?=rl^P-&2Kt3}w%o(D;w;0w<}UDG5aX#Ohc^-3!j8OpZr{Lg>{*q~ z7K=H6Gj+NjjNm+xe&%cN7Ce+SB6!QzKL@`U+AqAH`4DHqJk+nh8Jgm(Cu8ks@Ypfe z{lqtMPDAR8fhsm2a)7ypxiq{-Y^km_o!L?r`Y5#n&-5t^-A{c4x zDtTUHwY1a0OBV-?hDOFfBT{$f9?xgT=yJABh38)kvyGGcL8frsJ9#Oy- z5PI&IM;!Df>&kNOg_9#Cboe=Q+7B#*4i7+wiPfBU106cCKMNg-Z2u5i+yftcF|((6 z_sDz9zoLJ^;m7Sb>^>ElXo&mzlb_)*BJa6oUtp2Uxa^E;6YqRV`{V%bEj}=qGHr#E z6KUh~uPXAtVEy_-WP}+Xcj_nR@y<2WDGH`v===DWjE|(vTEW>f*ImQcf>dW1How}HaV%6up68njqGdwlzH#{C!G3K;0tv7Jvw+68*F6|d=YcU zEA|HRnK}?%cQeQC%)vcB%Xnw9=2KgJ*;T1{E}XODH|sBM&EmP2nb&e`M4~Tj$46gX z9`0!U1M$-Q$2z;=9sYk->`ur~k)^lzPw4pH(SxjGf`Sl5)*K z)S1tdSfSp;=bV$cF1u!(PP|aT6wSJOiD#+L(!-?|d=FU*RZBd+<7z|N*W^NO=pShy z7ls@*)+jsceP8Gz2fK4?=N`=&OGMxHYqEpm*|LsdPxq$Z1msaV`;Ihn^lYr7QqQ6R zoAcPG^v%*{12$)A$3olKb6dh^MvZLsN@|uqkCMBXhQGi-n>O}BSFwMeFVURe9%P>p zu3AQo6#W`G%zW!;=Q{01@?3Q+xjf`AJx}}RIwv{{BMkU!Ju6A2VRvEY0*ClT) z9J{I5O0OC^S15ILqtqo(@aLC&w@!TDZQoo7KHAnh>i(mLi+(Yb{aOlsmPh%<7C!k= z?A13qsS%!KB0obc9~o5Te%-TaB|aUg9W;z*zJX@@fOAE>;rHsU+8@Z}mAt?1?BNcm zF0a*7he2$o`HS_<(udURm$(K6F8)GoUWs{E$jROYRXYy7@|3!(DFI%Q{-wt8cle4r z4C-C2pzX_3C87)Wk)V{jO!i7gGtA>c2%d#;#ijErl>onQJ4pL4{w=(6+o!yt$=J zSM!8tjjU&NbjPNzC+!?|chbN~Ju)GIHe~MNCp~c6^{$M&=Xb8k z6a3c6EthfEbM0dYtHt;9mW)}>4v3)skiZQez*_=0x&IdTWxlc>l)b9xV?vKot4`>V z{E!V1hT#s`1J0h$StzWVdXjD55%j0(<@^0@)DrYZhfhbBPS1$9{+{Q5jV-jES|ukp z{vxkD<2mayvu#xe2C1M0&)TY{M5#%I>@VQ+tKQTEvrK)?y4qXCPEg(!V%zh|fYVy= zag;h=>v_h(=Q=gH{t%=BLkvdKT?K#e9Yx*sGR|>>U5;)G-LHpa z+uwd{Q5H1VKe|a5b}Qq$MUKzRe6N(O(4-UNICm>MD=cN!>>epOoZGn0BP?jH zes{{7n!n|m7GP@JsbNbAvA`#mn10@2?syIQi|id_>W4mDpm)jMj{i>d;*r3|f2`Wq zvA67y?;W~*5q*15!|v-($5)Lq+V*`kYW#_hOuft>O8q+3EBjSs!0Ct=LT7XeNs&4V zwFYlrZ|b8JJYbs_&)E&1@!nc$-tDG7+VA;aU_2d|3Y;5&(;?uT32f^FRNyY)y__0) znGtHzG<!_V4bnpk|Z;`pne4D|? zR^r}8cV9`LQityop4X_uXL(@!iJsKpD`5_4TL0`>cdMYak*h=ZFh;3Y*?2sv{1xn8@;o5w%yCw_}=vMkA99mN_r zm^JVWYv2pUvDT@qf#vi|`EAGHf`C%sfQy%$Yu5A&OFk_9bZ+;c)kZICf7Zql){@rW zyS9k#MGTjv!%td9yFW6gI3qPh*@wqiJwL8*LKgBj^|WT66p387vj;iKSx#s8Z-38(ta|+9GG95*?JB-xv6t!0Z^tdK z*#5wD05H8w-$C@9L*KKPb}BW~=aHqKmtF&Qk$O;VB>lB&PsE>~y}zh&}~EzbFk zjA?L0PxJH8MIdmJzRk=jMh}Sz0!Bw!i=|)bZ&Y`8?Q_mQYzUrw(EUub`8@LoA3iqAhA!CmB3EY#g2d(A5^7L@W)HB*<$swpN3U_31-4JH0S_1z2f;XRd z&0*nr3(ptL-FEJOPMgI>b?g-Fj#h?RX>&hy z7_*dyYtg%O%{PS1GjhC=+1gm3) zZk<0X!MbslZq1*YVBI!Xx7y2X`wGj|zVw%E`-)yx`!aUh_7(5u`w3f1@e{zkF2Pz< zr(37n(Jk!cS@FGsZ{S|p>Xq1R8HPWLZ_!=TRlK!Gp;sH@tt*V0b%uAmb)`3B?-Xxc z)k(8v1u*si#vT%HEeX-Av%1Aw*L2gYIX&X7YkO$c*}!vMJ3L>9M%?&EM-cqWd4)58 z*Gk|r6L_rxMuPido)cS~Vtvlwf3Y*Cp?62XuZ^8GXVw$c7U~@DEQGG)e{k9&wRG(K zUckFT4-wJ_I2RlJQJ#6kQ?(qUk4e7t!To&qSc00$k!=U~U-WzFqZ-{_`nVpZJ0EH9 z=Q{Rmc}D0ifp*+|aZP>auKV$KvZkl*_*ok^_prc(`}25C<|1RC=)MlDko(#0YtIUS+c2&z==AKj zt)e^j<=UI;2CheOZRYw5_w!oCsP^wZ?ccxPyT%v%|4gU40so3#rCw&wj-L2zl+m$4 zw=qWQWF}D0>AEd1{jat>kKW*+!IqbK(dM={A3AAsmT^wH9ll~uw{iI+$|<@cK|+pW zo~q^9UGNBdiu_%iEzxdU?9e+R*{@1JHMhNDRgc2sw}$DPU(v-U62&?fdgPISYWP_;)r> zpaw@6YYuH%ilQB_@ja_1+EH*|%G-W4QVPEnxr7eK*5TB|k$%tNuWC&*I)4ugE{#ZZ68p1}Jx|5AaY;^t>QrKy zF`#*&5xJsqmOHR^`?QEb@7<$j_ZV~0?)~t=cJ{X+TBnjN3Ci(>tht&$ei;9X^US|5 zX9AsP{sGj%o$-Qd`R0If{@-vjk2wS|hm$I>_8V8yCYK)I-Y2_s>eh5A+v=gZQY$5( z>E#U@wiXgYcZ;!}^)fiGEjBurGlvU~}=xQXaKqup>$= z19D1m6e8E<{P$|Ey;-rhJ`bJF;H>X{&`JFaRdr#OX0@O*^ham7gw8MveL?i2f#_fp zmYPb@X^(E7hmOiRe01q&r4ny*lRY*JHW@IJkk1!j~dZB@jdrGNUeE<{8ZHx&t7EugfZ4M_9apu{49Ljz&?(6 zz^r=aD&yk#VaE}CT37F+dAsiD-oR;ixSZ3;IK)R>k8Ez8_{r`l<`>oC>Us?SQA}%^ zcU-H%`ykJz@oXghoGj8D)vh$}Q?9oA;pAH2hx~uEF@*CpuSDDKbnyG-`x0|Hp%;lv zlYWFpX7nEK%)*Y=U-Pa_^DAjOfFFs~(QUgv^OUNho@rG*et}NN`L)=(%CXm-#XlfC zBy@A;DI3q&styI%eyAfZSK#;ax#-O0N;CEh`j!3;IyA@h+iBhfx7+6Lk~|UCjpw_o zVP(*QJp$bVT^4%-bm>{~)xT-)M_?oS&!3;IUVt64(cob@kFHq*JfBBq&X{kj5?ww` zd1p7GxAlWoEYM05w35Dqm?!9Ez*67RwM%PD_n=#*r*Zya_-~Kz{h<8%5$eXcG-?Tv z2i=P~$o_KbS)=tPYeh`MV8`qos^#fcYA2AtWuw1>hdixz;E26!SVjhRB4Q7h5vRY< z*2Q7Vo!;gjLI;o2LYm?WRjM!h5{x~u+4z}e;b$t-OxbHztJFDXldPLL`~1q|Dt0dC zs_*67xPs?sa|S+8Uk~Iy{fyU4wHL5yC81lTbz0LD1s~hPpHrz{5D#<;8(%uI<9XJ0){fLU;HHRi zS%5`0{q|WjrFjZ=@dm~?(LF}rrkY{#o%->BGRaGi}mC^JjN-ov%f;OvV=_t{c0(BcMQn^V?#gfGnM zXMoX<^``=utX4-kr`|#Gr-*}Z)FP_pYd$Hpt>{a?*?s(;Mn>?Inc6vIc zFI#)NKG-+TZ5qw}F;1xuDRY^N&mx>!UN-oUIHxMHVWz_`aY|)hMn?2gDtQWXyaDe= z<3HXI5pC|t{j8$2=IPMdxOwOidA2H}@-i9N>!agl-#A^dPoyX!DDQRBQ%v zV4_l!x9OcNPp9Koqs?S+?h$Wu-i7>;b=Ob#sNG9HqQ8Wb6D4cwj&_~uF?_+_FvoW-BOv+C?iltL z@sFADaaZ>rPLA_H^Jg=F5Aa0?=_>Y$k81{VY!W&7*e0eUPlT7mZqo`c&26x?1J z4d`hel;5eee(A~5UgQ@YWv_P`xi}EHs3Q+6R6y-sUB8*rC*MDDNP`3tX&aoSlYgpU&8h1u}ZWptq#%2?ZkJ`@DJKLcj6K00z| zHLu}%RBxO0J)I{<{1P-J^SA&_r6c#ApR6ha^K4GZSrD4~+z?oc z&a{cWZb;;!HvRlwXej}@S=>JgS~50OQ-|@Crrb1jHS#|5>+p-L<$l0le7gPaQK`4k z5$XoAKGUwOQC}>c+WbASTC$cLfeycAUaIdsZaS<>82y7caC5+evX0$Q9woQX$A+_( z%?2J)gY7QH3-!%lcJ@52z4XGmCX>^;%iSvYIC&b7U<$05LH=6(2#wk7|(Jv(T>E?#DTV42*R(;?~tzP`hPcbbLgHgfw&Ta8CMV>W5e;1*@bMV%;z&!%GYl7~Aq;J;yZ-MI!6o*!@qV?>z_I z$)2+>@=o@gvm1!pL*Dg3-c4HST^g1DS?R;byDyM;SCDsukauR}-F9pM&B(jAk#`%B zcc(aWYm|!KW~1gojcKI$f!ql5pGhsxbw@?kQKPErg2+1db|ULU z&WXHx16fzj`=a~GJ_A{IRA4n5S=Y$E?=&**3T>fh3==sZxHdq?X{@R2eNt-{x8Wg% z{q%hH({pL>lmWZ#VDk3B!^cq(=1BOy)`0$i?3&5?7^it;pJsn1@({nt-pmep$iBUi zxxKU3wWR|$A{QS4FWB9W_GBFr8~JMRG7Gu>I{T?ibftOdN^A8%3w6z7Wv?K5is)bm zkexPc45ELXTVmT(2|T1GyUgM3$kot!P}53u0T(%@yE)6p1|Q@MQk9}_Y2c&_^Yy{s z(X(Cd9bEiu^VjG!OQE^PV?W8VLI_yX*{=VgdX0= zvo9I-@T}gd(nQ;Vv@QE`J9?%+D(88OH;(Lsg~t5U{TrES??N!v$|M1Bi2(xyXq&c0mh zVt?B?c^bI6OswE5tgRC3*OU9x3e%eBf}=0lk9~z7>@xn&Vx9BzlwbB`bm&Lm)j9A( z$KHZ{#nFr4Mr8f?$TnHOoZn)9kbP7G`TC;2M*{a};JIkV)l<%jWS^43bNDHbzS185 zvlE;?L)%gdM(jJ(_BhU7tK|Yb)eoNP0?dp{Or>7%mW92QFMF%q@YYIrYb1QO#{0vq zkMmu?y4H$Lp}5{iKKd;9Nyd_??L@!52|@Ir6YTE zWPL+0akc0yC!`H{@a$0Kju|~Wl(+z7VI%zY1AWV0Ky<8lK4M!C8^Lt=FdaTDV}CFU zKbP>Utn2-$MJ8)_2b@>({xo1GK1$h-UIk`@f!UyTI0`@e0k@ih&ZPm!pAPuF1&liM zv1jNHp1u|X9LI8BU^bI61p&*Kbsx75mdajrKJeTGEEkH-X6|GDW>Jj!W@un|hkhnw zn!d<}ixiliT4ce2~xc z^MPxeB9@%9z67rFj==WIAO0D(L;eeF1+EqJy^OxIk+UL4XVbTxIre3aeVCtv`SH8u z5_25D96K-dDwQ=NlKE-O?|01S73R2{IsTRTT=hA&HIli7Ge`8ksy}g^!MGn%e#t?) zs!d?uI~P0%O`kSBV4l(=()?2H{pR}&q2Z%*?-Sj5-w5ap8`jZ5@R!8Y3k}9_kG<^C znZQWm)J4WtF+U${Be87F5y9$pg_ewBE^xzU5o51~8UB+vI-o;z&_vb?~1&FFv5dDJYXf7w&U0H^DW zLF_4gfRp&vh397hrzYUkA2^9UrEy6>sSmK~u%}D~Ru#Z%HL&W<^-Abf>?vjBSqR+* zk~1;`*bD|Xfxf-WG1ya57WFYNT<017YwRh{02`V2V&*L}Ugjitmo-p$N{3E^!KeFP zyRIzyQV!3rX6zGyozyb_n6am~)A1whXjGcAOadLg}Ei_n8qb>Pv2>&3c?F^8%m?QCz zMJj!D9Qy`4`bH)=s2jBK?I|kJ>Y=tBFC)&wGhq4FGTrlH4f|kwvF^ChN3{f_2QQ$e zRtR~z_0ib$u{pKP`NQ4PrgB0MfYZIn=p6$X>nw2UPwdwz^72>Fm-yvwezJCQ zGyV_tqU43BiZ05(BO8aZN9Sto_iZScjhbu7kdjkJ^}2WM+5PR#O%;G;<#|~jn+6k)Hy7j&(f zxPIbZu8B`TV5}>fHSK98unOQf>mW({9n%? zJ8IoZ{AAVv&H?BBH39?9h^!;7;{0i1OQeQ7^Z(6)wzCo@`>D!A`ZVyJUQQiZU_Pj? za-aYHFz?nqCANcZO?KijS~IbM5rcW9Ke404-ro&PE?}N1-l~#yW^ZP_)p0OBqW%V=}dm zr=N@`S;o_LWyp@8l zhYaxJlPQZKAwh0*Dv&xRGmbwVrOWvZ4u z{!54d8a5f70>88Cu{ENr{e3DmTG7=SHYGXFt{?5R-Ea+ilxGFEyZAPG+pJ~q<96!5 zlS_AWSA@Y)qa-FUq+%C+c6C1sopSEhTX}7AzyPneow^ zy^}UFjH;!KIF-4@#IWx$ zG29JX;+?i1UBg-5TeKg;M|{V;I&?&NzZRXLk2~JntEqvppNIF)5M%CA-c1h@qaZQe zjl_jt;9RV7U@zxtiLFH9&M$RV?)>^FX!JTU;t~&jx@)2{2p+iy{H`N@MCKteBsOTd zk$E<3(VgoAhtdY~l$dyTy$b#hpq+*-N8CVE=HM zSeZ1=r0OSjao&}7a;06~mAD3hqqHG$nsst!75~rWf4P5z-|~z+drtmuAKN+3pqehv z$k<*ZFO_$a@q4DDKVGnKKb%;58Cyw$^Dn$7v>>?#5>p(7-%~v@)|$S{%evh|#VS7) zJN0DzJ~QV)mq&~;N0N6km31%FPIT>%qSZi2Mg@$Dur=wMso8E%k z=vP5=Zu$)-Pd6IhOp9wcd%2dwoeU{1Wyr3_$KL41N827n`tA??CA;a*)O3Kg>H;)W zp!qa$Mu404&UVbtq&qKmH8@>DYv>_Y1V_yE3jfEmW)y)R`CZTZjpQ5)u4Mki$%Kgg zOXgG1dbcxkvX}K!#t^~1hA^ME?flN*{!85Zdt!vSC;GeOhe&K}_I2zp=o#k*Z9VQ~ z-hO?hJ4fV0caDhou*;~U^fB~zIkrU;^9s!Z&MSqRo_eXT&{Uh%+ zYxqK=u67TP_Kq|+nxf3hXBfh#{#Dzz^rW`$9{Q8LZAb0eV@o@i#!$QVY5aKk*I5t0 zbq$xX|BmsA&G65B4~Dmn!drslmHZa^Kid`F3WgT?Lks9G?*b>uhoSzo^E5D$xXJB2 zHv%{{1YmkcHGFJsyw-se`YRQl zZKpYbx3nidA>p~x!Hfmjv5{wlE^4^fh@3bbY^xGFu)|j}?xv1$n+(nsJnNP(Be1*B zkJLJ^;W;11UEeWoQ=(JGe1bMaFYEY7zDY-Xzv$ZNU9k}}3N~tgo3SySoC$P`y{FN) zlYXXePixn=>#=`Ke-e2vI`<&ea*h~KZ_&3i@oli5YSXvd@D%b6YluNk zuhATZ=-%(W=GyYiE@G+=jI-|0)#ME1!G}gQLUbSW+zp4Tb%#$nd=Kpup|@mB9&1fT zcIe~>_>y<{bD2>N9|}#5f`+jNY}iBlgP_|Z==O8zV=s9rh0ICfwxiIqC!)Wyci&(~ z$6oqZZ8P@Y4TXi|=W_k8V_N#Mk{}uhIrP_VIgT z(8V7`7Z+Q`2k7F0$JNM8nY+jzk%vO-1L^Y~`n*D)c6f0P{a%F^1K`ECmiogdN8Ef; zL*5Mb4>vEKh8K6jixKLdd2um&(*MSbk{i~O{?5|hH2QjViLvzjl8;KMr*&c`yjV+p zuyo|M*cW7vCGunz@*^GooQ14xh{GmLeA1;Ax-*BfEE?jlJFbvAm}-Qae_9V8t?$Jd z4ehdchkp0a3}o?5c;jt!nEB|J8Q^s*@Q9>+S*K6aj@!9J7@I=SiGPVdCu_8LU zX4~0?&G1mix$g@vKHSfa{VxN0O$b%71<1Fh;42TjOxux|w}5^B7b?Vbc%KSflA$K8 zFZiYD5wG>8dx7Z?V0s;x&IhKqz+YGJms${5TAF{nG@lyXUm3dB?$^6E?MA-TgTL+I zZ@V6~Ewo*h-Use>+!tq#MvhLo8X7*8oQyHvJ5f{gbLHGA;sX;ybD$&q(W% zz5dv5Lb3H`zjADOXu@hWyg>KJ{-0|quyF6hMLl9w;91VzYC;|b9_?)oV(ed&>-0`? zV0a#Naw834rUy-G*e3e(VyyG0J!jpRs$!4mUYs$5j$-HmU3RNTWPDfX^Y{3O|I=9j z(4_kefM+tu7eV%%r{4(g!pYB~XXQa>BgoaMUx44*>rqqsQ>wCOfUT-mH(S*U%ENSc z$r#gf#udp@@7PAn=bx!ty<{7CmWB}1BKY$c==mYgXIW=;t?*YW^*(GEQad<3lRZ3k z=<12Ys=+VW1>Hs<)Av4K^Hg5rJ6fJRU%e8a0P`chY_HVlKW*qr-jw8OhgPiMES_Dq zVYJn);!LK&@jTlXKLWoTK%j;ow&43LF`& z1)f``sthqIa5{6iYehm!C^#QTUQ~hJBYSl;wJ>Mwp4@-x?#XY`=YG{ATb_IS=x;+O zqsQDZ1Y0f|!Ym88mb0Xr!08VLgXOlt&mw+f>I7K6o!F({)jx7}$U*8SuGjLKr_1>+ zoh?S>B}Se=a?GDhGCk`z! zgqh986d(B5pZlHe@lHv|H-vpSHaKixU~t$nYjD`E9!Vz_1SOc>;{Cqx^n89BBZDmK z1_xXAWJTnPF2lY*u)v^Ym$MFz*R3I{u_@en zQ|$|Q-L+)}G-rY4nl=&3$vfAP_2*KsyFh0bOVQuIB`*w|-guL`D-)p|aHaVc29<(a z&a$gIru9fRfa4zEca&KLaYkWse{j4P9DfFWEBNdJ$Mw8-4I5bQ$lm6>1>M5?{Be7J zwNbO>}0X=9T2H3#+c5Qm$UB4{Sx_d#n8?2 zZRTVBPQ&{@fa4zxzLq=GC^&Oae6l@|1197EIsAIJY+o-G_#J1K%s)^T+B_Xx>b|Dd z_3?RE|43{s>k4aAY7uzfgPfVC6$V97=jIY^G-KZz1paS8FHQ7u%h1JgPO-NyQB@*m zZX$2aCaabop(WyMEZ@GTs#+M2$e7k;THX)HmDvSeDKo>8PRz&-OR>-CkrIGhF&e{y z3JjgHJL^VErs3|C?K_@Ybh1}y*k$4b-|uBMt?tj+=q0wQ3KeF01pW%dA2>K_klD$8 zd@*w=fG+zZXU-+QZyP!>e-q=y4znyiZz1b~KWp|g*u~!?H+4PhG;w}G=a5lS zujA?;w&!~zPlmA9y^gF()4OL^q_oMZa_qr_p#N>aqZpdL44sNR6PkVn+P)1Rh;H#e z_|o=5nLHUJEgErm> zoNO8jt<6M!9ipASkw%Le;%6z$8ugR>iffl&S;((w1XomlOcho6K?qx zYO*80g2;89m=Ap?34P!1mS5W#x5%&MjJuI>e~KJBh#od+X+YQ>XnY4Wp0gw%Y$Y_l z5gI?i{X%Gb4EM~VdxVXS?GfgS{5r^ctAfXv-eUas1Q{#|jQjIQ-SW;5AIqk!LAf&C zHu=@v(g>cz4PB96p~$Z-$gdE${5m%g|NBnPpLkPMUE>Uox(f7Yo;!!F{L)Sv_lZSq zmseLg+oL*$ye@Dv5d0Q_+waQ9%RF+1XLxtySKm0+D4rMH&u*m#1MrbGYIWAskwsZkb9H2aku}JV zHOa<&M=$XXn*?rG@$C<8BYv+m}puX zp<7-V;%!+DtVDjfkY59lUmqHRO>>Z67g?V&kzapAe%X;aBX^idQlAy3CXtFQ&k8*Di z^w^Voo_;;T9!lyFRu|tR>d$FSq>q(BS2J61{2v z{kD0ZqaW+!hrg;7hdz#9Hy@pE)Zo6cQ`RNsJ-dp#9Dn6S+2AmLF-kh z$)Gx$a#Vonn=xI&uSPv!b|PD@Mh!Q=&i86QbqCsXlDC1?)AvT0Po)Hh*Msk&@HFst z>m-Wvmd*mRx8Uj3S@Xg7{M=9Afsf&VL(qT3(qK0p9|3Nixn8>@ILrcEqk-v3EilYu zRA5;A@W8My;EQ=n0^MttXOO?8AFx~yG|BXFgpb8IBpCR`2Hg!PyE~UGwesa(9=EnTw^aIx_-Bl4?AO*953yQeeDzMb~p5HwWY12H|3kcN-RGA zv-PVV3r?7PzS=tem9SE+Yp0T&?RS;>WvQ0EoPT9KDd(1!!zAHt7y}i$cE0x>E?fy?<|%`Il*3!b_pI4CKoz&@^_yc@gOCa`yYn z(A%yo`^cSH_S_)&(jWQ?fG3~M*TarLJICBISP%2z_f+UD6MDOpXAB!S!5Fryr!j2C z5@XnU_*C@Yn4r#XC+Q__iIV6%+%N#plN=-wyMy#t2_g(Y&ReWvmV%Z0-Hc! z69jBRfJrd0xdV(2DIYg%t^%74$f*vQy|&7gx>5z3<^!9j_3lAafz4g4$s)5efz78w zJxqbf?AgevC}`$kAIN&2e}NKPBO0#fkicQ^+m5XpjW?zOy32}sLvHN0Xd(+@9n_u zxau6%cXa2lQ6oEtjRrnf0uxLM+VKtWu*jM|3BCFr^wf3iK?FAS%y&CFYairH1J^sa z|2jP8me;^f&W*aj{Z*_B6Ob!nSABW=Q+b{|lYZLhwg()Rlc{#Sb^h^); z{oM9@ihK5qc&qqK@XK%5j{Pb6e1esDj@W0(L+V)=pLd-Yo9-u~N+JxSt9qM8S4De` zt}0V1`}y+1(EB@&u5xLf*;kIeKur(>HA0q!%6|J5_S!pmuZy9r-3r=GnnXQ4?h(VV zA@J>|@;+nCGOuFhRleX!MS^retLHawOM#fJ0O=4a(*TiOQFkX8qk274m7JnZ; z0-M{0LqWgHlXxqU%e(1A_N{t^)CvBh^Lg^3my>@jw)kaSPb2?&EVhL6hcAhBhA$c6EXen87PNZu@p2Z7Q7r}eKHT$lPU~WFIz2lz+cQ*4 zEOqjUb#RmsCvYA=(L!w34Ti4dpmwR4Gp?;}bk+fbqtcW3Li;cC#8#WLLvVXnMOMDQ z^I7!tFNq&0IAE}5>w4ZSPd%?7h@6TS=r2gC%4rRB7VO}6Yp}B*%EMalwpR7|ueHsx zR(1XSpW`m7>3_Dgx7|ujOyb^&yKoVA@gRG5dxorYU4M$Zi0GwnE+*DPe2+%&Z?-Nk z>{^sd=o2l_7Xku3+v{l?bru*(AHJA?~j~m{9@Pe$&eUXIjT3YlEmR3G<~ym zT65P@sV5+D7U#$%kaunP_2t=P`1PxqV=&{DdEYJde0nSFyB)CvZLveEi2`=Nh~KJwgYj?Pt{laDOFnir@TdoVGL|pG)n*ynrO))u|87jS_P*qAR6Q^KLFj!YW?^3_#$DTTMxrzPp1$W%j>08Eky^rE-W{KrDIRE-9e1?7GI?<_q zbV)tguK$XgD%z1T9cD~2#$#2kEs~4hKrBV!UHE`Ah+UzbI((WEBl-F~X#HsT_2q@AH4r_{Sp;O-+k5puk}m*zoTJlGBRnXzM|MDO z3Gk@Ic0|Cl9W^~38rxQXr`CJSVa6cJPovUwV6A_yFB~4Q}tJ5dN3{ zi;e21Iw#`K{om9%S?C^1P*XK~&jUZ34{P2}bxyjp_w%3XoMh65#3l$`C%doP>X7`( zece`vMB;Y(;>Y&JkNrokM{zCnMlNyPQIn*j_K4K&mGe4?adLl4o3h>*-0RKz&Z)Y( zy1RY7nZord)*D%8Jc(mnfu1h$e7EpRC$Mfk#2S=bZl=yIQsE_oR)8zG<}qT<_VMm8FY^dRoukL+leAkWc7|uv&B3<{eO08>=$%WC#dSE`xM2@-p9x-8F9?nJF zZ}1xJ6j(mSe^T#H+V6;S`qzHe-E?)mmpxgT9_o&HY9(eQ&0ua?1?(l>=?8vKrOim< z0VUp0=64}d-`s_Dky?Sodns!zee_~{AL_~~aH!(9=pz!FRQ4?OHJLkn=}4g+X+z*$ z&N{stcuRX4F%4hR<`2N{dt%-4potDxzRy}Fc(}hE?mK9^kulwC2&rAALTb|tK23dD zPo+&ee7TD@;|!inGmur)dPqr{7qMm7E*tPo3G6N7_02Nw>5S7g!#eV}(jNaA;0>Km z$GUtwN^|46BWCKa#A`&ik6+?qu|XX_%eUZP_|yh`!uWqD{dd4Aojve2<|XiXN9v~( zcXK>Ar_JB|Pw^SV1_)n1#(uKFpgC?75ZjliSxqj^9S3(EXN%YOZ;OLmMVmHslq7g~ zIXrBLuvt_2T^wb=_eRVpJ~Q#h+u@7n@Q+g$uqAVcmo+{$ff_YlR{Ias*a9E>CAJjW zeAh=+Hjaj#ioG2xY2zmFc?Lhe-B)YTCM7wG+j-iXXDi{yzwm4hvSm+EPq$t0K)6iS4aC2$F+glw9-fU53b=7{~zdYNQt9n zVI+Q?Ch*w@dY`U)Ti@ZjAJ;RBz1_0g9h*tro)@Ep4-=gN>zmLpb>87y;ZcLr(eWSf z6qom^y+J;Pn>V#4^sCf5=su3v)d%4x;my_&24_BPU0|G2+elz^ zix}fb_(?${m(fF;c&7)vD(lEaU0DTYGG;e_5(6vn6duJ!@8;1g+LL)V0c)v2iTly4H-W{mlSd%h%M@mHT%1#6XOYtaBnqZx(nuT?aL5=HDhdxAwKQ{6+6t z5*Megc@qQmTvyIAMgA9(r&>?_E79{qp}o4H&>e7TM0Vi=st~zRw@hb zP37z%({$>eVMmfU^dMgkry+)O-(%1j*xO31^XW|0lGWaJ>#g{_1^&Jzb<4iEKUdCk zppWZwY%QIEXH#OL_0p^Hc|p_#yquC~HC1cYtIHCtov0gl?YsCqKk5da{w~pK9;W5B zF0j zNp7L4><>=sc*e$cU%7rt;Mdh%qoRdpWep9L`@pgzw*7nTzctW9h};M6ZaQIYya}Cb z=e|GpJ7id!Zg9dK_kKoXfx)9`2JniY-MHt-Z9#6HCSETO-glvQ2<+>irI!1E8FBZk zh({MXZG?`6W?2u9CqT2(uh6W-JBQC0F|vLHzH#a%ouZ}&HuO}Xhi`PPXW<2rX_5oj3d~Ni#)~eV3GUC9jB`%)H{INtEjEfs#y*WcGW~^7k%@8mQd+3Bj@G@(uU`idjcwzf*`T75hsgxbUZ~Mqn@eD$fXy z3U3N;&E#H|zfVaC^qX;4dwa}N>J!x)60I6zJju1-QO@w#g$_||4|0smacy~v>xhOB z$8fGiCb|+$$IkCGIW8n7TU#fppJG4V`aXJv$U>=&eb?{eonbR=PN~ryVZ;sqeO#cH zM9YHsmfHpKEzOz9R`z+sLfgpi`N!EMQa@U1Nz;!zCMoMccgMvz_B7OxDIhPc5L?Tv z>)A@)zTfp~od=46{u4Q}&>v`8p z_+HOvnbCUopwW6}x}Mi~!f17sanImkb-6;E-#?{QwJz|m&IwbS>y{Zfvktu-dduc_ zI&o3M>h6VxLMqZe{%8A^qHfmr(EoXZw*x=-(LyP($yBCPVB98mrY~Hii-|Lu5+w~LCe-n+4hxuRXzIb>R9`6K?p^Hww{3_>} zMyhK^BG+tnk$2qSSiZG^`S@vS*s@WDllOn_HP4Bh2-vl5@>>t6p#54vcJ#&#p=a?c zeXpzehg4bU>GrudXL?u(xUI~G2P8l9)H~X|Lf$=9tIeyYww?G%uFvtXj^n>jXm~5n z_2oKkecN+sr?h#usUxy-ad^sk;3j#UQYY&Maf}OzW2{?3ZLB35O3`?Rt0eom9o@QexQRh)cVD$~zo7+RolfV#gv5 zBM*UfMI*6e(A~eI#|~O-d7PY8FXWOzUAxXWKZjQovaPdS-z@bD>*1-oWgd>3@33x6 zM%OSUR8i|;^7uzznZFL3{TrO;{t9PiRoVMF8od&#-t6_*kypa5)XOQV{-l5scg4czfQvTV!-g$9r&o|oie4&XO$ONgqB6JlCUDQDr zwyQ2wJ#xeOj>i@#^mQauZI(L0SCKEmBl*zAVSH{E>_$ffJQSy^?CsP8f3}kv{y6`A z{}D8yt9gFNsjP+s>q8ML7P&jG5ZRfnkFnN{;I}U|_xSxx)PvSv%Wr@FM;^^e7;haf zzk~Rn-#Hl*t)D-@?=Jk$UTJpmWa~Ql9m@awp0ndo>qPl&=6`5q>VYS$_0YtJJyh&s zOJa*>Qt|P;gzk=L;67i4QCG{eX*{)*?=^u371|Ur3>gUiq;6;nGRFHsZS!U5;a&Cv zuM=1Px`%36NIUiDV1k=VJmVUtZT^;LzQe~@&%Jl>G0IwbL<^}sb7%CXswKgtL*+cE zI8Wydo-H89R&vmDMyb>vd2hZ+9eb!Xep4rOv-4ZZLTCC0mlSsKDH#{3hSm4?bbdn) z_;);?!I?erw-ZVhM5s#3?f6Yk`uLXIKJlQns7q)`PwEMm;eXJOXCtU7d@e4&#YK%M zX;1cfcHmwZKu(L&v@9Xum?<9Lk%y-hr>#?`308b_?t`i)F)W)2~i_{ zH264fCwe<>9rSkmu*`?rYHHp<)@na=zn6GV;>FqbTGmZ?qjb38jZ&TQQ;%ZO4Pvyu zh%_9l=UeFITVQl=gtob8hkmTEnEVB~E`I!WQG<4@FoAl@`V%8x2zp{xzV5ja(k1<*knT)yU%6y0v(+y0c=wZhgKut$B5pZe_o_ zuP}r2PAk;D*Vy}(Jjs40gM6~$@aE?;RLhzM-6}Y>D^+>=ZrzRFccTo)x?nptqW1={ z1~`!Q694`%AK}&Ch`dK{Z`@S)z?4nujVYTnKKdI|!V4cLK;GUqXe}-;K8fDeTfuyH z<#W*6`a^%d2k}|vWBvZ1kM-&~W8SqBKGxPuU+d)szSce$*iUD|i;Sh3vDEdCN8bu{ z>t{a1Z zSg0vy=}O-hq1mbMS$Ft#4*V*#corV~tMb5h(!D81>^$H>)?%@rCGZjW3m$$AUamv8 z=b_tc25(0l_%J}T7ocJLGWCXinZ`$d!wy~wCq$Rt#-}Fukv-@S)c6tn2wpnyaRz+c z1RqzyM+5kX$yd(4`EpKT8{YPx{|A1a_!s=tgP%zDgAe@+epkT^n@;nM9P;7&Dd2n^ z`-IHDl)0Xw#tgm%^t>>5)3f3Vym@5of0uC|@r>}pm3A5TX1k303o@>^YxJfMmvkz)iw@;AA1^(&}axc*bTpB8_rzGaxj@DY{2dKO&Jac}T zucQ77a*OZqqA%~i^=e`sc`VFrto7!yvDRDQ;KGmbRl*;2Dcm!Fi|@u-U4`53Kh3!6 zz|VzJy-M&?pr}*9T5=7UIm%ZZ`^pu+N$del$if_N1G3exm=Tbgl1(Q5zn{O=1%APe!d%k@h^!zx!&2+xdS+d zgrHXz=%qiRx3-LB-^=`ps2|-|8B5gC%2KgQSj^>G zSoR^hZ<8H+RXskzo5*FcBh)|c>HMB{FTUyRe3<727K<701;ZHU#W%+}Ba3v$U4_Vb z+Bk(TC7ty})w?}^IcKkU3!H!UCi|Ya~-C6l@#W`SNc8ky8>?r z{mNXG3M~m|+ztK5IGgA+OdvY9m&&atGAB5Cz_fLo#Ly?yQ*QiA3WUe8R$i7@XYm1va*p1yiQ#B zV+m@~T;d9z=07vBBD;w#P(=xO*wv1bqrErb1vTlE7xiGN{pdA-7-Diy>P(}|8nG?| zi95>@z)q}Cx>;&&r&p*uq1EwsX5!DE_O`k+^?h|``bX-{!sFd@7JaSmWRWLg z-(kD+5VYAJTCCyy+^=nSp3^e7#Wu#@Y4Oc9k6Qe!S@q2~+jpot^R{8*9Hj0<_l2GY z+3py~;|PdIH}^!(EO^^?C#r7&HLNnspJF>&{CnFSH8R~i<$&$Z(oeCuL@YL6qTXo! z7q&Z^cfL8!JKcQCG{xMoXsJ2TmSIi+C$qpwrmway^KEV4tKf>WPxo%*temK&r};6bN%D1jNm}x@w}FihmtVN@o)%r_A?~jA*5m)v6}11@wui4m{xA|sCqL} zP5QK#Hfh8Ias7t$Q~ff1 zXY7(4zSkJjEd2`nWgI{6U&bb5sGz@Zkv|>p&nD)?NgEPtBK6K*Z^yUb zMer=+UtWX#0GM>(Snw_LmG-tBcWn_oHC}gBy8A9R{Kvja=-ZuN%X^I-hg3 za~-+6O3D=)l6s`xXG2ujpE#rNuCCK`T~BC&y8bU(7$4kN!#&IuVXVP!ti?0>Mf*eR zlW$KRwZ?cpXr=LR|5e5V{Z|_!>7!oH89u%<>AUp128>q+;NciM-&_Ze?KC%pPZGYJ z(;YjavN-D`*du)w`VhQXamcmjobZFZ8%y5adPUkjoMrwCdDs2k zetW@yb*#??#@CSZ@;|iSju`crv1j;wCKGL1^@;s86Hy56|D#(sMjZU6R# zIi^3_=a}9av&MLjDc$tvw7X5=dog(?zP#(DC( zqvKEFe(o4#p=NB_IsVBv3W)V9^5!6()uIoMlRXH%uSqb+IJLkZQClIRS{3JkoVUk zuY{3i3|8pkWDgE1UjR=UjBHwvqR^uqck5cuQ4jI1%JHuvkM@)9G{c0>r>n^Ms$BfL z^wg!Nyx#P)g#AxZhd=%BBh8;WR(R{kq7H(j{#zYl+ldwZfV-a|%|Y0BdULm%T^CqX zBJnZ6(zC?J5IcnQSNi(nc% zDi(q&k<82^R{cGw4pf~ejnbcA7c|w{fnr>pYl_}>}{_q9d~$e zk0$0 zOs}5fL+rM?OVe$&dX+2wZ9(2=`*%yHd*3kFJDEn>5Ek zuwU*LNjAqh&gN(iiIvh+qAxqwkN61By7n}npYKgO#BR;JI1bbq9NDzJ0lBeZlU6p5 zF>5vnt)`SM&Qgx6?XEr8M_UT3M>=+4lNEdTCF;JyTuI%c9}=77xqf0h>D*jLf38j^ zZI@OC-{SZ%5}V~NPdhnp>kz(N;$s(HUR;BI^b6ZZM-@f%lX~joZnrb{0xWJO*Gu=w{?2m9*;e#kv+cuq162T zHkHs%FZ2~zercB79doj9luBf8tay{X(w^<_(1d2WbFqH|af4UbD_`jpn%L-Pwhk&v z&A*bW%SSg~A%6X`&t>1G!ahk(a0p*@UThY$(UL0sQh50o^bMb%;`{>TtO!K6qt;r{ zLsqoL*ln$5m59uHG>*3XiT=pliSOznrpq14!V`5b(B?`TcfoVrTrsgMd%Ox4eo6SI z8;d5C4ZY7U`gn)j<2EKI*)|6M+f>S4i2v;c#_^9mRbmBg3d>H;zebzSFb@f&J<)Th z)x0Y;zm7EViRuC^IB&QTWZZ)}dpw4i>`~CuQWf3ogcd}uYI-KH>?rw~o|#;Bllgj) za_8woiuNv6W&4AKpNVcZgRi%cV{b7AKhTHk;H=F1#8lDMMwQ>cNjWC!jW@Ck$6k5s zm_qj$-E3ifTzBX1RelS)dXI8Bf8649j&M90sM;>xk55I8zhfMA`{v@)>piVf?m+td z+F)fxhgi|41f6803R{BSB|e~VPB+H)8tYERPv*eFypLy`Gj#UW2E8MyVUwz?LZ0gz zwms^8rRR)PfMGG`_ddE8z4K$LvXGb+P53#3kHr$>5dLaw+h`lWb8R;x=UNtxQzI8Zuu$O=m*cU0Qrd^n#Ez1BmEHhY2LBq z+sW@Ce;rr1Q%|bf6aTDk&pr{oeBMQMdunQ+P4W%b}+fq~CwX`(_eM}RWKR0B( zF#~_qS7KHA-3`eftc=Mrj{Hjd!0$Y|X6#sfq2~{I_r%=f{EN_c5B`g6+G$mC{$>7m z<3D=Bid6K3^X>kQE$9cU&=1yePe)(oMR4Ymzb#5c&Z!W&R?e(nYPlzW8sFHRicQ?( zIm2SN4H~4n4KBJXPGs64yVBxTBHxN^I}F+O@?K@F?yP1vK#!X_&!v!Gh_91)bM5rX z2RNfqpbyJkzsnKjKuRGO{c7R>aN94_!D?aSw~}YQu9lCYOB6LwktV=&0?`i z-^&@)7~*E?!roY&d?I-EQfx5O?tW`^?{x?FZMil7%%NG_XSz-c|F*vhTfDA(U#HvI zX9}UqI?lZIV+}kqF>LN2Xz;4)Z1@|o3taFEg`-vafRmGKML8-lFSq(3 z$9DyxWrDZ$*!W~E)!r7p9(q;MB%a%%DD*Vo@A>0?4wLeC^PLU*?D!@t$Iu9mUKhJ! z<+W}2kmsnk{)K*{Zjb6fGW#|pIXK_}kFY9Z!-&VtO zV4#1pvdY z(zt`xq%-E8K-P%lj9|NZKB`C=<73C_x}Y~g_CQC^ST;kOXE_u77H!uZaP2wJnwnoo zxec5n?vMVY5WCZA$`7Ob8N|aFNPPU!Dl8<7GBc7q_tL&kEU+z{Nqhr2McQZ7!s4ZD zDc4t5JM}b`{y$<#u%Ac_(0H&?_92<`ki;??Qeh7R(H=P;5^4#^lR>Cw&m! zQ?O{@A$`8c#yUQJU%2)Rg66u8Wvy&V&3|(?^rm&o{nwvMqVn{{5ra4B^OwQjn_t%F zTcG)Sd#kWJ_?G?Da@^k`nAxbziL$Tmo?pjb-d* z9oMmr>sZIK2S4WgcYC~jD>5AIku~l-WMf_5QU2{b4So;4E)|`l;*1{OvgS94EuJ;M zI$Z6}r2WN|b)I!yg=`gf7w7r(_yI6pPQT4_>WN!*A%|E#oE`XkFZ&073$lN3kXY}j zL1T@J(G5MR51O8&ac}i+ushy6t8A(Mj-mp6i2ED@XZ25B)D_k&?`+@s8hY>}$RxGI zxBAMm4Lg3P<|iKKtU>{CJoQf7qYvFkT#fCbAh@7a&JnB(blOg>At|ZN*9L;_a*7YW*ZM^)CB@g}vQ<1lGVx6{4D@f}{S|4?-6dS<&eoouD zJkkb`7DxG{Eg0amO_a1Dqz&@K@m)B?X*;}}v=O8YL!LusTRg&P3zD=%(njJ>O;c#R8eAs0 zL`f1SLRmOgHG#~m|3;m3Qe%=n@?rwOe z`?=S=N*9&eycB(?KD@||jMq|zKRET5z*p9D$Hxu!hVO|3as97T%YFn$|HU3wKVA6# z=kB3M^z*mI8S+3R%8_WQBxJjR-1 z?0!Q&;a|VwT-;Fhzu{ohuMUPfg2Pktbvook73_|`(uXlhC4K&^6w>^1?a+#xCo4pD ztYeHO`m2OtCnwof!OM$1cRYKJ_=@=M=aM_9o7Z*Tx8m_H_qF0HGQ3u`C7leg{dpKR zB-Xs}tg`0oS@ZR*`S@clSbqE?8FyL3mQ?IstYKos?G~B%;wHT<5^M@UW?lRW=a;!3 zkl01(op|Bx;_ac2hfe%OaXRj81@&SD>Lo(;HZS2{f zvqyLGf8OvMyoZ(YXM-_v7y2B|X3k(wOd_VmIYX>*FLA9hbfa@0G^uV|VxNlokiBaZ z`R^jXM*iQir@aKv)xY-~Il9e1kr6dd}mohOCBnHfe#m z0jIY`U4P8}feSOm<+@rm|YxG+9wO^fod38NLGuJpL8_oIJ zVXEu&P{yrW=n&)ksjyIyaM7P&D_jU2T(8C+83!M9K#Dp{Rm-U*Pw>Wxk5wS}?CWcA2x^wOl%|Cv; zrZc>#MNbdBuV?gGVxoN7FVN7Jx@K_>d@^UidvKS;Ko84NwxuUwqVt)orzmOMOa@{)(wenvcvlbod;za%XB614CmX`~oC*%c~iiv~f&t0LV_|4r* zpYEYgSEWz%XFB~lp${^AHmrwXCFi$)RH23+xSQ+*eX8P&y5RrRC5uKqvfe*>u=1b& zA>Utf?s)o=MQdkC8s~=N;4lA?-y=Hi*FB;i;p}lP^!;N>4|g1dhac||J(N5~;vih2 ze=mjJV>lTb9RJ8L|M+{C^jrHW>*zwzP~$h8p?{4&e8m4%*ki`)kl{imR>lQPtgOh$)gD$f39R?K*GK(otzK1OipNzUb} z8Qr^eQ4#Q%UE*vaR zF{}R~<1VmFWT_JPu72=ce`wG-UedPh{Wa<5OLY#$w5RYH9eE7lsS?1x=fF6@Sq*>6 z@%SY8BSQ-gi7Y_O16u&^%I_28mv$Q5?KH$sXYM!BPLGU%{Tr;hCrs@=M}7zI-!JQi zedQ0dL3nZ>KYl0Ad*86P#n+|gZ)FWSBz_C>fSz>0{Ec2YdG1Nqo*nFm;xkz{6aV_G zNZQ$>{9}jkQXXDb@=hh6_|}PRbM?5$HeKBNLOa+lz7lQS@y*@G{c_~>>7xdKgFE$I z4O4Xy2GLbD6PxPNAyv7b{pBoqMNc)&?^gzF{YQtQr;<2xdY!*v{<>7dB>&CRFOc7- zs~Y!;Ymev&p6cD-I{2AXWP@Juf$ZNR|4V=1w`+v=-t6tyRd{jauF4_s+~Nx;GS;m_ za-XTzT)*3uUdDKJ-2dJxcI`=J?0;mx*wgAt@L_iu^F5Y+jAq@&{F5^rfqM-Svnm4l z>n_H0CS&>vWz~UkE--E)7)AWfImuw!G0yDYV163FwL8JJP<_|wy^-PkS(k!qVc^>R z;M#hAM}lkT!L@)Ov+*K#J^dTLaqq}{@a(E*l>!N!h&;h#^&B7D@RRSvT|)B@o;2a z_skEAZe+aP2IqQ%b4S2AN&ooqu;?Oi?(3Ma=-y$5_#eY28ongG$lN7wTVq|<6H~v<*Yte`-VZ<1V@t*z`<8MNG zb3b5jdgBirF zB8G^>_Y7b?1tMow4CreNTiTCzY(@j?vfHQ_Vk{#4)RNUmUq{Mn?hqpy7T+uld1t$qi%7cF%`Pug6wW9?&?1LEU`nT znLEdSM0^G_*dBr1;qtxs*ffZaJG%Un3&ht!Z>oq@q2-8d8eLxPP0K`2F)Sz9#$~5g z(d{m8PO%N*_aD)Z4qudIXUg4R@J|Y7-`7N|?0U2HBLhQIgBSIUpSBRbI zJhqxMk;U!~$DTv_^5^9)h|cA&A9n5ely>yfM_3Qan3|LGS1_jd@rE_B&n)EkuepKO z8UHw#k!gI2wLb4F`|YqX4;zQhn`b%>-CjT+(ou$zeuy0P70g^i zs&% zZTx>Q%e4nTm*P~j-KH-Mv~41$ieDXf>gd)c24Qmy#OCPatnn+XbFn{*zN)>e@rKyH z&*yMg$_V9-z2wtf-F?Efr#&#`h6>WcL?7lKG}$I)9A0bc77!F@ld>AI$G>u$xEMUQ zcVXW77CFoJk$CCtGsR}>vDMo3YppTJBUzL+k#-(XYD5-gZP6*~qRiC%U4HOK-L+NA zknMM|ue(ao`SQDweJu{1Z!kLFkdK3BPk+2@-?H2D&+H;5(Q^8@T=zsG=S;(VHr$2u zH_O}Kh2YS6Y=rPr=s8P+Jvt1#$ZW=3#%VR<^iTRJ{rdv@@N#Ut z8^gpl9nkz4I*GH`YvCKpWgNsu@%s^~Ex_AY0Ro?jrAeiQPFHzpxFRIUB2WDY`O-bAP;dAy%~==WO+bSbN)*G2B}r z@7{8al(9OC|9T_!3wB6ber@;6K?&vU7k)NJb2OOrW!159%=I1R=fnNVLK!z1qgd8O zw%1mi?6no21Aorxb!BJXQ@a~Yq7%XYvZuW*2zzlhafwP@t_tNG=?KK8F81PI)2DjI zRQe=i|FgZA*dgpsm)zs8E3;rP9_}80Pyd@3SJ44^Xe6ZB34hZJjWmSo%CgAYuS4E< z=*t?NGA!d;){slDJKf0pJ|9J~`To1zn3(*~#LWS!?NQ{5N6zA_n4Oyc(81LFYVc2d zPj$p~u7|G7@Y}KQ+kQ%K*s^Yd;U2#&({I2huVo$r(A%BB-ivS8n{rP{CjJwj-O6|( z4nOD5Zt0&m^p0VdAQ|?g8^~B1HWIZce_ob{ud{)mhPH*6^Dl&q|2C~MlHmLl_ zZ|^GGwf^)zV$nH%gH7WrUF6AD&VkGe=~nb^NX_0qb2fS^v42AT+-;wwXGl^1OFj1m zEmduIe&*UU96s6C&Q-K=IPva2q>Z)uZn=fX#=jx0bWRHYRW5tKdmJtW_O~t}?%^f+ z`Z@C$q8HkVC^uotmAg;Ge$dIAw!=;TNne+f@5S;7ws+~XN$;0i4NtX@F%9sKNF>fv z%lFO)^1r9Nx5>AXvRn8q<2C^wh)Fz`agdnVzH#}4*xBOuC1cPGUfdk;@4kj&JBPO1 zc8+_@Dr`OFCK9{vsNCVB>zSL}=1N~f{oz_fBJxU0`u}?Bf0lgGmuJJZ-H-Fz{p^tE z*)#li&!a=eBPh3y{d76wbL6!A?~-f5U$LTWqU{apNWy3206vMtS+|O=>S&Fp3~9%b z+or@7(9sI^Q*?+e^RNjU`Hi8l<)O2ld=gXTNo|yMA@Q_w`7JuG?^`|3mh*pl+(etu zPl;x5$LPNx`Pn;VEH9KkkUx+Azv6d5_=EWm@H?O|IsZPsbwT!g&U|&V@Qv?ruG(A@ z)p1X=@Q&P97n5nX#ekpq8nnz`yvFtsJf8n^cH4RQzrO4*FY^i5tZdj&TY{6vIRc+h zws_LwIdfsap0Ml=&VoV*cIK~hsmXmWDP?P=UF|bJbhjsy_rvWy9p4*NTlYfckh4f@QuL=Y=ddpylRb-=M_^|5{r0wG zc()6o_&B6smrs#r+_TNI`P0}(c~&dWVz5ziHpypST^NrJf@j~zGyJF)9aB6DbicPa z3VSNJdYWgK;6Kgyotg0UlQNfvP#@1e=UIUc*#$lC_Xb%T$K1YO@b)d5Il!SlBKEUg z%H%E~-iu`nv#9U=P+j-`q=#7YXNI!ZI)BbTKf=@YivKIWnf!L?kEi_k{XO|#{Ez(Y zGv6t@-k|NylH{=PC#+gNJd)8_C+feU3}c>z^lYuo`);A=#EfJ~_7w zjkWZ&LmwNX9K_(R6#k|=G%ok?-AIXcoSUmE>mN{+XLD3#L!xREx}w~j^8WWTd6p{v zPMTxM$C}(THuC&TdnNX+RdvD}gyXXwOIut)anh#6=d|5sVwRzwspQ_iRiAe# zj$flZ_`P(Kt0br{CfX4PO-Vj^Z!hmP^4oNWT4g~_pGuqKSvS*@qa6jT3%e!SaVPmD z?{)IZcOUvXir;eYpzn;aZ;bke;(JfM{lU?5(52L8;r)KJA&~l|-m|3l=Y7H6pV!md z_!a5P&^@<+52s|T()r$G?4q1pDd%64DwmD?k8<>rE3Z;lSNh+=xVXII zVnT1^#9wt7V=?^dq{^NCY9zd7u`|}-h-NIR`Ho>M+`gf#o#(v$de-~ByF>rRNdMsV zpCN76Rae53)Fd-y%|;-ty~eQ@pu*3Y!& zN$4~~as`*_a#iIasVmoBIe<1Udn4MhPfLp1r>VGYlqGHbD{cIm-=6*A9nKo)%7kvO zgV7IjyNS>^d+@2Z*k^?HozSca8nO^O!$a5D!>eST?UTl4o$H6q2F-tIkScdUm4^Qnnc&IcxNw1Fym|Tj&BllmrOY;YI^-*+%4Q! z$^O?e@0iu$bY%q9y1aBuS#@1hx`nYxLCE!-yO6h)yz9w3?{iPNS=qfDeQ0aaEl<8GZ(AG4 zcZ_`5v{mY#zq*%WEBQ*i`D(rSE|Ra2e2w0GOTK>4wsd1J$8^Rv&1+u0i?T?mn zzL0*L+M)fj9~kr(_}Odkc;7SRV6{}G27;AnQrK?@$Tc3p3|?=zquF2W?eaWUk^I!_x_ zTHnSWw1*m5H^kod{N7%+F7N1e-%A}b=aI~di#a!UQV9`<{2ZOx4~}TW%a-xJ;7b3F za_bKCa(qWQb(GUe8JXSH$XT=x=Oydx{i$uUiRmc&NmQ!BW{j_HffinWhJ6-Xi=eOb zXxI1D)k+z}rof)9+G_Ro*7rj9MWueK?Y=~rA@qTLdd}$oNo{*#>Do~yi&}+lC%xYR z&eh`sTEHF3a(9TtQ8`CEg9i5aOUUj`D^#Vr^YFfpb0}v7a_9s0$|n5bobVXhIvr;{ zwA>u?hNuipMs#@q<82VS)TX*WL?lBExZOm(je%rn4 z%mntbc9LSDPhw1&KDUjE3{qjpqCJT>w8}!7jDH)vj>a7HQFfcGBlRtGMSG;qLh8gP zX5=Qu{t)+}ZDj1T{nb%F#(gVyTWn*TKgCy2#$Lu*#$U$T#a%%WVOygbPiVWPe&J)b z^KLNXD!ycX-mxz{D6t3d4Q8Iq`m%j18B_N31jDVQu*=Mmtf#eib??TVxVh-#{_8k( zs`HG~Z0|U&q0J?Xk&M+j=|^cVM;>W=NxNKRuPpIbtJ->&M9pFxvh^X;?fS?f;jOle zB32mr?|&h+P2$n%@KKZWLM^grJzHt=lCsWE>NKK`LON@5PTu>MYF>o|+zw|-|O{h0^B(6 z$GLq?w;Rk$@bJ}kV$cP<<;>MF_P8AOi%)eo5@*j#KQk}yS7%1(j72Hyd(C|a-S!6P zVM5xhGllC9?DL<|yNDR#MJL8`#^mz4ox%QYd+x|)__laxM&fu(AIClA@b13y;q5Dz z3>Tjqd+YSDi7Y@(+}t}lWFUn@EZ8;#LK$*0lg6Z zXz_w)?K3@bfEBtL@fE@DJ3{!*PXY_OP2u}R#`Juzh!G79$^kD^Q~y`tAHehL%Jz~m zbi~KKf<~MlqbjF*%eRAN^(*Z8lBZgy@^_K`-|Ca+PyHXyOh3ts@A>xsQ||pg+vwi& z*|*)i?j5YBquI(q4AJhH!;OyJAHv((pRY+?^KxruiplW}F$P#qiSq0|o)y9im{@bd zmt>|G9aHMy|57+l<=+@{n4V3?Q>29m99SQ zXLmGlzNig47JKM4WKX>A^#1@|KR@LCvh=bg=0f4&ZGEL#N#YPtvDq$Q$^rY~c5R z5k^NwA7WN);&Y zPxnEFG8SQsh3sq6-`W2$7Qdw&=Z}Hbf8WDAb6?9l5+i3P-*SGl;DX*ApU-!eO=#+$ zdR@HGlib7B9X&d7!cpcBU2AvZFK|W_nX*uEZzSiFzDI7~s1q9NF8a?o6DJ^-yPx5| zrJ=tgzpUF6q}P%DHgZNLx>oTkQ=#cMS&!*LGamZ%oJT{KcB;Q~D0~q79DA3>KAOur zqNiB8T(kXViK-m5jn$EP z(1h;t_$!}0?cqP=j_3BSciy;w>|lAqZcCx>>-lJY${I``0-?3Z(Aq2fjz{+}T?;x{ zfZyX1D5ZtG!;kqDV z%5-iHhR=Cpf>u_Ao??HnN*q8RUoGTpUSR4Ck*THJjf|Pu6__Y>Ut-Qmp>ueMIaQS1 zF>kgj(E1wrXRx1)4^)Y-Z-#d0ztnjZAL_yQQ2!2nfv5hi)ZeA~NpPpVc1w+M(5tNy zQ+z7z(Vf~^qYE!>edQ^;?G@^NnY%*cbb%+6G+nbEy~KHFL-?Rg@Jt^U+skzPzR*=- z#GxzTgPv=ToY|B4DyLs3Nn1w$rEjk(aJZ9dJ3&8Wob-&-A@4YKCLjC?V-I`Fy2gaC>TT8QA?nkhE`C% z4_oEitN%JB`Z(D$6Ve~B?Ivz%AJ!T??3}};6Ks9CV>Sd`VH5hpS4k6{p3I4Xejf?r zJR^ER(Vv-^_pZGE473rNnPD5s8Zl*>Y)3u1(27iS65kM;MfO0}a)p_DX+@89=6$WZ z_)`k)c7n!*mOXp1N5>Td?q-0yqWg-?jCP1VX+CvH8{O^W9@|CK-&owseNH799{ziM zK>QiXLB^>V&YBj#%z0p&v`5ywwB@b;(v}L^^54d14dshnHyeH2F|bYK=Xz-So9EF9 zF%RHXqM16(=p%i)Ihn&)^o=>x8_Qhy(*Lu3@u!usmsk#pb*S-Se>xfieWvi8F<-Nx zw>>oXot_Qv2qJF#(t-S(;w=tk@jMZ8N)o3!Tjf}Q|c1BQ-Z;w>)-JbZ9AGvjz z(ia_l+UV`iW#0Am$B%lq&>z|7eEoTlzKHGJH|MgS${u zpD=s(vYfE8B;(=_S(3wsPLjJLl~)|Cd+*8fQawWmejI;vna+(7*ZO z{s|xIiF^D9H+?+?R8p!tm zc&CA!vAV(;tK|}th5A=K-f3S=+=RB4$N%8wp=xHUw@%0TwO!n%DsO^;|72}l7@^wi zl&!N5MaSxo|CV35@XFwG#km4id6+r6z`0y>Efv+dYit{!-A2=g-3oL;O@+|kcIuhR z_zs|-q630gN}s`e5Kl9xivOAXN3T|q!aO8H4|Zrq^sO=^{5+Wb|P#jBh1 z$mORuSRA4k<(&VUbGz-@Yer^IYX4a`XP%+b*XRn~Jm@N^(bXMj&Cu(b4op|+H_?4U zLp8|GH4TS!4)~dxWIlHAA&7NhVDEFeLfEnmWfGfH?4+3m%G$AQPeKQRo6pg%$Q+9! zrh~3czscgrLRVJc)puW@zAfZ?F=0a6KbYeZ&auf@yz4YMDl^TFsvtl11!%gLUz@2w zl_l{p6=-~GWgjN^wN*JSwyKXTwgV3ZRaVtmY{zM5!(7$YpLvb<#$mgPeO=F?-m)P^?M|j@(6#J6kd_*cdGx_V3nq$(dYog~VQEF*2 za@Hs>E#A-v#=i-^{0{ufkl5+0k%O%JS+pTZAKF}qUcxuVKAVD%281{EVR!pX&zgDw zx;c?=uUz-u1Nq7NK*Ro6ZFa3*%N^7RKLK3{ehLi=cFH;u7ZOXJJaXo^SIRKQ zNifFYs(oSz_kC@pj7E#u=$tC+d2`JtQjm>GOT}oxVglll@9tzYL#! zIzu1Qbh7r>rw92z8I_?oG*$ZVh^p11nq>a1fzL;suggtarHCmx(owdn`V@AO65nxXH})a!V*ZH~Un_DH?i zF)21^?sd}d=@&eAB6f^f`uv?YR}8iOjka8!2@j%E*Q6c9PqhusP;JBW)X|-kIhOfM z(U~3h>2hojW@`DTmUA|VcN%ynbv|(#$y4GVYa2>FX+wLC&e6C=RZe4^8#iIIVcj=C zkD>Zl8-7Lc6C74Y`<{?8Ej1P!qiSoUF8t)&G2rBWV|)wawT4)S>|^scS{*BS)`$)B z1cqw{`19tS=@a593{Tt@nj1yF%wB^C% z;f`mSZ^|w9FOD&uX5O(mR`kvq?pRop_Q8p7EbCji7qnaaFk{iJ+9%|`Mb6_?9NsY8 zksd$7_$6uB2rK$E40p#@v{KhZ{+AXeI5tdE>3<^szW9;GuH<_(oIB>1y)sAeR_@w+ zg!1pBzFF@+kU#UUmi0F{Ptz+#o4pRd(-zBcqke$RxEUI4u_PF`^Sz{}=r(%gULtPr z4*Jo9u{|6&#nVQ7qOVODZft(1BA!>GpMO(FGnM!w$!66xgjG!NGg#_X6GBSz!WN#)`+oK;ZBnAO=_A%ow`_*TM z5*&lDQ4GKB$t(Mj(3KzbJndj_M^;~zK8fcuZU+V-yN;}-tocFqM>mij)=!NLN>m9m z8Mi{-Sw))+L;KkL68hL$EZXddQGIOsv3=aWCCJn1?d*xNUT;$WP4@aHct>ZkIGWKH zPlvzD?wS(k7dNFcV$hVzCplL#=90W*O9@BMJ~FQWp<1wA7kD&GEcpJlXY8v zr(fH*b2&rRTU%AQDfQ8_3$eE_9&aX(b~Ig2woQYNn#4YFm38a{+oa!Gj!GB0&1UXO zs8iYDO<3>WCaI%2^j)K_hncgl4$7HgU2Y0{8+cay@uO;X7-zl4bFQM6dsH_u7QT98 zR;%=1v9HMZ1+fPj*b4*hOo@|ovGeapi3`RL&dk0d{gL)d-TTP9hI(?2n;co8=zNx` z*9&yI+)pVN|D)m^M<2+46Fn5x8-|~LNMicsZbfNTfH~;sX zwb=HgOsU-Sa8Tuc?mgcT`|TP0$7S#Su+ZYDhK7Zvoajsr!=HaDYa6<$$Da7-r&OZk zI}DC)MJ|5jp(&N7VD8prEUqw?m5k*HV&<*6S+Mhlo|qBr!58@+i!OaL?-f#>MtM?x zJvK$;!ix2oR>$YmDR_`UJ;|gGNVYnb!9SJoznXe?WLmJFV{4b^{C|daw(>s%zNosB zO5d0n1&`$U}(!Qi1>=|JDrjN30`gJOCzcb7B;myFr8?;y2r@*ql zzs82ex5&Jr_o?UoYs4MC2>!FidfxnMXH68kqmjC9C*eJtgO9k<$I#w_Mas6Eu^Vx; zYohQ;Rs23wXmTv2EtjCf0a{3W0c}2jt@bs>Y#A{KrEJaVIx6E;%6N4_w{;{`B@Usy z7A@5lI#(rjQ_t2!swZk<@Waed;Y|m)FTmF}Y4hi_O>Eo!Xse9t2F5i4{vvRbvc*z& z0plxeFC?a&;IY(cA-39h>S$u`{!Guk3hdiS=kwp~8p$Tn;hi*aMqmXT`lwJ*~7?==(nSqFm;CA!|C1wOs&z z%U)Of6#XcG$6W*+)MA&*_*0k4TJF`UU8j}RKCYE5vj* zm~kdwaadAqtPx(S3$*kOWnTH;K&$K_gBymr^$q(-^X)TB=-ZTIu8}eyPcmLf8+yYB zAtxNezaRQ>R=eDK??K>g7Hw^0+ij_};)8T&^1zT$WI{qpWv#=HT#a^_+e zCMHA!`PRPZu>nc`E#xZ*P{X92!uMV2BWY71bed&IiF@`XZTD|C^|n2nVSn90U&bFZ zIo5@9Zx=ZDb%uIe|fB1CL)GD z9r=WxDjKuEW}v*yu@=WJS+ii7*aEM18$Rkmcz_q;Eyh_feT;_& z#2C?mrx){k3E%rt%*G?omheuZ7Zn~!=npx&xT|xxTfRN#7Vr|2ue2lqbT!dzz{)2S%?qfRHWK%p1emj#2+M-;c# z4|UI93iBdoK|3W+sVtGb?>$$#jk@Gc@kqw>Ys$U>E?xyEUDXzw3w*o*Hr@am#h2qd z){&n?Y=4=A`(-2z%Ru z$W3EoRbo`k;>4SODoFfxP-dc$bzZBFYBGQAN^jy_!PSk@HtMvq*No+TsrwV!FM6a- z|HAJcU0r6O>uA|dyDhFTF!8{%c3XWxVB&jE+imahy^HalztiH_(ZMgKO7`XTF4@0} zv+z;LJY{v9ZGT;Y;3SZG6MCL#&M~Xud4Fk3;sA zL5z#=rPD?)ur1~JB%V8YE_D6HxCOROmjbPSp**vzHfSQ4Cv(}6w#a6${i%n^M9y5$5w&uYgk|oa<;nGz&q$e=d4$q;@fWpCSHQ>ny?QwVIS(fXhPcn z%@2DXaVfEf3BNq3j(Bm<*9EZlBKw^14=*$Jawf*N?+dMzvM%1Z!C4vT>;gD^k-bm! zz>+=&XTKNBrr4Q>IoRsGuxzgYGA6G&w@71#} zj+gfY7dJzvth?=9)W|;gussP)8{mEVXq<_)s>IIFv-JCjW+<leERi z3h04aa*+%C^409Mnx7#9|CcA8!~SqUVi^RxV*;N=msusWhaPPB)jWr-+ib^T==72o zCuDDuxi^Co!|Ai&#QUu2Q%_8B%+`lCRkyp+`^98Kw}DMrZ{k-lVS;0Z-oHuXY{~wx z*^aaH;X1mL>kkK7Z@}w*^Fd%@yPV%l^=mUvW*g^>nmTyN(8W*I6bF~K z>g~_fD!R z32g_*j5jtAQ*ADHXC-&)Wg3qivsNG8+#g$m=%vc-er=m+tGNe0^2GFxQ=4lBz*7lr z+4XVTuhL%5>NgeQzxjJ&EzZ;r*nWdFmlo0Fbf;xne{lUzO%FE>_Gl_Z7Pw!((%Owa zuZ5Q6ZWF=jZ14DIg7Y<;hm!GsknwZfr|lMgL1a;pp*N&Xsmx^_zoQ>lS?gC>>!UKT z8EFx2+xHU6Ps-8qzh^!~FF5x=wr%dxK&u_u+5ARe;`5XliY+`8c}8Ejv*yr+Bdxu@ z*vBgp3v4*Qc|<@iG!_YQnOi)!EOw>0?p-vHTdr>Ek%bZJc?jw4RiAi zbDILzXTTE`vPb*o#mG4O=48K{SABNpw#KSfXlVQSzx~>=nKWPBzP9+VJlDfV$Li#Lz5Drj=F{IjpZ-mXvFHR& zJryL+J2hqECns~e`p2r)dAcY!J)^H}I)GoZPu7t=S+J#$_20;P)ROIOcQfZQUxG3B zF=v$z23mK~58wI}`jB^IeO@PBQ}zvI5(q`d=ZX9N3!(Aas}e!(=0 zckGqFg5Ek)wr|W2QNGxuo<#26j;t445NH+tU?6GB;EM`Aw%D#ii?_UWbnJ)l@nO`{ z5qE{2Mb;5La0VD8^Vk5k>)rF9Z*ro8??k^kx#zJ{Qz6fj!TIsuEZ*6EO73ymSQGD_ z!;q#r<}6%o+B4gfueBDtTr2%c_U;G1@o)a&-`n*i?UJ!y z!}nglOskYDXNGcnmbNbc`>#*W@;?8Lv@Lq^g=J53(@JDh9e2cBb?tHMku&sNnl$d$ z`;PkSn6DeuFE$Gen}f{3Mm{pnC;y}VBb0vv{dNoQiTo(~fk@h4%h~gre|*Gxh4MSQ z$Eb7Dfj_#^8)=8MSK27&X+@S5ekYKR#7D95?kV2wJ;$}j4|^~%qnZ!0rrT#$VMEZB zTd)soCVL6j-ej(?9F!kjftyDk9 zzmmE;=8nWScj<^x*Rdfr=eqr!Y+n#BY*`OAYT2FkQP@pZWroka`2@af5?i-{`FjMP zP#3>9{e`&nlO$$EWOM&7;SnhJbMz?_#&IrG=SS?lJDP(|Nj!Ms@X}U!|FPlw_7-rq z@;WgJ3elUMYS!ee1@cjNv#jU#HJ(^FR>n+pEz>!(l)0ggV^(ca@syx-=#?IQOevj_vUx(Yu|l^|0lMs^<9I~9Gq?5#E1DlwSiA# zzkubO8#%R=&&Y+<<2WyViWp<3dY#i|KD@Yk+)94mu`$xIn(up$alhh_z~w!cRgYWG zx$t*N!gz;Sll?+i+zUY@8C`kh3F$y8be6-F)(PAullxR}yQofVhX3(C-ck z|7G679P)M}FR>6;_8>3u5DVe$2lf1AUUN2i2{bdF7>O&R$V;3=&IhCqivDF@XC`^0 z$V=?Rl}6=g3W=}|GW{}NVFvk(}!Ps3 zEWn2clb4u{D_L^|#BEfpzd<8@nYZ*;hA6Y*`^oFA6p?wGOMb_vHMJ8fG>fqOh z6H{eGc=fp5Td$|Nwp~x-F4yksmL43NVpopcTW_af&uDheRq3v6x6>|f`)69qwja`( zmz*7YW!sNwt=n#-UES7}c5U0uwC}e4E6thc%BxPioOdj-CGU9RmAsDw4%saY0IMwX>Z=yKP~NkbKdEf zj^qs{zT}txavgo1@9X-7`~TZo5}sD}FD{^UKzE}AJIV$#CjVvK)x(#{T0A%iAKJIn zs%rA}X3doxRjac2EioywwZfWq?syix<}RylH!)r+p5fCzz&Q?Kr~>?{5PSi5D!`zM zKP{*px0!D+sN#nu)#L8Xs~)!&EU8>sJ#I8uvJV{jI~W2_H1b+>;hdpvdI?)<-@uts z>XQ3$ef2#;eH$rfJ0Gc!_%9Vt@{#%^7Df@DyXRMrdx~%3mQ~zCeLa^~j~kU$J+6)V z9{mmV_T$XHK}#r6gE?FSoc!N%Zn{NKUG zUMlir$r#pYnP6Sy$*?Z=oiQo+ucc%2I##({^~;9*iX4;~H#4}Ez{ym{-Qh^-19#({^~;9*japYhO_ zx5}Hh5Wgz+HCr5bm<=8#MS1XWFnH+8TkFkh#+ND&Jd6Vmv%$j_@Nfut=*#Ew)sMWp z0z8ZZ59QopQj7-=hl7W{ycrukV^GL>w$i~|p|!Na7%9z3)_-@d#_-n^OYSFA5v9C(-w z9wrU<;9+0z(3iK?n^&=4Ed&qaz{70tFv;q{!|~wZPkA?a=a>CzJ$M)g9%h4wN#i|u zXa)~`c}?DO?d(@^;34-WI5NS*xXwXoFR+H5QDG+s>%)rH=)#JobqY!oe3bRP2|UDi zu>zjMy&h#Pt^`A64a)lKyQq3xAnWqtm32GuA*gu*ej{N^L)!FJ)#Ebw4h9F}v#ZB- zVofe*O+L+<6kJ`g^v$st)WFrNX)f+OaXu}$dNu9(whL)>+ZxlpTGBf9{I*NrX;WJL zw&t{kZI{!|Zo87!&FaeYvtG|r*19}@>-oGe>$N=1TA!!4HstB7XY;P_=$AJqYIB+& zm}-vNkhUOVV_I_5gtV}TiD|JBVQJaMhP1ga9?V+~mR{+Asc{`}GRaF{nP95m=@KuV z#<6$(w|s)9C3^gM!tc8o3_mY8;Ny{k-f^Ypz)MOzVIMXZ==9A_*{?d(>0T%BL{irC z$V+YdVD5_0l{dj-3%)Eq>WyQGUFn}EiJ8@J((=WkWt}=Y zmiCoEV+uLLhf5EFOIU*3d|G@5T*~l{nH?T=DSVm_m$1FN`LqEYaH+tze(^`m?SM zz$KHHPaEC=mwXtONxYQR9dOCy<^Q^4N=BKF!4WATz#j z!l%{4r=5jQJHGhh*mLk{=i$>Xz^7e=Piurv`wTwq^ThhRQ;BEuP9~nq`$OXSye|?j zsGX#v_10!%YMi#xtfbj)JGr2Q;6G-MY6#g*NN)_0SCJ=rHD7=s21GX7(Nz z@|zu9d%VmqeYUVKnb~XbZ*kLq|0MWx(zDou%=rDgkjtFx!2?o}4M{(Md}N+X{!nm= z^nsJXAJXg5v74up-d$a@Gp~cDbFNp)m-LyWN5FR=uMD2anQJMZHkjus$9Mkl4Rf)v zkyeeIWWJZYX7nb=EB)>z9oo|*{Q=T@vu}g%!ylmS(kJRS>jR3C`m^tX>2VqKm2&W{ zPB-U}e<1#l$R{y5NhVUeJFed>9LFGlaw#%xuhphKA7J(mo}1~OdHHANJo!z z0KLKZ6{NFv(YK_V*COYc$XoR4?YMke!O^rN48{nEluT^HJMFb94?)JcBl$E0`i z&_*3|;NOY4CS6H7v5cy~ePXnxYoW{s>2~aPk=;oL<1?9?(C#7wQvPw$BS;6&OPPbP z2=bHeJVtsi#y23s8q&*dYowj5qoqpH&EyBGg+2^s=8tqcK0J}VNe7pOK05WLoun6H ze~;`>Iv6bU(X~JHM7pzz^ns*)g>CCO%Um)}m zoIpFJ{0~SUMLL)%^r0I?e#&vaPdaCy`@w@DYZZT~bv}tKR;*O#qEDcYKR_4PF9yu~ zP*X*Vk+&{wzTl<{d<7kGTN=}9na{ehDm_Fw$4$R;MB1|F&1pMcdM)oo=;0i6VdGoQ z*$Pg%`3LIj14h*|PE|@mt*=9DFVSqjcrl`|m z*Ii-RzPCi{+8hf;1c4d-zyMiyf*BStKx7=jjNxE_d)aKJ=< z&LyQ=z=0MpV-OfnCF_FvE!^iN`?t_UEErHgUW=rI0kT&MO^gQvWbI~AzXc4CeOYLt zHyBVt{sYu+0RvtDD zm-of!c0Y*@HgTA}Z5y#~+mYEtKe!7UjL>56FygU7Uw;eq=pW;TWAB8Q-2yLL1ut91 zbCIz_pu_3VV2R$)d>q+#TB15S5E?F_-S)(vW$YOpWb9#qvc5brw(MylV;9CDpLgJ8 zGX$%U;rbhX&TFDf$!qS9Jl=tq^~u;ny8fKk<<0Bti`?3Qm(757MdxS<|2c0G^daSD z_CaRsz{_Sp&!Tf2-t*_YvTocuf!@ft9eCLcFE86K`schZZ@Hy0=ma|OvLa*mHT|5g z)>pp;IkW>Wo8jeU2gi2E>+P2^Be%!E_x3}+M8?kW^0MZBKj$_1>PPO#?7+)rux6al zz33c$^HAk2*UlU+@4(Au{6BbE(J6Q2Wiwb?>}~12NBmrFiMI`f=r87X;AJydZ>6$6 z6MxQI<;`nGf3ctgFPq`zWrqr{>xSMkGs=VJ~}A$;)v`wnO?s5GuGID%Paiqxv%V%=defg#=jr~ z{#V9Y!TX*8Q*s%rWgDU#8@a1-80SBSV9RZ-?&H{yY`3BJD$7bywn_K^)QW#CdK+^< z;hfA#%C-s2Su;)jf2_TEd{jmD@O^K0_CP`w5=gMq3CI#;5fY$9NOuCbpeP|TGBRTl zP(dOpi=)VrO%{!4F0`V=F$pf1C>kY-t)mG9MMWe8x6$8BI$;rL&=A%}NWb56yIYah zd7jVnyzd|PbMLKN_f*xXQ|FvIb?THhcf#-2er_1<$$1Ev=h_pr1lD@&k`KE{;6m%U za@JfQiB39qS4q;j-Ueip(Ywx6Gt@gzUrbwio2+B}>9YQGA8VG$N^lu*DO}a~zlr>A z>9uX#{6{;dB#-YkWed7^EBi^EMa&a8k0^!rBk(}sjsK**8_0iw`Tre>+s0j3)iq^Z zMz1Ls;f)EzD=oz5y9vIK7o=$C$sf_h-b&W-RPZYNb?pV!zMA@`hdE5Xsg%+ENU=wl;E;D(h9LpeU^+3`Vr;CPS!3TNm;c48LhQl^wwF{CTCtU zkC~;1zfR-2!1ZLi-b@woDgdFKp*%@=;t&0>oS{i<`Hkk zZ=3O!)7>TO^#83KWSb7}Q7Ny<$l6(ec6Od>Uj?q(cy}rW?K;l?W}kSfa|!!}p|PQA z$mIK=vm_y^$lP)-U(qA6+_tQcQ zWwZ8IZiIHWV`H;k+iObPCEwBG;xEt_>HI6P^89%DI$_&5KW@%2FBZGeKIpFDoZv19 zdr~m=q!8>$q4RFO(Hjp)_EXDRuB_j#A?_SJK0Wb$_D3fv>9$7Vy>Q<`%tW=T0Usl^ zU?BD-GwbwIcC#uU+u_H}N+E+huCi^$4eH3wO z_VUk*@Hc;~AtNz}VtZK^XObp+_#Y&m&)6E%Nlv$g}i-1 zH}#lyF!9{z-PnVLSMIsFe_5RxSvLRk)!Fk8*DQ!O#O=C`G2F#k&$hYC-)o}(GnA+T z+4q|lVs$9^Qr{V5b!=7PGYLxi-zoE5_LCI>i+W@$)afqj(14FJYZ>m1R>ksetm4Qs zSRD(f%N+iF6&Rz)I|v?B$eG;cVvDBo{?P5ppa&T*ixQN@&%6dM_Y}4CgXW31cFSYL zkqUXJIC~ZGc_lVoQl8?DK`)DKFQE zG_c0d7_FJORA)~uv{AK$98eYqH>;MoJcA|Z0fQxJY2fChqBYlgy41~{YRq-MMjQDe;Op+#Sas)<%&v`}Y&C1jCdad1a~C9WvY5>y^&N!p>fljanS zOIjMSIq544v>rTr zGr|(o5n(A~e?)j*y!QAqLrs{qw-)=J>W-!DN&n=(4%O`mDjIh=jzaUIEFtwFi-RAC zvcxITmY^QdmUYlW>2gC&R38IzRk?Dwh8K^^r9HW{Cztl*N_&c8Eg=)a76+HdTH?$- zEkVP3T3YZEZZ0&`1Qzknqg?M9+!^2^gMTylH-mpOTfa5Ocg1To-SN zv-YwC-P+4Cly(fE4dL9AmIc=&4K%uQFDf;0jlC^r*aIJj%lb?kk1g*j&Tc6s zewcdmt@}!rzgRKprsT3f%6N%+{wj37!}uO?CVT2?&Tl`0e_IVQ`BK;g;CwDPzZZPZ z1K)+<`$@HX*)7C6>j;e~J8%h31&8^xGX`F_E=Wmx)Yo={p=!aSw4E5e?kkHFtsi(y zxydl-ZrXo0?H|DW{*^vTjqu(vf=AAp%>zz|Vs(dJ%-a`sbB}2?0kqAmXtEA;$CT8v zWO!?#L76{NQFhIO|IUK{-U;t5p-q9zKVN~r?d-8)gA5o^#gC z@XtCu=C9gcyKv05`C@G2xMO)%N8w^+^U`_h=4DYuIs94iXnAY zkdlsnb=?a5oc!|8@6ROr%v~dc<{cj!Jnt3de#_m&ff9LfhW*W7{G!^0PUQVFo{2e0 zJg+#;iB%Wp(dYLb^Q^ZbQ_p7E7PFRJ{`zs-#h*CSe78E&^hW5trY~$WO;6d(Ci%yV zjCj+ad?^3k!GBfPdjIQDey{20n@h6qzjf1sNPJT9du{oNeZ?KijnkqGGfgAH9xzSI zoM~FeziHTZ#1E)H9RvijcEXPuAeeyN=l|9;Tj2)YBQh z+|r`w z$A!ecUHbXt4_8YXHil>MlMW*OXTPENdC{+&Nz?Ml3}x~1jue*;B{* zX1UPaNc^^rv9G8*{jqq&Fm&kNwbiw%eF6D@p%3$pPIM0;M$}xx{T3Vj_<0O|@$^xj zCitU4Nsk;@lzmI`dkb!bue?NA``Py{dd$xi5?fo&9*L{%SZJ{1kiV)wzHq#s9cEix z#rp~HDljE&IQ1P`7Rq}mFUyPk{>sKlFo%(9PeJ5K-+}HD);rBf>FwOM$Z${qd7?^IlklN4m-8ZA| z``18=DK9@E=^8^q((~cNOk=tJ6MBv5S^9G6_u(Hd`A_(V%iF_0+<`6cDf*IqE72W) zQ5H)d-Af;Z(nlkR$C0Qc?%H3tzQtJodgq;m(G`7_#!hU^u1~R}ogfBFATiKhCI;Gk z;&n(Y!;+b@ zbCwLy?jNsgzJI*B`Tpplahv)|oa>&oY>Eal4v6cLJoZsoEIU{s&{1Tdbh4HvEWS+^zc$_17fAXa3G}rgN1+ysAPn-F^ za)T(hf699c?zpVnLzk4>MY+#O{vN-Tdyx0wvp=?Ypz$_k_6zOd`KBz&e87B_iCA?x zawc-Y(a8?~IX`p3^Q=SRA0Ew8-1jaUR56cpROcNHcRY#wxnGS4?^qTT6Scf-@`(HT zOtTrHCeP}wPQLzMecxMgjD0Qmb@qcMO6bQ!Su0yU`E*O?#P_V0{?0v}L5I(Dy0RqZ zOz^JIWdRkb%RZ@Sc=SfsYT^;!OZlcq*{5eJShM$qgg2HgU-#xR>$)k?O8wp_W$yyc zs>#U4_KZEDZ&&8NKxhV&tj6Gn> zdv8st46t@8*r!&WTE4a*G^p%H_7NYRV0|wLKDTh?D-pSdVBH^iHs`(GldNb9S8gIL z)Rl*ws(^FZ=3XsnuaOp}`xHFT-TL8jY(5KD){$m%nUSgUqpTkyCrNvYv~IeeYC%ut zD|#7kN6a(yH@!idnnU+&5FS`0V`{px_$nWLEuo(}nNyZRmxqs+WLJ>>oWc5`6CRKU z5BMj~@$i6WInySqkeH{A(+t$45cj&gH~>E){o5wDa#ny{2Q>UHtKT;;3Fd4XqKpWvo0 z*HDKU)M4z-@DJyZ|0sMk5I#CdA1in1V`VDoCrFPay%XFlxI`YOQ>Q7wc{gm4>D$bi zruE2T$q(-sQ$)C-A;Bfj?%?^O8b zbEFXyFjcvJb&FH2>cq~I{@oGJ`o_11Y0(!w>)phDQGglC9Jn}+eb^gK+AQ#CkbM;J zNO>R5-3h)jH?TipgyQhWJ@e0LnutZ)kALoDFUjTK{!i+Ey|4a_j7xw0@A-rJze@dg z{V(c$;Z<+F4gVkO{Tu%OsoQTJU*cIWx~CFwi-oz#Xz%>NyB~q|raH4SLO;Xey-H+P zPbEDC-*s!1S?gA9uqWXcYQ=w!{wr_VK1N%}9AspGQcv8!x5LmUU*TM+PdJzKl?wr@ zUm~`_-7!j<^q(3~)UxO-=Uy0;`qS7X7aG{N$zEPF=dT4aPk4#*r7D$pmx}#PVijTs zaXZ^`f`#&76hdFK6O^se1%=W9Vbgilz9~rdGz7aEkxd^^hYzaM?!S!g!ZxG3@}SY(aKz|t-D`Avs!f*bs|irGK$qGEXS~yN~zCIA~-p?vL|Qh0ZJE!5ibu zJ0@gq_u(U+^)h!8d9FC4wR1cNP{(*+wG%6>YNf$Fp_%=iC#O@VQf^H_=1QvSHr zas!7YBt;V^p8X8qDeB3UR!bdgpyiKa2abc!vDW$qd#l0Q)DB;Ik1!>T^UAWd&o(Vc z;@s2m$P3x`nG~kX7axf}J|NqS|GF{uQ43r0`u!MsnUUVG;ZFpYR* zxM@Uy@}U)ak(imK&|n@kXeaLqt}4=LvmPr$e7$#?ktKYe1AY|7M;_lEc@*56mC-V{ z8nk~HF%ok_GJI!rpb*uN%_WVu^Mi2dIftid#|eK+c`XookrqiJRCh-`vO{M0IxlX@~;jr9HM2;s-QbXn4N+AB-W`D95fd(zU7B`X=r?7RNdmF&AqrC&vMl=;%`MV1ulvcwDX3t);Y*-c#}zUPO@Yre<8JB80V zZ5HiaAMdP(cRsy6#q{@t2Tj`y_q;HjIp5nl?~HckF-Fi|bX_Kb{)KOJbijjqF$T|3 zj+c-3s_n&kn(*-&>hdh~bAmi6z}QZnOdlV2`uKPc>T;6r@ze#~r$d2{FQP7m@bQPK zOKLJ<23rN^h?=U#a>2P z*jdU`w^=x&2L1`WYS!I6(6YoT`3o^0uHt)9n?>sjO&=mZdo9yAdmx*$2NooUY)?1~ zuaR-lW>VbSjolo?{f`$ubDq3H`)?c$9`y{cs-XFzBbydH1Mf9550L$+Re?p>_AJkO z+2<*;LE>wx$n_N3CVRx;f$RbG$^yT=uP69^x81BYaaL+9&$Bq2S<# zZRz)_JrH=Wpp!Pj$95tg{P?P7t@&Q8FkxkPm+koCVNRAC*LgEz#5j$ zzr#xDk1LeXcapZkDPudAbCA3-Sw$C;HSm1)Pwb*U{c+5Spb=zM`5V;%+Wq|3^0n3C zRN>(Ur63<3zU>OufdyCancIn9guLl6S6wY_Un@NPH2p5Pu+zo|;pKk;7nR^(BQdrb zy1cwxa4U3kIUkpKq2RQRF_6bOUylMq(kh**yOOnz%JM*m3V%hvj1M56oK;r@UpdEm z>8uyL{JasL5`nS8$5)Wuf52C~dfuE~!dEzV8os{kl$WoZ@$r>!kpZLOD~EpND?N1` z^@z?x;%hyZ@D-OY?Ki&Sh50Tpg|Dpn1HMw^(^0RW&z|PH=wyDrQvY9cvdnY8@f9=v z5q`dMZk%ctUfKvxz^3m$`72-X>f6Fs)=6F9E6wDIf*asrcAC0);42s5D;wb}rHM05`RIp9)MdZUSBx$Nxjb?_b{+V}@6X-a@#^k> z7-H{%E=KPirXB5KTnW#>&wKE;VZYK`G5g7nL!16H=^Du6EH(NB=TK+B>Z{2^4&h+sj6*=+{cyz*Ft?QZ3 zaxZ3l{NqK=Yl6>841;9&Y^smXh6AG>9{vb-Df6`ObKqY(=I*9%6nK{SnM?copHb|b zy%7HZ<-~Um(>&lcmrLrhm%5CnjPblPS1dO({#zL90ux{2c-BSASD>%FLVbm=RO9ba z2p<<6ViWg)d{^M(Z}HEUl#vY|?*Sjb6+W(pwIo2l<$Ha+JQ-fz0xv%VT;VqafYy2S zpiI9%f_FX}18x_=i$%9Df*%VXRzj3f!0Kr9@#EgiBQ}C3^o!aoWun6hA6c|iomO}) zarEKE>wG--E_m)MoZ+<{TiqD?Z8rS&0KB%+5TNtg)rJ6_*E%QlD>JwY_YEVDF1z0H z$}R%Ll#BeTf`6iGm9K$+O4?80@=bVXGd$Fz_9!UEMp#XoM88wOVJP^xl!v}UU0{9d0Ud&k7mlh~vfQ)hj=Q^t+?ck}zW z|AYCx7v^kW3hxyCsEqntKF9a-&)rvWu7Hn!%Gj&2S+uXiT@9`PVx9`!c?{mpW|o z>0|lOiqxTsKDcylTlBmk*2~-DYKyN`?cdT@KXAW1-`~l{dC2KPPivvKF6hO^*xAF_ znZrK;jBSaZGW@h+f0}y~<87+wO<{WyPVxRHn}0lc&$E)gmpEcFowETg{G7#K3th*5es3G!{@eMz z-}7x@3Fko>VqD4Sk?%^G@Z{GT^u5kJmnaocdJbqqRf6QJ+=?AI*pWAG>N^od!xvNKH3i(4B`uw9`jwado{5nOHAhqmyaLx_mZUd3b!YXX`rnt>j>+C<>V~4$H>#hxpq#@+w;7D zy=A-6E$8lu{P9F|b0jAaTb8_yl=&aZRKHa1*W+_ldQi3B{g!IKXRB)e>kidE@?+IL z_XE!J{!Fzm-KE-fUV**lE&dVzD0pmhBXk@1yjRBN;aAF7YTnOS6x$$nl3(?%70}Gf z*albl&Wv9XCwdoWR-t#z10P}=JmupZGN%^a5diNkVLnHUFr9bE87#VOZ~*5Q0bgtt z&H>&t0z#S3nf3Xc7v^+e3hy{dT_z)+chSEyee*e|Pw#5zW3Zp~@eTNOa}j*woKM&B zT*fyJppPEc$82|38@j|fFW+eXiFx}z_=dl&W@zdJwnY3+r=GZIT#ZdXeSYL`Z5=_q zgil`H)=1h)47yK~h;Jfx(CACrYJ--{zP1`kzY{x7k-YoxcZIL5`aF{Qu(!tjAKJV9 zq*u3d`s|6N(q6ucZfBsq*1R#lw)b+~?p4}*P;YObE1CTa(q4E&^GbN!K5+j>eDaqQ zUOu^sJcp?RaiHrBKAac%^vjvlVLjgyr~`JyX0r`_(TDS2!13{q2 zxoD+bW`()noc?3}TfQ6Et7dMC)du{(+V72{By;G~lrQT*v9z(0d8`>ZjDIC%_pH4J zyht5oep^ag8#s%-ito~9X|Do4gzkyqTYDf$(d`Vodm8MEsPh4A?RWaxTsgPjnBUfM zyz}?{z?XW|d2xX$q5+F!1n{Qs?N!S^TN z`(^NbH}L%btN{04QTPA$UlKZnTzcFtKR&I-%kX*AZ}^+TS39v@#CE<2f5QXN^NOkomXegKEqBdUN4L&JZ{%A5--^*6L_crO3g+D7V6nyF zH`cq><5Ar1EebK1IiGk>pBj(R;OOo^m*ty#R*#q*2a{GPLlTm0)iCsl{@O~oCo z=YwaF$GsJK@H5wb)!~P2^udYZd!?Mad{XxHHn!OGz6jR3_G6EISG8LyyAA&iRe5Q_ z8Ek<{a8b(~bOreNEwYv-@8@pAFP!;CQlYXrDZFT09^c{hw}_8jvJS6T?Jot2yO2E0 z9X98YC;SK1o~$&|?}@b`JfE$XcJ-=_;#txnxgRoKZ#mc$qTw~={_zK!ZZlU93feqpO>))I1Bpap4t%o?aeNabh;lOSp`xdh$oF#Gd z>@A}>NA(!-_2wD6?P^ftT=$@l?|9a;{%51j5pf}Jow=-=<5aNCG4!c!*jto>Mm6UV z=f62G5#8{;cC!}cY5jESGG)|O{$c*sk%En0_DDf%sa7ldJeDizRqK_sHu@ZWtXWAO zu6bq|9cPYvB zcS_)z|IUnMy}19wF=JWxf_WB+)xCxI@Ht`EnjYkO=KbpBTe-H4H$=2^RsXry;>?r1 z7T^4!GD`H_J?c`+&x@2%t;=KPuX);Qs}cP-Y7S?pbg<@md#}Y&EfJ1a6m@bdbvzCp zTMa=4JJ+sEV9#0jz-yK0Hhjom1@1RpdFw<6N7tIanLbYa+w{fZtMElu!zQm$4U>s; z>HEKX!Ix{-BxEWP;kWRAyD>8L7V0GJo=clW=YIC~>C66d$Mj{rXp=&FlDVE`&5^p* zMH!Y_v{KH7CVvb0Z!2UzL|=|AyUEe-shb>5X#N*y`~dWA&KjZhUXSm|DK-7z5-*+Z zFSNJJYI(nNr7>{V&ZVXb4|?zotg&M=Yc}_}&V72F!Rw0~i(X7@!#ME&S+tGwO%=yI zYxFuaN3oA&OjqmbeK%SiC&#J|;z$;lmnu2m-KaRyOGju`&}QSa%Bb{kt2^VhZjN`D zyL^PrV=r;sGqAHIv#(dqX+1I4<`5fb*Dne&wR;s*fnO(O#_zB?&KP1RpCSF4rV-jC zXsrL!%BU>-h-X_9wY1Wa+K=}W50mjM@wD*+$)rB)HD*2-)JNIdc0X%6><1_w&ior6D5*8uZCjU{swKaun_~yB-A6wm?n83wZ z)Z4QTp0!DFH?DvN=-(Hf!S~~!n%+hJTfvn&Gf`{YX?54dU{9m{MUS!e3BHjzErW+Z z7nC)Kc8TwXq>0>=w0?XmW)FD4sfOqb=1r?tDLL!0zlcqHH@sK;H`>t|lGy9bf7y+_ zIM1E`Bu(ZWB4e_mz4#J%<--j2O7>DZs}*#Ocs)-R`yI^mqeh*j|KjOCV*Kd#NqMh; z4#(0bKU}N4bHUfoLeDG6e;8hD$kyi^*=Ld_*O>Q@)Ixi*r(n>;LC4|Oqn25>yrzVv z&R%NWa+7LIeRpZzmW67!)a#bzZ8?(^Uh}TSR+Bi+R`a!C=;Mow!yYfE{!(XwW80$p z$JHu-QtF+nykq7Z_>9MYbGB_m%Yb_}cODvHv!o>6>=53&fiXl}V%K3}z9*?cbCcOC zZJ4g4UzK#T&1VJQQ6)yeQJz zpy}_~Qz7R>4W^w3pi%7Xsm^cI^luD_oc|eH`wRIVjNv@ zz>xoCeEvlKJ@Ane`8LZj{)ysT6Zx-^@!m-c<_8SXEVY_Xn8BUMVkx^)9eI@Tob!2x z^3DVC#JsLr(bBhnRp(6Tt<4y&IZqPP)(}?vP`u)PUTl8jv5_{|9OyywZ}=OzXl8H9mCiyJB z?;`(IbgQT385)!4weq}`@%0bxZ*tzZ+_zZWuXDdJS@wfWz_(^1dg>(f)a%ewudhLu z)#K7uVdIU*)+=_uPvECJc=i|q3T(uNejgjJ^v%$@#M}mVv*CvxwGcEOs z678X#V$Y~HOtK8*-EIg8_t54lY#22uH*l`Dq=kihy5Sc^+H09NS?<--x`lgsfE(r! zn`ho);oMd7MTC1|iIqs-ZY;^R+@iya4EOZnoD_JQLyvGzA7#GiVq3OP zw>+q)^$eG~Rz7X8Kf(IaJoiO=3K>ijMROwolg12Fs!ops~OZgJeo*$B_XLszOelkWycf53*wzYfrp$mWg4t@|{N=%)u%8)4P)NkJ~Z8c*k zi8ZVI7trxoBkY|m|uu}w~KYaR{VO{8`WI2-=cj8?V#V_ zJIb2p%+VI1uWqC%&J`^R=h~M#;hW+381gL-d3Ep+-hC>Y9I4n%f3!q-(IX68fud`D^z&X81?ZD#rz|>-8S;H11~TCYU~}oYLm^8+TU+e z?d@fZN#+4b=(Iw2`>&0odpNtv$n$pg3VI3+HJ(CaO~)6W^%s7vXCJ+u zXQ^i!^_=I!iytTZ!HM8&wxmx3Urk}Z;cJE$UwM2Je(lGZ@Zc}t)Az?%-3#F1hun+S zPCLJ7?cK;AUW+MZ1PEap42SeL?2L;8f`D+(^}N zhWa86{U&&B=6`Tv^Jj}kT!|$hL!yfn9Csv2(g&AsW!ESsYrY~U+qmeT3K{-0o z=5SFC@sA3`C*=vsujK5*c|5Pdx2?TbQS>`%%;YD>v!8FKAgg*w&_An{)ICkJA#u2<=l3C&Gg(GYdX<0js%Twme6vT@KQFwmO+9Bvc=wqq)B&6>FAI!Pt?}pEh*q>>^ zmonNzn}zQWH%_vcbpC4!_i!GS@cpa%-e587X-c@KyO-~e&brA$ya{-BP`D?`%lG@u zy2Vne^LS&pr>B?i4=ByH{Gz8NhI@K@`TmtJ{>f6Ur>WtdE4+N)(lp&N&?xXi;QQ!$ z)K~gV`s@i}G`bmM7e27MSucv0F|LBUF>zk~!%5mnWalFE-$m#vd8}3Bp|k8GeZ2J_ z*-472poo}Zi^Mk#df5T*DZkT3e3Nc2Inyu0&|_{@1M!b$WoY}+56w@i>0{$3xfAbF z-bs#`%YK+Uqyx<+aJ$N_ge=&wGWJPGd z7$Y>P>-jCJyE@EPGw^9_575emCV9`Q>Bqa2d5ALiZ?(B+A!|-CUY=mhvK!Cmn1B5| zY(q<=sk-xc6K6X{-n^@o_*~aB_jfkg+?|w>L@X%bQHOS6!(cp?vX9|XUZZ^G$?@}= zrF@&f7?U+3nNJQ`p9_UVg_%t`N3Oq2gA=lOu26#P4~ixmAFx?7P$BCqZPmtWaE z>qUmh{M>w9kXz>HQKfR;Rj=A1jPte}-Tzl;>NUT97vyRji;SlK4{&+>NypB0BvEx2jaBNM(8kdZRQFH(lcXpXuT1jkiNbr4J9t6ZJ6N-c zWggcaZ*xCwFlcYFE|sf9xr+LTt+r=vTWN@P?T?=IoqW$F4s_n5%oo7t9oQYe!)7IT zOhg}0Jgp%Yo`R2JBU?rr&=u;=Bja;O7he_5ZWDV+T^>4AT?K1r%7bAo}9&AcYH=G(O-(u+kV1kC3@N& zz?J^pO5axhdAe?=5ZcN-IeqbX(%#2TA>S*oS=g{sPWR=3 z{;OHj>x*7jNMBjsL1v?~3m>n7r&Yqo8sA}m;6_in=+PsQuVcBs*nrP%<`r6=F-5x= z>7B2lm)76;AJslY*Bg}D>gp8uC%!sY$-E}E_T*rL{U^%bL;0LTsh=5JRmt3+y6+VG zZ&lK-`kM0v;-q5hJHdXPL0y$>FDS}B30_2}-%QylrHNWHX*TpIg?WgXc}Oy4FL+b6 zfBgn>b*hp!fIJ?bo^^nK@%Jmo)?9A#+N%$ebBCv%J^U8pGU|2`4g=*I@rGDW zzSK?AKHb$%Lk3G_$a_+riS#d~oodnkF z;%gFkY$sz|>Mr$8gFakOVV_4w+`o?T!x(j8&u~ps-TToITq1`HvK;sR z>FMm7{`B&KHSFC^p&bO*tJ_mOOgk_;%aIL_x^Ctm>K>+LD!sMumtIw2W1Znop8R#M zE?+r0G%zIm+mO(L{n4BiuXHasSohS1mmfCR-=S>rEiBIT@`Iv&;Dot=jJKzWkta5b zS}F79s(&<2#^?^YO4 zliH+UTME<$8iTY!r9s-@tYEEQVNlI@^pdNZg0&%8A=(~z$~9S`+BbzEHA9<1wHB@v z@S4Uv*^HficxkxSR2Wt>vb39awXwT48hJFTDMIU))kC||7^8hs*uAEIQ>50{7^Uqj zjI7ydjMP%m^-`N+wQYq_HOanjuX*Hw9Z-6Ag}5))QK@LdhG(zg)&}u5LVYWp%flC*I2U##rqqVy}Ez+EW`= z+DpqM7EDTMyp}^em=UGD!9g#4b5zcuM}U?Em7TD=&QW# zoXcCNy7!im{uI|H^1sHlC1~-t@c!1VTut36H-amYx^tEGuzb@*`cAG7jE+`g6lror zQ_mRk#8?jDD|CR^I3G_oxUVdY(wf2z?#~t)+^vxY>ccfHWbwy|yeApl+XizV##I*J zXuZYY{&WV%v_;$Mxf&h zaI_ozZ2ti`t-#pNwJv<|S1#UvHn{iv!rj9)ILOhGh>u5-(cL_l`!IYwCUcGKzS!)e z^S?v4WsDCQ!@~2=?_&Q2??X64c`H2DgIuzH>B$)de;>g5G`fpx8?kQ{c;}0=RC@t@ zNpvn3GPh7oa2551|08={F{=AGGV~bo_IRSonh)a=x^6R8;ql6T-xR{gd-v#`K z7_$}FOlNrNTamwyVc&R*HOY*RjPsMl{t<-z_?Th-He}W2FnHue!~A@n?*r~nAE<88 z6Q5YD+S{;!IxDR1mw9e{i}elooz$`W5yp1uNNt8@uy^u(7(DBIaiaETd@{rb`i!Ey z6M}v!Hk0;Lcq)Fovghz2_)#1CENu8j3f$X(dn360aVD`{tzJHT2)(&KzFeOw#Mtff zq!B;0BfUCNlf6?xI?SH6yMfur-dsB{?ZV@HFqv1i2<|%=`(2FvHpc#e((alEnm)+b z@A#!xP1`TK3P?Ol`{|co zIQ#iWl`}BA7pOzn$H$y565Y0iJ@nUoGPG<`Sa8|lsGzdY`Bq1z8d^}rdc%QlD-%xB z_D9cn(yjy-_0B}iiwE|@`0(%!cz7B-RQvGI6Fj7n_ja|#9GV25vT4W zY>`c#*40~K|2j>4 z?F`Q6W1Xf>)@LR#-<<(|e{{jedJu1pe?|YBfX%sL_;^juS)7B8zYBQhnGXxk5`K`n z4}Zo2d2i%BrnW!tJvXCY@@*K;k~W09*lO~K!~Dvfp7qCh_OFFhwGrDIUQc{(_YCa& zlE(rrhR#a-)vn3BuiQE_NqdnxiB8$bxx7_8-zsfoe)#fXbeuOlX|IV)wDs4j2Z@f; ztM)AEGPitoT~T(t(KOj(Fchr$6E;GZ)e-c9_*PGULosmhTbn?TOv9rE`P5Jdp z>`_O3_Nck&C}NL#a(uA9o{&7=lXD8ZzY0BvVq3w7vF^&57HuoG^$az>pqluY^*UY0 z*4_s0SZl0{!?rGS?Bn>|)I!g5LzU63#7xNJ{WZfR%j7WL*(*%moI3344}|j`!FS#_ zVpBJCmF~WWb!RiAJ5gMOl*<~ zx*uIDd&!H49VYYO)&#GeM(pk*_~(_C@=uUUWKwm>Z~wIL59Ow{nkb)dn-~Y1DF3CS zl0U#@eb#IDmif@urwsPpjP-%YYH$;h!935pl6fG!!-E_h`MzpD56wTa(o;XCL$ME* zIU2V2wiRCay(OPD4d&AwXFc)4b6-LxZyd_pmNS=%IUA%p6dZoGts&?SgBQtBrF+s{hOw_Q54knq9fzNqdewr;VYyedjRpIe!Y{h;~-o zgfC5=GFoWw6t-M!`gNc84bn2Z-&)hiydoa^^#OS4VdfUjnFg(zF?!~RVo!(9%ABRW zZ-`b6f89IFvtI6E=XH{QH}A4XN7^nn-Gk&6IAX_b1J=qh#o2y)?vH&Hi{GZZWGD2v z1YJnCXNT*yBERkS+#%{b&E~$)B(__xz4zP<8*5OCc0#^oVb{&N#I8HpYu7z0-}*AQ z$_nK_RfpL=*ygsOFYVW1dU;zNcIeTJn*%X6cjM+Kvy0YjUQkT@xD580Col2j$h_zl z`W-%%eO}t{YzQA`~82H}BJ&W}M1=`zKV$|}JBee&o;xk+ZZP8~*_$r7Etpi;Vo}#@?8_odR z4_D@G^MEJ&g-Xydta)PBkE^|Ezh}MZK3*8;oxtb<#y0R*4GdtFn|Dldzx_S&PoP!! zM!ETuN$xwo<}7pr>2IY>FjD96P2ZL_Qvmj^mRf0cFP#u(%l_1i%|KTdxi zq%2#$svV=8Bw!x|2DY{NE^NKWfYZiUmOMf~lE<|$((=}6WG;HJ^8?mfc|OZO`^o#K z6s5ijy)%ij+LD!=cgQ3Ck^;Ro7&yC2d3uAhG(tNIJh3l0Y1a$r+pbjVo4`pPI5`c!ILSCy zovht~PnlDkoTj=&unlSduUE@@i%ZFdcdd1=Y$&eB^#CbYo6q+>|kZ8shG2G z_hmT(mRr}Y+A+NBjIl>*aY%5PYroC?d5l_i_D7q0qOOkz7F4tE*_c2q-$!1o=t*qr zLba#MNk5#}RGAR9MoDX~QqqXuF;(nhJJ5p$px3wU7*uvJL@j$9JwGcduq^KZ(e2q6 zjXzRPV2vE~PR0BY0xQZ@#km2;fpt7qN&Bo)N&9o8G8G@L@;!|69n^2_j!|VRL!!$L zQ)d(Ngq^JMRI0%R)wEv)*5@hJ6%(%(Sb;7x^9v`i@}iZrxQ$BM)EH$d`=858z`+n; zz47tYWp5MX^A_rLI4ZgI}PueUKoht&nF<;6`Gu&^)Qz8)bZ7`zy`izfVDktOU2E4y}G-qu2ph=2G%X% z#I*v})Ff{kR|Bg*u>P~->av|7rm|4*l^hjZma4-FD^Q6e5eTfl{a>!g(_t}(=M0($ z)6f&}i$4j>eIZKPUi$OqzRFZ=*X2`yDe>DnKORzcAT+w{Q(y)~1(f|qhiNLPzJ@)V zz^qAry<&jg2f?o5Y~q)s3ry8@6quhcR?^Nh2Ne1ng6<__YWEAepJDkH)?5c;|AW6| zCvXp7TolxHb9}+v%FlabpShp+-0?r2cZBcAKH8IvuVDOTZ{;e4_PctNd&h6P=N%cl z@#qJ_V{Pz>u{>i>ZmwpWNL+;z%rB>s#@c*&(auTk@ArAupF-1vx05nKEiS@~rEC zYVX>`w|(->q<=g1gIAWH<=c^+d}BQ+NeR`zon|emn*TcZcIH?47Uxoydvbn6zO}&* zj_^(F30V)a&-x58&Nueap3V2He}+A6&qOMtMAnS}zgE(Rt})m@I>kJIHd$!XLGCwl z@A9=#_^I%xWN;;XNpv3JRpr3@7x;>$kGtTfUyn~-LK<|r9o2AA;7 zx4~foJ|WgLCB0nyNw}{>-ixmKuQ}G5RqVZ*&N(khM&pUijQ6Bj+>vPmXBjz@2;Ri= zr|fM>W~~Vso{r8EEpqwzETiLD(!@`#g!_8@+|JC(a>yL&Onha6pGP+%-(t~Y#Qt*T zxjq(|=M+Ek;5q0h^&M!q?=|f0&UW0#D`KPSAB{65kzqj1Xp8MXc%cfzwZ?Q91 zF1hs_>r~CFs6!)jHQ67LuaA#DwV&q^-?!b!8cLtqtZ9tHB{Ft<>0|d`DPx!M$=N~n zOaGDb{>gvX63Qpz5C0WyCRd z-<)IqBy+0``giQo`uxeehq;aUQ!+SSr{e)#?rzq*UV|^k$o~dc{zqLor%!w0--pK9 z&?_^P1efr?Z;%yJbQ+FuiCj*A?u0M@d!cF{OMc<2?MCL1qVIv*vGmQO*juXK|7}kD z4Qpa~D?Di~){&0FOGg4j?5wrGKGSrwB~DQ+Q~1`PBoussu5uoIP4tFVLqY+5Z?d1b z`~AxyFG~xjvos&?47T# zIH=h3@nOs3zY=-Q#hPbkC4Myz_;Iw^Ub?>BZRfgcQ+j-wc-Kq>~SsQbbKlAPa z-ci;HKBkUS#!Y5U9$Q;w2rQcw7+%)tvR#}PYAoA$eCfU|21D8HjjDFv_@J7%=U#K+ z=Y_Xe4*!tlxSzVup&ePkYNYOM$h#_oQkKE{$(YQGZ?n(uz_jZZZ<#y#!h~pLaTk54 z%LexSK7nj_Vo&gB;r*MDLly9Td~QZPHFL7XgN%@QX~}t!5h^Op61&nN z@;zEI#Zt+?lCN}o7Ww*`x=B9lrRXg=<=B{rjW+6qjZ-bH$SBG8=;IT}*Uxl}v)CH2 zp&mz;6=7GxPiWMt?Ku_?@ZeiHE3zk&?@H4>JU3uhoi`1iZ|q5u8Y3rN#6*L zMTfkfdj~KTXgn)ei88+0&0$5BR3G}yW){d8Dw^#{|BH+h@VlFKt_8ojwCf?t?mR{R zfKRbgB~gZsTiUIG+d}fJCr{LA@_@^2q>kVA3{l+SxO$#h^<|&R!5SrPwk3# zJnQqOD5E>D<9p|SUj4F5_%A$bUi^^ZcbCCxlQzMFM*vIkCh~3Jjq>c>fA9d$VxPNtjJ4+We@>}s;XKDlT@%+GP!o0? znxVMYU6{D8Q$4q}H@e92+3fR%mc@_Wqx9BeJByss?eT)^KPjVcFU5`yZZnKAu5Df7 zJA)rSvdeG?8AJJs+;#bpsLPMTB0p$r81*~yYd?8)_73_9dy{75n;ASv`_w$IT>A(d z92{+PzZ`&n8S+7OU(l`HU`+cAJ?T_D)ez|&{aoN7U+bFv^3{tUzkJ;;-$#nvjB_<|=IEKR&@j09C+R6NuF$FTIn!$#d9Is`fw_K9@j1luejHkugd8?LxR$d}7{ zcqrd*oTX^fV-!baU*&|@>vKJ74d)NKr$>>Nq@1uyT3^MTi;wN}EYcD=yAFPtJB&0> zK+W_Sq{Xvup0q@PKUVSv)y!B(dJO;LQ=faC&PvHW+0d1;24P%y8|lf%KzQ4o{YpHln7RBNaTi%e)(%Vcz4!4WrywDfbL~Q|zS!fZ3Lps8s?}Vm?`ue%nKoz`iOO zd%XhmHNslXKRVGJ+ZlAL?=g~ZQRGpSM_UTRtS25>TZG*yp|&4svLC6ck5a#%JYus? zhSo;~8tlyfUHRbm(-f=Y2z%=aiOYTjynY;HbsS7k(&lDfxl8s)UQb%J5)!VTmx>K$ z@=0ZHh7#@?$n*cq&3|w6k;k&vguJrgOJskgv3tQbMUbd>~S(zcr({K zc4Y40*E3HDpMsu4pl9YkJJFllyJgqx zA%Ew#KALqVx|ESM1j?!gM_=z(?C8dI?fXS;#Owa-b=1#>U%Bu+sqgE&d)FX{S0QT< zn3&-$L|nN8o=V zb3T`EjPDNQh}c1@#^S%p7_SCq6W{*DI>FD-p7=Pg`8#nc@dIqE^W=1b2l30l9y$_V z`A?DKQ=#Ku?L!Z8hH|(v|7P|JiM;Pd-U9N8edu;Bu@99&+Y|UlWKDjfSJrj@B))0C z&CkB&-;>DUJn;1e_}1rGB}SQFmCO996q);{$=-gIK6O41j{+ycqt;RX{fxV_Qh(MD z*F50Kk+MCk4eovkpLk%W)3@tLdxUEX_A1t_;=Qtk*c{aB{r~Z-PxSFQD?XWV=s4f_ zbevY=6fYwG8Q^2Hoxf(DCr8#9cVlNg5A0jfC0+-vw0Q%Uw7DB)1oMxJe^|Slf4qR0 zark$4k3t9IpCjODukWAteg9kyp3c(_83$8{ohUT*5^HBNCS<=z2e6W){Cn7!#6L-_ zP451ON3X+8)S;8K@440j=dkc2UwymJp}wq3ZpM#ac-ceXA`08x3F;_yKF=j}{(*nK znbeQllp0pv^Zo{hsHn7x7g=zF#VDI_VP|eKM3j5#3=Wb6V!09d^d+ z_9}x`w9%`Vd~yf>$(RAg$Sr!D`_aGrDhs``$qij6L)VEuSR!XdPAf%b?V1goK?vMX z+G5U^wWU6_Pt%8&)}@2GsMIB#|3&tl_|mife%iR6HkQ%G(cB;7{t)+7+(j;n@6c$0 z!}ArBRQqG}p^Td@#?9%1@EWlNHnI+PTE-5rPqljeYxR9NK3hXN`r8}eY^UH0+7((B zTy10y_R^*JVy}UpFSP@wkv_hZh907>@-BTU{j<>bF3;DHCT(FKpz8+Y^2|=*xdzwa zuRS`?7u-Hg96zBQ;p@VSO4uhSyuHClT&oV{L?iPRp|vgKll-C3nye*DnUDC&{4-@V zsC`^Lkb_&3pWkr8(5EbId0mC*K||oBvj0?3dX+^ZgOftALExVh-2>U`lj}*bq+L*J zq6d=Zlj})l$!DyIwvy(P>q%EhzJQwO>7@DOdeRul7gQ7d0BOkdJmgH$1j!d%6TO-= zWV+0kl5UlJp_~;+8ZzB1X@8Y`VKve3k;d6R!Y7mFNWN}0(anlO`l}7SUd~;X{QY9B zHOYC3mdQ1~DEHh1`}mqWijvNWOiRWN_ME~R8#Xza3p_+$u@|u8E@*m_a)tJaA-2ph z)2JPy{ip9#Y7(HO6SJ8Upf@JR^)7qy2haLHLq}V|>2d4>Z6`AwFCr65k%<|c3nuI3 z#|C6M?8w73f4XCY)h)@6#6-UZ(Pw+s=cZ!c+_t(M?TTd?K+fU zb$lFVUHc7V?9d}uzUNtzx!JkuqbVw9$_!BYn>^I}a33Wq^sQA1smoY!2vQvLfMvZ9 zJWArDNFC&A#8#y$k(%PPxl^nXbI-eXtuH!kKC&;MRgIOHK$qs%&-5Uk;56b1ZomK4 zY<1B@&ZARn*caYm-Fhfr=S9_%~QQ~@s2p{v1Uc`LnGhn7Bch@4;WVr*%`+8brH4B*~_ zE8fueg=-D7O!NPuI>r+d{jIP1N1O}mXWB4!iRrn)OH3ob84$7Po8b{pe={QD-S3Al z4@ewk`bT4mX+o6pVO`%xOm{MF>iRA=J^ICXQ_IvF&-vT*Xiw$CxBngN?jbmL2aoc{ zr20ADdeMLOh~TvAmJe#!o7cP$JpGD8Xhz~ct;aTmADbTQ_~GsB-@HX}M1Z?H(KlHG zOuMT;XYg{rJJss=g!}BFR>y!~Vq}}2Z>j#MsYoF`^M5357!{hOyFJjx!N!vP zoKeVs^fDE>Av#U!w(*+PrfLJo4 zA1^(_@+LLBtUG5|KFL{@4Zbmi{?#mfnBp4)vDW8Wau#mt)W-mQD07FclxGjyz9E3V zb4E_6fo68?VDARLHEU)5VMEuDvvdvfTD!eD$enA?5(5;O|@He{H@>Iwgh z{x=$R|71B2YM8w5mv?;qG8FerRGji*b`|u;3W^?qvN~!{>4N7D|=WRAeRJ1bH)-v^xQ(G$&YB}pqaN)ep z>h3P}%)pPA`{@FFnpauf?-}B2Ev#2v!+KRabM%?a&#x^^s3_uk=AR$1Wx zeP<@545TBF;H1z42-3nR%1i>bAP9+T!8Hk80t#3oB?(Ot(Y%0*3%ewMg~U}OYnyeE zB!Hl(gy6bsS<~pD22_TUd_U)%862~0`Tm~oKfigNdER!*x%ZxX+CBGN^QF}N_g;JN zkfX#92quO=oH_Vd9Ww0kG5AsURPUZFdcOKC&WoF=B>qfjV=wI1d%K&AJ#F>GUp{@= z9JHOdHB!IK>BpGUFPWV7!Ng(5kEm?n+$Ze|Bh?U*ZyP3XrXW{a`OW&lZ_`{(`ejFh z(}gc0eG-rp--WX<$pao&Mb*XYgI)b~WXdXNY#GisRg_nS&tcVcVtXWAtA?0}V|`~1 z@r*>?;GD)2_zTpN)?U;@jZh!mq~1!sq72d#Xg~}>=8Q6-k^8bPZdcl zn}Pf@h-LFQ{{r>~ZRDSDPsiMa#Ey9;LJg621ryJv7xy*uqGq=vCIf3oWmfhD#f|Tn z8_C|mw0)s2he^Xv6WstB3m?weQJ5doMOmy1j950dq?;-8lS^5v_%{1Z@ZwdIBR7yZ zHb+!IS}<{JhKpWdXO`5%}Z^RsDBIdOUF z_!nTCJ`PMPfU|FVl`Lr!=!=Kx@6l0eNI7^J6aI)zh0m}>u)nE^F^p9cY+X%}X$#Ev z$8E>2CU0@n>;)<^ZTFuS$4rYjpWOYPdvhgL&+Dp9T8j$GNd@NMn^dI6xg}EmHj~O7 z&U$VzeNanZ22fw|HEQs&N3eN7*Rs)1>Q0WlEILXyv@PMZx~$Z)YIRd_(`I56`Omom zVhwoC`E*=4GsSoIAT+{=>+l)4>jZBzy>Y|$B$@PVp7XrVGMB$P+AkI8YDVUDzKsg8yXphb`s5fjwfC{CzkuyD4x8 zdUKhB_&|#Lw)7voyX*z6OtJ7T>$ve`>_`W=)K?&d@~9k18#y<9vf9CU=n@;QEyB zQhpG5rH%4^2JbjCevr}U-aK*jnmcZ($sM;c!1Y(Y|CY1@M=mfdWUr%vtKgc(^M~NI zJa+=eHO3~M|0BGYas1@4(=`>DRdA|C1?Cid-;(hV?|0)55oA*D247CyZ_QQ_Nx?zO zM{)flx=%xza?d4A!x;SXz4Z#MNR;+_>BLW@OAF2)_j%|1afRFuG+C{grl_2AyNY7g z^4tSIYahSL;MsRCSAYH`JWJxz3I7t=Nch>+_*W13i9i1uzsrw*!JG2r*~h=&XLIG* zpMSyA{({XgtI~2+{-tC;EPTYrzb0;=K0p3-0{%5`J!>KGuX*sVr#Cv>!sixzU70)K z2hOE4o2*)YH8xJua+Wja7j;n)4^>y@PEwjRPP61pt9Q5#!^e`eAnPsHtFd)ew-~(a zj_W*p(`XO;>^|T=2p>BEAA3u+EA0m#lXFggf{#5Rei!p2*L|?y>viXeyEYm=Ru3OD z!N+PelflR8;A0z-h?T`0*~}aX<}B^uT9CoVrhj7Ay909y^Zyn~rnH zeI{|)gpXm%DGT=UF`@O#*yH*pG1<0xc~PdRUCwA?swEIpt)Ici!jk&I$HozpEfd?7 z@UbfRSOk3RW@sI_bA<=;JtuW#K77n<9bxb>OVVQan6$GE?Grxscjo&;etc{hd`$Rl z2z)FFJ|<}&A?;H7`xf}v!{Dcnj|m+XS>!uyf^CHsVDPaD_}FmxSU-4b^E)eI7Qn{_ zKwH9TTLiprxXEVlG4>W2e5?i@7KffE^#~7xpU+RHzWk1Aa07fS4<98T9}~ORGUT6x zAAjLvKYjUYKIZ%%_}D~nH{0)ggh`*7^#Y!YyyxBc_!#!4Dv3MO*ww?wMCKrNgTco{ zmT|zxYLI3AS3Wis-sPd?^XzT852F91%r;tNS|B*k20nJHmygNV3Lmq=$J)|&OEjy& z$4Feh zWAITUZV~4b2DPv@Dtt`##=~!`9PGcZS`Hs;9VorB7CgKY`en89{RR2_c?T$ z*YG=;y3}FM`5`5@&-~l1lPewe74x;ImglwEqYIYCydA6}sgQQD? z-p|m8X`@mXsg!h>jw>=-np8c#8lfDL7 zM6T!pRbpQ%;&}&nwo2>>kFHTR{br{nP)!GR1w(Tq%4UUFJ{F9$+v06Mh{pnG$r-edHXu zzhM*hohMiAy)WR~UhYrQuDua`^%gHKJ57C!xVPWX@4kA(P9=6}Dcc6Vv4$~d1?9`T zZQ$BAaBUm7_6XnV$tUv0|I*(#(og>Voyzmo`rG}Sr+@o-`?s%L>F;Fk^I)$3t-n9} z|I*)#f%Nxl^m935ApIe-qjqh6we)|~w_0@Tz8}@9@1OAN`$zrye%62J`>*LkUw>D! zpC5TNGGt!ez(o4C^q+G^p zn~^U_-zrz0cX^+8a-CF}YVQV4vi?~HEi0Qg#A)A|MJx&C%YkWq?LpXqMYhN)b-3fE z546ktn7swr(WLgg^NqH;8r*!)JC`a_m7eXLLng*AmGR5+n?rJTrw6xpZZ7oBA?9e| zVCGP%cMcK6|5tO!;x~?(-#9jpZ&`yrTeX5Yw2e7r%qPt=pT4>>hdj0<-TR3lEK``$^N?y9(S~9UsTYRd~ffuwb$qP~LzUS2H zdg>UFf1_T? zdJw+f_1iTa*{Dq5>f087b>rT`SvUbDahKZg4=gd(%2*eRn-@~j{$6WIu%+$!=@XPY zFU4%ff61L!X(pbR#h&*9u^sTWsmFh&WxHn2SrA&XqP@!9%buz+W;KNQUKoK+G@JXp z?ws!nU#acF{P)HJ|G78zGuCO|`3G}={iH$@G;pDt7Z;=tR;4KSW7IQ@czp6K^WJkl z=WfF$ts>V}XAv9zy3e)MhZ!g2xxxn*-l%_#y@IvtIkHAqJJ8`a>Sql{;g5O%8*Bk< zIIF1ld-5>f3X3P)sGG6N8fmf37Ko3S)m)M^3Z2-RT5_6n{`&a;iVscT*8gjKa1nnA ze5e}X2=U@W_kY2Muc-I`ulUgSf53+i3;r`cl!@USLQm@2RV2@qO^x ztXKyv`x|_z_!`GnbJmCtm#|hOa8BVYwHj>wyZRT!Or5S=y?_^8y{eow)eWRAK%Ng? zmI@u|VM_{Nzb7_?w1|S39L~4yA3xkyieI+KM=v5Doz_O%Pq$IY5!4?~*;&tVmTi4c zU0{l$+?Axcrww~gKXJO{Tr!0Zw#X=trv&Kte4@EG@ofS6lB`WF+%ac=P3pp&nXKC^ zC7-O}?oy-eJ+4v7mB4kI&>ly3+YULiiMoEHx~}g)f0@rXFE8ym(N-2e#r7F?cL(XN zJ>b0j%+UF~n`--+eE=KKAz0IItYxp`6H4Vi8KmqVQ}>Q2rN7cfxgQ6g+MCp%U+AAl zCfN|_*!n5sGh@izCEGO5{szYC^o+NZyXKGRk(})-dGBV8(~v9X5Nn3M`5o{NWbCR| zrf%&(`U3i+-qcGMd0ugD^XHRItM~mbb*sFSZ&`CpdOYtx;r%CTQ(X<43dc>nsdUc4 z&z~Q+^YcH=nfjMy<8E!cagK?yvNoFZ6o)6@?s;9-eL62L>a%%0)>$u4UNu7tPP_B+ zlvSI!zA(Sry1kbttZJJ7eA%e&P##C2xTQztQ_mf{q zbp=?}V1fOsjiLIp$alQwaol&|osIh% z^ThR*j&p4X7mbMPopa_8?gveuW6PiZs4bT^?LrUN z==ZF8O;0TM^i9LO57te*G;#mrAhY#=B_Qn)(tTZ>>Y@*;q|Z}ofi=>kf3@I)b&HxO z?w>}w9c_ZrCX=q1as2riZS~_5QtdA>f3v2f+T%|J4#93y_-UElIQuk-c`Eu%7WE^UT130cJhM zYPUJS?-9Ttu^WCO{S&1Bn>o=29#z#Z?4^H=-QnABxY_Mw8_Y{0x$ck&VU?i%V#<`0z`d z1*NHX-wZdcuE*zw_$fMkYEKGr3FOSz+mVR`Zv+OB!D`I`rLuPR%X#3=lF6n{)SXh| zrd|H>l8j*`aCTMZJw+0?hkLQ*n3Z{Xl+u<9{O5@ADt=+&Bl8>JX05$+p+({sUX#=l zIL*jx0w3+kokSZKVh_$#T8@KuNSWB4GL*m;<= zN=x9WW6mO*PiW5CFK|r9@1sl5ZMk_1)SH|i&)>w~%-_O4fPWkQfp6wrGS5CjeEWmu zs3cjN3gn;GRz>1xH*U(IN&AE2S?hVsmcD{m3ybA-0>GuU8C`3ALBHY+-6sVEhQ}I^!$;IrR++n~xdFluzIg4Rg?Xm?7NO^bTaSy z;;YdfeEm2vNtbc@%jj|IIX>LmPlrhI<;rwZOSkNMibhZOu+ zocOUg@MB30ckaIVlJ`?`-(d=0LAG~{!XV#y}@RKSFqu*q$=#}SF-8<-GvF-1|hm5_}o>=#+3rUQz ziAz~yz$PeuK%19HzbV#dV@rGSe$1^7*W38+TUpC{gLp*`ra4?6N2oz*V;rvDtVP|K z?r_cQpa!J`I$RU*ow(2Ju-|7>$!G9;8;Ji}9=cfFMb6CwccjcQ9n{t__o%ITw^>{x z{px*=db9Aw`|(AG>%CrT@V{HDKc0LGeRu0j`q)^rKf8!Ed&Wh^zF<9mG;N68G0~)V z>X|>z9{=GSiIdh~Zd+QHY0{6g_W26<%35@_d!2Ggo=cCK>>o(J81iMN+$8VJMbZbH zp+?>re1m2U?z=rTq9GN%m2!M#NM1>Ig0fyCU2O+7_*`a+@vezy&Vd@&guFBdc`5&! zgay!^suvbm(kteN#U{?%vd*cdu1~a#&r8KmV3G=rvpCFKeQg;{{^D~jgHL@+u?rDSqYEL96oXBlK*)@{Dw*Nc{ocp~%uzzd$wraLZ27EZD~7Ba{7Qsrb@S>jAv2>V4v{_KbRiCv=VYx?E#kIu^7i>%qm{b24zmW-#}b+o(VdFSP!@utge zzJCl2Lgy_MU)9d|sjBcK@l!3lGr-~gJX7gk6|p}(%5l^B`FVW{f*pMqP08!~K7L0# zSTjA&f9=DLzK`FhZS4kb;j_A+a$xFTXK}rrZ!WFN`hVOIZ+oU!SKBzAALB1`>IUmD z+xKTv{(81&H`_Yi%}?rX`=ED!TXWL&wwm4pY<0Z{*}C?;(e`}LE}XU72c2xFZ6toI zi{T~ZN%1_#+g|;Ah|SP}!O`mUJI)Jz7k}qNzaO!+TeRBB_`0j&yV>p_&%xhYwpQ}} zKEC(3$FcP^?}PEL?*_eljXr3PAL@Jfq1If6zV8c6K1=^ThEB6MFQp~<`NWNFX1)uoj?QXGN9t+=FB%CinhY;G1TVs7 zP>60>_BMLL1={>~p1*{q3GWGq_naN)bm99wXf$-<1$f0+=1@eGhgYPuSA#^C*|8X3 zRD498_=pPs3F0{(y;{C4>Ph- zuQN=~toVM|oYj+f6wO|%q};68C9>ET^DPduIj!P zS2OFS-(1f;0^aWiTU`6>7S|6qSzPJ(MJJ7v-Z5Za)hFAF(f2L({58)^OrVWQ_Lye>h7Jd?4dX9GVri@;+;TUb0 zP8(jO4d|;?f+x??j<)lIV^_>CUH96r_(@pY?2+cJCr^0ziQ)gnxT^`Fy7_HwwcyrR zz6qYRz#BJCV62WqpHo}Y=ZCQ!sf+>8XZGTr7P&=aq~DmPuK(xH9vb}tG%K;uQx9~k zuq$$UeAyV+LUd9e4Vd;c;d!eW-{*#`9=EV zF#YqgK~LG^!2KZZ2htzNOl419a9-vNyvqZ52fZj1dXW#k(4ZH?p%)I$WLWbN=cXF; z!jyCSRp>>BKQZRei=p6M80GvoxW4P5MNg!jN%7%&5o_!kdE)%+d&n_`vZik6ZY?ck z0@vfD*J=Ak>@x)^*!EbL5}7#wUjvI;SS|c`K7F+jyN&Uk^(yhN^8fz0e8-++d}kf& zmR8?q@?E}d#MV>H`qq?I-zW3EuBGL)tnDW_I!XDF2eBDi)U!tY$QRWQkcM@-!s3OI z%xmIlT}k7CQPQN7W)m?~G3z&uN?!1l0Qfn$d8 zJyM@8SMp8c`pSf;EA$?}T0^&%H80Usm(ribtjSe4I_d$yE-?7|PhjgK_43`L*X-P! zu|$jZjg4Hz{^}ba8J9;H7a6C=Y42m?6J6v<;Clkt#Lkcl>`wtV=N7r2raf&LL)qt= z0-Uw%U2+)Lj-@vn*AAt_jO#U}HyGFUr9+Ktbm7zcx0H`MBhqRk@??a+Ew~ie6r1iZX0OStf^l zWHvsF*QlZLt^hspoRzakyyw09`bcaKl3&(l(0NPiI$$qlf7>c-GIbq9msEx>i9KPQ zC%?y*Abv)xh~J%$4qlI}Gl96n@;wfJ+}aLBF}^)40-qV%jo5UjVUIRDi5Gx=uSPja zhO4MX?AaNUP1+s{wvTPf)cEJZg=_O}R%h@p&B$xR-gfZetVz8Wg6gc;(D` zZCdtFc_-gAr?UHhtN%G~OP?iK1VAkw_y^j6k zN9Y5wvp9Yt_5$rNYwSPsmhE3|8)#5@R;2!TT+5n3?paeH?t#Xc)09)5q$_88{dar| z=6#6wn}c@=*-3gK?@jbYW;Avm+9iD|INm(QRdRqbj5PvmR9&$7O+RcMSyFCso|jl`weg%k$eF$63G5SK-EV4$ zDtQRo`ZU&2i{sV1wdmbP2Pzpadu?wSH_`%ABWVwGFqLGp=XnKtNe*;KVI3Bjx~g|2 z=I05{?wWxu>Llla?rrB-d7ANzGqr1sNL;bDh}eb=)b~gi_3j+-FLSLnI|w^pO>kb5 zLbskE@#tUHW>3Q(n{%Gde43~-rVy9DhIhN!lT#D0pedhs(?W@T`Fm}4Pu_9P)0q<9 zWkvFibkAaE;GCy3=(QQsuc18B9U*2f=RBRs0+(`P=sVus#=9>QIu4m>BX%UuyMH82 z0x|M|Z&o5@0b5Ub*Ub|bVRm=o=JW1Z;`6rjqI~RfbCNu5IKp1SmcE|-lMAi`-gT5O z@2>akpPVqj)2_{&8Pzh_vwt#s2;~89ki5G|ok<{;z|FyeIgvATVh3 zLn>?!Jh&{&6t?`I2h3yQA}Vg`hpo!0!j?bKzT&3s&$NujP8zN7_nNr)(&#v1131_R ztyK9<+Mt^rPJCs|WWHfHQo)KiHBo!s;mp)X)qeT#82XH}C&liSKfrOJC-=i|P-h-u z-%BDee|&P@%B3l4U!bxrACX^iQyp_lXvU%q&17qY7H7O? zvh8_}|7PllW87}XZn=!-9tD|~P6x$@hEKcs(zXysQ$Ducx0~j#OrRg`(8BgKvWIWR z<;;V{lmZ(yE^{Wu<5X#;aO zfILCujavrIWba0>Dyu$~=h$+LblIlh<--;6KX`wPv==nfYAb1vC#RI8p+l_FRIX>< zwlm@soMhfsFlUR|=OO$;=yMbL%y43eIOwOD<|*sTw6NuJ=A_UCX{)U93th;9CLDww z2n`Xu5dAd~`*Nn(r;d)2bzE;I?|0^@>w9yLK2d!mGJj9*r*eOh`)=GH!^Rr| z?#NohGD*W6jN{(Mz2NOJWX}hAKF;$xzIEh2l=Y|YxNpz>Cvs0&k=%!a`zockUUMyb z@8#anTesL+*0gN5>|2OWX$j;1i9x%u=ikFVyG*mO*Y5mO3umVWlw6_@6tupMy>J2l zsLa(CJM4kw4*RBgBdwP2Q*x)x)1rpse|ks$vKTA=r=zq0{6ig0Gx0%vD`IJk>~A}L zlZs*?I>LU9CW$)|=?pJe-`h#-+jd6N+qjFbpO{V_W_@ry>x1hWJl_}c{q}huuj_t!;{Nh- z6_MW%VBbl;4V2%5_eWUA3keRg_O^ti&8Scje>xCg|AOz^jt1Dj~JT-JCs_8k?T z7O91&^(aiW6N5MB(S3SMo+&)%v5kc>qb5E{Jo|Rmy$NdU;AxKB7A-R8=Y1<xjBAejA|F1zK3QFXGGy*ECW^Y?Q0?Rzn%2zYAC#y)L*No91Qzb9GL*p<|gc~Z^ZJw{~=B=3AR z!8Whid3ghCugRQKauK|^WR6Wb-^HRQ;Bz2*V@1yV%_#gv@c$w1OOn{Szhz&A?9=>t zk%hBrL>}m1&=rY+DzUhp+pDeq6kGd7+AU);5TE7M15`vJ_I0<}qNn0tas7eH+?&6z z%wyD^&cIO&_4>C0`L%Q&6q&v?FzKF%|T z=RjXG4$$TzjrhK_Z{xgIL$+_yW3GeVJ~OOs`gbGG4r?w?Amw#G#gH6Q2sWcEo;DI~DoSJZtPh+F#h`w*7Z-uMZowKXQRJwkQ9M zoh|8QtmVDaCn)_u_-)qlGXi5nk^*A~+z}W%EpEjAk(9A9JSgcd+lc*R4zMIy zrgeF$Mb_6?=h(&`f)y)SFQeT>TDzPi?*B0R+Vo}f1JYkKcZyt|8<&3Q`rxFAw0m8! zikz-uld4sS(QfrS&X}a#-_h>vDllz2xPCM3?Mb^&0dFGh?oYcTazkTB(r$~XW8|C4 zlGKNG|3QniCeZGZZV}ezYc1)AXlG;Jp!6>EM`d1M?5y*7`}fTYj18DJYv|1Rfw7ip zv!2@AdBpxd(bmqvA+ayg7whSVWg|mk4-F29t;`FFT~2$u(B9eM)})=JJrJH^?VA{o zwE22VQqZ*iPvx04qs_7xOlX75lhNQg2B)ow%!x0-X_*s3BRYfA&kWZ>2ZV3WU28H~ z@3N|hFmV6Id`Is6W{dR!Q$kK!pN##uY$E-fXEx`2)>dWg)7kJmTcqfLe7$L%_PnuF+X#9Ka{NZD_$Ej#T=G4O>^XmP9pg~ z2X9BtPS)o#J~hy=JCQR|=<{mT)@tDzr^V)cF-v8PW`1O{H+us2ExdCSKk)RQkgMW| zS$O+m<`FRp7gy!qpJ^sN@`jYv7n$vlIWkG=t2JAae08+N=j%$@l<_+2q%F#n^APt< z<~B)3;LTFb3S`H#*xCjHdlBbmyC(*fxXsZ?=V?1O%%r=4`{(h&B|j4@^e6U(OZk5Q z<_X4HI{Bf;W!wwRMHb4aG0`WHJ7?}h z{Lzl3XXiRx?uoaR{5<~l62S$LixX-CpuwFC8vHFX!nr$I*6iln3GnQxO8+wBBm$ zCg3np?_zrn{Vb4NaO_9@xh-Tl>N_m{5vH&+Jdh5_H-LweZiO}P>O~b$9dUW{6 z1LlrN2Mt_|;#}ztNrxHpd%jwD{}KF7E}A2fF43;N^v_x1u%9!Bf=iJ}5*zOX_$_Py zHQ;2bxr6n_vUM?kc>NDCap30DWou(rnq!h8we!gj39U5;=fE#Bj?3ILx6N6OyeIur zWNx1`Yi?Y+!<_zfwmCXYd?*#Rj)*z{7T*16 zq}nIA0#S$xX=~1v`;d-zmjnl;=0dagjKa^zHy)p(ABP~%o}+z~o%G}3J4%isW1p`{ zE1Awd(dIEu!42r?51L|lQ)6!1n_-FSzVYffy4kXGY(RZ4IKWMHf8Yb5;oC`^wG1#Bq~LwQSgvs$f1*X zek3n2eNOC%{UX;*%ZW{&{YdBZdit;F_Rv@xGD810v5^(XVw23*rZ>>1{glNj@rh5a z!%wAKr1ccT!%hVuEy>3`yS;w+PhuJLfTxL>Tnh+PfO)@0083 zd-l(scmqB4&kpi9$iv>{Jr0Q>HM`IIEg2o*izncZLJ#kUH@cAZgg1`n9B$!_-K|4y zyWow7k@xKAl$FrPqpXWO#Jb39=psweMHV)g4BQKVZfuxWvaZLa$@`C>iv-mM*gvD( zG-&0F`LC^8fsXPP*S%a%2ZveT2?$RcP^luu9SpD=ItP3HURvhq< z^NS#^MUR`c&|u*A$lRSu&(QB8cQ@0|r|I7V^zGxf6N3$W72e^a`^V_NTKZCOc$5~D zCcNRr`J=2>6`OX5{+&5L&HAt@z$)~5V&DoSP)F`O_6iGKuC}~rUB=uL`rW0y8oSOE zX`R4xEwowi_QyrP<_kXhyox;oG9DtgiwrOA5IH^)9I|0EkL6kPhKh;3u@AH_9R?q| z1=yubfqMcx>NEBw$a%Z|d`HemOu!B`m-2T}{siRn`&+VBtw!ESgNLlRK}Aes@Bc^W zu~GaF_IKI?h^2n0(2;wHvtti6@IR~Nh5|!HLGLSkvj=roQ=aqzcGskOWEz1(;1S*_ z?VkipV}6HhK);-#{qMJGd!4`rZ^{6+&nausw<^NN7axPB7rdkC?WjlQ+b{J*Ul}J~ z9l^jVbx7Suspk)^>N!R|PV6!_P>=Lw#iri+qZ@BP2lB`O=Wc6Rvxhq7!J|C&bT-=K z>s$Z!%zVjH*9q!b*s301U&m9A;Eb<)txnUwqYlx%8^ANE10Tn$_E)v;DZh#Gr?)D< zUfMx_1yMeB@4~wBU$>)@I`&FCLjHR@j(gi7vdUep>N!X~8>r_b`xZX&Yez-6NiU%e z8IRWO@b9D6<1w^V`KKvg11GhJ|Eyz zEzx#?HT|rh8*Jz91nhZK6`~l~DW9jPy!9~IS3$jnhPX_e0`(!|AY5M_m{48r%+k4)&x25d`8-8hfDlmOYUuKy)8+0io zT;@_N$9~9Ih5TyH2+tJwdV6u85ggdt3RYkHXSQy?GV491{qWd>%pYIdee=)P2U7lD zT9xT*|GkvCcGC@3v2`up<*<)v%UKSzr%MLD{G2cJ!a%3}1)CbuMEmE^{>jLO_u`jb z95mGSxVQZ#(mTO_p@lO3W?&NBpUQck((VhjC;@68%yOZT=&3BJm#y4?2QwvRx;A1Fe1uo+s_b zKRoFWaLal&v?%F}S-DEshbVkzEO8b^S8A)bWXSVJ@Y-gJIxRG-qDvp6U*Dpwx%8*- zY3b7&JNWmhhu-_Qd8U`v3vIm7ul@PRz;Z^M1`Yn^Gi~+PMtR=(#Qu!c-ac)h4qtyB zBo>U|6z7Ki0+-nX*R!M-`kLd#^_da=xZdtpV|~Jl>!Ds;KM8Entzh%f?JdA2Jk4jH zbF$B5CUqIOzTK>k^oOOvgL{+tF1FPiXwE!8nj`)11hIo@QzJpy@Bza-D$-B1@i;bMXsFnP;B~~nVr)ck#Ba~8XBu%gBgQd z*;9oj&DO3>=d3@MO^dJ|MCPgJ;gK&-Ap0Cgt~`WXdH5rdC)<{s91T2%JUObQ5!r{c z>|6(tcO-VpapcKE$diYWC%b?<$C16Fk-?nEVlN>-UWW`Oc(f&Ckj*EDr6Yq)MF!hU zdVQ56_Y5>!?Do&VukmNj-Ag+ba$nE=3NOxzT}137^^9B7BIPW0lK z;@Z$y!&ZgO>Uq^JX&CmZWoD1P>P75Tjl`NTJ=OcE8nGwg^F4#IKBKG#?0yp{Z!Y$) zM#`H-d2=Z55v!-X+vs;)1tm?Uyw|XOPsE;)*gecTUbV4WpStm>Jai2yFP8EIM;flk z0*-Gm`UK z#GmQxPTIxwrJp&!i~16@>x}mscosXf!`a8)XtXJ&G&_NB)cvquoqMTM_UHKb$8q|j z0Gjp+b;fa)gM<217xoSx*H*tt`{I;36Skvh?F+;#ZqY&;oA$l1cFTPM_S4>aw2hv6 zGW_a!k9sb(s>eqco}->TQ|HDkVj32hJ?+}+ZI|@tgS183DEN|~uG6RUY*K1mWnw$K zhqlL*R+x!tNZXSA>U^0xTaTBIU(Gb?WF3OG)p`4}*jr}`^$UrICGzC`lvR!|%^~va%Ic@Px0`fZ{?1`XCR+5L@R4(;bIvq+gWy11 z{wKqJ1}BabwJB-Nv%D!h=xi`P6Zl$mWWSY+MI3A9w~5V(HByBxA0MXPJC-iII;Qjp zZ9Gp*smzCl4h<4K=6xLJaR@JJ91k8dZbN|Qd;BVXp2(i9Kq;HEGbmg3{YcrnvAs&! z`NWvcZ>!!rL7R*{SCswZROR0G(BPpQSZ?fD^0e2pUUQQ6R#3i;@=qm;|4vwAIkr@Z z{b%4cef9T|oCQLEN_mgT9%>nLqt7}RJ|In$QI8G5iOkTJa_XVCv%u?2{0XvX!`QBz zM;fHw6CFy%^J`+h{NCk918b z`7vMi*t9P-X~D|_zf|~EwJ-gGbH{yUzD9XBe3z ziDBG~PtT4Hj-f^Q9$%h1v#oR+`@fvx3&FJ*dr~~`i0_Sq`!eX zP$lf+D#=@jZv%Uzr?97Z>bEL4?*`@0tJmyVDa0vEG}-f320fLRNNj@z?Mm|ID0gfs z{_O$z)v|_`ge^*FRrZE{(8=i1o|{xj?RK-CR2OG=f>+t#i9CP8Sk^LrKH7hLk%wMA z#omDv|;HC96CYXdg4RSH|XJ~>nUq?rLtFa3D)P_5z@;69~z49+sojA%t6joeK&=+YT&W( zx}TsIvRCPn*{p{JO1$^>rR^GxvjPdRBKvKS(McP`w@Z0e?An}BVK&?Ev8(qy>n$CO zb3yt;pC#>&i_H4`VD@v)V5mdT3k%Z9UXrhX1r_bZ{Ps@U{z&;BNp;yVwQZ=8$sbJfLXw3QfO&@4*FP zc(yDu*{gkZFmDDz6AW99UmZuNLt`9*sN?U9af>O&;5m*i$Pvf1)xq@ZXOa2Ua-OFu zUbZ$)g)~~Lo?F{Hko{f8xW$$hZ0K*$>JR+t>PTG%KlQ8YgtUjcP7u$q#?-;6r##W& z{*-#eA7igkPiSLg@e6A?`=l|Y`o*=0R?c(x)}xt-Ek_&w=vPlO{noloXQ(Fu9NAAj znP%uGw5ugb%ay!B8=UO@yLUEp$lGTTLZ5*18rC6)BhwT!Pn#)2{3d0Myn=F`z(1iO z%9-0`pvsl8ykKTuOO~8PC}++^mpK5*@px;!Z7-)h8OuY^Ug249Qr;nGZw+hl zLc{%Gs|XrVa=jmH$2j}=Fy#aTTMMw&QkINaEjIk4$g?tbzo)#T$gQlE4LJskNy#b~ z-<2wXO)HKv`s^-0_}&4&MmrZ#~C{JYZ78CpJTftWlJfbAn557v^I{|#L zz_(5F^xa7VzILS*lr@L4#JA%VaP_-U~C&UlX9Xy+nQ@YGmzsN=@1B||C=U3;$SE=-%PW8@p=Hb|@)Om<@R?yDw)G2c# zpK+GCVPbB?cR`=>_FG-8r@Zg|%Daj3F8Yn9KWiXKmEJ{|L}DV_ln#n?eMqD55wDL66gN$N(XBWs_;Yp63Z@bqOuQuGQfVU zol0g6sc->{7|Buo5>I!BV>k3Tu!mpucs z$Y;cw!^h9#4_>`_O|BN5iJyg&^(tT6v*>eQ`?I7^ynWE_eBcm~C0=0NH=7vMHeys? zON?q+KZ_(jWy3dVu6TTiQcUJF?Xd^ry5d7rM10RB%AEFk*}|B>kn^5+f5fP?{pQ}> z?j{?ts@vq;hA-`rVJZ?Cp-^M3>MO1)D_l2WJM4L1$K0X^JLWprgLZET{O@ebAmORP zn}nzKE@15O*Ov3MH{%!6g8%nztlzib|6L4D$yquYee}&~@`4vXXDa*-lZVQEFXXcE zv_En3yr_vY&`nP&){qw^I(`C&dPcn_Ly<+ z`_(gs`?Jiktc4wQ>5rPIUt%A~IMrEHS&v$)-m*Pt-(p~0g4}ocsgyT2(Z8<|A5ZqG ziQFgsj$N|qHuz(R3ew%v9B;mf?zgAS(s3dSwr!I?Zf3{wroKV7P3N`;AQ!gLFV1ql zX~;I5Ys+4>GO7Ot;JYYuzINxZHk?J1MGWg=RXj)J#)mgM-3uz059{~POuNXCnTsoK z%3G@J4-0-FOXgNC9rkqPGsEUqK09n)<+5S(E1w&dwek63d6n(X=dCo`r#+$Ek4Vg{ z$grpKDv6ub995E+7+}vMW<*|d`;yFp-wn%oT64{~V9K3Yi4W;>nk#QW8~a>`hO3#_ z5w9t|P#(nq=&45D z?0iq&Cnax)M~AM%hIUcT0QQ5qp1e-s|Kt_=Yrwq0lXsfrMRqgVdn>Y4tGw8rjQ#%W z$@{Z6Z(XG)?|qUt(wjF;x&PTJ??LizpxzhBD|PzvrAfXRZ$4s~?roLt5cw*|SI{co zO_J}Jw~x@xDq7_`LOzj89wpx~FRacw53JWo-X?F}dz5=itGui$8#2fw@*-aveN>@?P-fMIYSMD(?wtC-vSm}Fa61^cDeZL1 zYnQqT?l$iLce@1W5_cwR1pZO*^@Fr+L;fK8yF;naed()C*pd!l&p415O6)wdz3fW) zok}B4d+kwv<@<2$5aoBo*FKKe$6_BcY*LHNy4bHeREUh%xzyFf`Z{%LhP|zG=}w-r z(D^*L#@T5Vo;I!WtMeRfGHhUeb^37aQ|c@-cl?+7E|z=h`y=HGE*5y}E8*D@sO*<` zCvBB>7nld@Pg0-%eD~qwJCrZqC7q<7=?B-BSAolikDLAtTz~Vz^(1hhJ6F|t;aVhc zJ<6Ij?+o7R@W_f|{p#CtmHL{%VJAH88E<{Xt@_>Nt#3T#3m(@Q@^0tSsXS}QyUr&K z8QW9mMo*oC{OWw^Ds`TrPSMe(``U;+kl)4Oz6CsYAn#&ZG|H=J@RS$tS6;zY%4?v! zY-rVQT9r3I%Ja&*(kCMC${4iuD{tmi%KMS>MBYuIJOdZK@Y$q1=Iu#h>R$lHl!=2y zx37A(e6W5Ty+p>NDI48}Yhe5k{m6FZK9P#A0nerRL-hI^JCq#aeoyTXy^d@D_+DOC zbS@#zURh~;N1gTCvK1Sm^urV799rcz>dB{k_-FGjY#e*A3;bQV>)(hiIdF<{w%baM zyd7846sWmRSUER2Omm-#(%gqTXzsNpZ2YT~``aGsU9o*u{fLat926Vov&4rJ8)g>g zBXB;dVF$UiMr>|^-<{aYH*9D}`qa?NSNZYmbsnC5V!P<&9UHUoD{a}Pwr8trwc;kn z2ioe@_^!*G@|;f(&E=iqyda5f_``1IEa$z6yrsS>td1wv=Rm%f^FAAW2j8#LIp{mL zpzmZ?w!4&rthJPQ{_IV2zk_U8!hhCh>`BX3_65Ww9uZWvw*M0W_DRTY%@HbD?0O;t z;-gt6vU@GD2k!J@}ZmTKwCdV2^nvdz!OT+v(+3+0%U6hPjCf>F>ujq?OdguJ!soZuWq-&>Dg!OgGXfka&)^$DU<6k@_gyl z?JBf?)$PjB=>m=VgY@f3D{|{2mCQ}_3v|2FhHgjP>N-c8f6?vSz+uEdHexh6jQFmi z=OX*-wkNb`{7y>i1BsIht*H;ZwWOB$aA_T9fJ19i&?6Ld?Pb3C-U}Y#r(L?7@3MZD zKpH3Z?KSX9%Ph%Gq9CtsX(7o(K z<^B}@VV79T5&NA__bS6CTkh4p-t^uV&s@3Bfreqc;?(i=4>|ex~h`(9p-B^X?=4y zf_r%y!=P^K1jG;G0-g%cl)=d8*|{dVr-(AS#ByipQG`$XsZ5xbzoa`Wg|iam58 zC6hVl?jZ9xE85|zD`M{wdsQ-rT4!%8bUuCdnW7lxVBrD$FP1)=ZvO;7*{X*f?y^Yr z?%p{LcSLdixJdRoeUgF?hdDf{5#RN4&S=`5G`d$eQ=2p=|1$PDbyZ<$!NfzTsR6@eUP|e>9=!^6!nf(kWx1A2^VT*V;CN4THBJT0eBjSEn+0FI={})U{ zZ5#NnzhQ`N>kY}aJ*=O1<1DW{Ej(w|zQULvVgt6uncC!pZCo1j&$xiC+mt2em8!)t zMc6Ht7PFTwCbZX`ZPbwZiLCqQ5Ni%R+>UJ|&U=1WHDeM89;R^iNjA2TBg&MPs50Y5 zfrraDN33W`)a;~po{e$NFAXWo;oMsKyMCgBvK+3?(D)Oa;qij0-E%cs_?gAQj;Bx2 z-`Y*AlMz3xGMw08jLkv*$LW)7@FR$`?D820IS=UYuA-PoWTzIk#uN-w8SglWA5Xe~ zg&B7CnU(8d2Yd4{@`(_7y#k+Ls z$)ui4>RAQ4I+nowkEBoL`>UiYBQEC$&qdqgnu~(o z=DC)*oLlB-tGj|bOL^YUd7~@2K7(&_J@ab^YgEqop}MSD-U`q99pAoMNNoIlhJ0Tp za+;RVQU5K^n_kGUPrO+rXVX6R79dN@8kj0wd$S>%m(`-<6ch|K{1{&1ozTEK-u>od z?xB%Kk)vb{BOm-ehOFR3XWLWZp?zmk<(ucs@Mhuh(2E^>D+V65;}-Yd-fLO&D*g95 z&qruuFlVd`=ZuxQI^w+zB)0jpQT8tMff-&P{MtdgpQYUm1KI0AzDT~wTq`-yGPsfc zn%py`*EIJC*VM}+Tod$k`xX_H=4Ag@3V!98`20IwTY3L*_R92nrQrUyD%e_dEqkr7 z!}q0}nR=A{BxTUQRr?}Fy0*6;>1t+9rI{kG%nQ~jtuik{m=~?*#AnQj=Id3mjPq@b z{pM(ud@Ex=m8<`_v!}d+;G<<_x_t!a9EnaU`ly?6t4AM8*e-rk9ZQXMDEiN{hGr@~ zPk*?vUkqXljx54=gESY}YcMR<)7KY}MdMVAF%C!R>jcK(A^Q3V<5|w!oO6?BJnOf! zzM{#xQs>g+*1(c@%9Ax+(RIJUPUog?>l;iuYmQ|bHVi;lCN?8B7m+{P8)?N4w`1wk zyJelntmki6t51pyX~=V-M*XtaOmz3#1rHu&y=yyuP}o7@h-o2sazrp|hF5RVM&IlH$Bc%8u8o^OZJ_y)`p zGeTgM^{oV84VAW_V~G49K7-e*TRkOK7W_>KKQ}4 z*Ma|(7uV{*wR`;F4*w6hcBhffgKJy7Fn6Ui^UGXb0uT-pf! z+)*_|F94^U;1laTr+aN0q9<_g!^u!DP72LM#vkXyP2t`BSW`I5Imwl*7YScJgA9b+ zp45@|_0@s!>wu*8+|NXY`=N`9xC4IusX53x9DeQCaOcy&*)T8OoVJ+C=D z%XwLwp~Y%LoW2(r!&vLt0$k25L-c;!7lHfFpp$0@Io=dLUQZnd%@Ikn!yRssMe2go zn?Ep?`Vx~{U|bXt;9B24z%@Bo4Y`$lMZ!1gw*)3jTWUAq*NSW|Wt zdi+qM)VupOvKGG~e_Y7;{Bb*b30oJz4mUc+f(w;?j|CBS``XNVDu1vLK<4rn;41WL_-eSn`mSYLxgN7U~ zGUdQgYOwJ99WQ0rCyiA@CfuurZ0@249RPQaf*;c6{v#c|WWQk8YlZi>c;)!vJokD{ zzkfK-D=061K}2k5Jm;(;$1gyRUymH$(UfTW204BOa{LM8_()TD?6>9~wu9975$~bd zRa@>IxwQ-F9^n7y2S#qK+Bm+~?5F;BIsU~~a{N&(+z`W8X6|AKx3WwMAKT z8jF|5Y<(bLtHf~rWZ%-58qQ7oy!iQ;JzHXX>0UYh0CN1@;NVX5NuL~#uVtY{xUIgj_YEh}QQ`I|%5PXoW`bCKhrQ!X2F{6XaSd{e-4aVq@G0p$2P z`n+N|`;3XlVv179GCrsHAE8e~&kHw&S}g&=W^^5PeS8^7HlyiW;jF%zLuZ~8ZZ*T9qxV`<3fPW*;b2h{CtSP*SE#*u0 zwe4e_dlq}e_WqEP8@WJ>lD)#~3s%I8WPeVj*=ikbax@jQUfU+TC}x*3S?f60j`iE9 zuKXjNDnfSK8hPDj&U50%Nx&U-8S#-p^3huTSLK_}ja<_fGQyJ^YLVs7i6m2gm zXm2lC(q8ld_9Etwd&tlSf{*31r&08Q;i3<4@6!jE&sDoPPeb&97ULlM|H-_aR!>Y^ z`ZsG>N-x_DBVDGON4i4SX4u<7CyqihMxzgiZoV1ad^p#x?0XK-ELP&D8v20nMQv@g zUFbTtz_K}ajdV@V80qTInMB3JNr+Q{Ie}Hg7Jy&*=9k28IMixxl?_nILSKGh{F~7O zDjENcT=z5XHH>==<9?s;1=1XUIm7<^ul0e#|EdqL2HT%8@Ye^1cJ%bMzdmpXzFz^~ zpG;quGrvVnd-w)J7c3NgKy%8v4t|}i%N{{?ilt1SZ2c9sAfHZvO}21D@vn7)a3ifp zCwP3PM^2kt&h?7yp&2qy12AL*!wA6z>sWb9$`9Xah7a@sLuQ1Ocs zndvmLkI2b`_-@FVobh`TZKy?l5`SCGSZ_n8;hhimSAkvh0@e-+>ssjr^+r06tahsx z?mL0IwJzh+Td$$s`ZVM*V2@KCy@0*c#@cZh-%cQpd1SSA2E2{Hn+@&<@$Kl1zvu-C z6&}5yQegM$1#h6k9lp|Efkyu0^j87-&u{%jFL<-z*LuMr@TMoYijAOZ1M*u9J_Ea% zBQ-Ba+j~MAz}>0=8;9t(iCzG079DvCxF~wTBye#DdO_uP|5h(3ysBOR&aDD=f4yK` zhkwO6pI)#V_82%aCTl7-(N^XdmC-cLY3IEJj;g1k8k{lJ;1B7QKpv-V|g zef2;!cAFNEk2^l;EJpovn>34j43KJ%H^n~%Bx2zGn zS1o$N;&)osylb@4f=m^X)Du173uwlQzXT@lfo7y}t?}bu)kfNoq@$Fn_!;q4vE|EJ zMe&4aJ&HK1zW9NLe1@-Hyb*KL!xttHW7EkT{P?fh>PL}Dir5QO$DXTqUr2FBYwF!i zlp*rTq#)>_ir(XiTU)t#%U`u<-@U{Hm9pjkFZEYBjrz-3v-nT-uWwbq)caUl_RRsq zD_$6uL^JpNV9>7uLpI})7@vrr*~cZR>@hI*6=09TXV%^8Sj(CvrN6bmMqlruf4YJ< z`G>~a4>*GCJ2~q#D^Mk`Dou3@4!`tPs=Ee%$~+T$vVi>*{Z<>`Bvz@1HqD~ngdfiG z!oAJgZ!eMmJ*D2&x1_p7HcK$I-!qjo`D;_%D^1s4k< z9Eu=>zzE7D0YRe%L)HU!Aqj`v3c9ONAQKSLMI?_#P_irGkTv7tMi-CKWl6vrl>o}R zx+_Vz2}g_y3v`spA&dU}ynoDRo}-_t>gww1>gw*Q>JQxEx*J*++mw-qQF3xV zPRv%N4c+Z-$N4I|+8D_*tF8Km@{Ziauk-Eejmi2;di?ijWx_7j=)@?bmRa^ECYRkSsZQ1)5+VU0J z#A?41k;9*9zdGLS4{E>G`88!N@lA4Go?4Kqzrp|REvd%&9^Y2ZbEHX}Q1{L*$bjsJ z{SLpUah{AErv=E>ug$%>d|Y(ZS|j&rCy(S_-AsJYaMTRRP!*m8LwQC zd-cUY?o}VO%U;w1Vg#S$nms^ehiV4vA zf)8*JSJb_e+)`C@Qe5Pm3azrucAYLEH*5*HVN1vhyBAw+Dltb(ZsbRf*grt$Uo%wI zYpJSu^UccHKD^Co-*j@Y`ZZ_j{p$1=(D24MSJkb+Eky_QB*)U^Eq48JuJ?5rQPugk zs_M-a*INZe%GdTyRn;?26?bV?Z-p1SoRg=utD4xkJ-XJ+@7kSpv}*dEg%U<5gaB4?^cvwdo) zdY%4JC$aw7L*M-NT}$#-=B}P&?Ot|IS|2`|n0oO1~OovxK9e3$JlSRSP>NFAbU z5$>IwscXKxBy@CI$vYK`=Dtndzd5_spS@?-2jl>h*rAcc4t+NyGH2FJY*f?cpYT7MJxG4n%5JLbPr(P#eK6A6U zKVjFRh>+-EVWBy90Kai}ws*^oYJkkw-vMR?Fgt9__3nW7)HTo>;@(-%ImCeZ7WI6N zdKOc^V(KUGr7l~6Ih}ljAz{%unZP_s-ZG)5V0jy(zDtR7_|!aa#oP1Vs@QsN&aPbl zJ-b@wy;Cuam_tI#zR=K|{(QIPt88!T^=bez){L#yOxrg@S94@omd{qbJ`cZ0bCk;R z2`^-fxQn%OscS8?I%BhZsWpN#OutS`dqL~q-pLwi^`~93e0Os{D>BPB*q-)6V%IFX zXxa-SiLtb-ZI-Vm|KD)m;>hyN;yRZyOZh*?v(Va9M;+J6J$pDZZD}v0aep*&kYfw~ zJ9_qZyvDnATu1fj>j>YH>S+F(+H@5$G9Keu|6W%+@_E*>R&BbuXFo>?&+hGYl_QgX zas|z-=l|qLTlvYgu1#wbdN@Mvekt!g>QS&fLO=C4*QPbD8+56|0_yl~LQlt}h*Zam zYLMeVLNCW+uJ>{MP(p^|3$EAVGkiW_pd&Fl)iJ_8$T67z$^3r<{12YW_AVy>mB?ag zBmNWiT@5?L{*=p9hO80XrrPOWT|cbn1LW+?Cue7udG5TE#G3j8v8KMBl-=`7zSHR2 zwzQ#oLFX=d%e;*h+2<$kn)r_{T^G%LqhcL#r``q6JtZ3}q>Pj;xTA}{_w3|dQ;v4& z8aD5ZigzjV4rQ`~%PjArPoT{7LtVN~qs*{#lXksEnVx|%1-rW#u+q*=-Zf)i7jl1q zi!xP|5t)$sh-@w($7DBG_NIc)9rRPs{UCIoCJ*VC-mT^x>+EG2BeT6(N(JOTM*sKxffZlPPwKdR{@{v!{z=aavnA&2 zKS$0|m6)@5?jZVW(KBK59?jVn5f=SuNOVpquw?D-W1}rY^eo9Snw)h``u)Sao7!)z zlUU!PN1J1A%k~nxcz|K=+@9_I^jf1IHfzLT(fX?a58N=;8HaCaPS#lGM*3$9^Or}l z+kVOm#9k%(Umb1i3y)MAC$x-rZsj}n{lxaduG;HX#nW1noJBW|brvyxm-DTDp7nV0 zuhpYRck>gj`>)nt;+p}rwwmJ$;E}=`f=(W z#(1!YF+{`nIvrk-05ZJ<{z%;I`=L?oQ+?P^TJ}vX=NRq8tpx8^(XQf#ca-1-ldV#soF+dCFcpK6}%4=#c!tQns<7hyD-B$r&F9aekxbzEknjSk+n6 zx0SqI@i6^#4E;2lvB5_lE~XF9V7yv7@6C!=pm%#@JMsay&+!0fC*z^$d)W_~S}?@O zM;y=iI+k(H4y=j($-5?@R~D<#oCD+6 z=Q;aHn|rNps}l>k=|TPRmA8;<_+FkH>xs2(b-&i8>7@ST$~wtG%=7ldVXRkaFT|kh z+sgSc>aoBkV^)HGjmQuDx`lBji97?Ho_>1ep@gd)+CL(aQX{T$WKZesnE22&4mW*p z3UuzLobm1M1Vc}*r`!jWJ50G=#n(7o^tEx6+h&#PoM@E0Z&O54Ow=`we$#q8Mn8Ow zqkwkGr`%?%+#P1Q?>9#zJxjSaDEBYQN#5R@DYpgRzzEtgd#*RA9f>(I_pOSDXve!~ zN3mxfKY!1zFvj?guxENjMn;E(M&(>5^f1OBrHyCM#zs3HQ2HtC1*{KaD`us_zGo&3xM6`L~!*$%^Q zdNeF7CmB4lFVm#+oeJp_hCR|*^oVJ1eTcmk$(Yg$`O1lmg1+dSSiU=oJv5Vg+)6!; zL+32$jK|(GXno^?%&nZap`vTahKgM1oWsw@+UCHLq>h)DTvKsHN$-lq(79K2nLasx z;h5cwlP^K1UF(wb5%MPdc$e7lCvUWsuYt~$^qbqqW^d|8A32YHnU8+yVM}#bW7RjT zF%~S3(c4Ad;HaTp5AmHfW-R^8pMIQgX7SAijXoC`6aQ=I?O44s@_L6tX1?Yd88>BY z$^6uxZt1bU>^HRVG}r`BtllOn#o-3eXM8iB{($^fKg(XO-i#?5@Pnb}tJPkoo;a0w zDC;kCeny!Ra?xvyDf`{7;zRybr&m|wogax_9B|Ia zKfu;h0G@HmRZRZu^cmNI8@RQMPxsxBTYM{UHnV>-lluhfB)F~%Pgo-O?gj3gu=YzP zh9xc;x3Ycls2AE7FLLD;j|68@$`#Y2Qx+u_k|&`anY!=h+~Q1N4aLVQ=VP6~IwsHW z$Soej^YO%gZy@%@-NH9{UX)v$C(msirkC=(nCA`hd{%DpaG?n}DLj8(Xp-j-=N9Mi zT=tsQl5@t(^DpH2W4XmQ3ml#o^8DXC-!9Le&Mm&3=R<+7@!ZGrk9fY%9_C?u{&ouS zubbh?Vb1M87Ns_hYNOI;uY~86FCZ4o9?nx#avoyFdf``x>5BFGJ>=h2Je&U-ZA^WP zXKl<_ED!%P*QlfMjGW=(H=Oiwu2B!;8M%mLUO8d6v~l2D=qSZ+HoMWpE9IUH30d-} zv~^gUCDpVuey`$c+PP<>tGH@4?VC*d^36fomi5G@2F^|d%kIO(y_i5fCPBBv*$Zu} z(q%3aJ|Rw@?8z-YPTqw*nti&9SUMA5$Srp8ymo@LTj=xx@}-C^l$E6!bE<;Q@%n+` zw(@&d=FSVFT+s`;^Cqm%oj1{wJ1;jRY}UOYQL~nXw41d(UY*0w!j#_R=MiYD!~Z*8 zQ%%Xlrf+T|&!apC`zpPeoPK_#npQJc-bs5r2n|2dPJUb0>4oG3l6uMe0_tVKlX$Q* zg?7qq*4jQ0FSuBQjRkWU8a1NTinF6BrV!_ zCh|A!tK8y7o{iUR#xwEdo#OtH1N2j9k#A+5zXSW#(jWb{Y#nmdmUoBr-}2s&IepZI z`=j00r*CmuR!y(`IQXBkH?(2`DhlZ2m8a@@*!_U3!53&_p;Hk7n8GQ8s zU)n%yD%n5uAU5#V#}?&Pw5go)qfL2-!qYS4#E>$ph>I+-lTX;~z20R%!6f?QWcuR) z;uB6--@aII>}Q?gVNd(wWx)FPJ@CaIHocS_NN4OJy(Es#LC)jIS!?m9`0ed?*g|S{ zX3{ULee?C$qE=2$+4Cp+{IJ2wWPe{H=QRH|kF!?j+6MMNXlmV@y{kn>+GRi3&U*HG zhLfAHey`lu?5t-!%r5t=>)Y~-^W1s$tP^K7u&!6sN%s>Er5-<%#7jzJ|4oVbT@vuS zuqG?;WN&}dBlz#|BkmhaEOGYVw&}_HY|cgqUe>Tq@qd7|tHX<3z7JHSr$_zZFM8eP z-g)#p?X?-ddA22bUR1@*d7oh4W$y~V?5>Q{?B|KEhl?uyNG*Al&awtPgma#atDfAs z#=ExV8?D>6J>w9QOJy ziB%c+2&#`4_0btK>y{SA>EE*dDwpr8oy4rWS9z0cG1F^$sQl;nhIvg{$Gyq=>u>kf z8JEk-c_y(Eh;wAbOPG&u+rixV#CZRTVdUn;R`%4BCwd>bOa-SarLQir{Tg<$-}X-B z^S`OQeV=1p?@snHu623g*?@*OUEZPaY{r%B8%$!opy*n?iEs8&KH+)Rohf^ivbRjv zyiWmh8NY5F`Z(^JKGXTZ>tpAg^NyV-`IKKJe{F2k5J!K0`NaDBJ-^Z$Z0*+YOSv8ryQ`fyhy7M1?43A< z4%xrp+~PBK4^upKk-dM>&JG2%6Tbxy~@o zY)RR6@S*^ICwEjCTh9#hCI-$TM6fn?gf@Ic6*;1{sGRxsF-f&{b8YNu6_r!=>XO7! zF{cOizVoi)cGPXV);7n_IFSv_F~rT+u)PKTW}9M6;XDOAsE3y=&{jiRw%qITj^`X& zCVIHx`0#VGU+`UYY-u-jPN^q$s_QFTo+XAuaQ{d-=+Bq4GUqRm+mrrm%;Ekma_b)- zG1PC1*n-S{H91btWQ851$B}$4r|Vjk9hOE**C3zIccvMcVj*E`v`loJ9eNS-BQ`;&mYQK z4{Oq8iv2(LO_n%&G0yhjUWHv*4{tMx!60pRY_#%?qMeS7W<;^v!X5 z!v~6Q`JOk>Lyi9Q1=KTB$r@2d&(M0-h#s~1hL(kT-{if(C*M|{)KT7#;Tid1)A3a_ zch}5s{Cwl*8$aK8crUrJgpPZlVZnEI88V%MoSj&qmA{2d%ew^RTccf)`TdS^xqS2C znvu@;kl_QPGri=1O#fhggw9&`PSIOQJ=N?(ajro}$QjvFi(2wHvhi{Ub-U=4&RN7cFm>mrS7v!XJ3q|ZZ~iA0&39&c^Ur7QdL}9+dOLe?e{X9W{U&Sbr->=P zN5xOqcIH0(9l1TO+U3vx&vjY8f7^z8zX}`fy}{OPNh-0(lOr8nGwpHFcBMs6WH06- z)t>VZq0_%(pWc&qu*MO~xmg!$90jb4Rx%#O@J!aw`tn@XMCCeoE&JEj_uxHdeZS?u?EkaA-)#K( z`ujl^PS3C}kN7)CuKaKZ1mo+Nce-Tcfllh^& zJ+W|nw;FNl4?m+7pWw`z8H3C`<9vkuIhn}CQh2chSTmesooyP`K%rM*KUy?q{h$V> zrH^$^VEnp#&{*fNYqf#mlii7~AIDj(8vmXTU9YK(T4-&+ruvBIS7vJZ2l$Y>zoIh4 zPb|4AcJRF40!<$$_Jv1fh}|i6+lM@ltkv`@@gW^}QDsP-4`RPH8+(DwI%`EXJ&ig) z4V_Zoy>@ab1nO+ncOP*!7Qm0Y&YN{UO`TtBRc9-f*C^`z0jy}7S{#UFpF zOZ?B)CFh)3mnLwOw8CM zD&_=uCbhz|pSrB3E_U!7!2Y%B^4srJOl`eQ-vq8-(=H5F8EQIP!ON zK~P;Ze0nbe|2dwuZkNa@|67+RyV)+O)a3|x`nAGiwSOIW&SS${bs5t~i>ZZ2e*~BG z1yja|>Hae^HY3n3N5PTM3WwG9Z-QfCP+bc16ZJWPcG+UIOX5%Ma_d9?TbI`D;-7YL z|J?`AO5xd`!Gm327Mh#weUE(e*zt9b{VUr$`FSb%OL}E(sylCKK(8F5{{L=8msS4<1NARLXJoBX z10O-JRG|A71HT#FH!4IM_$TNjjzqfj1=oPFPWIho+}?Anb2fX;#-NW9xzBuE@)??X zAT`iFd++CbbwH-4AivTlgZrq&bzcCTB5SXqI|#cBex87@C*bKm zc-lfNanWHyb3?t!*YEq7{r#8ty7wA%SAeggyB4;hyBWGQ_D-chw+_FOuY+H)@DSR% zv8J?uXL;~-PLwuq82Wl5yc-VhuMi&YV_k{%6`FQHi;Nw6i4ke>(D4gAJP$1eL9}24 zT3u+h^<}hsSxzc6}K7Kcu^s z!Mbam(4(z2dGs=LS$!|K-$`4`cxLJM;J$ZV5M7L``3K-pEq&rk=n^@TGoe!NhPY1p zGr(WUGtnalz#Go`pV7~OZ{ag=bav;x0zZyZ@4p55`H6*EaZ)Q>md@G)t})2U$|yD9 zPw?Qkni}u~c(%fW!ulKZt`+d>T*r$e9UIfEwR z(_1tJ%e9Pe(f$i#!Wqs`1&`^LetQm@E*{^)^wGeVzWs~vsr%Bvcp!bdu@!u4%y9$% zqA{mDLLUr#8FM7Zg5bCm{kGmRS2cCCj5Qy(f^UsAQ-J?4G9_~5Vm^V)rB4pr?<~vq z_M4*y(8mn`d!nc%IxN~Kp+WP7{z zBbEdBqriP+ph{l^p7njlI&Wm18-H3gI=4CkU4s2r{lw^O?>%>Bd!xu#nyrQRvbRwK zI0IOAJL|JIur|FXNzK8&%9lPEdi_}Ed$+5BA(>;HkMiGb_*my}`8V}Zm_8AG^dIWE z4t*%=0&;yA+SEEV;49?#?(8tVA7!34-jgeZcLgu10i_Eg^hVl1WWNHsKfea~<688j z=*CI*bp0o}LZ;T<;m+HFUu|+Leposu1h~7wR}RfGR~Hyz_5JmIeEZQKGrjV?z!dn4 zvo6z1v%2Z2#pK`u9(z9OgqGEn5e7Z4LW`99g74%TfhDvFJ=<1hnteS$ljmU-lchyR zyIRq8igs#17k=|9<9M{})4WuUIdfgP7P_x;h3Ey?mo)~TqCHK-S6M-wjt(4A<@!bq z_=Yk&IU_U%-Sm}FCf3vPNO;v#l-b{LM3wt1U}@;mN-g3*EiPY(gwgA8R*|KcG+6h+v*>c z)LUfzU1+k}`LXy+Z_2YV`j>;Wn7hDb=FW-lW%0N57%BLUaQ-b=e^~wdao`*JlXf%o zXL*dC9VA1I*xDc5Bl$wCxW;Bod6`ql{ymvjJP3@v*znVbkZVngkNy+=;veuzbWmx- zSZC>*;2boh|1xKq~n)r0TdLsd+oijRH-UDEX%d^XUQ3g3#JCayEQAZ zw~KxoT*TyOEg-?rGt#dwC3m+3!B74d>k87Jk(ndaTKVhvPJS928%^E54!G9Xcqy1^ zBh9&A@YvWt2#44PR@?6YhcPw=Y=hb^9rY)HFLEh;Tx^5jJ}NeW0Y5M{%DDK{59Szr z963#Bg~#ecZ-VDh#*WL`n}$7Pj#ZgqMw{FRK5Nc&sruM&HtX}-z?|tUIQ_^=a9_1# z?a$zO4B9Olxwf46j=-1kCAc0x>3iy9z^6XeJXYqg2V23n?3+cvAH!If_@RG*j7!~U z(}j#VUsI>O*QtzcJbSp*uHVixvFWZIs4_m|*?(&7`U0M9nW{40=l&}dqL1YM&@`3t z5#{KyThRQDv|nvN|~{d(*T1{3}?;sIH%&6}#EL#sIg1{U+6xuBg9XE3UjL zn{&b49r%aGC9~V>amt9!_y)LV*V@?I6s}853z7d$@WRp?m*Vx_9Fy0~t%@7JlW(OSJJ*KY&w|I#%=W3aBdsTIAJ&2jK=TDjPh;y1GR(K`y8tW%6W zma|r?z$Lu+C0!%9u5AVXJi10=`fLZj)Ir;7(!KLk7 zy#;L1|KcOFXdiRN8l26uCdN9yGjn) z_+G2cy`5#TtWC2JyOBLNWf3)9e~N=7y0#nd^uaFYt83K&fuju@>nyAa&-f4gSV>&! zQRo4&3#*r?jMXk|Rq7#qwHI}`;1~OuIS_3S>=*O4s)NsvVSb0YR!)lkBJ1>ln zso;A1jNrmP{UD<10Qbyy>rO8lStT*1D}Uop7d$EW<@WB4FmQd*3fJA>Y6RE5g(IsL zOi|w6LAWYM`;FWbtC>TG1N(UcSD5EO_lT-(+~Y5*X5VI26Z*h?yFa~fHTnpA$NHPN z-fo5K25=n**9rT`s^fPnZ)^}QcP@J@=!@dhILcXwhrq@7QC&~|ob%hltNsSQ(~J>& zpBYhAaI0A_ZGt(U-?xnTh^=s?1?shb;fSg=BbE0Q-&;H^$RTdM;6jJ(0N0)1dYrNO zL)|}M7I_I}EFRfwtn=~7;Ta$Ibmzt3D@(+0cAkI9WqBSS&l&tXlHa$#o# zeT%^3{xCpaK$kq!ingm%v!}=ap*zxiL6x|2$cQ8=kM|v z^cp$|f4ta85h~Cueg6?a8cb46J5q#=0Cg492TjJp$`1NuP*U98^)&u^`@0`$9#<=tE1 zvE~c!fybCHq?vM1yCP9{gU4zk(cvNVKZ!Xfax3=R+aoja^_lBzmi+!5I5*nkqYL+5 z;K$c(>@hQg+Fk4!3vRHzF7yVEd7@8(`-o*5tOSQ);|2KL@Oh&Cn*h&cEhv~LOYi<) zo>*gE5%!h%=Nen#vHW9h@W{CS)@7zmAojr-#=uVleP*@Q{{y%MFL@|0SvT=%2DkTn zt#DfHJpr8J_qN(Qh4W?(;9K*kpM{S+-C;9*jwh+ph9LNr@fY-N4)AMF`@2NrziDFb z(R4pQ<`hkg4~Bm?&!7G^a$nD0!XruHRpIobrv4+UYVP%?GX_`7IG7Tcb06&!UUjPH z#bf*<6Ra_QMAfHG&6~^jRvT8%yr83dLdR5NjOpe%&iHbS`+bZZ_0Rg#MZYim(&c^n zkjpE34EL{oI&slyd5&wxi@iH}j>Z3@5>eRVUi4jOQ}dcv1zUeP~R9o=It z*s#ri)ynH+43_o`(4{?*?ehRj;4}btpwMN&O7LV?XkL2|EcDk;H2oJ??*a>Z($Lqd zlT9081+f0lu>skO4Coq}178^=8=`A0f6Tk!xTs&nX?h9pEn8LS{YhU3uU8;@IRSkw zYq;%N!9R+=F2yGKEAVA);uY4wt_cm#_#10qs~4H;UbzMMet|y$d@?_gvCZno9nfJG zUTX}JIfbl!HG{7O9$Ne_u$kk7j0PiZUr@m&#Vj@R&m z$-Meg_$%uI$GA?UY#q8JCe<=BB_o=tXc)msMnz45?kr9!n7S>lQbJPH1eZSDA z_rh-)Wt7EErtBfgW>EGtWt%9Qe5)EDeuM4Ul=YOwM-JTfo)eTkPT8x1;JR-&eYWp1 zhvKZ*hoMH<5YIl!o~LXwWe)-OFmPSK6~B&*=f}#3pMek8(jmty*&kU={$XsLy*1<` zu3#MxduK29PB{Fwbj#1SFY*(-uDv{n-@#*5I{a?HPO$LGcyjG1*3Y|iA>Kc^hkKZ7 z7goDkZ5nLHNG{@D0a=o@3(+T5+X^mg3`hXie)1HvzoJ^JzfjlH&k*Ab7%$^foI%{E zqtx>=@QU31B3@v<66hncCic5lc&$G2s@S6BXzwkyrLxWy*O;c={Un{;xjS z2%W+9T4pPJ)_AZ7eCXXW!Ix4=u59|qO5g|2;jJ`#JfLHVa-)Yu5_C)n7!So7Ss3$5`X(G#A--e114WH|X1f4;RRX$thtH0IRt#vDl26t1Fd z<%YmK2pdY^J6geC1AN)DYRKj2R{{4Z(5 zsTErRo_<96;5NGzo*oX^22VVqc~b)X+z+3{##M7Jj4Nk6=pLRgVT?$5^uoT4jldN9 zO#0^S%sid9p&lOs^G9SGKeee}QcT%c0K7|% z`SinJ*|;kp8?uihrd8Wn`ton!xY(w!>(hX5`A;v>DZ%iOjTr&iko`wK>SWa+c+6P= zd}E&ovZ1~U%jk`4q#Q8Y2!loej$%oG8TXT}Jz`ve4$hzKF3q$qc z%t5h%%k~@Vxrv_h$af;`eE|8C=QW)BN*wuhrHvM#W;&H8Lla^~;D;rmyx8c2`L&Tvoj=1D6|IkFZ|2 z9y`q#6X{zm*g`4E#9XIO@5LtC1^(cEeP;prO0kiokJV!*EhtmoUP1lA_1XnrV2IQQ zUCFsTqmPOIuQbzyeHz&RXa(B^?1R8I^4- zx!Qy+HsXt|VD|)e6R?f>Hn1P6Ro=7EXZ3+fU|V+eZeW)J+tLlf6Rqe1Po8Q8I~Ldy zm(lR00XwrAA6O9V0{rlnO|Ti*Pg&_9pw_XErQ<@xkV z_8g65e_muts-BI%W%F6BDpj-TDfG9b2<2OjkLhFb$G9@D)bDMgPSElm-@h&}!BYet zV-7(7@XLIUXTRf_(T5qUpQM~2(`k17VApWN|NEO(b^JHydX4~hUqGi1o2q&L8mQyJ zfKGRD9zk*d7cw_lL_OvC0QR_x4@rI#SdW|d50`JK3OQ2Gc$cL#4|ys)iv8-VRO%7w z3$iC%?&Y63PV<#qpU>S?#r~1%aLz_tIkKa3e|ydkvHzV|J=Jn9qSqKRjzTZu_FYB! z9L`KU3BQ)=3Hr-i?`!Y!U6V|%9m+o)?#>fBb|E(fs)JtG7@@ZiC-$kjcEz8+cLaD2C8z2#KB!FcGw|Is%Izst z&KaTX8=I%9_RQ0&R$ZaKEg=6w3bAKhrAj{z%(sAf92j!OLe6R&@1lGSYnA@kpV7@- zXnXdNw`U)D3vgsFeX_xet;W9jQ8A2(uROU^f8~{y+duoX<=Rh=wK(X{d+aey4aELw zo9c3I{B>X?0yP;}9U-wQqN1y>q&dQB}{$XjU`a+k|SK|Md7;c?h-E=u$ zC+F$nUBpp4%X#58%9rF;PJ5i~^!#1y-wRQ>lZh!aiMTBH;8U5hysd7#%RDnDF-P{y zRU7uq)%e-?**9$Felz!*x!=sapL;*|e(wFoeF*=d8#&z@YsC`_%Ne56HWcTb-7i3rA@uQ zoVZfu#4Q_>#yQVv8H0w}eC$Z1`7o_~mpYg(i}+jE)oq&-9* z&-wB17ut2!AdGmY<2g${p0nh8@a68|jQJkUn6Kh&_$tnZui|X@BTu(2exz4d=cLcV zy!WnYTP!g_KB!M}?j5Lnk;rZ%u?meGXDw}uHF8ppyn=jVN4nzE=(kOeKeAi-rx4G4KR(_A!eCILt$HsXw8ze_-XV2C0-5K+{ zS6hA82);~sKY{OF4t!TwD|!1mdmQqet($SZw$*o5EZX1j9e&AXFTd3(k$N&YBc7w3 zjCLHMHfF(J`q0jfkGd9Bb2f4F$z2~R+%|BLz|M>r&yWHSn)CQNAe6O zDfMmmyQ@}`3%co0-D4}Kq;_@I8g=UCNvSdG_}*Rx_dam1Qh^+!%B=I= zwPu|cfom=B3)M9SZk_x6;I8bToXk~`pKhMog=U?{1>xNcUc>hqg!ce= z#r{Fx>kojt(ZFppaAyW^uMglJ39i3_yEK41pZjCrR^YBoP)^nr&3dOq8~jcV!d(jP zmR2%-0^BX&ZUFahz%9PWBzvrhn=?z&ri%l(dxC47;5PD@CU^#LFZ{NHdu=!6G;Bxe zt&v+$+FA?3T?B5!#to{swDo~NTW5g#fPp*Az+D@t_mlwcC~*A++-45d1W#w~C09%Y zxO=1owf9;RcVpTG8P5iH>%N7L(d=8acNcJ5eXBC4Z`~BY-SoMC1^TqEFu?Ou+)K_< z8@Lx-p`4Y_W$ce3FS*ovYY^_s!7X-DupW^Z&*G9R4%uZvc$;_pOgn;C`s};lm3d>5{o-~!xyJ0X&w)o|iZP}xC9R*n zj{8IKG8|rpzo(pHOG=$nQrZ}GzAp&(4sc5@XN#9&JD;b{vKL@Ic$4f2O)l(Be}Ao5 z+Tqmw&=fta>Z(x^LtJuT#d-FDPkc@Z-N=E8Po@$WM}Se!`NK@wqZ~NC8`VJRW4>(0 zi^4YMyq9lp4Wi{0Xt`v&!Ut*B1;9CO@S$Ck*ucRw)kY4h3JaoXGc?6Qk5wPnM8J%VU@;u38myU+O3dw+Z064AE4(f^u$5WD!bWkrwn@NAJB3oa5g&0 z8N#`{`q9W=AcnthtjmZ8>fpWDV`2;K+NR2nGOsh^`L}6GzER~LV?A2hEsk<>cK>N? zP?>*?cSL)W$oKj}vQ|EYxLp(3!zH%n2gC%MkUG{G8M$@k!UsZ~Vs{@_$~TQNrMw?Z zjIe2T<$H*G;zrc1SkqQNjV)Zv{SxkrhzWK#~LDY>D3%(&Wlg`Q)D4)<`U|g!Znd@mcM-n%HftG+Wcslm#n^>(KQ04J!ZcOttYT zm9T{TfSx)nWLwuTSIbx0JulRwH%iERDs5j9O$?l?Remgag~u;YvunC5!_Mc-uX8B( zuE2egGUeUD^F0gIY&UT&>>)0v%n4+^QQ}s!>#tDxq1{}AHgoOfdU2G?>5gKa!M)<% z-A-cWv}H!eKlw)a)SwvWyZ+a>$OF59Q&vLbYSN~qd_-MMp6h^ytdoocWD zW^w&(;K{F@+BhWj$?IojuUj)~x|;mLRT1j-RLXt5`0Q=t$z`}Enb<%{@7$I|3=!!E z?BV#`e5qOA>U^6rDcyT*u`>$AZ> zaoyTkZr&wp>h;F9oblkhOX5H4-&h0uLpHT7EY#H^?J9ATq+KOeQp#m2Uz2te{uA3p z+A2!gxs>*aH}A#H7Cjcv^Ca4}hS)37fp!(0TteAop4n*E@xZAeZp+otE@yHy^2R$C z_sQ+0UAq|V+ChbE>jF=o=U2^K6MNbD7P6c~-+qF5<~z*mZT2qP3Pas_1@=J671bEE%fBHAPa#LVMhj}^1el5wS$X2O>!Q- zt7kTI5Yc_<5+9Ac$WLV{=XusA2HxghA^Q70)_d9$FQh^1nv=-0e&`%@q@j;uiEsZZ zxkmm$8R_R%{^R@b6}toZk7ow1OZiUx_lwZ4f9cTM$Z>KA-%XK+oZkyHezKR z!Pg}H+19qH=CI$$JFrf3IaeX~F8WkRoEpSFeB*tl-=8ma7=}OU1bL-P?CqOgqWw!G zuXL=bUn}`W_)op^_I<{jc!JCK<2}gNl);1Kx*z^aVzfJl(vKAKDzYQ_n3wU)&$9wz zce#1?JUlv&Ep@nmX7NY&s$$8@v6uUO+)tdMioeAN+sJ(r_c;?)@dww56xD^ z*HYdZBcndXzWHg4#5Vnay|vSkA?lR_PX|#}d=nFCi|mFry69I+cK2YLO8;6BtMu;B zX^(I@OW;l6A%A|T>b7k^zLd=&^kMGJIe#b58uBj4_k(EDLxZsgk!Q6x6TJ}8lpMzX zlIT%Yd+@8ch|wqhkpmH`s)3vlhw%lgFtxFMA#<1|rXC6IE0#~h0nLvh2hY=2x&eD2 z`$J8eu#4xx&s2GD_M;N>#?W!5ud18pdHT#hs#N*ksEeI`vdY%J=@2pcj%y~Zd$fcm zk-aVY^D9L^Y?qIaR&Z0!`nE*~JoTB6}6s9((7L#e7J>d^%K?3eXP zE*@DQuA^)t?;G)hjz>q=FrG=?@^K$BFXXxKqz&{h2o?EAHS&%V^UBE0y-R%TjNy-g zTl^^dkSRNKp;vZFpXvD`eFS-$M0t6?8lKdD=}&)(xQaF8I{x#1@yEn_zTf~{?xZjO z_WX*!^SoeznJ0W2_iuCW+8S%<+#9%;zGeLIv1XzN%os3#t-2*S5CdjPC%tWt&U#dG zEGg|e8a~_Tnpi#36{Ck2#OhPf72*?2rw@rAw=*f*y5Q@+*A}A>BPL`g;vmmD(%H-n z0I$Ul+_k2I{uML}{oO+F83p-#+u-vpiCr)xDb9U;(^cVBCz-GDe#0qbH|ealp(OV4 zAtkX-@cSdbCH$V`x0K&g{FV(_RiZYmD$)4a_}Te|@C)6bsxo~gSuxI%qF8c&baa-i z>FAsk8&&*3uQ+E(zo_DpqE61k_|FfX3#pns#^x&-XY>93c!;;)VViH_AGya@S%R;! z1YhN5%5BEazIh)0%z)2*57#AO;m(rB_=QC{OLj*WpSVmbe~o(HRn%5@*|W~I8R)7y zyfC7ltR)~v>?7~&`2+l0O_`LMwt7DP&hWji(@ze>2Yzj|cky0zx<1x^_VCm8w;mX% zoZsWG`@&-@{$XK={_bo36;bf_06&={OS>1Y7GGt8XL472)wDF$Et2p(HpUpw9^Jvb z0J%?6%VTlwyY`Q0B{eRrPkWZu_<@60(7Iqs6hua@B1 zE8n%4-%V-t-9El6MOP;Boy>m?dfnn9P4Ijn-<>hP8`J8$V|=$7-PeZi-ZbVqah`@P z=64^+ceYpq#x1SBJ1%tc-Faf{Rf11TZl}vy)ga__3_N=P{>hwQ=K2lztslyZEWVd# zqNnp%<76GN`k^fyWL{idicj{THIc>1(c(0q zFJnjGhyBZYrVkfAV4R^4U9d*pFT_W?5Fc%}!bjV-YT)DIqZM1Ai{Ya^jqmis_f0rI z*hBPA`{cSaV{n3}U#M1&4-Edrd$iTmiFRKEAIvcz!L$1lWvmI*Ge@)9T67?NTYm>$ z9GDQI@3Dn7)&E}QH`zJou~yFb*q!JQV0Q4NEHHhf&BOuv7k;Rw9OY{&iLRRQ6OJyP zPd`=Vk~b_E$9ZswT&w}d?oBtn?m77=-J&OWa7CNAM0QeYP5*1R zAYAhJf9kPLYnNAkFG3HZJTD*EnPV)$;2b$S#7r2PM-$h zx#kjhPJpL@`ba!Y!6W)j>azzt1?WMcn|80()U^hGyg~31F9FYL_Y74IkI7 zL9~TIoA`X9p=~_0)dTB*L0gokiM^z?zynP0JA^$^PDgLf2g6R8ZJ9|!m(+>Jd7@LH?V+MV8 zkL-0_4gZz`?>O|$g1+<6H@`v^qqhzIH8cz~+H_bDeJ?_vvA-^eK55gV&?o)575=~ypy1>8T#&9tBOrskL(qh{p*LzF7)F&pwHOT9z@?hVD4o+C`DE{ zTv@&sx!+?WHzInY(C}}^dwwhX2+&REKjSPkZL`|&*~fdLps^i3=2;z;Q~I>XRP9<5 z@4tfZ4g#;SMiPWq`gIF<8>mMc@U|Fu$$=|6-&iAw_uLS`TMu4C4+rob-054>&K`Z>6sEi@$?&pMf)Y?IPZ@|4(MyE(Qm- zTXkWeuFr7amb%XDuAHnznr&NZ;w=cmTMOP3t?DZF!U?G>Hp8>vJz?M_2Om6c2-Nk1 z0N$zK!H%xZOqF$!c+c;-Zv);LR~c(SW__7ch%U|w!n+o{t=rbcO9B+o}NG z9Ps=!-csi~xtH~ld-^D+X@j93HL+XcJeLRIT?AfZ%`Hf##0EP6-c0b`4c-GreZ!3U znrm+Ho+Saiy}^S`Uu~{?#e1CGhk|!f|KRpD@rDKAz32aE-@!lAzB2=O+k+>#eY=46I@~k8sl5NiECpJu1?@; zEjPhB;qax8ZWT${iZtP?)s-p~nqHPH!X9SddN66aYSg!dG_pI_1m+rTS2p@ebE z(7k~=o~tnBbQO3Eoe=1sFLNJ)+)O;EUC;}S=341PL3sZS-qt!_#&gm6q8B!RS9E@f z0x#_+^Cr>zd%!EUyYO*!ty!O2wo=e z#5Zl(Q1a~$LLcxt8}Q-`ct|{j5dSx^6u?Wr2--el}m> zeA~I%&}s>cd&Gj#+kBV>^9wp>l4=kABqNp;zBOggR3r zKUrCXPpRzMiF03BVTbll^%jmE}VQ=q4>}yLKjZl zI-zk}cACDbZ?tz2zMzRQYQw}Bji3AalG~M6QC{YqspQYfR4%WJTqF%0H81Ny#rI^5 zcK*e#28vzM;3{xP&MY~vnN`@)$Y;^Nx2=2#^cRzVUMx<})|oqYvdjj2t7#iugq|==u?Vi?sErdlf#|frI4wHP%VyrTSMqNL+6#ceC&+ zj`fmfzs&JA+KL<%woWA#434 zIfXvop19QDy)1BD%5@^wGl2gDd2;c+=cTgew~+f})myi*elpYW+jhnW+~p!4@Jp-k z0Yk6E;ckHM1^Af!X}03u^KI|-{uS>$J=|9rss{WEUY+Qp&fynqK9iPJyp{XeT+5pN ziQ}2)zP=`B)2N}U6|!Ixd+=$n?| z_z2oFp|KDe>yItSlYWv+KE}gb*S};dZca^hyvy3ejg*;8nM&vy$Mt;j+HIA*jhqv$ zPEB*Xwfl0%FktN`F4-jFlF_%DANh9VrhiaIcr)qilyU1LhB!WehkdETb?>YmcMEW4 z05c1mtKiQ~eQfQTQ-?Zk0`KLl4@^Dl&#>SLUV+)fx9Q~kxt#oYA>_|{o%XBmug+=s zJJzgGdd2*86{5Q)_$Tdpa7MS$CvEnel~J8@hS8>@ueO!5U%dGkG|q&^`u?tS_mbbP z8rrFFo&4_~EheV4a1Z{jS0J(ue;V{B^^A75;vg z!hd-y{8wL$|B6fC|4Ck;waCTUk-)y7i9JktiRYW(_9{hA@ zC6jYW_CeR!I+CMatFpV*j)`Z7?^=Y6e$V>gdiJ2mo&?!fQGhKc`zmD2xQBOs#ol>x zRY@N3DcmQqKSA<^$^BIBWxs;t{*wDWcdwh2A9wG`!6cri}ID{{prDUG_Vd$%$$t^PvBO@a#o#k#NbK~ zrZ0tZpR*_Br*ha^ohg@m)}Jo9roR92VqEQc=lao~{ub}zTD^-9_-Fj-!k-QD{>;VS zDtS+C&(*vW9&F>^SZ55ZH@40v{(EwIzrH2aI1BOz$tS)bRX>%j>0vKi$RRFgNs`DR z4xgKUZ4U8g$3$06Fmi}@G;)ZSa3a);MM>4iov@gBOI{ZZr)pA^U;eu#b$ zk?h{t9bAWr3+wN$e1hMftvRDyc0Ibru1AC@U*lFymoZc5>P=qn+l=cF^4*12C7li9 z7haV#40~m6B+sI%I^7jr6&cdz^t2+ydZgW%1dNg`cGe_AoFz{w-zo7|mykPrtLB_O zzg^YRPO5l&q05;|jBLhQBk%WYu7Aq=orYYqx5tglpSsGlku(1U@1HWy^sv9kcSQ*P z??7&dXR?&<0q}e>T;@0z@_)C^{r%5n?8TdK#JWW4L5R*%(4+v44lE|q^z7H9pLl%+}f8qgt1q^$T?DL*uIv`|6KhZ{+0Fn zMCkmP`n~rH_50^9)bGt-SwE?>)K8;s$ySb$4U%J|_NDa|W{wfRJ!VItw4r-2ZD{6k zchUYyw7u|Da_mw@7o8uR-<^E5Woc=#>+C9`QBvS z+9}-S+idI7bO;^%y**O@Av;pXsaNJ>OlJ*V|Cl%>M}Dg^nzj;Wi#6Ao@Un7tSN)n> zn7=a*Y~h>J)bU65&-k*#b-%xT6+XE#SqH8yy~?nSlKg$E&H!)x`My<2{%fnopO;@h ze*O8S^BX{JPqksF{MMEZDfv!&%YT*T{h^D0MJ9dvy8B#J4QZLa@%C;_1rxP=-JZDZ zh6QTJ7XR>FF8X(4_e>vqN{#WhBrx8}-aGh_KaBc~S0PR6HZ6b5LZuHk?n9gE-&Dr^ zjmABD)0@rvRrW+>pJ(sr);x z;2yt;_-=^Zl0T+Y(*>4{x6;>!vJN8jG+mYHlfC80q<(ItRxV{y{;l$7eKyMZ6l)m?vsb9{4?-GUN!2W z&-PBOtH_%=;iWnF6Ux@`v)~LX?4oD6$sJD~+^~6}qeJIaRn(`2>D%W1v*Jba5=&m` zvUz{0hylkCa%Mdi+ASxpCv%^hM>{8+BR4m`ktd1aSpYsO4{*EsY%gnmWu>ecH?B_5 z>)FS!ll;Hg=O^z9<=gvcSD{ztxI^-Y@JuP9pDn zY~7mbbG7`H_RiaGTBvrMp-p?88@`J;G%s3l3@58lKA;#pFIJ|5NNpDci!nj?I)+eO3N#JiCKud$_OZr}A^J z@ zpX4r(`KtIbMAx*7%kqU)ug|+TKFcTb=8>0W`TD7LOYX2|`R)tN@_nmCELjklC26L)*(5M^{|x}AuqNNl_B*!%iMV`bLYxK+1_d7kiMB5(tBz1#rOdp zZq9VJQ)!Oqxt@v%lGi%2yW^{HEn~)kQO=o1MmcZcTISTT$H>n-pW}MuFrPVG%ee3O zC};I8S_Zz~vijOo{AMA&8eQc4hSvJEq533fn2-FuKz*n3{pG*O_O2^c11c$R?9-`7 zUhh=sqd3pX&aB4=WH1{U{6jzn6*92|85H@OQL1(Ypj8mDSRY08+p`eqv3aC`Rda` zb@o1%o#}2XKe*PeXJ#kjrw%v9_=BvyU#_XRGZn=8cKe^+h&`a6AN~xvj++Xyw0v@E zejCB_8#=FAxy2r{M9!kh_>@=n_{uwvJhDsnt^S9;*MLpXO~oxaiS6pNkG`yu3;%8!Usj6bWf=0cgt7Q7l0 zp4bi}fhX;g@=xGxzED=+jiJ2kuQ1^K)1Q6_`pz8YoQ6&2&g|L1Uc6mkVh1K4_NR-E z-a((S`iMr{39&QA918koY(&*C`KJ5GD)&KudLQOMiMxW{19M0Krfa7O^HX42x<9kd zpTBZPPmGU_wt7_`}=?_!qEw%oQ^)V(7Pf(8@ytnvLPu>00BlRun8Ym%-=0sF=4&ZT3;%8(LbOyP)2AyxAOw6?sxp@UkV-HfQK>`p6@AR@bAC=^n>6@ z{0Ka$7w9}H@8O4wIL0^dUTkQw&&5tZgkH6AhGX&j_`Ba6T_tCxlj%o_ek69bvMb*K z#{9GBR@o<`+G_a+(N$qQ52x>Sqc1*)juKn^5O%xRkr&Y;I!Wpz`=~l};+!q?WL%4#Fvql0YVa@Vj1i6K6S2!{vCHv8)8{gM zivqUF=73$kIbfHYHV1a$adRB_SjGjh8w<_*t=yN;_bQiP7$?M5F>M-bSH^@-0^`I1 z>MM4s8jSsd4|F$rLu}9jY|zi}5$={XVR`QYmixjuu}ti+t;FqZFzv7t=!Y-k#Q#9M z{m7nM+NPWAPYc-YhYTLsJQ}*C9Xt~K)53hNWwhuX_Wz*wo6$XD^MvvKADz{}nT)@; zVl%P^*Ze+q{ee+xfQ&mMM`e3^gtgUStGh}}%81R(v1Lvr`V2d;&dq%D{gJGV zqaWA7qtaxFTM_S>34e|ui?4_*_7+);ZW386(mFFw&h(9hFR|DwB9|j*ljeXdCb51e zKG~!wb3XKu@B;c>Uz&9ny*d>7-8Y-}Kk;CZ#T)!F$l^D`8_o>YkTcuj&Dj8NYB>M6 zh&j@7#*)n<$JiVTyK`^Xbdl?t-YS3jLXpM)N8FpoM^$7E|8={wHv|$w0s*tKNL)}1 z2`vJhgiWHXai4)C>_k9tT!N5=04@>Cg(ymVAOQus6^ROJR3r%~D$W>TMjf3Qvap9G zAOg*j{(aBwZi&pi&-=W8{NDGEeA4&csybDtPMxhzow67@ONFd8Xfc+&Gcxx{9y-LA zxmswj9$NI`?pJVE!FXnayWPhUm>$% z4!iF~7k#K2*>MCqJ^~#N!ADij{2YUhg&)L1>l0{8Y|%5U583CHJ>tK_r(VqxJM3R$ ztv-8I@(E z*1ZyWe$m#T*I6^NPG1<&EW}J0Qx$BOcf;&l)~v!1g!Bb%WrDd#A-V6MJ$Nuw;Bw(a(pWpT~|$tNK2T zdsT*}?TBC4vn=zZ%If(y>wjTSbPT%a&owbokHzsll}(3M=@sB_f_~@Wj(e|Cbmu%`}*Ip_ZJGh zJJ_#%I;dY%SM0FD$tw9d;KZiMUO&9nv(KOD=c5mx9U0fxjKO4c=TeeBa9(FTxxPxT zJTk$sjWgNfI19~{&`w}>cU|bS7rBv+L8FJk^@zrs^dsPXEjrhM4xDXGB)$v0%N~F6 zZrADK@_|bOL4gKW5 z=)JObG<+Fy#vyZkfc_A1-3xkUSbw@(CI2ZQ!x~mVuE2EmYSwU$5cRS7fN6MRtL``*2MN#SAT(}xL;d*?SbpN=`EDGojcNnFATx|U5?yDmQ)Il zc=4q)=RH|!o2+B;H)TOT+0c)?&vZOst-eq7x3H(408WbwRqiZDgmojjOQW0%7Jc&( z3wL7JoZAI{bh`kW>K3m)jzlros_9PN1rI;?bDw;eNyLKiT4VeM*0;0 z`#$Ad*QfFZ?i`c;8#)l@kFam%e@v_zc8%Az5##Xfd082YEO9BlKJ9 zPhK{{I{8so;u5L9%wJz@yH@`XQXe0fgZd5Tf_-sPmuG3`kJP`9IF@X`k=E=ySEBHS z$$kO)`nL74W7Ca3baT8$8;i}#IJYT&l6$Fti26murpbMtnYE$%+q+z=hr*i*U*xXr zB`PV4`xwO^gAb-|){po`l$9FRy-_2u-J}z5Kf6w5X$)b<h_*q3?eh&RK0@m!7As+iS=x zVX{>X4zlGQPBT@l4N|$gndkN$H;&iM@oQI5W_Qi4`g`~RZiCnTN`2x4TQuTIWbRDp zDq{Cf3`)J4$vg}S$cx%w&W*YpkDmtG!;jeVgUXH)|6r}BtSgYR%z1rKew10|Mzv7( zG0IM69miuk<+FA_T#-H8m-^-u2@Ll**%+IdGxwO0BPoD1{d-YAJ&$=&v z+?7}eE*igde{ahhUiXyo@`ma?uEY(r_0u1J-_}Y`IrT?ZqU2Oh{n*nM>%CaM!Gp@H zT#09}X|CWe3C1td)!cn=U)QizE-kpZ{v+bHG^SU)5rVhnJOu^0lR<2lczu_kd zcdUdz%9(bdd!@P-n?hWxqw!UjKdLfb#$LOC+_(hoh~J|j$mX1Amh(3F&d>obV2f`T z{{%9@Rupwnau$fc#6~@GpC8-~TMd6<0cYKp z%(~^HO~g))q`cei>+aZDOU#)`CH<wu&NbSQbZ+Vk$d#F0txnwG5k1f#6Z`xt-ZyuU3u=j>SPUO$y| zlKw9*R{a%waobH@`knY2Gz>24(Y+g=QOH`YG&?TU*~B~1=fuuv9$ORY=1F23!yJbx zHwC;+VT>o^hgxSF^Q8J6r>?s#)o&Q{Bz^k}^K>ioq-37reZ-emykb_|M}wHBe^LJU z18zK|G<4N7WXzxVCw2bh0b{Pdc^;Vf7~O4#_xlpK-%)2X{fnl5u_s*_olka1K1=`R zo29IKUO%JUO!_yI{^RnmABVlCr1amQC&!Fd;Ly)Ba?}BJ)oJJ1F^eAZf&%M z>w8#VM~leQ&Df8oDd&-0TJEu8vvr*^H-FU=KR4wbO$pbRYqs3;lg;{yK%4dC`&#a) z9Lkt!3mdqQGPluIh{=|FD2+Vol2TmVUNekEmSp#mN`MRLGw5k{W#2zxg=OVx6BEM#zNvnDrS@$Bc4qL~uk~Y2a z?l3f;x;R`1kVj=oxcA@WL)6Y$@}j_wk7yQrV|5R zl^JI$oyxo}?e3p64R|@o)pX?QH~&bhlJ#gRXa9h`ta|8dIeQu#*pHY%ogc~RP0)VJ zeSQVw&zZt?Vj#k{`>A;fJ6d=qcev?`o+TE*NH zo1ZJ=GI8ayzvnM`1{R}h*t$rZOQCltzYkvT^>EY ziSHsO>nmJ|cKVpTv_isGkZ9QCx z7QWXm_p}Xtdv)ero-$q;TmGUe@h`yg`V(5Q5#+qnL#yy7(9g9VJoW@1_kxe*;A06q zuYqqjmUq)bu{$PVbJ+HiOCG*4^D)(5*4`NOx^eui1>ZM}8oHx)Lw8+6rxYH#-4xlc z;lHq>C#LOKj|~{hK3pb$pT=I}trdSKzbSKZ3^=#p3-W7q(+s}mjLA=?=N92}ZUNqH ztd-Nm986uDp6epdfs336GZv)hPFa?oJMa6kR^P`|Vke}zA z1?h`27pE`ETb91a<>xmi+9znv0sr7R>ul=kJo>+Y{-37*hv@&i(7f1YnR{Is_!UaN z#Qq9k&!L_%;0Nv>R$<%m9C5<+(^ZB)`%UPWb#YnBz}b0hX2ILbK}k^(!#lqXp0=AJ z`rQw#Nx)jDCa+z>UySAGKHrXWqF$hl2G))rxj9m^!r6~D>%z;P?XocHodMIMsspD* zO`DTARE!kNShDuTj6Lh`VQLo z%R1V@eyGfXk7mI~Um+eqXyMCUn!YEmqU;jD(W;M2GkldL_Y@A)Z-M75C&nIsM@cpQ$+dj* zWj>l|V?nN}`jve84^ZzSZCEMWm2(S^@SNFX)hAFkpZp$9*4gVdyY33-p157L-SyeC zI_nD)!u6#!yYCYJSgqh4pON@smeqWI*QcG;mW_c0gPyJV;;xgd@0V)!+_k3W%e$T( zqPDED6bzb){ndm|NpLN7rQQ_YWs>Kl5guX|{PQiEoFUQV42dRZNN@P~+&I>ersdS* zJDq=PdhR3>zlmLc?9TMuXnxy>MV&W1J$DGd%lSQPJY^`a0#(M8iRroP&{H${J$qI< z>kFNg-*YeK@1KE=dsZ_SPxlKgZupZWH^qlDA5U9y$8z?giT88-%*Az!EVP!K7 zyPC`aj?^v^Q$w5&a8i)hg)V#n;pw>tXt(B)D`PZmOpD}M1?Qyj9LShBixejBXY``K zT5wK-)0NSO_tJ;keFKZ7AFaU4@rx>+-E)tMQ@ z#cTy9SIoYSrW@3@Z$nh#4ESQS)*+`JAGE|iNi1*{d~pbNL_rAe*l%Hy<;miZBS_tNMm=z4zG zbXzX@CCwqG;hk8O#NJGu#59P#+*m`L0`|%6F{aXQSXW|)J&3LKDSqvy4Q_hRB9D|^ zXHN!y*c5YkvFxv1p4`cPaD(j4bZ*Z4sx{*fa;}1YuA|%t^8FXasQ%O86|E{*pSf|o zbu<2i=kO;SFG#COU9`C@4ZnarNhN*fZ>wtg=Ed=K-@HA4gcg$CBX4tA!@}FjmhgS> zmF!iY=Rce7i7Bako|uxaY^pzd8kHZTzpX)k8}3Z2%7Gu{z>mBz7Bjxof-buFCd4Q4 z%|hP^e_r@j*$Vs?8?Vma|1ExtR{HP{VoIL3bhjMw4NN~1Z7R)S{OGB5*;)7!JpSfp z-cLjJ3%^XQ_4=WG^+UYB6TH4B^t^z%Hu>i?oO1m(5B0yeexs+^(Ai_iPdjC!O@TQn zlsnJ6&v?#RDYR`d-pL$BlP4vGJ^7dTUO+6&7RI@pan50ka~Pw{UF5_7Zz9pBi{{ z@4akoXUpAshwA_4ZSM6E!+wl+o&QRCVpS@=F+&>;8hU!&Z+d!@SeedA;p1Ixqy_oOIn5$Z`U1UAMD|&$oc&?$>KaL&R)=ssEoeJIx zOcujV&H0S{GOQE9v!Oc(zWMuDrHafPzsx7qc_VQ`>BN_%n*EB~X_n%9RlB$FiDcln ztduZ9Z-0EipVxSK z#tZO_7rLqb#J>GTi}zektD3=jn!$S72n{ZS1`VE}y8gy9mP3at;1OG~({{r%&cZY9 z&f8el6PxeT0AI^6e3=KMOr;Y&c-U_0-tRVWaTc5XOKkQVy*>p47pnNVS^Yk`5nO!5 zoKB?eH&_=-SQlPhO6*RtE%)TVA->f*uRZ#QMHOXYqox+PZPGJWrW1Qao^aRv{i36a zZ50aK(by6zuq7(cd%o_Fg6s*%N#Q>5qh_CkgXW+FeS?2eli8Ph=`9IUx~TpJKg;Hf z4*I#w>k{;G(TTS*rmn256}~Cx1wJ_y735~@qLL4p0}|YA`6dMN{T&BvkdSeRx7k*GC{6DVN z9ak6tA8CT0oTR?A9aGzyA-0+9!-{=&<|VDP9dl{G-SYcy$N4sudiCf~N1q9>ze7Kc zi!W_6@ki*R!ece$UK)7$#|gvsulxyr`+^g$#9{DoFAwy_KH>|g+k!kYdFX94@s1*= zwnAe?v#J>3m&>V%3jdp^e2V>9A&SnkUp*Fn+^K@fcbfa`FRXDj{yfiV_gVy;$3eO z7gd%uwpnlen4jIybZ>aF&_~k-RrLqYSkXhOWV{d4w#;+f;%j3yGuE|?H3pdP0dr*= znqXf5nD3RDI0q@T(0kDb2A=x@>oDVy_^Cq590q@JHjRDnfCPibu?|k&U@Cn8c+zil z=Y+!8`h`ceruG6t~)blP9VSSOnwi6B3?vm9TW?Pp{Erg949U$L3=&w01>?~kQOlHj?G&Hna= ziU9qbg}k!ZO^nKpy+s-5&zI+X1^01uNUiK0qw?6 zSI(0@gda+H(rwf&M+X?XVS@Oo$A4k+P4K(Lh`X;mOTX^FU*bqud+>JIlWSp~m0!xm zXw}hZU&r?!OYB83?MqDJPE%NO1Gd1zYCm8?5RjMl9-{zF_ zAHP74vDhnjAnUS~C!aC(qxQEmA6*^4e(GBNaih&X z$=sz`J>cG7I5QC0Z6;6gm`TK!g*0cbz>Wn65Atp}`x6t`XWYb|!$D$n-tbdS>BkTB zKcBN%a^~X~)`Z+|3ZCjZgQscqUGfCh(Es+uuGQ0dE@zw#oHe_5t!p)L1ucR2Hn@{E zU=H7qStaR=`!4F=%)CvyLCrtOS;5&AChLp-Ayy}{_~(iV)^33+`9M!o)sr&?zr>Sb z-(7$wp<|VttGP*cJ|1L;-ahjM|Pi~RX+{&+*1zCMPr|eJ#zv)7qYiryh1CL zzHA}ZYs-5oIhy!@cYCE)4Ka1eNu}IJy-ZaSuPJ!}3$cBikB_oTUeZ$V^Az>YaZX6^ z_y~A>`iB(ek$hv=UFTWjt)lb#3;jhIFn2?L@B@7gFs03%oJAG-W4)HxptUX?l@q^i z$sT??w<_nkM{Rc3gXq-n^S8m*y3W+Cx%`C6ApWAH3-@sSLj3ph{JvA>;1`P>T$H2} zza#M$=O_E>&CG#}$L#|PcYO0-uGOoUlYE(z*JMt}slgga65O+{Uashv)F5()cei`q z{kpMB5B0^d3r zee&g7HDlPWY{@6sQ(+&#`OX>kw!T-%&}pTU{T1*2&81J^K}FDD(O6V_d^lMRO-m^++v) zTm)wV!q%-JS2;P${hAZ>WovB5p4s0@T&Kil)uYePfbYnC7+28Y8d$rsS81_9gE`iV zPb8CHj(C%GTBqjf8?}tARN1%e<@l_q>&06uw#r>AH2Y$6RB>Fma(-r3VZvL4 zkG$$X&idnF|K#+DROgXjwD)GvW&}KY`h72-z1-`8KF4cqRgW&(Q?~qS%KlU4_6cL- zGpu<}L`}daU72=aWNs_>HmCkF5xbl`Z?Z-4lqhHSvdEXGkYqz z7l?^EM&6mfXq_$O9Iujnlz;GhCHu+i%xYeJlR0Y=<@~;fKH@*G z+>`e~(8{Vua;KWZEe+crK~MF~xp&{v$RR2$r@s2$1v%S^)oemrMqlZ{W;r{ zJRsGXq=r?^Mi-b}YMhfQ8O-|mG0m)-c(;C~N*a#LsV*3-cg3HMPEjH{MPyIpLbRG+ z|Gdhun<6YLOyQPxeQeH~v|!5`EpqP|))lsW$@jE%5nTOH%NYcCn?H9%cLz`Kw|!3L z??Mi1YdW!1;7IO;ILw??N=yLre*~TG&!5?<^s7Uwe3idtcQ2dsud2PJ@hw|bk;&IG z*c@UhY#3{8DpFOeRmbALnoX9ht}5y4jVbmUwV=K0BA#pB!2bObY(Z?pl3<~Kb6A4# zqB8C7+&#pTkYBax5Pbgd5Y_~8?=tkU);TiQWhU2tkvVrPa_2E{_BuFazfBJzhCAra zRA(q?o%E z%h=8`&aRA2`n3UF^ztg3vpan8ucmH$U*?RIY( z*5{>1LhYwn!*YJU{E#c7m2rsuH;*!Xz}3UdW5aaep^=UgohH{n|$?4JJCmHK6(W8Sr4*CWKBrjyZH7#eGxgCfsA|>dXRhb$~$No zE@Wf`?++p;q5ERdW1lHmz2+%sTy(c`W2yNig{_U)jmo^GKXPtyLjB~4P zXyZk*(1u%fKIf?`G|_-QWkPPwfi8@*P9xBPJ!hSy4b4LzYbd*FlF&ydhXxML7DFHC zp0hb0{>dz5KhD^;K+h8Qor(XWg)wRHhohA9$EFj#x}oAG{X}1jUFhT#H1g*v?&9l~ zZZ8PROq7_`ViW{=B`XN=)>Y@pp7-#+t3Gb%2CkA;M4v|#ATGcG%l^` z+f%N@v&in1r(E0a^;6#+W*=&&rkXeD1#4Pa2L}eKGxj`{aquqnU7hkNjt;h+jpg}= z4gsS#(APr&N_X&|GwLNzK36m7UGCoK!o5Dhsp`8xQ^?+jme&kgR8%vlb=mpRfy~DN z-|9hsNm1X`n{ODcy*OY_+#3~hQq;7yg-UJz*R#&i2e?~D^y0ndX=`P@?IkW18|}N= z8F|KiG`63F4x${Fpfzmp5{jOhlRx`C&I;7N2#!BwMy zCm%-xYjJEFJP~7WtfQ7g{u19oN3~@^|GcVT&10Yk|d+xO=3bkp1D{fYBB7a}M|C$eF~g{PhA)drvN083~?-+0=LA zm1S=kc)C(pGw9rs!v>xzeX0k&$+r+w_tE`U+&O2$#`oq-Gfi8&3_O)CyF7ZQ3N`Sw zgm;3cCH1at;N!bZGann^;*O5YADA=puM3{Cp)XngJGW}3X7Q1&vpIi>_hmnT95wKa z%bRS@EXFWGXtl^k@BflJ?pflTuaAAk&tT+SaNBRhYQuwsPJ4j+_M8L9sYBRFZa&t{kdwj#MOF$g>j7UAc{eeY^F%Iq<07^FENfTRviHo8FZg(NenZw6(u#C$7+Js1YhW*&L6mk_Hu9ZH>E;t5_8V` zLdwO~chxWVw%EVryU2#4IqCLtV#Ba|O0o+3aPO&BWy_gy@lw3SE_Zj&Y-cJxot|#2 zf6g_OEGCxK!12ua7uSG4zmm=48+WDb5L~OVJ)&xeQJBs6H^8?yp$DY}#70f&9v4*- z6B9L*_{V3lrADEF_A!L;u86xx*DfT;f zllc+c2_BCjW7>m5`7SoId}~Y?T6NCm=1bB}TRo+LI>EG;tdvFMRZ4tE&Q(Puc-uTh zd(ITMek0%Hz1aEnv?pV~WKx#GlsoS$ijP_cS)cS38RSt|J0Ru88`zu zuQ`)DyhN4^L6+Q#Ecu*uvU7ks^ZaP;bsGdfSDL{iHJ;yS7cg34`2H2BbmU(P{-l=4 z&({q4=JdjqzVOHq@Im%%_8x{uj#ykXNMF)q@W@N>$Rm7v#OyzM;Y&T|lx+HRjt~5h zvme`UUv_x3i#q^BmfXg>k`GkFtSX6*~~l6vIN7lNbW`|Qi^P^G`X&oYtw_2{c3s3&$#;6pZN0%Hz( z$gPj&o5Pwb9>=D7z~*%Rl5VfxiVqH&ynn+;>nrc5#0NJ8$bH!R4kV~~;Ssh0zecQ! zd57Tc`W_dAGk++RLTxEiShW9)uq$kiQ$4 z-}CJ8xS%O3zui8faL48k@uN)kPu@UYh*0RnptU2()`wC0TecdXD(+8dBo)3Frki;3ALM={VvfCaI{Ltcmy_Bo;SAo2T*n zX}dtvDRVtspQ@FDe)1x+aRB);s5h<^AzDV!WT^Ng`bA}yZ`SPYdMy=DQ4{A z|8wB~8=9A@?_{X%j2`$Zi?=A`c>EJInb9EXODn08|UK$rq`EQ{g8js7cs`UDq}2KY^*ME z@{iJ%oW~RY)V#D?njifem{$7X84W@>;>UP6|MeJK4l zc$CM-eUv&q1b3{1?$Fk2t8MTsYy!!DV3dz^`1rb37oo3TLI#U0o{BGPDZI+CVTN-) z4|$Ai)q@%99gNdECvq-qDgF1M|FzIW13W?Q^!*cKIE9WcHb&z>n^Wu!ubt8Gx}5vz z<`7+ff4OUW7P>t;Vaq=Jz}SZN6!d%Y*F|uy#F(3!h8TlBx6;SCZRVvB`s~NN$ellK zy@I#`^s%$h=dbCUQ$U6^KF6Iv_}RK3FNAI$q}|Y4$LD&r;WF`JTePc7j)b@OtG&Y)xdQ z*fWar+n1@=4DK_1#gFaIWp@yG(Dmaq8mix+6t?Tdsonyb@6;tO?3)#1pd7R7KWD-Y5ca$b|rpI8Jl*4o^6!r;`oU7Q=lPP_kZMfL5?f2U>A8Un1d2>>v4CN zy|KyP&?_ZwBAUEfEti$^N&IcxyVjDay6Iz#wz@gqr2aidTM>>?{EoTN3$Lp_+$a;_ zc%AnHjXs4tQuv+O%aureWBgs6^+86NaK|d%-(r;M>=?lBa$a$^a%Qy=py3xjJ8w{I)>iyD`Ptd-5(=%^5|r@fA4UPat*r>&2r-;h2=yurISjN9j{#)W>S`n(%t zt2(nutNP$W&brapCg|LKP9(yS8iSvYT)7vE@3Fh*p^Ia;4>~LBPTINm6=VqdQiH5h zo{yQ~HO4xYvnA-CHx8|`4W>N$&P6G+6Z-P(Yqp|0i4UlSnEFHTGm-mZBZ%E~5E(2y z=@{SgYX>xM??;~TeA}wW;|kVDZnp+_@I`Z{gkSL0ottZO8tb2VUxHrjwp$_`duqu6 z?D4<+1K!|WZ-XTUTl}nvt_=6yi_lhNzfsWESLmo>L;njM?Hlasb%knP!6fd|b-A|B zhwcxvKDcu*p~>7Gn<^Z?XIR2XGqDKh{l4INb{E%b(OvEVp6F0-Vt0OrUM2Sj*WW{q z9@@#Ioh$eTeen4ta-ORMUr@B%Wt`7`3ckS*e1n6@_jG`J&3CO@vgV1S;s@&Nh+;h$ z=eeK_L~!v6a6LrMbNz|?Sksh#9$(!>a4x=`YVTd+STxTIS;XTlm=V`$-#8KbEpx`6e-oN6LgA zBp$l^-i6GW%<~L%G@;$g(?jh?kzHk$LUXZxVYW6&+Wt*$1tTqx~t2wctzEr=~tYuCFm*TTsYmU08S!y@Gf15Jyevd^aiOo5R zwubi$JhpF(MopgWNWxtRq=NhoLvI4NqZzihcMfYibJXtX5MN(Wy>g7tZzg zN>5`4KgfE&V#tWDj$mM{CocU7c%9(2VsTG>E$_$yb?sehl>Pwkrg_TLs3?5`&zYWQ ztv*U0!}Dd}%e&d=-sj#|Rgv&I@$H{~Mmf);hg^9e*xo&+kM6WY_i@tSlb@)nBha$s zdU~Go67`I=^Na-pcCr==*{hfSxc67PI9_5ciQUf~wXA9Pxj28?Z+hQWC3f(ejQI`5 zEOziA{J@96RTSfN>n7m_&+^*ApDvUA%xi5wP21CH+uJVfjW_crZJ^7IKggaDcNFHD z2Da6A+--XG&`q={V|f^UiS1*VWcF_^V&DDzGcxYc_H*>p*M`&x zV?LBa%2e2{`Juwvlqn9*J|T_MB4SIECfDl8M*rP5n8?Ol z`rkm`k&OxU$oC=a2bClLWZor4PW<0DG7gb%?_x*JBOfukV%_KHif>>?4!sNelC|A9 zgcx8iymGfr{S)wnrrmw(=2#ED{s_FbIR{;8?_vARZ}AhI z#aO#p_3n0e)9%!^?J|xLv@8Ah>gv+2*_SH0Q1(ICp)_6hK^qKXDDuuDQ?H!|UugygI-xwpKsn8+W-EUqSCN z_SbR-UOf58AMDNVkF@WUe1hcfSkAjs*k3EKi(bJlyp-SF?n?8w4l!Gr%Q=VeREo%T zi{lsUu5-}lFYuMi=61wCSPVJ;9eDK0>6bkFd;5^{I{Pmx*~2mNx+9;w`+MJlLl=9A zBIoOjIk+b0WiQ7B4zAcaPm7$FHl)7D`CqX2PM}*f17FICKlUx;em(st#BY}m-o&a)&q?&zlhByhR#zTz>x0$eZvj6d_fibG7wHh&DFwNg zh1~n~R%MhIxpyz^zQNqD>0xt zaakjG@E*QW*ZJPG9j)Y=$s^ay`{b9oJlR*@M?TF=axaL#_Vj+*jW^|f+eK{`KYbc? zrh@AaSr3PqACcjQ(y$>|Gs5?U*Wbz-=;4uF!t+nz|DVfxZFaF%I;rgq1Kn%lH@#f= z0dgkDGpCmg-@W^8pwrN51H8g4-@e7yxxo*=erR)Mgv*GZsNma`CEOoOjQl(g--tE2 zW6(a({+<6>k$L}#|FzNwZ;bF!+7sUKCj98oUcaO%o^}gWoWWPiX*ZkiUOtx!KZ>Va z!``?oa-n;3#m}yc1I%-~FqJ&tQ$HoOhyDzD%5QvnL%jYJ&vQMr(8?ZRgLl7$xe{7< zs0}Tgg%(bdOQxW`(1QQ(XyGLJU(Ql~2lpHwyq*?_kvs@3e89J+>u4bhTBzi`K?~#3 zb}WJq9l6UtN$A}ddf!l&lG}v5PGx>VS*MfHpCuORXJV)=yZo-{RE<&kP{!h(1LbI8 zZzVR>BeOkY>D6W|oTGNgeoKtMj3w}QW0Cz9*^_yJex15*EVa<}DaKO7H=%2xc`xr4 zx?aS4(M39Er0p2RSn%VHUqzoYWxk+Q6LTdr`r)0|_9BFK4?)Xvf3nc4@bwox`w*$@ zeMtEe(C~AY+%Y9b?=a<*@!Q96TaMK$mh+- z;~TLjMsVL%j;CB!MIT-6l%MT+u88fai%lv%M9~#%8hYqI@+|!i;k@rS@;X2Z#<$p* z8};w_w)ePy(r@)^;`DELccj)o>9@WV#^@$sxb-x2?SkI=F3RM2VVG~!ck(Q>6$l@_ z6Z>H_d{FX>)WY{gXFIVqz`k%Zxfi#NwEuy&uKaAP^2+BTvkDb??YwNO68&@i+oJbG zIyzHsx(7ys>aA}ChS;IGwELUxP;jGO&U=wzk5T@5z4Zh*{cT;=-l)G!*%40vBsX6s zjx{z$--`{<-|{s728o?Or6fu5gZHesF1xf=0^07XO&z3@U~w|*&xbZuk)Oyec_Lv(7yO3 zCAWn5tEHX7nrM9u&rjk5swOr)>$}#~BKKOyyv<&+WJ(^iQYx`wUBUR62wRoOM~#~_z%nnpBxS*`&#sH)jBni(Xn*PE zH0#o6=#SqK>|ZRXF>^-kz?W}#Qb~7$!+ZTh^mlx1)^5bx_2oG@OeOiU-?DTpccHQ0 z(i@q!^F}pqX_#%mVfI^&D8J&R?6({<`zN$#PvvNA2=vm;ah&~@duXd0FlMpmBJjx5 zXjSAf?!cZ*zNS?Lv;Xo~{?}#m%pHn1XdNt}tttBlw-4!7tA$#=BED?qqUb)&D_yHY zXhYhQ{!3f!%L~SL>z!I zyjD{;%L?}S)@xDe9oa{`TLq+t@^`zY(rfrLEC2Mj(Dj3+hw1kc>m5NX<#F~;&jml2 zbjr1MUvPcJ*>$Gi_w?@3N_+i&rHSf=yZ5_MN)GZ*UV0?huG=I*VW#d;2 z+%!Lpz4}6}pj&_VE zkTEXV6&qFj^i$TQ0RzbW-7{)WK(DBlfZkCdv${q<{$)t?xj7-xPt^8|dWF9{^7$3; zxAxAYs6}`7kNUg0oyDXAEkn#&PVD}|$X2ViV~8^6#FrOEULB@v59PyEfA+y!#?e+kKR4}l;CcKB|71D)X!zmLUEX%Ju9o-p z&{&gYoLxiTlf0hQ=-sVFKE(M)HJ2YpPT@n7^ZathWeT$9UyC`f4h_pamxqqI`hSOy z{ZRC0q0gCoUx?N^o_QnCw%`PF8cRH3{{WR35u}ojG5@lMKASNmbh1^Q4pHOY3>j*5 z$)56_b&=?}>}gqMRj_Ap44!XpyzbaeO_j5Oo z??PGRXJz<0b5-<6pDG1h!S#Q_GrX~7Po-5q3XMl&m&Vq+GS+Q2Tl-Mw82L)rb8WFT zSoIlqXr-6n!LLErfA2y(gTG47rN6QM!>ol#DmmFa%=!TTWo>k$E@wQ(7r~$9x6pn1 zQFngFsnqGyH?>cBmz1h4-BYR@VMDDqv(Dyd?bFF2p1h7V^xT^-K74@xwQsI?*pGdC z@}CRb+ouRm*23jF!D96o5f3`L(CyL zx9`73pM#;#DCl$R05^TgIN$OaX1yC4-5bi?i)xrPnRj0!M^@q!oer$i^l@tk?)M?? z<^nW#nV4Ly_Gb9J_k_Gj)SWN8VMYtnY_D z;z!&|gyR%t>Ib@I*aYmD2HJgS$?xHw0j~Hq;(=SAL)jwM%@Faedd>L}TyN@ec*LJQHX)q$*o z$Mz@br&${=Xs|=;x&SNh?%a^1k74bKT$oJxdC<~4rIHswM;{;YPx|l%l_YcKrJIyC zbaS>1-7NINv_x!VNy1|~RY-mF_iPB#W-Mr@M@4D;y z>!q8Sz-#`EZag$hUxkLV`F89#x^dq%C3d&a)FU#EG&kL7(2USaxWM($jq6{($B%bC z-%CB2`&bXH+zwp~+?S+hK`U9%hMe1bV11I_0L^&m>*7XLD!ksyD+j<^Uk+7?4|Gz= zB3q83FI?bnI`1$1%^#U#N|?g$ThZVC6|X}4P5zcTa|g@Oj%r-ADJVx(j9&2eH?EAI zV^qjAbAUzig51Qj@XQ!^Wry-;-3K~8h|J+!Sj$_LN%|Ci@9gYjb;SDUu@>7Fubje` zOSrj{%_+J=N}$>j#k{@!vT{m)?YC=HpY_+OYS9T__{u*?c>7aT{>j4c4^B4eU!toD zPhGgN6KOF*$7V;<5I_6PpWp)=GTdJNDS5x>Lq7REV%~BQPhob* zoXa}c1*{C(uXDL7xr0o9ww8XO=lm1;k^33mXOA=(oJV(@8>Kov8pZxhNqg?e9r5?{ zsv2@Z7}O(L)6 zbHv=$KQ)om;qE@{Q^Dy&-*fljXZj%eobbX-(I^XDTw*={r_A0c4EmZHQI_Y8`J)PQ753cX1 z2b72DVXC9v8~XDjN08V{k@dm4uc><9e8$nAzcOf!OSSYXH*pU^Ob0!XoIxjr$B{Q^ z-sTi%bOCk?dDQa12)0f+tPxM9ocY-utoe&OTJz&VxHmA=+Ad$&QBLgn{kRJ)iTkPN z`&8u*HaX`FH#xm|yIhM*_UJtF5#?$2Q^~ZS$8($fMER*fx%sb{oY7a6J^u@fHGg=R}&u2@@w{(NZnkM66Fwys;*?FwfV^jDal-QWWIvvSfdWi71ei=GqaxG!F_id-DJ z%548N%}1}h(z-e;Na97iI_|?KRL^>n{4&D#TUm$V3-pKHvE}QeepZa!2hr70EA>L% z^+sG*?vi=`2|VgGQxDtUsFzaXuD4O@#kuR< zbX~pE)N7#LKdC3O5dT1(R+ykm&OVa5tgc6YL2i;qEKq;2NwbdOUH*FkxyyhdbUlfC z-)k6GIkMvE#$aowH{E;f^^d7-skEVC54-Jhv;HFaBt+)DuwE;b`%>}Yj+bXCvsAvp z&s=F{Yd!L{KEIv)si)O;xmUZ1GO?8T6+ZXY26r3IYV-hbDSJoZjjB}i$MZ$#kJ?Sl zRXFd%95WcVJ0D?JN0nU}Fzb_%fJ)g zV_SHqfOi~tLI*Q}cN};w6K6tzm4aVEa8>pUbISigTZkKD{u;DfjrVu+Y=d9P{L6SX zt%CtGq7BTafqD2km`8wl7?=(4_IrSN*nsJ0z^qYjn0X$UF~AU-sZeg1Hw#RQvWjjf zFjHz14VafMd*`i-;}KvUyAEaxFvT_yy{s=Vj~OtDkzky$o^fV*V48t}-@CHV1G9s` z?4Ydpcir>KotlE%f3|@+7?>xngV_Mg6TpmRoT0!x0Zcj9DliK@Fo$|z9)26Yy2L_x zV4mffvy;|L&p5SmH_YlbFk^v9Jk0Orvk91@%R+yFFj)r~&rk92a+R#vt2j<(rfQCvMVzF(YsgHOL z!0sQ}Oqp4&0jd*TgRGT_E8cEcUj2JTzHy`C?~yb52CdCdo|@CD%s z297;&-}S(q032+bk_r!wC-JO+YwNA7Zux)@w#E(j<~DGb1NYQ*<81}5#G#5@$^xzt zi%RZmfm`FDr&S)f{egoVDM|6bP2sr%aL3$a@CY}aHOa#f<_K;BcP?=MJ06h+TrZC> z;CjaUga>W}aNrRo72sI#9nW(paL4y;JHKwYEtjtGiE;m%`R)0?nBNCHaGh`cetvy{ zYs~K*ZRghwcV8R0cl>YW*T2pD)*};AJma+jw}J7A9&&4eDqZNI-NId=22QKmz=#Bf z?1g)Iz33Mwnac|3_VgmH)W!K&gJ!u;MsODA8PjgYWbg#f9MJjjWvIPJZ+rsqFnRY+aMy(HAa~c~ zqvMq`2ckcSZ6i9wa@twQ8K=fOINP*Z<%-YeN}5Tph;4^HBC#=Hj-hS(^d^0}etkC6 zo~+L-`jtz2-t}32UEgW~huW|9y4JT3=v$E73*^yls_C1o_2c9?khMOIwvKaNNbN*s=Uv0q*Y_=8sQvpkeS3+%9im@>a_0|t ztEX>g4ZQg}j?upqa5tFtj?urF^zR`38@f*A!W&zpf3fAAjQ;)VytdZwr+?SWXVD2n zK8sF}Kzm;KTyS0g3c=kwZTdIeGq2tL7xNlHThDmsb%T3erC$}X?t8+%ZPTyY=$FJf zc;}&jvC5pveEQN(K6e3R(w{8PIvtSf<~ct(*dv2pYO>sCGY<1yo}iLNU(m==AZxmT zch$G6B=Nux&+zu8v!^c~0!P+t zjfem4;@KDeI}F|5t*3Q&q%>NLIVoua?+m`e>&GtgHI}h|;e`i2#GVkC&Zpgane@M~ z+RaxNwrTI5|Diq6!D8wEd!F`U+VuYr?FpWqrN3^UUby4OJXPw}383>h@nwZMCbxmH z`#-?&@`cwtFf!Y~_{IZc4luCkDzgft&2Yy8o^3@Y(J75J6`LxuE6g#n4J`YAfYr!& zQW#I37e8%az3YKBfwq4q|9K`(d3^e_Cachlz^RGtWbl}q+rV26ymQyl;;+D~V0~l* zZymAVGXI6xGBSpjJ@ArgU!K`(Evbp?r>F7U1$Yl)=Uu`tSU*ARC$}&E!XwZV?Tx0r z2JA?&ZO!YE9pZPKEakYjxEs7E2iXB18cI3Yf61&3(Vu58C3F7JD)v??=Uz&2&S=Gt zz#gD~$V+Rc;};m7`;>JW>uzfHIBQRQVL8*r$+`UGyvEViAbffF^IF({ZNW!Y_ssBA zr|gCFVr@isw^X_Q=|>)osDz16_*$d0urDm1uQ@#94(oh;4U_Dy)x^S;^k@jyvyP9p z7UGL*M_n_2i|&I9t%qkh%pt1>E zX{nh}nSMcfY9=}8$@jJ}$W(geCSv;7r@FQmxPPzfWAm5M$f?2V%u(_x zySTefDA^G6_Hk)#v`Z;#u>$Nc)Oz0m~5}y>+kzD#dCtMi? zz?sB2WUck&zu15^@j=Eq9|Qf{{^FlBig_CaKIVcCZ~uj^_tK|-d2kTJxeURs47~7=BPc_0srhA8wxCjX8Unetl2BKBYgagPw`H$QV1)Cv5kOq1-n& zg?s8W#&P20;_>S!cZ~lxGlr7*AyEf811a+CUdqj;Tsi$u=XVZw)U9XSlliNRi;Mc` z`}nA#w08y^%>zfWE`839+|iS{7yK>zF?Qk}_V!z<`lvB>v8*yB((79^ifE6<3nCJ%KB2Hd8l|{NJ~77hW)T;XMKV>XX$~4gGWddZoY0 zT^hpc*bl2SyQc16@M!l5e=wWV*9LV@-_6{=5NIl$`^(53$LZ%R`ZF0!?+oK)>))jCcPaBPt%ch)sThuag$3*&B&fIDNgQIR^EX|agfIgH-UPz(6iZ5G5 zk5{c@J~QH9`qSs~#u&ZRSerfH6lR>y6MRZ8vlyQg&e^&5IJ3zYmm>0ifmZrBv8e0F z>C`}s>b9t%&M-}F+dvy4Po@N*8>_Ir!iQSN)NcNMffnZdExbtDmcQ09AK8Bq{?MKC z1jOO=*Hq>9+BjX-ToS*(UmT}jNYnJe@O|MUzp(!)<)asx?e+Ly%$e+46lr=Yw74$M z$G$Gl*S@aRk3WC=y5Y*XE-#RGLH3s)w%8~8wYw)5Vdb{Df(ll$3&8%Ch&3b^3VsAy$ zkpY#`uUoi#5+2WQAAHZg_UJ2q{Q29Xhr&}A2J$Y*-uXd`Jv)D z&u}O6b(uBw!86zBL*mZVeRX^e0r4nCniCX6R@Rc}VZ+Z?j9id}ww| zEcbLlx8`}ai}}!QKD3(;-JWHCWTqc<0UhT?m}AJS_RCXrTTGG?vd9!Qayu`2nCYCo~p|9#{+fe^MugI=@0$hm`Ap{LcJ>yL-?>;{y6d*^uE&Dc^(gQclWb z`e}Mm{g@q7D6^C@<&;@S8R8O*GMU3Qquj=pF+289riC&Jo#AoH81ZUK=`QwDkH(~0 zT}{gB%J;Fm*q?Px)_BH0P^0D@2hEzE9*EB*+0UNC zSrhRSW-in8?ATlMLmTLOyMlcW0t>sS^6{8X`jnUn*4-xVFemvwPwAMcM52{(kll^pC^QKK6aU)qy#mKjW^qm`>K~+dFj7 zq>GMS+uNjX?qRdX@;h;fN%yun>Smk$#Uz{k=q8i>S=v33>|?(hz2$gcKl`(^JCnb? z@EGip%5UGb8ZnqH#CpJUDpkEzf1(dQ5I^;AaNEi=&K7>>&37$%u#t&%70A&T_*FE# zsvLRU>d9wCSzUA^?2?wWm{4?}Yx%LKQ2tfQ$B+|LY~Qc@a-SZy@7?L#4TA0a=wNcN zXzn|^WevcA3k z6miOevzlG)^`t8YzMPL;Jb9U~ei0v~OABod9L^m*%yTLC(JeLEa+d|!tW%ZBowmZ) zI-NTlot(v(WDadUmdbrFluIXH!lRlkcXpu7dV+GZgZ->?miZCm7wmAELYu!D!d)_y z8<-ldKSe&1Jo0?}psC!v6@J9G`g138Xmg)I_?RdY15A^$<@yBJtc@m>doV~@u{-Jt z=6BPhmgh&E_7u75r@_ z4#TAd=A0l`W!CV+F?|hNMtE)4{I|;DxjUx^uw{KpozdKP5X8O0!Tqn{wF7v447~2+ z4vYKv8^_(ipYfMuib_AgeM#RuqB6b&uLn#4IbUb1j3eOn0Cz{+ME-%X(^T>_VDB!! zMNcQU|3~2ORq)5z8Albkdkx$@y6B^_1>kN0xO+-)hYT3T9Y2lPeRZv4!M;-NQz*-; zDti;W&8ENa1h%&<^9xQt?`tZ}250{tYiAxGWsx-ger9q92q8eYHYW&zCt%{pHA#pV zq8u@Z%4!m#TtN`L7(tQ{E{$j&!DWSA3E-94RkJQAvo1>lDk>fUcG-R1cb7@R9l3%6 z!;$%Y>v?8ih}nJpFVn0>gww1>Z1ciaIRIk?Ky*3^F3`pfKFMGp-ne|!z=)F|8e)Q73Rkox2KoWnkS zCwJ{`p?+Ng`Q-n4OWYyy$%ovo1`l8l9qG#_@1W1;3oZJE1q0S5vBpT;3)xdo^ycsV zUd0kiDmdm*@+WO#KfQ6NidkU^&OQ;=KKm1L%5R1S_$6KzyU&m8m!D$4oR2+iJp1Jj zXm=2I{+{Hn->a;VCAXfOkcfik)XU zI=7r#cTGya+>lT1B%@B4?$0+Jn~||~w`E>jBXBd{DJGqzf-x5tfq?vAzPm!_=j&G%=Xdm;PaaMkHKV9aD3 zXEMeMFO0FZ^iiqBOCxQw822&U`ImlAxI4r3>fP!#nUl@L+1xW)-3H!uVG}c4VOi=n z91at&_mtu{?xnroZhTctd+DA#swiW-dlaLx@pf1Nu` z`QwopKHWX-ag{qSy_5cwB}R|OZ!5l-{BXsVs%`jYZNoQf8-7{)TD;YPdAnpR8}W_V zMXZa)46y}wxsrG8Gs^O}i;cRQGXz`PVV(v0b@fFi&weS3ymRe~-qi@bB~i}LyY%s$}oehuIM zNzS)V+0)LmhLB&bTlv@Z;f{OA@ACD*a7P-s-lkAq7!p!ma3tKZErGmb_es8lU|-%j z@`TaOJ*-(PB=6j!EON)RH}cNST$<%b1I`H5&d56#MW3Xt=HRGuY4361&I##QK8;*= zH#USjZa5U~=>B|`<3ZZYOSTndCBN1q5&M!G{lu69)IUBX_pb8+6; z0h_JZnZ!Q1ncq>y?;ghQKk&P~@!O0|`7XcDPoEXnz34G)%2xdV_wEjIkF}At$dY`M zooOI zNZgKGWjVbw`Dr@B#)%O zu10=KIftEm;h}hYSV5dKpx&3%8xgGLtl#X-oxvGH5xN#}51VR zj`(!XTilE6+aulcxg~@=PuB7XExdeWa74MieNcHMxt(V=<0>RJeQsCQWO$EYv9bRWM> zEP@zv4pP>jsa;Yw>(`wB($|7J@3z%`;vJk#{mD}Q&URPoUnDo{FM%QJxf2+Zt!kIR zklznezZ>oQ^@NGkKQQ@5{VXv3y3~D??W62n%ET_3$?qo*XSg<0nmL5?mqzL<7XHb| zA)HP-Ujpw1WYx&a`@_~DtJb4S7a^C5Sl5adbvEo`a;B3X60RSrx!ZP#yHecgspv8( zV=Miy6I-psTH0RQPrnIxCBSNrp1qCxJ2mKl$jIvY6&aoa?3#>K^|roopYf6n%yPqUhijN`4@a*lRagg&vbJp)x_wPtXsm{vR>iGY^+z$1JhWqz6?!K$b;GsIZI|YY}~2brw60 z;ip17VbjTT!ierWv|>-COK={=r$=PR2m&I5ofa<}St`o%dX`Up<>q&CFj<7}* zEr$oj@m{ASyX%!Z)NK>^F1qK(Ny>HW??Y2$PCpF}_kqKX#tfI(Zv=MqR#Lq*|eDmGVlqaE6E_9N! zxFl%)-X9*aO@KDvK*#)$Y#Z}!u*jiRoKM!0Yc7#oa|J~STgK8>BlkNR)|)ay+8RPT z{x%Y5V*-5`hfZ|N+M&Pj!Q%WI^?sBgD=S8GpW+61@NV|?j8{bs`E-l>u&>7lJdnp@ z;VJaGQyS-S_5;=@BIB)Dl+wTLLea)#n%j7s&+bq6!{~f`* z$V+$R!Z<7MM)U4^-o;1b)W^Ilb2y235(2k}0XI@#5czCenbi>&!n-SZSK{j*928bH z`YF@5r=-a{_@9ZyX+dB5EoJvJKP&1&jlM2o-pYF5fVK}n+XsK0;cE9Bv5z)Z!{>6Kr(5BE?;`|oUZU*fNFUYum!9Msl_Ly>(`vrR92;{6H=l6r? zmW||JPcM@gtJb3YJzn5SWK&*Dc>(3$QodTszsqtwO!t`yWf{rcm4_VPit&Zjgdv|#I-;-4msfXo$Y}Ih>Jm?R zzb~)uoKBcEjYhZimHG1OPVP^cGRs~M3MyZWZut~>i$6lAd?wiL_z1nS zh&APR$HE=!M1Mu59VVBkw~f5IB7Y9Nqpg}oU&62@JPQ7Whq4@*oz>ufa_%>85@TTv zD{^;LxnJ{p{dm!DgNqWnpWj#0dMAmapG-o|GnEdFuArZ5l4CydyaICr<4sSdNEa9&VWs6JScvaTi z0i1(8H|Afu=s8#QltDa`eRC=I44R`%Jtv(wHBvVCSK6v!@UDMP^9g(^x<$=aZ|(&6 zG?w%80r2KWi?Q&O&JZqrrb&iq;?Z zUKy{-X6pI)u8{X0h34mZZ=32?r175Q-+inl%TX_7nr4*ASPSelU=w2?c5cLI$0?rY zSvnT2#}D8Uh~<|w`+C|t*-fe=#+t_!`|Mm-jy7WgOJ6K zkn4OM`amk*-Q05v?yarbjO|qD|GSoTVS)1bePUKjg}?e*i1iG8g|D{fYs6nO^BW3p zZPrZQnl5H!e5Ff#p zpOP(2@;_jKSf=Qqh2UN&cV`JCb9lW&Lh zc2hgb#HKFi_Z2+juH8QWZ~qzo&%t+f0KQ-O@ZHDf&%yWepNX&ZLGWDxo|W`L@HBFr zOf1nwC`8S66q4Gdoc=vs*#N6rA{Oj*v8PYzI*%fYwu%_V#6Z@<}G8C=s$ zA5UHP&UOd>8=gBY=TrM&j|#>f#U8RQy^{Ng3;L`T8(ex;l>lto$p(|D(2kYXAhmmf*ML$iP1=Tfs ztE|zo_nPxfxQ)G4wag=hPIg8awx$YsSKe6z%-U|*TSfjQ@SLEUtJ34`TkFyJ3efqO zE7fwYb2GZ$hLY=zIvM!MJi>WW3GeUc{mf+h*6kb2XZax({Vl_f=H@sz&;QQzaRUOL zFSY2=*xCk0aIVE3>|35=_o_IYKGP;NeFOe|C%7c%i5s%FrrW{M$V<+>E@f{nBWG_u zb+%K7y;a3A>aZ8Bn_PN}j^0_ff_rv@ug^C2ci+}x6E*4v>3N#HxlvoOri8kGq%OL3 z#UbjZQ75V97G3)IVL~^30ya#uPO#2CrmnH!W_>^H7OG#Zsif{3)a7iyx{{FfptCZ*V2#KVpK$E|kP(|j_nb!B_*a>+Pu$8SCV&JcY*xMYxH-uV3)dnTUc z^4?QY9%XkeN|N_Njq=B(EYkn3Sth(RgL3Si{nIn#-7w?bM=8VZP{&=m{ub8S{LjpC z*1fuijrY5=hKK8u3vV^ve}J;B;Mg6z=q-P=>9;bj(a3EJzwMl#y_tlb{pEk}_f`3_ zwJIY)yH+0JFC_A?7&wMJoE)ZaVvQ)_^DlflhHG+OT2YceLZ30z*ke{yR*ul8@*P`i zMU8ue{s`YA`9I7YKa!u}x+~bQC1ur9yEW6{l~Y&Y<@pQx$wamT*7n3 zzI+qU^Jm#Tk8H4BxfA{9)8_qy*XCgNhBiA(Oj$b>Tt!ZWA*aHTQwcs{1K84?hZa2=#>duvEdSdCVdPAZ3brU~!ho--Eyk+$Z)Rld;*Q#up zzPnzb@RHc$7vtw??Oc*$L2jq^!!HBhF#jFdCVX}Z@Zta4TDfBr>#P9o ziU7E8rkTFvez+rnTiDHno7f8O3ECXc9l>oSzi`s^}D4`@L zvK8D@z|}&OUIkqCDh9rZ7V*cAbv^=Infrb^1lu)Ta20=Gp@ZPNv4@H8kA1JDLyO>x z@6t-(Y618r25I^j;4TV)n_2Qxd}BHnMJu>x1TJ)#3fzzYd}|kLdJ=G#1;9Pn2EGDU@cm;exJQJ(jN5qNVw*PU zyWYgN9dNJVvo`o4Io`zgx2@p%`D_Sq+XdiT8jOAO`&N8b`cpaxT)}r)E4Y3>>jT`e zK75UsD)56FxYzI*d)n6YElf1=ozn`gpU+r1TBKc9UB-0%Q=6N7{Fxxl@K&)VPz zfh+i0Tfz17*?Qn!k!Kn)E1~Z%f%|{Sv*dmzzQ?b-RzCRotQ@%4$g|*J{Z8Os!)I;C zGl47k{=F4kKc77X+$-{IvPs`tfO`#}LEoS7S$`AX+E#G=e3l2?Yvoyp-UGPT@L3!D zPzYSX_jj$}`uQvixWZ>kzRI%U+mm`eS#+bTx&K)E41XzEn?smG314^z3m)=Y*14qn zGaVbS)5v;vAJ1jYEBoAx11D$8GC$Pk-oes_{9f|QOvk|u${}?}^S*ywoU$`CRbU>M z_jh^+hx*z$lAq}~vRyew@a{ltP59Rvyj!rrr0xGSwX9wmAR|9j*UAQ2GYbcqw4Kq4 z28WT6=)QUwZQjLxL)JE}-h{gYxX%Z`?bC*gY)m!b=C*<>c|OySz0I@Gd+CRN%`C_a z(ccB`ive(#v^6JyD`Pgi72M;%T@T#<1ukc62EMgv5{n_$xf-}H2f#hp2ENI6nE3W< z1y}OjrLhKm2HcJT_-gEHN`ZR~@4{oPc~{^HzMWdZJq_GM;8p|oVL!ebO?-=hdkyb0 zCw?N+hno0a;!aYat|RfB6B)NPz_kY8TQD+Ip8(v&0d!c>)|>#Y;CrYQT**DV9=MBv z3!fSEEod&u6oM8y0}C_GzeoJ#eq#vo`oa;0nHfY6aKN zXZHh_{ke&6qQr5Cb;bbq8a``-9~$i@zHhXG>*up{;C2YWw>C3OzkI9}pS6Lnz!iL7 zY6aKNXEy*Bo3T0H(oK911NRy}gT6oEvkVj8d9C33`K&8&;{x&B8K&A^er**{TR5{@L3!DP?%}rdv`0iem*;fPky%md{@D@+Nf~-4PcAz zyM*;e_5nYc7r+&KQv%@HInR+CA+^l6zXJC^$#L0dHX=hG`Lo0v4LauLEFxWzhe2_- zMCU@iZ1J4!g;SPLZ_}TQ zBc>g;!T#XLS!2a}#7di~b<v}A zbD(wF_S^J^jrg7cKi{B7T2;~vS9&+eYAT~>J(XFNNQ zY~Gcr;2HLiI`rW>d-W(!pHJ@O9);Q@xIcH17$@MW@ZGx7FZ(e4?N!PaN}t|-QQ54V zuU|)>->Oiy1U_3rN1Ye?jK+@KL_g9>&3IwW3y4KQ8zrCK>FGI{*v!6tB=L!MH}GBy z?TLS~+_CzR_{Vl^A+m?OFguugD#YF8opby@T0}XYhh}BCcFxUkIaNsiY%R2ZQG^M1*z%rn+v znP2{W<#sDMAGLIc@Y~TC&9P4IEM*I=Ee5RkZ}d&p%nQIf!`R{f zplezx_lAP1X7pZ^hC^F87UEPDY=Mqcf+O`|n6G;30J!wY!$7sLU*M7V* zbjTYT*B6Ox>&gy8SlbKHFzIm z{vqQl_(~rx!Q+ddH)kfq5#XFZ;daKahjR^htpYEhsl+J{#7p+b*5s0$S1sud!A-{X zNASA-3SK>%+-Es^0xu1^?gX#@i)Mz-K|8heDYPHse3tfKHrnrw?{qKn3dLN5!vXH* zZV2Y?*kyBEFVcSamG(`#oRapLzi-pNv{b;L=WcW_TWx3bv#}V4u*s2}>d`qJpQ=XXf zBJmUQUmP*#^MC4tz?XjX_w_^Ob9pQH4fG?8eq0ZHH#V1^zIotg9t@{Xa#kR`zCJVf8%xG^A$c`6WYzX(xxdx4$)>UZMLJ$!^n^mi!)r`{M##jx)rCUPqsbI zx#mh^%uM-JzGOz%$z3fE&(x*-m5JyT3HD%@`=ZPR?i$0J2Z-HYO8>tq(pJfPckoW;&M~%6xi2&- z>Mlno*0xdQ5srS8hezM#2wxH5=+F1;g7LOpi&Sb(RdDR^pie%ei@bS>B;)`(e=x7CPq}wJ+L>dsw*%iWOURIj^)lWIeMO#dsmFd z7RLNFa;X+DCmNWSovl5~#aCxhHTeKJO9)lnc6rI4enj=$^&9K5HQl3MTQee3oet-| z*7Mx6dck71m2*euhKIV{yCN;3|9e_wfAKF#;2uZ2hw;l;{zA^;u*$jnwV)#R63XVP z+_L`5b25xFYms}N%B_reAt&GXt%}m;m@gITwzv0%>9_4)Ab8C5zvBa*uiT>YxZ?Mao z*5&*?dBLtRjF-TA02)qQo9-Dw+?$#?Dpz=Oiu-omd#~~^R;PMEN1kllW)t-K{PMd0DLl`HG!_lGSX96zi+`2B0IH9t1R z-Ta_6YS;bVjFlaV+pWddyGeD{a*4ryx{iER(UuP7_@Orqd}YO&NfDjO=bd?u+>+g# z%b4@Si|y}P$t5W9<*ozAxM_bHS{zg|Y)VJvd3KuGEHP6a2G_MJuAKR@N!C=!NvfDH z2Ut_29|xex8r7{_`m>(=bizNe(B&9w@P+xx^J4>NS{pR|96Z(wf5t!0RVg0e7E2Dq zeBum|bLD(lsE&^dca|fZ7rkLsm*DfK>l1YERL&8~lxIjNvGci~{KG}%S=(OQBtCiX z|Av_M;2l3yo&H>ChJRB6_gviL)#l^y>IJXzpv&c0`QJAEj@vDKii~(4no8_4$s=}P z7`(z@WVnX=&&vO)a8Wi9?>hPLVs(Vv>=Yq+#e%naHWpLC=BiN5y9 zOIbNaZEl9X7f&jWv@JN~%@}gK%wfUdFTVCA7tSZbtITUf`;ASszfie~S*Jxd9Xca; zT3IKR{s!&$F0p&-(Sg$LR+}0mRt+#8I^43_2~1P|^>U^=M!MVyCFW;gRDfX1Y44sK}g2nXWpm zeWZ-_LThy74r`~#0@X3HcByi$Z+-3*_~obgUnp2n$mLk{&)-dDVZ=$iMouaX?Lk_$V<+HF^NzVB(tSa}v2%Kg97 zPbkmB3%jgsVV-qletpu_{_fYEh)vIYdL-7IPsQ+FC37h#)?S65uih;~>H9V){WSRW zjxBv>oh7rBhYmBqx%OZbs~Sk&p+L==$jb>)KC8s7>3LpYE54`2*Ze z2h{8lR^m6XUi8gSyV-X*k15NpyxOqS;oqs;j>Ip@KKSe_cjJdfuDSAGhws0;inWO+RDCJX<92O0BQwZ3sVOaIVe1mj%5d;6?*&)1f5w&M?| z!P~;g>szaGkxdn2EZ4=I{BV+^8}qSta;D22tYvp37IwTv%~`?R>$K3m@(uF%-XHPF z8ut$JTfuuN@Z~{h*HXk?<>FZOmdbO}uhps}e;-|SG;(59&uIDqjSdx&pK}LmKX~mv zv0(4N$y@tq(VQ*Gj)hx7t-+D?${Lx+m?_r1eb6^;q}sBLoO|!Um$j@t#M`cr9Ph`N zJ2N*=a@cm{ZMiW&(>1mxZ_8?}ef9~hd*mrghoVZ>YP$;G6_0ObmaNm9}W|bS$A!tlAIgT62^)Qo z=!q3G3&`p8M08bSMu`4PewXgBlK(oyDg57y{xm}O3o<_jw6CgvMtQz3W_>~y6qDmq z6)+zn`JB#Y6rZfu#WAd>&%tZ(xa2mKc@cA{W%WlQdv}EBM@DD5jz-+&IG>*By2!nn zqlH#SSFKy*gPa2%1IL3sy5J)!IiDrpbBuBJ+(4W^H*3YAvQbr|Sew=&WBs~hiO6f@ zs>o^^cMa^w>JsjK+=r~bFI;VU&ye{s&P4oU4g+V;giM#z}cEQnk>?rh_f3 z-|^uW#JUt5PQJ3VOqaxY?U|M7ItY&QtPzp7g5v@BO#Eb+(*}NGw~+mw*e(RegW&i? zEBqwCp4bbb!S57(G-G(iINzd8!KG(IfvC|&4HZr^d{lZ;r% z-VDu*^&K2CEFB_mZq;@J^hjg8zNYO;VBKQ1yGBKlqkCMYEBX@m7%f4O`^a6|$D%r& zCEnv7j)$g9LRXvrJ$FcaeAPhvhgqK%fX~Ie2dY@__cRm>zQhkk-Yz7^6?(}Zjv^D? znJQP-{+%bs*p_9IdkY=u4emwu&Ll5UrrLA_IT4Q^ZiHU4=6=@a_#x`_^BLG8hpF9D ztd{cq?d;7Ozhk4q#xQ42jSJ^2o6mdrfBN~_VeL*Vc%|C`ZEUSw?fzD^+hu#HcG%X^ z+F^}L&yERat|SE23`^u$y!yqM`j>B?mGs8?Ss7}|>t#x9E?n#x^w;*VN+gUY=jQRNPJXL(MxQ5IQLg3W18 zmWtl5MHiKB@a8_fVMHqX@rp^7UhLtpM zUbK5=8Rgw5??HJ_=N~92La*pYi641$FHB_(N7wl~ zy4E7{BWGS3xpEshF5Dls)-yuTGnTH&XB{{0I-+ME`JHmr|53S)?oh6^%-aUqImw!S z9PPR zGs^Q3&&TupbXllvgwTyP^T9{sKHr(CyoU@&R&M%n88#t&-%m&x_(<6a+OOrkqf&BU2OD`RT58XAo!##y*X9v^VtPvz28&sp3v}sdOeML-&3#Y zqxh=#sn?r&Bcjx4`(khIiyiE?bovXK9OarO>k)Hb;K{zJ^4^6Q^gUnGK4Bp}lprU(yf4zaeNL%=>R&*}>g+3}~tWEkLa!MCa;c%J~^S9J}Ff0u=#m4?kBvO0gNqD|LOSD z>!|;Udw`x#-Sp5fJq_Br!RJ7Ed{sT|XF}UdXqy>8+k;nV`-_3M`0#lPco%#+m|^cw zmtK)IPW0g~9%h|IFZ&1j^Ta{;{*7&4g^hlLxW#yT4b@cYf}wz42xOk>(PCmRWZBn@}{qh*Sa(*_6e+or+Z<)SZWO`-%tGI zFDqVM^UEI>vd8J=yr1#uHtmirY_OeckR38Ng*KzhwN;rh#69AE;ar(3SBW1-H>c!%I0C(n^=w}?4<3@-5661m zQ*{Jg!u_^)u#DN4#PusCZb7o>5sjh7c#AH9e(O1g41Nh)=T5Kplv`Q!sqes}z}?yk z)(yzr+p*<#E*n4|kWkyGP^*5|GGb`bp3rEYMGgF6U3}FM_}~Hfz{9w2TBTN9FT4Z1 zZtM}}vhL?CQgaf}S>}1Yo9o##G;9nuZ0Tu@SM}(_=+6iJx-@$9hpc^~OE2eq?Fh6m z_2_Q@QI8HqkN$!=7^p}4_0*}1mwOj_F86EYY*W_v(|gUc&3vB8`r|H=z2^9;Qr3nu zBb4VssRO^(eC6FFx#uS1ALC|EA$x$sD-|*vJ1Y8GNBVFUeJuf+3qM=(ujd`Had&k_ zSNL?cm3EK)Jh}#J{LSBwv7I~@nquWFa~5%5UOML;{LDG;re<`cJaVs$e5GW~uURWa zXZvE5%3U&4?cQk#F889drSUriolWi-EDuvUvbzrbtuAwU?XZaB3tkCDXFH8vc1lI; zs(Z0^*c^1W?-n04bhd#ZHN$RASG(`EM2~s$rM|OXeQVRKEtV;-{~Dd`!DXk$#Ip~V zxiir^<#pL_{=M0|={z|7dj@)28Ft8fiOcBI+uEYTHw~uV`cpdebbd>|97A`74(ilZ zI=p|W#0WI`}HbU=4AtN zrq=GurA=MQFC?_F_fxq&8F%*+c2Dv~{Ipb3+(GPd=ixo>v$F>x20!m>@L1yx3-`0S zIXADAH7CZ)Y{0 z)0gUbo{eK|6T64lC&a#eG%~iT0eeUDO0`OC6>{DpHV?6L9GU0M-Gl7dZRI=f`fVh) zVRymyFvoo(Hd$aLvQBt?b`v*nM1CGa_KCgZ=*Onb==C0%KMW&1bT{U25u7CGow#Pu5)Lpp|D?OqJ)P*de<%g<}`Klo6s|VytC; z2rb%Ad;0cm>}l3VO8jZj>lq{3hyFb09N zzXa_|S>JAlh7I87hy6o+%jyqge2w&Z5y^}u?devc6yPU3%he(CHhFfc>2$% zl7V^7(mhi8CgZXn8(|qX!h>VeT$h@1syyrNtqKlOw+Ze1vU(rw8a5AT(15JIV)vlE zuHVvcDdMynd)vpZ)xHk$VDx{N{efdxhVA z;MvEFt>`rk*m@+ki`XJRe94?g3CKv%&t;y;_}8YHbM0CGbK<}Cl6hwEMpyE)#yA&Q zyY6aWe=W2cxxt)!AOX2u$Ii19hdI%o9VYT8zezB693Huk0ezo7qOr!nY4xdnTBP|u%^o1ZS5 z>AO2Q%_UDzJo_9*t4L(toAFOt3;FnIIo zxV}xl4$}vr<>8gmPMXV*C*0o^y;o%ALGVsw3`*(GLHctT7;k>>9b85qWG?!7&IZpJ z_(A`f;Px1}6^X3~TtC9D)C6uN;8yR$?EtnSInVU-o8QLP7kyl4Tqw0^x)^#>VK8Gx z{4Z>f#&|I%Zg{z|(eCQXSk+@olURMvLYsqL&aC@fy9W4eTV0`%#OLFU!i-fL%!BU19amJMeY?!6egZq0SRbDwSGJ2;O${|Ng2 z9%wjJ>s2oG2WrYy(g!)jo0?>&9JjhQj_Risy`(J_{Rty6O;_r*&(Z#YtDB@>%GX z|6ArG?=TKm=Ho0~a!bWJ&r!bJ(ruT2K2D=t=3_1G`R8LHW#V7idwj;$GZHit|PrIU5G(Vv{CuvvYz&><~RN9ty&qFVM4Z=#PKgD(#ip~F29i@v5jGOuqy?>5$2=v?YsYmd_Q>n~o_`DKjk6+ay#B*E&7 zzVVTKOGjWab6R+T+{u#)OQmt63++{w*}wK7XVu6`IJo^?a*}6q;m1 zk7M945_;STU7DcBMA5gP$2m(#HEwe+t9JQ~q=WPJ}tUdUR%-(qcA^a1DOhWzR3JWIXv;9})n z;gvv~{~NFT6JGf}I3G4}?s*N)2YomT?;mD86};Z;=Eu2f|6`1S=u3W_7lHF`aK=Uu znaX$x&Vl;nUdqlPUqokZLdKi|SNU#3Ry6Q^omIKia|wU#i@%J!va8;wx@GnCd{3zD zq+fWyWwpo<`QL#}tiXsj@m^JLyVCpcdwqTfee!7h0JvW*{=ni_btc1V#M|%b4kvam z`JXQl)3F`8Jb8PAI$O?vvsCU~N9aij_;of1IYRmDOP<_yqcu;-otkH9QiR?QUe~m6 zecj{;o0~Jmr^ws6Y@x-q$P(;0l!_f|4mpjD`4HoLH7D4Sm`J`<&L2bfx2!I8VmIOY zi}11Jp!VkvI#$M6KI`Q0$=WLRDa<8wg*3CC=ik)(z^u2hRlV=2Cu{F5)VtB}hl_Ep zuP2rsZ8S-}KbiF&Z&mLE^=he?L_KuqYH6>&mU}tW`q_(l)~;QP&A4qc-tt@Y zr_XqHsW_5*%DtRktJU`ONVS=`Sm-TXorydbU+CjY%=$LybO(FnBj7A{tBIdTeo3DX zWnsAfW0_TV(idYM^UlR`wMy;~i;c&Br&oLn`QQCc*C601cM;a^5O(-bxG`OWm?HiyFdhgM|-hyL7wc+l_HP6VTp2XwTT! z1@z?z?P-kZyR;>HxqQyj6Tw&ZhVF;pH$E3(XAs^@Ok{ld{Sv?NA+z=OwUw48lLFd{ETT!^R@M+V7^gj;z4f#w^EGgsPSRdI?LAF<>#!F{-%2fJ->Q7=WdmRM(aeR~!#Pp<7Ncyp z`1+t(yl2j<47rCMpU9~7v{gx4@z}Ql=kZ=&TTl7gx`VdTk_YOg z{5E)RXCUtp50Li81hn^l8?^HC-eTI5d0c`|kQYC4srw^3Wog97s_+Q%c|tEK+fG|Y zka69~Nh#+zmC)AkeXxc(6B*;Vz;STy*mj6vi2|7Bl;tdMmw9egAoeW2|1%cof2c-t7WddBQG;3MND z<2C_&&Vo-2`0Tfs`21+#)7812egy;P3GitFpM_5-$HgJgE?d@Q^A5qmdrh9an5V6( zN8b>gqV&*mxe4yN2L-|N^PiGG4z z%IR-Iqn)S%vrnhdfdl*SEx$PTbyGL( zyy&O8Z4}P}b=$7l*Xp+CGAw#Z*;U=Ptn#XETUjf*t(+&~^XJoT&;0YMZaeaMW%#ZK z&Rf53dp-RT-8K*1){bs_xU6m6_5t*_!|1k$(QW_N51akkuorxJ+nLj%H`gFv4l$n_ z&~0m3JEDOvJ`wk!+vcgRhHh&|w{0rbRxR=Awn6B&>##2^uUoQad6HFhTVtK_>$Wuk z?IqG)YkgB>ej;OY_F;2P7yZxFH)EaGPm;AT*0~E?1M*Pga<^ZLIUp{0`7Jg`SL8sI;ZoSc-uLX(QQTN69#2W?X7NumVVu7rjM4=KXacD>s;q+ zFAey}#tKunjdk9`Z~RJfrlZ>m|44gjKHauQKzsAspr@Z##B8BaYjBgjWD;dTE!PW9pcKjkLR zCjwh^+k^b}>9$5&wLabUj{$9UZi7}LqeMO(eMn@+wY2KxYwIt*wm9>ts3*tsm;5$( z58d`E@0ohr>VWpnFaPO0_VeD?Mtkf7TIrFZ+vbE`)gvPr7tw7+Z);1p{TMi+w;e-I znt^UB`y1trK(ra0huj;j918}JZm)5e!uh%XCjF3D9fV z2cI(V@#(b#z(;b1h+g|5__W?<`DIf9aQ>5?eJJFrUb_x_{+nJq7C8S+uRV0H$&Z=5 z=htg5EV`=KD&k`M_1dAl6Q~m&q;I{^?cP9#t-THXl<(et+N#gdr_@tc*CT!LId7*1 z$Ds2*g^#Gje7s1Vhz@4lM`Aukzfa6ZoL>gd<++{bsXQw~51mTf#i_(yv=W2yNn$CM zS-4lYW2|c#`EB-&11@m^E3oNCx8(1Q8`JUL@g2^mKA)uY2(5$8=!w67X;0~kzi*a(_WG~BX^tgtcEVZjU^{m%&?|0x z96CP9d(p(zRM2xBIe~_UsPS>o*$w^@6Y(fxU}dZl3P$MS)487S()YoP*D-twntadm z*PG94c|N+x>bimF-}C&hyzBP8qloh0g$?wGx#A3zfUYeuyMG2XEmvl_qyAB`HySSrveaEG1BJhn|&U-nGb0K^&SDAb< z2A&uN4MNX*2MeFv!f%O>nuH9svu7FVY*}5P!crADivO|1HE9{U)yQ+KNj#G%;~Zh;-{uTt46**QkSA%N1dfSJ4~OCRCL!vh!668l-+ZELP^e-^1jwl7dcp{*>nr{ zkq;2BSOdQmT9{rH9Xjti_Eg{SUQMYop36GenAlAZ;vIP}j_1uhSHUHF?)~ge&v(o- z{HmO9(%yQ`4`koi8(+xASmmkTC})E)&SLgPkFZB7=8WL2ajZ?Trhj=ye10wX3)|I* zeF@a_$0Zg1#;>m;yx2dp7h7m>fZrw1KtTiMc->pjpf9j?^6UsW zh3nn*zR*DQl3hGcOS9?u(4e}=yZS4s>+2^rvWkrX{XCGbR-NFv^mFg0cX}#){d^yo z&58Z=`a-3Tw9rq+Li*ggpEISO(7i;dO+W4Db|d~OI?R{u<^Bd|{(oHBNiQZ=ulTA8+=xWx zutjY;FeHuprfSaD=pS#68Rz(}IXs-$@YMPkl>L0Df z7wjJW?6Cp(5i`ExI}<7RWN?q4&l9XuCzshhd$cI$VE2%}rHm=rbN-C>!Mq8tHm_dT zb**RNKi1yi&Di@&ulrLPy|3@Fy4N@7S**tjxZ84=bGE+y)TX2BUffgV+Sq)THFQ_J z7T$C{c=Ts%W`O_imPQ--Jtkky3!8b_8n%PHGlItxE%cQc2X(WJ}Sl~C+p`J`_tsto3!gL*TcYV_%7SkGMoFsR!dP$BDrm-BlB<& z=Xy_Xxkdjc-+!PCSas+5f0Vd$pY~KKmxH{krxm5SWZqPESGV?1qANNUda3A9H{nv%)HXQj>o-tRk{xyZY2 z-pw!4T=)!BpXR?;$D8A1ZoFRfm@V|fNzV=Y)1>E4k*DPk|4dxiDPm~cApUdzw0_}J z{Fe^5blAXu;>2!_4X3&}{vD-K4gq7QT40;X_u>UHbMEP&a+zDz;nPZT;wN=;bUKBt zXmbG7wA*X zcZmz@`F{ajhV`I&rnbQLVvI_acY8pSSeB%9%VEXr#B5$J#Ey@7D25{1XRFuHq zZ&Bpc=o@E&4sPh#0&e&=+;(I(>omE-YFRt$Ph?(Bn;LXkspt2oVU^7r$DqFi%(MCf z-dxdDTE^Om1(e2oH*IlZJ3}rQcTkQYpXggf9AkN$KE6o5?VBe(SL~YfoW@u-&~|dz z@VJruKe}c8!lnGLA8P5aoquC2q1_EXgr*?VD!zq2-<}CgiGT(I^KQ+W-JY>*M;{(z z9A#d}7`@A#@eY&jcSO!&K zsfK(eUVg#>?_l`3Vy8+p)+Vo;yB~`!9&bgk>sy{nT$E7iF5^?`%%#kJ!aMjRb(%G^ zPF{oN$y;jiH?+RpPCyeqs=3=T3jiSUg4-f;SUM+jyAfKTOjcX(D~oD%qdlJWEmO-d!6#@yP*H^DdX<{ zZyCF-%HlTTtRvS>sloW~P7A_*WiifY3WsA`WN$e6LF!&d-1Es2(=5n%_UKKf{dtl+ z>uUE*X~6f1`*p~#+^KQq{xz3pHPAGy#EgkP4V{_io5Ilv`Uj&E_+p}0QWi;B%h=j? z9;aO5q04vCi~P9C=g-AA<-g#2^MAp&-_OKX`XKnu1lJP!AUvdXl6c{@@5DZ6=AJO| z{R?xQbspMQCMD}JoD#5@Yz+ zZ=~*%$n8IaHs@cPX30r~IDH=cmYEoLctJ)MonV&!Fe7u8xQPBmTt}5g=_*GO9_v%$kqMk;(mE^Rm z#;z!z1^j;3_q~+wPQJ6I)y<5)QD2ANk36n>PrFgy&-XpZRew7&55#9iU^72fB@kQx z1>j3rUOn=C3G!VJc8zAfHBfK;&!l%(XeRVd;L}g<{|UcJ?+%pv=^e>;p?4QPh2AlI zwx;*n|G(+Y7zn+0LT5K)AoMU~)JEa0?eCnpU+dhO_F1iHKR$r=V*+TO{a| zux??ys^SRcDR@$?vS{Q6SM2j>tB?H#V_&U$m+X18lUB8~lXCQ;-LQm`J#W+2(aJF0 z+t+O0o1xhv>{dOp#;S*L4%o0m)7fWM3tl&p6Z#wDdr(#Ug5aw7OCkJ+R>hCx%y2`=9$i*kHh zV7HNrBn5rHBKp~9Y;*Wte4Vn%I^s^2GpAT%4LOI7SVo{_0s+@<6ZWerQDfwM_Q{+?84p>nNf9$ z_XL0cKfY|cTgFD1JQ0>_bF&wzhxWZ+%`|k#tNit@<9E@9EQg#&EGo6>njK&GrAmK{9E1(LKZ|_RO)Hga_OG%W z$B9uf_mwQii8AGSgq+kT=POs?3*-uW0=;x;mg7K?a!py30Y2oMJ5mHb4d7DXE*a`ICI-d?#bQ{XKbxVNRGq7IX6FPylr7bXB+Ev zN^w%Ot!3pT&;v}+1=+uvA%Sx1E8qXe~tgOWDI7t3V?g13p;rlyzK80rw@vM~%tJ;E{ zswFD^d?N3pfrHo$9>HE$%6Ina)s@8m9dx&MbxUa4dD+v*dgY%B@+tDsO+KeH`0+?S zIEl-6j`DP#Y(mBJ)VuGESLdg@we!aZgj5CZV~!$M>N7;= zH}%s7WJ?-z{NahnW9)nDu2ZLLWIWQ9J`g<8Hdysl%stLe@XhY*{A9l5e8v8_L+MY3 zD9^TOgKu}oh^#XA5G_5i_2Zv1THr;pRw0Z0GDzOLtKW-zK40>Yd56X5{V1+BmEZImD&gE zgP_Zg^k4iXWX*aFTo2MegWfj_u7hs>4YUs7{hiSI81$8x1z$kpeDd3Rp>Og~TlcW75YognDqMy{T;O6=n(L%yHFmZl-!FW<+#zj(Wcbzrj_ zIu3$=4p^`5&kizn>lv#vyeF}${l2_EBDdF5|2XA7y`X=~*j=XFPe`)~jTE|ol|B?y zcF=`JD;d)dp{X1EKVHn55t>mog7{bYtOF9~I)=6-)^!16A?vz@x@l^FQTLD3eOtEE*R~Hb>(gkmT?5)6$e5Tj{^WCp(lgkC=@| z7&FB@N(aBa=!yS)R$H}_xheC{Z<|k4cAKV@t#!GZv!Xnun)(4l>brs65NfH~1D`g8 zrdO3P_g11?HGzkWU4DKi-SWoO`v(O|T{-V)8Tt57{{0u=Y1Hq-*n95{ zvc1Fji(HfOUj{$9GlF!HZ=e1CrJSWJ-kn=4yny@WBlX6Z4pnlldKUZ+%vTAlE?ST-XP-O&%KTetN2d$o?t{hYw}l*A zi|k|U<7G^rz;9;A*XN5Ldw1ujlo@jn*)IB}8~kc0Lmt&hUuwx;*wCoyA5$i< z8U;S@$o<|AYRo?P?@hFTyU5v76TrPpWC8xZ@YLaQ(@t|t%ITBex9~iD(RlxWlouku zGw}KM$!s}`*Pz3{cvcchecHX0VbSOGhp#gP1~EB+eKgzjMcOMc?j=s|4v}Hqjc1}4 zq`^O5@l0%@vi1eqLtDoF)tE1*s5h21;9J&!ldJ(Rvj#-7o{X@VvM?4})Fbn&;I~dm z%mtBItU-CQE-)W9wwezcS#t}F{j_=iMfMUFyLnDx_y^L@AEBY}VhT9Pos4d(qj49e z^&Ob@CGaTkNPW?j2-gn^v<@9b!yd7 z`Vc|C)5v`(YpnPZrqsvVZ16#Wvm@Nwwfj=EB>lzf@;?f|Lx zfmyG*RXx9t;AHA`5dNfIt?$0gFQnd|%z7JI)${uZ=2EYtuRU$Md2c34>TNgct!hvJeoc?fo< zAHqhy)!zp5J+4Fy_Q6tfNgJ(n}N+NzI|$lqb^xhfJnQkD zdALRHm-aH~6U&&(IbcuxRrYIL4L@x0?UR_l^~jZ-z?qL;e+qw|aiPkAURU>{6<MD6nKTeI}UzcVp;!WY{N%Z z9lm^ZY%9U~d#pHBq8v*1??4_kn@j=5Ed-sKsBo`DPy9bvHeAMm-a)ciEoL;Uj^_}vBH z$qC5G3#rgQTVxNueZchJ8#sRNRsX6D4({a*;yu=7Im1!prfw)SWmF^Y$r@dQT#C=g zxD-C`85?WarFlu|o_VZg(<4>t)7Xvog{joZ8^+movIdH6QTE;c;M2`|CHc(5rw_8> zYb9spb@7GhYuK49gS1s*zqyWmc3N6DJ=nNoaMfoizbr&A55|tg=jIS{`S9)(;1+0_ zez4WMVp}cYUHNqKuAF_%#OGlJHevSitX(lqvDwyY5n|`-^#9m<6X>X_Z1MZvs>}fb zBuoir!inGrNGJxWN>G%j2&5g~>m*DfQ4z3J)TR<52qKazv~)waA%H^_2GSzhNVg;e zMMWh*JGHh+B@79H5W-ksr@r65w{9r%0K z0Kb#ioD!zqq`zr+jQh4l-?ZqlWt0wSUI*<)d`;Y=D8r_WuR-a_uGeZq{AKynr}B9S ze?Q>fPHY5kDA#KLz+NCS&eQbu828)p+;3mT{kGUNBDvqaTvFPy9OJ zdgbYO-@ND<&3t#fvp6;>_)My9H{^~t?w)g(L_RIX;Hg2qKpVgA` zZp3|q_T$SETwUB;WC=dxAs+fxRhiL9-uAt>C^t1Q=H%UW+vG9Ipyd0MK_!o)-}(BB4{YW8ozUaB-$um6C+3ZdSKgfY_+#_O z6%KuKX1baj{~b6i*!25xwJ~qbtiC-eE*2Y_jP)#j4A`eDXWn_|wP$G8o7h>OvzE_T z)2`W1*`BXRik}x|i+>~RiufI2SH?GmT@~NuvDkzsKJSvyEu%}qtJ|)Kf1m&Pmcj8Q z{Qq!BYW$yu42tisbcp;=jfl*$bjcmNM~j{Fn~v9xu!Q7Zxq5!=$K!%FS6M@IckF#3 zR(yr(RxODAHjJ8*8bJ(uxprj^$?6B3q*93q2`7d*nxta5tbS^Y?Bm7Wd zZgW1gd$(HR4^@*FW0|F!yUIH7P(Girf0y1!{l~Q1fgSSCqoZv;_VFk3JM56e1zC1Q zBKdFl{ye-)^yPJY&Pg1qeT2>+{%a%Qk?&FV&0Op~Ilkq{;H9$X%JE_I@*RJL(t2{5 zh2Ns2meNjiM73)gHZ9&b?P^&rdV=VRj{KqMo>uJ!%A}2lvSW8~W-KLsR|RjKBo-O8 zSuMeR^Vw53(ypF%H-m%MdMSe@k$>$F-yP)+TRwJyJ3eyQUK*+ll6`K% z+Xo%^po7=>E$2#89dHc)S5?@E%aoZ(HNMQERf??^xxEi#S>f}a(MD{%5x}+7ePoTuNF@Gz5XjZsn;FvkV_UAkMb6_u;DqK{PDeT;FCeh>WJZo3u#BZ0H7H-Z}# z{Y2pH1&;E*%&>O^X*J04XRtqg{v~mT3V3Hln{(KB|Gp013EVN}aSj{0@>zj9a;FO1 z>#SC-jC~rx@6K?p>o$gRbdL(&`y;Q_j8c%bdb;1EUgFt_+%^3^ebXv&dgiVbz+@a}pFI zwvogO7TWk$>f!6P=~k^4KNX1|DYR3cYuExRsn^#4zxnQqmgORw9749N!S7J~haIft z1$|EPCN<7&m$_$fPB3?|=Ok5&T-Vz@r*+;v-L-!RfSe3L+u%#k+hpc%(%WO;$_osH&U(UA)QTb6nO1u1<&M?yA^GUy+k#b#BF5tot{9ygduv+S1!mfg!jVDe#Bh4p&&U!#cegcs(TaM*T3U2XFh+ zt$Hpc6Mx5Y4SF4Dt^s-*&KhLT9BidGV$7hoH&AZwm9;YW41HgfiY>6%W6)cT-p1G` zqx|!}lX*9{;=Zd+Hy-9K{IfgbO1@-+-i#cOP0U$kk3>;d+e&Z7{%BynLW^Oto;LJW z!Pq9fy}cfP<<>C`IjN_xth<@khSKh z@saEB19oz@ejcri%_|=L%p)K9GCvw%?Xp#g$c^N)&^zZwW!F^++809S&~`a(9@}dVaeh;)J(lxs2svp6EmLXW#sH`mP1elPm4E*U3{Yb4~jx zl)qh5QWzgUfXe*h1no1{n8Lcg;J5Gmd5|`m^-5nyWNxf&H|It&?dP)YCi>gM?>anl zN8fbr_EjZ5(v3VdLg|uwW2F`wC`VW2(<1^p?=Fw*a2 z&f`@-h7LLdjzo^Bu?DAn$=LhOh7Q_q4NBR>_~SXpvN*@GILAJxE*n^V0<28^Li`~+ z0;_%K7YXPWE;T5l`l(+hbOlyf^P^{^TY@qkDP0(w|J%1CT)?WBwWiz-22;!10=vj_Qgn{PQA-=aPoSmW!iWg&CyP2Y>lQ?wj>A~z(dS|fZ!Y{y-zv8CYCXU0*AdfswoLM*=U-4t(Ql*RQsua7ue zX)bxMktKI)!Mwvs1UE6tF-6|w6b3z=Wmk?>%jat-zeYLc;a=e(#`!4h#XXZF);3SB z`=a^vFOM|WalezG1~;hmQQz4<`^EJyjT@mxuCj<;SO_X2k{Tk)@!*aTI}l-X5`?E&ZFKe~qBPrPIO zOt~kN`$0Rlx~j`no7wIg+C4_QYr)A@t$g^8YT59zgb|OaYgavXJu!)w1Sy;PGv1!k zpr=2lZ588+Pgm#8+!KGO&X62#B9HGb4El?_^O3Q$E?15v5o>w|{Z<0Q$AMwfZC^Iu z(4n#UX6_lP$f+grfY8n5=nL=jy8+xYsC;*F$B@k(gVcE`7e4{%^Apzfw)D?D-263Z z^S?`(OY7tNzS?k6xz&>m9)QAz=Lw z^!g_B8m@AuqlW7A8qvi*dlB@SrAF%X+MzG`5B&5hXUG@8Sk5bxUOx(;*9GbSXY?xk z^CRfyA?WoJ=yd_~D*9@B^tu*$ozzONLG9A(bk=$uIH`hOTLS2{KlJ(v^eTEw#s4LG zz2e`{tJvp+UO&AAz4|IT?l$c!%24qgRCIp|kuObsW;`?`c3L$tZx4QKW6Birapxs# z@r8ZjxAA#YS+bTN%AGJWU;(r@nfuHlr`7d*L9n(wJy@G>4bgsA5v*a0sZ1%qfja#7 zocQti@ZC*>J~QR1j>NzXjh8`D_ib6)jaa7mb&{{9niC?}^2@ zMg3b*E%iJ3zS26oXs^0i`20)cH!Zpfy^k?@b+QKsSnYzb-{d!==;y{>PY3oF34F>q zW8|*!aqdXanVzAnwS`#vRgPyaOAIP!zXKvVhKhMVALO378og6|Y_8iWGOx(%(e66*gl*gpg@1wW`8~R)RbrDHx@TRjVWXSCTb6@M z$lG(b@~)5bs2HADi`+RGKY^_;DKiw}-3Kwg*jV%PhUxc;-53KO-NL7n`e+LG)E&sf za`dS$2eSDxreU4n>ccc(llSWLOWg+={orkxhwI&rhD6r1f z=Ry9bCy70L0J-Wt`u1Qysv?fgM$YF~!HeP3)ZKmJ74!+t?pUS!PA6~s)2~x9xfja( zfZt%}(9bc^E#@Xci&f-yWNktNCjJ}2e>u8E&7I_4LVt-Wu-h^%@MC;Z@_@x$EAcYZ zL$wEn@wZm-HVwr#Fe}a##~Y_7ftgd@6DN!BLl5`(WM$I~$x)OZYCC=qf0No!EuQ{P zP9N_&aa!@V6olGlp{qMb5Hl!AeiP%~l0^L2F=JhCGUmyN$Y=CuV> zcNO<#KD+lbzF!m09u9SQ%h>N+KIXcWI9PUK4Ihnic)y^07wzlN z_xAkDSDCi0m$sMo=ir4N>>;PN80)Ot0q=(1vi5Sh&f-T0ib zF4@ncp5QJg;eJ0;!qEr+7S=eBd0IXb9oUGy zwQN*~?aABWZ`?b~WA7K+duuc0J9Jx=9%3_Tw}p9#?PmaEE5q~lxZq*%s6xSge)dqU zI-R(}*bN#!ZCM^JylWzFXp?S+f5y2FP$sqlv8~8Fd|UAk5PKTs`n=XyX&3GOf$!o= zAUS6DQ7?HXJoH<;)vC>Cp)O!Ad6`cV^NA8z?8NQ`k4R7=3|rJ*zy2?ETd;S)Lrk0O z5%5yX9#o}no!#3Ak4aDr-T&xDU`pNDJFv;VWB7V^72huSfE}F5++IzGrmR8Q5AP`6 z=T9-GX9YjTU8mg7BtiR!_oBlwZ z*tKMwmiFE?R&>;Ta`PEe@K?p1892$5y)_R$SgGrV=pEojc=D6zXhy!b823#x)Me!6 zM0f1&9zuOJ{N;Fq0&kNX2666dsc+Qlquu?b9v*VeC-uZvgEp?9UU-M_4U=aG{}8?* zJY(UHzRb(zckq(qQS2}Joj`pLes@go7vHuQ!d(aMRlKpZJ8&=b@WSmb;S*Ds=K=cZ zK-&Y@a!%8}>Ph9;g5JWn^7eG1{dWH5aR#iVy{up6t;1`;`n)9+Zydf4o`vz_6xsQC%8oe_`joz81#xv)@!WsPhIi&4n67rlsFoyV&AEVQXIW)*kQ!v9}l9!2D5cKXK_n96<^KF~s$ zz(U~I$U65t4y;+{S5gkWiEm58o8hj{DQ|f5c2@=ENzi9vxo_YJ_Dx6jQ*kkJfU%cL zpAC_G<}vQh?3XC&I`Q4(8O9wrcj^;EwMNc_aO(O~?ywFw$~iZi;hC}UXA5mB z&lQl1Y)zP!lsH`b>64b_3;2!b=^nfPcj@6;U7v8W%iv7!Kpp9VjCoc>Y7J{5 zZQoJ%D0Om2Q||HCP3)i@N$+6WL)`}Ix>BdF+1gQaSZ>yi)^@O+07jotzm0m4D{Bfm z+U5Yup4B1T2@nh1s<`fh-V(5HJPs`KBkb_`IJe|8Uxt46c)?|7=AVRC=4K7fE=U-h zK)&*F-dP-jZiXcH(OP`I(z1#u?Y=1SAMdEWzZhQxSo#nhC-@RN&OBs-!|Z3#ai#?5ILkN>7Q)Z}z*;^-$I18^ zI?jB*j#Kmtb(|vhwaAkTksU@bpI@Tmh;3jodoEDNInEhX6sTXlNuQj*TifV3dpHLg zS)=%d$^P~@WN&xU^@~RCvbsXwLJvX%*Iy+%koa-+cE8nwbDOj8WQCk}-So4i>3hRY zehaiGXK)w#>%Y1a{YAUG^Z6SKIu7U5Icu;M+sA=CM2;)VD=WM^$SpR2--2V|b)xT_ z%Tn~SshPT(f?!SO1$kX`zEm?5d{Hjvi`<9SL0>Y)j!)5pn3Fl57Um;zL=y9IX;43wc@7RTwB%HhE)mpS)nuSQg7By zkLln#@lZ$CaYZS7!qP|kX=|wK#QR~cUeK=4`S-MYvLacVEN3_P>WLoJ3q2|y+Dy*A zP>_8K3@YzFF;2H1&03gF+5T9C(bah*b>7N4gE>;>rb!w z^`{s7`cr{lf12Np{`5Th(?awona9V&qz;mhDKtp{g2G?T^K8l|6-S;$#`!WycbgMNDP?*7F0$TPEIUH1j(Qn!I;8GmVl zvZ)I&JXH{i&a8M(Ar~F9hT86(nC6OuRuj;n-qPE4ck{S>QwuuLY2bKn%sAJXqlT_^ z`kdl@8oY=s6o$^D>u8C}ribYFpcVb8lju*~(JOkmjw4rnCp4a0Hhdp6Bj=JQ?m<^x zQ2wwyyP-d2b4H2&^cJyN<}+p=WV~#vs!glF?v38$x#~Y%^Pw~1&3Kc6!HD6;92YWX zB5fZ@S2fQ$^43~aTXun}-HyDI-OrHK-eP_U$T3OidHracTcFyS)5$UaFJI~U@?P3f z+8!Nc_nzBGuC%Ru-U9!#@}2_S%*$RgbflgxiN_)5gy>6m&L9`sRrk5(MvZnYxGKW6 zKlEN#O;k_U(uonarz_XD9$neQMcHGdDI!XEW(%#UYPSoPl2QI>-+^;7+0PM26n|e}ggNna{=t-x? z+`<07Q`hy-Wtz&9(UVx?=8s#Ji;Y3(L-_0q@ab#t&yabqWN+uB_tvhK@6e;6CmHg8TR`3dGwQ(@I) zK0cr5OEKPx#!6V<3x;4DfNS8YQ`;2w`4!YYQ>*ROX_22D?uCzWF zc|?yb(9`{Ubfw{yV=DT|j^5 zBf8Mi2-i2XJFs-LOLQUG^Yg>dg_ef9KBet}rIh*ie0%%dn4_Ur)vt?iZKtn#a=z+) z!53~1CtuFGaMyeERlknD-~%RK2;>K@Dp@OY-WcxMNFSb!w1rnJ<@Yl0!{{up(}&~` zI>r1~gKK*<{1%)pA$IVpzx!_5%NhDqavyCjd&7YZLFAFL%h+$oP=De#Nq%0wg}if1 z_?`mac@drUFna84zCX?RAU3oDKFfZP96V+Ao3*_bavbnIpYvYuoOQ3rJNWeuAlKq{ z^cdP7L4WH-9=-Ky_nlR0uLdjkVLs$+h5Neck?a9$lpa4j&(eJna@;ZGR?engy8bqO z7V$0_`;|qU9n%I6o=ATNU+e8oM1K?h^etsY=%b%-hbH>yG+?yTuaD+}GdcHep^eZB zIrsu(^zQBfqm^ZH)|q2Fc+*!jZP4IaAEQ=szR)t^z-?)6}rH#g3hnce9rN5pols zWpBK8x$rfy2X%M%=*H)r!Z!^6=9<0m0QkeE+t^FjIc#x{D5e?$EwxFBU)GhrTwsW)9)Yk_&Y`4r)Qx8nEY6szCb!+e`DzIvYkVzV>f!5m(!ORXe!9S*ntl4`E5Rdlx33@wy;J67yb<2Nl>Wh|gZ9U0CwEG>60-pt zW@)YcM(reLxzI&zT&ydxCQRFK2j@C-ddob!sgw0f{20l7D0K5;46%j5&06?%O*(OP zfLs1HY=3^79AKZ;BTwjX8_$^yK0K6({El6q&;k40Wl}(sm>xcO$U@rQQ!2JY!JSS1! zk@j*g1a6X>)`Yq2f#>}&H)&pA?)1Z4@E|aEAKPfi zU+V=10Wfc=L^h%H};fq z2F&AhdOr%xYgQ_o1@0Ps)U32`HsrHj?vqzs9PaaJtHXS*0c!*912m!YJZN0teli0) zKl6K|4a~~~=I~{q^U7$0&JRILVk0wQ?m=c3m|p|jY6D=NgU)=FALjTH6smqYPxixH z@SxLqd4zTuWr6S(_@DVmS$1fEN#}-b+aoY%|Be;d2EhCnFi(QUGNe2J<_)YV2YB5= zc?&RaaTqYa3>XXl&G*B+uOH^%A!W6CakvklpFp@TzXaT`rY(G`vU6FgPUG95_j$w$ zFyX#GJ=V4SXTW`?AMP&!cd?lXojbC7YXX0P`d%>+`-2YDGz|VndAK+;r*mx@MnQPJE4(%6qwhwBh_ofG9UEd=Q?qiN? z+rT|90PgQ~HTX;=`v)6ap$YfmJcG}41$GAl=)D|z?0RKy*bnz3$dcwAn!sMph+fh^e79y}noZ8t-(CXlooK7WeOqV%+*2=r`)_{+ z-0uVKri=`aY094vuD!nvcwt`^eMI=y^u`P2W7$I@PaU}hJs6pMA~+NMMQl3dW!&{M zci984(+{|*6n)Br52WDWAaZSy-aq;w--YMj+vmdmP5JvP`VYiIEqKUb++CC#_s((d zN%+7#YPEYm!T%%N(LwtR`g1r2YdintD|`gI&idilhNmOnT@|a#cvWhLhNRwVW;Xu5 zHvylctYt$Rx~$f9dC?8x+?|1s?xVf#yli92041`1WI&0Rj7#VnKHs3=#TwV+PSQ|j?=%hmU(k+I!?>rUvhSYG3Rs4c}tr) zXQQ`?E+c1lZ5LxN{RgEK)-UDonRutK&!TUYii>QaoYWJoF(=Ud(Y4>7a98HCfe4Jf7g_^djVsKTWsh#7sA&~TiLrI_AWY1(Jc#W?ANvO z;~I3!Uck1Nd8}yz+w6dI@I+^0?+Sl6bopRSO&Xzz{3rBxx4;M9{J@bwo)Y73PQH+* z2oB}UdY*Z)|4K9Rd+YNmXI|IXuh(?|!TaIsV_nB@1HQB`X)~`?f^)wf@TGrVbFW0ee@RedM7vn3OPnG6+RppDV=%F7k}dU*JOr;8$N$C$WWcD&*c0+{1%} zcUMX|{m5CPpU?ESZX0|kKwfEL52(<3u)s24518^fu_u?cY_NNIxUxy?33Ua*n)pc7 z={)R08T15gWq%y925X0OKIHc|f)C|DUx%gsL9qqI=(d2n1+RR*~CWhRpjwVQWvb4CU}A836E3#xSULxE{if3 zhZ3dBqS=1@3GM`kVviqs5&Zp5VA~G^ITwS$vmw zjL7~ex{Yp&$eIQoOnFxJ|ctG)TY_K$B$@V25rHsX;brn z&m_(vZ0q_tBsdj3o;ch-9$%K&6!giyt$f4YLu_wNb?ga||LWp;>iXI4QJg*CvGwes zPVgvaPaqy^z@vk)?__Kfk8ea7d{g+l;8D&c{XFvH(E{Apfk)B*7qi!ehwW0&?@6bM z4}iLO#hI=D6_3X$lXHsrn3Xag$F_l5qqJim2IBEkatF4z5Bms=+QH*xlnWkz{hoox zlaI4^z#sBjWx3@#O$Cqpz#}@Oj>lRZkA_Y2z(&qLV9RRz=?A;SA}ROf3VChK`T@REOo+vXyp50eC!(zu(2|APc1J81}Az zKX$$d9^G@W{n2Ly_?w(}qbBx}?b{M{JnoMMkMPwaw_=k8kF7RY6OR|+s}D1_iN|f7 zjQ#inG${K~WEs_S9*^gv}1|GYBH}r(kVm}@)1yf*vM#Y4=+O^@Uvo35?0(v{*6D$8~%^2p*BWbUYr=@o2#R zgy0dL^d5akTmfT0UMTZykZ}X>7!4i|x8l(_XHCAkR@w&O@tTX^@#Ehr%TCef7vOQd zBSqT<9-Gy{Iv$&cvLDg^!@=Xvk#lO{t2xlyJjOQntLrmIW(rXa|q|{CJeTEO<;Rj?%7d2aoDS@c5v>sGa@zE6N3r zKh8GrcrAG2TrYL#_RMIvjql>OB67|nVpm&-+^OTz$US1pI_dP&R@T|ao|OGMOvVnt z<*Ed7A-3YuunU^^hc`;w090|S?a zykqcC(>7a4KlQEq(l|ps;8I}psf-sZp>m}B7+a~dmY{joZCnn#$RoVvN z_sjbB_v%#edxAdMtCc(QEE@7q(^TwZx?aLwm3yOgBY)Xmy^66t^eOsf9{3eJu3-O) zj;7n%(Tg3}bYxHc@K^AIJ?B83Vb75`d!h%=VQuZfxO1Cz{r)2B>MwLlU(ju32YaZ{ zZPR)+>H@m`4eR{+9kfD|3IAOTx4zMo<%NY9{bpn^N4L{QI*15dHX3iJJ5qY34gtr zwaIisex7OED;ayLd846U6-eK}OKc5tw{#F6wYGaq{AvWpPfOc?eWP3i2P?qA z0s0IE_N(nzYbU|QS_?7L!9k5*fB0wm&(j~yfrA`ya6e<4^z}|8^#82LhToWsWo z;PcFJ4DDXU_wL93(OP9RzV0nmVR?L4SA}UW@b?6<43dNF-U8mR-KJRGZ>h?=eZ|h3 z27O@Lt-qD`e?#F1V%yvntj*%{A?&;o7q5Xha1Ci8w!`rJa{9liv!bme9)kF}1>YrS zR-F4@{%$1}i@XV3%YGCcL1ZfSgu6J0cY(n9z!vTj;MqbyqSKcX0+0vqzJp&yB_i3ff2G=|*9|D)Z zJfic4LWf^A-_CbaPd-=>tR2*ClA#Ux5Bf5HJS%>J*gI*1oKTpr|E8z=eZGs%rSq7T zvew{+a)&RotG|5__3}IVEzHNRBEQG3oAQ>|*MqyHQk6IF#M{&RUPc{wD=hclnXlqI zx=o6}so4r`BWE`2cF?X3#XDOvb57xl*$U&14XXz8jskx*(G5-ca}DrpZiTgRM^po> z9mp(yq%KfqQDkqjuM8WFVVB#t)R0v*X&bONdvRv8XEWXS3_b-9>bADRHF<+I{cJ14 zHy(OAh=01=^MJ=?C!mve+wjM{HZn^+dou}|n910t%(64Wx4anHBmaZYLBivOw+Wx$ ze}J=&``{|*j*m|m(NfOukg zmfpkLDE1R)>3Mso552uud3D9Rv}-FrZlH|4Rw_KqQPx$rzqq9xxHHc=;aBtidf{1j zfOVHc^Ht=V4CG^SCzeC`ca$IGtlQCB+2m$!roZDMT~0K7@S8Ro=hT<9Jv;(f==X1e_vIk6x9*GF3Slwn(IS!$g7f0ecYduk*&Zf{SagD%@gpWH(f?#dr7 z_YnBJgz5N}dx$(_jwEoqpEb7n7XcrE(W*8whiPZ|6JwjWJr$16H}4LQwc@u+LmqGR zZ|2-;Vf}-t6Wf!4`>2Mba$ja7{?`Xu%R(Af@x}%CZ9WL^dH1Ia`BFA-d9I@`;Y&lP z3-oJD-ZIx@?Xx8wSReVw%q-w{I|aM;LkcoOg~k_ zPq^a$6?48Q|Rp<5ZgPU8HzYhJPo0U#MH^Y`vDt8^GZEP#LnX1lT z@lV=`94Y%oc5kiUa^c=GZJS|2&jB)mDO+187ybLg z&wRQZ`HyLGCW>5vFL+{q?Ev3}x4^ekGW@ob25=|$M&+OSGVj)X{iEHV(++vKQ1#27 z-|}7XE@$>ai=nsI>-$x0DCWIU5Ap4XMyly+1bxW)Qs#d*PzKLS1SbMZV%wCC1)k!s zk%Jx~u@g;y6}f+X1sL$wu+;Qd$tQl~V#@Tr%GqP#?2+?d&JMYUy{^sqVe*)=VZev; zqdlLD&D8B@f4@;SNWUxRonzBO6~-NNVr`gqkURXV9T&e}7Jegq+R9$8<9@il0^fh` zb{n|IJzT*3h?To8?uSLbkUQoE?sN|$-y9lB%nxJ=;*WY8ISX%RulI-kn}Jym_J_R5 zl07}2&xe7f*tkyext7mjBbmhh68W~C&wKf7{x+TcdV)4`->{L-dO5hcn*A>@mpPn( zE*hCDGHhkBhx>1NbIbj+z_5|I3O)t^=cBBFv!c*pxq&uOtP^>v0$&-{fZSUsIOV*FJEN6$D8>c^LpSH&e?%JX4 z49a!dj#PBo?gLFSPN4(378<{v@9ah0=CH3InE2JoxP7`@dEs4}P5RgMI>WF1PxzJz zPmp)Q=fID7k9?4G#>07at+Zbx_vfOc`0ve^8uHSW)HTxAA?PV1f0*2pH7zbb|JL9L zeiw3Aw#<&6zBk~m3|I&}s@WS7!$s(6dYEBDSO~7<6a%b$A9h6rc2EZeY(V{(oiMr>l8aXk^LM-^(S3A@?fE&L4-WF=f`QueVX}pgysK z@t&>^`Gs?+|Jq+K`FYi9BX6y=RjAL>^Gh54_!Is4hd*PE=zyjF6ZwaK&Uov8=6HF? zc^At+{3q6^uTQb)vAy*54Q{hObS;sMUSYg!^sV;tXD^aE;>1lMzEIoz+0Xmu`9GOI zTm2dHopOo!W?f>w_x;TI3S2LiKYJ8#O(52V{MX@|9RS~vZQy&C0pB4qr$NBCM)IQ> zd|@(gsEdL90RLL15Ra)9zT_?!9&n9+EmL*a8$94)Xi{{hEBtGT@aM#yW>NG#5IAo$ zC$_vJmE7N@!RRHH^SR4^?))PzF@NhN=Ks?WgLc}R|4HiDQ-%L-{(_4O-@)?Epu3TS zdf$-qxG?Zxg&&sWI_GU<=IiwPZciiE`5Sx||GgcF;ET8RVvCUc#UC;+^Rw_F zlU`Oaua+^)F_L$+KaBLAuqf~5k+=LfeS{N(J1?0r(^PF4W4F#R#h9Z@V9ER^>ht%{ zk@?FUS5qfvk=h||PZ6J=_?K^!kuPtXZVNHT*T*J5cPo4hu!px zz|O$$7T09n!@i;1p!2jHc7>cMDmg4w_erZ&&$S_MH5GWe9%G#R8)vLRZfA?)a(3da z{#^1Z&bOS&?yh)~?z6kLVehLVzQ9|&+aJ_fdAID>z<7eHokAafDp}RCucRIE^}h4B zyR9?v^|~nUifwk2w5{>CWsTW`6mRhZ=i7#nqvmUWTese?#ow<*%f40d_M+c!{r!GI z+k3i7zxcA#_iMC&9=n*#qlj3$iCvXU=W2_sh}eeAJ=6J0#M4D~oSi6oM z#AvV(zk}GN(}`U=o!F%th+W!+GRa3*+)c^s+SNY$HHlqniO)^qdvFTz5kFC9loNmH zUBtHj+Mz;`Cjw@s$y~)4PpyAxPmk-~ zZoc=r&zqMw9%&{{uAVc>gWqe>9;(DH;fGlDFN&1?Z!Ahv~de z@p}4zE8=K9gKUzd_n~Sz6I7c{NA1wY?MKh|(NE{C=lghqK9Z%62^MWajlYlN|4K6p z8;v*Saq@fUNydMi-}WIshS1K$2^M{Pp`Rq$E(Avs6Lvc>kj>b!DXM+5^9_qFOAX3x zAm3>&GP)_k`#OgZMua8p>y`f1scDnbT9msU2jsZ?3ZR z$gL)4jLgY-k2+gu(&?wiVq!5#EN16B&>wM;^U1F*Yx)Fwp9;O#5f}Mt;v%yqZx%Ut z6=F|I{AlUpRdmiL-{W_zA(7lCLeqBMvOiMqyXgz&S)63da~Shf$qjbOs-~3Hg{FQf zYsfe1WZna*N6$zxVmC={(ID3rcw9~BNSE*w!NF1VPdD>g$bJZ4vc9=K_w(lZ#Yae0 z&RWQ0ms97dROm0Ofe$?|*fH$ixm(9b`O-wU0-N)F$T1onvreE&H`Yz9iI z@P*x!C(S(%_phnTX8tFDt?)aOCe-hZ{v9i@0BF5IL| z=(kbGcA@EKk2?GaT7Q>RbA{&c*GY~n(dEtY9216XL;Q7LQ`Ztu zSDrpx8{n_oMIC#q^>-3K?;3yIC)A;1x7Ot-!?i2?b>-9vT+Q+FtA}av{yNF=#aYr? zS8VUD_3+niq^`Yq{K#l}UUZSslAs9(@%YyubC~h?=TR@Q_$}ZXe3Vw?1!>O{cY?EV z&zWJ$GVTaV&3NaZK#zg(&YP%TNPUVUT93_7KBZDKHowcJE_;M=7W1A(V)KJDcNB7r z#O9y5n!g>e5#%Yhj{Z33ySM{r%&@pNc*Op2VO)M^;`zAz&Vac5&Vac5Qy8OdT>c%< ztB?CF6&~^larxn4;}X;bq#wt z!O*#5=u_@Wvy~BF|B|@;lZbOZnK2E;(Sf}bU(fuf`{SHD8MnQ-{4@M<`DN^^ z|G~KYVt8epXk+` zPyaq|#D9Z63)|*1fq#~o{4-~ps=-4Gg@;}w2sw`VTeK`Db z1o0o;d=`G0Np6V$9IP(OrQb)?8+3m8GPz8!GwZobgl`7&%uaruxdEPe1fDse`a+(m zAS0PPvsymGKO}#NgU^AvHy%f)Dn+Lyf{CN1R*Ed9U*&_)!RB)WOFjH^rN@dkB6PPP-B0+DXK= zA@wrnD%$9u`OOb}9?;c3J0BkIw5Yk|$h}vf?+MQqoiCg3GIz=ILrx1@*5A+r(b0vs zOCP!Px051J1_|eq65? zT#vB04p#BTy3P5Rm3;nu%z7p0=`7KuiTj*&oq>1BTQeD0Z%4P7gl;hjysriC$ZXy! z?00fLzRCHx0N6_YjeO|D#rZhGe?F!FztR0wo0Y#NU8D~(=%N|An4fYX|G5}lTr6)* zANoyyMVUQ`^YJ6j$9bHOMM|)KK4!hD%+6wL^L*R@y-aUCAEWg1G3!d!>2D|J<0Gt9 z{3)EAkFN!skJoZOF6Mlc`_#MM3DWb{WHD}g=i}H{jJ!26_Afaf`>=N|mAB?f#+E*B zWxkTPCX0E9{v!0)GUh#UD22Jj2Bha(B_5le52QlXPGkE~M4qYOPmDHeX9JWdP4Zgu)+fRMSK!@#Ca##p2^6-vW@ORHhBZtLKWQZKz zkx1EC%Bq9%_6&tC(IG3>BezMe-LE{3Gsx8LJ=BR0Sk-KM3GwN;e4i*$1*VTW5mKh@l$w&r)|J{aDnEu&m? zPO%-H%1Xm_`I)YBO8=g5c9)DNV_Xd{IsqNrh%VE@I8Mfyk*3(lE80*_{Iz=UA$Lh0 zX!|s|csJIQAQ&EL%@KvT~&gFPE~j>AvNn zvwg;I^jKDuouq6nWuH=(L>@+I*F;$nWir-Q{ucLC2DOa&vn#p`{!0u7!#1e!Tkg++ z#Rc)*uop^vw+Zm%T5yq%E%k>Vu??Zus((qdVNXl7{58$Ct+$f;Qy+_l{i)KMZq-(% zsl5BgmdBmtX{+(Jw#F*`_jD`o$X!`)_aEtF5A7YqniN~n**~MFQD4g(#20Vw8dW=1 z1kQ8Mde>CFvO-gTR_?vVQJ0jt*3pG0Dn| zhetxck@}tOT<*LBVR9IlMD8;-tP>9`eO!~{P{nt=ID9Tcq@nfMrECJ>kY=B}@-5L#Z)LCMTUrm*Jq*5d4U%?`1sizcI+ z$4yIm`lB#x$Ncu>boMRzvunoO={n7QdKR(clqht2`l{jkzKPsDLj!Wxd^`)Akh7!9 zS75b`ZL@|mtU-JwH?oF6Iygl?<>0%7@@1^;ePAK}wI`+pK@)~g{MqsBUw*rmHsS}F z2#*Z39Z3$)mNC2Zy{u3twt;7b|3DMj+@WTNqMP}An-;TYgwF|GdnAShbS}6Ozeu6+ zJD^+RO?xkQ-=JI0NZbUWd)W`k#VRqbRd=6_1|G#%NcfBJ9ut?(F+V9klx6o$;~pog z8}@6?R>7t09iegMfG_hXusFb&9&kF{|CwVDyC22^$0OjP?L4L5jmU(Z{qx1|F{OT>k-zpJzrn^{nOGg8ZOp$go~ExNdAEM= zQeYvDib{-GBOliZ&S>GiUij=yci3G{IaAUqgBL( zP5_@}!T-PSJHdf|U_ zIXmZa4yj=yIp<>B6M>cNCo>Prf$_iueD5BBp9it5rA^>oVojRtpEb-Sa1K7^$r)pl zxojuj_CjC^KfOujXwIwp*UGX-^m%n?$T^4on)yoqt2eYP7g=5Mee{E`x55DU93QWE zTtsK8nW54%slLNO<&O&^k3ZDg@chUZ!*v`Pb zKD(VV@y(Jl)j?T>RU1hezGQk?QjW9>(ne5r$Y16tmUcnf5Xz7*^>#Vs(k@uLi85?5 zdRe|l+68MjP=;KumldmquS!44bo(XamOCh`2+^*jOt)Lg{BopSsFp;TZg-^2F<07! zYP~6Qtik_>vT9-*%Q|~dmQNpgSw$E=L`q>-%5>YK-Y#5ABDY0H%5<9}WjTqV^cSv$ zQKs7(Da+^GOLcmLW~EHGF;Z5XE$t$-7Vs;umNClnq+O)urK}aEWzsHEJ3(11Og+-B zgLag%R+y?`wCkW9qO29BNtC5`)b>->3ey~E*HNpctQDsD(yo*CJ!P#hEtYnjw67^^ zg=x98i_&&ewu^IA=Il`=zF(B~Ic3N(dYL1cvh>c{4$2%8iA6`d>Wa?VKd9eES$=`P zEWL~N17&}s3_hX%wz{H=mQ)t5{e`j$e_2ko^w(9}NZEFOS-uiMpIx=}l*!$Ij8U9O zS$eeQq6~hlmz8HryJ&4KWt?AnnI})$#b`y8iQQFxs}cvYx*|qfL7B*nQkLYAcHOk! zQ6}=GlsS?jY1d6Fq)cRdDa&zCmfl@kM48C0QkI`1?Ye98DHEAP%8K))T@NjvvM>E* z<>k_@hxQz0tuXaSyPn!pl(oXt(t&n8wV9MT`gHKqX)hh7k5ZNoJ;)f<6}@zrPNl3B zrs=U-Qg#PzB4w>G&6ECOwO>=#3e#1TrN?RaQ`QR8YH1gzWm47(Qw91V2KyMwT49<< zSw(McG-a(Ybx6C*v|A`^g=vnoyG*lF)(X>nX&0{zrK}aE<nTt@v)$|d%n+v(Ecp` z$;5_@A*TOsdo=HwD#S;|@He_W4*dg}A-uo5yNGq$gB_%7Fy6anM4~HDXQ9qV{yy=K z5qVVP&zq57L>{WEU?1{VWTl_TtL))>HRE1^JYl>|5jl_?6Zo9hAO|{tQR9u|LgV+) zD{mUvW2+=rQ;hqq^)1W0P@dqwbMsllcKgq*i|5F}hjbikl>C-zqLBmiVcu#@<84+v zIY9I9Hw?{7)^gBk=kod1vSiIU$LczQ>^2d5qvQjfG?%!(bAnt`Eg{+>e0Uxyzd>`} z3a!kEaMkyVa5?7$yPPc{{14@GxNAy$r0aEZp39&g}Q8zos$zT4v`TQCG|Dky2 ze4zf#S;KEvSZ6!;kc$!9=wlZ0kX)(QWGsnOevWfj#yn|d?&i2}@S9shY*pmPY3-B# zB7l$N5|BOQn2X;ourmB`iPsOUj|T4g8!~Y45bwi9Uexu1f3cTVq7$)i%)AIqYYaX1 zx8M-nrSueZ_U#0V*2P!#$+1!B=X^g?5Tt#VV0RrvhVqfiGjX(%`J29r_I%a(&E~H@ z__le|;sebm_7;vCsH~cKYE9v|Cx^Rdrs5x<$on5?P4=YEqRgn9lQ4eY8_OTSA7DoK z9psL-2BjpU?;P+vKaMwxG0s0l&2SCCo~wrBe#+lkYh=nTos}*RKljzjlz(OHb*eGB z4^v)a4NhsWMx;0wt23rT!?y$}T|Q94BF`)mU9P9wR}f^&B4ey26eyeb@%Ha8%uU{cuy<{B&*GQP?`sO|n~y9-FXRm%ysUIrQk2%!e)Xc# zU~-QA=9ZGqv_1E*y`*-Aqhw#Vw2}jtrI$>2D!8QSmXRgT<|-x4+RkAUXQ?HVdRR)P zBv?xx9~D$GbLpaCMK7r{7Lu1m>%bch)+>7=|GD>8jtWx7l6xwp&rg&0W*2se+h?_= z1V5cH-o=`xWjs81^yuWlX<^FP+>FVCGe%!ExQblZx3T7`KSs?6>#JlgDO0*MU8Z!s z+oITBVc#BGWcPMOhd#SR@s5}_WboM~#1yi2T~rmR9CMB2O$hbrQRMw0S85)4KPAS9 zll@%Bo1{wUsf#5_!(KjnzY@EsZv^(EsY9N2i7w6WYU%T=HAwSK?K9XDHP&_ZS;nBB zMDl=E)6WEWfrql{0>!(Sy}3R=S(ALI3-}yWo~(6XKj-m#$&Wgdy?X0}URnft{UYW) z5BcLd1I#XjwLGyUmD)JT!kL?f;Gst2s&Pn9;9)(G3Yvu=vbUT@s z9eCGZ)2iJN>XNwp9e+jaCVaeWH;i(<2&}El!9%{FtcUvyjtaKx`5Edqgt?4;-qqbq z9;U+IkRuP@JkOh>TnAU)=IWrRJ4X=HbWO66m-R5~6xtU120VRS?;vhhjm0-f z>5*&ajnEP+V~`(0-r4z}8F?f5PxwoZ&dTPGp@om^J+;&PrW`-=zIpMQ?7Nr#>1kdDP?mJOgCb@R1L&uY6Cz|}E5w0Uq z<6JNI%Wy4@igY#hi*bF44PyeoGk9T~Ti%#R?70%kFUYqe{`J5}_~i1Rcw2%#YU3?& zk+oMt`FEUij4xy3uTol!jc_1+9(x;JI$q?4IQJ9q=*e=2ey`p8By?R)&cz(Q%bPW4 zT8Pbnv;WPSpWh|{H+eI>9JnB>m5LvvD({8S-Q*1Yj{Ze%61~mCd*PZ|i}rWQBwr46 zqscscBP1^l@xNs*%tOj*`dGEk_`aX-V&j#391{Q3lWx^&M_9EiPs{Ri%*&XQ5ex4a za}t~7PuE|F<1@fYY+k3NJb)(73QbVnB;~pIvlNI-V9-(XEb8d1Uh4cgL_-vO7lQ2G zRrnOhoSsTUZ+-_`^LN0ypTM?9`}u9yi=xXL`C>v{wd8Hi0A97rZzIRcD3|bnHDU1V zC84hU?4e&mOzDyaznxCqEgksG_ec1g#^-7Lz4DB6uM>OgYJA-!S7sIYffiyXg_K`82yNHC z5azmqc^!aeYmm7-))05~%1~EN=5zS{Q7)19ClT{ce%rY2HrHG=cF{ciiSn>j&U<*s z({}jl19JYsE9&=(pJ3je+H}R+nLfoXDSe7897KNyS)0iAQN(ZfSoWA|pY4HH?+drv zn&H)#)7M?}l?xr_IE*|r@$CDzINN(a9OUiAdSyQePsjrwvLA*~rt@yblDtd;&-(HB z$uXA5w~K+ne&+tX8osks3E!Du32Lat2ewM&zz8MtSQvX%?b5IS_#`Ufi;CcHW!PqG z@Z}Z0bGRtf_0|27^I()qc+&Imk)o;B4E_iGCc~TO!eb9%JC?kkpR*=ezr>5|#&h2($j6wciTdvON8^;pBfSE&2oo1rf5F85gY zzi(rh>z*5wW%oa7((WsaEIcd*>StVf=SWp8v%zj~3#O^x8-2ye|~ zugzp!8BfM;$lwIS^^IGLz^=8Uf`KMx2Lw`IbA<46x-xWeEzxm!Dz<6gnm#NpdVBQ>IdoQ0`2Gr zIZ4-&g%zR5$E-TZ_i#_Klsgcx_(fo>j!h&(GQ9ot@^>L zU!Wg+!~SbeKUny`KtCvDZvRF7W zzg$09F!Pt`2Qliu*AHf0d!a07>IaWXIcH8={ooOX~+;!C(CPLFGr-cl`Q6 zVc)VuQ$MKuCHlcF+5dO+gC*We>Ia3Ueo*haP(S$3zJ`8q4|Fa1!To%{lzz|)xQTwS z1h^pY6}Ht6cGExlL1mzR@Hu7e=?5RnTmtliZG69&esJ%P7uOF?Tyr6gP5q!z%G=Qo z>ZClkef_{Ab^k^`c;xF}t{%^ckoh{B(D#eoz^O-Re^MK?Zba>IdD~_vi6a64B zKtBjWCopAEd&dj)gD>v+Ki3bovuE1s2k$dazkW~|42*xNevk^CUQ9nYL!Iaco6$W) zKgbKs+p~r_*q?Hgh)kn4p=?S4CVK_z7QZ!6>l>1g#&(lq2wa^!t?z0V*0|Pm(UkRU)#REp!)TNl^4+$ z>izn{6vn-jzVK_AR~vm{EO^oN1?cor`htvY>I((4&+7|$eD+x*cAGw9Vrv%vg+QM% zxoeQTmNzrLOsf=@*I)W3sEsT<#~p%?I|R|&uva>?Ka@jxwg)DPTm@Wb9KF+%1^nzsc`Lh1iPZP9dPr zlhAVhHdTM8`#`Ap-$)#H{CJGiF^MxWi@HE&$) zUCJhWV7u_1v2ZW4Y9sdDbE9~_trCAIHM+0l?>So=>GD3Lc!g%pk*nf8)=sPpchQx~ zjE?v4PWEMW#$xUa&T^OW40jpXPu^1U2kiDkv1R;z&Ic=>on|k=uDB;>rlTavH+k=b zPRRMYd&N!ao?bE~eq>3PXA;Kux5Pz?4D*$$-KO8+{@K1|EY%MQfORP}3tmR$fft|cdWSp8^iZ>ja{=Ne4 zf~F=9KD`ScElc>KEPUj`$8(RuIA=O3nwRz?tdR}bb|q8tLM2$^8h9fjcKy;WX@=Z> zjkU+3Ya{Hon{!j2UW`rTEWbHJ|6XXkk$$pr2M<0y@qQOcrMx~%r-nrOI!a%X2mUl= zM=Qu1%RW%EdudhNyLC;>+k<_-G!$9BfWMR3OXZ^#SD7V9o6Foouy6dZ%}U!KR~7ee zRouH(aqm{ez1v6JyX|Als$0Pc{Gp2bxvJIb?6POD>u==_hFq*Z)_m3(hiyO9_VJ4y zT?yRlOy%CgNgm^3{?_B?^Qk4s_6_%7|40kcejloMKeGgDJGld_IYp|&DN?=wZ^z0Z8Xz1^2{t+Qn=Z(XlsKHW#z)Qk=DKKj;e_T*8%FVyb+{zb7> ziA^oe{rYsy3T*YgmAIV=*4_<$Qh5)H9sNJ}jo9cDxDOIrnZ&*7--2Ii6*li{lufn3 zMfQRj_i{gbpcq?>mcky`BIUhwd;Eb4!!K$PHq1u^QV_mY3Glt{0SfOq{drEHw;s>?dSK;?~lAP z_uO;OInQ#Q^E}Ua&U1)?5x=n)dL31Kt{W6zPhq6hFY#jRyU3bWMg5WZ_}V;?Rwedi zjy<_E{5zS)^Xe}1F!z*dMZF^*A5(*UQ$AAgU31#mA*`c*5e(!3^UBF`4 zO`VKgeDOnszTm*vhdI`+``isJRY%rx2HZSoP6>Mz$IGu~j02r- zqmvY{A8-Qy|1nRF;|M(AyNf#>Uh1jJ(D+RJ)B~M`lOn9+Mu-n6$;m!yV~uU7dJ)fV z_^v2B!m9J0o`0hU-m8Zny3WyUlbO)(CHj&5=lXovyC6o5eFi6e5YMu{sgQWj{C>#x z!Oj;cI|fdh*ej56`M1d4MY3}(@B@Z7?)#1C*+C%$ju)M?kV#iCyDLr>M= z-uW<4<9lOG_?$86Jg?`;GW|U-&5d@jxv2u%qeY`pPCD*9pAGX-*c_JTXS;W zcGc?pC4Z(|-wR3nnZ1x0Z7-yLF=GKI=m(u{^yvxAhaZq*F7!M0rz&d5_boDH;CO%4 zP|Ac~d*B(7sZTQ>gqOLi+1YuGsq*c>`y(2!5l`4I?`6Ls#kq&~GS6j>_s(zlQs%hK z?{nP5NAkOsZzb=ii}`=lulSm%^F805@Y*!lVL^YBF?iUYYq>@7{Xl(Byr#Q5^9hlcL*NwStr%!2L#^|B%I;l_Jk@T@(`jxLQXWeDK?l9rk zoH*_fvE5+22fGx8SqSp`Qt{ ziuDHik+t8=eu~gZ_8X7#SHO2Yv@bGppQS(LgODfWI1k9VkAS&N_KYk^+apa$+x?uw zvXG;~ZziUleIi>ddq5V&+eTb*z9mW9Gjc_rv=T#`P9*Q}XA@xJEJ73n`O%BJ#bRzUFH4 zCfOcTbqA~j5z_7J+_vVaX{V*M7~aVENB z>Vsj9eYBSa-ExTKiYN|O!<7hi&#RG+)Ca>I#q4ADt-}U0;P>AAET0#rAL)aKA=i-TVFpSrcVG zB{J8<7L&6K3C`aiqWpauITj;WbM$qtqd||~>I;8$vKGZ>V5>D)R6p@9of8yaXHh># z{8%M(@Y!~2<`^Y2d9>ZSdV-R93|s31=qY=tB@MbQCNXI5(|3(lE^|H6na;h6?`Y%U z4&ZFb37N>ahB(!iu+bQcF^*=&QG#CTJzHN_k810xekQ8*ZPq^CHSu1T<1p1ObBo)1&Ct`|@nQ&qga7#SRo7&RFPyPh$NE=uuN6^kCneao*3EblC?! zGKl}x#whWkf{TI9QQ_!MLAW@;`05$oD)Y4BJS7%D<2B-& z{P-XCVtWl>tqX?9$gRB~1f~PDBe2e;{2`0Y*Umh4l~~oc@T*+6^&(Y8&%S&sxv;_2 zGIEJ^6Fb#mNpkp!7jchJa*NB%>NlgwQ4Y>t>D7%BHQrN#;&R?R$eo+eX*+yQJcUN1 z0)_j&0yOFyppno=_%=F(M)eZ=6hxyY`V(H67y^%R2b)#O3x!7H%McoEAr1{1ML?r- zl!)?)*xq~6!6R*+1&#JXBf-&H(;)A<0gtZU!d)h9gz3G{6e35piejBc`uYc+C9^H+|*>D5Bn8`(C0<=CA2w&P0*B0{4g|n5gZb)TG3QU z{62QNtaa6tHPOD%%)iBKmASTtGI?&QmG2UrRXhuSw(z@|_c9M9CdISGte*SbsXTg^ zG1j0TemX*zK?ZJ&d%QlB@--qqMd#P$=doJduKKIIE7$K#HgdZjeUkY~d++eB82sWl z+|VC;z!V{8_{1I<>U=Ou@jVHR?2SED3-O^VoP8L0Vpo*JfqnmclzJck*Kii&ib$L9 zF8)fDNayqT0WK693|mHEnNR%K-{r2v3EZs-YQ^;IJ4=5E_=iomplXrSa7l(kbSOXJqqgp4*u>a+Xl^9^r$QF~nJ+r>s4j zyy|1X)BC5NJ9f?|HZfLNGv!>Q*h=qAVPAxA&O@K!tVD%}xhSzVC);OkAv>4Tw)oF~ zPHq-_kp}->R+Ysj)z@JVT z0XvOp?nL#A1t-ts`OD7M{Mm;C`jp|%79CsDvshC_w|bPhEH<|*NAab8&%DFe`!HoS z!*&1dUfIV5XX3*x>_TsQKFfNvXpqC-5N^$AZQhn)pnZxAZLw{`pXU{)xQcGSye>f=eD^auK_aE2ePk%TI z9rb1AiK=XnyS(xO=abLF&fUdX%DT7kN1~^=%EHw4Cl%iuH?P~9MPOV7CrS~F}}@titk+(;1gLf z>Yi!n=_xS|S#O?!|IP!qF==w&Gxcg_-l#w?6#u4*&wB^{PKjME zVNXE(JymOnA55dn5^mkax2poN%oWJ{wX7#9{;joT5!NSyVwoq}hIUV^8`@pQp29=K zGRt^gA+~48naajCwZH$D zEbEfV%DBZdY>w0fd=uG9?secR^>NM?bH4J>K}GXli!B_b`6Uy3*O50SBXi(Q@n3pk zZ*vsEkNL%%$)s;jY?7mSJ2c~a;bWOoT0C_S-?mcE%@}{h7(ZfNIQB7qk2UzRiJz{X zsN1{M%aq(tV&G*)BidzL!zeX2#^p$+{~*5wHoC>u@S%2gJn9`_^DCh`|+VjYUIE+jwd53GN? z@b_GO0cU!tYoYE@OSIZO??%UwekRtCDC^M_lkfgOyW6NIGB@QyWn&n1n=R4SBaFYB z^M=P$O}_5YCf{*jucKYLzfRg7seO~=ByMrz9emSL7Hw7H#aEn+&o#wC{ITyE)*kGjL0KZ^SKWhS}9THT*w_Z>*J`(|5A)>!!l8L`DQ*jo+G znlkLZxjdIf#B(H5Q_!wjNE#)2l4PVy{HeVyU z*8pt)BYabW{*_TTL~Wjg?y(a;I{4|#VZQ^I{or9O>vO?u{L$IyEzIjI=CZ79{-UAa z<_ygrz4UhO-%7pJ@#y(e9FL^NI9fAqaqK;RsAI+XIgVxQNA5ZQ496$Ex|`T_Db6(3 zsn#EY?(?NhS{E{SMX!_`%RoPHe}Hq`#Y~({vMOsY?|#4_(?dkMrl8 z!&}4JDefB7%2X1_?}jg*Vb=`VPkfQ<)lxTn$1ChU~f zlXl8T?37g5BP`->77t_1j#MXLtL$N&x{3A4>qTZ@uiQOg#p)ttbW|SaIbaub3(mhP_c zilsc2Gfn3#Bqs#;7r2^%%fr|OM_Z8NyZb)`ToK-=TvbGBbT)ro@Bu z-Eqd3H*3Q9ra8Acj(GUZcP{o+_t8evoS_c6PkEnL;Y^cFTL)w z6?@dF5218H`-be1YbMwY4*RsP2ZyXRPXTTcF>mzxSyq5)p$7BIUvBp zN5E-efOo_PWbn_Qu1EK3(C3ZqQ-5wJYu7|Gx)kek7wvVjcDc9Pd|lhw=aze3ppToj z^t)RIJAJ}CJd+cI`5-?3!One?C<|E!g4clPM)4!3IQPo8tPw{NOz^4LV@b|`@~x~1 zvNp)N5WFU=_)@+b-Lp~nQknhC5mE`=A?-l~{-{l>$@5mS#4|5oNY~$Th4Ikw0 zT^8%u{c<12cIxeZc`D~WavUP_M?@2o{&KA2uhiZBa*pGnp!(k0K8`Ka_tpmLrzpNy z>U(Qr9dAS`j^T2+OGR0Qk=_v2V7hH7cYkoUfGhGIe>4|#r9*4yvN?%hkP@U{e+p!BiT=Q zlJS1b|J|%{kHAlpfKlXK6FSO6^uN5^=6jxR4B2%55B`mv$gFN;Qx~$NlX1k?`8SHp zsQJmC+a1*3v-H;~K4Hr+aG&5D&z-nCc^>a8+L^~%m3^~*PO@8UQo$Qz5PyBzZTTYHEY<%MW!zPi(k`eq>jLTGh-Ef=5yMYb1x6E2QZ4iwVXw6 zqrD=|RuvO#A!m};nqs{(rz^Q>fqj5{=2Y+5kqMl~z|X#Kg3Two<4WM)GV9#&^J({K z=1X0*f2La)XLIp zq+TC2mon_H^-|A{?}l?M>NLt;4b&@eOTE786w0v2v~Nr5rM)=yO3Gdjl-1bLWy|7J z8)fSPW%X{U*H4{5*&Bf}cZt;Nr;ejc_A9i0%>$^{U%ikrZM+_-(_h2ixs;v6A2}q_ z2B>FK){DP1a#xfMP={02i$Crgc3I-pGbroDU$NASSCc3Me;T~?X_DJ5K~12n7k_n9 zFF}o?4E$;JOeQS{oElA8FaFZOeOaO!Mw!^J8XN`E??Bc6ToC?Bq~1XF7-hZqE0KDG z)WekZ;?FJh2B{sC_2REa>J3)Cl=b2-o!k{=gVo)X_3~e-&@D-IQ>Nh$K5>;LY54n* zGVrIt0q>I6()itQUWh3xj-48z}3=U%J#gLw$p?Uj9obPes`os*|!_ z{Mn`6F!e>sdhu5v^@gd{l=b4TK>CiruerKu+7 z!AhP_@?N@{ULCJ4r>qxuHu6@KrK@F>oy48AHC$avSugI2rQUFL5oNt|*Cul}L%ol( zUfj8)UWPi4vR>YE3vJI-XH(XTJIRAlcBXmP6;)okGVUX^7gW`)rppVUORf}clc7+ z4{TJ-7Bx9l@mUM8@A0>+l63(2YsNQ(e*Tr*c`|>iyZ{uB&MZd4*m;5#b_xiPaC=TNXIF3I+?4iS~58UCESTkJw#e z+?gu2@Oh*rd)Y*@IP+@-*(i5FdFh??mrvLKkiN7#)vzJkjNj(f0GT{tfxq65_X7aSLlxng8M> zS#LG`6z>p!>#P*SX1eWFWb>J3#U;0%2GtSF-N6n8QK7?vwvt%v^ zOiN^ZW%3Pw%Vd0)j29jIcQTG_d>ZJ-hTn54WBEC~zM#e!i`XHF&O2x~nl?ml6TLT$ zJd!T2uJ_9MZPA^@zL0TeQ7;c4!zT;@9pp*duSo8eb%BUP1m4Wj?+XSiFoGe*kGDYw0??^O(9ui|6; zL}JtL&Jlem+4;Qi0X zq3vOlBCHkM)v7dvGatg#mHgIhrtAo-*iH6Mf9_-0MabF4^a7F3NzU)iBjy8s5jeHD zi7}B5GjmSnwVJL}ihr_s%p`}QXS$hh6N#IcEpr1}$=!X1eRUc4de5dUWP77Y%U_!0 ztfT!aDBFuZn`(*iPG$~vTVjy09Z!s<4KMcRHCkKP{m8Udcy>2@7Dt)*tS;uijrqNr zcg8%ZBUh{F+ar0`(lE)2kKNja&fb$f$vTYReSuNoo1uX=WX@y+e#>`h{ASN(eX%D| zeSdCG)${ze5u@=Qzu}YhX|}7aHhiSAH zvgG{A6q6%&t862m_2ZW*@$;x7egB^S^Jyb(#)axG)7irg+?=#1^|qu%t{>8uzDeJ< z6aKNwzE>*!z$CCq-)94xi*x7A{Y;Ju_|DUhI5X}1l)Xh^$pf5xIcyX$`0oT#BQ6E4bhBO_EYkdsJ;2{z!cNSy$b(ZEiv2M zl$b{+Ql3VBS1I3P2^%H3UfHwFRQRqwEDAi^H9Tk0W==lwTC{&RzgNy$VBOE&&OQ9D zBky{@r?E}J`vAU6eOj?Xj0ASFExx(BNMiCHWaXOca?h@tb_$4X;jB&*t6B z+@%4%8kK@n_2NdQau&bSN>bH}`2DEx7IpF_Cs>WKfUAzQ53lmYCvp!9?~Z|=3;6#g zfBhd~zdHn9J=6Z`keH#pN0rKRzELU@qsY7E-x8mynC3(g3)Y|KZ0*@HXC}|*?pG?) zVwABxhm=b4=5)BGnl>r1%Gmqcl*-9GZ(y$e$vjBCA)PTfQ_ff3>(mqmc`d8jIXu*Hewi?>6pj;sqZGba-(}mH> zSoy|3TG?cIL#gbdZ(=;=+kxpe#=UEmWz(Cqr$i`YzvX{?H+y4!i>E&uX{r>SQ8)`A z`>xfMmQ6j=8nk`ZO~;f<`fIdRST=n`Jp)gBhy_bt$JmbeFP_T(E2vZav}Myj_bHV& z%7j;61W(Ypqb5H=Rq8HR2OUrov z{0jeLs9(+hP+SiI2l+?*V`aQg0Ef&qgI{igU;g}erScVl3EVyc{DlEN85u(kQNf$` z96o0`&j(sHera@FXWBFmc&-Lk1ZPRBpOkHSCi^Zy9=5dJ9!?*Ep5qJ#M7r6BwX z|2zTR4E|XggiGO{gRklQb5;=lLHL_e0J6^ z^G`Q;5&pTCvFiMz-vxSO4tJF?&rFYHZ^9Qkb_Tp{bET+bzf>w4PAHX6GRN=B8mTS> z4`p$-P1zRZVtFo}fxge(mZe{C@6<5crbv@AwvGI6%ZDkOh<&?w#R%J`S=60N-7SAK zJMQ6sU4f!HsV_Q_>&{fQLlzV8CB; z8u(2i@O%2}@b|!ja<^G1{D*lT4F9)0p9;UOuWUZ7RQ_wHQW@pd*Pq?tr^=5eo`dDb zwTvBoMO%Nq?E3HJ$7l2(tgpPy^Z!+T9EO+wFYC{@;Ocbp<6&g0$d6a~zZ-mr{P;a^ z|F`mkK*Zkl=cyq4iTo&K-Wu{_RS+&ket2Hh<;OtAWvo9(T2A8kfgt=E@?#xkza&3~ z0mJnIPl)`G_2ZZ1$G$UvS$?#E7m*(`7;EtQa~|b$;h%+jb^f_A2!7FDrU$_+`pf1Z z_$CIy_n-8aOGEf4U( zy;t<%^tuGqMhy8Sqy1I4Q>KKo|BC&35#v6KvAvvsCieg-&dIzRRidal;hZ&lP~jYk z$su<;7M-PZO8z^1mKAR9KbHGC)2KIs_S*0}2n~ia?l$Zpv5gM(0}tr4_{BFQU~|vJ zHzzUf$fm|oUyV~oQ#VJ>@zeK8b%^>Zztbo)#(pjJzAUg=r-2)MBaH)QFR*rE>x73%0%mzs)ed5nEq;7iZcoQ-@*e%Q#B0=fmmuWo&(yZtJg4z}6qhyP3obGmiCX z*!q`zrc}=6w+&lAli%3K6*7(@Y<*b|*=uc_PTT2Q!JoOmx|jR03V9a%EdYN_L&^65 z-qL`>1P%p%Bf!gc;*?E)1b=@7efB< z6+_hL`E9CJRGW+$`rkj8IOV|jcQXFB7{9F7ZN!BNoui@qD89`pIFq{B>X_r`7gGF z%CV)qj)4ddOtk^p@s3wrFS84s*ZCk(@q`LpzmCe~(wJDzOw2>mdI9 zm{xulir+hMCTor!&+|$$K15=O--SQA%~thLgIP_XpJe#khp+f>nVJ0rvsL_4lG8PO zfvx)>_&;=4jN{lX?57mCH?r!O)7 zD=42?n!Tt7+Gf@zs+_OuSXA6coz4E#LeAtwb4P)B(ct(Q>3vv8egTHXq~J)LSm+x(7Pbv~weRev$Wgvu6p8h>!00I)!*VaJABIRsBcJ);Hk$ zb>K;GBIib=&9|<%b=x`faA-n|qa7SQFWY2gO_!_@>aQs5>G(3Q(qwsbf`!VVGih}Xfwkv{| z%s!3-IZEZ7!=`|zso<-RXa!%h&m;c`_-gINi;gdm$+9QIhC%?3 zI=*b+QTR;wZJyxk%;Fs@z|~{mOmI^|-eB$C31Hv;l(tvAUe4XrxMdH^qJBh~;Ku_F z{e@<$@S5Q1zRyp^(*f{Q&;HM`A*b@xA;u(oRfi}?X09KM%xp(?^|L4&@M#4H77gY3RgCa*Z62KV;|~V$evEhAl5+b+>1p`lHc(3LTyh+pF1ZQgT#OS zgTC?~*Vjtf$NC%XR)ZgbV?j21zK?T$qru1zmhf-;NamoC}W*@%lI3Lb<^=_1xLu`ZxLNa2zbNsCv$!FzxO_lF}`a+b1dmy&2@3IRgAAl!4{D%n9D& zQJfWDz*@*z@vHGK4nz;CGe?$hi6DRYuVl|x?x$nF;xh8r$anO;Yxbq%2V@iL3BD#y zC$5Y$*8{=#Kr6XNJSO#>C}qPjcv^I+7x;gIHqIQZY&guGiBn?KiRqNRh8n)tV^EWw z-*6VYn!Du6ky|;?JmqX<>wAbTSZlF(%g*E+96Wh~=howq4kz-W z>B&hB*+X8-y&tWd(c-LDXLFKmaVcjb>X5@iqv~E7g*pEOj6&0D-pQC{zftB|Dts>I z&yTQ|cMN_J8n!R^cRKE2zthFIWskopZRL(8_j_HxVH~21DBi0a_L%QiXKYJeGjw5L z_oYYt8~y~XUgDn6JadG%o<4;iHUsA_?#)Y+IA!#u7isTrhx{8}LLU@9_&DnO)lE+) zuPH+JGNEsA7ll*%p7@X8?EU$6er2bQ8hl@S!>`g== zjN!qGlGs=aS^#Rn%IkWHJH_>k+mnv!r6zkb=l1otLOhoWT#m*Y3G?ai^Uw5 z`?TgzE_YdCUsNDxo#_&v#Xh?5((Sx!sWq#Q&{jS60{2)rC1*+tc=(;P$M>EF$^T9s zEc(nX!+v~K)^OL2#m`Zlb10SP(M$~ZxNbtrV1HYEWBC>oY3<(@{T#2%H5YzesBTb zP(EGCmz>mj4ncoepQchSu_D3u!RdD^eygnoYl%tO^LKx)%<-AzFJDXC?bYNIkvxem z{&qv7DEP&VOgoNjn<%jr{gF5HHO`PX^tHv5sL7jM=6>Gg?8)@X8|ocFe&x*`H~s`? zXWnBUzmeGB#@T0&7y0}&&)5pN zXN2>N!Q&gl_==!wG5C%eQR$lQ`#>RS}WyMlX><-Q{+A4y#~KdQwqad)W3|Kv<> zTcvE8f2pZ*&nnxdy~wf2KlsPmEHT=;Qu4h&x1947Idevh|C%<9@2j=%(Np2owlZZ? zfqc(hDSP1+hsQrQpYLU!x|{sD4*~P-d_S1}ALI9Hvopqvd|!S#_~G|az%Mz_KQr5` zeTaG3_6_5K&qaosz{g6)b4{dT75SOY^9I_%_E7)K|7!jp;D0Iouz$xLw~5|@UH;r2 z%3h_tSjt}c$v;-1o;JRJ`g5P9?t`=^bxp)bAEd6xGKrNgr7vkm`l=^3{~5}vm7OIV*{o~*&Gu0k%k>*!TxQ)R@{Z%xT{#v z?piKppI_!z2J>qodgLtRaTDJ`C)PN{dZ!s#f}SIO{W?qDH=J+rU4c#b5H{fz*o0?d z6K)}&ikoE~;qch*ew_W|{~X3FW895x>c-CW zP+!&oev*{3vCdi+uN@>l|QSJ;Zn)CTE}jTa(p+Y&(}Tpj#Gl4-RmO|D!8y zwE8Lau~j$iZZN5D&|eWgh~{jwdJXIJi!OV&e($bH^^6X4z(cCL%)~ukX6IyZzjw6a z%jN#_-4i1m<=9#W7LYS>q4N42E>m}NW|U)34m#8vv$e9nvdFvBWbOPDvN1zqz~mlD zvnC(fnENJV%9O##2iiaLO5NX*${A9Zta*v>Cvv1S!REVe)QagHQI2~r=T7cjmi}{G z+(SvcC$YB!o%Pj;=(7pV?k9Vy648@NfL+F(j?5-@+}TCBP9OdLifo({_PF?%~qz)ZSsY zS??UCXg1uvS&H@G#2CkeLQ`;H=evIl0w38YWxR36_D;$VPP)QzpLsxe5%V`69Oj#C z*26DiFAP$~uVvnrpucV&Ww#za8=a5Xmo418na16s;I2Z(Qlim=Ttz|;cxb=ILxCJ# z@Q~v8NW${pF#Z$5mtC7FAO zBwmuf3SL=0y?%xBUb8|B2yrfQ&!{EJw&;bcADv#Lgw1gu^XC$up^dXf1)!zKv#{O*BPncZl?C|g zdwBhH{FVO;{Pj8CX#ACaZZCgLI~{*b3Gi3CZBZ|O4ObQke>GR?{8hkr_MhRe2|vSM zzYFEB5kdR~eHGSS(H(`q+-{khgPmGtQ&jkYa1;8-zziz#l7 ziDzV})@D6EC&9tXv?;l{f_d#8+FVLmFt5#`Y!PJ{jIo*aWGCe4Q1+d8UT59-fkCYIKyAXDT0`_y3>sOdTo1ugQIZN70-A zQ=X|Fcq*MWSn@N-{pO-`ijSf{dYAC*R@Q2_X&}13MctXCR9*y5>@)hSGbop`FDR4$ zoRO+9Weij|XZWkc_Lck8#a6qOSVZwr6kj7Td)ShccNB8&Gg9m>@;)?})x|}MqbCo) zZnk30>eSay$?^0)_fd)dZ^R6{3-#FNn+GC)(U}eT+q^)xBW|Ev{DnUFb{lYsT$8*E zZdVlc)DWkOzK+$J)oAz*U9C|&Bf{7V@KJ@ye8dmc#Iua)gD#$f`tZ<40ea#k(s$69 z+8C4Q6=NxvGx^)`5#Cvnrmi5z(OITAwb-KhR4ZceAId#jQx^`7e~h#GeaUy^2j49z zagHsf7;j0Io=;~rco!eQI>XP$H-g_f&CjRj)A<83+7NI3DKPz&+Fh!ko ziN053;GquvsDrV!(YDB`qlvtyJ)Sp+?la*=&f<+B9|7ZvBbIDyUzT#R*wH_KGU(Tl=H)n7l50T&=O!;AduCy@Wgq^wk=zI6TqBW=C^= z_A>gJ16=q(wDYq;^f7YO>|jj716M$(uQqC(&j zItmRR34zPt=VHoL;Cc?YwsV%N6u7P`?x#KqT(UnPu$+bO`(a?4dYR74yU&kvtTjb@ z-Q-yixLV<-{q)nD*OqSt=hZ>HycM{Rr;TxG@#>ev*ZPUC%}*rvB{ck&IrRj*C^WPW zxAww1Bm~xhA+UbldFtGC3k{)FP6({6(9li!m6SgOtg;XCd*ZptS=~6m-e1LT^bHHZ zTF$&J2iB_s^R_cP&cS_~-WvRv0_$tQD!k$dp$(P?y1*F$oWdu) z`$hr!*@ED7@9L={o}%JeQ-5_O>oR8qHi&#|YG7ZD`j-LM8p;pgC!a^I*DoVDM-?P{ z4SFqL{IdVF2fpi_w=>{_LfWCN(X_*w%(~0EUpGN(dqed~h2Q)GeLjgFQ0y}!M_JFb zFEu+&_M^nE6q&p5stD@?vL`=@XU3%M&ja(qtO%><9R=vKe?$M2yHdp;oIYcqDr?== z?2)Rijx#xOuMYKP9sR?2{T{PmoOyw#fH^vXaS#0te>r{5$;EF*d$MlT=j-jACF>^b zMbX|AXe48?mGoDy9;mO?GM4mh{@iTwQ_)5>YsN#2OZyFt<=(y~=+*?Ei?7cX@bxXs z#NSJ~tik21#pJxv&nq(Kb7*Tm_>=r|qNfiBzjssrN!pTji)r`KK!37Fc0IpkA2roH z$XhM32ejLft~fe@u`?Q9J8QP+q_VFOANa10@5EOp?bXrV8G$k9Q{GH@Pg%Bh#_8LD zj_)rU^p)uLa@Ucp4M!THiQiDzbBhk_xsi7$D5l|Rc(9wgKfyHQK~OHTJ!B6 zFXKD*EG1`L+YNk!9=s3z#=8VREpVcXb%=a#LQfODx+HtBW_$fc#tpCNd0~MC|I-bW z$zF!sRWH7k*p5?SXaR;AU|1nAkfX=&w|9`!M|6QQ%B3HTpP!fg;Y26>ufL3TjebfR z#;8{52mMjMUJ{K#Ah!dDM{$$rE=A${$puX@HXQ_8iumO|dQ1n2EP8TX1LJALe9 z2e);cwhCzL7QUH+{5t^6mmve&6!H~fvrVqcROOxvp`+*`-x5cZPu|K;(oN_iiq}-l zzEYW4Z5V_;LR-E12=#>zsx?_Cyq@HI?x&urcKi|jW+|Cn&^bO!$@C1z|Mj|(*^FI( z`%mP@#Xt7jwMym*&R*{Ikbl@h9`qt;$ez-kWr{D8c%b813F;F6t|)BCj^C2sVI=>D z)po{IoD`m5B#@rf`??MoNc^`-=)-*Z;LF-{AT?1Vc8K@ zkrCpvHSwp==27~(6o0XYc0L70nN#D_{Z)SAwiNPiK8%bxZtxHEOqX-5>|;pGz(OT`}N!>Tu)ikGF=V|4@j<_52P&5C`)j@$Ft`K`9{vPCUB-z@*l~bbBgmC z_TGc(cTngDe|d?y4(7W<@IndYEtDUgL|f#B>fPr_flqk%6YusRM_lBGGR~BG$tNYU z^IP88-qvM)95Vm&aN+=6mzkc(!;)_2MUHmx(8OuK3Kgfmawk`7P!I#i! zTVx}5f6o%yKZyJa+*90gT-WWl(7vn{@|~Pf4c$9JCaHCnyl-Tl%A6hzp7&d#)W-#% z+#_3W8l;`G7aZ_b%vYha3mo77PwEO@DT@u6w}#A|%Xe2nlV%SxuU7nw;m#Ap6u6;j z3-Yij((d~h{qrdKeVQ{(zE))6zP}JB2`&}(P*VRG=J1pMNAjNSKnCnZ&g?-JiY>c` z?_(ZPx@{}T6Ug&)Zr32UTPO>r|DO+>O8-viFEmaO{0GTx$uTD~b|B?K6Uloi zbh-Y!lQem$<hFlXhh1JkF+ev6pbseabkQD+K}kG~FPv1q%D% zI&NxDgPZ3x+(sK&WKdeJK_Hb^6Ffu(P4L<;#)@BrIgFK z?RDp?GM-ZDPg~nWmWfPDaQ@@_Q|CjQ%tz$UyCHq-l}4$1&Rai($_&Zh=d5VBLq1=TVb^f8@D_e?`|RvIF>+?*tdZo0o^+|H%GR z`N@z?_l4lXkW2SSIecm0!uhT6rY>vz&8N0y=nMsXBX-U{gEtj9d#_YnT{o_GogXE* z2(0tV;mthO`I=2SE8dEV6ZyP?h(z=fiVC!S-&y6`L3kp~hnkWKR{>^dBS(_QQKMl*dzEjE!Z= z@1x3kEi&hG+7x=S_B0A@-S%j8oAd*pOFxopUU)qfJ{LVfi+|Jjm-}I4Ezszd;(QW% zbuBQ~;s8E?SMYJDA9qXjuHpLKQZ3-JhIjjU7pxDsfgzppRw)mH!O#uels^ak_dx&E z$nr_(ZWYjfz*c-ffw{1av1da6DafV^p?@m2eSuS_|77UDk3Nw9fmlg>E);9BNqneD z&NBmZ;c{prJ`0031#X=-#o*^a5N+zA&5{t>j0vHQ=$1l*H$&iRhc?1fuTrkjrurmp z@I$Y^BS0UaO+nchwIDzngDyg&_x^!j{S?|HJF9wWlk7bA7ihDRet(WOkH}bq^mcXP zO{$FbG_)BK0)s)D1j<)I8==bqC0zYI|NCy8pmsu+CgzgRrVZNM#2O;^E?hHS=FKo~ z`YN3^OQ6kB@bqp7ZRCC{V-2|x+H58Fk=Q)VOd5@%wvJbO0&{0Ld6{oQ zu6=^v?`m1sm^=0|UFS-GK0hzlbo=!HIo}uKC(6MOm2WqxapYE6cdar`Y}NhPs_m9Y zRo;uex*vPBeHng?!n4)nOW7+jC418z<%~8o&6+Vp?QV^6cxt27r{SX^4dd13j2N}0 zHby;O7^8ZKMLpq(QM*0SYI7lZ)OYo9v_GKun##$&jjxSZt;D0f>w$jPOIHeOBYNyC z@X+#r&G*|{le&c%#k%3TzyAmLSMJmh9}oI-V|umlQ?he1_jT+Jn(y`KB}p1T$$e$I zUfAe8b-o*V$+h&=dJAiow$4O)!Fz5SbKZn3m?U&!9myj8L}V>^R&NvCIs2sUb~${a z>u!UcJDX1JV-IsBopvs!olc2UvRvc19Qy6Wj_JmZ!9V4*lT&TeyR=zI+~6b=&smO* z@_ZM%z)kXeh2u@0rZ%eclKq(TK@!IWPkPme{SrMzWItOd?&hm-NQ;Z zIUJq8id1}@E$}@@TjzU-pPFR%rPV5GQ;ywt{$TERqx_;mlj^>S@(h#Obc@}0(b=4l zpu82{L%(XYlN+!(W3rl`)RK{7-NPEY8=J|Ey(D_V!^I|RD*HS&?9;eP z&Fb8Ee9Yjq*T+m9(K~F&bQk^g+D&=7-L$7KcxQY@eyYxCx_#r3a?Q?4(&*HKohA0o zKc)O8Sz87>$HCt>fve2@k(w=WEx2))3%zu{5q|k=ZBLc#Ly9~Q*;K;%@Ytgwe@^nt z6(Rg0Yf=HU+)7^(^B=62900a@-o4K|Lyr}m_UP9lL%4&Gex`=-hM^0rld;1a{jhJl z;1A)8cKD(T9ueNS2>b{0#(DA_#2ce{z7lww0=$vO9ax4f+yZaJ0e>sJAhCABBN6b1 z@QConUD(B9+mC=ZJn+U~+B!3YH;C`|4WN8v2ycvpH)1K@2XEBC52K2Qson{b9YTNM z3)d=}Pws}<3t#MkM_lm6tP+z|&Z61n{yX@hbpU%T;O>py^+e|j*U#`pq2TH?eDOOe zKMh~pB;^6VSpScnD)Ac&Jrvr%6~A$J>lDWsj8 zxinJ79;Evk_R?_5Wu1FY_5eKkI`>c76#bnzvI^np`r9xB=ON(tT+GSs1I!!Z7K#S6=HelY3Hh`S!0qj5TPTGi=tQQXT}uK4@LSJn5ud z^bo_Ay~h-z*|L4v$MC>UGGDqxM??=(~>!p1-ia+_K1w&(tJ)HPAKVom(^?UcUgXra&uMzYJR0OLba32EIH&Ye)fW$g&Vx zO$?z`Gjpf}JLRt-aJB%a*fsA`ZrE7xM@70TQ@!^zw3>SwT7CGk=UHRh&CnACM|?E-|abd9vOQXH-^CFhBoQIdmZIM8|KXV zdUSeOkHprBp*P zV-2E>;YT_v1coMHumeLXXmgv0tD2*=H)L*9dk-5RU{5Sn$MF*C%7X=yPHT`$T z@}4UAzoN+#rrL*(qbx@KoHFoU!I=`ZAb*T1`KPy0CNXw$)~uv%u-cTtS(c1g^|&S0 zTF<+O#U^G?LVQ53+F11i%7n+83Z-5jH60oBE@j}iv8gOv_1E^X*1MQ%4Sm!%DaYSd z(Ns%*#$v{h-B*2$GU7TJYq)BvVGIp@)t4z-A>Vt#$=MobO=q2U6~?JGl(Q$ncq3GM z{l%)w6Q@2)ne06^WkgV?p9P0v^()Pe%OXMgiC z^g{vV!wWnojewmq+ zX*3aD%uZAbTw~Ni%3Pcu5ZP6bF@(E;60I)Q?cY%jt-!}Xa*DGi6b@8>Lm4!pEYVq` zVEcFmsy9%k%;avA!a>$3=Guek`6cM~5lUY*O;I@49pOBL?r{j1MnrM9(M^i4B1=&V zVkGZxqO-!R_~JJDtCnp=zvMZRT)zb|S&nGRmS;(fcA~SA`i8n^%F9^;l|JA0``71}MyiLVq32_ZOyJ&{gRIpj=>NiN*tf|xsmtKu;|nH} zhf_&hQcHf|44ZE$<;FhDZ1!I4tS7&Vh1U~ozPlSFHeSywIwwWnKfjT82auO_;r8xS z?gA10er_x}3*SxST@g9z(;3q-=<*SEtE?IMtnJs6t5amsX2x*3wOs+1p?><~%b*YK z7&gb-Z9E6fXJc)@kbZ;LMPqFrO?l|rzMD2f*LJt`6SB6C|NFnM7lT>vjkWzX_Nzl> zQk$$7;GwVd+q+(zy0%BiSc70N)^;TX24ihM7IVtlzWyG2gqn|h>PxP`Us~I1IBP2L zC^PzTM;q(Kiy`YpHT(X?dU4se`g(DbPMh_{TAm(QFP;HEq4r>92yLeR3~fGT{HLSM zhm`ly2Kg3PFDjM>=wqxGivzR?UN64F4hUT@*0YA_v`Kbe`3tmpN&5X6+N_nao`yEh zgur0X=1IzByJvNXV*9IM0gX*u- z%Be$ne4xCJ`j$ZKhOG0FYu9gy{4ncqW*A51Uouf9qdGIf1H zonB{65_jm}zn3@=xktD8ATbrhBR8{esoi0;hV!SKdv#IXa$M2!As;J?RHd!&mMX}^ zWT*7edX(59&Y?U>`x4u6oVG-Uwt2WymG;_h;cS*E#as7`k{d&e^B&6gdby8+v#+dA z+~FIkuA#jWQwn1rQT? zVT|yb*tZ^er^^B(r?iE4lFwT9J&gTjW544>G=4C2cNa26+v`Bib|)ZTX!9`dUSyw7 z?30hH*+=AmB4@x(jG;cd!4hrY_Io6=Z!=~Hl966n`We{J+F_ut$~zp}rq!>_M1?ey!W-;K20(c5o- zZA_i?D|@!|8D*n1UfyM~brmQjt5b)F%t&zlG1Fi5 z0&DAg_>!6@aEA(UA_}w*FJzyEy^AD^&?j8$ha7%dJWVD2h|DrY6z@>^&3V#|trO5| z$*Z#sS!?e6<4*MZ4b|g_`$gyL9>dzpn7gyX)FJS=J2uyGlry7(8_9uwoHAx-@=}GMwIoKB}}uK_Z;Qyy=jPd4{>G3;hV9hA=?W$V=sEiV#|abe;C>momJ`SiprmXsid5cIIJbX~WytnjoR|Gttz5m9`-`_df#0AETLgcO%+HPi zPg36ByBt50oEc_+I(GnP81pOxyt68}g9~`pat^eP9P+Z~EPZbM6?mYHMeyYz^sv;K zW5@Tgb z1HGaEz1#|Zt!3O1$5~-F=iQsD$ZLRpbLIfzA_rgP5L~t(x88q?7#z9t%@bv{pyM23 z9ETF91K-IQ-nd7p%=brTO6-!(SNff*`{1h*_$rltUWaG;A>Y=Sl=zj2O6CKMv8!Z^ zdL4Ah-D*~=8N1AJiJ2Dv&oN7X?GC&i#$JbPGIXioj9qMsn84WmW_|2##@+#}OBjDi zyt45F`a>^{Up@VT^23u9U-u8u+~J;p{7iHX0fv-sZRFh<=*=I<*}80Sz?uAqVr<9q zEs8JwVa`o+XJ6a3{D&^p)0Et?7G>jokvbjB@UXpDQIQ$GZ_qn;Ve{9e5a&OMySvit z)_W8s{_AUPjsqwB7q5*|I%|j}e2KG@cbIL9wkQ#E>SijrDYe|=h^)=$jJEVI{fa+9 zXrB%3^O+mX&{X*8>SCRr_6GPVN8_hhZ=0O=4DeGQji35>qyMOnIlu5EFP$IYC4-OT z9)Y>E?P9zVuPQN5%%vTs7-FvAIk}4~xSU+$>al2iV3aq3=i!nU0eSN9INj&!j-Boh zUTB3^E`V3sZXs4VJJM?KOdI#43E#L|;kyEZZw5Kj1AMcG`nnvC_PWSXu-B{W%PP6C zCAYzJ&N9byW?05{DbIzgp`8-pRc3)Z8@N;O)!%TPV>NP0=(epu$z@U9px+lU#OZa(jRugmNMqu4T`}+Ke_EvM|-pBk& zXZ}y)-DL1L1fGa4_CN6e@@8+(l~3m3yRN&NGxR2%H`a`N_EBR5B4nC zDKvVIc_Oi*iZZx74qO?0zHWAAw|lOVJHwnaO9PEyR%euoJuID83|kz0wr7 zeHA$Lo07ceaJPua(_!8vJHIv!D}R=6%zcod*KwC>rjq+E>({rpDI4BtGO3qdplsMV zYiV~lIN1-3M_5z$PgFJ>B~ET1I@nt77_@UX*G(I;-pe{TG0UXomidDEyP%bC@Y-at z*{+8+68j~3Q@=D~Ac+qV-O&sm&Vx6fV4Pvd%+>ir;efvuc_TN;C0HnFBz97RjR z_zQOw^+fO&$?s@K(etK7`HS(B-!jFq7&_b^N4_g`&>5fhb*#D9<|u`qBuB)^(Ms-* zqm_-nXKwx89A;fo8m8XQo#iL!cdFTzy`29a)mqdaxzeIEk~>^h!x!YB zP{3cFg*!VZD7kx}`$Uu3TSiVDGh>o7Qxc<|K1RvCM6p@FHz`*6E|ok4O^j>Ttl{Gy zD9v6}^t@$Jrsa$=4}gPbX#3`Km5l}P$O-)Tne4M1hRz4!hZ6}VUnRLVjC(p?5q^cY zjto;amU1p!L09slKa(BY*VGVYeV_T#(r~pk3>hbDX$tdx;8evC7Nz*Yixn&TVvWDI zSyb+`^%3*Xak+Vv>O(ibikxY6_(prOxto_wx-~s_F!!>a;rPoG zY>2aOb<93*ieu&o?qeOJ-^V)Zyd1|}7lq!(D!H)+pK>3o_yw>@h#AIC!Y0#WX7#v4 zxtq2InK(e`k)z9wBmwL4(U}jxOf!w7~owNj{F_jFEWdio?VZOCFLBdUi!! z!t>3wQR*1}-^)GnY2f%encGT#=T_~$X{GUN&WCtd|7_GVVv%2sMOIT^%FSUXW0YT{ zTw;`sc;o``T!8OQi^bQ@1w^P4lU!Ry&Mx57d|mKPi7gEMc&PKwl*|1(viGFlv6JF_ znzCb>9z~3vN6r=`JD;RX?$ePt<`!*zmiTn>r$?wG-{V~`|LXVUw7|bL=tO@b54o&I z`dS*H>D8^QFK*s#=3U!eyxS>jPn7m<&kyMK;Q3wN$vr!Jvm@|J1#FS+x?gHN@2cO@ zW0U(R?3IP*U&F(!xQqZ79BBL^8WMwVZP5oK7OJ36}ZzAS@kV#i<}azbLZg zQqd#RWNkzT+Jg)fUUJjVyVQ5nzr4GjKWW!VyOKYqj@Nd$7${WZ{e*eU&n=&WaV;h&@LhiV+rcEM(!w zLI^ISb(SIJgCXf5U-PHHt!>|?nh)ih*I%}#&rn|zlZkoT+EM}356$$zv>_V>wsB=Y@J z{(FIK4r|+|&_d`ZbL&pVNhPrzHSjnUIBxSO; z1mjP}Kbn4`_-=ySIZA#d54M4gIe45rFhX}($EH(fA8^Q6gg5fg8(h@e4{vcdrqdgM zS>)iC>xxW`b(&o4TFUdM{7k%rpns`C{TCG3We6^Id!}BjFL$`OC zhH^(~y!UGQE3%lq)#Spgr{67{U5+9rlT8^~zLxc?7=AYHC~cvSGcI6VVXU&Y-VUzT z&OB@UNZP#y9ilI5Z7Y6hx#Q|WO|B1dc470&d5{5k= zIXl8S9K1@Nqq}0r`#RP%KfTJI>!dBotU>F?WfOqCh<6w9^pD9TfuGoag7lwU}>3Vg!Hq65nr zwC$8n)O?U;XCr;>h5v*PBsZfOolp4b1mh4N8+!SUX5ed?r}&%ow$86u~x`ti;`f`bVM!VJK+s1-_kRwX!H@0hBCm~MFQA8V?#`sy3)-1I#@W6-+9CKV z0$*`Wq`4hgj z>Z}xXF=Y#BQ)!4-r}6uKe%Fz^>pp(>Ona5QMB#z6gn=`LoHqT~n>@lX;Om^u_pH zz*A-!XUu9d^m7u&vn}c%`jCA-@nP50rNBpW?gqaC`cQW!`E`Ne*Yv05vXK7K%dY2H zVw`1P*iGGNiA@UXcQ^gkGyj&+ujB(fTqb&io?ovOy+ZV!V&0uVUy4GHH__81;T7tSfkQ19md%6gM}xlE(SHQ3A{dl63 zN)LUbM{m${Sn3MS^3h|(o)bK6Zq)aFzJn*x5j!+^fiu1Ma#i3?4!|mK%D00AR=zc0 z{la}JtR3_xF%we*uo`f70;l+AucEvM`6_MHbHDHR#43oN8((STZ*0F3A4y|)omu?| z*p{KkwP9ZfY%PU}_@N@a?#1|v7)NojS$!4wPSD>6A@CK;8H@mYj|AYW20rn3_rhoA zye05873;J#;QNW^VECR2fp0JU*^!xvA@CVF6yqqD`>~~s66p9m@JS5)O5j>&8n4dd ze^S{dHHtW zmHhz&-unE08oV!s!25g%yuS^Bw}<}gkrm%rblx@S*$h2P;M*OPi{D$|br%m*?*v|n zVZ(RaF|^*SV&gWBst;4Q1Mf-`c~%0vx_3b$aV@dlg82b@mYCH{;BBYBH$vc*y)%QJ z@d0|C3w-~Ny)%!Gvbz5NeP*&j*h1I@Bnb#ea95V8OC|{@ii!fZw%U?_YzCD@tGH#t z;uftlkQxiNNx+2}tDP#SskTYLJz57)yJ*Wy76=4n*9>Cj_dd_e6DGqX1i!TY{%BsW zyk_P;_ul8;&pqedb3b>}*IkHyBCnb70@9whN7V1ui24nVsGpDbrBRR4i251lbgm-2 zcB$F%H1M# zXFv^bnMl8Dh}n@xn%t_h95wV6qL;f!cP@3^Z8ke@)AhKEtE_;%e_*mZTlvov9EjI| zO&8lKeZP4LJSz6cXw$D~(<)^9=YmC;{gO8E5&jdxGd0`f71YyrpDMqA`wljlxyyjE z*7AD|_Vj7$oWlId%w8q^>k0E_Pjb$mqBiU|$2j)WUm4>dIg422inYK+JMhJVd-X$H zG92nUk_N)tVeD$$ueoSd$Ijyg!pW7Jo$;{fN6p zxK8Fw(^6S`M4285l`SZPoYhbK83o)+h`&S|BNxHB(R$>f41IhnqD-}vDVOlqBs{DR zM&Ig|@Z@WpG1sXL6Od6kqcBDFXspB+l5-InR;qI8f1W2^!%Ay8=O?9$T)q5YP%m^H z8`9mes|Rz$$kd*YT(zuofk*pGNUoZZD_59Yy^LJ#Lar*1t6>pxW%LV=M3j3s@=yTA zO9*d5uJryPGgbOOclXM8#}?#DGc$(~lB>P+57QV6rClD9EBg0F{Ol9;5AXh!bx+7s z?J(>ScIw@+YD_=&w|8T$l$`%#=KI1@*1_``%f9(6#s+1KrL&agnr>3-<&F;@eyi-| z^=5HC@vW@J>Jq!mW z47oJqeJ{Vo2dt-E>xff}ek@tT`fSoKd$qOf9}@hLhr!Y=VK(rf$Qj`S3IDc5HiLZ7 zk)`zg*sR_>s|;~Xa`wq6#to&6U*+9jXThVuGnKw*oQK~h%6a&o>F1w_F5gRi=ZFqb zR?%ZElXak!{Vl0mm@dB|bpv0+@0!1@b$tw7{z_|IpQF?V`{QUJ{84oI%06n$W5~l} zW7TMQB#*|~f|94s4TbQW2mS>iJzphZ;7*_7k#dz4BsqR9Wg$&?Uozhoy)XGt$`huq zMqlza;WhdAeau&`pj??I)l>SEg=eWT(|K2>HC{EYECt&`Q+nXp|gau?z_k-J=M#og3lcS~OxT5o}E zE92RGo{4-2PO+><3CHLwWW9A_f%;E@r#1vwms<7PTn7`OZEH?*QMY7yER^hj1CY?!)(I=WGNHd z(3^0no2>tMYA0(*Lb$*1S?he7z)M5-IuT#SIN)yAY%$_HxW`u}=wqCv*pJzQdop7j ze1`z@#Xio=65M5svk=@H$Y)&y?kdbDz6RU{gV|t!?bOd;Ov^lm!BH?+7lFaE5g6PY zfq|h{|5U9pFvfA85^iAd^IgXFABOk@~Ho<>`{<)7@s41^B5OA zF5`l8lbyTn>%|!|oUz1RUV=dmwJLYG?H-V8S4cQT!cMh_67GZ*4U+}9#hGv7Iuk;vxb>Men1b$N^ z@aqzRpR}2V%sv)@-#%nWLxz@x;dfV<4E2e?Z$J5@5&s_I3trEF;qS6flW~HW>ca-O~e-#_Wa_%RLWas#?t!#i$~zC=IQcz|mw zX*TQc;mjw}St*ByIA`g)&Nv2L-$lBe*yJT(_u?6Fj@Z|o*vxKvdAkJ5Px*dHKGJV$ zxpKbA0M}dO{U^en;ywx)Pc(=OA7c2VYMgd~Xi#{h0EK-pYE)*Ws*WOl0^G z|DrxG@f=4qdc&o2MQ zea9>Qu8KClri#A&IC$UWpBhxF`?6o-w{b_J+&4M+1634{PbK$dulQ(Y}qRm?Y`_6pKN_!=^)B3 z_htX|pGv=PGM~>sfrpp-O2<)e#>D%g-Ip!A6nweexG(!-?w~ah*UEj_w}#;-_f7uz zi(o!B?#rGLhNav$`TDPd_m%GCGmi9?+?V~~`^WH|7=~|Z=)UYFgmGt{y{-GQ4}i^3 zsZYdxlQ$FQ?Mr_FHqq|Ow#T=BU+G)mQptU#qrotEUn%!Ru03|2<8JJMtcl&|46b3k z)1)Hqmki#I+Z$hg8eC%y-1kBB9WHQ#%vA)>wh!K4e~3McvTpcmv*zlH{KnvuaMvws za9DQ+_wBoN(OBWr#lQXWIISp^IYr4s&h!htyBcLwU`VcMADX=FL?tW$o=6Nm;Fw z_3LE%7S4&^g}%yn$y0vIdH%=r^G*Gn{M}|PJ?4_Cb$hTsj9>IQ!dYyIY_;ruZ zId|-Q#{0L$(Wl&c_Soi0?*x5$?)W&A$QTg+r4+q=uPJ|P1@jkcnPc>JQjWcpbx*R{ z$vkKI_TkEZKkZkSLb+(e8p_1_L|0uR_e>ALj~#%I$iC&B!^Mu7UCd>br%|3-o;M6& zj^$!ieyEvq9f&8~{GJTjA(8W2F1D86f*j;Ar_fe88Kds^aW=ioAM8msIroyEkNj?= zJbNzAa#j;Aec)d5-a^0p?gDF*?hlKF(ABb7e}S-YS0nHx+o zh56=zjaJTxm$`K9cAd}`jWgw-nUc73htevublcqmfFniEBo01G*#*#^_6=3Bfwck)T4;?y3#&N zm_szmZeqUF%h~T9!W&p?Fd^@vu}>4PhTo6nEgpMS-iWdCOyub^{>%B!_|a~ot&U6# zwpFmb{-U>6?7*sZ6|ydgJ3ex#@8v4Ka2vnh2Xk4IRLXDt+)Tl1Vbf}9bBQa@eCBwU%uU`CV9g_GBuvsv+VFH<=GAvGRb2KS7OOJEHyI>Fddx2rP8D|L{vSJIYCXxBwC*oZk7wv<)g zC1JVD&xVJ~-EGsrAc1zFpL5j4YtB1qliK)9r@VuC0OtNVD-QcI3p{Gk^&IS8Wd4ks z?be*0j%UCfzsqi`?CDq#Y6J04&O-;3DMj~5q#m-KFZW$*lNam;qX*)TFZ?v(`{>mplyo4Sd9Abc@MslD3dBTq;;mUl|*-_E&2Zxh$YA zxs+iE?sgEJpU(Gu!o?3I4~yJ5 znkT*K6nQ#GoQJ?n?i4Cv+?Pr@1h?7LO?0G^_%kVI8o%WpqFm}byR-7=@Q&GW{8O)- zI7OQT`yeSxI_VR6K23{lw32>aXUc>?fhU2)UN+b8#-k!HsL%_(WJkjwW-vtxKBzpehc#24B8lK82-uMypy&wFU+4K*^( zAg#!&ytABi+mYFKh&Pk+Zl%84D0{w1SvHeC9(~1sT5sYVJ}IM~F2?mD=@wEJk@tnf zXRVVzpY$czq)nttB7U=3bJUI0oHgbo-YH`U?qIya|9Oy8u}fdIn((x-@W7` z{nM}cUQ6FA_jVZV6O$>r{ibu6G8fj9kH4|c^djkxQOD<87q`A!urN4|xV_aPf=kc*iyYP~$GO2zLZ%**==!B6~` ztBGD;C+7tgdeE3@;k| z@G2>fyz6Dk@km%XOuXxT#x$~?@dNCM)U}Fyq;HpV^;S`~fAih&Nj|$WBoo+UEAKG+ z!Jv+7v{iDeJxH={hcTR^AN5(pS{}L6$_J+#)Wx6=B6e5uG4A+EzK(q#+=nIoR$KYS zMC7*~d64~8Yk8mWin*#+b#QF8ah?BL_A=rBh4;DgJ{dn{&_)T;Pnfjo3dT^cGKR`G z#WYS|v22z2Qwm#Kha4(wj}N`Pd^F<@WH41zqkQ*SUzu)-sixi1r-8@g$VKhaTznC8 zV~%@Cf8%}l5}sM;R1NK03qA$vbVsGNx5H&%sq-6uah^eWropqFiG35jTCPmh(oc!4 zsvys2?MqjgRXl6@f^xQ-#Arb}AdrBu>UUPGV5<>O3|58CDyWW*R}S0FcQ>?>PjL~NDFNG{m_c@*m>Tggc5 z31tNN@W7X~$Ve43;zdT%LO3)}68l7diY$y*s&Ec+@jPq&#P3O9?6reBh^~x49x^no zu@o7)RhI`-^*k-1a2jXfuEmC3gM6HeEW~PEt1~!{mHB_hXZYhi#vLg|-@IB(p%2;7 z`#0iC|F%0rbM6GgI(&ksQkX-*=h>N(#qVtA8OT-%eW6$H3xjgCTlYV@y9y;PKEu3_ zT#5ftGUqI0D`+#%p@F~cigiDy@CHaQu zw+q>On>01ZUd`My#*RB0SpN@x&%m}xnjy$yv~=^~SQYE-e#d)7*5qIOOOcD)dsv;r zRk!LYa1k9>;06BGb`@J~GQ~GO+s}H$M%X%VtrDEU!X|dH`{_;fCHQ{y;a7sgPU*V~ zGo8amSe+9!RW1JTHvHkU@Q0h@vzu&SE_P6SQt=NKAV;a(k1b&z&z&>2D`B^D=G{Im zwt7Bsw#_|nY$6NuY(+q2FGL4`>?MGdxSk$vyhn*`UbgwTl{E|rFXEC8vVIG zR$sAv)evPW)a?sCmF!`TXI%()tm)%@u`eHDlWqWu3R9=XGm($y_`O^8Dh#k6z!{RI zWj(TvoPZ3~!U_0DC-G;{miuY@V3=@k$*xV`28vIVpV%+CV{i#F zv;-N73CYmgAs?!a{kf7yTjjxba#v;!a3u16)_d5mgL|#Tf6;jjt*b+2^>&=av*tx?&WLv`ETfJMsYuupZ-PUQ~KtW+=-oU8c1LD z%&H~WGh0v2;kpPvoiS&wX`pU%GT3V?{Za<^?7m2w+B!9jk-f1+wB@1i0voomA1{aX z-+v>oPo;l0_ibFVvUt@R@~a|0nNxU_JQe+&&D^)ThH|9PPkw~Wk-jd4z9Y=*Wwmk8zD*7qs)Az2F{o%^h*T$S+5B8(sqlh2VAegx{$HoS&R2)-5Um$HFp zJ@}Q8w#E-nO}-lS+QxUmQ0i@9Ab14tZ4TxqYcZ~&{3a8KeA}nXCgE16Oc=%9M9`Ch{Trt*k-5h4T7`UM)VAsc{H; zILlagGOv|%0g+lFn6%s)%!C>VcSdIk6T@_mA?H`xBlbcez>m`1qN z%lHr1pKoaM@O94v(H&U}qEeMZWWsx)^55KDt-tsdtFsCDJ%ZfI`n^NQmE5ns5_!mH zfBEzkzX|FQ(i*%SMhgr zX)AJ&VeZ#Bc;(Y!x-`J`8u^MYrJDOyv))42pWh=-b-FIaG`^_Y&89KZ&N<}KmRvrA ze{s~$dueYugOdeEj@OTTo;`(f?&|7C^x_0roKoS8^IQWS~p1$vIss`V&}= zW*<`t_W~_h@s!?fY1}O>Wt$LcH=C(X^-jIrIyIifol3j(cI({8ocz?&(7(6HL-qzq zUWTm7XSlqItTusZ(B89e6FL39_I_}SoE~rQtI_q+*w*$w-`uAWJ)QamGWs_#EMXt` zl9j8&WVE-dt5H|;fMfQazP-iXBmdG4V(+Cbylu3F*n8bpuhsOm|6==oHcSBm_ z*xaI~z=qGjP~Ic?x1|U2dR{hmKu{ z- RD|(gwqyV`XOqq}gUA7E9FcrU%^p-RQlX}bcXf3t6qQ`3lP>|U$#oI|3>Em63x!-L+A&{ z7hl|^R5BERa-`3_u*sL0?cB-S&}U_gxrX2?!NpbJ>sV>OT==#FtWP+|_$iV3yGhhx zGB`<}FpsjySo<3G?cc#3oZHy9Ut#LmNSUYRfJY9`ucoXeT5uoEwWO8!zKLdMV{(jh zBl`Lb*!U)9^Lw1r$afNZ_$5EdtBSQ)BG-43j>(<%c5IB7^3+jY&6HR@u!%Lhl-Hs9 z6fXO*ayq~&(sz@x?*qSIVCyT{L-UvM$87xZ`f_UgqaR;j*!3v-LR*za@sDgL@Q*Ud zGtxiW9p)buo{WEl{Th!fwC5iQ|0({_qA>sHJlbp7;A8$#$yH+4Lq3vSIhSG2yJvOG zN4g8!d9prI5kAre+ERQZV?Dg#BmL%^kdH*&p5l8)e54pKFnlEO#|G*ro=Zw(#;(zk{8g#U@ zpr7NjaX}qT<-7{9xygSYkImGa%(1Q4SgRp+RK_$iUXgx|h0C5%YtL~s(N7-1&i!}} z=iy*C?xg>j#`%j`D~t5LCkMHazT)=tSsTpw#b)YXE$0M1PQNN=D;Yl5VamP;?339? zJcN8@?zt4~U)S^NOMbzzOBwmedW)ZtpXjEQu}huaZ^tyA1-A8iza87iI>@O<-_4-y`46gX^Ha}MjOTBnyZf`ySr z+C#9A|4i^rV=Zy>q*tBg+#ha&;LX10ZVP?&=%sOLOgw975=w28JMr21XST@=XR5{N zXRF1D{GOMaEN35h7MVskmT-r09sO;?TI_tB)w#;g`WF0KA7Kx3uVW=xFz;jc@jP`& z567+pthwa*fm%7MGPwV~87{htb(b%Gt%{l_eXNh&gsT&|Da&PV9loPo?yq3{F8MAX zUn^^P<@eqhavo;)#vJ;Gedh+(>ivd%q>rxk$B&jf*;%J#kEJe(&xhFmvYfiaouwAb zd|x*y8~ImqXXGZz))>Mluqk+P!1)Ax3DA$|kngPiH-JA9M47edxG%6ewPhNiMUbx4eUhKby3 zq|nd4N^=YZ=YqAeKC!QB4slr9f^2nb#6C>jM|!R1bdELA97!K=Co}te_7_^q7tDv3 zFBIME=X!O3D(aJ~#{3$r<=ub57K%=8!7q_@i}GE@ET_vk+Dm0ziVdSphQu)TqD|zS zrZcGPaLU0x-Ja5B^?T`8k&$%Y6idw0%F>W?ZFx;Tdpi1NmBZ^zZhVvVNkayW_`9>Y zm~vk98uNDOrh6XtfI08RQqFO@ggg(E$2o+bN8Wv>U+OrY@8=R{5YN6W8)&(J&!gr( z>48^Od2^mBKk%d~mvi`!?Cs)gxGI#K~`1>NA6>NCeHrO|Z(7Uy zDK&YB>X*KjJ(1qM*7B4XwZO``s5SDwfoh?48-6tTe!Dcmv55UA_fgj)lf*tB3$hm!*|DS|6 z(5?wX)u^%9xc+NLIQ&mq%g+X{H_ktsvw~Hx-|?O;Pg*Stv6GutS}obBYRt=m4|j80 zIh$u6-&4S0HTvcl zHKr5yV`h-24X*Jl@O!Mv;+V)DpnSr-%$cQtfz+`S3|Y_RpF}-nFRS`Ce#{fZt@y4a zfi|~${%CQ?*$GM5lymv*^;sNepyx(C4qzv@7F#XcOHw|izZ(4sb)3Ul3gTbg9GI3c zEubZ^rfXCQZLaz-76Tu@d0_hAdEPuFtGsRocju&Vrvhi)Z{z%hTJ{jt-;w3tz9`H8 zGh|)nr3K3vupA1GX0?R>9kv8g|&P)IOl6>fvuDE-dxURT6Bll(qz~9)N?=joI!gY#HLEvr@Gxs zcKw^r3&7aAv9IF=?DUbJ$n*ZLkM!sLU7z!rOFox;$3A4_P}T|E$2y@L)|AU{8+i31 z>}h;cS!do%8UFnvHHz}PkFMzFFv@!x{zB@E6vu<;F+Re+)PfYpeWKggxIgOe>g{?{ z|Lo&>DfIcee4_iCpQSGtDQlCW+!@Ll;4%l%^o&+?qBc?o15?YvKLfceyE@ojXXIS! zSWbIY&|Yc+>vODt`Ghs%J!yw*eEG%L+|!cPdi)?y#&GU^#(z5lUsUd{7`$@X zs)lorxt?m&(BW#c7eB6owHuFfrsB*bHEI}G3?`o{`)LlVXSCynUp5zCjEsx^RL~~* zwCA5ho<(2iTMU_*jm%ild4~!VKLys?e#P39tJLD}ZdXN;1{>+VXVJwD(QCo!K5z

i7mbFs5vTFd@#0-589({*dx|hjp>0sqVs97M^6#QqN&k)o2MlNnuB&AAbLcfID~o+ z1YcdBc*i#Cn+Dghgm+x=xYZJWnHuv`yVX+uZT#qOuuD6@=MBn^k8ZzUlf{uu8AaD@ z%+DLPEC=~JUG_PD7e6MAII>1x{I3|d#W9q3E$27*+bi+M4uVfT`R$LeK^gdB;Wo%Z zpYRd!L>6ub>t7-Vw{1Pm@$z@u9+CbqX}ZO6Zu7QBwrSn-GPeb$=9szTZU#6CK9|tH z=gIz4&Q@AvEzfeOBG#{_duLevlX#vVug)+1S3qxLi6?P#SKxc_4(Z1e&y9tZyufz@5l}L8b|3HYktz%`80Xf<9~`iHZZ69jjS8O=j?WqzLwrD zcLi0ZCOVoA7xc6Y< z-I@COI_#9CBu*_*^w&30zuV3I9XImX4;vwK@5NQ8JH9#?=ajma7o6sp#OFTl$BCg$ zig558Eqo^7x%9 zzv)Bd_iT9{r!Hd5X3tF<1eOC`(+N|ANu3IEgJC}>jIs7bGG-~uWgeY)HxgDEqb?eK zni}<8I=T}>%@jZ?2Qg4vczZnANh2@}?y7J~)(4_)#eX_zpjoGDI!#QieME*%HR# zF^S{vtp|^KsVf-G1fMr`Y=-7t1I~tA7V&Jyt5)6TxR^ak2k9RVIszBT7|r(b75;@c za>kz{el%wUx<#&UdSQg+VfG>Q!k1~1Jx$p4@76HSL70YZI0OH}=&yX7Ifbor$2~jO z^3dDyW2BFvJ@#eN&v@x)-n_H9co4cTzJuog=U$OtiK%m57y6~2#Hu7&%PqfOq8;SC ztjkY-VC$~?RQcVv&T5kJ$dk9=XY2aV&-GR+XYA761F56jgRtv9{B141(Tl$A#0Ie6 z-X&>8-`_dFnc_S@dNh8F^fU9cA&#@D+Y|UH^4`_FSI)v2O;|~7vZa{c_&)Bzr6U|e z2+PK1uORGt5Z;)-#Y#4mO&42PAzAr-@35L$M2j(mDG>A zc0&#apbztJy{{<=of6&4X^{0G!L*+fHRVcpv{c;Rlz}Bi)`F+>+MYk(A{b8ss;OyeH(Fl&{oo>!$?1&$ZC=L zHBi?_%Hv1lZ`jkt*Pu-&()PO<7X^5>8~^HUk!|Es{F4#L=8gPje6Ran+wr}gq<-h| zTXakOV_ba-{X{rFqsXg0er6~7 z))qg*y!E~?e#U+xerDmo{^R25XR4ZSf=wccCc-epD9}_et3UZHU1I&j2^cweXF89L_H^k4dCai6K<}p3~ zK-YTW<9pf-e#VCHAL3{1?eR1B>gjvCo+Z7(&n%v(^D}mXpZPO9N;H1vsOUn7pHTyk z<7ey!KjVBmIzKb9Z^!tV4RTim{+A73G#Wo6Hu+@vnfcEJ`I&2v==_Ym4SvSngSm5&w^1+pvb*=496ytoCw4d4^#OQ9@-y>v zyO-?xC7uwUj6H&%@d!WD2RVYD@d!VYEV_-K zbEW<+*1PGSeO%*1pOfSh-Je@}Vt&R>9b54;QQ9bypAo!I#LpbS#z*io?r8jsP0lZF zo1d|pc$dM??169V2tN~eAjr>*INIEbpZPWI5#nd;;rvW8IGuo>aZ4X5{7fR{=_o(b z+aJ`czF>SJe&!tFw8hW7Nxi=hKO@{;d;H7>a0=&V#QzHCXX5xR{7fPEbcCPTOrK!z zGjU)Y&d*4H*cLzYN%8Ug%s(GL#?S2Fc{F~8!@G2TM*4C18P1Fd@-s8QE5y&Z!}*!< z^K^a&&Lqgs#LC_5_y^JWnS1wkjGsA=Jfrb5&;OWnd(Z)cpLuG3bbcm>_q4^&{FG=Vuo4yQBQf?Zh?snLNIKAAaV~ z2Lr{QpgY3PT+aNY!Oy(TI5fo1*xTS|>;^x>eeMQ7<1zS|F9-|qGaiGV`JAvwe&#kX z5`LyTGAI0uj2%t|KZBpQuOs|S)t(OVGoH5i86W;hBtK)mq+Nc-(;h!lfWEcE&v*=e zM(o{*_?gcAqVhAIF7$~yKeIHZEq=xmji0HxLlq^xdptjL4`FxXFDxm+7YO5LrvFwI zz3^RNUwizFr9}Mj{;nDLN9#gy+u~==(c=zq-AG*FXLb_5J$`1e9)FLdPjTjOBtKJ5{*nC5zM|;-Oy^&> z;%DpzKhqVwzArzs`EYPNw3Tek?=F0&7ofKGu?Ne96z&mme}27S1$F8QDhM)22@9OPp)Ia;U{uTP% zA)oLw8u3oFe&$T-*ovQt(neAE8BYiJ8BYX1V~@tq^c&VTKO_7AzO%>RXO_dab%dWO zUL53Ss*vmO^)qMF9>UKEhaJw(ytw*={ES`t$Pho{=_o(*5^XPX^oNxv=4aj|PFwuU z6zcsw`58}p{LD4r6v5AUBKR4P@H0b@qmJ-1bLkTde&%;GkK<=NZSga+1)qrZGYcO% z#?R#QJQ_dac(jF|@xafx4SwcZIFk@RV-M$N{xutanszk!ncwc9ecIq>dNy{9pLw4= zqwzDBP1gAtx53YxgD)Lz{Y=v?+Mtc~Gy8c4KjUtTpSc)cN%)zue1`ZLx53YxO_=aA z=kocVGr~oO@iQLy8MndDH0B-SXB1~(pX~aX z3f9gU>t}ZN?KnSknDy_*`Wg5cPe=F}nJbCpXU?ac;b+_iKXVgp9O7r((fFCyM;_15 zTuYiL{ER)EpXrV78qUuo@w=n^OdN3ye#XrA@59gBuvh12Ji^cXoB2tDpP9rsRQMU0 zpNPiK3;`d5pSg#+ht|)y4Sr@3VIh9TZSXU<6BfzO#DbCVGcPdi2=OzXQ^e1BI>OKV zl=H8eMEuN}~Ff4Iag=Z@%&7WjjE_S{#F0g_yS@4%#o*ce#X-t zKeL(oim(4I{v-U19=9!i=3PDR0M|a^hWHszd;H9w^!Ni^b;QT_^ceh%8(%EM&v@G7 zXIy&v-mXtcZ}2nDES;b682rp0c$7By8MndDoR@qYKjSg@nSZ<)ou9d{TgUjB`Y(h2 zS3B!x+$YP=ls*&WXC7oe3_0+$!OwW$XWSuv#&e4J8MndD-2Kbw{7mYXIzQtUe&$!m zmyFRK=hNV4=92FF@H5%eHIkn>2W%txnd`|vlAn3R9-W_AL%6YirXO}RjGys*Uw&rp z{@{2hkGxOB&nzKM8~lv>MEp!&>KVDe3BTVR!OysbpVMx6dY>de)3;52#@!Y_^VVG*;%D4p{EXfo2|sh& zEz}Es=7k+6$Io0mUF>eM%m3u@{LC}D-Ai^o&nNthNBEgLuz?0YQ=~ud@A@5|BgiL) zJrpOizX^WE6S02AF8s{p$PxUEUHF-7(QWvd#rnH?yO!#oeOz~iKJ(=h-TzJTiTRmI z>ez~(iPA<<_!)Nx_!)ONKa++}6pf#8v&X-!^)v7@9{3rz!OxsNw`2UwxyX!_Jw!h} z*qWbtC%1*4@r3g;+2GXP`Wczel0GuT&$v6v&y1J-Gsw{uV0@zWGru5CTl`ETJmdG| zXWHH0RL`2<2!5v3{wDC(_cy%>J{{p_H2MUCpBW9-5$k8#+}{-V)$#mH=VizEnZ95X zjh`8@yoH~!a}Gtz{-%}SCHxE=MXUWycg@iG890;R`k7I+v`-uSjB9(x_?aB?jK-G=D=jGgzi#m_v-Gx(V{_cy`M==+=CXY~C|tTk!b-z0Sp@iYI?{Y}<0 zTk|uQ@H>*98ADh&KXW0!!}*zW<#~{wY1!YDPFRSaY1!X2l&}y#)3U!Qm9YO3Khv_m z$;>-X0YB5Szlr(e|H}R*_?eddP4DX5@jzEU#%S;}C$+yRJM{~DNPb4R-f({ACHmKJe#Xh~ zj`B0VBd)>Etmgao;b->1oqdAt2tV^n<|hq)W(VWY5I^H-gP-vj{7et(9^z;020xQX zScspo8~jWhVUhgIZ^20TnG9qu#Lu`-5kKSZ2tTvGu0#Bcy)AwwiE>BsGZ$XSoq(|4aWr{Qf6D|I?oz(tdDmn{K~s@)@#U9kI8AyI7s3F3Q@T+e$u!g<_mjw(^grd?FCS+|$i3V(?9cvVJbpO)%l(`Wb(r(W z>W7#dDRV4iWe>H?cgC3I{wdpJ6aR8nbs$+=ye!9B{%~<~v7GNKY2{uM>Cfs}(^$rN z6KB=Jhm&smgVvQYrhJbxNxjWED-##rZRy7ME6-;?`&{MkLYy_&=j;v6#T|W~sq6Jg54t-K%eMM^mf9u{;{3Xe=57;xm~ zOOIE-n>?mA(_%HnO`NFWCU#ccC;lksZp$<+Devmdj{YTDTwX!hL;cTQXZ7GJBnCE7RKw75d+miNcazv`c%dgOWC*Wa7R`45|D zzqe_xGrk+Qbw#R5nn64M%%mlbzEJLZ?~|CR5+;rz+?G0IkerKrkoGx9+g(N-tIR_k zS^8OR$*!6UIfI$@lJlYk_Zr$v+N;*wH$7#}V9sWg`|o^;dTVC9_0NM7QU{G! zmO%kEH1B!#^jD@9_mA(=Yl@srkitC*nVi*A`%v)ihT5ej%LKx=gNk}GO`K^q zgY($f&%Sd=yz|^e&BY>jJBM81^v&Sx7tVi?yo7tQ>rzH;dLVTlvYYlwxktV9@nB`?oV}I4B}e>zHfu?nc#al|7Q!v+(CK{7}tSuqhLHF*15Zfb@84M#(xFR&VuoP zcxR(vJkn&@-BT?#FqW~SFABz1Fh0-*#?x-SXza2!Fy82kj`3R(9)@u<7*}zo=W7xU z#`Gm%9JKj9Fit~v|G=}3VjPa|;iZ}`w|&7?7JC#8 z?>Etj{{-I8k?*O(`>_+?{a5&_@P5p|yGuKG$F_lYfOYvI+tKiD;#u&F-k|OHK6p<% z3A}A5A>UUTcxPVVNVz&F-?xS2TV(sm{nj_S?^ADt%lCO=_p*YvI$XZb0q^$g$ifJ` z_hYNYCc6bYY<06P-$C13gM5n|JLQ>fOM>!Uk9?OAzP25_pZT76uf&c=_KEny76nGq zC!P_q*~qm&B5#9&B8rBCI_M$C3e~%7@T_51lNwp=Xoc<^UgN# zd`0joS{2%ZXA42pz4jjSGJual@4~6g(KjJVl_YQKoJS3MQ zlUD4c$fRH=zQZu^sz)vlArHf8gNDk^j+AluWM^BQBZ#{be7j__UgIp~>|#|G@9?1B zAEN&?^!||UFNogva{bfHz3y%3eFb_ys0CNJUfrH{*Prb}_ciqR zh8Aptvb`VO7yX_T!uEi!`=PVg(S7kTCWNpx^j^wq_zNPZQs!v>LYw*zKBE6aLO9O` z=Z)ySVMA}}_QaODJue@~NB?6*|GB56uKJ?`F}Htppa#4}|3xkh{f`&@$A;E{Z(xYY zV(9*v(oaR$(&b>fvkgo$!1RMFTkHNVFwF$h_z8$1gL|MuTO z-QT0**)`Zcf+x=o@vIHq_sDo6T=&EMueR{KF^H%Ar0|^h*8|VaJ83*Uk$9ee0zB_( z1J73lpD^7w@O(+a!*t)k^M!WsEIq||#)R+;>+jtYN)!K6{k2*iY+KvYZ~qn4 z|7iB~5YNKL10j3bqWj0&)7QBp9j+7`Y51q#&}ZF1|1F%&jo^blwHxv({k}f#t?cF) zkNph1s9D}4t@u-~4OWhC`o=nC?Ca%x=nwFx3?E9yygN$bo#Hcd zxnIc`%U&ol%6P}SNpsY~%^c!>XZ^mdY|SC}y4)>T^4u8b@4@z!Vf!`+F1mgPd6}=U zmtqtDAmP}9Xc(^x;T7~fKhXIXDI0x|j+yW;QZ~77HE1u}$E!;1>`qK~g@miNQ;aX_rIKBSMkuCq4Phxoi*lY?VK&fRvNNFOJi0I!v8;I*0c z>e2METEg4V$G3TQ%zyd6>*JXbc(vFsYY)dz!3#dGP5YI~S=ga5V2k}4tSl$O%X|X7 zu4n_VGx^)c@Rc>SRby!Lz%T_1NycpLiY<=Ov59}Pd^a&Q70`z?&iWb9jy&ryY)O2yaO zfZrhgLj}BfeSEyr$5^WZy?dUq*I3fwpSc^n-5n{6YsEk7B>ow8O#CzN@YoaDuau~G zafegLpP11GUS%P?zFHc*pGn5ShJU*%gxNlQ930}a7`MrIcV!5(=1C`SzYM&NAg9sr zsyqQ+yGf_x#ht?`Q-gRp!|+PnY;8*PsHSk-41YG#58E7Ie;0mMYd;g*e6eW$n1P?G4g9<(!0#CYze@1C zF^Jy>;rRK$&)YHl3QmCEJL6m1H3L6$JNO;_XHZw8;dhv4LEpcX+_{Z;#Be{hE&TL5 z4rw<7#~Z;zgX=K-f04=A)+F8Ecvt$*H{0D$L=~4X+w~S9CIP0`aEi2VIVX@eMY?#>HK^bmpxC!7L-N*z zIY6DylR3cFb}lMz_08?;>xc;440)R!!Y!J<=7g||CT~9tVHaWNqT*)Ao2)nZcImP8 z0=aQ&z1&%<%N>2f*Q^7Qaj4vlcbK~fs<@kydy0!cO}F|#=YGsy+}AC69fZTQ@r*_G zMYh3K|B@`tQN;5UWzzYuT;iuOmvbIvlsh) zll#s~iTj)$H&)N*dE!pw|-~$0KWJ6Hn8DXzqm;sH_BRAsml)P!5Gq|Vyw=Y zovT(kKhjpm-7~l8%>55+eOFWK-v)yv+zTc5)+^SREamrh?hLL~YW;M=>$sEks)VXl z6Cc%9XK0CymD~rR=qr6CnzNxVcOYXQd~aqt_wXL>z1Xs`D|amxC`ZLL%31M%=G@a= z`8U#U*7xQ9%L?wRH>olEG^;=9)|pK)rr1LE_peXqE|aTF%AZKsLQVO1lZQ1+Ipj|B zJzW*+Y=U+Ah_czZlex>$0PPeE^P0Q6_Eu}oQA1SG-s()}j#%#X>ipiS zFWg_NxoW9fCTnN%FH`&9XH8Qwc__+~AIBY9+$&K-yVWKt|C!7W)FyJzbByxm@;qbC zg=3p1ZPeSt`%V5U`P`TN2xAK~Yv*3APxF~v7pMRq#dwruAe2YE-;kGZFInbrgz{xx7y z0lw?V=a=|ky<^n+Prp+|b8D32GoH&`H$L>Nmi+T;m{UL}=Qf+1Gtww8et{}Ic2}`+ zw>ayt*H=;|;o5R3tDAlJwfF^+kfM^)aj2=>Qv1$!`8^B$dRo17VJ`KOKEFk{bci`x16#L z)JFYf9j2E!$f3UOy?N5xdYNRs`%&^tChe3!V13RxR)5|a@dp!i`!H{GkdyE85A4h! ztN%9cs+PMxZRB-3?I!$FcX>ve-LXV$P|zQmkDU>JD1m3X4eD;&63cfV?>dAWDt^ma z$y&ItyQwGlhhS5btDg3#h^e}yB&Oh!0$ICAd*_15ni$H#JL*@OocT)v#Wf{a&RLWt zhqjzxvsxN#$}($^@)tao?Yx`kbE!klbj>mM90?omTu9h1?#G>iEjWa3RD^JBAHP4h zgI~~A9EV@J)jxZQU=*)oH0J_v0Hb&R4o2A8xh8qmNq=_h;Nbj7g*>Bfc{+X}+`+Ga zbZ_uX$B#R>H}Jg$KYr`@VK0Y=C2YL&Ov1KfSGOV;g3~)EBX8XYHHo|_?ALMf7N6Cm+m4XDb)oIA zM&4}L%*S#?ZaVAt!xmzvcOxIU)O|7a-Ax(1<}NNR*0$v?e(#|?LrJUnUEiJl0-4%D z9FZSWj&jtA4K&BQhAp!;#Vu1!OJaf;_`qR*L7=!{c&77AWZ;XAwErot&-jS?WJama z`je>7pMT)`Bt_JxYn1xfPNF`K{=oJ5*WX&p+dudnDQ{PwM15}ff$QUpsLyjz>eKHe z>XY^Z*XOQ?`Yec2pE_i)qxN8r?T57onGyB5G)jHkCsCjBAGkhUBkI#BN`3A>iTW)6 zf$Q^+&s*Dr&-fi_4DCH?6~dVktQ?@vFbKmCgF zQW^c}bCmz9?$V!jb7^t5EoI^L;dd>*L_KknrB1|a=~I*2?o$U!onFXv?!sqC>}~a5 zN#8oMchHATIgx*Qiu>2wBHC+ic>O~D!k5ToN9{v>{ts&(ED`k?6{SAwPNF`4{DJEe z8&MxEN`3A;iTXScr9LtqHO8TRQeu)XSeK= zp)A7Nya)$ygmEO}i3Q)h^3$?yM1ykxwn7+VPsCOl3K_C%SmAW75qR> zrE<(+%$56~a?Z9X$4tg}vlx@)XDLfg55_sjM+Wyom$LWFiLB-lwv)8KXS|YQ(;T^s z&*t=0{yeMZxQ%gI1!;Hlf5%{CcB8V~zQVdV=S+U5D*x?vwRnCyGGv0Ufp`03C#!!x z&lYr2{=d*K8i%N$dd zWqO@jJbRV3{1%U9S+p?AGDn##`L;(cnfzBAqvmW?`skncgc~H8= zd+}%5vMl&iwc)g7CVwSz@ecDogV^V|iTn~0rdl?ht9n+%SpPhWeXQQZ%LZw0ls!1& z60KW9k{S*F?cVixw*RptwSJ<-YMGd%F6z3>YU#>nw`CJ7f9;_zI&w#>^GEF4?Z@8O zqs-;Xd%oa3_h$F9yvx~M&s=i#*5XULOeryU%Bx-RX#acIKbc@Qr5|CwwZW_{&c8PH z{5!K z_lEAeuDQ6H_kB~VIi}yMlGgHHPhTN>k7a$du}5_odojP|y|?{*!s4cEljAMo$zIhx z2i4-c3fZfgEqziyov-?8Vvz4k{!|rxLf-N|*@wCzPD}DFSB{T)=N1X)?)h4C@APQz z8^`;uo<3o*ykj@-xH;k-`*?@&hDWxlqBBBuDzF9Xw1ND&yWYR(h$*SoJTM)8JL)^6 zPMxTaykjTt$c}i2k9VYDt9-oUov?b8ElY4b!#h4FOfZu2OFiU0f}4Sv)Zx=m9S)KI z$guoVli4pR`BR4v$p0ww!bk2H@4S}#vU?&6mv>g9Z#0?GWzT3+SUdllHhw$Q&Q)*T zw0OC+v+9y}mPgt-mUh1S-jSWuR1m37?B-pxAI@^XS2!`?c(FKrlY*4O1nF3zqAwwIjoRnLBOsk7`m z4^St;(AaxEEvuJh*Tc=l%hGL=8@1m}E>LRX(EBqJr^hW%+zM9nvZh)-V!wFO(VUfo zj^=NzG$$oC21+Jxh_fY1zJj5&Mexk$Uam&+H?WlVeDPRoIXeV?1>mtqrr4HMv&u(*YpK;7-w#iE=cMWCm(T=@1Q&IH&W#Y0I z%dTw{*$U#ZQ$K?zh=pKa;1Q0+Ur0BCbZKEYenC2s857urV<~wEo<{m@;P^B+J{-bv z7dT$?z*XS*MB;1YyB!&mz0vG%FOMv@E{~km7DqforsSUbH0&&PY|Jsve?#l_u8iHL z5a)O3teG{Rvsj-Jc+q5uLDn9#B{@D~tqT6EYbUsFV~vXJOP;{Iw>MjJFmLPerS@}N z!#q~a5Y2Je+==;1<;wq!vRs>FUEIjNf%hczfKO$?-=_!*t_WRM{SQkwrY<K_^`kGC; z9dR8Rndtn6d906F1G#esdz|xv?eYZcAZODyyI<|<9DhAn<}pvX)a>x%m!)7IY}E6s zMM1m%Tk5&@T)1`Ws(CMS1covfiOs3uebSaU2ws#UkutMp!hIoSo>`OGBtEh15oX@d zlS$cWinV2Wx)G>u|n$)d{x@qjgnI++j&3xo9 zw)e>MybrlD_N43lbf`gbfnHixtGLhL!uZs3`Wv-I|7FQ1INnkRjt&!g=p z&2?u!zQyyz?+@%d=i>wR$G*ow0UoT+~XOL%K#uU97ONc+*m+^wkr`s5Vq^Oui zMSJBkj>uumP}Z3-2>$X+bWhfo-*Ue~7K7(7JdYooZ&j9=55_q2vouTG>56j?HCLKR ztsjYeFGbcW(H~t`%!y(<(fwrCm$d!k;OHeknM;475A#G|5?o&roKu|5m`3bGfcaU` zqjjAnemrwH$`K>@l8>xO(Dd(p!p6A4^rExYqk*Zfqi>^nS^WW1@5Y)Hzg|_tcv{vv z)H1J}*2C(*z6*1&%(JF4uJ)RGSMOw8ok-bbe(mZbfvLOnv32K0@uL#&Pnq&D7*7We zA9IRg^Xu4$mW3ZM>1*a6yJtJ)9Al}woO>Z{ajZR?rN8;jfmyS>2d-coQg<|aK2A%~ z)c#JrOID?835C-Lo9K9G)x1uLg|&T6P8(|~L=JYuo1JIV{x$L0PSLjm8ClM*jEgS2 z-}=%ylx5JIHJ4Px+Ae)L3Ht_4K3T(%XmTDfo1J~B-`>P5=K<=9 zxQ*_vn(ij&?>3Wn_blfE)vItuXXRXg?8y9|Q6G`t%C&tQ*(t5hzn3{?lRCOWI2Z0Y zap|^=_UU__)mdcfTWxF3S}9zI7j6V@V?RDmy17@$D*CL#48qT_FIlzn(1Tk=CJrMH z{pMWshR9A4<&*sq(x2`)tcsTRRE|$s+wnT#&+GEk*HxwZR?ny0@0pSdUz@C)FHq*z z^X@@;N}%kjtdFA?WtZ}9N6uv&nZX?GghbAK;eE1}qF!m$nu@Qkpj>Mx*O}m3f{lD1 zo!UkDu8hrWVhqw~W1OEy86H>hg->Xv>I&AdJi>VUIc2IoSBopm(9DfHsc!}KUDhM( zNGUSo)nW>LnyHZS`~FJe)^Hxnp5dBv?*Nli^&ln0^)h!~ zgS`6C@jW6_wAWgROWWLrya{fyMxtcS*^Fs}^*u+6FU(in8WYeVkpqb%X}eH=Np}GG zmN1_=P7lx9641kqyd>Z7{2J+lWFEL??)0%WbI%w%jav86wm5 zz{gNo101gnYA#N~-t`RHeEh+9>`YgOHLJJdZ#)w{GybJ*G}=bi&t@>rXU))529r}| zJo$W#@~6xhHdf}5<-e9Tdz&_E?mn<-HlHQ5X9CzZkoGFp)|hCoX|!J|7{fxCU8kvr~L3KJmNUHd{Z(f>6DW z_uudr=>H53Q~ZP``hz2P#5jAAzuq^~?@C{};F{**2KqDk{w@8v%>NHwmfe(^3w;QjLML6pJArDy|-XZ&Wr}7RX&(t|F`dLuMc{oi|g1*K? zDIa(q!p|`LlN$VsOfVnEvq&G}$Q|Qa{D}Gx-Xd>b^Is3~Vy>N0`?rJ8RCR?5jiXGRoiH`|PLSefcNxzB^CB`(~WP z`)=&u`$~}o!Bg<_fT=R2uvexkxW+zgd@J(M9-fzU@O>hCZMEOXu=)vCBsQfC89Ip=Fs}9%8(uQ5@(6AKOkbgwv4~6tS{5dwk^q&QRd3U&rtl9x&Md$$~bU9rgK~` ztMdwUCZ?BiR`Ra+1lB7MS7b^4{}bie`_b{`ncl(jpzHR*th12y9NAXJPRy6cSl8gQ zHa!&A^eK9D2tG#2FJsAN(?$PS`(qOQi_!IOCib8V{riZr=yrhhbRY1&s5!8qbTl?% zx{L+m^tkVlhi~5lTdR2f+O^}I+f2!grL=+M-vF9?6-WDbj;fwf8Ni9!TsdN&igsGuNIGKUgvo-an8!Hq=QZ~0yI@%ww>yP}>`BiKd5Pv2(= zuVn07%>fS$JdFLlay|yQx@V;(|DVraNu+Gi_V->4Ztd;w&5yv%*x&nS>Myt%b5h3n zKCeqSm_^&)>keTSxxcq9+?pr7)^dLJg>Xatz=wG|`#3noJ&Sxv<&XM?W#04k& zyvQ?BFIN86XQakC56U^7a8K~Y9^;JE!^|%m=ULb9RYkIw-n*2&j%GO0D|kj*`^=g{ z&RQNJxbnPZ4tZj59mZ_I??UVta@=x0HF)O28Rp2dAW9!}1h)X!b!9GvIKSI4^Q{0^T- z8;*7Od9;rS*5K!*?vZDQ3)X)f1vWf4bl;e-?;@CiZM5@fW91px8tqe0n@FD-_>gdL zWey#jgB2aJq=uHOlqHjcP-yf1>RSZZzFjf zC)>1rYuP?_zBPEe4cQLI`8b3~%U)wVlMxe9U&{<+h?>i4I z^MUB8LR0(aef#NUm(SiS);EHSbL@@C+2m%%ee$7rH%07&wB&MAguWjkI>mVzKh$#@efBvt`M=S_*$aMbfzRjSmGgxS z$YwvaU-s&kus16DVFkLM@GuA-CBj1sJd}9R>u;nSH+qX*3wNUjW?Ufc3I6eWFI`UB zhxja?s3mu#o|>-<10RQ0>8GY3L)WQ?Z?YbcbEkRmRraI80@;V4-ZhkCgH{J|-`u0! zqsvbRJgHrvC5s<~V%*QtWd*!L&WX>0lr`}b<5+k}8h!t%w`$2Io$y%v`0IP)>reS( zN%x8HcD0&gPlUIr>P!)PKK5Jreyci@d(M+l1npnI=lSq?e#3`N?|gK!N#+JCe%KpB zEpu|WKbMYAcTOeyiJKBF$@ab4%q+eSg1^6{zkUY|5$tciW2zVuv!-%LMNG;JZFA9# z0cz5QQqGy%U-z3W{q+LrgtkFmnhHbJ8T9!Km&sDLweRxuy|-+em7)da6w~*KlwGxT zMS4E>h_5piTFB5i_`QMh?*?CKlWlmihYq5Ts z>qLSoJ2^tlX?zbk5qxD{I>r1=A37)f37=K+?&H7qwfkDa-XAV&;nIvp*)!z+h})@K zWXa6cD%n@RPnNZjWBV2rb=T$C9?B6Ns1`X^S=-flq}5X(`OnZk;V1r_J1WzLIA^_} zlJ8(VO5Cg!_@n-#?XRQ#g+}|2U)}!OEpL6J{dbz)+Hsxs_qtB|!~b{fU!}J{_8#Y! ze^>jp-cHY}diz_Zq7Qwe|7W&oKkN3BPnzC(;yUd=viI8k|H&i&eE%O|?l;<>?40!P zYQL5CziG5zd;!1F{?V4^%l$9yA7g6nf1UPkxla4n{!7}QcE8|~eNj3F6mO8{alkvabV~qcq*Bt-i zKjqN)CenSnZs5L^&+^Rc9e-7>p0j`1JOMw7HPks7TayQ0S+OnFQ^!Q=%vAnv1)Y;9 z?-0B{f{fjRo%$@kMh%n`^gHwV8dH#dZ;K!DY#}sXP0Kj!j6#plExu8YLbLcp*}nD+ z)YBtFFAy(2e1+t1OZNbgbL0yR{CHhzUZ?erWvb2DIKw|Gg#HPDU(+c=?tZzM-^;)D zl%6$rC=tJ|5gyOZkPDsx3$8(1EbYc$ujQauj*BiBUtvPuE!VMWQoNgmzN6c)(1pYX zyl2l9dyk&p68w$yZ~D>)8|nY6O?p{B`fQQv2E!Lre0jt_Lwtk8&!-vxFgef2*^!c- zv|s!Mtc_-K21>?^=(FPMCi-jVo%~M z8+pYyyxVf#7T4E>hCj~{^x8^vz&U%2wM~qQ)a|B6(~LFYlM+6He(=6S)i8$rZsz#u zguCd!MD)>R;7-;EBlxtVv;LWWTK-xOXE}Q73LQJ)C2}w0$D|e8XOmZVU5);D09hfJ z3J+8*pTo~G%1pxd=PlyoOr;O6hX1dzF146Ne>EkGua1KDU6djIQfJ2qKIOf?u#%l_ z%7yMt-ZW*B27aGqy(oT;lI9iC9ArHwdT>2DalP4;>`T8*(!=YscS`yQJ$(`B55v2y zr1yh{L+H?(`7Szrz5W?lB07ik?^!;tUaz%wifKN?JSJ;m*~>!b*@10h$HI!+oa1e` zI~Dp(YQ+uCV*Eyb!98WI?X1lrCo9axo4VI2Z=abmyydMDTgSqRJDuZ;!i@4P-SqMv z_y@{^zJ1>)FLr=)eC=SPJcm)-+x8mtS%PS9h_}4%I(>0Jyu5vF_-B;okoJ1Z zt2N5&@WaddHhr=-{F68dHa8Oc|WMVZ~yS}q(8oi zmus}w^+U?TUw9Yz6@P9s<3nWd7{-M7+{;;#MGJ>DZ((d4;a;lukUvK`Pa^WSZcVD| zAmR0~%2|`|DX<|!0s}2AOOQuF$fXDPOhGPvz&II!T(TpVp7YA3Cy`6bkxNC$rBhzH zv;x_)jq=40U*yv3$b!cyQ^sNwvTqjgZT+=lylbp)jZf}()Z2p{q-}d9K+=_%(jucUg`RC$=%4 zz0vpX+d;ymKm6#Ah4jN}^s96}Gbd@uAJQMM(jOlB-;s&euCJl&AFmG`XHe^?9fsZl z27G%mVskrh4{(Jsjy$`yWE=c7#afe7S$~^*T9e0jR)hWeSd$laQiJ_(wk9v)cR+t@ z@)17U4X`FZtEoX?katuD;0N2S+k;2`#>+689zCuDBt z+?QadKmCgya{;}_x6k7{^EyQEiY{|zx5RnhDjaM09S@SY@q%UJywlMfuz{Y@U&5bc zOzk#vp7hF@F3!T}`^J5UcYtZ%8M#0HpVk7=g{Gq;ubnciWi7gVp{axJ6MdXESj8_J zT19{OZ`x((Y&Vo_C!f?KdF4E?j6pYbU=wq8q7Gk~%ctNIedm=icb@SlHp&3fh}}eHWENA1&Xe_}(=$_mo^Z3+D*Z@+RkMq{qlPY+u_*mA<4uhCk0mmW5suqA{YgXTD` zzaBP+umyyDH~x2g<2>FNu=ptWKnL2l7@O{1_FxXuPjU|ODD_GI$+^h7qKgUigAg^eH?%v0L^-LUi5tr0@}5m%d9J_&Jp(81eeWqf^!qw@u>4 zSXvr)OPu%4?y<%m*cOSS|C)B2Ima2wSpe@@%4gW?qJK6>Josu&6MuW-9l<&<76--( zh--_XeqiA}a4-%GZNaa8IOoJN@oliN?h`)dG7gT&IZN6j{JT$ZBL40rjzV)sCtpR(Y56E7640~yEKfCmA1N@gg z&f0E%uEYI|@f|>aN}o-luMQGFZk*gf$vqtP%Gt%+FGuMY@um0O@z_A$$ok_U;b8*r z7^g|U8FxG$M>n?;H~cCd{`EJl1s~DY$7yR7-b(pUcrat_wmq&kDIB-SMJA*#Vb7AtBB$bl;{NX z<4X8lEI9S@2}}#0F71Yg@XSp+eLgI{cdX76SHv9Kfq8p5^WS##sF8fupht;a zr;&L(rnN9|rao_nmE1vE@xiF`&e>Va$v>wp#pqYEFHr}5Hpc#W_$qwbNcv&maPxKM zZjmc;eoXFt@%ahKUY4xShf}Vs-(>G7i$0Y#x3Vc`8hp$^zu2@`>37n~zL4w%^Ap6G&S2Onur(x0oNb&+zE-?(2FL8`Ep>A)ko}bwHpg1rZN^AZ zl-xi4hs%3l`gtP!d_M1{N`-DYSJWLnV@|j#y^GIv+-Wg}&#(|x`ZVdD=l<&7^Z6xr z^?t(VInD~L=kspH{3XVWjkK3IM{2q@r{Y>aQzCXi#N|(sDh;yrscuUKA`XvUtk^@<>IMJ{T%#!jr3;OIX zDbKiTbqV*Y$~er?%L~`b%jWx7Xg>#yvLA1wyqT2yv|gq$$IhZmEB*2d(lYj2=Idn| zGBArWMFu{imuZ|^9mDsowErwNf;TC%h%&cP=I`|~jk|HT3!Tt%KWU37^Hse}<8Is? zLMQcE^)m4d;wO3&+H8}wfq@DjG`QZWOfGO|0gYck|xX<*myXj>g z;QKErTkhDpg|fwtYS@C_*JZ5FHgawKdz)@2l(DCfw7rCBGfA6{N zv-T)UnMe8OSlNUA(wn|=qmjOh^sfk>D9@+IetW)tSzlM_=dAU!p{gVd9Er}!T};XP zIZb9bZ)}75GHHRhTSITCNPvkd7{rsf1HQz;`(qMPZvbD1yAR8Yff3WH=hxj^vY zl?~uSWW&c2w_fZa{=|9TgV|)@aj(Q(g~z5Rjrpch;=pl>j$=d4wSr^8>K`Ny-1uzV zKD?C@uG$&$;DHx>^1!g0H>Xi2d0!@t$UD(#uE?fOb-D1ISq)|_+*nx*&*{tO;JG^6 zZm{&H^iKr+^BXYOayK@ShUMw2S8Sg()NCoMF^A?9H+eGRf-Q5-Zd;z7qQY|G_+3j` zT5WHql#W31eNgqYi&JNf$!8Nrd^5WN0oqg%KHZ1$6Xum_rSkv;yur3^SiW9$2-0hf_I%? zUcBEzUctMJfi&H!0@lAAf{yLQdL8Q+!R#5r8o;`YTRGPo zR~e*Zy#cHrCyp_oV_nwtg7w3MwZ;1X^aEqaL$_HlZOr-S!Fw@sEmH88&l*(6yLSx= z-iyI|n8bniQ##(gYf$iBM_h=+f%nD*B7ePWQ1Bi{nf?+7-no;4IAi_U0^Z}mY-SROus#;-h)+#htPiK$ysNN2nsk%fU|ldTwua2_IiDf(jhvIKMc29B z`HT?efbY9c|3&!J_CEb$exHP%o5(Bc7`abBocZjB-j93Z)cX<>~e_8mzxihXuTBjam;H%%=z9F6_r{`{7^VD&!ax9<+;jkNm+WgP-vCf4z? z7Cl56HL7ArWoJuSUI=%5D94c8&Z?|(iPd!kUC~ARk8ZNMj&XlPZ7p{D9;!uKn&#R> z_;Jc|vre9>v8Hc>;qSyRzFl%o-iE*1xA5zIYe&xaedGO+yDTl)CPU8>-F`}{q4$4T z&e{w;eQKWY&d~dF?lAQJ(-McCKFwtCRq{gTlyJVk7@p}OMCA@qXKFV5N^zZAvtuYqZAjBZOW3w#I0}Ceb$AF3maV zF2#Er_qiS<>?nLa3m;_vM(%X;&4vGI`S3e<&{jVDAAVmgA4I@rUa|U!F|jn<-&J(RfFv| z-6j{4Tti z_&|OqnvzHG+s^%IMfj82Z#5;S^E()QEE8W;EB>6PyINX;uvw*WD_*NsaoK+~5&zLl z?t^l7D~!y!!<77r*t&wgZSSg}-JN&za2|#~V)L446266%6q7!d^PE0^2H6)Z6d3_u z#O8(V%9$Gr_Q_XFU)B>YduwUro5WgYIB72X^d}heb~kV!x}@(7q=V4@F21u9@SQz` zk8)3Zl*iF;nXIX#z2g7bpj3Lcx81wI^hxsknLN|TGYx;+SMaypu5l-i7NXw`HIzJ+ zW|f}h<=t!KIYORI_??c&@6=c~nR9C4U0>2BYASuIm+u=%+e+HkNV^|@+Di1*6xAiC z9v+VK_SN&G+1uHY9P>7FI6ksLlyRD{BJMF1HZo{ZP};urgYHZzy+(WH@g zVkX7n+ggNgYl|m?dn?obM3`@kUX5pwhpnUDa&5#mD|nT4{sefFA$!K)_8$6zb#IJlZ_!pc@A5Ww#$M~HBzH23(em>3bKzQS^8udVkj-~8=j;}lZs?{b?l#t9Pf8r}SbTKE7iRtI=!K+3?w5wc>otru8+Kox zPS`riuzgpz!N_CyG}oBBw2k+nLQ&Z%Jjx{PTrFWx3?C24&= zbJ}O2|C+N@M9z6V4RmfVhgAu&j*Zysf>fEjDr%!!8FD}A@_<^FmH+P z;2kEFKFiBv@dKI;Mjc?ZTvIt3{(Mh>(HJmV434{y{v2s~g3&@Sn#G-8{)E*NwgtS4 zPj(!4;R$Z{5%!Pbbroa(GG5g;@w)%6Hh8t&pyTz=g#9ykT{ijKcwI!;)p&If_Wwq_ ze)RVB@w!Li+Tiu{YyUr9e<)tRTfh7#-nZ*z%>BN7)#!)9`BRs@7u9&v(XRPMji6L-JVJ4iO^x&$higdm)vEku3dypMxKi-pN!6uyKI>2 zZNeH}LU&<*EjZVjEN|QO%hi%ak1U6d@6{jK%M$(Eajo^s_1*`(4*xoS2mjiA2me$X z{(b$&YxD2%e~^E_x(5GdU4wtqe*pikmY33xGPldQ6~&qEMacU!=Jvzrma<+L2Cbr( zE@tlA!@U9x7UQlCT{mS7bzR*Q-QWS}vA6nTo4+;M#(e?!C0C#19aMXwYB`P0YI{Av zWp8cgvM*C_+vf+ls+n^$IZsqX|H*lsecm}(=IvPKtZdHc97A`!mOpF}`a}r&<7wzF z#MeoDp+&dYPWlS`oKDkD@pF0{{jn2ml69%*kJfl}NAiR+FPtSz^ujFGS3S`kCy>_X zgY*vb+|~NnA?Df%UOGPmpD&Wer{5WKtvN^5Zoauz<}2SEmc_g$bC~FrA9%6-z4-nI z-WLj{AMyJxwbA}5xiZd!^!a#d7jzJGWh-*v$KcZ~`m#A#e?Mt7zb~(kxbH#iC+~vi zBcu_W7;g~y_x+AL4U$G{Nd>$G8T) zFnHTaec!+vYj=?|KLl^vsQ<*9R@W)8RRnfK|I^ni^wF#Q_H<>BNZ0?g;l<)^(%V?eob+OGI{2DKdk=fDSS;%p@`!x!VR0Pg%N~APEIPs2 z4%P}%CFpQ5T06JcI%G_ABF}Ep=8@JPSx}B1{1~e}tm^3nmtL$sM|?-xRVa7{t24mrt6;B@|5aeM z3s@b^XUZfk`E}@i@bwXg$&U(N!nLbqUbJZXwalf}B2bvJ7iEl050lQt{{8n+h4qY$^~~k50A7V>Z&1F_D|T-W zc8qAw!us%iJNQm9sWUq5U{z=rtWFVn!0HmPng~`iIs59vs`Qg!bzEo5oJIQiTmKwc z&rIk8{y2ZD@m=s&Lz<~^+)-P61*_5q!Rkb?TJFWF-&I)s4!rKr=ksgG*N3m*b>E)Y z+kY@#ADQrNyvm#`^Ry4Iv0m9KeI@v-xy_ijXE1KR1AqG-^Wv|Db7j7HyBPe5-ACpN z#k|cO-Ys$0z+cb*CH};RCYwIITK)y;n8L>czb27?(jOm@_F7n#b?((zt!UGCam@A7 zcg=*gM@Hof7B~lO3 z_W6Gq@@OJD-Ik(T^!{y!JZiuu=F`;zkVlh|M?uIV4S947o&F2_vyb0~t&qMGStN2_ z`ZffbrW00h};VEoJ(~(gg&iY*7Eyq)Kf7f$CYM}E5H87x?8tCe(20p>(^dL3h&y3An z@t4NV^4i|kg5m7*kD~v!BR@Vu#xybpV@w@$P9S5ZLBG(xAAbI*O&=dcZuCZO+)E#q z<7-vh#pvS>@cw^D`zUFvkukH7F|(KtUuQmSWzJ&H*lp`%^fhuc{R!G5ZTXNqBgrHF z+U3ZNw)Uah#6E=m^BD9@L2d{?WWKpq=s|8gi`>|X%ww+2(dSOaitth1b9sz3Z_=(` zAr}oBV7HtKWWL-ff&5ONNnc1mY#=Q@39Gb?_=>}q9QaZNEm^t`0e2`TXwG$mSfjHq z+(bGne&V{nBY0U$csw=n$PTE`gs_ zPpBWy{y%cRlDG-@XFQ}i(hqU|eKI~8ADSKM&+>gLej1s)S+%WeVdP=_B^H_0PVxOY zWi~mdr>ipG8rAo1#dfKuA6VqRYSE!DU=OQfeY#b`@l&dU*0W<(%f4;23wlUXdIRI& z0CStz%EV7V#%=4U4|P8QsY|<{)-Gu$?FW}#9_C-0jnr=td zYUe!}a{jE2dlMFjKB3GxS=>=j&%FsUjx&+nb*H(PfHe0bw_`+ZpEAa;V2FLoZuq0D zs^mT)>5q2w$8QN^URfo6LlR~pOnhwE>s}S7@7Zh4ulE?f;``~lIFtAjXwGKBmXq$g z&g31{%~18*|*1W>kpRqe;xO2d0*sRmx;U=K8TJYbHD^}xCME=hcy6wUE08U z;C?=1@MCo$hZ6B)75yTUby<#A7oJ9X2kWx7y08mcUGy9k-u{PN-%3=aQBqR-)@{w_3~SnzqNNbMfS@2r2#$fYWXX&*8!i8F_u1{ z&vpME#;o}Bh)mu#5dR*=ApU5pWQ~@~SrG9fb2DzY5GUs{J|tf;KKi=)agRv7Z&MW*F$BfNG zyLlUlyI(H*p)uZykqLh!?PB`vyRh+nxJZDfxvbL#7vkgG8%&&opEADJQ1%Suf}AH4 zJ5lSXkBspSP5xhU<{KK3VL7IKxshq}Hn#t?%~+B#CFh)TS5`b!i3``|p5cV6mv<7J%5tiQ>M-mAaK zTFW~xnM%3Uj=adWcL5pn{%6nEzXGilKj3`*GUW32p0CH&=J_G#>wAj7`9FWY-VV(_ z^nCr#q5D61zTWV+N2hh*`^#RM+}(t4tk?hET*BQf)tck6=5g3#-v;M4d}%-J#ktI; zUmuu+?A$y1spbamLx@Iq`NE`Ho+hkl?o-V-DAgkK;xEbfC&t4R?rjpkOW8B>y`yrJ zx>Dr4JUW|Ft*cYOn7joufV(^EkT+t}zaM_c{dBUX7N5_1>Wwp?Q+6q*yc04m6&o&N z&dzw-g1>(yeRY_=dLLZ(4BWGB$-;K)m(9&?p2{1=tle8)hOX!My$GAo7VZwUL9fpi zHJ-WpDD`Gh|LboW^=xjxXWdiL$|Y@<_OAV;-Fj)Wv_HGqvvVqSBP&~eN&QvCS1~4M z+=LB$kj3?J(1+_9%Q~!oVNU<%GuZxwA9n;;n@3N*srkG3GMzHFLFYuu%$wV%c{^y!@UNgS-Yb`j#@!d1 ze(%LVKid7UIS94~;MpW@G-M4jTZI*m5TyJxQucGeuC-``-@y1K2* zOIh&Cxc4HWf2U=-d0k4LT2z zf5~qHc>Af7+lqc5Z+%JLO7`;F=C#W2i@fJferd<)C_mTpwBdBrFqgXM8E_n)P9;v- zUIOpW;)gqhdZ%!A#UA25Cr*6frM+$2GL5z@r##tj?il#tx{q@^tXJ4BPxt1{_Mh=) z6Y=6Z5MVRrVL7{)$=Ma-9k9@nNdc;*DM7Vtuz3n{DaVngoH7RU7)SrZywi{%G-)NZ zjKde8;V^#No55?>F5HVTcVhF0Cck_$e0!Y!dmLO=6E=p=#pKt0aVYCf`bYZZFU*Gp zj7#aKw*4bxGL~`JSs#;~^|zN|siOh9CP05Z*r$Kf#TWV~bp}n(G9J-WsyBe2h485m z>>#nADDY{^YgTQ8*N=decQ<=K2x!jCHIDPVJrxi@lkM30pH1t zg*?hMQQj)b{ep26O#Tt{>%O@+H6P|Ys_117!sM(=1vnGlOMByJ_p84*+E@hbFFdAP z{-1PPFSeGW$R$sRx%o?crYrd!NQPT{BAF@Dg?OIP55b&1c1tq}tExrL7V|2L_Sn?Nsi`=pE9=6Dx8gpyGe*T3{-@oV|qHl^`s&U^=bV%wS zpJF`6gS|{OenZ9X_~^PQTXdY7vf(_kUSzPW<7BKqg-yWFp?2wVL%xgsPjD=H$cxl} zxqSE?1FvhnytbQ^`+nB_Hro3eGLt>YJd9|s@f;YU9Fp5_c&zkKer=INvr|C*8Tc_qJ(^SMd*eKD=2$r0;( zhjM*->K^eYr_XPM??r@%Kj`DV(XJiTFW4`EhNWP8H06ptbQ!Y00hxR7E6+}mN79as z&>hBU_ShRqD>#j{4QAZ$$sNb8_qOP=NjaM%mWwD`I_Y|Kl)AjrrZ?n z-ne@0I(#b(`G`N?NbcNaTnsESg;&WM_&NGV&MCY3tWeE^ZO9kFFlmsLs^k=O*}zmB zVGd-b$k8~n8rZh%O0a38?7@_+&^;ZzG00if*QNhoq1;3I`+|P%myz=hQ}f_%^ojJn z$SaYXSA6e{^L$~koaIN4wVO{DSC=Dsd~w&R z$A@kC^u1>;V_i|d!Dkb1t0}k0P>}_LsWXlD`U*|m+wG~m1!BL{}6mi0%TKIoj=TRq}M~ym+`?xHy&HCG=mW7Us5L&k?@K-5cHETQIa= zplyYwU}(=b)(+6_MmE;5uG&g}DFBI{c(gTL(9CHpAlIJm?g4 z)L?t6Gp$)?3oTqH^5Y%wHlO<(-v9?0VDVS{_JF^7FaCTO+1{r8moWk^d>D~BVolA1 z3~YokWgGqK^Qn7{@>946UZJ;0`#wM(h#U}|EH{t)-!E~F3yjH~O>+0A@J`B-{I@~p zV)!R(qZ)LqX=gndHSq5!?W-)h?_$3%!WXW z$o+LDbgQmqDqR0<3D$pix%?aZEAbupeYJg0_M2KqmC63fD&5}|J!%4c)%{)3A00c} z_zybz7ft+ z>BTyndgc;-8hJkr|N7~>u+9Hhs%siP_T~Oc=G){ZY_PhojO?{+)GqtC%G%z(MN6(H zUiN7+*?W=wm^xkdb|{%yq9vb1SMRu^wO~4D6N)rT@=5Bun5wbvSBb21R%sQTxJM?{ zHBPDIh+WtdvBS$f4cO6iTYM|FwMx!7z4wM%D{GHM=r)VM-xlT*_G3zGCUEaDJZQil zCkC7E6!Z?^i}>wWu=%>7MX{%s(;k0a_?a7j#kSWUovp2HZyL6Y=SXMhrN-ULUv&Mp zFU~>sSH^q!AnWt*@=J9vkM)N)UGPi&18Lu*JfDy37VN_{;v>ua)`v8#htj8b`6*{v zU&2o8!A>lDdg31}dwMh2(_6_tL5@s9W5_<)UHot4+;oMBa|-C{v5eWCwReA-FcQD7v)b!+Q@`Yi zKYqSx@jUbTJ@ejM-*74IK%a2#A~#!B&+Vb~yR9?Z&2N(ZP-E?VLrFL~psaV~9t{_E zw_|s!mcbM6btRj-Rh>ouPx9Qm#*B??Eo1sgbihLH{;utSO^Nz1As48#r{-V6zF`L@}K5+QGAfogzVeP`BXD!Q`sBS-=7`$rl;U; z%6^9PENe+8{*`~H++^Zk;J)sY;2C?#j>KGKD?UUctcrJyRY^!KwucbxIh^?kX0QGP z>+)RgnK?h!Qy{*SC-J59B&rqWe?$k5C;Slmb{9slj^4tU8-Z+2Fy4flNLz~Vy^uRgd zW_|}?YXZOW#LcMui=+T`7QAJS0>dWeuGlKly#B5l<_C`V+`jm z(~2U_$Z$XFhGY0*(x-o;{yo@|&okbi=kuve`0$ce#;M`MA6c@7v<;-aKSGtBV0?7L z9#ZJ9UMq%P zS{?N9I?EqAtuNG++a~kqGqKH*-h|EN;5hD|BAwVA9K;=FomR|ve4RGR9e5hH+gJH6 z_S3)7N9(bd3I-z>+k;!|2lO>P>%U99mF_Y1a6f?jQL1tEu@u(N@R0Y)_4TvxPJCQ{ ztMjf$iJZUc$NfY7%qm&>NcP@s@IrVMcG06_O2%?&YMAqH1-@|}sgLvB_!#_^v296+ zaPFvREs(L3$CzH?9n*iIym83OfsE@LxQF`!vgJv}^^`ngTqiQFFVeTcjO(v9UK!i% z8QUYefl>V7TYu&$P>k&d$9wm5>$-COg!^NVrI{Xo*MolvaAkVhxh(nW?M&{&NUz~O z67;o?IV)cmcaNTSWP+CbAmP}%6WJ$7ym%k-3w+cin4Iao*^7UXaef~*?mCbDCYnY+ zh>ukuyjb1sil3gyj8yR}Rh@KSwp!$fPljk;crtQHEB>cXu%CWA`cex1rxlD@k)sRQ zH*YIrM81feStfOZG4(&jT}aZW$62QhMW3oE*JfJSACUZw&{B(TxCI{KJ5nuUB2~f| zBNyo7BElt1`ge}lyBMnp(#Q0B66u_zle?GdZs?N#{2QKvXQ^Ws*vzG^4};Av?JL&} z-KBv|&NR6_U~_2m1TbBgeT$CKM=3*So5yELjuFN=XI*y_c_j8`(cu^y`W(o;#h2fA z$QC^0au*Qt^H20k0)8C}y>r3q%u~xGUgcJg0V6YLM=kropR~hg85>&NrYrYio&Xa= zg(qT( zY@oicDfd3bTafkmXEEM8FplM|L9tan#ki67nQ5Qz9a5RsHTr$~4z;$B zJaQ&X<{rVZ$OhTdl=g4g;d_tt-&6mJ@2P+Bzq$Sy-&6mje{=mKzo-7;|K|E{{hs=J z{hRCW_&xOpce#>{7@RJe@AU91h$Vk0l-Pw~#HoV6|al=+bHHOPi8<9oYR?6kh` zLSv9$YTp!1%ZbMh?T6gzGxNqVXAi4RW-VxhXMx(EZR^hS3y$jL$P@OEM*m0!jS#ux zZ@I_mv{;6??(dtwfH(6N53?lS9-wvnb4ZUdt2<~Nr)eGa{j*!=On&RMIWTdDwXgGx z7M#CY>y$6`4$Z51P+M$yYnP@4Tbk_$TJ36^C)o1!1f}x*9rze1|NKMUEYrU>TfTlO zI;A82GGEV*?%DC;QOoo<{X%YY%((s5-?t07?dj-*j`#2xwLA9K%3ZOyeo4A5#Ql!n zw&=S$&VM$f)6reMZjE0U(y1~a*PaOU;0 zNxdvBH*(ixmdWBW5#Hxg<`T1J3QoA>w}kuj2FjlNQTRHAxES(RVP|L^Wp(*z@!`)e z!s0rLjDMfKCyjpegQhs>7Q1>Zdv^=6vy#U3RHN+F!%ijK??Cc~LY0F8Qc%urnbT`rlqi5A{rnwJ$zgDGo3Lj2@r9w?}FL&my%hNiz zH+Q#O1UDJA$a+n6$j=l#A3Kb^*?TfZb8S3;?_Y}5C3dYt=%4qQI#wOU)>W9@JE_(C zb}#o0RJ;8otX~rT(xpd*_wpM%mDJfedwNo5zMrA)cvFX}Bh*z-d`)(IlEe#7Ji7z; z>w88E%!~=eeiU8^kItdRI?}}t zL3D0eOJ76}mGy4P|6oUEpGo3AX0P+YQ5TBBb*a|nALaJ=$ zkbJA3BYpo__Plt1B}_$C*#p#TMV!HS5`9YM?o__-G=){oHHYOJJ}8kTlILCW*ziY+ zl05CyYYJQACGJ?VnZsyzS9jQ|=ht1z$7aczrvY7^a?dFItq(k;b{@)Sk8q{*=bcH$ z8a={o8_t@5@N(6|ZFzt(wrRBMFgoNB)+I+b1-W8}!(+-jvPQ9nP|0$qQw(X5a~UVs zpqGKg!tLCF3jfPZQSPN+>>~WzXo{+`;`?hcN97klGx}<2M-^FB1Ga7GuJX1_Up_a2 zJ89Pn(i9S&gYn%hN$nKuSnh>J^xv<*sj2FgKp@C2P~&-t>RDUEU0ox9cKGeqRmN(BlNl>Q3-VJ7mr}OWjuF z%TQ^1j%xYpN!2o%at=a|-DGy}rGIUdxt%hlAJ5W{zV}3mDf1c9rtTc^@_oN_HZ$HKT$@O3+O63Mp}y;$Vg*_;us z{nT+sy-`OKb!1}Kcz|-P)FJ*bwe-8M4(4#Zj?cVxDC&r&jv8}#jtzMrbre&Fx}6o?%oU7K|VT!EEWN+WnUuFD^arQHFmnu89L`yjH31ctQ9PRFdygCII>NSb$ z=+0(b$`~I9eVLq71Tz;a2+K8h(dVKfY#0v8Qeg05e1@m-eHFHX^CK)R7oqteej(*k z?_yj$;93bTeRL|$5N4XA+zFJ6Y^h3xPPxO=Z&lv9Mc}g>-woBzN2edObaxja?~j0` zOml#HFLWM;PLq;2e=nW>?s4Q1I{hMibo%LZR*+Zd{A|Bkn+l!d`HoCTJ`XQ13NLjU zN4Vr{f`(n>67A14YdQ@TU)c}H`#hOui?HuynWFL;k7p{7^Y!521bJQ|&k6EK z|J1^7T}IGH5|@P>7{EA@`18nkx%2zv82qT9y&bgofG3&ecJA1lRK{L(#0H)AK(`rP z)kpgw%2^NXr>~}+{`Ap)nl#IxL(+`)^6WJ)?M*uEW@ryJXxHc79wi6K^K0@P)M@X2 zg?9Q);)Hg8XqWi&W07IdUN;_`LwjZlGWUd>Bk=K`H^gG-&tLIoD)*$mkE|8j@=@~C zGTw^3dH%$il90>o4sqLVH1ce1_GE}HMC_)g$Wy`C*+rg}IWv=1wo}O&e0StbNCFqh zB0mq3re5SNI6Q`4c!=*}BRfQXv6CJr{up7IT9A7wc1X83-c7vhan(s)e9W@D8?rhL z{))Uii@ei)FTukgc=HpGBFuVExCOYnQn$ z7Tc?g1$hTb<~z{`>&7B`h|`!Sdt>jz4w5_%J3|fm{|bi6nNK%SPZ9lhk-82cFN0~{ zF~;CmV875Dq}yMGzIn*8T*}XXg?Y&&wlu~9<#=+x+-?Dh62`3TxXC(+}O zUoq&wqAR^YUG?@W>5C{=((jV=v`vr8^rolo`zgN_onS-G;3PT2B=v?9CZE3+`gm(( z5x-9?7{*yam3)w}W9DIc-=E<7Ve&2lm(rJY?-+e~5gHl^mp;?=b$&PSJ<}ZM-inNn zvAvGGqLa+x^CCXjg5T%)-b6l`gCs7L`i_$K6XrihYLs(d%hv_FSr6N4!<`@U{UCjM z7=L7GU%k0Y3HHTm*&k>nPUO1C_@&VP&2)Yxat=ijF|n1ffvjth0Z%6FNUegB5PB>t(v3f-Uk#(P-aIQh&t;>D* zSrr=}{rM+x(LM2JTooG^-5%Zb&7_3rK}kKMKjputB{sUQ{h;XH5d)*g_vszIkM#Ix zWR#L-Oj57tYSIiROJ#%wXbO~j|bdHUFm;7<_ENh}W-y9vleoT+qS$|AekrLwwjE$a{bW?O$M08B# z6WwDXXUF|fXzxkdzmez0*%SWwt6!;@ZnJyp;lB3x?0SlEguYpdEl2m;O&ez11!50S zy3dx64>C^KByY5tIyp5zu?MLE!x`7v{GN=wID$;D?Mf?SE#0zV1M?Pp2fTY;#+jIb zIi#`k#=LJ#`XOT`czE}d{OG0WX5@mDGm&!2=V`7@-m*4YRPyFhcg7&RDWp0=FQWrHq_z?Ea69=$8rniUw)1H-~ zCp{}!M{BOq0gI|j>tAU)w|h_1Q=gx2dV2mR>x+0OARK$u9odbuvCDNCZVCvliM8DR zY0=8aa#M$#t<}pT`(*c@-9P*A>~K?faACaV_B9(W$d)MKe@g7@1^QN88|hMhA9Bo@MlA89Jz z*7?4<_hVb^1${#M052_jxwBF11{F_7kMZ?sqd6#1c*1#mohPT@$piQT_o3}KWhc&l zAARy@pz3l<_8qfhSc6$;&n((A+N44oDEs(4`+-nw39tF9fy<{f&2~;XKD+4Grl_0d zo1!|*3k-Xaf1%4p|A=lFn|=IpnSshbI3~_=dza#sktv+9zo~jfq|}+1-8B0ltwV4* zaYe*o@5%|>w*r0}G{`*{v9v)jzGP18Z0DS&*&C*uoBjNh^Row-0!O@W?mD7+URczc z`C(BzQ&$HETGs@>13g`!>wSA**Z}yoleuikoFlU(>?VGnH2WuhMwo&ZQm))J;H$%j zP5ESPv@h+GpC)t8VvuJ+=>CQLR^U-=f8s07UXzZguJel5uf0Ewb5kalW9rk*FPOUK zUqElY#CtaWV7PGVz~(KSwXL*8vA-BrQp31?FI1J)q^sl+AG6j+C#l88D*A=I!JCI( z6h|MOBmC@#oWbs|&S0C$Xjo$@yDxER`kuX8XUUm=jj-eEEoH|Nm!$uxWa}(+@|-OC z%+pDm;|b%x8~-a+nThhGTq#rb?Z1#RW7U~>+AZ`{qQ{*WoZh$UmF4OA9XHP^ru5F~@;!RcG#ySV)^hH0;SWUW?eKw~HCoR|PL zQ$d@g!HZkBP5FF4;NxX`x6lL))l!aCXp1sA--I>^uT3yHB~HR$_l4bQgyj;pjW8)+ z+EB^wInbr&>vtvJX40I3w#(_PYX9S;`y=$93A4@_8lXn+N>QQczB9KnhU&Um=hU_q zrYFQ=(^hJ#-2HQSrKRl9;|1wk*uN0pzHDp@V%JTYXC9+eUUiE(BJsZVpGS&4w`sg8 zJI$KlE5`Rx+LY}{>2lE=m8d=R)avku!b2^e<6{6l$KaKFyrqn_7&6`H12^eq@B7%D z+~=F4%I+0DL(h>rS=W-MFiy=poI@V^H-bFnTKAk(=AC;PyGL%rXT;n+Sn98#&GnRh z94L@5h*+po|f^wo;N7vt&GFeeL5<@^%LQ9)Nq&F-5`Am z58UHe_f!l^%CBV{)^b+!KIjsD{_Z$$*m-S|OWeCc$3>U8qfHavL>8Z)s?orM<%;lnBV{5i(( za%-gXEMxLCef!sRt#9!ZiwnEh%yamGe$2T1gmIaIt*sUehtZzyjNv<&t6t|EQ3CVS zc=Yb1hb_tDn5QN(Pxays@ffqEX{*YMtU>-YBA?&w{L{Hn;&a5fX*a!WeM8{BbzP8S zLt9h2RE!D_<;+vglktwoI2&iHu(4>!%caoP^A{t^3VBb$#F%8yf1l;vw3g#X;g2~i zQSkQaU({N?4a5omW3cn&gcgFoVXpjN1eX=vYi{XDfB5@Bz{18szC};~dLw{S27=7Wpc8@r{3<|AF+U_)1G%az^qI^p?t0v%ba%Xa8$| zHU4V6?Ibg|w zK2@PL4?a(OHk%^yg_bp!tk?x2++y#P^QA8$=Zko&N9+lX0DRyGJH+?d@JwtC(r(|s zocB`T3ZLVGI%#7X{wM4Q4yApyVY*GoDR#O)9P!Q(61E#3Ag?cVJ!MN9xdcYWWTNk^ z_LcJgz&vG2tUu^GFD||>np4hWil2B-;bS+xV~<$m<6{DKz}w4p^fT)CDRnr=XQpq; zvBhKi&Dh+FyRXqp?*)s+wKqD8=#R{2S_{II()TP3nv8d#geG}=?JVnY17C{sUM8I$ zAAO%vzNaTNL8H)QgC>~+Yp+Ao0BEZ4(o_gdGS(JC(=aevPZ`obg1zIEDSa;A4SX6j zO=NFd!X}#Vk!(NA^~z{Z!Iy3ND3^A%cIwd_Zy8>ehmO2}-xKZ`UN(WVb*=4&H4C;m zgSZbn(Z0Z*7UU-7jaSZ8#@l;88D7@V+vGZKlTR~mDw_L7Ji%P(%_n0$pZ|~n-^_RG z1H;Qs3^utQA1$9|*Qpe9-}Y_t`TEx2C--i$uOWKv^OV&vjWsci>0#B;ievpQW#rvZqk?lj#5Avos=3@`feK9V9Z>Nq#qZ z_mfxduM=73tAG0tOJ5%i+o5^o=x@>@dcDsE5gur1!FE$Bd~o1nm|HJrw8Kl*f(IXV z$8l$^jE|C+kO7Rv@#AFd7`}rO@Da=e)?)xnm@b!t{+ee>Zynyzfi|^-jFfP7?XK#(t*3vrz9h`65NSSh` z|9<8ekvnUk=WK6Pn%YB^zC{~WK&wA8=yATEg1(O<<*a6>61i_6lQ);F$lNT-kUiu2 z|MGL~=PYvl%3&^t_gw!I$Q68@OS`}u>`N`7ya`c_-dW9feJoyVz?n-@nMZedv?ay( z1YCg5TIhTg8bz*4``V6`BIu}Nyw=Aqudc6qtLb-)z1(Vx>oDWfFYuFfiyh(X6J}3p zK1iQDN!?T6eTwFPYo3hwXEDgGmd6~Aw2Ys^cN1Maf*WkZh2fsx| zNL~vvRnlT3-6=d4K7se@?bJ=ZuUp~o0E^ivdr6D)qMZJIs>Mg&Vr*FNnv^SswQ5m- z#Wj;WqIcEOPV+vCt2cEXr_O1!r#AltpVU|2?;6e0G99|hv27PahtQp^(;eupV6PCk-wy0=rt$2-H@nzQSv^pV`V;7?w3{}vPZ zot#4-rkM9gn>V*_^D*d@cTZcXs{%jt-OT?Y_bR~j9&ElspPX@@u*INBQQtAr4)|2L zOhsMS|Ae?1(1IR|erv3a#R&eJ_66Yq*nPA$~WDRYd-I(ihXN zO6ZzIejo04!BfG#KbRNn`*1JgRd6ppx`Lq%e6Fp>_nouyzvuf6+*eSJ?f(Jje&g)d z1uyb1GT_(e3_E%2s8YQwL!V$yO5>eK=E4oF=ndHDWvx3FjKtimX0lI~5mUn+U&Pj;zv{ z%g%PRtZr^^U!6<;%D#@~kohsPWG6mA6_2r|=lfsL*<;yvGP8f4nlnCWnAx14*#|qx z&sD}Sv&t`It`R%{T@7+QZyy7n6s*E%Jf6aqO2_yAdbvU?2-ece5m? z5Z9A9D|=$rDB^g>P}Z9)0FyI`8%A6f^;=``zYd5PG&Tm>7eIT|19OWRD^|w4Jzkv& z!k6r^1bn%PdzZLM>bCYKt{3}s%#W7d(BXiN2L?R>z%~iVfc>SdnY_0ZZmOK>bDLiZV>dN*A5>HEyTS`To(0P z?3YIMK8`dqb$k`R;-p&4e=XB&nV`h?%M|FhdfjfI3w_wqyi)u5Id_0PS z&b&bU`Mj7~ye~7!$0O@V;zG#hH^0e3zb>iBO!Dz43;(0M&gAoAYUz&5q!jqqQ~38F zapA;yG4*UwW|9ZKAA;}2BZ!M2&WovKtDuv7!^l_pBjS3f{RhERz9TcqPWS}DuY|{v z$BU`wp2$opByJ&baSssJlQ=J?mfL6>ahr*=-cMW~;=Gtz@i1*8?p@-t?j!DI;=Gtz zX@N%K4iT4&KT=+Q;=Gtz-5(mgxG%n!xBWsoP{Umt=`Ay?aL~METR7<^1D0O8Va_Q=3f<=S2;vmd`8EY;4lz7 zSIY9rAu*hxDH_5(*$X`*L&4V=Q{>2}RwU1Odd1KgFGTMg`In!?&S>89=8ORIqz%Kt znB2p?tnmt;<78h0y$gHGe!*7Ie|s|8#``e$z~`Qfeqhl)U7J~Sm&*9>zj#Vdnzbsy z+^Zcdt5<-JxGa`1v zEy$tRaKgQJW8W0c_$OTE@7M^!yCWBn1AQVG-_TP*U9mmzGxCoZ)VBw;2#pfP`qvYO zTtzPQj%EB&hK+h+dlJr_v^HcyVozuxy~x7YK7{v0t{{*4ad)${6k$Z&S(jOWLw^0{? zcI}Z*&ApV*KxC0W{U1dCzXXm_exc4B2N(U~maPjBS%g3Ik|dR}H3@$;u;&|-b$6=_ zli&_KNS}t*UKv|f{FqE4i@=1;Z&CZMjIAu@J`=L25L}2XimtdawsM)@Od^ZGhRkmr zcU&3g#o){&vPkYKrawCsT^Z+<)Nc}51V*G!JFh~%dFRDC>Ng>aP9TfAIFN1LIWbPc zMHYb-nco7Qpf2y6Vudb~$Rh9}^PAZQ{lra>`3Aa7B8$L`h5ikCxQ)DoE|bV2a3k|u zJ4+jR30)?UMPSDPcG~y9GL9>$-z2gK{K)(k9D7A()=|GnWDyvW`7NaL6`83?9I|LM zIQkI$Y*&F*)goVzKRcFI4tbC7A2Z)|M&3jsk5Z6F?>OY{^G;PiT~Rq?$l^vFSDjNS z-xTe(+@vzzezs*~D0iceF-0Sb?m`x&d_xvRfwT3cot})*jaT?9 zvPZ(Flw$W4xdHCt@p*Ea{i_6Daym8zNyrvC(1JghBG#4cNx!W(Pjqg2L0bfyl- z7$4ryUo!lWGj=cD0+BN@$az1R10sn-*4P6LyoHLa@yhvJ{G9xeH+C=HqD0>KbR5oS z`Xh7f+=(rCi$>=7w*mOVKEEeMt|gxy{Cbk8ZyoNr(g$&jU4Qy(BY5LH^gi|@_kX0!I_5O=sqyr);7uuWzE8IreS^Fi zsPZ$sGE9-b2K}a%Hm_w)H0v_#?imxGyJyDY9xsmEgI?9R`K1|A$g%$dXN&lJ6r3e& z^pq-aa&L|;seFK%nYD@eXp=|xS@!Al75J4oip6KXYsoJTiQOo&Bx=)@eGpl1Onwmi z$tYvZn$7*#Vn-2sieXFnvu+oUQz7|waHzfR$zTn#qgO=bkUfi!jI6sSV&qDElI+-> z#6NAA@~`TN@6dDLzVK;nru98fhRmfk$h~d9^<&<>8pYbWbQ@o!N{-Sq0ZbY8E#@yh;p^RA-;;61G z2yoS}Y3I6UGxrHWQ&0u>HAA0r==X%CPwB!Q8sYW$N5-&5bknA7wC5;kq>Z)((42T?B5g^Wit=lyf5&)GveOHP!X9sXczi!S29Euv-%Uh`D{fojcKDDdU7* zMu>ZFUzM@0x7sOr4+UFaw@)3Ebcy`GG5h7m;Pc!!gZjw(f~?u8zk<9+^t=J?hJh;M z)e*VrkLTPo`=Yo0=6Lp5at0-xy_NA{4%6?h`x*O0jg&d7W2&o|b%UL`F?%%UX~^>o z_a78WyJA(w8OpVrySN+BY0QEjbLV_JzMrwTiT|vbaS>WF@_l?!$@dlX7UtZY^yT9Z zy0YO-4ehcZzndr{MhkTZGQa&dzR+h#+d$fsseN?5%CoMcda^eEGbOS|Xit!y)<4$R8PO;F?e%X*x2MTpsFicz1Z;%bu?NtZ zsf2w$pE)?s|C1XMyvMVQ&|&CFbJ=ZPtqIXebk8SR63hGS>1*ubjDMoBm-7if{itMq z^EsE*6PvIO9sXCJV224DE66i#fz?my&ZmDzM=72P`_*h{Ft9wj@PFfgh5HQBUB-zF zo&juWTj|rkd45WNR7LysHb7`rE#%7PaI)f#c7do;SXqztDJE;SzFqN6w|Nb{}>l{Cv8z*E+1EG zbX=F?Re^k+a)|rKQ{&n~Kh`szzw)mA=o!Xz1>@<&ct$XuF4z^P<5%Lo(a8N7bCr(0 zwiVu9Ht^->^e1P4`|Jm@KNgIT;iJdzY1;n=*c*O9f9rw0_UH!s=VA|Ppj>+e{hi79 znFIMjN!FZ99kMUC<1h7Rd@;&dKh>Nu{2dHWGd9Z2d^gXmzc2L@7m@mZM*Tsv{=U8@ z>My|dUvO`x{=-Xd^PZ>v!_Wn4e@{CjHSG{fND#mUfb%AN9aW z@Tup!Df$i?cme&-PTp(r9ef>{@FF&6wZ!XafJgVUo-~gKhbMTi5uR|TujVF(BYUni zcGX&q6EPf7AKXJ?eX#k`=!599a6bZj>|ucWHehlJ-a#-C%%7!?mG~g8fj|D<$ALa7 z#={}{EM3(>=uk89cGdq1(ksDJt+`fkHBY!HT#)@Zb}mieb?ckP?z11GhkDbw`w;dn zy36FVhVW=Vu+kc}G=y_&;FoF^49o0AedW}raU6@*SHXOn^|AityK;>B8mR9i_0?^- zjWlPdTdV4`lxl6bTDTvV`t~iz$h?XArdyqk4GV9`6g`&h`hH}|o`u8A|F7|1;{bL+ z!;bGJI97{ohYda-*$I1mPv1V)QDiQA`Q$hFF>OnKQUL8}W1M#a!#3b|3iyqpzP+sT zTH<-vbM}#qei**xGtNtDNBH`oSs(E>fV<@CZ&9C*z3wo$Dwt1U&zr(JTSq_TA29Em z@My^$1gmYxqCRJApC=d&(XuN3@2Ab$Y}W6d$of41K5nOtm8{`5>VKN`i<~2r!1|T_ zUoG;t$<@RM1<&Szi?xp#Cz7ITU-V3Rpkms#()RTKiL@=aiZ7f?+k2yJZ{vTf+NM5l zwC$DOk1f?4+j7SCJI3}m>b-+;^=4dt;I^Lc+&o1e+IUB%3afwtP&2)N>Tue$nxB%!TOpDfrUG^tTh^5Ueu(8P5Gs{RLJT z$Zxc6n!yW@Dm=N2X-M~XSX=`B3l`=I6{!#NMX^)3C*hpx4;elA~MhpQv76a5d+ zuNLO^m|5o1nrWbnSGd4@PX-s{R}-6S(YZQgvwxvY^{I+HJ3O=a?8|w2?~#jTyWqQgi(Pmq?RLSU=fgjKW4Nksom-g9Cy29ILga8Mu~nW(hFP%^OR$ z7D7|FcOtg|-eW%go>>-~89(3?Y&eFZwZZS)JiD^+%Sd7Ka2z>~OD4$j5Hc3f-O!a00Q9sKG) z$q!6*hO+RJ#5nN4{hP zlF|J4Q-=3_>UpUzaqewt!3yAZ2QgE2yKJ65^lePT0PJ#l`Th^)#Mi!%oM zK>+@sAR(edp7EJs!fY|+?ng)e6?N9)L#%r#!tzbM(#XXQ*mn%MLm=LT-B4$f|Gyz6 zB41gH4}=4mMHv6xI=&J7?(1aieBRcprcU4RZ4qU3mWZ7R*zZ!sD-NQcj0dr+_$#ZY zx?C{}BQeNgWi^&^=v;)KPxT#TPOI1t7ExzJ{?x}8iM{t1Q~va}wO7r^_FFgS(H|$U z%Y$EfplA73zpY!T;uBamKEKu3`s9JTnV%CS3EnTEhYiRu6gw*c*_$63TVTP!wnEJt zGHI<-C(i@P#xAW9`NPW|qJlZKe8z854ZX&*nTr{wiP|W-SZWYog!k8^vrKz!lMLCtRr+Yp63{^@bZ0pHHA;|J6%IN z6`Fs_uVXENZw~Q-m(Q8}cZ(Z{wTy znddmxUlVgJ`FMai5|8>?YWdc^#K;Mg*1B=U*4_u7&hU`NHTML`FfhX zaBN#Tb6eA=y-ag!us^3Vx2J$Bwh+D!%+UEu)KeP2NZKDsw zo=Fp)74uY|WN)jrrgf$@a#i%d=3oCaqW}Bz{6M~++k1MZ1uvF;$h&)XH_uewMVDj0 z_UUh#^x2L*muPg449!Kvo>g=gebnyoz4+08Wq5bBTfA|=^Rb7VUJK>Txw_j3{ma_B zv~DK*h^=RE{!cj1(AG@!Ca2I@i01c8t-86v*0bg+eh;BLdj=2Ke$w0P%<)+QGFQ?iL;jlcVJ&(K=}!OB0U5o@Lw~>S zM0xb}esH3u6Z!zsb-wtz8|BegNO$_zZcaxz=>h8ex+m%ADxB=&pZ7#&ulkkVhjjE5 zZgdWR>w^wM_0!hZ{ntUp$m#Ba*_>%h*^GH`aUtdQ$ItlP7_n+5MKk0tz{CXtm=p*c;e>0Nu!>M2C zHj|GA02lkTRiuO}Fu{+*Miy=o-X__6)|Gjp^Z zotFjLSKFoPW2c^wd+ABpUeKE? zTd&|6+Dhb15yt*U`qEm~QZ{W0$ISUePZEcoqyk+f`nsjb*BW=l^`7#CVkQ}+<>9CB z8S|>|iWyJJsY|*%>BkyYj8v9L$NQBEUOKM`Ds;0G_EzX7&2K+sJq57W z&NpKz_4&a)9B&}Ma9`Ip_B;6g7ul;{gqM)LnSUtwgWYT%JVW;8GPCX~>?I|~KTDj} z>S*1+rfvh-dcfMJ=7f2dMpv``cJnTc{=rgYANhmZ#%hlc4gZQUYYwWAo9*B~II%w+ zI#72aoU1#EdYU-WGnf>Jw_*C>kwhy%9A51!SJE9Mti9V2C zK|6lv12n;;4}TGTAU!}ke&|CU_Bx^uHPDAb((OuzKICDmBl_@H=tH^chd%hB4|&+> zh(3G{eW+CZwB?6BJKKxDeLG`mv{LqI)bdvrwY3L% zP(0_yO5h_}p|k;{Y0XGZQxBeM9aOWPWA+0T@G$6dmlj+D4d`{p6N43(jkH>P+&)9z zt~0OVN3CJ3D_D=^*d46E?f^MMZaLp!>vY!&zMIH*0q9Mb@4P(IIDdx0KkHTSNVJ#E zcX52@Brl!slK3u;?~ft$>S>~^mpj;0v{xLzXErTqW9U}i~IDd zDO+NLe~~OA%`B@JPXY8%#|k@nw^HUCc**a^8KHAsjh)Ar-R{-BO2?rwg6B-=N;zw( zc=HQe(P8d%M(Il1KcHY*WerU+1*jJq>t}@XbEvDcAbRR%o9BU zMgjP}s$%e_AzbzY+H^(R*jCO~fn~@>kdIM+?!hO~MZnws`UPVPzS$-n`x$mRL3o*n zejz28|36_>!NP9&2M#H-TyW6cz_}w5U$7W_HeA0GDWn-j-%`aub2Wu?v5nezpl{X9JD)x^&5iDLXtbP@a^{_H;KydhThBbY zyCeHeVGQg6PgfdSY6K5-x~1gTF}H$+0W8kc^7tRM@vifAF=s!G{djDg_+_+H zr^foR&2{b^W8DVq%-B1W!>(YM#{DroZX@4U;8Uh~6>nIK{&yl{UX^Nu6yM}!@@_#t zAHSk;+8@x*b6-@NsgDA_+J9qb#MmCJJrdoJc|OffiRc{aw`$Ms=d&=swY=}3&KNFT zpiRY?$$*DVHsR9K_bpF1V|wLE#;5Oq!+yTo9_^?0#i{g7cWG&lE(C{Wv5#skNms2t zT*X?_-l=`L&fGgK!H&c#YBtwXLU1ZHx)1v352#1_5$?w`pQ3%j;eVU|`}lO;8(B~M zYs&tTvZ6O9$kTir;CU0W03YdE*Yb7jZpx~R6LWew&uM>%`0H4F@GkqahbS>CWBliIdta9aFny*_}&;^OA)c^jYbb`xfbY#aN98emcux|CTHN z!Bs{)@-_=JF_AO2;ggIciGDYy8_3n-OIyn<*q_*Z4dqtvJo) zLDooTBe^E5ScdF*LB=BeMx7<4CX03kaXu_Z*D;Cq4kP<;oAQm0K||+&WauQmNUPaH z)8SRT?2U8a!^)A7JHh9eUaqmy;ys#Xg#Pdm?Sl`EmBb~mI726(T_49obLS1pv@_{y~{7#l(Y@7*ea|c4pZJXu z=4vo!aq`U=ZTaA20rodd-7Vflz^kdd%UePl1Q-1pV zOX;)bJ(M|%a{6Ae(Y^G2Eo&6tNS_nAV@A;^&mS3wa7#Zc<>>#3&**=|FWB%k;`3)v zzYSV$0oGSxi&SXDEvztZd7^^#P`KJydK+abjN6{5VmuSEp`tJBy@|dSvKb1pW`Id;TOK=muS-^|Kw0k9TeYM%lxMT9OIukFt`xGPn#8&RIp$~Q7#$j+n zcOV{O&JXb{1cqPpdeptAm zu~<1nmP1!s;f3W#^dRzY@%0s~C;67GVy>kZ(_N!pa9|JPuEc&|K5G$tIk5sfu>%9U zB@)BW$#;@zAKYy9wy?$<{uH_U_#kUq>rQ-bL}nGoK9cNfp?}|~41E(ldXO>C72Ju9 z8;Sq)v3WMb&TN;`Rp!Te+vsCCc0#L(DWaHI_=1}Csvi-#WOrXCFjC!WN3c{G)ur}T z=2_tV|JR3B;IG&WE8s8n?I7go|5ty9p_3Ule^6#M<&mksm5+SAw)tY2Wb5mrI4*rd zk>v_c1-Nd|zXs;Sa4MelN8Wq`|L5DCUg<3wfb}x;7Db{Z@cW;FSCVOp-fyx#>6k6T3XsKd#H-{yNJ( z*em;DmjMs<_cC65CO58f=J$V^diG^L(qFu)+AgN`LRsyVCzT<*xL$X?LX?DRcX4T_;jDjyB~BufFRS ziEotT6Ahh>uVNgqn2Sw#D`(q>kbA8(5=*xs0~^4c<*`O4+gEQThE8xcGV3Dl8(9l| z%li{&9sbXP?o=ZG3UJmbWqt}tui{KO3tR9k+3k|Pj`VWUElS4@yb}3WKIfkGq*s#e zVr|XB20RP-m(D!TkX}nVwlTT0u>a0N{uSWdvVrul>SwLZ!uA_~H8Y;zM$*$iqJE`g z`@OPbuNyt2Wsz3E{xEA0Ws!e<27TB>dLHT9z`a>RNk{%=kp2?swUx$F_Ojer*m`Hl zE*ILdT6NQAhSIU~&O-j>W*jR?ul$hu!MR!3cxNI1@-vP#q-Rln8@N0R`|d2{Uk2%G zNzWs_j=7$NZFd&(FBjvB!A$#lE%fTo@Ickj@xn~{OZ#6^_9dfRX>DicN!hQ@<^20P zc==~+rrB4HLkNy1$R->)*|{dm^uOj9`)jbpz5zd!yNarA{*H5SGIFp@@&23FVK08S zwX13W{p@Qy7jNVITVxo!zQSId*fXY%ME*|klwUt@wmCQIyL5m9!3)m9yINTf+4K*3 z|K*K;79T2JtIDKh(j62cpU+4Cb9s6Tw5y$di)UU0oh_mt;#u=nSKa(3&-K_AZ-fS4 zp#Q(Yj=d9cz|YhFPona^S67^$R*Sul=&`{Wz6*Bk7URlk1F$WQ`D=NQ_hE;y^W~`A zk3Q}fPmmAoTm|gI%vC;TdC7k?p4sF-!x(FslK^uvo3V-SsAPZh6Kkg4xS~d}_{{Md zwwm*w{BW%G&^YZ`Ej;y|{y)nzvc7b`b&}7*`pSSW)A~}n_WumpRs8ls`cuJp1k(qB z+k;jkWFhYR9$+ikXcG9701dRW|5v~V>CW>AOe1@?c}{x4;?+Jl>3L`!^j|*V^)Ep4 zsOuqgD7q6@`q#`4BYIouTQwfd-QMrV6RA)Ai~ZWCzisy4rCq@}^_Rtyh z9v1HDeGWQX4$Yp#I+o6lz}!2fx44qFq%S+oxqn(KHmNC-ym`=pd5lM~#ofSKaU8et z{mW%BJy|S1#1|$WSr~Ix1?wOEgN?mmj_j~sVSV#I8+y}Re;(S5pMPFPq6j)_%mf?%+E#B*D9w^F?qh_SDEWIvHtZ zoN~!`_7U4!GFI7|rE^EH;2)=Zg73w45nenn$_S;sh`fdT0CJT!wbv3Zd*UzXYOq(3 zEd4HYKC*ki%f?waWs0}f87_Mi-sc`<8;^k->hpzVlAojo8?afHtoZww=QF`WWSqA# zX2C?UpfwM&50MR#lXRUsW3g)j$UB6~!aZVRIo9#6vtS+l{M~PXoB9bJNdHwr-ed3| z{n2+_pkKMjMT^jTWf}d02J|WmUP`(!JGw6$YrKADf)_qE_#o$-3Ur+T^lrbUPU$!S zZ)rVsC$R769NxTOblatyh>o)t z=j4=<{%v_S&P>o~1Na$~TWw+d+;QLnm)26gZd8J|1$jd@^RV~>_%-AMb)#K=Es zp*7Kmx^{4eRt$&$ZEv$A)|`5dGZpfO#}^phW7bZkOIUBxLz?qU%nixPOk4zJTh2!2 zwv9Pb%%;P_g=m=o_V6kv`@OZ7m3xYE8?jk1Uhe5x)p+Twp#Df7Ru5jg(5Vm1Pem6< z{2=sVTBn!Wm(-7i@0m?(9oFl!(e=7|kk+f!m)e6cf2sGBnQi_ftL+2e`Ly5M|G?zVpDfnVYw46~4%}jeEZ+quA5^d@1;BIJ+C8 zzhgapcQ>$sRt!aF^9yVYJm@!0u(r-EndIfX{^eQtw-D>;^u6e5v2{4eKK^T4cVfuv z-hzJcv&63_|G96`1*aQ3Q}NX-I zvM#BI^{2SR8PKA9a7i$foLT8@&_@gH-A}so|B*EtiJv0dNf+PTO`g{5<+7%TtwBWR z$Qxx_y<0Sa{Bx{j;pQOe$e7zk)_p5>2)h3~-2&~kOg6g?cNyf#Bld&M@!VQyp<+&`F5zel7eB?GMl>xFySkrm33L84${};|sJvun zN!Wh>8(Ydk?)NKU9pp177r^gxX^Gy2^r3##MDID)9(&TR9#Oj~$?m_$Bk0OcsrT?W z=(44!X(yui`C9Yapf~l;3eT{218*)cmLKC<6=Q*)I#I_nfNjAy{O+J#^bTgs_o}F^ zpaomO9>AeLejRh@yKM1v9+Ljy9JY9}Rmy>9&Bqq+95_CnIwCQ_` zH1>fLy<^(KJDs*9bDd@IjThXUyl`k{M8?>|*GuyWojSeH2ua5Id-8uj@1{(x!F1|1 zW7$XXP5AfQYW8{XOtkhO_j?M5PJ(mkMmKZ)w1Y=g%+*@Pp!KHpIsInK7JFlO^gr-# zP@Qh_%NdK8b)b6*1+%rJALl*K)+IQfb$HI!#kY$zCuQH|xr2Tsg0q^-D!%iOb|i}L z-1lI{`#wtBN5J=^;QDFsTx&rx_gg8uma{YV8jfAZ@Ofhmi|%X#r{AF7sn{y2UJH7G zCn;Ocej|9=;hVJH_U_g?C05Df{8*pqiVe=Vucz#>>KsRB>Xq#YPCNVD*b|W$=gbx^@ zX4YqTdx9e!`r-yJT0Q`$n7@--kfpobUtZvzp;gc<#V3Kco1y)BQzl z@2`QocJ!5j6aC8O}%-}PY6!3KaI>eDYzZ|&s<=4wfJ!CBIJ`Qzth3AtFylIr})~# zlgD(57XA;0FAu}#&%Y0U`@kjJhz$M@Mi!tmzx!T%?)P2tb9V86F!F$~&i(h`ckjRC zhhD({!N>%{oc;aS>s)FFb>j^i zFY_0_n{;FYVdMalc^~1v?z`{}%D?2- z?&AMoWCdZ}*M29m!aHd%s-G?3|6t?=VaWxi6DPq*o#fqu?zV{kgOM3v*?uB0jo1e_ z@LkmYWE=m(od1gE8M#;6FZrOm`2Q!)(46=8tuPX6o&o=c@XX`vAM?pQ&b)SppZfgb zEeCdUc1~hlyiNII>@_+w55YIQ6931mr(kQks%4sNV*7KR&PPsAWivQWk6S#DGxaU~ zwohA$zwT?Vyt??WoTt%k?aaV0T<3w<_$<&Rc$fXcsnv(@*}W{!39f-x!RmwT58NwN zU*-(0puen*FQp6qH#ECpGk2`C!mi)P%I%$7^Gdq6h zS(G0{d5g-+E`xd&;Da8k-;z&y)GlK#{^w!JH&Q-B<)d~P3-LWKWZvh1w;7a=f1uZm zi}5+HCGBIjC_2|)2TmBFi`oZUB*NBm)Da1vC@f~lm#DOH51t2Tb>@p z*^E0_7uLBiA&=U3ATep$Dx+&nfzh>8xR*|Rf|1x~97R55N0)l7(W&$%>@$9Y->nt= z{L`v)(;V1vjoy&8c+3X-4`LGZ2IoSPj9nSfr!4ec+c>j@xtC3AbT4`J)Fpbk5cy6F zj>xleC7+V)e-e0DZm|ZhhEIP6`Q`>_)Iz=qlh!!4ywAhLDiF@RN{oz67Ax}qF2RrN z8@D>qJE}~Ay?kpe=Y&bnzH-A@IuTpl&#}LrH*eAR>(xb`Vi(wf!TfnkzK^j}z#3nf z4Bf+Ld~%MFyJX&j-_s~;b8}Z-!P+5q0W!1PrQ~HXhl=Tx!T*(A`Hol_Yh2imD-W7J zi1`%$+b>l+P zW3Z~4Kzat>D6R_cbI2>Fz7^D0hri&;tH>i(hLiV4$cy2bMR`|~N34u|?9d)nTQPdc z|CQI0N30C@IQAv-V)*9b|H={M5i6qtzsP*mNqZ*F@qgtQ@`#n;cd#b)9eKjLBL1&) zkQa@W@dNmCCNcG+S0qi7p6w8FyU#6G)Syd$D+}8Ad!Cb#FD~W&!W+Q9Zs6m7=$*rw zT+_0y>gMjm=n)<+d%9)X1ZZKEtt)i!2I%0(AJD-spo7y#8@sR{+Mk6VuVhns=*234 z+d4~fjqq?ecoCZ`;o&;s?g;;chvEnHz8$%DFxpx&?fi`xA={e_-)G{m}!~@m(|DWz8F$Y4Sph18alG znGrsxX*>USpihJE&8&hCdq2DjUncA&oljWsWjMOSx%+Qd5f^>oecofVeL`*GU+`0S z`H|f=Y|TQhwt67=iH~`I?%!&lJ@I}a+AN&s$gH0Ve+sPjKN~J`IQlgf zdmZeU=3mubCb@{tM&HXhpNz;k6Da?`SBbF|B1m3z!DSO~j z*Q@Z&3vS4KWP5mLH~82B>V$~L20P3;xVlNo;q=Y9kn_mx-OJYv=HX&Klw z`6<(cPGB=n`F?-MQ#3%f@V!qbj+H-z=CL5z>CI#w*D=pU8IgG&$~^0Cbmea&{|55S zIcF|+Z3>rd)cKILIuF@+@(FlEY-_!mE&TvF^Si zriNhsD*cK1%P95)av|F5>1&2}J3}36w;A3|IG9M;Sib1Q5%Obn;yc+Efs@Yy%WdFf z{d>k1`Lw&CGpB$TxO%*(eiV1gL-XkWY|1wBv+_IprEsvP?;qx~m#^Wb2u}DpYc~>y z`q#9p{8&HL2gOhMoc3Gj*Nx=s|K<5A|B3of{tRG0l6BPM|0wr?#z8qBv|s^i`Y`XJ z1?5p%aFMa8{vY?@cYG(@F5o*0_5X)*F4|JLo5;DTYiXx ztIFHUf>9h4j&2}deNx|2>DN5q5bI|b{y!wRs7~g3&icq6buWF;f3+EdYaKWdoNI)Z z@J%Z?@f!QoL2#@I+4$i3Lo;3Y)37+?QJW695WV!QNZe_-%a-VYPU`8%HTNtci#Z$3)vU%q5?94p0Q)UeBR^IRDSx?@5JooUthv&;Y)wgW&XYd@r z^G@aS)O-$B8Q!PzEao|x=PaJ;n`9;3YcH1lmN6I&sh(f`=VBQ!Fk_V~uOoS~H_Fb? z9R#nMel-o?kK{R${}|{h!`wIQpp5K}!pK`jAJ5Bd7zZw+H@73-yXHG=!_tkh|H6*# z^w_Ch$-dy3bG3K14vhEs+rSl`U$J8cc3_t>J096wCzG}xdlNo}J!AVuW6N>Mv(}Gq z%O349Si{Y`&_S@?(bw#JlsnLVN?cnzGQQidXfK;ZzV<@Np9+l8p7ZDz^gaT6BbBMm zWWDqMAEckUdn)!N#2T{7Wi1<@P_KL;^V&!a)$j$2LujHmN9b_Xk?F{mw#>cUdc0fBy zr+MwbF&-GoUSL~K^bfObo@QjL&8&mKK<-|c9p{k_M6r7g@=buXuxyOQjH6;OPhsvQ z2@%KU%)mI$A>evwR74Lenb6fYTDC|At-a66xwJ3w((?X*T>|^_d}7lcY!8qA39)7? z|A^fLX$wfp+a1YYNPOBL@#1AW+{So2;Rkl+)a_o=hKm2E!(F`38U4V4I7cn#zR!TC z{4ZC-|0@oH{Pu@({s|!e-Qh8|n6W5UA=}?zu=g4c#YISmzZ?(!E>}#75t3#0Fm+@4 ze$!6uY(-;Mp+73+n|b3i>q@~FE3vlVK^x%v8^{|24=Nt+_y+VY*l3-!Y}{ID?G_x0 ztUZppWy2>PwBouL58BuFBz5cCGt?`6W#POrnQBM)5zsvX(_Oni?ws1KybJc9BRSvM zolBj=84G31`!CL513-H&c+|EH!nN+czcD9*wf}S^F1ph0(mcU?EIXMvR`b?F`_4pg z{9bI)XSJ7AbTGy$7RW+k{x0G?_%LUJ2FjIlzxr=I>$e) z(CWeB$2fjNJYmo}8!Oda1PP=Hu`lvi10wv&eslIW!Zw&Uj*xHm+(nZ9Uv^ z{+m}o8!bjZ&N4Tdeo+r`ejzU3t`*o)aBqu=@5Q8Peu|0BdiuaZI{~mQB$+@FttUGuafSqazhv-9wt-kbN?|Glw~Sd%zKPZy zg8oe_9{Vd-#q*TmR}ew%}t_dItI@dv@WrXrSV~ zdZB^R5$Rs*Nt`pozr?l$+bz++huABsc?!=PqIj-xf5)C88dQtE#|_Proy^_uYCWKj zgg&)XUpl`3qJ1CRu)pO_?xb#%BY!3FHkzS*0cerV--%tG-dbrS20vxqbdR%n{)Vxj94O`x_P^BMM4PIkNi+~Tn>X(&lLl@P-a-TGpn*4G1E1I3xzvxXM&3Z@(tM4D zZ*OUw*Y*6{~2S;D_XDM(XkvOG@P-XWbJCKC!=Hiv+}1#_`OEfgVweBa(V-2 z=xAU5M`fu0TkM3`BbK&tw^jo7_s#5a+u)&ohaQ7iPY#uNlK*!xcT3@YMHdvaB~Jb` z$d+4cxtDfgWZj!`WpH8Bhwz=Oec{Ci&=Rfx=7u%T6^vyFb*YWr z^uygoTn6w<>+K@vpR3`Q4$_~G=<5gnj;trsu7PzbT=@H^!0+4e=pp2ffH&_N?XUcM zCehzX;?=49W&W>%j?`6*@`yeKXyY!9PQITG0)6(eSybz!{g+8JNKV7q;Vc=fUiRCE1UT2{L!8a*ve z$_m=Wt~#`md%P&BdA9O#=< zpQhY-WYYe5Pi8(#9&tBDpJi=@sb?s%#a7mV_|?{0QjR16Q|%b;vx#aW~Nn zzI$j(J}s&7_w)vml4dDzz=8)UCxDf)d}Zxk7AC^GY>ji%Qu&=f!1o9r_*KYppKYq zvPHVUnlB_?Ahrs*hu@#>4US6j9s&O^fcwf5ALpd5ALDfvcrCma9P7xhh@Lt8@Sib% zs|Vhu3}g8N`D>wpIhIt9=AzUi$&jDEDPsY_J>QH`(yX57Lk|19jcNM$oJ*~{d6ZAJ9CT*jm?Z}WnqlE zzvUj%Bu8k=v3PoumIm*5Y@l(mkUg_=b7JSev(AgHy=&xGn&)<&0GGbZ-uT>Bo!y^% zi+u$Aw6SLlC0#yc>FC0f!7agS4)Iai7tFqZuGcpkonU#K^Wy*XP4DENncitz`t_Zx zaUHK8*ze^|v!6CDq{AZ=vsPaR|I(oi;@fF-CM8(WSIbY7G^CAMDMr#nra9GH24nR&;m z%Dx*d8!Kn<&Ht;c`V+gqOm;Yrvk#efm%VKB1lV`Nvn`I*@VL${#u&AGH|LXk`2DhY zoM%hD&2wPZI8T5w+DCMMpm5@^oE^5c*Cu84GafB~Cd}eJk9Q02xqQ3%<#C?b-SEL- zo%(@G!)%vhyJ3ut$;R8K|JmFl1H(B-U~i)Kf1KBZY^Gv`GlczAnbDqj<3s(O-ZSB? zUyiXoE5-J^gL!)$8dqygGWWsHj3j)nl7mj@`}_pr)KEv@Y2xuxM+LS+#q=vT z&gqrUQ$BY4xpBm80XKzDZ&1&2OV1klpxuuBZ5wk}Zs{GYrVZKTrl%U2YBNCHFI#)o zfR8g;hG5Hz3^@QzH;mq;FHyfg5qn5tV`vSlZL9Izm$R%DCyO4NsQZx0D$XX3{SSGy z%=_m9p5Izw=~;>so=^9GErwRB4e{!-@i|7los6EPZu+1$p#`2}lvCR?X;=C0aVO#i z@gcU(_z`wyFEX|)eJtDa2=Qptk4^Mxgw^i3`!>USCpN^giL0ZW&IqbYyv!ulh3b-j zmtfJCH7dM`{p1JZXWY!U8I!>d4q2QwkG*1$NAdLM!h;^P_wfuv&z*vds3U7%G59;d z*LB7=;m-No2cnXdT{XWF}U8J07Dab{eqi*ZpN{09_|WFOtE@z?duHP)))WSF7QqREup62mQVwAiGOOJ z>bm$F_nz@}FJ%Ae$XHkCfpNygqj$SPKQCE1zP@C#;|}JwZtpG2T~8W+YOS8^$hKJ= z2d|&vaIG?yAKEDs-IHq*BIF1jW;+T5CSbk#r6vyrFS{%n_ zxW2tMUCp=+!UL`OKok$0;J_*7|5V9s zUbk=_zPk?kb(DV8(hrqAMn9%yWqFU&hdb$mP0KvD5Wishl*iuYeA>v}#(q&xTHP`u@Kk%N5toOGST6sb;v7R4W;>R?mHMleiPq)yo8ufOH(Qst4v%-(fnO27uxQ{@(0BY+ z+`q=|4*Xfm_{Rc|VTt&?@Eo3k9cwAEn8+*R9eI1GtiFdb2;*@eKLy@ zU5~hQ-*(Y;Ncb8*+cAw0(X)ect8GSNK`??$pXZ6Wkm+o>b zdbCgG`hhOT!^M3vR}67E=4|Sd=~mx{Lu**S_NCZUVN+--*<5?Z@TwRZ(|O43O=4grf|BFay8)EDBJS31B?@x z*ykX7ECq-8fBakK4cwF6gZ3PUtzS)Ri}fAZ84oNzFn(nC*3GX!|NO}_|1?7NW%!3r z%wFDJa*JcO`?uqpt8Z}xusg1s>e}6IOLQFEe2b%Hm2LUNr;=VcH0oAIeG9s&9MZcd zI_iR!-G|;ybY$7$Pkc@s@KeZWJHVIEX?Jb@C3GTGR^BH!xkKqnm!syjr1;V;hn_s( zUigc)&9>Cif8gIWJKOL)Z|hN7wD6a016U*C%bmz1@)%EmbG3Z&ix!S<%K)DXn9Hld z<@wBO{+-P6!ZB?_Q=s+W^22+umnx3n@?h}#I`BH5*kBppbUL>c`o_gc~y6k9y=vm-b?6#Sk5e%nplwm34t?fhZt zlf^L{{Fdx~VF!!j8gP73CyV1+aQxwJ7RPnq_~M=x$MxX&l0Fv44dD1A{Vk3W;P}!3 z7RN|%{L#VG2Yz#A%B>|neSm#wbTV}hGeSM$!NquDWAlG-GIw%JqL0IkP%7`~qzkw0 z;CB8V>Hx0`nvLbd!Rv)z(iiZ0(F7xOEqMK~)#|toyk2~p5xRaVXXPoxmj|yOnPqj1 z0I!!mWOa-LuOD4tbxZ)SpIU5nj0UfN@hGuvp_Rkf!w+$$o(k<=gwM!&WQxyRky83* z@)e~k(>j$to7TDXt$i-X+g}0;YuAM?VyV3|ftd2+k!xd1B|MPNS|xf{=YzzwV_e0^ z=kn0Yxv@8HDo^q@Zcp|eycd7C-w})bUhuel5^0mYDl1qc12WINh6VjBbqQ8(?9~M) z?u_x-C^wKYR$w&%_!t&qg+|-VFCfkt^Brr`IWgMi3(4LF+I*Zg8)9v~Fd08v+5~@Q zfd|?v{qUvoyATeUZGu0FSMnw09;M8Gz@ewW8^2+MmPXrj{~WnhBD(bGIE`DPZBFO@ z8QN={9vNdk^iAbvB}Cd1U00kQtpUHr2c45o-Z086pv>?TQ(ws5VT4?i(>XW^Y3Thhu(=dZGMC2d2m`Z0$cV|8-C(#=0AGVD*#2@dS5Lyes+A$wQn^0S3$-a~yY z*jB|Y7r#@;z8JWJete6KAOGuyTevfOqT>kPALDm;h$Zw&(bwbK3j26Zws3xd&pWXy zXL-0f!O@;G(Q$IDC3HOK+I?bg-14K{Cpy}z;RD~D=x8h|9)G;ly89^nU^BenC-)jV zcSCoEgk76|0nK>>I@1ciEh2vE^R|wquXi>^yB98M%YeSDM=p>K9EzAv_K4g{=F@&P z{sX|YXyG+&8<@}Q6WPC+&l^(UlZQiRnA2yN+j8c4Fmz=o^hN7#ts8xz-|*O>F-2XR ztVR4kuA)xSt^wTR0v={SPqM*FYrGMf%KwyPXxG)$No=kh-t$Pm9=am>V%EvsN$cGf zkK1suzgrv|<9H6IFNqe1CrNasb8tiodss)8V`OKGr@9=2(=3jay}_Rlqo*f-ff*FBQ$xQ6|6)c|AXQO-7X%w-d2_8}Ks zn;Vi6OXssstgt1Q7Smpy(P^Ot->S8=sd)}?c8bk&9=c4;`|HQUW16s;tsth0^d|Xs zWR2(HlQ^r`$8$d<>!vY`>@md|8pK@J*<7KF6zIPlzMpl$-5@4i9l=~*%Uo-IPr@sU zzjsns9yH94t@1~}Y9#a93{U+Uup=f==vClls2}-+swX*yFsB#xPI8QA zJ{xN$IR-J8bze+!WH6UU4@`1g$6Ox!=OoAV%;lkPCpm^Om&a=-v2R!$0nQ(G=JEt* z5aGlK=JO;xzjVWaE7dPz`DSpRo%%JLesMNPP`@~b#M7^eD+klg|3?l-!X8C<9g=v(2yyPVa%t_ zoi{L_0nVp(=JN#S(Gkq&<>$!|eaJwM@w-(&JWrkmW|DvJP&#uIJ5QcrP9*={rt||! zkLbDDpd}XSc|qwPC_T+QJDi0^)lvRg(iPt?@P_iD{(kR9?0KFcuNi(QVoMtF)oLn@ z=>1ozzJ>ZGV!PU~jQtl`LXpyED!s4SPW^23@1#FT`YHC;WeLvEpRhO6{e}K(@hxB- z#pr!La{QL=_;C$P_SU|E?|An~yiX>a5M?MQnxMVK&6^=% zPc%LcWkyhD6SQ_@3T;7WcTi4wdVj@ykN2q$@5R!AK_tdpf1mbu*(_>r)L!_M`QFLr z=i80EhtM%zP6z60Idh+fAHmMr53hP1-yDMuh~6Ip--gi#?UULwwe}^a)%w?3xts=A z0@(IL11hNF9s1C~`ri)B>cQogfth)3XHS)^)nL9PYmdoxWAa|=HPlO-E=9N|4!ok%R?lprx+b0t?85anC^>=UMsZ4SI7 z^W2)_gty|{Oqm!CYpn;FqnBBOlGP8ST!3{^%zxRnHu0@&z^^2|iSPH4C-}@FUwOJ~ zre`#77kT0n4dDAS>&qJLhaKBEmF*ZU=eD9lC!aRVbyUIs6?|I=P8-PQi%h=B=6jzq zWt4fd1A4g*&_U9lpj;SPt$fn!FKffknpGR8e35>tPUSN$vyA}%Z_&5lvf9{Yw$a(w zPMMD=(?T0NXd^)SO_a;RH{8I#s5tS`I1KDs8q<=z-_S;5+9a>JUdaD`z1W! z^&xqGAbkVhDK?4jT~UAP`EFOVPy5I(=D+d|lPCQ9J$Z-eukKn=J*u;@OnIrk9r~_p zlJ{5SoqALC_V6`LMApIlR*=^;(HVM>Jn36oO*~5q`mrggXZ`I#{-|?+!TCq_e_JT8 zbiqTgF=bV(+rHpe3`gyhl`QLf9OcX;IoA=!zk=_NF!l-yb4Qt%NtQ1h*loTi`!rYEd5^8ryI7}3SbMT%xt90Atjz@8<)0s0*Rp>*STf0xO#0`% zAGb|1*SKI~>hNgaohTlsAE$7|fHQobn&a!?+h_Ktn=cR@*9x;A-F(*Q_&1yXEk5Ca zC62w$Fm@SnMrXr*QI?I;yYlu;V&PaaV zc4U|X_(pkm=Re>`xgNVm!?-cvviCpM*?Cbo5|PL6dHq6fBUSHePkHUr_n7*mBL`yk zCx0^K@P2eY-HqZeyW0aN!|++Z;CwGVmh31Bp$~3!Q>Lxqc4FkF8KHabBW^(&`xiPX z1G%!wJ^Qb4naWnNRs+!T0+oTEvk*JU!nw&#xpkC@*nUJ}9XZi~Sp)q%8In<7C{G#~ z8267`NL%T=-n0Ee`KRA97png$zKhlIeJX_ z4vmhnjya9>@9rP92V0 z71&WS2I)9YKlJf;~~HZwvHOG9EYb z-Z=v}H?gLMu0&1@-F(oL-$d-39^&j>MP3GZ!YNA!?DToZH(}Qf>Td;SKZR~sPyFUU zG0%#3ZZ-94E0J@1$)7?$LOJmsXWe*DE9)fdHx}?O zO7iQofUp0(!q`$a9GUGv3$i~8F-Lm&#?a66#AtaR-ODM?9vc5CY)syj-4VD@h(ELF z`>ajRZoNS4Qt)R?{$S$t!{>KZ|NqDe1r@@#FTK0o!1Bu#e&IITU16VyLAm3oaHZ8tuSt;YHK{+=_O9R^b7 z6ywu=Fvo_>W}wrdJ!=lMe%1iP(E!ZCa}yi~ejiqh$c?YLM>9Uzi1zmV%Rt}3_bUJC zBhEi8=bL$t8h>cfH%k&6f94z68RucEYvDX6Tay#uhG}Cu71=!U?`_0-nF_uw${6lB zhy19mB+lcmiv!1d`9j#&WC+L0ouOmfub-{lGtcNCf`Y&ChOqF$#ZUh~S?Vf&cin zvAT=!E8u?*@XteU69DHQr;aCB*Z&-c?KJg-fxX~f&pfWBo(kYzVNI(!X2zH9Y{ESM zrnVb3_IILV*BsYjV{s1nf5*Hk{*idhx)+?G{oJ7~`!(6F=}yCZ+HB=p!;FWVWYU?H zDUmZ?C-Ck?aG@5vILeGCg_3^FhQw*PN)OV8nqpY9E+KKqLd{+uxV+{n!tK(cMyr^IdKV^>W z*cTem*U{Hl{*TyA|2Fr@v)r9Lwk5o4BKweQ2x}@B-kDE7zG}p#bs2o&q3}-0{m+&p zcuJP zLLL3cV4pyjwWTNUKz8ows6B%*pN;nE_wYQ8thokYZH111y&~e%_y3}A8QfQS1o~Df z`qmpiVd_5ueUna4a6DzZ-K%^1T7j<<+V!U(etnb)47txM+)=zb+3X*@n|&ouXUPuS z!_*O5luP(@guYam_;iJdpVC`Zflm)HhFz=`ol7pqC&d%11D_rsUv~WY=tuHtyLG$G z^Ix>zFbFUQ8&Zs72Xc&B;OfW5@fG-%{$1IJ!Od-P?6Kh8_9P<|z?M?D+4uw8 z>}}59LCRz>f8P~f!cDK3d*z-km_S}4=Te4aiw*?TSz9Lr&@nbULB{ZrOJ zJ@}$?TLtn0@!^B{MzpS;d8l8-8kUU#^VQB7#Dp(n7HsQ*?aRQn8MwU$Y(wCRa6+_D z{nDJuHbZlIl)5AXlYhKqVCEXkQ4Fc>J~Qs*IA=(9gu2sEc&9s5GFrpA!sYM4@QUD2;9qO)5d7PKwOha7 z-uf^y$>W}NTMcx|0p{!(XqE*V&;WBeGPP&v2y{Ie=xDNx^vn^zo`79Zw_pM1)w9gm zci>GW_o|3Tk>9dp87D6)7I~U4-`xKqXOwo)X4YZ2i1-JL^(%AzrkQu&>E64H=pBY< z$q!LyTMn?d^({Tm`xslVQu%uRkui!^icX4NidOC-O?#_7F|xM?zy)m0L#@DOUdkmr z*M2Ho*Pg2VRA&S2t+9Qz0KXOOtAd;M)Z^eMHr$~z!2c)gspnW%`cAT;;k0?W`Zh-@ zb=(IYoy@t-(T#WcW=nsneNFNp$y$$**O|PIM#@kblT1z@J>8vE*=7ZpTAvWC=jMbzKQM%zYWj5V?y}6ITiuT{rVi zTCJtnTCpQ5l}zy@du=k`o@5ORCMuK7*kkMMnA#>UwofV6pM1&>(l^DK3T^M;9YUE` zdiE@BVt!r*UtR@YD#4eR!58Vhg)i@sfBD?q27FEcNBQ;C1D`{{O7hk(co$EqeQfxS za9I&`i^l%Ze0KEJ@cad9%e`l`r_UD`%Q#oO6~LxCjrYfR_Y;dRmG?LJiSLa4+NZy7 z`e8?G6_eNpiQ5^qQ#_BXs(!2y+RORP z8vq~j5dB+a^sA};8F6JPdk{PCzu4DoO^0`?#+9~Rw%|Bx)3)$v4zCxN@j0IUh1eM?-lZ@@UL^@19(6C`7`)p)sn7QS{9{u=Nn>m z%}2Jlp*u0T$ZI4o;|lW9$Rl2t8$92bMr^BSOfBsp?!M#^vrG8x>Fac4MPoG;(6&3B zJs+F(P3f27ZEb_saS!C10rZbG@DgXpT4FeTObn+g+I9~ik8_fp{jz8X^%3VtF`VjX z+dZ5-Vt6@O10}uMYQkEGCWt}8;URNTS5G&7U2)N zo|wE@#Pf>9oZ}Lr()WlpCqJcUDEB*Tj6dOis670e^M8UL)YDDVKC<|4_HP)sxN5`r z#nyh?rsWV@Zq6&)7q7zqcrN^qAOBFv{S5Yua_rMS;|$yxd1-8ZoRUGZR;{FOB+i2e z{dE z8#Q0bBYt6e6sOi!&=+8Pi|`FuOfm5b)1x?5y75xHMAz-)5x=l0q1TP;+?Qe{7ELAH z&NoqCOl~^~4JmMFoM{#PClRie{ zcv+N3{KE7oPQ7%)rMQRaigSyJUzi@nsUkZtVcdflx9c|Yh|!TA#i^1mjE%fGG-kbbJolte%DFj$K7r1!@UNM#lL)J!VhA|B@iP8dcJcIxVG;2C3sp`3oF0} z;Z-(g!prl7Z^FYh+~Ix&cv#6jo$wsFy}u5RK4vq_ID_rPj>FHnraH&)xWGf*g|w8| zaaq_9l+dpSZZmdP>Yl@|xJwYc4ih6z_>-VmgWM}9|EPHGaHvg*+yN;&{dCIv!OeL5 zRKmoD^Rwm^(;<)Y!rAyPlJkM|9$_+Yx3Ovo_p@O=bU@)Idaz$m`K?{;6F4WA`x0kdLI1*4kjJl zP#*N42fhaPkS=sEa5(8Bp()U!NPG=8lJ2CRz*|WljSdJp6os!rkF+o8x05~wnn${J zJ7Z^zdGr-Hmh@EGXFZJg8nlpJLtlYuq$3+4tLF3+UxSxupS}X`CT;-uBe;`kh(EZ2 z-%u5AO^Ru_XCk=t1~DKHs8FlKEPZsPYf2z=Wdt-SL1Gx)A#otDP8kF}n)T9<1)E=g zeZdOwBc8MC4Id49L#IK3ZT17iiVzyac!Wm~Uco@x9-&YBJ-j6{Z+M&af0(w#r$hD6 zRr@*U(5p$WRBZ!C#n0x<@x=ZeuXfggcmDmMk+uW8lbFG>rtdq+^PeZkr#qlSx%dne zI`qNe>-({cGj9iU$bt__!J|JruJ6ZM&bA%Ups%Ef1(oNZfc zuG2&p{qKMd<>E6?*7VKw*J+|AdC;L|=#agXF+#frL%T8<*AD1VEDG6?*Uqd~Mu=Zv(-rOx8JpcbCpV_-1|4 zJtbSGL-Bfim0!G)eiI#v2hX-Zhj#EQXI)QdMglZrZxVa9<2nq_#8$__OXVb>>tDMQ zT@}2w0U7sqfo9(SN4B{>-T|r)W+~nB_7XB_X zuvN?IPab}L1wS9_&z>W%g}i+11F~)*kM~W2pO4?dIN_rL;G@d0S;$IKHaGbBvm|I6 z>GuhLg-$PP2zBuDEBN{35c(o-7I`l8YFQ)58|=l;%n{dlC{6NiBM(2n!h1b(8+|bj z@vEAI4MEl&CB~IyLE#8{rqj~?~T*_sQ6>V*T=It{I&AVg4)A;yZJ@Abw`{BVZy#CgL zXy_icJ3A}*T?Sq@*KoHAo~$a$OWQM+xJO&jH`RJ}-N^g@>mA;j)OdD@p1%Yi*CGR? zuJFENmN#v>d@_vt;Yrv}p-Y*YOq}FvjR&|V;eITxt%h}(a4mPuvS2lB!ZpJh{3ML~ zXP6o*ceEm_iw%v~&vZ@wT-S%cashfEKJGs83rIpuZydj%rzN&F)R>#kIU zRb<*0EF!rrM=ukY!%YKk-7QbQQkN|xz`teZt{+}-q&Zc@Ap1_!K?K_^tYe>ob-oJb!?v^ zQhvj{dg8}4T?=Y+{Ttqxa%zkCGILJZ!Mx7Xri`h@;;9t98~#qx;XJy_qW9+D7>b#;};N zZp6RuO#C29j3kja#fQS#gI>AUlNEZT)fmWqv$BujUL>#Jj{kY*EPA)lZ#w4|)n}cl{u~#oy`r4i7b3FS3O_x0b?4CivrtdxRc29G# z$xwz~j6Ika&;Ai`B?x^v%vgHTQ*jmcTzRlRn zUgnK`Z{+f7VyZZyVWQiTID&GQa`iFJ8v2*AP5+kp4y^k-eRgsOBD#IaGvaekbRysC z`Tgn+lkY??BX8QLi5`)>$H2iv_Nl}m)?pzq0tTO>Td27#v?Q+X8SV?6msxAyo5N<0 zSI5}z1=1TO-DeAWlD6qPM$(zH=!8pw)uoTo<&hpC>9noqqjSy!XT%Sk8NF0~&#uZJ z7<+%-s}9XF+LnSd7x_KOcryp}vo$0RL6=5+6Vcfx^svAGwal5=%FIoC)7?0}R>r4^ z{(m|5ghAR)xrhB|H}_JsKZ-UNav$d^8)w^_G}PB-Y~62ZuP^0}7WCHbtIXy2W(PJm zwtGR^Wgg$s?h(q3p^VJu67OaU*r%EFl~3CfoFTSB^rPRmGRFLxq3C!6Y%68VFUmci zw(}}$iN5!6nPZ$y)=XbV)}z9Gt+I)=&0x;5b{4)R@89%s9DEAoeZTlZ31Q7b`4#zI z{@+hLMzKjjPC$>wn?KIA6Rg4hIdgU2VRGLz9C|MKQg%3Xq`Xdh$-6|`7JQ_%25313 z{w`4WJMcN7a7P2{f5Scb5>g5p|O?9sTO$&oSw&?sQyaR_8PFuHNQ+F7q8=D2|M z>ZGjD5P|9c5qDZ}t$@1nosl=5^%+q2NR0SgeT1`aKwUj+@7-f!Lol%J!A|cwETc|- z#dzBr>nJOD_ay5sd5zciK^OZ#bk~p2?~UX6j`8F(o`*5$>Q}&zK#))2k0(Bo}kMNMv-PfSTe@8q1HYA2z0_`a7v*k`hIRkCE zD{h8~*x#c=vW>WL49(s#^z@B^2jZ2-ePh_;8^Z~G41skG)QzL=c={H+E%VhCI|xPn zlet1)xSPRlNhJl?(tp(dDcX@cyHMH?f5aC0%4<`p@_$=apsj5>IOluMdgg8KeSg<7 zFFld-z)w@oe#|`~?OY~r0dQqtec^|rmz7-UMr-tKO6^YbXj z8~(#5DC+U}&HqO+Kdb7w6<(K=@ltRi$8yWd&dOyQ!158hm-$vf8v^U>3j@nvp zzV)?!rX2ERZZf_Gmp6SXY5z4hvq|rJs=;WQM81sOc;nnkO?scR4hNdj$rs#XZWo@R z?X9Izwg#ukRysS?B=qV@@?DRC)8gwE9B4$2ImIu0dvP#n>hOzk!oP)lQXLnvU)85$ z(=9kEv{B;g3Vqzbnn)kT(C`)XA?+q7_pmi&-DT_jNNINFkNWtGKF&%Xs&`S?;Z1Rq zU#JTcm{|W2S-;2E{yDw<9(4_@`BK^!8ZPj3mEEP!EtEF7Thn2cvDcdxKw9_us|h-c zJV!lp&!(3vGmDQ7>~lyH8x4VTeyKO@d(ygb!|6@CK$`4X>9;KFZoO_BX@Vz`R$Jpu zJ3*SjR@!S&_vqzZq%HB4(`I_p{zaPLkJNQJy=i|VZH~WO(!F}!qoi>Uuj5c})-@yl zUVSby_O;2%^ac4vzW(xSy>&h%?F@C~>=PW4J{nx!ym#(UrrqTK7ak?1+oasoAfss) z`GcwZ><9OoN?TJ+WA>==;QWQs7bm$lIN=$-QRBPV>rGLQ*o6)>KywmTK4EVGcZ3$S zzX1H8lR{sAh94ZAR#srAa0yzeueH~I!4Ir!KD07W_V}~B^`mXaZZ$rz=cxD-Ged}_ zg54JFi@nT=YWO=(g8g{7VYi2OJ|5n`H6HX-niJLd;aT`=-4|dBZNOKUYpCrMcQZ>k zlP_*0&gS2QuOmJZJf84$BHL|$1D;K6pWoyhA@*GxIC`~Gxh?oQI>VcU&Z2C4^)%#S z{jOR3L-(um`_f8=cAc%9VLwS*ks+T}eO4B@`QwsjI+txxJC`8moX0-!N+t5nFmwah zg0114`<6I;9&}W4hDC=>g91} zN?H6+?-~G1oEybnO4V(S!KY(@>K%kEI=k?hG!OSX3RzhAl2Yc|$vLji8U7W1GUqgO zQ{HPO^M4NSNyWbeI`*74##~Jd%m>jGNzAQ_eD`CXUf+eibQ`6JYPBg7e#25YG%bkO zGa<-$a|`FBrH>;fD7>ttaCn;B%jxh%my-amyoNdSfLFF~j|>jy$Q=LmrpN1d7P#ne z<$RU%>f#pseKOur$Wb<lk=%T`18JXd${Y(;#<+O8|~S@6G^68G9M@=%-6%+{%6NW8@KJzpt?=MYn5{81u4r z`IL`g%|G}(F>+YL!Nlt-9qe6i1MB^WzTQ3C@?Vnm4$#-Tf%X25`a(Np%rcI5=)Y|v z>-j(Mw3S#tSJ_K{!au+d+(Uk=)Gmin_2%9Vyc$@?LhQUsY|C{z?uF?-$;yHSCSKfL zg|F2b{E;oAd;;+!WsWkxvzxu=>@Cc30&QGwWM8#q+B1PsE_&bx)=9b8x^LI1U6Jr| z=a9peBVS)>#%Dnzdx5^2u^SQ_eG6|W^IpWZ4PV8MDq=nxmD|~je9M@Cxw{Fzshm6b zK`*ME&Ggf9lKsg2?v1?FNy@n3LEI&3Q&%c_i~?k5^eMHx4RS&!CP24b(4}!g4<6$i zJ|wRhKc&F&BRO|~jllHZA|p;#?z}x__l!nQWr$KStre;sK6U&>`slrbIGn~{+aEK< zA7j6|UEqw^X(k}&{RZ30fh$-;>?*6#@5`NdIrf=jfnh0jmE2jPL-g8bI+lxlCid6Z zGvF_Mmj&C0#CM4igY1yV7$-FdZBI-|c_Cps{w?ayOg6hsr1ypnkDNKcHfEdfIOY$2 zz)n+are8+4cGf4qo~tm||Drs%bILq5?h^Pn8@Qi@?(KSySP|)hpMB~q$Z>v}H=Mg@ zp?RfpCp}N?YNapnnJaQ@IzFEJg__-u6JP9m`235^sei24zV>e`-}vjQt;lGqmz2k+ zHuuU7=9$R7w9NA*a7AoIM=pYPEb2_X2)z2Sru}q#RNibBs+=ldR*hY7`Nk@}tukOI z<2&hVs}w)BH?=jFw&r%Giaq6TuwnlR^LRCx7{B-h_#V3F;oiVO86BUYXB7)oP6uT@ z=ux*bo^o)zMKf4)kWBt3+!>> zXJ&wF&Pm`JxGjn0*9nn$Ks{KZ6g~M*LXI zUJ|~z3tV)d%Xl6+<;r7bx9|hlB^(wzXBRjpvi1*Ky!d;SHpfxErb%#jV4d(c@C7@h z%vJV=R+esS!k+lmv!2SizVsxQH*Fnh@SA$sjC^m}D$?K)c1WH4hIGzlY!pe8U+kd| zCvh(>ztx95m4@Z!joM6+ZR6^GNg3fIgon5dp0}a4m!2-|yp!LzWFh&&M+i@KC;4SH z-g=ThwPQfZZ1T}nr3fFEp|tM0Z+u`Z$s-S&rj)Ys>**ivHI_U}*(b=mM4qeZdfxAk z8cW8}$9VpxkuN;fApZY>at&tj2OU=@{VvNJSRybLS#1*KIHyyDmy`UY8iNkEw+y$G z;KTHAI{CtHNuK8N=G{daF!h$lep}icN7`xH8A*Rh+eEha_Ep&4zeM168~MV+-%38` za!Rcx_P*XSztZALWUU8N<{WvWDI>h9+=^l1xp>|CjVHBd<(BD-}#9_dfQ!Rys(tC zhCFYYn>67~CC%mVrd=eh)*v#pcU~9x7P!jzBrPc~*w#jxz*B4RmJ0`;1eStRNlEfH zle&}t>pXhR&cl>Ps$9eTUIlm#BvCHB~9m- zYocr;-|VU!PCaOzj>Aa~Z+m^_-)0j0{gCq4;Tx&jmS@6M?>CF?E{G2*B!KBoix9mdSlBJZ_VOD-U@9PhuN`&4WBrm`D zdin&?J|nH0=H(Hq7JO+SP2j4J%jr$~6KUNv&)i=x_XpByxAyNIgY3BvNb}=aHyzXB z^zy@#VoU1C7rjpRnUm+u8#yMnL}0m<{G0Y*LtJ&3Ap!f%w5FYvf5W30KJ|I3Ql64|p$$rqj0 zFveP&d`oxz6YFF3b7e94|26+w;z9w};kB_Ph2;C@zeC`glo+q)jr=fH@O4K4`OJSk zxZ*u4Yva57_*Fx!;Oq|IwEl6*`QWgg^HOgsBRRnfha<5ikC4xv)6>gJz3G!lgJ$b# zwN7u^MAGsz6TAE1+}x2tTG`&~Y4`Bmket+A23%U7Mj9~m_FI#r_dA9(S8{T9xm3!H zB2DI*zb#oWlfpOf)$8Ra4${+xkOsc#X$>{rv_#UtH$BajI9M+?z}HsoR_}K#-#%Ec z@8;>WA$r;2W$`6ZPe zJl&0F>-G6<_2#|4Xh2Cjc|IK5k)eilxBGSZfRfYXakrP^@(52muYSbc^I2BtFas=;KGiL;L*t-sH~# z9zotuuZ52nS$A!;$hx6*Ymh_poQymoZ#bVcyVuo1 zZ;+Rowqcu&ye{_2SGZRdKO4Dx3;%xMZJCQf*KhueF}3^Tfpqi@j%rVi$YJNHcYYi4 zSC;6T`qU+E_r^`q^&!|vi0tLS|D^K=-kwla-j#|x_4_K`fzkK3y1Xwo@!nWGJ4hE9 zP2@Azhvse>t=~q^E|JgV-H7JGbd;QYSK#M&EvUN#rNL%vAP&+&QBE zvdb^}j?i%`hkJjUn?BDEi?DD0C2tL=FS3#7mtJKIXHp-wOI)11k@#8!rcT~fHK6zC z2OQ2bhgXr~e~sM!9&qj#g$((MXIDA@%bm}QwC4mSoo_4mC(KXM$|VhX^(y)j@w@$J z)~1Vl+^4AHhj+6N-g4*B^$WG>8Dv|LaZe!MK18`E&|RhTE^`F$6Ge9={xd!w<<(uC zpNWk*X>)!wm#1VdGtF+X7vIENjjzi*y9UyhU$5tl1J|!EMaH*L@YL&j^~`4PJ;c8l zM?P|VlfWGL?N=Sw&^wxzaiJM|Z)D7Nz@~)g@-GT2Y#{D*B1a@Qeu>rfy_|hOP44upAeF3J!SFj0S z-L_&s(4;Ao$h3m@M(h_Y#Ocund(i6*@Wy1|fAlRo1JN1IDk8Ql`A+Q7RujXck@q(H z*RQI&Kwk-W5hE9UU@JCRbB!U^bYd!sopb{BS;Dhj!cOvwbIUi3!XB#&`>d4zd~=}1ss8ndxTH;3uQjWR_nLeh-zv8@sIA-;~y=={_|CIRV!Csn_|%-_4gfR zq`A;H+|KwG7cEN5CB9i6`^RPMS%=NvE_sjptBs{q2t@Yeb6bsqkGngZCNq%NoPJz#(mf=@5*jY7n{Z~;41pcOs(g^k-YcVN`3hrj1Ef1 zgO2{F#^1{4Ij6zpA-z~jbg>eD@;G=|Z47M7!?vploNMxp)9Xtnwr(?HECn|tuN-`o zHyh31?@(|lgF9z=+bs9bLhqgJ*D4d?0c2mO#Jg>ew?Mxy%f7&$m)WD=`G|g`FZ<$} z+Y_6L-s(!zP}{}5BW;h-$M@(3ze5NAF)`jOM(P011oUT5K|?y(M{+j&jW-ZNo5asl z2>BNLwusJnCid*r*o^ZaLVqtWx*PBxUE=`g9ySlqr#Z~!2ln6h*!KJkeTAiHTv|1D zOe)Wl^S}DfKu4|j&3a4UAKlRRgXF2 zC!t#>gOsU)|Gz`8b7fnwt)(K+Mto75*r{CMtxF5`Cdb*=-#w<>`!3`2BN+Gs&*Phe z?LuQtPQtex_9iDePmXV%WH)Dc#{K{-;g9R;u;URu&`98lOmjGew?GB1!Nhe5wB_dy z(e*-)eJ8xfz`9+3{ck&nGafJ9`rUJCQ(9-&&Og(?+*gMoS7g+hZ0kSu;+EHrB!K&y zuF7vIb1(hL{Xs+X5Zm7tbyXfD4O}@Q_cUobTn5yI0{daiyOTNib;e~=JUPFF4v8&6 zBkQ%ct1G9SeUJ>CB=()g_q{>f>k~(+_F9*&lh5?wax-|9$oX}WzQo=j0Nr5=|NjGB zdLsQk0W40le}9QT_sRI1_i$Hn0DH9#+CRfSKFgY(`krMUQ@fwx>atl89$2cUtetz8K-z`8Kf*9|Ha!bg{o>E=}-fS&32l zeoUs1B*uGg33t{fy2k#Sawi5&(*4Jb1QxPKTj&G3o1?NvMYp>77sP61jN-fgQZ6)y zz4bTV{yEX>T|DBcyg(n##+bT^{N@&pPut44o?u*w75!}I8?IHt3$L%q9AG=c|I+?( zco3mCLJOpi_`TOEj{_Ssb(AB<_D9Oedftf3a^E4i+>5e;yJH#4BK~hqWjyFXOW_Z^ zcOrf2!bq31<4=sIHK9D_)S*=|Mimn78eN)gP@&_8P9zDETWJqTSpy=QIAnZ|Y5;VLZLqD2(hx#KuH z^0k;q)g!#|1ywwP@AH<|V%jaMvU{qiaPeol79VLH3Dq$nDkePPT5xeF-_4&^$Al_l zcsg~~vTp-Q&C{Cxxhb32@%raghev; zZ-9Y}`)huMCdpq}!fNuhq7d$Y9@760D{6)2yls&5@S+EVenpsz?c_(O)iLL4)*T&1 zjDj92BK**hud1AyiV;4vskxf+hN9t=3vgD)3{6~hG{~{NBTxl|?;reWRfw}X`xN&L z#Iq<$EUS)_I_nK9vyTL1i5Wi9f=7LmGT!n*<=NpAxFvsBN6T~W7muEOqm82;>P=*tzQ+0RTe*qti<8&_(E z9%typ$V|K94OSz5fScf@TZn5V_DY{oel34irA&LUkrbQd7Wnmp^k*r?o)la;$a@S+ zy;f}IZt{Sf3v0Dvu|qz_#icY5_6FD zKU2Y0q1$3#DRxhJDv}uLyb~ZEm!v(-x6CP%Z~t7Ko$$qrykqE~?rLB*5}55(;Rlm_ zFzX7=>J<1}jxZ(}+h4U});`DbIrUg`fB$b|FCk<2jCL%)<{pzW{yeKMZx4BIYrOI2 z9l))$HMqB&iy?Kc0h+y3U^xKWTgv$BP4?A$|Aw@1U)no2q>c2Yy+zt7+6%(>e>!}j z;LHQj_y*{&>W4G0ceRj%T!`9InA;bW{Stn0OM{yB7o0dY4pGGqGUitUwP_b_0bl#7 zVmo%#wpH4+JL6SMF5hdg!QS$7ZQ5Sm!#EZWoSx-S)1GE+_6(*hzMm%rXwy!KEmI#= zEO+UXS8CJd(N;Cz+xedIls4_KroxZ#ZYE~I!0GqyRnzv;cP{lu@HQ+lNSkJ)zNNP+ z4uzKT2;9x+3kcB>W>{ukcYygGm2^uvrjnz5x1RmG=xe{qzt&)~Z;Ruz9v zdwUr>akgTxYcJl;_os~gZD`FY%jTGQT4;FnwW#7#-{G&&Qx&sNiwyVhJsjTnbKdN{ zqlF%1-0f#OJUM^i-A*I8TE_o}c(3CD2a@>za3XQ%n1c=<#xR$+Bk{~ZpA&t`7!-5x z&uI<*ngf}`e%|oBGjHJZbHML&;FCUt`NCVC2Y!CokKnr<`1xVK{hTMK3-~#V5#jrI z>k~-*+0;M7{Hm${Id4T4P+xBkc+2-f>igT<&bz&0>fdV!4ByL}pdYWF@cy!XdVADg z%RZe#eSdq~xpSUM{dU%`1Nhx*hzW1>L>0H5^5i5BRWU_F`cBW&3@I;iZW_(z=vC~? z1-(_wyjz2&FS;*c`sexm?|hZNf={xKse=A@8skf|*G3?_gb@2d8B^A(Kr8#pG?Mj` zeRPp?Zjn;qzW`6e4N>6|kMv7pOn4c;&D?EUu4%>aNja8l3B_yqUDQX#6yFv!J%+Xu z`73z$;bZ$5!_)j32V$p4Kf*t6`L~+(2)`r$qo&ORm*(^T)PJdI7ns-2_^5E;6gEf2Q zv-sx@&amex<$e|#A-r)j^6T3FBON~ef3=ed&t%SvvF+J&^LuK|(I4CLKiiY9dgC6| zGR9ueBY4de|M-lD``cz+ZCn!wkNRew$+n;Wt5tB3*h7S<{<;qYp^vRm$~`kpLs0a`?x8a z?-j()$R~b=_(=aQxH?YW^~cLNZ?c+|FV6TzdoGZtsw{E|7J`CqpS?E7y=IupxSgbNo2EnXJ$QRYluFHmCD; zLe88s@QhMcVE8U|YvgSl=UUfPuirg|kGEFV^kl4Z4`98~{nnwYn%cqdD8_WC>^58D zO4S*_8~qUOaHk`0C6S(}M%fxm%kCZot~Zue+?`vlOt}Wl)Wo}r6MHnf3;eimg=T+% z7&9HT{}giK$zJG7uw|8YkN3*3Cj!%xvFK#pzu$dY3$|XEJG=9Cc!mi0)OWzS^L!uI zl>0A?p_I3fpVIaRoZUxzh_4Xu_|wIv0b12lb!|xJ?bdL3f;%p}aO`+5_z`1tT|0Pu zd@*_z#v}Z{ld=3`GrFtE8TOHk!#kEt`&aaVyt_Wkahpx{`CFmr14DT?LTohgdv^j~ zS0{mA&(Nb)(OY9SpDHQtd=MM`B;en`SiAWC3|-Gf*7gW(jR?a(CB7iwlii`LPZF~5 zNY-sdXhYRk?`fNlm)zFrVBTTSHtez1XVGsKa}}Lfyt>L<;@cjCC-~^k*D7lm3wzrA zCgV9>a!2Q0#*xVyo+ugA*~}dOMjdIZAY+tmAAO6@k3`mfp5R2fX72zNW#G@qVtj(8 zXV_)V9lbK`&x9SVIzaiT2bKNUmob}Xcf4?H3vCHp7SfidAAU6WUdI^zzo0kESf~F* zZ|1-D|4whVF~*zequ1}_SacX0w+`23+Ji~>ya+PaYXK@cKL~pt;;WXDCv>QjJlUr= z`lOV5#jSg#F1p`yuNYr=ID_1$RbVT7_H{5#iFYTbPTs$1izo9&7J+sCESm=)$I?}7es3I{A5)> zi?(WvYMkg(_g~FBcHrTj(_b`prY=n8y#sAUPZ@6Q(4ws?zF3pJqSe0mK0~jAybZS{ zwpp{Yc-NL+IP;^Y4Mr=tS(Fcc)r6Sq!LxDSY3BNk1~pdhj9T-C+eXmVcm2ZZLo-xo z@BXU9?}JqM=Atlj{oFg1tuULI7SS2U<|o~M%%Yh)c6`6$*p%qCRfj?&tRgSVx~(o4 zZfjgld@%N||BUdjvA`oAc;o|*03SS>NRxYHnZLk+I||)LU|zq6>hr@i`(Wk|{U4Xd z`~#VP5cB`k(3v`)`A1Us&`*Y1cW6=8V&-4W{9~B^jC;NF|Kz;Pf7VAc4FSwQx=7Bi zJmwGmA6J0fRSv9g9Oqo-Ih%RTVV)_>b0qUjXPysh;np6}FIK(6d|Q~Oe?GE)M)Po6 z{?*(AN$5WFuNn@>8$69zb%V((uZgtX4_>@Mf2;Xl;3Dvpze$X}D=NNo4)YF%hLmp4 zs&C?qY@LbyHfJOIc}EI3Sx4P@wUM@J@Un}T=~6e(o>l(|<)jSGW4gyvaRYpfKKMeX zZh|fMTy8UcpFZ-U;GQwahve&hNt!Dkh|+G`q)h@zd8b=Fr5Nj^7nWq$~u_ z7J_FZ${IQz=%bBzguKafRSEKu4(ln=s(xyQ!9K~P>L-?{lF2WqlC{9226zSS{lFm?{F)6wJi_2Zw=6aStmi!;~z{l;c!=F~jSvQo~Q%O37h$*WbQVZ#UR?_B*m z?nOu|QxBx(#e3g#m60YoL<_&-JNCx)^Y_=p-UMHED$X(|=i_}V&G?E6Xxqm;@$1u@ zJz&d#=d4!v{D#&T=j7`?D@2zhY4n{VbXj15oNxqPfm^<>GADtpr2G4l-~1Hec|OLc zkB0tCk3q3h{P_rt82Xago`)X?i6ycf{-FT9TSnp-Tg$5k{_8t7Kr<^TC)fZ59GI0E!HGn>6uOwaW%tn$X z_Rx#Dcgx)p)jphi&}qmR#gWRrg?TleN0#O;FP}9RylLT##czQdnWs{4uTiPC2YFk5 zoU`%uIeBT-7ty_N$6;jM1DJ#OpqokgG0atX*M#Nj-Gt@ZyT8DXZ7X%aA9o0{(A+w+ zeKPtE3-+T;=#r!_nV0asPtli?vSN#V+YkI7pvFr6Pf0&R`pePWt)M%3`4(c1{@HBz za9_1o zD(|~@&ngBtsPu2x$90Kr&#p(?#dl$!y56)Q>nrQ=8(@3Z81#VwICzFB z_m{jGe)rm|9f!~bcD##xiwyn#ki%68jPU^b=6!sGX9DY7VwlL=K-nJ)=+8`=@HY&cl7%v#Bx1FYUe&I=AG&3=t?FR})O%t!W47kU_}FZ6W} z`>?hReJb^WLrSv?s9QkY*QqP|Q`wi&mc+=F|E0`gzU57N*VLVM(On#e9?Kc3Eb zW>Z;&8ef3iav%Q>j*$4rntfpe{%?_=E+T6=O4X4KKQ-HP4a5~5q;l-#GdczDgIJF` z!;H>H!1)AxM3jMNg5&AF80@VT2K}AracEsDwC~Jj-YbH~$Dy~g&|{Z{n2{HQ>y86k zQ!#coSq9!wD&jEkHj&?pqIbxG2I_tawYHjMl~asd<|M6sGO_TG?KppI`S4bj3}Sms zQtq-)vwbLSo!h7BZOOgfxiR=jqzz={HvE+3^kLo|q)Cj=Q?%itzK8nqhN*Bb^TcnZ z6TP7sx!nvMYZ^4sEqMJ{|G5F2*tc!(`j1gz$j!C$iu&MdjJ_1ZF= zo$P(jVV}?WJl*U*x6i zhb(2Q@#8WF`ZbSpyzN7S-ME3X@xx4!dEE0E!|xcw0>;oa)!UYw&rRdMH_m{{0(Ztp}$QSmO-n>lW&|HX7`wHyiDHxz9XR9bo^+hON!UOwzLK{&r7Q z-)EP0SC!7t+m$x)XQ)lk65$upm1-Z-yPEeHnl+cS2i8|qDPSjba=_t{T@L(*pg=i3n4z7;-mmJYuN?%R_vF0iWxSp-T8X@&%bjaVt4-{xOi;=37Y2=ve~|m662>sH zmpUSLYsv7!(`h@eyq~S3{#xbBx@}vJwyoTEUO*?m2l~I3I`S^_++L*EjAtSJk~y>teqg=gd7(1V2l9JN1eU@tv#L^K0o#e5!ll5v$uSeGfcpW&cxNVE1Eq2#owN zsiAEdr|B#+80$&jTFqpRsjA8t&_j5sk`jw(gWw~afH~{=rY%TXc%LAZf_r(?BmPyeThBp zk0*245=tym;s?Sac#BmXM1T&=y5LRoMR|=`{b{JM!z{2 zUJt%_KlNLG)o-)K7^1(2{tmlbscYs;m9n2=CnR<@&MbrNo!MQL{lTHMaI-s&Sf6o2 z)XslUCW3Kqa+$DkQN1IL(r&-H1>|)?Lwis**VsdU59_zh5`X9oZ=k#3J?yL0kK(Pf zs}`A#J~q%I|IAF zMEDHRr-)wOm{?vV{!oqZuC;^I&dmmg>B-2>)YrhRKN)6kNe}b-q+A)~FsB zbVWM;wbnwLR);xEpG9=0z8I-&S0z2j>yvU#q{9?K`q~&}yBnD*9lvhklX6{*!}L&i zXR5WYvMrZ%e7c#@fBm|z!}RO0&eWga?6*=pZ9i~MgovF5=^eJN>j4w8DV#`p6>CeHPspToOEn~!g zoA8gNDGrk}s57-<6l0Ne-gOJlw0V@nG=cQj&}Zo|z;9b3=_~Jam}Uh6gYiBX;Ij>0 zF=zF7hw04#U~rcY2G}$UKCQXSVQNL6y%xQqz~CWt9b1A!rcCBH+n^m3J!CGv+RBL0 z^F-Hu$6mlc+dll{3U0j1o}GyuYC8B}hu{9=+2zL)=Ulm4+nzWj`Sscb4`Y{l2A^!j z{030|4%VyD5Z$J@d%B%9#Qt(TGETPmJrkd5f{XBJDdIO8JKmJ#o@=~6dceMp`>jWA zG4IX}HSdo8HfhF~ush=y8`9!;aer`=>tA`?11ky+vh*$Z94qid|-3RVy@q0P}cMj*xX?cm2T`)WZL#xoQzHC z<@@CQi<7zEGW0L{{nlT{{l$tx}Y2gF*CV1fc2AX$I3^DIs_4lM1Z-oqv?@|K4`0yuz zU)~^PGYb5Wc?5?7fZxghH7($(*QXt_=~(f7B)$TiV*5k?{yuAe1g}es?`dd;*qvH} zk%{3?9E^LmFRc~1R3V3-pKoz!hZ<=9P+EKO3pR+A?{l*^&-|f z@Y%FA(YA;*jL_oiBVx@49G#Wx)*7WXWf~&vDo99ErSFq1i6=5}qce z%>iz^;ORZ-YIhR6ck5iW$&+s0E&Pn|siMO$EA#FZ{B=#;zgQndYgD+>}XYNQ@cxm?kQBDcn(*1q)FM@{Y{=RbX_a*hj z-xu-J-Y-R`DQE9E#w_x*fp&8P)cc9(^K-HPHj^GOGUJcU*gjhDF_hEuS5IA}7wN?sPa7wVigoc)n(*~%)*3--A>Ll%aOjLNpw3KvGj)Cs?DoK?3GDu?!>&)A z$k>niU`ITg4T7@`#Ig~7Tj1AH5n$`&ZJNO4TlV6U#?iJG_q}_;<}g#^Mcu(<-zspiN=Jcw!@V zDd7C?$dk2_HT(ayUhphO1@>Z>mT&aVb%)GFsnq-mc@NO9?j63>mEiHG_8D!bje$0g zCCYvqJjJ=uM%(#ZqwT^rd?oA)v7N;JtF?$efD#AXgOO}SgyA2ef6JW_KnyieH|JfPVxJgK=)IbXH(vAeztL+%MQxh%2tA7t`m;ah4@n5o)eXv@qbrWgDAan<{vh8{xR?3wXr z^u)W!2b0v!{wnTZI<(C^N#zU@zMsA3J(~k*>XYh1;Q&g_~9J2NKLf(243wU8XcO#7Z0(v1iKTOd# zpW~%Z;TMZF((^dSpCJDq1J!tmF(Yr0E)&nw%sI-Nwn{lWWxk$eYWJ~gyvJPz-6zIy z&%~tohwxkNV(u3!LeOjXZqo)5qZFFg+$%$mi_|t7-idtYW_c%tAEGps^M<_H68Tl+ z?tMYFLEy#ltYDLau{*(M;l2Lq=70L|>(N_iuZ+F*H`)_Dp=)2TErRv(fZHyC+Yho2 z(eKmu3H*u4KKzoh(q|dIV+8JkhZnOl+|S6K^X;)8W_DHn1KRODv`+L^&W)M%TX^G> zcbAu@n4rgRa0aKN8&m%#4j<(N7N7r&I7z;>n+Gj-!V?O;lz#rtcjoMeZaxYPoCMwc z657|w9&wQOjgM|V4Bbr7&m7g}{0g6-@DYBx`B&&>Blj&rHxKG`vu|AiXGri%-ZMw| zr)etAS`2M^p1!g1L4OwBX6Eclg!ZOqq2IA!3q`q?(ZkNCToUD8XD%(^M76vryGP|{ z;J}2MM14O?Ts!D-w(RGt#$cPg$vFYu3SP=Sf9ZxfzdKCjT(u0a%iGrB=nUmelm|Lq z%l~hIuP2ScrZ(_ZXvO75?tkF1(AR;lsXlyt(%uHXX0hh2=ZSHP|8+O`D)1BD`sJQC z&N&oI49{$1f}yy$Kcjf1w-a)0dKmnq<=vyFI$6~W+S51kJ^{T(1$hnf4h^ zGG%ueVy&Y8>ICL`ymt0gr?GcREx0QDt>B#ON!f!P?8zJVU_c9Y>H7YQ*T>MrUdaIe zBV?YkSHg4c`HXu!ZH1!KOdv*;<8F9HXyr0FtA60Uuu+2_mG{xHbqlPL#@+;9qUif= z>WMDYgRQb6{)dzK&6j%rr$qYrZSC{Y!Hu2#uhT(q490V; zZ38&-+B3kK_TH1Wc!T2(_xfk_RD_uHHD_FZnsamA^VAi5TTNXZ9}f!6^z!Q$j-h*I zT`lCbr{lXBASCBHJXL~Bw@!j

-e$E&$}nS-{;jOPhx(To+J+*!LN50e}wt$1v7cg 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%0DNgeAl0k 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't*ba%vkE^lCs^R6G3G@>qxs-n!o1SL;1r)IjG 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

  • ~4_Z2!nvr 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

    7gKkGT73zAsWMQl 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î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 z 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

    }mp6 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

    badgepYh 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

    fi(vKuHE3XT$AW*A`f! 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%0DXW^gAtWfs;i!=x#F7#bMoQhrN(@>tN_#)Vhzw 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

    T{%cD%Yg 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≥;-~J@dH|CjGFLH&k@69R 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

    545#zFgZ&fDd}CC63pmZZVR1Xp-Rp2c3`QMn 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

    h`cLx&YeuLbwQXV^MCXmh&wk#{)4njuMwJt*4>V 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%0AnfaKF`&3C7GNJS<->`x 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�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

    }pTBJ4n`#Z{1S^?J4(dw>PuD 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

    W%Oagd!RZhYkULk=*w|0(IQo3d@GfB3+_x5 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
    >&JqWJr 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⋙+qxEZQ0)s~=iOn*A+-~K2q17X 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 z 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 z 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 z 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�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%0An9i(IR36 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 ^>uYb`JZ$CN5(ZDn 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%0A33hetslc4#KFinjL^n9SiEChu@aSBH~_ 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 D1}HV4L;GNwL_Cwf}RT1DX)mMN>i_qM7hR5 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 z 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

    Xlqpe*02NdshyayL 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

    M2N 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懖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

    FJ>Pg` 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�KMWV#C5l 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�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

    VsZ5rd=_GN1di8@(yh)}s5~-zT-u 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

    n;Y#FR^~R*%*Axi=1WkRdavk8x&{5Ng-I}wT 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

    sORb*C% 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

    h3590$$Lbg`ZBClxWCQ;G9=r)j!K4j;|CP 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 z zziMq)tZV;zxWV|1@OQk^6AEK83}bu1FW<-gJZwxBEpN65YaefG3r1H zu1TG=RPd}7VtT=k-kUPT-+UWwVjMdmgVEA4EYyWoXl>XDwnf9NRW+4}aThR%fljt-Ow9{y|0sh&B zxd!piH5}1@)Nri*#|_KZ;9tJBa!uk_u5HtQcx}27&UE8UqXf@1F4KS5cueQG@k9ro zG%l9mUo0<|1#G#zN&jYfi(>Cqd56B8@~)2EEuYXob$$6doaO5)*L9ND59vR=eysh+ z*XM7*KYwHSh9-Jrm;T)wd)mKuZ_XS zfTfB9+q&C|7%v?(n`6#+ZExqk5{{z>eFgVR7YY>0*+;&DaS{UASMcX3Ed0V_1?MsS z^F?sxE0P+~h1*}r@Fg3dZn{oR#V~FUQu_fr!{M!3e*7C$g52i4X$0IGW&oZWxgCy< zF<@+h0qfktysb~>BJh+)J8;w%o4SPAVcWPJ?l$c;(Yx1l&;%sI1PnIFkyuc|U;R%u z9T!}t!iG14=;cpvV-eCr<5&QVl<`KD#_?~&-j+e6!_0UXJT9ETS)#}`5Uz0ThX-QN z7vUVU%i&0A<1|d3gv;eMI!EPGI;YoXZvf=+jSZgK%*j6v%I3?skRA?Pmdk+W-Fgls zn2tbX7Sna%UFe0DISUPhOT}dhiaV4SnVIzxoOO;T1UkBQd=0TC1FP4!t|Rt{UGI+Y zs3?E^1Qm<`KK?PN@iC4mnEd7Ubi+b}{U#0jO+p6VWFCt6-cQ<*9t*ONmy6--=MLyB zVnD|#4XePZzowyJ@YqZf>Xr%ODsYhEBgb}Ja*~ctp(+OOg&wUM7Q`YR#+N zL6{&#{giPS7KLqYXI<%m@stjh_&3gPNZk3289Y4(Nf#N7DYUDl`yWEu1=dWH`4$O{ z1)`)T1&iU!?9kZdz&31K;VsCd*#7L7BpGpfW2y<>six^BiJWdink+83x9xJxYCS@> zP?3&lRJQCRD)v z)Wx$1ttbMZqHP1xNHZm3nEb7yY3PL$Q3tO z6Vq!PQOax^Y|~vVEbE3>D$s0>9DRyiSk19Aggz?6M#73tsxoX01_(BUuuj@1UfR++ z(>T&XbS_$c%#Kzv=$Pi{2A#Z$0rV*nDJ9gvQpz@iZAxijIp|0!vFq*VOOtDsQa0mB zNe&Y>vNKi61R6^j`8^i;S+?(CLz#s^DYG~o@p^K`ng`1v53zMXmuww-#6m;5(1@n^a&eK(c`DhBZB8~)4~Y{MT5>-dvb z$93sD{`desebb6h47O>-mYCyDUM;)n*>67{{TQGQ{S`L_%ZzMc9erF!PSW>g9K-(@ zz#pY(>>I<UYmzYkhTOiMjd>)Y(<^V}LsJ&y(~mtfr3vuhR(FLGEtUYD8Il zqv_}$m$&ZcUeiDbMh^Gi2yYay%zvWTZ@Tb!u@ds6~VEo4)OEhl;!%Y&ODo z2z3U0N8$U_-z^n)=Z zXRI1;Tl=@mhm1cgA92Zfq}6yQP)!K!)A9`UcT3l|>1lgH2T%XozyXhP2 zRNJlJ*w+4SyIMWd{<9miRNO5?M+0ZCXQ+hIFqjf(OH!`EvvkEwF;`1^OHllJAz=C`kh~3&3p(6UvmXhn zqSmttI8p0?>Z_J20)#5A;gTx$>@?MSYCS)%qSm|PtMx$jj-?80A`sSa4Gm#g(W z+FTSst@q_{96jjEuvNQ6wcZlddS8ZG51V{n#vkl7{zItsPQ&RU{7Xe}=F5^A(S_Sz zw(PjnRokwMi&F0v(z!KAW!+slk1<45+|UREM#m5b1uC zVZ+olI8%*FROd~Xm#Dzof({(c1-lCB>&7Z{AZY5x_0)M(%39T)y6ZBH`|F`m=*@)l zRN&2H6f3*~UEL~oCDIDLDTS^2fpE37LA~BaX(kfbsYa+7p%c75%be_9Kf8|1&NeNG zx&|q$;Y5nFO^b}t`GJmZ>v_vWDs!fJfr~F)p3&KWpBii>BjM;DnSlR7|81c?EB`bGpP8*C#&S=bijAH_NTah>-l z_hou742SCK=(;@iSsh(`vQ~2%6BikdJtlBhbaac@#jrZMm;w|^zqCpn-7KQbw_Afb z9bF8sb##ymC?WD-F(gFjeUTQs?LyN^6TBdK=EDzJMaa)s(OoJ!ULYZ*E^8(FnQ2}?NT%;k%X0UC1}RFD8R`Kc#sHf#Hv zhBBodsGlqbx4z9%cHOnGIyyQVX<6#nsBFv=badN>GMc<*N*c%L=oU;K(ZZ=wTl2io zs97)DBw}}xvDV92WToRLbd#$@?|3>o8yaBgNv)p&aymL2fI|{wlJhnQ5no4l%b+GJ z%IhvMK%MT=XA|a%5{KT6mlC_Fj1foQ*DFw>hF-x&LPsaIT=;{ISIQWmPAQkYlu$|w>q?3HWR89v9i5GYjxJHk1R9%rJssV#q0GXF zj?PlE&D7J;MQ%*Kq?9p0ol=$!wjKJ6*R8(tswYW5z54Y5GOJ(Q1xV7j#9S@m@N$xV zc6Ay9`1v{C;lG7-tqjMI+U?Zo_oZ&#muw_-bpModMckKcOufF;tu+VDhO*PqrE$8^{PZGF zjksL+t;}%|s!9jom(u9yM!l5Kmn^K~BKBzzEhH?7RoQlMf0KmSro5CIIf)KU;xSl3IS;&aoF&mYzjew^fD0H40p1ayD~ zyG!fnEUd?$wz~AIG5r|8r*C>myTLa6v9PX}#FF&Wqm&Pj8Kr_~+NTfWM#k$#sk~ZG($DJXVt_h2x^16+ zKC-Z$j_x!`KRXJ>06u?A{hqlD%T9=e^#tVd3w9Lo+oxB*F@R6s)NjRLoBFk|6p&?n zz$Q{%`d<5t0et!<|APkGv`-7`+9zzD)}`<1=wbk$zR}T*8*HPav#_py@rX;3zNuet z{D}el`ZeRva+1D<)jLrb@Yc*)7`v;{vJtkq)0+B;Rt;f1focX`uAZLw)4I93AhPn> zx?wAxS9iO*Wx>%s2<^$;ar_zQRbCufF~{c?^N_t4Y0?4;H5ixE>ZAPsO$FPzey41X z=P04@;qr5=z=z1p3td=+0twnQjRYMT{HHiFUKqpaW;rE{H4o1qLv>Y}=P|eW(h_}3 zrDgh-d6IlET;o|3egxk>&L6^e8ZGf?(^A8F z1AOZZ=Z)~4H(oR{nd$NZ4=F8_k8U9H=*9_;IGx-$p-$v4$4@?Da;lkIYLJC*}{s0TY+{v zhFiti)#$BXGNk!RUmSOgC*EQjCxz|MrnL=aUg_;Kop;`kuo1Jk7^2?RN7~kl`^A{p ze(?xCo6r&T+;QAlaZ1GrQNy71yIa6C7Tn}rtN*3ZhdwQKf!?b_b8 z(%XBw68EkhUW-uKi9yxHJYf{j zgO?k^o&fozDAmzq=SFJEc474t&H@jM<0z!os`3&Md|TN6fpdt{+;A4viYQlkpK2i7 zR6BIotO>#!dN{L*#tLT}wU6hFt$o#p!KYw;wl&;~4tRI)q~W{)&L$32*8w_dJfjZz z40Ti|meqyWDeT(7ndfNAbE7MC*2^1ows`^@87uG8IpF@yKzOXrl%ACz(|1vx7M1k% zIXdwIftU!}8geUr}4^<6r9*AM9MoHm@}>nGRiWa@+pWn>wfKXqcc8HCt*9OcGX zzjtGwzWo~q^c~#5JYdcTVv@LVLEi;8h2)%MOGVdItJc9zm}~L4L;{tpZU?ICDO;P} z+|1xc-B)lcX;;B_#?$pYiyU=)OhZ+kdgmLdYGL%AiEhye#ol|2-8Zq#pal)w*wdO; zbGES5;@RkOooKv_Xrt?4r<<)hZMKDjPziG#S(0HVmWyFmPn{T=?m`^Rh1H2&!#hcc z-GsQ8jis)#@*_I!0O|nhos|uMZUKm4z48IAHH~Hio`42B3>8ziObzPxHfw3bChh_* zPn_ISv#vQ{t3O;UO+yw*v-QvDS2K<_biWW^S15*Z_Q*02TQEkP-K-bO8y&#iF74Kf z-L>NGVZGQxEB>C=i#^2@1 zUZ;-EqQ{JVjM=$P>_vpOQ^RTYnTBjE+i1I;N3asWuwcDdLa_U6nOH2mb@#CWv>Sk> zNW%`+CsxlEn1Sw6&3p{tuXD{hJv7*6oo-<{nDM7t9rZr!bBr69TLa4B?RIGF}1cKt$R!}V#FXwwXVm^sPTBZH;c z>by7?;CShJsju_sA^>%AIDzf}d|n!zWoROe=GVe@Szh)yM{nVk2$Mz3^kg4iE$#oz3u-a@ve z4q+_D0YG`=j@S2SMQUg!Xsw5hEbL9xhoOJVKp6T^X<(6y%Oj3{3{YoVvd>^^Jyc|2 zo!$+zkVn7n<&+q}Z-YiJHs|PzUeCf-*#_k}7W&odWhuZ6^%l-jX+}X8?(J`9arjz2beCBBRx=^TBuvJi_u)!{fq`KPV@ zN79*oscizr$nK3Jc6_3Ktc>u6jv1BaEm?LyY2WIe75{YqkEDO%wukATc@Ll&lWF3{ zd_EdB*v-;mB1=rGnWZFB9{hp0j=V-s3;n0tMGc5xXE7VsM+H<>KVt=Po)QeTK^h%( z^tWx4&}!C1Akx|h3}FJvKWfTB3lDn)I_$X#syAyk{RG?>p(y(zqpaQkn8X*+RV50V zLYcK^9QDo?yZ+3~G+o`7#vzB%lA%F0IZ9zkvJ@DsH%)9{h6h(N7Or~TvO??w-qeM= zc@KrVw`GijZt-p(Uk+F@76awYI>^zmyX%!dCiQ(D3j2OeVm)i=iR7?@7Ixi~vm-YF z-w$|L=KVFA2R{a;%d3||fDKqMC{hJXj|41|YI8;5DZ<`9{Mn?{-P_QU!!UBJtxQ1T zu6iE|Cy+3JLr9K$(M?NDdq+Jl&&XJfBO40pQQflfxVQ#O(w$5$9sVVT(`*T38rD7j z=zj$DC{Uk_3xjg3h8CEB1yd#StOJ@ahI6hj)6c+6Iehbc%^71h)gl1N!`xz>TyZgq z_CXOZ%%r9-+A$&Kg_(0db+x9{%v`_XK+%M;2-S1FGZzHw6b=B_+;{}(T^>Pdk&T*Y z)kHSSbP!os*+P>|7&U5Z4~32C!~8Z2%{|~4z^C7->5my~%sBv$ENrKq!QDIpE>p5= z)sLJBJ7u?sUtw?`t>nIb)C??gqgUd!PxJo@{F0H3J9YW%8SUyG<=TLKQhcn$u6xt@~5T-EZbm0`NU)fy#yk5 zI5C^^!d!+_=x|;H-Q(Oj(_YJemud3BDm0%QWzWEaM$ON8J?6@6izOY6HDBEeE{Pnc-pOor`>i#_;z7fL<8+(-v$A*#Yeob z{|I)UbohJ`I?V^L7_wrl;z74^4FPM{Hm_-j&1(k;sFN`-PqLdmj#`&jHPJdJaTx-J z`E>GZzTp&Yh)ps1ew#eP=ZhdNc4njntM&iD7PFjxzlHbHU*q^o%X5_uW8_Y4IUtHi zEm#wP`>6Ll$D=NkU^T?O44v;p3{03YMjN+D#PCW7Vt9B`|Gd~T8*!O}foxU7SQbIe zn&!YI%v0*iwDY28bam`vI9V>pF1OHDr!EF|yh)QBRC_thzo(zU zQyxVAy^7dnfGcb;MBu3Ezi+uIjiv^!n8%nt$f1)y!1nlI3C=|cnwkgUa>E*&7(el) zP93pwvGyo>6ouuM;%oBJ(xvc$z_4pB$IlUb(sG%JKPz4oZSX~LMp@_?H7DN$UsL<; zdtdFA4C(>YlLl4Kz-FXF-cU=bJvdPTs@nnHWUbK{CbTF=P=Fu+-TvK@x+V%saca^7&J?*mVOy8UA%?WXX__Rznqg#$5W!H zaaY|OYZi+*z_55hwzjP)o=t*}=wDGI}&uupr6f(KiRR5W7_C6a#d z!sIhfwu5bC5%yQ;&Yypoo5Njc9f7M+J>bRHJad00B@ zarN!7t^;*CUtD5cPw~{zgOC{Bn5lYP)>|=pbWk9iL?K>7A*OTDw}RQ=Q=k5EUEBmL z+UG3BBw>M?bVO)ys`51EnYcrL(efG#-v_Wtwpd_piZZ>+Mzi1hec)jY%vl(~!(!SJ zttAkBZva`| zPqip;Rj*5Ig^gyFtF{qsM|LE9%rr-&eWNACKUH&Bzh2M{p=(}XP^Dh^?g(y)Hp(U+wkSs(urL|zYj`cON4pafgG%);wB3$J5l ziY5&mOzwO)%6j$73DKO1MH)g~*?=%;Lv7wei%HJIYU$sz)!u_dd(Jp}^FWXuU8V|a zYz1rRcsgLKfHMY361Er~sZmHPqo*F>i=H7e6ib3_m@#K)hc*8ct%p^Ht~{j`*SklVr>c7doS`t~eJWa+@~z0E5AS zksM9oJwVam)rrJuF`YeE3wP1P?~Z_FBd9C9K#_xOsW-wsHmEnk0~!N-17h1!$T&8y zH!wMD6!{>9M^T+SdiT(Juoz=o+N7@Jb&QOg+H~`Uapz?L5RI8}Oac zE+Xm)$IakdDg1^tL<`?k_-#tZ1yJS4rBz94(oqg`KZh-UaD~rV;ahZD`XP@(!=Ium zSWj<+kNJ+XhzMna%J~o?LAzH785(oS28A%2j{&iOn!sQUJEF;HH?G2RX-wup$n|Y@ z&_@j(k37ZSxSJXQJ@%;A`Q;WZ?rilk<4c6Ye}7 z!I6N4+!Bsq9(?UG64*xKg7dy!aB^{n1feqkJ_Z~3Nx+PsJ`FDyFq0d0_Z8kB`!MXA zDB-1c)r*~uiOJFj<`bE6!OWP8;A}5=%Sgn6_^J4X{X9gz&-Z~PeUdfkVHYUr<3UJR z(-SHipn^=}WUKzMfr4M#j$f=4JlgXh92)0~@?v$I6;#;axUoZ}OFXQGY3xGb?aGH? zAu3G685|R5Y#jKD6p2PL!hsBo1n_O~QPgBA@pg3k?wj~C2%DmuM)=Ezbk&Z_V#u+o zHp#z}m}>bX-8u)-bz>lXyKulK=QK7cJON+iwN;Eed{Oc|2L&_5H*IKrmvlJ!MtlFZ zZcbR{+e{C=Y+G0x%GK6^Qo(lrs7v(;Y5ofD%%3r>yUDafWqH@6g&W5@t-KmGL19o~ zp({8qAGY5rylLJDPzx?TQe*mrW7Jxn3BJwmAE%g0ERTPK&qFdR@oT`y5sY9AZ3V+4dDU2Xvy#1nVO40)6Q0}-lwSoPky-?AjnU4FMRbNXwXe zT5l=)$i8ri)O~zBFN+*vBG&jA=(dRex_&S5w%&)fGqTP_0v~%wNdJLNp8^i?F+DK- zevKawCJ9`e!P{e|F@y=UHe#tqE*Z1PRo(g$nP&g!8Z6?SMzrd|yT$h=_%XDUGeJw> zqzPnZOem8eCOM*me5OJ%;0DY}$PU z$Pq%0XqqF?X`wesTyYjv@?&}G4wqQ zC->sH?02Xw{vAMr+peRaY4`~J1_5=tkOM-$MM&JSaQV51c}b@rQxXscEQ0i;DERw2 z>ott}dP)kQ;7~RgyEUwy*7ob~1=xjb?QVUE!&2DZ(VzoZ$sIk7aV#zo+)4rqo7ADp zQ!MgKF6OL|lK}z?sb1E6Q-SN7tkVi#kFS~0D~_VdvdkzH4Q0`~tvFf_;jP6nX`-#w z5fV{==&BL)hf{UZARd#QI{7f{AbYgm+;y=oHZH_#@-^&hR8`7gQnKAC_^KF z9Gk$O88l71Emw1Z&>V*$UkgPmx1oV(lcO;MWEYK0McF_u9ADE)6)dSZw7!OYV{9Vv z>B(r>pmH^e{S50htI>^mgl(WEj9s7C_>Li-pQaYZWBQb7x?#|VD(agdx6$2Za(F(z zhUeo~bbw)r^)XJlrxF>N1tB z7F`b8oWwu+?VSBKIrG7gaRA`&w{x>z_SMl(+U6+xjV)gLkE3{LDPojlJvuQskQuZX zVFS!zkxKrp$YYNER9n3^Eg8*v&^mi=7N+0DL$7_B#eJvvwbVrpOL^2hQEvx$jU1A98yhuZrX@;Qu9beZ31_{(H9cI2jT` zuPd*4@T9(o6aPPRZv+44crX5cudAO{nax8tc2-ZLR_lYd!x%-2GCNxJOwSHwV_jQn zoq3uO#Fmi}YY=1>7F%qw6I&3LLqeC*$dL(C`r@AH z*Rb?z-L)@sYu(hXbyIy0)~$6|%%BbNXuz%2y=>_^`20u*!(q$mr_+wp+1QF;&NvT` zy3D&?hi!TRt-e4L8Bqg?jJoX_cna?B+Pa-L_1x>y-iXMMX65zvW-1)u-(`}D^ho2sM^Le;>o|ei-=M6_TB7m_yjEZv5gNojVhk;iH zCXV$)b)cF0v~c1M9G*MOwpX6cHec7X0L4%(I4H~z8)`YkI);{roJ9e zjz{Q?AES9%??8)WtQOHJ^XB#r5BFTe8Jb^6>I%qx7;~qEx|0XY1I-&YKzdkDswXt&~tI(c5=}5D)K#*#8#NZ!yv%dQ$HaqZhFD=Ws(8<7BbE#lqQP zjCegkT6=4BW$MrSH^JAhb_%C#PJpDi)1>nJ_*l<_{GL~vM_xN!DM_BkHy_UF-3xOw zq1rd+ZWznd$oGoa3Uv6rqI_R%LO#t!>-&?;i~MpY2_;tN&qzLI2(Nil%g}yYChCbbId=_4-TUgjoNJtb68izs8;J z&P6$$bHJB42b8-fD0kx(?!y~@_Z1mG``mMl;@vOASH16xC4NYjoo>HAMAt`*LcPA> zy0~}6taWGm`n*`ud&`C8e_y))i^~SyE0JYfpYVGn-CIt7kTkIu^;Uz2oOjQT&T01j zZag5DWoHah+y@)+l81h^9gq)p($Iuz|2viY9loM>LG{L}*HKN&jiMFYC@Obv=$GC7 zW%@2gnDgx(^DlElmfK3)p;y(zbn!RFJ2`dD295Ol#JqXjx|zpmTEFAsVI>}TEnp>2 zGkBJ;i_lF7F?cZC0Q{Igg=ItrGLFCgLcN~GKu3Rts+<5os z8*Ig``lP;xxO`p73Qw|vcVn4#;l9lfHa`8L?Ox6|x_rGE?gs4i6*nf*LyqmoNk=U` zs2Ay6+B-L`1DxhnEpMV_ZCbi}%ev8YKL)Ipa_B7OX5E+FANN7zEz{!5-UC>+g&P;w zSAF90OI_lA$xmM0pmgpHI#hhnsm{NpK7B&t(+k5>*k^@D49nd*RF=2Qhvhu4VL<6u z9`-6%cU^+)=+=IxP-j|nM!Nq-)HWg1Z}b!&uMz_uC#3uScqf6ciDkX9)YRuS+`-cK-j?xvt7$dHgdR2Sdkeju zPs@b2fAX=RA@4q-7w$lWBc4M9yN@Jv+nEh|gg(9M6RmLbNNYFN+p_8e z;686#>9tGmI_ndJetRaO;GVI^kaW-Gy-Cjqmiu-~8GsNM8GxK^DDdm^Jbg`NqSMvt zKCEeUNv>780Z-_$^kL0P?+ELyJ~T+*0see%)^1E|G(a6`ZLX0C#R1`0c^#QSn>SCN z8_~3hM|OoD?{)eh&z+kS6J3>!t$(7LtnAU<35+iD(YRn^hQaB_T{YOT6OQC4p_POI0oO^AGVrBU9$$?+8-A2^+Z0ZqIK(< zMP05Hb-mYB<%FUBTZ`+qw=WuOulvnqY^zbCK`RY$G=RG}vAupWCw;eL5ZJ zy(x^;l!4xJD;w;l!{np-D%j@_9sUM0@|O_9%CqQGx8vS-pRV)W<9{nMuRFV;>CKq; zY^8hqX!Q3q*>|2dO9$q_I`NL`E=^0b$)=bs=7Ed*{czxJhpW4^Hzq^xs@uH|X5nAI z?ka9B417cCjl}?*u-#F;HDOm9nkTz1p75h_H_w~J!?2K1Mu_XL9xKK@Ipt+oqkFs- zHyM=I;Z@llFTe$-Ys(3t$BUCG9Nv(-U#lCyK-Fw3?-19*U&+AcjD|9bpC-&Q@%boXc!rXqllcx7*NUxlGc!1wnbn$@`!f?+` znB8~41-s0iH~tJ?fcNC)eG!UxO*Z=eyrB&rnzG^FxQndU)^Od&uDT(2oNtwb@|u@S z-TheyYP4;Py}Ab~bl(h~;(91e*|0h*S$uU0kp>kq+FHhzYp9E z<9a8X1NzP1ik7#BxRXAEHXeE2hd0`I?l*?IKat~UDvw+?`Uj16_$7;ua*ZoLmoqfc z%ciAqjMwk&?mzw3G(0x$eZP$-@H?rwQ@XDT@9Mr_hmT}pYloGkJIl#x)J6;EV>gW2M2~4%*Z?2EBjq46AoW9 z@d#evU3_E@^O@^S57)%kJ>224sf#l-6L;$R*wij=y6u{9Uf-*xk1FU@)^N53{Z2UH z*uKWcdtQ%R*2A=qdw9_NM<3Ta5j}pDZ|Gfo=wDc)-+RgNx_g4}oDaL04BhK4Aor@n z?%Lz<&0iM~{kf6eRjRSmy}jaeZUwyKE-dfxN>ESN&!wU2ru0V<=%)3u7TwIa$^_+C zCREu|`gEzXpQrL`6MP%!LgfA=i`m8{DU(_e{%rxK(Btbx)A*qePYCuy{i2Q>TOA(2 z4M)E_o&BtjcHR%UQxr3#XzpHAaY@Xwh;D~>m{eTg?G=S>8+I?c!+LdmH1BCOU9veY zCMr(zLXyHVKPpi3An$9rG+Dfqu8)sRaP`P+qjZ_nHZGssHb5>&2LBBNuGjP;^SE|7 zgF7wyn_HjW@@d}Je;b?q9 zr0?Tc4#Q<<@Nvf3}U3AxN zI1XLXu-GR!j$g&IV5~xVmrF zZNNqo!u`NMZka?MKayjIH{g!q=0;9$43?OYfTsQ+=P35Cbrd+#6a^XvyX9$3{X@+R z4LeWto$tXFf&0drJ|zI}{_?V-w+t5ZYH4~LAj>a36zJ}h-0au9Ig7h@3??M|uGZ)v z#m(b7NM*~5&-zn5&i~`w?~MArO9SZ6^DZ36@mv2nSOJv>Uxe!o3ZPvxRD>tvB-Y6oA?=B-2J47 z!=L_k44`jJ14_DYF*)Xjfbv1WLS+0W!dTwW?9~HH=t$p5fPUf z{FJy$esn8$(d7nc$8f$6TE3y@P+PoITD(9!Bws#*cL!@A%X-KeNyGEyl#z~2jvEqv zi=6W~Gd;weks_piONa*8Cl-5L#nVaC! zLlP!qk7#0^Au04#J*^yRH@jYZ8wEC!Dyho2i@Q;DBZ+Mk-$*o1-MVy&-qzT zEw&1gAUieFdu)6lnrm(>9pczDxT%CTjczJ2HkpysrkPD8%PuqSZpMVQNnsOrR~o5o zQr(1YrW>0Kxw}lW4T&G`^-UXCZr0gMe49Iyq%m{i>*l4+yWH@k z+$70QDokQ0;*ZxpF7Z!fK0y~wj!c%=W#sczN!q@;Gp?C@^lOivt} z9G@(SzIAJIR;?RbOMV;wb`spKu$@%5OMG&O8b&F$Crf7QVa4orgF2b5b6ZQz6Bo9T z?6%If;%wX5Ryy0_HoRRFZQoXIU74*VJ6uf{Z6O~(tCJg(CA(E&D`{-q+***>wo_;*Or{KWR@?IpW?W&0tiZeQPC8r!!)b34>` zkn)toj*{Lny`yAy%i)cRBgZU<)vDeX|+L8|Yq*qG9sBJC-G9fvRv zOqIY?*GFlplwC)i9XdORZ%S#3B(<{Aj-?%?ykq)P5}X>HD)p(6otQ*ZLQ^C%B{795 zzGLE3lKfO^ggmiRawo~{6#2A7Kkb_){%N^sOzWMTousl;1N-Qw8=scur`wpx=DD4@(ivr$*uA;C zw02MIA-=sEdrNcg&^}Vwr@D{S_KEH*v3;}qN^W1@JZa7M?Z@oj+u56s(%xOPw09Xa z__@mGBs#A(UxNGj_g6afISGF*Omma-vh$?5UlZHpy!1RtLo>qjO7o;VuQE@n^IG$y zhFpC6t7&1L!-csgsn3(fyk=kQ+rO*RnHQKZmHGAg(wI-3+5NJ356(}`m&ksx{rYrd zzC`E8=SyOK(vu8H=W~TUrMRcFr?yT9>wAiCKmUFb-#@Xx6!$L@LFaRUJteqj zcu$G!8QoK2dnWdjasKFIfZiG03!Ec51o^Z}ASAaekV<^hod;f8qQ|5z3I7Wfv3e?ee@gcd{= zNNhoTfinFIB(NZ~Kq3ob3ncC`GYhf{B)_1rK%50-lo|_~3&eMz??5RobQVhF(CDEO zJ2ZYM=E`&ymKI9%(Ac38KQsZebBJ%D1Q&)DN_b&pp~M#^7BVXr2C-ZiTPVqesfChT zn1fkfSY0T!h4qEfT-btcENm{6*24Be@hu808j{GO$RbHE$}Ez?qT(VcEh;aP`l5y_ zi7t}(qU0jUEXppD;Gsb(jxCBWlH{WFBFQf*^qAR2xkXZ5R9Pg|MYToJT-54GLW{#k zOXTS2(Goj4MhC?gCl*U)ah9jvi;IiJSzKOBFD@={3B1@@ES1GoHW)iB$d70aiyg+= za731^mX1jugVGTN@?jp`I-1w7k7yqu{v!jtS9WClNJ$)-MR`?JxJ0A)equ0Ixc;jgqDPtNOnnXNtX^T2`!P*l5&p@FNrLX`jSSE z&K{RLP722rkCWPQ_2Z;*TyTj*m&BGxd`WtVWR_%?NN!1Ci4>QVmPmO?eTg)dG?z$g ziSOSe^l#CBli0r{{*9&|pFCc&$LEjdP&vMMyg0{~j+e^u73eab5V)(Ok~tyUvx+UvEtSI3AU~A+ za{OeL7p03!ouyJ*T3JffON&dzSz1~um8CW4*3!;W@tv4BQPL;oPNb@(z7r*JV)8^u zotQpRawqmZts_Z&Nzz|xe~F4h{1)lt2(`I7&68RuN#~@VICSzzaqvrB2`8FB`AfehhGOgNVx~S5B7d$u)iscXA6lcuI1u`a|%vQ zN%QdLlstJRPAT$Q^C^9I>qv6TB)=@6wZ-@e;PM1jx;nmPe%{ty))U8;j}%9H5=N|F zPwABOS0wk9{8yy#l@hVPTMB0v&lcxw-#OwxCvc850w()iBlYi^79ez~DPC&CxzzYB z;~UatrU7V$OyWwu;P}rDoGszABWFwW?AY0A8Nnp+U6TZ)zH8E+gD?(amzp>raj8iH zf|r>LehQbFBEY%Klm@&GI~-xe5)v?eJO;mOLV)mh-P*#gEBgJM_&Jg~C-7~e3>ZQY zT2VlcfQeV~R~koSE}m09M=Iw8&c)w($!|&g{L1-Uczmn%EvcLzD59%tT9yI^Gl6X*!MfiG`Gf3B<}{uqQ|?jd{d5v zO$SiA#>P;lQ>M*LTq0D!+Bz!xzAegY7VmCFddI#**K}2Tb%n1onLd|^a+RS-+U0&g5TaLit9GFKbPU2Q4={#sY# zZY)c_XnS3bGxbL>+U338MW``{uQ3roS0{gsDR?@lNg`sB8Z3IK33^cgeozziy6#XD z^xQE+N8KS*KX6?K?TG21kUQX*PDcPOZs|4k#N*dTrx92g6APi*PDvRjj2-3<6_{FXcUp6 zQ3t?EsS?}*Wc7Me10@uq4km%x8rv0rZ^K-~b(p0&{TT2>> zf~GnS+-ia-g>E&`TOrdZLuPL^1tsgZng(R^Rzs22t)>m=+-m&lF#2;7`#Ej>xk)J* z_zx4{?r}0@D)*{s$^?Fi^p_?NDE!iN?qXr#d8P^zzceYhowTXnK_fFJc-Ju3f4d3X zPDr<#Fd%Zfi2>rbn=HV&-BbXz+f5zNxZQLBfjdkDH_4GgtW|~EI=h^>Hz20hQdINA*6eMZDPNs;lDO1 zRT@R6?lTlg-)FM-AJhC(f4F&lA+61+`)*f&(|Bf%*E8TQ8F|p;3QV(t2|R=}`k*O3$dEp0 z$^f|40^Hb`-1vhgfl}&0lLlmQG+=@RfgnL3Nb(QjsOHs%Q@6JII%I%YdQxBmvQ;pC z4GmEcGEp!ojR`yi87Y_;AYL#CI3gc1&4)N5A2OkbA(Ic8DrD^;Qy<`_#^k0SG8vR| z51Blm_>gf1OpqWDBnSjaNka-hY$6YH#6E1&THCvli2-TsVM8I(hYdxNU0WO!Ad3&1 zl1lUIkZ}4^|05>+2yK7F1dD*8X#o6>n$V;4&r>G#6ds0kQmC%WjXi=AqPjYAJ-B3T zfP@{zal9+d7fk`O$S>0L@mcc`(?+@D1~EwbR2qBK_#b2ZA2W@|JkmEnCLT3OVog74 z;BxcjQB#4eK5FWZLLx#UwXQ7=+Sqm;Grq@JnI1PmK>2Y~0Yn{B=Ov`j6NVP@b#T3^ z>(!|`>-SSpos46$RGo87K}ika2@ZoNOb(EL!Z-l_N>3pCUnHr7I)qAasugHGR1$uY zaeUIm0f{HQ-l#ueLXd?gjRPn>X{vzQlco-6banDi8svfkazOz(@qPdHvy294urmfx^PnqUZtTa!Vj?SWV$xx)udmsSc z(}uzTKW)NKa~68qv;duFOzK&<{%1_!8Mx0FibS3wG`W`u;U!c3r!BHnnJb&Tg6B+) z8mqrGeyZv`Z(W`deOL2a1^Dv)=;=ebB#2}_5exTt`s&!d@mcn_C=TM(D(r| z@UjUGkoZBNuZ$rIf<|~i3Eb`7{L7|@)Op#|USXQNVp@RqE5`pSCa;<>Ao8k-|BiX_ zJCg=verNKpG5cOKB|!N#Q?JvQx@iMCbrbwO)Bg851z9it4}BAGi@1q2T606p5-G7& z2$7&V#6~o+|Keoudy^%o-0w~P_XL%C-PHb!;h#<5zdaI;6y7k!Hz3omn=)kMbrWhZ z6C0)os5XrM4>OzNbXOj25A4uP^9xG6Qc#`KO2f<{%k6G zpr=|U-NIYTK)5KJ%^p?rC z>DRUi{Z+}fsY15f#;0WUEmMDs5pk6U$plKtwn?>7O8nJy{>sFA+oU>lSH~1PaAR+q z#M>yr1*G3LSwP`!<3p#g9-Z1dwBjAp0IW~d!E5zx(*U&IHpO?|qh?iYzim2z;5#OS z^YA++r54@jif1Y%yRtsRe8} z05@RcN`glq69Jo25*&$ur0`Fc+43YW&?a;dcIR{FsFQVIqL|KTP5uG_L-4gIrpFH*G-Z9|pOg5LF>&2n4eL zTv#yxW=Rz`{$`qZZ~e`*|E8qRHtCnP&vrCU--XtHA+Nz*XhRo5=D%YLbeHoTTmB9t zcoDMl9a~cp9EpH8ltcxIfVY&4TxessN?vG7fa-;|2Jl^E83IXv$Kskx@e#t%dkGU4 z*~~>&vKQGLpm32b0xB2TDxi6hZ2{UB*$%*WvGreUC2+9~0m2ts=i655-+qsZQ|tG= zj?)CbGZ)*^C05Fp*b1O}iOv6C)D)wp&i|J+1!xTY71j|-Ut+V6`Af!VX>SyZV+dK$ zFS3l1FieaR&%!LDBn%UyB#aNkBa9Ej!*O@1Eq>o}Bi2@LU^H*BrJuo#Tx#Q&a`;_p zGl24?Hvc_LNPQVX*uKpAcwaLVw3(ples6@d@jXkC@Z~mgxt09owg4z!ZYzN1<+csz zTyFhWSczR><5%FI`90gh0`(}u_~kYM$Xsr-0E`_#{c_t-S=WLvvR=@M>xuGun+9aB zw|PMEdg}n{Zi8@sy^Te&jB5M(WHM?qKOnjv*Z{2#-e7YoY<%DP*3hsuwsIZddP}be zX3i~E=obH7>frmfP1Wc`P))6|X+Uv}EdlE9W%zCu{xIIcHcO5CXQx z>Mvb0wws98jOL9TnKxOAgl=*h)%=;INc(3tous8nTfdbh_!qYH3tIYKHC3*$DMF-g z)Tw&=2@~um)}Np^6Rz)n%4saZw1|xI-6CNA{uisrL~P6pzY$|r#%u@RyV2%oOz}qR z0LnMon%6X~KJ+7-8>@vKde5JhAg{4HahnlKkygZZ0Q6XzQ7Zh%IzK`OmhW22<3}4%aGj-a z8Yd?+$A2wseOEz(gYt0Q=9m~9S{!;iKqX_VfM&+FGq~&8cMVHd+cJg~*N{uQzH{U}mbN$+JQo37 zuK*kio^dRAZm8F8s{_BZ-BzQ<+J38z-NpfVn{5Mpzi@kcSSNG`r?oq543M}(Lv}5S zKPR4_+gi$sf3!v8cB1O4`hITxs3w1I^ML$+SU(nlJ8kh!{G|B73M7ANK!zQp0o6M# zML`Wvztc7bRMA6C(8~?0qKBHG*Hl$PBQha0jjo=u4M5;F8>Dri+XmZ8pc-rQcH06( z+(!28hb_VwMsBlF039{lSKR*h>HtuUP!C2zJygR(FxNQ%|3U@bj-(o{Kkl;8yBMvz zY#!h|Y|}-iLebWW2ulxJic}xAH9+HG+XQqTw*E(49n`pIZ5>rDKWr-qTMyedApD4p zqEliEdKID%N8O?>=p$f>dBi5+qTyBs8Ha>5$jv-rD{!liXkdK#e#BBF`-sgy;*p>N zUIZkHmO?Cjn;6x_yWILCmLmLxRH=BErAYZMThZ$Za8LnvNe@cxE?ZYAB&dM9Wb0Ae zev}#dm<>FJ6ubioPLbeaHmqD&CPE#1Q5U5CIRWY zZ3d9L+vWjcJ7-5;Sg9Rb4+#9Q-G3 z{ZAXjLF8T=1vvbGPJi2!x8>h3Fu$>(2WiKHHl|)j8W!%c#e2}X$2I`%d*0nm@d4{R zz(jw*HUXUn-nUcVy_Pa6sFB|M4_XReGdC_+djK=}bn zU_xXB#uw5N)1rE>JCOAUby|!eL@o#^tlBy2|1~SnuWgF4Pv2)VfMCG}9%3RsWYf&6 z%)>UTe!8lSU)v@Yf%|MwXUlzK7&afWEwz8xMzD{uj;zm3{60(RRXox@@vxk5{eKDp>VYQ$_AK&!K@7fB3T;;a16DW_3itu zkD27p+b|%Kw^5zu%vGJPnR{&>P`cNa0Zds6&s=R0P zTZ61WVVf$2mm`?!(>C)A@jh!i&!Stlg|a8idcyR&LQHB;UPFPyru9w>>5| z^o$MTH}Z^)J%b0T(oirb6uSLMn}-C?Dhb|zY(8m&PyG)`XQZpTN4C12V^7)mQ-tx9 z%>c4b*^XP^Q?>x8|~s6J(DDue|`V8N04Q?{vG%&`_<$>vKV$dr6}_9Cn%BrG4D2`dN)J#E8)$kR5eI^duJURDwqgN%2{%F~vS5r)xM#&6jM zbtK=Lq=OlGL6eaehMrkSkB`YMK4TpQt@NxdV^Vq6)&PxXT?f&!jo~0(wn;$Rbw}?! zW6|b0okd$vM_cPcTTn+^P)EC8GZq!5=&WMuv{{b0&&c>f(CO>B@fZB65`dixiTU!CNe`^EJ(+|(v zHlX#g?YvBF!xjz}>vD5CKIOi@2#!1tgWT`{7ik>-iRW$Vc}&4U1)N%WwDG(xL6)Dl zRVCr2D$MnlY@$lMYi(mKx-Z*|hK4Zd3FGSuF)6)-qnB*;C3L|-1$+$M`j}i_)%x)p zsM=5!4^*Y0U`{9uO2wuj!IMgYS0Jku+o}8y$=pa+Wsj_NJ%?Vf;TH(w1)BgQU$BiA zw7wT?1~T`8%>xQA*doAr!Io4A3y#2oBjp!tRk@gBEzK8f`o$4sOv&Plw(=r9{-SLF zS})qRa$!{=VKo7;Iso5G)=$?4Ua~>$X>d>hFDMBNL590z@g>X12*cQ9BwK53XDv$a zP13=Pyr9X*3q#K=q{(A)vsIg8(DG|-0h8idTLM(px(}{<6BGcd8a` zK^<*D9c`@(Z9yGvK^^UW%~%wv!>QV`4n1UHfJB5u5H(fG#|Ly@c-dB|t@g5Q0Gi$A zI(=?kqmHe$IWNwD+Zq1@GW?2-yuwU=#U=r%S8VzfDuAWj_$w9x%fKr(28jj=f=052 zZq23vg_BvHvBtI5x=tuK=yaG^t-X_aUt1PEJZS>{EDprkPy0h$OC-8vmp)N8KDz-)y5D8erJO! z#9AGU&Gp=JwtCf~AlRvU{9-MbyY2&nLUcz;agG-ux`AmxbY&b>`qKa-!P&rUpyS=y zFl^tzO^*xyf!xuXuh@?E(5sfZxaCbx(T&4(MqO?{1eZi(pqA2zpixMu2|5WKJ5RN% zQ+?G^1f3WSi~r72SVlb^THbBE>Y(5XyAHa?36dH@ByJ^5y81PayVq>I&WiI_8+%** zy=EgG>3^F6ecOhWoAS86w=GF-O7U~|E86b;w+l2Ie zdz}B<<5;HZwguU)+YX@qhHbn7^@jER5!29rSvUf#1t|Z~5-d;lZSEbI?^t{YPNM1u z)#QIMlmE-+e~;>4Z09dHfXsMgJ*_qP5A zH!kXv(3`g0rd$8&MoD<_4)zz03tTi#QWuT$T|7=A7msTLLfx4Em)ul-Z$qzh(7kSB zfc#sw^%hNsTP4OCG5#L1F{V<><5u6Yjkj3xyQZVau46P%pr>EAaD=+r4Y%>(rq}p4 zIj_EH6C-t6o=(WqDGlhvU$+VTq+YjqK;d;;1ccu59KeDj&g-`PI&~rf74TtyERrM1 zI)PDJw&5yu{%EO`FNm+(2Bv|AE6jUBKUt1d=rn8@lUl>p8<60j66{K24I76{G;9h` z{iCh@ktzB|+tj()<@U(*n^qg=f6LMY7S@K_J5-{*gQWZ>Tsq9hgn<=>3#)|*9mbe_ zP+`@xOsOTfIs$hcLDnGaZ`vjx-Q`lTpSr2Ipe+Y4K{8b$-lWZPXfbI!99q5kiB3?% z{ew*b(jUkohDFa0_<9_0UGWDS$0X5L&HaHWi(Z|@_8)ege%OcQ*;ze*ndpS5plKGacwwM(y+t3U|m60SOB!bAtQBOe5 zUr|~gw}lD1dDR71Q*hU`?U98png5H`7I4DP3>qz9i+ZDY~T$@a8Ln{0}^knud+dlh&tfo z{aT_LrIJ|RBBKrpZ`cZ4+7hEJakojh9Z90GZZ8DhbbA3atQb8{XB3yNtuYVkZQB4e znKRVVJ+rWGvuq3NHp@1zri^3R7S?ULPER+?YF3K>Bl{xf-qPE)45+?sYk=}4BPwq7 zLwz?@#=_IdzHJM7(xzGIz9V|}ZM%*sN7~z#dWDLqSE#rNXuWMa>Y*``M1({Tg*b@l zuBs;9S|8W%=_XYdTus4U(||{&x@68bF7F#BCEvKRkG`(@#&sZloJuc*Y>y-nArVAT zZ_uI_p|n13$kPp}F1VV4yQX1}4145F|2~kM?DX@z>|sF@;w3G1R@41u)?qaaFLAa> zF3Wu?GO|nDCUg|Y$SRs&jteAmSh|V%Il9RmC(UsoQ8Yi!-PTgk!Z=c?J3UcWazX~O z3R-TWvHJMNcshK1WP(H|WJx#H9N!%8=5$lEHD21|JL9{e_Jqy^@o(VYfR5atx`8w{ zXlx+O4Z;&8IWbOBvM$|1?wjaxQxhdUF+Wkt6U!5&KCwB`-Jx4L6GIzHc*7_*u3|$a zor%5;#lK-+qI-G6>`bH)>LcpvS0+{_N_Aolu8Y>#n_bbW`e%Fhrn+jmR`CrJ8%k=! z(uUI9ut`;2I@P078}?EEM!}6FyisW*scn=XWm$Bi*hZ3a6QLzOl>dSr^Tt zP~Nz_vD7xMZ!G=~2R}TL4)o}ND=K`r_+fEAT!!2JaA8xaZki)cSYWfrW)j^ju^B1F z+MD(1*k+R2thkvtn>ApzH!Ex|Ma?r--aLg-mv%N6$75DEm+I#A&85D1b8~5K-rii= zoBJk-Z&F~A1SW+hNoZ1Jl0+uOCP{2ke3HZ`B_>H?QgV_cC#l0KS=glWk-#Pl_D4D& zk-#Pdm?fJTb$N7b6z!%|3y)&PHj(%yZJczCf}2QslZ>WiE5XcdlHWv1F6#4Avi0o) zJ(@|aIocANCds_koD~14BtDuV-&*9OW1-QH#(D~|^`X&^#XctSk0n3Gk^HgF$Hccq zU<>?i5!phbTf{-rTco#;%oaINXA5TwDQ!^!ZEVrlLYiB&K?7R`wv^zO;Vn4`w=8Ta z#Vt#q*)h@FmieASetl?l%lekm*s{5$w6<*i3xn}5wSSTNzbG2{MC20^{Y3l|1oDZ- zC#3m_HfUgSV6p@!hbI%rZliZEM>~TQkx5 zwo7a$sqNC+NoKq1c2eK2v7I!xi+oaIpNxM}5}$NFDdkW4w`b|!9%sevogUiWzT=|N z?a3~e++OnA7q=(dT=Ub?`E+4t$;^sSV|e?XxZsJMb;Zq3)uu{&YIY~d?Udh1Z6e!4 zx2H;Qrx0{RefXyOrb=X|D0JsjpekoQQ*Lyp7+e?iPYv|AzN!8m8lD>Ip_-Jgs~aKh zTo(;a4fW8_)Nl_?OihADr^cpAdTJUpHZ?v~k}fwsH8E9EQ&Vu2A(^RJP*s!M)O-(3 zPtEku?9^NjElzcMXnty;hZd$5r;0PR+@q5_rD&Dwu{^Z`x5B4{chWR@E~>fkSOc`5 z+EY6yxM*jpugCT6DHw9V(xa=CuA)$?eeEK{`96rbuQ=V~Vsi+hA(P+K$rLG4?4*dMe zq%+MwT|(2t(m`rj#^YVA)LjIr%x_%qh*0>YUmfdUZMt2~H19m+~v{QrwzUtexjTaoFS1J z(HWAQk(wb54Zk&`JwrM(d^06Dlk9~t5*JEUBd^bF%#`NL)=cs3?BChTWti8Xi?f_r zQkqqsCAC@gS<;@>nI##GH#a*!TMDy_v!y({GFuw6o3utlP0z{9k^G$E94XJK^g@kH zk4~55^we}oPtQ!3-1K}m)ZmQJ42jK1%#ieqOgBp3O#e&?&y3EL#LQ$jz}C$6ObP59 z+*v|9hc(Y)Y-e!;EYGUUlE$poEb-0u&-P*~&UR*dDgElR8?&V~yWNc~GbcMoigTPf zQkheoBegm8UVv`DxqamJhwIvHr?!c+&}XWjk=kb(pONNg+MkimXM(#(XqVJ3lHDb@ zi&Q=v+@0&bU9!7KZkPNnQrM-ss|0sbpp5m>JqVyt_nqk0TH7PJYNZ zs3dkzK}U9v?k=g_)1dL)6T3@#_bjMySO2aO*tNQAAI(Hgcaz9&(cL7rTk^Bw>>k*I)o8cWZjv3QOS_kLm*(y*s&dgf z878}EYxlN`)_0e-ixzitc9Sx;oPIns{8@>7HU?eZt*j#7XC?UA5Oipd@E#J`BejQQ z_Q+DLOUL$zf#&we?IFcI9MJq8#XY35N8oc3a`R7i=?bFi=Sboh-Yc=UB=^qjEjdzI z@*MtiwaG_Yq7G_hA=FDdQSAZcb|uiReJ+AGvEaOw75jkzky>?QuWfw>Z# z8=Nblxg_RH&P~si%-j;<(A?NuiH~BY=VsY#~zQ~OGK-~7H( z**7y!s`HZjGaZM~>b%-KscW)M-~9T1lGtD6UAnNJ6!&vRF$41@JU=?015I%q-_kb!1 ztq&maXXT*UK^$&98dnDt4v^vj&H++BpmKmT4rm@AtpnN^<=$0NUEn`R0tW>TlF&g8 zAD=J$D_y^!wLsbnIt#>qVCX=O`%!f2z|4V?Jur8m6b>vNNG{CUfzmp#bD*?8A3m5% zhJ&&PNlx8GKi~emgb!Aq18Dr<BbkN`GwXOMlv%8Oa9>E!BRQ6 z^o71A%=*ENgQat@?+X(6LL5oz;8D!r7bG++iMi;Ykt>g3xehb(1&My)14_d0YBN$2 z`a+m0yKxhOS5fr~Biml@(RAA($wMS{Ncs@T9a21mE5K27WFc8ntBdNSR*jLbmHe!Q zg-kk4_gY$5UMN*EwQ^``zSiKP&?0fOs^&87Q!!{0UvKP$ZLAF3WJjN!;T5pbeIb9r9I82I%mB_n)SoJUoA0A;QLUq-#RuJbRQxDO9F+o1AC+OBilcJu_JR`A#!GTr z0j+AP+xk(Bo>lv(&Qan!I&idvjxN#*;iDr*OX=v!(Wo9>J6h^TH;$H;n@P9Hr$mp5 z9V3NfipNNi53ZJv?i?+?V*;STV?xJB_?XBsB;k!g$B#)IBS|+OZ|0cnF_Jqb-?OS6 z+d5X-$99et-*NuqBzRo-IEf#ZJWc}tp7?hTj^pCTiT~gIpq1ll$4UJ-XNe?EXrD;N z)*92Yp>%PWuAERiL7FF&Pn4=F@6y>5C3j+e6tjJT1eS)DN_1&-sl=DYPoxgd97%F% zYN_Ow=9iKMx4x7U_6ehy&Qen2_9ZnJ9W-*~nksi4W@V{VmwrG=`CV;BN=i%1RN0N2 z5WI>4O9M+Kq|J;jjU!K;II=@BJ(`QK6WzY8(zn4cMZYBRFC{czZ}v-En2e@1J8ACg zfp19b%*0vLI*dAAdfdjz(muI!viMI4ogy)^}TWCQ=*{tQzBoJ_BUc@O5&_0 z_N`M=r;nt4UlIRT!e3!-ozh1`%Tmk4Syoymm1Wgs96ihYY-71Rv|J*~qsz&in`V>C z<-Qf-*BrFr710&%SEsp5TFctYq_fQTRq=l{^i@J!HU_h~thG$SUyULUEDtW1lvdeX z-dgTfIVAq&f#nif9$7BYZw)e3ZD``w}rfYYUfn(o#sDHf+$h#Y2ni(a#{>Dep=!*NuHMKS!GYlohJFyil>R= zrQ{9KU>A+JiFf0x600P+Dz!>7t1_#Il~1Xzs;!dX>7mml#0Qr@t8%L(zp9AbSyfsk z=hqWom*m&eUuW`rd2rKbOOC9%G)?Km*?rnM+c{fGXIIXa`q|-g zSS`<~o+GVueCKlUdamzW@t>AI^CWX#@jPjqSHGZVQt}%$Nq&3KB-wS|J}>nx zNnen;K#HW)mD&Z^RsE*s=jZu;(*gu9F<~{o#H0Y3OH9^tmLtTX>yth@-+#Wu&L=T% z^8D2KQaZnUzBJEoozEONFLRzWFVGe=FEPZR&7yKv;|p3BNauo>kKfZ@Vq)L!v3x$` zAK;PWw+Y#^D)>yzBjexU2lQQExDQYR%`9GmA37=y$sbvN`95)>DMQjzcwrh`r0Ie+ zO>q1oj|>lx>5EJjGIx>50}2-z3O|@Oj_Q&|ztgHgT~@sV(^XC({?347S;eOLVz`7n_{SUd3fGJV`3Si#v=EDEn)$h9WY5iJ76f%37GhIdlkE02Xqkn5Rx%FFrb41J_ILOK*`IL zO}cIpa|@Zd(*S}DX^j7}1Da?Q98|y~no`vHnJGb*e`b72GKDJi ze)UpQ1Jo}yfy;)ukQ9#8%S`)w^w0N5^nQrLd;BP$J!=r(`>&h;yqcskBRilR6bww;D<} z6)I=?prJ_UdnWunq^a*2iWI(QiUTCLqh$I9levLq@CHNbS#fSK6z1~}4MmbaG^rm# z7Jq0cQv0E)50KyuCBv5+-x~VhD$~A-3_VvHjzi7UT!`TCMpL_y%71Fe8Y>)+MeT4b zs^51l$X)$@E%I0tzHc1Qu<-s3V~kh)a+3l$mz&y^w03lGMS{x@2loLj@Jf-$6^0^( zD-1>ISC|GM5HdmDF-V3?3Xl#NiWEYo2yjA%BDIhqdA&43h9ZG0O^^`dR~m|BuQU`X zU1=y9H$|Ll3`OeK7>cHA@1`#&%eSU$r)a-ZxGJQl2`zbrp-ANlLlH9JQzXV7!2p7x zXcQFjU1=ziy3(Wpg)2=FP`%RaHd1YCy_IWB6+kX@3cr0Hte&Lt6ix1~QINk|^Kz#n z?p&zcXsQ|$BcOvopED;o=&v;E4lOf<@oY_9+NCW2D* z`zGe;W;q+=x_+sVxg<;`oli_A@~U$nec#j}nUv&3=M1;To!HGarnSZ+{mk>kRffXF z{2CL4OkQOuTokxl3h0gkak!-EC-Z(+$WQGxPdv+zx0689P2IQ6v9Y{$()kd>sA2X z768;9F`PJsqc#2`#+by<91{!>%dBwFvQ7yrUg|%n`#%iJI2i~`{g-H_O)bq7xzlj= zVrh*SijXbc%arbs;cHFwTBNmzsUz*?Uib2*vqD{KC{n!ElvF8|GUb%(v2iDdMb~lm zI+MGO?zpa(H(aA7g?08Om^T^nSWEJk8WGFm|A{KzHS==um!_nZkk>qRJyV>_-=hN= z6z0((Z#g=nxxVOF+(6Xien2fh@PwV~j1LbHFI#%*dZTI4TTw$15`>dOTtYuE;UC}~ zJwL+W^#*O}rcB3O4b`4I6aokdIx+00n`<0j0ri6dJ_H4->(zxMNL^GEQJu#1hLq>h zy56*}hfLgNDz`CWx0xECbDPc&mz#v-FAd1tX0m|%ZN|9`A>4NtCT=oG#xv#SC>KVU z0hW@RqFkCcnHE&wC#HQ1b=_io%+t__%;fc7n3xXH|G(T2RfEH(^$XK+uXTQ5nvlL< zY7%me#$OmD0v=Qn6(j;4Rx&h3Yh7;XCmgarF*UlPev4@UysqdALy7kgMiQnxU=sd` ziQq5s6O#tye_{%N;4OwCky}g@khsMpZy_M`q6pE;4(o((F{nxG786$;6mTUd;Hu{b zC&&dSDb=9{Z32Ph5-eN^(*g9F(D{k+LHZLWkWk&2abnDam?;A)F+-7R%+z%8O#aBQ zW(n&P%ad@$&+;U!1}sm)`o!|Yy6_`YLZ|#=Pu0^YrAO%a;>I6m9O5RZZv}=SZ+1Os zHuu7vrmT+OQX~>LSyifysYI=VHi6qs5EtZ(CttiKi%;H;Y3yc0%6-kZPf_3_K+F<% zAOxxh63CMqUUSF?m7BiVP!wb|y?_44gN^c9)93a`Qpb~YUNUzWijaIhr=B`@7#}OF z|4u_86^RLI;{s_DqSL}@69vT51}82zID#98N~R5kYvZ&@K&HF8iHu2QAldI6(9W0+ zz<-ws--YfvLgYeneOCysB)V?8{ZV8-V+u&gcAvhB#@uDHfc&pa@mHLweq~C4O4hWq z)H1A!Hr@O_Owftr4-a+q0IX#h`G1B?-eoA#${GrD)2qE3DJ(Zc+Az=z+A!P<2Kg>S z`-BEo0gby%6MzEE6xtb9x5GNQ5yJAX5W-R}_`8sKPg)s68Iej6xl-_gM^;rCTuJaA zIS?W&H#Rhio>Gm78^1DbH3haH`TO8x=`KSNf7VcV8te58xLY3~3`fBcd6%KjgidP# z+IN}A-CPOYZP*||(2p>%v8+h|7>eM3;;(CgDuv~^Z|RckuCQJY==gAtL!UYf+-)cl z_)kM|N%b&Xd7R3TxRsCKvbf$oSR0B2>T+p;?(t9nICq;8fR@k@L4o-?s1qL{bRED_ zF8I5U2~V0-PotC(sT7eb1y6cpN|nKt1n-dr$Zm+R+}O}ac}i&_&Sp(sO*3~J3OQN~ z#U<4g+_eE8_QasyZOTYHcN@P>r(qHfSHE|g3exbeOjM=ABpj~o?>2R$jk`?~fJTg& zNbhId(f5Rq5hW4DktTj+QfeB%$0YBedH0yYJ?}+ky3&NFj6Myz$515OwJqOcC{nq{ z)KuEI$21|s_nOGP)OW8*0`m8o+Pw(VIYW_5&SU|(oM9J^J{K~tWFu#y_YvED#$Uig z!E|)5gl3=X8{me1?e5pnESR<`v3*A8LDvS3z;aFDvb}_`gTxrZdfqs{>6y@{zcDq) z`fp6*H#iJFU_uYjng>ke0m#e)CJUK+z~q&zJz(mPjRy>cEHb90TyRkFKWGBP5_-_B zwHM1e!tjHb@S&Si^pr~8h8E2SO-rStNH(JgJw!|onJA#U^+Va+G=hV2v`}||U{?ut zl;EbvL+*wU=)zftj6Y-&C^sH5frpt#59_8BB!@D&N9empOaTxm8unLU`t()N=FZyt zFhQq{cRYmE129yicm5gD_pqTztY|2FOL*7~xEm=fH$>Vn&&U^peS&Z+a2kZeD8XSwJkuT-^2pX>hN3%duTv`H6wPTZfD|x{-&ZX|wLE^)7Xw8iC>#dXSnSh zMbcd*r1Voud!zESsX?-RNZ>iz`J4#>BF~v9AoiSz1L#@ZL8HTb&}obwYJwhWq|Y&^ z33>_U46{DPbPK*W~*U3$ClUyg) z@lA3Q9B`-sC%DvrLp{MATyPkZn#EAV81N1r;soz(cAxCC*Edw30yi@RiLouQ+>Ao3ej`eA9H4x&a)1 z(~O{wziDFMg1P}re9I)iMdkD@lU3>lklSGNk`*pjsVH>=So@Z#Lv4J^w3WI6?0(Di zpmHP2NU0k@?AKru88*BdK%y%Rm3SIyY~=f<`5glIV*|fl3&N!voU}G1B%S~7n8bGp z0hg=baQR9Ohl^MGLu#`hn*I-|9{$cCB-|o`5Y_W{Oc!;7@0bw|x4A@-h<|r$HRbOS z!tZU?wowf}PFSbYnM=6P-~TN)QJFC^WQUt%@Q3y zE?8`NzgMu$WecgH00Gc`0>1tZ@xar7p?XHwq-ru%YGr;zD*nh6aEd=NC7jBSOckg0BU8uW))~EK zhC5~`P)un0@`)dqp{n`eh1E>tTgan^duh0^W(zg>AE34T15-s^dStSC6ukEX(+8}L zROabGIMtNYk2EOM_)iIPmrj;&&j&dAV-vUe-VaUk$0ltn1wR5N0T}(r#MKxsgem@n zNcxGX+Dh#whF9S|J7&~AHWeIh)u}uI@(I(xX+L3#Pa=s}3D&ZcsHp;e8ekFO4i_1Y z%?M{aHc=$G$t3NUkSLpcq=w*ye29QK6j?v4HCSKL1ngvUMWrwX1r22#i1%iMA zL#6nnX<=dKNz=8l@}y}4^3F54%m%xkG%zTZ>uvP@oBmHpwx60IP9)+L9^eZs4|o-v z`U74Mr~iOA#)-Y#%e>oj@(Ak1IYWClP7n)$#(bW-0i5{Fr8*Jc(^7;_=0&_RPA{UD z;_!tBFX?-lR8KK1>l3*^M@_NVWDrY4J{u5qIp5cS=W%-@k9y8SuQ1}};lWF8>~UC7 zDgp}j33g&HhW^yV3De}RAo!G(a1pF2E8$8b$bCKB)kBYIPNEg@y0Eq%@VLu|s?{fM zjrBdDcM|bn5aiSs^dddE3W$OoB$7quspvBNXS4cq3JZU>Tl@ zy(B8Ynt(O=t6q9b351lD$M@L>x#@@4oYRM&7ghx85Xq?}fIQNDpT~Vj^i`i$k>wd9 z5_!Luct0YU_j_EEq#>N#4naV{&Vz6S0vw++(7$wo+V=fk2}STJ>x3uus~(R`d00Mwm9-Az`>SdJ`2IT=|{d!tZ zFB#)Dv8FGR!Bf=aRTEeq1+8K@l&ST8y=sg)!(L3L7m^VO650<;`Byz22l`#Bx2svYQ2zrRIjq*=b7q(HRgNC)p*nvF|VTF zN4yjTI6Vpb1`v*beGNaj@WW0M5%a2OfI)d6Hi?T?!sB62wa){C5}|;l4xZBois*9* zNI-}W%T!l|v0xez-Nd%QPf`VWG&!0vuZ1(?(NyUqysm18L3uz~&z=@UnV_xX%bI5ClT3t}S=yKa3`;e zB227(z=OiJ@~sp>9Qees^75{{yvIH`2SyYG$0P9%dWi|htMJa1b#&`KXg%PTx}1Vo ztQXetZb2;P5$*x90U$8-4`CE-)US9FO?YuK1=rb?HE(>_fZN+1W z(DhopB2LWdL6s#!5GYDS0d)1m61hgN3O1SW(qQumub?7eD-LTxFv`TU39Nt6YePjo z>#IPEpoTz@=1)Ux_>x?lr=IhWa3Ay(3yOzc%m=+Rag_Oxm-VBnNK}=6#jD~>BL^Oh z9PaOnfaQ;83rXlo+*-j11ti3TC!q>J1-u5eg=FGGL7s_Sk&k#$O*Dupj7Ev-fmp`8 z%CC4lGUb6miBP~Yp*p7z6yc=c`hF8$#01?oPiz1YC6+i5U^5lA;-Mf;-m-cpM2*JW zhrB$_j7MX$_A6dpSz%BfP}c9K1yLqwEBZ2M5!5tQ6Ik^I&?<&QnMxn>${&KtJFmif zML~Xe*r4tk-1?BmBkd1)U8RmcJjUXHskp}@>A06wun_lnq!{noV~*B*~#|FxI@*MRMRjGE^f@+xdhKG%VyO~-&Et{OuX&kYgP9A?c%=AiURgn|G~*F&E^8^s z&k&G5QkOiu2?Qg3i$(U=z1FW2N55__Z)<(g>wFOzKpyG-x)(_SCVs<9{RScV4KMc_ zfaTxtDuC7B@Z!Hoj?a1BPl7Fc(&LfhC%v+Q+$`AyY<<$F!m0N_!r9B?d)^!1G)i8p zL`namhsP58U9bJSNTxsKWj;mZe#$H2G(P1uaoV5q2A_hMc=+iRz>|I$b07AyIQfUY z(!)q5x5O6mUJFa6e$VcyjQpQuq`ZfvGR%9CM+nO2J$p0S=<^#I9h~kX z9*>M4@wi@1xL+;#X?TjbPp1c-3L@OaR>Nu7o6^XBTVk7^@y4IoWJxmZHPRTC_BuGd zv^T)v+Pc^mFae@oJDN*-Ts2BjNPD~r?-v$?EJfO) zrJD9?N(JOqc&{tSkNVn6dwm5b2J>z~EaqXGrf>KV?;j*y9`qVGWITwBtkPZtF!rDq ze-My&UWNB9cp*l8Vge`mpqEk+P$~injDX5)!V*muE!hXXoKgXK72fj-@}u6>9`x!8 zRv+|uWpBF=VyYIC&cx!@gC38xAM`rP+bTdY)n%d0EMPaEpsQE&JtAn!d@mGR;kz!92%8}PTi zI1X1`rhnVVM&_`3JEngRCdT-8X2Muh-WiyIDf`=AL9w;p_97X4{hUXElkAtg+?RZ8 zPnjlQGUH`nqAX+zO3iq6z(&T4{tk)vJ6;ke^*de~C-Vibr1^Hj)6RHZSbNWawc}Xf zCj1!>j7kpYK`!Ma-Yr`1&m2!cy+@OGE?*^E{f@QFH;HMk-|-TdhIu@sif`}*Kmx!c z*-1DEB$fz)uvQUZv*p*nr;jgaRXFOc^8{jD`5tL$iuPC@d z{RR*})SEPS<$eri-gy9_qP|c~C9{MzUV)Al8_v z&w11VSf2GNe3v)?g5em0$A!F>8U^Itg1kdfFo~1OdTC|iCj*$vdc~&%VIV7Hy(-ML ztXIcrX1$hbDtc*b;!4#lPQK_Bim<{5o4^N~z^CTJr#G*{2b;i0U>s}1v8vVyYtFG+ ztx%N6y9LpXlxpwdpcZx|mT~y2sP-98dya=oZ>hJko?>~o;0E;@K>Sc|dRecpk-b4mOmFQKxjhddrhKjdWm|URDMaeu; zdC03NwegV0Bh81rmV%v!JRa#j>Do_#rR)alpjKJswGZ+)FE1{J6&>B`!Et zkRKinm*@@2X#TjzBh8O{+<;7D`f-m(`XBd(3PwKR@ksO&Ui=e)=}&k(lKF&}Q;?r3 zVC@rLOF>#0I(9-|j#diIU+{R?&Tnrc9a|zElsz8lmp$&@#PqVqBjd6cRT+LVU&4bg z`6>W;*i7%mm71KV0`f@8Vkxybk4F+YFO`FtA0A2Pyo`dmoX4ZLR~HrJhet{|udHA- z=kZ95`^_zL!QR_TQXWk?Hmo)z+&wnZNU+Vmq0slkc`<<5}XU|H^#8_=MsZBpckM1hB7gJp= zWEZ5j&|8r4!kACs^MB({U-}|ri4f=>TN3?fA+viaFBH!H#S}A8>#AX?g*#!sAfMb8 z3RfMmz95~2Y?x2acf-=>^YWo^%@Ior(q71frLK}aK0_Z0j~#JE8eWr3;Pq*x7oy7A z(a6BN@dA;Nl8i`6$OiqazLl%i&PC5P;X#L*bEwPs-^tq3}U=4f^3-B_c4? z!N@Pk@`|X`k$LRO>N7>@Zbx5zNQB7B1mQ(l!pCQT!n+{X5<$;8Md(E_yExS!%A@a5 za|5hfHiPt~znX{lZh(($fR8(PzZ@X-?sYJcgnb*~`y3tnR>)Tl4%wu8I+$Ib6MIPq zb{B@{5G2V{!gzQe+jac_`+21pgvo9j;f|yG5jfreFLtK-+U(abY7$#aCte(ogTzVG z!ONmqWFyQ5)R{?|w?bjvkm_5BujB_(_L-qVY*O_F7iGCdJ+tBvC?b3t;e%hB3i$DH z+QGih?dcqP(&SpP*Cre zOqEc~VQnZj<24lQgP!Z*<(dx=eCdwhE+oDQ%pAHymK zFJh(a+ZPJ2vvGQ=Y4Mnh4Wp~@9)}Fcfy3O-!&WzThe6pJplIuVAOLGc*!#v*-J%>i zEQb$=!b67&QJu;`a?g1uCDJl9<>83K(39($9$iCvdqI4NT21G(e5fC<2`y4jmJK+dSdmU19 zhlY+$n3kaX9N`={{={}jd`D)7ly+2i1Zk8uKIU$bx*L3|o&;_AmjH3|PnhlA6AEb! zEPp$N&q{Y;v>-`3$U*cW(7lCFc+D|di^-TPB+%giHqYHk^njcPVsr00<&=bU*on9O zskb7lQKD=ufH-B-=RXXN^_QQFh)f=*`S^Fw8^laaUn-A*m^z* z?V?6!YoU#WO^0Np!_7~q{q~d%$@qefQ)Z~6l3yq;NNJ(01DP&bXEe0Z6+FtdQgGB4 zn%d27Px{(+bTC+;bKMY?I^#Sc3YHl>FfNG^-Hb{KkdFk&O*BynZo(Y=&eTq;VwJ3M z&@tI$$u8v7)T*rj5Cr71e^P}U~x#wQ&Lt~FUdC-*W<5Y7eBbiEm*2XI5 zI49@+EAZ@d#`vXf55p5VdoSaw4FrlKiSZA|9(H;|a_qRApwJz6D7AqhnuGnatY-)O zOc4^k56SjXlO&pEXpy+y+UBF1j(bHCFw)8}eD|wuj(|)wXT#rkbc+m9_h5tt;5;4VYu1jbc1r*heZ!A%*u#&@B`r~8!njFuHi}_9-AIxt zJmUz-$&;b*2`8~^Gt#}xsK8v%eoE7}k~0pm94FvFXTcOu$C;C$hiA^pz4wK}OLSO$ zGpHMu>;%CUsIvhs9jC_}OhrewDmpl1N1Zd6e$0Mh#~Crxb4fl3i_-GKO2ewxZ(4|>&D*bX#D?@d4 zTJFsfH=!R*{bQPj@SSzAt(D1p%-rbE^PD5#@iHx@)_AJ^{vcu1POOxf#qoo6TF%6X zfEhxFHiq+<5DHfu8@6iRu!E2D9B}c47w!BIM|38z*lxn2ld_qHnY*&>RLt@PX%jCA9nm_Bx<`KGmLMw&eX`>{p3%_>KksOLsMtqY}ec&D>1IWT&U39-AFj0 z(~((;amVAf#C9ocFKuShD4Lg}gmP+a8ac$GcDZTuGeS|XigdU2==#lgCNv+t=0x{M zM50260lCJu79um6SXwB&?zjbB&8vF@7?r2*vI%owJTs5Y9i;p*hvC*hrc@c-I}F*; z@4+4pC?eXl_9BuUlB{tSR3(klY zIi6)3eGMmO2ZCwM9xdq*M(Gi(aDsr&c(g8||LbG~&MuiM9EYv%(0i;+w3N_>OktCy z9nH_R3}^xvKLn#qn9xtAIm@4ACbgfKVyJ1UxrQ!Y)@V>t#MFx8@MCJ(=~%QW7z$?` zhPp@lgAVp34nH~dgVAeZp(4a@n=l-8c-p!1G$(Xc;`lhj+v;rpkxi&Wpw2sKM&L)O z38)Gkib@VcI1M!^=X)8+rx#cxDA77_%w>YM(-L*f4i2@C&c!@N3m6mmj>Dg7UJiK^ zB^Y^H?u%$tIUGf2bu+vcq#vYvO47U7Ma>>21RT81!UO}Hn9VUu&Uaeup*N-mn4x?F z4>}g#z+(T3L><~^mA@0s&tMMv`+G^+NY zLs1A;ZIc@^f%pPNUu+B1es9X)9ZLjQ*)XwNG$zD^rMl#pM z)}^yPT$j`hnH!|HH*vG%^{T~iP$;#C&~SAkM4h~CY6hcRMxf2*?y^L$$XpR5>B-63t68zAR1-DlAQvQY;Qoyd9ic;DX@%MN-zAdgE6Xuaw40n@VZM zv263x*h$bBGnUe>hg>q%dRUI9=MX|7(PBFW45SNk%E6kD6fFnCA0dwf5ogJ6MY9oG zGG#m}1O@S^=wRQYqnA!C6IRLwVTo<4Z<8iXrL?y-Xs(xA%QCz?LVRsvZQIuA_~la# zhvmcx>0dm$n1;q7@#ZkyS_c!?t4vPP%L<@$teXhHI!BUs@L{R%s556X!}v-Ij>9Rf z1yHKA@8A%#KXH@m$ zI_X7;gp*;3E|#y5+SQ}0CB4>Nllpbp>!p5u`+8}ux7Q_hL;418ukGC+;~SdKk;F}1 zt`B`~`gxMo>srTJv@$nWp3gm^DU>%{88|78t6NvIV&X7bDyYG>Pm`C}@|%ho3Jhgt zuVXnak;OQXFvB20gSF3bka8r;nE*WL7{we45m>qoj&GyuHrgh`?b$^sT++Ej@>kTk zhx)4M)sncnakXT37uTe;R$Y_MTJ&1!UN_Rqgj4I1;fmj&CatctN1nf;c!iX%s1S{4 z!raAa7`Yhrn!)ZM#xH;S9R~p*$cG#Z9XP#ns)2bAX5Q`88>_&lnBO=bBroZ3LI)Wc zCt>HcSqK^<~V!(1`;EhqY%4< zspv$QPu4{?)phQiEqq;YpE0*pY~eVv(TaLn;~iE z$fEaNG&TK{oT0X#!J1#~O2B=N#Sa?Uq7XnS*P5M)Z#yi5QWAF2!6&49&5($iVTdOZ zG6*lxpICPiA=__^Ts^gJ%d9aYyQ~p)5-w}x1E^WnNIPsWYn-}x>f!xTz9f06B(F+e zMYeEg>?U8$!DJ#kucsAr-ZA=xb@hs=KB5z@V}#M6{7T}ugIy&tL;01&;>uJD(Lf(+ z$-#bSX4%31Y`{JTGuwDZXA(uRW`|x=U1me(Um5e2UkOPY|oz|$Q5O+;cKhXT^;Y1)b;u6 zrFwm7UCQgdbs4Y6Zjjmy?Hi={oB^YT=eC~9-QH2XZM(5o279UhGtX~4Uz*QvX+0gM zo?cv-dP$ZSMzIb)E%DV9*=~j*mB`-fj>AvIlL2^AMDo4Bbu$~EGWx;b-mC_GbVi{Tng zm1=4uig_{((7IGST}_x_u!c4y2y02aH$0VK2+UaIpd31Fcb&`#Ol_^R;Kh*C@iJiY z>)Y%+id9fuB8odKelBU+AJr<04ve#pG(N-y_1Wt-Ahlw#9htaewM%QQt6G${tV7z# z^6sV4Wy$X>TtysYua?g4-foHRN!%0)R~@5`rTESS(q}H4hV_(fKW4CHvI_`~#not; z0Lrh?v^ZCTSmN=d>z^K%{8DjAyRkci=)<7%if)j%XWV#0%${=66l=dDcW(fteXi64n8Q&?cMD% zz9M#I5X~*(SB&Wl%oy=$AEkYH8XU$LnWfy4w3a%wI>#KI97271J_r-fIR}Sqku5ve zFOYRtXVOi$kFJ=5{b-}YVHt*+j}~o4voUA)$2fKybJ~9x2T&9QR%Dg2=dd>BnBzRg zsN^Ia3s=2452@N`SlF2@K@UpGj+eq|8!Gj%>#&P3Vy1&9UQsQ%x{@Nhms0IuYqquo zO;>&TJ?2&VOO8wH0x}vS!Clj2ShG9xo*Khu4XTjiPR8$n(C9e~i2_H>!M-mW;nFoz zU-vVGR@^4V?QNzndk#%(Ff~?TtD!`ib{f6+-!~~a4PR%eY%r!;App|jWF=_(PQ@VC42uyI30a$28)`R@(GTb(1 zl5h@*k%t`<6VMHhmD1h<8z9?w%rg=hh4YAQV9RdJw*BZ-TlnPkEo6INRXg2u&LQa* zL|EZkNU->1XCBxeVREDwVSOc{Kzc@kK%yRM^+rO05b5X;J zhMghpJIpHEM|=K0cBV?4HxvVsQyk2`Zr00#7&Q(m9OGBSIZS8h=9boYIBA-}*5 z6=rwK3oTt4=#$5yH%_^2M{I2`(})hGp4!o7C!lkgwfX`ZAXwyxa}tUDTTB^`IEBC@ zTPQroxi)2F4K+ZaB3yyON~*sryX&;;mc1gpV~06S%Ct#y&UOa8(#}aVDY5()U7Tfr_`Pn`9WJj~490P+AMHivqtV zv6uC)DnZmE1xejnlhe2?>PDZA?)#63uBkm!DLkzHqY&Neg6ZdC0=r-Gx^1ASL&=Js z97t$fmNnOOwI=J^weO9B>^cd`mN=r~6imcuss>LfJCpGF4m;yQ#6G8Y?7(-VSYXa zrn%2Aj7J>r>SU+M3_}gIGC`i+GZi}|E!&I_9cC|^4CoG|$jG!1Rb7W0V#PcIInD0m z%IkV&2`+NlbEi68saS8B@+bySYqsxrl48QPJXrqbN7t!HCwZf-AhwG51jt{KDH z1aq$w@jIgB4RHE-Q7gKn#waB&12)AyM;&c1YmH6}O&!amWVAmmC z!@(huGn?V2qx{#UHsbS;@ipWvs4jE}VEXhYl`6Su2f2pJ{OI#)8s~T)j zTy5-<{O;V15`9kjInsVkdJn^jmrZriEUWhccp3GKRNDcR_858rSm~#o$NqkdvjJH7 z&jn!ZUf=6r(uJU znf9XOcQ7aVOeAew;@L=>`Rv767GsV%GZtB4rNvEMoC19!fTnlQ1v+Ito4W zladK@mMX_lCnszJNt+ zI$B?sy=D3%YD?U2rn&JOAA7+)lVD@Rw#_{zwNv{~CEe~x$B=@dyZh0Gk_ z=qia^on4jkDpQ-|UCC>hAaXuvo|iRtEUMQ874_{M4HisS$}3V?sc9%1J4NTmqFrp(YG`ED~M0QGaXJ)5lcV?L}>$y@w>E0{* z4zgix$yBebe+H(rdbf&mJ{sYfmttn-}vt%47wN`PjuVR+TB2lD@dE zIis*7<>l(K)RucJz%CD$Wwacg8g5${npzl27nd)VnhSSFgPgrQd$}|;j7dA6Hw({H zCtpNn>-vRsmgjUbjrW3ST1?BvahE!N7l3mEbkl9wC~FS31*GK{5UTC!a(!7E%T4BS zFV9~t#miZPEbc7tl*-QPPDyJ4$zD~yS|V$yH5ptRBMt6#KKNyWp+K-~P@^X=PhKvm z%QKft;qu%S61^&VmBg;1UCUgRx|(%6D!{s(FP~H8myMaWS=pGWOsmS`UD8{x z>e6=lMrq$zcn*C#$4f>#BJrz}1Z@t5k)+^KnrsS9h_g6cE*YN41wv zRcUuf=LnC|*V%y8dD?+v6gi*=ZRyxH>DBH#G*!S+roHq$Q*%g>DBW?6Iykmvy4WN7 ztH&IMWy5tlEqf|}(v!;P0`P&M7Bj|)X*OmtA*Vg+IXXRxAU*AO&Nna}W9n>^Bs0q; z=Tk}txD1aQUY~*TLJdnd5UD-_#EO%owYBr7c}A%8h8^C{D`xBl*RDgte2xKa49>Ab zo?x&#V5%W>+bm8GA7#C-4|2&Nml>#a!0d4t%};dD9lTfWkI|Jr?huRqJYIn_@E1ha z9XEN>bdWE+Vrqw9+u2RDb^2eD-j>@Yt!;e<@*9|RU+6q46s|fwEK;m89IA-FOR=ZN z>|@*FsG0FhXg<2_ME5Y*%IgNv8WX?=-F#ThP!I5xOyT5f}V8*5;6 zpIP&YD$Co&fCG-^Z`7rz1~AIakZcp?$RRnm2d~+!eFhuc5x+Y^j1;Gwhw$f$^#2ne*K$~z9jO`fvd$GyfRzbfd;hz(k@t~E_P}0ee z^R(G+*lH~A(0dr24A?oT-J`OtEDDY$cCL_3ECGyiQ%7vVR5oD>ho>24(N48c&pON+ z6Cp*)X3t^#Xlghui;`tRh2*(?riB`tZ7rwIZ^E7hbw0p&_zWw!%o}7_m9W)Q$q{X} zUFX;Y-`yCYe@0<`#nwDk$Ggn*QXQVA!>~7mA!8>9@7GqOzznIaCaK>Xk*@z9<{dLS zRnKUfA9y!ctj;S)i7-X{JWlmk3I?v%m*e6VN4OtV;s8gqTOD9N= z=_fbHS800Hs#mLNrsK{@n_6Y$sG z$&Y&jC@u7>0a%ZXtZ#t#1z`P9Nj3m49-v~OE*N>tq>eSiF|SRf8068df;A_zY!41d zlMN+wRFKk>qAXGU!Zh=dTh6nAoxE4HUpSegtW1#m9s819;W_Hy6*+yD)i(#zWRTbA zVDkF@e>(M!GHMI?z9YKeG0=K7#wT#*S#(+av=gx>Z?vpS%Nvs1GYSoh*8_9T@zQ8A zZ%iLFfMNNMiTjeyzjy2w^cm4_sqS;keuEcxu=P6Q<#p!1i`p55!vOYlSIY4&+S-KK zzyOB*AbQHa>`=CKUZwcjf}Ya}COd77GE!wD-};nI*GA`w^f;W-6O?bw1zm?ZM*XZk zj>V(Xct0v<7;#r=NP<|~M`RN246_PJcjUP`T|c7X8R7G~(_-rtwhx`~*VdwXNHeeN zLwXR8oTj~#e>~j#oZWtvxJTO^j%(acXsiC*gEd_b)@l(h6J$)munntIv z?4#ZBMTg;22l_pyrp*<{ozH$fvhLWlzg#8_W*BXM6|?sjr^@L-_$LicIMjJo{Kw2O z>daz=0XTy)M`I+dyHbKEFt(KKeJVLUY$AKfo-A0XhSwa=0Cq z4yU1{v%Sw2c_uRm;<0If)-^lweKfuo#n~-~rZ7++9u2@cWqd3E3;a>%mHJcB&r}V< z^twl34o&pfS`u>%c68HZKMH1ap(Gr|@4%e8V`|Z)dUtd-AcR|CX@}_@*S6P@P0!Jq zc%}?K?OtahagWJa$4lQhYMUbJ#-VjTpd*kHTLeJ^8AVxKVWUF^# zn|{k{#%nWkd|QHT^H!$fw1lhx)s(XjUaI4QgI73dt1CFO5GV)zFg;*&uTun)U{xJF zRa|!%j#+KXVAc%77K6=54c9yyD`J?=nAEA7DsMRqyAjB9GnlyWQA5Wf`XvYYU{Mn# zI2-Uj^2n>Fsm(0G0W#hOcoa}Z&oyEqXxb7vcAR#L*8TU>T@0WUUI{4I)t_|-+u1() zn)>AlPR!K9*=d5|PtS+6~mB z#P-g1>2II+ZG*u1pe42jm}ojnwdjIjh4egj!l9NV!gf&xl3CJohURD`qe4bEjxhu# z0w(P+d%@_g_l(0>k5zE8ajOuZ=$OoI>SDCx&>=e8W9o;^n35~ztM+6-!@+)Wox$XD zrm5*<&7oHK4i33L;1fl$xJ@?@1d*FDS{LkbVs^9tiPLiW^gQ;&iOuj?Cq;cruY*2Z z5M?)!23WL%&tl-Z?6s@1IkrTx97Xk8-d3Blk^nkZHpUzbhQP+S>Yx)^pI5Ho9|TY< z`z6YW(0L?FCviKUCa;+lH0B2fx>w3y2VM+N7FlZ3T@p%WDCH<2i>5?5{}$oVS-BY| z1V*<6ZN{8;Y0IWHPW>}BcbJf^MrJTE;ivW-%1`a}fIXykjEqgO2p~6OG_{kCgLEU( zg0P+`%{n?Q4jtk4Yo}4gGPq8Q%^{RWKWwCD`L`m_Z~tdg`Hnu=HlmI(rxMhPmLRNJhEB^O9R^*s)o=7|!qSHcDnf7$MsW~U#rHY>bIbz`8A@H9 zVPbfOrUz^>1II|`hg-6xVf?~Ds`MRdnekPI z&e-yuQ!$<8T`Vt3=b|VpQJ1oc+q-;txr{H5vNL+drd|5Q3{#tz7B7|fa+dZh?R4M~ zzLXr?q1UggJn>7qmr6xfQJTwbBxW4@e439w^2Vt#bh2v;4GO{xMf1WSgCabSVqdzG z3fURi6As24I*fi%xIc)cx9jiloWo*z!f~CjTVq1uyu;8k!_jlFpBhAc-=Q>x>=BH= zH>&I6&hL-*9E|q`X4`k^Y)9LywTG2Eg?QdxTK@&`ol{pr;dXOzX8kt%#NR!ddH4+GKQVm(TO73 zJ4dqZsV|D6wT(WzRefm(b0R3{Y&hOIkTw}{iAI9LnBJWS-<&zS~TRAgTO z)}7yTFe-xZMt;rDLAsiBFsKjtAguDo{<~=qu$W$HEC90yp96S$P-PRA?yO^6)O2D- zPe0)`!)of0M;#Yc-67lX2T^)Nuohs^CN3R>ZM~+eOB=AqPtZKhG0wv}TuQ!S7PO@( z-#%lXv}F8UAtM^(Ir@Ph<-nV!k}T{s7)3MT?@+dE>yFBK6jA9|C|X4Q5eM7SXHTxt zg9u_HI_ID#ujjCom-`&oaXy`pgd^cF{)}o6rWM!Sx^>55J=8g;hC|unu2Y_WZ&WQ1 zpE?F?JJ^-!u0vT1)~UOaOrA1|IXR6{stOHGI)K>2=}(fl?y@R<0=3=2=*RFQzdY4J z-KoRzAc`*tQfALM7C)8fN3lEfsHF9adU^ZtyqseRF%BG41iB8xvZ$SuZRn=C_V&ag z8zh>H6lWaMew+RLlasSu1g#UuzRRbkRx(p+PhsqH80=oBFXUh%X&;5l!8VQTkthaQ z4!hqD7??wM7~&8;-2j~3-lUFOee=|BJEONw`8}i`S70qx=ljFM&5$AOMsMT{>8=zX zdEhNmkDG?MoI1A5P$7o0G!Kr2q}XE*{UjU;b16GBSo28`rdR?G9KYsU`W~mJzCu67 z)KZF%i`%WK`nA8VogWGE=!)E4ntU~HBc2Sf5rxrJ=Ywz2z`@IYt(0ctF@`-In%PXP z!*t&_O{(J#@g4RQnD|?#0nvG;AWVDgqjHXgu#-Iwvk^N**J_5>II_`_cdTSL0x<{E z($pMXvuzLtB$}I!j!L4r9e{NrBm1_gwaBA?$24 z$lsZ7Hw*fGq#13Z#BREu)3i~^vi~*EzHUVHX=~0B9i8Ea%@9-$4ZEs-$dPSrpwqF$ zVsyHe6C|@;*pee&WJ*5jq-|;M>9p>^|5UG|@Qn-GD_(L@#Fqij+9Q_d9LmqUGj+r= z<{t7FCr2hrs?HJh1GEFa_-bd5PdL9qp!-zFGtAWY8D`3J(n+Z@orRuZrc!4dkDo1O zu%9i?JG!4O?hC-0EsnbY`q`rIU=oT`U2vS4W*n;bLySKi2R`hRgAweS!!6osLf$?V z)9(tf$bLbXnW=-D>5CiqFAV$gOOAg{4p95fV5Q69VF3> z$%!+JHXN*(#m*U@aVR2-=uSA8=+?^8!G7}O1MuP+y=LvL%po~|rZe)|pJv|2v4`wM z3r~$d5sSPCeM+rw!=3>|1iPCTAbG+b7tT|A*4a$1OleL+}5Xon)pE=Pf) zYHI~y_NLR=uK)M5+@rPIp&(38;NB_mtC<1+ii!>O+#`R=JVS9t_K#)vLq?Ay&^Ny)Zij}&HJ1n&>6)utD zbmDlhE3P|7drzDUL|itc9+=>%A$(bPYFcB)}nr#H0-)*Wiywmf|YGoQuM zXj(s&(Y+{pvE|}U;@A-Jv+$V(>v|b>C7mQvI3NQZ4sais87Y*1grqh5+j$m`K zj;wWwjJ|*)+%L`DQDXJ1!-VV?uvYGw>ZE_j($RWiT@ve+b&21Yzfoe(DLhAN&uKg- z6yEc{PZ>F1ZCIQidD_PAb7(RK`u971eyW!4o{Alp?3H;AY9|6ol3z?*B8AH;mr3vH z=nc}m0Y57@MsAYiO*Oul@H5pH%5Z<;7OCGdx`t$)SuVm8$5gYz(Z?qcdsOG&hm|`n~OIGC0Q=JtbCbNE~~3} zncO?m8iK}_%lvA74o&`?NL78Q0wH)R(L>HoVxB$58jH2dYN{F0(rO9y&xGfw(-T4o zR{NGcJM?`4C0a=?-Zzaz8r1qlY=j4=;ex zXe&C{*1YR1piDASRTG!o)V!?BzU9>>yY{b%?w0uO#BNFMPLVhH_zwjrLs9Jpv@G8* zW8LUKyk>NbWN#Qy7*@|s1A9~k>*YC&typyEzUG*0m7*W2NZdb_^J^LUQbj7ev_liz zCHt+>#ym>T40Qr1CPNr+>2g!gVNnTJ=zp7fVRfnCszdoK`yK39PCHu3?n>vU};0Bgfn55P)4 zcJEZ4rIfzTzp;U_t;cLq7qzsKkK;+gF&&m;IlYL9C8X3g)>xaGRr43sFn7j8jwZSf zGe~76G^@K8Hpp<)VX!00@q>$yu3f~@ipa&x{KhZdT2J1vuwC(5REIhGiz0i3Wh)&ubWrwOjQKfo zon15>AM8tn?V&q*>iuX3;m7CNQi0gZI04QVdQtz7A*{?`k9R~alFm}}Qb}Bzg>~5_ zA>Wz3D0>m3YKLJjg7z9J+p627$97#927J}(B0XPq#BrVGL@r;Ih+Nb``0W2O%>ni+ zA7kCX6}3CO4*gG4${r5t#NiD&jGc?<>_~8!;G#5?vMa`uCS!QbkXqyd=)-}AH+5x- zhBg&w^jP#t>gsBh53~|T3DnQXE0#vv?fNlvIsM-1A%|kVmb@NwFo{4NJA?iC+aRo+ zv_r0$rL@`4FVol_I~xk0c7(|{oCB~f8y<4~hI`qZQYJg^OzxEC)jd9zcWwPTN!?g` zjzsrl_DFqCbC1MsO57xcn~FD4mpe(Fg`g0*i1A11L0D(VG6A~w_tODbr-ky{C8M92 z8?MB5O8J`pZYf>Qx1X{%RBn*|4MV=scVpp3Y24VPA`QykTVuDQ3T{E7Q@#cEenw>h z&vmjo2x|pdc-J)l)E1uD0F=ZMVxG4f;1*&cvBb6!7~N~30XYUcD9 zyWLdP&<#Re|7sb3gI?0EBHi~tOg%xWvoc)a3!j`$it2He^fmF_QnR0-o3X9S!DEu% zncHa(G_i!@6wv;y^s)PyVA}ud)Z69Bc8_eJbGb}+wik>YMr$ZO5y<4aaCXMQ{sPYo z_B$7$$kY@1;fL*a?Z}Ob4r|+N_B`ldam`_AMf?u+Jc@CiV>v?nw)L_V-6eA1fvGS1 zh+^GCaL8e_mr&%xTPp&zM_;!Sx7B$s8DktIBUf~LW=B7_oCv20=@wjv2yb+1 z?tUgI;>=XBa{6r1d!3TKY%yWM!rw+3MEjUQ&{AUaxD(Xa)#2jMusgD?`#7TuF}<;5 zyukOB8SrH|As}6CjpN~ro|f$prj7FSr}ThJn~eb*i3}>=I}Pe8*h|d*zG& zwe_l=`sffe@{aSEDseTm{czL&MDyUkc%fguD-;T|uBQL&2XANzFoim!pnGkpI4b(} z6t+$>1KrZClm0Hsj?VApbr&mpw~3py-mgG}5~XR$vba}M|Lb~EfKLsLbk8}vZR{Zo z>4ba!);Ojsx#W@KEV1qESsQF;1BJp}{YE^S<9fO&NU^EK^rB=IbBmH+EV2`EF|k9+ zJ6Pe2EVVBQLCH=i^~J_wNV3Y=(672m{G#~9jOWKo`kLjStbI)__4tekg9219abVMb zP4LZFN$RQG_Qeqd`j-qZk?5tdOQm~7?+Su(NklskoGp!B+20kCgpQtKS0=9vaafOo z(!Hw&_IrC*$@r?s)r4&W+|m{K%u0TRPoQ!jcYM`YPrI^{Kw6jgFZYp=tK-0yDQQVb z+IGoYSyoT3%&bUeR{^i9SMnuV|246aq{3dwtYDD;n&!2z(z{9$yE40^pu^(cE;YEi zHIjq46S^LVtnRGsl+MoHPI@7F;4p?!Pwdio76MG8O|6J zgjGf%h1DXjoz;jQ7VjW7+!eV-qSwT(VFaGi5qO4C$~C2H;Ab!{rEAL9NcEZ;aQhm@ zH+el=Uf!Kp+X`k7*%`3^?X=1aXlYe z<;#cZ>#Nt3*RP9TCxz>ZNJVd~-Y9iibZOn#zHu{L+(0jHg!fc$lG;s;n2^kQ*lNry`c00DZiiwwl>4oKm_5z3x~|_yfF77qTz-47fRuU%@=Od#zZ#r59CRB()bcFeI@*xnENI)BB0gTMD{aa;t>*!WVyf_V0 z^VT2|UtXMfvE*M|hBSQf=*2RAapZuMZY$p=!`nu;1(4*>1M{TOi^ngv$dKd@IX&#B=?K8U)0z30qGp*9+2LF0i?zTczhuJvy%DQ?9URopN+mm;x9?OL@IA+ zyn!n7CApVK@gHGWQ7KiB>_xDFN$O7URzAjvj+tsiV1 zl+3GguafGk>#vsPt6Q&@^lP)Pr8pk!AC&s5ny-@ftJ?b0eU%jNDBU6DJ1Tcb{I!YK zO7gYo*Gm1J?RQG#uIOD7yDNT|B<@PxMfIz~gM+P?`ofhvs&`1@waM2?`<!U`S|5Bcy08bN$&OK*VFR6eDrb|zdU+~OmV98X6gR(=-XuUw#2`X?7xV-LmKbs zyhEaAYwwiKJ0tjEUS^osPU!qHm4A zRT6Jay%lB2w@c;iwYN+C?Sr>V^i2MYyDY@}>C?zPFw_-*6OwbBa==Gh~ z%i#4xtS;X+yiG>8<$hk;Z!G+>#NSeQis*Jr1UE?uaN93@~@D>D;lqm z-Yfe2ym9nK$-QancU%3gSidbL4~3+B)96hydQ*(o>d&`+Ub_FRa$M4PWr)WK96659 z#~n6uJU3++|9teYBoC(!1+G;;q5ZIeSEt_UKxF*)Q{C!*M4K;jYQ_{10?P1@b=N|GQK_XN{PNQ zp-in~(tUI9%_Pt(b4Mh9r29{0d?NRHDZjq;da0jGzEPTQY`;0e0y0-B?* zmzL@qym|O$8NYe_W{JEd3TNhZwL7KphSEtX{c@Q&%)Ku6I%&MF@j4m3ZuC0I+?i2w z;|aT9RIwX}> zS6?lSS2uahzozgSDZQrr8sh#nrPoOLH5Fc~T5=nAH1Ck^9lbk<@jE(q$motSulc+3 zcS-54#$D39t3__GaQUtZucf=ncS+^08n4lF^>flXm$+L}cW3TVIC@TE=i=w|HFi$o z=TfuRZYln^;VIu;xm&6lhSA;QyCrf@3j1cr=si*32`PGyL@hlCC!yE;IB48W zZa$Yi2VB2fn#761xpTa>c+H(FpOf*q=-tw~yA52{sE^*Au&-65&ear--7WFE;~=XF z$LwoOS>u*9LljB&p8P#hxTkoJRPJftBco56@h2HQY@$^$u6IxBU6OfM?p@OQO*8&Y zK7jO)iGQ2}TOT)(PcX{PnW)NwZ9K#r#Y3it)80fZf-OB{Dn4Iw4=`W?n8jdcTIyl_)Rk+$o+@R2=?(qCW39zkDJ)XXKdMb(Ly~H zAMw^kN%JAoQtiCMF6hY;QVs0yJXG?5Tu`^Mmsi<>?M_M^!Wd@%zv4>eOe%K6g zMh}~@LXVl`V@&NmX0kYi$4u)nBrn98nCFS0Ao{S?n%JoI!mP=M4UeQAHfbFGG7tM+ z4nIZy_>@ttb3ByWr_w$l5|W^wU@Iu%uZA-X7;c#`R39@nocd#?p}~boc^eO#HcsbZ z(^ZRzB_c_Pr4n<^mAt9q5IsW`iRBHCB=aWaVd3 z-b_SPUpj9xoDfsrf}-8L89Yjnd(?~`h1$!TKFs{Z9>J7HOaZ6#h-u-pA2A)A?jxp$ z(|^Q7K5ZoWX~QF_Pn$Fje;J(Yr%fHF^Jz208GqU&Kf~dr&zK5M{WGSIGx&@d<3tK3 z$+StTU~)L+g6ZOn3MPY1#YasAr~0UA&6_sD!tp=Y!kTYk7l*%zp@}&|ds`Wr^$qR# zhNd?gifIudh{#Lfq#rREoa`eeheK4BacYm4I!@D%SR#;T8i$2Xo8rtgVvR={pD|58 zx`;82CmxL_9*rj+IvaETJ~IzVH<@`zf@v~6Qx7LWo0w19YZf3bdFY|};oh3~l-NmL z!Wa}y?IG9~4*5hKf*KwK0|9v^f*VZV+B(uSN}7?T1WicHJPwIj#UU{pI93!M^fG7;4tdO)V9RAukozIvqPOMoU?ulZf=uB%|Sp=fgV*=p->FA)KVi zBuwaT`+-RX1G7c${d=dWmR^loqEKTI@6<=UhP!`iOVdM_OlEq78LI&F>LRvH`8E_6X3?_tj|QkB+XdhQ^-`^#3<% z=5x%%|EIK{(lREG_8--b5u=WRA@@kQDdDA;-2@JRP@Gr}1^ZX!imilRy2B#S16!(SRFQ#9Ek68WMj z02Yg;q+kuE&ysYXHMP%f2}T3d=4Vaz^Vsrv)B8NkfGw!)&zi*NEViQ94PfW9rVCU5 zvu1!Z`m7n_puzG&fgn&I2$aa@(2)L|^#%^>4d4jHLsH*?5No~e9HepNf zf{oAfDzf}#MgJ5<3#B~1zkau2%_aGD4 zrjH#cQ{hidiS%#$scHV{X0Y~U(;#QHzHB z?@Hy}Qt<-@!HH3K~JeX-a$*mT=uaHiPqS4{6O z=fST~-F?L*z^4AvbT3FuUx*k*1Y&DTNhM~VhFA~NDX3X_*FCdst=|Bb6+)i1$pOHcn>mxP5aoAGC`V8V`5&2dUVPtnBvch zm0U_D6>{kihwRzWOait;wwi*xPnh~Gs57vqVBb-T3J(6lBz%p92{=U6$YIkEGcB`$ z81+Ra#H>n!QboL5-e(2kB|Zx3@QMijib<2n7CetD7e$6Dm4mkRn8Gnry z@9QS6AfzJHa>rCUfV}f6yw?*hUg!VM|FR zj-Q4Y4@knVmY@tv=r}(ckl+$pA-J>Xpm)$UJs%tWFKC36BcZC_Ff~m@zyWa=`D+vX zYe3$472bnPV23b)O(+wjK#~*ZC=;~JQvMn8{EZ<`37M+dL;JT(Tysh8Z%h^J6y$xv zRPRBZfi(pij+#`k`8Q_ZYfMbQmgZQ89Ro#rW&^S7i%f`7l?0`Vc(=UI3dBo%6x87r z1@T)Z^DWBsw@d*i|83LyHrVpFP37Ap!?#UCK}a>I^>3Mm#sTlV3h${t8T-4Y@?F)` zH)&*$?+(bU0~7x))!26pbb+C*JcYjLAd>d6weOmiVnOx64*F);2ORay7%=i}6GdO_ z+a{?tY|@Jo)r%5Ai&YO#Urm^RytltY?jM+_d<}T|Z4;RX$7qWF zt;zl^(ek%ugcINm5DOO~rVxSH-%?VErKcg*0+R5nB`6#HEwS;eK!QtXh2YMjgR=D< zlk>6F@1PMXAe;Wk zbbRbsHA0I19aYEJ#xpTxqY!NU$5gaGHXWQPHZwB0c`!>n=i$X^j!fo)#MXs~6(k`h zx0F<3=V^!oc&7Hjua=+;OUUNW1|+zIRtWAaI_UHM*fe}>Uo}F~{6@ASzAV@v?mB;G zx_<}AJFmifkO^$l#}1UK@Do!+Mg1q5%Qu1G<}*K8n}CcBkJQGdsowI_2h2TbicbRa zUV4Ix<_S~5sXbwOIQ=Kg2q*HSNjyo6JZUl$)`*XdDVTi1P z!oVPK1bpev`7%{MVTDgwXFLO-;S+{OElFWe`bon>$JA%VVl^5*<$=KxCwe9UgEE2$ z#RjGMr0Jq)@TAHAlpy@n6mhCQH65JpPt5=)67dodu4s&S8Jt4IYem?6KM{l&Q*eYn zc(Xq>IUGWSF`o;00Fd_qAn)-9IEnax*Toq=;C0^3N6p^tr8ow% zfd}k}qcs6+OciAw@M?(GAMhH!hAbLj9OJ~^HMvGQNf(4vcjawchKsRRo?9zM#Iri53~piEQAFMg#ijan5VPD|`~XQhV`g zjFWn=H5(uCQ1G#*p3YdabF682vhVeBI7l>niH=IZSAZ1;=mJ9?2L{y&LsxlVP@kb_ zOo6g~CEn-pNcMeRfg?OJ0h90ZzzC>5&ftCC5GVS6ulatW=KWq5XZU_E!jYjUcR9p1 z2|^sde-4|O*Pc?a^ggeH-tPOnp07TSUgRcvW2zUPicd_a!s?vJ2Htv*NMg-v!Yh0d zyb6Q~A4_=JmkDD;~(^LAH=gi@)CapSpR>ydlzuG$|~W1-uEmD zy>O8!bf%0gw%jR&wm<t2BiSJ>ng$UuUks8S)Nlv=vNmO-0W*tVk7 zJ<#eEwnkCE!uk}AD=d8JUtxhjrm~gHBomGr*g_?uP6}6+v6mX*k>(MCCt_E2{!&u?BHi?w2rMmg~C%d z*2kf~E%L5k=?^x`yN8WU6A4awnb~N0qs?w&OK!473Xg&&s%cxN=%yzd^smE<&)H<2 zmh!gqHQK$!=5AqDZ<%x^e;-!vvqg&Xeb)UpSE2iD>3i7xo~=@}zh?`NbA@?)((PiK zhT4C&_nwYdjiK4dC>Ct?W(MkJTcn8HYBRU8^S^0}6>e`;t1hO#7dYiVZCg)=is(vx zqxC7;8*N9;4M;|F6Z_;Q>rspwnAAiDkYT|(H=z>0$)-bDH*CzgFQmdC!p9~;Cbq<> z*jNQ7B&AXhP}H?i)Nz-mwVP}PGf}&?6eG;+IFI15#!rZ zs7ZYkg^De01v#|`2sSavioMS!8KcQAQdcx}pG|9Ls8bc{S&H0!I-XP1%zYMM>xR9E zh7LjGrl?z>p-{l3N^GEQ>QG{0X0)zcJ^=9}VKfGy%ysHkxS)WvZ?YW~rcPC;cNLA@ zY!fUD)KP?US% z)b1HV%@iyPQHBrN%6HJ5W>z2w+nXf{Pebu^Or59hdX+@E!UClE3iuDjeq6L%w z=~iyvV%uM5wSUvnS-$FDX<7D3#~ltE`K+iK}h$YIKI@d z(Y1cRE#HsPnq~Tg`AgNA=DO`s)E}PV3fB4AZYMusOaH&_cKH*wu#FDJnAdpeMd$VZ#R+Y0*|YkM ztm+$Wi=um@?NRh^v`&syk{eykGj^AIuCCwz7yH@&gpDPqb|%jz>;{(e6gBf%P(F0u zPI600TSupvvDiydhh>d;62xyLg;qqTlD2=o75+d ztwdY@ITN+1RPVnmAl3h}wf_oHszTkL0UiFAjWcHcw`}WM2vgS~%!N)s!U_IAQ?Vs( z{N;*8ZrZ1ctwZ(4sm+RQLG4v+pJG_CakY^Cq|JXaSa1Wbl-2Lp-gj89V;9W))7IlM z*b6RvqZ-4SI`)9=g_@lg(`-Fp+Yiw61J*&K@SrVHv>vqWP`?)H4=A`)=ebnZ>b72| z4HN-Y1XK}FML=B!)MY>w0aXM7#Xqe@v{Vs40l`mo6+hKg{8U%*Q(eVRK=3ng6|HWl zm=r^1by6qdq92%`jTjcOnxzP- zQr>JmwI4C3sTHM0veW~i2&EpNvCWniCAHbolH@kqJOzCOq`uiU)WW#TG}Bk+xC*2| zWsJ(hY-n(j%ZM=ulHF{P(_YX6!U!kFmv;Hq6UvM+dF~BWB6}2p>=<>bwMlLy+}v#2 zfy17ydE7F7Vp~69G4Z{af+w-TQ?xoWHTeVE`~fOIu53RLT$BdyQKrsu%!ko zxnU~}(Ci}?klZ6SPf>WpRvwwAmLhbT3+1oGd&Jfdjy-PUkAo&3wSc4_wONY7qqg`c zRR2*65V~Yrisl}(rN?OYG25VMKW2Lr!^dp4iAvL!DXLA|qZl@A{D-W~AKEfS^@rA{ zX#LQ}e+2PIHbasBk@YEBKeAnl0mL6e{IRW2)P8LH6i&+~TlDMk$%kB@Z|nSbp~NUM zk`CY2(`^e#wr%yh`;1S%3^q47;j&+&;C5Q$$=C1Orrz?SPDI{EZb$w`jz%6vu0=j= zM}u3mRBc(NPdZQAE^hEw?6IZ)XcK?r$`qR@@yOi?pS&9%ooMppJqRDbn;)BKeT*mX zj|b1;rH@aPc^q$ie4m|%65K5yT7v8 z9{sNLY?b!wJ^ebsFg$Jn={#<`x*GbATR;YnTSu=>d;k)A!p0R%JYfMzK4H^}@&QQZ z37b_k|AYmk@PsWX$_F6jCu~L0>Jt`_+7s4Sln+1}PuQlS?I$cipiy{LWP){$V{IF! zNVILLjSwU#0tpHW`9`~a52>^kKFIPEJN_Ws=XrLJvyCsXsJ~!46kUp`?`kism_jj~ zvl$AsBE|Zb@M^rN!PGOeYD|kJzc?*A3}s?pw60PkC((qVPuqzx&HfjV;ZYpEU?pfX zLUUiVRdu1Bvw$>nwnfp-*=|nl=4{m6A=K0tEFkGG*o+$7Ce!_b1tj?e3vf%h&E{@r zbKY)!3jT&=_I=qV?!fFFwm`vO;!Y;+PFtqnFZN9<{1x;&J^FxTZnIg6{B5>CQNGPq zD7@Qjm7;x{?ND@YvptH$?KVkEsoQOuB76H}^Xf(Ac3Ta-h@5GH^=`L)ig?+&xK=3J zB86ABRf<;GwkdjL+o!;7^*(!t&4q5O_tiUWjiPgh?NSWyu<@`j+NHvswitFvdse&C z)+zdT+93rU1g1KOd+H&6scTV7*w-d7rPi>aX0}lLKQS^hb~|#09>(xu+$Z`p*xI$1 z-ls_8|7%62;Kf$PcB}=4>BZIpgEqPrX6!!BG^Urt_~P4E6We1O!`s=>X!gff`}iV= z*7wNzblHz=TXwCmQEL>f+br8v*sp9?ac;LUy2eJ$P>lB;EDtf-5O~=F>)&n%6l~N4 z8!=h7DGK&$iK1DytXpBfb||`K%dQ>SNM$xs;||-T7~El5#kz!(EL#3j6l|>uMg30e zPpxF#Yi_hjx9-bJ?nLDFR<0Gd@@Z_Vs~2(gVtjz2k=dS0MKtQ;`r|{&c)r+>MlIp( z$XGIZFE)ty9t`4)UPSGVPu_G(IyC&1D8^d~SD8%Oe#u=MZvy*U_i3gT@n=lJxQkK0 z$K8m!IJtvfx(16h!M@@iS){1kX1PW3ewVFNaC7Wau;JocZ8mmV0V01zit6pQM!|+_ zQ?TKN6p_PhxHS7JQ?^+O_Fb8xRB}?vXx4^A6jhh&sx? zOS9Sd%TTcWJPQ9#+n{LOX*(3rJhOn3x&{8C9USk{xc9iND+0IcTlqWfQ)26FIXpqRIT9)kes^$CgZ8pW8V>6a0 z{M&4kVsM)sQn*pV^mb@9DtIZby!ed$^S|>5)AbEe|ZJ(P*|JGf@x6^rtT0f3hOeqBFxN>p(|s zY_aEFg3R~~(}|I(joL_!O=dKU+nT=U^29g=^A@eFai=1q<7T$0xE-EG>uub{@uf96 zQtXN}dw^ZRcRAtq#NH4#2hRx7zs<5mggxRg((&6ZJ4G_LTfWOpZWB6F0b_IYDA*iv zrk`sR*C$@xwFL?`heuH@+Zsi^Y`MPc3gI#}HG6m1EEs!)$68@?@Fh<87RLgdoLM$U zfvv#is8KZUv|LzpfApvK2ZNl`B{|-uZS`e(Mzj-=+grJo8S^4P)?jvI4~$Rj7ArCu z+40e%)vZTwTf>GcFE~&*_JSjXo59d*%Zup=@|ht1be?EXyC1b1O$jaOC`1i*!%3hC zKqgy?hITu8NK4va)YAAGU;*eFh#DN9d}dxJKWumEda}()7ABhVLNu$faA}R=|Ah6pKEx|uK zvlfs-))w`!^>Wq%Qpwt?qK&Ktq?xsCMbp_E}@jTR91Mw`45H1>H5Nc{8GrAU9?W5$;R?-R!W-C{qTX+96;u9iZC6dbAlgzcAAqzYVKe~g{nqxCJN&H$#QAR> z53T{fv5c26V2qbAU^-a*Fsp-?oUlR{%ud>c36{LTUr`<;#d4vUH3SwND% zvuQmqeS88CKR(fnGx&Vu*i+SDPhsk^2|yB;O(ZXao4#xUkj!Ntd2;j;7i zV*}#G6TV$mM@zCq;=UuM|G3mwSX4s@8V?cAqzU9a z0ck&EyNV7UvVb_>vus>+|7bHGnYt=O*8wg7r7QV0>&l5>2j-lKqQkFK&V-97G7i@Y zWO5@it&lmX;*Sb(?f%GwUWu}oPcS%)+eapREHyqd(WGd7WTO9(?WcBBmJdL>k!tFa z2|)PETmm#D8ODBq#f_j%u08+hlqONG`(g{G?mrisQTDQwBylYbw{H43o)MP+q%XBSO<&FxCQCaTe zT<#--=efFHK0%il$LB2|)#q*PdG+FX3rOR6+fuaqyalB9yz0R1T0jaP)te8u*^f>D zyaF>(RW#x@ySAmif;JGQ9-z)s7LeFe*41C#Gf!DSvQOE(qUEP7AeE;qcNwm6d0YPS z)NPRk8$_u?t>tk&La7%+q53`OfX2pAX9VRA+b5)RaJO|-m^xKX3$lT3<{q2n{+qkU z7L*(RvUSl-e%WTfJdLKlY}1Oug2PFl+I)Z}LKF(;McTYlhhMgUIA5`Gjl|_6%Uz#8 zZvFuZMcl90grcc&E-1hutE$7;WGv5W(hoxCd0u(gmL6uP9=1fCa^0xeY>f$QTYhyH zenr+Of5Pba*;@!IWx9D+ax&(h2vc6TnIM>y_dh0hUJxD_SPH^@hs{4~t*t-m^6{6j z+H2cv=-lAhz`5c!oJ+l+bIwm~{-^x2=cm@EX#Uj3FzWuyrYQ!$w$3y3_!*m{C_H29 z6pd%>fWmp!W@tC}tgTYipS9{mo);nTBJrHfFhs@YtVhv!&UPrgKiFWTW*j1VQl!E1 z&uoRF`ZHUjsQ=9RKV!gh+hU@ImY{}~poW&9)>O@cZviR#w&a6Wd<%%@+nS<%-vTo5 z?NHI!!xoVE!#1I7AivQ9!rK}|lnZZb@UjLQ@H)#gr(}zk$2{Sc4Bp5P0`qyylj41r z_$%RE48od)cQJSsLwFa1S22VL4ptL=DcV92v}ij;P~JLexva{KHbYyyZZb$iO?}1! zlKza%d`5LXV*$y3#ugPFK4FOy5ne;#Efis862vLIf5Pi0LgX^fJ?x*K1Tyh}$=3L} zb$`yh{M;rfQa`t4iY-*Ol1U>|8d{J0cy(xNdY4xfQ0hKKW4z7w&~~BrhPF>J;Bn#i zjOOock|O!e`Fq=;=>6UfDPn)H33`zHgU#r-53F@CGYrinLNnRW zOlitY6~%gJtsPn$gx1{9S~{}Exag}nId>vYQFJFf4e^EqMIb>LMGJ~n8B4e=ccM$t zcPE^U-2FCABq`DxCvp^pjT2=GZ{tLrqOozJP0`&rG1wUD*HH9BGo8@PFf@}0&16F} zrO-?*G}8*r^dmFzO%pB;uE|Xk8J*d|&+U+jiFb7Nc|v$9_#)#!WgAb~zk1}5k@Q+5 zLVfk?X8#o49VQlFiFnbclZ-IIMZr!Ys-FU!7+XN)y4%p)^(YG-G+NzI&QL5$QRc6!$+D=!_L zu6B2c?<(%DiCtwtn}|;0JU8#0*;%rhH7qtCd+G^Sv7LuIM^$GRR}+d=;P0N;U6Q+d zWEpdIi|;1g`6+rbnD6W%u{{!0OS_Q=ILNIi<=y(bMIEY7SN+|ZyGdsnZ|~XNQ~H`` zEU}=!NRo?d`>@s)^cIjKtGfu>3&_L;b+Od-cox-aw$o&i~C4*A2nZISXn5Ig{_4$AhS2uyd}vcWbVvT ztt@OTl-9!P%O^E^uaMS~NIhb=|IU56Bwn6;Iak!_YVq&te=pkz8f`3==3*E9>dWgdm*SF^Iz_T@sV!+x zbr!`INq$L@YHU$?QPiQ-bTz#wvq*A_3X4b#KgDDzkarevb zC&m5B`!OK<)%TOk{8f*B>@bN3)aGHm!=$)E)w~r|P4V8K+S5eu z!xgcWl3dweNy;r})i^P^QVJ`JVIKIcI3CI2d6-*?P{Ud^t|uax@Ao*Es(imi-m zO0MK8Ns*UJG?!LHOsz^y;?w+Lz~3%B6b-C~)!3@UDoL-(X`U}KdFlqd8?$hsyS)9w#uKO>Q4(K56>Jf@gqnnHqx8is(h5w%sD)U z)hV2XrRmH<>WfyhhvyEL^bwgOBzr{p2&o=XW29b`n4gwpv?KNGG!dKGAp2SV2t*4< zlrUN(iJFuSui$G#)1@`}z}F+=njS5AB#F^tt0lfVLH4szV)jU>9O)e?wIiEHZpHBf zV)jUcYDfC;N26TI#M#Lv#TYyIuG$Em*i>zF}FH5iBI$0fWKXM zC>mG|tI5@w)skObS}o<(@uMVhRN^Q}9#uR_;z#F?4pXVs!X#>alBnfZ7gkGe^>B3{ z7~!hJHeB7Gr1qx;`l|<%)WI~hu)4TfhO3>a_EH!Kh@q{3l{!kPBh|<^rPf#btEIWR zJ88SQx;;a+JuMIMtW0PU0yA&_Be4=601`cy#S( za?UjwsTU=drzIKfNS(xWBkDyG*>S%(8qvzpRjM9Y_N01L9bY?|2v4)&;r1&luawp+ z9ZgcVCUqPc*;>cR;5g@1Qh9ClwbD4gdIJ9^O-Z=N`u< zSNYhw+zC=XK}E-^nRSv`S6ny6imwxQU1}Ydk#zwpH(4#N^VUgiT^-z8S6e6bb;EU% zI3b6@YKYg@iNCG^zrN02CyjN@Nq%Qtf1UJ^XS*HmtdracWwb`B?c@8$LoJ>lrGS-K zn_Mf+wXL<%UfWsA)>xZbE9JEw)!N$HTB)z~*Ggk;6TG*!w^rh>abF|J*Q8!U+b7gd zkj4p38t9+UKS9!epZ$A=;P0z{ALJxt8NR;sdMT4SQEIREPm=CQ*^?!IO8=CI<3*g; zOaJxcH48bT#PW$GKdWjUv=(U(1I2({f4#3d=@TV;V(vsKo>)>rvZQIkH1Z?<-;;Ju zOp%r?a4LSHd!i&xOoFFQ9CI!3su8#!co{j^U>ruO=@YXjO76tsiBdX|j(ghiFzZ{u zDJVyYtk)BR(elynj#gbAL#5_51!N_tCQr(oB-xX4Cn0;%;3OHG6gyemlanV)>g4Rn zQ^es(;+#CmNpCkNp@u^7NIh|~WCQg853BCUQ`CX_Fg(f8=F>FqpVYv;lLseD|CIO} z@ciV$$x_wifptv|*g3h6P~)WLNzyv0i;t(I>E5<*H{fH`IVDEbJtc99Bm=G18`^J> z?i+eewpgE;>{rpo%8hi?(*t(mvV@a=Ip*|&7wvUSxv zt#+E!Pivkgt<$=vN$<4SJH&lQ`W=#aNA(@ttlm_Av&2tJqThH^dWLHEoxOL;;GMB| zk>oPX$3Iv8S-gL4{IfJp@1D*!d*|St5_?ztU6OlGZN1dj_ts18^ah;%drC7@JMXH! zTk7v_lIO7X?%aE%a(WHff~HH{s@glFcZLkkaNftY@O|a?N%eiTpjv&O)Pibf&0nD7O)f5>)`QTcmsYF|6w$GIAnY}ZmPqI#uiq_7OItd1)byghl+;+(1 z&n#jh5HFrtI#bGLdRX^fM6*k_!rGa&GlN8iTT~m7OM^3qAzun-dC2=`!U?N^%gSeJ zrdsNsIXF{>+7EBC9}zp^V6GN&e9Sdfaj0zs;{I7v#9&kcLt(PTwvLi>7KR%^^2Im_ zIVF2mPKQZ5lAOf1qnbG@dsdjeF@IJ8-QL-xN6cR2Y>@QDxr-GaoGng}C$M*RU#qcm z_^P1E8QpV|Dw@BD?SKH)?09u}wsVdo&ncWE`HQNs0z7k0hWv{c6~U9|q|PD5V^;Zv ziy)RDrp`$#5urS$r4UGtDAg`%UljS))@tXXE?Vu2Iu}XzqW(oP!1oC6UDShBIENnf zFB$|@dVzi+6E{&TE!Ml1#?WW!}iDDDiV& zNHTj~?mWq#S2$0c4Y3W<-O$B}8HoiIicJe`iRaGCpC^U$x)&gn-yl^iVXn79iWhsh z6tIiRj)&~#7`uF4^8$1r7B4O%o;bgBzIf+1&zJW3o%3aI{_uQpFGyS7jnJ1uyUbPFRW4ZFO0Of|6JI;kdGeJ!G(hhWq4tX1rYmS;)9a^ zVBv#O{9tYqM-y%`nd^*Ht}~vdsf_(c{6D1lAEp10_J5>5B+gaFy$W*rL%9!0{zIJ) zN$hhb^EoKV52rsYxew<*ER_!rK1>rIj>S0r{VJ2W+6Y-9+c$93XwKx+X#amHZxYKp zCUFVJSVqjoR%qMdluyTWDbgP?ab!C=)6H=j-xo|;?V&OvlMQ6(uVdmL!G({Q1O-_U z(Gt{1l_{j)jH_n$5)-*X^E_s4g|@V{OH7v{d8rv*$|-+2lg5yjGeO=(RK{g8$Yd`y zIf{Is!M)-VgAKum12uN3iBr&hOz{?+DNq!1rlcM)V9Bd!gmI(DUS&!Y<*Q7E!n?{; zb?_NY&3)Os-lT5;r30=GXUwE1vN2PjD922Nq8>9HirU9a{bQW|`7zU=U`BFGO8#n7 zq^MkN>J+U{nC>Sy0rC@OK;a}!BFVhnU!P^qgB5`oYbC^R2#<4dNaCdhaRXlhVLvrm#=643mTeMQN12JpM8 z=F}TS6C)_~fJ^E#K$9kt4UDn*iUEYoQgzKiM@}g~$SalpDrn}bhAd+oLS)Jmm9H9) zqB@msk2IY^(oM!n7%aayrcp$+^a6_go9N6>Nog+B3ZmVp zDY8ImBB)xF8;*offaZm2-lUG)Y)S}|*(vlZ%%hsS+2l3XXXF@Z&YS`xR|rzK;R9OQ zqfFQ%5=4!PBCURs%#?)?W~&1QWr%)!oMze)58yjiHx~SrT&VT!B zhI!$O_>@es0Lq7EZkt)w+ZMA{FaSqo8GuLHtx(d?DR;DSKTH}3wKC#Tl&>!IfvF0G zKs)MT#HCJectH7@A!*oDv(&LRg=WJ1k=cUDt1w-|jG)+8)Vaw361&NeS(1C&O=fzX zZ-qLf?Yf2GyT#-*g_wJbNrIA9EKNaCib?h`vW0Pa*kt;z?p^G(drbcx zE+_YzOqDB8HB?N5R$WqqY38mML{rM;0|@enDN4F8K>R4{SNt0W5ceAr` zl}x+@wPX^dEvfw4JkH%3MNd#nQqX}e9q3KE~ z-fafp4OdfFv~`;Sv}jXwZZo7%o1#L3!n=58pw#^B2H?FrQ@UL(-EIKhzcV#OTellh zqVX1xAs^Z{P*SXoa*^kPce??2VK&sQlnub!5XKKol}!t@T{ay>hhZYK*c~RTiOgOQ zCDYj`7kS414g>H?MX1}l!vMSvZ~Dr0NM&}Xk=UJvq-Hz}+-WkP**i^nn`nNVi#%g> zrvZ4UKGYrDX#g4CX=2}mOGY_B$SOBbv{f;HkXVl_c|1XU%K%dRmMMP=lw@px#O^Zg zU7(q}3?SLNOit0lT?UZiU8byP^{yb*T-F;0zF4IpmSB=z#+Z8qeh zTS>Fa#14!*YQ@;=U_n9U|=RVWD50&hF zCJ$P?&y*=D_n9gMx!t@LqAf!lSy5Q?uU<`{>X0i+tGnsXj7fW*ii z_W<1T0|t=F1E#8I{{aICx#gS(LGuq9fRnHcS=xAld(dbix9)?cuW0r=29Vr$OhFU5 zHNRs3X?@3Z6iw9)AnCdxOB#ElZU&&K@0#>?xq*DwWWT#5m8Ck)-5NztP|Q&jA2%Ha zu>1JrIA(rA<3BMZ`{6S5=P)anoitQ^+yIjLiAk$n>P=AUv__Z7l?2*;+yKm4=oxO| z6)XNB14!&4<30qMddQ?fiw~JH1%H*TsLaPWcMFsxZ>SUb8zy;cJ!Akveoa?R`QJ0Z zRFb!%ZvZLzrsBix`Ua4mZw87sA2xur9yT4#zE=Of0mT2lX?`Cx^8*7&_6H`fNz_P$ z1qi9AhKe>Drq!SekC@6MSbW6P9}5;VqprD@f(6}w#AF}krtzpLPz+mUlsVWIGydq- znmh%NVGTp>;|7=s&4k>PPS4}o8YBLw8K-7o<|8JY5eHF2i!~imw?M;QaMgI+#4$1H z1a+!YD7px8LX#mo7aQ+U14#8zQ&+V4sBsvk_+!QmM~g8Ds4$e-ii8xU-d2>48FZj_ zRHtRSfr*xBa|z<_rK7z^4IurN0hs5oJ?epTv_0KCD~L-L4NVCLN>eCV=aO`c6nKTl zF!h3HW}J&W%k41(Xr8-3xBghLqWs4+CmxsX#|*%EP^PQs;ISYd9XaW^oH8fPEm0^E zAE%bcX2#{A{1fBpzD1GCFb889Urm&MXevKsroyCkjUSqVW{!j8K_yci6vigZ!WI9i zaW&so`spC8koUA{J-sc|S1uobG$LWr1_4t2m8oe0A^%qfkOp~#6z%`Y05bTMaeAQ1 zo&hA)GZ{q(Jp;(FXPjSyk}C)h@&zRoDO&Anf-8ytx2gU&sQZ)w2;DaM zr>4=uQ>LUSADR@4KY-!x7_US3JElbuW#Sq9#>5A7WMJA9oq-{v3!^+Rnp-9}Fr=4Z zq<(5h-9_}EAuX6xy2k4=Py^%s7Upo28K6)IsWtVV!F7Lbl4S47{@ehpfS;Sp2pW== zn^$gxQZFh>N+mKXN#R*jdv;qW*_0U7sjNzY@N{ORl1437`UViMZ)%E?AqkLn-vlX< zoaYQ6vFD8Y9NhME29VBkrmJZGIRnT5q31#Q05nljT+zhy2GG<Qsfg^Gi_jrbVgK8j5y)X#nZ|()1P03{7^(WDiY!2%7(xEq;tR>W^6x9Bcz66$1@T zrDO<%$t(dx`4VX8;}($a$1Uk3*l%$QXc~neQ$j9o0m;WL$r6}@%Pb(t%WUd0(9C5P zknCkPuP7gY6fUzxMa!32Kq{Bns-k=VQoGF76>VH*0p19*ZAIgkTR@X9BrXR{U2XyX z+iA0kdY4=BFi0cF#eijtH$p`ADi^5)blp0L;B( zU573>Hc#OuY$8F(b;718G6|cfC?ss0)41KMZ0agBDhXSK%8}lj=#6W?H#L&d)cO)1-SJ=!I zgnCDLBVG_CX#)ckCU0m)!Zp_dQV)_VusOnX3PiS(PJs)FYXMER5Z?$Irf(1e-pR1Q zcx|$PaLl`_0rtsF7SI#lGm7#7XcT@RxF9NnB}Die|60obw(X{m$yS%5q4$a7ubZ$C(dKMVHQ1wyS9T66;=q?j^QB zQM$yIFM*mKM`6JcSQX{g!vs3yz-dG6Tw;3^{YxwmW!2$|bV-l|hy*%`OHm;ej%LGY zU1~{)!<8XSTSK}UlG6Oud-oX$?%rv=oWXC)uM3Nl-zaZAP2;?kw(VNnv{@iV?}XLq zDmjQ;tcQF5+>fT4Ym{k=F+knt3HKCRSu10Tx=g!Q0)d) zULez0bTtrvv1)E2NBI6k5m|3CMjc}lE#6w2=tAvIq(m~36TVwWS;XC;v;*_DLuLob z?ogmw*`YcWir(5$`a2E?Wp`%9W=VV&;pd52jak^9Rh=cZpxWOtuHoh?)!eDIleBm0 zQBBUy&X&sT%pA$i$E3>6JyER)nvj?+BiM;@?%!c2Y-Gen!t`;?7OXmHgcNTq(>g&y55lya>K+onoM~-7e4t%ys8VVs1v~qA*v=bJO#rtKt30 zAo73b^3GD(xv?`#aZYazQx(Wm=Sp*Kcdqp2_OZQvoXQrG+k;o;dfHNZu5_oH^XAfg zXKn|3RjsyzYDWe7fj@&e^ee9YN{0Q?xsLEuxaPLTQ`4gLx&B;f%x#ADWH8s6$JJ1Y zq5Xh045(3cI9Ebk1yC5$pgS)$Plh^@h3P>|&&%jL6-j-2qOh}+cdjt9FG}RSh)GFi zCsOCVj7cIkQ_L23oA4EiJXLRAb)HoD;6CzlXOYAgC3ug)SrlI+iA71O$wjF}l3A3a znhK-!^HlR1vtL?Np;}l}S|pW49#wBqZISdA4XFBy8jEDOXt+pXi`~WJcpN-n#RFDQ z%`YxaQuB)olhwjB)nDA4r24#f5LswUQ-_OVdq>paVrR1I?5)(;g7^Y)7bF+37WRoP zm(=nu;rG>j)BEu@L3KZA?N{DkD*JbMMWBB``5^HQP7$sj2=&8P2I2=v?cmzM;veiE zEQ5pN%OtrhxlA(4Qim`z2d59_!#f!D<-_F?J2ZZ%WDd<8Db*vZM3oK>bqLXsI6U69wB};p(da zLjuP`&CJn~I3`k$*eQay#XG!8*mhyM+F2DNI{k3>aH5r+qY$0MSsW|VD<#8Q0eFHv z^@NM{%E8L0I$RlFCGM&+;qQcKOJa3pHM4bi><2Y$*9B})%+^bn|uZq7)Qm;zCN^-C2 zziJ#WZ-E!UtFNxTTAHtJy;{1juDo8nv-|It-1*h>rTXvghs66|gOBhJ27(MW@y+y8 zrt~QuYw~LgYo)W+dCg4K{#w2Xy`G3m=L3ZgNcH^MMdDx7yoiKjLA*jaW$GzxlrM@H zW7X<3HGOjOEz&zLcfMpkl>d+vE(ziiQVBzFgw#H1FeF&QC&8(j`qll1#2Y33#>^Wf z`^MZG`C^nZU8DvnGo*-p%ESYylz}3Upl~FOag`d`4-GRJrx)KRg%9-36Zb=z4@vTW z7Cy`lTAy1l#q|V5me*I-GdFKfyoUgw{XE?;hk|0?5X>l)L6+r7s0 z(u{T52m)uy_~zhSO5Dl^7pn~jYR^3ww|#e@`58`?JGsY4pcLK>w;0}Y9x<*FZ! zJM{n!-Pc}}l*@EPgUk40__IL>R{yhR@L3k>XHAS|+-prrr#E6kbw*I?DwK$XB2{#t z2zr5PM4d#p;PyUi5D?73P@N1#_F9wIW+LXKY9y4q)&ShQg9cPMK+#}n3VVbt!euG2 zp#{__v>b7fqNa_lpRC!Pzw>2 zI#od;5ZVHTR)$MwdvvxR_IZoW{#i_ZCZ8I$`dtQ)%Du+B7k{a@L8&ve?5?{^2b5pa zgCEp!OFhFayrSz_(*Sj^H`(jAg{G9t2f&eOp>W}PQv~&{H&u%I^~R@YTyL5x8!@+_ zMzTl*LR+Bdqb{xMO;1e>uQ!0iZZL@(K(jX(Kyo*jLWEKk>Lo?HHyA+rK{zSBzR>`r zM>B&P;S!+>Xl!pk2io|80i^W>)73~_|BD9DD9O$jLBkkF4Q6bA3AC0sfcSaS(&)wN zmkl5UC5{Fp*1lpIUxAwrA`!`kXb3{&IkjK_Nf%760GhbT0Fu1Pq;CSv-DCiAcAA2s zLWu;+EA3JxgKbrsJ-I0(BZf+@=WO044^TNfo`>E0I5YG zkFBBsq+K)}wLB~a0cWuw!fYETk!Yh_>1@ZS-OUD&-e%L^jLvYg0mSi4Tmw)r+eN2$ zi|MOH>QsgLK+)LO4e@Ro#+LayX!GmFA#N>IHEF#fg0|pxzHYh{{c$FbH^~aJ6_c(Y zn+RgvB>fGO!9w;Mh9?f`1Ti@zWix$52Ngq9j&zC4;hMmOnCq}`A?DH~TrFr-XqLl<Jknm6#+`J=GgS;^ z?lJj$Xe5l#+k%-JXA-kl4K*uz6~X2Jvjp~GQre!$-p%0LV_3Pu7GUenATv-+WC0;U zx2GtySg5LzrUZ}%!J|+CHCR>$Bb0i8qL4uc1>|x6ZW9Mh+-;H+M5X#lh2(}*7%B@$ zHHcv4a&os(Dzd;7iUa~v)b2fI2s+sv=U$VbcS(YTb&^42pzgf};HrLiFa$^-5TNSf zBubbfK*kD__$J)kw+tY8E+yXrWxb3ppTgY+kmB8@d^g;77%|wr+w>Ie-)&NOm1eB9 zh^~)N2j~o6gc+Mr1uaH#G!l^^4?_?MJS6Ur-ri^8L=w99nG^+KfrKA&?3)=g87dY+#p<_BEtKi1%r>bQ3WOpZ>H&(;$e~2&$$+93 zwv9m0b|f>Yg7YJ?PiBReRiUO`{hjCJ9W5y2S8;d9u4Tpg_eqj|JuEL1S z+I_~yZ1#RrAaJsHzsdZX$8_RgG{|IJrgFdWkg0|-mVOXpDb4#$8)E-{1IXb1$$-lu zK|U>FZ=PX|1;HXx9)w0`R7^x6nuKan)kw{zMr^(yT30R~fcTMc`~d?9!JJ7A;3SX} z5bps~Q&%0FrH(oTBB1sepP7)7~ap8|Na=I5rF*^+-4K zhylp*X^M})B`Q_}W4%XARng`nrUlx5#Ka!m7TO&bMxL>H!~hy&8|YRZHGsyH`f7?e zQ9#2)2?*t85yop$#2y1B&QwE9iOS3<+I-9a8b;YuboiJ7#AzDhCHYq0H0dUD)HIcC zqQp&(3M0=YHw>rDN4mqN0VMWAlhDA){tpcx!ylUXk3hRWGJy1dWSk#^wts8@>HgRZ z6eW-zAe(9!%vyik0Mdv8tgBBLK1n{0WGx+AeFYMwLuF%HGq_U zYP_FH;>`IU)j zP-)>;rt~X%@GC=@DeL!HLkMCNcPRb78GxmpGtK81`_ZUF={;wL5Q#E$pJy#SZ&DNl z3ic_6L?HeK9-*5QgbWff7}#z+%k}VC)1qiUYdRGDXU#yb%K5)c8<;8MRpmKTdk(A3 z@C}RT;i3J?kw~Mz`5XB=PPcpA>*VCO{*|1;x8JJK+i1>ARr7{_&J<0FTgf!>rQ*c2 z5(8&78+c9wiNb2Za$0K1mI?BjCcad>V>!RF#`%?))-a*4S|DynN)u%cTb?GqRJ=3c ziPWSX1Q<UAILytC^4dxvO9EV$zWD;N6GEjC*G*FLw5)1?J(Sd zP$i<2QXGdVg;~LQoV8g}CsJur+S^g8J9c-J-j3Csq`p%(P;RSoUzLe-O3g~o3J%ni zl3J+F!a`+7^g8IVuV=a1YI#Sg@7N9x;gsY~xt*l2lcyHjSnTf5+d+mqIJ3l^m6#>D zS%q0ro>kG9sroEw%xcaOZ^!D6($!-;t2@2`&kU90H0^ zfKT(&+mDB$LD*7Q&FTT8WsMZ7%^^@GqaiU_4Z%sxE6pVp3^BPqBFiNR~uNrVf0Mbw=frujUcJ_6C zrmNo0)t#jlP^&LiZSUOPSvouSu;A>Xhp}?(D*vzBCB2JecF9rA?c(nuja^z)d%FyF zk>M`Rt`gg|yc<%xW_FeAuEkx)s@Yw0yGlNw)_1G#Cc)vW?cF*k)L+(qnRH&(eVO!L z7W->SF6r(gl>-w8N$Q~VL7d;2BRXeI@;LF1=ODD~`tEv3pOfb_ne&|s7=f2HRFAV@ zd%MT}dJ^Bg&#|yAwVU6)%Q3M_^7}|(pYlH9?}PE$n#6IDdLT2+-jd@lX)fW=RkUkC zP)H!|bNng9#8OEt(xuv7(q1B+pgMpj z!zIpACU(hii8xE0rQ$A4fICZL+A__z*0k10hvwN~OXE|-wz{Ll_)<3_29CDZbV5$# z?KFFe!$nFB2jXfYk_?DVT8sFh`GA^Sn%XC5PI_yG@bgOxOQp25yi_VnYfHsn+FdIB zr7kz$ZE^CUP9)?ltum~t?(7raN8j$2~?DV_DZ>;bH(j*fD(l5tUtKS?^?tbXSg0zfn{ce!Ik0n}bPwzu z$m8dM-2NNtU0Ic#xVK49h6 zNq${{YGG1~-M+51PTCk`*{(0FCu~V0mI^PS8uYia-diu#^_&amb8U+TVU*ZeFP)h= z%`x$<#<015O0~JZxn5e}%<^A1|5_6BQ}ZP~zp;mu_jUIZfBykTEg#T4K-#ZyUMudK za&MB<8KpDWFMlDKB4>t6YkqgW^yUxeOMH*i9+KH3zlRj|DDNSaJ*w)7zppf3*qs9I z6zA9Hi$CAzxO2`Um;U_zd~x@1)mBDr71UN`56m?8Wf!VoO9gu>7+1k$*fP?&uz6HU zp%0NB$}N=3`gc3!r@U`XWrix#QJI>`^i?LUGC5?L z^IP*doxC?+hI%-8N*&Fsqh)opswbxVcq@fqyi@bj^QECjwdc>NvcE=gZyIkYzc`IE zk@;XZHTIaQw$w`T9Mx*=fkJQqd{NJ2D+R=!^1ZN?lQaJyg;PC_KKvi`f93Q)|15Dn z;C+BcAkJ%)-l_Sw^A-N&)F}vcPL=%IOW>(f%BM)@)ZVF_r&v0T!8oOLij>|ye7lrR z^S}dBp%w36ynm7EzqI~^2dO>tdrD!?&I0M~!vGg_Y?}u-2a5CB^lK&eChtu$_%|Kf zzm$x(XHSoHcNP#RoLC^~1^ES1Tu@mc-h%o9@fS4Jli0rE>U_`aP6BtlJ==RqXV1=_ zGSDO9;~I3FS&&g%MYZLrEuTQ-eO(q$TLpu&PN3Z7 zW+AD4Q|eAZM~8jsyq0~L(|tMkx52-u%ur?WD&wh4Ph}D+Q&O2YF8B8A?*{E8L5m^5TS)|KIlpIt4lZ#1MzZHt&gGgmf|sXpj>FHMo1ey+$n3dU z@Xms%YEP}?&sD9So}b?j@%*_`2#C(#z%K`_c&An0A(eC6hz|aC__yLLtn5X^Hr*cV z&&lqY11kqg{P^7Ql6iCG&C+^rjK0UWLngJbx=?C*gnmA z_bO^D!~MkBKeoTbb(m*vZ}?sox}M};(Ubb?3+s9&zaH1WaIg@At{P0M!TesBiSN%g zP{EoCHdU~%g3ew+^GGK{A5h7Lj-VI$pvtZNTKh?2|Ae~3B{_3oM!O%^?q{_7E!=7C z*H@XW%D6g2MU_dbOi^X}$W#~BG_OE&p>!5@7fMVWO{t?fb+ouwX)hV>=j<;rT$W)l zs>8o^=;dAw`Vq|MD4t<@BAnC#@pBW?IMWqBSI=pz>@`)bs+GjKs#V=fa}9)e;#^4v z#D?OTpq2JsoxP;HSMB8-38_}P>$9iJ@C?rPY@b_szjQvp>5k3wlIQcd_Rny_YQR?( zkIyf!^D4r7vg@UEM*R%&-`{(`c;_|Y3>P_zc|W1LH|Yf!)RbPo9Uaf|Yn!hXN5|6- zwvxLYGN~Z#1Mee9YjJn63>L@tmc-uay(P1Ees3x4UD8%^`$>Mkf@U&!!S;Ip#&TL* zSuEaSZ?X7`{l(H=++Hlh#lyuIOsK((8Z7LMnc{v7s|watu%&_n6^!j2G>>#D^Z}Jz z=m>g|5320$$IZR6Uq!pmZgLLfI$M5iS-bCO_kG-P_sgh^uQGX+Nvcd;Ws)k>L5AEF znhc_~Sh|aQizTj(rq$8BI$GMhO#7O{p@7TM3r5vh99t~ay<2;eb|HQ+4`DOob>$EA z;V|SgUA=>P;MKjSs&%z82&~li_V<=XhzH3W)O1Vn_`zE3?A?C_sWgVKkmB0s+p3Ssj8XAGRFGg4sW8Y^ws6Gx?DO| zn#VSe#cwWy?KidGgx^IhcGTEFjm6biMvdi{1&(2{5_*T(dg!9s-X635%CU&G+<&s(6Jd`(OQu?A0 zv)_HCd#pHXGHWEQ+t$<7p^}Ft)mBbzmDE=CP`+QNOh;t~Dw9x|bl50@g|KC$ zD`E4hGCX?7>p{m1kDz4T7$M~$JCVFh21<9;t1Y3l*a1nM*q#)MCVWpcS9mJ{gBgtvkU@u zU;S??(Rqt{-FwIIJ>s8U_#aaL*W`Ppc6R(6>7L)`*4h8Z>N}1d zPwaqy>b!t>=ASbEB)NYoD!YBU^iJ<_OFliLcH93d{eSKA4dK1IT%pN-3@^Dei!mrmGdzbpzeXN)$AQ5V(7!Bm!bh@pMp4 zAL)`VWNmS+_-`D%ku`P{IXlQ*agxMNPMs{3H~Mds!5jJd9DhsURH>gaJcCo)<7bI~ zR_$zw>-poA_xtac-us;oi1&fc2RL-wJ5Q45chBc?`MT`u5$v4BK7U*O)KI8~5Y4=` z@;2$H4etZBF(vnH?%TwDTk>s^d0Y8y%-~tWv!rr1k_|nYyLEmW%g)*Hv!!`{>wJ#t z)|Luyao!p@!dHzGk|&Uzp?~67wSH9dD7qCtL8|1f;G4^IHGVyK;fjd4QDpLB$>j-;5caBEDSWU2Sqp`8nZn6Yzq23i2B^n zw>3K#aa?_CLz{!vHw>7GfT%d@X@hgI#4b);%#dEp;;CF*qspi;?ZUh>?VKW_YiYZw zC6#Sw4R3cyB7Ap)71#Mz5K_I>!ej1Ugjpt_vhqz+(}2q8Z8na7971&}CRTw;MEd{c z?QH^>2i%x{!kr3r40;a=?@}-9Z;wIW+DZF*M>u-VJ|Ms$b>d_@*Q{70iLu zJSSwkRT*)TpOc62A94=Ei|oirK;})^VR)|DS^uH?|FXGkPD(kpg`Bjw^mCrK%og0~ z*xs{+1OV@UfqqBslqi!CyHhfEZVx7%)CEG-n0IEn_9F?qz4=?h`D^8*u{%f1sp@IS z8Q%lHn=;jIdE^+4D+@-X#{AyhkAKFLQ?p!_58W489$_Z&!tTP2yfj*m>C6 z#r2D|d2#zv)&-O2=`a zV>_D-%a_(J)%vB@KHj%c+V?ul>T}Eq>RhV5O9z)SM;kLf5_JMB}#s92GomN+*r@oBq<%)xEa;o0rpCViU{K8C=NyS04H z_>2^}w zFr_$nvV^t+osTD)6_l&DNQ=vO!L&9@dow%4W^<`mf~6C`qkPn< z(~3&lU?VC`ATFB;GeH@NCVh*jSObXQFo#j;G8!7gW0S87Q3(U1S4)gb{Ax*Y$y_aE zF14$rb@i_4B(9buH5-0S?7>l3nB}iQfn5}MmacXaf)}Zq5SzoRnCGZOZB&`4FmcMv zF-82Uyj+Uh3~&0kfFuMVABg5Jm%`;JH!qXE-OtOVX)qm;T!bCuvo0wJUVOa*3$h@* zLM$kA=DUpihr)|^TD8yDQ=BPD(E;~%$=;6n+of%Sl|48{wRGQYh% z=jVVW=iG<%I}-m6bMPHWnZGGzib}a^FdGDaE*m83a~CO&s`#h!o!~n%0)~C>Cb~qA zlrE7pgz5CskW?bV)G4_?_+n~#JD4N;8qSwsi&S7i19*F~iz?fwpeHRd>frIfB5 z8)cEBJwz;7pJUo&f7O{(-brHP9jw0-K9(9bJ`{?oymg`wMGXs{T{RlC!?AwDUcPqK%9Qbt_DgfvOAX(lDf zC6$zP5}i~+(l;|1-rDl+2ETVa?idm)#FWOc=$uN;r?kytoA`yY^mtR;DI>nwgzvJ& z%9BE17iKbky<5=q&Q>c9XwK^+qmq;Ugx?FMPxfT69o?Q`+fnLHd!U`4__Ie3Jb(-%%+$?sty`|pzD3Ca^WolA`e ziHm=NckFb8S5V>}o{@V5A05p(KOOdI++lyf{r`dB@6zd@+LoUQY3ETGyELPZ>Yu^IzA7DPAEZTfd{Lg*P+NK`r^wc3{G!1bbmeG^g~z7uiR>gf?L>p$+SvuVWSl zo*xRVV{#Co>T$P#gp8>nC2CCTUr^?w4eb1jbPaCR{@5_WB)cyj@nj|8d#cx$v6KuY zWWx!1G04jhWwMk+;6}eF2`;$K7rEdqkH62CgxttGgkqpH_@XfN zIwJcDPc+Gd_+iH|c8(i2U5hq)IvD;4;gaF z+-C+D@&i)C0`ZVbzw{s+Ej=J*bI(C!-a3eyCfyP?J!#dKnkkf>Daz9j%^p%TohhKz zZ3W!gFIi2#5Jl5P(diQMzRF-@_eJJGU!U_3Eo6cNaYE1 zQ$O9l5P1-1p0YvwgIeYjNA(&wj|rzgE5ox0cqS< zCZ<26#PW|nf;97pK$?9-@&+r92xNI5@I&I3J}QtFAC>Z>Kt3R?IJYFWu}1~chVPz) zj}oNqN2O!Ry+;Mo{-ZK9nE8c3n*D|3e*yGD)0;0-&0xGKxh9q$lNu9B-1DYQKJIH< z;i7?pqR}#?%HslQ)en5$eq12!JTAS*krIEq@FXL6Qc7GZPfCqT%L~2TebR;8PCO;a zr&!fbNt#RHDXDTH_;!QK=qU;JCT4JfviiO%9#EC1Cc+690q;alm$HL?4`#PXW79$) z#7lfu$6(=a#X!9%;(q68c`N-yXtBj-33*j{TyIPm@~Sr65c&P#&Bl1BbQDsigaK*# zDamljJ|#KpL+44MbDHQ$%BE!wBzXA%>F7y`P^Z`v!shdX{z-wO(WfL1mwMSAx2s3O zzz}~f4t2et Y3b5(0SX`!xJt3D<wC^W6AQyrUr_&!$CKG~^3c+PVm;>QO`s~Nog$Sap z6>ln<-c*d|;Exg#$UB%!KbUtv9vWDnb6^1}WhS1j;kr-}=*9Hri<;N7acu9nm&Kvc zmtLQV*(Pk8ln+QdzB2h9NcW)OUrXfI%-*ks^bSgXhxD(}^@Ve|zAhS0X%6(#Lnx^s z3TC40<$?3U4w&g2-0CVG;(z|hZ37Hu{o6AY=*Z5)3c@Mvo1G>AkFx7`ZD%g8bwGtjI{H2kb{eQA<&WgH+kfu$$NTpP+6EM6OG0Qtuj z?jRg~vxmwCNn$W91w#CkpT#8^Lxv4M>*Zu9`q>u}u@I!GSSZb<5DOJ8g#qOZkaEc& z`&IvXau(bWit(<9-w;Z0N!<`ibK&igyODc*W2nHTcw?x_rG8_m$)$Z`sKce42vrjF zClRW1X(U2TF0DkUo$zc&%=Yym@ z`ObLR1K#Ofb|IrcTO-HAh{9VxH7vOgSkNg}-$1w|nQj63Byap!4 z3XaCw7j9BAl)`96?5AVk5uBW#n(s4XS8q$Zsy*kQTMCuQGciBrDY6R~wmNLt^CM$!WTN1b9C!-R3D>ze$L7a_ z_OcjoOi$H`Eaw3mi)nd9zi-BEhdN|h35~{$TSf)HA5+D_M4>Rhj2Ro!)M#7^hm?&t zJwJoh0P`G7xH~LX=2z!qxvaQAx0K21={(Xj?0{LDXfoS=b$qC&s#h?`7RUebyKYi! z%x}!sCRrbNGUt!x>xd5)#)85E@;g)(Xk!5m$pyTdeP&}p!}ow5Er`uxMsTObp2t_U8s3y$fdq; zKH>kjbgUWrYAH3G-JQd(_3qpr78z>8yxrTob#~L~tfHaGG5qV6I#)!o8&tDH{LywpbvH9QlU*;z@QUQFBA8C+l3 zu$Bf3bu?+Nv5@A63y0WiT9Ird6o;k|as6@QO4_(G-ni^u`#9^Zxh-*aqS`hWe)H>h z_B1*ZXONER*>|FtbZ1-{))AB2){DN)#J2%^7X-!Ec1!i5-yMJ+nKRKFEfWaK8JFSulrx zKVL_0cVE*nJLDeWEo1T)p6|1Y6?0(VX_3BfZPH zVM#wU?hIMP0L}j2)UjrmgTU_2Vb?>Kkz~4uNrq}EX0&X96lyPO`Uy>3zLLHwi zIhs3z^NS1CQp3U|1kDw!`KAj%P_$yh6`Q8eas6@Qasde<-ni^u`#5Uj+!~HfRLd4+ zqH19d%pMUC`qXz!&%P7&9M>=QEFgtx`4ueU!f0`H5AE4ZPEBHL50bHjUmSU{MqiwM zvF2W!XJ&WEj88PVJAQTU&Q$g2i=$YIzZlg7aT2)UdldK3A|L!_STb6onU_>v!bWB8 z;{BJ5D0W}kf2j^%I(jKzN%qR@rMbOoII3FOk_@gy{M}?yY?%9MVR>h{_LldTYw9%_ z zukuQK+#2TNhG$#coa!3;HSvSouf3n;P2ouNTYH?Ne{1+~Mr(?_Kyj`(y|lPgGlz1F zx^>v_FfG5OO>UCvpH}}=>wns?JU5a5k9YmPwS9GX*vMQs_9X~G=8fgIX!vkalMor= zNc8`wW7ar2UHhNu|3$=r+W#V;L)kQq*?d!a1^VqHboA$@-+WW^P1=4_@68%LJbJjs z567{gaCqf#tsh=LTwCVi5I>?#mX*X?l5f$Zee~Zpc$>zE0ifAG&;2?3wI?al+tPvc z12u>52|L!2xg)i3WQ{gzN7j$j=8>%$i_=TX#JxR_q?xJyLtl;NZyg zQJOs}e-uyWQPrcgc2xZ+Z5-7)O4~;@kLE3B#m-S9WzM$Lrwu%n7_&ri+C!cX0gR zcpV)dMqzL~$I`hQ$Ti9YU6y7sFe>6&Z1Q^wrKO+ea_`?S?s`#pPe~dvuEee*2>wnv$cM9<7{o8-8q~6 zW1Eu3+3mBnb9NV{_&M=&G;vPy99~H0w9e7?IbDjwbB5>W=$y#8e1ADNaxT8*v2!(k zZo*-X{>RRZpR0*;YvAm;xpTE}ZjoZ{+`_q9Jhwb4mMA7xRmpdAL4hOE#Z`ER4p+rF z{l8@~0(bPW@cCLizkdGKiWRu=3veyXU68*(OBa+c*b=Aa$kTIh!j5pJ*JsviZhc|B z7T1^7Yi)gwzatcqQsh!2DGujJIO;$AE`Jkft#7Z_(fZ^?TPsH4HZHDTqNN+9kl=3( zNy$^UMCz9mf5QBfC3?^{#|m%5(%|CJ#Twm^*r26L%9m&^;i`~Z#dH(5Na_~;^PQg? zVr1t&TN{ebGUrq@oe(NaHDLKxie73K+8J_2YV;|=ieknRR3!dYFcvgEyirD+s){Bg z=2^=m=n|=Z!t|FsKXESEf0CS?AR>DW$!oOv&(h*znQHzSF3Dyh91)2BizK*Y{zbBO zQouh)&~)brl*0p@IpA^f^1+l+Ql^^~*G+b#Pf3e@lJ2F)C4P%_m*sPd`{$c zY#U+eGKPLw23!~}CN=v>q5r|COFN-c+qMp?iOKY=lLSh0ULz&f2&-!=LV7#P9@VJD zTQ@B9l>b5?BQD|15@ix%n5x`+k+!h_70>f$A}xOuKG>VU_v@1$FjB3yGi=M;Y||0 z8JN0RiZ`?S-7IB;lqo9Zq$zW)0&6!*%cP^5CCn|0eA1J$c84?&iAXfUxHx9Xg=4SP ztI$O_u(cg|QAxucUid3Pq(%E7P!V(%4lJr}4y9p42~q>Gg~!DkAii|I#6Jl4tq~;gp!h zu8^di4J%wB6=3ZOsT-tBQ7I=)c>>!e9eJlYBUgG-jw0JRPA^4}B@W_fzqW1_a{6fI z^V0Y{GB3SAmXrtIM0U4ubW_XU74|R8T_v1k)(FR~qXwhS+^m|s@UND_)zrD#&ScYH z?|d}nyd+Y2CqrYYmpYO70yKZ z2O_oW&Q-EAdi@@EIQMlKeVs?+8xs8nb@H=e?d#G*N_GU4_>#RVkR%G^bx;oRHEm`{ z@Q?)-ziHFP90aMEre?U~CUaU?;XPLUSE+HSlL+coYWkU&23{g7vU-iuOq0u?6bKXB z;<_wXeE3PnNSVcoNDKMLEPWQ1_{nqY^i3akDgQMoevO$Y-v*c3*QEJ1bYn5$ON`}J zs%BWr8R1TAD(6y%pfEr+Q505;C8c2Im9ev8?6fa8z|~L0SyJ&o-b{=IinG!*;6760#O<5KhSQU(aO7WpsmtZ^Xi! zW`HEM(SAWVZ_cZHb|+F_l>&V#epNW`%)Kj1v&wl6L0~>CzV@PL;%+lD?BF z9E{8%B`;C=i@>A8~)NUS3^ecRuDcnVU`|_BshZ5 z+U+}C(^vJ@C*P#9lAuivdltA9vr@`p&+o$4+nz1Vc|MTij^(~3m2dIzeoI>4!cf-B z>cMGu1_AtzM3Vh!u0bJ?RHp)*6x#KJ)99(|hep)C7 z(o97lEmovbK}y+A_yR}k6=`!Jg9@a*iVV1rBE^!Rkn)5u^GYOnqP_DHtBBPgl}PP- z+k<73@&ReZSDqLiVFKg6ea_JHfCl+S$Q!~F^1lUAybxW27IL^iN&=OENy(Rz`#zhU zcW}M&ec|l-94;IDZ0VMedj6qz8(#7!tfQZJque3vGbNl0byG5I3Z%uKNXcf1atu?H zQDCR}iNt}4p9sX#bcgJf#%PQ0rY^IM=BiSuZV$SYReV5N@|Ek(n?svbX~FGPWndPs068(3H z|2q)J21toiJ~G(8M<6AcNbeqCttODA_-NLEr5_4pIX$X&8b9|Vfh>tf@khYay#i_a zUdi4IjMW9QxB~wYc zeu1=dzf=vjf*cYY-`x&$873ym2*lk4@lRfg9ilCp*xh1@`I9ikY61xFU58sNiU|Q=<}RD zD3Be|=6E)X;X#44{Ge0})*ci{>kkTNp&8(VG6M3CZHTGc0>aV3Y;LV0Y-!4#X8Rfc z*m;yajV;a3;zTnXVgY)p0qo4G!v4he$6^jLOqo5;&>Svb8oa7wX{;$6b=FkVrRE?n zhfB>tx(+yY+&RMqR)b61Pqs1mi455)$cGW-oV%9_BS?Ya3*ox+?GvRMy5l?UL5-{Zq+t;lMm{?UGW1^R0=#)cZ8@tQ0uy7K zW=pq()Ke-JxiHEqqpWRxuz!p&ZIkEETDC8ck`*caETf=Y0#asbS=W6j11o)j*qOYZ z(Jgw#LiUn};B=9GczZBmQa&K_%5cg!VdR1MVBmtG)rX~SN>cn9}`G>kIBGb^KpT+ z^|)~6AIrZKNOQlG!Y_e|u0WdXO1cXqy$PhzCnWA1O`ebxF#UvN3>KdlyP-6<3rUVL zt&H0WKfk@4DYYlW)lEJrkfxrL%#%oQLx2=l1kTp;I(||hySR)hoX>~sAU=od`5G3S zxz9fZEIlQV5-Our(UHo@`r0gtPH?3@GX(JA}118MtN>DZ%9nW9qe8pK+jqx?Me2pnu<9~R_b z9oTqAn$|azt@Y|NQu852r94Ne1h?{xOoTjmv)kEKIK(3V$ea^&l`fYVNY(E-Qd5df zyEAC&SCY1Il*qWl1bHX?c`-jH;Q_h>i4Bkfd(Sxths|gpd8CDb6b(|QsFcIc&w^FB zwSm;RvXN=x52bv{=Y>t1{7q2U=#&xAP`5tTT932`UHl46HJ z7v*;6M2|c8FcH=C>ANi_=!Q-G>~lvEw46 z#b(;_<7j7ok3*Ha$6myD(A@{S>u~o7#rpiteC^FAql;g&zB?y#{OZ1Vupqsg%P7Nl z>fM53WkGv^b{2FOXwseNs*f@6sQCjrHNT-OK_@*FM4*;D90fohPp7hkZdRkiphm_PS?2s&cK6iYo@Ea1xMF|L z!JazYGqwX9Ms6t~IQY|fiFVz=pY7rPSik#{E=9kV75gvgzeESl!008}mul{%1x^lC zURr&r)?S+4%P-bn+IT4;{(EE5HgFqx!J^)~`19^KQ0HY~!kWK4{&Hr(4*U#Wo_+;i z4J^)i>=j9h=~rYehRprsWm=z8SawssRDOUlkkM9=$5E zm11ORpio&_$BYeWYBbGPwTOIfBhD`^U^T$(B@^xri;bntrCQskz7N5?d;92cpV2-% zGdp6oCYsE)U!B>Ws@`Ds`TnsFs_lKc6gx{hOSQYSPhX?^#P-n`AG{e}J$SVaEssrV zS(@W(J`Piiah}cR7M2y4kt~HYEUjf-Qr;}|E#4f$Q+P8 zKywG=4$y+-NpJ~x`Ui{-;B~ei!Tp`Yn1)@&#IDpyjN9Q0#iW>?E~c#`x&7G2jhmxS zyb<=x?nhFJ>V8_=ue0;Gu%DL6WD(TgX8-REuK-W++`aD#Qx-ajbz_D8FaDPH;q za85URKpcfCYC1X~aUeIwvNPoltQ@G-1KT@~^9OP~wLH<^X`DZ>WKGo$)TV2%j1{dP z*uYfTdeJzrNwH=}U)xS$s#rO&YTVv|WD^*Xbn2k=K`e(|Wp)nKflE%{*W78`@md}n zsPThR2Wi?hKg5)#{34x-9TXpnq6fvcQY;@-K1eI%4PdK0sCAIGEeS#5wOI@9Uw`dZ zn3dNOg?~yyA^~50O42lD!Za(`XdW~hcP;xskA`?fnpXC;Wy>JYL3OGaJver-b`S0z z%@?gzc4F2xHJ#f;Z_~#EUP%IzZK3IDP4=L6UZXT>nFiY;>&bV#|3%;4~A<;uL zc1VnX@rT6ySoqmP5?&~4Vpb1cPg7Hp!Xa8bq;iPX?2Py%67HmK2#yeFk98x?)D~Hq$ z(Yl?U?;X^6w_j?(K&7W3c2 z{kypLZGzkL5`SIqb?O4y=U-ocy|!N8e!X_x&7O;0eD=|ykw0Uiz0mL}irGKQS{(KQ zMHj5SN(^>p<IAiL)!y<3oT5-s!{GoXkjGRLLjrlif z;f*D9yKn5iQG0J3P)xrm{U*)4DTk}T@J*vPY2wY9HwVS!n>FQd^3AC?Yi4dS^XBZE z=~C|)?R)*|zuoWGt}rXd_?2qM)Q-{a+k0jKYnsh_2As3R6h0$gI%9isA|_uc)lh>WbQ!Ifb3P=0sD)%8Kd= zt*>ZPp|_&9Li;O*6k~6Ry+z}AL0BVt zvPUtGlZO_LDjh|&qXtLm&^dKPj*c9SQ%C%0erFzCg{P(_}fX!Sa^G#wORSg>R)R6FFSvU)=80flg?DSwDY$fM zxxdc;HGhe+tZ5~(jj(xGK9LrQRLWo+&EdAC$}hePVStn-IMziwUil$Dcl-)7EKixXsgAr)hg4@^R|Jn)z^cY^8JB;4~ecHk;Wyt$!Nn*CMBD z{Pgtc%;#xgE5<2?Plua2Jw?$NnsCM8X(XwMoF0RlwoIwb5BERJm`^XAu6>G{JR^UG z_Ri>?p@TER^xa{vSTd#Ihht}G-jw=h49?K-M@*?~`DtTkj3wnW+MYyPA88@3ogV+N z#?OeKp~W+bXJ~ttSbHDoSvwzQV2Lx5XK3k+@)_E-9z;J9`-sLdp`DL(K0-cAo6O`# zN*~dRvzz#6>Z6+e=QqzCU<4`_XwCSs8F6E2AqlwlcnwCAKoQQsWbmk86Lg zjlXXOR#s+KYIfypW@=@6rRG)^R%&@=9ZR{Dc`KGF=8aohS)*tSt+--#Wp1SwR+iw_ zSGGymb7uNX7VFC1N=;ML>Y42`HFZ|%EX|x{iB%o;iak@xo>@9m+oqI0D{~gfNlmH0 za=21Ufuw(C+>>bR>=@%8tt|h&md`Aosa>+hkydhAtf{k8=v4onfmP0|o~gYv`)86O zl^zt&DxIa}vtnm!;_SrP&e;sbvwCOg04CoT&#s=U^>YX3TCrvBX1%kufA$b(wR3Xk zXyKg7IliQDPH8K}iGIncw()7hJFPu-QJafn=OoU-Z_QlRV&>CkE^I7fk2|86I45-u z-fVFc%-_v9wy`oiZWM0noXk16ubI!9Yo~iok7`rJ+PQVS;Lb~&r^)j&=dnZsoN_pM zUg|u}%q`|Wmj4(TT}vNhU;0@8V_M%Vjm`X*!po#_nHaA!=CNU1Cgsccua%cc&194* zDrKiSfn#aKlR8M*S9XvOD5x7bKl5>N7PN@dzgh4U(e7muyPP&6=SR-xBX+)DjJZ6K z$@9r`68(5=>vfVO1SLz=aE*@EWY%eRU2UD_HncWq?$Xw!Y_x0oCP}Q*^g6`3b%k|W zTvuABV-%l%!O zT&pR+m|CmpwX;=|YhmV`6IpIUVeC(~!(!IV)EP4OY(r&(RyWis7T1>7YGrM8t=86d z)@pz4V66_;;gytG8e%I8@7`v1b`GyDCS~iE@rxU)5ZtJxgRd zTs2yyk=0S$S*MDvRqa(8U2U$f?NuFyv^q(#v#PsFldIDdyQ_MuG`%`YajIZkPgn2b|khXTz?8zN@ogut725tT@iV8UeZ% z>#G~9bz~hGZHQc=(Mw{Nu<$0uM$p^HB~e68!&5~Y2(xk#iE@V6wc^N%BZ|${t<~CI z9lv1iowZB|wC*-5r_^0Nz)IUDrQoj|XPUT2DFol#%Tey{m(K-!Z7zU5lg-sNp80OR0GKNMkG=o#c)P;o$HFIf>4K;OP`a(@laQVXWg<83= zMun#3s%u@?q1eB$f1wU898oNMy!de~eZ1wRJYyosKBv`>*FMhpEw5e2k5xJ5p-bWxdN^`h!UTDz!0u|v)x z9bFpPsL_qFjhft;+DK!UjxHs6k;_U{*r>&grHxwISVa=q7~QC`jmeFgvNT8ejRly6 zjm3?MD>k0kga{S$w8kUb+>>$ojcjIb*s;c>9**3Kmv$jcy>eLaQ}*4Fry)Mb4x(U6 zl_}T=OVePrr8_jWFC7QP27Uxb@BL*>gQcLgWat`O3DI0%O*rBdgD>v4+6(jI9W903PRC#LbL^99q0d zhBsr+&zcCg2Df>gw79gdlg^Y5DH`!i)7mVZu>rVsgbi{#QYAAhNhUh^oAGw>oysSw zeQJ=jal|EjokYC0@Jv@+(g!!uEnk(akPz$NOA^_dK#G<#a)*YfX{z*uKnZLlUJL^Q z66`wc&T6i8lh9$d$7wF>!W+(b9JGSpz2bO}J`2$0s#L~}o-*z&=M1Cfm(MIrPn}

    f;NPyp#H>ln-fYeBI-2IPs=Xwwwly-qT8DjQ_= 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%0DPeQUq$**CMM=o` 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 z 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�p7Y%AjGBc!!Hd`Rk}>Ln!g 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

    Q> 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

  • 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�{gWyI%82xXy~IXEZh#8L-H*rP;^TwNou{Z;En)@~X~X3f%JxUOzAg z^kUI{HM`ppazkdW>Aje97Rexv@jOzbGdG&MG8~S(4{RPIyOg-)A(JczR_a!i((Blzx-Ly<=RM~fN+>Ozvz1s3*#|NM_uIHXsfR5Q0 zd7uKBM)B9~V)WCu3ab>I?|r@PjLY4Y)#tiyz>5A{Pm2oNcWfX%OWNa)YpD1u)FM<- z4(`xadWV8io1x1~3qI-JiR_IGOsv{g>v~W~by$ z@#3j0gunp-%2FIKSvpsr3bR<57fSU|Tv4uxp;$@I4IBjcezUx))PqcZ(K1UPN&;#X z9Gb1FytB3N*>g2BfDOwyBp$(-pYc~M$XY3C`ljCD{x9U0`Hdc)R1G~rPQoWRs6>ey z3mxc}Ob&ZaAxOCPNa=ZL0M1`oKM8uhvo1CLZBVpYPy_loTXuj3_+EK7G}$#I?$nyM z>mP5T7s6a)-e+kOMZ9FfW}&5xFxtr3%Y#!&^Gx5@V}I$gu9@k3808ycpgQyN$W<;j z9m#Sqo@vO4pd_y)jd6B0Y_yK1ryO5=X6io>q+3HY!6G!%^kAeOOPWcz?gy zu+f8tvdS~XerCe~`X^w;vqi`x%f9B&y#MiU!sZFslr!&PI4l8y@c8nz88F;+}?T#Rz^QO<)wCvQg)?toYMfvnK8~-bH>%!LTW8i zjhD!1>JWev)sE!Yym_3dN)Gr9Xv7`&eUwPqgO+3hImb#7-pfZbQ?{Ap0G!Hn3uQ|m ztAeia9T18yRw|cDwbASN?0Ppkk1)j;% zLe_Y3*+ETKmpx4kcNPh2e`l)XrL_!x>%G^`N{A*|_glWa`P4uaER?NgN~5iY{-5XT zP9w}?YnrPRPr9x}!!D;RcZlLgRByxUYX6QcbUuC}|8AM2&gf^S>VQ%a5VJ;ryhrQW zn4ej&fUfJr!wGP;fc~yBu)ObYP)Nv4-f_kKUT*>+SYjstKCLOoK$Jg6^GibeY+JvA(j4VACoYMuxC*B70JEl&40sxhR@Qf~U3;2w>O*Ef^>^D%( zdsYrzWJ}s%!XgnT`!bsFQ5$zird03Ttopwxme%u4L(tYm-xJYxF@T^BcHQo|dMIps9N=pqq`^vZUxlwhEAct)Ds?Y87*9wnk}{yUAYVuz zp2w~j0j6}3d$E<{&xDSH_KSZ-OZw%^Euzyq2q@w0`~nIpxyNfWP6BP7Y7b$H5NTUw zG0pxn9#>=sW@tXi*mKC4!657Cf1`$0=A0x^Ch^>#gKnssiU-2OXVD0vaF6z4$-YbUZ?yNNHKlG{vooRvS?reo<9#}waUS-p^oY{@NV-XJ zD3!#ypWPFGBmKxTT;)aNz23h7L8+`;?cHtI(TM;WxDg3UG{lW~^Di9WS_Qo;V zL=fAmR@sqv(lS&%nbrCW+JECMM{)gr_V6%{Zl@V%*?9Qhv#uLGPFmOgZ2sy~7E0kX z8!$j8YcKC^+n2Y0-Bf^=8|S@gwYLs>$TKa!q`BN)uwy0Zl4t`icQzOf>rtXaepGTx zk##LgoioWD;E#?{L>2SSSd>~K)d)Wsr(I85ZR-a_?Gc3m(G_TI7!aAp=0+8}4dZ$* z>7ZHk+7Sv+UsWnG#r>BTA@I=;Leqe(pB4Dg%rwwG)jtm}^4yw?0 z6Z$281RcQ1M<>mJs}@$UrQ+^$U~~9d<#GGdoi{Zf@)3tl!AKVSNU3rDrBz`dm6xVK zPX`K#PV#GQ11nP&<=S^wi!OhiHHi0_^ay`_C2WP2wwOJaPMa^l;D52+MRP2VqSSk* zzReazZTgMs4;ntVZ>wmyL_()-5#=!RT@Rb3t&?&UXsWa)mscF zgVAs(Lj-E=m@3$El`G2>A&v_-iY+QAyH8TVBrG;SwN&P^ zKUbDEVB83ESrO=3FB9)?ltgDkZ`U+53GSPn>vPqoxoUm38Y1PuUgW`{5{G|B`i23r zXzX*sxKnzqqOOhRTOOV+(%Tl+n>#aAb1-OTBZRVbMMNmlf_`1uE0Dkl)bZSU(HISz z&E^ju1-c8H(Yl;&&XFlCa_`^R)T&?NgF3vyu>QT@V<~KOzxvpt4{I^X7x#ti)airB z`eIQ-${Q&!xU#O{D!O4}Kn&)VvqM4B>C^TH)?Cm>nDN=&?d|<))Qs3Py%K@JnM0 z-XJ+vvL31=HaR)Jrrl|63^tStM>*>@4*N%k4R?AzOoPQ}d21Hgd^S?VSVslk?bvMZ zmhqN#o#f}rVWk3{M=o6~QPhz2`gJ%_B1H1=z z0JO!b$8wkSlNd}=Nbqlv8KmlXK(}bFtE$2p-O`)Qg~D>ul}a*KMj}<^%ndw$>ft*K z<3+zYri>hgT4}0Kca{7hw?o=JrHYa#PUgeexF0RYQR_0j=#|x`;_0o{M^X|u7r%yj zP(#1uAI=FS8aN0sD`QG&A;l3DWk(X&c>0aLRzh>@lK;8f9RAD^e7AAXJB`jzew=bZ zoKPu0lnOu5Jcq2QX2}&gxb(uWWVa=U(<8QD;c*M35r8c?PGouCfDL~5LQT1U0?<0m zKSOhsBj^)6O!;;pX(fu0sqOW|PMuImRPOs67Kf(nKu*L{i8 zudxK*BaL@(_ZpT}uozNnz&SwNyw4nwh?>FKwiKqlGnTQ^r5Sar`)va5KMx zqtdnl4Xr55N;OSn;hoA@8R5b)f_efqTW=f3;WA~&nHt}2&cC0xuC0e$r+H237!nIp zR+1cnT(}VheJsX-+T^(k7DOKbY5O8Yr`mjd_T!|ntUn_Xd@@^*Ir@UO4YHJ!_%kq1 z$;L(Bs3;fAm7O(Z)?H%5*J{CbNwd_ zK2H-xHcfji=7J~I6l*fMz>P#UwbGgdx_VbSv;r$;dwC$Twb zqCqaU!${zxDwZHmf`@RiBuYN9x|EZ6JZ`X&AT~>9=jzDPp+$w6eW(PFGwb)z`+VTY zoH7h`32v7S1}>Q(js`2A;KKca*)ZxSojm7*VCiY&Lico&S+iFVrz&Wge zylqRqvkbY(Y;aJ+KJ}<;nhS_2D+SPcms&k%@x!O7+Rm75aeXT1sCozF^+V_Na}o?W z?9`StE=+xS3KeV30(2^yD6CqmstEs(;mz_D^g)#~Oj2h!*j6I(z!DP@ww#LxS`D@~ z8vNaeV#FM0udH7Zow|6j@T8Z8{?QWTjSQIyPk`>O+f7o`NT<{3@x=H?a&5`{b&01M zVG~)U9JWkK8y)JV@tQti;aQCM{SL*K(GL0C3qRAFhRVe(3C23V@y{JNSO z21I4ke%Kp5;M39HNsz)2nl^di$d8BwWHY9spXhNOsO)v)sI?iVw3dR2>Lwjo8A!m+ z;{h89pn-N*C{NiMB&9mjD1>CaRy_x6cI!P07i>KLn;@XKEugnN=o>;0R^QP~mV;QH z(|%NP*BK8Q#^Lm7LT0R4NO5fzxQB!#|ftD>o3`+ixd-`-afWJVOgV z*(oELoPs^d9Z^VG`M`PquMvumdl*D>UW)Mcg?G$yNbCq5rx6dsq1QBAkus}1WCeSN z#CqP-7tdiC(k~l-onK$K&)WcMB{zs0wGikR99TsAXwj!e_h_{2DXk;v>)~1;)H^RD zwC?&}k5M#kHcx+c(5A*wTeJn;3Rg!dzsDLo-ylTXjAv~?+ zA+=lbC8)|^Ecpb=4J#F+ejXLK&vqs7kw7U!v+=Q?)7INoY!_WYi}~S1+@|Yl!vE)g z`9)h3MV7@9Iy(QT?Q*O_rPekI-$dHhNNf2$=LOzWen4E^u+yT96$tNQD=k)&jVZbU zw_YIko*Q()&Bgn-wR-b=kqMeLA;Yc;jta>nt6U%t|Ab{_M+-8t7DX(2H!{vPHmDpfo(|4&wK>tJ6q0B`rewxup%_(aL zje5|geaiV~SZ`$u4q0J$7Ryvtkk%SIZ$#d1B*=m#mes0*OKmv%?^1)dJ^QH=P6ZZx z4D{K{m)o3-#-j^OO``1Nu{$1q?&6%NPJ>?Q^%+nP=GW)N>}lS%HnbV$`mbb6kD=Bl zAtfhY34q6KY`XNHiR?*h9t3E;7muSceKUM>zLG@D*vUsp)dKr+!ot6BJ&z`nG;4iG zHSgpW<(jrg z2|RpYp>Pgb=}K6JA64+#joNxC43aW?P61o9h)y?t59Gb$LatVGugA_=@Kt5dz0vql zYDK+}j~f_UwMUX50B<|1D5U78%E;CCTi~I=vEf%{^g$Q7bl=P*-W7VY+4946qX_9M!f>vxC?aPkQzPli^D~wi!wdf<;owzbHVquA@vC_qGH`YoF z*?NxRAcv&GP~^nfbxoMlf$vC6(PdgCg)71O+d_bBHS3Mv6pu0PzFDxQ3VUM>{=YOD3|A>sN0*5TxE?HgZ z4Q9xDSm)N!Gd}B3@h!>pUCPPjj3^U2N|H|_`urFTZr$-yN6>0>=b|_c>ivGb+dF0& z*FyJyU8U7m3d;UEO`!xDp!N>M0uh9U{ZQrolGep(m3IJ?=`w|r|MwFmlbu7|EyIS5 z%7aB^v~z2Xas3f`zhK=Ml9)oRils~SKl;A12yA{*4wMsgn$$LIUGZ!$Pb=5sJxcVp zb>C|b6WhMkgbK^0RK;l!o|;v&Oe{ZFj%jdoa?}q3+z#ez!XL8?iS?UwsV17`jwd`? zdQz^OmUQy#;OKeOQ$5;f5m*F8K~XD4??a{iEQBA>Rw|bo9CZk6h^EGTs77et7d^Ce zxxlvPc1LkrXe_S!n$uZ^RzENy-j$F-A47B<91MY%Y28Kp&BC!FA~Fq#w3Y{F^ASls zFC#;weeqmBe7RQ7cF2_vV{uNJ3l6*W7-2tHlFBrbxaQ&jl1xZbyh<=pQq_){|EiR2 zUK-6hRozwuotR!$%iLJCd463&Ul!H1l1S;IgN~;&J3va|P)w67ZWVlRtYs)Vt*I_5 zFJ%zy)FSK@jSK`L>UcsgPw`Eu9a9x13=U;^Yd|8hC|h|%VDRq#iL*Me6;Q^uXpqnPKYPGqO_Tnl69%H3u6TE-A$ZN z5m@WRxVX=UbKSQUFP>#3N(AsP9RT}6D{5!kv>qARxaeEUo6Al+%MLP|T5`e1SX=Sm*i{KFmGn~#A;l>u zAL_6jh}f3ftn#DBLNC%rdS%sS+fd3n56Bza63p!Cr>vKf?-50EYi%9Dq!(NbETyW6 z0!wj~ruo0Cari6xviO0!Ur?E=y_$FuI|^LyT#7jw%NSajQuBJ;W-W_{g?cHjxgD#N zxgtvnsJD5f9*6X%c(kUi9EOhru$^UN-W@Gke|AXAz`;t(5-O?F%`YqV%QHF_wG_ll z=@V4mRUd^}%kEz`RO;70-;jK%h_M;I9krxaQ?^G1H0c69YF{$OT^!ie&EJQhtpvCY?^oifc$~JLk+wvW?&srZl;%9RNx-z#n?$98rgv0mGtHsx(n&Sqp>rP5BkR^CkGA7mw{9K zzFgM^@Z1BTo~~;I5#uG+fOvMzjEuN}@NhPG3Hi-+Gj+Dg1${!MgYKeit}u48)gP1; z6@qscec!xf=yC)i3C2#2Bq8IaL?mj4uRj=@`P#-{HZSDYv&%~FT9Fj3lkIl;v5Q}j zBAdo9WS~C9FX>1|pI(<^iM1=E7>?p@NurbJp(rfI^E-urew){bx684sgOjtP`tXe6 z8-#IXUK&a@pk1nt7AkN8Z;ER=d{#QPYqOfUqa9pKd$%h^I^y7Z>Y+T-ssybPwcDqf zbsTgUb}Vroiyr&UL;k2Kg=P}D46f?TEGK%E_emhEkvhs1{p3m=E}m;Q-!GdNimgbL z2_?z+zAL?$)=PaFBtgICxU;CHXzoU$-q2+8h$k0amg~ zEB=O``N20CF-=b^k?%^eSr#WCo_C2`z-Ht0V0db%u7kDmj(#7ca2*`yvkc1_hFT79 zc)1=rPIoHUetx8N9k^5|HSfhQ_2F8HuQ(pXng!kt-aqGX-2D0;t6isQ*l8-vy3EJ7 z20HSHu*D5gdCj6Ti_v{0f2jqvS)+hv4MKDF@a_D*Ye7y<`=|Y>Pl74vE9>6zJ!U26 zY6Ifvo-HOxh)t|Muj;+-g3vZG%6C2ajreHSB-C*N-*onpk{>t}oYg^~Zvqzq$Pbo% zoCrk770M?+gjCo1to{`FO)1tEMOZ>zPJgBU6wJ&UTa72`w^)lGZ)brf8G_~nh25v6 zIUqRNu`18s^64u%s;VvJmUA#+xi^Tq(hac{zeZRW{n&S6S3wxnB!+ji&`X#XoL-AmsZUBPjemO?8bg~!RjHOGcGsSc(3SvkV=bvZW~ z{Lt;ju@6*#(HVXp9GI@#Xsl0jUVsua*1XrZ7gIQabqcW%9_`D( zPP9XX?Z${3juwL4(Y$gk8m<;-Qh1_HY%C0M8Bw4Wzk?N|@Xb(r6h3}StypuIH$gzk zf0n1V$YQoY3+ZHtPr}!;GK%Re55w>EpkW%Az`^JNKM-xZ4Ufo0O?@=N;G|HB3X1(T ze-N7J9<<1643`U@pe^PtrD}s1Ke=>8>z3eMC`0jr&07ld*_5xL-CHjVQk}4VaQpo_ z{L-Y|r7t;9N`7+YwUs}2`AnVVD>+ZhEjVBot>C5A{w4pLpwrRvfZPXlLG!aOv zU9PLD8&r^g>iX~zYz82_bQM|en%pR|KMCmva!*5B%zThF>+-5T?)o7?H!VZvvJu;T zD@Hb{4f~3!;3dI=SF;Fq+&U@r+u={^1?(kpXV z`&t((u8 zOVIq-1A5i|h_O7fVi@(~{z>=nnCK*@7c>-Ub6pSQJa+B#%%9tyjmMOYX_tePvf3~! zff9ZZf>TmFTUV_MW_C*iN|{-&k;iWXB^wb0)ib(udG+3i_dY{aIgoSQw7d1sPPLCT z+Hzg*_4N`9INP)xvnD{!i!Q%a{{kU5NL3Ug2U(|e%~;5f%YjDxg5r1Qi@p>Pr&af~ zqgHLXFN$DIArb_=_2stnNuIgIChKkB5yL*$vf*`|TpXSD36L#ttDa9e(_Zc7M z_2Nc&7tKvB4SdB1d}`fR-`+m4@F*fJJjRu2QodMR48h8^mCD_A{_5(_7Q6G ztEe3V?}R#$FEXU@Ke<|hnQ7rDl~~-dRs7IwJSRBJIDsog6tCk2>rWGk-zK)Zb!G}! zoEHlyxN7@F@jkT!eVr3JuBc6aRg6^qUuxaCYy5&qLnKwc(tARI74ehrK^4_@YCR|D zc_iQ3e9-oa?7x0Q+wdKrg^hh#B~Gzz^#G$QtSIpHQ4Fd(j)-lBnJZE&e-K!ijIwNI zj$X-4_h=vWt`d3$B2hMiN_*q?osRxCtF@*ASYzmwbLb#Mg<*SC#Tk(*4C63M`FD_% z6i^t0Vc)0Xw7DhmBxUdi>$-v<7h3C(^B>E^B$4Kj?Q<1h}9=JCb(%|)}&)Oc%lxrx)*NvZ}F zoDWT#y9?x6)8cLo=@mt<`?Z871X zR^aNy%93!ThSA~+l};XI%Jn4{(mr0Uz>*fy}Lkky}161F48a4Hd3v0K?4V?W3zT`-)}u{or)#6 zr*f53ipl4c)r;u^WLd6D8b~27T@?*L>R=J2x|9vkS(34XCoKs2G*U~# z`TNQ_=r@&eux4xS!~28q-m-g@rhv+M8Wxp#-!7JC494weJ;9Y6eO97^SgicHuD6cK zu|x&VG%*|pD4!N5YFce@_+>P3=9DNoIOETAip9@pMvf=j$eX#OM;;i3rOaa=f{}9w zmE)#`WSE>}2~^kBaud&~pfSahEB-8E^8xb-YAnC7_xWCuh*5}I%jayAi!z>o0b5DN zHn<)mQvxd|7B>g5*i1~DX8LmZSVj7TwA?h;Y~9-3mS}L!q~=|c)383=acy+?)(Ep~ z!xUnN`vY|N`1!$d)|K9gM_cX-Sa}DC{`;us9C4Pvr`j7`N+rLen_?+)py)8#Ax1N4 zn^&+vOQkIQ0j+CroHz`CE*H= ztr(|=#|q_SA=S*%6@yhYgU{g&PV0lgS=SrAGAmP&Scs%rYa5uVnu{>~M)oBkruifC zACx*-K2}xY-+R=h-FzhHplj8b{R`M#5!^28qU=;Nx)_B z_zVFHu-Rok8{y_2aI?eTa@oqe$X3H`f>KVV5<)!pA^}y2i;CJ#&Xz)@UF9z4gP?d~ zu6&X>dV@Y>%{(WsG+Ew=lQh$)QN;AGuFq-mTd2<`$X5n%?y1c(|v2re8NAD8N zEPI+8*cys|Bvox``XrO?>jBqUPhedaS<(+UmD4ucSM-_=TILH{@T9sq1 z+)699p@mp!A?z26frHEjVVZ=ZV))?MvJgdflY(aGvM>0qf!;!v1Ssduawm&@Zh!DJg?V|*OF>6-UApYd>Ut+ z2pYTr#a-vr4iL+L~yk7-CJ?pj9y18ABg!aY0Q6O5K@5Pz*6RBfoOIe0(kD^RX*=K&(10#wgPE zukw(%6S~P2vUQOla!koJv2F9TB|2K8;{^v;6C-F=mIu5I-kT_UgJ^^^DXF@X^6%7- z;HnHX2wrI65&YGfDlDs1XTVoX$SeZ??`u3ul;3kLi9B((%k@vZ zqI-&KMQIX{b`JM)C{x}RE8t5(RY0zcwRq~g%((;kevLnrXa2hcD)c%@E)wC)m=qJf#P#Y_~#D~P99AQrHQz3At<<4S6Xya+z8UeNW17p7hSk1h+Q>8k$@oC zNd5lTopaC3oum`>!pyn%-1D7t?s?t+{;#9jtwu+2N6(%6cx8ZChy3y6^b|*c?kM1|cZu%QV zJhYgk_e-5BlztKaXfj0ko7ERt^zyz2dZ#_c2RU7>z|X^%^7U z9?fQ+jW_wK0o9){)@Z%*@;cpUm(oOgLD(Xj>>nOJ9XIUlj$kPCfM*R&%!TSAtYW>v zO7ne|Z2rn)q&xx-qSaSGl;PDz4vLnJj=j|ffmjcG^;OA>dz=V{yuw1Sx%HXBjfRD@Efo?|K!e3P>C&jMo>gg}AW5}MY=+f7CkwXk zh0`MyFceF83(>yuXA1Zp=AGfVG3bM<7qan%2G2UgzoG>?ZZrOfWg}%w@xB3WfOgdM zK(mT@1$!?*wV0(t5*)Ncab9nV4?uI|*T0N!iy;zL;x^=rFvz66!1AIgfo@33!Fbv7 zwjRzGPt4ApDwifEOE5Q6JtozRqAz6X$B>CY&)rhHN2vW+(nk;A!0k9TSH?&y<(GK0 zVI=-%K0>$xAYedFh<8loCR4@9(qf=ms7(2q%;_^44-d+zZ-Ct~)(L}##hyjOvC&eq zb)H=DCl)(j2-AJ=cx9fe#bq!TNT?GPdi2F=&&f)}-Q&}p=4rgJ#2Y(%@3R){KBf)G z2L{t-P{BD0c_y~xtUEw>?zR56X?KQ~q40^O^!Cv6Ao~W`h`GR*$MK*p%{kOocV+E^Obu9sX zAF+_)0X0eX`*qa`o9y_oK1rV$5HF}PjyLaH(>cL{O@{RN1jC#KrNtjQthfyG4t+tu z)(C86-msqgqWf8}D%qaWTp}0|&}^j2By7~S^Vh?X@|Jd_tZ)AaNenbRXwx8K`(c5> zV8uhrXBYG(u;)E<5`7MMGfPwTy-Dp@m>`w|WG5y-13$9v7|-L?HSCrYP_Z#}+SFrd zqniUNn%q#s6U|(4p$z44(jEuXA(C>t6!=c`fg};)CQa#CL9j->m$s;&)gEVZ0rTpPlDSuCp-f-3qL%4sRho4gXl;Q^!e=owF z_!-{v9npBJ{{_WgP<&8*?rY7GgLm;yX$)Ued`sN{~lOsQ^V&JpHuwWKHT&UE7zhf zOZURy zQ`vMF&cbVm^UHVZ+WzZW|HBN6|1$BJoLoo1c&+Dfr{X&836lUy>mO^lpt|f#!S7Ca ze#_$z!)wHQLHWO(vy>8Ml9%pJTyyyvpZhvl|FHb9{(l1(#!*(o`utyhrWtDxw#xkg zH^Z<0ASq`$-cMu@rrnc*AN_fiajWmx%#>_G{Js?YwWmL1K;iIXEz9po!RHE}Gw!4B z67YEZS?r67@3IIDuXNDL;M}i|KBX}dSp6-0HKqKop81ghPyBwcDc&MSQ}CA_`HPc0 zf6QjCAgo-&&nP~u|E-x@oa7R{V7$ZdewgebNqnUy_^vKlS@t6OQ@o6A-rBsj_nKD( lpKh%0;3Cdlw~{19^2)h~5p8RipU0`IyEy5Y01#Zde*n!KEwumu diff --git a/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.nacp b/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.nacp deleted file mode 100644 index 146958db48f433dd4f7e3e8d09a399c5d090bc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeIyJr06E5I|vnI)&bHdjpBe1&j@ivGN3nVH?)0*mzoRvTBe>GPWcp^R_{zK(MSZ z#XtU~3Oy72<6n<s)KP&JAw(r3i diff --git a/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.ovl b/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.ovl deleted file mode 100644 index 95495b80bd89ff03f47a2ade44395e1016eb16a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011772 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℞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�=UMrL23{6EHX&+QhmT?eQ2N+g@O8!nW)jF)p6m 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

    0qdgo+LW;_+KDxeSkBG5SmP*QU9^hv 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๤aGeJSA^>p>3a<0wK+M2_5y5qy97tJwNN}Au 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℞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�=UMrL23{6EHX&+QhmT?eQ2N+g@O8!nW)jF)p6m z7nk}3bC^x%>$->y%8$%neVEtJBL~R*_PYg{N!5=2n#_^+uqJtsG@o;1UPO)&9mr9A zlq&(dpC9s^jXyB&-;gWwvCK(7Ag4S^9Fsqg|7UC&M0azx(_mzoA;>aAk!6Mzl@O1- zfO%T*>LRb$6y6=bv^jRE$)gh%{^tCyxevYL@waHsJ05%gst>)qR_Z#ju9@F;AVfVkw=nR z?H_&kAvoA+(`c=vQF~iPvkzqq3NBbF>mo*+~S!gD(h%7WQwX3!wGFICd!yJGtl!+YW3%#5{ z4jSAd2Te_ICMBnJ(!$`c-3IvBM$^CJS~c6ZuWOf}u!B1EVey)R`Nbs`|m?~RfTm-ywuGIRz=~^G`2s%W@ z{0l~feDZkP4w~4ndgPbk1_#oddgGXO6ggPcNZ*AhAtHiAsfF0Qx{EZgyZ9{5r?Y-1K+7a&kq2Wh&b_Kp_ zOxZo;k?*sn&8`W8FHN78QWFes%w?bDI_qA1A{w*cofGHJsoCvFqQClTe`n3P*wWhe z4Yrf>=69<(v|vuny1@op{eo^agP;M={Q1{r-XL<;f8y`n`7;^X5jjg_tjaCOA@K4I zlp}m#NgeuJ?k_{G;rWqT{&#|6djom^mw7EVZU1MC=K23g+jo(}i|B(9cT0fm+ zJjnW~0XcX5H%((?eYuf%V|VBIh&~a%!r2Yll4H$zWbT!`ACp(+07)lBZ-^~{*e;hc zu49RHo}u&?umh8rU5!h5HwpbjiBqMO5=U(uajjMuRio(V@0i=&oXodl&*-X75TaCx390izWVg_)AegccT|;gi2vp24zD%Q=Gjj|{~5~1 zRmIi0aBulUiwX<8on0?}YEyY9`^m?MeI$NS8LM=&3z2Uo!XH$oDqD>n$d;+n)FRGd z>Zh*7L+?MBRO9wX)U}Ve7xPD&7tIf=@IAVirJZ)OMM1xUK*UW z`E)y<&C6R4+?cpDtOlNs-x z0vsKvBN$vtePQ&=5WPzC1tuSXsjx%pujvQ_0rE6)oO49_CV z^t|Jjc~k0t`p_@me+|!_+**&WsWoHjr&g-5HRaohizl|P`0sA|iRAYe&QRysMr>x{ zf_Y+DLqD9sr~b0e7uuWFJ@uzn$Xo1--O1h6ydS1_rpdR`0V?gczAM`D!gBqyVy8ek zjq4;nrJ;?-E>mn1o_byX>~nh0nS{St{y5qnQ)elA{;sxr+MoMjRi4rvI6=83a@G&< zDsWyxtjap@`7SWeg&)`oyF)L{u?6hx<>;XG0`mR(TZ8l!=io^>;JoYv@d;eOeZnuZ z3LH1ig~y03=?TW*?}7OQ;3`+Yn0+L5^>rqfZz?hbS)ep1GtbRHiZfAoqH+sBdV9F;%M zJV)%3OvH_nI6tDR;H=p(!NdWpNU>0oFH+K>spmzuLMtR?fI{Q_rx7{z*Dy_ZD>V2*5>!+*!BO3Z*7?SC-LoN z75=Ypf5dO2jBnU_IwtdNXUs3(UW`Rw!Z-G`98>sq-1*D5=kbMD#y4#F9EE(-kNf4@ z3l3GikZ7|)3f~^)hwy3a31krWVw~`@ zY12~2=>y#f^nVa`q9P+~!FKGZ5B<(~Pe69@EhpD;u@F!B$3 zP<+Su_bmUmW)G~YKWBhLm*vpkEK}WsW<#jy8Q>A01o0s&lJ=}`#%EJWaJ=B{Vo6YZ zC)!tVqp3%TdUf=I0Wt3KSk+ju*uSa)o1Uk0RP~y{1FI?)2UN{8In%BV@vFLmfAP~7 z@cZQZDz0L0X2&0@mNO$o&JbTI`F7mwU$wj?-%_r}*XhbieTf%r(3jbflkjJJ{`fK- z{iiS65mP$)V|jk1`FTnE($TwlmT$-3)s?O1d51jv4XHYA9$NJo_tz&#+#A2D{6O%@ z-sz1g&g$ORntEKrSGG)ibY~KS;VORmv`gT*laC(?`Zq17nppFlUHf9xS^giv|E0b@RjiXE zBql^AvbJm5xYPo@&W(?Mn%MLb>%jCeeL9Ccf9m6`PDQ8j<$j@?HtxC89!BiVzU^Ws`N=XLO{d+?3alC^K9+AIY+ zi#rKlo5u?aQdcVFeuB7-LW@^u$3f}~)0-XnF)1#c{i!J8ERM_a~RkKY9>b(HlPwudu^#+09-%*U0VdmrWO=KoO23Do;IMiECY z1{}RS&z5)Hnc^Ofz3p-p?Y#cn0P-On~qYQJ4)*OG;MMH8_>}N z@LbAXr_8Z3x9$bcrU1}IiyW^@MVG_c;%s=+?Au?@qtq(VfWzogeu!uI3@LE`g0gGahLy)r6MN56^K0jG%@$Y_dS`m zy+aJWw^gXSKjUp6f}^CdLSux8hJ;s?tX)P zRTp`^GSF()l~04qw;s{*lIyzutNc6oF2_*EN6=F9{;V>cqMqISJDGZR*7bJ}t!wX| zOMTO(6{b#w2E^8VI5-mi|Lc01vWy=8s#f5}>tiMUQ#aY07XPVRo_*=Sq7ZZiUy}L8Ydh+-=@p+R+UU^}3LK@#oZ>Ga@W?(e@e~@RE*zGgm3eG@iO%Xo z-ssP>(2U|NF=AL$XE5(?X0DCHXT9Vs@l*TY-`!1>btp0BwPWAfH<~loPpaIr2IHpJ zLpPM$bk2VMOAKY&vC-+)9eKD6jY*GM^1F03?%wngKf{cdNV?4X()ITH)ARj&W@tvA z83x@0>BeIZq-PlYW{f5I?07KUcl|@@CB}dmFOmF~Je(dn?)T~2jiwpjk-{>^rd#a! z=}pGq8JchKj0|7%jIpHe`)WCVcsgyya~u54f85}oTigASkoUSjl5?}$qap3OKbnKS z>4J{2R{g=-IjPvxXPBMWoyY-+GovjZV|(#bSXFuUDQD^`#%2k!LS)3BqB0CYuIccj zKmCBtykv2GL%wSK@k9J=WG?=`X#nJ3pUaIMW0dDM(k0=FXF~B zLz(!{1*6+a%iDrzS9(}{G{h$$ux-3H6h9yK1kLB@PZKgw(+O1_1HFaA*RX+~Ejp^E z0Q|#&^UMinbq8JDypBF~^UktHJxkt7_R@Ed{)VpkBKE~2@C$Id5^L6@3yH@@KSS5{ zLM1j#UE!fk$VUy#XTy+Xn!@nk6+VkEl<*R47TkK3byS@4z`t>(zVC%7y5C!pDo#xq%G&4L!{S86}&FWa1Je` zu*Mqmus%9_;X?`U_XjUd*6A+j#13v6=!ZIVn)a4{$XdK;-2j7ueu%5d#Kz$^z5)M3 zS;^#$_Uw5$v=s2&jdDWSC+|-mByb%~(!kRvl$8(e=Ff|^EnO6C8wRfKVJ~FY>q)kg zZzS0!;hVlJ+=xwbXKj_tYrrV|ucQA57P06Pb^_Rh4s^7~NfLTke}%Kk z`R8dBojv2*g!iBFQ9VofHv_tMKnvnWR&b#SUoh*YkDRJ=v zt7;|o$u-Ki!&jW7iL`MFHu`1Q>kAF|@=o-QLIbjICH@g7=%ZNrSGUZ8 zF@8JJ?aM23G7O;?)A_JSkXg|)m)z6P(Q?_J@_hY8&!$R(={)UOP2M+^)zh9KI%oB1Lx3Zm_`FT5nMbgPaT1;D(9b)%k8uqNHo7mM`w?4% zy*|#`A7tJt*-X4k)21mrYa{ILtE{OSVtQzmwCO6>3*-@BBhk;h!L$5x4I7niyt~7H z?Xg+A7|=tz8IYjKy2!$M_FMKZR$%A!7`8>H&|?RMsM^TyR1&sde0@SgyJ}~SEwNnlPu4o)R}+AZYmCm%vu4`#!V9CH zs(yWrB{hS6$u3&>nmFxYWUSVq?KSJc4%)qe>DpJLTic5JV8dqWp+zxgUZ9Lbd~HUM zW>D5Mq^+cD_}xg%f*4DP!+VCntCYW-@)f>D2Fhm!M~rj8{eP}LD6}2 z4~KV?Hr_$MD{`{*x9nN>Tfva-Q?I!z(8Il}_doE5{ZEYk!`Z4ijsuCER$6vGFc^T!Mf_9hb>aM?H)ZIKne+RQ3HL*7tGz#Cb zu*~|m?1SpJ>zvoIad(%6xnH#Ww7C9g3$JP(UoH56#$~Up2l(g>KG5}g@G%a(#tPoI z2Omc8;nRYT!Qf*M_!wx^$9Dz?Q^3g-aPkE>*~@vCf{*L7II|0Vws(yv@XFd&;N1nh z*MUREx2{fk_6HSw%%*e~WX&@k9+k=X=)4G>IAfu}b0)FDb8hFvKq+&_#wC1@S)>n_ zd+!?hPVW0Hko?{W@f>mj0G8p9+5npP-dJH-MOVaq6El^;2G&yHxfn@Mr93 zc-EGPED7D)wjpy9@2M0!@fc#nF2f!?%a>ToFYC(0ron}-|2S*TH`wbq!JIpdwRwp? z@Iog44(HoNquN%{=-eDkU6q;ovZM3W<`I;CCC>Rz>BC?AfA)D`U$S;k)g;cI-0+F9 zJhpi9&EtB`lcAi>o^t&!6foX9@!W~`=zOSKx5*Ij(Th_nIjd6V>)}n}|6HQ?zpw)x ziKma*cq#xvsXr6qBVdiw7RL-Y4y*y#?4X_9Sl7bHLuEeo)oSz%O3B z@M(DYp?R*G)2}V6zeZb;EgIK)V6t2gUF;fQT0?#dbH+91pt1b((Sh*t3VgnIzz0tn zLV?NRfl27C1ONNL4=a~DH`n>9&250Cj=u2yUvOjR+%b6XwiI-sg8LZiyhi)$ke!dw zw>>=YgnMv*7Mk*<%rBCijZ*~vPr}Ou_Ol&JtM$CU@{N7*WndkVNNh}GoVIPTDPnAX zjxX59xhzmgynmUs#3l4_6S-FF{7qf3TR+t{PTNDCA^shRDbay7PY3M^wo3u}RIMB7 zsxBbgPj4}O2ww16YAo=yM_nidzq6&S^mz<0-+|tY{$ISfq%^#|gxDH(xRlmnx(^u@1ao&9G=TWK_`8q=RmL9&y zy7tO};P`VkbNok)x6|M>2wXLvEgrt9^q8(JjwW_C#ho51n3l z$XWe|z`wtEZUVdp-S!#co~`?=b$Q|SMfDAoaVUT|yU_nA>I(xW=(-x~d^lswRQKYN zo2oo;zWwGa!01Ac>;oKcR_e;8lUHnmD%qnQxnE)ie^@0l$2eq;*iwC&^Y+nwl}h!R z$g}XZ(n`HYSK~P|kG;K*7Q(O0_&u<1Qqn`;*Z}`4`C8vtlImOC8r=T+Kb>;U6M0T# zxl;8&T3jOfK+0cbd?3xFUK$;wSG@|9$upPwaF(3L{MK<{P+q6$!|S&rXEzY9$e%gx zsOszrXve`i_LWiD!QuEsH2;&NOo1Wl&!e~ZbIyK4_jHu^y^KXk#x;Yg2jaKEy6j*! zep16(uZ+NFDhGe5T>Pby7y9HK!e{C_K2z;ywae?Ew>Va+ww8E*WtrSF$T|T3sg26d zWJhmGECojb{wALUg_=g_Os0?yK_>CrLm!fYtTV=c`GCfTMfjeeXMwKg8KxGb+VL&Y zPc10!pby1*XkdMN{Eey>>a2dm{~o+pXPt%*jSC-|RlJ+k!Oxn5&rB{pGb7siSr4W7 zS&uLB^Y~`IgP+W+p%zCRWeiRnSih3|0aIg&Wq$BI*xtQc4XPH~iDmHV zy~aVrvGsGsalg-B-ut_D!aF|>lJ^0w3D{kG=M^u$CMbP&2{Lg~t{Q`%?z}Uc9dH_4 z990I_-h<1cHU@=TY~b3NqsF{VKb@nk4qaIG8?<3K{j-_&Y@rR4kbzc`Ugd0$J*1V> zRF9G1cQp9+#m8$9_#8^P`;#rEH^6BCy6neUhfYWLTE%s>>_^}`c%FMR@xw21-M28z zDt_XLi^8ne!N)0NrtH{2s~Mbzg6DUV1FgHsw}E_T+Xh;vk;jbR*GO;{WC?Tx@Z8Ok zYg$1Zz76;q`4)C5ZbGkLfDOBxck~49-9Nis-ho9vdAax*9Ym-5Nr19kPcfMS^wE|T zz}S&}w?NAI3_gkdl;tom`s1T$Dx8yQE}T<5oo|zP|2TeU=kTGu#J4NJbWhtb>z0LP z>ma_rxyWoyB8Bz|v-+omS>r7uOuoSQS*VXAi0}LDL5`6r0glkZZpBT+Mw5Aq1C~7S z4Z;^H8(*l+(CA=nl5+5adK36Q28a8BFB!a9D8ok|WC{X~t=LR7!#69{w{TYR48Bd{ z{ch_2jDGqUTFd5s4{3CpFzf0hU;@^AfTsiRwvhioSfE3EyW%Z_OmpnMjuG7g9KnUj z#ZB14m9`?D8ovF4yFg$I0=67*=L>8;z;+;o{V-sAhdBF5I&elgEI2%{4FY$T#ncCm zLOAbdHT@b&;_RQ|1LXS{IHwOYTlWL!Vc_i2(`+4?X|}rgHhi(!`Y~5Wn8{%Q)-IOe zrV(~xV5EeAw+_X!FDCZogNS+fIIz75?Y#l*Jq2u4(B3=HUJiImB38>tz0UNSF4Xi1 zwEKn%F&&1MX8_w%z_N$B1E9YVzN28#G5e(mM2cImDu01#G*axx>)h8}#XZXl@TQSCnEg4Fk4= z;H?X=i67!_c#XTIPwxSqRp2dveU2jFeA`_dV?TLNWu)mm;~|iKy%H^Pg3YeY*mm>{(dV2(ZXXPP z-U#0!ut4r%`uP+3dA{v~oRRRE&*1$Ir=n$AUF-G>pV3#E0MCWUIQ<+R_fVo}a z)%5Lt(KBmoX*nPIMb51B3!k}c*^u00Jntk~N{8eolSYvy7zWLJuub&LS%!f#XB!63 zoNJ7pdH;RUxmTZ4Gkf?(&up!|oAbweBXi%={+jbo?fsl~gN55F z>HOfcX4jQj?JSpeR7AZF9wiQVQ5=50?3)SAUVtZ6(Vll`j|2Q~r7at2%W!BT1b$?u zEuZ4sdl?+Q#=i4wjP=9dIuP9N1MkhWJE?diI2{g6m=}jwuaZ~#VHG}@(idB}3hspu z?MZDO_eqOFtwJM-jQh_huN(a7344gcH$`}6hvE`qjV0j&F^RpvX9P}o(W?p_4tp=>x9MQ|6m=#U)@_3(n7a#{C@VWKQuO-hIyZPZow+yR^{B72w!I zdJWj_>DSDcy6{{DOt~KT%pShvz<+cFd}(8Hpu-=Y>4C2;=jwRjgFlUcj&q>nH-T>$ zbUYZ|^h8RCi36G}yP@OJ@O6PJhqy%o=RV*&4IDv*g}_%>{0#3_@Lgbg6Bq?|0^e@Z zJ1y|-2@kUhe8Zq!FMPX!Rp47|_i+sF1|KDUy$8N%0KTE%Pv8rIhYEbVf$zEpzUFZz@IBrFpWx67pWts}3w)!an&Fea^};8yP6WOu zz@H^0&|&fRFLs;%>R#`7{@ zJP8i3g2ShQ?>IOVxoUq(sA)L!;|_2rV{R9A7(ZAgjrYeeJFSo|LUos{*H-UQ!GPF$#$b7q+1xg zzN<%O9HOZn!+~osa0!n`&ajLCw(JyN(@^HcDsUHuOg2jwX7VX!en4KT1Mea)eGa}q z0pI8O?=ZOD1I|Y<-)HmRKH4;u_2Jw6>r^&c`o0XkD!I; zZ54eRMtxhr)ob)`Vz&U(L77A8A2a`5XU;Jd3%~VsZ6*%rZBioYqDKH5zm zVS8lC_28_lhc^Th`}lZEyR+!uf%NYj{+01Jg#I1e&1l*PzK?-#Ss$e^2biEuS+iY1 z?vZ}H_#Qr8_&|7{hjV7Y)2#2k>p9sE_#Rtw(GUKJu8{Z!9)Ee_8#sJf8>0*9Dd#ST z@5l}IrdWe-m3SYDwe0)oI13m1o9XLDv zb#x5U-U;9<(&pbm%d+p$d*S-P)60j?JNCrzc|xy$IQV#!r@q5WqM9hP;GN&i ze+nGv!3ld^liQ;yw6i{U7lm{px=()*WCEFLNZ7#3%N2#y9B$T{m9l{4#wI z?O#RvO~h?+1A8zrTUL8wwlusm#)FUg7JMw<=bWDePC9~_WsaEIP?+W!N)1i0gyN!|A{^X9|7RQ0Y0)*O5#VP2|i5V!wo)y!H2Xz z2z;ypA0go5>3_qA(1*nL5IX1qE*?jxwKwvCv`z-qTj)mcRD_OEa3OnCalkoH8BM*Q z715>N4-M^uX6igN<%ty`pd3SQRRl$?4Zh(#_ zq!ZhR{@5%1flTlOGAcTxQOH=MvY2-)i#7(9s9@LhgR7(Rp$pcfV_Gqu>k}By^zjgI zZiWs-KPP?h5cbiJ5m)=dgSs;B{)y<{*>@KknlkLNTm>E3|JMb%bcaUI$DeG>qq@4Z zRBYeALB_FhrY5@0FvBbBqVoA=*uk=>67*_;=-5JvqVrl$wdQ>RpZt*Va0I#!*0syK z#}I6?F7nF@X*;k!iMno~kNlKaE*s$cK89$^*UHE7Xx}L7S0NFm>JAa6SVN>~%)*lT ze9okD={E>p z<<_n^?)#hMz2@2p&+cKC_u;NAeD2TF&*Eq7ofo|J`FHyrH~SfX;u%xYhthBJ>Fd5R zeM}|T$K1=ccTAt`1@&c7L%AMho(KTO8;joy{F3=13YwVOR`tv`v~fA`_g+B!Mj6|U z%!Nz#y!3yWdlRs#%C+%(t-YB9WL9u*Tbsd&?F61s~e|xmY=~ZTIO?<}V&%khbGPmX8$czniHV)K}8HKu3G>zcj{{K zBF;nYE=#HOOX?gz+Lgfe1pN@-B5Efulh|yAL=V-P-?x-{M)%Ny(WiQ`bBO6!@BYLZ z=&3El9``TkS-s8mA-Z=TMGw|0B71A6Ru>xXj_R$MS3PYQ!2gt0&lu+OfA*?;!+`MK z+PYP14FmZ92KKqwf|l0v{3i1?yjOp1CNwgDG*5HKw?~QijS`XLCK zEme(@w=|!j6Y)2`|9PG@r?t*2jecs>EAcD5E28sL)Z0qN zcDSu%jQedR?dxr7N9M4;qjkwqXe+v>5A0Zrt&JZ%+OzNqMyuuBdl&bH7Z%zsbUm1| zI#k5w_oSTel+%MU6PcR>nUiM9$|R1<_?K51jy}25yHLds+Tmwdy92G3cg8GUTiKGa z5#1x{KXEY+*KzL4`Axw&=4`WGbV6Ldy6~CU$wz1cyqa0o?L5Uj1%0h?t-3Edvs3SG z{#EIc5~AX zV_0i?BLg7*K}iy8&&8BmqHlv{*I!_bUg92qW;(GatZGTsJheoH?zB9nmeej%OBxPh zC%6n7!$@WDHS5FCCD=$1&u-iWbXqorD&v|jSn#>kVNQSO!?T>7*7i~ObNA0Q4+ly^}>l!v`Jxr4ptxVznX)ZJdSgmU09PERL> zU$Up@$Q7TmG8Wh{H{@_8nMdr0)s&a7I2&`+l5=@#>G{=M!Ci{Z`WuQ)n2bfu$EhRg zmZIvOT9LEAsi;}6IvYGyXO#~Z>z>e#YGPT54yB9cpl6q(4{^m$yJ$=*fyXI+0sTbj z&wrKvG13?6!mJVC@)^cKblfCglit@{$XfCYJe=tG9j6ZAEu|juCG-gSOw=R!n#i|^ zI$G0(k}mkSbPwK?PRg!-5ZeI8sF*$0g_OIBMDJ1Jb2S|uQ*^v=Y|%OT?+ZWGc#=LJ z7-`$YoPUvde13yk`Yg0yWkTxF6KP2$&n1jK+T>syFO0NR`zf)#F8 zOUYTrzwveaqS2=e+L{W!UZk!X@bnz*sG*&wNpqR_Ij4S6N*=+_|3-c1lvDIabn&Wm z#+1{?MJKWqH%`-!CSB*0=fVG4d@Nl)q?E+qPyFIhrDOv4$Mwh@n1@5rw>?K21%^_F zz#H4;z~lIhIDbGX>Cg98TS%k{X@t_*=Q)`TKskoiA$ETb#lVK@(kP^5O83 zqW3HQagHz`V5L8y=lwD|65}Jqf#wuGWq`AJcVp$))yj7ryLSeWw(O zlhR&}=ntM)lvJ_~erPrP&Q%4Fuo+IF^XRE6DIryNhoPq4V#l!ez&j259 zWRnT;qAS-&+Z`39b$b{)d*GPpfjkert5I>iw1V&`ZR!N#Eizu`mfV)$Puhx~A|?io z=xT~WH_z5pd9;l6zvi)|5-)+(yd-#5H>+X$N`pxWwT4t|GE_pZvANiLRPCYV=(<=d z@h_MOt?_2xotVhk9m*>G&X(^(^_ZThi~yaZf+Qnllxi-{PYLt;3IH z-9d}xw+9;|?hH0ATN-S9gEFc~GdjT6Jb-&l@I;@(@ElPw zL1z8T{@I1_s}bzwni;FBd6svYj;bYB524%nqgrwdJ?OG%CF4A}bQSr|W%!Xx(Ag`@ zV?SUowB4IAye>G!8dA^NbDFse%{)@eI@y$t|5#{4{e958bc@qTe)fyw8}73>AD_A8 zgTb?weDDZmZ=dRJDu{@1@p1FH7c-V;fPv8XF+86G4##*ti%hpC{_n*vP6O}^z*pQT zYAlA zQ?Dc5SEP2sVJVHohvp9QTK*P=-vK9lf!y83Eu4zG~*ijPqjk( z7{}|#c&#=fj&_ z-K044__mt1f-g=VzW3s}S}~?PrPrrifL>hAbGJ9aXIvppmB9N7wE8$S<}!PwI`G2* zT|e=QQc`^!`!Uvj)|Qgmp71pKuwq#sguX7*nSx^7lp!*QtH3uW?HmT*K7{(<1+m>W znmviJaU44Zd6qoY^hd`#(d&0YhowB%d;VWXS6=2~0Aid*drXdiig{;eIx z-`XMmRLg$O435GX<&p8v7#JD7tEMVOK0e;#y;VTI|ygOPMEVwum+qXvW z@NMu={6`Hi#I))nFOGG^5!frqX zA?_}Huyj;n+vn@Hj$LCdeqpgnTbkuRjXs9o0ko>TBfiZFEy;=0#|y%y*|Q zEX4ud9szE_(8`P4o1u>bdG>>53hnf#456JuTkD~pLN}YCl|pAPLT66{t8C_4J#>_E zOD_PoMx$CPbEToTTH5HMsUa?!dIp-B0X=;lx+?WAq`r@)b%L%A(~5`%JD>Y$?C#D% zSA~|Y<@r2xwT0)tJU@X=+EDzh)<^c!Mv*=YI(ij4nh7mDJ1orfni{W#LPyJxtqC2? zict0>f(yAjG8V5Rzr<>=>=?ON^cZrfTkz!R11}oPtnCxQ4Z)*P2mWGM$8$Awp>m7j zbPiKX)i|?OHmt8Ud>OLH3rgu^?%vUgsqzAG5zs4i8?2a|!-#>og}KYTxPHh|3SU)P zfFH_tUNLJk;X6K~zLUnJ(u(kITH`C-v^&Gao~WBPW-xcs2V>*b&^xI#2p?ki8U|`2 ztN3~GP%Vr(lWC13mP#zPkxIyQ$|#8HroBN7+!N$;C*Mi(RnW#jLr-lmaYDtPxv_mN zvBo)r)zbHW9%gEf-|*oH=2CEyYcBbKXTCC*pz*7~|E=KvDdyE~*8la)0lyf{Cyg_r zHOzsNs+YNeIq(T{U>$Ou?Z_o$4k(?l&A``y%mFL7@6k2~2F#k2{VTDn*7EKV>Uk90 z|7#!3r4#3cobYzDW;``eGj?3689xEB($iEsHVy|OgeV1oW^lko@XuW%4w0pD?-2uN_ z*PwIapF@1xzrxxl`aOggR7Tc-uC8>l*M6Sw7g-}}7~|G& zq2?WwA$er|Ti2HV_wU3S;=6pi5Zk(cuVj4kNLL%>Zg0FmTxR-zj(z`my@&k*a)6p0 z$OAUG+iPjl@dL;T=ttvYtiRBpQ&ArFv(T9u_WmcWd}q&piaq~%_J!xz^Vj7o&IJ1C z4t;uwIJpJk-LvbO)Nca)YXJUa1+Z-=L=hev+}9V2fSePw=Q|JI3m8iDZz=3+*CjP|@CR?`H} zSRaMXi~?uQvNrY5t3HRnTW2r>@5{ijk~w?;9FVmsAl$5((Y>i=j*C6be_&Vhim|Wu zJpJ>LHi8GW;DHBtu$#Co{mB2quyD-~5TTijL$%AjZ*{%Pq`qRt;;-yijg%w%ne9g& zTD%^*ex9}YJLsLf`+WcNhE6)%1+d10w7+1D&kapj#gS9K*@e{^a7hb#e4WX^P zXuYZgH8a<1W8sPP?)Jm_E-Cf!Ov6~~F0e1Z1pRMhUR>&}mI$wUmNBf}p_CR4NbFlg z`NCJeK2_=a70-vTp%k9h$vB;2e1xw(sq5kskA4Mmf|BE}E2ZhsJqPQv4?bE)(N2@z zU{w!nGME`NnO~Jl6z6j2-*=o9b;KU?DtDpJ+pvjE<5_5Cf&yb*tQt!JkO^J)0;O8V~vZnfaV25iLPi%Uf&Qwt2AW6sK0k6}$L!*8exE-!Ug zOvQrV&_;pn8E9kVfwhLafbT}$3(UH4mU)#n3}s&xM%x~q5^56r@R7jlVXxlWW}bz{ zw!~p858VDa-DG-R@=`|-bp!*?wfw&bzS0L|Kf&gwV{-cDPqXx`jZG?H4u_s)p1p+q z`wLOw+86)C4KOz(ryejejLtb8sf|I(r>Cllg)@N)s@+7Z?ct5}euD^aJUB1_t7{__3u1(-Hnl zITmoP_T?80#WIJX@xo)tTt3cutjysKH_hRRysLuOs+>;T5OAf0GVW$fPJE_`YvE@S9AC(S5?$QaodF;Lr)7!lJgf@v^fmP%aTewr; zp5TNdHmUT?u%uFFVp8cP_BY7BORBHo#}hn%kTD(0c*;J2IFmsm8Q1ChEp6jk>s-DQdJqQmAVeo-pXii~LLR4dvdS63+=}N7ebEV!Slyc|HX9y7FJScD%HVqN zvrrdcEk>^QHa<$^EaGG8h{4WB^sW|GJZt!ced<0{wZ8jg_bvA=3)<3|vzC(W%MCf4 z-OuK{;$_+szT=+7a-Mh!+r_F~g@$K&U#NDpjz@mGYWq6FsaX8z@$Corx#m#6=&F2$ z^OF#3KK$((oh}9Z4mx91O7!R))j>0VlhM#V2kU^G9i1SqM0}2A!*1Hy^T3EhzWe(e zI*%@b*l%RB*FTx2IFYxEI|HAPsRmi^I=tQ>=b0j}C*mrxExoO0kkb`H%W_}7WARssEOraqReq+-N`JT4?$=Px=`vI0M&$d|7?i8%AMf6p-rEBSuAEHz4atxl(p^N z#ooxF(8u2LD!zkGa1JYH82ojnjxQ*{)o-c2vtp~=6pTkddr~k(3Hl;&960oL=k-Zf>_P{Yb&rf#{Gl zA}5zK#j}jzDJ%SEB0S$?yw5|?qwPW%YfEJEJj zhBwFIQ_oUfq0-q}i%h)+eUmA)p)rrMtsUc{9h)rV=R!B|8g<kI?IYQ9v7vG)Es7j658x z_lk~{>bSONwP9qA(fAQC5}j3bnJzsixD`gyhw{WRM+X9(O9=X9O@(K-b z05_oxO~Af&9*iiwO znfJ8IUgx14KAvwWS-8|^OXyOsEv%)3?#7pw1K()pz|A`N1Ks|9hfZ=AzW6rq?D~>c z8W0FR`7{4T$9i}h4R|TX&nWuwXORB{VD~T&yjcJ*IG*Pz;FH9ly1qa)4j8E#AH730 zJ_qi}ocATaJ<#8r%)K9Sp??fi&0SqIz|$&vL2f&4cj?yst&IjWu#O0A*v|hveW(0q z^`ZIwmC*b?N+*T=YIA%zB#nF1UuT&x~EHGXke;lwD2Pjb)LCl4+aJ z0HN1jz)SEy4f^~bV;u;r>d~R_qTfr1OBsXy#Cc%W0L*-Oe-fBoo6`!fM&Q+p`92Sr zspK6P;BUU2d!I;8^Ok{LW@8%-FzMZ`WjE1)dC-9Qz-R_As!~Jq&!_?;^*1`*(?tUU z9M#Nyu`?HX{a{Xz@f~0^kNF`m%50<4%V~QAYsgo?=MJd5ZDFRXaZkg4jd z>DyPJyV%OVm{fyx)Q&aiOd72#%hDHrjlM+{a4XaWTQ|JC!H}r9SqD|DM8`7NdiI#m z19U8aweTqT{BY^PE`SD1hX%}s28b?fKP}X_iZi(`=qkOUbTM0*|Ld@=5Q^b@LEG5bMU1dtI?bB zw?1(6IsO~0+ulxHeEPeVjCqvN&a28@4Oi?@*kGfBj1O#`qY|E=+x5&foN0~gc3r=Q zvz)=7sLCMGmlWR;;_Jg5olShUICpws|Bc?}bbJuB`lu;?t`7oG6o9eLVAIrPr_*YJj2%TK}Q z;AjEkv)fPEyPR=ZPG9rd#-$(Sh|k<}F5eD*#eH3Mbaai&48F~{(y~|a%004q4!%Wz zEjqpLe1Z>~Ty%z!`xSduD)#k^)tX0LG2zU&<7cFBnOaoX8NMB#1%(>t4*12W^KmPB zUVJATM-`o&^2Apt^verB5IX$SOoZq3**+pA3;9;1F8)UFMD*!8-vaTzATF`fD_`|ymCbs z`;;KX`8T_|@eJ=ouSum{=vq4qq50x_VkNk?g1IHQw&Hp#t|_EJPhig(+HwniNF}fM zA^K{(QiQ+7(DmSp9ei2lePr_|-v({zv3P3JXz;ci*oBi~a5#dN?0_ z>@No;JHHr^?3~@<%gyWF^xhI>o6~fj`E^e3Uwj^1Eri!#u4HUw?z8uFDC|=->aXx5 zez5nKn`8ESZ`r2?IkKp`pDm_I(*3F`&RqO&HHW$tonW7vOFt^{A1XdPRkz$D%dPmz zkhA69qlyj^7b+LSKGlY$Tt|yKgB2oh#RWDQ6z# z$o#GAIjU$C^CFRQ+$d+Kn{xQ65qf8C9l9RWL#zN-S)$9hm9~FE+jG6X+^j2*w(DH; za2MtDvqd&lF&2s0eO>+dhV+TH*5^Y!i*Jh;OWO6v|NHcAVaUIscMtrD-rd_q?_M_i ze?sq`plw3$UXeEbALyNxH2;#`jfdW){x8rw#>YkP7#A14Ya5sUF1?#L`w#T4;(tQ# zCg6|!|4;O;akev) zHDsTzgCm@Cj~T4l&ns&FKK4ystUYef?{HPkFBD&b$h+~wOItb@KlH3_qvRvjf{RB@ zoH;m7Xw~n0*{3dBk4oxnVJ)2@dU&k=El;$@R;eV;Ogihye(sauX-pEAM8_FsPm6QU z)s{Vl#4)KvUj*Ki{YFT!->v=rS7k)O=VcKCW&Has zo6J00szU5(JPRD!FNvWf{CX&SMQ9Yhbv$VVAEv2N`oqKQ3qI1J6$glkz9q^eW^}6i6C?oi( zWM|kjGB#ljO9J>vKC!pMN8CC4E}&m zoHILK<6LbBdBtY#J6+d9PcT;Oi{n@5+}g$`)EvY3h%fHe@#*Tq{dJ5_Szl#P7UR>6 z@hQ~1{b78tCvzZ6%-H9lyqz0|jJ$AkQ6p{po6gfwhK09 z&cRP!55`&vaIER8WJCs_!?=Y1Iyc95cue8pP3&J4#!BGu6#1t0QT80^Cca!lij%#6 z+&umB&@C+rexGT_MZHI{;-?KY?I#Ti0G+gbirqFRVH$2+Bj^7VxI~R`BznFmY?IbDd+)l#_$*5d!G5)^dLAN zijM9S$sgc|33_hxF?{*;>aS!>jaK%Go}$S*ByJLApu_C2nDJN6KIuI8RuBFJ-eoDu z)OB*?W#VT@*XfYZ$$g5!@k+tw&C-T;T3N^UQ`EbOdWB9z={n_CQ+Flx;)l!8IbhA^ z7VIOv(035JX(64^%`EC`rJMRb8ikbMlZIG=$YoJNiz zxIY7a+W8jpiGj-Cj==w~z`u++R2ztYM%qzHIVQ#55k8RdpbaYY@TnQCF+FdV#fWUC zJ!Y7lF&?KWdt!jOz;7b(D?b#vB@y^7$A8vEePD5+(&`8C1z`U|bIabQB^GBpY?9Cg zpKzgNZ>>J~P>l|qRA0;br#zLzS?ohiikrhTeC6gA#lz97pOUfTHf7Ib=2K=a{^h$7 z!^tbB(Q+GW3_b}>%kfV%nzK1C@R$1{Z~Vuvz-K(q``nf_ZtJ6DJnlza9^OSrx&Wo2 zh`cj{Eb)otm2^2FO2anBc2;NV;9UgYbHbDcg?Cm1v6*Jxi7etw(xFJGV~fe+Uo0-I-Yf6xn6&$ z>DuU`TWZv_%%JiF>;vC19xfD=4PB;6gPJEm6_tk6%m`ZRiMi*#Z6Pw2Yj z3mtROp9932V9nK2*55f-7hA6sa5gK+Xs_a1U9#T(#9Q#SR&W=b`YK4-vynZoNin*7 zsh-VaUT|*s{dC>NjeHZn7=5hbSbf+biFYdWtq1G)@@GaC$#WFXEA(9s2|ptLP5gfe zf2=vWt`3#him_EKdvaaArGuf{p~d&nw_50`tYOpi?uU*kogABEH*fxa!1J4hW>K+ z%)Onix6}FWnCC*L_c3NN#v~7^f z-lE|ScUcF6ixXJ~%Xtof4{PLqeV#tPA7eg+IC9A|BI1OGO8m`sSZxGW(#}=9YsaT+ zjL9VWoy2&w>f*Jw_4!%g4e9WaegwOlhGyED#CSC^hvK-O1V^6I8x9Gc2ra8CcxrPU zZ5O_0`JR@H{m6P77~4dBpli(xr;cqhw)Dw~PF}UX3u7Bryn(T61lQ5IFZdq6olf-f zwvA*iFb^_k#mChh(A(enD>2L&|4Pzr#&7LIjHyWpcFl*{$CwZJ4i2RK5AjXV1_i)Lea#{P@>zoE0vc725Aa|9lR3^O~@XG1aUQaWZ~` zNm~Q#e`y<^i`?bxa31%mjMw+v?}ui+!#K6K^BV1xaXvW>{{_s|Q>+WftJe>Ojz}y| zldO&5PqQY6I=on8dJ(@^2V7-cD2EQUur4UP*CUtA;oT$?yhaD;J$IGZWr@5~d2V4{ zP{LVT{h{0K=>nC8Q=(rO+`0xN@oeg(G+0=td_r5-fbHo2;#;_38}=c-##WlYoOEbM z4GA%|t}#-+DS~x@_rX!*gGN@-CR2B4JNJ$~Th|4Za!t{ckA9zD@78r8f^toLDW6yo z{{36m0HLp@fvgq03y5u9116EjG??sT9#I17I%v^>E>?T{b;RK06`h+lm@mDnE% z>CXq0W{RIO9u1Rk<3Tm?@uNhj+E`ArBABSuh{~7fzU$PdXYh94_;ryHG#?#CLSsU)cS9AJJYePG&Oa;f# ztz&HnE0#4uXzV@u&_hB`3&HhCZEM3zJV!Ez(bIL&;1~EWzPdA^`4RXE8o9S+PZn!~ zwC}}j@bi0G2E~HYZs2%VaJ(CL1NU}XBJ@>gYd`95r6sL%d4HuqZYA8KMm-2)YD{E8#K0GW{<2|t&j<9cTXn;0t zqg_Mw)3$En{&(IV<$DeHM(ScjIO zuH*V3aI{nLa`x%DBRkpG^6eVe2)>ma2(riV+?(etzCX;fBEN7;yqw+1o=7gG+n@eZ z-ygm+X8-QLoB?{0M$Q5CQ{cUBq}Ci7mOV=n;>UqRD>VMLGR)6KXy6MX$;^8F?m4Ud~ark+0o>s99>fX{!3$7$g7q!}$HVy@|w9PO4EhTfXGZCLTYoW`2w4vgb);6?{n`?a5{@3F(iSdCR7bG)A4~JNmE(AJ`#x93(I?Fgc$9UAM9se*^M;NQS@R@uEy5gDm$(FJ5b&ZwpZ)2738Y>^y zSaqadyZ}hG+m03gW=S|8DY+~!f9vf;m z%}3ApAL!nq+pNZo(E5L{eInmWk?Q<<9FFzqZ5`v2#;oa1ctUu3ojGp|2QX(*zdZT4;J07~Biz?+G$Cp8Sxs%Yz z*cCaZ$N`SMenP?S+0&(iaB8Kc$!xQfSkc36e?N)!`)1kgd6VTv``oM~|2FdfF4t|1 z-O`-)VbLjIQ^)sKe;mlC83*r*)RH;qSo8)~slY&BbwbpA1fJZJo_(}BdPUyq1=RvPT-|G9#<);8Wn3tjyy9VBTX+qwpCjMY)_8cPhhtu}< zar#}~uC*`wuuH8(|3LVjWXmx7R5$c=@Cly8JJ$IHpGd4@VD_mlBxO2%>p@ux`q^10 zEhXF0`<@o-8NUqMwWaKS+poO)1Yh)p!z~LY0moefMmw8_`=$&1=#VtbUVlK1 z?~7i^m-zT%{VqsZP7Ds#*5-q1d@yZ(9Ders@(%Wfp&muj_jCGSv%;CeV@Gs>=aR8Y zZgDG$e}uRX%;QF47Rx$cnXKB+_eW+i1%F|8Dn-YWu`M2}i#{lOxc=~zoG+9?%d4Z% zX#vhEd--tYYjqSdM%oqLINGVrnB24#e!3R8k7i8WXGAvTjPzNcBKPe;`)Wvciu|kV zM>{Lg?UMar9r-&%z*{ee-*@43QjyTO6#6-veiYs)^lH~;oX!pqq~x}8{Lv-XIa8k*6kO$-d6hAkExbY8J8bD zhtDg&uUlH#ecjXk?ioL?TDvv%hx?+^qPixe{<^v()vfFBRGq$X-ly8I)M;H`NjnK$`jy6Dn@bL&Lw>9(ca|= zcXGdrD}`$e*PuS-2^Z+w<0FUJ?-@{@Fc=uFuU?U`WKem+^Peg4`{K$IHk??I@Q>l; z2^&wZNcay6@6WABxH_slVN2tRgf4fMClp>@kuY>@dBRIqS0p5jD^K{3<`oH9_mn4W z*5xI_=OpxsM$OT3I$ovSkNN=Lj5k%c5z zqO;}Z+a&zXO5oqltKg36XXr=OT|` zeh7~;MJGI+vd0a)Cq_Aap-(4}`A_y_AMfFkOH4nOd=HJ&+WRlY=Oy{}FUIG2`Svfy=UMsoFUDuJeES#UlgqdN zoAD7GknxeRSwLPF4kfhW&>Y69im{G@K4lFW?VMaW5O|>11N^5BAMIQYZcHUjnf~|v z(I3V$9Gh0bH+a1N65r_GG#C8a@J--PnQ3kPo8f|g8@>tr!HqlG`sdvS{}kwHZ{Xht z_`?(bK9^aq+vn(v8})D6+x7ply#fzuue7xzd0p`6)(Vdfw7n;L z4$ll_&z*|JmUts^K~cJr;X&-C?!M@Q1FL7)ryNn-eZ(f{>+woPU%vGTKp&rPJ|z#@ z-o&4==!KshN4(-*#BRmT?U+j3O#VmoA&#X&d>sCty&E|kzT7h5S;AOj?pA|R7Qlly zrzu6vyVgIjk2I%ut$Vzj{h7xCRclqPa)r1@bwra<9lDXR15U` z9P4=?I^7r0Dec-+meASFE$s?z!|z(!X6_Y%f%z*|?@fJa^@pj+8Bu8ub{(4fu-mYC zqgKA0`bgIysXOoMleW5ReCqD5J5vL-k5Xf_U8#?{);!L+k&~$liR+5(S1$SyQP_SA zM9=V1bj9bPBW^)gd_Fqj!2|rwLD-34qY{*+)0?w&{^qiuB0fmed0F9IGNN=IJ~7w_ z%qL%#q$i)`pBLkA4nVhD@&%KxQVk~GzzWB-KhlV;sKV5`AG-AC~sJP8{I6ZSpJksT+~ z{v9(Sve9+mY=g5A;>!_lR0 zTkxCT>}82Br`}2Az3`yqRjq#+u-x!>@_vV%>5FZ7)o>-_0qXs5MtpW6akaD9cRGD7 z@!{mnk~U{bUd6g;K(3*gyoYIX1bL59Z+S#}y|kG)+_~UURlx6UzBHw^&6{cS1o~Ts zU6Up@XXI5m+Z1^1nL(SGXUHrvnnNt{f2ZDTY4dc+8%CR7F#Jrt2Wayo@@7iCoR9uC zR=4mUe5wljz21x1kH}c%Qm+PW_`4F~W5A9|+Ps`I+k2_^y&1P=$K68QXJXr$)G+HD z=G@?AmJL_gzwNklAf}Q^$j%v8hX0dTE&pK79&`(vSK$^iZ)4%&)VGQ6(#X5ut&39! zb4}!WTt9N&LVfbQWyE+{Ladj~#C5que3yR`BW4M)UiN7prvB}|u(Xq=zopi9{V272 z*ZFgQ==#Xq_h!65d@pFh?Jh6>O~57xeUJ$Dds6Op%D=hnG4R&H zmpO^SHG=vEMiTq`v0I=!nsrE7q2aJD(8onfbexm0zd$CG@-gGlP&UvNzxmc#Q{vKr zQ6YQj+yNU5s?c8G_1%&wAN{|5OXZ|OZY6lH!9d10Y3hO&1T7r z@NCgX4rGsjoO}F}JijwzQk?i=8>CZG_Rg4;Ep54%vL;a9kIO=gA5+(d)D@c(Vhp0p zPPFR>p2u82dR`M!JsE_m^Jy9`{nUr#`Ni7 z#>bT~<6vUG9ih%JeJ7s<+~b3S%$vA}M}?XV1H#N7GVd-Shu=HH7S~9f7W_@TJ;RnQ zwBUWx?Vz8{%M@b-bq=D=$DUM-<7x9f^m7Q$575V4zTdYv%=mF?m@)amFk>KfR=Mg7 z^!bjo8-i5xqqMWNpJDVfKKmqfe!$pXq|VK(&+js}6QrM{52Ea{Wd>J27g6W^JP+c1 zEbrgrxq&N+ddUZDHRHnjHDfqqEA9GKulNk*-b6q5(1y-YA?Bkon)zME_9yC;*a54; zL+q~&&xzhX$`Ty_KXC$n;+Q_b`s{Jt2HWUa990;Twd1@P}^@{y}(+&ksLmkn@svfaMkX*re-{vZoD} zfP1{aE)tdc#!#0Oc%y=M7Eq!m$cz*IKE2+XJ!7$n8YxC0?QAmvxGX+c@|uFp0;$( zQH%q*^7vM{*kIg~YA`Ol-(ZYmT!U!W1Nak{wK6t1$owN^JrNlS&Kg`eyPZ0ds6+7Q zKE|YE#^ShbGZtsZl5a5mfS(8&LfzTRG-DKbOSpf>Tnxev?uo2Wqh9cKyk^Xr8tR(M z_wh~gE({7W2Xc4Ph7TeG&A;lq_^7d(c{?;)^d^MgSDB~6kG;oO3q5PU)a%FAhzwdG zo^ulW1WBtSPLA$+;Tn0~-^K^ZzM?1lisrPBijWgkWWpB;e^C=K!6q>z>v}yJKP_uf z{Hi`mknoDp@QV0$94frUXg_6W^{CO#+mRn7akVHNtWgC|8)o>1q&p}JnQg^vWYF%a zyZQ2m587%sD7L~I9t%Es#sGsEWww)LlTaTM^@Vmlc{ z7VYW}VVEYl`V->nkDU2odxuHE*75a^EQ&9<>N(V|__<03H7uDO08 z>5`tamfc>Y{{oreosFJDS1MlKUc?3!8DV(?{^m)a!8oiT{WGNZ$3JyFeyJO=-D|*h z&xB8fke4?anz7y6rwbyU#Ck*QvbVikbei?bk*(N-hFWup6Y@G`$#}m?8G6c?0UdJh zZi)5?%!w}4bs#Rq(}sPDvf%aa3JqW4-+IH7uXtx-7nnty4sZN=zeT=w{8mJk;;%L7 z*l)_Y*nakFdS9NWDE2Icvo6n(O@imyZ?x%m``^-}Q}p(#P{pYhjE%19iQk8fsnIo2 zN{NLsYW?-m@OgViQ-;KBt)-lr$B^;oA%EJT*nzRV%vEl(tK7+L<+it{B~O1C{&2xm zVq?@H^FDL1&~V~G)h1(m68ZNbWW%SBkDo;j-t40|t;EtemESq~_=eEv+Jj2TTAebO z`M3K5eUZKTRQ8XR{O^um$=5imid8xo1RSGjxQ;?v;riFX-iy;5@hT+1d0s8hN8{wXO3ArzIYVK7C_bFaqv!KVro{VJibcP+((}%uT6CXJ9M#z! z$948I7j*W8E0v~GdeMgqEnek@4=&RkMK$yA|M7xaG<};=WZkVRI*b0(%su*|)95kG z>ZUk*imYy4>$#YU{4Emsn*|u>B5(Ga@kG;HowE15)#CJ@F{J4Scu4d$8kS?Th#dR~ zr@_u`y4E-y?v#_mH#yglalddhsp!%#Ba5zZUeOMNrs;0zlDijO$0y0q*IPE}x)CSZ zQyC&>0mLFNj^ezzJLkPNlXDAhvtbYFiUoX_do$x5gU;o_zWC7fz}|1o*l2x0YP8Vx zPp2%37kVBJJ%3bHhD7)(L-jO^jJy_lb35?&=G&*p5kAA- z{Bvl+G4@0q?78@+4@plUE$6Mf*Vz`uTPW$iLAJJR02F2Bw8 z9cAV)Z&osI#J{nuJ?%7B{LZ9;qbugU=c{fb|0g_tt+oQ)mBKKV23lTUE|0Uno}ALbL? zGK@3JiRfn?wb*LG*)_};9p@&M2UPoM&OfS-tM*#vf`fhK`-$GW~7 zeL{0M=OOy+$xX?`plKN9ipg#d%#Lg_1t|^NiL-H$@pIubF=%AI4JCaQ`~J!{+)kwp z#2Ru`u|J6bJ~y9Ru4UXL|9oOvOMU0~pIh8+Pa}A(U^gs2gRtYIy~zVwZ22Xvqtbl~Q; zw$p)6pLE+IZTr1ls^jyU=)i392ZF!-9=*->En{j#&Ub{n@GBFc0~OGL>zo-*dS-0& zl=Z36dBkUVck-h6snCH{&;e{m{}UYurp;pK<)H=;3oWTg=zz@QQShHaC)munXhE5a z7PwnI3sxEGm}4DC&sp2<6llRIXn})x8@!YU+ux`NTR3Uqv@ZBSSi%lha;cvyC2z_f&-K`VXuQGh@ACfM5QNqh*>wHt- z!;Y{Q4-}vNZ!`9B(2k)wy5Mi27fxbRQSG7^!PbhS8w~Yr^x|wL zzJj0^j)&1PhF;V$Z=M4GUGb=(7bn~3MIH3wH1r}&C1y^bV(a|9E;{59U6E&z8jZfC z^RY?4(+li-N)%|tS?cgJ{`K;ZSmpuDL56vyz zub)@?!^B0B*hq5L9=5x?_7l&0)hO*}uFG7Dh9zjro(MHnM8#>R*@u~^L-Y*Fdnam< z=o5@n;zSnWJx)>KH0qvaE9jrIw)bK57_&b-b3v3!Efad?8Q;r*cKI#WpWso+l0W?)rQ zHNn<`@83H00b9#8rQ~G81Y6Ape2@e_V5`f+&w0cHwyFcF?aIIhY^O|t(dQ1Tw#GxM zt@2ydcJ8EVYjN;=UbUUM!t*uN=4erEQf?1$;4Cy=4Va?M0T19|c8^=?v8ALe>Bfj< zUvK#y+4hGXOLHFjWzxi4ADi|gdfvw`DDQBtzI#X0$;NxXOS-X0nZ8x?TBIFIo~%_J zh}2q^D5c?EPiWW+-Pp8W-Izw&+F_O(x`4@A63_mYEbaJDNjJKEl5}II??_Xb*HmpC z={#9m0s>}hmzG#c8}qzkF89~jLKwGmdFZ0Sy9NTgMw40+1iXBpAs3>jYf7)_T4nIK z=ob9BpV@%Vl%6`9_$#gHt+Orlp063b=4&nZZ9EgDvz@{I;p**W3FmIt*;-O`w##W; zd3yT?wA;p2c^~f|)Y-1~&rP_Jsk2?g&*MdWJ2nl)Pb9t~U;5ed=0iUzZ&nprO0T>> z9{6NLpYp#adj8U!4GTCY_;uF&Y;0x5KgGQq*~O>GE%qaG`WD>l4-OnbF7XX=i;sEE zu%()zjcIbz638;!Q0j}S$L4U zg*3atR}Fk!5|`+j3)wlUDIlsfO_$y=+FrV<8*=iBSyQvOa!Fr2C|CR*>5%b!OP_wG-O{fk^h^3A{g62;eR_z# z?7#I^?Y+QBZoshC9Hs4?(M|h?{(J&GI5>>hT$Eo=p99*`29s9i`7P#H z?IUZrmPNk;X!8rh615Yg?Lxl>&@U;s6KM^k?caN_)-v-}t(ml+(Z1#MuRn6+$bbOz zr#k=q^<1gp9_D8w6x%BU;43NT?ih=0E9EW+9=X6HkUs9mPl=9xdeF}i^hM7#g#O&e z{U2PP+!~2*$yWGC{WsH?U}(%d#uwf7pi1C$jyjClz^SdRVYKxY+G^_^2P_h_cSxH` zotuY6xyB&PpYe)l?U&Fx9ci11jdH*msZC|P3TW%c^s7AB&m2x1jog8XO=1SF?SSt` zYzx#gEgA2z-xZm?*yYXXqXb^T7uq)de;-L)p3cg+p-HT_k0~YZ|B4Mdb3ypLlkgT7 z;FZNc-*LUfDe7!~iniCF)AlNK4PMka48G(1P|FS1{tO$A%bCeVu6;6oS7lEEAG%x4 zMp<799MH5c-bs#TPhRjPYfd3@FUYYs0?1hL-9AWk1LoBpLAl1YV+;f8e>z| zHrW&P{Q{nwy(2o01x_yEX~x3OjAYL)JdOMN58A}VH0Rd{ABELTKItTraJ@y6i8%Oj`C2Z{C8tdQ`aN}j*_-0qP^tbwWr6=-z1TcC}))!)Q?PXlb zcxEp(ZU}xFp9hBZz$*oK?F1Ipz(n9x4|6*_E3jv4-%AUeE&(ri z1{a*5y9Fzu;qC#8@zFb1yAExRg2q>aFDF?)>Usu7*YpmG&J9U6O~ifx{iuQy&}YSK zn%1NIciMa%Ixcp?fzaK$p5w?fKKh|lj~geU(J|25@#8&iTt%*0-ccDB)unZB?Ar#< z$ARb5z;ZoTq8eZw4LrYs?|lk+o$$zllQPzeiPic#yo=zD;K?j}^?pa0(nfT)3Z$Lr zYZZik(c1orUnfyNKIFU?X_Y?9H2A_B&N9`t51g~*sUu%s{;+Xu#V?I>rqne`-`U3$ zoIk01N7kgbUVO1pUy!A_vHq>7NV=gu`Sq4hXVI7It=sAOyVh#6XmAL>3_`-o$ng-*ae zbSWo&j4xASRDB((lnC$8K)*yTBYi&&ynExL<7PhXG;n{OGzU3vKyH0RkflV%t?B`-l_yiu3q$mXco-#d!qY=ch_t^wIgc zqEFYV(Z|?xzs#Op;(47 zn0s5{k;|4WXtLl7;v}|OqDysf$-t&W`03^Bxn;f@W#5pq^ynJWUJLdtQdDF9W7K^* z`1Ya)(OJaLtwZ+PAA&nFZ?DHgij4hXU|{F}K4Q0Tf14N^ zy!%>1uE@Kyq-p=ZhW}E(w6*G5%iucra^d&Z@BE!N7db$S-tBO6n(*Rnym>sjsKLb1 zU@spDuN8HZtO}i$0u`Og+wc=O8h-mT`0eO|(av4Stj-{_dd4NQ@^E}U6#q^eN8i|K znXLJd-alaLk+jThjTJABcG}f|L(|~76Y<9+Jb78wLf)FyK+fG5r~+q4{b;%>cc+HG7j6`S@9*LJSn(7P{K8~Ov6xno0O#_~S~ z`d1Oy(L51|0och9F_Iu8T5v9(9>vix~qL6w7JlYzN{~YSaXuutIuPNdD@~3 zNrEmNXroI(&?R)ehq^^hI}x2D>kGaNxSH(J-RjV^^0-$N`+X^X&3`qhnk zqmBej0LVS!;~RYzQlHq zb;n}CXY3G5=_6k%@pF2h^EpB(eFWX(TWXa4vVZvyo-_cT)`9rBz8*JB8-Fmslfeq;AJ0{r5-ko4OcwmC<%cB!)-D%UO z$Jsv|S4xfqvwv_XC7)fGU_)MC@{RrhTVuLX@=4SKwlh0a+y2-GZ0C$V(RI62+o{)8 z+sU_7&T71(>)21Uu%9@|exmY6o_|qor;n+&zLedY{)+5H_7EZ`lC|b7e5(#+eW_o1 zU`v>e{ekDwoHEuQg?++jQ*|59u!lhJw%`r+5E0)e-6&+Asq@OwlEL$NWs%zPVd#r@ zn53OIDmR|mr*0Iw?=)I&xUq*opQ=Fi5bo?DJXoW8hK@2-vQ9loI+0Jw9^%R{OX*4W z5U2C-_wf;aL5(TV5(nVC$Oc+EMH|>l1j1_t_gbo5k6x-ZzJEtFu{CYr;SuzLb`v|S zr22N1F(Te!3TG1dKHKOsUt7W&cQ%cE7QWuAr}I5owVj>Eerge8vP88#KXS761aKpM zrR{#3<;}(e#LqdTls4IvH!G*(YyO~8dih(WG^s;bg7_w>>X4gYe==u7Gctt%GZ$n# z;J=c&tISg`_)!IZbT;!Q5*~Cq{OY6dt9tlt6aSy%Uc>!1_|y~lL;uN3fj_?0wSVZ@ zd!Tk>MvV3*eDUkdy@I$XO?cm~eu}A}EzJhfJU%N%TLC|M8+Cld{y}*1g*l38cVufh z@0kZ`Ka!?_G~(}i3Uj$qb<3YbY=U0!qMs{@&36EL_v{~jMQ=*>)(4{$dn5aZzB3=q zPT_i)`d__e)X}%`yE>oe`)TtO{!iln$2>>SejV2oo)fv!;^MTLNwhQkRu`}D4xBuI z-HW}tYdx(!v^scVU&>jE{mMz|+r30#57C-d;sncHI|N_xTV}<&_7I-*?b5Ia?JQ~E z^B`tKTiQ_4q95r0t9htaPE4NvhqX5WkE+NTzpJ~GbQT~R5J;HYS&$`&A_Ae=(n%l) zVJD+AIAc0tCx8-M5|%8iLKM<~qToxyBG7R|1vM%XKt+j;2#z{#S=eco04`~^{{PPH z1QxFWXlMcN z?~hh_o!CD#Ld0rtC=gYA9+;fszn2*tn>mBCoD0L0YS+_=b z8L6vLH;%kA1ycrS^|UMcm+kB!nuUhOFO4z9ALyp?IJa;R>)TNZkFCWv;UM(v!ZshL zO=$K9DV?Vt9Nu}xt0Ow^#TV%^ww42;)#w-5M`U$Xp*IGzrtVc0$NQ>^P2aPpfOd$k zGK;;&&!q#MvX78G#IbvA6+a`Z9_@=PG1yko5&7mqgzdV}QK6fm_MVQ!8>Rj~hl`za zk`o@P%d4{9OAT2Yv_^ULtl8vLdy}r?cWZfzvm?@5RXPOOfC4K@OYB?}N&aHiP^A@XD7|K-ziL zJZ+pIR_nf|P{{#P{pYXHfSo|!jQ~WGF;GdG~<*=crlSJw8hil45)Acg;97Uec0>(2Qs>H2#?lQnzL9PKJ}(Z;yXSg=Dz#{C!>Hx(Io z5;ATGut1MfauON$GBk4=GHyF$+%V|#>&UnQAK_t1^FLm1N7n6vtovx-JZ;AO1M444 z9&LFQ`Sy!|;l*z!r(1Fi!BzJgvo?GipQC9}PiU1v$jZpK7UbJXYz3R~j}PW78~S() z^6kdGp7eTX*#u-O;pst);{<0eHvCUA-%9B`{?*}~ANhDh=MM})L3gt+`;5KMWzGQn z1IY(?mkK=#UXg>K;uLt*47`%P&q;Kz*vspC9ohE?PBr11;8h)X<)}q&Mwgt8Y}N`r zTx;-ukFs65hxeQK>#Tjs`kvNH6Fz$n{YqlLxu5-})+h&rAqR|NZ(`%$Vhqj>Em;{k zfb)Ba3Gx{-^>O?^1;?$1#ZZe^#eIWV=QBg z{7c>OjefJY#{ZskBkM+dQc~;z4(~ag*Y{G+HpIs;{Hsw;6Z<4N|0^Tr(Koc)kdxr} zn(Ke?#ca{&Yx#RWOFMfbv7a~7=Tn@iE6yBdCo9Ju&I!txKfT;TjMm06iGSsXzw@t* z!^g5xC4Mb_g@sFqixlhQ2r%2&_bHbRexuCFy?)$C=QBpJF)*=TYV9gR#}O~*UEp=$ zB%Av;PwAL{wA$PM#TLUF_7Iz=CQPLVDc`C&CVXLH)R(21Mm_#Sc7W}Y*bcwaEaixA z`!>B^qhG|Fc2$zQ^;OpTPtE;DSZQ~M!FD*T#jxVn)%;b78Tjm~(BhOENk{$}>^~xt zn5^x6Y?po_W{}wMR+=PU(Dj+ITQ<&2W^QB6YS;I~iRi*y=Ud(zQL2Jmc5FlONxT>h zO!k{A`%j?$;w@Wd3QlZg?>LwGX^r(KpPP5&Q)V@&UD5vDvZiqjq@NR%+9mbHAMyzG zW^z84VQS&3WK8+!fUt{l*@?}O15RX^!d%hVg6D$^^1O`r9OH?(lVLKs?DT7P7W-ae z7uFD)!^Rvd!I21JvJg-2_des5;Fmlf$2%$Dh#kCH%KXPNXPNZj zAH-%#B=(}fxlS3XGKfbtoVX&Qr?{6ozH^Lg=C$72e;a+QiB?~h`4K1jjikIplYe$) zIPp*Jd0>u#7$S3#1*?t3{{jCNXGts|)tYsahB-6X^ViTvX-~#4Ye;ks2HK2f zOyl@|qA60>3vA(;gFay2t$&NNN4Ki6tyP0f*uHrJGFFlm$H(gk9c!Hn-N`j_L5H1f?Nt)^EaVs zdwC{sYl5Y~vC01NvPmnCru=ihi5)@x7Hq_BeYa)#QEbIpg1e)sQ*^?UJ_(piGGfER zwHwa_{vll3MEf|_G8P$klmBHFcq!}7(AVor^;WvErMG<7O?welmSU|z-)6Ua?My}I z)Wnm-7k%RSQBH}GDfHtz`ZtbP0GH7fh@Gf4JHb(ljt<}R@_F!v5O~yT*3v?7v%wf% zW%i`3F2!DCJi4d?72&c&tAC;IE1?_p>=jDjD_&-Edg1ky)xpSUbNBf=9#8glgfS0=xsNq?W1hAyAD^6R4FxAV3>Dw+ z#IF|trB4?&Yo7GOyp`IgV z+7-e4;=O!*0Z~h$HZrNKK$fwEPAXvtqKwG0|JMZ13-QN>?!hXWG+lP8{ zmPT0GkyCOp|BuA=(-!pYtEKj}YAM4KwcTwZEZe&D(i(E(w2dS>p4F z-@&xphIYVX@nEkH@DpR8)2V*eu9RK4+jd>_+|th{vPL>R#9}RkFZE%a|ASam@;onc zm{a1DRT5w7U#e}@ui)$#$T%KkoKIs_`d(z5BCg$nQ;z)I(x%rP^q<^GF8dSspaHYN z#J=iCdsm5LGs_fG)z374Rl`5__8-7pv^TXY{5?>#&q}tZPy5kGU##+`zc+{SxelSpQ*o^7+F)Of1jV)wQI?> z5lM~pW696*?3B8Gd#RI%>~tELqBFA42h@pymd8_GIOR;gDCD3y+uoa*MtK+HpgSom zHMDXmXu=BQACXBGPC4JNNv3)YS>*!qO-V?zVkr|jrvviMfh}8S9;eKgvh|H+xj~iv zLnsT~x?^TP`q&TIrwF-9-uuJvllP*MeuOc95(l*sUgHCetyVs+LUKEY`p9$m!vvn& zywAn{U4ze6li$of9(mR-c+-L`hu`2^A3~!GS#L4CD>SMf z?@GR6JF?4rd7LwW-^Z_c){32#{N7CacIxMUH@q|UI3-hm8qs+Pwr-zr7Q2bFiIaU) z=o#f7R3&*w{8hr8F)H+F@~W*k+@bgjZ24})Bz8VW&fj9};_^nMT66t|IrE5-F>g$& z^;!?rD^ay^RidYmJqu?MB|^vZ*}J%nt%JgoT010Gh~(b-zQ8crpEX_@YM3m0n3}?;TZ7a4==TudnrH}jF~;-*^zmSht)dEAMtr6q^9^$XJU_ern?vVx zl|3A=k#iww=g2SQ*P*Sw&=;YXV$+8lK6(j#pLv2jL57IzX4n~C>vBs5xg~#8=`mD( zLI=<%Q-uyUX+eA7fv=N)W)?K(S7NxzI+ZyPxEIxVVg67f%%A)Nm~ZBN>0dNF-i&{l z#P!N2zQ=c03s%`$L>5orejxj#TfDhddDFh>pYYvF#E}c6j^on&Be}-VV&Qj{_!rCf zYmmcFF34y&3GaInT5E(>NUV%x)uw8wf69?%;8L2wScM60vB=BkrsG=(ujvEcwL))^ zK>Pm&Piy$b=2-RR%GQ8?h^q{_<27WhGGwi4&WxhDFGJRn zc0|_N%D9n(c5Ffp`e|w1h)Uw7b>i7|W2|=A5UWl6N$7f<)|&H(Cq5Y7IebS4%})HE zok9Jzq(1$%iHDOa#1`d}Q3Yl2&NGqSwf5*#YshsT!Sx+$|)({*tWrLxjBla2% zoqB2Q_}(7$PL=rh%2|3Ww14WVRO`NYWt}=y^*YF!Em-AemG~tE<%Wvswd3-{M&c}b z`}e@}UpXJB;~l{nH#(>}CY94*S`hg??@j;OvliXXq2=V`%0X`Ih)lOENR94*U%^Rm zG{a!d9{%Oh$ZBF*HRJn>!TlFARnHdqC`F z^rJEON8Lk?xMt*p^tZxKRExBQ*hRj>y1vGFsqkm$c&I;n)I@_RyORA^B7SDk8;8#s z2A^$bsI*#DyR-z=E-2CDn~hCGX#8gJaR|$P0$=nD)?Og%^=^EQyWw*jN#49;_{c0! zk@3;^AOBscpnmuz_rWi@6WpQOWbnQ5Ps*1Z-B4Pc56@$@u>riwTPV!e9(4#+N&2T6C`XdwPt4*)`yJ zF|ZA~>gloaa2MT=CIkBc{2tSf;Y*WRXhb5iFLg5Q{q^~ARk2|+jz+RUX2_p z^3gox9u4^@3i(KEn1pA<(_SvJ(L!XSEM%j9^4^5Anq?60ZsXaG=s2ySH+j)H8|m;x zAMK(|vviM7)W*)~z!^>-?a{+gT?b+}A+nFiJ)&29^!{PaQuI)^#{F?2biR;&2_4Du z^`6B`Os+k~miqqK4&OBAdihxa<0)WId^c@=C~E+{VgY;N)S{k_g00BOjIo+Mv3DQo zrQ;U%Z?;41ZQ!TT(8TIyg|51T_)b9sg^rKn`;YK_U+lUEan3o0ZzmGRI|-Pmxsw`1 zri-F)6OiYG-wNLo{p~E|x)f+ zfi^#a|KgS**!CNTIkTAyqY9}iXuiO;iG5pJ@U08-dmuROGiO=@Ys|4emosQ^%-ZD+ z4c}^gKK$lnH=IzhS~qfMe@nR;TiOungvN6Ycz;Lj_&24Ici_9-jy{g*-H&?RwJnJ% z{ee#XwCnL5v~IEewL7_&{nPW*0}u zNxM7Hew%&K+5vxL{pgNb$N}sg70jz4Xa^zSGvATFM;XfWG4Z z5qc5YF7_>#ROmuD*OaPbbinmUeF$%;G+NQ@B_7*qr$M0iSGbUc);Kn z)VGl*2+hs*Q$2&=3uVLs*+NW?O~eK%CpO3;{Lxe43(4?>gYbpy?4T%na|K^eK}*Py zUfswSis1{D@P!Fe?Y*<6+H;pP_C>%T6`n8@-q6GsKJMn_3qu?E!t#*7_>ZY8d|_aW zU;IJ%!jf)*@sp-T>p6EVM&E1$er3WR1>Q|CDS}t*VlDrMO_8kGca17+&QVX#D0sjk zc*g>Tzojx}A4T3N^zrhDh5TObFV6$BWBI+LnLPK)PHFI@<5Pn?=~I4+-0{PR*WNVm zx6gUjAI&-Mh3UGBFqaKnzrlI<(KLnM6MLQ2tJbM{bQXjCo$rlCHq7nOa1?p1ZuNc6 zeY$=kyu2nn!1?l{#x=)A66Yz|GYG5H~f`AN*iLw^_7Y!#?NGDkqSrN3@<-ASh+imq8!>M#bK%^@V25IXW)y3bgbXdy?^& z$K@U6w-f%8*{BC-37>lmej?}c(w8Fi6b*v?N{7u9u{+p{(+%c}>N0*$lfPH6~$cf=2Z zuOa(q8~q)3Mi-8meox!ntBg_NOOw zv=*B88MaY2ei!inIrdQ>b9TOt-~ZxVa1+=4)cKI>dx71xJN&zAZTUYD)LmOTGtyGj z+Gtrg$z&;v^s!t(ZtceZME({34ah@ci{<-pyL$&>1GQ24#NX3R#a{$o{{&vdm7P_F zE<$L`giT4ipZ_){KRRxJ7X7SOhct{aPonGqvhn0ihTXs4Q@zAI%^8|%{cfANS3md~ zddNfd@H(}rr$cP;e2JB~hnR{noauxxe{aAi2a-49k#fWC3HUM1qV3+m=~MPO%w5GS z_)8oyH1Zkm4}H5q)B9=DICJ=b_ol#azwM%|oTuo#OUHxFJstN$_pnzQU^G?9`sobr-v9?ip8o{=Yl}?p28PXmq2Q@6V?PzXV9fSAx90q4 ziro;wSX;v@-l%SE$ziOcSer$w**76iG@II`L1e>2S3D8ID-M!hL3qX7M*1)3V{=lX zHSt4uly)Jcg zpUscUR$`Ovll=wvFPrWB{l_4IzLqtA2Rd`iS_rcbD`rZA!xtGY8qJtBg zk@0>Jpcys5Y+j0f~>%a25=aFqW z_nS1!73S(qV@K^l=IROf=;QP;J?LJYS3gU8zuqW)@-gt;4*qTY4xC4}Da`lc{K^K_ zInT#|^KFS`KvM8~St) zeR$~C2+REsg<8h$?`8QaCEOzMHU^Rhvw>>~eamW`cME-bgg%Yu+imERii^`~^1OYT zMxSJ@^m}(>{=7fv)2H;Q@bn+;) z{IjRVe13LY&IgR49GLqsr{B=uB<4Wq>A@(qM);e^&vO4U_YvH;K)$Hl*jnOoF}~J{KTjZ1r){V@$L@r`%Go5ezyG!d_>vAM;-q_c;IiG56GE< z8$UxF-^v#tm!uRL9TN&o4!^?i2Ftu&PRqOmXFq>8`5a;cqEp-Hr`(S%Fgffw)EjGaKHpgH6!Ol_ z0MYBWEk90OU-C29iO-nJIk&uHUxF^r=wtnQjLrE>Q`^MCdX%;$|BA#_{YJh~=i_L} z9x!i{kHh{fKF3)$XKVD}7IIwO$2Y#EzT}9JJSJ7te+@d?ty$ri-n=t|IFd7oGg*+| z+W95AlCSu$Z>93O&w0XHkRRbJSYW6q2sGu*xY5R0kmYABxDn}OALYhQwxVFUDR1VD zc04y*SK)WM9J#olgR+hd?d2#C8>rjPmYU9$qKN@!Pc~WqH@Hki<`F(EKFHffO6*1D zu8redB~ZC{>3CtYX6`dtCH8!kk@gtBj6FNc$0~66Jq!YndqmDzBW(en-pB~zzj>B- zr`P#d<+sFps5ARGi>Xs*9_W-gmG7<8%UYE$mUo$tmb|->XB!yn$0@|Xga?WIAHz33 zWe?Z!dbPg?p0trMl;LOa9(84}DF2dwPHd^g&O*n*{U$y4+;iYv1bQ2Rz3eT<{pML~ z0JrOo8rh>qI0SE{|1TdThXYr!->Kcy%n=>e%dzw`!ZhMtAad%{%0o#{4Vh_YY{|53utDmvOD*o@;6`9w4bQJL?norw^ z4HjoSvz~@8F6R42Y=5@AGcGR``=3e`nr1=I_6p;oPWHA{g^``Glit2FGS7L#z8W3L ztl_+u@l%NIvlzIvaLfwYNF&CP#BjN@s5o*s@vlGUTMzqCRBQrMGp|TgDTQM;9Bxq|xnh!hy!HI3r-(me zZ;|YletrA}c~i~ad-?u8?y;rO%QLzEK+4%CN&Su7zboa9_eI>lCFQ=2@3YT)L&_WP z_fr02zgW4JGua_-kL57O`Cu@B}Yy*(~(3uCjHRL?q+3P|a6Ym8+2I8Zj)5zq05bYl0-(DByFrwS|NZ<#Y-i`x@xf&>wI19lR+EJ>9 zoEd**rVe|BKCC0zGms}9T}F6$KKIz)IXbncF8!$yJ7(a&g?k(JUcUkRp0xLvG1%(4 z3*9XA9iNqSPo$cqI1BJ-SaL zncQ!b`mFmC)K~an)I5l+NbHm_smpI~|Jsz_FZ~l*K>hEjTjr+jWX>KJm>p)R%WrSp zw&iJ37g~@>-9yy1HBguJ|AaBnaqUy;^4nWCqTD8R8K?C7BkI=tN?mBdoCVDsYnZEg zsn5N)eq?zM>KE?o<(SL39%BsiD8~+LN9Cqy$M9dVts}QGc$1F)X@~F<>=kx=#6SAB z9h~j#`0IBj_dc$B`M>uklUraa@2)##az9w6S^sm? zz(nR}Ib)5!?CCL=X981swwPyympnZl=b5Zm!I%5M7rFj>o!2kMN0%?&cYcgaaiGvE zUwp*x?SCL&{06=K^){JeD)DT6{x4*TDO!-z`3Ew^6!`d8;p94)FVk@=awrBCk|c3WzA z?-TByGv!$h87iuYw;!zh9TpDK{vY4kLfwIWRu4Lk+uNx$d1G4N82N^tAA~dL9dFk4 zaY!5>uN-A`u-@WDmj9MBQdz%OnD3(x6GxyR(COK4vBTm|)J1N0G}JT6QnROEZ%<|T)P6zkJ+T)g^}g24OVN) z7>kVQJ!qlyZw!6NFsh4-$WM`kjamfqM9o;6+oD?Q^4bk}12z_pDQVukqq1(A*6Xbt z82{37(#AI>A6HW@!_C8tYhq{H^xV}Z{~y*(ENr*_!Q6=r=#+NOrtXvuVo&Jr+6bN} z(~n7viMV2VF51bAcN=-4Pqp`sJ0RePb@3b9tw+!3s^whjvdLU7@9u>b-2QG7_p#)M zmc9sFj^pe2JTN(qpQHUZPmeSDnvN=;aNFF-yp)m8RCq|`_=l`D@v4{bjadJ}F?|oE zxb5^U6I=O(@F0;rgvTr>d&p`;?<2fM>dpQ3R=qsxRl?haA4%DJKin$Ip{xd3+_Ux{9c|8EzOYrSHU$(*{>;vIkW-dCE@w>bs?L$mZ&-8N zsxH3jOWE(PkTY&WbJrI!Pp@lhY!&1&1i7Zfsr0ikYUesrrFBkFLqbLXxn6m;%3Nu^ z6xfhZij89c_ZxyLt@+$%_~u{2Cp*0`xYAk^Ksmnl%eXHJue4^$z2xxYeo;iF^_V~R zr6X5TiT`4+EJd}%`XAxd3UAtNnf7b%QJHKRl>K|-&<+D>cg`Ho{_r` zI-I^dq0%~3p7rG!x%=eoqquLS^(7O}63IJ&T~c#sV`oFND)a>P>rBmx_k`~4f9JV* zt48wsM{L0NW0x)Kc3cWEh8JBQ;W0$IYOu|*iJkWL=n-P4JqkM@>=t+CaP^_?82D-d z_B>AZB%_U$R)@#aD=1_~SOfEP?p~wgbc)e&)f5r`FuIH@Tu&3j=N!68p*N4?hk7XX zZf!X-qQvl$b-1!W^as1YbI6b{n8+QEAF`zrxDMYw)mQ4YjE}_+V?>(Rj`cLP!WXvi@Y;Oan{Vga-$Vx%Q3c-4g_ao^=Vep#^69Mgv)_4kimj{A zwHf3=6`H5-#c!h_tDrlQ4^QIh%6G=`oe+Kt91^jIuo6S|N7l3koa9+9u|mHy!-+FlxYxSehHSN^u$ zV}ZkCfjzYCMuCIB4u=BZ@B*~4l)Rw^WRPooi~QEv;q>v*o3Ln?wwwNqqfIGmL)p-q z{SV|D%OfvPo@i+1s)4R`$Ih~d`)K?VPIJ9To7hig=WJdVnSQg)(6sH8$vA6n8)psU zoWM9sqVLwqIp1j-XBlH|n(t}!xt4KaBfWE=K29I{uqg5l#@Uf^ZslCzkbg&f3T2!| zeVl_D$EoMtWt-O=a+#HXIwiZVILb;8(T*37!JV|nmUSv)sZ=cYmu9wM`(@2{X zc(UuWTlDE$>RzI*jk+z7muGTy0OL5h24P1a*I@Kbat&9GzsNO0IYfu&h*FNWaFYdQ#Mv$Kcz?p(TE_YvNz*n0W3Gowtk~Yk}mB+S|9QR%eaYTz9Il7;;mj@IREeB`*V06MpGkiG8(*SaGis`|LIT7yHL) zJ2>~LHgwAlB@TV}*p-og#h=V>XcaH~@f7h*Yu+^EO$kv6cLx-XDM2?-TimYm(LI0Z zT>qP@D1aX}N6u$bOAa$eiDUBD_J&Z2VKRWYY{|ql5xb}lk8s9oY?VFe@H3IeuPXE& zKH0V%gXYAeW0N>2=*te}5!WGLq0v#MjAUe&LerBPJuiEHpVzt~TlMM$e9yc%yB~@lSNuf;aAMY0gVaiNp4S!8!Gq za-Mo=h;zzzqw~aTL!HyxEBB)xj;{;Gp@yi4L)zcb#rd^7NgXo@}C zoZlZa_riOIG4~RGb_Tu#)v8(czYdYN1lzNk9V6x(#3t|ru$6C~H>nEwuJqwSY)lgA zZ&MuA!@%GwfJe8ryO6!h~iCFo&`;otD$ zSk7%XalH%OwVd<;D)v4$&ZS>ut+ zvFKuj|@Wc|3G z>eVF6{)`-5NFR#&kQ?x0uN*DDpYaSb$wyj504 znaI(fHOO4O&-L}2VX(;=VU#O2di}Z#_AF2KQt4&)s+|jwrN<*nR|gebipD==F|zb= zWM{EmKTVw_$kLOzuQumjD&u}Bvh+!0XA3^(Q@LM;EIn23TOzk|zZ_Zm4Dzz2jrYD7 zSvs5h4L#fRdJ0*(8NV07-z?EyS^8;Y=^4nW$Bg3 z(s#=mT*nlVgQ0^5f4HVvRlHydDi-+>J$w2o zXtdzRs2`B4;zl?PPfELQ{Q154qgczzP8?mZh<(v$kwH%R@vwJrp|c6*g9?X z=4T>jk#j)Su-G&7LEgTCyxk0%<-@ZK>@Ale6$AUdZuG4?eG3KO?#1>d zQVJ=vx7J`zUzp zpwG9)5s@bA_jWi3--L58-(49gHrY)u6FA4+2D5X(?6F3eodagyQTJzXei(b4V_dgz z6<+q)gY3L}r(%v5I zdZ*CF3ic{r6d4`$7gO`@F&K(P*1B|hxV78VnB4Ax%9_u+Gibj$yK8T+uHKtVx#qWm zHxkj|Z%4=vKEf*@>>oJpp?F+4o7EylKWY z6KPw@4gv3C`Z1k;oZ}2Z`mnIJxnlxjlC$8UgEayM*(aNx(|% z25QKuE8m(#Uq0k_Q(r{4a)xt+5A-^w^6$A`_Em@MbuAsMR%0W;Z<{^Lv6A1iuA2VE zHs<#Esim*m@a3tcZxfj(nV%YLV&Xz<&WX$u=k3KZZ`I6KC*WhmPfyyC`8osqEX)L!(4@v_~~}DdtV|Nh`3)tVWMQzL@lZtk*K;sFbl*GMB`rM~*X@ZCbj(KLthj+yV;8|P8#e+n!skyB0-8=Xg2o1DixDz_i)3hYl7C-cnP z=49GD-Vr(fH_uM5{yJRr0f%KQ|4KEik#WcvWK1%i-;ag3QitWdY8mq#K-v4t9s zeT=-fd1_4WKYO=nej}LQW6X77O-n~hetY)&ekuA7&iLvVpeG>CIq}oIx(?BW+@62J zpaxoPWeE;bqi*3Cv3g3e#j~SVooF0r^~D$BZRGJ2>@N@4Y}TdN_q@yfNcerdugx72 zuXer8cf?L;47&M3zNZTBaf}tccQa#)t;RtWo3WMtaGqi8aZ?8k9GcY`TmKrfaRhp% z^5^hXoQCWe;7K`h|LD$oJ~icA)XzfPguU!zgD%fsHJLNZQe}26V~w80=K37-GI7eC zxuxLOY53<%a;IG&-qS~%WtOU7*ASl7LmNH{koyqVr_A+5*7QfsO~KVFW%=aI5M4j0>h{w z+Yi40ygVjlUA#X5RazlO=J+pQuQ7Lta;Nwej#+>%E7NFV@7St*D1L$Yfl0gn(ygPm z37BUtFgXSn_R-&8ax}rQ*wkCEcZ|KVytlVYfA|mkZ{DkA{-T+`N=+sFjk&u4zWmC* z)L=3=D)&dQcWqsM1%G@~c&hUv>#MfF=I(Bk^&I9R)_i&$`%u|4zrZ>szWHI%Nn`*k z-;fRKO7Xv+(h+}F*0qgtS=Z=0Z?5ZZQ#qgI{c8pI;=}VZru6IW8b8wcYqoM17>IMx zfwf3`*zLP(XDfFq{X0n?8pzr5A-PYE;&aoq7ca$@X$ox@fFJAe+ukp7AN@hjatDSk zTZb>G>r}M2FLpy4y)T?<-|S0s`hs1(`zmc?>*pw#+PC-F*~6U;@K1@=QOLXJXzMKZ z=h%15WDQ(H7w~IAb0_&*tgl9?ga>upC!PqfQ+2>D#nh);VB zJh;mLrS;0anD|3`R67@Y%k)rxWLKVD+>9OwIWw8|YWDjOE>Ag={F9w0N`VW`f(L2m z2GKhLC{Gb_Dq99zk^%xTW< z(C|I@*NRWHYrLE*2Dz4DlYO)pSnv(fo#{G;^Q)z-g)5-FO25Dy)ax`o#D(upy1e7$ zoJ8nb&3^1#67fA7#8^4gIF8J52{>It7q@3h_udzy(wx`Qlsggs^k}|Q%Qr7_U&~(S z1agqT+ha0WCBCZo=ohk1Zt!h6&+IV}d_k_O!=|Zbz0G|RSXx;BQs?Mq&ih#ZU8qy@ z5_7*$%GkS5cIr)JReVU=OBwyKFkX4yz_$&wtI6|hdG0+w{grvy7``q>mN7oWyN~M(aA+U$F7Bf9>hnL_@>AHYbSfU*9<7EwQPvU{mpLPx^r3BxkkB z=u-TS*-swRugtxKCLHIC=sa@Ri_n9u{J)1ztuU^)L)P|xi1T#ufM@MV^moTnd>vUG z4Ws3qTIj>c&BnaAxoWflJ>Q}(xz=mYgAZG&UV__&&;!A3p$XV=uN@CfxXL%qf)9c( zPwP0*+||jV(gk<0Gu~O&wC?fcY~tsFANNcl1~2#_c+rF-zsHZ53!e0S%&GW%oZy`r zWY##|JHdO8!3!_Yx4Jm;#K*M3zR|}qy%K)ch}XpVt!TpSBx0;I;d2J|w?o*UyPyq% z+fp`)w&WW+{-&^xWBnf=Xt+raeoqVbR(sMHfHz_TCi&xTOlCfTgV;(*8(;IT&^4iH zLfd{%*E0X(NjK{6x8?oT<>z_d#q|@tjaKEc$m%)tY00MEj-|=Hy?kI_Z~cs8^ZnT4 znb>co7@1_qTb}YZo0h@8mSy`=@4ka;f#Pwa9)JTgekU@lg z2z?p4N1i7;<@cLS&w=Map09}2&k~+IivGZOsH3)|&fBM2%7s4>kDD>HDwner>DvTi zFfM?%yhy)pU&B{dvpyMfN(yU=wM)D))~7dL{3X_I66>O$l(BY?>ucB7Wg`yFu{Y5_ zf&)D%>i|rSiQNV=sK6QCd06IM$02B7!CjFhiL>fX1rCOw zRA{n~gnL(MzBAaO&y0D}0XiG5-8SB$xuY7pk)U5pB81D7@~T1;@frb1F^4_Istt9Q@*{PZ-1_TyLt8*zI~8y`_Jag zgKvf)f6f|_w7Xw?H*Fz$v@*u=4tDajXIP{w3P9 zA8BFJW5#>iC4DQ4fW$mH24{e}d6KTJWb3>8sr2V>k4cPi5HPngj3jSX+L#4+A zvEF!I+t=XkK>NoR`a9|t5_?|815K+#XCvP^k>G7#Xv;|8eRi@FJw{s{Wi@e0(6|8Tqx8>9tIl;v za&Kgfd`G#Hd5Gscdc^hWC(l>m7tcBL6@FiN6TZq>bjpqDCy#!wD%vnV=mZ=jQF3H1 zALYCTEp#IvH+;jn*%O?VAtypv7sdWCT~W2}yN&cidr58F<>MxK30m!c3JO49=YA`GxP5+sK^mr@fkmevY=xqXisk zNbz&jeWTo&$nQVUP7{7K>{mK|=(6EMjkv+H+A4G%v?F*RI5r6!Aor(x>mZeI?E#zn zKeS&@e`S9WqxZL6`6~JvBYYh?zMpUCe9+|YNZ&2b;p_Z%FEl&ezggC{d^ly|ujqP7 zRU8ffo0GWGhiii#auy&PpQ<9?Md;FX8YQwKL(6vnV z>n1;kd%v&a#m2VXZ?ZoEMxEJ@BpQfsHw1VGAdmC>{Cmp%2D*Wb^ObW?lCoZUn>`Bi zl`=@}s$=f;cYz^NGel*AUKa zYv9dtZkyBijjId)dn`2rlpas!G|w*-EB9u`f=ugZ8c*GWjAtoxNc*zBWIra~IL0?b zhVhYg_l-?*uJt&6bKN%j*vPu2&Q%++;;U>G&8XuVOgs9z_paZjb$^LEHOLM(_a%%q z2L63ko?pJT-?+v+74iH8&riNYJ{8$FnPlB#U)#9mF9s#KV~{0&q>kvGz4XE>gPew5 z#6S?YCN%KTKX@ zsrOgnA&c&zY0r4M7%4*6esI*|0`v^dY2*H1Y% zYd&`QvEcu{9A%Z*Tiokwm~uQeopL0&5~=q z^3t-yor({_%eO%fMZa{sGQlA_CXw+(K4^~qs;N&Sh>P_!F|K+qGrI3;>sxW>UwkWm z3bXAN-u?x=KFbiCww*oeD!wz0oIdNQ+m}A|qfd48=|l9uS@dh6aq;1!!DW~11?|=w z=IvYGoBsKle5#1w;5z-DC;hufTg6DzcrBxfoN~xCk{d$uEWDax*Cu^UUQGDI^^xlO zNBfhmH#7NFEisJWaKL|}R%5ekC(Zsdvaw%o9+Iim558}P_%Me=&(M63>o|+L-i}-f zW8>#(A`leN#ut*|*@vUVYFy!LYvIVoai zY1q`bzY0^kKYYuRE^<;XFx6!xf!|x69>T9?Bm0CQ17)>NwLTi(U0cX`UESN}UYTL3 z)=cKAJ##f7%+D(MDf$4Hdf@U1FnN7mQIB8Rm(QeL_^2$&$SDCSXj=PvE!JX!Ys36HNdi5S+s&ys*>6|2ej^3azS*EbG zMCM51bIc>w%L~*KU-aIMbM#%~92GG~wak&vyf)y_zV+`34w)jWs-b6}zTrv#fjN4b zIVxq2w%>`~vvH38m2B6hzvZ2yUzwxtn4@e{v#J8-sE!!!Hs+{~IWjUw8gq2ieBTT| zeU9?=Il9gqNxq90yG&qCCTa)ch)u#A1^3S9ezMk#Z+SXDtQnc38$kuyw?SFjD|xxv zR_5rD=uC|mR_>3Pqb;v^(&qxlZ1yQ{fZHjtR!1(fw?%X&th;{9!#rf}8hFn>cui%H z+UaHupBf8|g5N}^v~jed&ilxvwL$4lsW0~RXIaNy-ikc=9%sVvV_l}DTxeO79iYs^ zkC%Bj#pafE{71Z?2tOKfbp9zH$fLX+<$oso&7!=vig@CjiMGHN>m|l%N2ZyaX?5J) ztc9h9Ge-X!+^I%jeqxQ}MZ9c^k~5 zf%#_kyBDFOLT^QH_&$5m8rrEliq1M(z7th`hI%3sc#sJsMtu`spV!#dfAMv6gqg(f z7r8{6&aJ@$zJ+fnAFB`ZzGNfeoVNnufM$O zm9L}^F8cBx=|`iiG_JAU?Xr?rz6x+{guc9{_XYoE>C0r!)!|1IoBA@@=6;Q~WN&GR zMyJXAihq@1i6`CnIdp;IBed9)ZmzUhCodLVAm@>si9gsF+oVZvA~M@^@Dm-Mk$XO+ zzyG86G3usnMP#9s)FJ;Xdp9}zYf&yXkRMR@0Cjh8rkROfwb~>$ZV}}ZmY_3(&lPX> z?3`t=xkqyq-@=$p%5lAqTGN_$w#YlNK8`}&E-s?{0p2;zJ1=hZ?A(f7+$64Id$G3+ zIhS|LymQ_c+fmxz3xAb4+CcmnFK_j8RND+|E~GJcv?2Nt;j5S6t4Yk?_5sE+j;f_d^Jn>Y7Tn3B*Pj9^P7n8ksCNIA=aMQzo&C8;@X~i;!`Gik_E_U zM&_b~dUxy31N7%IN7u-Mox^jfFLgx@kov#!Jcx0G>CZ*y7g;X&RnPOw)PHWF)e+{Y z{$v$$j=Yo1+O7#uJzJu0+r>N!ZP|+6ZCkQeP7|jdAjZzI930E3CO%ub{cwUGUMp@lR;aGOnh2!e33)i>2N%>v-*d z{Ij$b(CUp{GBwc?HHXK%N?ZoXGo*S?)?V-O2zD5=u$58i9fM9CZVNrWLhgn(6UJFy zpneqfB6>fj{Vjej{tda>XUs_#>iJM_qG9reqhW(Aov9bey}M72rpVu634u3Q=V(85 zo}=|&m|+>wd#1K=;Xf^Lxg#tZb;GF})_cCzin=YS`@VIy_I2mk+Jj%GTUPX)sXg({ zgO-MIBP{c%`!(zIC^%!U5nTXyV>CF1AV=;E^zPN?FyFtiUcERSQ630B?+uiFQbhS| z%H(Xq4-H zDSHaqHS{U$C>#HL+6{Ahu)(qsbEQW4R7sp-Bj=tOc5)8j6QcadIly%xIR`#$)~45D z)<+`iTjI?xW9<(h=YSvQh4;aq1Br9eg5TA|;~fSr7L$KqWkAxA{@Ch0t%8bwz`v#B zdJ-{jJtK&5yVFCQb36Jh4>lAr#4-sZX71*xm-;ou!rg>TULCd<63cP_;m7KFy@%#0ur*7sLn8rIpu@Trg)urbacs10o z_!(mOzO{AN%r7W=m>9m__gJV zauzgwUu<*~G0~?JFa0TZ!Kyo(H!EHS9ZH18*D%%+IeR6px7Zdu4UNT?*j0udLJ4|A z54vc@^M&kHrHw@7QK={Ly@$O)H1-Ka#IBBhGUbRo`;2dkug7WTYy;Oa19pv#xg16V zyHI>%q+ijj9Vg|-ncuC}ARm*<;wa-^6%cW_*dt=&Hn5#o3(u zOyzi`NS+0_qIo85?Zu`_#w}x84xXK5T#5MYMPu{zG`J=cbeLkEB*hk_hlU`8+*lIwbR6yj7pUZ zRH2TEe-j%NA6F7~ra`R10)yFQW1XE+K~;h1l{1Kk-I;qM@vv+0!5g*$#vCBnNvGSz9<~v0BnL=xV-67Zb$SjE3wmXlXR&p%fhWtsyYa-fZd#`=^UlkS zc|ejI-x6Lz&9&NswY8!#4@fd=b0p=XxEfoK!~OicBeSMlxVc6rP`5p6s#?xw zu-AEf%0+#xP7DdTnFmDC2XuA2Du~l9I6j54raT~LD2pc+wj$q~lr@cQ82y~CZsh^l zN4*s0L|Gs*8rEPkeY5HJo_JTot#~=He^4#o(Z0KYP zvAOKnXG%O-Js%EzA_k<(fDMoj^%Kb}u#9If=T2z&AL?#7nV4aCCuz5l7<|`MEb%t) z)IL|{G|6}Wfgx5)?H!{nUGHnD@06&8#<$nH&l#YNoz_P+B zHNhf-c-Gi)>M)SH0)s`&)&CG%P+*YM2!j_Gv%p}pp_vW?iEa01Fc{kigL?ADE2HJ> zj3!vn2kFO+ksshcW^l?`UYW6{Bb=C41;o-Vqt8+<{w_^+D24PV3;RBJn&acX#x=8% z$x6xXREw|o&P}QAmIk$RGi`|cI)Qavq*_*q@5+sl`?kN^*VwY@_w6_ZJ{^ivJstLD z=#t9d<*Xg~&V-iUGvb$d@Amo`3XBV~Uw{xm83lkpFf zvOgJrf6D%E$Im?Jeqt8*6$5=ZD`mhpN5?O(jyWIv+KW#9IAulfhFEY*;2aBn z{UHn*@oP5tm5G0k;MLcC{usZ2@1g%c;QN8}`%mEewv_z|e0NCMpTO5CWq$(SO;YwJ z@Lexue*)h%QuZhCeVVfWTlfn8P5{0|N>vr`o{qn1-dsm>fpru9>h!D3$4kGSx{ZE4 z>!n|hNPlvmU;9kpUL*aYe?{QzR4L06yKO0Jq+ip#^ec<9#~tF}Z_z`8 z7oMGNgJ*XyJljd1!UUeeTN>dR>4j%2%8s*c%5*zRbZpRvNr7G(EIgt4ZE$Itzf5?X zPo+tZ#j{|I&6&YG)bL)CQtk!Fii4097yBr;&~5n_{|J9#C?hMmhbVJZ2V{(DXi7A) z0(R{eE6D>DsPNlDwn%e4xz0`=D4}b|Ee7Z5VEhuoP0sPqmAc?$r}!e*hNn2s-J9ez zOo?rXr7yME&72J~IM11|U5`@kQ4ewc6_n&WmxkRsbw|*jk;WFqoIUQ`$bP1V`WMm+ zlo_4>CST@-v?P8fJ4YGAi*s^`eORgB*Is{#FMU;g^rqI1IZJQZ1Nrz5bEYUCuPlko zEpig^HA=P?hB(9)x(IpY)G+43;O8nrhDhSOfxyf5ij9~-L3%De1F#y!o>s*ogZtis zRXu(rBBKb*ngO$}dF207&8xluW*+maZKEUfV@H!slt@9A@+NZSQ z0D+eZ0A2y*bx~e;EdyS4QC@f*P~pXsfY*W-Zo%sl;H8LFde?36x-qiC8}|`jFR_aL zMqB~|Fw8)1v7vux%D;Ifj(Jnh48G>US=z{`a4b` zZQFTeD5%;FZ0kLN$xK8)Gd#+Q#)(&CN>z6Qw+$ilG{!CHUS&#Li+HUkv`&A zTX_Q=FYO*s!Bv;oGf3Q&z0A}3#6dGe-n$ZK!@i=m?z=3yHi=bqW8?u{uEB=2WE=k< zV#nI}oiRtTW0f%;Ku!<1$iC{f{)f|#a=tZ!e7^qyC-giw^tC2$c7x=Dm>x>spmDGD zvN>O+&SB~h`*_!E_-NBOGLToFL|&C~UgrEl>PVjp*}D}IgL{R<_9sS|jral^_7*W~4Tzs)|d6#Eg*=F@}GWe{(**E!<1KSvvF z;MK3C+MEM``C;M~%e(i{hZ*=+tYAJ$m=BAwMfN#-9#%0|vIo)_>uhjPe&>VV$FS*3 zF>1w&$;Yvo{ebKl7Ili&3Xp3u*)xotGrQp@_5}v^1(Nr}!8l$ZK6w`Vi|*tRA58rt zX$DJuh{3Y11$t;=eLfc7L)#JCO{;sLG;$-j)UmRgqmDDQw!l>I!F|!QbAT}xh-r-S| zdE@te&P?hgAx#2FoJj$Mp|`*&l1ZUx5Cmdb-8GYhnh=_(2_+4wkutz8N_I&AMJ6`X zxVv#5B!G$vvk5i?QqGUvyUsy$PKO?RDnM3oUli+zD!46+pLp zz-IvXtS=~NuelEXGLSJ19s3>=ILu`pEe4bI1#oBs9*I8cO|h*B?f>(8#o+Ve2<55U zesP4o)dVag5A(w>-zfBA>_=mInxEs$(7U-Ow3p2{#YQ%M&pgDIZQo&W-p3sN)A)Bl z|3bHM@Y@vlZ8GgVeRnK2dGPpkMWobv5gL+Mwsz3AT4)2MtxDR=%QbS~8|3FI@ z>j175XBif>bcO#y8BZNKyea4w4&>D{`}$k3XH~aYt>$3P)aiaGhVw-Fn6JWH@KDZ( zu&vwvJM8($K9)Y__c;^h{yu%p&=hAq8SBP?$IiL#C%%bu8q%K+Q3=7Z{mciLOXDAi zE!DN=(_1SdAEI{P>ANZ-_fsDM`MLKnJe%6hzSx0n^K0nT4gdbP&?kHqFtc4A)&eil z4W$p2{|qJk?X9l^%i0cJlUl>m;I$ptK+oNkn%77@DtTUHwY1a8OBV)?fkwtcBT{$f zqdk(Jx-oXBxes#iJABh38|HxH3Sx2BfQRA8#y3U&0H;aRXqPY&>xBiqf zXTD~hZtM=Vf+z;Of&iy^Oex_YE04uxD9cNy~1QDYMJ>O&<5PI&MM&go5S;&zRI{b_| z?FSY@hXWafeu~RpM?%ZwtoOEz78LJKD&o`&&UDhU(vtd@S_eKcAt(+G$elY z@y~D=Q}9fSKd?w+Tn@&ynRh;+eR2TzmL42LnYQ97DYWs~msN$IvwrFgf*WAO`fkSLw;U6bYaG7+!y0Cx3>3Mu#{lRH9HaV%6 zum_wTjqPpzgn94%2b>00;S2QmJvw<78*Ftbd@jYPt z=2usH$z82@&cfO8TlD9*$>ql`FRItm2e{qEEG&)O>R&b><5sR;U;8IcFuV%c0q35-(IV zO|$J;>Rs-)>~Ogi-$TwK)tZFwxYm&I6}gZb`^Fl`g&~KHHOj$y-y6Ef!|vSHCAuYR zsp#8*%?@xpSJpA?>Av)vj6BL@-;qI%o}G16>RB{ma~}7&zD3$>#O5sRSZN!3ZmVT> z+{iYc)E4RUD7lLn_zMiQX=g8V1^f58GR^hvA@&&-)jE2l=-0?$=37rY*JwAE=V}wk z+d?#DlW~iEUGml}*iFS&dd1MCN~tTGq%MJiKfmC+ zZPL3Q`{p9>(Z1eM_a8l6^oybF*QVlUd5CXp;Zq*MUVS}4jqt7z`5A8g(4eaK>)y?) z@##qIpkX}oH8gt{I9J3Qey{GR`+;0u$@}Zh9`2y(`bqq=1PpUhbli?NVUuqnGhp(tp-nQ$?A9`fgA}=*UFKQnb{?Y0T zbkyY?fV zL!DWSOY>L5iga=x7?;#D5m?CBzC`yJj{YR@8OvTlU?X%!tzG^%x&$`j<1j#v)S~eC zj#GiH{#$fo?7H>PQaJOJxi(Q7RQTmIZOi+_n_DY%wLo~*$a+>!K83*H=P>YR{yKg8 zd+?$+ANbzwY3~623O-7h2kXLu`iP3ix2fCrI%A0i9*xXZL3;)K|2}i*d`8;JKz|l| z$+%LlyQ}}oI~m}l0hy3Y8!~tClODX~en-aL<2!ft34ZJ3mdm&sxb`zd)!}=3Q^qW3 z2gFc+NZ^JK;7x&>+<%k%GGEyb%3f9UF`-APRVVaFe#pic!*HkU0p~8{EELvFJ=MPN z2>Mg)iv2-$Y6%9R!)KyPXJ#eYe$Vs2#unN@t&(px{i2{U>lxcqbL}+;2ddB~pSIUb zi&K+}*v-&oydt{V`O9gd2>e zJBt43KbpGh6`bP&FNJL3ESE4j14fy1yB^&hxnB>@b-eZP;v8tOk=Vn7)U}sA>^8=A zlN_Jfg+5brB2!O{=iIH_oT#aD=0;D=|xunO4?yjM^|FFQs}o`H`~U>F3PuK?#k#DzLl zkbe+uCyur+koEsKZKqRvZ9TQ~gbx0wf~+!knQsgD*hbvD=x@zARW==uD_a>8?)<=5)aP)3z0ZEm6nkgqib&2n z&)sr-Rb&xo`8>I^B=RJ+VZJ)PoZnq@E8j|ATt&T|Exa#&$R_A9lUo19%wY}w{}qg( z0b2JyIy?d+ZUc_)&JN={;wEH7-N;Fba zlzn(&0Cki^wx*`oD%*S#N?C`Ykt_1tih6Ps^20)xvmVFe%PZoY66magb$HC}nIl|` zrI*H7u*00gj;dH!vGZYXBc6wTn^^Due3#nN#M&p%t`&Xk4ts0oIZ@v-ukF*Y_cO09 z)7MQo@|kPlM$U{XrC&FBmm!6pmk+^zZP(3pW);8vDChY#pywy{PR>F8rk~OrlVg$V z4)!2NIm_uZ|LyOQoYR1xT;?n1xn04REcP;;`R%;vlh7BK_5-Gu=sT3Y^XPl-vVd|k zeI8l%S@~697psTX#nNA!_GrR4nq$PkXSYr{vemV)i7^d|>0y2rx(ESI(zls84bj7g zgaV_Zti{r=^fy|2Fu}l_4l$=%L+F$&#yBV@u6>Ln?Kv82!V}+3O7P~H5BIqi9yWwc zIpldJ-h7UEScZ?wv7<{iMyVQ+PgZa&xOq^84H5lQ?o(UkN)Gp*u!f0daQ=k(Ls7Re!~EwMPWxNeNH*DMA9y}_GblIFDXyp`um=5uxv_dWP@XwC+7 z+q%9{0khB?%9ftL61@us2RIM}l zUWGnW*0~owT{1x^m}!&Jw;eG_w&EDg zHm^sLZDX-;@;Tk_+G%hOs*w2SL|Ae>?P~jGaaX|lHSCA()TyCzmwkw z>901FzPbMv*Za9IeL8CCqgJ!cZsL5HCRLDgG|9I1sAkI@Wp6DTrCR5xWZQE}x8ghi;ocE!nnlnr>S#E7|6prP~(HNw#g8quUDSC)>8q*KLkU z`@Z5zwJ-BU`@WJF)xNAf_I;&$_)a$mH4s;6#c~*R{;v2YExA~;B zScl=y;#+jrOqFCSQRvmiB-<*ZW}D@kWLxda*aMPmYXUS|PB3E+X6)ffwz6=|Hm6&X z?YVB6EiXFBwk}$;%>|z8JK*^$G~&TOI)dO|&MTY+yjBC3*}!WJFcRFC@|@V>6zg*q z|BIbD1HC&2er@WaxpE$*wosQOS21)Y|AW(3siouK_mjLU^bjL`fOE0YALW?`y;bWm z`k3rbAKWkWj3uujM(F5Z=XkkZLK{Luwa81MpL#<`)efFJz%ws1 z-opYD?l0gunTw2llIJ?4O77=+uDz=SZo{~?qSLeAwu$c8n`>XL8@V3MwVCVBJiGTz-v|7`|Ic))>+rAWRq93d?C6P4#~Ga)bvt9EPG&OooUYjmGXG*P@ahE~ z8tnzy7wjH;^ZVb}T@{>@?trh@(`{PupmK?>NRW{8n73+udN(}6o}zF!XG?V07CZHh zSoW*Z&w*P$2`aky_|0MZmX~z#iNtXZgTeJ8*Q;vdJU*i=_NwC@QuC0yf1J_KkfJ%0 zkyDsQs$l;??^|!Y8`S4*=6~_8?yVoLlp2808+1fm%BJJ# z%Jm_0J-}QKFxP6}DtuJ965E<`Z(7B9()G7eH+%9?p>O2DRUN<8{Yv4tBA3wV+%}w= zIMVM~{8eokM%V9w!Nn0NE@FQ+vFEA!HZj#@PyuD8S^ZiT8Ida*XSoAwk57vj^j^^i z_KY=`?AZ?=>|lQzt_75BO;*m&WzE%s@WTXEon!vJITPp{^ADyD?yQxn_3MMm^?$?7 z0_G6R9KKN@bzi$vH@o#<&pz3$Q@5sT#WpV$L9LYF<`*|^+*V8s-A%@N#>e2gy2R*O z!5q#HOm&fuBbA*Y7>BXZ^h;doqZ7 zlX={snabW_9@wm_ldx}yKS}2C{gC!~bRl0|=JDlw%JndCXHQWjHgutnYkZ#|H^G4q z?uFuZADmY(=V2>+j_|A6n^chK%YH|6F6C7>7CWNEG9ae}N8xf^$$u~BJ6aTb>vPcQ zEYAAw1D!O?QZ?u2Xf`W4Ltk`;i|7n<&=*8M>W>aKaha(co%ZOC1?Z@(!$+5WS}yT+ zR|nx=s%9_4-lmp*I@&&Ving<9TjFOo(Z(3;G3?uq?wHRyguP~yyaRl^DpPDP`Kb|Y zlm6h@2dU>CBtKO(C$SfqIdQBlgMEqA2R{QJH?of-9x$hYxyraWe%N^gpVpPz8NTk@ zx-W1VZjp038Hf0Y8<5RylRn-P$Nb`2-4Vy|9}Q{C@J(zp_#Wcf44#dppKnSuXRSNK z_oTc1zJ**1{E+{THU@K^=H+<%?M{BbbWciN0D6(gH0eipWLB>Ut{m)WeKp^@jKH$y zgZPnH9X+<|(~qkf>Y3Iw;1>u$&acDPRf)as4E_P(A)%YokK1|1Uh{si{fBzuas_@r zpNr01F1KLMpkL|lkW+Kcyp`cwbgO;-Zpjm2-FUXU8dd=P6Tgn+#sobLg4}fakNw%vlTVHKNOBDBs*B^tL|GiWOREhE_6n67vMT z^jqd%zHV7v`RnMGnHijaX!-5&z3)|CJ3`$Uw?-`?@}PS%2iadvKV!7rV67O^ILJA7 zr)qtojoJz1Z`tXu=zedT12|$Y8G*j+#YgPKZGpV*MoPB=z5tT5XbJh3qZCu53v^fhOsJ|C-pMEB2 zrn>Xkv{KQnG6J4!j)RXK1+!b$(dX;oQi!GIZ1z^)JHC)o%y`K0N5N} zGQXuB_#hW^(^%&($E(|CeyOV2KV8{{U4AxsJTjN75<5!1R?;sSH~j~J%QQ{**j>Hg z(+BeBwwy#>IG$1IpA!#s5*uG8vg29ScGiycdElmmaan;yF8$uMcv{Oe?Bb1#agt|@ z{>=w|fh=W=Q|?v?S7raDh2-{2r~VW%u(Wdwns_sby^xG2h%w|bha-%k4cqTYLtyjA zYa}i-uSNP9LO)WY+{<5LszaM&Hz8|iyK=Qk5PnF{Q^OYBKh{=Vq()=|?`-Upa}&nd z*8fH&q=D;P{6X0{Dq#TELW6TJ7(Hi84S^On0vj)E)G_>5i5{Mf-CFi7eW0sVFv9Pw5e|d!Z3K^{i!n<^F|xro@Lhrx=_sFDz#t@#+gNOnI*6<%MHpALVy=TLJfw z8&_BIyT7j2Eoej!(c-sX@x8|!Vzvd`{5$VA?i$1Wu`c2LhA}GrC1kYJN_PC!oo=R` zKlmQr*7O^n^4cZST4XPF+=RVKzrz!+e0H;!>+~*fm-J=tXx9(>#@WqdxIfk<^&w?0 z^YK|&sO4pc4~cWC5gTSE{F10t?j>YIAEnZ!F~{rhemwr;jWO}&9^B6<$!M7gt&LxR z9#LSgF)AOEfxSLDZtnHN6_JC%S$}XQ``p5v?fcxg!oc!}mVRFT2J3{`@^@KqO*7YJ zux61(v~kOPyHnzCK*VtpbLzZz{0p$%zs zT%mol3ICykc7aLrPWY{o7#8e!SK2z{Ku>sVKRNFu@R-PfO~?TmpU45>M}h0w{P``j zHD#IryohhEq1c`&k^01+&Zfp3wB$`ZMJe;1gj{H&ZUwfT*6Fk{gmwEte3v2zGoz@x zc2K+OHjmUy!i55otXbprQR95^7OHX&~0h-E<#AlwkqIY(Q!z68Jau*Co!MNUMX#BSOj?ND@+@?` z2%4G(Y~;L_3G|ystif8%XcCz|7x^MNJNG@P(qBQg&*Z&A==}inEx7>fDbg3l+HDJg z^FrV`8+fMbex?fLpBuow#VgS6l0I^Q-F)ySeu3G%FFcqGeb-|bxjVT@>SFmAVv*F<%e%&Tc<(g!*>B1JxRxqw=|}Vz3pr7;w(jiEsUF4`{55lY$2tO%@8XGJe;)ss86S6T-{Isq_cwn!3-|zE zbdU(KSA29}5XUBwlaFm;Ch|mhN$fUl@Y4K7dut)_kH!_9@rLeXiqOjQXY&lintm*=OB`HYy2Ja_T^4r}#`tkaT@nglJ2 zykCW{s|cB1g#SN~Ijv+)UqIKQ?{JnzO+9j{qK#Z^bh4*(>ZQ)Gx7vZbyd!dd70;i4 zWvt7=Iw5?N0x!&kmoA|T%~Hm?X7r&@;Qc8ull9S=Kd0q6u1EK>+rAm9MpRG_Dx3B3 z0{UPvI%XcaLz0HA5Iyt!K+ZybllnRX?Vf#_XMW^Q26ph<>zY^HQQFRfPUk|S!oQW; zjO{hp+52-wi@!3N9$`*bkhell^~ikDC(qDsGjqEJU7broUWFpp`}(*lnb#Tm5_)Rt z+fGmC$PvE?P02jYLsOZ^y=SMW>W~7vOL7*3ram)-)S)wNX0IC_ySQCHzZ+UghHjSh zjf0kq&9&5FJgF%UO&rd6MbwrYuQ}jAvM_UU_5~xYnn!TuVKrU zHBIF#^!UPsm(EpqQFGGUb-KKrpUzc`ab4Olmfz!CG2|I#)3>Z&75IRPku`Hz$JVZs zbu6c43NlC5vLo<1b?rU*HfLY)a$S@5;LkJgYrW{m@MEB?XRnOmKiY;@Wlg&TJ}yW+ z8DkD-tfH65`YU6tWUQj^#N^Cv5q*0@$5=1D(mqyc*E3dV&okCY_0IjAwU&YJM#g!A z9EpjHPp1ugeol+%fPInuQh&6Tn2fW3VBUZF`#8n-F5^@(&OeOdzxHv84@vY3$$h%9 zaosjI{-ibUxzlTxJoQsdi^O15F}|}~yaHTA z69cz5XF-qW(^U1H9keKNZDv6`4c0@08h)mIePf})5YM@WOW~8f@uSQ}&U!#6JC?wh zI{Dw9>n!AV-g{B~|9P+Ud-9;!172B$Y!JKuDfGQ(pgY-f_D0^xo^x&^aeK(SXyo1G zWxnNcg`bu`fV}%0d3PCkHxPMeM&9kf2GD}MdkcBD33+#tGq*;o`0aLT9vm=@G~b&a zWBxBwqWSXOqs)=at8w<-<}Bn}UL$pV&{?O-IDv`i;-U*@zC@i(4{Uv^&UWy26LfM8 z*b1GT?SO3)v~mvE3NQEJd1T#Dk#*FlsyQ#Rj=i18I+1fC?_NXJRr0>*zOv6i)*TgC z%|+HVvF|&DjJr%*=o!OA4hXId&~XN9Dtn*w154WRFogZ|LiW@1Y44-~yX_$I_Q1nO zaWUpt_`c47{($V7&H9+AdF7sBew|s{V8}Zo^kb%vm)82Wbqt+%A+rJ#Q*F9r%%zg)PfQF4z)dwv)5`p z4^Q=hr@8_&<5E+(54>e%Z{^S4Y7e}%8r~WSpFQXM!L~>EE@EA4L#I$&Zz3Ok4*Voz z${84PyLF*z@Kx zhjEO17PMudj+Y_-C2Ciaj2 z!+(Nj(IExDvM1XDuD@l>13K_LoPC+-j03@Q7x4TZc-{`4|C@2W>i@;In|uqNpI~gY z$W@u&3TO*I+tJsN5wXDV0J^G+zUDKB(fpp$0axLJLY`j;ToV-aFuriwqN}4 zkFXv5A7CqRt)lPc^qq^G6*)SWz8%c5H*>s;`8k;%zgsUd$9~MQ%QByGStDYZpT_)t z$9!I5jw_hsUzpDozhm2CnVW?J?aqXXeDiK!PF9Kt>JvPWkFBZ*TN8C%2r{E$VWw^rrP zZaIl8jM?f=?}Pp-d#Ft0&L5!pQ^baEf&WF8Or)Iy$n$%ULp_mka`xll=i)3^h!>n6 zKgfJPy2B0fe81(nQ-)CMO5STh|8p&%W-tzyZ#(-EI#RZ z;P^B-vX|H^?ME)pWFEV;`0dkt?>4^>eXn`Ik~s5cUeT5xm-II;>DUYH12^Z1Bcsk} zgzSCZVDIC`c4vRyoxY!SzI{(Xt{r2Z!6%D7&c(YZ!X)lho7-Cr`H_9-BTkr}jC2ut)mz zv8UL4ywwPBx;G8IqaS0P15Sg8{W?ir{u=rczub+F*G*}`|Dm3jybx8@RRxtDWDRSe z-qf25^eybItI>@M_H*Wy_$b-eI6sF+rHzlUVYJ};k+`2H&?^t_3U(${8l2g(_8&Al zf${NS534N}^gH|op1fkQ>rdaSIeRgl-K>e|V|(iz7U#o%)3%7Nq=+4u%C*ED@cXDA zu>-OAJYtS%&grkax6XzJ&)*!E@Co&La%O0@&KQdu=&nzpx8@OF@%pka%gIqXF|TX8 z@2rUD-U82EILpAz-ok-T0K4bW5PTv-c4{1PTs-9wXryy4vafN}YEHqgkuiSFZ-JG- zY3$;^=Uxdu+a|s3iDwMA8$D+n9>7KtUTbugV6VX!bhVbae&SxPicdgbtSh@MW0ba_ z1ii;#wA+fF*B02L!38zi#V0y)ySC-~G}fReIF}k-%uOxz-cq}UJ=WGRRox!H7*_S} zgZdWq3(pzsHz%ouaT2zWUcw8(&8wlGtRPi=(%|Fq zZ%r4yfcOkMW1XerkB4r|J<+cj*T<&!w^>__b$r*K053pf-3ht>wVa zEgKscF_@S85<5!l{hiR{lgx9fuc~I9*_+*9a~@Rcou1sEPn$B=`Q(Uoo2tM%hU6(WC zLp}I706rElKk9V7BRnuix7#i**KISn7GH8tXrvz6yg3zL5%)T2NO0FlM;H6)TO@AI z2Ux5Rm%T}!g{Fe#;HEuS#1b$~WU~5EI z``dJCw4$puZccTb*)YaszwRFP5YGy3ck^xZwc9G-#~svvCztN%?ihpffRdQN@T%SP z8R2;rI_2E0Hw)V3fB{}_KXVJ;A+kJ*14I7^4zcH+q- zRz>{PAK^>Qf>(Ax0~umFLdHrgS>p!sAtQ+WnM6)(1Y_QS-bou-M%7wDoXY%CV%T>Y z3PKh~hb|~J6iCca8#Q4%b49TYSIc@NvD=b|-MCeA{f_xd40q$!B$xe1_i)ztR_#a2 zi0_zJr;aG^*P%1q<%u`Mff=ivR*#F)F4Z}WY`C`e3q6LI0^ITx!E*vq+EVk?oj z^NU@SC%--p8ofr0xWt2>ib!#V!XpE~?|R}#WF8VjVuzNSm}lcw-L+nDC~YuLiHY~r ztKk1&+G*TMt}XX3gYSjgRIB9P&GV%n=JyWmNbLG~_7A6smC4{tsy<>D=Ur(hU)tqe ziE9uzN*fZVSubZ+@&A1Om-|QfEziiaXXXEnv7O}%s+sbPjO`WjQh6s0zh@@;<9RFh zEyUW(*vgV!f95@*1<5s#nBqA6p6bDIw#?l=wjEw7K?SOW>E9&nGjk4fWz1-EEO{r> zStqmF&@tHKPdn)2+yNdFp`BvZNl#n>@Sg#^WPNO871IHemC%b6FJ9%E15rWGT~zXlKB+1-Ra7n;$!=SF~o4M zG0N{P2fwqp{{r{^mJ(y`f&MP}Arc##dky;wddAs-+m8E~cU)WT$r1U$lOrNN>+h=6lY#B z%V3%Q7j56NZ?t^_=uh^xowaL^E$dP~gxa-F;KwVx#(Mazd$^4KcZ^SLhX2j?Ab9I2 zyd^kZ&2ORqGZFAs7_`tAT0nPs2RKPS4E3j7r+|^fP43{i5x}W240~BblB)?gid;X{ z7hJ(>lJBttUK8BTrd{E+*%#gEBAbNQ@UgY?S|?8EuUvSxgXRR@(w_K)gy&9$F&1RU zCY}+xIKaIon{>wai>{5{l@K$lXp{EWS(`G+nLxMLdkTF!^=JC_j1GOf0sF_y$B^fu za}QLlXNdvz6@5D!-v;}sc73}&A4K%hH3oaTzKzcM95Kk52Q+6fy7wPmac_NUH!;-* z$J=)5YDyOJ-~*!?A-WHG?#9Ely3;QczK3>7&|7k*jI*U7J9P2`{K-4~xy-194}~U2 zL&MkuHoi{#1EJd^==SsJV=s9r#mq_Kw&T#VC!xQxci-qh$6odqZ436_jm5>}=W_ke zV_NYe_RU^Nt&T>{Oi0vh^QESn%r}v`vFsIPkMGdz3CGaA7oby%J*Fpg+5lfjJ?!_3 zyvkQn5Bo6o;+g2)9=P>w->Zb7Z+Z4A#Mk|OuhI@X_VIg%po>3*E-to=_t3=!k86>c zGIx&(A0A#j1uyP`7h}{v z^5PQqr2mN*B{!@G{hgt|8T9q?Qe*kKr5~14PwT{Nc(IQ9V428mu`kFTOXSHM%;1NsvvQD3(9l7^w?uos)8JQ(x$f4g{`fudE?0F;?8Qvq8hni8)tGpw! zL2Ud-0+GM$=^DuSTF$-TXWI1{_aVbE;fc<(W$ZC_VnuXx&GxekTi~J2bKe(Tc%Y91 z`(GCHnjEPTijZ&1z*hlynXxma;7RuVpQ~`w;e9G(X_lJ2q3D;U2Yoh}?gplVf$241 zx)7M&1b-3WFTE(Fyu9#uc_B5rzch5O+pkA7??JvafWIB!Z-*YYJ+ecV-UIG--jisK zM~+Ur5^0%EPR3Z@9_GI-^|Jhi@qYw8b=%w1?B^PX|Dbq^IfR(7Koy$Gr{A5%sr~!= zPIanybAc9b9>ecsey`$sFQ2!#Kb6n0dj^}|85eHZ8#mH?fqhF?Y||0Y;C^d@xjuJ< zxjQ)^F+sGkijlRy%&(1Wn<-wR(&-0NyAIpzTvhi7w%7FRX0KVPyiA9ejx{}FT$LvEj_t&J{x@~2 zmu@G|(hzQ141fLtJwF`!tmvYy7XM16--8W9Y6oX#vxmnHT|0?bHTWgBsM`o+`rc;` zJYLZBwpJj|*RIAV!2F0W+bcEtPZ=V}o044Z$f{MG#k1Q!jJCQ}oz6BmpJm)NC;#&t z9q_1v21G{`9Yu2Ai;y#-qgb#7Spr6zZzKPU&=rc%6?(zDe@UEh;?u-{sTl^}+%o6t z$eH9K$$sW4FmWqm?ngK94^=)(&QTX~jy6PEz^&93I5I{HIlEld7>1~jnatsiRmrW9 z;JiP1QAK)m?%H^2Vb0n!rSJ4TQ{JG@{VFn%f|Rs6=(39x=UscWArf8y+rL)1^)pcS;tl=EG>SdGX_j65OanCE_mFX3B7 z-3@Zowv(f_hWxb6Uq-Nhh z^0)dimO(K?%oo{m{oe5OLVg=#L#^uvg;`(EiOCmThJAlXkwMF? zWF4HKX=(lE-#PUqt$S$vQm?5iv6uJCw@mHrOW%VGrsFC))TnhgP1KF1gIb8`LC$SG zu*lmoC}ybnQ}pdh#x3o=$GE>`+Cu+9m3J75uM6?A8fa&CtigI>P^k6ooI&|A-W}`> z8ljOU{PGq<*If4S*02-5i4=PRwg_wUW>s^c96vfXh1+kaeZjA~x2}Tbtk7KZW@0&c z=Nhv9>{RS7(AkA@^!IPc3j?Ru-=OZwBxna*Y5v8b<=~dH>}rl_(P;*791VU)n^h=h z6sGkB$9uu?r{K4W&u(zsz&-r3Llk`3la;l^DI9IdeyT zikxxf%*_`WGln^i2Ue9!1EL1?AAcgAe84Wt0-}0F8>hx`Kd>+$YA*lv>*qUl%qU~j z$I2MBdblxaFYi4YJkb;bth$6MtAX!J!0PqEMsPeh|4De^q#l-=ca|EadYCC|;hj^* ztL~w*3%#bk4{c9hY?}`;OMBhUHnI#JkRz$YU1edzMscl12!IeJ|8_T-F+LT@b-d{(~ zEYONWtkux`tH)qmR>yOY9aW>X(|DbAG z8IQ=Aw&hyE56G3dMLtt!N2Q*al^ZqHF)w;*FmlCcj0!C>1mt$njn-_#ol|%0e0=dY zJtLzo5hwU=PqS%lU(QA^v)5FqDAR-RR|x*VL2(1kF81R~m`f3K*%vu;Ce7aZH|BiH z5WxIRj2Ao1@}z=AtP4S`*-v2?{{y+H8(61_^9wzTjFNgCSN^!8&=+|!n7!^bWL1XV zJ-2FVyR53j9y}2G-wr%Vq3KJ|smL>->6f7GTkwJC7XO1UZ7;Mb@@sF*JwM4Wq3uTA zX~SAEH}Sg>S+HwDVASN;z^I8TFlq+0@mk0f(@qISruE1d07JA}M0aMK_BmVn!H ze?U(G&udh4n#izS;8q9Ee}(3Uu(k-EM=M{C{Msn<&h(KbIn(oXWPy=2D3CSD&V0u#^^KYgZrAV~1a4!1 zUo7ymb~QwW^e{y2w)sZIb6;pfWXVxr^?pdO)i)%?v@S-szBJg^x&l~<{Bk3|`Xj$S zFoc=rA-^uLK4l}n{)GH;Aiw4!za|ehn1aFYK`qi`)OFK3a*vPi76$gd5I zwV1JG$_V^{0g)_o72-HzdkVd_!*;-vaZXT{z3<=I@k6{_(JqZ zS;vPUw?t=@wOrQtLTLm365bLWT6jzNN?_f|TmHQNbDpX|Zsua^>Vv*+4M{GTquJTB z_~&Xnsfp7k)kfVF+es}jw`7MqotU21H+pqTAP;KekFncb*Spn~w~g6cXo@Pc`u)$gFMljLVeY=yF$NJ@W>V~z|?(|e- z>pzW zG%?O-Jvvyo?nMU{dgE-Q8d(=NLR%ro${^r!Cvf>5TDk+cM8J;&^w2cn#mm6vjmLWZ zq*uN6TX*{VT9|1Ta>)#AvXD!~z-BgbX%2GfgQ2=923}l;-fU2TrWx!V%?~Qe(f9-p zY>vi{_z5;A54G!#M?|l-C7R>X@3cI|dj24=8LWcSEbI^JIX^_?*AVp27g?{~W3B25 zZ2AG47+~|7XMIXNQ3`C9vp#A3{t(^!8+7lG;h|Bf0ijU`jiFJ!k-5iMvpz9Ek(61<6O5!V#zD9-DPHbdG6v|#dfX$1VPnW!j~9H(m}Oq2%&Uy~p5l5J z^Gf2njqCT|pPM`*@}d~o{ir;TTq$RMjrh_&X8u_%mJ!n#{}|#IX3*|oV~PzuTk6$p z?9uRe!6EuPs75AC`%OwgE!V_mY&2edynr)YBTB!wjKJo$@%_+W7D&96$mKosA^TQ6 zM(PCr$@MIG(JRQm7F+ysu4j;cJq}yKxyoRt`fD z4(x+FY3qu|_eah&ezB|gWJrvx9^H#rN#gJinZDjOqa~tT>Iq1k#aVI*+#3?wE4YpO#yVURbv4>7w zZeoA@!5#N>`j+usyGwC4v&8ZnTz~l$KEu1@I>n`abW1(ih=0aS4eiL74l^bh{S0B$lH14t&5_#IDdzJw8o|k$iOl@`17a-|Ck*s4*hB{to;+_@e%0{gPU#HNt=Y z+xjK-v?=u}BEb@#cw7HhO z=fR)Nhc)k~IwxH_`uTTtPO@o3ViSa}(>&Mhbx3~Yxo)pRB5^yt@nieq$Nm%7qq&xP zBNw^utVz;YdqnE?%6T2cIC;LMO<8XYp7rKk*K}Q7+0(J!OyhbD>y4~4-o&x4LQj`? zzMJ@^lUcX!XAMd_;Omq)rtY-{r&30z)J`)L2eSqZWepnU%GG7v`Pb{v>^Ku^gH|wO zd!Wm)xP2``2WVf5&~?J8iP9do*R|@?vHF($Qls;!WTSJK4?a@jI>Zl=zgD&G_ok0h zqfPwo4UgGf2WjIZ>)9;m=3!#a_VMm8AM$fby_|WRckwXq&n@+K9>Etib}n0^H{TrzM&6)A6rIpbW6s;=$5C~k~hm5An_mA zT0OBzHOP=eLwNIYXeu0f%3N%3t?+KAUx`Cx-&3`XvBx3 z=VFP4t;OfkU3IOi(7QJ;2NrvvOTm-I7{xESm-7^F^4=UVjhI)k+$-*uxW zhBFqL$ke@TQtMh|a&bJe9+(d^kz?+;M@*QHmuoTi8-2#O1eOo;pVa%4_B-R8{<)v^ zH{20-vnQ+2BRw%sZN!XZ7|hLUfW5>!{lM?(v>8i0pu`)>{LaVfTe`9?QY(;nFJ-Hv zkDiS016|n!4mJE1eMDlDDxRjkCUb``ol|K?+7NhGvQF;--qM~%Ov4wn`2+C#o>;d6 zXrdFA@3NK&9!7P*eJ5=;dN_NcwL6UuemqtskG^UFL%>sqQSd)7P6{V4=>B` zA+`+LWh1^RfxUHtzD348lX1Fd*+%|W+T%Y1yrJ{yT$gXfX&yXx#!UT%c#Zgu@k?AR zHmKug_!j&NpW1;>6#ws{|4uk%vIpMIyaYaPOZ}A6ZqEDWwfmd@AwGlH0O8Ar*-tha zH0SjqV*64wo5{_&b%3Z!lMS4v-3aTE4tdN{3qk=46v(^6yYgH%{}I;&oI3l`+t1g6&YNQX z{@ydlo>%;cQv{})Jo7F-p5D=J9egD1-sFA^?_B~O5Afd^+V#X5dgkC&b=a5v0{?$5 z?G8+F3Cu-)c7EC>z2+K9?qBAIL(8&)v@&CWUMB0D)GfMksGXl=U28$s{-&S3^($)X z%6$iXVjxCH);W=*H;TMn?n9a_`>&H++j`qu|Ex!pB_^t?zQjO16Tw-g$p2#UR2!&& zC3=1&v{yeAx&tmv$S!<9RU$X)mut?;v78soe>X=!le0&Rl;^&h*#5kQ+}q-A*ro3w z_7r$N&%8t~hjyptmQhV=A`bq0Vt;QM;J=}&wOi3!<=YLM`~6JGloi<3ByT{*nZ$QR zK=Hi}@36Acocxv-^loK-hgfsNi|?Hoq{`Oner4Ym`MOpI`INa+bep?x@x3>TOs=*R zgYDGITEXe52HTla23x~-23y5a!)u%+&|2YJd~ZcCA3L#a$n$2#T|{kT6(X{Sydh#Q zFQ&kYl7Gw`^62|&-FVmBpun;XK|y6#x?}Snqr0wk2d2d8*Qcn~D`~2A4$sN@&<)sJ zor<5BvCa(&DBBQhFWAU?gTcYT&8k3I*`t`!sD%*NT*)3XL#O^3b|i^I5B2wQ8HRA~ z`w(;n_O=r1d@5VD=5(~(b~CBq$sqr-`sJUG%9ryT=;PWvdutcq*_@JMyZCZaK`3kh+1VzDu#0hiL_E%k8&=m2PV=CGAtit4EzFgXaeU zuk2Ktfx3X(a|YhJz8Tz63()&f^6set7{mC6F&6h`$t_gXeZgrx&)B){E!U3={31Lx zDq49~*3d|~4=g)l+rP*DdjNU}m;1ooLno|_H=vUp+z;Y@rwnV?4NiFC-cO4xFnBf3 z0$wq+oA?a5Ey&GN#OoEn`)>3Ofqgx+)OrsvBkq0;@#sRQP0+E>EbHO%WN23U6`GZJ zXUnV+BO6BG8>ep4Nos0fLr)ia_*&P>F0kfZWL!n$%dZO|&lWj;4!?&()5=c5C-uno zMtDNvKpsrxOrMT+J9#1OXS{HL_k{lK@U`H(9{F|}7zw_;!1Yb=EW98xO>zL+fZ0jb zc+thP!Tp)C@viAXhO&|%ud>nIbXQzAYMDWI!b74{Wb)3Rku~*vM5mr;u-oR&jvd*J z>zT+x9}jG(C&=&4eTsv&#YPd!*k{m3R*-kuvq5@UBfd?kJvftlv*4>WLB3^i{gr1w zAvhLYz7bzQDeH*rcZ!jvVt;7@7eTbu1nh-hlrubbqeIj>LY*V?+*{w|I;Jt)Ih<>eiS88Bv2(jj&hsg0wzf&? zr`S)AzK>oZvQTPc-|@R7SJZ5~OKNn-7_kFDALpqh(fVXk>#d@s)|Tuv8~Z$Bq3z`N z{Qc|_sUI!1r0K^KlazC?yYoUKdm3uU6p@!!jICwP@$Sxx_^sF7KDk=#Ku3rNy^?8k zhP0hrEwykmv9(j*hjq%}Y#avX#chvktu-dduZ^CUH^2>hFez!mBbq`bYbgqHfmr z(EmAuuMxnf%*^9j_{ zu;rtRr|kdCXMqbj5xjf-lsE5Hq5HMq-1to!BhTPh`d(KH-&Ylpr#j}|lI>+9;I_ID z9+3RZlW%Jaih1{BowlHX+IHe6xi-(sHlF_?q2X;j*PH8%4eifmoYWTFqK?SwC6=k@ zfScrXN}a6h#4#=+j~7WLp=9zD4R6Ho#N$%e|a8-e%pHg05jouA$b$lnD>Lv~WE(``0+n z{Uy%Ks&VvjHu)siyy2yew(J-P4H%s}weHSCOZ$~4F`p&3GB+` zSCB8lBZbh$VSH}q9Y$viJd~)b+#S>de>y-7e}wT6(-7xw|tSxGz*u)YbBC zoZMv2(M|(8nBe9j&$!2H zTfXI)@9;4;aPMt=jIvf9(ZcIa-yXBMW@%XYP&p4O(c5*MXN$sF{;{nD{1p% ze*R^*PTXfJ=^9zqgL=Xh_#ZUn*$8S1pG{0^byFis+LL{r1GpCllhb1M9q}MIG3f^9 zQ(pEO>;aRXqlTCBgJEUc14GL4g3M*FHzeBzgsTxh8vLBMQhc2^5BWNOSnfw{HMO8W zYjq&H-wV7a@#5@zt?MVgRzBSDTDi{nsYfySIx$+G#~O|`@GbQ6Eik$}M%z-dQ$JQ* zO8$aemp*cZ9XSVBq9aUQTt6L@d<1Nce z9~-&7boHoBJ0Ht08Le7ZAAD@&@`IXfP3hw!H=R)hEA(IGuRgBXN{9Svk@x8BO`D7F zowixMHf^)UM}KXarTE?=qHYEklr(QfKBo z@>1qC8<{z^(6@Yg;m74W$Qk(aK5Yv$dGvAiB@WiX-+iWSnfW$nsUi~-sdrWUwL4wT z;>kH=bV_cn)E;-7GCIe7u5Eb-f0OjpM13b|ThYXm<Xjb+SNqkFf?o7T%@!bfFe@X1gwJzSSoxnLf9KEtgFaHs}wRIf(UglRq{pjAx zSf-X$my2D(Y9?2fd59fB)-R=e%6ZGGA!u475WH zoof-ycU6&Z`DNO4GuQLXb(rQ;R$Tap^6#17Wq3pASLUizWSNC=H})OtYNp=|_Wj6( zf1IPq+w~4(7QMe2_=R=MGl_XNn3yN;#WF{MQ3k%g&N-6fQ9Z45jzhg&CCb0d=)Uf>b9_aHF^ddEQ=KH7G*hqz3BQE^mWHos{aRpECpP5*ZJ;WBMlH>yH zYDdY@-kZEqO+M*EJy>c#`t&1)nB0?k(`d6stV@65&T>Q42#ws1i*YL9F6CoAy^DN% zWdHlf%jMug*6OpIrBe2yduzlaDkLj3)poGEO2`XJwdIkYBI`qTkkKajm6As$Iac|h zNi~vZwSK8r`MkI>wxi2FEY}U$W~p^ODNv0VVmfy`Dmata?m6Z=2hB8ReWGrs>NB@5 zd0pLJ`g?VI+V>H8mO8ayJTbIhO=_SPoNe|Fo@;*D?l9wT-Wwk5AXX^TEH$??tJLkt z+N9gF@#oKYOWmISuDU(*Lv?%6@$Pwxzf!kz$P;nwwBNoT+UyH09^n1_uk5#<(XzKE zG$q|`_0KntUh=eA^)56!cB3op*hhv(|pr3&D^+nnK{Lt zWljbsbHGWqzqT*?Ep6Y+;EJpY6wolzp5X?i3uKt~EI42PM@Q!GXl%`79?7 zC3%?hfpF^VXGy$6c-44fHP@5lb5##Et={BS^G2+i{7Fx3@`!sA`wZ@*`egej?UQ_# zTs6|%sGHJEC)``N($6V$vE@8J?P<>a3smp4#LIppiT!ah`C%zyKlJR0vzd>BdG0_D z&V2Zxyw{;wZ|LMXa>YJ}PUO5JOJ6lO_cF10%wayCaZ7jlUu8^F2B^vA-#=cE$T>&7 zIpc_PBXjF($1nCLmQrZz3^ay~w`L6Z`#GHneGMmfU?zR#K;x_VzYj3TL@&k0GsR7x zGpWHZG)kP_6oHTE2m+4`&3?_Kt%&fvOU#LjHYCYcsXfp5W!;917M;sEvoVA6?W!MDs;+S`8I zy;bnkbj@Au>ATeMZ~HEzZ%=+L?=9kdrA(fkt}|BplC!I%U7;cANBaGZzY6)19ECsX z0cm;!G(lhgjuuAyojcAs%zH!N!BBYdgkk3P;D)5z<3>JdKJ7c-yu0@T^N!vN&E1)! z!9Wfl-wx(3^FEG@S3A(*fL$l9{YC{$_2-jFY-gHtU1TP?P9l3`&O#p|Z|3cCZ*3BN zkay#Gwg;agYP_x3xGr)xXHET_2K~up{xi=meb;__df%n+=XCR{?DGoVv)}GEa)~)2 z>=zabV_NW`{kHeW>1H415gc4-UU=ModoyGI%WtPxzOYZRymQZ!=7%lmmaiv1WC`PW zkv@yP_X9{zT5_j$<#>j88k;E2*W3TEDX2 z?9YEEu?P2&H3+-p0OeCxK~3KA)DAdF{fIu;2^xs~fsT%!*{XSbC+8xtw?%7P7UFj} zvo*jM7UPd&+E-Y;ao62d*RpTZU=Yp`$CbaYZb_NGP2 z3Om{%kFE9pu=d{ZQC4aH|G8(-vmprYa`gk9Gy&n6+1kN}3@Dq$h>dtXyDyYBP->-WdJX6D@I zKJ_}EbG37w^VCDUt8)CS$fNzJJIyem^XV#bzA6|0E` z=%e&i`uut*yFo89w5EO_psJIHfs=U@0<=F0>)Cj3n|_uaCG(RF3f zUcp5A(x&sr59xWKrSS6CPM}}x(7tTWf*0~^9`W`p_{K>L5T%SojsMb>J(BL3%k#w4 z$h_kkDQ#$uhTn&G>c`l`Q~x6B@TdHgFnil;O2-`@+@pyrrjxJ>IYZC<;|Mo5ZEtwizJ)l9OrU0hr~*0D$$pn z??-%u=UjUm(9id#9b&g;UK|JO432Et-hkZLuvsgc$Cx#ngjQ3^7H28PwRYED?4vD( z)gv9dvB`=({4#Z4Wv--d(GQ7D@_awBopf%lqd(WCleSwcgKu$s7>Uhtx2K()w{-|# zF7dGouXD}-{$BEF$oI!OCGwVI|JJ;LdTVWD@Q}6HPH#P1|{OMe{*!tyMcz5nT z!zO6OzF4erk6RLVUzEmp?sNPenSN9bau|C^BXXsj;T^fgUOAb#UiG_)OC9hFgEn3r zi{<=oZ_e*7P=1CZ>n9rS_uDqTZm-9l)W{y+|8Q!4f166^rx*H)EWbR{zQM| z?!@2eBBsk7$-)zLFVN;n8+XHV-C8lREPK2P7k)|jrkjfgYW6X4RBWGePXKUYNN^@+^ifE^~Rf7hU2fkeO#e?jBd8DK5n@4_bR^)UA;%S zoIh@HI!8Fx1**1758_jiPoE7l0t80c7P0#M`u%!As&OL6gJfVezJPrSO*bBO@cP(vAK_Alu=Fbh;V9dZ@_0?FFes4qa2PD)fVO z+|$vQc@doXZi9>Ni4&Q2$nLbb zmB_au+YUpvy|PbPt2?XN4bbBj&T}c`7vk$A-da1o@*&P>6zIcpH|%yqIXO2LpgPB2 zaMLMkp1N!C6aECAQr6MfoYef1p4zG}knKtiW3yPS()V!&HHNsEy0AA_C!Y+Sy%ZbF zw0qxP-Fy9^{abI(KYMr<_nEHO!vES|g)LrRzQ5C*?6ZZ?WgTZ;`>_Tdn;15C5HxsA zbvFE+*aa^5g~HJ)eZZ+nwxS%Bn3$~+zDdTe~MmTK>aUJt!0 zX%f$EQ51R_@b|(AKZi;AyZO$B{dRnlm1AgxN3V-rvGV$Me8_Xu+y6qpQMXz4k7#$^ zmLiWYM<4QDz^@=RNp;(=k23TI+p{>U)R*%duqmyJ=8k2px6GyCqCZag3cgN*X5LpJ2iqgakjsc8jfGxgDuMyL_ zM2ryp!G2jh0Xo>m8QlPzva&vljm&i-_s0Ife9zL1A!*z}Ytk8WPasXDpkc&2yZIew()I4!ZUpY)#ECq}&G15%))bQi$DYHRXp<{tV(_ z3?x4OXcZO`MwuB&o_lHECl=UN&LqBxoFeTrYGLtGwv_9utDSn9O8+0RB-l?R253B3 zDf^Jj`AFzt^keqQ>GvSN5({PqSSU6pd}H!uzmq-)?B~f{LJ#U3|-aYB}NW5X@{; z=0w?7_sk$Bi59hbP;8*%TAj}EvG(*nk^g;r@I~+b>%&9A{3~C&_Qp`&KfbZwamGGj z-1rw)diC$@cm6ju)A*0`_B)q&CcY7A&|clwt_1m=0rni?zr@~erw; zv`5ys^RSI|eOLKk=V|bJ@O7!^92IBu_?9)lQEc(7`PJcSPbTdzrmPFB>ndccxO+Iy zr^gR~@pAfYnNv^Ps*5?q^5N{j|Ms$f@b@752ZxCDo*FdPxES5gllq|PNgDT7{|dX~ z{jhCHl(1*CsA#hgz)FoYE&GOFnU9Y1DKZ;CJOMI)ZEZec;cWU181ZNcrh~ueu z+SWaCGjTPxi-O>SRyjwoGSF!|y@oUczL~+uV9?hpgVQ!l(z=q*e?zOCwCt`<+osi| zg_AE#T`xmc%nEnf>Q|B0leD|kbw%3xo=)4tk`_%`Byo1-98R>;R=ScjlX5isMOZhO zoVM}uKbAcB8%#ys&WUx}Hm@M9A8CEm^-^pA^ZPk%=krJ#Kw2E-leS=h(>77khLASM z6UTSq5U1_Pa?(bSHVkX&VF)N^|-gToKKVZQ^Vlj=WM%} zmV|$4%6yeR`r7)luPnJWw&hiGTG)|_yrH^<2U^;(yYr3Q*xdrY%RX#QSLwr*(}s_t z6`ql}0nz2R;bZ@)503wVbt7kfe$X4sZ?Xs6_*-z9;F83guA=pogU;~^D13bZu3&~q5AM5J2GBN z8UEnZUjkoQ&mA8(*&Dti4#bVWO)dKY9Q_x2Sp9V2`=iT$wTpdhkw-2#$9v!YxGy2s zFpj=`si22Pzi$SQUXNg1tzpkOp=YntHQOJ=uJbr+jIe=`$=B(S6IHM~{z@OlD3$d2vrn&__*hMk&ZTLmvK_T2I8 zIpQngyPr$$pl)8@dH;$hzTDr6ugLIP)s}QB!1m{1*pOKB!n4YnuV>BIv*zQEyI}e8 zk7V3s4O>#Nd$ERz6}LxZ;!B(Lwn(rk0GW01tDIlven4UurFY`l-@rU=zyw%qZPm?Y-)ZUBq`2;>3*`K{y_{oR#y$s2m&$h8=f6gA=$^Qkz^Y9*4%AXC!$X)1j zIGZ_xJu!)x7UvDI#(l)K%FvC@eb}VBZH;{@>O=OfQRKge{2KXx!=CmsJXaI%oa6HW zF%OUF<^J@9+%24s-Dchtb%u8)^3FT7LH6i-@tbnux7`3AkF3>V+~?Z+Dth4u3@Yp? zgPOfaA8F{q=jkV25Bc`@59J&5k<)XYcr9c#yt7FQ%ndlRJ?h5e_77Z`DXyG(CJKxg zS)e-QPQ#z|SAVr^=n*=|_#ovh-ImgJ7iUkqaW46O;xTmPY;rifNF_18emB}`yvh9@ zQQWIA)?hO})t7s;H*}3&3%~Y@3$LuM$7kj`=VYTfUpq{7ogT`#bqgJ0e4jkS=+^_X zNANp>y}zA)$ePQ6my~wEQKm2ANL>qjzKNIs=LU>1&I{tcx7hJUbeHJ%I_JJ2z889U zqxFGvAB~uBcK)(nbMqEQ&n+T$$;ZSn$yRsIU84ENkJogDm$c~Vfe-YIK1WQHPx}QL z`cl^{&Vf(n40sRD^v=V#X)0&HPYn+=e5~))El~?H992CHr!|A22m6(abGdc2Y2K1Y zM@?Sx=-SVSr*Vq2wBwhAMPG&%eqekStO|>6VSFS#a6?%1QO50uzG2Y|!n(w_hfOxL za2EHdIW+#{Fk}4WC02Lbj}-bV{Bwp1$Tg#X+sv8k`TfTj3)lLYiet@2?04z2_%6qv z+@CY&0mQxPH>QuVg;+gP!Rds&08=q>(EPb8v=qO&`{~nt^y!-PiT+HdUnliJhR=re zFs$VK_75u5@I7~voup4yoKYA2pSonxsK++=M-Nv1(?8_|B`-d zKV=s?uhBNf9(}$1vzY2TIcpWla$i&LHfQgk=nlbl{g9oDGyG*RCRl3|yPH&1T z084U8pNx{21y7yX8CAvE-^_{`>jpHt+~;Eiho0nIuA0%kTNf1pkJ%+Yjr!05_3VN? zhi_Jk*tMPsX>1J)%{Jb?oP6iBw&=jiV^$gu2d!s}7aFtrFEZ{1%S4tcf$!=E-}Q$E zo#SO~`@Ub2exX$7U`%@opV5)W5S}Ul?0X)J6P(rXryP$@f1y#5}MC@UHwm zNq%Xk!QDds}>6 zYW_CXphM!fAP?wC7tG(}m6PY5a_xPZ{ZM=+>t^C#pA|_vdz63d5MIi|%Szs<5ZR`SdtYb=+r?L+tvkNC`?+6^ygq%@0B~@ZzN=xXF2W$Xs%BzST|TTT53s+S zBd_SGruqHCfUW=7Q1nz1XHKv4H_Tt3YMA7|W%@<(`*c;~UUlsiJ;77G`&$P;n~H4E zD?X6@TjYP~5BzqG@ZMXz{kjG(j@(r_1fE-b0Y%2TeOT@@)tc+~xYElQua5iQ+r_TE zsf_&(>=%1mT?szyE@QsO(vQ)s+n9fHh9hvFL1I=#Ab;J%n9gKOU!|-%FwOUUFm>t_k(YXz&61+!M0p5F55r4+h^e0P)!$~ z1;+X7G{YhA&F}7>(e>clE4}>)k*>O*HYXUbfDwbigg#)xY2rF0f(H@@EqJ)U;XJV} zdT4=$BGto?rv)2M6H{1lPR`iezhvd8iAz?lZ6qF!tm~fnVbP6@*E`@`Z*cA?I49{J zKM@vP1kQaO6BgY&%n<)W*hIsZq!*dH#4i}uGk)Tdp+Ckq60A!C=j!lPoCD51M4umd zoVYfz32vNgp}m~d2k#P$@nFS9VkL|iV=>;>-(vh#NN?^3>}|ZcjynotiBCtrA{g_` zM8r#r6Q9T_OBRfJ zbc0`X7ro!~clkaI{!Lx7U~L+|4PaXk`1jZ^L!*Np2#vOae{ta7*P}zDo9X9JVpDV> z&!6f0r~Ka%I?Hf5CMe!Y+_L+Y^jRx*lL+wp3;H8x@;o>Y30?^f^jZ6RZ(6XDwBY!u zjFKtg$GgA=;W35xyh+|0lZodJ{t#EJ{Cn29_-Z&?Ge-IN z%kN~ZSEF>%dVt*4J^M2|S zeI>qyjsng(ia+*^$>QtMEB^bL+=Ib-T1cA|cYDkr@AtH~jToer1COi@CqC$(hz)v^ zShCHmlSKCX9u<9zW?iiD5YJNicJcj^#P~EM8b6pp+$v&-NPN!#)>9yIX2pQM#;~RR zc*kZmur9leiZMn~MkD3DAJh$cvHci7RPHA{FkrOtkGW%v8_D0F{A)%f8Sf&$#Ao^4 z`fyWd>_~ThUwl$Ez-rVjPBf-MH(Ze2ZN)v^ho2*M$TV~3_>YLsUxG;EccyVj;KF(=|1@N#_cg#AwbfOXhv^NqwMOTX`= z$5wm)S^OwsA2o_TVot67PPAdQah>6D<1E8t#_sDLG5$Iw+t`WvpJDG19IZ~4eIpv( zN{@0YSbCLbBKwF8 zC|`4z-J|?P0=m73KBS`zCH)XN>MNdY*N?Ie-kX~LAmxl_e#axP5Fn;_g@3B;D{K$4j||RA z&Y#0`k@p^>En-_qTb-PL4{51?w%;+0$u#QVLnbuX?_7w_G2SkkVA?i%fpL4$!={$* zlT2buYvtWE-aW>0 zOclR6?$pt(O$@^37>Lc$$ywu9S?6MZ7JXHFSL02we_zPqu9OkV9ec^AySn$JYj1mC z%1srdg^51QKWMT|$~dyt)GZ(=&?aRyVvm3I4skJfZtudp^DT0g?<4Wj+h>Z+)?=%+ z>(^RikVmp8Ya;DDsMLro%G#<^)$ZQvalSFu^1Pu0Pf`MGUW?W`f`VuWy5QtFw6e(nvd&k-&1=U zO`;RQ|FWmOEeLyYHgSncU9Jk{9O($erY`p4U(%;~##H(wWB-%AnAjogPnX@}uPd`) zFCOk5e^39L7+28&d1xf0*$IEs42?8|>&mjo+pk03cj?O-oiZ%rTh@?EuRGJo`#v8< zvHAYH-I$pC(8R3)s%;(e#bf92Rm@J!f8H*8%$ z!Em47*6BCllh-m20qE^cV(-N_>@B&cBoqIM&u(Yzh{MnMv)lR|hh46bQ$tn43ViyW z(e*TB9rtq__u5XxKSkpAPc`&U%*jr+rQ)YHkufU8zT`&?r;oZRYt&uJ8Zaw4|04cH zVsA;N`~{pLmU)qWE@f_}5QpwH?#e3Af^w7bCx4y$WbTQZU@O5_sT#fJwX^p8WXc^% zxt>^gk*sHB>%NqAh|lT;#_3J`RYgV+*+AC#wFZ?R`PX~Oc5gVdpICH`Ut!buN*8&m zm2)8TLb?_GE~IAPpE(;nmDoQaf9|&5(lex}|K*#dZ#Dx$PYHnN`>Z%1tD8-!ZwvN7pkq zxy_ZnhWf*`h(zR-mh|6x>VJ-W(wFDLwLMSp+x_gY=h?ITch93k#v>@Vj{S5w<8$PW(8;_!_j# zU%bZl5j>v%^LE<>_`kmFFR$06p*`-qE4f?3=g%fK?9cWn+hywb>?vhyrCseaKXkVzllQ~z zJssZ}R9p8#<&d*TYf|)QGUu=_AD2Cgm`7k{_Jj7eWO%oWq4+qYV3$vkXWX;Rv-#85 zM|oB&&tkAqayH3lUtJiF4uWUj$TR$?79CeS3v|D?I0}0zxO#?Xm*GFn_??;X^^-D} zhEN~RKId714%r1g?{@}S8^_(gU-0%VnmNFsJ|gzBUCQJxA>NB+46~^3{ZL)^|D=al z@@Iy!*E)a7KR?3L_KN>2znT1Y>5r%U`TaflU;2;y?K9skyV0QS$>g34xsOrm7QJ&F zSm!DTEQ5z}#~aDoxpR(7&g)+wZ?GD9z9HF`LOwaS3yrn(v_l`8q8!BFt`z>JJ2Wo$ z@!d>`cATH9D(fFomFIF)WkaHB6S|_@UGn~SGkKOO{!W@>$;X=9GdA+VOnW8vu2pry z8-(Mt9!pzXL2=Ti#pks>W@471pQ+^DzEz)s0pi0HgpOaMJovqIldB}CE+*O$2Te&n zd2b)@HS*hZms({(PM=Df<5@S;lcOC4tP8s(+Hp7eCGQRL%6A|7I*Q+N@1XCDv2Tp} zhT?lqz5T(_^U$T#XW{*Rv>}lCrQUO-_vd}V-k;XfJNOmp%g{ZyfDfl-tkU`3lWlUy zx#!WT;~e+0SGwb@%#C&k?xZf(_RzOo;zL{Pq-}f$P}kY^+MrTC`18f5-2aem1pD(L z@Gf;tv|~O#7bW;yWHN?Ra-tn3`WSrJfTq);YlPZ^u{Eu?T*@(VW}(EUO9j^ zE_*ZDv0qDy+pnp(?UW^L{Tprkn%|!N;$6-f=*om{Z-CK{a=VGpID7Evx7lZe_MOnI z2^z8xJHtcQ*u$%2p6@E31$|fZJV~AtFE2YrIZ~my0{$OFKQxMR{SHsC`Jvx%?>V!E z311oH5}HKUuy|K5M=;}S@{Vs3beBvyD{6ZEY}_r}SIPd@GVi$6;dEsL)w;ZNOj&hZ zRJw(+N#$b}dT7vW3+D849D?4fZulkw9CM zT%NooVs{~LD|t7Nci!ioa{|jVIN7~nwa=ws$oPJvSc|SJ7XPdxDCw9Gi zT3qS)p~iD}R(Ih`49e=pUiZ7zR!0?>l*bs?@-2Ky>nd=ny(9>~z0+ZDSsh9Ima|YF zA0{vOv6wyzt}UVuF8(j1eYJf1=*xVSy|+Vb2p@I}&ByY23Yra*F+JYP!G2XE^lN$i zk(=Oa{2qAu59VuoN{9=Pg$?Xc@-BVuVcX|d1Fa?OQ;G|`4D4}rv795rR?_1Wa6#6S zeBY%KxEE&5chLXS`yRGcX_2{#a}3WM>cu+lQhsfSYHNK5f6yLkWZe*Z+Y9@8*}A-| z+jBp4$ec$qFD~ZX+({)w9QJc`W?cvF3Y#&$x&>Nz{aN-|a4mwq&ZAx5QCBNv5Ss#fwrZ=@+gslY z-5-_uskY}bWrolP_USpJ|0lI=$I`W$c4Y(MQS zWNbfRECi1m(N(q3w=ndtvbXNiS>0nA#@d+I4*j-!*O>|IW$h%zLZ8H#GJS3v6&a+$ zkVShEZ)lZ;G#URkcpZ&7=%eg5Sx4%x&=u{GIt!^2pO}%G8T-TBhqj5a&-Pcx{22Fb z+-=&QvZYIv2mwt9$-Y?FM&>4$THuReN2)gZ!(8GkZS!WA39Nh0eqjwQ8#EVXj z<&4Rd^}B-o-S*s(&G2pU(2T_Km_Cks%HiF8<-^-oE*UO9Iri4+VaaD_SSFseu%#~7 zIu+$Re=phHLRp>dJYP(~f8N)x~NK-S->L65F=20huUaIC?W=B4XQC{+Y3o z*vqm%-UaW5&eZWedZ+KvWhT?syWutP-HDfV^F4YY{L$hC&)R2t;s7gjHR3CR-FJlW zou332cALWYON{A-UJ)Z28k7TGrl$UH!asoLHG&!74~o|%4>7vJ;k|EJyif40%R=d*9SdEL8MPsg&AgBYUSGlv@; zdp?A>wZBl4yylhG%oLO38)6Kwo)YER13W8)7cjBrgfGcVF*>Hy!T+<~d^|!ud}#J2 z>(@3lhL zGUaU@zk`}t$LV0xbsWIk4uwv;1)ii&)sQ#vTiM9(0V9l#j6TGy;!I0(KjO_vAK*U^ z!hf1mO^#RS18X#~t{?GYcsB4-YTMI&?6#+G23iN_7=OGEGL*3hV=QD}lm5>BkFoeQ zxSa;EX&Y3s?x!nB>|1Ayu9r(Ezx zp;vP{mp)bVM&;qw*U`0n$va>1&Tqh=)BFx&yoT$7h$+*#IT$|Y%?Vmr6?%#T!76b8 zeSEEuvw4B3H$|qFayKz%W>;XM)P0#bD}~PCA?8$3cE`Ngu0ZSS7X@%v&|i4ljcfDd}Ey>ezx=Bu23og!@+ z{g=MIuE60=s_i8Gka5y8PKUkY)R}znD~wgpDVL^iUJPvr?Hpu$@ik36&T~5-8LLvI zl}ULr26Cpag1&|kgR@2-7C-!lKzH8ug5sL?TZdW?Lc{W2kkU?>G-GrB@Bh6IAMN?6 z4+qIt$cOj}?mh@Ue#U>9^H*pGfdtwPQeS=79dqgfj;zk$?n?dXU32s~WvlPTt}pjj zs&{tHse86;^?H6A`P3Q47!Qsy8+G{CnuClc9aCLK85h8H-#Cih;L{FcDdVW9GfLXg z6(4@EU)u2sv?*Hw~?zd>^*Tw^#plTJ&+UXC|aSWZOgB z(mt#;c-T2dN+;O*a>r~4y22*(hp&+)Iz5>a1N}Z4#(75cf}%e&G4EY@|5<1wG&93C zlr>_?G}(@MbfFcQ=p?=&HjC_mtmO(b_tJ_U>+Jhlck!nb+U*353oU#0Vvmk12Hed6 zcSZLVn;Gp8ebRjDk~X^A$33=-sK2qem;0PbFg*Ns`hfVel!J^@F`P9mewp*YHffKn zd1=er|D`PzwB^5z&l<`XyKXl6xZ_}($j|lA_BSt}6Jj2~t3)$(n9)c2baOI?vFICf zs5h3m@TLD}`QlG2V=u8B6zfpq!~S$E2Kr3lJ7d0PLvMR}K02|jD@|@$r4X!G18*WY zDltO^L!TrKdq}w=_Fw;C;*oXM?b%71oCzq=skV?H)i$b&Zci?KScXnf&VY6tXAeER z|Kon!K%a$o$f8cce@|Rdbhgq@#=ko}Y%yhJsLyIDxZlyo6 z&-wcEFntl*yKl~AKb1Z7KIXHUc6;_!#+0?7^U*nD_%i2Yk1@aKEw5LDcW22f^<>iL zG0>b79RGy0lgv$j#=DXEc#7wu<1RlSb_D$NiE)4}s`=XXlBnrg@U&XZurv$4WFY+h zZ|H|h>)u?7{3U%V_E%?$y?uJOL!ZLv({P^4So-?Zk3M}!S}ndbrT=B0mVSv2U)mZ< zTT8*{LA2|QUCQR$YkfNTSZoPD>K5@Am9@#5E%xQhLO)^l?#cB};Ws2>fc^doV`?U^ zF4Jz)dF&b$V%K++rn3rd-OSFyT&_5pHa3C zY17N3mu=&`pLfpNXa1I002*gQb!ArCd-4$Hu+YEx;{FLA>WO>&2RD5^25%uWft*>f znevyIl_MU0XFB{&^W&=05~nW^XRMY>Ocv^2@kFQn zHE|Q#TAuiWn}@2It=>Kp=ht>=yQ;he2L6+^b#a7hvs1RtJ`^3RKmJ>O<-#k2&lTqj zROJ!o=pyHG(X~`m=dQ7BgmxQEA9gFy1vM2ye>q()bFur))kYdSbxrQbsL2@TaCJJ&QE);Zv3YLfZb!G|E$ zg@L`#z*D z?iO%VK{MCknXcoT_sSfVc!_qk(Vm;U>p5Q*QLe)tJh8h6>jI(KOyrXQ($1ql7kg_1 zI(CUYe_@2@olmhZ3C>5P!ZVY&CL?E!^3vi>ePH}s;LC5ozYK|; z&Kfzyx}QZGlJud?h3F-GW9+jj_-H_QV;^?6&-ARRhoGC2`S!~7?>&^CtPeCCh}CA- z>b2ZKjqnrDmEfn)pkSx0gT?dVL7?vp=zKEsCw;oGW>T52PcjA)_v{jSx@ykqkfu|$zdSR@|H-Hfy`ibn z|LLe&EviZ8-x~Nr)P?FSo5a_&6JPSeIMyonnBEVrZs&PJU6zg542j5Ts|thd>#l6a z9)@m*{bp(M!jI56geb=V%HNP{LXlsVPM^mp8*|s_QE;}RjX2+!1pt(0lzpr2L+=CQRZ0YGeu{1JfO?5J)EiKpI*+{B;IM@ zoz(fnX(UgHf2?gN`J@f)IXXw<8dW)saccX{k-G4cbH{*_`;GA}jMo}s9kP$j-(+>Hx@lv7 z%<7pE*Y5;=iQuK^B@WurZ^M^MyAEueZ!=C%iPDyblZQK=W4g@xzQow`+IEeT$sOsW`H6xFbD&gz-z#un|`DYZ&g1uV|&N ziTp1uOmJ+RrqcgJ{{8VIja|vNE}T2&m%Tbi@K)~HdyMiQpuSnZdnkYA-z*z$a-ODF zj5d2cey1&#;YR%cn{f*?+G0sC?&Nz(Ptk4k%Dqh7;HT+F561RL+!Rk6@rk}ZVYspR z-IA!+)~Jz>aR0C9Ch<|K_)AuTqo1obs8x9VaC;?sXW^hSZ(V*UPufA=Fw-^vR-dd|1I|V9lWEnSRBphi>JfiWp_=9^NX8O88K)|<&&H% z8FcTH4|db*bEn<6>%mD+ghU^W>>OQtu~D-M?0EsB-^IJM@?d%xW+nmf^E`oEk~sb-DWd)CDf_x@FuMHzb2_;IrLqlu1A@( zuMWwXVqIN_d32%la}WRbp0n8Yrc9~a`)E+*f9^fs68r60 z{KsYQ{;<&EsD_4xrkvS zmX(a?QG?L27FOZ=s#= zccgtuLD)0E_RSw<+4SpG;sIxt?ZaDvi8pDlv`>L$eSe7!i*J#6MekG3``3v(dqf>k0{$X!v$DlfcLC!oZ7(FIo#3(5X(6`Sc8&~<7OzxOuE>{ySPG5HO34d+{AAUA&sk9E%`Wpg1noMRuV zO^&fiUB{FC+Kx~3YkQ3GlDQnl9NIeYs!7aEDKsVR6&bt`es7KNC)6o8hi=|I?uGPY z7j??M-3z*@(E`hlqg$S()0N)_V`l4z?(D1U)nuvW?&jVq5uf|`K=P%zaV#L{6TvaY zTyRXV(8(H+b^SthZ#O=>7#lP3Cq%abMi!sXK`y~2=EN7FfxWXiHZ<y?)jpw>EwcwzihcG`v&A8LYvK2PgTJ}RWWqaMV}4h9*Q1&7k$vt6YvfZf zzqW&KNj3L0#qvB*ZK>JzPGI81q?u=@B;IrOunICHkC<^bUvXGcZK@GostdIAE@fW* zZJ<^5kiiW@-TH?8r1|!lCG>5|ao0$hk0%+gq>a7dgOC%BmwcYlp{R%1;)OSzOVQVe!skXjxle5uAI5pg^3B#K)$svd2B$Ee=GS40@N_6 zr|^AO`bgST2%TmbQsSO_S=;mL&An}pX4v0w(3kPYO^)^9+}i~Xex0G-7#rf(_91QC z$FqmvYyO7L?;PuO%41V1GvE#Vf>YKV><^z#+WJT}@;UNV4_{!@z`T!RERIsa8t6#m z->)`V9KwIKupZoXSr@qdCr6X-A#kk#x|e+Yvyq?3rz4;6Q$=GI*bJ1nCD!8DEo&Am zlYGCInUc@fmOcCz z{1km9_~72>TbSz%WI7dPU*~iZ3lw^heOWLFeME6<{ZRM(r7$mY7PM3Hl*$s>``&Y< z+o((K6pv&~zozV);NmrK(p7D-xxmMpVB<}&QG7YRWi1J|{pLm2F~Jf$ID$NKeSVbv zmU_{ZF8YW~4-pRoT$A|4zWvBaz8S<;W=@JPj0kKWqpQm-bR8?(Ww*r@1|}YS z&TgwO2uytM8N2O0zIQX;^LJSsPj~Q(sgiwpgG=`B;w*erGEZ9_r#Kr^BzcD|u)V~3 zS_4gGw%5A#Rb99@PxzAGu{OTp*k7uc5ad=k%{JQuqD zV%!2-r^|uXzfhjpRU0%B%#*q7NLyycd>eTO)1JS8$0xz#FS6`57yOgZe@EI+3MY2p zJAu~w$otjOHMVELP8o{}-*G<+`LCV5Y9}!nKEl_dw}rcmd1rvezLKTo59JP$7x+I^pJS`Q_BAXp z2RU0^Z{QvDp>sBW{;s`dF17cKmM*3yS{4o=GRk6h_*{*NmmmiOw}7stzcf{RC-!= zIA-fZo2uJg>HT7|q1(Wwthewhm@vUHL+{_Dakk_@*lfo+`fvl?$&E(?tvBIyzxg0A zv0ct@ruwy+C$kTw#@IH|_nEW&+J4*WdfUNVJG!EGQ_tb%xnozVK49nTO24xn9*=uo zn+}k-6kjLNr}sTR)ZwHIpKl{LUQ-7z8M^q%n&RNnR=xfCnw%#Nw)UFhsJT79v^7(U zIgrJfS7U_5DDukd_H5hh=x|NgHJcb;v1z`jk2!GAKB4W-Vnzsp;XS!5&S8$N~@QS6aK#=e5w1+-)K_o$Vd}OmM!2^H4JW z4>NwQ2eduHFNiEEGW5pODV4d*y%TS)WO?Q4s#ZStiEe)Kfw7yi-#qesVImtAD6!ou`X( z(=+8mzX|80fF~vpvk1Zo0wwF7^a`pxQ2) zLgO0I3yV&93jCnx^gHegPTD(wb~dmt2#sB!?H5h6c*kD(3+SygW&6hbFy)I)>Ph78 zoydB@1%X!K4+fI948Ew~V~gzuw0PTFN5_5$A0I|N9dTFaS!5m2180CiGLH>lyWTwy z`X(nj_)hezlY1UJH5Kwa8Jr*g&Ej3{r{x}}O*QfEISgs4W6r|Wrd?<6RJAT)j+&Y4 zB+byIkuE%!@LFrJ%eB(KWbc098~^6-|Giyb(k>bMHGJ>$%d|?la%L#EXKCy5|NZ5e zS>EU0lD1VZzOd|RZd!?Ks^gBBYp%U+J#vP=OOwX^df!ri9rJaQ`o(6UVRMi<*u+QX z`P6^Zf0Xi1qTg=eJ&_+pKM+a#YdL#<>yM9FuTp+z_ZW3oVb)^z*KDr^Y4atro>O`InU$8M0xoeyWH==NwT z{FLyp?K7)iHHVh`RqPmwGaB;kvmLv?Ifo?crG4i6?ik||Q@S&8w_~UWJ$thqzoRVb zPvV?T19iq=3(TUP4DbDXa?bo5ehYoMvtT(k&~shE!~oS+wIpU#`%I6GTk7mfe0w=h zdycv;5Tm=6IFS;g;v)7vxq~$t+>KXu8_r!eDd#`S$RL(>96VFTT6JCSKAmAM+E<9r z!IdJimekcUN=JX^96<9A4Tg?>|0#|GomwR^A{+K_Pn6)6JTkwLm@!Z$?=m zJxZCI=id63eeK(?@c+cNwV`WJnuD{=oB1%`r#JFx>=&?{b0ep>@fo?WdK~A)PZMM8 zbg%Q;%tsejk6X#_yEa8SR`Y%Taqd?f61cqQvg&agI9GmLAB7J}=lBWw$Wxq|Sw1SW zdfc_7;N`!6qk8H*RWN2r8*L8oF5Ta2$puoihL z$)>J<_VjHgP zf{jz+8*+AJP}iU5t(#BYF61TV;Ywmn77+LFGWy*?;Xlt?m_y!f&zr?6nTlAxYDQ`O(7B1L8hPQE6gCD zk$m_Ct;BX)fZy_y@R);Qf1cMokGwJD?ML3e z>16@xhmbY{Z87I?f*<`+5UZ6^OAF8uWtV#t#$j&v}@bj(ynj6 zmGVr$;ViP!QzNxYtSGV$BI#ZQmT3y#>BHZ5Xv z+EWo*(@sZhPa6?AEv+bWR@(9?L)u$+_fJcE(42SX<)e9ni7)x(zg)*&;QNMt;er3Q zmV~F3{fi4|9njqY^|`S zojaaIuesZ*+e3_(if8$>4{(k{7^(n&Dgn{pIOcF#cQwis;=#lI%uNQdp#?ilf}PR!b;{(% zURxY^m<=8#g?R9=A9(1?>nil*Ev24C;9(qim<=A90z7y)06g^NE%26W2d{I%!#MCT z8$3+v=E1{(;Gr*Xi8pUu6tPvo!#MCT8$3+v@e>~U@>Y5C7UEaMzGjO953|9;q$m#_ z4h9c>d279S&G=H~froM6VK#W!0v-+l4}JMuzWR}OSAd6c;Gvv5Op5W~;c)QKmp5aR zXABBC&$b#oM4{x!1`m@sCnk6p3m*FN7I?=??j_Fw597eYZ16BC-h+pIz(Zf&DsNsV zXB8KKhjHLxHh7pc*n@`_=-Zb!$(uKm{fhNvivtg{!Na8C9z5&|9{Tdudh;swtA*fU z9C(-w9wu2mcsL$B{4wul@BFe~Z2%ABz{70tFloF856$4AFR#g4uATiV4m{-E1V<)# z7}q%{?M2qmvnuS=V0~E88eLe?v`#^3f{(JEH-m@xE>^&ExYwhs#g$;FtU+0SeHT@a z3uIkhy1ITBJ_I#8;5QPsHl$5oRXr|)?_h8sKD&BcC)VV0*5os+Nx{_>OWzucK@D8J zmgeHl6X!F6tJl(QY`>URx4kj#t0k>tFKoXIo;Ib`Z*NX(*nTDL-1e(!-K?%WKkJP= zWv$Eew_eB#vtG~Bto3<%YeSySdM@wA)BW=1L~Tj)15?dW8`BmV67|CUeiv_y|TPxu43g5l={ z2YftI(7Uem9C%5IC+x%K0-e6uDf?B2I^F98o=D1i0ePuSAIx15y7DG?Y{8es$GmYY zu`B)a6fv{;o5z$H@$ zKFvqt?lA-#&73n>-T{|PUOsIwe3~zBt+!k`N0`?EmrPzhZAb@Pa(VM+q90k&0hca< zOG7*0lF5rTX7oYuaX;b`=P=!T+OQ6|l;q9pinJVmshcffo}>IqRC!0hdf(KCMp&T&nWn2k}%FbigH( zmrpZyz$G8n)LnL^XLi6Plb27kbikz~Z@Go|3i@y<3tSokF7?$1x%sr6DhNI;s3-$m zLI+SY1*|cHOW$p+gHNk-^JzItUm1JJ%cq$*A7sWCPWZHX__TBIX(tw68hai-?E-w- zMfkK!@M(?kX`jKTeV$mKcRKN0-l@d%d4EW}koQI6#k@0#m-4<$Y|LBn)Y!Zckvr44 z#xm`#$fwdQQO~4hN7>URL?x$9jPOglc=v_0lP?{~JFgZVINt$J26R~41wMNJ2X;8{ zB-h8E)pIuOzvL4PAf_i6U<3m~%YTgyocsHl6>`E~^xcZWb=`_~l9r(nmkF7`rUezv zRY64}moMvpH6lmiH_@C)y+6Ym)``?3cfy(3W3VeW$New59lbhrkvQ}9$Z!+Eh4GB( zOQYav^a0JMW4G-qQK8Lxd_6RSIyQ_s7dlSnznQ(qh5Tkm*B&qPOP?+5OJ?>O{9D}g z-#-cdob)XAATxgdF61&Nd+>l%WJA&qA|IJ2lRp%kB7NXw@Q3tzbnNEoq<2@>?ab?- z>7478@+EyH=@IZ9$SZ?qa^_mfrw!)0%JHo~e8XI9Y@}5qCzm+-t61p`|yWoyYz|r&H8|%r2g!?V0v5zeWe_HtJBRnW`XuE`dM@b+ln>_j&83Z`C({P=3ewTz97Jz0eg)~QUGy#K<~7RE6joHrCYm6-KTZQ+4V=$A_9Q$6(~m$_*m_z$9^^rUB^GZDI2 z@`Z;ku0j)O(8nv(QNwu#*Te9J(8@XUllw$AIzim~Hy(7KJ+w8zI_Klv zw2{fY82#v{Uca>P6IXg<5c`en56ppI5OtE@`7!C8JhV~A9Qb!)u1QytPAsD;aGw~h z=~^iBLAo8gU1WFC!T3z(CbYZAfRulN^a#?y^HSy@EQ0)`JCBpzi}4MJu!i)q+Zt&n z>u9NxbTj$EYM~EeKp^r|zX(#E0*xw`jlMV(8eRS;)J(2FLB7Gp~ z;H}U{;6Tz9S3#})E85VFr_Ibe!GdN%(Kj)ItE#N>4m@x0kU?psNVtx$i6Hz(HjgXA^$<@w}1h%2MbN~0RyT? zucv+s7$Ezt(8N$Mzy$VKBpnQpy;W!;ehq!4Jz2ED@)+q}ni%ky7dL5x<#FXm05jmp zi-(O@XW}^L8iXFRIIMbHjAtJ$?gwpXU`8J>qgCmOHg9Wj(}w6b)I#Yb3t~&>+bh%?j_{#@kbbFpe2b(y|-nO0Cx9!O6 zq95Fi4Mu1&co^|mp|8IOdi0NR!?Ab5%Wj32t%8>=+(z{_SpyP|Wng#VN`3Hp$7Gy5PjcHm_*pl8uJ4)6I>URgJ8 zoj`A7+zz~KhL@M^7yVOSm$%%~7<2+1cv+FL`_af*jg`m(B3*6h3ND}#y&~hi!SiL{c}aeK9@EPeb;9zs>c;@4Yhi zki|#Ge#tuU$k<()6?zqsvFnhr8<4TPF1a@LMh6-Ddx>$+~Hn+rCXZbs_Zqx2p-Q`umToSsi#B8~P@ zzI3raV%V3~j zs zbz9rBgZBSGtZl(wALjNLrrM%xs_mBfC+zJ{JNts$TgiV>r)=+HkBcR3E%isGMsZ&y zXT=P}D8inIEvE7Y}$&+>RC>_8J}*(Q%~n+vD5!w^{}_O%iALLozP=D^K<;LT-&pqv8v~P zozgibbN@Hz#N+E8=e#g9HdqUqo(G+oRF7tnwXbfrw;lZdSbOvMD5~t?yQ(^SAR!A0 zB(c*8$Pz>ll3 zMI;2b(cerqK%hZGSQ~+Uzo)vR46pM%pXYhsKk8Few{G3#+;h)4_uO;OVXt;LW0FgG z``Q1^=Iq*&$a&{D+bR3MrKAf?p6RKN_V?gI1a-6bS84)xwxeUSUElAvs7t;h$3>rK zEK>MaeC74P&+g2Kysd1_Ht$a zb~S$Ipz$fOA8v zzQ=j80?MKtnF?*Xmo_wDqs(50YlBU(z89%Dax|M`K5d!Jzpqh7DtU)OgYt>VZ7HMt3q|t`H&h@P9Ht|d{|Am z5}^mS`B(!MYK#24e5_FgzE;0dUu*mh#T7rhU|jr?kj?SuL%I5Jg>4R7(!VCm5~lZA z5?j-!AVLpaVy;O6Zg0)7>VZmtHNeMbk$;~6YgAQ$)vqqV8b3rOwqC)w2HM{MJQ{#U z18oen1Y3P=k$OOx?;`(^!Pcn8V5?tqur>aC3^0r1x?=M)z$?TOrLPvaR7L5%vQ$^E zf?j(3G}RUVG}jje;{t6V)_{Tji~R2hq3`C+QEeeszpfB#3Fjk%bE5U9mTEOYw*GqL z`>HFFzQ_NA|GHF{+pl2U#0ny@$xzp7kW zTq6s|Wz(N*`jbt6vZX%-k=B3-L5uuLBdt-EzE;1HeXT9n2{-3!HNFM>^90xXnkx-h zr15VW|EBS8n*3W8Z4G2R1HKAg6kv(g{p+HwQMP_ozdQO_ucjZv=|eF0_@(|e@k30m z>C7JKP3*LgCfBb^^-0n`U=e?Er zuQ8u{LvKD~zU*XgOMF!3ubT;Ry8#vFR)I3G`@+>w$bAR&qArb#9Qhp+3ieIy0Z@EJA7Se}%@q2bJ ze$Vj1v}+J`O<*r^rRG;M6Z#`(^VxfISislia|WGN@OieMdLE{p0`Yfd_%rbMSeZS@ zHdOZPYw&dz_Lr=E;d7_$i&z>rbv(MfuZZ1JjQ=q8);snUE!$Wz>6U~NU+Q?7b^c0Z zzC+j^5tBV>74h2-W8YQ-PrkJ5JYYTtm_Go#=K}A1;Qfr+yX1C!opl9*4oBKqXZ z`tw!j+s;1A*SAq-ykg4RhAeo9cCEs{nft75GxW30@cF9_($62YZ@v)OIPPeU&5^%I z*}P<~x_N0>!MF#eD8_h-O_hwJ_>&U8vC&68yO)0Vro3SEF1^5?H-XPvz^4KDG{X~g z&XtAZ>+S3RfX};zeNr5C7vk^BvTDLmlcFWf^ixu>udZ8;ol_4#?6GH(bLP&`eshnF z^`HBy@{sjD{6Go6IL-OyFMd(W1W)AsGoJA|i9fF>;>4T+RP4ypZ{{L!Q;)57M7$%)Mv1 zmt3t4FS**pVFC)1Th%Z{mK{>rnNv$noAzl}3>>~EF|-i^j?>nP`ndNUr2MvXv*?q6G7 ztCr0t|1XST&XI|(;rNJ}qdjD`Gmf7}U>DCA#Wg`6H6Y(jw{89aIIUT- zZQRE23B#AiOc<_yHSV_7)^QKc_;&nlc>!0N_XZ3!5B@6Q!T2x6-gd`Vi4UIqYVd<6 zT1P$D_nVOqJ~|}X{MT78Czs@Cfr*u73w! zXMUcsT=ISJhl~Fm{Nb{W;1748%X^lw1|FlOJ9&Kxyno$L#zRJ=$@6u=wHw?G=2W&BI@Z_%bY7vbUnTSNg7vHPG)a|I|?A zvQ%*4Tkz{e>cIvz{Dd}0*RC&U$T5)*l+LY<_6Gy7{5-f^nM$h@b1e zwc}hKzt!TSPwf7LX7||s$(d&7=t;gh7jOlLGpcS7cBgUoNzr{=&t>xBju$efy{ zEV{~zUyB*1Zq}5=;N_uXMVS?(zo6MZY=Z{mKm-24b2K#Id1AW85Th-^``=vt+s%K1 zXLER#^|n0E;<<=t;b{syP51(a4&~Tq&ufRjj8V#CF5nNNhh~4|pBCCm{JH$kgFj4a zabuqbFJzr0|Gmh6CU8jp?cm=#`L_*xQlRNM(DYpJYCmn(XrCz{*L)B7wfz0+yGt#J z=2x!LLS8L>B4!C~G}_`VbEUT}=cGJSd5nv;Tt^$G(}uA-gFl>2{v*&)U+Cy0W3Jq5 z%#|smA16JM^lo4?{}O(jLYr=*ocDqjn!in-VJ?RkOMYlqrkq2F*snYUPW&(Z%P!yM zIa>^kP8R=N_zV00)xYf9-tuji`Ir5L^xvyb{L7yFFW&^`D-mp8sM zLJz;-E_dPkMWM_{*1&~PoWtH=)@K4wP0mq3BjtT0_cq{_zMk_5qZCJv-?N@IO%uLo z2lCH7oF%#Z+y6=XZ}hgmk$KtE{`-HY{jbsfUH^-ApMTBMZteeLyMKfKKMeiNQ;Xf@ zB6})6w_918jPa}=Jm(SEZ>qB>ql_39?^nXR`YI`j*sj~EEPAhMtt=k9P#gAhj9+Qf z_G|S8tU*TmDE0XLdnX8a@>SwOeL`H)SI_&bdKupa_eChlGJdL0LCeB3#J$jz`cvp6 z7igT@Eaa>~An8fHIseFc{hl(j zDRV78>UPl<@l*H(=c9{`FWpzfy)otnm+<6I67bi~_jvR)Cv51KX#4JtG5QwHtz6pn z<_p=Y`uGu3^@6AE&BVg!sb}JUX?qB5=Zx2Amov|02m_~&a_h7a6CXn9kjd0T9b zIYGJqrA_D5vQ2(+rorFY2ygm3Z3y6>K&~LJV6I+Vy}9CZ&DId^pNo}*9tnq^;th4&vf+BxBUImzyz-Nrq1p1S8o4EkvkB14vuBmEd%2(HzJ`1JM33I` zQv4U)CF_LJzj|qp%!5YO;yr#|s*rhQK6rebdFF(y?LK_mT`p@k;pa+QxPF#rAKDmA zSsnNat6HJCCNy(ChO@%?>?tsBvYsrmSxcX?S#Kg(LVP%W;yKR%oWh=2VYAk;2U_|R zdf+JN9DA*Aa<&?{P3iKc_X$#xiC31Xf3|6UJaJFQ!!P9AXMB({Pi!RO`XCqfkvPKR z&G(kZ#lO1H6ki0s`6DOxVcn$ zv*9a4Y`u3{;3a&Y4SW>lM-JZ}e*)NBlrgfl8rnGmABoukY2Fwe*_>@GM2430I?uji z{q+oW4zk8^;4+_o62GxoZQ3o4Y(>elv)7nl_MA^HXtV0OUPWKb*{dqXb~ewVrxAY{ zkA;uazW^5+fNNj;_{C#Tu?>3C!1?TL>}`nbeEB#%1zhKx#@F&GcZvx(jAHIru28IN zo>8nh0Rzl_LoDX4;Dz99PPIjMAzyt9-U&^E)?^7DuWlcs*VFGT=u`pp={e>VeKF=) z6+TuBAKTC}`)TM1=@KWmC!fN+>-lb#@4U-=*h86J(55b6sdX>ihaaT+Fw%uKS(xW9 zvELHTyUjb#KTkuSw$Y*&&^Gi*rCOs^w}V${;FZ`YE(1n8PK?ki;ZxaM0{dcMFS@XM zc^|}kBd|RRJVib$0WOtAiWOh3sq}G5sTapS0>54Yzf|x`{ACOXNHotO|Hs=${2D8$ z9lO23l)DOl3M;*FM&cRs1k$TQ(p`4G{j+6+e*a_Qn<3qm%lm!a=R%%m@|@Zhb zCi<8IA90yXwTrxP7yIfc(m#eiZxNaXA6Y=mOk}u7e8{W{AjaUQ=e1QE82eQrLXZ0y zyrlh7}aVa^Yl$B5ydY00pZB}B`KtCz3nteAnxGcU({)Eqm ztN32fZq)~X(+A1VS<7T%4`dR1V17ct_Lwu!8kraEX2rGL)XRb2|7f8z=g2F#|K=h8 z)aNLx3Y;%EylMV(&|VYk06C9Zm%Jd@bWl2+9*TK0EZp3@TaCEu%MzLfVWGHD}pY$yDo2VT|eRXj}z` zw8}QsRmomQWvQ=2g}x$RM*EOYV$~HuSI)9uI`btDJ#WOOM9Nt1r7Q66-=QlWId679 zp)16lhOX~A>7gs9y>#VUc)%Fw%E4dhN?$`pJ#5gB=vwzBbj9gS`;D%6%6yM9g|4jr z9lBEBl~J!?%+~Q;WU?N*QvY9Mvh=gR(G?5!5j}L}>^QYdXlWxf0iC|<#IJP4BX0{` zSu1UUt~8S;40^DaJc;lmLtggMm2+mT>|4Ia(H0b?U5yzQ{S<9+Lsu?9S2jRbieqP( zbCD0@X-lU;S4>U?zC3z7dL8J-f5zS0@!IacX_5DX7i0F0(2rbXUJ1>>&U@Il5x?SG zA?L}Dftx)s=^Dt>M$Du}FQ18gl=YsM$Ao#G3&Hyko`t^rbg?pE7&zhY#fdfpC;V&w z{WlLzSg@-yWLNm{7?J!tF4^%EcZg@$KN&*uL(LUJ`56|vq@e$8%!DX z(D28(OP!~Lo>Ts%bM8LIMuBFDow@XX&}pTN*bC7QQ%`jF2;B`_v$>=#duhvf>KM;E zYsFFv^S_0;E@fg%9L>H+>2l<9(px zcRKGojR3X_p~WKG7eJ4N4l4ml zDrI#wdg*b0))56TyH@UP40=3d&c%`1=Pf-BO7D#qZ_wQa$RTBL`zN7WWy zuaZ) zQJ(m{hq~ea`1+o;9Xn^S*Fx6miQn7KxBnKu_j|rAC?Xz|7U4`lj(kt*geJc}iWq0m z^ISD**Ix2$?dXfI9VPNiqG@m24AIRf_4`O~qdiBB_IUK;$7oMAHd;I68}0eYXitdI zo}Y;)+|IWT`PK#PRQ&A36UJ{kZ9NWchDPe|@vT9Nc5dVBoS{#`*5_@~3>+!4>f(EC z_Xgn!arzJIHL-RbNA9&w)=Zn4#!vuECdNk@;-?vhhRzS``0& z{`UB58|bUbK0-NVwGqqhN%FK4*RG9td+wLew`@1LB<`N@A9qMEM?ws~Wy#w}o&Tmz z^-HzvMr^K%52$7Ly{(qrzf~>!^A5Fa^v7!1oWB##`!ls{$u70bpcUwA-sT^%kAlWF zH-fjmFM4=v4tAx?rRGlNqUZ+Ell&@oEeB^_K{vSE8#8`+l*nDgtU~UZ3p_+Oc+yKd zWKAu!!w1@1#Ci@NVFvAx7%YZva4_+UC|`6HZG$~A0s>jjS&a3Zr_5=TDYWAVZJ7*z z-o^ON@UG|DymD7VoK|+mOE;j`%>~envtC)peHq=@k34$Jn6tf|?Z^^mJ#?e_C)Vxz zpc_4XwSZH{(IsMcI_3BU(<*fODf2>q>+2}mC3N!gzJ}6Qe9(OwkAD-M0p|B0Urvm@$6Sqkxso;mNTd{0JFw-0-JUz~1nE^sNJ%PrKrWPa@UXjvfOUHETcfU?skW-1sxHArsDI{6AKd z63#z416VVOym|;5C+5QO0^lNkdaw(sJwUlZQOGUOiUX8&FY6PDCF7obB|e8d_DB24 zE53{*uY7Aa`PFLhi0`_UGWkc+_ON5w|qBoR?X5LsSo~t z_21)1N!HM(s9*MhBI#o#>sSkX82d`8}Dj1n=?T zTf0AAG4u?(`)XwiY4d(`?e}>5TsddpwZHA-c-HTolrQa;|D?~z=q>B%xBMsRQilBh zd;gxM|DqSE!p6G*yQ}|Q{!ZE``#(~bFZD=$@=t%@($m)ev^N4i?1jz1e%Riq{Ti=G z_;A*rZ?37t2T~5_hyFOt1E(&|$ovW?U{VR6coKNs1Dq;>lMOt&98Sf+X(r`Me;3{X zZ{@kIK+}DEJbk`&UC?OC{-!{SE@@yKX2VAXc8?hU3d{xm(Y00ZS?SyU@$Padvp&<~ zt7{?oB){~%fIN~{V4dcLbx*xz*E870w{)|8H>lU3l`30Z-cg-~Rg#crq`4oxk8^sXm*eHXB7cAW{x^Jl4SWiFFUa7nP11iAIT%%1sCPJ;NjoAaJzgC zUtXWUY!_uzgM*T{5Zt?zMqHl12Uc=-H%0GlFYb-4s*geUl@BX3Pu}Uv-jW}-KmPbX z3#d6inYlDoab5TvyII!AjrhcA-(q*Qr4_bVl&bFdD!a1-UoWCNUx>Zoe(-sD)dXu% z;x*QLXQ^Xa=O8!o&4+J=$PXf)cVzez_t;-_aoCOZuXVc>muriH4`$*M?}@8%n>0sn z2eK^RTr>Uk#44UQdh)x^C@!(Dcb`xlZEqi#)Ea@PnVZI#owc*(Pr}VSKNY zxXUNxTyJBG-53jh{bDEj*!R>j8+Es1-=Qim&p(YWQ1LHlnT@OfJ-=P{(&YW@o!Eu5 z-iXgvHpd4SjLYFWwElLnu}d(@>sR|rp5n?U4{L|bIphicK`l#A8X5Q4+5n!<)Jwnm z)rRpbX`$Q?nr^fnXbRA=nsWX4gWYl9b@r8=+#^)i;iem`?xq0ikzeeNgH4*_T=5Oo z!}~PHp&vBIkzJbOM<;2WnnU7soyQO1nWo;lvz-6&eYPZ5Ej!A1tWMy(2k%w*NtXH8 z#`v8np&#r)6tE6B{dc<&@2;LR0Vm6CuB)*<`Wc(Ehp;u1J<|Rnvpd;~21eI3U8%bl z0OR~ChOS!{QgM71&x^TCs^gtydn(-is>8jK_h-4%c;3i;S9FaJ`j$%cEp6kKtm|oO z+nxBM1J2@)?o00Nv)F$okLXh1IWbfG=9RUi5=ZqY{`KZ+y>>OIQO^63$9FvM zF8|qNcZ8hJS!*fj#a%+|HOIk2Na^BX##oljBS?d!aH%XJ$BP8L7M~|!;*Jp%T)=n{8^WL4lv>*4sIi@e|oj2DizPh*I zA3iJSdh;V(&wWt6Y%ABc@mfd+SM?wJElNMpZ_%xfD5)av?opRme_p7hwl0g9w|bpN zS0nOo*lc2`bg}1oSHDGJEg_Cq6?JkeZ9E1XTQ$GDooiOaaONy{$n{EiJ2vF6QSLVv zbJmIsj;u9rGh>|emuZWFS7M8-22EbAYLoGE>HWWV-j{1u$D}JE!MF2&hbc7acG@KU zo+!L6hv+~r z{-WShyI)=v@NJ{c=p8o4X)SW{Y0|H28l_JH#|EuaQZuk4o@I;GlZ!{|KR$#%Oy;xj z2cb_Z%UJJ+DD~k1oE=S6=H;@6kHF`F@S4Zi-#Z6R#>a8inDwAvoU*t5A@+1Q4^TLg z^*1(9(pG8bCfd2*O9Qrn=hf_KNf|4{JY^uS)~9ri(qE&Gv!7K`kJH{U$W#fY(Ry2v zqJNB?Te>M?ml1Q0_jc&mMDVz}%4&SyD{;5bef%;NUCwT03_Pb-9E~@rp@*m+_dsDEEZJx{avCZX<@LiNayWMM{S(_AB<8p9-@qOtzY(EaDDHq9q z2e49S#OjSZZLYcq^l9|J;7RsAfj2y-W!P}=g1Uy%FR|T_G~t_)HjrLwm)3qXU^Cp0nQkm)Y2lc<%fsX|nDR9+MI7ftQq5IzlU}ZRE+|yn}^t)M>MfUo_)~j~_!nDeo2F;aJAxhwGJh&wIyN@Oe4;4?&ByOk>TF zc{+Y_jiqz69@v*N1w$teJqEo_U25C%x)PW)Yl&^kEvhN$y(KwY7O1_FZdjVL<#c>- z&3jgRP3$;(&DYx1Pc1Z!c&e24OPi$}`xe7Ku2%VjQs1`HGiS~M&uHv7XW7@c48DJJ z_rXziYhvuJ4xzp4nM3#`b{@j#d%Ws5CxNrl+B7BQs`y(Sw_Kql9~=9Zp>L@nNe@Bm zI!0eH^gKN0xD#LN>BNJ($X*5Wq2LPqMUmDHPJhpt3W*anjDGG1N71tbZt`uFM#(Z|LD^9ZHteF((2Y8SDBaZCYx(`=u7Ot-3p3!=E*@trK|U zLFXSBYI9Ypmg80URkH+BejlZN+hXYYHf4;IA^*$#{E7T~pd-g~?bf6G6GmJU`LB`r z-i;6DhqZ9FS}n&dz)pCv)Lp5LKEiy?`aDf}_u*)KURNz|88E1-dj|N{ZVJ}hPT_4VwrObIm@s*JyvgE zPrLw|$?TWZvY%dO{SskE-tg)qW9^1c@_B6Eh5xI_R_o*$9FylY^1PM#^*8Qs5${{> zTWqd3xSyXa=Rqc5TQdP z#MPFxpkQ||?4n3}J^dEz14de}V0Ry2!#ZN~jN7fmT_s;gusaf8iHz-rqD<@UMtPyZ z?ta8MA?=+Ff3V(x+)$?V33kUR^F$WgvVEHM5hJZ{u(Y*uomTcV`%7~f(sNqGx)O{T+#iV(|J7&TspyqEjg9;9?nKJ7j#>Fye@x%%h+H|e@ z)cQjH5!r4Vc{(UBC-)lk9sOz(ETQ^e?^Me=N|=+Z1LBcs1@Agp1LSfJU<>CD+7{c{ zQ{${DXTas#(PF!+kUfMq_;!qTip|BIFuV1w5OvHi)Ft7ZFttJ#n=i#ew>b)Fm)GMH?jjI>tiyWIE}d*t3zfZv0;hZ#+Qyxd95U8wxW0IJ@j7 zc9V(c?VJ^K=W8|Yd{a%=7w+=&zqT{ZXy+N)*-ks>dg0OolTKhF@R}v*Q-N1g&~NaX z?txbh--KTGz)WcH7tra4B5bbt(C~w$DBC-cg1yH*2KV6@b2tr)p45fNNVb@A3|P9Q~Twe^(P+Y0M*fBr({PT z_t_^lhscF#YGmGSY#^pB<_x2WIe_TgNfS7Y1O(XSx< zT{U9zGvhhWH$#hct08&q)z8Gd#8^!?ne+wN{>ZpzK3d?ogV;6~;gf$NCS;d?{LrjB zZ>*V?eREAWa>g&T20$S zCNAQ;GbT?+o0N#WWAx<(>b)z&q)VTB`iQiab=AK95+i!mPn)nsHT9PB0@mC*fb2Ha$| z7->qdySIn#kIA^jioXeHw_mV3%tQAF&b-}PY|wa9u)D8^?hh``wEkkG#Rj|kd+7d^ z8~FbFp6(EpuE2cGpIE z|vOR2xIcqDp1B{Gq{9XYp}NLo8I zXP6K6d}@T#&br`TzCCgu@xPcu=QBd|UrZsowDsH;)m0s2uNkrq-2=FCzDeFQY6kKy zbsnV7&aHOWOnA*n=F8LUS@z=jEbFhIN33rNHCJ~ZYa+H|=&ie2@y~T5YyY+;yQ`Zz z;_(F~H0t0kbQsLXV$LyKN^6wQ+*v)eW(nUWFvnz%NY<0XSG%)bx@+1Z6Km3Y74zgj zOFSRolZbssW`SbFp}PYd_@VEI*Cts$U-0NU&ZE=WAwESI z+s;3OQ?K{PcYe;svG8cd{}8;TgE1BVmNxu89)^w{LZ5XcmUQ%7hhtS&!C0lf4cs{L zch&V1|HLbb)x(p#a-z^)_zqSOWnJvqM6!9Tn6n^GbhUkJ+lvGA z>wk2Yck?|PKhQZ(uwDS3ccXXw4xN?2F&241akmDXe-=85j%+D?Kvt+b2anGpU2Ii| z-6r~yx*TMvx(fEr$RlgmzE8O8t60PK$h!$sJTfr!w{EY@Q!OIzXp!un$JVBoYGpNy z*Ey%nH93Q`?%0f0BEJ+OxBZ09O60V=DObjKD`Q*z$7zP1LU1en#I!}@N&5gjg?z6- zXJJQAk;C-{>EH9;5z74oa^365b%reu_+QPQ-T>sfe8$T5E<78VUFdifG_4Xk*7z>x z12?!+M2;Q}e;v#9#d>UR)34BTOo{r1P|tc5xwQVCf2(D~4Y@(7t*%aleqyV0m8@$b zYflW*%6_8$J=9MeN+V`$RV8bG+P+itzg6+S%4=;e;U^Vc-*L|C482&%@q&WP6Tn4e z`pwjxSRAV-kY-1YQdoyrScfD~_x!iivajESuTD{t2b0I`m9zHqFZO<==$cE-9(`3E z`l`BZTMd0x-Hi9AFZD&YGk}jE0_sV4!@%-w^xBm+DDEL{9?FwrL?HV}PsZNjktIoIL4k5^XN_ zi|g9kuhlCDp^wy5;@&IPnMvk13oxf%dY-Zewms+oj#f;D_^B^z+Dw zookst%uy%$4ChqU)rpMY6h54n;dtN=>oRZo!z=Swb9OtCe&AfMZcp_HegCWsMw1#()Ou~2AO>H!Nu6S<@?kmH7V$peDxtFKYeJipFS+ZUmuw7S2G^Daf5p|Bp;%j+xH430>te;xnxXN|RcyjPsSkIq z$*QBZ*q3)dzWG_d$d9YJDkDm7&G5JG&NtT#Z{oSh-`X0hIa=9IXw3*DZxH`-nS!}` z@ywOc+j#iN(=+7XDyH754`Q{jkkZi9^Q~;k&4L zy6PH9e3sU1)z#|M9Qzilt}TpJ&UWJR=Buu~C8R&gwTb+%b8Yck^ewc%bt_j>Z|V)< z3Z?B_#eJ;bG?BiO>+dEOeFRsDkE8W=&GqSYp0l|gCEsGM6M>6bGa@NhuD-M*ih81{ zkIU4Lt3S{EtvBP-W-@Dq*6F^EFM!c*;IsV)%4wyHPOi1Vi@tL5{KevnX7rYNAhVoWutQ)>$`_i42 z3Vk2U{xq_Sa~r;I6=>(inQB=cbV+0`Cp;YLI#(F0{}G!Ev4K9VDDMU!pNh_;BMF*{-L9NDd=z@r&N&M^wvkfqos@es zu>ElczFln|I(-nic@VZ-pDOs+z35KHe`;4sb*wIDr~HgE`_}HJ%tp@UmQiMz&^T|I ztgBiC_Fc^Vi_HCY=KlWT-ntu{KET}X`lVk@`#x4E;J3R;u28ExqmR`Mey#_HOTpm- zdlc8jefVYimg@(T?e*RG<24?R(bvWnvSkr|f+qQ6q{)SJkE}0bM zUvenSuOx7u%~7ca=2fxZu>af2m{auqiPP@nD}hCQTdeMZ1LtA9aCjFutOE|!UO4mx z4oT#_OO3k(ZZWm_{|mSY|6Fg6(@(&kPW%e%nA-XBPnwdvfI8NuDfPMDIy&j66Bz`& zZ(#uxIXHBZYkcq|S5DB*^#Nb_SA4v9_St*cN2q2UGDg-VTC_8#0vUw&8swTWzMi$q z5%SyrVC+}w$z4~%+GL<%NOYEn2pr?`b%&>diHsm7yM=sKK!m{UgqGZ?jv-OP43oJSF)$Wo@HJkaqhPoI>_kSCy^J}$4+WY zR8vHT`~(@Ym36)k@>$li3$)N+bcKd4@*Q-MqMux#^@*Yt;i1)smkuUi+f@et^&RujhIrw3I z^&WTmF`j$&LaN&FZ4Ir*KeuZ-`hCe`1r}G&jQv%w$-1x9HX~l&NSj2aY$Psk70-7_ zUs)f%atImcO?UF^!V~R-^y;A^OY_(blMz#FNwW{ zd2+nslXoZkw)$-y?4&YEQ; z>jc>kvFCd9z3jWx^+wP7COYLeF40FF@#>@IAft#r>Y4HW#(qM=cz4!G;Qku;9EffO z8^*dTXIS;E=+@KJ=)7wDW7ZpZ9a(!Puw$>WE(+bctg(+_cT)>K&k0nVt(+wQe6u)cZX3Zd@aIP0s35BI!#{f*P|PcLU7XLYN)fBUD5e=HZ=$r4-kqq_vwW@kHbM5_PD9QKxrqqH*R zygT^?@|-dS8v30>@aNpym`C)p;udUaa+EQGdneK5qSLSYe1M;x-usT4M%ES4=&$!f zOAoQOXq%zw)y&b;hn2Dv=&Y<+ItB#j)zH_yGu`EK7d>wq`FHa!XLO|RqSHMwJ^wZawx?c-I91?_Jz8*e_7Py$wYsJvSj#e`E?a z!zJJrV-}CCg6Pn?kQJdR`aAUDG-dacE9+#k6s53H@5nzUcpur-#Q2 z&R;{{t}BXT9g9r@a-qlwPS&sG0q zJ?UaM-;+L)dSW#8FQ`Y_e;Qln!_@QRCH16IPr*P>Kc)`+tsfW3e~!AMsOJFn9HkyJ z-?z=QS)Fe12>Dg^jTi~m;h#?O{vlDRuR`vOr>^z{CF@=C$haheZw(r;yOee7 z+loWryX(#?mHH-Nk^@XmK`%})&(${e?trJPDNamPUB%BTWhaY6!Dq3%j;tNl z0lk1G^u$Q*fF8)aKE}C|=lU!4yQ#B*I>iU?H`IAGu-KE(PtH0YZ&#mN-)8Egw*ia4 z00WT&K7~KW)Nn4@q|96W46(BPl_};zV&Cq|aQG~C5H&*n;w{^bS*V)E69N$zK6Si7OZmv?2@!v5;^kO@Z zg9anlx9=EQav(r0c?vl{Bh0rX=V6iUITwvRQeVm%J@nm*d84GPFlQBU1CCMFu}CHP zvq~lTkDJU7*1Jletb>IJNWp#opv1x3or3A`skNe$oWPy zWepzxQANAaM|=R_bL0SJUD*deBb0Shv@%8XemRttLLaw$GPLC7pokKUvTp6;Q}U)! zR*2EZP|6w=_*TV@Mjr!=vMy5AvO*>Ka5a65Ri>ctD{ZGN>El!Mu{a>8SHSD zYrv~-o*j5aP}cUSEfu#K?dt8Ux?aipnX+yV#;+A+O^NsPaTR3^qO5=KxTa)hfVm_P zcqN4Smn0cw1?8#uk?^Ig0fSzt$T7-d4NnZ3N0N~fu!}!Infn5ia`wvoI6?B`H#->O4Z3 zpD$99&#?v+{2Pw!C39-`ONO0c=@#}}hoS$2zGTL5_hDY-)%J3H!P=^a_Q*N&9@=yF z|G3{3x+CXkPcXmyv6sDrD<9my*r(Jpe>>do%G`}cJ`fsfhfa*;8GUkdHSh1=;l&d8U)+v?(y@0PSy3qVjqr!=v^=qfF_{ zPwyGF;B;dj*_Ziwa1Y;3$lUcac+tsU;Mef8i~H5Gi@W%?PrjLrZ%2Rd@bWW!JG_%` z>?g%5fyTE}>?Kw6Ul-p_|H|K@oXRqH){pSFcId%jzKK2|;}OnTpT@`ehB*ECTzC0% zoN0S5R7n+HHwyULNWXfuR`$_J)&ca%N}mpJznS|*Zy$x83VlidRzjCV<`G&|N_qbT zUXhIPMd<0*~A7|rW*6ECI6l>3)Dd*3W=kw|_nNP7#i)~rnmCaAYG$=uN zZ&W=MQ%@PU;2-c!@$}>>M_nkr!r>4oMEHP9X zSnm$km8@dc2(1|w^BCG$JVQxcoqnUWfxXzAk=WyoN+*AUIgsZD>OICf=NZ-zY51bN zll)(fP{uT{9xmj268jMe*k?Gg0nWn)_!M*YgHOhkq%Tz~W|H?GAu%O?T(Ya8EF`Yv zi$P86i#5&q^vw!5*RS>;Pitj$zuci^_CEjE@zM1(RKa)E=ZOBX$F^Ql}Jb%jBmIU^i;NdCAEaAeJkIghWo+nN0 z)QY&5W9N2yW`;x7P^Y6SV|r+GGyE+QIY#s^r(cM($~vd;@kh>rM@jF3!vn74Y$x$U zbJ?Gj`IKSM29s0h^mDZRh=C75PNB80@Qy8UX+LPc(t3mIwVUYAG$qxSv|4CU7P`MO z*Twp6)Hw{E%DzE!PJ*V}bFR>z2X7`BaPe~rt(CGy4wz@Ho2HDp2tJFQ%NcO|EOPj% z#lbb$XO(`+zFRzNR_uFAEu6XU&%SIjy8D(g*2+b9oMoS?c_nRVWUVIWBXW)T5m)

    ROzfe=)n-g(9xj%-+s~N02a1`y%uiwmm0kLe)b|hmLzhrG8GHDz=tD7ZYee5V zqtK+!w5YoDOYCFbl(ozyWp+@e$N)z>DHEGO^j6J<)n?{ubgkI#yh^#!HnBw!+no)( zucquTDQ_FHw$veQ*@z5Yep%T+Q?~4JeofgTcXTuF#SZ<~eeLOV*w-om>SlcSexaf0puY8~;|;nq@&vLEdE~p!_qH7LuNmwm(WkSERaeIicGsBI3hfjb zGOqTjHqY9s2lnUbOChrV2If7sAXfxFLbrT#2QlMJzzVQv3UZ0OZ5l8t!ckuPb_D-JK4!T(h+FsXvz>hYb|A; zZo1VPr6|_h_|~Ar~6F-CQB(xyv|rdjc68I~H)*vtD0*Kqd7h`; zbv`#;(2kY;CAbwA2J*d(e~N&BZIOUX?r{T zu1Zr%(s(}+k$&MF&iU=1dgG!kbH<#X5Uwn`$QT;Dfpfo4!yBI7<3C1d|7Q451+*WV zo787#Ot!k=5wb2VIww3L(R>wtn1vV2W!zSvS2{?(CyH*fR`RdpE8d<#z5(W5k`H|; za!XbzIwpLhrM|RbinSFUCHbCsY6AHNnvW8TtpOeCF?d-4dL`_HQde%zvbre`x|Ov& zb0Yb!G~ds21A5iDQ?dC*pEPEwlDewnPHQ~vYeZ&ifLDDB&yYO~BOm#nB;QbI-*WOv z-x{fRMa(418)Uwp=QHHL1zg3)&oy@JT<+v~3;XKF(IxcA9-$@Jh<77HkoN)RgTZ&n zyAHnF_XZ_32LAj#{5cxFlZ}rxGi4aE=M&qSzja`nPo8q}gqb~ z{*xyhhSnuOw`Y-l0J`|`*Y5fx=)Ju#!JsvpyWHiQX1N!$~`GX~#s` zF@Q2pqCd;E#8a-E8HlTO-|a3xL0Jzlc2ZV>QI?!HjH~_bva;HxPtf2|lqGNz{&(O+*Z>2LUU7CvR@;|11#P{!OrkNs~+b)Xj40ibNF6|&ZhWZt`8~h{I;2(#C zf6&(;+IRTZaq`IQU5pd@Cf&q03viJBsW~3L_7N~RFvjkB#RvN`_&4Veu`Y$}guMK(qPP=Oybn4Wv zZR%^Z*GZdXZ2sN;pJUdefBcU0%lT_|$#48Mi?&@VhxG8*&!s&0Yh7~>fAzqphre!@ z@1uopMmZaaIeL05I1Ft5L3*OhD`e_iVtS2ZUjKlf1d)XU-5F~|9!|o}zefKHII< z5P#4$EsV5y<+x4K1}LsHPfb(7R|YN(qg6jv69!XX8Hos zBlsVi`s^DduYb+-64FBXANrU*Rq_SaOy5XaF#k(hw&V+{nf`ah@gjS|*?E$uSIzW& ziX(=#s*|~}1YUR5&<`q}-ehtm3Lk;C=CZ$zkLKt*p)qH;pEiXh&EPI_F#ExE3HB@W zdOxkKYLmPE9nKGr<-fzMOViYtytyUrECM@+O~|*cCB{~5NKG$C5^(O2bvH7@+^6sx zM!m05?`i0!=t~DvW_wPoUP+na^T`(f+Zm!5&Q;0W>*r(a5!Mp_=y-2*XW*@I#z?+} zkw;OUXvq(<9e;dH0eYvH+JU6Wd8Dd1rM{CqqO(r`*HeA9GS>gjT;Tg@qRnxbvvv9S zWj_pDKlZaZ4#X(QbJDNeC1)gWB&}Kr2sYxSqJx=yLfM<91UrZD{6BMY-`{-r$;{OO zug?Dx-d}0zowp4>)RJOzJp0*`nIk5@IzL+r&BLybxg3R^XRsdX?aRHuY@p0bSc|AhCQ$ju$SGHdpbzk6GpZkvHDWnvG3x~hTE*PTik zvT$;9t8d>WDkOT^8f#C58|$E|2dEM)BZx}?00SS z4H|O1N&1E@Be48MXa+QKuY7~{9m^JQ7>^PvPTJz~f)_Lyr(cIarx@E9ZrT z-}fSK9{EH+bQhQChf2Wh3H&3xCb!YU>$-mu+qB=-XW#Pg3HWdh@cIIH8*8j0ldP{w zWqnl)&;7$>&$!B%w!H|A0wzME*3$k?=G_@-Kl_KPA9iO+-EQ^@mIyg|9r=k;9D=U&v|&p%H7Vef9l1n4g;sX-hV#u{&Nj* zI!8Zb9^8iSM8T<-**lXtA?HQ9C@Ws-zn^nS{1eaK>Ow0qa4 z-}9WY5nC1b`=$J*n=!F7CRZ~iB0H>LP0JdztBm=&y-L#yHhAQcPwwVFnKP6zdW+%b ze#|ew@zwQwsg@Jm9_-) zzwo}}U%Ja5qL1bDv4lR3;r=A|N4c-$E__*RhsH=bJYO+MEqjtNlzDTJd2=c+xJGn= zjqJmnlDR|KCtE%CwZ=IdudX2l`Rz?$wo~8*?g}motTwO)d-+m$an_)RE_F~&BV&9i z4n0a+9#%F=|U7oKaP5Qz)K<7>HVb2aCouiXaC7uc@DkDuU<&~>3jMVylp z+TLKouT__Fypi>a;Mx}QN&Y}^P4<$d&d0rV{*gKw)Hr7!_~6!r7uO%x;!2X2)m4Zb zG#pwg=T8--Ur9JTI6eR!1olbcec-KLz8)V*+Ih7mdi2;|6&tgr0+?Wv6 zzhvVN?(#o^M_YmEG4uoNC(<1o;fclY#5Cf9$$t6K!5NM+_+c{qu#)o|cGAuc%P`K| zoba!Vk#V}oJ5H7G$EiEr$u9WculliB!8O-XugIY6@7A>?THsZ2wGY35%(>VrbLQJ! zRUJy%9NO}U)#eb~5c?r1{}8yhYPhlg+of8>zsCnPn&npZ#C`$ zZ7MNk1}lTiZrXh)P6-Qqdu2@0QZ^j?6vtf3vYq!&75^yG2Duv1RjEp-uC&=*i8k@M z=Q+DJ02wwH-sjV*Mv70MOY<8sJ@6+u6@P-;A9^iQT{w|=bZQOf!n?{g#OkNGi=U@& zDEphl-uld-Z81MbD;I9Z_ws@zwzaa?yeCTeP|l540h=3Wm*TICc>h}=$y!Ckc z`OZMw+;-JIxBG{LtMBl|uf=x>S5M;F8)mZ(=H7=ZS{v}v_1aAHyg#Xq@%Ti4`>R1A zXM+Zs*NR^XP8|hb;VNWXQU2Muoih{m5lLv8m?2H71%Tgef1^4S3vq5A&vO zz#{V#UyL`mOu6}NPoJLXt9lTGew}6n)9-==iTA{_0tG%IsA5KXRE0-w>H5Y1??+W>@vWjEr zVWM{qMA}|x$y%_f+n584p{yOYQeRon_VqrDU0djc8gORU4$f|1TeC*iA9iF7iKTN0 z9~nZQgx3_&zKA#_T=KLHQ1Mym$=6Dr6BjO}2c9p2t0(v~#@}Qz?2{!P)ChU+ly_|X(iGP)d2jMD z&gZNA*OsBU<^*6Hm1x3tD6poDwPyQRe1$W2^O?7e$i8hEVk=nCB095(jm&qGQoo-w zl9kY@&G4;H9>k7xs@*Z@Dy9AlixReTK5J<1yXSk(S-u&jOleR;@+QNJn*VBZ>`{9K zHz=Wb-FMm@Vd2UYd&`u^Pj0P@sU_B*z@qI2o2$39GYval?x*swXrTG_9< zj{T|**61@>pI@IJQ&Et=y~1=pW8btZrllUnhd>}c1maDBN7|8LkKT?Q^$?~0r^=^W z-Xvb!Tt)oPggA$yx85^IGtRVi;D5R6f+?U0zco_7%;|;9>2;djnt~s8?1<`$7C&k& z3RhA^zU`brOhNAE#_{@r?s#~iXC(3laT(A%7+3dfhtXs#@L**wBk$l0I`TnTsfTU3Pan3Z8ls`M)m ze>OvTZe0>FuQxs!*h8ud=3G$x^nQ!NIXgIcZ-~RDsn}_XOG$-2V$H!$z>(kJm_^Z!uy-r-SJ zS>XSDXC|Z!q$7~vq|k#1f)Ga0%p_oof{?ftT$9ixpnx?BB%vuHnio)9*d+lhOl*<0 z&ALbuL{MA_!FAWNl0pwPpfCu@?{nUn!7+=w`~5!Oe}3~k^SterbMHO(w0rKkVb)9| zj*T^C39v{zKcp`%8++HB4@{0Zd9x#oKkw%}J&xFBZcTos+U{m%>HrbL}h?Rn>2 z1rn?0HPtS&RfXhd0CVVdDq7>*5-ESPNfo5Ao*POZ)X|qg)K_+y8hrRcY#z|HJoJg~&3EewRzo5%j$bPYz^jRITjS~Jcc8&%P zGyr!u_J_t00QL8)%Bml(^N~HcRzFVRp#hK zW!bSApM_9(&^Fp7e#{NT&_3up&*WG0voToaWX)ODPP?#YF)aaEqXC;bYxn4{HI7ER zK5r?p&Pa zMr?1^#Axd@P4xVj^3rF5tMv*d+3QkoPimiGJT z#80Hl3@sY-Mc1M+CEO1(S*j5>OXAWA{}S0q z_}QiSS1Er5T)n+oOG&%fYjPs(#3|AMFe1)E`RwdIohOUZs%_=ul>jbBTB z0sQMI{A>0a)JT}kDWzU6@GRCe%6Kf zdZQ`h9JKHxxSwW@Gx!*Mt^!_E6I++4|L#LCACqzd`Ph8uYB%`U?F(C1-V7gW_VKYp z@G;>xW$>|PA0KP>@iBc9ad5!7qiy)u7w}HuV`bp|QSuxk{SzN^h9zl_lXet*Oz781 z{=&!RLc@aJA3NtdXxRVC$JW5Rq+MqAxpw0|hq!FQ$FSv8g!=fH(E7#faeb4RY@2<& zD96+xeCj2%GK9&L>le7<#b`kx31AOcO@YB!7gbs@= z@|`x$wp0r;_*fNuEDb)^AD-Is&eFKK@Uel=mPpzb1+Pmp*$h6$-XepK?SY3Spyx?F z!o%R_bF!$fsIwZ}2p=oNN6F8}#O}2i`6ubeU-;NhU;dhpIsXSfHXhu~3pgKP!slka znCDX8c{hGOhP|mq;?6X6_wq53If&h0@G+5P9PqI{$TI&cADayC^3w9z_V(O|(0@{9 zJ1sgh7#wH^AG^`V$7F1Uk6Gbk?diLPn$_TAC*Whdw8&?O7h&)*4}9$I4(i?W%+bFx zN8_-moX=geedOC zHp=kwvDoszkVp6!YZE0+zC4BSzCw6kA-pe)Ji^BWj%~mod`#|>z_n34{}a5H=RiKT ziTA?Cx*m7BZLGNnA1gK6F7mPazpXBK2A$?r{7xn>a@g~KNH4fz&dt_|)eig8Ia*BX zv)as&#f#$J4pmV#TB!9Tve>MvR8%%+A#Wz`&*13Nxc5zw)_?H)Qo4%r@Q-6XY8d~g z;ag|ng;S~jEWA+8ToCw#-sDIh`e@BQ(q%&Lr)k7AQSA*LxP*6;Uhwk3;cfWeTE;0k zHxYeplPd#zjPO6EKR4Z^uS6D+E4o09*q2Iq{sg>R7>q8)J5|(GU-)p4 z{SL;utU6d4pRPari z624}xlstki^9HmB*h}8Puj2(%k}kTBoFn&lY{LHYceHH zsh<(|_8a=$UysaN-_`7=Df*56j-kKz{ab&3_w$U*P$TxjQu?`QU8w$d-WAOY(|5~toK@c?*Yx)KPPw9c z|4pu>`-fafXQU^ck)Cu$deTXHDR;4y%Xn=z@`dP|$VQdNf1 z^L%s2#Q0?}ez^g2NY3u`;`Y`JCB8Yt94#5l94hzCA%gh-Y7SWf#!(9x$Ck0JE750b zmNJJnGlz`%q4lg>y_IwL*lB)yDhN8fm68u>!> zo8`)QX8E2+bNz4QIpsf$=XL)l;|U(fcrIid%L3=7-{#kL*WTiT56QpV6v zAD{8v3w?a*KaB0JfI0dN@X8#$)Oe;ao-#*UMt$gwTi&&(R`|}3nyPrOI@z#C|HS>* z^OE&58Jhkm>5ctkgS@fBWxc8l{4(d7_4@gmo(^24b1kmYxk0YdmUjGuU8Og0-oV^Y z-i5hdxX0=m->yAA)#$);+q(+Gl&9ZmwW5JKh8JC{*K_UR=waw2s(VrG#Awa62p`3} zs5d0BsP;ALI#fn{?_R#x<;3v_bC`8&rCATb_q$<>rXw3w2weTzqSiZzW~puGP)hWsS7hW{br~%xZR} z+=@|0_Q9`ycS(!{Yyp z59K@l&+#GRf53-VGk*&oHhbwqnWm3mZ7X-G!;Mez;Bmy07&nmpis*C`u5sFP7b$&W z<*jxLb0R26rGCczOZ$DsCM(|?&E0JpzHZ~z_SUCOGOd`l(P?ilb7!MwZy8l(;5+kg z=335s$V+C=BzdGfDObwOqn-&Df>Q-gw`wX?cyZ;u8Jj{#r&yblvQ1UJ^*elJ-%8r) z?>p`NNb4^jU9h6=u8d8m!1vF&&$&BelgN_r#fqK8eU-SUC*YG}BS=JVdhuy(MdAAa z@KLwaFKa&{3yPd>)C&yhmA!TKG`m0jl8WX>J_;X>Am1kOpErM3rK z|F!|8ag(PicOT$ISFfpLO?544i;?F;7iU06df8Hf*zbuAAv3BtE}!$Q2PCH1%JIt< z`RIA%qZ8Ul`-yfcHH!KZDLeNW&a!RjtqV*sl)H>HceZ2i>8DPQoJ*$g!4?_ik@O(_ z&QCSZdcMs?Uy`+{d7sSMy(eQ{{&d!D7LiZZaJQ+E_Fk8%)N0_mNobFwr|lCtvx&NX zr@F7{M1Pr2Ixj5hJ>FK4ILY=oc6SHqF5m0C@YK*byqj!0!#;qu=n$;wH`TG%@lmA; z9t%ypE{b<)xXd`uS~Kw+Og>~#%J1)J6xMJ@BRkH>cq6SlxNSM z&?7n9SMuJ$8mA#w%p%qdee)vl4`S?UmSt?}MEYX-qruci7kOTBZu1utO)GZ2n6XLT z$+z5DCOwh&pYs0GRT=Ka^(AA*UspbB-xtr0+4{vBvnKy#@t7OiubX9}tlV`bJ>B8W zw|#cE)t}8yi1~bWuhrHI6PHiZLNjl>FlqUEuFuWsv3lo)am$~uO*XZ}$22D?{^!82T>wq=dq<=N{gVpm}#_yg&x=-4LWKJYq8RK~7DQ(3g<1*|oFn@C= zW!Mvs2M@t+Q}S7b-8lO+g?TFaO)mSL-XLw^B(r@6xKcRIj9-GEk9zT_8a%q4ZwGFh zH)itfug&^UCEEm!^rAkxhk0h;z(BJeXSLfL;P-G~kk}1Bk^WKA|J|Hy1CMGN=JnCP z#_!EYZ!+s2gblIPfj2`*|2*kWkbVZ~qbXndBboAJ{OM~=dUn_#TM_B6Abk<(HR6vH zDy^xKc{5IFJ8~k`No+aUu|I1oWNwa+RJ+zQKf01u&Swl&=a)@o{ywb2cD&S*zMQp6 zV@@ZS)k$lo(pA&6&P#|r)U;GzysC`#YB_J^FfvRCv_D+MF1c*V)sKsf^*D0MKSDWM ziSyS>qLuzTQ{sIW9cJ@ z9XdyR?9Ab=W4teB-6e>%1>yv_1^yb|#n2DA>n_u6-G4bFP0ni)n|^0xp#&8c6@DxrVeHu`84Orzh^S<@UC%d<*DpZ7n#aK9Mwc+ zS~3)$t92&J>-ZU@lp!09Ar_a=Xz}5fI15Ts@4gvnTG4>d4e?WS_|%Sc;u6T2uQwwT z3El_{B7@bLgUV&??3eSvovw+dF4Udw^3bk8c}d2w8aTTv^Nv!9+rz!sa?HxSBt~gV z1pd>+con}e@sar*aI@B4KF=cY3olFQ4V-3VHi3`!6ilFv^RNf!C@tSXJETl(PuWUf zi}CA+Tf8zN@5Bb8RL32Dxa#0N8aCFJQROap>Znu5=Hps&cMBX-@%!i&a#KO!T=gdB z$MZMwH}kjf58~gBfAE`y=gl(@65oEGIVMHcrh@rrwpY>k*^QaBf5Pt2MAmv9wq-44 zTskC{H9t4gn(`n%CJ*9c(yzFx`R0yVANXl)6mSf`UlrV@DNo|L4EIQU*+)4|uAA)2 zePe+t7(Pc8tYxj-9@4_+m`@{OK{1 z4!UM7R?$1Iz~^V_(b>yJPM!YYC{u?edx(Reu`Y8W)Zxa#X)u0-cAfDR|D1+Kg-uA) zmyTf{hjqBi6sq29&d_APC;P6Wo1DzMe)wv11YbW+PSItYJ~unub);!Da8K~aT;7_a z*{cRQJ`}vFi?Fy3XR*#cDComS*^fnEmA`jnDSjP6<>?`6*IIOtcj8Pdf*9L6=2r+~ zTWt#3k)U-n&JxK9Q71Prt^z|abq5pkvh@pXCNb8sttw_mVUT*~NBq!a%nMDNjR&0& zJz+1pg~<4;{*JuH{#3!+mQi0D_>hhtixWQ<2YxIWkB#zjfgI#l?3R@BqS-k4C z({p#f3H}~1n^F!kwxQH*VJyM>G41$U`9H&Vfi0B1LF{`p`eJ(k&R0TrTjyW4OMJlm zJ|=f2V`;(D)4HpfQ~Kj`kMCGIzGE37RdJ8t4|ZoO`zHIVA)IgIwyN#5 zx74p1Gj+jhvznp~Hh+OEBx}RyZzbQd4mFbX@#*llk7mZ}|K#2CJhT2(fuB@G1pOv! zMK3>_;rWC<7Tf+de8|{q?TvNMx{$;e8^4G(25f@j2ee_K^qXRRHom+M??>I}aKDZ3 zzLmAS*NInjU#7$Tag@3`bCko~m$j(dvK;Q|oz&Io!4CI0d?)TUJM4GcRO(6m-Ui{n zR){WE|1;<2fjd&>s7`9rs5{lB!kaAa5drl+L%q59;{Eu%!~I?#HTbvI>W`$}K;PXs zojx|!>`%>S&7N_Qu`gbOA5A-AcZ@gbU3wRdu_t~wOX8$8n%kGx=a}>(tbM)=zOoiw z>shVblIQ$GCi@4HFOGaU>DS3SbE)(JXQ+{P8sDH1c68Io7h9i^;S zNmtiN4L+TdZoF&enRB4VG$Sv~LS8ERCTT9Tr{=l2maM8d5%I~hH?DT7$!n4=V+%9z z6PTdF6D$t%CVyK-lE3V9>);c)@+0 zM*L=5PSTc#NS7GJnH=OhMSC{$+=I64r7aU^%R<@$F4YJwjHf-5X9vX}oc;3ZcHrSQ z+9PX*QI~}$>>6&~^usZ){|~mD3d8>_FI-<)p{+3Rhi};6DpugTVP;HB^tZ;fC_PGl zVmo`y0^f~`(jVbnM&P@7QThztjSqacE=temoxi*!DX%(8pA=ADJ+!K*Axh5+D9=b| ziq`MtT~Tth?k`i`-^n|{^P>leZ4AD(vMv-h0leV(RF>mHbjbwU!(p>*FH}#oRU}Wh zg|S~$pV-Jhme+=p77 z?rq&H?!(q}_x4h=`_P=ZE>roVvz3%=Z1M^uM0!-NUw;cXLvD+CJzzz}Av-m2FSo zfwua-SKGSxzSj0^?{1v6dj&e#P}>OnSQo%cDpL}9PPD!9#SojJ1B0WrS+|@O`Y!&? z`~NU}Q;%4+iShN+B=)e~LY{qpuxzU4``vu+b*E#~3Eqd|U*7|I_bPqR5kJ)T@I&2m z0s6ixIQ10$`!G7qg5*ejAvAe2_NUyM*6j6vCB9$l=4fJ!Z!LBT^@S!y>S^c*Q^?n9zHHZ}_|)cY`$ z+f9ELSRGx}kj~WA4qh|@UNjM2v>#rC&7cI`vf^#@gmbj{A3T2vO%vV|3GX>I#_7iQ z`|6RX+hXo-g8yv4z`Qe? z^!LUy=eTEYnSPjm(@LjXc;Q=&&GpW)=XW|I^qi{ihwb>2*?nZS(|w|p`Ep3Ra1uYl z*5cw}&G`3xvDWPN;FnSJirM}19;dsupT*t6dg(V;F^_=vyTKOsF1yA3!*v#S7Jj+N zrat}>TYl(|^m~vR?B^{K@4c~6)9d$W22b!jiQf#PV#+CS;AL(2w$NLN$)SmU&cPli_(ikVuCDqOUx^6dE3xGtQg6|zR-+BVQ~p~UPLSS#?(J{Guz)ta!neeet%G|B zKlzO|9H0$*BweWRli2dpw4*O&^q~!hX~R_7@Ct1}U#$^5d75^#pA#CtbWZu|SAWG% zA`)hfFmF0`)XPr{|1ZW}jSJV!Z)+5~KW&r1e9Wsd{*S93pz{y=7`c>J960%zb| z7{oj1MTyXhBItz%y-0&zI5?AG_)57oFZ<%%K-U!Mg~``EPK2*Gr2X zPdyV7BlS|&*fsJb1laeGV@hOA-O$}yTPp;vM@X;J_I222iqo;}u`VSta}d4;7B#O{ z`0*V2Y8`eP<2&nB;$Ic`{So<&J;(UYI@S$szE9`7d|QXDr;PQjNo~GQQ<>j_!g zPjYmT@}u`*Gqk9ujrx%vSb$^P-v8#M8Q%#tWmQ$s)~qVyMcuyrTAc+cL_q z|J_0wY2(Alt!1=jmRx~(hFpQ|0l5OlG~;`;K2@&do5Jy9gb;0a<4pafju50{*yl zol4{UdsqZMGqxMC=}y5OZFUkb0R3Lw>Tsp0m?rGm*%M9L4hy!A&C1mD=aPA=3a?iu z@h{CTY{%Yq@Zpq6y%&RAA!peaP8oFZ%zAA~-cWfb-!!MP2YzcfQ@F9vWNLbva>RbK zx0~h~O}yc~-JGsQ+KT?Xz3BY==4<)^ z>j+n+#d%g@vDGDV{vc=eRwl7efOWsgVajzsw)H8jqn0JAck9r*4-HZ>UiP}aGH#>= zrY6$v?PPN0vFCXydr9_oN@pDwn7XTXCFbW*&hDCqE$SHOg6{0#SayQ(OfYq5ib`I( zs+8DMM1?NX55F5b3K4_&XuhXu+?t$c&*FJEonzW`p^Kk}O3uz<4 z`9k)oyBO04rp_3;hd#h}J9`?uOX#22ogOxsm+WJ2V&O1shSAJ7>_#e75vL|*$2**v z8m&4mNsFV;ID1m;UPS{P=X!IWc8xlDKl@&if%)TOvzIMOSG$6hZOQPWs_W{RTS8m5 zTJ{WkRar*%v=k3ZQ^ZK5?#(7!6SO${J(F$6GyFGDM*`z^Gj_|xJohTjIe#J~F+6h0 z_2)N-Ihu>G?Y`YSXIT>caElhPqlrCy(=Ox;y#kyqG!a*rG2* zi2uR+!=yc@nO0aydn7g8m5C0qTvG+!dE3E=Q*exVTg99$W1olc3!%@==rd`=5OL5? z)6J9CRA>=P_0GWO*hu}?G4>Up;>#^myx#s?%O z-IXgezd!4_tT!0(<>`lG@jJDFXlpd*c0>D*_ygzhv#cP0YI zR@x-(=}13)!E+=u?GCPsz>96CbA|?UCa=U~TMO>+?-U55)b%Ic#qU)QUdi=(@_uKY zyrwVr=o7WqBJ=m=elqtzbKise!`OJkz#Um@SS)Fng9+T*xEH)VjO=+I&qsJ(&9~0n zhqM0l9rqo%|5WZNE1LUAa9^eO)%RS^-g~)s^wll4)|IVWEW766Q|e;;KQ(AK_WV29 zXP09(_S&7DY~k$GAlG^NKtb#4*$Wr+&*}ngfx{kL>9DV#J;G}FKD}VdY%L}Y|I=HF z7ROofKfP58!avl}JRKj@x1tus$^Nzz*Qpp5qNB|CoesnYRrbyf=Y9p(m_I7d-x;TO z*C|gG*Hp?sOANFwbZFW~=9yENhpFG23clsr*ry!!u}!9e@3~*YJ!i(uylDb)G1zzb zG3$eCSRY*7=>0yA?>Eo>cy-SU<9An9s;HvIAp2JGt)={4yg$e~URY>|wXY>Cb6S;( zdSh>p{cn8Vd??8NCD)z*sxGM6mtJsk&M0eiJKb6vWiHsw`-cx#7d&#Tx?rWLWB%FS zt-PlTv0V!0X>NgC_O*>=Z``o&9quP3CYZUy=T-t;Lo)diKRtF>R9!);Aequ)`HnbBHgX0MVAJ280kAKInI6`CURA6{1yckB4a zh-cryx-&_Q9z4ZS(5gk}pV_r6u9fc|z7L(oJNo`3(@Sx4`>W_LvQ_F|(Uoj9#271V zpEd5mTX&ZRJ2stXpGckcdRseXx20)4^S5?Y(Hj!y#i$#)#poxj zFR1Kp^!Egd8oi7Bl!Oi_a#Ma-QTjWLiTB%nQ!5&8j%M&8FWQrph_&RXLf2UKEu|&j&{qK z48mu5#XuF6jD6i>w&)r7S6sEXy5Rcns|yCyRTtzYCfm9TUf-p%o7fu@M_=^>{}$pe z-C&MPxrILePQ_Tik5N&t;ODS3L`7Y(z)=vY){J>F$gzp@1)`ttr=llVudyv;kJxL& zwD5AJQdQ~t-EI>J{5O!cx;xm;h+|p@{a0Yon-E6y@FVs2$Q1^(!Y6kJDyMr z(mhSFoX1JuTu)za=3K_9Jb%vf?euY>IWiymn!T4cmukfKrG4vWzY?}(y&iWZ^!BM? z?X$icadrqX5N7tfMP=V4d9;xHrj@L<5x1p?e!tf!N6j3!zVsd^ZTT)ljV{!>=FcZC z;oRNxmQb8#ng;&v@KbH7zX#dCtPo;P=iUQ&>dwg0Nnl<~BCb*PG-s^U{>RhZFk^&)3X((dnQ_ZAhLITc*L zp7!>p-N%79nRXAL-BAVM@gr!r#nd_aO=U^Bf_DE=i?$}wZdZ>eYs=-9to^jJsb5G| zH~OQxFgSk3*}~nsW(UUyO_?!t`kdf+%aj?9Z|FLF_ZzgeYiL;f^Yq0U`eE^iu=xFh z!{Vz8!{V3F-fpyaW~4P`D{1#erd#_Z2c>Md%90W?Wx(TwX3c1`>;)6rAoFA-c#gqo zQ!;bnOK@7|gwTkt;Pg{zTKK@oEd{GgChP516%_&QUt8oTxW{a<-fN1nPKDOI#TruU zfU)`0pfQV+o{H-aExAvNNJ$_LW_<0cxJAtE7I6KB4rf!bA6Ja0p9{_A{LkB~>|H$f z_zV4R4$8lUXPGO+>`7^4zRSEn`F61D1hKvLE?4eq);fWQ5bVw65IFx1-?sKJo}HX8pWY#;P6H;k-BRt1bv%=&(oER~Ik`qS`NZ6l7>I z);&wLnWN?}jgz=oH=80dleJjukr-3KlS0ccLBqSScWM`P`Rh+=CVnmTSMn~fZhyTd z=(!bo9uMwzeHOe_R;$!?TZD=d_@?w#qt^q6iF(gd@9*2xdjQ^1j~w{(-`Ed99iKv5 zYp@;e1AhcppBZ`wdWfaG7+$th3)`_QWJ^Kgh4ke|(8GT`5a#;P99b?hkh_TUmG@X( zXIX^Tk@w7XTDf<&HMxYH$C}p>uk5h)7GV?PS%ZD7i-AFj)L&L z=>?DC&lA;tOTmWf(1Hly`$t$WTZ5_lnr)iN8n?ce_3$tileVr`ei3{7N{Pc(2OOd1 zD68it4%&7t}5%j_dE_ss3{mmu#+|CE|L=FfOCA9*(cgE%86W@j$E99f6s7a;t|Ni#I4+7 z@!EmGFJkE-n{-Xt%RH8N1c&D<_de*=QRvly^`Wj8Mswykb4+ka`s={@n_Y+JW50%W z2`$?SEeMXh(zcngU(CH9<_*<17s!~(7|B@WAP=rZPruI;m-6x1*3<{+zdgu+w_$$} z8k!6Zm6(Em!}cI}?}aNm<**N~hk!%+Lf|+IJnvFh`vEuD-@qR&XaoChRLqhZ{51v; zSGFtkzSJC+pNL*(iRGSn@s;3=2Hjr^jtLG`Vl#OY7>@$qca+tQ`4UVF05jtt_1M7S zk7-jj-_Bzb{h2;`nwUi8$TSKbau_*u0?!W?24~HRAHG}Ux+(ebSu-E(n$S&QIKZ5M3msF3A2lzsMb78Uix;UN3piQ8qK?I`#Gn)MxPzT>xq z7W{$!b^!BbwBeku4dI*_cPFyHv_arMfuCO#aV>gXuZ4#KzgOn&Qht(t7rDEIem+6} z?xk-ZxtSPj;H&TsKixk}|JBi#g2T6JA(_G(o}Y88)vDq%_tU@A=VV$RFa=qKUXKr6 ziUjH?n9W{cq06vs3*P=X|JQuMPoI~wXF$e7yp4f}y$830%x1O#>d;EPH*q-SxcJgmrm#@`p z`ghbJx_2XZCUxNBc**{%)xG66Q~uO8=&umU$L?KHU-|2HR8z-JX-C+9Z^sc| zJ49Bwy-hv)sAnzp9An?YrvdG#iZtmi>X7kh+m66KYC9f7+mwHT@-=YsYswdyr1%qu z-PuD8VQsNw>a7{>!<-4V3_Ki&znR|$I73UeonuWuH{=@I>D$12v#B6L`ap1UzS)=) z^L(&PV{HG};n#iOpW7F4X2q{@CZY|D{yuo~Vjp;Q_Np3_K81R`?FWCrIsaJt`#^9} zaQ~d_6AF+4{q26q*Y11M5@Mw7S{Gm2Z_jX-cUD)=qwNhn)sW-(CqIaP@>trw7ac#> z+THe^ukGz=d-2*|+MWSSpV61OrmhBE3X7Dv6wk3AGFD-~nlr*P1-`yM9B2XucD8}l z-~Q=s+po-eZ)ra~b|3S{-**4}^Y?+2|Ccsp`rCgOWv*I(ja6)23${7z!`pL~1MTUS zjW0jv3q3c;X@Ab9hBVXuS+sv5vf*9$WtW8vwLRi%zlrot@Ly=5jK3L}1otO%-lw$t zT&#Eez3mqn#w*kN$3GDNOWMHcrx#ZOr_fyXwR@xz{W5`m zse?BEi8+z{&!qbtA=lZil)iyhzW~pZcH#f=H{1Lpi#iC9K&8q5lh0(8X(bfX`Q~0#>>9w5#`_xPC1KT{^N9%<)UK`NcjPLAFdw*w%9hX`RVpXU=yC^x6e7*XEL3-3|!x0)<*=w(&)v#iF_B^YCbe) zb^y(h{`d35z&_gGgX17@G|RrR0Q%sEqXamFSNP$ma+>r^fkSx5db8fh_|EJyeD~Zr z!C4|#&bU85Yu5CxSxv|{pWGN8uVI53g>~|~Tl0M7K2DqV1OE|VKh!tO)zr!A+Pek+GGJ|h1|8~q3-2;r&B$=rqeu&^ zz`S>h!~Hkv{Q;XoFQ2`tp<8-^*s6M9vx>SrJl?QXVY7Nxbx0Y8y=t-9Yp;49dsP#$ zCQOg_eSDADlkoYTMp>UzRwH)5ag_HY_OB+&n?ZTADDOe5x4fI^cU^^~Or*S5v3-xn zo{`)$!a7#9vsxd&_VGe=4Jj|4@&rd3FUkV(De1IHCKCNVZ<9fNZ!2$t%xlz&h4j5`t{_i=UPX;)9eX7b5RcU z=JoTFZ^*kJ9DW}?t<}VNWf3a-0A>B0!F?#5d}GAfV2j)G7OO0{i0#{ZR}}dzm^DILpC7eX1LKhmUA0-lTmAN}Y`O zq;%DD#4K*r!ke0RJ-2G(-9h#fzIwEE-g>eF>UocP&bO(@PZyq{o9(S+!w!zO=s)2j=gH!nY4ircfrO$@hn)c@4wklawG>+36drUc6rTxvEjqK` zO2#6AHS?Rq=ENGQLYGgBQ12bi5?&owevmevC8ku){X>U_2p;o3f%7Z=?LQz~f8*S7f0?gR zUj37l&zxS*z4-G6`azw0a5(!|zB2q`l#DNYtB(54j#cy%dw8I2w;k11tcK>_k1xuh zEhfA86iV7rl9qn|F<;VlC2hy@bkfSX&Cjx5;|R3iW$p#9M{|v5-`d}VM=<{n@htII zo4K+ESn(3=aVkw$^Of%Tq;;hhk?!ijUM`7Y+=5TfC!HKaON+d|JoRQ<`DXTiImH)( zYZ>;WMBowM8wdC86l<@fbS^E}P{rj~1^q8@&m=DdEKn$SdDbwx9l+i7t-f}I( zH$?o0dL$3X@It!et?k7bX+iU~UIj;Vk8e&%nPusHj%f&{D8P39ZUo+aEd^Ti$!Ua@B1y z>nZgKb|-k12cF3Dr;KGC zD*2B4^3~US^YxH?1HJjm+vGbzKGE}J|H3ZTzbERku)m z)-7Ru9Ppu`_`baa9>^TzT-A5eX{!bv3$ObLdLet2&YR78M6kqr?^xcU$v7*J5G%6Z z1{s~SA$&VuXvMD085L%;{Z6}j&%55z$v78e0Q6bX{y5*P&k1EeH|>|$O0Ru>RkD@y z+}$!Dvk2wPx!Cf@17P|F zm?R!=ov-bclqX}kAKEKC>rKkr5AEH@F-D)=9su7vz;~n#d`*;j1o-kO zZz1K0EZ%BjzkM6{ibIFHLIdEd2EL=f7Y}@!HE-V?GvMn`UPW26C`)`hjssW!YgIwB zF_v-V&T8*irUbyXBpap->CBuU!9$(!kB4`V z<`8K_4v>A-!vAyEY5Em&wG~r|>%bnf!TH1($%n5MrZ_IV0gZp)N{44@!DDv#+l2?< zZPST!|46liH3wDlA%BTwmoQ%02R{~MKiom3vW8SL5L&(k9-E6lfAjr=>}8K>E2??E zgLTV1pAUSJ&lf$=4_$oF7eB5UzUY50z_v)*Nt9KLY~b~m|HYqP{NU$GTCN*N+mmz? ziH-g$dkeOaPkfRk{zSba#qh_U81&1Yff?j8V$I>>=k*7#-LSGii_O8$!pVA-zwNp7 zxxf9n(kH$?=x{c8h{zJpvF@8kjA|P(sxK!-wXB~-6Q8p2n@o2iK1AszbEfw2eF@$1 zAu1)l=R#%9e63<$TyWS~Z@fQZRN8)bS3yscjab#~@^8YI_TVrTjf_yDu~zjJSCt#7 zo3I`BzPocl>3y9G9PB~6%LV^C)q1t?RN+m+Q~MS(_V{bd`Pm!ri)qFG`zF@!Tk-!c z1E=IH9gRNv<^*}ci!(V2zr)m_a^DBJY%FaNJXGz|Jx}A*)?w{9izb&C z)@7<}mdK3{Y;bz!RxcUW|NiNAks)&yR9#oNNZB6{{6dy2s9rSeiR!0@Jz4$qu-Vm% zhs~*eW?1gJXNMJ5cQ{+P%xs_XsPa50F|(p09xtpWZdOZ-t1vmpUP#P{!j_J%oZ=UU zACnx4yqVYn&>0IUPK%6ws_^hZ?|$rC+(6llB$s(N&kZ6{nnQkS*S~!ye;GvzP^LJjDt6C z?jR%YBFWp}%L_jYYm@f?dC8;ymAvSwM&7(4Z{EiwZP1X0-Q4WUDrLu{|04{nwE9j4y9}wKwnGk~i9yH&c23)h6#g@~)-c z=gBK|`txNoN|Cf{|E@360r(9NpaFXJebZtScKb$OQ5tUmAT>tX*yNOM>J*=gW&exV}x^qtZ_5y@R~cMro_` zXO!eawl(?|8uLP%e8;4nzkb z$?fPQvfpqtbCzHVcJz`O_;<~dt5kvLB{R~)`qZJ9jD~N{g1?KMq%uG+k^M?Pi>(12 z?=X9IL@zyfKwIG(YgGQUVhx=oH>WLo!gy$`Q)=XPMw-zZ|hpVmFHY^J}<6uc3PFUP0Iu7JWZPn8(2V{eq8&E zI!n!+|E<2CE4}soiSh*(i+%OEcy@L50}gcOntC5x^98PlShMDx!CM_(S#fkgeH$-PUo$xDgr_~_ ztFNq0zq@_)jir3S<9b8h?OHyWXAODR`IsSNd+S{1t@G-DI$yX%ohPYNbhN4dHX;uc zb#r)b0M8xByVw?u@~RrW5tlw5FT^pkx7%%70Dvwc5 z5#_@_Tee~2*nwT(AIj74dc14zamv|Za~*s;!POkBd5&5+H#tJ{9FNgF2RdnaiXvLbj}vat}}-k`ug7~e-%3C0_?C2o1F#olqy((E%V@(5IupA$Vu!| zJ2RQ|4+(5uUCZ+%_(=VqlDGbKDeJQGCl4X}&6hOsO}Xsz`e_M#0-V@H8j&YOPM2~0 zJN^Eb#CZLKaqN@sBJl&*({db|QrB&ArOZsZlI~`%(#~GA zZMsjlTkG`hGxozHGJhqyU9^PCqyswXbLgbQP2+5D zYvGv-+ovbIhE7_q!ZTaZOS@G(AD1_Keb~Thtt(}Xybim`UT908zSip#@BI9mwAD9f zpF8-=oK0lT{mh)rV_w%(v%bT8jU}yr?nZGh?<7_LaSSTd{LY3g_~A(6gYleO9j)KY zeFFMg%c$2~F|vcG!s9~{i^hbg*JjOpV9^-;TH+_-Khy;q!2I`K8q*m2+N`qc zI>cXtKTQjDJ&FGacAA>n_z{rGWLsB!ZFVP&*z_6g5xdQTElIY8A$HrVAw6u{LVDUx zg!HmSJrI`=n;Dhx$QMxwFIM-keZc=Y(@@)5{%fuoV%v00s%;1B=RG*ft5A!~pRubX z?uYoGO$nxU`4Q_D#r-QGXwzn8$$zPG#hfEnx-e#D$~#ZTIp>szmE?17E&bgv z-a%OocUNfqQO@vq&eY+VJzC_+1)+{7j?>@Tb*z&SKdd^E*kFv!KK@7OlRWSvgtP35 z7za5I=)ktpxM*ajR<_0z4^!FiIEf!mx}bU4cJ`a5nigf-*Kw8cZRTIkw?WUw*prK5 z?E@FY+HWLoZlZyY{y3L^H`dH{z!#=*e$#aJZ$B4mUGjER=8_ujCxhe7lyTp4S@!$7 zt0BGM4F`B`D$2I!v;XSgf^7Q+2Yto6Eb7Ujo*e2~4*yZqlm9V${Y=)wMZ}k0Vd_|3 zs9k+HiTfW(pUU@FNLN8z&JUi6wI{TchP=&l9dS7~&eB$N2X_|nyqohzmvMax-{uD9 z*C(t|ITMHKvSxWBJnKcieKn8R_`3}GzCz?QEvd8qd!E-nmu(+^y-Llaee5kjmXexg>&jQ?zt?y^NE<^rV}`6hGCwYPO}6a6)@cY2>Gp5gAv7lymX=~?!TDkRg%{;zcW z%5(7fcf7jno;3E#^m)1Xp7tu#T6#Hqt+2!Qqnzn_jQtp8(7!diqDHv4bR6MsVNPY5 zqAt!0)+wzrFT$7?ZRf=2%!!t(RH}^gO^p49Se1GsV?UW|;JCA=yp!OgWm%SeIOiOR zPAdAShjD8_A4}RIep8*xjddvc&%1_ZDnCnqc(7kw%@`bE1m>w}DEC3ADub>8u8*uwgXChJOF%a2%tU5S(@Yr3NAeuJIPL*F(u znsnA2E7q-I*(Z|+M-q*6B*Kw=faKpWv`j&?l%h_ zJj8m}7W|;FgCr2sLh$6I$b`syPWe6_+MHq5Td=RlS=aJi)@6|4b-N#a&ZkTV{wCyh zfjbZQn|b!b{W@@;1#WcL3ax&iF7k0hhTwDO@`FY?@n4H8zs(187BKI-2y>88=V4$L z-0e!84d@_V8PZfwv>y_Gj`9m?dU}z$)uoNx&K|Z9&Hn`9XXJ#ZO0I-A?^- zl{K+|R{!V&K}^xPQmBvjRW!`b*&VJ zp~4BSdB;r|xb}pRR&Xt@d=F^_*Y;Jb6^AbNpO@wwrT(>y+gsExW7Y(&H5s@@yaUGP z7-Lt(_gCdR<8}gEJ7M5jr19PF@3O`ZKe+Z9@E`Z#T0OXSX8_!h{{h!-Gtzl+ZKDt7 z4}rP)BFw~u5S#&K!I@&}Jb4k%gB|YKG{=;FJ@5V!h`?pY=oZB<}q<8ScYL zp}ENTWBj-&yt_YZ3a2#l+uy=>Bw+DbW>5cz^^|u zhgj3#*N(NfJ#nPEH9J2^MLnQ}S@*E#HJ@iWFKYv|SglRacLHMsYdsr*%eirg-k&g*&Kt`7 zjxC?KvvuWL^jYQB8$8dwi|?G##%Sc8;FLa``+P%jw*7{Wf>WIfv+Ww!oTbPo#mFZM zW9|Pm(gvp-W!w^w)BXSdXYzVUw*AvYm0G(7KhzlY?yhyL#jh zZIl+3`3Yyy)o||P51j8<#`(oxzCX5)iTylQ5|D-b1r%Hr_R2Q#aDx%m2^!j@VSQZfu{KkN@v- z{PS((_(NKx^-3l4DmcH_uBYNYzAI=`tFq=dl`Ve-t`{ek&$nkf8gIm!j{c=3MmL(REl&E{)UXYzSL3 z1^lAVMUIC~xoybt`;g;{OhL~isK}Fhk>l&>^QtuV8557i6r)mQe2()!NS}zF7ikK& zS_Z1oit#8_LHWm!_h_M0lgRhXaIb8Ayyy;l1ZOieEV#p7%~=>y&R+g9UWPos zA{KeRqrLlrj`mxEenXz;Y=&o9Q+N|w%9reG+r>Kf4EBoc{2{#{daf2Ddxh5&FO3_) z{+w#F)tY8p9ns_1l>4{G**JN_P-zfcbZlwhVkR+rAN906Lc{ zI^ylcci2my4fid)!@kC;jP+!pzsp~UwU-umw3jaIDEa_<5sSv$Z|DP|hl|+LDEdH} z=mXsQ^#SH{%{I={5PhH(dh|Na5~u&I2U!;f2cPA6xfY>6!*zjIA1L{BqlP|UH}rww zj~Mzujpzfv{}LY)3$`n0#ai@%yLo;EeV|9$zv}}pUTgS|mWV!(muoj<2%UF+ePGN- zUVWf>i^%+5K6em#MuYcm``9Ztv><2rWjw#!Q^_~X z`he)>8_>FY}7x5#M^Tw~~hC87^#PFdH%uakAz zgUC+tlFuZS;Z$Bb`@PyU_>tZNS}Dm+|YZmr-v+Ch{1tCn&F8z+P%& z?KpyON0G<8vRVfN-X`G91NTGtcIet)^n#=+uU=3su>16a*U{k)TW|BiEhycVx%cY_?R>Z?G&oQ{5Sbtz+B_%(o*$}Gh2J0c z=?5m>k3&B=jI7*>yg38?z?rO~elT~i_G52-?I1OJvlf)^SaH0Zq4pPUGR>Ipt1!0GvIUqkMPGTX8uWD(G!ScY3K=u(G&Ipo9GE5&or1V zDSsnR7Q7+{UXcT@IK%T1hgU}P>j|Qdgd(GDKt|h)jMkk!@S-PZ$Y^rTbT@2Zvnm$E zIp=N+8$1a;0a#k-cYJ$FlE!)Ugt1?=t`xgh9eToocUo7zYqZgVOcj>W8$ID~(2S*j z2~OPs&B)}sCxCy|8fn8)4pFA!XT(>P> zO(%2kJnF5MHWsdv{?hR7!qLZF8#c851^ZS{tYf7N3B_YxCS z%9j7X)nDT@>aS$Y;y=~DrcM1)@5AlcHwO$a`(RiY%iIfqLB9kHd5lMLVlsYaAGH_k48kG$_S zBM*rEI>wWjd@{N131!uA@R><69J>-0}uY=_*MR2 zjGqEF!TbL-erG=V?eRMy-+p8K4#~IQ7{3O-{ZHcuF3I?%Fm4XU)L1)E#q5`nb8)IS z)O@7HwjIlx+KlC(fUz79FqZxP!&tt>nE1!9Q1I|K#;=BN`vS(V?fIIrmiPf@UY?nk ztiR9o>*{1VG|Z^~L+FuJy**s~yYb z?A6W02R-(+TCtY;dN_LN>oj#@c#$_=x#H~ASA1u$dVpPgQFDnA{1f;10F@l9yjJJT zC>J)-lFYno_0YtkT7gO8D-+MD`~l$Fxt6%#gB`>bEvn^gDc7td2WL(NxlA)1XA3zS zwve-73pp3I5n1hiVvZKxz@IZ>9|g`ghA7v@WL2>F7G;kJ{{J{T^Y|!>rE{W&zeF~L=HD{#xuLA}YbG|E8+x9jA)B zwWznk3ti5sGdk2v?%EMuYvy9z#W`Fzy@Gv)4B)G){c7=0-Q_1g5wY!Mo!X22 zZ{~1KXijEbP4?5vew0-3|A%j|oon3%LnQ~GnZuR!r!vMLZ$IVpT!UTM51(<6d~rsJ zd>5LrhuDf!YQ-o$)H7`Mk$&N`j}DF?$57;K^=P(F4Og$zKN=*~KYQp~-o9&D-m2W{ zc~&05M;a>g9+~vgyw5m?@SmAlMZ$O4o`Mxo`l8ffx)xEoi!*gCmzRW&O)Gh)a>@L+ z$@@2N_xiK0zYP9=vc?XcPjfWe7kb1f8OrabNB4Nd*K_Em-{E}UJ?-!Jt8bL=MLaEeUa_i za-$j~^YwRtSqaQe8*@E7p*?jC^oEq~D(D(wzt-zc~KEjZ& z=$uSo9wl#?&{MFYol)N>iF5eW0#D`J3*M^SdT!qCT>m}0TNk`jIf9r&Ld(9;(42vM zx8WQ@3rwR5R!J+wMwvwW#_ zf-_9NPD^`1>r}dnHPYHoyJh+A=6+6OmT#y%?S;hdS#;5~7e*6fX?goBUvGZD;l9<8 z<(tF*T*^Gj?>U}@)~7le_@CUnmm|}b_Cgx>M}z!=W0hj&sx{2O*i)*;3(nQy?w57Wb#X{pxIu2PmZ=#oLuYLv^Jra zBjoOv^4_B!1uG)-Q-5`BTI0GwmpUw>j_)S)c1(##b-bvCI1VKAaV+KkKK?(Hkm2~8 z|7-CXKA$kykr)%4I4;)(CD> z9rUlRAJO{(a(3pEv$NZR(!7(zn))5FroNt%-TO?9|=Uj&|!Fw&0D*cPaA@WwL|Itmvjs zqRh-g-MY`9%!qSScE3iM-hna&Uvx8IrJb9)d)B^g8GIkLFhhB9?~z#L;47H8c&@{$x&I!ci3PpQr?j16`k~tMrLnHrX4DHSIs-t z*~>FVXM3`g3dnto{;!3DE5BNp)Op9kp_K#tQ=S=NOU&7Sj+~_`F=y%gA@tXxXTlad znzJn;Ec(%q=$tZO$=cn=Mq7sHS(0NkIqRJC`-gcqeZY7pvA#u*w#3|)?ICvYAj96d zJ=^o?wMIW|(TKyM4OD|3xM93A4&Tzetnto`^v_o2FOOok{gfAoy-M`I2HMyc9;r4? zYMtoZ%6IJhiS2`3wYO9i&uC3@7Tq}BS;Y8V!MFN(*5k>)=0%Tw!FPw+Vm26 zjl9IEZAU+o`T3#(lLwD!JskyI6ZAi`_rzP5>bQwIh~5+Z_tgw?V3GT0Ho1Rl2IOp_ zUpA=wuhw7Un?d#DN=ohJ7{NZOKT_`Z^hM!y&zdd82SZK|9>aI{J^JRn{wcj2UD*pW z}O{$7UTPSXA5>8Qmh#) z2<<#$!P1<3;%{V2ENEL)&dCVY7>N1nfL5>M;=*tJICT$WJlMk+qTzd;39m>1nO*{a zB<}Y8(5UvQe(WbL|E8XEjCSHyg7>RvS8?Mz%5&xstyui~r-=RXAhBOWRvv5_y(!B} zjBjWE0YkuSW8b9T%^}lh>x`KTqJ#U!8`i)||8O?Ze6FFg6>&NabS#z25d+2-zxtV6~pm$;o;{bC0K61Vmy}cN{T_=44 z8f*p9SG(xZwwRn77Ot&~;+nqT%F6f9)7ivYXN->CWTRQ@zpb=CB3C2vBF-auby1+X5}l;yCbp#`G7m-xPh~a@lf==><3LP7-r-nj%R!w&p2lX)@1+G-BZvj zOI2vj0dfr=n(wSUJpa1NuIHva^D+B8a(?xPaSsCbYWnbEEiC64W6&#+?V~4$cF1{J z>dc&1bU|uCdp(<6!c!m1_O0W7Nojk14|^RxC||tlC7#dZIr~Xl`c${qiG|$!p#J!( zTgWwhFVBtj#QOHSUu)NVQh#DqgXAFQc}Ln~`1XqgLr<=!+y|69 zOu0VA*En4CwF#8lW|ixjXq3BeQ$$is)HRL)Gx|ElK75U%fOg8K+-9rX9cH=jH%BBr zOSv~F_fN`6-rk!jw*}w8DB3Z5z9*<1i8(U=t;&aJ$Gd1pv1cAXf6wkP#`ur0XZl1& zMu&t(pAO6e1Z zJLN%887EzUZ7-zB`ING@E+dNz4Bo@+SOv zm)P(pZ?sjcfzDO*o7=}{ZyG=!Igfr>h<@p1OLbUd)i9PLoH?;6H+5}Im z-YzP|Q3{^zd^3^$fc)1!%U-U&j42!NgQ4eZ)n2EbIGuPX>o0R|r%VaC=rzWa{iUwr zL;ls|eTbOp`oy1~!#6Y0u>yxVe#1@m-Sz(H;UvZ&Emh?|^4ewkgYz7ENeOWoN{Gu) zVyp2JqruNvJO4sk&0Xv>wr}mBZ;^9{=zZBs(@XZ@+Pk^snY@$dX*??!ki=fM?(Q(2 zALM-!XZMokYh1RPo{Rx=ZphwSo>w)Jm0Z+ zLI^Q4|J1QKGs0ComFJVf!j=_Qbu3;@?iGo*bAa5VS@DYa0k-A>@JvvyV)AFF&$b{$Ei!*^W93QKkk97j;m^{BDw|E@SCldd?k=Pq|3*Y2< zQEqXbJhye4S;q5Xo;S+#Il09ng(l#n@cen9NuEEPTb#pl*=t%)&KVESKbPl^yYIXe+7yAKohViNV30^Jg4FSNZ%m$^*%q&R)5JGb~ac^CF* z_L(kX=}dkhx7fk+`bpAmp)(7}mm;=MR+eVWsS3Kr>jy^KD(+pCyC95mMK9zon6y53 z!DM&tg4~d>IroM{%~>AOVa|?tbq+rZQ+ku1N1&|%|L;UiH766BzNMW!k8&UEuk;pj z`uUY=u4b;hi}rXB8h)gm{I>2h3&{y2^^*4m)XRb=@nB~Q?UdWBb(qQd#{82!D|{oj z*e7kQ5{zfx^6cI%xx_R89&v@G9A_B1P1~MZ+|08iE!ub{@;BqF+~OvlP1J10Gx6n} z;{K5X^iyb&Z)Kjp6Z_TD9|N{*9d^~0cZUt!^4_p{{nUp0qf4((-}3&jK3hH*Hhjy6 z!@lpMHu$4TuRn?&8cB|8_*CqLpL^LKWGlG9Q)!QK`056}w1L=EvVZ77Y~ZhtEy=5F zS2gcPoAL~Yr)S8CA!Sw*7g=H_pRn8eyvu%qDfGvw^v46lC!DmtW3k}a&pO4!?vBOF zf%UI@;EO$MW*Iq<&e%ixNF1GmoX3%~*5Xg`+dJ;Gh1BiJq+eM3=DpaWR!&aY^C$cK zu))e@e_s>lH2=DQvsUQZM)p5wYTdlO)uJQqvL9@hm%X0hv+iEyNwUSvtm~!npW_?mHRYZ6ChM=i-Ct*1F0bI3#7ZE}kr6LpA--(~ zbLSHi{VPY1n-^Qz?Iln2K604~PFG5QU1Iw+?q|X=g#Ck!|wR$t(?4^9d^Q=2l_9$g;_whHC!oo#uqR8F249a_8;hcKfpHM8O#68 z3p&qjPn`A_cos6PG%sm~AETJWaLwO}&!sUx3nBiEyxL0bY%>(zW`7-zPmYzKHz0KbzvtBkE@MtBkf zXAvS;8#_W9KB9^o(OOi_Li@O+db_zccD0JiDSvfY;+UAzgZtijS8)gGwnJ;5<7b@6 zhUOUJ=4;sA0)MkjF{W^y0v>qbWh=DR(Uz_Ex;zs(hn9&RZahBnoa`5T7ad#HL!DFV z_q){fRjtnw!y&kTq#X3;%UPN8m&ol&e>UcD{}Q?NPmCDuw?%A0X1|&mr)P3MF>o*a z?z_YOL5q#&8(l7Z>1;TcQ${tD0Fm6L?jseNH4Yps4>x4IS8%sOGjuCxwr{t2hF_ zMX}HR5%8a2&sU4;_=hB0r*CCU`!6^Q>m~9hnam~H4Q$D9oa>ilJ z`H2y4o;UlZ)i0;)HREoqr+yz{PxizP^rKs zE4}bGlNb!rX2-@V-x%8I*jV-xf@d&gQu%G7A4}hyus3|L_?GW^13lE_PhUhmGnK3n zb#@Q;vPSf%%{RO})bl3q1wQ$<@}!RPejLxp51Wp!qNS&1e&gpGKi~NI#?5=ljU{y4 z0}YG5yUUR26y)s0O0D88WLn-OAm1A8lFaoR%H{IShigVV-$RBEjLr0r12X-C^$|L2 z-Md6@CG}Qw55>8L93f|9Z!K!sZD^z%>atHkq=^%GfJRRvx2B-Z>37RBjl)6fO{_T~4JCeE;r%kpvlF%O+l&itf- z{bl9TY@PM>1n7&m75W)#I@pP74*X5L1O6!u

    0qdgo+LW;_+KDxeSkBG5SmP*QU9^hv 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๤aGeJSA^>p>3a<0wK+M2_5y5qy97tJwNN}Au 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 Date: Thu, 27 Aug 2026 18:48:52 -0400 Subject: [PATCH 105/205] bpmpfw: disable SMMU for FW --- .../secmon_smc_register_access.cpp | 8 +-- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 68 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp index d42f6583..af04fa04 100644 --- a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp +++ b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp @@ -174,12 +174,12 @@ namespace ams::secmon::smc { /* This is "probably" to fuck with hackers who got access to the SMC and are trying to get control of the */ /* BPMP to exploit jamais vu, deja vu, or other related DMA/wake-from-sleep vulnerabilities. */ constexpr uintptr_t MC = MemoryRegionPhysicalDeviceMemoryController.GetAddress(); - SMC_R_UNLESS((address == (MC + MC_SMMU_AVPC_ASID) || address == (MC + MC_SMMU_PPCS1_ASID)), InvalidArgument); + // SMC_R_UNLESS((address == (MC + MC_SMMU_AVPC_ASID) || address == (MC + MC_SMMU_PPCS1_ASID)), InvalidArgument); - /* For backwards compatibility, we'll allow access to these devices on 1.0.0. */ - if (GetTargetFirmware() < TargetFirmware_2_0_0) { + // /* For backwards compatibility, we'll allow access to these devices on 1.0.0. */ + // if (GetTargetFirmware() < TargetFirmware_2_0_0) { virtual_address = MemoryRegionVirtualDeviceMemoryController.GetAddress() + (address - MC); - } + // } } /* Perform the read or write, if we should. */ diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 7c626409..4fe5003c 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -53,6 +53,32 @@ namespace bpmp { constexpr u32 ActmonGlbPeriodCtrlUsec = (1u << 8); constexpr u32 ActmonCopCtrlStockArmed = (1u << 31) | (1u << 30) | (1u << 18); + /* MC SMMU handling for the BPMP. */ + constexpr u64 McPhysBase = 0x70019000; + + constexpr u32 McSmmuTlbConfig = 0x014; + constexpr u32 McSmmuPtbAsid = 0x01C; + constexpr u32 McSmmuPtbData = 0x020; + constexpr u32 McSmmuTlbFlush = 0x030; + constexpr u32 McSmmuPtcFlush = 0x034; + constexpr u32 McSmmuAvpcAsid = 0x23C; + constexpr u32 McSmmuPpcs1Asid = 0x298; + + /* Page table is backed by the security engine's MMIO aperture. */ + constexpr u64 BpmpSmmuPdeBase = 0x70012000; + constexpr u32 BpmpSmmuAsid = 1; + + /* MC_SMMU_PTB_ASID */ + constexpr u32 SmmuPtbAsidCurrentAsid = BpmpSmmuAsid; /* [0:7] */ + + /* MC_SMMU_PTB_DATA */ + constexpr u32 SmmuPtbDataPdeMask = 0x7FFFFF; /* [0:22] */ + + /* MC_SMMU_AVPC_ASID / MC_SMMU_PPCS1_ASID */ + constexpr u32 SmmuClientSmmuEnableBit = (1u << 31); + constexpr u32 SmmuAvpcAsidValue = (SmmuClientSmmuEnableBit | BpmpSmmuAsid); + constexpr u32 SmmuPpcs1AsidValue = (SmmuClientSmmuEnableBit | BpmpSmmuAsid); + constexpr u32 EvpCopResetVector = 0x200; constexpr u32 EvpCopUndefVector = 0x204; constexpr u32 EvpCopSwiVector = 0x208; @@ -122,6 +148,43 @@ namespace bpmp { fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: BPMP timeout (cannot sleep)"); } + void EnableBpmpSmmu() { + /* Point the ASID page table at the security engine aperture. */ + const u32 pde_base = static_cast(BpmpSmmuPdeBase / 0x1000); + + /* Select the ASID and configure its page table entry. */ + SmcReadWriteRegister(McPhysBase + McSmmuPtbAsid, 0xFFFFFFFF, SmmuPtbAsidCurrentAsid); + SmcReadWriteRegister(McPhysBase + McSmmuPtbData, 0xFFFFFFFF, pde_base & SmmuPtbDataPdeMask); + + /* Route BPMP (AVPC) and PPCS1 through the SMMU. */ + SmcReadWriteRegister(McPhysBase + McSmmuAvpcAsid, 0xFFFFFFFF, SmmuAvpcAsidValue); + SmcReadWriteRegister(McPhysBase + McSmmuPpcs1Asid, 0xFFFFFFFF, SmmuPpcs1AsidValue); + + /* Flush the page table cache. */ + SmcReadWriteRegister(McPhysBase + McSmmuPtcFlush, 0xFFFFFFFF, 0); + SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); + + /* Flush the translation lookaside buffer. */ + SmcReadWriteRegister(McPhysBase + McSmmuTlbFlush, 0xFFFFFFFF, 0); + SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); + } + + void DisableBpmpSmmu() { + /* Clear the ASID page table. */ + SmcReadWriteRegister(McPhysBase + McSmmuPtbAsid, 0xFFFFFFFF, SmmuPtbAsidCurrentAsid); + SmcReadWriteRegister(McPhysBase + McSmmuPtbData, 0xFFFFFFFF, 0); + SmcReadWriteRegister(McPhysBase + McSmmuAvpcAsid, 0xFFFFFFFF, 0); + SmcReadWriteRegister(McPhysBase + McSmmuPpcs1Asid, 0xFFFFFFFF, 0); + + /* Flush the page table cache. */ + SmcReadWriteRegister(McPhysBase + McSmmuPtcFlush, 0xFFFFFFFF, 0); + SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); + + /* Flush the translation lookaside buffer. */ + SmcReadWriteRegister(McPhysBase + McSmmuTlbFlush, 0xFFFFFFFF, 0); + SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); + } + void RestoreStockState() { RequestBpmpExitAndWait(); @@ -140,6 +203,8 @@ namespace bpmp { Mmio(board::actmonVirtAddr, ActmonCopUpperWmark) = 0; Mmio(board::actmonVirtAddr, ActmonCopIntrStatus) = Mmio(board::actmonVirtAddr, ActmonCopIntrStatus); Mmio(board::actmonVirtAddr, ActmonCopCtrl) = ActmonCopCtrlStockArmed; + + EnableBpmpSmmu(); } void PscThreadFunc(void *) { @@ -194,6 +259,9 @@ namespace bpmp { fileUtils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx", fw_size, static_cast(FwIramPhysBase)); + /* Disable the SMMU so DRAM can be accessed */ + DisableBpmpSmmu(); + /* Set BPMP reset */ Mmio(board::clkVirtAddr, ClkRstRstDevLSet) = RstDevLCopRstBit; From 3352dffc3955de0eb0d51334048ea14bb93f1c2e Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 18:57:15 -0400 Subject: [PATCH 106/205] bpmpfw: cleanup makefile and split hpp/cpp --- Source/hoc-clk/bpmpfw/Makefile | 7 +- Source/hoc-clk/bpmpfw/source/actmon.cpp | 65 +++++++++++++++ Source/hoc-clk/bpmpfw/source/actmon.hpp | 43 +--------- Source/hoc-clk/bpmpfw/source/aotag.cpp | 43 ++++++++++ Source/hoc-clk/bpmpfw/source/aotag.hpp | 20 +---- Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp | 96 +++++++++++++++++++++++ Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp | 73 ++--------------- Source/hoc-clk/bpmpfw/source/freq.cpp | 61 ++++++++++++++ Source/hoc-clk/bpmpfw/source/freq.hpp | 39 +-------- Source/hoc-clk/bpmpfw/source/pllmb.cpp | 84 ++++++++++++++++++++ Source/hoc-clk/bpmpfw/source/pllmb.hpp | 60 +------------- Source/hoc-clk/bpmpfw/source/regs.cpp | 58 ++++++++++++++ Source/hoc-clk/bpmpfw/source/regs.hpp | 41 ++-------- Source/hoc-clk/bpmpfw/source/sensors.cpp | 29 +++++++ Source/hoc-clk/bpmpfw/source/sensors.hpp | 11 +-- 15 files changed, 464 insertions(+), 266 deletions(-) create mode 100644 Source/hoc-clk/bpmpfw/source/actmon.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/aotag.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/freq.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/pllmb.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/regs.cpp create mode 100644 Source/hoc-clk/bpmpfw/source/sensors.cpp diff --git a/Source/hoc-clk/bpmpfw/Makefile b/Source/hoc-clk/bpmpfw/Makefile index ddfe3882..b855a056 100644 --- a/Source/hoc-clk/bpmpfw/Makefile +++ b/Source/hoc-clk/bpmpfw/Makefile @@ -39,18 +39,23 @@ all: $(BIN_TARGET) $(BIN_TARGET): $(BUILDDIR)/$(TARGET).elf @mkdir -p $(OUTPUTDIR) - $(OBJCOPY) -S -O binary $< $@ + @echo "bpmpfw.bin" + @$(OBJCOPY) -S -O binary $< $@ $(BUILDDIR)/$(TARGET).elf: $(OBJS) + @echo "linking $(TARGET).elf" @$(CXX) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ $(BUILDDIR)/%.o: $(SOURCEDIR)/%.cpp | $(BUILDDIR) + @echo "$(notdir $<)" @$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ $(BUILDDIR)/libc/%.o: $(LIBCDIR)/src/%.c | $(BUILDDIR)/libc + @echo "$(notdir $<)" @$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ $(BUILDDIR)/%.o: $(SOURCEDIR)/%.s | $(BUILDDIR) + @echo "$(notdir $<)" @$(CXX) $(ASFLAGS) $(INCLUDE) -c $< -o $@ $(BUILDDIR): diff --git a/Source/hoc-clk/bpmpfw/source/actmon.cpp b/Source/hoc-clk/bpmpfw/source/actmon.cpp new file mode 100644 index 00000000..f6faa312 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/actmon.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "actmon.hpp" + +namespace actmon { + + u32 DevReg(ActmonDev dev, u32 off) { + return ActmonDevBase + (static_cast(dev) * ActmonDevSize) + off; + } + + void EnableDev(ActmonDev dev, u32 freqKhz, u32 weight) { + MMIO32(DevReg(dev, DevInitAvg)) = freqKhz * ActmonPeriodMs / 2; + MMIO32(DevReg(dev, DevCountWeight)) = weight; + MMIO32(DevReg(dev, DevCtrl)) = ActmonDevCtrlEnb | ActmonDevCtrlEnbPeriodic | ActmonDevCtrlKVal3; + } + + void Init() { + const u32 emcFreqKhz = static_cast(freq::MeasurePtoFreqHz(freq::ClkPtoEmc, 1) / 1000); + + if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMcallMonAct)) { + MMIO32(ActmonBase + ActmonGlbPeriodCtrl) = (ActmonPeriodMs - 1) & 0xFF; + EnableDev(DevMcAll, emcFreqKhz, 256 * 4); + } + + if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMccpuMonAct)) { + EnableDev(DevMcCpu, emcFreqKhz, 256 * 4); + } + } + + void Update(HocClkBpmpSharedInfo &info) { + const u32 emcFreqKhz = info.freqMem; + if (emcFreqKhz == 0) { + return; + } + + const u32 avgAll = MMIO32(DevReg(DevMcAll, DevAvgCount)); + const u32 avgCpu = MMIO32(DevReg(DevMcCpu, DevAvgCount)); + + // Get 1000 -> 100.0. + info.emcLoadAll = static_cast((static_cast(avgAll) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); + info.emcLoadCpu = static_cast((static_cast(avgCpu) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); + + info.emcBwAll = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadAll) / 1000000); + info.emcBwCpu = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadCpu) / 1000000); + + // Not 100% accurate but should be enough. + info.emcBwGpu = (info.emcBwAll > info.emcBwCpu) ? (info.emcBwAll - info.emcBwCpu) : 0; + } + +} // namespace actmon diff --git a/Source/hoc-clk/bpmpfw/source/actmon.hpp b/Source/hoc-clk/bpmpfw/source/actmon.hpp index 9a607c4e..42e935f6 100644 --- a/Source/hoc-clk/bpmpfw/source/actmon.hpp +++ b/Source/hoc-clk/bpmpfw/source/actmon.hpp @@ -53,47 +53,12 @@ namespace actmon { constexpr u32 DevCountWeight = 0x18; constexpr u32 DevAvgCount = 0x20; - inline u32 DevReg(ActmonDev dev, u32 off) { - return ActmonDevBase + (static_cast(dev) * ActmonDevSize) + off; - } + u32 DevReg(ActmonDev dev, u32 off); - inline void EnableDev(ActmonDev dev, u32 freqKhz, u32 weight) { - MMIO32(DevReg(dev, DevInitAvg)) = freqKhz * ActmonPeriodMs / 2; - MMIO32(DevReg(dev, DevCountWeight)) = weight; - MMIO32(DevReg(dev, DevCtrl)) = ActmonDevCtrlEnb | ActmonDevCtrlEnbPeriodic | ActmonDevCtrlKVal3; - } + void EnableDev(ActmonDev dev, u32 freqKhz, u32 weight); - inline void Init() { - const u32 emcFreqKhz = static_cast(freq::MeasurePtoFreqHz(freq::ClkPtoEmc, 1) / 1000); + void Init(); - if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMcallMonAct)) { - MMIO32(ActmonBase + ActmonGlbPeriodCtrl) = (ActmonPeriodMs - 1) & 0xFF; - EnableDev(DevMcAll, emcFreqKhz, 256 * 4); - } - - if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMccpuMonAct)) { - EnableDev(DevMcCpu, emcFreqKhz, 256 * 4); - } - } - - inline void Update(HocClkBpmpSharedInfo &info) { - const u32 emcFreqKhz = info.freqMem; - if (emcFreqKhz == 0) { - return; - } - - const u32 avgAll = MMIO32(DevReg(DevMcAll, DevAvgCount)); - const u32 avgCpu = MMIO32(DevReg(DevMcCpu, DevAvgCount)); - - // Get 1000 -> 100.0. - info.emcLoadAll = static_cast((static_cast(avgAll) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); - info.emcLoadCpu = static_cast((static_cast(avgCpu) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); - - info.emcBwAll = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadAll) / 1000000); - info.emcBwCpu = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadCpu) / 1000000); - - // Not 100% accurate but should be enough. - info.emcBwGpu = (info.emcBwAll > info.emcBwCpu) ? (info.emcBwAll - info.emcBwCpu) : 0; - } + void Update(HocClkBpmpSharedInfo &info); } // namespace actmon diff --git a/Source/hoc-clk/bpmpfw/source/aotag.cpp b/Source/hoc-clk/bpmpfw/source/aotag.cpp new file mode 100644 index 00000000..da71c08d --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/aotag.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2014 - 2017, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "aotag.hpp" + +namespace aotag { + + void Update(HocClkBpmpSharedInfo &info) { + const u32 regval = MMIO32(PmcBase + PmcTsensorStatus1); + + if (!(regval & Status1ValidBit)) { + info.tempAO = InvalidSentinel; + return; + } + + const u32 abs = (regval >> Status1AbsShift) & Status1AbsMask; + const bool frac = (regval & Status1FracBit) != 0; + const bool negative = (regval & Status1SignBit) != 0; + + s32 temp = static_cast(abs) * 1000 + (frac ? 500 : 0); + if (negative) { + temp = -temp; + } + + info.tempAO = temp; + } + +} // namespace aotag diff --git a/Source/hoc-clk/bpmpfw/source/aotag.hpp b/Source/hoc-clk/bpmpfw/source/aotag.hpp index 1e159139..25e18a0a 100644 --- a/Source/hoc-clk/bpmpfw/source/aotag.hpp +++ b/Source/hoc-clk/bpmpfw/source/aotag.hpp @@ -34,24 +34,6 @@ namespace aotag { constexpr s32 InvalidSentinel = -125; - inline void Update(HocClkBpmpSharedInfo &info) { - const u32 regval = MMIO32(PmcBase + PmcTsensorStatus1); - - if (!(regval & Status1ValidBit)) { - info.tempAO = InvalidSentinel; - return; - } - - const u32 abs = (regval >> Status1AbsShift) & Status1AbsMask; - const bool frac = (regval & Status1FracBit) != 0; - const bool negative = (regval & Status1SignBit) != 0; - - s32 temp = static_cast(abs) * 1000 + (frac ? 500 : 0); - if (negative) { - temp = -temp; - } - - info.tempAO = temp; - } + void Update(HocClkBpmpSharedInfo &info); } // namespace aotag diff --git a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp new file mode 100644 index 00000000..ad457560 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2019-2025 CTCaer + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "bpmp_mmu.hpp" + +namespace bpmpMmu { + + u32 AlignUp(u32 x, u32 a) { + return (x + a - 1) & ~(a - 1); + } + + u32 AlignDown(u32 x, u32 a) { + return x & ~(a - 1); + } + + void Maintenance(u32 op, bool force) { + if (!force && !(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { + return; + } + + MMIO32(CacheBase + IntClear) = IntMaintDone; + + // Blocking operation. + MMIO32(CacheBase + MaintReq) = MaintReqWayBitmapAll | op; + + while (!(MMIO32(CacheBase + IntRawEvent) & IntMaintDone)) + ; + + MMIO32(CacheBase + IntClear) = MMIO32(CacheBase + IntRawEvent); + } + + void SetEntry(u32 idx, const MmuEntry &entry) { + MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x0) = AlignUp(entry.startAddr, CacheLineSize); + MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x4) = AlignDown(entry.endAddr, CacheLineSize); + MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x8) = entry.attr; + + MMIO32(CacheBase + MmuShadowCopyMask) |= (1u << idx); + } + + void Enable() { + if (MMIO32(CacheBase + CacheConfig) & CfgEnableCache) { + return; + } + + // Init BPMP MMU. + MMIO32(CacheBase + MmuCmd) = MmuCmdInit; + MMIO32(CacheBase + MmuFallbackEntry) = MmuEnRead | MmuEnWrite | MmuEnExec; // RWX for non-defined regions. + MMIO32(CacheBase + MmuCfg) = MmuCfgSeqEn | MmuCfgTlbEn | MmuCfgAbortStoreLast; + + // Init BPMP MMU entries. + MMIO32(CacheBase + MmuShadowCopyMask) = 0; + for (u32 idx = 0; idx < sizeof(Entries) / sizeof(Entries[0]); idx++) { + SetEntry(idx, Entries[idx]); + } + + MMIO32(CacheBase + MmuCmd) = MmuCmdCopyShadow; + + // Invalidate cache. + Maintenance(MaintInvalidWay, true); + + // Enable cache. + MMIO32(CacheBase + CacheConfig) = CfgEnableCache | CfgForceWriteThrough | + (TagModeParallel << CfgMmuTagModeShift) | CfgTagChkAbrtOnErr; + + // HW bug. Invalidate cache again. + Maintenance(MaintInvalidWay, false); + } + + void Disable() { + if (!(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { + return; + } + + // Clean and invalidate cache. + Maintenance(MaintCleanInvalidWay, false); + + // Disable cache. + MMIO32(CacheBase + CacheConfig) = 0; + } + +} // namespace bpmpMmu diff --git a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp index ca106eb8..9e4f2ea9 100644 --- a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp +++ b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp @@ -77,76 +77,15 @@ namespace bpmpMmu { { IramBase, IramEnd, MmuEnRead | MmuEnWrite | MmuEnExec | MmuEnCached }, }; - inline u32 AlignUp(u32 x, u32 a) { - return (x + a - 1) & ~(a - 1); - } - inline u32 AlignDown(u32 x, u32 a) { - return x & ~(a - 1); - } + u32 AlignUp(u32 x, u32 a); + u32 AlignDown(u32 x, u32 a); - inline void Maintenance(u32 op, bool force) { - if (!force && !(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { - return; - } + void Maintenance(u32 op, bool force); - MMIO32(CacheBase + IntClear) = IntMaintDone; + void SetEntry(u32 idx, const MmuEntry &entry); - // Blocking operation. - MMIO32(CacheBase + MaintReq) = MaintReqWayBitmapAll | op; + void Enable(); - while (!(MMIO32(CacheBase + IntRawEvent) & IntMaintDone)) - ; - - MMIO32(CacheBase + IntClear) = MMIO32(CacheBase + IntRawEvent); - } - - inline void SetEntry(u32 idx, const MmuEntry &entry) { - MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x0) = AlignUp(entry.startAddr, CacheLineSize); - MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x4) = AlignDown(entry.endAddr, CacheLineSize); - MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x8) = entry.attr; - - MMIO32(CacheBase + MmuShadowCopyMask) |= (1u << idx); - } - - inline void Enable() { - if (MMIO32(CacheBase + CacheConfig) & CfgEnableCache) { - return; - } - - // Init BPMP MMU. - MMIO32(CacheBase + MmuCmd) = MmuCmdInit; - MMIO32(CacheBase + MmuFallbackEntry) = MmuEnRead | MmuEnWrite | MmuEnExec; // RWX for non-defined regions. - MMIO32(CacheBase + MmuCfg) = MmuCfgSeqEn | MmuCfgTlbEn | MmuCfgAbortStoreLast; - - // Init BPMP MMU entries. - MMIO32(CacheBase + MmuShadowCopyMask) = 0; - for (u32 idx = 0; idx < sizeof(Entries) / sizeof(Entries[0]); idx++) { - SetEntry(idx, Entries[idx]); - } - - MMIO32(CacheBase + MmuCmd) = MmuCmdCopyShadow; - - // Invalidate cache. - Maintenance(MaintInvalidWay, true); - - // Enable cache. - MMIO32(CacheBase + CacheConfig) = CfgEnableCache | CfgForceWriteThrough | - (TagModeParallel << CfgMmuTagModeShift) | CfgTagChkAbrtOnErr; - - // HW bug. Invalidate cache again. - Maintenance(MaintInvalidWay, false); - } - - inline void Disable() { - if (!(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { - return; - } - - // Clean and invalidate cache. - Maintenance(MaintCleanInvalidWay, false); - - // Disable cache. - MMIO32(CacheBase + CacheConfig) = 0; - } + void Disable(); } // namespace bpmpMmu diff --git a/Source/hoc-clk/bpmpfw/source/freq.cpp b/Source/hoc-clk/bpmpfw/source/freq.cpp new file mode 100644 index 00000000..de97caaf --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/freq.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "freq.hpp" + +namespace freq { + + u64 MeasurePtoFreqHz(u32 srcId, u32 multiplier) { + constexpr u32 win = 16; + constexpr u32 osc = 32768; + + const u32 val = (srcId << PtoSrcSelShift) | PtoDivSelDiv1 | PtoClkEnable | (win - 1); + + MMIO32(CarBase + CarPtoClkCntCntl) = val; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntRst; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + MMIO32(CarBase + CarPtoClkCntCntl) = val; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntEn; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep((1000000u * win / osc) + 12 + 2); // 502us + + while (MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntBusy) + ; + + const u32 cnt = MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntMask; + + MMIO32(CarBase + CarPtoClkCntCntl) = 0; + (void)MMIO32(CarBase + CarPtoClkCntCntl); + usleep(2); + + return (static_cast(cnt) * multiplier * osc) / win; + } + + void Update(HocClkBpmpSharedInfo &info) { + info.freqMem = static_cast(MeasurePtoFreqHz(ClkPtoEmc, 1) / 1000); + info.freqCpu = static_cast(MeasurePtoFreqHz(ClkPtoCclkGDiv2, 2) / 1000); + } + +} // namespace freq diff --git a/Source/hoc-clk/bpmpfw/source/freq.hpp b/Source/hoc-clk/bpmpfw/source/freq.hpp index eea8e9a4..95c24c65 100644 --- a/Source/hoc-clk/bpmpfw/source/freq.hpp +++ b/Source/hoc-clk/bpmpfw/source/freq.hpp @@ -37,43 +37,8 @@ namespace freq { constexpr u32 ClkPtoCclkGDiv2 = 0x13; constexpr u32 ClkPtoEmc = 0x24; - inline u64 MeasurePtoFreqHz(u32 srcId, u32 multiplier) { - constexpr u32 win = 16; - constexpr u32 osc = 32768; + u64 MeasurePtoFreqHz(u32 srcId, u32 multiplier); - const u32 val = (srcId << PtoSrcSelShift) | PtoDivSelDiv1 | PtoClkEnable | (win - 1); - - MMIO32(CarBase + CarPtoClkCntCntl) = val; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntRst; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - MMIO32(CarBase + CarPtoClkCntCntl) = val; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntEn; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep((1000000u * win / osc) + 12 + 2); // 502us - - while (MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntBusy) - ; - - const u32 cnt = MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntMask; - - MMIO32(CarBase + CarPtoClkCntCntl) = 0; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - return (static_cast(cnt) * multiplier * osc) / win; - } - - inline void Update(HocClkBpmpSharedInfo &info) { - info.freqMem = static_cast(MeasurePtoFreqHz(ClkPtoEmc, 1) / 1000); - info.freqCpu = static_cast(MeasurePtoFreqHz(ClkPtoCclkGDiv2, 2) / 1000); - } + void Update(HocClkBpmpSharedInfo &info); } // namespace freq diff --git a/Source/hoc-clk/bpmpfw/source/pllmb.cpp b/Source/hoc-clk/bpmpfw/source/pllmb.cpp new file mode 100644 index 00000000..559e149e --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/pllmb.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) Souldbminer + * Copyright (c) KazushiMe + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "pllmb.hpp" + +namespace pllmb { + + u64 MeasurePtoHz(u32 ptoId, u32 divider, u32 preselReg, u32 preselMask) { + u32 preselOrigBit = 0; + + if (preselReg) { + u32 val = MMIO32(freq::CarBase + preselReg); + usleep(10); + preselOrigBit = val & preselMask; + val &= ~preselMask; + val |= preselMask; + MMIO32(freq::CarBase + preselReg) = val; + usleep(10); + } + + constexpr u32 cycleCount = 16; + const u32 savedCntl = MMIO32(freq::CarBase + freq::CarPtoClkCntCntl); + + u32 val = freq::PtoDivSelDiv1 | freq::PtoClkEnable | (cycleCount - 1); + val |= ptoId << freq::PtoSrcSelShift; + + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntRst; + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntEn; + usleep(500); + + while (MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & PtoCyclePeriod) + ; + + u32 cnt = MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & freq::PtoClkCntMask; + cnt *= divider; + + const u64 rateHz = (static_cast(cnt) * 32768) / cycleCount; + + usleep(10); + MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = savedCntl; + usleep(10); + + if (preselReg) { + u32 val2 = MMIO32(freq::CarBase + preselReg); + usleep(10); + val2 &= ~preselMask; + val2 |= preselOrigBit; + MMIO32(freq::CarBase + preselReg) = val2; + usleep(10); + } + + return rateHz; + } + + u64 MeasureRamClockHz() { + const u64 pllmbHz = MeasurePtoHz(PtoPllmb, 2, PllmMisc2, PllmMisc2PllmbBit); + if (pllmbHz != 0) { + return pllmbHz; + } + return MeasurePtoHz(PtoPllm, 2, PllmMisc2, PllmMisc2PllmBit); + } + +} // namespace pllmb diff --git a/Source/hoc-clk/bpmpfw/source/pllmb.hpp b/Source/hoc-clk/bpmpfw/source/pllmb.hpp index 706b2993..5e296b76 100644 --- a/Source/hoc-clk/bpmpfw/source/pllmb.hpp +++ b/Source/hoc-clk/bpmpfw/source/pllmb.hpp @@ -32,64 +32,8 @@ namespace pllmb { constexpr u32 PtoCyclePeriod = (1u << 31); // PTO_CLK_CNT_STATUS busy bit - inline u64 MeasurePtoHz(u32 ptoId, u32 divider, u32 preselReg, u32 preselMask) { - u32 preselOrigBit = 0; + u64 MeasurePtoHz(u32 ptoId, u32 divider, u32 preselReg, u32 preselMask); - if (preselReg) { - u32 val = MMIO32(freq::CarBase + preselReg); - usleep(10); - preselOrigBit = val & preselMask; - val &= ~preselMask; - val |= preselMask; - MMIO32(freq::CarBase + preselReg) = val; - usleep(10); - } - - constexpr u32 cycleCount = 16; - const u32 savedCntl = MMIO32(freq::CarBase + freq::CarPtoClkCntCntl); - - u32 val = freq::PtoDivSelDiv1 | freq::PtoClkEnable | (cycleCount - 1); - val |= ptoId << freq::PtoSrcSelShift; - - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntRst; - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntEn; - usleep(500); - - while (MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & PtoCyclePeriod) - ; - - u32 cnt = MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & freq::PtoClkCntMask; - cnt *= divider; - - const u64 rateHz = (static_cast(cnt) * 32768) / cycleCount; - - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = savedCntl; - usleep(10); - - if (preselReg) { - u32 val2 = MMIO32(freq::CarBase + preselReg); - usleep(10); - val2 &= ~preselMask; - val2 |= preselOrigBit; - MMIO32(freq::CarBase + preselReg) = val2; - usleep(10); - } - - return rateHz; - } - - inline u64 MeasureRamClockHz() { - const u64 pllmbHz = MeasurePtoHz(PtoPllmb, 2, PllmMisc2, PllmMisc2PllmbBit); - if (pllmbHz != 0) { - return pllmbHz; - } - return MeasurePtoHz(PtoPllm, 2, PllmMisc2, PllmMisc2PllmBit); - } + u64 MeasureRamClockHz(); } // namespace pllmb diff --git a/Source/hoc-clk/bpmpfw/source/regs.cpp b/Source/hoc-clk/bpmpfw/source/regs.cpp new file mode 100644 index 00000000..3b80f9af --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/regs.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "regs.hpp" + +[[maybe_unused]] void usleep(u32 us) { + while (us) { + const u32 delay = (us > HaltMaxCnt) ? HaltMaxCnt : us; + us -= delay; + MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | delay; + } +} + +[[maybe_unused]] void msleep(u32 ms) { + while (ms) { + const u32 delay = (ms > HaltMaxCnt) ? HaltMaxCnt : ms; + ms -= delay; + MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltMsec | delay; + } +} + +void UartPutc(char c) { + while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) + ; + MMIO32(UartBBase + UartThr) = static_cast(static_cast(c)); +} + +void UartFlush() { + while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) + ; +} + +void UartPuts(const char *s) { + while (*s) { + UartPutc(*s++); + } +} + +void UartPutHex32(u32 v) { + static const char digits[] = "0123456789ABCDEF"; + for (int i = 28; i >= 0; i -= 4) { + UartPutc(digits[(v >> i) & 0xF]); + } +} diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index b287c27b..9e0b1d9c 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -33,20 +33,8 @@ constexpr u32 HaltMsec = (1u << 24); constexpr u32 HaltUsec = (1u << 25); constexpr u32 HaltMaxCnt = 0xFF; -[[maybe_unused]] inline void usleep(u32 us) { - while (us) { - const u32 delay = (us > HaltMaxCnt) ? HaltMaxCnt : us; - us -= delay; - MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | delay; - } -} -[[maybe_unused]] inline void msleep(u32 ms) { - while (ms) { - const u32 delay = (ms > HaltMaxCnt) ? HaltMaxCnt : ms; - ms -= delay; - MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltMsec | delay; - } -} +[[maybe_unused]] void usleep(u32 us); +[[maybe_unused]] void msleep(u32 ms); constexpr u32 TmrBase = 0x60005000; constexpr u32 TimerUsCntr1Us = 0x10; @@ -57,27 +45,10 @@ constexpr u32 UartLsr = 0x14; constexpr u32 UartLsrThre = (1u << 5); constexpr u32 UartLsrTmty = (1u << 6); -inline void UartPutc(char c) { - while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) - ; - MMIO32(UartBBase + UartThr) = static_cast(static_cast(c)); -} +void UartPutc(char c); -// Waits for the byte to be fully transmitted -inline void UartFlush() { - while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) - ; -} +void UartFlush(); -inline void UartPuts(const char *s) { - while (*s) { - UartPutc(*s++); - } -} +void UartPuts(const char *s); -inline void UartPutHex32(u32 v) { - static const char digits[] = "0123456789ABCDEF"; - for (int i = 28; i >= 0; i -= 4) { - UartPutc(digits[(v >> i) & 0xF]); - } -} +void UartPutHex32(u32 v); diff --git a/Source/hoc-clk/bpmpfw/source/sensors.cpp b/Source/hoc-clk/bpmpfw/source/sensors.cpp new file mode 100644 index 00000000..bd2af778 --- /dev/null +++ b/Source/hoc-clk/bpmpfw/source/sensors.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "sensors.hpp" + +s32 TranslateSocthermTemp(u16 val) { + s32 t = ((val >> 8) & 0xFF) * 1000; + if (val & (1u << 7)) { + t += 500; + } + if (val & (1u << 0)) { + t = -t; + } + return t; +} diff --git a/Source/hoc-clk/bpmpfw/source/sensors.hpp b/Source/hoc-clk/bpmpfw/source/sensors.hpp index 64aad219..1c101a5d 100644 --- a/Source/hoc-clk/bpmpfw/source/sensors.hpp +++ b/Source/hoc-clk/bpmpfw/source/sensors.hpp @@ -22,13 +22,4 @@ constexpr u32 SocthermBase = 0x700E2000; constexpr u32 SocthermSensorTemp1 = 0x1C8; constexpr u32 SocthermSensorTemp2 = 0x1CC; -inline s32 TranslateSocthermTemp(u16 val) { - s32 t = ((val >> 8) & 0xFF) * 1000; - if (val & (1u << 7)) { - t += 500; - } - if (val & (1u << 0)) { - t = -t; - } - return t; -} +s32 TranslateSocthermTemp(u16 val); From 50ff965a6fec2da17be1f18864e773e05d61a6f4 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 18:57:40 -0400 Subject: [PATCH 107/205] remove hocmon --- .../.gitignore | 10 - .../Horizon-OC-Monitor.lst | 2 - .../Horizon-OC-Monitor (deprecated)/LICENSE | 339 --- .../Horizon-OC-Monitor (deprecated)/Makefile | 243 -- .../Horizon-OC-Monitor (deprecated)/README.md | 9 - .../config/status-monitor/config.ini.template | 127 - .../docs/config.md | 103 - .../docs/modes.md | 252 -- .../include/Battery.hpp | 81 - .../include/Misc.hpp | 41 - .../include/SaltyNX.h | 231 -- .../include/audsnoop.h | 19 - .../include/i2c.h | 77 - .../include/ipc.h | 755 ----- .../include/max17050.h | 165 -- .../include/pcv_types.h | 41 - .../include/pwm.h | 22 - .../include/rgltr.h | 19 - .../include/rgltr_services.h | 29 - .../include/tmp451.h | 103 - .../lang/de.json | 189 -- .../lang/en.json | 189 -- .../lang/es.json | 189 -- .../lang/fr.json | 189 -- .../lang/it.json | 189 -- .../lang/ja.json | 189 -- .../lang/ko.json | 189 -- .../lang/nl.json | 189 -- .../lang/pl.json | 189 -- .../lang/pt.json | 189 -- .../lang/ru.json | 189 -- .../lang/uk.json | 189 -- .../lang/zh-cn.json | 189 -- .../lang/zh-tw.json | 189 -- .../config/status-monitor/config.ini.template | 127 - .../source/Utils.hpp | 2538 ----------------- .../source/audsnoop.c | 35 - .../source/main.cpp | 1164 -------- .../source/modes/Battery.hpp | 220 -- .../source/modes/Configurator.hpp | 2290 --------------- .../source/modes/FPS_Counter.hpp | 525 ---- .../source/modes/FPS_Graph.hpp | 757 ----- .../source/modes/Full.hpp | 727 ----- .../source/modes/Micro.hpp | 1300 --------- .../source/modes/Mini.hpp | 1853 ------------ .../source/modes/Misc.hpp | 189 -- .../source/modes/Resolutions.hpp | 581 ---- .../source/pwm.c | 35 - .../source/rgltr_services.cpp | 43 - .../source/sysclk_ipc.c | 169 -- 50 files changed, 17867 deletions(-) delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/.gitignore delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/Horizon-OC-Monitor.lst delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/LICENSE delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/Makefile delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/README.md delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/config/status-monitor/config.ini.template delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/docs/config.md delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/docs/modes.md delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/Battery.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/Misc.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/SaltyNX.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/audsnoop.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/i2c.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/ipc.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/max17050.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/pcv_types.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/pwm.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/rgltr.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/rgltr_services.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/include/tmp451.h delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/de.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/en.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/es.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/fr.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/it.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/ja.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/ko.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/nl.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/pl.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/pt.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/ru.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/uk.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/zh-cn.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/lang/zh-tw.json delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/out/config/status-monitor/config.ini.template delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/Utils.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/audsnoop.c delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/main.cpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Battery.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Configurator.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Counter.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Graph.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Full.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Micro.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Mini.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Misc.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/modes/Resolutions.hpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/pwm.c delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/rgltr_services.cpp delete mode 100644 Source/Horizon-OC-Monitor (deprecated)/source/sysclk_ipc.c diff --git a/Source/Horizon-OC-Monitor (deprecated)/.gitignore b/Source/Horizon-OC-Monitor (deprecated)/.gitignore deleted file mode 100644 index 3e35c18f..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ - -build/ - -*.ovl - -*.elf - -*.nacp - -*.nro diff --git a/Source/Horizon-OC-Monitor (deprecated)/Horizon-OC-Monitor.lst b/Source/Horizon-OC-Monitor (deprecated)/Horizon-OC-Monitor.lst deleted file mode 100644 index 1a834f7f..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/Horizon-OC-Monitor.lst +++ /dev/null @@ -1,2 +0,0 @@ --CSn -/home/sould/Documents/GitHub/Horizon-OC/Source/Horizon-OC-Monitor/Horizon-OC-Monitor.elf diff --git a/Source/Horizon-OC-Monitor (deprecated)/LICENSE b/Source/Horizon-OC-Monitor (deprecated)/LICENSE deleted file mode 100644 index d159169d..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/Source/Horizon-OC-Monitor (deprecated)/Makefile b/Source/Horizon-OC-Monitor (deprecated)/Makefile deleted file mode 100644 index e2e4776b..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/Makefile +++ /dev/null @@ -1,243 +0,0 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- - -ifeq ($(strip $(DEVKITPRO)),) -$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") -endif - -TOPDIR ?= $(CURDIR) -include $(DEVKITPRO)/libnx/switch_rules - -#--------------------------------------------------------------------------------- -# TARGET is the name of the output -# BUILD is the directory where object files & intermediate files will be placed -# SOURCES is a list of directories containing source code -# DATA is a list of directories containing data files -# INCLUDES is a list of directories containing header files -# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) -# -# NO_ICON: if set to anything, do not use icon. -# NO_NACP: if set to anything, no .nacp file is generated. -# APP_TITLE is the name of the app stored in the .nacp file (Optional) -# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) -# APP_VERSION is the version of the app stored in the .nacp file (Optional) -# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) -# ICON is the filename of the icon (.jpg), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .jpg -# - icon.jpg -# - /default_icon.jpg -# -# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .json -# - config.json -# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead -# of a homebrew executable (.nro). This is intended to be used for sysmodules. -# NACP building is skipped as well. -#--------------------------------------------------------------------------------- -APP_TITLE := Horizon OC Monitor -APP_VERSION := 1.3.2+r4-hoc-r4 -TARGET := $(notdir $(CURDIR)) -BUILD := build -SOURCES := source -INCLUDES := include lib/Atmosphere-libs/libstratosphere/source/dmnt lib/Atmosphere-libs/libstratosphere/source ../hoc-clk/common/include/ -NO_ICON := 1 -#ROMFS := romfs - -# This location should reflect where you place the libultrahand directory (lib can vary between projects). -include ${TOPDIR}/lib/libultrahand/ultrahand.mk - - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv8-a+simd+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE - -CFLAGS := -g -Wall -Wno-address-of-packed-member -O3 -ffunction-sections -ffast-math -flto -fomit-frame-pointer \ - -fuse-linker-plugin -finline-small-functions \ - -fno-strict-aliasing -frename-registers -falign-functions=16 \ - $(ARCH) $(DEFINES) - -# For compiling Ultrahand Overlay only -IS_STATUS_MONITOR_DIRECTIVE := 1 -CFLAGS += -DIS_STATUS_MONITOR_DIRECTIVE=$(IS_STATUS_MONITOR_DIRECTIVE) - -# Enable appearance overriding -export MSYS2_ARG_CONV_EXCL := -DUI_OVERRIDE_PATH -UI_OVERRIDE_PATH := /config/status-monitor/ -CFLAGS += -DUI_OVERRIDE_PATH="\"$(UI_OVERRIDE_PATH)\"" - - -CFLAGS += $(INCLUDE) -D__SWITCH__ -DAPP_VERSION="\"$(APP_VERSION)\"" - -CXXFLAGS := $(CFLAGS) -std=c++26 -Wno-dangling-else -fno-unwind-tables -fno-asynchronous-unwind-tables - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) - -LIBS := -lnx - -CXXFLAGS += -fno-exceptions -ffunction-sections -fdata-sections -fno-rtti -LDFLAGS += -Wl,--gc-sections -Wl,--as-needed - - -# For Ensuring Parallel LTRANS Jobs w/ GCC, make -j6 -CXXFLAGS += -flto -fuse-linker-plugin -flto=6 -LDFLAGS += -flto=6 - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(PORTLIBS) $(LIBNX) - - -#--------------------------------------------------------------------------------- -# no real need to edit anything past this point unless you need to add additional -# rules for different file extensions -#--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - -export OUTPUT := $(CURDIR)/$(TARGET) -export TOPDIR := $(CURDIR) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) - -export DEPSDIR := $(CURDIR)/$(BUILD) - -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES_BIN := $(addsuffix .o,$(BINFILES)) -export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export OFILES := $(OFILES_BIN) $(OFILES_SRC) -export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) - -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) - -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) - -ifeq ($(strip $(CONFIG_JSON)),) - jsons := $(wildcard *.json) - ifneq (,$(findstring $(TARGET).json,$(jsons))) - export APP_JSON := $(TOPDIR)/$(TARGET).json - else - ifneq (,$(findstring config.json,$(jsons))) - export APP_JSON := $(TOPDIR)/config.json - endif - endif -else - export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) -endif - -ifeq ($(strip $(ICON)),) - icons := $(wildcard *.jpg) - ifneq (,$(findstring $(TARGET).jpg,$(icons))) - export APP_ICON := $(TOPDIR)/$(TARGET).jpg - else - ifneq (,$(findstring icon.jpg,$(icons))) - export APP_ICON := $(TOPDIR)/icon.jpg - endif - endif -else - export APP_ICON := $(TOPDIR)/$(ICON) -endif - -ifeq ($(strip $(NO_ICON)),) - export NROFLAGS += --icon=$(APP_ICON) -endif - -ifeq ($(strip $(NO_NACP)),) - export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp -endif - -ifneq ($(APP_TITLEID),) - export NACPFLAGS += --titleid=$(APP_TITLEID) -endif - -ifneq ($(ROMFS),) - export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) -endif - -.PHONY: $(BUILD) clean all - -#--------------------------------------------------------------------------------- -all: $(BUILD) - - -$(BUILD): - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile - @rm -rf out/ - @mkdir -p out/switch/.overlays/ - @cp -a $(CURDIR)/config out/ - @cp $(CURDIR)/$(TARGET).ovl out/switch/.overlays/$(TARGET).ovl - -#--------------------------------------------------------------------------------- -clean: - @echo "Cleanning ... $(TARGET)" - @rm -fr $(BUILD) $(TARGET).ovl $(TARGET).nro $(TARGET).nacp $(TARGET).elf - @rm -rf out/ - @rm -f $(TARGET).zip - -#--------------------------------------------------------------------------------- -dist: all - @echo making dist ... - @rm -f $(TARGET).zip - @cd out; zip -r ../$(TARGET).zip ./*; cd ../ -#--------------------------------------------------------------------------------- -else -.PHONY: all - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -all : $(OUTPUT).ovl - -$(OUTPUT).ovl : $(OUTPUT).elf $(OUTPUT).nacp - @elf2nro $< $@ $(NROFLAGS) - @echo "built ... $(notdir $(OUTPUT).ovl)" - @printf 'ULTR' >> $@ - @printf "Ultrahand signature has been added.\n" - -$(OUTPUT).elf : $(OFILES) - -$(OFILES_SRC) : $(HFILES_BIN) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o %_bin.h : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- diff --git a/Source/Horizon-OC-Monitor (deprecated)/README.md b/Source/Horizon-OC-Monitor (deprecated)/README.md deleted file mode 100644 index 234e0d02..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Thanks to NaGa for Status Monitor Pro!

    - -**Horizon-OC-Monitor is deprecated.** If you want to compile it anyway, create a `lib` folder and clone Atmosphere-libs and libultrahand into it:

    - -```bash -mkdir lib -git clone https://github.com/Atmosphere-NX/Atmosphere-libs lib/Atmosphere-libs -git clone https://github.com/ppkantorski/libultrahand lib/libultrahand -``` diff --git a/Source/Horizon-OC-Monitor (deprecated)/config/status-monitor/config.ini.template b/Source/Horizon-OC-Monitor (deprecated)/config/status-monitor/config.ini.template deleted file mode 100644 index a11d524b..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/config/status-monitor/config.ini.template +++ /dev/null @@ -1,127 +0,0 @@ -[status-monitor] -battery_avg_iir_filter=false -battery_time_left_refreshrate=60 -average_gpu_load=false -use_old_fps_average=false - -[full] -refresh_rate=1 -layer_width_align=left -show_real_freqs=true -show_deltas=true -show_target_freqs=true -show_fps=true -show_res=true -show_read_speed=true -use_dynamic_colors=true -disable_screenshots=false -separator_color=#888F -cat_color_1=#8FFF -cat_color_2=#8CFF -text_color=#FFFF - -[mini] -refresh_rate=1 -handheld_font_size=15 -docked_font_size=15 -spacing=8 -real_freqs=true -real_volts=true -show_full_cpu=false -show_full_res=true -show_fan_percentage=true -show_soc_voltage=false -use_dynamic_colors=true -show_vddq=false -show_vdd2=true -decimal_vdd2=false -show_dtc=true -use_dtc_symbol=true -dtc_format=%m-%d-%Y%H:%M:%S -show=DTC+BAT+CPU+GPU+RAM+TMP+FPS+RES -replace_MB_with_RAM_load=true -show_RAM_load_CPU_GPU=false -invert_battery_display=true -disable_screenshots=false -sleep_exit=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -separator_color=#888F -cat_color=#2DFF -text_color=#FFFF - -[micro] -refresh_rate=1 -layer_height_align=top -handheld_font_size=15 -docked_font_size=15 -text_align=center -real_freqs=true -real_volts=true -show_full_cpu=false -show_full_res=false -show_soc_voltage=true -use_dynamic_colors=true -show_vddq=false -show_vdd2=true -decimal_vdd2=false -show_dtc=true -use_dtc_symbol=true -dtc_format=%H:%M:%S -show=FPS+CPU+GPU+RAM+SOC+BAT+DTC -replace_GB_with_RAM_load=true -invert_battery_display=false -disable_screenshots=false -sleep_exit=false -background_color=#0009 -separator_color=#888F -cat_color=#2DFF -text_color=#FFFF - -[fps-counter] -refresh_rate=30 -handheld_font_size=40 -docked_font_size=40 -use_integer_counter=false -disable_screenshots=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -text_color=#8CFF - -[fps-graph] -refresh_rate=30 -show_info=false -use_dynamic_colors=true -disable_screenshots=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -fps_counter_color=#888C -border_color=#2DFF -dashed_line_color=#8888 -main_line_color=#FFFF -rounded_line_color=#F0FF -perfect_line_color=#0C0F -max_fps_text_color=#FFFF -min_fps_text_color=#FFFF -text_color=#FFFF -cat_color=#0F0F - -[game_resolutions] -refresh_rate=10 -disable_screenshots=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -cat_color=#8FFF -text_color=#FFFF diff --git a/Source/Horizon-OC-Monitor (deprecated)/docs/config.md b/Source/Horizon-OC-Monitor (deprecated)/docs/config.md deleted file mode 100644 index e01b8466..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/docs/config.md +++ /dev/null @@ -1,103 +0,0 @@ -# Configuration file - -Configuration file is in `sdmc:/config/status-monitor/`. By default it's named `config.ini.template`. To be detected by overlay it must be renamed to `config.ini`. - ---- - -Explanation of what each setting does.
    -Colors are provided in RGBA4444 format, which means that each character represents different channel: red, green, blue, alpha. - -> [status-monitor] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `key_combo` | Buttons combination that allows exiting Full, Mini, Micro, FPS Graph and FPS Counter modes; max 4 buttons, otherwise next buttons will be ignored. Combine different buttons with `+` | `A`, `B`, `X`, `Y`, `L`, `R`, `ZL`, `ZR`, `PLUS`, `MINUS`, `DUP`, `DDOWN`, `DLEFT`, `DRIGHT`, `SL`, `SR`, `LSTICK`, `RSTICK`, `UP`, `DOWN`, `LEFT`, `RIGHT` | `L+DDOWN+RSTICK` | -| `battery_avg_iir_filter` | Read voltage + current averages directly from fuel gauge, that uses infinite impulse response filter | `true`, `false` | `false` | -| `battery_time_left_refreshrate` | How many seconds must pass to refresh Battery Remaining Time | from `1` to `60` | `60` | -| `average_gpu_load` | Average 5 last GPU load readings. Because GPU load by design shows only load for last 1/60s, this option allows for more accurate gpu load readings at the cost of slight bump in CPU Core #3 usage (from 2 to 4 percentage points depending on CPU clock). | `true`, `false` | `false` | -| `font_cache` | Allow caching generated glyphs for better performance. Cache is cleaned up when moving between modes. | `true`, `false` | `true` | - - -> [full] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `refresh_rate` | How often per second this mode should be refreshed. Higher value means higher CPU Core #3 usage, that's why it is recommended to stay at 1. | From `1` to `60` | `1` | -| `layer_width_align` | On which side of the screen X axis you want this mode | `left`, `right` | `left` | -| `show_real_freqs` | This works only if you have sys-clk 2.0.0_rc4+ installed. Show real frequencies for CPU, GPU and RAM | `false`, `true` | `true` | -| `show_deltas` | This works only if you have sys-clk 2.0.0_rc4+ installed. Show difference for CPU, GPU and RAM between target frequencies and real frequencies. They are not showed if both keys `show_real_freqs` and `show_target_freqs` are set to `false` | `false`, `true` | `true` | -| `show_target_freqs` | Show target frequencies for CPU, GPU and RAM | `false`, `true` | `true` | -| `show_fps` | Show game's FPS and PFPS | `false`, `true` | `true` | -| `show_res` | Show game's 2 best candidates for internal resolution, it won't show when game is not using NVN | `false`, `true` | `true` | -| `show_read_speed` | Show game's read speed per second | `false`, `true` | `true` | - -> [mini] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `refresh_rate` | How often per second this mode should be refreshed. Higher value means higher CPU Core #3 usage, that's why it is recommended to stay at 1. | From `1` to `60` | `1` | -| `layer_width_align` | On which side of the screen X axis you want this mode | `left`, `center`, `right` | `left` | -| `layer_height_align` | On which side of the screen Y axis you want this mode | `top`, `center`, `bottom` | `top` | -| `handheld_font_size` | How big should be rendered text in handheld mode | From `8` to `22` | `15` | -| `docked_font_size` | How big should be rendered text in docked mode | From `8` to `22` | `15` | -| `real_freqs` | This works only if you have sys-clk 2.0.0_rc4+ installed. It shows real frequencies for CPU, GPU and RAM instead of target frequencies | `true`, `false` | `false` | -| `show` | Which data should be rendered. Connect different stats with `+` in any order. | `CPU`, `GPU`, `RAM`, `TEMP`, `FAN`, `DRAW`, `FPS`, `RES`, `READ` | `CPU+GPU+RAM+TEMP+FAN+DRAW+FPS+RES+READ` | -| `replace_MB_with_RAM_load` | This works only if you have sys-clk 2.0.0_rc4+ installed. Instead of RAM total usage it shows RAM load. | `true`, `false` | `true` | -| `background_color` | Background color in RGBA4444 format | From `#0000` to `#FFFF` | `#1117` | -| `cat_color` | Category text color (left side) in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | -| `text_color` | Stats text color (right side) in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | - -> [micro] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `refresh_rate` | How often per second this mode should be refreshed. Higher value means higher CPU Core #3 usage, that's why it is recommended to stay at 1. | From `1` to `60` | `1` | -| `layer_height_align` | On which side of the screen Y axis you want this mode | `top`, `bottom` | `top` | -| `handheld_font_size` | How big should be rendered text in handheld mode | From `8` to `18` | `18` | -| `docked_font_size` | How big should be rendered text in docked mode | From `8` to `18` | `18` | -| `text_align` | How shown text should be aligned | `left`, `center`, `right`| `center` | -| `real_freqs` | This works only if you have sys-clk 2.0.0_rc4+ installed. It shows real frequencies for CPU, GPU and RAM instead of target frequencies | `true`, `false` | `false` | -| `show` | Which data should be rendered. Connect different stats with `+` in any order. | `CPU`, `GPU`, `RAM`, `BRD`, `FAN`, `FPS` | `CPU+GPU+RAM+BRD+FAN+FPS` | -| `replace_GB_with_RAM_load` | This works only if you have sys-clk 2.0.0_rc4+ installed. Instead of RAM total usage it shows RAM load. | `true`, `false` | `true` | -| `background_color` | Background color in RGBA4444 format | From `#0000` to `#FFFF` | `#1117` | -| `cat_color` | Category text color (left side) in RGBA4444 format | From `#0000` to `#FFFF` | `#FCCF` | -| `text_color` | Stats text color (right side) in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | - - -> [fps-counter] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `layer_width_align` | On which side of the screen X axis you want this mode | `left`, `center`, `right` | `left` | -| `layer_height_align` | On which side of the screen Y axis you want this mode | `top`, `center`, `bottom` | `top` | -| `handheld_font_size` | How big should be rendered text in handheld mode | From `8` to `150` | `40` | -| `docked_font_size` | How big should be rendered text in docked mode | From `8` to `150` | `40` | -| `background_color` | Background color in RGBA4444 format | From `#0000` to `#FFFF` | `#1117` | -| `text_color` | Text color in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | - -> [fps-graph] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `layer_width_align` | On which side of the screen X axis you want this mode | `left`, `center`, `right` | `left` | -| `layer_height_align` | On which side of the screen Y axis you want this mode | `top`, `center`, `bottom` | `top` | -| `max_fps_text_color` | Text color of "60" in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | -| `min_fps_text_color` | Text color of "0" in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | -| `background_color` | Background color in RGBA4444 format | From `#0000` to `#FFFF` | `#1117` | -| `fps_counter_color` | Text color of average FPS printed behind graph in RGBA4444 format | From `#0000` to `#FFFF` | `#4444` | -| `border_color` | Color of rectangle in RGBA4444 format | From `#0000` to `#FFFF` | `#F77F` | -| `dashed_line_color` | Color of dashed line at the center of rectangle in RGBA4444 format | From `#0000` to `#FFFF` | `#8888` | -| `main_line_color` | Color of line representing FPS value on graph in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | -| `rounded_line_color` | Color of line representing FPS value on graph if it's divisble by 10 in RGBA4444 format | From `#0000` to `#FFFF` | `#F0FF` | -| `perfect_line_color` | Color of line representing FPS value on graph if it's divisble by 30 in RGBA4444 format | From `#0000` to `#FFFF` | `#0C0F` | - -> [game_resolutions] - -| Key | Explanation | Possible values | Default Value | -|-----|-------------|-----------------|---------------| -| `refresh_rate` | How often per second this mode should be refreshed. Higher value means higher CPU Core #3 usage, that's why it is recommended to stay at 1. | From `1` to `60` | `10` | -| `layer_width_align` | On which side of the screen X axis you want this mode | `left`, `center`, `right` | `left` | -| `layer_height_align` | On which side of the screen Y axis you want this mode | `top`, `center`, `bottom` | `top` | -| `background_color` | Background color in RGBA4444 format | From `#0000` to `#FFFF` | `#1117` | -| `cat_color` | Category text color (left side) in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | -| `text_color` | Stats text color (right side) in RGBA4444 format | From `#0000` to `#FFFF` | `#FFFF` | diff --git a/Source/Horizon-OC-Monitor (deprecated)/docs/modes.md b/Source/Horizon-OC-Monitor (deprecated)/docs/modes.md deleted file mode 100644 index 665237dd..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/docs/modes.md +++ /dev/null @@ -1,252 +0,0 @@ -# Modes - -Horizon OC Monitor Overlay from 1.0.0 release contains five modes to choose from Main Menu.
    -For additional functions you need to install: -- [SaltyNX](https://github.com/masagrator/SaltyNX/releases) -- [sys-clk 2.0.0_rc4+](https://github.com/retronx-team/sys-clk/releases) (using closed source forks of sys-clk can result in retrieving wrong real clockrates and ram load) - -# Full - -This mode you can know from older releases of Horizon OC Monitor. It contains all informations properly described and supported with high precision. - -- CPU Usage - - Real Frequency: `%.1f` = Real clockrate of all CPU cores in MHz (This shows only when sys-clk 2.0.0_4c+ is installed) - - Target Frequency: `%.1f` = Target clockrate of all CPU cores in MHz - - Core #0-#3: `%.2f` = Load of CPU Cores calculated from IdleTickCount to percent value - -- GPU Usage - - Real Frequency: `%.1f` = Real clockrate of GPU in MHz (This shows only when sys-clk 2.0.0_rc4+ is installed) - - Target Frequency: `%.1f` = Target clockrate of GPU in MHz - - Load: `%.1f` = GPU Load provided by PMU in percent - -- RAM Usage - - Real Frequency: `%.1f` = Real clockrate of EMC in MHz (This shows only when sys-clk 2.0.0_rc4+ is installed) - - Target Frequency: `%.1f` = Target clockrate of EMC in MHz - - Load: `%.1f` (CPU `%.1f` | GPU `%.1f`) = RAM Load in % (Which part of that are CPU and GPU (with other hardware, but their impact on GPU readings is negligible)) - - `%s`: `%.2f`/`%.2f` = %s memory used/%s memory available in MB (not working with FW <5.0.0) - -- Board - - Battery Power Flow: `%+.2f`[h:mm] = How much power in watts is discharged from or charged to the battery [time left before shutdown] - - Temperatures: SoC: `%.1f` / PCB: `%.1f` / Skin: `%.1f` = SoC / PCB / Skin temperature in Celsius degrees (Explanation provided at the end of file) - - Fan Rotation Level: `%.1f` = Fan rotation level in percent - - -```Optional (shows only when SaltyNX is installed and game is running)``` - -| Category | Format | Explanation | -|----------|-------------------|--------------------------------------------------------------------------| -| PFPS | %u | Pushed Frames Per Second - how many frames were displayed in last second | -| FPS | %.2f | Frames Per Second - value calculated by averaging frametime | -| Resolutions | %dx%d \|\| %dx%d | Two the most promising candidates for internal game resolution `(^1)` | -| Read speed | %.2f MiB/s | Show game read speed in the last second | - -- ^1 - read more informations in explanation for "Game Resolutions" menu - -# Mini - -Contains most of supported informations with lower precision. You can use touch screen to change its position temporarily. - -| Category | Format | Explanation | -|----------|---------------------------------------------------|---------------------------------------------------------------------------| -| CPU | [%.0f,%.0f,%.0f,%.0f]@%.1f | Core #0 usage, Core #1 usage, Core #2 usage, Core #3 usage@CPU Target/Real frequency`(^1)` | -| GPU | %.1f@%.1f | Load@GPU Target/Real Frequency`(^1)` | -| RAM | %.0f/%.0f@%.1f
    `or`
    %.1f(%.1f \| %.1f)@%.1f | Total RAM used/Total RAM available in MB@EMC Target/Real frequency `or` RAM load (CPU \| GPU)@EMC Target frequency `(^1)` | -| TEMP | %2.1f/%2.1f/%2.1f | SoC temperature/PCB temperature/Skin temperature `(^2)` | -| FAN | %2.1f | Fan rotation level | -| DRAW | %+.2f[h:mm] | How much power in watts is discharged from or charged to the battery [Time left before shutdown] | -| RES | %dx%d \|\| %dx%d | Two the most promising candidates for internal game resolution `(^3)` | -| READ | %.2f MiB/s | Show game read speed in the last second | - -- ^1 - Real Frequency + RAM Load available only with sys-clk 2.0.0_rc4+ -- ^2 - Explanation provided at the end of file -- ^3 - read more informations in explanation for "Game Resolutions" menu - -```Optional``` - -> shows only when SaltyNX is installed and game is running -> -| Category | Format | Explanation | -|----------|-------------------|--------------------------------------------------------------------------| -| FPS | %.2f | Frames Per Second | - -# Micro - -Contains most of supported informations with lower precision in one line. - -| Category | Format | Explanation | -|----------|------------------------------------------------------------|---------------------------------------------------------------------------| -| CPU | [%.0f,%.0f,%.0f,%.0f]%s%.1f | [Core #0 usage, Core #1 usage, Core #2 usage, Core #3 usage] `(^1)` CPU Target/Real Frequency `(^3)` | -| GPU | %.1f%s%.1f | Load (^1) GPU Target/Real Frequency | -| RAM | %.1f/%.1f%s%.1f `or` %.1f%s%.1f | Total RAM used/Total RAM available in GB `(^1)` EMC Target frequency `or` RAM Load in % `(^1)` EMC Target frequency | -| BRD | %2.1f/%2.1f/%2.1f@+.1f[h:mm] | SoC temperature/PCB temperature/Skin temperature(^2)/Battery Power Flow[Time left before shutdown] | -| FAN | %2.1f | Fan rotation level | - -- ^1 - by default it's `@`, but if you have sys-clk 2.0.0_rc4+ installed, this changes depending on difference between real clocks and targeted clocks.
    - - `△` - real clocks are higher by at least 20 MHz than expected - - `▽` - real clocks are lower by at least 20 MHz than expected - - `≠` - real clocks are lower by at least 50 MHz than expected (If this shows constantly for longer than few seconds, this is a sign of throttling, usually caused by bad overclocking configuration) -- ^2 - Explanation provided at the end of file -- ^3 - Real frequencies + RAM Load available only with sys-clk 2.0.0_rc4+ - -```Optional``` - -> shows only when SaltyNX is installed and game is running - -| Category | Format | Explanation | -|----------|--------------------|--------------------------------------------------------------------------| -| FPS | %.1f | Frames Per Second | - - -# FPS - -> Counter - -It shows only FPS value in 31Hz + vsync signal.
    -If game is not launched, it will show always `n/d` aka `no data`.
    - -Mode available only with SaltyNX installed. You can use touch screen to change its position temporarily. - -> Graph - -It shows average FPS graph in 31Hz + vsync signal. In background of graph you can see rendered actual average FPS.
    -If game is not launched, graph will be empty.
    -If game is not rendering any new frame, graph is not updated. - -If line is within rounding error of graph line, it's colored. Average FPS must be between -0.05 and +0.04 of graph line target FPS. So for 30 FPS it's between 29.95 - 30.04 FPS. For 43 FPS it's 42.95 - 43.04 FPS. -If it's in display refresh rate or half of it rounding error range, it's green. Any other FPS graph target is purple. - -Colors can be changed in config file. - -Mode available only with SaltyNX installed. You can use touch screen to change its position temporarily. - -# Other - -> Battery - -- Battery Actual Capacity: `%d` = Battery Designed Capacity multiplied by Battery Age in mAh -- Battery Designed Capacity: `%d` = Battery capacity targeted by manufacturer in mAh -- Battery Temperature: `%.1f` = Battery temperature in Celsius -- Battery Raw Charge: `%.1f` = Raw battery charged capacity in percent -- Battery Age: `%.1f` = How much of designed capacity was charged last time battery was charged completely in percent -- Battery Voltage: `%.0f` = Battery average voltage in mV (time period: 5s, or with `battery_avg_iir_filter` enabled: 45s) -- Battery Current Flow: `%+.0f` = Battery average current flow in mA (time period: 5s, or with `battery_avg_iir_filter` enabled: 11.25s) -- Battery Power Flow: `%+.3f` = Battery average power flow in W calculated from Battery Voltage and Battery Current Flow -- Battery Remaining Time: h:mm - How much time is left before shutdown - -Shows only if charger is connected: -| Category | Format | Explanation | -|---------------------------|--------------|----------------------------------------------------------------------------------| -| Charger Type | %u | Connected charger type, more in Battery.hpp "BatteryChargeInfoFieldsChargerType" | -| Charger Max Voltage | %u | Charger and external device voltage limit in mV | -| Charger Max Current | %u | Charger and external device current limit in mA | - -> Miscellaneous - -| Category | Format | Explanation | -|------------------------|-------------------|----------------------------------------------------------------------------------| -| DSP Usage | %u | In percent (not available on 17.0.0+) | -| NVDEC | %.2f | Target frequency in MHz (shows 0 if chip is not active) | -| NVENC | %.2f | Target frequency in MHz (shows 0 if chip is not active) | -| NVJPG | %.2f | Target frequency in MHz (shows 0 if chip is not active) | -| Network Type | %s | It shows if Switch is connected to internet, and if it's using Ethernet or Wi-Fi | - -If Network Type is "Wi-Fi", you can press Y to show password. Since max password length is 64 characters, it may show in up to 3 lines. - -> Game Resolutions - -For this mode to show and work properly you must have SaltyNX 0.9.0+ installed. You can use touch screen to change its position temporarily. - -When game runs, this menu shows what resolutions and how many times they were passed to GPU via two functions: -- __Depth__ shows info from depth texture passed to `nvnCommandBufferSetRenderTargets` -- __Viewport__ shows info from arguments passed to: - - for NVN: `nvnCommandBufferSetViewport`, `nvnCommandBufferSetViewports`, `nvnCommandBufferSetScissor` and `nvnCommandBufferSetScissors` - - for EGL: `glViewport`, `glViewportArrayv`, `glViewportIndexedf`, `glViewportIndexedfv` and all their variations - - for Vulkan: `vkCmdSetViewport` and `vkCmdSetViewportWithCount` - -This menu shows first 8 resolutions passed to those functions in last frame rendering loop, sorted in descending order of calls number.
    -Its main purpose is to catch game rendering resolution, but user must deduce which ones are correct.
    -I have limited catched resolutions only to ones that have ratio higher than 0.6 and lower than 1.8. Such low value comes from the fact that some games are rendering at width lower than height (f.e. 480x720). There is also a limit where it won't accept resolutions which height is lower than 160 px or higher than 1440 px.
    - -Remember that resolutions you can see in this mode may be used in different ways - for example Tokyo Xanadu Ex+ max dynamic resolution in handheld will show 1280x736, but it's not that game will squeeze this into 720p screen, it's just removing those additional 16 pixels from showing on screen. - -Those commands are used by all 3D games using NVN, EGL and Vulkan APIs (that's why it may not work with games using 2D engines).
    -This mode is not 100% fullproof, so it can show that nothing is catched or it won't catch what is used for 3D rendering (if this happens for some 3D game, please report an issue). - -By default refresh rate of this menu is 10 FPS. You can change that in config.ini, more in config.md
    -Exiting is done by using the same combo buttons used in other main modes. - -Games that don't mesh well with RES category in `Mini` and Resolution in `Full` modes while showing properly rendering resolutions in this menu: -- `Kirby and The Forgotten Land`: dynamic resolution has much less calls than other resolutions, it shows up correctly only when it's max dynamic resolution set. It shows up always first in Depth category of Game Resolutions menu. -- `Darksiders 2`: Dynamic resolution is randomly showing up, fighting for attention with native resolution call. In Game Resolutions menu it shows up either at 2nd or 3rd place of Viewport. - -# Additional info - -> How Battery Remaining Time is calculated - -It is calculated from the last 3 minutes of power draw readings. In the first minute of running any mode, it is updated every 0.5s, after one minute it's updated every minute. When exiting the currently used mode, calculations are reset. When connecting or disconnecting the charger, calculations are reset. When Battery Power Draw is positive instead of negative, time is shown as [-:--] and calculations are reset. - -> What is Skin temperature ($\mathbf{T}skin$)? - -This is temperature calculated from SoC and PCB temperatures that is mainly used to prevent Switch from overheating. Reading it is not supported on FWs <5.0.0. - -Explanation provided by CTCaer ->Temperature ($\mathbf{T}skin$) calculation. -> -> ->Console and Handheld: -> ->$\mathbf{T}soc >= 84°C$ - Immediate sleep. No questions asked. -> ->$\mathbf{T}pcb >= 84°C$ - Immediate sleep. No questions asked. -> -> ->Console only: -> ->$\mathbf{T}skin < 63°C$ - Clears both timers. -> ->$\mathbf{T}skin >= 63°C$ - Immediate sleep. No questions asked. -> -> ->Handheld only: -> ->$\mathbf{T}skin < 58°C$ - Clears both timers. -> ->$58°C <= \mathbf{T}skin < 61°C$ - Starts 60s timer and clears 10s timer. -> ->$61°C <= \mathbf{T}skin < 63°C$ - Starts 10s timer. -> ->$\mathbf{T}skin >= 63°C$ - Immediate sleep. No questions asked. -> -> ->The two timers are separate. If 61°C is reached, the 10s timer is immediatly started. -> ->If a timer ends and the temperature is not dropped, goes into sleep. -> -> ->tskin is the specific calculation below: -``` -soc_adj = (temps.iir_filter_gain_soc * (temps.soc - temps.soc_adj_prev)) + temps.soc_adj_prev; -pcb_adj = (temps.iir_filter_gain_pcb * (temps.pcb - temps.pcb_adj_prev)) + temps.pcb_adj_prev; -temps.soc_adj_prev = soc_adj; -temps.pcb_adj_prev = pcb_adj; - -if (soc_adj >= 38000) -{ - if (temps.handheld) - soc_adj = (temps.tskin_soc_coeff_handheld[0] * soc_adj) + (1000 * temps.tskin_soc_coeff_handheld[1]); - else - soc_adj = (temps.tskin_soc_coeff_console[0] * soc_adj) + (1000 * temps.tskin_soc_coeff_console[1]); - soc_adj = (soc_adj / 10000) + 500; -} - -if (pcb_adj >= 38000) -{ - if (temps.handheld) - pcb_adj = (temps.tskin_pcb_coeff_handheld[0] * pcb_adj) + (1000 * temps.tskin_pcb_coeff_handheld[1]); - else - pcb_adj = (temps.tskin_pcb_coeff_console[0] * soc_adj) + (1000 * temps.tskin_pcb_coeff_console[1]); - pcb_adj = (pcb_adj / 10000) + 500; -} - -skin_adj = MAX(soc_adj, pcb_adj); //tskin -``` diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/Battery.hpp b/Source/Horizon-OC-Monitor (deprecated)/include/Battery.hpp deleted file mode 100644 index 8c39547c..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/Battery.hpp +++ /dev/null @@ -1,81 +0,0 @@ -///* Notes VoltageAvg -// -// Vavg time = 175.8ms x 2^(6+VOLT), default: VOLT = 2 (Vavg time = 45s) -// -///End of Notes - -typedef enum { - NoHub = BIT(0), //If hub is disconnected - Rail = BIT(8), //At least one Joy-con is charging from rail - SPDSRC = BIT(12), //OTG - ACC = BIT(16) //Accessory -} BatteryChargeInfoFieldsFlags; - -typedef enum { - NewPDO = 1, //Received new Power Data Object - NoPD = 2, //No Power Delivery source is detected - AcceptedRDO = 3 //Received and accepted Request Data Object -} BatteryChargeInfoFieldsPDControllerState; //BM92T series - -typedef enum { - None = 0, - PD = 1, - TypeC_1500mA = 2, - TypeC_3000mA = 3, - DCP = 4, - CDP = 5, - SDP = 6, - Apple_500mA = 7, - Apple_1000mA = 8, - Apple_2000mA = 9 -} BatteryChargeInfoFieldsChargerType; - -typedef enum { - Sink = 1, - Source = 2 -} BatteryChargeInfoFieldsPowerRole; - -typedef struct { - int32_t InputCurrentLimit; //Input (Sink) current limit in mA - int32_t VBUSCurrentLimit; //Output (Source/VBUS/OTG) current limit in mA - int32_t ChargeCurrentLimit; //Battery charging current limit in mA (512mA when Docked, 768mA when BatteryTemperature < 17.0 C) - int32_t ChargeVoltageLimit; //Battery charging voltage limit in mV (3952mV when BatteryTemperature >= 51.0 C) - int32_t unk_x10; //Possibly an emum, getting the same value as PowerRole in all tested cases - int32_t unk_x14; //Possibly flags - BatteryChargeInfoFieldsPDControllerState PDControllerState; //Power Delivery Controller State - int32_t BatteryTemperature; //Battery temperature in milli C - int32_t RawBatteryCharge; //Raw battery charged capacity per cent-mille (i.e. 100% = 100000 pcm) - int32_t VoltageAvg; //Voltage avg in mV (more in Notes) - int32_t BatteryAge; //Battery age (capacity full / capacity design) per cent-mille (i.e. 100% = 100000 pcm) - BatteryChargeInfoFieldsPowerRole PowerRole; - BatteryChargeInfoFieldsChargerType ChargerType; - int32_t ChargerVoltageLimit; //Charger and external device voltage limit in mV - int32_t ChargerCurrentLimit; //Charger and external device current limit in mA - BatteryChargeInfoFieldsFlags Flags; //Unknown flags - char reserved[0x14]; //17.0.0+ data -} BatteryChargeInfoFields; - -typedef struct { - int32_t InputCurrentLimit; //Input (Sink) current limit in mA - int32_t VBUSCurrentLimit; //Output (Source/VBUS/OTG) current limit in mA - int32_t ChargeCurrentLimit; //Battery charging current limit in mA (512mA when Docked, 768mA when BatteryTemperature < 17.0 C) - int32_t ChargeVoltageLimit; //Battery charging voltage limit in mV (3952mV when BatteryTemperature >= 51.0 C) - int32_t unk_x10; //Possibly an emum, getting the same value as PowerRole in all tested cases - int32_t unk_x14; //Possibly flags - BatteryChargeInfoFieldsPDControllerState PDControllerState; //Power Delivery Controller State - int32_t BatteryTemperature; //Battery temperature in milli C - int32_t RawBatteryCharge; //Raw battery charged capacity per cent-mille (i.e. 100% = 100000 pcm) - int32_t VoltageAvg; //Voltage avg in mV (more in Notes) - int32_t BatteryAge; //Battery age (capacity full / capacity design) per cent-mille (i.e. 100% = 100000 pcm) - char reserved[4]; //17.0.0+ data - BatteryChargeInfoFieldsPowerRole PowerRole; - BatteryChargeInfoFieldsChargerType ChargerType; - int32_t ChargerVoltageLimit; //Charger and external device voltage limit in mV - int32_t ChargerCurrentLimit; //Charger and external device current limit in mA - BatteryChargeInfoFieldsFlags Flags; //Unknown flags - char reserved2[0x10]; //17.0.0+ data -} BatteryChargeInfoFields17; - -Result psmGetBatteryChargeInfoFields(Service* psmService, BatteryChargeInfoFields *out) { - return serviceDispatchOut(psmService, 17, *out); -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/Misc.hpp b/Source/Horizon-OC-Monitor (deprecated)/include/Misc.hpp deleted file mode 100644 index d5f21a08..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/Misc.hpp +++ /dev/null @@ -1,41 +0,0 @@ -typedef struct { - u8 ssid_len; ///< NifmSfWirelessSettingData::ssid_len - char ssid[0x21]; ///< NifmSfWirelessSettingData::ssid - u8 unk_x22; ///< NifmSfWirelessSettingData::unk_x21 - u8 pad; ///< Padding - u32 unk_x24; ///< NifmSfWirelessSettingData::unk_x22 - u32 unk_x28; ///< NifmSfWirelessSettingData::unk_x23 - u8 passphrase_len; ///< Passphrase length - u8 passphrase[0x41]; ///< NifmSfWirelessSettingData::passphrase - u8 pad2[0x2]; ///< Padding -} NifmWirelessSettingData_new; - -/// NetworkProfileData. Converted from/to \ref NifmSfNetworkProfileData. -typedef struct { - Uuid uuid; ///< NifmSfNetworkProfileData::uuid - char network_name[0x40]; ///< NifmSfNetworkProfileData::network_name - u32 unk_x50; ///< NifmSfNetworkProfileData::unk_x112 - u32 unk_x54; ///< NifmSfNetworkProfileData::unk_x113 - u8 unk_x58; ///< NifmSfNetworkProfileData::unk_x114 - u8 unk_x59; ///< NifmSfNetworkProfileData::unk_x115 - u8 pad[2]; ///< Padding - NifmWirelessSettingData_new wireless_setting_data; ///< \ref NifmWirelessSettingData - NifmIpSettingData ip_setting_data; ///< \ref NifmIpSettingData -} NifmNetworkProfileData_new; - -Result getNvChannelClockRate(NvChannel *channel, u32 module_id, u32 *clock_rate) { - struct nvhost_clk_rate_args { - uint32_t rate; - uint32_t moduleid; - } args = { - .rate = 0, - .moduleid = module_id, - }; - - const u32 id = hosversionBefore(8,0,0) ? _NV_IOWR(0, 0x14, args) : _NV_IOWR(0, 0x23, args); - Result rc = nvIoctl(channel->fd, id, &args); - if (R_SUCCEEDED(rc) && clock_rate) - *clock_rate = args.rate; - - return rc; -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/SaltyNX.h b/Source/Horizon-OC-Monitor (deprecated)/include/SaltyNX.h deleted file mode 100644 index e0dbb80b..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/SaltyNX.h +++ /dev/null @@ -1,231 +0,0 @@ -#pragma once -#include "ipc.h" - -Handle saltysd_orig; - -Result SaltySD_Connect() { - for (int i = 0; i < 200; i++) { - if (!svcConnectToNamedPort(&saltysd_orig, "SaltySD")) - return 0; - svcSleepThread(1000*1000); - } - return 1; -} - -Result SaltySD_Term() -{ - Result ret; - IpcCommand c; - - ipcInitialize(&c); - ipcSendPid(&c); - - struct input - { - u64 magic; - u64 cmd_id; - u64 zero; - u64 reserved[2]; - } *raw; - - raw = (input*)ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 0; - raw->zero = 0; - - ret = ipcDispatch(saltysd_orig); - - if (R_SUCCEEDED(ret)) - { - IpcParsedCommand r; - ipcParse(&r); - - struct output { - u64 magic; - u64 result; - } *resp = (output*)r.Raw; - - ret = resp->result; - } - - // Session terminated works too. - svcCloseHandle(saltysd_orig); - if (ret == 0xf601) return 0; - - return ret; -} - -Result SaltySD_CheckIfSharedMemoryAvailable(ptrdiff_t *offset, u64 size) -{ - Result ret = 0; - - // Send a command - IpcCommand c; - ipcInitialize(&c); - ipcSendPid(&c); - - struct input { - u64 magic; - u64 cmd_id; - u64 size; - u32 reserved[2]; - } *raw; - - raw = (input*)ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 6; - raw->size = size; - - ret = ipcDispatch(saltysd_orig); - - if (R_SUCCEEDED(ret)) { - IpcParsedCommand r; - ipcParse(&r); - - struct output { - u64 magic; - u64 result; - u64 offset; - } *resp = (output*)r.Raw; - - ret = resp->result; - - if (!ret) - { - *offset = resp->offset; - } - } - - return ret; -} - -Result SaltySD_GetSharedMemoryHandle(Handle *retrieve) -{ - Result ret = 0; - - // Send a command - IpcCommand c; - ipcInitialize(&c); - ipcSendPid(&c); - - struct input { - u64 magic; - u64 cmd_id; - u32 reserved[4]; - } *raw; - - raw = (input*)ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 7; - - ret = ipcDispatch(saltysd_orig); - - if (R_SUCCEEDED(ret)) { - IpcParsedCommand r; - ipcParse(&r); - - struct output { - u64 magic; - u64 result; - u64 reserved[2]; - } *resp = (output*)r.Raw; - - ret = resp->result; - - if (!ret) - { - *retrieve = r.Handles[0]; - } - } - - return ret; -} - -Result SaltySD_GetDisplayRefreshRate(uint8_t* refreshRate) -{ - Result ret = 0; - - // Send a command - IpcCommand c; - ipcInitialize(&c); - ipcSendPid(&c); - - struct input { - u64 magic; - u64 cmd_id; - u64 zero; - u64 reserved; - } *raw; - - raw = (input*)ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 10; - raw->zero = 0; - - ret = ipcDispatch(saltysd_orig); - - if (R_SUCCEEDED(ret)) { - IpcParsedCommand r; - ipcParse(&r); - - struct output { - u64 magic; - u64 result; - u64 refreshRate; - u64 reserved; - } *resp = (output*)r.Raw; - - ret = resp->result; - - if (!ret) - { - *refreshRate = (uint8_t)(resp->refreshRate); - } - } - - return ret; -} - -Result SaltySD_SetDisplayRefreshRate(uint8_t refreshRate) -{ - Result ret = 0; - - // Send a command - IpcCommand c; - ipcInitialize(&c); - ipcSendPid(&c); - - struct input { - u64 magic; - u64 cmd_id; - u64 refreshRate; - u64 reserved; - } *raw; - - raw = (input*)ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 11; - raw->refreshRate = refreshRate; - - ret = ipcDispatch(saltysd_orig); - - if (R_SUCCEEDED(ret)) { - IpcParsedCommand r; - ipcParse(&r); - - struct output { - u64 magic; - u64 result; - u64 reserved[2]; - } *resp = (output*)r.Raw; - - ret = resp->result; - } - - return ret; -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/audsnoop.h b/Source/Horizon-OC-Monitor (deprecated)/include/audsnoop.h deleted file mode 100644 index ac0dacdf..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/audsnoop.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -Result audsnoopInitialize(void); -void audsnoopExit(void); - -Result audsnoopEnableDspUsageMeasurement(void); -Result audsnoopDisableDspUsageMeasurement(void); - -Result audsnoopGetDspUsage(u32 *usage); - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/i2c.h b/Source/Horizon-OC-Monitor (deprecated)/include/i2c.h deleted file mode 100644 index 6c2d68eb..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/i2c.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once - -Result I2cReadRegHandler16(u8 reg, I2cDevice dev, u16 *out) -{ - struct readReg { - u8 send; - u8 sendLength; - u8 sendData; - u8 receive; - u8 receiveLength; - }; - - I2cSession _session; - - Result res = i2cOpenSession(&_session, dev); - if (res) - return res; - - u16 val; - - struct readReg readRegister = { - .send = 0 | (I2cTransactionOption_Start << 6), - .sendLength = sizeof(reg), - .sendData = reg, - .receive = 1 | (I2cTransactionOption_All << 6), - .receiveLength = sizeof(val), - }; - - res = i2csessionExecuteCommandList(&_session, &val, sizeof(val), &readRegister, sizeof(readRegister)); - if (res) - { - i2csessionClose(&_session); - return res; - } - - *out = val; - i2csessionClose(&_session); - return 0; -} - -Result I2cReadRegHandler8(u8 reg, I2cDevice dev, u8 *out) -{ - struct readReg { - u8 send; - u8 sendLength; - u8 sendData; - u8 receive; - u8 receiveLength; - }; - - I2cSession _session; - - Result res = i2cOpenSession(&_session, dev); - if (res) - return res; - - u8 val; - - struct readReg readRegister = { - .send = 0 | (I2cTransactionOption_Start << 6), - .sendLength = sizeof(reg), - .sendData = reg, - .receive = 1 | (I2cTransactionOption_All << 6), - .receiveLength = sizeof(val), - }; - - res = i2csessionExecuteCommandList(&_session, &val, sizeof(val), &readRegister, sizeof(readRegister)); - if (res) - { - i2csessionClose(&_session); - return res; - } - - *out = val; - i2csessionClose(&_session); - return 0; -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/ipc.h b/Source/Horizon-OC-Monitor (deprecated)/include/ipc.h deleted file mode 100644 index ef370f7e..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/ipc.h +++ /dev/null @@ -1,755 +0,0 @@ -/** - * @file ipc.h - * @brief Inter-process communication handling - * @author plutoo - * @copyright libnx Authors - */ -#pragma once - -/// IPC input header magic -#define SFCI_MAGIC 0x49434653 -/// IPC output header magic -#define SFCO_MAGIC 0x4f434653 - -/// IPC invalid object ID -#define IPC_INVALID_OBJECT_ID UINT32_MAX - -///@name IPC request building -///@{ - -/// IPC command (request) structure. -#define IPC_MAX_BUFFERS 8 -#define IPC_MAX_OBJECTS 8 - -typedef enum { - BufferType_Normal=0, ///< Regular buffer. - BufferType_Type1=1, ///< Allows ProcessMemory and shared TransferMemory. - BufferType_Invalid=2, - BufferType_Type3=3 ///< Same as Type1 except remote process is not allowed to use device-mapping. -} BufferType; - -typedef enum { - BufferDirection_Send=0, - BufferDirection_Recv=1, - BufferDirection_Exch=2, -} BufferDirection; - -typedef enum { - IpcCommandType_Invalid = 0, - IpcCommandType_LegacyRequest = 1, - IpcCommandType_Close = 2, - IpcCommandType_LegacyControl = 3, - IpcCommandType_Request = 4, - IpcCommandType_Control = 5, - IpcCommandType_RequestWithContext = 6, - IpcCommandType_ControlWithContext = 7, -} IpcCommandType; - -typedef enum { - DomainMessageType_Invalid = 0, - DomainMessageType_SendMessage = 1, - DomainMessageType_Close = 2, -} DomainMessageType; - -/// IPC domain message header. -typedef struct { - u8 Type; - u8 NumObjectIds; - u16 Length; - u32 ThisObjectId; - u32 Pad[2]; -} DomainMessageHeader; - -/// IPC domain response header. -typedef struct { - u32 NumObjectIds; - u32 Pad[3]; -} DomainResponseHeader; - - -typedef struct { - size_t NumSend; // A - size_t NumRecv; // B - size_t NumExch; // W - const void* Buffers[IPC_MAX_BUFFERS]; - size_t BufferSizes[IPC_MAX_BUFFERS]; - BufferType BufferTypes[IPC_MAX_BUFFERS]; - - size_t NumStaticIn; // X - size_t NumStaticOut; // C - const void* Statics[IPC_MAX_BUFFERS]; - size_t StaticSizes[IPC_MAX_BUFFERS]; - u8 StaticIndices[IPC_MAX_BUFFERS]; - - bool SendPid; - size_t NumHandlesCopy; - size_t NumHandlesMove; - Handle Handles[IPC_MAX_OBJECTS]; - - size_t NumObjectIds; - u32 ObjectIds[IPC_MAX_OBJECTS]; -} IpcCommand; - -/** - * @brief Initializes an IPC command structure. - * @param cmd IPC command structure. - */ -static inline void ipcInitialize(IpcCommand* cmd) { - *cmd = (IpcCommand){}; -} - -/// IPC buffer descriptor. -typedef struct { - u32 Size; ///< Size of the buffer. - u32 Addr; ///< Lower 32-bits of the address of the buffer - u32 Packed; ///< Packed data (including higher bits of the address) -} IpcBufferDescriptor; - -/// IPC static send-buffer descriptor. -typedef struct { - u32 Packed; ///< Packed data (including higher bits of the address) - u32 Addr; ///< Lower 32-bits of the address -} IpcStaticSendDescriptor; - -/// IPC static receive-buffer descriptor. -typedef struct { - u32 Addr; ///< Lower 32-bits of the address of the buffer - u32 Packed; ///< Packed data (including higher bits of the address) -} IpcStaticRecvDescriptor; - -/** - * @brief Adds a buffer to an IPC command structure. - * @param cmd IPC command structure. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param type Buffer type. - */ -static inline void ipcAddSendBuffer(IpcCommand* cmd, const void* buffer, size_t size, BufferType type) { - const size_t off = cmd->NumSend; - cmd->Buffers[off] = buffer; - cmd->BufferSizes[off] = size; - cmd->BufferTypes[off] = type; - cmd->NumSend++; -} - -/** - * @brief Adds a receive-buffer to an IPC command structure. - * @param cmd IPC command structure. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param type Buffer type. - */ -static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, BufferType type) { - const size_t off = cmd->NumSend + cmd->NumRecv; - cmd->Buffers[off] = buffer; - cmd->BufferSizes[off] = size; - cmd->BufferTypes[off] = type; - cmd->NumRecv++; -} - -/** - * @brief Adds an exchange-buffer to an IPC command structure. - * @param cmd IPC command structure. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param type Buffer type. - */ -static inline void ipcAddExchBuffer(IpcCommand* cmd, void* buffer, size_t size, BufferType type) { - const size_t off = cmd->NumSend + cmd->NumRecv + cmd->NumExch; - cmd->Buffers[off] = buffer; - cmd->BufferSizes[off] = size; - cmd->BufferTypes[off] = type; - cmd->NumExch++; -} - -/** - * @brief Adds a static-buffer to an IPC command structure. - * @param cmd IPC command structure. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param index Index of buffer. - */ -static inline void ipcAddSendStatic(IpcCommand* cmd, const void* buffer, size_t size, u8 index) { - const size_t off = cmd->NumStaticIn; - cmd->Statics[off] = buffer; - cmd->StaticSizes[off] = size; - cmd->StaticIndices[off] = index; - cmd->NumStaticIn++; -} - -/** - * @brief Adds a static-receive-buffer to an IPC command structure. - * @param cmd IPC command structure. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param index Index of buffer. - */ -static inline void ipcAddRecvStatic(IpcCommand* cmd, void* buffer, size_t size, u8 index) { - const size_t off = cmd->NumStaticIn + cmd->NumStaticOut; - cmd->Statics[off] = buffer; - cmd->StaticSizes[off] = size; - cmd->StaticIndices[off] = index; - cmd->NumStaticOut++; -} - -/** - * @brief Adds a smart-buffer (buffer + static-buffer pair) to an IPC command structure. - * @param cmd IPC command structure. - * @param pointer_buffer_size Pointer buffer size. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param index Index of buffer. - */ -static inline void ipcAddSendSmart(IpcCommand* cmd, size_t pointer_buffer_size, const void* buffer, size_t size, u8 index) { - if (pointer_buffer_size != 0 && size <= pointer_buffer_size) { - ipcAddSendBuffer(cmd, NULL, 0, BufferType_Normal); - ipcAddSendStatic(cmd, buffer, size, index); - } else { - ipcAddSendBuffer(cmd, buffer, size, BufferType_Normal); - ipcAddSendStatic(cmd, NULL, 0, index); - } -} - -/** - * @brief Adds a smart-receive-buffer (buffer + static-receive-buffer pair) to an IPC command structure. - * @param cmd IPC command structure. - * @param pointer_buffer_size Pointer buffer size. - * @param buffer Address of the buffer. - * @param size Size of the buffer. - * @param index Index of buffer. - */ -static inline void ipcAddRecvSmart(IpcCommand* cmd, size_t pointer_buffer_size, void* buffer, size_t size, u8 index) { - if (pointer_buffer_size != 0 && size <= pointer_buffer_size) { - ipcAddRecvBuffer(cmd, NULL, 0, BufferType_Normal); - ipcAddRecvStatic(cmd, buffer, size, index); - } else { - ipcAddRecvBuffer(cmd, buffer, size, BufferType_Normal); - ipcAddRecvStatic(cmd, NULL, 0, index); - } -} - -/** - * @brief Tags an IPC command structure to send the PID. - * @param cmd IPC command structure. - */ -static inline void ipcSendPid(IpcCommand* cmd) { - cmd->SendPid = true; -} - -/** - * @brief Adds a copy-handle to be sent through an IPC command structure. - * @param cmd IPC command structure. - * @param h Handle to send. - * @remark The receiving process gets a copy of the handle. - */ -static inline void ipcSendHandleCopy(IpcCommand* cmd, Handle h) { - cmd->Handles[cmd->NumHandlesCopy++] = h; -} - -/** - * @brief Adds a move-handle to be sent through an IPC command structure. - * @param cmd IPC command structure. - * @param h Handle to send. - * @remark The sending process loses ownership of the handle, which is transferred to the receiving process. - */ -static inline void ipcSendHandleMove(IpcCommand* cmd, Handle h) { - cmd->Handles[cmd->NumHandlesCopy + cmd->NumHandlesMove++] = h; -} - -/** - * @brief Prepares the header of an IPC command structure. - * @param cmd IPC command structure. - * @param sizeof_raw Size in bytes of the raw data structure to embed inside the IPC request - * @return Pointer to the raw embedded data structure in the request, ready to be filled out. - */ -static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) { - u32* buf = (u32*)armGetTls(); - size_t i; - *buf++ = IpcCommandType_Request | (cmd->NumStaticIn << 16) | (cmd->NumSend << 20) | (cmd->NumRecv << 24) | (cmd->NumExch << 28); - - u32* fill_in_size_later = buf; - - if (cmd->NumStaticOut > 0) { - *buf = (cmd->NumStaticOut + 2) << 10; - } - else { - *buf = 0; - } - - if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) { - *buf++ |= 0x80000000; - *buf++ = (!!cmd->SendPid) | (cmd->NumHandlesCopy << 1) | (cmd->NumHandlesMove << 5); - - if (cmd->SendPid) - buf += 2; - - for (i=0; i<(cmd->NumHandlesCopy + cmd->NumHandlesMove); i++) - *buf++ = cmd->Handles[i]; - } - else { - buf++; - } - - for (i=0; iNumStaticIn; i++, buf+=2) { - IpcStaticSendDescriptor* desc = (IpcStaticSendDescriptor*) buf; - - const uintptr_t ptr = (uintptr_t) cmd->Statics[i]; - desc->Addr = ptr; - desc->Packed = cmd->StaticIndices[i] | (cmd->StaticSizes[i] << 16) | - (((ptr >> 32) & 15) << 12) | (((ptr >> 36) & 15) << 6); - } - - for (i=0; i<(cmd->NumSend + cmd->NumRecv + cmd->NumExch); i++, buf+=3) { - IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf; - desc->Size = cmd->BufferSizes[i]; - - const uintptr_t ptr = (uintptr_t) cmd->Buffers[i]; - desc->Addr = ptr; - desc->Packed = cmd->BufferTypes[i] | - (((ptr >> 32) & 15) << 28) | ((ptr >> 36) << 2); - } - - const u32 padding = ((16 - (((uintptr_t) buf) & 15)) & 15) / 4; - u32* raw = (u32*) (buf + padding); - - size_t raw_size = (sizeof_raw/4) + 4; - buf += raw_size; - - u16* buf_u16 = (u16*) buf; - - for (i=0; iNumStaticOut; i++) { - const size_t off = cmd->NumStaticIn + i; - const size_t sz = (uintptr_t) cmd->StaticSizes[off]; - - buf_u16[i] = (sz > 0xFFFF) ? 0 : sz; - } - - const size_t u16s_size = ((2*cmd->NumStaticOut) + 3)/4; - buf += u16s_size; - raw_size += u16s_size; - - *fill_in_size_later |= raw_size; - - for (i=0; iNumStaticOut; i++, buf+=2) { - IpcStaticRecvDescriptor* desc = (IpcStaticRecvDescriptor*) buf; - const size_t off = cmd->NumStaticIn + i; - - const uintptr_t ptr = (uintptr_t) cmd->Statics[off]; - desc->Addr = ptr; - desc->Packed = (ptr >> 32) | (cmd->StaticSizes[off] << 16); - } - - return (void*) raw; -} - -/** - * @brief Dispatches an IPC request. - * @param session IPC session handle. - * @return Result code. - */ -static inline Result ipcDispatch(Handle session) { - return svcSendSyncRequest(session); -} - -///@} - -///@name IPC response parsing -///@{ - -/// IPC parsed command (response) structure. -typedef struct { - IpcCommandType CommandType; ///< Type of the command - - bool HasPid; ///< true if the 'Pid' field is filled out. - u64 Pid; ///< PID included in the response (only if HasPid is true) - - size_t NumHandles; ///< Number of handles copied. - Handle Handles[IPC_MAX_OBJECTS]; ///< Handles. - bool WasHandleCopied[IPC_MAX_OBJECTS]; ///< true if the handle was moved, false if it was copied. - - bool IsDomainRequest; ///< true if the the message is a Domain message. - DomainMessageType InMessageType; ///< Type of the domain message. - u32 InMessageLength; ///< Size of rawdata (for domain messages). - u32 InThisObjectId; ///< Object ID to call the command on (for domain messages). - size_t InNumObjectIds; ///< Number of object IDs (for domain messages). - u32 InObjectIds[IPC_MAX_OBJECTS]; ///< Object IDs (for domain messages). - - bool IsDomainResponse; ///< true if the the message is a Domain response. - size_t OutNumObjectIds; ///< Number of object IDs (for domain responses). - u32 OutObjectIds[IPC_MAX_OBJECTS]; ///< Object IDs (for domain responses). - - size_t NumBuffers; ///< Number of buffers in the response. - void* Buffers[IPC_MAX_BUFFERS]; ///< Pointers to the buffers. - size_t BufferSizes[IPC_MAX_BUFFERS]; ///< Sizes of the buffers. - BufferType BufferTypes[IPC_MAX_BUFFERS]; ///< Types of the buffers. - BufferDirection BufferDirections[IPC_MAX_BUFFERS]; ///< Direction of each buffer. - - size_t NumStatics; ///< Number of statics in the response. - void* Statics[IPC_MAX_BUFFERS]; ///< Pointers to the statics. - size_t StaticSizes[IPC_MAX_BUFFERS]; ///< Sizes of the statics. - u8 StaticIndices[IPC_MAX_BUFFERS]; ///< Indices of the statics. - - size_t NumStaticsOut; ///< Number of output statics available in the response. - - void* Raw; ///< Pointer to the raw embedded data structure in the response. - void* RawWithoutPadding; ///< Pointer to the raw embedded data structure, without padding. - size_t RawSize; ///< Size of the raw embedded data. -} IpcParsedCommand; - -/** - * @brief Parse an IPC command response into an IPC parsed command structure. - * @param r IPC parsed command structure to fill in. - * @return Result code. - */ -static inline Result ipcParse(IpcParsedCommand* r) { - u32* buf = (u32*)armGetTls(); - u32 ctrl0 = *buf++; - u32 ctrl1 = *buf++; - size_t i; - - r->IsDomainRequest = false; - r->IsDomainResponse = false; - - r->CommandType = (IpcCommandType) (ctrl0 & 0xffff); - r->HasPid = false; - r->RawSize = (ctrl1 & 0x1ff) * 4; - r->NumHandles = 0; - - r->NumStaticsOut = (ctrl1 >> 10) & 15; - if (r->NumStaticsOut >> 1) r->NumStaticsOut--; // Value 2 -> Single descriptor - if (r->NumStaticsOut >> 1) r->NumStaticsOut--; // Value 3+ -> (Value - 2) descriptors - - if (ctrl1 & 0x80000000) { - u32 ctrl2 = *buf++; - - if (ctrl2 & 1) { - r->HasPid = true; - r->Pid = *buf++; - r->Pid |= ((u64)(*buf++)) << 32; - } - - const size_t num_handles_copy = ((ctrl2 >> 1) & 15); - const size_t num_handles_move = ((ctrl2 >> 5) & 15); - - size_t num_handles = num_handles_copy + num_handles_move; - u32* buf_after_handles = buf + num_handles; - - if (num_handles > IPC_MAX_OBJECTS) - num_handles = IPC_MAX_OBJECTS; - - for (i=0; iHandles[i] = *(buf+i); - r->WasHandleCopied[i] = (i < num_handles_copy); - } - - r->NumHandles = num_handles; - buf = buf_after_handles; - } - - size_t num_statics = (ctrl0 >> 16) & 15; - u32* buf_after_statics = buf + num_statics*2; - - if (num_statics > IPC_MAX_BUFFERS) - num_statics = IPC_MAX_BUFFERS; - - for (i=0; iPacked; - - r->Statics[i] = (void*) (desc->Addr | (((packed >> 12) & 15) << 32) | (((packed >> 6) & 15) << 36)); - r->StaticSizes[i] = packed >> 16; - r->StaticIndices[i] = packed & 63; - } - - r->NumStatics = num_statics; - buf = buf_after_statics; - - const size_t num_bufs_send = (ctrl0 >> 20) & 15; - const size_t num_bufs_recv = (ctrl0 >> 24) & 15; - const size_t num_bufs_exch = (ctrl0 >> 28) & 15; - - size_t num_bufs = num_bufs_send + num_bufs_recv + num_bufs_exch; - r->Raw = (void*)(((uintptr_t)(buf + num_bufs*3) + 15) &~ 15); - r->RawWithoutPadding = (void*)((uintptr_t)(buf + num_bufs*3)); - - if (num_bufs > IPC_MAX_BUFFERS) - num_bufs = IPC_MAX_BUFFERS; - - for (i=0; iPacked; - - r->Buffers[i] = (void*) (desc->Addr | ((packed >> 28) << 32) | (((packed >> 2) & 15) << 36)); - r->BufferSizes[i] = desc->Size; - r->BufferTypes[i] = (BufferType) (packed & 3); - - if (i < num_bufs_send) - r->BufferDirections[i] = BufferDirection_Send; - else if (i < (num_bufs_send + num_bufs_recv)) - r->BufferDirections[i] = BufferDirection_Recv; - else - r->BufferDirections[i] = BufferDirection_Exch; - } - - r->NumBuffers = num_bufs; - return 0; -} - -/** - * @brief Queries the size of an IPC pointer buffer. - * @param session IPC session handle. - * @param size Output variable in which to store the size. - * @return Result code. - */ -static inline Result ipcQueryPointerBufferSize(Handle session, size_t *size) { - u32* buf = (u32*)armGetTls(); - - buf[0] = IpcCommandType_Control; - buf[1] = 8; - buf[2] = 0; - buf[3] = 0; - buf[4] = SFCI_MAGIC; - buf[5] = 0; - buf[6] = 3; - buf[7] = 0; - - Result rc = ipcDispatch(session); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct ipcQueryPointerBufferSizeResponse { - u64 magic; - u64 result; - u32 size; - } *raw = (struct ipcQueryPointerBufferSizeResponse*)r.Raw; - - rc = raw->result; - - if (R_SUCCEEDED(rc)) { - *size = raw->size & 0xffff; - } - } - - return rc; -} - -/** - * @brief Closes the IPC session with proper clean up. - * @param session IPC session handle. - * @return Result code. - */ -static inline Result ipcCloseSession(Handle session) { - u32* buf = (u32*)armGetTls(); - buf[0] = IpcCommandType_Close; - buf[1] = 0; - return ipcDispatch(session); -} - -/** - * @brief Clones an IPC session. - * @param session IPC session handle. - * @param unk Unknown. - * @param new_session_out Output cloned IPC session handle. - * @return Result code. - */ -static inline Result ipcCloneSession(Handle session, u32 unk, Handle* new_session_out) { - u32* buf = (u32*)armGetTls(); - - buf[0] = IpcCommandType_Control; - buf[1] = 9; - buf[2] = 0; - buf[3] = 0; - buf[4] = SFCI_MAGIC; - buf[5] = 0; - buf[6] = 4; - buf[7] = 0; - buf[8] = unk; - - Result rc = ipcDispatch(session); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct ipcCloneSessionResponse { - u64 magic; - u64 result; - } *raw = (struct ipcCloneSessionResponse*)r.Raw; - - rc = raw->result; - - if (R_SUCCEEDED(rc) && new_session_out) { - *new_session_out = r.Handles[0]; - } - } - - return rc; -} - -///@} - -///@name IPC domain handling -///@{ - -/** - * @brief Converts an IPC session handle into a domain. - * @param session IPC session handle. - * @param object_id_out Output variable in which to store the object ID. - * @return Result code. - */ -static inline Result ipcConvertSessionToDomain(Handle session, u32* object_id_out) { - u32* buf = (u32*)armGetTls(); - - buf[0] = IpcCommandType_Control; - buf[1] = 8; - buf[4] = SFCI_MAGIC; - buf[5] = 0; - buf[6] = 0; - buf[7] = 0; - - Result rc = ipcDispatch(session); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct ipcConvertSessionToDomainResponse { - u64 magic; - u64 result; - u32 object_id; - } *raw = (struct ipcConvertSessionToDomainResponse*)r.Raw; - - rc = raw->result; - - if (R_SUCCEEDED(rc)) { - *object_id_out = raw->object_id; - } - } - - return rc; -} - -/** - * @brief Adds an object ID to be sent through an IPC domain command structure. - * @param cmd IPC domain command structure. - * @param object_id Object ID to send. - */ -static inline void ipcSendObjectId(IpcCommand* cmd, u32 object_id) { - cmd->ObjectIds[cmd->NumObjectIds++] = object_id; -} - -/** - * @brief Prepares the header of an IPC command structure (domain version). - * @param cmd IPC command structure. - * @param sizeof_raw Size in bytes of the raw data structure to embed inside the IPC request - * @param object_id Domain object ID. - * @return Pointer to the raw embedded data structure in the request, ready to be filled out. - */ -static inline void* ipcPrepareHeaderForDomain(IpcCommand* cmd, size_t sizeof_raw, u32 object_id) { - void* raw = ipcPrepareHeader(cmd, sizeof_raw + sizeof(DomainMessageHeader) + cmd->NumObjectIds*sizeof(u32)); - DomainMessageHeader* hdr = (DomainMessageHeader*) raw; - u32 *object_ids = (u32*)(((uintptr_t) raw) + sizeof(DomainMessageHeader) + sizeof_raw); - - hdr->Type = DomainMessageType_SendMessage; - hdr->NumObjectIds = (u8)cmd->NumObjectIds; - hdr->Length = sizeof_raw; - hdr->ThisObjectId = object_id; - hdr->Pad[0] = hdr->Pad[1] = 0; - - for(size_t i = 0; i < cmd->NumObjectIds; i++) - object_ids[i] = cmd->ObjectIds[i]; - return (void*)(((uintptr_t) raw) + sizeof(DomainMessageHeader)); -} - -/** - * @brief Parse an IPC command request into an IPC parsed command structure (domain version). - * @param r IPC parsed command structure to fill in. - * @return Result code. - */ -static inline Result ipcParseDomainRequest(IpcParsedCommand* r) { - Result rc = ipcParse(r); - DomainMessageHeader *hdr; - u32 *object_ids; - if(R_FAILED(rc)) - return rc; - - hdr = (DomainMessageHeader*) r->Raw; - object_ids = (u32*)(((uintptr_t) hdr) + sizeof(DomainMessageHeader) + hdr->Length); - r->Raw = (void*)(((uintptr_t) r->Raw) + sizeof(DomainMessageHeader)); - - r->IsDomainRequest = true; - r->InMessageType = (DomainMessageType)(hdr->Type); - switch (r->InMessageType) { - case DomainMessageType_SendMessage: - case DomainMessageType_Close: - break; - default: - return MAKERESULT(Module_Libnx, LibnxError_DomainMessageUnknownType); - } - - r->InThisObjectId = hdr->ThisObjectId; - r->InNumObjectIds = hdr->NumObjectIds > 8 ? 8 : hdr->NumObjectIds; - if ((uintptr_t)object_ids + sizeof(u32) * r->InNumObjectIds - (uintptr_t)armGetTls() >= 0x100) { - return MAKERESULT(Module_Libnx, LibnxError_DomainMessageTooManyObjectIds); - } - for(size_t i = 0; i < r->InNumObjectIds; i++) - r->InObjectIds[i] = object_ids[i]; - - return rc; -} - -/** - * @brief Parse an IPC command response into an IPC parsed command structure (domain version). - * @param r IPC parsed command structure to fill in. - * @param sizeof_raw Size in bytes of the raw data structure. - * @return Result code. - */ -static inline Result ipcParseDomainResponse(IpcParsedCommand* r, size_t sizeof_raw) { - Result rc = ipcParse(r); - DomainResponseHeader *hdr; - u32 *object_ids; - if(R_FAILED(rc)) - return rc; - - hdr = (DomainResponseHeader*) r->Raw; - r->Raw = (void*)(((uintptr_t) r->Raw) + sizeof(DomainResponseHeader)); - object_ids = (u32*)(((uintptr_t) r->Raw) + sizeof_raw);//Official sw doesn't align this. - - r->IsDomainResponse = true; - - r->OutNumObjectIds = hdr->NumObjectIds > 8 ? 8 : hdr->NumObjectIds; - if ((uintptr_t)object_ids + sizeof(u32) * r->OutNumObjectIds - (uintptr_t)armGetTls() >= 0x100) { - return MAKERESULT(Module_Libnx, LibnxError_DomainMessageTooManyObjectIds); - } - for(size_t i = 0; i < r->OutNumObjectIds; i++) - r->OutObjectIds[i] = object_ids[i]; - - return rc; -} - -/** - * @brief Closes a domain object by ID. - * @param session IPC session handle. - * @param object_id ID of the object to close. - * @return Result code. - */ -static inline Result ipcCloseObjectById(Handle session, u32 object_id) { - IpcCommand c; - DomainMessageHeader* hdr; - - ipcInitialize(&c); - hdr = (DomainMessageHeader*)ipcPrepareHeader(&c, sizeof(DomainMessageHeader)); - - hdr->Type = DomainMessageType_Close; - hdr->NumObjectIds = 0; - hdr->Length = 0; - hdr->ThisObjectId = object_id; - hdr->Pad[0] = hdr->Pad[1] = 0; - - return ipcDispatch(session); // this command has no associated response -} - -///@} diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/max17050.h b/Source/Horizon-OC-Monitor (deprecated)/include/max17050.h deleted file mode 100644 index e69ab9b1..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/max17050.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Fuel gauge driver for Nintendo Switch's Maxim 17050 - * - * Copyright (c) 2011 Samsung Electronics - * MyungJoo Ham - * Copyright (c) 2018-2020 CTCaer - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * Modified by: MasaGratoR - */ - -#ifndef __MAX17050_H_ -#define __MAX17050_H_ - -//#include -#include "i2c.h" - -/* Board default values */ -#define MAX17050_BOARD_CGAIN 2 /* Actual: 1.99993 */ -#define MAX17050_BOARD_SNS_RESISTOR_UOHM 5000 /* 0.005 Ohm */ - -//#define MAX17050_STATUS_BattAbsent BIT(3) - -/* Consider RepCap which is less then 10 units below FullCAP full */ -/* -#define MAX17050_FULL_THRESHOLD 10 - -#define MAX17050_CHARACTERIZATION_DATA_SIZE 48 - -#define MAXIM17050_I2C_ADDR 0x36 -*/ - -#define MAX17050_WAIT_NS 1000000000 - -constexpr float max17050SenseResistor = MAX17050_BOARD_SNS_RESISTOR_UOHM / 1000; // in uOhm -constexpr float max17050CGain = 1.99993; - - -enum MAX17050_reg { - MAX17050_STATUS = 0x00, - MAX17050_VALRT_Th = 0x01, - MAX17050_TALRT_Th = 0x02, - MAX17050_SALRT_Th = 0x03, - MAX17050_AtRate = 0x04, - MAX17050_RepCap = 0x05, - MAX17050_RepSOC = 0x06, - MAX17050_Age = 0x07, - MAX17050_TEMP = 0x08, - MAX17050_VCELL = 0x09, - MAX17050_Current = 0x0A, - MAX17050_AvgCurrent = 0x0B, - - MAX17050_SOC = 0x0D, - MAX17050_AvSOC = 0x0E, - MAX17050_RemCap = 0x0F, - MAX17050_FullCAP = 0x10, - MAX17050_TTE = 0x11, - MAX17050_QRTbl00 = 0x12, - MAX17050_FullSOCThr = 0x13, - MAX17050_RSLOW = 0x14, - - MAX17050_AvgTA = 0x16, - MAX17050_Cycles = 0x17, - MAX17050_DesignCap = 0x18, - MAX17050_AvgVCELL = 0x19, - MAX17050_MinMaxTemp = 0x1A, - MAX17050_MinMaxVolt = 0x1B, - MAX17050_MinMaxCurr = 0x1C, - MAX17050_CONFIG = 0x1D, - MAX17050_ICHGTerm = 0x1E, - MAX17050_AvCap = 0x1F, - MAX17050_ManName = 0x20, - MAX17050_DevName = 0x21, - MAX17050_QRTbl10 = 0x22, - MAX17050_FullCAPNom = 0x23, - MAX17050_TempNom = 0x24, - MAX17050_TempLim = 0x25, - MAX17050_TempHot = 0x26, - MAX17050_AIN = 0x27, - MAX17050_LearnCFG = 0x28, - MAX17050_FilterCFG = 0x29, - MAX17050_RelaxCFG = 0x2A, - MAX17050_MiscCFG = 0x2B, - MAX17050_TGAIN = 0x2C, - MAX17050_TOFF = 0x2D, - MAX17050_CGAIN = 0x2E, - MAX17050_COFF = 0x2F, - - MAX17050_QRTbl20 = 0x32, - MAX17050_SOC_empty = 0x33, - MAX17050_T_empty = 0x34, - MAX17050_FullCAP0 = 0x35, - MAX17050_LAvg_empty = 0x36, - MAX17050_FCTC = 0x37, - MAX17050_RCOMP0 = 0x38, - MAX17050_TempCo = 0x39, - MAX17050_V_empty = 0x3A, - MAX17050_K_empty0 = 0x3B, - MAX17050_TaskPeriod = 0x3C, - MAX17050_FSTAT = 0x3D, - MAX17050_TIMER = 0x3E, - MAX17050_SHDNTIMER = 0x3F, - - MAX17050_QRTbl30 = 0x42, - - MAX17050_dQacc = 0x45, - MAX17050_dPacc = 0x46, - - MAX17050_VFSOC0 = 0x48, - - Max17050_QH0 = 0x4C, - MAX17050_QH = 0x4D, - MAX17050_QL = 0x4E, - - MAX17050_MinVolt = 0x50, // Custom ID. Not to be sent to i2c. - MAX17050_MaxVolt = 0x51, // Custom ID. Not to be sent to i2c. - - MAX17050_VFSOC0Enable = 0x60, - MAX17050_MODELEnable1 = 0x62, - MAX17050_MODELEnable2 = 0x63, - - MAX17050_MODELChrTbl = 0x80, - - MAX17050_OCV = 0xEE, - - MAX17050_OCVInternal = 0xFB, - - MAX17050_VFSOC = 0xFF, -}; - -/* -int max17050_get_property(enum MAX17050_reg reg, int *value); -int max17050_fix_configuration(); -u32 max17050_get_cached_batt_volt(); -*/ -#endif /* __MAX17050_H_ */ - -Result Max17050ReadReg(u8 reg, u16 *out) -{ - u16 data = 0; - Result res = I2cReadRegHandler16(reg, I2cDevice_Max17050, &data); - - if (R_FAILED(res)) - { - return res; - } - - *out = data; - return res; -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/pcv_types.h b/Source/Horizon-OC-Monitor (deprecated)/include/pcv_types.h deleted file mode 100644 index 50d3e3ea..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/pcv_types.h +++ /dev/null @@ -1,41 +0,0 @@ -typedef enum { - PcvPowerDomain_Max77620_Sd0 = 0, - PcvPowerDomain_Max77620_Sd1 = 1, - PcvPowerDomain_Max77620_Sd2 = 2, - PcvPowerDomain_Max77620_Sd3 = 3, - PcvPowerDomain_Max77620_Ldo0 = 4, - PcvPowerDomain_Max77620_Ldo1 = 5, - PcvPowerDomain_Max77620_Ldo2 = 6, - PcvPowerDomain_Max77620_Ldo3 = 7, - PcvPowerDomain_Max77620_Ldo4 = 8, - PcvPowerDomain_Max77620_Ldo5 = 9, - PcvPowerDomain_Max77620_Ldo6 = 10, - PcvPowerDomain_Max77620_Ldo7 = 11, - PcvPowerDomain_Max77620_Ldo8 = 12, - PcvPowerDomain_Max77621_Cpu = 13, - PcvPowerDomain_Max77621_Gpu = 14, - PcvPowerDomain_Max77812_Cpu = 15, - PcvPowerDomain_Max77812_Gpu = 16, - PcvPowerDomain_Max77812_Dram = 17, -} PowerDomain; - -typedef enum { - PcvPowerDomainId_Max77620_Sd0 = 0x3A000080, - PcvPowerDomainId_Max77620_Sd1 = 0x3A000081, - PcvPowerDomainId_Max77620_Sd2 = 0x3A000082, - PcvPowerDomainId_Max77620_Sd3 = 0x3A000083, - PcvPowerDomainId_Max77620_Ldo0 = 0x3A0000A0, - PcvPowerDomainId_Max77620_Ldo1 = 0x3A0000A1, - PcvPowerDomainId_Max77620_Ldo2 = 0x3A0000A2, - PcvPowerDomainId_Max77620_Ldo3 = 0x3A0000A3, - PcvPowerDomainId_Max77620_Ldo4 = 0x3A0000A4, - PcvPowerDomainId_Max77620_Ldo5 = 0x3A0000A5, - PcvPowerDomainId_Max77620_Ldo6 = 0x3A0000A6, - PcvPowerDomainId_Max77620_Ldo7 = 0x3A0000A7, - PcvPowerDomainId_Max77620_Ldo8 = 0x3A0000A8, - PcvPowerDomainId_Max77621_Cpu = 0x3A000003, - PcvPowerDomainId_Max77621_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Cpu = 0x3A000003, - PcvPowerDomainId_Max77812_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Dram = 0x3A000005, -} PowerDomainId; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/pwm.h b/Source/Horizon-OC-Monitor (deprecated)/include/pwm.h deleted file mode 100644 index 559ff873..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/pwm.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - Service s; -} PwmChannelSession; - -Result pwmInitialize(void); -void pwmExit(void); -Service* pwmGetServiceSession(void); -Result pwmOpenSession2(PwmChannelSession *out, u32 device_code); -Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out); -void pwmChannelSessionClose(PwmChannelSession *c); - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/rgltr.h b/Source/Horizon-OC-Monitor (deprecated)/include/rgltr.h deleted file mode 100644 index dd57f4c5..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/rgltr.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include -#include "pcv_types.h" - -typedef struct { - Service s; -} RgltrSession; - -Result rgltrInitialize(void); - -void rgltrExit(void); - -Service* rgltrGetServiceSession(void); - -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); -void rgltrCloseSession(RgltrSession* session); -Result rgltrGetVoltage(RgltrSession* session, u32 *out_volt); -Result rgltrGetPowerModuleNumLimit(u32 *out); -Result rgltrGetVoltageEnabled(RgltrSession* session, u32 *out); diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/rgltr_services.h b/Source/Horizon-OC-Monitor (deprecated)/include/rgltr_services.h deleted file mode 100644 index 32becbf8..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/rgltr_services.h +++ /dev/null @@ -1,29 +0,0 @@ -// rgltr_services.h -// ======== -// Minimal header declarations for rgltr‐related functionality. -// Any file that wants to call rgltrOpenSession(), rgltrGetVoltage(), etc. should -// simply do `#include "infonx.h"` (NOT infonx.cpp). - -#pragma once - -#include // for Service, Result, hosversionBefore(), smGetService(), serviceClose(), etc. -#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. - -// Global service handle for "rgltr". Defined in infonx.cpp. -extern Service g_rgltrSrv; - -// Open/close the "rgltr" service. You must call rgltrInitialize() (once) before using -// rgltrOpenSession() & friends. Call rgltrExit() when your app is shutting down. -Result rgltrInitialize(void); -void rgltrExit(void); - -// Open a regulator session for the given PowerDomainId (e.g. CPU, GPU, DRAM). -// On success, (*session_out).s will contain a valid Service handle. -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); - -// Query the current voltage (in microvolts, µV) from a previously opened session. -// Writes the result into *out_volt. -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt); - -// Close a previously opened regulator session. -void rgltrCloseSession(RgltrSession* session); diff --git a/Source/Horizon-OC-Monitor (deprecated)/include/tmp451.h b/Source/Horizon-OC-Monitor (deprecated)/include/tmp451.h deleted file mode 100644 index 507585da..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/include/tmp451.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * SOC/PCB Temperature driver for Nintendo Switch's TI TMP451 - * - * Copyright (c) 2018 CTCaer - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * Modified by: MasaGratoR - */ - -#ifndef __TMP451_H_ -#define __TMP451_H_ - -//#include -#include "i2c.h" - -//#define TMP451_I2C_ADDR 0x4C - -#define TMP451_PCB_TEMP_REG 0x00 -#define TMP451_SOC_TEMP_REG 0x01 - -/* -#define TMP451_CONFIG_REG 0x09 -#define TMP451_CNV_RATE_REG 0x0A -*/ - -#define TMP451_SOC_TEMP_DEC_REG 0x10 -#define TMP451_PCB_TEMP_DEC_REG 0x15 - -/* -#define TMP451_SOC_TMP_OFH_REG 0x11 -#define TMP451_SOC_TMP_OFL_REG 0x12 -*/ - -// If input is false, the return value is packed. MSByte is the integer in oC -// and the LSByte is the decimal point truncated to 2 decimal places. -// Otherwise it's an integer oC. -/* -u16 tmp451_get_soc_temp(bool integer); -u16 tmp451_get_pcb_temp(bool integer); -void tmp451_init(); -void tmp451_end(); -*/ - -Result Tmp451ReadReg(u8 reg, u8 *out) -{ - u8 data = 0; - Result res = I2cReadRegHandler8(reg, I2cDevice_Tmp451, &data); - - if (R_FAILED(res)) - { - return res; - } - - *out = data; - return res; -} - -Result Tmp451GetSocTemp(float* temperature) { - u8 integer = 0; - u8 decimals = 0; - - Result rc = Tmp451ReadReg(TMP451_SOC_TEMP_REG, &integer); - if (R_FAILED(rc)) - return rc; - rc = Tmp451ReadReg(TMP451_SOC_TEMP_DEC_REG, &decimals); - if (R_FAILED(rc)) - return rc; - - decimals = ((u16)(decimals >> 4) * 625) / 100; - *temperature = (float)(integer) + ((float)(decimals) / 100); - return rc; -} - -Result Tmp451GetPcbTemp(float* temperature) { - u8 integer = 0; - u8 decimals = 0; - - Result rc = Tmp451ReadReg(TMP451_PCB_TEMP_REG, &integer); - if (R_FAILED(rc)) - return rc; - rc = Tmp451ReadReg(TMP451_PCB_TEMP_DEC_REG, &decimals); - if (R_FAILED(rc)) - return rc; - - decimals = ((u16)(decimals >> 4) * 625) / 100; - *temperature = (float)(integer) + ((float)(decimals) / 100); - return rc; -} - -#endif /* __TMP451_H_ */ diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/de.json b/Source/Horizon-OC-Monitor (deprecated)/lang/de.json deleted file mode 100644 index f7c9a332..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/de.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modi", - "Modes   Configure": "Modi   Konfigurieren", - "Full": "Voll", - "Mini": "Mini", - "Micro": "Mikro", - "FPS Graph": "FPS-Diagramm", - "FPS Counter": "FPS-Zähler", - "Game Resolutions": "Spielauflösungen", - "Other": "Sonstiges", - "Battery/Charger": "Akku/Ladegerät", - "Miscellaneous": "Verschiedenes", - "CPU Usage": "CPU-Auslastung", - "GPU Usage": "GPU-Auslastung", - "RAM Usage": "RAM-Auslastung", - "Target Frequency": "Ziel-Frequenz", - "Real Frequency": "Aktuelle Frequenz", - "Core 0 ": "Kern 0 ", - "Core 1 ": "Kern 1 ", - "Core 2 ": "Kern 2 ", - "Core 3 ": "Kern 3 ", - "Load": "Auslastung", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Gesamt\nAnwendung\nApplet\nSystem\nSystem (unsicher)", - "Board": "Board", - "Battery Power Flow": "Akkuleistungsfluss", - "\nTemperatures": "\nTemperaturen", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Lüfterdrehzahl", - "Game": "Spiel", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Auflösungen ", - "Read Speed ": "Lesegeschwindigkeit ", - "Press ": "Drücke ", - " to Exit": " zum Beenden", - "Depth": "Tiefe", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Spiel läuft nicht\noder ist inkompatibel.", - "Battery Stats": "Akkustatistiken", - "Actual Capacity": "Aktuelle Kapazität", - "Designed Capacity": "Nennkapazität", - "Temperature": "Temperatur", - "Raw Charge": "Rohladung", - "Age": "Alter", - "Voltage": "Spannung", - "Current Flow": "Stromfluss", - "Power Flow": "Leistungsfluss", - "Remaining Time": "Verbleibende Zeit", - "Charger Stats": "Ladegerät-Statistiken", - "Input Current Limit": "Eingangsstrombegrenzung", - "VBUS Current Limit": "VBUS-Strombegrenzung", - "Voltage Limit": "Spannungsbegrenzung", - "Current Limit": "Strombegrenzung", - "Type": "Typ", - "Max Voltage": "Max. Spannung", - "Max Current": "Max. Strom", - "Multimedia Clock Rates": "Multimedia-Taktraten", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Netzwerk", - "Type: Wi-Fi": "Typ: Wi-Fi", - "Press Y to show password": "Drücke Y, um Passwort anzuzeigen", - "Type: Ethernet": "Typ: Ethernet", - "Type: Not connected": "Typ: Nicht verbunden", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elemente   Nach unten   Nach oben", - "Transparent": "Transparent", - "Opaque": "Undurchsichtig", - "Alpha": "Alpha", - "Pretty": "Hübsch", - "Compact": "Kompakt", - "FileSafe": "Dateisicher", - "Day+Time": "Tag+Uhrzeit", - "Date+Time(s)": "Datum+Uhrzeit(s)", - "Date+Time AM/PM": "Datum+Uhrzeit AM/PM", - "Date+Time(s) AM/PM": "Datum+Uhrzeit(s) AM/PM", - "Date+Time EU": "Datum+Uhrzeit EU", - "Date+Time EU AM/PM": "Datum+Uhrzeit EU AM/PM", - "Date+Time(s) EU AM/PM": "Datum+Uhrzeit(s) EU AM/PM", - "Date+Time ISO": "Datum+Uhrzeit ISO", - "Time 24h": "Uhrzeit 24h", - "Time AM/PM": "Uhrzeit AM/PM", - "Time(s) 24h": "Uhrzeit(s) 24h", - "Time(s) AM/PM": "Uhrzeit(s) AM/PM", - "Date US": "Datum US", - "Date EU": "Datum EU", - "Date ISO": "Datum ISO", - "Date Short": "Datum kurz", - "DTC Format": "DTC-Format", - "Toggles": "Schalter", - "Info": "Info anzeigen", - "Disable Screenshots": "Bildschirmfotos deaktivieren", - "Real Freqs": "Aktuelle Frequenzen", - "Deltas": "Deltas", - "Target Freqs": "Ziel-Frequenzen", - "FPS": "FPS", - "RES": "AUFL", - "Read Speed": "Lesegeschwindigkeit", - "Real Frequencies": "Aktuelle Frequenzen", - "Real Voltages": "Aktuelle Spannungen", - "Full CPU": "Volle CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Volle Auflösung", - "SOC Voltage": "SOC-Spannung", - "RAM Load CPU/GPU": "RAM-Last CPU/GPU", - "Use DTC Symbol": "DTC-Symbol verwenden", - "Use Dynamic Colors": "Dynamische Farben verwenden", - "Sleep Exit": "Beenden aus Ruhezustand", - "Configuration": "Konfiguration", - "Refresh Rate": "Bildwiederholrate", - "Frame Padding": "Rahmenabstand", - " Font Size": " Schriftgröße", - "Font Sizes": "Schriftgrößen", - "Handheld Font Size": "Handheld-Schriftgröße", - "Docked Font Size": "Docked-Schriftgröße", - "Black": "Schwarz", - "Dark Gray": "Dunkelgrau", - "Gray": "Grau", - "Light Gray": "Hellgrau", - "Silver": "Silber", - "White": "Weiß", - "Dark Red": "Dunkelrot", - "Red": "Rot", - "Light Red": "Hellrot", - "Pink": "Pink", - "Dark Green": "Dunkelgrün", - "Green": "Grün", - "Lime Green": "Limette", - "Light Green": "Hellgrün", - "Dark Blue": "Dunkelblau", - "Blue": "Blau", - "Light Blue": "Hellblau", - "Sky Blue": "Himmelblau", - "Dark Purple": "Dunkellila", - "Purple": "Lila", - "Light Purple": "Helllila", - "Violet": "Violett", - "Orange": "Orange", - "Yellow": "Gelb", - "Light Yellow": "Hellgelb", - "Teal": "Petrol", - "Cyan": "Cyan", - "Light Cyan": "Hellcyan", - "Magenta": "Magenta", - "Hot Pink": "Knallpink", - "Brown": "Braun", - "Light Brown": "Hellbraun", - "Colors": "Farben", - "Background Color": "Hintergrundfarbe", - "Background Alpha": "Hintergrund-Alpha", - "Focus Color": "Fokusfarbe", - "Focus Alpha": "Fokus-Alpha", - "Text Color": "Textfarbe", - "Border": "Rahmen", - "Dashed Line": "Gestrichelte Linie", - "Max FPS Text": "Max-FPS-Text", - "Min FPS Text": "Min-FPS-Text", - "Main Line": "Hauptlinie", - "Rounded Line": "Abgerundete Linie", - "Perfect Line": "Perfekte Linie", - " Color": " Farbe", - " Alpha": " Alpha", - "Category Color": "Kategoriefarbe", - "Category Color 1": "Kategoriefarbe 1", - "Category Color 2": "Kategoriefarbe 2", - "Separator Color": "Trennlinienfarbe", - "Elements": "Elemente", - "Text Alignment": "Textausrichtung", - "Vertical Position": "Vertikale Position", - "Horizontal Position": "Horizontale Position", - "Left": "Links", - "Right": "Rechts", - "Top": "Oben", - "Center": "Mitte", - "Bottom": "Unten", - "FPS Counter Color": "FPS-Zähler-Farbe", - "FPS Counter Alpha": "FPS-Zähler-Alpha", - "Border Color": "Rahmenfarbe", - "Dashed Line Color": "Gestrichelte-Linie-Farbe", - "Dashed Line Alpha": "Gestrichelte-Linie-Alpha", - "Max FPS Text Color": "Max-FPS-Textfarbe", - "Min FPS Text Color": "Min-FPS-Textfarbe", - "Main Line Color": "Hauptlinienfarbe", - "Rounded Line Color": "Abgerundete-Linienfarbe", - "Perfect Line Color": "Perfekte-Linienfarbe" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/en.json b/Source/Horizon-OC-Monitor (deprecated)/lang/en.json deleted file mode 100644 index 836b8f0d..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/en.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modes", - "Modes   Configure": "Modes   Configure", - "Full": "Full", - "Mini": "Mini", - "Micro": "Micro", - "FPS Graph": "FPS Graph", - "FPS Counter": "FPS Counter", - "Game Resolutions": "Game Resolutions", - "Other": "Other", - "Battery/Charger": "Battery/Charger", - "Miscellaneous": "Miscellaneous", - "CPU Usage": "CPU Usage", - "GPU Usage": "GPU Usage", - "RAM Usage": "RAM Usage", - "Target Frequency": "Target Frequency", - "Real Frequency": "Real Frequency", - "Core 0 ": "Core 0 ", - "Core 1 ": "Core 1 ", - "Core 2 ": "Core 2 ", - "Core 3 ": "Core 3 ", - "Load": "Load", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Total\nApplication\nApplet\nSystem\nSystem Unsafe", - "Board": "Board", - "Battery Power Flow": "Battery Power Flow", - "\nTemperatures": "\nTemperatures", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Fan Rotation Level", - "Game": "Game", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Resolutions ", - "Read Speed ": "Read speed ", - "Press ": "Press ", - " to Exit": " to Exit", - "Depth": "Depth", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Game is not running\nor it's incompatible.", - "Battery Stats": "Battery Stats", - "Actual Capacity": "Actual Capacity", - "Designed Capacity": "Designed Capacity", - "Temperature": "Temperature", - "Raw Charge": "Raw Charge", - "Age": "Age", - "Voltage": "Voltage", - "Current Flow": "Current Flow", - "Power Flow": "Power Flow", - "Remaining Time": "Remaining Time", - "Charger Stats": "Charger Stats", - "Input Current Limit": "Input Current Limit", - "VBUS Current Limit": "VBUS Current Limit", - "Voltage Limit": "Voltage Limit", - "Current Limit": "Current Limit", - "Type": "Type", - "Max Voltage": "Max Voltage", - "Max Current": "Max Current", - "Multimedia Clock Rates": "Multimedia Clock Rates", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Network", - "Type: Wi-Fi": "Type: Wi-Fi", - "Press Y to show password": "Press Y to show password", - "Type: Ethernet": "Type: Ethernet", - "Type: Not connected": "Tipo: Not connected", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elements   Move Down   Move Up", - "Transparent": "Transparent", - "Opaque": "Opaque", - "Alpha": "Alpha", - "Pretty": "Pretty", - "Compact": "Compact", - "FileSafe": "FileSafe", - "Day+Time": "Day+Time", - "Date+Time(s)": "Date+Time(s)", - "Date+Time AM/PM": "Date+Time AM/PM", - "Date+Time(s) AM/PM": "Date+Time(s) AM/PM", - "Date+Time EU": "Date+Time EU", - "Date+Time EU AM/PM": "Date+Time EU AM/PM", - "Date+Time(s) EU AM/PM": "Date+Time(s) EU AM/PM", - "Date+Time ISO": "Date+Time ISO", - "Time 24h": "Time 24h", - "Time AM/PM": "Time AM/PM", - "Time(s) 24h": "Time(s) 24h", - "Time(s) AM/PM": "Time(s) AM/PM", - "Date US": "Date US", - "Date EU": "Date EU", - "Date ISO": "Date ISO", - "Date Short": "Date Short", - "DTC Format": "DTC Format", - "Toggles": "Toggles", - "Info": "Show Info", - "Disable Screenshots": "Disable Screenshots", - "Real Freqs": "Real Freqs", - "Deltas": "Deltas", - "Target Freqs": "Target Freqs", - "FPS": "FPS", - "RES": "RES", - "Read Speed": "Read Speed", - "Real Frequencies": "Real Frequencies", - "Real Voltages": "Real Voltages", - "Full CPU": "Full CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Full Resolution", - "SOC Voltage": "SOC Voltage", - "RAM Load CPU/GPU": "RAM Load CPU/GPU", - "Use DTC Symbol": "Use DTC Symbol", - "Use Dynamic Colors": "Use Dynamic Colors", - "Sleep Exit": "Sleep Exit", - "Configuration": "Configuration", - "Refresh Rate": "Refresh Rate", - "Frame Padding": "Frame Padding", - " Font Size": " Font Size", - "Font Sizes": "Font Sizes", - "Handheld Font Size": "Handheld Font Size", - "Docked Font Size": "Docked Font Size", - "Black": "Black", - "Dark Gray": "Dark Gray", - "Gray": "Gray", - "Light Gray": "Light Gray", - "Silver": "Silver", - "White": "White", - "Dark Red": "Dark Red", - "Red": "Red", - "Light Red": "Light Red", - "Pink": "Pink", - "Dark Green": "Dark Green", - "Green": "Green", - "Lime Green": "Lime Green", - "Light Green": "Light Green", - "Dark Blue": "Dark Blue", - "Blue": "Blue", - "Light Blue": "Light Blue", - "Sky Blue": "Sky Blue", - "Dark Purple": "Dark Purple", - "Purple": "Purple", - "Light Purple": "Light Purple", - "Violet": "Violet", - "Orange": "Orange", - "Yellow": "Yellow", - "Light Yellow": "Light Yellow", - "Teal": "Teal", - "Cyan": "Cyan", - "Light Cyan": "Light Cyan", - "Magenta": "Magenta", - "Hot Pink": "Hot Pink", - "Brown": "Brown", - "Light Brown": "Light Brown", - "Colors": "Colors", - "Background Color": "Background Color", - "Background Alpha": "Background Alpha", - "Focus Color": "Focus Color", - "Focus Alpha": "Focus Alpha", - "Text Color": "Text Color", - "Border": "Border", - "Dashed Line": "Dashed Line", - "Max FPS Text": "Max FPS Text", - "Min FPS Text": "Min FPS Text", - "Main Line": "Main Line", - "Rounded Line": "Rounded Line", - "Perfect Line": "Perfect Line", - " Color": " Color", - " Alpha": " Alpha", - "Category Color": "Category Color", - "Category Color 1": "Category Color 1", - "Category Color 2": "Category Color 2", - "Separator Color": "Separator Color", - "Elements": "Elements", - "Text Alignment": "Text Alignment", - "Vertical Position": "Vertical Position", - "Horizontal Position": "Horizontal Position", - "Left": "Left", - "Right": "Right", - "Top": "Top", - "Center": "Center", - "Bottom": "Bottom", - "FPS Counter Color":"FPS Counter Color", - "FPS Counter Alpha":"FPS Counter Alpha", - "Border Color":"Border Color", - "Dashed Line Color":"Dashed Line Color", - "Dashed Line Alpha":"Dashed Line Alpha", - "Max FPS Text Color":"Max FPS Text Color", - "Min FPS Text Color":"Min FPS Text Color", - "Main Line Color":"Main Line Color", - "Rounded Line Color":"Rounded Line Color", - "Perfect Line Color":"Perfect Line Color" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/es.json b/Source/Horizon-OC-Monitor (deprecated)/lang/es.json deleted file mode 100644 index bacf1152..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/es.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modos", - "Modes   Configure": "Modos   Configurar", - "Full": "Completo", - "Mini": "Mini", - "Micro": "Micro", - "FPS Graph": "Gráfico FPS", - "FPS Counter": "Contador FPS", - "Game Resolutions": "Resoluciones del juego", - "Other": "Otros", - "Battery/Charger": "Batería/Cargador", - "Miscellaneous": "Varios", - "CPU Usage": "Uso de CPU", - "GPU Usage": "Uso de GPU", - "RAM Usage": "Uso de RAM", - "Target Frequency": "Frecuencia objetivo", - "Real Frequency": "Frecuencia real", - "Core 0 ": "Núcleo 0 ", - "Core 1 ": "Núcleo 1 ", - "Core 2 ": "Núcleo 2 ", - "Core 3 ": "Núcleo 3 ", - "Load": "Carga", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Total\nAplicación\nApplet\nSistema\nSistema (inseguro)", - "Board": "Placa", - "Battery Power Flow": "Flujo de energía de batería", - "\nTemperatures": "\nTemperaturas", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Nivel de rotación del ventilador", - "Game": "Juego", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Resoluciones ", - "Read Speed ": "Velocidad de lectura ", - "Press ": "Pulsa ", - " to Exit": " para salir", - "Depth": "Profundidad", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "El juego no está en ejecución\no es incompatible.", - "Battery Stats": "Estadísticas de batería", - "Actual Capacity": "Capacidad actual", - "Designed Capacity": "Capacidad nominal", - "Temperature": "Temperatura", - "Raw Charge": "Carga bruta", - "Age": "Edad", - "Voltage": "Voltaje", - "Current Flow": "Flujo de corriente", - "Power Flow": "Flujo de potencia", - "Remaining Time": "Tiempo restante", - "Charger Stats": "Estadísticas del cargador", - "Input Current Limit": "Límite de corriente de entrada", - "VBUS Current Limit": "Límite de corriente VBUS", - "Voltage Limit": "Límite de voltaje", - "Current Limit": "Límite de corriente", - "Type": "Tipo", - "Max Voltage": "Voltaje máx.", - "Max Current": "Corriente máx.", - "Multimedia Clock Rates": "Frecuencias de reloj multimedia", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Red", - "Type: Wi-Fi": "Tipo: Wi-Fi", - "Press Y to show password": "Pulsa Y para mostrar contraseña", - "Type: Ethernet": "Tipo: Ethernet", - "Type: Not connected": "Tipo: No conectado", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elementos   Bajar   Subir", - "Transparent": "Transparente", - "Opaque": "Opaco", - "Alpha": "Alfa", - "Pretty": "Bonito", - "Compact": "Compacto", - "FileSafe": "FileSafe", - "Day+Time": "Día+Hora", - "Date+Time(s)": "Fecha+Hora(s)", - "Date+Time AM/PM": "Fecha+Hora AM/PM", - "Date+Time(s) AM/PM": "Fecha+Hora(s) AM/PM", - "Date+Time EU": "Fecha+Hora EU", - "Date+Time EU AM/PM": "Fecha+Hora EU AM/PM", - "Date+Time(s) EU AM/PM": "Fecha+Hora(s) EU AM/PM", - "Date+Time ISO": "Fecha+Hora ISO", - "Time 24h": "Hora 24h", - "Time AM/PM": "Hora AM/PM", - "Time(s) 24h": "Hora(s) 24h", - "Time(s) AM/PM": "Hora(s) AM/PM", - "Date US": "Fecha EE.UU.", - "Date EU": "Fecha EU", - "Date ISO": "Fecha ISO", - "Date Short": "Fecha corta", - "DTC Format": "Formato DTC", - "Toggles": "Conmutadores", - "Info": "Mostrar info", - "Disable Screenshots": "Desactivar capturas", - "Real Freqs": "Frecuencias reales", - "Deltas": "Deltas", - "Target Freqs": "Frecuencias objetivo", - "FPS": "FPS", - "RES": "RES", - "Read Speed": "Velocidad de lectura", - "Real Frequencies": "Frecuencias reales", - "Real Voltages": "Voltajes reales", - "Full CPU": "CPU completo", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Resolución completa", - "SOC Voltage": "Voltaje SOC", - "RAM Load CPU/GPU": "Carga RAM CPU/GPU", - "Use DTC Symbol": "Usar símbolo DTC", - "Use Dynamic Colors": "Usar colores dinámicos", - "Sleep Exit": "Salir del reposo", - "Configuration": "Configuración", - "Refresh Rate": "Tasa de refresco", - "Frame Padding": "Relleno de marco", - " Font Size": " Tamaño de fuente", - "Font Sizes": "Tamaños de fuente", - "Handheld Font Size": "Tamaño fuente portátil", - "Docked Font Size": "Tamaño fuente acoplado", - "Black": "Negro", - "Dark Gray": "Gris oscuro", - "Gray": "Gris", - "Light Gray": "Gris claro", - "Silver": "Plata", - "White": "Blanco", - "Dark Red": "Rojo oscuro", - "Red": "Rojo", - "Light Red": "Rojo claro", - "Pink": "Rosa", - "Dark Green": "Verde oscuro", - "Green": "Verde", - "Lime Green": "Verde lima", - "Light Green": "Verde claro", - "Dark Blue": "Azul oscuro", - "Blue": "Azul", - "Light Blue": "Azul claro", - "Sky Blue": "Azul cielo", - "Dark Purple": "Púrpura oscuro", - "Purple": "Púrpura", - "Light Purple": "Púrpura claro", - "Violet": "Violeta", - "Orange": "Naranja", - "Yellow": "Amarillo", - "Light Yellow": "Amarillo claro", - "Teal": "Verde azulado", - "Cyan": "Cian", - "Light Cyan": "Cian claro", - "Magenta": "Magenta", - "Hot Pink": "Rosa intenso", - "Brown": "Marrón", - "Light Brown": "Marrón claro", - "Colors": "Colores", - "Background Color": "Color de fondo", - "Background Alpha": "Alfa de fondo", - "Focus Color": "Color de foco", - "Focus Alpha": "Alfa de foco", - "Text Color": "Color de texto", - "Border": "Borde", - "Dashed Line": "Línea discontinua", - "Max FPS Text": "Texto FPS máx.", - "Min FPS Text": "Texto FPS mín.", - "Main Line": "Línea principal", - "Rounded Line": "Línea redondeada", - "Perfect Line": "Línea perfecta", - " Color": " Color", - " Alpha": " Alfa", - "Category Color": "Color de categoría", - "Category Color 1": "Color categoría 1", - "Category Color 2": "Color categoría 2", - "Separator Color": "Color separador", - "Elements": "Elementos", - "Text Alignment": "Alineación de texto", - "Vertical Position": "Posición vertical", - "Horizontal Position": "Posición horizontal", - "Left": "Izquierda", - "Right": "Derecha", - "Top": "Arriba", - "Center": "Centro", - "Bottom": "Abajo", - "FPS Counter Color": "Color contador FPS", - "FPS Counter Alpha": "Alfa contador FPS", - "Border Color": "Color de borde", - "Dashed Line Color": "Color línea discontinua", - "Dashed Line Alpha": "Alfa línea discontinua", - "Max FPS Text Color": "Color texto FPS máx.", - "Min FPS Text Color": "Color texto FPS mín.", - "Main Line Color": "Color línea principal", - "Rounded Line Color": "Color línea redondeada", - "Perfect Line Color": "Color línea perfecta" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/fr.json b/Source/Horizon-OC-Monitor (deprecated)/lang/fr.json deleted file mode 100644 index 95bc2d9e..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/fr.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modes", - "Modes   Configure": "Modes   Configurer", - "Full": "Complet", - "Mini": "Mini", - "Micro": "Micro", - "FPS Graph": "Graphique FPS", - "FPS Counter": "Compteur FPS", - "Game Resolutions": "Résolutions du jeu", - "Other": "Autres", - "Battery/Charger": "Batterie/Chargeur", - "Miscellaneous": "Divers", - "CPU Usage": "Utilisation CPU", - "GPU Usage": "Utilisation GPU", - "RAM Usage": "Utilisation RAM", - "Target Frequency": "Fréquence cible", - "Real Frequency": "Fréquence réelle", - "Core 0 ": "Cœur 0 ", - "Core 1 ": "Cœur 1 ", - "Core 2 ": "Cœur 2 ", - "Core 3 ": "Cœur 3 ", - "Load": "Charge", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Total\nApplication\nApplet\nSystème\nSystème non sécurisé", - "Board": "Carte", - "Battery Power Flow": "Flux de puissance batterie", - "\nTemperatures": "\nTempératures", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Niveau de rotation ventilateur", - "Game": "Jeu", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Résolutions ", - "Read Speed ": "Vitesse de lecture ", - "Press ": "Appuyez sur ", - " to Exit": " pour quitter", - "Depth": "Profondeur", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Le jeu ne fonctionne pas\nou est incompatible.", - "Battery Stats": "Statistiques batterie", - "Actual Capacity": "Capacité actuelle", - "Designed Capacity": "Capacité nominale", - "Temperature": "Température", - "Raw Charge": "Charge brute", - "Age": "Âge", - "Voltage": "Tension", - "Current Flow": "Flux de courant", - "Power Flow": "Flux de puissance", - "Remaining Time": "Temps restant", - "Charger Stats": "Statistiques chargeur", - "Input Current Limit": "Limite courant entrée", - "VBUS Current Limit": "Limite courant VBUS", - "Voltage Limit": "Limite tension", - "Current Limit": "Limite courant", - "Type": "Type", - "Max Voltage": "Tension max", - "Max Current": "Courant max", - "Multimedia Clock Rates": "Fréquences horloge multimédia", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Réseau", - "Type: Wi-Fi": "Type : Wi-Fi", - "Press Y to show password": "Appuyez sur Y pour afficher le mot de passe", - "Type: Ethernet": "Type : Ethernet", - "Type: Not connected": "Type : Non connecté", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Éléments   Descendre   Monter", - "Transparent": "Transparent", - "Opaque": "Opaque", - "Alpha": "Alpha", - "Pretty": "Joli", - "Compact": "Compact", - "FileSafe": "FileSafe", - "Day+Time": "Jour+Heure", - "Date+Time(s)": "Date+Heure(s)", - "Date+Time AM/PM": "Date+Heure AM/PM", - "Date+Time(s) AM/PM": "Date+Heure(s) AM/PM", - "Date+Time EU": "Date+Heure EU", - "Date+Time EU AM/PM": "Date+Heure EU AM/PM", - "Date+Time(s) EU AM/PM": "Date+Heure(s) EU AM/PM", - "Date+Time ISO": "Date+Heure ISO", - "Time 24h": "Heure 24h", - "Time AM/PM": "Heure AM/PM", - "Time(s) 24h": "Heure(s) 24h", - "Time(s) AM/PM": "Heure(s) AM/PM", - "Date US": "Date US", - "Date EU": "Date EU", - "Date ISO": "Date ISO", - "Date Short": "Date courte", - "DTC Format": "Format DTC", - "Toggles": "Basculement", - "Info": "Afficher infos", - "Disable Screenshots": "Désactiver captures d'écran", - "Real Freqs": "Fréquences réelles", - "Deltas": "Deltas", - "Target Freqs": "Fréquences cibles", - "FPS": "FPS", - "RES": "RÉS", - "Read Speed": "Vitesse de lecture", - "Real Frequencies": "Fréquences réelles", - "Real Voltages": "Tensions réelles", - "Full CPU": "CPU complet", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Résolution complète", - "SOC Voltage": "Tension SOC", - "RAM Load CPU/GPU": "Charge RAM CPU/GPU", - "Use DTC Symbol": "Utiliser symbole DTC", - "Use Dynamic Colors": "Utiliser couleurs dynamiques", - "Sleep Exit": "Sortie veille", - "Configuration": "Configuration", - "Refresh Rate": "Taux de rafraîchissement", - "Frame Padding": "Marge de cadre", - " Font Size": " Taille police", - "Font Sizes": "Tailles de police", - "Handheld Font Size": "Taille police portable", - "Docked Font Size": "Taille police dockée", - "Black": "Noir", - "Dark Gray": "Gris foncé", - "Gray": "Gris", - "Light Gray": "Gris clair", - "Silver": "Argent", - "White": "Blanc", - "Dark Red": "Rouge foncé", - "Red": "Rouge", - "Light Red": "Rouge clair", - "Pink": "Rose", - "Dark Green": "Vert foncé", - "Green": "Vert", - "Lime Green": "Vert citron", - "Light Green": "Vert clair", - "Dark Blue": "Bleu foncé", - "Blue": "Bleu", - "Light Blue": "Bleu clair", - "Sky Blue": "Bleu ciel", - "Dark Purple": "Violet foncé", - "Purple": "Violet", - "Light Purple": "Violet clair", - "Violet": "Violet", - "Orange": "Orange", - "Yellow": "Jaune", - "Light Yellow": "Jaune clair", - "Teal": "Sarcelle", - "Cyan": "Cyan", - "Light Cyan": "Cyan clair", - "Magenta": "Magenta", - "Hot Pink": "Rose vif", - "Brown": "Marron", - "Light Brown": "Marron clair", - "Colors": "Couleurs", - "Background Color": "Couleur d'arrière-plan", - "Background Alpha": "Alpha d'arrière-plan", - "Focus Color": "Couleur de focus", - "Focus Alpha": "Alpha de focus", - "Text Color": "Couleur du texte", - "Border": "Bordure", - "Dashed Line": "Ligne pointillée", - "Max FPS Text": "Texte FPS max", - "Min FPS Text": "Texte FPS min", - "Main Line": "Ligne principale", - "Rounded Line": "Ligne arrondie", - "Perfect Line": "Ligne parfaite", - " Color": " Couleur", - " Alpha": " Alpha", - "Category Color": "Couleur de catégorie", - "Category Color 1": "Couleur catégorie 1", - "Category Color 2": "Couleur catégorie 2", - "Separator Color": "Couleur de séparateur", - "Elements": "Éléments", - "Text Alignment": "Alignement du texte", - "Vertical Position": "Position verticale", - "Horizontal Position": "Position horizontale", - "Left": "Gauche", - "Right": "Droite", - "Top": "Haut", - "Center": "Centre", - "Bottom": "Bas", - "FPS Counter Color": "Couleur compteur FPS", - "FPS Counter Alpha": "Alpha compteur FPS", - "Border Color": "Couleur de bordure", - "Dashed Line Color": "Couleur ligne pointillée", - "Dashed Line Alpha": "Alpha ligne pointillée", - "Max FPS Text Color": "Couleur texte FPS max", - "Min FPS Text Color": "Couleur texte FPS min", - "Main Line Color": "Couleur ligne principale", - "Rounded Line Color": "Couleur ligne arrondie", - "Perfect Line Color": "Couleur ligne parfaite" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/it.json b/Source/Horizon-OC-Monitor (deprecated)/lang/it.json deleted file mode 100644 index 3a76ba57..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/it.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modalità", - "Modes   Configure": "Modalità   Configura", - "Full": "Completo", - "Mini": "Mini", - "Micro": "Micro", - "FPS Graph": "Grafico FPS", - "FPS Counter": "Contatore FPS", - "Game Resolutions": "Risoluzioni di gioco", - "Other": "Altro", - "Battery/Charger": "Batteria/Caricatore", - "Miscellaneous": "Varie", - "CPU Usage": "Utilizzo CPU", - "GPU Usage": "Utilizzo GPU", - "RAM Usage": "Utilizzo RAM", - "Target Frequency": "Frequenza target", - "Real Frequency": "Frequenza reale", - "Core 0 ": "Core 0 ", - "Core 1 ": "Core 1 ", - "Core 2 ": "Core 2 ", - "Core 3 ": "Core 3 ", - "Load": "Carico", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Totale\nApplicazione\nApplet\nSistema\nSistema non sicuro", - "Board": "Scheda", - "Battery Power Flow": "Flusso potenza batteria", - "\nTemperatures": "\nTemperature", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Livello rotazione ventola", - "Game": "Gioco", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Risoluzioni ", - "Read Speed ": "Velocità di lettura ", - "Press ": "Premi ", - " to Exit": " per uscire", - "Depth": "Profondità", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Il gioco non è in esecuzione\no è incompatibile.", - "Battery Stats": "Statistiche batteria", - "Actual Capacity": "Capacità attuale", - "Designed Capacity": "Capacità nominale", - "Temperature": "Temperatura", - "Raw Charge": "Carica grezza", - "Age": "Età", - "Voltage": "Voltaggio", - "Current Flow": "Flusso corrente", - "Power Flow": "Flusso potenza", - "Remaining Time": "Tempo rimanente", - "Charger Stats": "Statistiche caricatore", - "Input Current Limit": "Limite corrente ingresso", - "VBUS Current Limit": "Limite corrente VBUS", - "Voltage Limit": "Limite tensione", - "Current Limit": "Limite corrente", - "Type": "Tipo", - "Max Voltage": "Tensione max", - "Max Current": "Corrente max", - "Multimedia Clock Rates": "Frequenze clock multimediali", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Rete", - "Type: Wi-Fi": "Tipo: Wi-Fi", - "Press Y to show password": "Premi Y per mostrare la password", - "Type: Ethernet": "Tipo: Ethernet", - "Type: Not connected": "Tipo: Non connesso", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elementi   Sposta giù   Sposta su", - "Transparent": "Trasparente", - "Opaque": "Opaco", - "Alpha": "Alfa", - "Pretty": "Carino", - "Compact": "Compatto", - "FileSafe": "FileSafe", - "Day+Time": "Giorno+Ora", - "Date+Time(s)": "Data+Ora(s)", - "Date+Time AM/PM": "Data+Ora AM/PM", - "Date+Time(s) AM/PM": "Data+Ora(s) AM/PM", - "Date+Time EU": "Data+Ora EU", - "Date+Time EU AM/PM": "Data+Ora EU AM/PM", - "Date+Time(s) EU AM/PM": "Data+Ora(s) EU AM/PM", - "Date+Time ISO": "Data+Ora ISO", - "Time 24h": "Ora 24h", - "Time AM/PM": "Ora AM/PM", - "Time(s) 24h": "Ora(s) 24h", - "Time(s) AM/PM": "Ora(s) AM/PM", - "Date US": "Data US", - "Date EU": "Data EU", - "Date ISO": "Data ISO", - "Date Short": "Data breve", - "DTC Format": "Formato DTC", - "Toggles": "Interruttori", - "Info": "Mostra info", - "Disable Screenshots": "Disabilita screenshot", - "Real Freqs": "Frequenze reali", - "Deltas": "Delta", - "Target Freqs": "Frequenze target", - "FPS": "FPS", - "RES": "RIS", - "Read Speed": "Velocità di lettura", - "Real Frequencies": "Frequenze reali", - "Real Voltages": "Voltaggi reali", - "Full CPU": "CPU completo", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Risoluzione completa", - "SOC Voltage": "Voltaggio SOC", - "RAM Load CPU/GPU": "Carico RAM CPU/GPU", - "Use DTC Symbol": "Usa simbolo DTC", - "Use Dynamic Colors": "Usa colori dinamici", - "Sleep Exit": "Uscita standby", - "Configuration": "Configurazione", - "Refresh Rate": "Frequenza di aggiornamento", - "Frame Padding": "Spaziatura cornice", - " Font Size": " Dimensione font", - "Font Sizes": "Dimensioni font", - "Handheld Font Size": "Dimensione font portatile", - "Docked Font Size": "Dimensione font docked", - "Black": "Nero", - "Dark Gray": "Grigio scuro", - "Gray": "Grigio", - "Light Gray": "Grigio chiaro", - "Silver": "Argento", - "White": "Bianco", - "Dark Red": "Rosso scuro", - "Red": "Rosso", - "Light Red": "Rosso chiaro", - "Pink": "Rosa", - "Dark Green": "Verde scuro", - "Green": "Verde", - "Lime Green": "Verde lime", - "Light Green": "Verde chiaro", - "Dark Blue": "Blu scuro", - "Blue": "Blu", - "Light Blue": "Azzurro", - "Sky Blue": "Azzurro cielo", - "Dark Purple": "Viola scuro", - "Purple": "Viola", - "Light Purple": "Viola chiaro", - "Violet": "Viola", - "Orange": "Arancione", - "Yellow": "Giallo", - "Light Yellow": "Giallo chiaro", - "Teal": "Verde acqua", - "Cyan": "Ciano", - "Light Cyan": "Ciano chiaro", - "Magenta": "Magenta", - "Hot Pink": "Rosa shocking", - "Brown": "Marrone", - "Light Brown": "Marrone chiaro", - "Colors": "Colori", - "Background Color": "Colore sfondo", - "Background Alpha": "Alfa sfondo", - "Focus Color": "Colore focus", - "Focus Alpha": "Alfa focus", - "Text Color": "Colore testo", - "Border": "Bordo", - "Dashed Line": "Linea tratteggiata", - "Max FPS Text": "Testo FPS max", - "Min FPS Text": "Testo FPS min", - "Main Line": "Linea principale", - "Rounded Line": "Linea arrotondata", - "Perfect Line": "Linea perfetta", - " Color": " Colore", - " Alpha": " Alfa", - "Category Color": "Colore categoria", - "Category Color 1": "Colore categoria 1", - "Category Color 2": "Colore categoria 2", - "Separator Color": "Colore separatore", - "Elements": "Elementi", - "Text Alignment": "Allineamento testo", - "Vertical Position": "Posizione verticale", - "Horizontal Position": "Posizione orizzontale", - "Left": "Sinistra", - "Right": "Destra", - "Top": "Sopra", - "Center": "Centro", - "Bottom": "Sotto", - "FPS Counter Color": "Colore contatore FPS", - "FPS Counter Alpha": "Alfa contatore FPS", - "Border Color": "Colore bordo", - "Dashed Line Color": "Colore linea tratteggiata", - "Dashed Line Alpha": "Alfa linea tratteggiata", - "Max FPS Text Color": "Colore testo FPS max", - "Min FPS Text Color": "Colore testo FPS min", - "Main Line Color": "Colore linea principale", - "Rounded Line Color": "Colore linea arrotondata", - "Perfect Line Color": "Colore linea perfetta" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/ja.json b/Source/Horizon-OC-Monitor (deprecated)/lang/ja.json deleted file mode 100644 index a4000d02..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/ja.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "モード", - "Modes   Configure": "モード   設定", - "Full": "フル", - "Mini": "ミニ", - "Micro": "マイクロ", - "FPS Graph": "FPSグラフ", - "FPS Counter": "FPSカウンター", - "Game Resolutions": "ゲーム解像度", - "Other": "その他", - "Battery/Charger": "バッテリー/充電器", - "Miscellaneous": "その他", - "CPU Usage": "CPU使用率", - "GPU Usage": "GPU使用率", - "RAM Usage": "RAM使用率", - "Target Frequency": "目標周波数", - "Real Frequency": "実際の周波数", - "Core 0 ": "コア 0 ", - "Core 1 ": "コア 1 ", - "Core 2 ": "コア 2 ", - "Core 3 ": "コア 3 ", - "Load": "負荷", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "合計\nアプリケーション\nアプレット\nシステム\nシステム(非安全)", - "Board": "ボード", - "Battery Power Flow": "バッテリー電力フロー", - "\nTemperatures": "\n温度", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "ファン回転レベル", - "Game": "ゲーム", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "解像度 ", - "Read Speed ": "読み込み速度 ", - "Press ": "押す ", - " to Exit": " で終了", - "Depth": "深度", - "Viewport": "ビューポート", - "Game is not running\nor it's incompatible.": "ゲームが実行されていない\nまたは非対応です。", - "Battery Stats": "バッテリー統計", - "Actual Capacity": "実際の容量", - "Designed Capacity": "設計容量", - "Temperature": "温度", - "Raw Charge": "生充電量", - "Age": "経年", - "Voltage": "電圧", - "Current Flow": "電流フロー", - "Power Flow": "電力フロー", - "Remaining Time": "残り時間", - "Charger Stats": "充電器統計", - "Input Current Limit": "入力電流制限", - "VBUS Current Limit": "VBUS電流制限", - "Voltage Limit": "電圧制限", - "Current Limit": "電流制限", - "Type": "タイプ", - "Max Voltage": "最大電圧", - "Max Current": "最大電流", - "Multimedia Clock Rates": "マルチメディアクロックレート", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "ネットワーク", - "Type: Wi-Fi": "タイプ: Wi-Fi", - "Press Y to show password": "Yを押してパスワードを表示", - "Type: Ethernet": "タイプ: Ethernet", - "Type: Not connected": "タイプ: 未接続", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "要素   下へ   上へ", - "Transparent": "透明", - "Opaque": "不透明", - "Alpha": "アルファ", - "Pretty": "プリティ", - "Compact": "コンパクト", - "FileSafe": "ファイルセーフ", - "Day+Time": "日+時間", - "Date+Time(s)": "日付+時間(s)", - "Date+Time AM/PM": "日付+時間 AM/PM", - "Date+Time(s) AM/PM": "日付+時間(s) AM/PM", - "Date+Time EU": "日付+時間 EU", - "Date+Time EU AM/PM": "日付+時間 EU AM/PM", - "Date+Time(s) EU AM/PM": "日付+時間(s) EU AM/PM", - "Date+Time ISO": "日付+時間 ISO", - "Time 24h": "時間 24h", - "Time AM/PM": "時間 AM/PM", - "Time(s) 24h": "時間(s) 24h", - "Time(s) AM/PM": "時間(s) AM/PM", - "Date US": "日付 US", - "Date EU": "日付 EU", - "Date ISO": "日付 ISO", - "Date Short": "短い日付", - "DTC Format": "DTC形式", - "Toggles": "トグル", - "Info": "情報表示", - "Disable Screenshots": "スクリーンショット無効", - "Real Freqs": "実際の周波数", - "Deltas": "デルタ", - "Target Freqs": "目標周波数", - "FPS": "FPS", - "RES": "解像度", - "Read Speed": "読み込み速度", - "Real Frequencies": "実際の周波数", - "Real Voltages": "実際の電圧", - "Full CPU": "フルCPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "フル解像度", - "SOC Voltage": "SOC電圧", - "RAM Load CPU/GPU": "RAM負荷 CPU/GPU", - "Use DTC Symbol": "DTCシンボル使用", - "Use Dynamic Colors": "ダイナミックカラー使用", - "Sleep Exit": "スリープ解除", - "Configuration": "設定", - "Refresh Rate": "リフレッシュレート", - "Frame Padding": "フレームパディング", - " Font Size": " フォントサイズ", - "Font Sizes": "フォントサイズ", - "Handheld Font Size": "携帯モードフォントサイズ", - "Docked Font Size": "ドックモードフォントサイズ", - "Black": "黒", - "Dark Gray": "ダークグレー", - "Gray": "グレー", - "Light Gray": "ライトグレー", - "Silver": "シルバー", - "White": "白", - "Dark Red": "ダークレッド", - "Red": "赤", - "Light Red": "ライト レッド", - "Pink": "ピンク", - "Dark Green": "ダークグリーン", - "Green": "緑", - "Lime Green": "ライムグリーン", - "Light Green": "ライトグリーン", - "Dark Blue": "ダークブルー", - "Blue": "青", - "Light Blue": "ライトブルー", - "Sky Blue": "スカイブルー", - "Dark Purple": "ダークパープル", - "Purple": "パープル", - "Light Purple": "ライトパープル", - "Violet": "バイオレット", - "Orange": "オレンジ", - "Yellow": "黄", - "Light Yellow": "ライトイエロー", - "Teal": "ティール", - "Cyan": "シアン", - "Light Cyan": "ライトシアン", - "Magenta": "マゼンタ", - "Hot Pink": "ホットピンク", - "Brown": "ブラウン", - "Light Brown": "ライトブラウン", - "Colors": "色", - "Background Color": "背景色", - "Background Alpha": "背景アルファ", - "Focus Color": "フォーカス色", - "Focus Alpha": "フォーカスアルファ", - "Text Color": "文字色", - "Border": "枠線", - "Dashed Line": "破線", - "Max FPS Text": "最大FPSテキスト", - "Min FPS Text": "最小FPSテキスト", - "Main Line": "主線", - "Rounded Line": "丸角線", - "Perfect Line": "完璧線", - " Color": " 色", - " Alpha": " アルファ", - "Category Color": "カテゴリ色", - "Category Color 1": "カテゴリ色 1", - "Category Color 2": "カテゴリ色 2", - "Separator Color": "セパレータ色", - "Elements": "要素", - "Text Alignment": "テキスト配置", - "Vertical Position": "垂直位置", - "Horizontal Position": "水平位置", - "Left": "左", - "Right": "右", - "Top": "上", - "Center": "中央", - "Bottom": "下", - "FPS Counter Color": "FPSカウンター色", - "FPS Counter Alpha": "FPSカウンターアルファ", - "Border Color": "枠線色", - "Dashed Line Color": "破線色", - "Dashed Line Alpha": "破線アルファ", - "Max FPS Text Color": "最大FPSテキスト色", - "Min FPS Text Color": "最小FPSテキスト色", - "Main Line Color": "主線色", - "Rounded Line Color": "丸角線色", - "Perfect Line Color": "完璧線色" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/ko.json b/Source/Horizon-OC-Monitor (deprecated)/lang/ko.json deleted file mode 100644 index a001d36d..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/ko.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "모드", - "Modes   Configure": "모드   설정", - "Full": "전체", - "Mini": "미니", - "Micro": "마이크로", - "FPS Graph": "FPS 그래프", - "FPS Counter": "FPS 카운터", - "Game Resolutions": "게임 해상도", - "Other": "기타", - "Battery/Charger": "배터리/충전기", - "Miscellaneous": "기타", - "CPU Usage": "CPU 사용량", - "GPU Usage": "GPU 사용량", - "RAM Usage": "RAM 사용량", - "Target Frequency": "목표 주파수", - "Real Frequency": "실제 주파수", - "Core 0 ": "코어 0 ", - "Core 1 ": "코어 1 ", - "Core 2 ": "코어 2 ", - "Core 3 ": "코어 3 ", - "Load": "부하", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "합계\n앱\n애플릿\n시스템\n시스템(비안전)", - "Board": "보드", - "Battery Power Flow": "배터리 전력 흐름", - "\nTemperatures": "\n온도", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "팬 회전 레벨", - "Game": "게임", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "해상도 ", - "Read Speed ": "읽기 속도 ", - "Press ": "누르기 ", - " to Exit": " 종료", - "Depth": "깊이", - "Viewport": "뷰포트", - "Game is not running\nor it's incompatible.": "게임이 실행 중이 아니거나\n호환되지 않습니다.", - "Battery Stats": "배터리 통계", - "Actual Capacity": "실제 용량", - "Designed Capacity": "설계 용량", - "Temperature": "온도", - "Raw Charge": "원시 충전량", - "Age": "수명", - "Voltage": "전압", - "Current Flow": "전류 흐름", - "Power Flow": "전력 흐름", - "Remaining Time": "남은 시간", - "Charger Stats": "충전기 통계", - "Input Current Limit": "입력 전류 제한", - "VBUS Current Limit": "VBUS 전류 제한", - "Voltage Limit": "전압 제한", - "Current Limit": "전류 제한", - "Type": "유형", - "Max Voltage": "최대 전압", - "Max Current": "최대 전류", - "Multimedia Clock Rates": "멀티미디어 클럭 속도", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "네트워크", - "Type: Wi-Fi": "유형: Wi-Fi", - "Press Y to show password": "Y를 눌러 비밀번호 표시", - "Type: Ethernet": "유형: 이더넷", - "Type: Not connected": "유형: 연결 안 됨", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "요소   아래로   위로", - "Transparent": "투명", - "Opaque": "불투명", - "Alpha": "알파", - "Pretty": "예쁨", - "Compact": "컴팩트", - "FileSafe": "파일세이프", - "Day+Time": "일+시간", - "Date+Time(s)": "날짜+시간(s)", - "Date+Time AM/PM": "날짜+시간 AM/PM", - "Date+Time(s) AM/PM": "날짜+시간(s) AM/PM", - "Date+Time EU": "날짜+시간 EU", - "Date+Time EU AM/PM": "날짜+시간 EU AM/PM", - "Date+Time(s) EU AM/PM": "날짜+시간(s) EU AM/PM", - "Date+Time ISO": "날짜+시간 ISO", - "Time 24h": "시간 24시", - "Time AM/PM": "시간 AM/PM", - "Time(s) 24h": "시간(s) 24시", - "Time(s) AM/PM": "시간(s) AM/PM", - "Date US": "날짜 US", - "Date EU": "날짜 EU", - "Date ISO": "날짜 ISO", - "Date Short": "짧은 날짜", - "DTC Format": "DTC 형식", - "Toggles": "토글", - "Info": "정보 표시", - "Disable Screenshots": "스크린샷 비활성화", - "Real Freqs": "실제 주파수", - "Deltas": "델타", - "Target Freqs": "목표 주파수", - "FPS": "FPS", - "RES": "해상도", - "Read Speed": "읽기 속도", - "Real Frequencies": "실제 주파수", - "Real Voltages": "실제 전압", - "Full CPU": "전체 CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "전체 해상도", - "SOC Voltage": "SOC 전압", - "RAM Load CPU/GPU": "RAM 부하 CPU/GPU", - "Use DTC Symbol": "DTC 심볼 사용", - "Use Dynamic Colors": "동적 색상 사용", - "Sleep Exit": "절전 종료", - "Configuration": "설정", - "Refresh Rate": "리프레시 레이트", - "Frame Padding": "프레임 패딩", - " Font Size": " 글꼴 크기", - "Font Sizes": "글꼴 크기", - "Handheld Font Size": "핸드헬드 글꼴 크기", - "Docked Font Size": "도킹 글꼴 크기", - "Black": "검정", - "Dark Gray": "짙은 회색", - "Gray": "회색", - "Light Gray": "밝은 회색", - "Silver": "은색", - "White": "흰색", - "Dark Red": "짙은 빨강", - "Red": "빨강", - "Light Red": "밝은 빨강", - "Pink": "분홍", - "Dark Green": "짙은 초록", - "Green": "초록", - "Lime Green": "라임 그린", - "Light Green": "밝은 초록", - "Dark Blue": "짙은 파랑", - "Blue": "파랑", - "Light Blue": "밝은 파랑", - "Sky Blue": "하늘색", - "Dark Purple": "짙은 보라", - "Purple": "보라", - "Light Purple": "밝은 보라", - "Violet": "바이올렛", - "Orange": "주황", - "Yellow": "노랑", - "Light Yellow": "밝은 노랑", - "Teal": "청록", - "Cyan": "시안", - "Light Cyan": "밝은 시안", - "Magenta": "마젠타", - "Hot Pink": "핫핑크", - "Brown": "갈색", - "Light Brown": "밝은 갈색", - "Colors": "색상", - "Background Color": "배경색", - "Background Alpha": "배경 투명도", - "Focus Color": "포커스 색상", - "Focus Alpha": "포커스 투명도", - "Text Color": "텍스트 색상", - "Border": "테두리", - "Dashed Line": "점선", - "Max FPS Text": "최대 FPS 텍스트", - "Min FPS Text": "최소 FPS 텍스트", - "Main Line": "주선", - "Rounded Line": "둥근 선", - "Perfect Line": "완벽 선", - " Color": " 색상", - " Alpha": " 투명도", - "Category Color": "카테고리 색상", - "Category Color 1": "카테고리 색상 1", - "Category Color 2": "카테고리 색상 2", - "Separator Color": "구분선 색상", - "Elements": "요소", - "Text Alignment": "텍스트 정렬", - "Vertical Position": "세로 위치", - "Horizontal Position": "가로 위치", - "Left": "왼쪽", - "Right": "오른쪽", - "Top": "위", - "Center": "가운데", - "Bottom": "아래", - "FPS Counter Color": "FPS 카운터 색상", - "FPS Counter Alpha": "FPS 카운터 투명도", - "Border Color": "테두리 색상", - "Dashed Line Color": "점선 색상", - "Dashed Line Alpha": "점선 투명도", - "Max FPS Text Color": "최대 FPS 텍스트 색상", - "Min FPS Text Color": "최소 FPS 텍스트 색상", - "Main Line Color": "주선 색상", - "Rounded Line Color": "둥근 선 색상", - "Perfect Line Color": "완벽 선 색상" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/nl.json b/Source/Horizon-OC-Monitor (deprecated)/lang/nl.json deleted file mode 100644 index febfacdc..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/nl.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modi", - "Modes   Configure": "Modi   Configureren", - "Full": "Volledig", - "Mini": "Mini", - "Micro": "Micro", - "FPS Graph": "FPS-grafiek", - "FPS Counter": "FPS-teller", - "Game Resolutions": "Spelresoluties", - "Other": "Overig", - "Battery/Charger": "Batterij/Oplader", - "Miscellaneous": "Diversen", - "CPU Usage": "CPU-gebruik", - "GPU Usage": "GPU-gebruik", - "RAM Usage": "RAM-gebruik", - "Target Frequency": "Doelfrequentie", - "Real Frequency": "Werkelijke frequentie", - "Core 0 ": "Kern 0 ", - "Core 1 ": "Kern 1 ", - "Core 2 ": "Kern 2 ", - "Core 3 ": "Kern 3 ", - "Load": "Belasting", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Totaal\nApplicatie\nApplet\nSysteem\nSysteem onveilig", - "Board": "Bord", - "Battery Power Flow": "Batterijstroom", - "\nTemperatures": "\nTemperaturen", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Ventilatorrotatieniveau", - "Game": "Spel", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Resoluties ", - "Read Speed ": "Leessnelheid ", - "Press ": "Druk op ", - " to Exit": " om af te sluiten", - "Depth": "Diepte", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Spel draait niet\nof is incompatibel.", - "Battery Stats": "Batterijstatistieken", - "Actual Capacity": "Werkelijke capaciteit", - "Designed Capacity": "Ontworpen capaciteit", - "Temperature": "Temperatuur", - "Raw Charge": "Ruwe lading", - "Age": "Leeftijd", - "Voltage": "Spanning", - "Current Flow": "Stroomstroom", - "Power Flow": "Stroomverbruik", - "Remaining Time": "Resterende tijd", - "Charger Stats": "Opladerstatistieken", - "Input Current Limit": "Ingangsstroomlimiet", - "VBUS Current Limit": "VBUS-stroomlimiet", - "Voltage Limit": "Spanningslimiet", - "Current Limit": "Stroomlimiet", - "Type": "Type", - "Max Voltage": "Max spanning", - "Max Current": "Max stroom", - "Multimedia Clock Rates": "Multimedia kloksnelheden", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Netwerk", - "Type: Wi-Fi": "Type: Wi-Fi", - "Press Y to show password": "Druk op Y om wachtwoord te tonen", - "Type: Ethernet": "Type: Ethernet", - "Type: Not connected": "Type: Niet verbonden", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elementen   Omlaag verplaatsen   Omhoog verplaatsen", - "Transparent": "Transparant", - "Opaque": "Ondoorzichtig", - "Alpha": "Alpha", - "Pretty": "Mooi", - "Compact": "Compact", - "FileSafe": "FileSafe", - "Day+Time": "Dag+Tijd", - "Date+Time(s)": "Datum+Tijd(s)", - "Date+Time AM/PM": "Datum+Tijd AM/PM", - "Date+Time(s) AM/PM": "Datum+Tijd(s) AM/PM", - "Date+Time EU": "Datum+Tijd EU", - "Date+Time EU AM/PM": "Datum+Tijd EU AM/PM", - "Date+Time(s) EU AM/PM": "Datum+Tijd(s) EU AM/PM", - "Date+Time ISO": "Datum+Tijd ISO", - "Time 24h": "Tijd 24u", - "Time AM/PM": "Tijd AM/PM", - "Time(s) 24h": "Tijd(s) 24u", - "Time(s) AM/PM": "Tijd(s) AM/PM", - "Date US": "Datum VS", - "Date EU": "Datum EU", - "Date ISO": "Datum ISO", - "Date Short": "Datum kort", - "DTC Format": "DTC-formaat", - "Toggles": "Schakelaars", - "Info": "Info tonen", - "Disable Screenshots": "Schermafbeeldingen uitschakelen", - "Real Freqs": "Werkelijke frequenties", - "Deltas": "Delta's", - "Target Freqs": "Doelfrequenties", - "FPS": "FPS", - "RES": "RES", - "Read Speed": "Leessnelheid", - "Real Frequencies": "Werkelijke frequenties", - "Real Voltages": "Werkelijke spanningen", - "Full CPU": "Volledige CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Volledige resolutie", - "SOC Voltage": "SOC-spanning", - "RAM Load CPU/GPU": "RAM-belasting CPU/GPU", - "Use DTC Symbol": "DTC-symbool gebruiken", - "Use Dynamic Colors": "Dynamische kleuren gebruiken", - "Sleep Exit": "Slaap afsluiten", - "Configuration": "Configuratie", - "Refresh Rate": "Vernieuwingsfrequentie", - "Frame Padding": "Frame opvulling", - " Font Size": " Lettergrootte", - "Font Sizes": "Lettergroottes", - "Handheld Font Size": "Handheld lettergrootte", - "Docked Font Size": "Docked lettergrootte", - "Black": "Zwart", - "Dark Gray": "Donkergrijs", - "Gray": "Grijs", - "Light Gray": "Lichtgrijs", - "Silver": "Zilver", - "White": "Wit", - "Dark Red": "Donkerrood", - "Red": "Rood", - "Light Red": "Lichtrood", - "Pink": "Roze", - "Dark Green": "Donkergroen", - "Green": "Groen", - "Lime Green": "Limoengroen", - "Light Green": "Lichtgroen", - "Dark Blue": "Donkerblauw", - "Blue": "Blauw", - "Light Blue": "Lichtblauw", - "Sky Blue": "Hemelsblauw", - "Dark Purple": "Donkerpaars", - "Purple": "Paars", - "Light Purple": "Lichtpaars", - "Violet": "Violet", - "Orange": "Oranje", - "Yellow": "Geel", - "Light Yellow": "Lichtgeel", - "Teal": "Teal", - "Cyan": "Cyaan", - "Light Cyan": "Lichtcyaan", - "Magenta": "Magenta", - "Hot Pink": "Felroze", - "Brown": "Bruin", - "Light Brown": "Lichtbruin", - "Colors": "Kleuren", - "Background Color": "Achtergrondkleur", - "Background Alpha": "Achtergrond alpha", - "Focus Color": "Focuskleur", - "Focus Alpha": "Focus alpha", - "Text Color": "Tekstkleur", - "Border": "Rand", - "Dashed Line": "Gestippelde lijn", - "Max FPS Text": "Max FPS tekst", - "Min FPS Text": "Min FPS tekst", - "Main Line": "Hoofdlijn", - "Rounded Line": "Afgeronde lijn", - "Perfect Line": "Perfecte lijn", - " Color": " Kleur", - " Alpha": " Alpha", - "Category Color": "Categoriekleur", - "Category Color 1": "Categoriekleur 1", - "Category Color 2": "Categoriekleur 2", - "Separator Color": "Scheidingskleur", - "Elements": "Elementen", - "Text Alignment": "Tekstuitlijning", - "Vertical Position": "Verticale positie", - "Horizontal Position": "Horizontale positie", - "Left": "Links", - "Right": "Rechts", - "Top": "Boven", - "Center": "Midden", - "Bottom": "Onder", - "FPS Counter Color":"FPS-tellerkleur", - "FPS Counter Alpha":"FPS-teller alpha", - "Border Color":"Randkleur", - "Dashed Line Color":"Gestippelde lijnkleur", - "Dashed Line Alpha":"Gestippelde lijn alpha", - "Max FPS Text Color":"Max FPS tekstkleur", - "Min FPS Text Color":"Min FPS tekstkleur", - "Main Line Color":"Hoofdlijnkleur", - "Rounded Line Color":"Afgeronde lijnkleur", - "Perfect Line Color":"Perfecte lijnkleur" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/pl.json b/Source/Horizon-OC-Monitor (deprecated)/lang/pl.json deleted file mode 100644 index e2dd49e5..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/pl.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Tryby", - "Modes   Configure": "Tryby   Konfiguruj", - "Full": "Pełny", - "Mini": "Mini", - "Micro": "Mikro", - "FPS Graph": "Wykres FPS", - "FPS Counter": "Licznik FPS", - "Game Resolutions": "Rozdzielczości gry", - "Other": "Inne", - "Battery/Charger": "Bateria/Ładowarka", - "Miscellaneous": "Różne", - "CPU Usage": "Użycie CPU", - "GPU Usage": "Użycie GPU", - "RAM Usage": "Użycie RAM", - "Target Frequency": "Częstotliwość docelowa", - "Real Frequency": "Rzeczywista częstotliwość", - "Core 0 ": "Rdzeń 0 ", - "Core 1 ": "Rdzeń 1 ", - "Core 2 ": "Rdzeń 2 ", - "Core 3 ": "Rdzeń 3 ", - "Load": "Obciążenie", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Razem\nAplikacja\nApplet\nSystem\nSystem (niebezpieczny)", - "Board": "Płyta", - "Battery Power Flow": "Przepływ mocy baterii", - "\nTemperatures": "\nTemperatury", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Poziom obrotów wentylatora", - "Game": "Gra", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Rozdzielczości ", - "Read Speed ": "Prędkość odczytu ", - "Press ": "Naciśnij ", - " to Exit": " aby wyjść", - "Depth": "Głębia", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Gra nie jest uruchomiona\nlub jest niekompatybilna.", - "Battery Stats": "Statystyki baterii", - "Actual Capacity": "Rzeczywista pojemność", - "Designed Capacity": "Pojemność znamionowa", - "Temperature": "Temperatura", - "Raw Charge": "Surowy poziom naładowania", - "Age": "Wiek", - "Voltage": "Napięcie", - "Current Flow": "Przepływ prądu", - "Power Flow": "Przepływ mocy", - "Remaining Time": "Pozostały czas", - "Charger Stats": "Statystyki ładowarki", - "Input Current Limit": "Limit prądu wejściowego", - "VBUS Current Limit": "Limit prądu VBUS", - "Voltage Limit": "Limit napięcia", - "Current Limit": "Limit prądu", - "Type": "Typ", - "Max Voltage": "Maks. napięcie", - "Max Current": "Maks. prąd", - "Multimedia Clock Rates": "Taktowanie multimediów", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Sieć", - "Type: Wi-Fi": "Typ: Wi-Fi", - "Press Y to show password": "Naciśnij Y, aby pokazać hasło", - "Type: Ethernet": "Typ: Ethernet", - "Type: Not connected": "Typ: Nie połączono", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elementy   Przesuń w dół   Przesuń w górę", - "Transparent": "Przezroczysty", - "Opaque": "Nieprzezroczysty", - "Alpha": "Alfa", - "Pretty": "Ładny", - "Compact": "Kompaktowy", - "FileSafe": "FileSafe", - "Day+Time": "Dzień+Czas", - "Date+Time(s)": "Data+Czas(s)", - "Date+Time AM/PM": "Data+Czas AM/PM", - "Date+Time(s) AM/PM": "Data+Czas(s) AM/PM", - "Date+Time EU": "Data+Czas EU", - "Date+Time EU AM/PM": "Data+Czas EU AM/PM", - "Date+Time(s) EU AM/PM": "Data+Czas(s) EU AM/PM", - "Date+Time ISO": "Data+Czas ISO", - "Time 24h": "Czas 24h", - "Time AM/PM": "Czas AM/PM", - "Time(s) 24h": "Czas(s) 24h", - "Time(s) AM/PM": "Czas(s) AM/PM", - "Date US": "Data US", - "Date EU": "Data EU", - "Date ISO": "Data ISO", - "Date Short": "Krótka data", - "DTC Format": "Format DTC", - "Toggles": "Przełączniki", - "Info": "Pokaż informacje", - "Disable Screenshots": "Wyłącz zrzuty ekranu", - "Real Freqs": "Rzeczywiste częstotliwości", - "Deltas": "Delty", - "Target Freqs": "Docelowe częstotliwości", - "FPS": "FPS", - "RES": "ROZDZ.", - "Read Speed": "Prędkość odczytu", - "Real Frequencies": "Rzeczywiste częstotliwości", - "Real Voltages": "Rzeczywiste napięcia", - "Full CPU": "Pełny CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Pełna rozdzielczość", - "SOC Voltage": "Napięcie SOC", - "RAM Load CPU/GPU": "Obciążenie RAM CPU/GPU", - "Use DTC Symbol": "Użyj symbolu DTC", - "Use Dynamic Colors": "Użyj dynamicznych kolorów", - "Sleep Exit": "Wyjście z uśpienia", - "Configuration": "Konfiguracja", - "Refresh Rate": "Częstotliwość odświeżania", - "Frame Padding": "Wypełnienie ramki", - " Font Size": " Rozmiar czcionki", - "Font Sizes": "Rozmiary czcionki", - "Handheld Font Size": "Rozmiar czcionki w trybie przenośnym", - "Docked Font Size": "Rozmiar czcionki w trybie stacjonarnym", - "Black": "Czarny", - "Dark Gray": "Ciemnoszary", - "Gray": "Szary", - "Light Gray": "Jasnoszary", - "Silver": "Srebrny", - "White": "Biały", - "Dark Red": "Ciemnoczerwony", - "Red": "Czerwony", - "Light Red": "Jasnoczerwony", - "Pink": "Różowy", - "Dark Green": "Ciemnozielony", - "Green": "Zielony", - "Lime Green": "Limonkowy", - "Light Green": "Jasnozielony", - "Dark Blue": "Ciemnoniebieski", - "Blue": "Niebieski", - "Light Blue": "Jasnoniebieski", - "Sky Blue": "Błękitny", - "Dark Purple": "Ciemnofioletowy", - "Purple": "Fioletowy", - "Light Purple": "Jasnofioletowy", - "Violet": "Fiolet", - "Orange": "Pomarańczowy", - "Yellow": "Żółty", - "Light Yellow": "Jasnożółty", - "Teal": "Morski", - "Cyan": "Cyjan", - "Light Cyan": "Jasny cyjan", - "Magenta": "Magenta", - "Hot Pink": "Jaskrawo różowy", - "Brown": "Brązowy", - "Light Brown": "Jasnobrązowy", - "Colors": "Kolory", - "Background Color": "Kolor tła", - "Background Alpha": "Przezroczystość tła", - "Focus Color": "Kolor fokusu", - "Focus Alpha": "Przezroczystość fokusu", - "Text Color": "Kolor tekstu", - "Border": "Obramowanie", - "Dashed Line": "Linia przerywana", - "Max FPS Text": "Tekst maks. FPS", - "Min FPS Text": "Tekst min. FPS", - "Main Line": "Główna linia", - "Rounded Line": "Zaokrąglona linia", - "Perfect Line": "Idealna linia", - " Color": " Kolor", - " Alpha": " Alfa", - "Category Color": "Kolor kategorii", - "Category Color 1": "Kolor kategorii 1", - "Category Color 2": "Kolor kategorii 2", - "Separator Color": "Kolor separatora", - "Elements": "Elementy", - "Text Alignment": "Wyrównanie tekstu", - "Vertical Position": "Pozycja pionowa", - "Horizontal Position": "Pozycja pozioma", - "Left": "Lewo", - "Right": "Prawo", - "Top": "Góra", - "Center": "Środek", - "Bottom": "Dół", - "FPS Counter Color": "Kolor licznika FPS", - "FPS Counter Alpha": "Alfa licznika FPS", - "Border Color": "Kolor obramowania", - "Dashed Line Color": "Kolor linii przerywanej", - "Dashed Line Alpha": "Alfa linii przerywanej", - "Max FPS Text Color": "Kolor tekstu maks. FPS", - "Min FPS Text Color": "Kolor tekstu min. FPS", - "Main Line Color": "Kolor głównej linii", - "Rounded Line Color": "Kolor zaokrąglonej linii", - "Perfect Line Color": "Kolor idealnej linii" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/pt.json b/Source/Horizon-OC-Monitor (deprecated)/lang/pt.json deleted file mode 100644 index 3805ce59..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/pt.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Modos", - "Modes   Configure": "Modos   Configurar", - "Full": "Completo", - "Mini": "Mini", - "Micro": "Micro", - "FPS Graph": "Gráfico FPS", - "FPS Counter": "Contador FPS", - "Game Resolutions": "Resoluções no Jogo", - "Other": "Outros", - "Battery/Charger": "Bateria/Carregador", - "Miscellaneous": "Diversos", - "CPU Usage": "Uso da CPU", - "GPU Usage": "Uso da GPU", - "RAM Usage": "Uso da RAM", - "Target Frequency": "Frequência Alvo", - "Real Frequency": "Frequência Real", - "Core 0 ": "Núcleo 0 ", - "Core 1 ": "Núcleo 1 ", - "Core 2 ": "Núcleo 2 ", - "Core 3 ": "Núcleo 3 ", - "Load": "Carga", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Total\nAplicativo\nMiniAplicativo\nSistema\nSistema Inseguro", - "Board": "Placa", - "Battery Power Flow": "Fluxo de Energia", - "\nTemperatures": "\nTemperaturas", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Rotação da Fan", - "Game": "Jogo", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Resoluções ", - "Read Speed ": "Velocidade de Leitura ", - "Press ": "Pressione ", - " to Exit": " para Sair", - "Depth": "Profundidade", - "Viewport": "Visualização", - "Game is not running\nor it's incompatible.": "O jogo não está rodando\n ou não é compatível.", - "Battery Stats": "Estatísticas da Bateria", - "Actual Capacity": "Capacidade Atual", - "Designed Capacity": "Capacidade Designada", - "Temperature": "Temperatura", - "Raw Charge": "Carga Bruta", - "Age": "Idade", - "Voltage": "Voltagem", - "Current Flow": "Fluxo de Corrente", - "Power Flow": "Fluxo de Potência", - "Remaining Time": "Tempo Restante", - "Charger Stats": "Estatísticas do Carregador", - "Input Current Limit": "Limite Corrente Entrada", - "VBUS Current Limit": "Limite Corrente VBUS", - "Voltage Limit": "Limite de Voltagem", - "Current Limit": "Limite Atual", - "Type": "Tipo", - "Max Voltage": "Voltagem Máxima", - "Max Current": "Corrente Máxima", - "Multimedia Clock Rates": "Frequências Multimídia", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Rede", - "Type: Wi-Fi": "Tipo: Wi-Fi", - "Press Y to show password": "Pressione Y para exibir a senha", - "Type: Ethernet": "Tipo: Ethernet", - "Type: Not connected": "Tipo: Não conectado", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Elementos   Descer   Subir", - "Transparent": "Transparente", - "Opaque": "Opaco", - "Alpha": "Alfa", - "Pretty": "Bonito", - "Compact": "Compacto", - "FileSafe": "Seguro", - "Day+Time": "Dia+Hora", - "Date+Time(s)": "Data+Hora(s)", - "Date+Time AM/PM": "Data+Hora AM/PM", - "Date+Time(s) AM/PM": "Data+Hora(s) AM/PM", - "Date+Time EU": "Data+Hora EU", - "Date+Time EU AM/PM": "Data+Hora EU AM/PM", - "Date+Time(s) EU AM/PM": "Data+Hora(s) EU AM/PM", - "Date+Time ISO": "Data+Hora ISO", - "Time 24h": "Hora 24h", - "Time AM/PM": "Hora AM/PM", - "Time(s) 24h": "Hora(s) 24h", - "Time(s) AM/PM": "Hora(s) AM/PM", - "Date US": "Data US", - "Date EU": "Data EU", - "Date ISO": "Data ISO", - "Date Short": "Data Abreviada", - "DTC Format": "Formato DTC", - "Toggles": "Alternar", - "Info": "Informações", - "Disable Screenshots": "Desativar Capturas", - "Real Freqs": "Frequências Reais", - "Deltas": "Deltas", - "Target Freqs": "Frequências Alvo", - "FPS": "FPS", - "RES": "RES", - "Read Speed": "Velocidade de Leitura", - "Real Frequencies": "Frequências Reais", - "Real Voltages": "Voltagens Reais", - "Full CPU": "CPU Completa", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Resolução Completa", - "SOC Voltage": "Voltagem do SOC", - "RAM Load CPU/GPU": "Carga na CPU/GPU", - "Use DTC Symbol": "Usar Símbolo DTC", - "Use Dynamic Colors": "Usar Cores Dinâmicas", - "Sleep Exit": "Sair do Repouso", - "Configuration": "Configuração", - "Refresh Rate": "Taxa de Atualização", - "Frame Padding": "Preenc. de Quadro", - " Font Size": " Tamanho da Fonte", - "Font Sizes": "Tamanho das Fontes", - "Handheld Font Size": "Modo Portátil", - "Docked Font Size": "Modo Dock", - "Black": "Preto", - "Dark Gray": "Cinza Escuro", - "Gray": "Cinza", - "Light Gray": "Cinza Claro", - "Silver": "Prata", - "White": "Branco", - "Dark Red": "Vermelho Escuro", - "Red": "Vermelho", - "Light Red": "LVermelho Claro", - "Pink": "Rosa", - "Dark Green": "Verde Escuro", - "Green": "Verde", - "Lime Green": "Verde Limão", - "Light Green": "Verde Claro", - "Dark Blue": "Azul Escuro", - "Blue": "Azul", - "Light Blue": "Azul Claro", - "Sky Blue": "Azul Céu", - "Dark Purple": "Roxo Escuro", - "Purple": "Roxo", - "Light Purple": "Roxo Claro", - "Violet": "Violeta", - "Orange": "Laranja", - "Yellow": "Amarelo", - "Light Yellow": "Amarelo Claro", - "Teal": "Verde Azulado", - "Cyan": "Ciano", - "Light Cyan": "Ciano Claro", - "Magenta": "Magenta", - "Hot Pink": "Rosa Choque", - "Brown": "Marrom", - "Light Brown": "Marrom Claro", - "Colors": "Cores", - "Background Color": "Cor de Fundo", - "Background Alpha": "Opacidade", - "Focus Color": "Cor em Foco", - "Focus Alpha": "Alfa em Foco", - "Text Color": "Cor do Texto", - "Border": "Borda", - "Dashed Line": "Linha Tracejada", - "Max FPS Text": "Texto Máx. FPS", - "Min FPS Text": "Texto Min. FPS", - "Main Line": "Linha Principal", - "Rounded Line": "Linha Arredondada", - "Perfect Line": "Linha Perfeita", - " Color": " Cor", - " Alpha": " Alfa", - "Category Color": "Cor da Categoria", - "Category Color 1": "Cor Categoria 1", - "Category Color 2": "Cor Categoria 2", - "Separator Color": "Cor do Separador", - "Elements": "Elementos", - "Text Alignment": "Alinhamento do Texto", - "Vertical Position": "Posição Vertical", - "Horizontal Position": "Posição Horizontal", - "Left": "Esquerdo", - "Right": "Direito", - "Top": "Topo", - "Center": "Centro", - "Bottom": "Baixo", - "FPS Counter Color":"Cor Contador FPS", - "FPS Counter Alpha":"Opac. Contador FPS", - "Border Color":"Cor da Borda", - "Dashed Line Color":"Cor Linha Trac.", - "Dashed Line Alpha":"Opac. Linha Trac.", - "Max FPS Text Color":"Cor Texto FPS Máx.", - "Min FPS Text Color":"Cor Texto FPS Min.", - "Main Line Color":"Cor Linha Principal", - "Rounded Line Color":"Cor Linha Arrend.", - "Perfect Line Color":"Cor Linha Perfeita" -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/ru.json b/Source/Horizon-OC-Monitor (deprecated)/lang/ru.json deleted file mode 100644 index 841b0b75..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/ru.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Режимы", - "Modes   Configure": "Режимы   Настроить", - "Full": "Полный", - "Mini": "Мини", - "Micro": "Микро", - "FPS Graph": "График FPS", - "FPS Counter": "Счётчик FPS", - "Game Resolutions": "Разрешения игры", - "Other": "Прочее", - "Battery/Charger": "Аккумулятор/Зарядка", - "Miscellaneous": "Разное", - "CPU Usage": "Загрузка CPU", - "GPU Usage": "Загрузка GPU", - "RAM Usage": "Загрузка RAM", - "Target Frequency": "Целевая частота", - "Real Frequency": "Реальная частота", - "Core 0 ": "Ядро 0 ", - "Core 1 ": "Ядро 1 ", - "Core 2 ": "Ядро 2 ", - "Core 3 ": "Ядро 3 ", - "Load": "Нагрузка", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Всего\nПриложение\nАпплет\nСистема\nСистема (небезопасно)", - "Board": "Плата", - "Battery Power Flow": "Поток энергии аккумулятора", - "\nTemperatures": "\nТемпературы", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Уровень вращения вентилятора", - "Game": "Игра", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Разрешения ", - "Read Speed ": "Скорость чтения ", - "Press ": "Нажмите ", - " to Exit": " для выхода", - "Depth": "Глубина", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Игра не запущена\nили несовместима.", - "Battery Stats": "Статистика аккумулятора", - "Actual Capacity": "Фактическая ёмкость", - "Designed Capacity": "Номинальная ёмкость", - "Temperature": "Температура", - "Raw Charge": "Сырой заряд", - "Age": "Возраст", - "Voltage": "Напряжение", - "Current Flow": "Ток", - "Power Flow": "Мощность", - "Remaining Time": "Оставшееся время", - "Charger Stats": "Статистика зарядки", - "Input Current Limit": "Лимит входного тока", - "VBUS Current Limit": "Лимит тока VBUS", - "Voltage Limit": "Лимит напряжения", - "Current Limit": "Лимит тока", - "Type": "Тип", - "Max Voltage": "Макс. напряжение", - "Max Current": "Макс. ток", - "Multimedia Clock Rates": "Частоты мультимедиа", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Сеть", - "Type: Wi-Fi": "Тип: Wi-Fi", - "Press Y to show password": "Нажмите Y, чтобы показать пароль", - "Type: Ethernet": "Тип: Ethernet", - "Type: Not connected": "Тип: Не подключено", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Элементы   Вниз   Вверх", - "Transparent": "Прозрачный", - "Opaque": "Непрозрачный", - "Alpha": "Альфа", - "Pretty": "Красивый", - "Compact": "Компактный", - "FileSafe": "FileSafe", - "Day+Time": "День+Время", - "Date+Time(s)": "Дата+Время(с)", - "Date+Time AM/PM": "Дата+Время AM/PM", - "Date+Time(s) AM/PM": "Дата+Время(с) AM/PM", - "Date+Time EU": "Дата+Время EU", - "Date+Time EU AM/PM": "Дата+Время EU AM/PM", - "Date+Time(s) EU AM/PM": "Дата+Время(с) EU AM/PM", - "Date+Time ISO": "Дата+Время ISO", - "Time 24h": "Время 24ч", - "Time AM/PM": "Время AM/PM", - "Time(s) 24h": "Время(с) 24ч", - "Time(s) AM/PM": "Время(с) AM/PM", - "Date US": "Дата US", - "Date EU": "Дата EU", - "Date ISO": "Дата ISO", - "Date Short": "Краткая дата", - "DTC Format": "Формат DTC", - "Toggles": "Переключатели", - "Info": "Показать информацию", - "Disable Screenshots": "Отключить скриншоты", - "Real Freqs": "Реальные частоты", - "Deltas": "Дельты", - "Target Freqs": "Целевые частоты", - "FPS": "FPS", - "RES": "РАЗР.", - "Read Speed": "Скорость чтения", - "Real Frequencies": "Реальные частоты", - "Real Voltages": "Реальные напряжения", - "Full CPU": "Полный CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Полное разрешение", - "SOC Voltage": "Напряжение SOC", - "RAM Load CPU/GPU": "Нагрузка RAM CPU/GPU", - "Use DTC Symbol": "Использовать символ DTC", - "Use Dynamic Colors": "Использовать динамические цвета", - "Sleep Exit": "Выход из сна", - "Configuration": "Конфигурация", - "Refresh Rate": "Частота обновления", - "Frame Padding": "Отступ кадра", - " Font Size": " Размер шрифта", - "Font Sizes": "Размеры шрифта", - "Handheld Font Size": "Размер шрифта в портативном режиме", - "Docked Font Size": "Размер шрифта в док-режиме", - "Black": "Чёрный", - "Dark Gray": "Тёмно-серый", - "Gray": "Серый", - "Light Gray": "Светло-серый", - "Silver": "Серебряный", - "White": "Белый", - "Dark Red": "Тёмно-красный", - "Red": "Красный", - "Light Red": "Светло-красный", - "Pink": "Розовый", - "Dark Green": "Тёмно-зелёный", - "Green": "Зелёный", - "Lime Green": "Лаймовый", - "Light Green": "Светло-зелёный", - "Dark Blue": "Тёмно-синий", - "Blue": "Синий", - "Light Blue": "Светло-синий", - "Sky Blue": "Небесно-голубой", - "Dark Purple": "Тёмно-фиолетовый", - "Purple": "Фиолетовый", - "Light Purple": "Светло-фиолетовый", - "Violet": "Фиолетовый", - "Orange": "Оранжевый", - "Yellow": "Жёлтый", - "Light Yellow": "Светло-жёлтый", - "Teal": "Бирюзовый", - "Cyan": "Голубой", - "Light Cyan": "Светло-голубой", - "Magenta": "Пурпурный", - "Hot Pink": "Ярко-розовый", - "Brown": "Коричневый", - "Light Brown": "Светло-коричневый", - "Colors": "Цвета", - "Background Color": "Цвет фона", - "Background Alpha": "Прозрачность фона", - "Focus Color": "Цвет фокуса", - "Focus Alpha": "Прозрачность фокуса", - "Text Color": "Цвет текста", - "Border": "Граница", - "Dashed Line": "Пунктирная линия", - "Max FPS Text": "Текст макс. FPS", - "Min FPS Text": "Текст мин. FPS", - "Main Line": "Основная линия", - "Rounded Line": "Скруглённая линия", - "Perfect Line": "Идеальная линия", - " Color": " Цвет", - " Alpha": " Прозрачность", - "Category Color": "Цвет категории", - "Category Color 1": "Цвет категории 1", - "Category Color 2": "Цвет категории 2", - "Separator Color": "Цвет разделителя", - "Elements": "Элементы", - "Text Alignment": "Выравнивание текста", - "Vertical Position": "Вертикальная позиция", - "Horizontal Position": "Горизонтальная позиция", - "Left": "Слева", - "Right": "Справа", - "Top": "Сверху", - "Center": "По центру", - "Bottom": "Снизу", - "FPS Counter Color": "Цвет счётчика FPS", - "FPS Counter Alpha": "Прозрачность счётчика FPS", - "Border Color": "Цвет границы", - "Dashed Line Color": "Цвет пунктирной линии", - "Dashed Line Alpha": "Прозрачность пунктирной линии", - "Max FPS Text Color": "Цвет текста макс. FPS", - "Min FPS Text Color": "Цвет текста мин. FPS", - "Main Line Color": "Цвет основной линии", - "Rounded Line Color": "Цвет скруглённой линии", - "Perfect Line Color": "Цвет идеальной линии" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/uk.json b/Source/Horizon-OC-Monitor (deprecated)/lang/uk.json deleted file mode 100644 index c41c1beb..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/uk.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "Режими", - "Modes   Configure": "Режими   Налаштувати", - "Full": "Повний", - "Mini": "Міні", - "Micro": "Мікро", - "FPS Graph": "Графік FPS", - "FPS Counter": "Лічильник FPS", - "Game Resolutions": "Роздільна здатність гри", - "Other": "Інше", - "Battery/Charger": "Акумулятор/Зарядка", - "Miscellaneous": "Різне", - "CPU Usage": "Завантаження CPU", - "GPU Usage": "Завантаження GPU", - "RAM Usage": "Завантаження RAM", - "Target Frequency": "Цільова частота", - "Real Frequency": "Реальна частота", - "Core 0 ": "Ядро 0 ", - "Core 1 ": "Ядро 1 ", - "Core 2 ": "Ядро 2 ", - "Core 3 ": "Ядро 3 ", - "Load": "Навантаження", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "Всього\nДодаток\nАплет\nСистема\nСистема (небезпечно)", - "Board": "Плата", - "Battery Power Flow": "Потік енергії акумулятора", - "\nTemperatures": "\nТемператури", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "Рівень обертання вентилятора", - "Game": "Гра", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "Роздільна здатність ", - "Read Speed ": "Швидкість зчитування ", - "Press ": "Натисніть ", - " to Exit": " для виходу", - "Depth": "Глибина", - "Viewport": "Viewport", - "Game is not running\nor it's incompatible.": "Гра не запущена\nабо несумісна.", - "Battery Stats": "Статистика акумулятора", - "Actual Capacity": "Фактична ємність", - "Designed Capacity": "Номінальна ємність", - "Temperature": "Температура", - "Raw Charge": "Сирий заряд", - "Age": "Вік", - "Voltage": "Напруга", - "Current Flow": "Струм", - "Power Flow": "Потужність", - "Remaining Time": "Залишковий час", - "Charger Stats": "Статистика зарядки", - "Input Current Limit": "Ліміт вхідного струму", - "VBUS Current Limit": "Ліміт струму VBUS", - "Voltage Limit": "Ліміт напруги", - "Current Limit": "Ліміт струму", - "Type": "Тип", - "Max Voltage": "Макс. напруга", - "Max Current": "Макс. струм", - "Multimedia Clock Rates": "Частоти мультимедіа", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "Мережа", - "Type: Wi-Fi": "Тип: Wi-Fi", - "Press Y to show password": "Натисніть Y, щоб показати пароль", - "Type: Ethernet": "Тип: Ethernet", - "Type: Not connected": "Тип: Не підключено", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "Елементи   Вниз   Вгору", - "Transparent": "Прозорий", - "Opaque": "Непрозорий", - "Alpha": "Альфа", - "Pretty": "Красивий", - "Compact": "Компактний", - "FileSafe": "FileSafe", - "Day+Time": "День+Час", - "Date+Time(s)": "Дата+Час(с)", - "Date+Time AM/PM": "Дата+Час AM/PM", - "Date+Time(s) AM/PM": "Дата+Час(с) AM/PM", - "Date+Time EU": "Дата+Час EU", - "Date+Time EU AM/PM": "Дата+Час EU AM/PM", - "Date+Time(s) EU AM/PM": "Дата+Час(с) EU AM/PM", - "Date+Time ISO": "Дата+Час ISO", - "Time 24h": "Час 24год", - "Time AM/PM": "Час AM/PM", - "Time(s) 24h": "Час(с) 24год", - "Time(s) AM/PM": "Час(с) AM/PM", - "Date US": "Дата US", - "Date EU": "Дата EU", - "Date ISO": "Дата ISO", - "Date Short": "Коротка дата", - "DTC Format": "Формат DTC", - "Toggles": "Перемикачі", - "Info": "Показати інформацію", - "Disable Screenshots": "Вимкнути знімки екрана", - "Real Freqs": "Реальні частоти", - "Deltas": "Дельти", - "Target Freqs": "Цільові частоти", - "FPS": "FPS", - "RES": "РОЗД.", - "Read Speed": "Швидкість зчитування", - "Real Frequencies": "Реальні частоти", - "Real Voltages": "Реальні напруги", - "Full CPU": "Повний CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "Повна роздільна здатність", - "SOC Voltage": "Напруга SOC", - "RAM Load CPU/GPU": "Навантаження RAM CPU/GPU", - "Use DTC Symbol": "Використовувати символ DTC", - "Use Dynamic Colors": "Використовувати динамічні кольори", - "Sleep Exit": "Вихід зі сну", - "Configuration": "Конфігурація", - "Refresh Rate": "Частота оновлення", - "Frame Padding": "Відступ кадру", - " Font Size": " Розмір шрифту", - "Font Sizes": "Розміри шрифту", - "Handheld Font Size": "Розмір шрифту в портативному режимі", - "Docked Font Size": "Розмір шрифту в док-режимі", - "Black": "Чорний", - "Dark Gray": "Темно-сірий", - "Gray": "Сірий", - "Light Gray": "Світло-сірий", - "Silver": "Сріблястий", - "White": "Білий", - "Dark Red": "Темно-червоний", - "Red": "Червоний", - "Light Red": "Світло-червоний", - "Pink": "Рожевий", - "Dark Green": "Темно-зелений", - "Green": "Зелений", - "Lime Green": "Лаймовий", - "Light Green": "Світло-зелений", - "Dark Blue": "Темно-синій", - "Blue": "Синій", - "Light Blue": "Світло-синій", - "Sky Blue": "Небесно-блакитний", - "Dark Purple": "Темно-фіолетовий", - "Purple": "Фіолетовий", - "Light Purple": "Світло-фіолетовий", - "Violet": "Фіолетовий", - "Orange": "Помаранчевий", - "Yellow": "Жовтий", - "Light Yellow": "Світло-жовтий", - "Teal": "Бірюзовий", - "Cyan": "Блакитний", - "Light Cyan": "Світло-блакитний", - "Magenta": "Пурпуровий", - "Hot Pink": "Яскраво-рожевий", - "Brown": "Коричневий", - "Light Brown": "Світло-коричневий", - "Colors": "Кольори", - "Background Color": "Колір фону", - "Background Alpha": "Прозорість фону", - "Focus Color": "Колір фокусу", - "Focus Alpha": "Прозорість фокусу", - "Text Color": "Колір тексту", - "Border": "Межа", - "Dashed Line": "Пунктирна лінія", - "Max FPS Text": "Текст макс. FPS", - "Min FPS Text": "Текст мін. FPS", - "Main Line": "Основна лінія", - "Rounded Line": "Закруглена лінія", - "Perfect Line": "Ідеальна лінія", - " Color": " Колір", - " Alpha": " Прозорість", - "Category Color": "Колір категорії", - "Category Color 1": "Колір категорії 1", - "Category Color 2": "Колір категорії 2", - "Separator Color": "Колір роздільника", - "Elements": "Елементи", - "Text Alignment": "Вирівнювання тексту", - "Vertical Position": "Вертикальна позиція", - "Horizontal Position": "Горизонтальна позиція", - "Left": "Зліва", - "Right": "Справа", - "Top": "Зверху", - "Center": "По центру", - "Bottom": "Знизу", - "FPS Counter Color": "Колір лічильника FPS", - "FPS Counter Alpha": "Прозорість лічильника FPS", - "Border Color": "Колір межі", - "Dashed Line Color": "Колір пунктирної лінії", - "Dashed Line Alpha": "Прозорість пунктирної лінії", - "Max FPS Text Color": "Колір тексту макс. FPS", - "Min FPS Text Color": "Колір тексту мін. FPS", - "Main Line Color": "Колір основної лінії", - "Rounded Line Color": "Колір закругленої лінії", - "Perfect Line Color": "Колір ідеальної лінії" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/zh-cn.json b/Source/Horizon-OC-Monitor (deprecated)/lang/zh-cn.json deleted file mode 100644 index df7d264a..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/zh-cn.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "模式", - "Modes   Configure": "模式   配置", - "Full": "完整", - "Mini": "迷你", - "Micro": "微型", - "FPS Graph": "FPS 图表", - "FPS Counter": "FPS 计数器", - "Game Resolutions": "游戏分辨率", - "Other": "其他", - "Battery/Charger": "电池/充电器", - "Miscellaneous": "杂项", - "CPU Usage": "CPU 使用率", - "GPU Usage": "GPU 使用率", - "RAM Usage": "RAM 使用率", - "Target Frequency": "目标频率", - "Real Frequency": "实际频率", - "Core 0 ": "核心 0 ", - "Core 1 ": "核心 1 ", - "Core 2 ": "核心 2 ", - "Core 3 ": "核心 3 ", - "Load": "负载", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "总计\n应用\n小程序\n系统\n系统(不安全)", - "Board": "主板", - "Battery Power Flow": "电池功率流", - "\nTemperatures": "\n温度", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "风扇转速级别", - "Game": "游戏", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "分辨率 ", - "Read Speed ": "读取速度 ", - "Press ": "按 ", - " to Exit": " 退出", - "Depth": "深度", - "Viewport": "视口", - "Game is not running\nor it's incompatible.": "游戏未运行\n或不兼容。", - "Battery Stats": "电池统计", - "Actual Capacity": "实际容量", - "Designed Capacity": "设计容量", - "Temperature": "温度", - "Raw Charge": "原始电量", - "Age": "寿命", - "Voltage": "电压", - "Current Flow": "电流", - "Power Flow": "功率", - "Remaining Time": "剩余时间", - "Charger Stats": "充电器统计", - "Input Current Limit": "输入电流限制", - "VBUS Current Limit": "VBUS 电流限制", - "Voltage Limit": "电压限制", - "Current Limit": "电流限制", - "Type": "类型", - "Max Voltage": "最大电压", - "Max Current": "最大电流", - "Multimedia Clock Rates": "多媒体时钟频率", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "网络", - "Type: Wi-Fi": "类型:Wi-Fi", - "Press Y to show password": "按 Y 显示密码", - "Type: Ethernet": "类型:以太网", - "Type: Not connected": "类型:未连接", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "元素   下移   上移", - "Transparent": "透明", - "Opaque": "不透明", - "Alpha": "透明度", - "Pretty": "美观", - "Compact": "紧凑", - "FileSafe": "文件安全", - "Day+Time": "日期+时间", - "Date+Time(s)": "日期+时间(秒)", - "Date+Time AM/PM": "日期+时间 AM/PM", - "Date+Time(s) AM/PM": "日期+时间(秒) AM/PM", - "Date+Time EU": "日期+时间 EU", - "Date+Time EU AM/PM": "日期+时间 EU AM/PM", - "Date+Time(s) EU AM/PM": "日期+时间(秒) EU AM/PM", - "Date+Time ISO": "日期+时间 ISO", - "Time 24h": "时间 24时", - "Time AM/PM": "时间 AM/PM", - "Time(s) 24h": "时间(秒) 24时", - "Time(s) AM/PM": "时间(秒) AM/PM", - "Date US": "日期 US", - "Date EU": "日期 EU", - "Date ISO": "日期 ISO", - "Date Short": "短日期", - "DTC Format": "DTC 格式", - "Toggles": "开关", - "Info": "显示信息", - "Disable Screenshots": "禁用截图", - "Real Freqs": "实际频率", - "Deltas": "差值", - "Target Freqs": "目标频率", - "FPS": "FPS", - "RES": "分辨率", - "Read Speed": "读取速度", - "Real Frequencies": "实际频率", - "Real Voltages": "实际电压", - "Full CPU": "完整 CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "完整分辨率", - "SOC Voltage": "SOC 电压", - "RAM Load CPU/GPU": "RAM 负载 CPU/GPU", - "Use DTC Symbol": "使用 DTC 符号", - "Use Dynamic Colors": "使用动态颜色", - "Sleep Exit": "退出睡眠", - "Configuration": "配置", - "Refresh Rate": "刷新率", - "Frame Padding": "帧填充", - " Font Size": " 字体大小", - "Font Sizes": "字体大小", - "Handheld Font Size": "手持模式字体大小", - "Docked Font Size": "底座模式字体大小", - "Black": "黑色", - "Dark Gray": "深灰", - "Gray": "灰色", - "Light Gray": "浅灰", - "Silver": "银色", - "White": "白色", - "Dark Red": "深红", - "Red": "红色", - "Light Red": "浅红", - "Pink": "粉红", - "Dark Green": "深绿", - "Green": "绿色", - "Lime Green": "酸橙绿", - "Light Green": "浅绿", - "Dark Blue": "深蓝", - "Blue": "蓝色", - "Light Blue": "浅蓝", - "Sky Blue": "天蓝", - "Dark Purple": "深紫", - "Purple": "紫色", - "Light Purple": "浅紫", - "Violet": "紫罗兰", - "Orange": "橙色", - "Yellow": "黄色", - "Light Yellow": "浅黄", - "Teal": "蓝绿", - "Cyan": "青色", - "Light Cyan": "浅青", - "Magenta": "品红", - "Hot Pink": "艳粉", - "Brown": "棕色", - "Light Brown": "浅棕", - "Colors": "颜色", - "Background Color": "背景颜色", - "Background Alpha": "背景透明度", - "Focus Color": "焦点颜色", - "Focus Alpha": "焦点透明度", - "Text Color": "文字颜色", - "Border": "边框", - "Dashed Line": "虚线", - "Max FPS Text": "最大 FPS 文字", - "Min FPS Text": "最小 FPS 文字", - "Main Line": "主线", - "Rounded Line": "圆角线", - "Perfect Line": "完美线", - " Color": " 颜色", - " Alpha": " 透明度", - "Category Color": "分类颜色", - "Category Color 1": "分类颜色 1", - "Category Color 2": "分类颜色 2", - "Separator Color": "分隔线颜色", - "Elements": "元素", - "Text Alignment": "文字对齐", - "Vertical Position": "垂直位置", - "Horizontal Position": "水平位置", - "Left": "左", - "Right": "右", - "Top": "上", - "Center": "中", - "Bottom": "下", - "FPS Counter Color": "FPS 计数器颜色", - "FPS Counter Alpha": "FPS 计数器透明度", - "Border Color": "边框颜色", - "Dashed Line Color": "虚线颜色", - "Dashed Line Alpha": "虚线透明度", - "Max FPS Text Color": "最大 FPS 文字颜色", - "Min FPS Text Color": "最小 FPS 文字颜色", - "Main Line Color": "主线颜色", - "Rounded Line Color": "圆角线颜色", - "Perfect Line Color": "完美线颜色" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/lang/zh-tw.json b/Source/Horizon-OC-Monitor (deprecated)/lang/zh-tw.json deleted file mode 100644 index ce8015e4..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/lang/zh-tw.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "Horizon OC Monitor": "Horizon OC Monitor", - "Modes": "模式", - "Modes   Configure": "模式   設定", - "Full": "完整", - "Mini": "迷你", - "Micro": "微型", - "FPS Graph": "FPS 圖表", - "FPS Counter": "FPS 計數器", - "Game Resolutions": "遊戲解析度", - "Other": "其他", - "Battery/Charger": "電池/充電器", - "Miscellaneous": "雜項", - "CPU Usage": "CPU 使用率", - "GPU Usage": "GPU 使用率", - "RAM Usage": "RAM 使用率", - "Target Frequency": "目標頻率", - "Real Frequency": "實際頻率", - "Core 0 ": "核心 0 ", - "Core 1 ": "核心 1 ", - "Core 2 ": "核心 2 ", - "Core 3 ": "核心 3 ", - "Load": "負載", - "Total\nApplication\nApplet\nSystem\nSystem Unsafe": "總計\n應用程式\n小程式\n系統\n系統(不安全)", - "Board": "主機板", - "Battery Power Flow": "電池功率流", - "\nTemperatures": "\n溫度", - "SoC\nPCB\nSkin": "SoC\nPCB\nSkin", - "Fan Rotation Level": "風扇轉速等級", - "Game": "遊戲", - "PFPS ": "PFPS ", - "FPS ": "FPS ", - "Resolutions ": "解析度 ", - "Read Speed ": "讀取速度 ", - "Press ": "按 ", - " to Exit": " 退出", - "Depth": "深度", - "Viewport": "視口", - "Game is not running\nor it's incompatible.": "遊戲未執行\n或不相容。", - "Battery Stats": "電池統計", - "Actual Capacity": "實際容量", - "Designed Capacity": "設計容量", - "Temperature": "溫度", - "Raw Charge": "原始電量", - "Age": "壽命", - "Voltage": "電壓", - "Current Flow": "電流", - "Power Flow": "功率", - "Remaining Time": "剩餘時間", - "Charger Stats": "充電器統計", - "Input Current Limit": "輸入電流限制", - "VBUS Current Limit": "VBUS 電流限制", - "Voltage Limit": "電壓限制", - "Current Limit": "電流限制", - "Type": "類型", - "Max Voltage": "最大電壓", - "Max Current": "最大電流", - "Multimedia Clock Rates": "多媒體時脈頻率", - "NVDEC": "NVDEC", - "NVENC": "NVENC", - "NVJPG": "NVJPG", - "Network": "網路", - "Type: Wi-Fi": "類型:Wi-Fi", - "Press Y to show password": "按 Y 顯示密碼", - "Type: Ethernet": "類型:乙太網路", - "Type: Not connected": "類型:未連線", - "CPU\nGPU\nRAM\nSOC\nPCB\nSKN": "CPU\nGPU\nRAM\nSOC\nPCB\nSKN", - "Elements   Move Down   Move Up": "元素   下移   上移", - "Transparent": "透明", - "Opaque": "不透明", - "Alpha": "透明度", - "Pretty": "美觀", - "Compact": "緊湊", - "FileSafe": "檔案安全", - "Day+Time": "日期+時間", - "Date+Time(s)": "日期+時間(秒)", - "Date+Time AM/PM": "日期+時間 AM/PM", - "Date+Time(s) AM/PM": "日期+時間(秒) AM/PM", - "Date+Time EU": "日期+時間 EU", - "Date+Time EU AM/PM": "日期+時間 EU AM/PM", - "Date+Time(s) EU AM/PM": "日期+時間(秒) EU AM/PM", - "Date+Time ISO": "日期+時間 ISO", - "Time 24h": "時間 24時", - "Time AM/PM": "時間 AM/PM", - "Time(s) 24h": "時間(秒) 24時", - "Time(s) AM/PM": "時間(秒) AM/PM", - "Date US": "日期 US", - "Date EU": "日期 EU", - "Date ISO": "日期 ISO", - "Date Short": "短日期", - "DTC Format": "DTC 格式", - "Toggles": "開關", - "Info": "顯示資訊", - "Disable Screenshots": "停用截圖", - "Real Freqs": "實際頻率", - "Deltas": "差值", - "Target Freqs": "目標頻率", - "FPS": "FPS", - "RES": "解析度", - "Read Speed": "讀取速度", - "Real Frequencies": "實際頻率", - "Real Voltages": "實際電壓", - "Full CPU": "完整 CPU", - "VDDQ": "VDDQ", - "VDD2": "VDD2", - "Full Resolution": "完整解析度", - "SOC Voltage": "SOC 電壓", - "RAM Load CPU/GPU": "RAM 負載 CPU/GPU", - "Use DTC Symbol": "使用 DTC 符號", - "Use Dynamic Colors": "使用動態顏色", - "Sleep Exit": "退出睡眠", - "Configuration": "設定", - "Refresh Rate": "更新率", - "Frame Padding": "畫面邊距", - " Font Size": " 字型大小", - "Font Sizes": "字型大小", - "Handheld Font Size": "掌機模式字型大小", - "Docked Font Size": "主機模式字型大小", - "Black": "黑色", - "Dark Gray": "深灰", - "Gray": "灰色", - "Light Gray": "淺灰", - "Silver": "銀色", - "White": "白色", - "Dark Red": "深紅", - "Red": "紅色", - "Light Red": "淺紅", - "Pink": "粉紅", - "Dark Green": "深綠", - "Green": "綠色", - "Lime Green": "萊姆綠", - "Light Green": "淺綠", - "Dark Blue": "深藍", - "Blue": "藍色", - "Light Blue": "淺藍", - "Sky Blue": "天空藍", - "Dark Purple": "深紫", - "Purple": "紫色", - "Light Purple": "淺紫", - "Violet": "紫羅蘭", - "Orange": "橙色", - "Yellow": "黃色", - "Light Yellow": "淺黃", - "Teal": "藍綠", - "Cyan": "青色", - "Light Cyan": "淺青", - "Magenta": "洋紅", - "Hot Pink": "熱粉", - "Brown": "棕色", - "Light Brown": "淺棕", - "Colors": "顏色", - "Background Color": "背景顏色", - "Background Alpha": "背景透明度", - "Focus Color": "焦點顏色", - "Focus Alpha": "焦點透明度", - "Text Color": "文字顏色", - "Border": "邊框", - "Dashed Line": "虛線", - "Max FPS Text": "最大 FPS 文字", - "Min FPS Text": "最小 FPS 文字", - "Main Line": "主線", - "Rounded Line": "圓角線", - "Perfect Line": "完美線", - " Color": " 顏色", - " Alpha": " 透明度", - "Category Color": "分類顏色", - "Category Color 1": "分類顏色 1", - "Category Color 2": "分類顏色 2", - "Separator Color": "分隔線顏色", - "Elements": "元素", - "Text Alignment": "文字對齊", - "Vertical Position": "垂直位置", - "Horizontal Position": "水平位置", - "Left": "左", - "Right": "右", - "Top": "上", - "Center": "中", - "Bottom": "下", - "FPS Counter Color": "FPS 計數器顏色", - "FPS Counter Alpha": "FPS 計數器透明度", - "Border Color": "邊框顏色", - "Dashed Line Color": "虛線顏色", - "Dashed Line Alpha": "虛線透明度", - "Max FPS Text Color": "最大 FPS 文字顏色", - "Min FPS Text Color": "最小 FPS 文字顏色", - "Main Line Color": "主線顏色", - "Rounded Line Color": "圓角線顏色", - "Perfect Line Color": "完美線顏色" -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/out/config/status-monitor/config.ini.template b/Source/Horizon-OC-Monitor (deprecated)/out/config/status-monitor/config.ini.template deleted file mode 100644 index a11d524b..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/out/config/status-monitor/config.ini.template +++ /dev/null @@ -1,127 +0,0 @@ -[status-monitor] -battery_avg_iir_filter=false -battery_time_left_refreshrate=60 -average_gpu_load=false -use_old_fps_average=false - -[full] -refresh_rate=1 -layer_width_align=left -show_real_freqs=true -show_deltas=true -show_target_freqs=true -show_fps=true -show_res=true -show_read_speed=true -use_dynamic_colors=true -disable_screenshots=false -separator_color=#888F -cat_color_1=#8FFF -cat_color_2=#8CFF -text_color=#FFFF - -[mini] -refresh_rate=1 -handheld_font_size=15 -docked_font_size=15 -spacing=8 -real_freqs=true -real_volts=true -show_full_cpu=false -show_full_res=true -show_fan_percentage=true -show_soc_voltage=false -use_dynamic_colors=true -show_vddq=false -show_vdd2=true -decimal_vdd2=false -show_dtc=true -use_dtc_symbol=true -dtc_format=%m-%d-%Y%H:%M:%S -show=DTC+BAT+CPU+GPU+RAM+TMP+FPS+RES -replace_MB_with_RAM_load=true -show_RAM_load_CPU_GPU=false -invert_battery_display=true -disable_screenshots=false -sleep_exit=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -separator_color=#888F -cat_color=#2DFF -text_color=#FFFF - -[micro] -refresh_rate=1 -layer_height_align=top -handheld_font_size=15 -docked_font_size=15 -text_align=center -real_freqs=true -real_volts=true -show_full_cpu=false -show_full_res=false -show_soc_voltage=true -use_dynamic_colors=true -show_vddq=false -show_vdd2=true -decimal_vdd2=false -show_dtc=true -use_dtc_symbol=true -dtc_format=%H:%M:%S -show=FPS+CPU+GPU+RAM+SOC+BAT+DTC -replace_GB_with_RAM_load=true -invert_battery_display=false -disable_screenshots=false -sleep_exit=false -background_color=#0009 -separator_color=#888F -cat_color=#2DFF -text_color=#FFFF - -[fps-counter] -refresh_rate=30 -handheld_font_size=40 -docked_font_size=40 -use_integer_counter=false -disable_screenshots=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -text_color=#8CFF - -[fps-graph] -refresh_rate=30 -show_info=false -use_dynamic_colors=true -disable_screenshots=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -fps_counter_color=#888C -border_color=#2DFF -dashed_line_color=#8888 -main_line_color=#FFFF -rounded_line_color=#F0FF -perfect_line_color=#0C0F -max_fps_text_color=#FFFF -min_fps_text_color=#FFFF -text_color=#FFFF -cat_color=#0F0F - -[game_resolutions] -refresh_rate=10 -disable_screenshots=false -frame_offset_x=10 -frame_offset_y=10 -frame_padding=10 -background_color=#0009 -focus_background_color=#000F -cat_color=#8FFF -text_color=#FFFF diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/Utils.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/Utils.hpp deleted file mode 100644 index 466a86aa..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/Utils.hpp +++ /dev/null @@ -1,2538 +0,0 @@ -#pragma once -#define ALWAYS_INLINE inline __attribute__((always_inline)) -#include "SaltyNX.h" - -#include "Battery.hpp" -#include "audsnoop.h" -#include "Misc.hpp" -#include "max17050.h" -#include "tmp451.h" -#include "pwm.h" -#include -#include -#include - -// rgltr_services.cpp (no changes needed here—just compile it once) -#include -#include "rgltr.h" -#include "rgltr_services.h" // for extern Service g_rgltrSrv, etc. - - - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#include - -#if defined(__cplusplus) -} -#endif - -#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715 -#define FieldDescriptor uint32_t -#define BASE_SNS_UOHM 5000 - -static bool fixHiding = false; -static bool fixForeground = false; - -//Common -bool isMariko = false; -Thread t0; -Thread t1; -Thread t2; -Thread t3; -Thread t4; -Thread t5; -Thread t6; -Thread t7; -uint64_t systemtickfrequency = 19200000; - -LEvent threadexit; -PwmChannelSession g_ICon; -const std::string folderpath = "sdmc:/switch/.overlays/"; - -// Use const string_view for paths to avoid string copying -constexpr const char* directoryPath = "sdmc:/config/status-monitor/"; -constexpr const char* configIniPath = "sdmc:/config/status-monitor/config.ini"; -constexpr const char* ultrahandConfigIniPath = "sdmc:/config/ultrahand/config.ini"; -constexpr const char* teslaConfigIniPath = "sdmc:/config/tesla/config.ini"; - -std::string filename; -std::string filepath; -std::string keyCombo = "ZL+ZR+DDOWN"; // default Ultrahand Menu combo - -//Misc2 -MmuRequest nvdecRequest; -MmuRequest nvencRequest; -MmuRequest nvjpgRequest; - -//Checks -Result nvCheck = 1; -Result i2cCheck = 1; -Result pwmCheck = 1; -Result tcCheck = 1; -Result Hinted = 1; -Result pmdmntCheck = 1; -Result psmCheck = 1; -Result audsnoopCheck = 1; -Result nvdecCheck = 1; -Result nvencCheck = 1; -Result nvjpgCheck = 1; -Result nifmCheck = 1; -Result hocclkCheck = 1; -Result pwmDutyCycleCheck = 1; - -//Wi-Fi -NifmInternetConnectionType NifmConnectionType = (NifmInternetConnectionType)-1; -NifmInternetConnectionStatus NifmConnectionStatus = (NifmInternetConnectionStatus)-1; -bool Nifm_showpass = false; -Result Nifm_internet_rc = -1; -Result Nifm_profile_rc = -1; -NifmNetworkProfileData_new Nifm_profile = {0}; - -//Multimedia engines -uint32_t NVDEC_Hz = 0; -uint32_t NVENC_Hz = 0; -uint32_t NVJPG_Hz = 0; - -//DSP -uint32_t DSP_Load_u = -1; - -//Battery -Service* psmService = 0; -BatteryChargeInfoFields _batteryChargeInfoFields = {0}; -float batCurrentAvg = 0; -float batVoltageAvg = 0; -float PowerConsumption = 0; -int16_t batTimeEstimate = -1; -float actualFullBatCapacity = 0; -float designedFullBatCapacity = 0; -bool batteryFiltered = false; -uint8_t batteryTimeLeftRefreshRate = 60; -int32_t BatteryTimeCache[120]; - -//Temperatures -float SOC_temperatureF = 0; -float PCB_temperatureF = 0; -int32_t skin_temperaturemiliC = 0; - -//CPU Usage -//uint64_t idletick0 = systemtickfrequency; -//uint64_t idletick1 = systemtickfrequency; -//uint64_t idletick2 = systemtickfrequency; -//uint64_t idletick3 = systemtickfrequency; - -std::atomic idletick0{systemtickfrequency}; -std::atomic idletick1{systemtickfrequency}; -std::atomic idletick2{systemtickfrequency}; -std::atomic idletick3{systemtickfrequency}; - - -//Frequency -uint32_t CPU_Hz = 0; -uint32_t GPU_Hz = 0; -uint32_t RAM_Hz = 0; - -//RAM Size -uint64_t RAM_Total_all_u = 0; -uint64_t RAM_Total_application_u = 0; -uint64_t RAM_Total_applet_u = 0; -uint64_t RAM_Total_system_u = 0; -uint64_t RAM_Total_systemunsafe_u = 0; -uint64_t RAM_Used_all_u = 0; -uint64_t RAM_Used_application_u = 0; -uint64_t RAM_Used_applet_u = 0; -uint64_t RAM_Used_system_u = 0; -uint64_t RAM_Used_systemunsafe_u = 0; - -//Fan -double Rotation_Duty = 0; - -//GPU Usage -FieldDescriptor fd = 0; -uint32_t GPU_Load_u = 0; -bool GPULoadPerFrame = true; - -//NX-FPS - -struct resolutionCalls { - uint16_t width; - uint16_t height; - uint16_t calls; -}; - -struct NxFpsSharedBlock { - uint32_t MAGIC; - uint8_t FPS; - float FPSavg; - bool pluginActive; - uint8_t FPSlocked; - uint8_t FPSmode; - uint8_t ZeroSync; - uint8_t patchApplied; - uint8_t API; - uint32_t FPSticks[10]; - uint8_t Buffers; - uint8_t SetBuffers; - uint8_t ActiveBuffers; - uint8_t SetActiveBuffers; - union { - struct { - bool handheld: 1; - bool docked: 1; - unsigned int reserved: 6; - } NX_PACKED ds; - uint8_t general; - } displaySync; - resolutionCalls renderCalls[8]; - resolutionCalls viewportCalls[8]; - bool forceOriginalRefreshRate; - bool dontForce60InDocked; - bool forceSuspend; - uint8_t currentRefreshRate; - float readSpeedPerSecond; - uint8_t FPSlockedDocked; - uint64_t frameNumber; -} NX_PACKED; - -NxFpsSharedBlock* NxFps = 0; -std::atomic GameRunning{false}; -std::atomic check{true}; -std::atomic SaltySD{false}; -std::atomic realVoltsPolling{false}; -uintptr_t FPSaddress = 0; -uintptr_t FPSavgaddress = 0; -uint64_t PID = 0; -uint32_t FPS = 0xFE; -float FPSmin = 254; -float FPSmax = 0; -float FPSavg = 254; -float FPSavg_old = 254; -bool useOldFPSavg = false; -SharedMemory _sharedmemory = {}; -std::atomic SharedMemoryUsed{false}; -Handle remoteSharedMemory = 1; -uint64_t lastFrameNumber = 0; - -//Read real freqs from sys-clk sysmodule -uint32_t realCPU_Hz = 0; -uint32_t realGPU_Hz = 0; -uint32_t realRAM_Hz = 0; -uint32_t partLoad[HocClkPartLoad_EnumMax]; -uint32_t realCPU_mV = 0; -uint32_t realGPU_mV = 0; -uint32_t realVDD2_mV = 0; -uint32_t realVDDQ_mV = 0; -uint32_t realSOC_mV = 0; -uint8_t refreshRate = 0; - -//Read real temps from sys-clk sysmodule -int32_t realCPU_Temp = 0; -int32_t realGPU_Temp = 0; -u32 realPLLX_Temp = 0; -int32_t realRAM_Temp = 0; - -int compare (const void* elem1, const void* elem2) { - if ((((resolutionCalls*)(elem1))->calls) > (((resolutionCalls*)(elem2))->calls)) return -1; - else return 1; -} - -void LoadSharedMemoryAndRefreshRate() { - if (SaltySD_Connect()) - return; - - SaltySD_GetSharedMemoryHandle(&remoteSharedMemory); - SaltySD_GetDisplayRefreshRate(&refreshRate); - SaltySD_Term(); - - shmemLoadRemote(&_sharedmemory, remoteSharedMemory, 0x1000, Perm_Rw); - if (!shmemMap(&_sharedmemory)) - SharedMemoryUsed = true; - else FPS = 1234; -} - -void LoadSharedMemory() { - if (SaltySD_Connect()) - return; - - SaltySD_GetSharedMemoryHandle(&remoteSharedMemory); - SaltySD_Term(); - - shmemLoadRemote(&_sharedmemory, remoteSharedMemory, 0x1000, Perm_Rw); - if (!shmemMap(&_sharedmemory)) - SharedMemoryUsed = true; - else FPS = 1234; -} - -void searchSharedMemoryBlock(uintptr_t base) { - if (!base || !SharedMemoryUsed) { - NxFps = 0; - return; - } - - ptrdiff_t search_offset = 0; - const uintptr_t memory_end = base + 0x1000; - - while (search_offset < 0x1000) { - const uintptr_t current_addr = base + search_offset; - - // Ensure we don't read past the end of shared memory - if (current_addr + sizeof(NxFpsSharedBlock) > memory_end) { - break; - } - - NxFps = (NxFpsSharedBlock*)current_addr; - - // Add bounds checking and magic validation - if (NxFps && current_addr >= base && NxFps->MAGIC == 0x465053) { - return; - } - search_offset += 4; - } - NxFps = 0; -} - -//Check if SaltyNX is working -bool CheckPort() { - Handle saltysd; - - // Try up to 67 times with exponential backoff for better responsiveness - for (int i = 0; i < 50; i++) { - if (R_SUCCEEDED(svcConnectToNamedPort(&saltysd, "InjectServ"))) { - svcCloseHandle(saltysd); - return true; - } - - // Progressive sleep - start fast, then slow down - //if (i < 10) { - // svcSleepThread(100'000); // 0.1ms for first 10 attempts - //} else if (i < 30) { - // svcSleepThread(500'000); // 0.5ms for next 20 attempts - //} else { - // svcSleepThread(1'000'000); // 1ms for remaining attempts - //} - } - - return false; -} - -Mutex mutex_Misc = {0}; - -void CheckIfGameRunning(void*) { - do { - mutexLock(&mutex_Misc); - if (!check && R_FAILED(pmdmntGetApplicationProcessId(&PID))) { - GameRunning = false; - check = true; - } - else if (!GameRunning && SharedMemoryUsed) { - const uintptr_t base = (uintptr_t)shmemGetAddr(&_sharedmemory); - searchSharedMemoryBlock(base); - if (NxFps) { - (NxFps->pluginActive) = false; - mutexUnlock(&mutex_Misc); // ← Fix: Unlock before return - if (leventWait(&threadexit, 100'000'000)) { - return; - } - mutexLock(&mutex_Misc); - if ((NxFps->pluginActive)) { - GameRunning = true; - check = false; - } - } - } - mutexUnlock(&mutex_Misc); - } while (!leventWait(&threadexit, 1'000'000'000)); -} - -// Utils.hpp or your relevant header -static constexpr size_t CACHE_ELEMENTS = sizeof(BatteryTimeCache) / sizeof(BatteryTimeCache[0]); - -Mutex mutex_BatteryChecker = {0}; -void BatteryChecker(void*) { - if (R_FAILED(psmCheck) || R_FAILED(i2cCheck)){ - return; - } - uint16_t data = 0; - float tempV = 0.0; - float tempA = 0.0; - size_t ArraySize = 10; - if (batteryFiltered) { - ArraySize = 1; - } - float* readingsAmp = new float[ArraySize]; - float* readingsVolt = new float[ArraySize]; - - Max17050ReadReg(MAX17050_AvgCurrent, &data); - tempA = (1.5625 / (max17050SenseResistor * max17050CGain)) * (s16)data; - for (size_t i = 0; i < ArraySize; i++) { - readingsAmp[i] = tempA; - } - Max17050ReadReg(MAX17050_AvgVCELL, &data); - tempV = 0.625 * (data >> 3); - for (size_t i = 0; i < ArraySize; i++) { - readingsVolt[i] = tempV; - } - if (!actualFullBatCapacity) { - Max17050ReadReg(MAX17050_FullCAP, &data); - actualFullBatCapacity = data * (BASE_SNS_UOHM / MAX17050_BOARD_SNS_RESISTOR_UOHM) / MAX17050_BOARD_CGAIN; - } - if (!designedFullBatCapacity) { - Max17050ReadReg(MAX17050_DesignCap, &data); - designedFullBatCapacity = data * (BASE_SNS_UOHM / MAX17050_BOARD_SNS_RESISTOR_UOHM) / MAX17050_BOARD_CGAIN; - } - if (readingsAmp[0] >= 0) { - batTimeEstimate = -1; - } - else { - Max17050ReadReg(MAX17050_TTE, &data); - float batteryTimeEstimateInMinutes = (5.625 * data) / 60; - if (batteryTimeEstimateInMinutes > (99.0*60.0)+59.0) { - batTimeEstimate = (99*60)+59; - } - else batTimeEstimate = (int16_t)batteryTimeEstimateInMinutes; - } - - size_t counter = 0; - uint64_t tick_TTE = svcGetSystemTick(); - uint64_t nanoseconds = 1000; - do { - mutexLock(&mutex_BatteryChecker); - const uint64_t startTick = svcGetSystemTick(); - - psmGetBatteryChargeInfoFields(psmService, &_batteryChargeInfoFields); - - // Calculation is based on Hekate's max17050.c - // Source: https://github.com/CTCaer/hekate/blob/master/bdk/power/max17050.c - - if (!batteryFiltered) { - Max17050ReadReg(MAX17050_Current, &data); - tempA = (1.5625 / (max17050SenseResistor * max17050CGain)) * (s16)data; - Max17050ReadReg(MAX17050_VCELL, &data); - tempV = 0.625 * (data >> 3); - } else { - Max17050ReadReg(MAX17050_AvgCurrent, &data); - tempA = (1.5625 / (max17050SenseResistor * max17050CGain)) * (s16)data; - Max17050ReadReg(MAX17050_AvgVCELL, &data); - tempV = 0.625 * (data >> 3); - } - - if (tempA && tempV) { - readingsAmp[counter % ArraySize] = tempA; - readingsVolt[counter % ArraySize] = tempV; - counter++; - } - - float batCurrent = 0.0; - float batVoltage = 0.0; - float batPowerAvg = 0.0; - for (size_t x = 0; x < ArraySize; x++) { - batCurrent += readingsAmp[x]; - batVoltage += readingsVolt[x]; - batPowerAvg += (readingsAmp[x] * readingsVolt[x]) / 1'000; - } - batCurrent /= ArraySize; - batVoltage /= ArraySize; - batCurrentAvg = batCurrent; - batVoltageAvg = batVoltage; - batPowerAvg /= ArraySize * 1000; - PowerConsumption = batPowerAvg; - - if (batCurrentAvg >= 0) { - batTimeEstimate = -1; - } - else { - static float batteryTimeEstimateInMinutes = 0; - Max17050ReadReg(MAX17050_TTE, &data); - batteryTimeEstimateInMinutes = (5.625 * data) / 60; - if (batteryTimeEstimateInMinutes > (99.0*60.0)+59.0) { - batteryTimeEstimateInMinutes = (99.0*60.0)+59.0; - } - static int itr = 0; - const int cacheElements = (sizeof(BatteryTimeCache) / sizeof(BatteryTimeCache[0])); - BatteryTimeCache[itr++ % cacheElements] = (int32_t)batteryTimeEstimateInMinutes; - const uint64_t new_tick_TTE = svcGetSystemTick(); - if (armTicksToNs(new_tick_TTE - tick_TTE) / 1'000'000'000 >= batteryTimeLeftRefreshRate) { - const size_t to_divide = itr < cacheElements ? itr : cacheElements; - batTimeEstimate = (int16_t)(std::accumulate(&BatteryTimeCache[0], &BatteryTimeCache[to_divide], 0) / to_divide); - tick_TTE = new_tick_TTE; - } - } - - mutexUnlock(&mutex_BatteryChecker); - nanoseconds = armTicksToNs(svcGetSystemTick() - startTick); - if (nanoseconds < 1'000'000'000 / 2) { - nanoseconds = (1'000'000'000 / 2) - nanoseconds; - } else { - nanoseconds = 1000; - } - } while(!leventWait(&threadexit, nanoseconds)); - - batTimeEstimate = -1; - _batteryChargeInfoFields = {0}; - memset(BatteryTimeCache, 0, sizeof(BatteryTimeCache)); - delete[] readingsAmp; - delete[] readingsVolt; -} - - -void StartBatteryThread() { - //if (!skip) { - // threadWaitForExit(&t7); - // threadClose(&t7); - // leventClear(&threadexit); - //} - leventClear(&threadexit); - threadCreate(&t7, BatteryChecker, NULL, NULL, 0x2000, 0x3F, 3); - threadStart(&t7); -} - -void CloseBatteryThread() { - leventSignal(&threadexit); - threadWaitForExit(&t7); - threadClose(&t7); -} - - - -void gpuLoadThread(void*) { - #define gpu_samples_average 8 - uint32_t gpu_load_array[gpu_samples_average] = {0}; - size_t i = 0; - if (!GPULoadPerFrame && R_SUCCEEDED(nvCheck)) do { - u32 temp; - if (R_SUCCEEDED(nvIoctl(fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) { - gpu_load_array[i++ % gpu_samples_average] = temp; - GPU_Load_u = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; - } - } while(!leventWait(&threadexit, 16'666'000)); -} - -std::string getVersionString() { - char buf[0x100] = ""; // 256 bytes — safe for any expected version string - Result rc = hocclkIpcGetVersionString(buf, sizeof(buf)); - if (R_FAILED(rc) || buf[0] == '\0') { - return "unknown"; - } - return std::string(buf); -} - - -bool usingEOS() { - const std::string versionString = getVersionString(); - return versionString.find("eos") != std::string::npos; -} - -// === ULTRA-FAST VOLTAGE READING === -static constexpr PowerDomainId domains[] = { - PcvPowerDomainId_Max77621_Cpu, // [0] CPU - PcvPowerDomainId_Max77621_Gpu, // [1] GPU - PcvPowerDomainId_Max77812_Dram, // [2] VDD2 (EMC/DRAM) - PcvPowerDomainId_Max77620_Sd0, // [3] SOC - PcvPowerDomainId_Max77620_Sd1 // [4] VDDQ -}; - - -// Stuff that doesn't need multithreading -void Misc(void*) { - const uint64_t timeout_ns = TeslaFPS < 10 ? (1'000'000'000 / TeslaFPS) : 100'000'000; - const bool isUsingEOS = usingEOS(); - - // Initialize voltage reading if needed - bool canReadVoltages = false; - if (!isUsingEOS && realVoltsPolling) { - canReadVoltages = R_SUCCEEDED(rgltrInitialize()); - if (!canReadVoltages) { - realVoltsPolling = false; - } - } - - do { - mutexLock(&mutex_Misc); - - // Get sys-clk data - if (R_SUCCEEDED(hocclkCheck)) { - HocClkContext hocclkCTX; - if (R_SUCCEEDED(hocclkIpcGetCurrentContext(&hocclkCTX))) { - realCPU_Hz = hocclkCTX.realFreqs[HocClkModule_CPU]; - realGPU_Hz = hocclkCTX.realFreqs[HocClkModule_GPU]; - realRAM_Hz = hocclkCTX.realFreqs[HocClkModule_MEM]; - partLoad[HocClkPartLoad_EMC] = hocclkCTX.partLoad[HocClkPartLoad_EMC]; - partLoad[HocClkPartLoad_EMCCpu] = hocclkCTX.partLoad[HocClkPartLoad_EMCCpu]; - partLoad[HocClkPartLoad_RamBWAll] = hocclkCTX.partLoad[HocClkPartLoad_RamBWAll]; - partLoad[HocClkPartLoad_RamBWCpu] = hocclkCTX.partLoad[HocClkPartLoad_RamBWCpu]; - partLoad[HocClkPartLoad_RamBWGpu] = hocclkCTX.partLoad[HocClkPartLoad_RamBWGpu]; - partLoad[HocClkPartLoad_RamBWPeak] = hocclkCTX.partLoad[HocClkPartLoad_RamBWPeak]; - realCPU_Temp = hocclkCTX.temps[HocClkThermalSensor_CPU]; - realGPU_Temp = hocclkCTX.temps[HocClkThermalSensor_GPU]; - realPLLX_Temp = hocclkCTX.temps[HocClkThermalSensor_PLLX]; - realRAM_Temp = hocclkCTX.temps[HocClkThermalSensor_MEM]; - - realCPU_mV = hocclkCTX.voltages[HocClkVoltage_CPU]; - realGPU_mV = hocclkCTX.voltages[HocClkVoltage_GPU]; - realSOC_mV = hocclkCTX.voltages[HocClkVoltage_SOC]; - realVDD2_mV = hocclkCTX.voltages[HocClkVoltage_EMCVDD2]; - realVDDQ_mV = hocclkCTX.voltages[HocClkVoltage_EMCVDDQ]; - CPU_Hz = hocclkCTX.freqs[HocClkModule_CPU]; - GPU_Hz = hocclkCTX.freqs[HocClkModule_GPU]; - RAM_Hz = hocclkCTX.freqs[HocClkModule_MEM]; - } - } - - - // Temperatures - if (R_SUCCEEDED(i2cCheck)) { - Tmp451GetSocTemp(&SOC_temperatureF); - Tmp451GetPcbTemp(&PCB_temperatureF); - } - if (R_SUCCEEDED(tcCheck)) { - tcGetSkinTemperatureMilliC(&skin_temperaturemiliC); - } - - // RAM Memory Used - if (R_SUCCEEDED(Hinted)) { - svcGetSystemInfo(&RAM_Total_application_u, 0, INVALID_HANDLE, 0); - svcGetSystemInfo(&RAM_Total_applet_u, 0, INVALID_HANDLE, 1); - svcGetSystemInfo(&RAM_Total_system_u, 0, INVALID_HANDLE, 2); - svcGetSystemInfo(&RAM_Total_systemunsafe_u, 0, INVALID_HANDLE, 3); - svcGetSystemInfo(&RAM_Used_application_u, 1, INVALID_HANDLE, 0); - svcGetSystemInfo(&RAM_Used_applet_u, 1, INVALID_HANDLE, 1); - svcGetSystemInfo(&RAM_Used_system_u, 1, INVALID_HANDLE, 2); - svcGetSystemInfo(&RAM_Used_systemunsafe_u, 1, INVALID_HANDLE, 3); - } - - // Fan - if (R_SUCCEEDED(pwmCheck)) { - double temp = 0; - if (R_SUCCEEDED(pwmChannelSessionGetDutyCycle(&g_ICon, &temp))) { - temp *= 10; - temp = trunc(temp); - temp /= 10; - Rotation_Duty = 100.0 - temp; - if (Rotation_Duty <= 0) { - Rotation_Duty = 0.0000001; - } - } - } - - // GPU Load - if (R_SUCCEEDED(nvCheck) && GPULoadPerFrame) { - nvIoctl(fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &GPU_Load_u); - } - - // FPS - with proper null checks - if (GameRunning) { - if (NxFps && SharedMemoryUsed) { - FPS = NxFps->FPS; - const size_t element_count = sizeof(NxFps->FPSticks) / sizeof(NxFps->FPSticks[0]); - FPSavg_old = static_cast(systemtickfrequency) / - (std::accumulate(&NxFps->FPSticks[0], &NxFps->FPSticks[element_count], 0.0f) / element_count); - - const float FPS_in = static_cast(FPS); - if (FPSavg_old >= (FPS_in - 0.25f) && FPSavg_old <= (FPS_in + 0.25f)) { - FPSavg = FPS_in; - } else { - FPSavg = FPSavg_old; - } - - lastFrameNumber = NxFps->frameNumber; - - if (FPSavg > FPSmax) FPSmax = FPSavg; - if (FPSavg < FPSmin) FPSmin = FPSavg; - } - } else { - FPSavg = 254; - FPSmin = 254; - FPSmax = 0; - } - - mutexUnlock(&mutex_Misc); - - } while (!leventWait(&threadexit, timeout_ns)); - - // Cleanup voltage reading if initialized - if (canReadVoltages) { - rgltrExit(); - } -} - -void Misc2(void*) { - u32 dummy = 0; - do { - //DSP - if (R_SUCCEEDED(audsnoopCheck)) audsnoopGetDspUsage(&DSP_Load_u); - - //Multimedia clock rates - if (R_SUCCEEDED(nvdecCheck)) mmuRequestGet(&nvdecRequest, &NVDEC_Hz); - if (R_SUCCEEDED(nvencCheck)) mmuRequestGet(&nvencRequest, &NVENC_Hz); - if (R_SUCCEEDED(nvjpgCheck)) mmuRequestGet(&nvjpgRequest, &NVJPG_Hz); - - if (R_SUCCEEDED(nifmCheck)) { - //u32 dummy = 0; - Nifm_internet_rc = nifmGetInternetConnectionStatus(&NifmConnectionType, &dummy, &NifmConnectionStatus); - if (!Nifm_internet_rc && (NifmConnectionType == NifmInternetConnectionType_WiFi)) - Nifm_profile_rc = nifmGetCurrentNetworkProfile((NifmNetworkProfileData*)&Nifm_profile); - } - } while (!leventWait(&threadexit, 100'000'000)); -} - -void Misc3(void*) { - const bool isUsingEOS = usingEOS(); - - // Initialize voltage reading if needed - bool canReadVoltages = false; - if (!isUsingEOS && realVoltsPolling) { - canReadVoltages = R_SUCCEEDED(rgltrInitialize()); - if (!canReadVoltages) { - realVoltsPolling = false; - } - } - - do { - mutexLock(&mutex_Misc); - - // Get sys-clk data - if (R_SUCCEEDED(hocclkCheck)) { - HocClkContext hocclkCTX; - if (R_SUCCEEDED(hocclkIpcGetCurrentContext(&hocclkCTX))) { - partLoad[HocClkPartLoad_EMC] = hocclkCTX.partLoad[HocClkPartLoad_EMC]; - partLoad[HocClkPartLoad_EMCCpu] = hocclkCTX.partLoad[HocClkPartLoad_EMCCpu]; - partLoad[HocClkPartLoad_RamBWAll] = hocclkCTX.partLoad[HocClkPartLoad_RamBWAll]; - partLoad[HocClkPartLoad_RamBWCpu] = hocclkCTX.partLoad[HocClkPartLoad_RamBWCpu]; - partLoad[HocClkPartLoad_RamBWGpu] = hocclkCTX.partLoad[HocClkPartLoad_RamBWGpu]; - partLoad[HocClkPartLoad_RamBWPeak] = hocclkCTX.partLoad[HocClkPartLoad_RamBWPeak]; - - realCPU_Temp = hocclkCTX.temps[HocClkThermalSensor_CPU]; - realGPU_Temp = hocclkCTX.temps[HocClkThermalSensor_GPU]; - realPLLX_Temp = hocclkCTX.temps[HocClkThermalSensor_PLLX]; - realRAM_Temp = hocclkCTX.temps[HocClkThermalSensor_MEM]; - - realCPU_mV = hocclkCTX.voltages[HocClkVoltage_CPU]; - realGPU_mV = hocclkCTX.voltages[HocClkVoltage_GPU]; - realSOC_mV = hocclkCTX.voltages[HocClkVoltage_SOC]; - realVDD2_mV = hocclkCTX.voltages[HocClkVoltage_EMCVDD2]; - realVDDQ_mV = hocclkCTX.voltages[HocClkVoltage_EMCVDDQ]; - - } - } - - - // Temperatures - if (R_SUCCEEDED(i2cCheck)) { - Tmp451GetSocTemp(&SOC_temperatureF); - Tmp451GetPcbTemp(&PCB_temperatureF); - } - if (R_SUCCEEDED(tcCheck)) { - tcGetSkinTemperatureMilliC(&skin_temperaturemiliC); - } - - // Fan - if (R_SUCCEEDED(pwmCheck)) { - double temp = 0; - if (R_SUCCEEDED(pwmChannelSessionGetDutyCycle(&g_ICon, &temp))) { - temp *= 10; - temp = trunc(temp); - temp /= 10; - Rotation_Duty = 100.0 - temp; - if (Rotation_Duty <= 0) { - Rotation_Duty = 0.0000001; - } - } - } - - // GPU Load - if (R_SUCCEEDED(nvCheck)) { - nvIoctl(fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &GPU_Load_u); - } - - mutexUnlock(&mutex_Misc); - - } while (!leventWait(&threadexit, 1'000'000'000)); // 1 second timeout - - // Cleanup voltage reading if initialized - if (canReadVoltages) { - rgltrExit(); - } -} - -//Check each core for idled ticks in intervals, they cannot read info about other core than they are assigned -//In case of getting more than systemtickfrequency in idle, make it equal to systemtickfrequency to get 0% as output and nothing less -//This is because making each loop also takes time, which is not considered because this will take also additional time - -//Check each core for idled ticks in intervals, they cannot read info about other core than they are assigned -//In case of getting more than systemtickfrequency in idle, make it equal to systemtickfrequency to get 0% as output and nothing less -//This is because making each loop also takes time, which is not considered because this will take also additional time -//void CheckCore0(void*) { -// uint64_t timeout_ns = 1'000'000'000 / TeslaFPS; -// while(true) { -// uint64_t idletick_a0 = 0; -// uint64_t idletick_b0 = 0; -// svcGetInfo(&idletick_b0, InfoType_IdleTickCount, INVALID_HANDLE, 0); -// if (leventWait(&threadexit, timeout_ns)) -// return; -// svcGetInfo(&idletick_a0, InfoType_IdleTickCount, INVALID_HANDLE, 0); -// idletick0 = idletick_a0 - idletick_b0; -// } -//} -// -//void CheckCore1(void*) { -// uint64_t timeout_ns = 1'000'000'000 / TeslaFPS; -// while(true) { -// uint64_t idletick_a1 = 0; -// uint64_t idletick_b1 = 0; -// svcGetInfo(&idletick_b1, InfoType_IdleTickCount, INVALID_HANDLE, 1); -// if (leventWait(&threadexit, timeout_ns)) -// return; -// svcGetInfo(&idletick_a1, InfoType_IdleTickCount, INVALID_HANDLE, 1); -// idletick1 = idletick_a1 - idletick_b1; -// } -//} -// -//void CheckCore2(void*) { -// uint64_t timeout_ns = 1'000'000'000 / TeslaFPS; -// while(true) { -// uint64_t idletick_a2 = 0; -// uint64_t idletick_b2 = 0; -// svcGetInfo(&idletick_b2, InfoType_IdleTickCount, INVALID_HANDLE, 2); -// if (leventWait(&threadexit, timeout_ns)) -// return; -// svcGetInfo(&idletick_a2, InfoType_IdleTickCount, INVALID_HANDLE, 2); -// idletick2 = idletick_a2 - idletick_b2; -// } -//} -// -//void CheckCore3(void*) { -// uint64_t timeout_ns = 1'000'000'000 / TeslaFPS; -// while(true) { -// uint64_t idletick_a3 = 0; -// uint64_t idletick_b3 = 0; -// svcGetInfo(&idletick_b3, InfoType_IdleTickCount, INVALID_HANDLE, 3); -// if (leventWait(&threadexit, timeout_ns)) -// return; -// svcGetInfo(&idletick_a3, InfoType_IdleTickCount, INVALID_HANDLE, 3); -// idletick3 = idletick_a3 - idletick_b3; -// } -//} - -void CheckCore(void* idletick_ptr) { - const uint64_t timeout_ns = 1'000'000'000ULL / TeslaFPS; - std::atomic* idletick = (std::atomic*)idletick_ptr; - while (true) { - uint64_t idletick_a; - uint64_t idletick_b; - svcGetInfo(&idletick_b, InfoType_IdleTickCount, INVALID_HANDLE, -1); - Result rc_break = leventWait(&threadexit, timeout_ns); - svcGetInfo(&idletick_a, InfoType_IdleTickCount, INVALID_HANDLE, -1); - if (rc_break) return; - idletick->store(idletick_a - idletick_b, std::memory_order_release); - } -} - - -//Start reading all stats -void StartThreads() { - // Clear the thread exit event for new threads - leventClear(&threadexit); - - threadCreate(&t0, CheckCore, &idletick0, NULL, 0x1000, 0x10, 0); - threadCreate(&t1, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1); - threadCreate(&t2, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2); - threadCreate(&t3, CheckCore, &idletick3, NULL, 0x1000, 0x10, 3); - - //threadCreate(&t0, CheckCore, &coreIds[0], NULL, 0x1000, 0x10, 0); - //threadCreate(&t1, CheckCore, &coreIds[1], NULL, 0x1000, 0x10, 1); - //threadCreate(&t2, CheckCore, &coreIds[2], NULL, 0x1000, 0x10, 2); - //threadCreate(&t3, CheckCore, &coreIds[3], NULL, 0x1000, 0x10, 3); - threadCreate(&t4, Misc, NULL, NULL, 0x4000, 0x3F, -2); - threadCreate(&t5, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2); - threadCreate(&t7, BatteryChecker, NULL, NULL, 0x4000, 0x3F, -2); - - threadStart(&t0); - threadStart(&t1); - threadStart(&t2); - threadStart(&t3); - threadStart(&t4); - threadStart(&t5); - threadStart(&t7); - - if (SaltySD) { - //Assign NX-FPS to default core - threadCreate(&t6, CheckIfGameRunning, NULL, NULL, 0x1000, 0x38, -2); - threadStart(&t6); - } -} - -//End reading all stats -void CloseThreads() { - leventSignal(&threadexit); - threadWaitForExit(&t0); - threadWaitForExit(&t1); - threadWaitForExit(&t2); - threadWaitForExit(&t3); - threadWaitForExit(&t4); - threadWaitForExit(&t5); - threadWaitForExit(&t6); - threadWaitForExit(&t7); - threadClose(&t0); - threadClose(&t1); - threadClose(&t2); - threadClose(&t3); - threadClose(&t4); - threadClose(&t5); - threadClose(&t6); - threadClose(&t7); -} - -//Separate functions dedicated to "FPS Counter" mode -void FPSCounter(void*) { - const uint64_t timeout_ns = 1'000'000'000 / TeslaFPS; - do { - if (GameRunning) { - if (SharedMemoryUsed && NxFps) { - FPS = (NxFps -> FPS); - const size_t element_count = sizeof(NxFps -> FPSticks) / sizeof(NxFps -> FPSticks[0]); - FPSavg_old = (float)systemtickfrequency / (std::accumulate(&NxFps->FPSticks[0], &NxFps->FPSticks[element_count], 0) / element_count); - const float FPS_in = (float)FPS; - if (FPSavg_old >= (FPS_in-0.25) && FPSavg_old <= (FPS_in+0.25)) - FPSavg = FPS_in; - else FPSavg = FPSavg_old; - lastFrameNumber = NxFps -> frameNumber; - } - } - else FPSavg = 254; - } while (!leventWait(&threadexit, timeout_ns)); -} - -void StartFPSCounterThread() { - leventClear(&threadexit); - - threadCreate(&t6, CheckIfGameRunning, NULL, NULL, 0x1000, 0x38, -2); - threadStart(&t6); - - threadCreate(&t4, FPSCounter, NULL, NULL, 0x1000, 0x3F, 3); - threadStart(&t4); -} - -void EndFPSCounterThread() { - leventSignal(&threadexit); - threadWaitForExit(&t6); - threadWaitForExit(&t4); - threadClose(&t6); - threadClose(&t4); -} - -void StartInfoThread() { - // Clear the thread exit event for new threads - leventClear(&threadexit); - - threadCreate(&t0, CheckCore, &idletick0, NULL, 0x1000, 0x10, 0); - threadCreate(&t1, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1); - threadCreate(&t2, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2); - threadCreate(&t3, CheckCore, &idletick3, NULL, 0x1000, 0x10, 3); - - //threadCreate(&t1, CheckCore, &coreIds[0], NULL, 0x1000, 0x10, 0); - //threadCreate(&t2, CheckCore, &coreIds[1], NULL, 0x1000, 0x10, 1); - //threadCreate(&t3, CheckCore, &coreIds[2], NULL, 0x1000, 0x10, 2); - //threadCreate(&t4, CheckCore, &coreIds[3], NULL, 0x1000, 0x10, 3); - threadCreate(&t7, Misc3, NULL, NULL, 0x1000, 0x3F, -2); - - threadStart(&t0); - threadStart(&t1); - threadStart(&t2); - threadStart(&t3); - threadStart(&t7); -} - -void EndInfoThread() { - // Signal the thread exit event - leventSignal(&threadexit); - - // Wait for all threads to exit - threadWaitForExit(&t0); - threadWaitForExit(&t1); - threadWaitForExit(&t2); - threadWaitForExit(&t3); - threadWaitForExit(&t7); - - // Close thread handles - threadClose(&t0); - threadClose(&t1); - threadClose(&t2); - threadClose(&t3); - threadClose(&t7); -} - -// String formatting functions -void removeSpaces(std::string& str) { - str.erase(std::remove(str.begin(), str.end(), ' '), str.end()); -} - -void convertToUpper(std::string& str) { - std::transform(str.begin(), str.end(), str.begin(), ::toupper); -} - -void convertToLower(std::string& str) { - std::transform(str.begin(), str.end(), str.begin(), ::tolower); -} - -std::map replaces{ - {"A", "\uE0E0"}, - {"B", "\uE0E1"}, - {"X", "\uE0E2"}, - {"Y", "\uE0E3"}, - {"L", "\uE0E4"}, - {"R", "\uE0E5"}, - {"ZL", "\uE0E6"}, - {"ZR", "\uE0E7"}, - {"SL", "\uE0E8"}, - {"SR", "\uE0E9"}, - {"DUP", "\uE0EB"}, - {"DDOWN", "\uE0EC"}, - {"DLEFT", "\uE0ED"}, - {"DRIGHT", "\uE0EE"}, - {"PLUS", "\uE0EF"}, - {"MINUS", "\uE0F0"}, - {"LSTICK", "\uE104"}, - {"RSTICK", "\uE105"}, - {"RS", "\uE105"}, - {"LS", "\uE104"} -}; - -void formatButtonCombination(std::string& line) { - // Remove all spaces from the line - line.erase(std::remove(line.begin(), line.end(), ' '), line.end()); - - // Replace '+' with ' + ' - size_t pos = 0; - size_t max_pluses = 3; - while ((pos = line.find('+', pos)) != std::string::npos) { - if (!max_pluses) { - line = line.substr(0, pos); - return; - } - if (pos > 0 && pos < line.size() - 1) { - if (std::isalnum(line[pos - 1]) && std::isalnum(line[pos + 1])) { - line.replace(pos, 1, " + "); - pos += 3; - } - } - ++pos; - max_pluses--; - } - pos = 0; - size_t old_pos = 0; - - static std::string button; - while ((pos = line.find(" + ", pos)) != std::string::npos) { - - button = line.substr(old_pos, pos - old_pos); - if (replaces.find(button) != replaces.end()) { - line.replace(old_pos, button.length(), replaces[button]); - pos = 0; - old_pos = 0; - } - else pos += 3; - old_pos = pos; - } - button = line.substr(old_pos); - if (replaces.find(button) != replaces.end()) { - line.replace(old_pos, button.length(), replaces[button]); - } -} - -//uint64_t comboBitmask = 0; -// -//constexpr uint64_t MapButtons(const std::string& buttonCombo) { -// static std::map buttonMap = { -// {"A", HidNpadButton_A}, -// {"B", HidNpadButton_B}, -// {"X", HidNpadButton_X}, -// {"Y", HidNpadButton_Y}, -// {"L", HidNpadButton_L}, -// {"R", HidNpadButton_R}, -// {"ZL", HidNpadButton_ZL}, -// {"ZR", HidNpadButton_ZR}, -// {"PLUS", HidNpadButton_Plus}, -// {"MINUS", HidNpadButton_Minus}, -// {"DUP", HidNpadButton_Up}, -// {"DDOWN", HidNpadButton_Down}, -// {"DLEFT", HidNpadButton_Left}, -// {"DRIGHT", HidNpadButton_Right}, -// {"SL", HidNpadButton_AnySL}, -// {"SR", HidNpadButton_AnySR}, -// {"LSTICK", HidNpadButton_StickL}, -// {"RSTICK", HidNpadButton_StickR}, -// {"LS", HidNpadButton_StickL}, -// {"RS", HidNpadButton_StickR}, -// {"UP", HidNpadButton_AnyUp}, -// {"DOWN", HidNpadButton_AnyDown}, -// {"LEFT", HidNpadButton_AnyLeft}, -// {"RIGHT", HidNpadButton_AnyRight} -// }; -// -// -// std::string comboCopy = buttonCombo; // Make a copy of buttonCombo -// -// static const std::string delimiter = "+"; -// size_t pos = 0; -// static std::string button; -// size_t max_delimiters = 4; -// while ((pos = comboCopy.find(delimiter)) != std::string::npos) { -// button = comboCopy.substr(0, pos); -// if (buttonMap.find(button) != buttonMap.end()) { -// comboBitmask |= buttonMap[button]; -// } -// comboCopy.erase(0, pos + delimiter.length()); -// if (!--max_delimiters) { -// return comboBitmask; -// } -// } -// if (buttonMap.find(comboCopy) != buttonMap.end()) { -// comboBitmask |= buttonMap[comboCopy]; -// } -// return comboBitmask; -//} - -ALWAYS_INLINE bool isKeyComboPressed(uint64_t keysHeld, uint64_t keysDown) { - // Check if any of the combo buttons are pressed down this frame - // while the rest of the combo buttons are being held - - const uint64_t comboButtonsDown = keysDown & tsl::cfg::launchCombo; - const uint64_t comboButtonsHeld = keysHeld & tsl::cfg::launchCombo; - - // If any combo buttons are pressed down this frame - if (comboButtonsDown != 0) { - // Check if the remaining combo buttons are being held - // (the full combo should be active when combining held + down) - const uint64_t totalComboActive = comboButtonsHeld | comboButtonsDown; - - if (totalComboActive == tsl::cfg::launchCombo) { - fixHiding = true; // for fixing hiding when returning - //triggerRumbleDoubleClick.store(true, std::memory_order_release); - //triggerExitSound.store(true, std::memory_order_release); - return true; - } - } - - return false; -} - -inline int safeFanDuty(int raw) { - if (raw < 0) return 0; - if (raw > 100) return 100; - return raw; -} - -// Helper function to check if comboBitmask is satisfied with at least one key in keysDown and the rest in keysHeld -bool isKeyComboPressed2(uint64_t keysDown, uint64_t keysHeld) { - uint64_t requiredKeys = tsl::cfg::launchCombo; - bool hasKeyDown = false; // Tracks if at least one key is in keysDown - - static uint64_t keyBit; - // Iterate over each bit in the comboBitmask - while (requiredKeys) { - keyBit = requiredKeys & ~(requiredKeys - 1); // Get the lowest bit set in requiredKeys - - // Check if the key is in keysDown or keysHeld - if (keysDown & keyBit) { - hasKeyDown = true; // Found at least one key in keysDown - } else if (!(keysHeld & keyBit)) { - return false; // If the key is neither in keysDown nor keysHeld, the combo is incomplete - } - - // Remove the lowest bit and continue to check other keys - requiredKeys &= ~keyBit; - } - - // Ensure that at least one key was in keysDown and the rest were in keysHeld - return hasKeyDown; -} - - -// Custom utility function for parsing an ini file -void ParseIniFile() { - // Check and create directory if needed - //struct stat st; - //if (stat(directoryPath, &st) != 0) { - // mkdir(directoryPath, 0777); - //} - ult::createSingleDirectory(directoryPath); - - // Load main config INI once - auto configData = ult::getParsedDataFromIniFile(configIniPath); - auto statusIt = configData.find("status-monitor"); - - if (statusIt != configData.end()) { - const auto& statusSection = statusIt->second; - std::string key; - - // Process all settings with direct lookups - auto batteryFilterIt = statusSection.find("battery_avg_iir_filter"); - if (batteryFilterIt != statusSection.end()) { - key = batteryFilterIt->second; - convertToUpper(key); - batteryFiltered = (key == "TRUE"); - } - - auto refreshRateIt = statusSection.find("battery_time_left_refreshrate"); - if (refreshRateIt != statusSection.end()) { - batteryTimeLeftRefreshRate = std::clamp(atol(refreshRateIt->second.c_str()), 1L, 60L); - } - - auto gpuLoadIt = statusSection.find("average_gpu_load"); - if (gpuLoadIt != statusSection.end()) { - key = gpuLoadIt->second; - convertToUpper(key); - GPULoadPerFrame = (key != "TRUE"); - } - - auto fpsAvgIt = statusSection.find("use_old_fps_average"); - if (fpsAvgIt != statusSection.end()) { - key = fpsAvgIt->second; - convertToUpper(key); - useOldFPSavg = (key == "TRUE"); - } - } - - // Handle external combo - load each file once - const struct { const char* path; const char* section; } externalConfigs[] = { - {ultrahandConfigIniPath, "ultrahand"}, - {teslaConfigIniPath, "tesla"} - }; - - for (const auto& config : externalConfigs) { - auto extConfigData = ult::getParsedDataFromIniFile(config.path); - auto sectionIt = extConfigData.find(config.section); - - if (sectionIt != extConfigData.end()) { - auto keyComboIt = sectionIt->second.find("key_combo"); - if (keyComboIt != sectionIt->second.end() && !keyComboIt->second.empty()) { - keyCombo = keyComboIt->second; - removeSpaces(keyCombo); - convertToUpper(keyCombo); - break; - } - } - } - - //comboBitmask = MapButtons(keyCombo); -} - -ALWAYS_INLINE bool isValidRGBA4Color(const std::string& hexColor) { - const char* data = hexColor.data(); - const size_t size = hexColor.size(); - - static unsigned char c; - for (size_t i = 0; i < size; ++i) { - c = data[i]; - // Branchless hex digit check: (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f') - if (!((c - '0') <= 9 || (c - 'A') <= 5 || (c - 'a') <= 5)) { - return false; - } - } - - return true; -} - -bool convertStrToRGBA4444(std::string hexColor, uint16_t* returnValue) { - // Check if # is present - if (hexColor.size() != 5 || hexColor[0] != '#') - return false; - - hexColor = hexColor.substr(1); - - if (isValidRGBA4Color(hexColor)) { - *returnValue = std::stoi(std::string(hexColor.rbegin(), hexColor.rend()), nullptr, 16); - return true; - } - return false; -} - -struct FullSettings { - uint8_t refreshRate; - bool setPosRight; - bool showRealFreqs; - bool realVolts; - bool realTemps; - bool showDeltas; - bool showTargetFreqs; - bool showFPS; - bool showRES; - bool showRDSD; - std::string ramInfoMode; - bool useDynamicColors; - bool disableScreenshots; - uint16_t separatorColor; - uint16_t catColor1; - uint16_t catColor2; - uint16_t textColor; -}; - -struct MiniSettings { - uint8_t refreshRate; - bool realFrequencies; - bool realVolts; - bool realTemps; - bool showFullCPU; - bool showFullResolution; - bool showFanPercentage; - bool showSOCVoltage; - bool useDynamicColors; - bool showVDDQ; - bool showVDD2; - bool decimalVDD2; - bool showDTC; - bool useDTCSymbol; - std::string dtcFormat; - size_t handheldFontSize; - size_t dockedFontSize; - size_t spacing; - uint16_t backgroundColor; - uint16_t focusBackgroundColor; - uint16_t separatorColor; - uint16_t catColor; - uint16_t textColor; - std::string show; - bool showpartLoad; - bool showpartLoadCPUGPU; - std::string ramInfoMode; - bool invertBatteryDisplay; - bool disableScreenshots; - bool sleepExit; - //int setPos; - int frameOffsetX; - int frameOffsetY; - size_t framePadding; -}; - -struct MicroSettings { - uint8_t refreshRate; - bool realFrequencies; - bool realVolts; - bool realTemps; - bool showFullCPU; - bool showFullResolution; - bool showSOCVoltage; - bool useDynamicColors; - bool showVDDQ; - bool showVDD2; - bool decimalVDD2; - bool showDTC; - bool useDTCSymbol; - std::string dtcFormat; - bool invertBatteryDisplay; - size_t handheldFontSize; - size_t dockedFontSize; - uint8_t alignTo; - uint16_t backgroundColor; - uint16_t separatorColor; - uint16_t catColor; - uint16_t textColor; - std::string show; - bool showpartLoad; - std::string ramInfoMode; - bool setPosBottom; - bool disableScreenshots; - bool sleepExit; -}; - -struct FpsCounterSettings { - uint8_t refreshRate; - size_t handheldFontSize; - size_t dockedFontSize; - uint16_t backgroundColor; - uint16_t focusBackgroundColor; - uint16_t textColor; - //int setPos; - bool useIntegerCounter; - bool disableScreenshots; - int frameOffsetX; - int frameOffsetY; - size_t framePadding; -}; - -struct FpsGraphSettings { - bool showInfo; - bool realTemps; - uint8_t refreshRate; - uint16_t backgroundColor; - uint16_t focusBackgroundColor; - uint16_t fpsColor; - uint16_t mainLineColor; - uint16_t roundedLineColor; - uint16_t perfectLineColor; - uint16_t dashedLineColor; - uint16_t borderColor; - uint16_t maxFPSTextColor; - uint16_t minFPSTextColor; - uint16_t textColor; - uint16_t catColor; - //int setPos; - bool useDynamicColors; - bool disableScreenshots; - int frameOffsetX; - int frameOffsetY; - size_t framePadding; -}; - -struct ResolutionSettings { - uint8_t refreshRate; - uint16_t backgroundColor; - uint16_t focusBackgroundColor; - uint16_t catColor; - //uint16_t catColor2; - uint16_t textColor; - //int setPos; - bool disableScreenshots; - - int frameOffsetX; - int frameOffsetY; - size_t framePadding; -}; - -ALWAYS_INLINE void GetConfigSettings(MiniSettings* settings) { - // Initialize defaults - settings->realFrequencies = true; - settings->realVolts = true; - settings->realTemps = true; - settings->showFullCPU = false; - settings->showFullResolution = true; - settings->showFanPercentage = true; - settings->useDynamicColors = true; - settings->showFullCPU = false; - settings->showSOCVoltage = false; - settings->showVDDQ = false; - settings->showVDD2 = true; - settings->decimalVDD2 = false; - settings->showDTC = true; - settings->useDTCSymbol = true; - settings->dtcFormat = "%m-%d-%Y%H:%M:%S";//"%Y-%m-%d %I:%M:%S %p"; - settings->handheldFontSize = 15; - settings->dockedFontSize = 15; - settings->spacing = 8; - convertStrToRGBA4444("#0009", &(settings->backgroundColor)); - convertStrToRGBA4444("#000F", &(settings->focusBackgroundColor)); - convertStrToRGBA4444("#888F", &(settings->separatorColor)); - convertStrToRGBA4444("#2DFF", &(settings->catColor)); - convertStrToRGBA4444("#FFFF", &(settings->textColor)); - settings->show = "DTC+BAT+CPU+GPU+RAM+TMP+FPS+RES"; - settings->showpartLoad = true; - settings->showpartLoadCPUGPU = false; - settings->ramInfoMode = "LOAD"; - settings->invertBatteryDisplay = true; - settings->refreshRate = 1; - settings->disableScreenshots = false; - settings->sleepExit = false; - //settings->setPos = 0; - settings->frameOffsetX = 10; - settings->frameOffsetY = 10; - settings->framePadding = 10; - - // Open and read file efficiently - FILE* configFile = fopen(configIniPath, "r"); - if (!configFile) return; - - fseek(configFile, 0, SEEK_END); - const long fileSize = ftell(configFile); - fseek(configFile, 0, SEEK_SET); - - std::string fileData; - fileData.resize(fileSize); - fread(fileData.data(), 1, fileSize, configFile); - fclose(configFile); - - auto parsedData = ult::parseIni(fileData); - - // Cache section lookup - auto sectionIt = parsedData.find("mini"); - if (sectionIt == parsedData.end()) return; - - std::string key; - uint16_t temp; - - const auto& section = sectionIt->second; - - // Process refresh_rate - auto it = section.find("refresh_rate"); - if (it != section.end()) { - settings->refreshRate = std::clamp(atol(it->second.c_str()), 1L, 60L); - } - - // Process boolean flags - it = section.find("real_freqs"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realFrequencies = (key == "TRUE"); - } - - it = section.find("real_volts"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realVolts = (key == "TRUE"); - } - - it = section.find("real_temps"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realTemps = (key == "TRUE"); - } - - // Process font sizes with shared bounds - static constexpr long minFontSize = 8; - static constexpr long maxFontSize = 22; - - it = section.find("handheld_font_size"); - if (it != section.end()) { - settings->handheldFontSize = std::clamp(atol(it->second.c_str()), minFontSize, maxFontSize); - } - - it = section.find("docked_font_size"); - if (it != section.end()) { - settings->dockedFontSize = std::clamp(atol(it->second.c_str()), minFontSize, maxFontSize); - } - - it = section.find("spacing"); - if (it != section.end()) { - settings->spacing = atol(it->second.c_str()); - } - - // Process colors - it = section.find("background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->backgroundColor = temp; - } - it = section.find("focus_background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->focusBackgroundColor = temp; - } - - it = section.find("separator_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->separatorColor = temp; - } - - it = section.find("cat_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->catColor = temp; - } - - it = section.find("text_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->textColor = temp; - } - - // Process RAM load flag - it = section.find("show_full_cpu"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showFullCPU = !(key == "FALSE"); - } - - it = section.find("show_full_res"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showFullResolution = !(key == "FALSE"); - } - - it = section.find("show_soc_voltage"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showSOCVoltage = !(key == "FALSE"); - } - - it = section.find("use_dynamic_colors"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useDynamicColors = (key == "TRUE"); - } - - it = section.find("show_vddq"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showVDDQ = !(key == "FALSE"); - } - - it = section.find("show_vdd2"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showVDD2 = !(key == "FALSE"); - } - - it = section.find("decimal_vdd2"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->decimalVDD2 = !(key == "FALSE"); - } - - it = section.find("show_dtc"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showDTC = !(key == "FALSE"); - } - - it = section.find("use_dtc_symbol"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useDTCSymbol = !(key == "FALSE"); - } - - it = section.find("dtc_format"); - if (it != section.end()) { - key = it->second; - settings->dtcFormat = std::move(key); - } - - // Process show string - it = section.find("show"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->show = std::move(key); - } - - // Process RAM load flag - it = section.find("replace_MB_with_RAM_load"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showpartLoad = (key != "FALSE"); - } - - // Process CPU/GPU RAM load flag - it = section.find("show_RAM_load_CPU_GPU"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showpartLoadCPUGPU = (key != "FALSE"); - } - - // Process RAM info mode - it = section.find("ram_info_mode"); - if (it != section.end()) { - settings->ramInfoMode = it->second; - } - - // Invert the battery display value - it = section.find("invert_battery_display"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->invertBatteryDisplay = (key != "FALSE"); - } - - // Process disable screenshots - it = section.find("disable_screenshots"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->disableScreenshots = (key != "FALSE"); - } - - // Process exit on sleep - it = section.find("sleep_exit"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->sleepExit = (key != "FALSE"); - } - - // Process alignment settings - //it = section.find("layer_width_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos = 1; - // } else if (key == "RIGHT") { - // settings->setPos = 2; - // } - //} - // - //it = section.find("layer_height_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos += 3; - // } else if (key == "BOTTOM") { - // settings->setPos += 6; - // } - //} - - it = section.find("frame_offset_x"); - if (it != section.end()) { - settings->frameOffsetX = atol(it->second.c_str()); - } - - it = section.find("frame_offset_y"); - if (it != section.end()) { - settings->frameOffsetY = atol(it->second.c_str()); - } - - it = section.find("frame_padding"); - if (it != section.end()) { - settings->framePadding = atol(it->second.c_str()); - } -} - -ALWAYS_INLINE void GetConfigSettings(MicroSettings* settings) { - // Initialize defaults - settings->realFrequencies = true; - settings->realVolts = true; - settings->realTemps = true; - settings->showFullCPU = false; - settings->showFullResolution = false; - settings->showSOCVoltage = true; - settings->useDynamicColors = true; - settings->showVDDQ = false; - settings->showVDD2 = true; - settings->decimalVDD2 = false; - settings->showDTC = true; - settings->useDTCSymbol = true; - settings->dtcFormat = "%H:%M:%S";//"%Y-%m-%d %I:%M:%S %p"; - settings->invertBatteryDisplay = false; - settings->handheldFontSize = 14; - settings->dockedFontSize = 14; - settings->alignTo = 1; // CENTER - convertStrToRGBA4444("#0009", &(settings->backgroundColor)); - convertStrToRGBA4444("#888F", &(settings->separatorColor)); - convertStrToRGBA4444("#2DFF", &(settings->catColor)); - convertStrToRGBA4444("#FFFF", &(settings->textColor)); - settings->show = "FPS+CPU+GPU+RAM+SOC+BAT+DTC"; - settings->showpartLoad = true; - settings->ramInfoMode = "LOAD"; - settings->setPosBottom = false; - settings->disableScreenshots = false; - settings->sleepExit = false; - settings->refreshRate = 1; - - // Open and read file efficiently - FILE* configFile = fopen(configIniPath, "r"); - if (!configFile) return; - - fseek(configFile, 0, SEEK_END); - const long fileSize = ftell(configFile); - fseek(configFile, 0, SEEK_SET); - - std::string fileData; - fileData.resize(fileSize); - fread(fileData.data(), 1, fileSize, configFile); - fclose(configFile); - - auto parsedData = ult::parseIni(fileData); - - // Cache section lookup - auto sectionIt = parsedData.find("micro"); - if (sectionIt == parsedData.end()) return; - - std::string key; - uint16_t temp; - - const auto& section = sectionIt->second; - - // Process refresh_rate - auto it = section.find("refresh_rate"); - if (it != section.end()) { - settings->refreshRate = std::clamp(atol(it->second.c_str()), 1L, 60L); - } - - // Process boolean flags - it = section.find("real_freqs"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realFrequencies = (key == "TRUE"); - } - - it = section.find("real_volts"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realVolts = (key == "TRUE"); - } - - it = section.find("real_temps"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realTemps = (key == "TRUE"); - } - - it = section.find("show_full_cpu"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showFullCPU = (key == "TRUE"); - } - - it = section.find("show_full_res"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showFullResolution = (key == "TRUE"); - } - - it = section.find("show_soc_voltage"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showSOCVoltage = !(key == "FALSE"); - } - - it = section.find("use_dynamic_colors"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useDynamicColors = (key == "TRUE"); - } - - it = section.find("show_vddq"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showVDDQ = !(key == "FALSE"); - } - - it = section.find("show_vdd2"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showVDD2 = !(key == "FALSE"); - } - - it = section.find("decimal_vdd2"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->decimalVDD2 = !(key == "FALSE"); - } - - it = section.find("show_dtc"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showDTC = !(key == "FALSE"); - } - - it = section.find("use_dtc_symbol"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useDTCSymbol = !(key == "FALSE"); - } - - it = section.find("dtc_format"); - if (it != section.end()) { - key = it->second; - settings->dtcFormat = std::move(key); - } - - // Invert the battery display value - it = section.find("invert_battery_display"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->invertBatteryDisplay = (key != "FALSE"); - } - - // Process font sizes with shared bounds - static constexpr long minFontSize = 8; - static constexpr long maxFontSize = 18; - - it = section.find("handheld_font_size"); - if (it != section.end()) { - settings->handheldFontSize = std::clamp(atol(it->second.c_str()), minFontSize, maxFontSize); - } - - it = section.find("docked_font_size"); - if (it != section.end()) { - settings->dockedFontSize = std::clamp(atol(it->second.c_str()), minFontSize, maxFontSize); - } - - // Process colors - it = section.find("background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->backgroundColor = temp; - } - - it = section.find("separator_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->separatorColor = temp; - } - - it = section.find("cat_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->catColor = temp; - } - - it = section.find("text_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->textColor = temp; - } - - // Process text alignment - it = section.find("text_align"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - if (key == "LEFT") { - settings->alignTo = 0; - } else if (key == "CENTER") { - settings->alignTo = 1; - } else if (key == "RIGHT") { - settings->alignTo = 2; - } - } - - // Process RAM load flag - it = section.find("replace_GB_with_RAM_load"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showpartLoad = (key != "FALSE"); - } - - // Process RAM info mode - it = section.find("ram_info_mode"); - if (it != section.end()) { - settings->ramInfoMode = it->second; - } - - // Process show string - it = section.find("show"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->show = std::move(key); - } - - // Process layer height alignment - it = section.find("layer_height_align"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->setPosBottom = (key == "BOTTOM"); - } - - // Process disable screenshots - it = section.find("disable_screenshots"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->disableScreenshots = (key != "FALSE"); - } - - // Process exit on sleep - it = section.find("sleep_exit"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->sleepExit = (key != "FALSE"); - } - -} - -ALWAYS_INLINE void GetConfigSettings(FpsCounterSettings* settings) { - // Initialize defaults - settings->handheldFontSize = 40; - settings->dockedFontSize = 40; - convertStrToRGBA4444("#0009", &(settings->backgroundColor)); - convertStrToRGBA4444("#000F", &(settings->focusBackgroundColor)); - convertStrToRGBA4444("#8CFF", &(settings->textColor)); - //settings->setPos = 0; - settings->refreshRate = 30; - settings->useIntegerCounter = false; - settings->disableScreenshots = false; - - settings->frameOffsetX = 10; - settings->frameOffsetY = 10; - settings->framePadding = 10; - - // Open and read file efficiently - FILE* configFile = fopen(configIniPath, "r"); - if (!configFile) return; - - fseek(configFile, 0, SEEK_END); - const long fileSize = ftell(configFile); - fseek(configFile, 0, SEEK_SET); - - std::string fileData; - fileData.resize(fileSize); - fread(fileData.data(), 1, fileSize, configFile); - fclose(configFile); - - auto parsedData = ult::parseIni(fileData); - - // Cache section lookup - auto sectionIt = parsedData.find("fps-counter"); - if (sectionIt == parsedData.end()) return; - - - std::string key; - uint16_t temp; - - const auto& section = sectionIt->second; - - // Process font sizes with shared bounds - static constexpr long minFontSize = 8; - static constexpr long maxFontSize = 150; - - auto it = section.find("handheld_font_size"); - if (it != section.end()) { - settings->handheldFontSize = std::clamp(atol(it->second.c_str()), minFontSize, maxFontSize); - } - - it = section.find("docked_font_size"); - if (it != section.end()) { - settings->dockedFontSize = std::clamp(atol(it->second.c_str()), minFontSize, maxFontSize); - } - - // Process colors - it = section.find("background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->backgroundColor = temp; - } - - it = section.find("focus_background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->focusBackgroundColor = temp; - } - - - it = section.find("text_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->textColor = temp; - } - - // Process alignment settings - //it = section.find("layer_width_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos = 1; - // } else if (key == "RIGHT") { - // settings->setPos = 2; - // } - //} - - //it = section.find("layer_height_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos += 3; - // } else if (key == "BOTTOM") { - // settings->setPos += 6; - // } - //} - - it = section.find("use_integer_counter"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useIntegerCounter = (key != "FALSE"); - } - - // Process disable screenshots - it = section.find("disable_screenshots"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->disableScreenshots = (key != "FALSE"); - } - - it = section.find("frame_offset_x"); - if (it != section.end()) { - settings->frameOffsetX = atol(it->second.c_str()); - } - - it = section.find("frame_offset_y"); - if (it != section.end()) { - settings->frameOffsetY = atol(it->second.c_str()); - } - - it = section.find("frame_padding"); - if (it != section.end()) { - settings->framePadding = atol(it->second.c_str()); - } -} - -ALWAYS_INLINE void GetConfigSettings(FpsGraphSettings* settings) { - // Initialize defaults - settings->showInfo = true; - settings->realTemps = false; - //settings->setPos = 0; - convertStrToRGBA4444("#0009", &(settings->backgroundColor)); - convertStrToRGBA4444("#000F", &(settings->focusBackgroundColor)); - convertStrToRGBA4444("#888C", &(settings->fpsColor)); - convertStrToRGBA4444("#2DFF", &(settings->borderColor)); - convertStrToRGBA4444("#8888", &(settings->dashedLineColor)); - convertStrToRGBA4444("#FFFF", &(settings->maxFPSTextColor)); - convertStrToRGBA4444("#FFFF", &(settings->minFPSTextColor)); - convertStrToRGBA4444("#FFFF", &(settings->mainLineColor)); - convertStrToRGBA4444("#F0FF", &(settings->roundedLineColor)); - convertStrToRGBA4444("#0C0F", &(settings->perfectLineColor)); - - convertStrToRGBA4444("#FFFF", &(settings->textColor)); - convertStrToRGBA4444("#0F0F", &(settings->catColor)); - - settings->refreshRate = 30; - settings->useDynamicColors = true; - settings->disableScreenshots = false; - - settings->frameOffsetX = 10; - settings->frameOffsetY = 10; - settings->framePadding = 10; - - - // Open and read file efficiently - FILE* configFile = fopen(configIniPath, "r"); - if (!configFile) return; - - fseek(configFile, 0, SEEK_END); - const long fileSize = ftell(configFile); - fseek(configFile, 0, SEEK_SET); - - std::string fileData; - fileData.resize(fileSize); - fread(fileData.data(), 1, fileSize, configFile); - fclose(configFile); - - auto parsedData = ult::parseIni(fileData); - - // Cache section lookup - auto sectionIt = parsedData.find("fps-graph"); - if (sectionIt == parsedData.end()) return; - - std::string key; - uint16_t temp; - - const auto& section = sectionIt->second; - - // Process alignment settings - //auto it = section.find("layer_width_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos = 1; - // } else if (key == "RIGHT") { - // settings->setPos = 2; - // } - //} - // - //it = section.find("layer_height_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos += 3; - // } else if (key == "BOTTOM") { - // settings->setPos += 6; - // } - //} - - // Process show_info boolean - auto it = section.find("show_info"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showInfo = (key == "TRUE"); - } - - it = section.find("real_temps"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realTemps = (key == "TRUE"); - } - - it = section.find("use_dynamic_colors"); - - it = section.find("use_dynamic_colors"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useDynamicColors = (key == "TRUE"); - } - - // Process disable screenshots - it = section.find("disable_screenshots"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->disableScreenshots = (key != "FALSE"); - } - - it = section.find("frame_offset_x"); - if (it != section.end()) { - settings->frameOffsetX = atol(it->second.c_str()); - } - - it = section.find("frame_offset_y"); - if (it != section.end()) { - settings->frameOffsetY = atol(it->second.c_str()); - } - - it = section.find("frame_padding"); - if (it != section.end()) { - settings->framePadding = atol(it->second.c_str()); - } - - - // Process colors - using a struct for cleaner code - struct ColorMapping { - const char* key; - uint16_t* target; - }; - - const ColorMapping colorMappings[] = { - {"min_fps_text_color", &settings->minFPSTextColor}, - {"max_fps_text_color", &settings->maxFPSTextColor}, - {"background_color", &settings->backgroundColor}, - {"focus_background_color", &settings->focusBackgroundColor}, - {"fps_counter_color", &settings->fpsColor}, - {"border_color", &settings->borderColor}, - {"dashed_line_color", &settings->dashedLineColor}, - {"main_line_color", &settings->mainLineColor}, - {"rounded_line_color", &settings->roundedLineColor}, - {"perfect_line_color", &settings->perfectLineColor}, - {"text_color", &settings->textColor}, - {"cat_color", &settings->catColor} - }; - - for (const auto& mapping : colorMappings) { - it = section.find(mapping.key); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - *(mapping.target) = temp; - } - } -} - -ALWAYS_INLINE void GetConfigSettings(FullSettings* settings) { - // Initialize defaults - settings->setPosRight = false; - settings->refreshRate = 1; - settings->showRealFreqs = true; - settings->realTemps = false; - settings->showDeltas = true; - settings->showTargetFreqs = true; - settings->showFPS = true; - settings->showRES = true; - settings->showRDSD = true; - settings->ramInfoMode = "LOAD"; - settings->useDynamicColors = true; - settings->disableScreenshots = false; - convertStrToRGBA4444("#888F", &(settings->separatorColor)); - convertStrToRGBA4444("#8FFF", &(settings->catColor1)); - convertStrToRGBA4444("#8CFF", &(settings->catColor2)); - convertStrToRGBA4444("#FFFF", &(settings->textColor)); - - // Open and read file efficiently - FILE* configFile = fopen(configIniPath, "r"); - if (!configFile) return; - - fseek(configFile, 0, SEEK_END); - const long fileSize = ftell(configFile); - fseek(configFile, 0, SEEK_SET); - - std::string fileData; - fileData.resize(fileSize); - fread(fileData.data(), 1, fileSize, configFile); - fclose(configFile); - - auto parsedData = ult::parseIni(fileData); - - // Cache section lookup - auto sectionIt = parsedData.find("full"); - if (sectionIt == parsedData.end()) return; - - std::string key; - uint16_t temp; - - const auto& section = sectionIt->second; - - // Process refresh_rate - auto it = section.find("refresh_rate"); - if (it != section.end()) { - settings->refreshRate = std::clamp(atol(it->second.c_str()), 1L, 60L); - } - - // Process layer position - it = section.find("layer_width_align"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->setPosRight = (key == "RIGHT"); - } - - // Process boolean flags - it = section.find("show_real_freqs"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showRealFreqs = !(key == "FALSE"); - } - - it = section.find("real_temps"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->realTemps = (key == "TRUE"); - } - - it = section.find("show_deltas"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showDeltas = !(key == "FALSE"); - } - - it = section.find("show_target_freqs"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showTargetFreqs = !(key == "FALSE"); - } - - it = section.find("show_fps"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showFPS = !(key == "FALSE"); - } - - it = section.find("show_res"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showRES = !(key == "FALSE"); - } - - it = section.find("show_read_speed"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->showRDSD = !(key == "FALSE"); - } - - it = section.find("ram_info_mode"); - if (it != section.end()) { - settings->ramInfoMode = it->second; - } - - it = section.find("use_dynamic_colors"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->useDynamicColors = (key == "TRUE"); - } - - // Process disable screenshots - it = section.find("disable_screenshots"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->disableScreenshots = (key != "FALSE"); - } - - it = section.find("separator_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->separatorColor = temp; - } - - it = section.find("cat_color_1"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->catColor1 = temp; - } - - it = section.find("cat_color_2"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->catColor2 = temp; - } - - it = section.find("text_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->textColor = temp; - } -} - -ALWAYS_INLINE void GetConfigSettings(ResolutionSettings* settings) { - // Initialize defaults - convertStrToRGBA4444("#0009", &(settings->backgroundColor)); - convertStrToRGBA4444("#000F", &(settings->focusBackgroundColor)); - convertStrToRGBA4444("#8FFF", &(settings->catColor)); - //convertStrToRGBA4444("#8CFF", &(settings->catColor2)); - convertStrToRGBA4444("#FFFF", &(settings->textColor)); - settings->refreshRate = 10; - //ettings->setPos = 0; - settings->disableScreenshots = false; - - settings->frameOffsetX = 10; - settings->frameOffsetY = 10; - settings->framePadding = 10; - - - // Open and read file efficiently - FILE* configFile = fopen(configIniPath, "r"); - if (!configFile) return; - - fseek(configFile, 0, SEEK_END); - const long fileSize = ftell(configFile); - fseek(configFile, 0, SEEK_SET); - - std::string fileData; - fileData.resize(fileSize); - fread(fileData.data(), 1, fileSize, configFile); - fclose(configFile); - - auto parsedData = ult::parseIni(fileData); - - // Cache section lookup - auto sectionIt = parsedData.find("game_resolutions"); - if (sectionIt == parsedData.end()) return; - - std::string key; - - const auto& section = sectionIt->second; - - // Process refresh_rate - auto it = section.find("refresh_rate"); - if (it != section.end()) { - settings->refreshRate = std::clamp(atol(it->second.c_str()), 1L, 60L); - } - - uint16_t temp; - - // Process colors - it = section.find("background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->backgroundColor = temp; - } - - it = section.find("focus_background_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->focusBackgroundColor = temp; - } - - it = section.find("cat_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->catColor = temp; - } - - //it = section.find("cat_color_2"); - //if (it != section.end()) { - // temp = 0; - // if (convertStrToRGBA4444(it->second, &temp)) - // settings->catColor2 = temp; - //} - - - it = section.find("text_color"); - if (it != section.end()) { - temp = 0; - if (convertStrToRGBA4444(it->second, &temp)) - settings->textColor = temp; - } - - it = section.find("frame_offset_x"); - if (it != section.end()) { - settings->frameOffsetX = atol(it->second.c_str()); - } - - it = section.find("frame_offset_y"); - if (it != section.end()) { - settings->frameOffsetY = atol(it->second.c_str()); - } - - it = section.find("frame_padding"); - if (it != section.end()) { - settings->framePadding = atol(it->second.c_str()); - } - - // Process alignment settings - //it = section.find("layer_width_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos = 1; - // } else if (key == "RIGHT") { - // settings->setPos = 2; - // } - //} - // - //it = section.find("layer_height_align"); - //if (it != section.end()) { - // key = it->second; - // convertToUpper(key); - // if (key == "CENTER") { - // settings->setPos += 3; - // } else if (key == "BOTTOM") { - // settings->setPos += 6; - // } - //} - - // Process disable screenshots - it = section.find("disable_screenshots"); - if (it != section.end()) { - key = it->second; - convertToUpper(key); - settings->disableScreenshots = (key != "FALSE"); - } -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/audsnoop.c b/Source/Horizon-OC-Monitor (deprecated)/source/audsnoop.c deleted file mode 100644 index 6bc801f9..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/audsnoop.c +++ /dev/null @@ -1,35 +0,0 @@ -#define NX_SERVICE_ASSUME_NON_DOMAIN -#include -#include - -static Service g_audsnoopSrv; - -NX_GENERATE_SERVICE_GUARD(audsnoop); - -Result _audsnoopInitialize(void) { - return smGetService(&g_audsnoopSrv, "auddev"); -} - -void _audsnoopCleanup(void) { - serviceClose(&g_audsnoopSrv); -} - -Service* audsnoopGetServiceSession(void) { - return &g_audsnoopSrv; -} - -Result audsnoopEnableDspUsageMeasurement(void) { - return serviceDispatch(&g_audsnoopSrv, 0); -} - -Result audsnoopDisableDspUsageMeasurement(void) { - return serviceDispatch(&g_audsnoopSrv, 1); -} - -Result audsnoopGetDspUsage(u32 *usage) { - u32 tmp = 0; - Result rc = serviceDispatchOut(&g_audsnoopSrv, 6, tmp); - if (R_SUCCEEDED(rc) && usage) - *usage = tmp; - return rc; -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/main.cpp b/Source/Horizon-OC-Monitor (deprecated)/source/main.cpp deleted file mode 100644 index 082fb503..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/main.cpp +++ /dev/null @@ -1,1164 +0,0 @@ -#define TESLA_INIT_IMPL -#include -#include "Utils.hpp" -#include -#include - -//static tsl::elm::HeaderOverlayFrame* rootFrame = nullptr; -static bool skipMain = false; -static std::string lastSelectedItem; - -#include "modes/FPS_Counter.hpp" -#include "modes/FPS_Graph.hpp" -#include "modes/Full.hpp" -#include "modes/Mini.hpp" -#include "modes/Micro.hpp" -#include "modes/Battery.hpp" -#include "modes/Misc.hpp" -#include "modes/Resolutions.hpp" -#include "modes/Configurator.hpp" - - - -//Graphs -//class GraphsMenu : public tsl::Gui { -//public: -// GraphsMenu() {} -// -// virtual tsl::elm::Element* createUI() override { -// -// auto* list = new tsl::elm::List(); -// -// list->addItem(new tsl::elm::CategoryHeader("FPS")); -// -// auto* comFPSGraph = new tsl::elm::ListItem("Graph"); -// comFPSGraph->setClickListener([](uint64_t keys) { -// if (keys & KEY_A) { -// tsl::swapTo(); -// return true; -// } -// return false; -// }); -// list->addItem(comFPSGraph); -// -// auto* comFPSCounter = new tsl::elm::ListItem("Counter"); -// comFPSCounter->setClickListener([](uint64_t keys) { -// if (keys & KEY_A) { -// tsl::swapTo(); -// return true; -// } -// return false; -// }); -// list->addItem(comFPSCounter); -// -// tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("Horizon OC Monitor", "Modes"); -// rootFrame->setContent(list); -// -// return rootFrame; -// } -// -// virtual void update() override { -// if (fixForeground) { -// fixForeground = false; -// tsl::hlp::requestForeground(true); -// } -// } -// -// virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { -// if (disableJumpTo) -// disableJumpTo = false; -// if (fixHiding) { -// if (isKeyComboPressed2(keysDown, keysHeld)) { -// tsl::Overlay::get()->hide(); -// fixHiding = false; -// return true; -// } -// } -// -// if (keysDown & KEY_B) { -// tsl::goBack(); -// return true; -// } -// return false; -// } -//}; - -//Other -class OtherMenu : public tsl::Gui { -public: - OtherMenu() { } - - virtual tsl::elm::Element* createUI() override { - - auto* list = new tsl::elm::List(); - - list->addItem(new tsl::elm::CategoryHeader("Other")); - - auto* Battery = new tsl::elm::ListItem("Battery/Charger"); - Battery->disableClickAnimation(); - Battery->setClickListener([](uint64_t keys) { - if (keys & KEY_A) { - tsl::swapTo(); - return true; - } - return false; - }); - list->addItem(Battery); - - auto* Misc = new tsl::elm::ListItem("Miscellaneous"); - Misc->disableClickAnimation(); - Misc->setClickListener([](uint64_t keys) { - if (keys & KEY_A) { - tsl::swapTo(); - return true; - } - return false; - }); - list->addItem(Misc); - - //if (SaltySD) { - // auto* Res = new tsl::elm::ListItem("Game Resolutions"); - // Res->setClickListener([](uint64_t keys) { - // if (keys & KEY_A) { - // tsl::swapTo(); - // return true; - // } - // return false; - // }); - // list->addItem(Res); - //} - //tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("Horizon OC Monitor", "Modes"); - if (!lastSelectedItem.empty()) - list->jumpToItem(lastSelectedItem); - - rootFrame->setContent(list); - - return rootFrame; - } - - virtual void update() override { - if (fixForeground) { - fixForeground = false; - tsl::hlp::requestForeground(true); - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (disableJumpTo) - disableJumpTo = false; - if (fixHiding) { - if (isKeyComboPressed2(keysDown, keysHeld)) { - tsl::Overlay::get()->hide(); - fixHiding = false; - return true; - } - } - - if (keysDown & KEY_B) { - lastSelectedItem = "Other"; - tsl::swapTo(); - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - return true; - } - return false; - } -}; - -//Main Menu -class MainMenu : public tsl::Gui { -public: - MainMenu() { - if (lastMode != "returning") - lastMode = ""; - } - - virtual tsl::elm::Element* createUI() override { - - auto* list = new tsl::elm::List(); - - //list->addItem(new tsl::elm::CategoryHeader("Modes " + ult::DIVIDER_SYMBOL + " \uE0E0 Enter " + ult::DIVIDER_SYMBOL + " \uE0E3 Configure")); - list->addItem(new tsl::elm::CategoryHeader("Modes " + ult::DIVIDER_SYMBOL + " \uE0E3 Configure")); - - auto* Full = new tsl::elm::ListItem("Full"); - Full->disableClickAnimation(); - Full->setClickListener([](uint64_t keys) { - if (keys & KEY_A) { - lastMode = "full"; - tsl::swapTo(); - return true; - } - if (keys & KEY_Y) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerSettingsSound.store(true, std::memory_order_release); - // Launch configurator for Mini mode - tsl::swapTo("Full"); - return true; - } - return false; - }); - list->addItem(Full); - //auto* Mini = new tsl::elm::ListItem("Mini"); - //Mini->setClickListener([](uint64_t keys) { - // if (keys & KEY_A) { - // tsl::swapTo(); - // return true; - // } - // return false; - //}); - //list->addItem(Mini); - - bool fileExist = false; - FILE* test = fopen(std::string(folderpath + filename).c_str(), "rb"); - if (test) { - fclose(test); - fileExist = true; - filepath = folderpath + filename; - } - else { - test = fopen(std::string(folderpath + "Status-Monitor-Overlay.ovl").c_str(), "rb"); - if (test) { - fclose(test); - fileExist = true; - filepath = folderpath + "Status-Monitor-Overlay.ovl"; - } - } - if (fileExist) { - auto* Mini = new tsl::elm::ListItem("Mini"); - Mini->disableClickAnimation(); - Mini->setClickListener([](uint64_t keys) { - if (keys & KEY_A) { - tsl::setNextOverlay(filepath, "-mini_"); - tsl::Overlay::get()->close(); - return true; - } - if (keys & KEY_Y) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerSettingsSound.store(true, std::memory_order_release); - // Launch configurator for Mini mode - tsl::swapTo("Mini"); - return true; - } - return false; - }); - list->addItem(Mini); - - auto* Micro = new tsl::elm::ListItem("Micro"); - Micro->disableClickAnimation(); - Micro->setClickListener([](uint64_t keys) { - if (keys & KEY_A) { - tsl::setNextOverlay(filepath, "-micro_"); - tsl::Overlay::get()->close(); - return true; - } - if (keys & KEY_Y) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerSettingsSound.store(true, std::memory_order_release); - // Launch configurator for Micro mode - tsl::swapTo("Micro"); - return true; - } - return false; - }); - list->addItem(Micro); - } - if (SaltySD) { - //auto* Graphs = new tsl::elm::ListItem("FPS"); - //Graphs->setValue(ult::DROPDOWN_SYMBOL); - //Graphs->setClickListener([](uint64_t keys) { - // if (keys & KEY_A) { - // tsl::swapTo(); - // return true; - // } - // return false; - //}); - //list->addItem(Graphs); - - auto* comFPSGraph = new tsl::elm::ListItem("FPS Graph"); - comFPSGraph->disableClickAnimation(); - comFPSGraph->setClickListener([](uint64_t keys) { - //if (keys & KEY_A) { - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - // lastMode = "fps_graph"; - // tsl::swapTo(); - // return true; - //} - if (keys & KEY_A) { - tsl::setNextOverlay(filepath, "-fps_graph_"); - tsl::Overlay::get()->close(); - return true; - } - - if (keys & KEY_Y) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerSettingsSound.store(true, std::memory_order_release); - // Launch configurator for Micro mode - tsl::swapTo("FPS Graph"); - return true; - } - return false; - }); - list->addItem(comFPSGraph); - - auto* comFPSCounter = new tsl::elm::ListItem("FPS Counter"); - comFPSCounter->disableClickAnimation(); - comFPSCounter->setClickListener([](uint64_t keys) { - //if (keys & KEY_A) { - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - // lastMode = "fps_counter"; - // tsl::swapTo(); - // return true; - //} - if (keys & KEY_A) { - tsl::setNextOverlay(filepath, "-fps_counter_"); - tsl::Overlay::get()->close(); - return true; - } - - if (keys & KEY_Y) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerSettingsSound.store(true, std::memory_order_release); - // Launch configurator for Micro mode - tsl::swapTo("FPS Counter"); - return true; - } - return false; - }); - list->addItem(comFPSCounter); - - auto* Res = new tsl::elm::ListItem("Game Resolutions"); - Res->disableClickAnimation(); - Res->setClickListener([](uint64_t keys) { - //if (keys & KEY_A) { - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - // lastMode = "game_resolutions"; - // tsl::swapTo(); - // return true; - //} - if (keys & KEY_A) { - tsl::setNextOverlay(filepath, "-game_resolutions_"); - tsl::Overlay::get()->close(); - return true; - } - if (keys & KEY_Y) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerSettingsSound.store(true, std::memory_order_release); - // Launch configurator for Micro mode - tsl::swapTo("Game Resolutions"); - return true; - } - return false; - }); - list->addItem(Res); - - } - auto* Other = new tsl::elm::ListItem("Other"); - Other->disableClickAnimation(); - Other->setValue(ult::DROPDOWN_SYMBOL); - Other->setClickListener([](uint64_t keys) { - if (keys & KEY_A) { - triggerRumbleClick.store(true, std::memory_order_release); - triggerEnterSound.store(true, std::memory_order_release); - tsl::swapTo(); - return true; - } - return false; - }); - list->addItem(Other); - - if (!lastSelectedItem.empty()) - list->jumpToItem(lastSelectedItem); - - //list->disableCaching(); - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("Horizon OC Monitor", APP_VERSION); - rootFrame->setContent(list); - - return rootFrame; - } - - virtual void update() override { - if (!ult::useRightAlignment) { - //if ((tsl::cfg::LayerPosX || tsl::cfg::LayerPosY)) { - tsl::gfx::Renderer::get().setLayerPos(0, 0); - //} - } else { - const auto [horizontalUnderscanPixels, verticalUnderscanPixels] = tsl::gfx::getUnderscanPixels(); - tsl::gfx::Renderer::get().setLayerPos(1280-32 - horizontalUnderscanPixels, 0); - } - if (fixForeground) { - fixForeground = false; - tsl::hlp::requestForeground(true); - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (disableJumpTo) - disableJumpTo = false; - if (fixHiding) { - if (isKeyComboPressed2(keysDown, keysHeld)) { - tsl::Overlay::get()->hide(); - fixHiding = false; - return true; - } - } - - if (keysDown & KEY_B) { - tsl::goBack(); - return true; - } - return false; - } -}; - -class MonitorOverlay : public tsl::Overlay { -public: - - virtual void initServices() override { - //Initialize services - tsl::hlp::doWithSmSession([this]{ - - apmInitialize(); - - if (hosversionAtLeast(5,0,0)) tcCheck = tcInitialize(); - - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { - pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); - } - - if (R_SUCCEEDED(nvInitialize())) nvCheck = nvOpen(&fd, "/dev/nvhost-ctrl-gpu"); - - psmCheck = psmInitialize(); - if (R_SUCCEEDED(psmCheck)) { - psmService = psmGetServiceSession(); - } - i2cCheck = i2cInitialize(); - - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemoryAndRefreshRate(); - } - if (hocclkIpcRunning() && R_SUCCEEDED(hocclkIpcInitialize())) { - uint32_t hocClkApiVer = 0; - hocclkIpcGetAPIVersion(&hocClkApiVer); - if (hocClkApiVer != HOCCLK_IPC_API_VERSION) { - hocclkIpcExit(); - } - else hocclkCheck = 0; - } - if (R_SUCCEEDED(splInitialize())) { - u64 sku = 0; - splGetConfig(SplConfigItem_HardwareType, &sku); - switch(sku) { - case 2 ... 5: - isMariko = true; - break; - default: - isMariko = false; - } - } - splExit(); - - }); - Hinted = envIsSyscallHinted(0x6F); - } - - virtual void exitServices() override { - CloseThreads(); - if (R_SUCCEEDED(hocclkCheck)) { - hocclkIpcExit(); - } - shmemClose(&_sharedmemory); - //Exit services - tsExit(); - tcExit(); - pwmChannelSessionClose(&g_ICon); - pwmExit(); - nvClose(fd); - nvExit(); - psmExit(); - i2cExit(); - apmExit(); - } - - virtual void onShow() override {} // Called before overlay wants to change from invisible to visible state - virtual void onHide() override {} // Called before overlay wants to change from visible to invisible state - - virtual std::unique_ptr loadInitialGui() override { - return initially(); // Initial Gui to load. It's possible to pass arguments to it's constructor like this - } -}; - -class MicroMode : public tsl::Overlay { -public: - - virtual void initServices() override { - //tsl::hlp::requestForeground(false); - //Initialize services - tsl::hlp::doWithSmSession([this]{ - apmInitialize(); - - if (R_SUCCEEDED(nvInitialize())) nvCheck = nvOpen(&fd, "/dev/nvhost-ctrl-gpu"); - - if (hosversionAtLeast(5,0,0)) tcCheck = tcInitialize(); - - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { - pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); - } - - i2cCheck = i2cInitialize(); - - psmCheck = psmInitialize(); - if (R_SUCCEEDED(psmCheck)) { - psmService = psmGetServiceSession(); - } - - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemory(); - } - if (hocclkIpcRunning() && R_SUCCEEDED(hocclkIpcInitialize())) { - uint32_t hocClkApiVer = 0; - hocclkIpcGetAPIVersion(&hocClkApiVer); - if (hocClkApiVer != HOCCLK_IPC_API_VERSION) { - hocclkIpcExit(); - } - else hocclkCheck = 0; - } - if (R_SUCCEEDED(splInitialize())) { - u64 sku = 0; - splGetConfig(SplConfigItem_HardwareType, &sku); - switch(sku) { - case 2 ... 5: - isMariko = true; - break; - default: - isMariko = false; - } - } - splExit(); - }); - Hinted = envIsSyscallHinted(0x6F); - } - - virtual void exitServices() override { - CloseThreads(); - shmemClose(&_sharedmemory); - if (R_SUCCEEDED(hocclkCheck)) { - hocclkIpcExit(); - } - //Exit services - tsExit(); - tcExit(); - pwmChannelSessionClose(&g_ICon); - pwmExit(); - i2cExit(); - psmExit(); - nvClose(fd); - nvExit(); - apmExit(); - } - - virtual void onShow() override { // Called before overlay wants to change from invisible to visible state - tsl::hlp::requestForeground(false); - } - virtual void onHide() override {} // Called before overlay wants to change from visible to invisible state - - virtual std::unique_ptr loadInitialGui() override { - return initially(); // Initial Gui to load. It's possible to pass arguments to it's constructor like this - } -}; - -class MiniEntryOverlay : public tsl::Overlay { -public: - MiniEntryOverlay() {} - - virtual void initServices() override { - - //tsl::hlp::requestForeground(false); - // Same service‐init as before - tsl::hlp::doWithSmSession([this]{ - apmInitialize(); - - if (R_SUCCEEDED(nvInitialize())) nvCheck = nvOpen(&fd, "/dev/nvhost-ctrl-gpu"); - - if (hosversionAtLeast(5,0,0)) tcCheck = tcInitialize(); - - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { - pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); - } - - i2cCheck = i2cInitialize(); - - psmCheck = psmInitialize(); - if (R_SUCCEEDED(psmCheck)) { - psmService = psmGetServiceSession(); - } - - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemory(); - } - if (hocclkIpcRunning() && R_SUCCEEDED(hocclkIpcInitialize())) { - uint32_t hocClkApiVer = 0; - hocclkIpcGetAPIVersion(&hocClkApiVer); - if (hocClkApiVer != HOCCLK_IPC_API_VERSION) { - hocclkIpcExit(); - } - else hocclkCheck = 0; - } - if (R_SUCCEEDED(splInitialize())) { - u64 sku = 0; - splGetConfig(SplConfigItem_HardwareType, &sku); - switch(sku) { - case 2 ... 5: - isMariko = true; - break; - default: - isMariko = false; - } - } - splExit(); - }); - Hinted = envIsSyscallHinted(0x6F); - - } - - virtual void exitServices() override { - CloseThreads(); - shmemClose(&_sharedmemory); - if (R_SUCCEEDED(hocclkCheck)) { - hocclkIpcExit(); - } - // Exit services - tsExit(); - tcExit(); - pwmChannelSessionClose(&g_ICon); - pwmExit(); - i2cExit(); - psmExit(); - nvClose(fd); - nvExit(); - apmExit(); - } - - // **Override onShow** so that as soon as this Overlay appears, we let input pass through. - virtual void onShow() override { - // Request that Tesla stop grabbing all buttons/touches - tsl::hlp::requestForeground(false); - - // (Optional) hide Tesla’s footer if you don’t want it - //deactivateOriginalFooter = true; - } - - virtual std::unique_ptr loadInitialGui() override { - // Immediately show your MiniOverlay page - return initially(); - } -}; - -class FPSGraphEntryOverlay : public tsl::Overlay { -public: - FPSGraphEntryOverlay() {} - - virtual void initServices() override { - tsl::hlp::doWithSmSession([this]{ - apmInitialize(); - - if (R_SUCCEEDED(nvInitialize())) nvCheck = nvOpen(&fd, "/dev/nvhost-ctrl-gpu"); - - if (hosversionAtLeast(5,0,0)) tcCheck = tcInitialize(); - - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { - pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); - } - - i2cCheck = i2cInitialize(); - - psmCheck = psmInitialize(); - if (R_SUCCEEDED(psmCheck)) { - psmService = psmGetServiceSession(); - } - - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemoryAndRefreshRate(); - } - if (hocclkIpcRunning() && R_SUCCEEDED(hocclkIpcInitialize())) { - uint32_t hocClkApiVer = 0; - hocclkIpcGetAPIVersion(&hocClkApiVer); - if (hocClkApiVer != HOCCLK_IPC_API_VERSION) { - hocclkIpcExit(); - } - else hocclkCheck = 0; - } - if (R_SUCCEEDED(splInitialize())) { - u64 sku = 0; - splGetConfig(SplConfigItem_HardwareType, &sku); - switch(sku) { - case 2 ... 5: - isMariko = true; - break; - default: - isMariko = false; - } - } - splExit(); - }); - Hinted = envIsSyscallHinted(0x6F); - } - - virtual void exitServices() override { - CloseThreads(); - shmemClose(&_sharedmemory); - if (R_SUCCEEDED(hocclkCheck)) { - hocclkIpcExit(); - } - tsExit(); - tcExit(); - pwmChannelSessionClose(&g_ICon); - pwmExit(); - i2cExit(); - psmExit(); - nvClose(fd); - nvExit(); - apmExit(); - } - - virtual void onShow() override { - tsl::hlp::requestForeground(false); - //deactivateOriginalFooter = true; - } - - virtual std::unique_ptr loadInitialGui() override { - return initially(); - } -}; - -class FPSCounterEntryOverlay : public tsl::Overlay { -public: - FPSCounterEntryOverlay() {} - - virtual void initServices() override { - tsl::hlp::doWithSmSession([this]{ - apmInitialize(); - - if (R_SUCCEEDED(nvInitialize())) nvCheck = nvOpen(&fd, "/dev/nvhost-ctrl-gpu"); - - if (hosversionAtLeast(5,0,0)) tcCheck = tcInitialize(); - - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { - pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); - } - - i2cCheck = i2cInitialize(); - - psmCheck = psmInitialize(); - if (R_SUCCEEDED(psmCheck)) { - psmService = psmGetServiceSession(); - } - - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemoryAndRefreshRate(); - } - if (hocclkIpcRunning() && R_SUCCEEDED(hocclkIpcInitialize())) { - uint32_t hocClkApiVer = 0; - hocclkIpcGetAPIVersion(&hocClkApiVer); - if (hocClkApiVer != HOCCLK_IPC_API_VERSION) { - hocclkIpcExit(); - } - else hocclkCheck = 0; - } - if (R_SUCCEEDED(splInitialize())) { - u64 sku = 0; - splGetConfig(SplConfigItem_HardwareType, &sku); - switch(sku) { - case 2 ... 5: - isMariko = true; - break; - default: - isMariko = false; - } - } - splExit(); - }); - Hinted = envIsSyscallHinted(0x6F); - } - - virtual void exitServices() override { - CloseThreads(); - shmemClose(&_sharedmemory); - if (R_SUCCEEDED(hocclkCheck)) { - hocclkIpcExit(); - } - tsExit(); - tcExit(); - pwmChannelSessionClose(&g_ICon); - pwmExit(); - i2cExit(); - psmExit(); - nvClose(fd); - nvExit(); - apmExit(); - } - - virtual void onShow() override { - tsl::hlp::requestForeground(false); - //deactivateOriginalFooter = true; - } - - virtual std::unique_ptr loadInitialGui() override { - return initially(); - } -}; - -class GameResolutionsEntryOverlay : public tsl::Overlay { -public: - GameResolutionsEntryOverlay() {} - - virtual void initServices() override { - tsl::hlp::doWithSmSession([this]{ - apmInitialize(); - - if (R_SUCCEEDED(nvInitialize())) nvCheck = nvOpen(&fd, "/dev/nvhost-ctrl-gpu"); - - if (hosversionAtLeast(5,0,0)) tcCheck = tcInitialize(); - - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { - pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); - } - - i2cCheck = i2cInitialize(); - - psmCheck = psmInitialize(); - if (R_SUCCEEDED(psmCheck)) { - psmService = psmGetServiceSession(); - } - - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemoryAndRefreshRate(); - } - if (hocclkIpcRunning() && R_SUCCEEDED(hocclkIpcInitialize())) { - uint32_t hocClkApiVer = 0; - hocclkIpcGetAPIVersion(&hocClkApiVer); - if (hocClkApiVer != HOCCLK_IPC_API_VERSION) { - hocclkIpcExit(); - } - else hocclkCheck = 0; - } - if (R_SUCCEEDED(splInitialize())) { - u64 sku = 0; - splGetConfig(SplConfigItem_HardwareType, &sku); - switch(sku) { - case 2 ... 5: - isMariko = true; - break; - default: - isMariko = false; - } - } - splExit(); - }); - Hinted = envIsSyscallHinted(0x6F); - } - - virtual void exitServices() override { - CloseThreads(); - shmemClose(&_sharedmemory); - if (R_SUCCEEDED(hocclkCheck)) { - hocclkIpcExit(); - } - tsExit(); - tcExit(); - pwmChannelSessionClose(&g_ICon); - pwmExit(); - i2cExit(); - psmExit(); - nvClose(fd); - nvExit(); - apmExit(); - } - - virtual void onShow() override { - tsl::hlp::requestForeground(false); - //deactivateOriginalFooter = true; - } - - virtual std::unique_ptr loadInitialGui() override { - return initially(); - } -}; - - -// Helper function to check if overlay file exists -bool checkOverlayFile(const std::string& filename) { - struct stat buffer; - return stat(filename.c_str(), &buffer) == 0; -} - -// Helper function to setup micro mode paths -inline void setupMode(const std::string& modeType = "") { - - if (modeType == "micro") { - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } else { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 28; - } - } else { - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } - } - - // Try user-specified filename first, then fallback to default - const std::string primaryPath = folderpath + filename; - - if (checkOverlayFile(primaryPath)) { - filepath = primaryPath; - } else { - const std::string fallbackPath = folderpath + "Status-Monitor-Overlay.ovl"; - if (checkOverlayFile(fallbackPath)) { - filepath = fallbackPath; - } - } -} - -//void setupMicroMode() { -// ult::DefaultFramebufferWidth = 1280; -// //ult::DefaultFramebufferHeight = 28; -// ult::DefaultFramebufferHeight = 720; -// -// // Try user-specified filename first, then fallback to default -// const std::string primaryPath = folderpath + filename; -// -// if (checkOverlayFile(primaryPath)) { -// filepath = primaryPath; -// } else { -// const std::string fallbackPath = folderpath + "Status-Monitor-Overlay.ovl"; -// if (checkOverlayFile(fallbackPath)) { -// filepath = fallbackPath; -// } -// } -//} - - -// This function gets called on startup to create a new Overlay object -int main(int argc, char **argv) { - - // load heap settings outside of loop (only Status Monitor directive) - ult::currentHeapSize = ult::getCurrentHeapSize(); - ult::expandedMemory = ult::currentHeapSize >= ult::OverlayHeapSize::Size_8MB; - ult::limitedMemory = ult::currentHeapSize == ult::OverlayHeapSize::Size_4MB; - - - // Initialize buffer sizes based on expanded memory setting - if (ult::expandedMemory) { - ult::furtherExpandedMemory = ult::currentHeapSize > ult::OverlayHeapSize::Size_8MB; - - if (!ult::furtherExpandedMemory) { - ult::loaderTitle += "+"; - ult::COPY_BUFFER_SIZE = 262144; - ult::HEX_BUFFER_SIZE = 8192; - ult::UNZIP_READ_BUFFER = 262144; - ult::UNZIP_WRITE_BUFFER = 131072; - ult::DOWNLOAD_READ_BUFFER = 131072; - ult::DOWNLOAD_WRITE_BUFFER = 131072; - } else { - ult::loaderTitle += "×"; - ult::COPY_BUFFER_SIZE = 262144*2; - ult::HEX_BUFFER_SIZE = 8192; - ult::UNZIP_READ_BUFFER = 262144*2; - ult::UNZIP_WRITE_BUFFER = 131072*4; - ult::DOWNLOAD_READ_BUFFER = 131072*4; - ult::DOWNLOAD_WRITE_BUFFER = 131072*4; - } - } else if (ult::limitedMemory) { - ult::loaderTitle += "-"; - ult::DOWNLOAD_READ_BUFFER = 16*1024; - ult::UNZIP_READ_BUFFER = 16*1024; - } - - systemtickfrequency = armGetSystemTickFreq(); - ParseIniFile(); // parse INI from file - - if (argc > 0) { - filename = argv[0]; // set global - - { - // Read the entire INI file once - auto iniData = ult::getParsedDataFromIniFile(ult::OVERLAYS_INI_FILEPATH); - - auto sectionIt = iniData.find(filename); - if (sectionIt != iniData.end()) { - auto& section = sectionIt->second; - - // Compare and update if values differ - const std::string expectedArgs = "(-mini, -micro, -fps_graph, -fps_counter, -game_resolutions)"; - - if (section["mode_args"] != expectedArgs) { - section["mode_args"] = expectedArgs; - section["mode_labels"] = "(Mini, Micro, FPS Graph, FPS Counter, Game Resolutions)"; - ult::saveIniFileData(ult::OVERLAYS_INI_FILEPATH, iniData); - } - } else { - // If section doesn't exist, create it with expected values - iniData[filename]["mode_args"] = "(-mini, -micro, -fps_graph, -fps_counter, -game_resolutions)"; - iniData[filename]["mode_labels"] = "(Mini, Micro, FPS Graph, FPS Counter, Game Resolutions)"; - ult::saveIniFileData(ult::OVERLAYS_INI_FILEPATH, iniData); - } - } - - // Process command line arguments - for (u8 arg = 0; arg < argc; arg++) { - const char* argStr = argv[arg]; - if (argStr[0] != '-') continue; - - // Check if ends with underscore and create comparison string without it - const size_t len = strlen(argStr); - const bool hasUnderscore = (len > 1 && argStr[len-1] == '_'); - - // For underscore variants, compare without the trailing underscore - char modeStr[32]; - const char* compareStr; - if (hasUnderscore) { - strncpy(modeStr, argStr, len - 1); - modeStr[len - 1] = '\0'; - compareStr = modeStr; - } else { - compareStr = argStr; - } - - // Micro mode - if (strcasecmp(compareStr, "-micro") == 0) { - FullMode = false; - lastMode = "micro"; - if (hasUnderscore) { - setupMode(lastMode); - } else { - skipMain = true; - - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } else { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 28; - } - } - return tsl::loop(argc, argv); - } - // Mini mode - else if (strcasecmp(compareStr, "-mini") == 0) { - FullMode = false; - lastMode = "mini"; - if (hasUnderscore) { - setupMode(); - } else { - skipMain = true; - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } - } - return tsl::loop(argc, argv); - } - // FPS Graph mode - else if (strcasecmp(compareStr, "-fps_graph") == 0) { - FullMode = false; - lastMode = "fps_graph"; - if (hasUnderscore) { - setupMode(); - } else { - skipMain = true; - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } - } - return tsl::loop(argc, argv); - } - // FPS Counter mode - else if (strcasecmp(compareStr, "-fps_counter") == 0) { - FullMode = false; - lastMode = "fps_counter"; - if (hasUnderscore) { - setupMode(); - } else { - skipMain = true; - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } - } - return tsl::loop(argc, argv); - } - // Game Resolutions mode - else if (strcasecmp(compareStr, "-game_resolutions") == 0) { - FullMode = false; - lastMode = "game_resolutions"; - if (hasUnderscore) { - setupMode(); - } else { - skipMain = true; - if (!ult::limitedMemory) { - ult::DefaultFramebufferWidth = 1280; - ult::DefaultFramebufferHeight = 720; - } - } - return tsl::loop(argc, argv); - } - // Handle --lastSelectedItem (multi-token argument) - else if (strcmp(argStr, "--lastSelectedItem") == 0 && arg + 1 < argc) { - lastSelectedItem.clear(); - - for (++arg; arg < argc; ++arg) { - const char* token = argv[arg]; - - // Stop if we hit another flag - if (token[0] == '-' && !lastSelectedItem.empty()) - break; - - // Add space separator - if (!lastSelectedItem.empty()) - lastSelectedItem += ' '; - - lastSelectedItem += token; - - // Stop if token ends with quote - const char lastChar = token[strlen(token) - 1]; - if (lastChar == '"' || lastChar == '\'') { - ++arg; - break; - } - } - - // Clean up quotes and whitespace - ult::removeQuotes(lastSelectedItem); - - // Trim whitespace - const size_t start = lastSelectedItem.find_first_not_of(" \t"); - if (start != std::string::npos) { - const size_t end = lastSelectedItem.find_last_not_of(" \t"); - lastSelectedItem = lastSelectedItem.substr(start, end - start + 1); - } else { - lastSelectedItem.clear(); - } - } - } - } - - // Default case - return tsl::loop(argc, argv); -} \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Battery.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Battery.hpp deleted file mode 100644 index c996ed06..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Battery.hpp +++ /dev/null @@ -1,220 +0,0 @@ -class OtherMenu; - -class BatteryOverlay : public tsl::Gui { -private: - // Separated value buffers - char actualCapacity_c[32] = ""; - char designedCapacity_c[32] = ""; - char batteryTemp_c[32] = ""; - char rawCharge_c[32] = ""; - char batteryAge_c[32] = ""; - char voltageAvg_c[64] = ""; - char currentFlow_c[64] = ""; - char powerFlow_c[64] = ""; - char remainingTime_c[16] = ""; - char inputCurrentLimit_c[32] = ""; - char vbusCurrentLimit_c[32] = ""; - char chargeVoltageLimit_c[32] = ""; - char chargeCurrentLimit_c[32] = ""; - char chargerType_c[32] = ""; - char chargerMaxVoltage_c[32] = ""; - char chargerMaxCurrent_c[32] = ""; - - bool skipOnce = true; - bool runOnce = true; - bool isChargerConnected = false; - FullSettings settings; -public: - BatteryOverlay() { - GetConfigSettings(&settings); - disableJumpTo = true; - mutexInit(&mutex_BatteryChecker); - StartBatteryThread(); - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - } - ~BatteryOverlay() { - CloseBatteryThread(); - fixForeground = true; - } - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - static constexpr u16 Y_OFFSET = 40; - static constexpr u16 X_OFFSET = 20; - static const u16 LABEL_X = 20 + X_OFFSET; - static const u16 VALUE_X = 240+ X_OFFSET; - static const u16 START_Y = 155 + Y_OFFSET; - static constexpr u16 LINE_HEIGHT = 18; - static constexpr u8 FONT_SIZE = 18; - static const tsl::Color LABEL_COLOR_1= settings.catColor1; - static const tsl::Color LABEL_COLOR_2 = settings.catColor2; - static const tsl::Color VALUE_COLOR = settings.textColor; - - renderer->drawString("Battery Stats", false, LABEL_X, 120 + Y_OFFSET, 20, LABEL_COLOR_1); - - u16 currentY = START_Y; - - // Actual Capacity - renderer->drawString("Actual Capacity", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(actualCapacity_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Designed Capacity - renderer->drawString("Designed Capacity", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(designedCapacity_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Temperature - renderer->drawString("Temperature", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(batteryTemp_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Raw Charge - renderer->drawString("Raw Charge", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(rawCharge_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Age - renderer->drawString("Age", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(batteryAge_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Voltage - renderer->drawString("Voltage", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(voltageAvg_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Current Flow - renderer->drawString("Current Flow", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(currentFlow_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Power Flow - renderer->drawString("Power Flow", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(powerFlow_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Remaining Time - renderer->drawString("Remaining Time", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(remainingTime_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Charger-specific fields (only shown when charger is connected) - if (isChargerConnected) { - currentY += 3*LINE_HEIGHT; - renderer->drawString("Charger Stats", false, LABEL_X, currentY, 20, LABEL_COLOR_1); - currentY += 2*LINE_HEIGHT; - // Input Current Limit - renderer->drawString("Input Current Limit", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(inputCurrentLimit_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // VBUS Current Limit - renderer->drawString("VBUS Current Limit", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(vbusCurrentLimit_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Charge Voltage Limit - renderer->drawString("Voltage Limit", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(chargeVoltageLimit_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Charge Current Limit - renderer->drawString("Current Limit", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(chargeCurrentLimit_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Charger Type - renderer->drawString("Type", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(chargerType_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Charger Max Voltage - renderer->drawString("Max Voltage", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(chargerMaxVoltage_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - currentY += LINE_HEIGHT; - - // Charger Max Current - renderer->drawString("Max Current", false, LABEL_X, currentY, FONT_SIZE, LABEL_COLOR_2); - renderer->drawString(chargerMaxCurrent_c, false, VALUE_X, currentY, FONT_SIZE, VALUE_COLOR); - } - }); - - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("Horizon OC Monitor", APP_VERSION, true); - rootFrame->setContent(Status); - - return rootFrame; - } - - virtual void update() override { - mutexLock(&mutex_BatteryChecker); - - char tempBatTimeEstimate[8] = "--:--"; - if (batTimeEstimate >= 0) { - snprintf(tempBatTimeEstimate, sizeof(tempBatTimeEstimate), "%d:%02d", batTimeEstimate / 60, batTimeEstimate % 60); - } - - const BatteryChargeInfoFieldsChargerType ChargerConnected = hosversionAtLeast(17,0,0) ? - ((BatteryChargeInfoFields17*)&_batteryChargeInfoFields)->ChargerType : - _batteryChargeInfoFields.ChargerType; - const int32_t ChargerVoltageLimit = hosversionAtLeast(17,0,0) ? - ((BatteryChargeInfoFields17*)&_batteryChargeInfoFields)->ChargerVoltageLimit : - _batteryChargeInfoFields.ChargerVoltageLimit; - const int32_t ChargerCurrentLimit = hosversionAtLeast(17,0,0) ? - ((BatteryChargeInfoFields17*)&_batteryChargeInfoFields)->ChargerCurrentLimit : - _batteryChargeInfoFields.ChargerCurrentLimit; - - isChargerConnected = (ChargerConnected != 0); - - // Format all values - snprintf(actualCapacity_c, sizeof(actualCapacity_c), "%.0f mAh", actualFullBatCapacity); - snprintf(designedCapacity_c, sizeof(designedCapacity_c), "%.0f mAh", designedFullBatCapacity); - snprintf(batteryTemp_c, sizeof(batteryTemp_c), "%.1f\u00B0C", (float)_batteryChargeInfoFields.BatteryTemperature / 1000); - snprintf(rawCharge_c, sizeof(rawCharge_c), "%.1f%%", (float)_batteryChargeInfoFields.RawBatteryCharge / 1000); - snprintf(batteryAge_c, sizeof(batteryAge_c), "%.1f%%", (float)_batteryChargeInfoFields.BatteryAge / 1000); - snprintf(voltageAvg_c, sizeof(voltageAvg_c), "%.0f mV (%ds)", batVoltageAvg, batteryFiltered ? 45 : 5); - snprintf(currentFlow_c, sizeof(currentFlow_c), "%+.0f mA (%ss)", batCurrentAvg, batteryFiltered ? "11.25" : "5"); - snprintf(powerFlow_c, sizeof(powerFlow_c), "%+.3f W%s", PowerConsumption, batteryFiltered ? "" : " (5s)"); - snprintf(remainingTime_c, sizeof(remainingTime_c), "%s", tempBatTimeEstimate); - - if (isChargerConnected) { - snprintf(inputCurrentLimit_c, sizeof(inputCurrentLimit_c), "%d mA", _batteryChargeInfoFields.InputCurrentLimit); - snprintf(vbusCurrentLimit_c, sizeof(vbusCurrentLimit_c), "%d mA", _batteryChargeInfoFields.VBUSCurrentLimit); - snprintf(chargeVoltageLimit_c, sizeof(chargeVoltageLimit_c), "%d mV", _batteryChargeInfoFields.ChargeVoltageLimit); - snprintf(chargeCurrentLimit_c, sizeof(chargeCurrentLimit_c), "%d mA", _batteryChargeInfoFields.ChargeCurrentLimit); - snprintf(chargerType_c, sizeof(chargerType_c), "%u", ChargerConnected); - snprintf(chargerMaxVoltage_c, sizeof(chargerMaxVoltage_c), "%u mV", ChargerVoltageLimit); - snprintf(chargerMaxCurrent_c, sizeof(chargerMaxCurrent_c), "%u mA", ChargerCurrentLimit); - } - - mutexUnlock(&mutex_BatteryChecker); - - if (!skipOnce) { - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(uint64_t keysDown, uint64_t keysHeld, touchPosition touchInput, JoystickPosition leftJoyStick, JoystickPosition rightJoyStick) override { - if (keysDown & KEY_B) { - isRendering = false; - leventSignal(&renderingStopEvent); - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - skipOnce = true; - runOnce = true; - lastSelectedItem = "Battery/Charger"; - lastMode = ""; - tsl::swapTo(); - return true; - } - return false; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Configurator.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Configurator.hpp deleted file mode 100644 index b18c940b..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Configurator.hpp +++ /dev/null @@ -1,2290 +0,0 @@ -/* - * Mode-Specific Configuration Settings - * - * Based on actual settings structures, each mode only shows applicable settings: - * - * Mini Mode: Refresh Rate, Colors (background, focus_background, separator, category, text), - * Toggles, Font Sizes, Elements, DTC Format - * - * Micro Mode: Refresh Rate, Colors (background, separator, category, text), Toggles, - * Font Sizes, Elements, Text Alignment, Vertical Position (Top/Bottom only), DTC Format - * - * Full Mode: Refresh Rate, Toggles (show_real_freqs, show_deltas, etc.), - * Horizontal Position (Left/Right only) - NO colors, fonts, or elements - * - * FPS Counter: Refresh Rate, Colors (background, text only), Font Sizes, - * Horizontal/Vertical Position - * - * FPS Graph: Refresh Rate, Colors (8 graph-specific colors), Toggles (show_info only), - * Horizontal/Vertical Position - NO fonts - * - * Game Resolutions: Refresh Rate, Colors (background, category, text only), - * Horizontal/Vertical Position - NO toggles, fonts, or elements - */ - -#pragma once -#include -#include "../Utils.hpp" - -#include - -// External variables for navigation -extern std::string jumpItemName; -extern std::string jumpItemValue; -extern std::atomic jumpItemExactMatch; -static tsl::elm::ListItem* lastSelectedListItem; - -// Forward declarations -class ConfiguratorOverlay; -class RefreshRateConfig; -class FontSizeConfig; -class FontSizeSelector; -class ColorConfig; -class ColorSelector; -class AlphaSelector; -class ShowConfig; -class TogglesConfig; -class DTCFormatConfig; - -// Helper functions for color manipulation -inline std::string extractColorWithoutAlpha(const std::string& rgba) { - if (rgba.length() >= 5 && rgba[0] == '#') { - return rgba.substr(0, 4); // Return #RGB without alpha - } - return rgba; -} - -inline std::string extractAlphaFromColor(const std::string& rgba) { - if (rgba.length() == 5 && rgba[0] == '#') { - return std::string(1, rgba[4]); // Return just the alpha character - } - return "9"; // Default alpha -} - -inline std::string setAlphaInColor(const std::string& rgba, char alpha) { - if (rgba.length() >= 4 && rgba[0] == '#') { - std::string result = rgba.substr(0, 4); // Get #RGB - result += alpha; // Add new alpha - return result; - } - return rgba; -} - -// Alpha Selector for background colors -class AlphaSelector : public tsl::Gui { -private: - std::string modeName; - std::string colorKey; - std::string title; - bool isMiniMode; - bool isMicroMode; - bool isFPSCounterMode; - bool isFPSGraphMode; - bool isGameResolutionsMode; - -public: - AlphaSelector(const std::string& mode, const std::string& key, const std::string& displayTitle) - : modeName(mode), colorKey(key), title(displayTitle) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFPSCounterMode = (mode == "FPS Counter"); - isFPSGraphMode = (mode == "FPS Graph"); - isGameResolutionsMode = (mode == "Game Resolutions"); - } - ~AlphaSelector() { - lastSelectedListItem = nullptr; - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader(title)); - - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - else if (isGameResolutionsMode) section = "game_resolutions"; - - // Get current color value and extract alpha - std::string currentColor = ult::parseValueFromIniSection(configIniPath, section, colorKey); - if (currentColor.empty()) { - currentColor = "#0009"; // Default - } - std::string currentAlpha = extractAlphaFromColor(currentColor); - - // Alpha options - static const std::vector> alphaOptions = { - {"Transparent", '0'}, - {"10%", '1'}, - {"20%", '3'}, - {"30%", '4'}, - {"40%", '6'}, - {"50%", '8'}, - {"60%", '9'}, - {"70%", 'B'}, - {"80%", 'C'}, - {"90%", 'E'}, - {"Opaque", 'F'} - }; - - for (const auto& option : alphaOptions) { - auto* alphaItem = new tsl::elm::ListItem(option.first); - if (currentAlpha[0] == option.second) { - alphaItem->setValue(ult::CHECKMARK_SYMBOL); - lastSelectedListItem = alphaItem; - } - alphaItem->setClickListener([this, alphaItem, option, section, currentColor](uint64_t keys) { - if (keys & KEY_A) { - // Get current color and update only the alpha - std::string color = ult::parseValueFromIniSection(configIniPath, section, colorKey); - if (color.empty()) color = "#0009"; - - std::string newColor = setAlphaInColor(color, option.second); - ult::setIniFileValue(configIniPath, section, colorKey, newColor); - - alphaItem->setValue(ult::CHECKMARK_SYMBOL); - if (lastSelectedListItem && lastSelectedListItem != alphaItem) { - lastSelectedListItem->setValue(""); - } - lastSelectedListItem = alphaItem; - return true; - } - return false; - }); - list->addItem(alphaItem); - } - - list->jumpToItem("", ult::CHECKMARK_SYMBOL, false); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Alpha"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - jumpItemName = title; - jumpItemValue = ""; - jumpItemExactMatch = false; - - tsl::swapTo(SwapDepth(2), modeName); - return true; - } - return false; - } -}; - - -// Define available DTC format options -static const std::vector> dtcFormats = { - // Special - {"Pretty", "%a, %b %d"+ult::DIVIDER_SYMBOL+"%I:%M %p"}, - {"Compact", "%Y%m%d"+ult::DIVIDER_SYMBOL+"%H:%M:%S"}, - {"FileSafe", "%Y-%m-%d"+ult::DIVIDER_SYMBOL+"%H-%M-%S"}, - {"Day+Time", "%a"+ult::DIVIDER_SYMBOL+"%H:%M"}, - - // Datetime (default included here) - {"Date+Time(s)", "%m-%d-%Y"+ult::DIVIDER_SYMBOL+"%H:%M:%S"}, // default - {"Date+Time AM/PM", "%m-%d-%Y"+ult::DIVIDER_SYMBOL+"%I:%M %p"}, - {"Date+Time(s) AM/PM", "%m-%d-%Y"+ult::DIVIDER_SYMBOL+"%I:%M:%S %p"}, - {"Date+Time EU", "%d/%m/%Y"+ult::DIVIDER_SYMBOL+"%H:%M"}, - {"Date+Time EU AM/PM", "%d/%m/%Y"+ult::DIVIDER_SYMBOL+"%I:%M %p"}, - {"Date+Time(s) EU AM/PM", "%d/%m/%Y"+ult::DIVIDER_SYMBOL+"%I:%M:%S %p"}, - {"Date+Time ISO", "%Y-%m-%dT"+ult::DIVIDER_SYMBOL+"%H:%M:%S"}, - - // Time only - {"Time 24h", "%H:%M"}, - {"Time AM/PM", "%I:%M %p"}, - {"Time(s) 24h", "%H:%M:%S"}, - {"Time(s) AM/PM", "%I:%M:%S %p"}, - - // Date only - {"Date US", "%m-%d-%Y"}, - {"Date EU", "%d/%m/%Y"}, - {"Date ISO", "%Y-%m-%d"}, - {"Date Short", "%m/%d/%y"} -}; - -// DTC Format Configuration (Mini/Micro only) -class DTCFormatConfig : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - -public: - DTCFormatConfig(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - } - ~DTCFormatConfig() { - lastSelectedListItem = nullptr; - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("DTC Format")); - - const std::string section = isMiniMode ? "mini" : "micro"; - std::string currentValue = ult::parseValueFromIniSection(configIniPath, section, "dtc_format"); - - // Handle default values - if (currentValue.empty()) { - currentValue = isMiniMode ? "%m-%d-%Y"+ult::DIVIDER_SYMBOL+"%H:%M:%S" : "%H:%M:%S"; - } - - - for (const auto& format : dtcFormats) { - auto* formatItem = new tsl::elm::ListItem(format.first); - //formatItem->setValue(format.second); - if (format.second == currentValue) { - formatItem->setValue(ult::CHECKMARK_SYMBOL); - lastSelectedListItem = formatItem; - } - formatItem->setClickListener([this, formatItem, format, section](uint64_t keys) { - if (keys & KEY_A) { - ult::setIniFileValue(configIniPath, section, "dtc_format", format.second); - formatItem->setValue(ult::CHECKMARK_SYMBOL); - if (lastSelectedListItem && lastSelectedListItem != formatItem) { - lastSelectedListItem->setValue(""); - } - lastSelectedListItem = formatItem; - return true; - } - return false; - }); - list->addItem(formatItem); - } - - // Jump to currently selected item - list->jumpToItem("", ult::CHECKMARK_SYMBOL, false); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "DTC Format"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - jumpItemName = "DTC Format"; - jumpItemValue = ""; - jumpItemExactMatch = false; - - tsl::swapTo(SwapDepth(2), modeName); - return true; - } - return false; - } -}; - -// Toggles Configuration -class TogglesConfig : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - bool isFullMode; - bool isFPSGraphMode; - bool isGameResolutionsMode; - bool isFPSCounterMode; - -public: - TogglesConfig(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFullMode = (mode == "Full"); - isFPSGraphMode = (mode == "FPS Graph"); - isGameResolutionsMode = (mode == "Game Resolutions"); - isFPSCounterMode = (mode == "FPS Counter"); - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Toggles")); - - if (isFPSGraphMode) { - // FPS Graph: show_info and disable_screenshots - auto* showInfo = new tsl::elm::ToggleListItem("Info", getCurrentShowInfo()); - showInfo->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-graph", "show_info", state ? "true" : "false"); - }); - list->addItem(showInfo); - - auto* realTemps = new tsl::elm::ToggleListItem("Real Temperatures", getCurrentFPSGraphRealTemps()); - realTemps->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-graph", "real_temps", state ? "true" : "false"); - }); - list->addItem(realTemps); - - auto* dynamicColors = new tsl::elm::ToggleListItem("Use Dynamic Colors", getCurrentUseDynamicColors()); - dynamicColors->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-graph", "use_dynamic_colors", state ? "true" : "false"); - }); - list->addItem(dynamicColors); - - auto* disableScreenshots = new tsl::elm::ToggleListItem("Disable Screenshots", getCurrentDisableScreenshots("fps-graph")); - disableScreenshots->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-graph", "disable_screenshots", state ? "true" : "false"); - }); - list->addItem(disableScreenshots); - - } else if (isFullMode) { - // Full mode: specific full toggles - auto* realFreqs = new tsl::elm::ToggleListItem("Real Freqs", getCurrentShowRealFreqs()); - realFreqs->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "show_real_freqs", state ? "true" : "false"); - }); - list->addItem(realFreqs); - - auto* realTemps = new tsl::elm::ToggleListItem("Real Temperatures", getCurrentFullRealTemps()); - realTemps->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "real_temps", state ? "true" : "false"); - }); - list->addItem(realTemps); - - auto* showDeltas = new tsl::elm::ToggleListItem("Deltas", getCurrentShowDeltas()); - showDeltas->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "show_deltas", state ? "true" : "false"); - }); - list->addItem(showDeltas); - - auto* targetFreqs = new tsl::elm::ToggleListItem("Target Freqs", getCurrentShowTargetFreqs()); - targetFreqs->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "show_target_freqs", state ? "true" : "false"); - }); - list->addItem(targetFreqs); - - auto* showFPS = new tsl::elm::ToggleListItem("FPS", getCurrentShowFPS()); - showFPS->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "show_fps", state ? "true" : "false"); - }); - list->addItem(showFPS); - - auto* showRES = new tsl::elm::ToggleListItem("RES", getCurrentShowRES()); - showRES->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "show_res", state ? "true" : "false"); - }); - list->addItem(showRES); - - auto* showRDSD = new tsl::elm::ToggleListItem("Read Speed", getCurrentShowRDSD()); - showRDSD->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "show_read_speed", state ? "true" : "false"); - }); - list->addItem(showRDSD); - - { - const std::string curRamInfoMode = getCurrentRamInfoMode("full"); - auto* ramInfoModeItem = new tsl::elm::ListItem("RAM Info Mode"); - ramInfoModeItem->setValue(curRamInfoMode); - ramInfoModeItem->setClickListener([this, ramInfoModeItem](u64 keys) -> bool { - if (!(keys & KEY_A)) return false; - const std::string cur = ult::parseValueFromIniSection(configIniPath, "full", "ram_info_mode"); - const std::string next = cur == "Bandwidth" ? "Load" : "Bandwidth"; - ult::setIniFileValue(configIniPath, "full", "ram_info_mode", next); - ramInfoModeItem->setValue(next); - return true; - }); - list->addItem(ramInfoModeItem); - } - - auto* dynamicColors = new tsl::elm::ToggleListItem("Use Dynamic Colors", getCurrentUseDynamicColors()); - dynamicColors->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-graph", "use_dynamic_colors", state ? "true" : "false"); - }); - list->addItem(dynamicColors); - - auto* disableScreenshots = new tsl::elm::ToggleListItem("Disable Screenshots", getCurrentDisableScreenshots("full")); - disableScreenshots->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "full", "disable_screenshots", state ? "true" : "false"); - }); - list->addItem(disableScreenshots); - - } else if (isMiniMode || isMicroMode) { - // Mini/Micro modes: shared toggles - const std::string section = isMiniMode ? "mini" : "micro"; - - auto* realFreqs = new tsl::elm::ToggleListItem("Real Frequencies", getCurrentRealFreqs()); - realFreqs->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "real_freqs", state ? "true" : "false"); - }); - list->addItem(realFreqs); - - auto* realVolts = new tsl::elm::ToggleListItem("Real Voltages", getCurrentRealVolts()); - realVolts->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "real_volts", state ? "true" : "false"); - }); - list->addItem(realVolts); - - auto* realTemps = new tsl::elm::ToggleListItem("Real Temperatures", getCurrentRealTemps()); - realTemps->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "real_temps", state ? "true" : "false"); - }); - list->addItem(realTemps); - - auto* showFullCPU = new tsl::elm::ToggleListItem("Full CPU", getCurrentShowFullCPU()); - showFullCPU->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "show_full_cpu", state ? "true" : "false"); - }); - list->addItem(showFullCPU); - - auto* showVDDQ = new tsl::elm::ToggleListItem("VDDQ", getCurrentShowVDDQ()); - showVDDQ->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "show_vddq", state ? "true" : "false"); - }); - list->addItem(showVDDQ); - - auto* showVDD2 = new tsl::elm::ToggleListItem("VDD2", getCurrentShowVDD2()); - showVDD2->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "show_vdd2", state ? "true" : "false"); - }); - list->addItem(showVDD2); - - auto* showFullRes = new tsl::elm::ToggleListItem("Full Resolution", getCurrentShowFullRes()); - showFullRes->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "show_full_res", state ? "true" : "false"); - }); - list->addItem(showFullRes); - - auto* socVoltage = new tsl::elm::ToggleListItem("SOC Voltage", getCurrentShowSOCVoltage()); - socVoltage->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "show_soc_voltage", state ? "true" : "false"); - }); - list->addItem(socVoltage); - - if (isMiniMode) { - auto* partLoadCPUGPU = new tsl::elm::ToggleListItem("RAM Load CPU/GPU", getCurrentShowpartLoadCPUGPU()); - partLoadCPUGPU->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "show_RAM_load_CPU_GPU", state ? "true" : "false"); - }); - list->addItem(partLoadCPUGPU); - } - - if (isMiniMode || isMicroMode) { - const std::string curRamInfoMode = getCurrentRamInfoMode(section); - auto* ramInfoModeItem = new tsl::elm::ListItem("RAM Info Mode"); - ramInfoModeItem->setValue(curRamInfoMode); - ramInfoModeItem->setClickListener([this, section, ramInfoModeItem](u64 keys) -> bool { - if (!(keys & KEY_A)) return false; - const std::string cur = ult::parseValueFromIniSection(configIniPath, section, "ram_info_mode"); - const std::string next = cur == "Bandwidth" ? "Load" : "Bandwidth"; - ult::setIniFileValue(configIniPath, section, "ram_info_mode", next); - ramInfoModeItem->setValue(next); - return true; - }); - list->addItem(ramInfoModeItem); - } - - if (isMiniMode || isMicroMode) { - auto* invertBatteryDisplay = new tsl::elm::ToggleListItem("Invert Battery Display", getCurrentInvertBatteryDisplay()); - invertBatteryDisplay->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "invert_battery_display", state ? "true" : "false"); - }); - list->addItem(invertBatteryDisplay); - } - - auto* dtcSymbol = new tsl::elm::ToggleListItem("Use DTC Symbol", getCurrentUseDTCSymbol()); - dtcSymbol->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "use_dtc_symbol", state ? "true" : "false"); - }); - list->addItem(dtcSymbol); - - auto* dynamicColors = new tsl::elm::ToggleListItem("Use Dynamic Colors", getCurrentUseDynamicColors()); - dynamicColors->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "use_dynamic_colors", state ? "true" : "false"); - }); - list->addItem(dynamicColors); - - auto* disableScreenshots = new tsl::elm::ToggleListItem("Disable Screenshots", getCurrentDisableScreenshots(section)); - disableScreenshots->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "disable_screenshots", state ? "true" : "false"); - }); - list->addItem(disableScreenshots); - - auto* sleepExit = new tsl::elm::ToggleListItem("Sleep Exit", getCurrentSleepExit(section)); - sleepExit->setStateChangedListener([this, section](bool state) { - ult::setIniFileValue(configIniPath, section, "sleep_exit", state ? "true" : "false"); - }); - list->addItem(sleepExit); - - } else if (isGameResolutionsMode) { - // Game Resolutions mode: only disable_screenshots - auto* disableScreenshots = new tsl::elm::ToggleListItem("Disable Screenshots", getCurrentDisableScreenshots("game_resolutions")); - disableScreenshots->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "game_resolutions", "disable_screenshots", state ? "true" : "false"); - }); - list->addItem(disableScreenshots); - - } else if (isFPSCounterMode) { - // FPS Counter mode: only disable_screenshots - auto* integerCounter = new tsl::elm::ToggleListItem("Use Integer Counter", getCurrentUseIntegerCounter("fps-counter")); - integerCounter->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-counter", "use_integer_counter", state ? "true" : "false"); - }); - list->addItem(integerCounter); - - // FPS Counter mode: only disable_screenshots - auto* disableScreenshots = new tsl::elm::ToggleListItem("Disable Screenshots", getCurrentDisableScreenshots("fps-counter")); - disableScreenshots->setStateChangedListener([this](bool state) { - ult::setIniFileValue(configIniPath, "fps-counter", "disable_screenshots", state ? "true" : "false"); - }); - list->addItem(disableScreenshots); - } - - list->jumpToItem(jumpItemName, jumpItemValue, jumpItemExactMatch); - { - jumpItemName = ""; - jumpItemValue = ""; - jumpItemExactMatch = false; - } - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Configuration"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - tsl::goBack(); - return true; - } - return false; - } - -private: - // Helper methods for getting current toggle states - bool getCurrentShowInfo() { - std::string value = ult::parseValueFromIniSection(configIniPath, "fps-graph", "show_info"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentFPSGraphRealTemps() { - std::string value = ult::parseValueFromIniSection(configIniPath, "fps-graph", "real_temps"); - if (value.empty()) return false; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentRealFreqs() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "real_freqs"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentRealVolts() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "real_volts"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentRealTemps() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "real_temps"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentShowFullCPU() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "show_full_cpu"); - if (value.empty()) return false; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentShowVDDQ() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "show_vddq"); - if (value.empty()) return false; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentShowVDD2() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "show_vdd2"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - - bool getCurrentShowFullRes() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "show_full_res"); - if (value.empty()) return true; // Default: true for mini, false for micro - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentShowSOCVoltage() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "show_soc_voltage"); - if (value.empty()) return false; // Default: false for mini, true for micro - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentShowpartLoadCPUGPU() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "show_RAM_load_CPU_GPU"); - if (value.empty()) return false; // Default: false for mini, true for micro - convertToUpper(value); - return value != "FALSE"; - } - - std::string getCurrentRamInfoMode(const std::string& section) { - const std::string value = ult::parseValueFromIniSection(configIniPath, section, "ram_info_mode"); - return (value == "Bandwidth") ? "Bandwidth" : "Load"; - } - - bool getCurrentInvertBatteryDisplay() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "invert_battery_display"); - if (value.empty()) return isMiniMode ? true : false; // Default: false for mini, true for micro - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentUseDTCSymbol() { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "use_dtc_symbol"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentUseDynamicColors() { - const std::string section = isFPSGraphMode? "fps-graph" : (isMiniMode ? "mini" : "micro"); - std::string value = ult::parseValueFromIniSection(configIniPath, section, "use_dynamic_colors"); - if (value.empty()) return true; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentUseIntegerCounter(const std::string& section) { - std::string value = ult::parseValueFromIniSection(configIniPath, section, "use_integer_counter"); - if (value.empty()) return false; // Default is false (screenshots enabled) - convertToUpper(value); - return value != "FALSE"; // True if not explicitly "FALSE" - } - - bool getCurrentDisableScreenshots(const std::string& section) { - std::string value = ult::parseValueFromIniSection(configIniPath, section, "disable_screenshots"); - if (value.empty()) return false; // Default is false (screenshots enabled) - convertToUpper(value); - return value != "FALSE"; // True if not explicitly "FALSE" - } - - bool getCurrentSleepExit(const std::string& section) { - std::string value = ult::parseValueFromIniSection(configIniPath, section, "sleep_exit"); - if (value.empty()) return false; - convertToUpper(value); - return value != "FALSE"; // True if not explicitly "FALSE" - } - - // Full mode toggle helpers - bool getCurrentShowRealFreqs() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "show_real_freqs"); - if (value.empty()) return true; - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentFullRealTemps() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "real_temps"); - if (value.empty()) return false; - convertToUpper(value); - return value == "TRUE"; - } - - bool getCurrentShowDeltas() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "show_deltas"); - if (value.empty()) return true; - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentShowTargetFreqs() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "show_target_freqs"); - if (value.empty()) return true; - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentShowFPS() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "show_fps"); - if (value.empty()) return true; - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentShowRES() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "show_res"); - if (value.empty()) return true; - convertToUpper(value); - return value != "FALSE"; - } - - bool getCurrentShowRDSD() { - std::string value = ult::parseValueFromIniSection(configIniPath, "full", "show_read_speed"); - if (value.empty()) return true; - convertToUpper(value); - return value != "FALSE"; - } -}; - -// Refresh Rate Configuration -class RefreshRateConfig : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - bool isFullMode; - bool isGameResolutionsMode; - bool isFPSCounterMode; - bool isFPSGraphMode; - int currentRate; - -public: - RefreshRateConfig(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFullMode = (mode == "Full"); - isGameResolutionsMode = (mode == "Game Resolutions"); - isFPSCounterMode = (mode == "FPS Counter"); - isFPSGraphMode = (mode == "FPS Graph"); - - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - const std::string value = ult::parseValueFromIniSection(configIniPath, section, "refresh_rate"); - int defaultRate = (isGameResolutionsMode) ? 10 : ((isFPSCounterMode || isFPSGraphMode) ? 30 : 1); - currentRate = value.empty() ? defaultRate : std::clamp(atoi(value.c_str()), 1, 60); - } - - ~RefreshRateConfig() { - lastSelectedListItem = nullptr; - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Refresh Rate")); - - static const std::vector rates = {1, 2, 3, 5, 10, 15, 30, 60}; - for (int rate : rates) { - auto* rateItem = new tsl::elm::ListItem(std::to_string(rate) + " Hz"); - if (rate == currentRate) { - rateItem->setValue(ult::CHECKMARK_SYMBOL); - lastSelectedListItem = rateItem; - } - rateItem->setClickListener([this, rateItem, rate](uint64_t keys) { - if (keys & KEY_A) { - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - ult::setIniFileValue(configIniPath, section, "refresh_rate", std::to_string(rate)); - rateItem->setValue(ult::CHECKMARK_SYMBOL); - if (lastSelectedListItem && rateItem != lastSelectedListItem) - lastSelectedListItem->setValue(""); - lastSelectedListItem = rateItem; - return true; - } - return false; - }); - list->addItem(rateItem); - } - - list->jumpToItem("", ult::CHECKMARK_SYMBOL, false); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Configuration"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - jumpItemName = "Refresh Rate"; - jumpItemValue = ""; - jumpItemExactMatch = false; - - tsl::swapTo(SwapDepth(2), modeName); - return true; - } - return false; - } -}; - -// Frame Padding Configuration (Mini only) -class FramePaddingConfig : public tsl::Gui { -private: - std::string modeName; - int currentPadding; - -public: - FramePaddingConfig(const std::string& mode) : modeName(mode) { - const std::string value = ult::parseValueFromIniSection(configIniPath, "mini", "frame_padding"); - currentPadding = value.empty() ? 10 : std::clamp(atoi(value.c_str()), 0, 14); // max value 14 - } - - ~FramePaddingConfig() { - lastSelectedListItem = nullptr; - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Frame Padding")); - - static const std::vector paddingValues = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; - for (int padding : paddingValues) { - auto* paddingItem = new tsl::elm::ListItem(std::to_string(padding) + " px"); - if (padding == currentPadding) { - paddingItem->setValue(ult::CHECKMARK_SYMBOL); - lastSelectedListItem = paddingItem; - } - paddingItem->setClickListener([this, paddingItem, padding](uint64_t keys) { - if (keys & KEY_A) { - ult::setIniFileValue(configIniPath, "mini", "frame_padding", std::to_string(padding)); - paddingItem->setValue(ult::CHECKMARK_SYMBOL); - if (lastSelectedListItem && paddingItem != lastSelectedListItem) - lastSelectedListItem->setValue(""); - lastSelectedListItem = paddingItem; - return true; - } - return false; - }); - list->addItem(paddingItem); - } - - list->jumpToItem("", ult::CHECKMARK_SYMBOL, false); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Configuration"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - jumpItemName = "Frame Padding"; - jumpItemValue = ""; - jumpItemExactMatch = false; - - tsl::swapTo(SwapDepth(2), modeName); - return true; - } - return false; - } -}; - - -// Font Size Selector -class FontSizeSelector : public tsl::Gui { -private: - std::string modeName; - std::string fontType; - bool isMiniMode; - bool isMicroMode; - bool isFPSCounterMode; - std::string title; - -public: - FontSizeSelector(const std::string& mode, const std::string& type) - : modeName(mode), fontType(type) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFPSCounterMode = (mode == "FPS Counter"); - title = fontType; - title[0] = std::toupper(title[0]); - title += " Font Size"; - } - ~FontSizeSelector() { - lastSelectedListItem = nullptr; - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader(title)); - - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFPSCounterMode) section = "fps-counter"; - - const std::string keyName = fontType + "_font_size"; - const std::string currentValue = ult::parseValueFromIniSection(configIniPath, section, keyName); - int defaultSize = isFPSCounterMode ? 40 : 15; - const int currentSize = currentValue.empty() ? defaultSize : atoi(currentValue.c_str()); - - // Font size range depends on mode - int minSize = 8; - int maxSize; - if (isFPSCounterMode) maxSize = 150; - else if (isMiniMode) maxSize = 22; - else maxSize = 18; // Micro mode - - for (int size = minSize; size <= maxSize; size++) { - auto* sizeItem = new tsl::elm::ListItem(std::to_string(size) + " pt"); - if (size == currentSize) { - sizeItem->setValue(ult::CHECKMARK_SYMBOL); - lastSelectedListItem = sizeItem; - } - sizeItem->setClickListener([this, sizeItem, size, keyName, section](uint64_t keys) { - if (keys & KEY_A) { - ult::setIniFileValue(configIniPath, section, keyName, std::to_string(size)); - sizeItem->setValue(ult::CHECKMARK_SYMBOL); - if (lastSelectedListItem && lastSelectedListItem != sizeItem) - lastSelectedListItem->setValue(""); - lastSelectedListItem = sizeItem; - return true; - } - return false; - }); - list->addItem(sizeItem); - } - - list->jumpToItem("", ult::CHECKMARK_SYMBOL, false); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Font Sizes"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - jumpItemName = title; - jumpItemValue = ""; - jumpItemExactMatch = false; - - tsl::swapTo(SwapDepth(2), modeName); - return true; - } - return false; - } -}; - -// Font Size Configuration -class FontSizeConfig : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - bool isFPSCounterMode; - -public: - FontSizeConfig(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFPSCounterMode = (mode == "FPS Counter"); - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Font Sizes")); - - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFPSCounterMode) section = "fps-counter"; - - const std::string handheldValue = ult::parseValueFromIniSection(configIniPath, section, "handheld_font_size"); - const std::string dockedValue = ult::parseValueFromIniSection(configIniPath, section, "docked_font_size"); - - int defaultSize = isFPSCounterMode ? 40 : 15; - const int handheldSize = handheldValue.empty() ? defaultSize : atoi(handheldValue.c_str()); - const int dockedSize = dockedValue.empty() ? defaultSize : atoi(dockedValue.c_str()); - - auto* handheldItem = new tsl::elm::ListItem("Handheld Font Size"); - handheldItem->setValue(std::to_string(handheldSize) + " pt"); - handheldItem->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "handheld"); - return true; - } - return false; - }); - list->addItem(handheldItem); - - auto* dockedItem = new tsl::elm::ListItem("Docked Font Size"); - dockedItem->setValue(std::to_string(dockedSize) + " pt"); - dockedItem->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "docked"); - return true; - } - return false; - }); - list->addItem(dockedItem); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Configuration"); - rootFrame->setContent(list); - list->jumpToItem(jumpItemName, jumpItemValue, jumpItemExactMatch); - { - jumpItemName = ""; - jumpItemValue = ""; - jumpItemExactMatch = false; - } - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - tsl::goBack(); - return true; - } - return false; - } -}; - -// Color Selector -class ColorSelector : public tsl::Gui { -private: - std::string modeName; - std::string modeTitle; - std::string colorKey; - std::string defaultValue; - bool isMiniMode; - bool isMicroMode; - bool isFullMode; - bool isGameResolutionsMode; - bool isFPSCounterMode; - bool isFPSGraphMode; - bool isBackgroundColor; - bool isTextBasedColor; - -public: - ColorSelector(const std::string& mode, const std::string& title, const std::string& key, const std::string& def) - : modeName(mode), modeTitle(title), colorKey(key), defaultValue(def) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFullMode = (mode == "Full"); - isGameResolutionsMode = (mode == "Game Resolutions"); - isFPSCounterMode = (mode == "FPS Counter"); - isFPSGraphMode = (mode == "FPS Graph"); - - // Determine if this is a background color or text-based color - isBackgroundColor = (key == "background_color" || key == "focus_background_color" || - (isFPSGraphMode && (key == "fps_counter_color" || key == "dashed_line_color"))); - - isTextBasedColor = (key == "text_color" || key == "separator_color" || key == "cat_color" || - (isFPSGraphMode && (key == "border_color" || key == "max_fps_text_color" || - key == "min_fps_text_color" || key == "main_line_color" || - key == "rounded_line_color" || key == "perfect_line_color"))); - } - - ~ColorSelector() { - lastSelectedListItem = nullptr; - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader(modeTitle)); - - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - std::string currentValue = ult::parseValueFromIniSection(configIniPath, section, colorKey); - if (currentValue.empty()) currentValue = defaultValue; - - // Extract the color without alpha for comparison (for backgrounds and text colors) - std::string currentColorWithoutAlpha = extractColorWithoutAlpha(currentValue); - - // Updated colors list with comprehensive color palette - static const std::vector> colors = { - // Grays & Basics - {"Black", "#000F"}, - {"Dark Gray", "#333F"}, - {"Gray", "#444F"}, - {"Light Gray", "#888F"}, - {"Silver", "#CCCF"}, - {"White", "#FFFF"}, - - // Reds - {"Dark Red", "#800F"}, - {"Red", "#F00F"}, - {"Light Red", "#F88F"}, - {"Pink", "#F8AF"}, - - // Greens - {"Dark Green", "#080F"}, - {"Green", "#0F0F"}, - {"Lime Green", "#0C0F"}, - {"Light Green", "#8F8F"}, - - // Blues - {"Dark Blue", "#003F"}, - {"Blue", "#00FF"}, - {"Light Blue", "#2DFF"}, - {"Sky Blue", "#8CFF"}, - - // Purples - {"Dark Purple", "#808F"}, - {"Purple", "#80FF"}, - {"Light Purple", "#C8FF"}, - {"Violet", "#A0FF"}, - - // Yellows & Oranges - {"Orange", "#F80F"}, - {"Yellow", "#FF0F"}, - {"Light Yellow", "#FFCF"}, - - // Cyans & Teals - {"Teal", "#088F"}, - {"Cyan", "#0FFF"}, - {"Light Cyan", "#8FFF"}, - - // Magentas & Pinks - {"Magenta", "#F0FF"}, - {"Hot Pink", "#F8CF"}, - - // Browns - {"Brown", "#840F"}, - {"Light Brown", "#A86F"} - }; - - std::string _jumpItemValue; - for (const auto& color : colors) { - auto* colorItem = new tsl::elm::ListItem(color.first); - - // For display, show the color code based on type - std::string displayValue; - if (isTextBasedColor || isBackgroundColor) { - // For ALL text-based colors AND background colors, show without the alpha - displayValue = extractColorWithoutAlpha(color.second); - } else { - // For any remaining FPS Graph colors (shouldn't happen now), keep original behavior - displayValue = color.second; - } - - colorItem->setValue(displayValue); - - // Check if this is the selected color - bool isSelected = false; - if (isBackgroundColor || isTextBasedColor) { - // For background and text colors, compare without alpha - isSelected = (extractColorWithoutAlpha(color.second) == currentColorWithoutAlpha); - } else { - // For any remaining FPS Graph colors (shouldn't happen now) - isSelected = (color.second == currentValue); - } - - if (isSelected) { - colorItem->setValue(displayValue + " " + ult::CHECKMARK_SYMBOL); - lastSelectedListItem = colorItem; - _jumpItemValue = displayValue + " " + ult::CHECKMARK_SYMBOL; - } - - colorItem->setClickListener([this, colorItem, color, section, displayValue](uint64_t keys) { - if (keys & KEY_A) { - std::string valueToSave = color.second; - - if (isBackgroundColor) { - // For background colors, preserve existing alpha - std::string existingColor = ult::parseValueFromIniSection(configIniPath, section, colorKey); - if (!existingColor.empty() && existingColor.length() == 5) { - char existingAlpha = existingColor[4]; - valueToSave = setAlphaInColor(color.second, existingAlpha); - } - } else if (isTextBasedColor) { - // For text-based colors, ensure alpha is always F - valueToSave = setAlphaInColor(color.second, 'F'); - } - // For any remaining FPS Graph colors (shouldn't happen now), use as-is - - ult::setIniFileValue(configIniPath, section, colorKey, valueToSave); - - // Update the UI - clear old checkmark and set new one - if (lastSelectedListItem && lastSelectedListItem != colorItem) { - // Get the display value for the old selected item - std::string oldDisplayValue; - for (const auto& c : colors) { - if (lastSelectedListItem->getText() == c.first) { - if (isTextBasedColor || isBackgroundColor) { - oldDisplayValue = extractColorWithoutAlpha(c.second); - } else { - oldDisplayValue = c.second; - } - break; - } - } - lastSelectedListItem->setValue(oldDisplayValue); - } - - // Set new checkmark - colorItem->setValue(displayValue + " " + ult::CHECKMARK_SYMBOL); - lastSelectedListItem = colorItem; - return true; - } - return false; - }); - list->addItem(colorItem); - } - list->jumpToItem("", _jumpItemValue, false); - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Colors"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - jumpItemName = modeTitle; - jumpItemValue = ""; - jumpItemExactMatch = false; - - tsl::swapTo(SwapDepth(2), modeName); - return true; - } - return false; - } -}; - -// Color Configuration -class ColorConfig : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - bool isFullMode; - bool isGameResolutionsMode; - bool isFPSCounterMode; - bool isFPSGraphMode; - -public: - ColorConfig(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFullMode = (mode == "Full"); - isGameResolutionsMode = (mode == "Game Resolutions"); - isFPSCounterMode = (mode == "FPS Counter"); - isFPSGraphMode = (mode == "FPS Graph"); - - // Full mode should never access color configuration - //if (isFullMode) { - // // This should not happen, but if it does, go back - // tsl::goBack(); - //} - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Colors")); - - auto getCurrentColor = [this](const std::string& key, const std::string& def) { - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - std::string value = ult::parseValueFromIniSection(configIniPath, section, key); - return value.empty() ? def : value; - }; - - auto getColorName = [](const std::string& hexColor) -> std::string { - // Extract RGB without alpha for comparison - std::string rgb = hexColor; - if (hexColor.length() == 5 && hexColor[0] == '#') { - rgb = hexColor.substr(0, 4); - } - - // Map of hex colors to names (RGB only, no alpha) - static const std::map colorNames = { - // Grays & Basics - {"#000", "Black"}, - {"#333", "Dark Gray"}, - {"#444", "Gray"}, - {"#888", "Light Gray"}, - {"#CCC", "Silver"}, - {"#FFF", "White"}, - - // Reds - {"#800", "Dark Red"}, - {"#F00", "Red"}, - {"#F88", "Light Red"}, - {"#F8A", "Pink"}, - - // Greens - {"#080", "Dark Green"}, - {"#0F0", "Green"}, - {"#0C0", "Lime Green"}, - {"#8F8", "Light Green"}, - - // Blues - {"#003", "Dark Blue"}, - {"#00F", "Blue"}, - {"#2DF", "Light Blue"}, - {"#8CF", "Sky Blue"}, - - // Purples - {"#808", "Dark Purple"}, - {"#80F", "Purple"}, - {"#C8F", "Light Purple"}, - {"#A0F", "Violet"}, - - // Yellows & Oranges - {"#F80", "Orange"}, - {"#FF0", "Yellow"}, - {"#FFC", "Light Yellow"}, - - // Cyans & Teals - {"#088", "Teal"}, - {"#0FF", "Cyan"}, - {"#8FF", "Light Cyan"}, - - // Magentas & Pinks - {"#F0F", "Magenta"}, - {"#F8C", "Hot Pink"}, - - // Browns - {"#840", "Brown"}, - {"#A86", "Light Brown"} - }; - - auto it = colorNames.find(rgb); - if (it != colorNames.end()) { - // Special case for black/transparent disambiguation - if (rgb == "#000" && hexColor.length() == 5) { - char alpha = hexColor[4]; - if (alpha == '0') return "Transparent"; - else return "Black"; - } - return it->second; - } - return rgb; // Return hex if no name found - }; - - auto getAlphaPercentage = [](const std::string& color) -> std::string { - if (color.length() == 5 && color[0] == '#') { - char alpha = color[4]; - switch(alpha) { - case '0': return "0%"; - case '1': return "10%"; - case '3': return "20%"; - case '4': return "30%"; - case '6': return "40%"; - case '8': return "50%"; - case '9': return "60%"; - case 'B': case 'b': return "70%"; - case 'C': case 'c': return "80%"; - case 'E': case 'e': return "90%"; - case 'F': case 'f': return "100%"; - default: return "60%"; - } - } - return "60%"; - }; - - if (!isFullMode) { - // Background Color (all modes) - auto* bgColor = new tsl::elm::ListItem("Background Color"); - std::string bgDefault = "#0009"; - std::string bgCurrentColor = getCurrentColor("background_color", bgDefault); - // Display color name instead of hex - bgColor->setValue(getColorName(bgCurrentColor)); - bgColor->setClickListener([this, bgDefault](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Background Color", "background_color", bgDefault); - return true; - } - return false; - }); - list->addItem(bgColor); - - // Background Alpha (new) - auto* bgAlpha = new tsl::elm::ListItem("Background Alpha"); - bgAlpha->setValue(getAlphaPercentage(bgCurrentColor)); - bgAlpha->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "background_color", "Background Alpha"); - return true; - } - return false; - }); - list->addItem(bgAlpha); - - if (isMiniMode || isFPSCounterMode || isFPSGraphMode || isGameResolutionsMode) { - // Mini mode: has focus background - auto* focusBgColor = new tsl::elm::ListItem("Focus Color"); - std::string focusCurrentColor = getCurrentColor("focus_background_color", "#000F"); - focusBgColor->setValue(getColorName(focusCurrentColor)); - focusBgColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Focus Color", "focus_background_color", "#000F"); - return true; - } - return false; - }); - list->addItem(focusBgColor); - - // Focus Alpha (new) - auto* focusAlpha = new tsl::elm::ListItem("Focus Alpha"); - focusAlpha->setValue(getAlphaPercentage(focusCurrentColor)); - focusAlpha->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "focus_background_color", "Focus Alpha"); - return true; - } - return false; - }); - list->addItem(focusAlpha); - } - } - - // Text Color (all modes) - auto* textColor = new tsl::elm::ListItem("Text Color"); - std::string textCurrentColor = getCurrentColor("text_color", "#FFFF"); - // Display color name for text colors - textColor->setValue(getColorName(textCurrentColor)); - textColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Text Color", "text_color", "#FFFF"); - return true; - } - return false; - }); - list->addItem(textColor); - - if (isFPSGraphMode) { - // FPS Graph specific colors - struct ColorSetting { - std::string name; - std::string key; - std::string defaultVal; - bool isBackgroundType; // true for colors that allow alpha adjustment - }; - - // Game Resolutions: only category color (no separator) - auto* catColor = new tsl::elm::ListItem("Category Color"); - catColor->setValue(getColorName(getCurrentColor("cat_color", "#0F0F"))); - catColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Category Color", "cat_color", "#0F0F"); - return true; - } - return false; - }); - list->addItem(catColor); - - static const std::vector fpsGraphColors = { - {"FPS Counter", "fps_counter_color", "#888C", true}, // background type - {"Border", "border_color", "#2DFF", false}, // text type - {"Dashed Line", "dashed_line_color", "#8888", true}, // background type - {"Max FPS Text", "max_fps_text_color", "#FFFF", false}, // text type - {"Min FPS Text", "min_fps_text_color", "#FFFF", false}, // text type - {"Main Line", "main_line_color", "#FFFF", false}, // text type - {"Rounded Line", "rounded_line_color", "#F0FF", false}, // text type - {"Perfect Line", "perfect_line_color", "#0C0F", false} // text type - }; - - for (const auto& color : fpsGraphColors) { - auto* colorItem = new tsl::elm::ListItem(color.name + " Color"); - const std::string currentVal = getCurrentColor(color.key, color.defaultVal); - - if (color.isBackgroundType) { - // For background-type colors, show color name - colorItem->setValue(getColorName(currentVal)); - } else { - // For text-type colors, show color name - colorItem->setValue(getColorName(currentVal)); - } - - colorItem->setClickListener([this, color](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, color.name, color.key, color.defaultVal); - return true; - } - return false; - }); - list->addItem(colorItem); - - // Add alpha selector for background-type colors - if (color.isBackgroundType) { - auto* alphaItem = new tsl::elm::ListItem(color.name + " Alpha"); - alphaItem->setValue(getAlphaPercentage(currentVal)); - alphaItem->setClickListener([this, color](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, color.key, color.name + " Alpha"); - return true; - } - return false; - }); - list->addItem(alphaItem); - } - } - - } else if (isFullMode) { - auto* catColor1 = new tsl::elm::ListItem("Category Color 1"); - // Display color name for category colors - catColor1->setValue(getColorName(getCurrentColor("cat_color_1", "#8FFF"))); - catColor1->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Category Color 1", "cat_color_1", "#8FFF"); - return true; - } - return false; - }); - list->addItem(catColor1); - - auto* catColor2 = new tsl::elm::ListItem("Category Color 2"); - // Display color name for category colors - catColor2->setValue(getColorName(getCurrentColor("cat_color_2", "#2DFF"))); - catColor2->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Category Color 2", "cat_color_2", "#2DFF"); - return true; - } - return false; - }); - list->addItem(catColor2); - - auto* sepColor = new tsl::elm::ListItem("Separator Color"); - // Display color name for separator colors - sepColor->setValue(getColorName(getCurrentColor("separator_color", "#888F"))); - sepColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Separator Color", "separator_color", "#888F"); - return true; - } - return false; - }); - list->addItem(sepColor); - } else if (isMiniMode) { - auto* catColor = new tsl::elm::ListItem("Category Color"); - // Display color name for category colors - catColor->setValue(getColorName(getCurrentColor("cat_color", "#2DFF"))); - catColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Category Color", "cat_color", "#2DFF"); - return true; - } - return false; - }); - list->addItem(catColor); - - auto* sepColor = new tsl::elm::ListItem("Separator Color"); - // Display color name for separator colors - sepColor->setValue(getColorName(getCurrentColor("separator_color", "#888F"))); - sepColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Separator Color", "separator_color", "#888F"); - return true; - } - return false; - }); - list->addItem(sepColor); - - } else if (isMicroMode) { - auto* catColor = new tsl::elm::ListItem("Category Color"); - catColor->setValue(getColorName(getCurrentColor("cat_color", "#2DFF"))); - catColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Category Color", "cat_color", "#2DFF"); - return true; - } - return false; - }); - list->addItem(catColor); - - // Micro mode: separator and category colors (no focus background like Mini) - auto* sepColor = new tsl::elm::ListItem("Separator Color"); - sepColor->setValue(getColorName(getCurrentColor("separator_color", "#888F"))); - sepColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Separator Color", "separator_color", "#888F"); - return true; - } - return false; - }); - list->addItem(sepColor); - - - } else if (isGameResolutionsMode) { - // Game Resolutions: only category color (no separator) - auto* catColor = new tsl::elm::ListItem("Category Color"); - catColor->setValue(getColorName(getCurrentColor("cat_color", "#2DFF"))); - catColor->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName, "Category Color", "cat_color", "#2DFF"); - return true; - } - return false; - }); - list->addItem(catColor); - } - // FPS Counter mode: only background and text colors (already added above) - // Full mode: NO color settings at all (excluded from this function) - - list->jumpToItem(jumpItemName, jumpItemValue, jumpItemExactMatch); - { - jumpItemName = ""; - jumpItemValue = ""; - jumpItemExactMatch = false; - } - - //list->disableCaching(); - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Configuration"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - tsl::goBack(); - return true; - } - return false; - } -}; - -// Show Configuration (Mini/Micro only) -class ShowConfig : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - std::vector elementOrder; - std::unordered_set enabledElements; - -public: - ShowConfig(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Elements " + ult::DIVIDER_SYMBOL + " \uE0E3 Move Down " + ult::DIVIDER_SYMBOL + " \uE0E2 Move Up")); - - const std::string section = isMiniMode ? "mini" : "micro"; - std::string showValue = ult::parseValueFromIniSection(configIniPath, section, "show"); - std::string orderValue = ult::parseValueFromIniSection(configIniPath, section, "element_order"); - - if (showValue.empty()) { - showValue = isMiniMode ? "DTC+BAT+CPU+GPU+RAM+TMP+FPS+RES" : "FPS+CPU+GPU+RAM+SOC+BAT+DTC"; - } - convertToUpper(showValue); - - enabledElements.clear(); - ult::StringStream ss(showValue); - std::string item; - while (ss.getline(item, '+')) { - if (!item.empty()) { - enabledElements.insert(item); - } - } - - elementOrder.clear(); - if (!orderValue.empty()) { - convertToUpper(orderValue); - ult::StringStream orderSS(orderValue); - std::string orderItem; - while (orderSS.getline(orderItem, '+')) { - if (!orderItem.empty()) { - elementOrder.push_back(orderItem); - } - } - } else { - ult::StringStream ss2(showValue); - while (ss2.getline(item, '+')) { - if (!item.empty()) { - elementOrder.push_back(item); - } - } - } - - static constexpr std::string_view miniElements[] = { - "DTC","BAT","CPU","GPU","RAM","MEM","READ","SOC","TMP","FPS","RES" - }; - - static constexpr std::string_view microElements[] = { - "FPS","CPU","GPU","RAM","READ","SOC","TMP","RES","BAT","DTC" - }; - - // Use span or array reference instead of pointer - const auto* allElements = isMiniMode ? miniElements : microElements; - const size_t allElementsSize = isMiniMode ? std::size(miniElements) : std::size(microElements); - - elementOrder.clear(); - if (!orderValue.empty()) { - convertToUpper(orderValue); - ult::StringStream orderSS(orderValue); - std::string orderItem; - while (orderSS.getline(orderItem, '+')) { - if (!orderItem.empty()) { - elementOrder.push_back(orderItem); - } - } - } else { - // Initialize with allElements order instead - for (size_t i = 0; i < allElementsSize; i++) { - auto elem = allElements[i]; - if (!isMiniMode && elem == "MEM") - continue; - elementOrder.emplace_back(elem); - } - } - - for (size_t i = 0; i < elementOrder.size(); i++) { - const std::string& element = elementOrder[i]; - const bool isEnabled = enabledElements.find(element) != enabledElements.end(); - - auto* elementItem = new tsl::elm::ListItem(element); - elementItem->setValue(isEnabled ? ult::ON : ult::OFF, !isEnabled); - - elementItem->setClickListener([this, elementItem, element](uint64_t keys) { - static bool hasNotTriggeredAnimation = false; - - if (hasNotTriggeredAnimation) { - elementItem->triggerClickAnimation(); - hasNotTriggeredAnimation = false; - } - - if (keys & KEY_A) { - const bool currentlyEnabled = enabledElements.find(element) != enabledElements.end(); - - if (currentlyEnabled) { - enabledElements.erase(element); - } else { - enabledElements.insert(element); - } - - updateShowAndOrder(); - jumpItemName = element; - jumpItemValue = ""; - jumpItemExactMatch = true; - hasNotTriggeredAnimation = true; - - tsl::swapTo(SwapDepth(1), modeName); - return true; - } - else if (keys & KEY_Y || keys & KEY_X) { - size_t currentPos = 0; - for (size_t j = 0; j < elementOrder.size(); j++) { - if (elementOrder[j] == element) { - currentPos = j; - break; - } - } - - if (keys & KEY_X) { - if (currentPos > 0) { - std::swap(elementOrder[currentPos], elementOrder[currentPos - 1]); - } else { - const std::string temp = elementOrder[0]; - for (size_t j = 0; j < elementOrder.size() - 1; j++) { - elementOrder[j] = elementOrder[j + 1]; - } - elementOrder[elementOrder.size() - 1] = temp; - } - triggerRumbleClick.store(true, std::memory_order_release); - triggerMoveSound.store(true, std::memory_order_release); - } else if (keys & KEY_Y) { - if (currentPos < elementOrder.size() - 1) { - std::swap(elementOrder[currentPos], elementOrder[currentPos + 1]); - } else { - const std::string temp = elementOrder[elementOrder.size() - 1]; - for (size_t j = elementOrder.size() - 1; j > 0; j--) { - elementOrder[j] = elementOrder[j - 1]; - } - elementOrder[0] = temp; - } - triggerRumbleClick.store(true, std::memory_order_release); - triggerMoveSound.store(true, std::memory_order_release); - } - - updateShowAndOrder(); - jumpItemName = element; - jumpItemValue = ""; - jumpItemExactMatch = true; - - tsl::swapTo(SwapDepth(1), modeName); - return true; - } - return false; - }); - - list->addItem(elementItem); - } - - list->jumpToItem(jumpItemName, jumpItemValue, jumpItemExactMatch); - { - jumpItemName = ""; - jumpItemValue = ""; - jumpItemExactMatch = false; - } - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", "Configuration"); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - tsl::goBack(); - return true; - } - return false; - } - -private: - void updateShowAndOrder() { - std::string newShowValue; - std::string newOrderValue; - bool showFirst = true; - bool orderFirst = true; - - for (const std::string& element : elementOrder) { - if (!orderFirst) { - newOrderValue += "+"; - } - newOrderValue += element; - orderFirst = false; - - if (enabledElements.find(element) != enabledElements.end()) { - if (!showFirst) { - newShowValue += "+"; - } - newShowValue += element; - showFirst = false; - } - } - - const std::string section = isMiniMode ? "mini" : "micro"; - ult::setIniFileValue(configIniPath, section, "show", newShowValue); - ult::setIniFileValue(configIniPath, section, "element_order", newOrderValue); - } -}; - -// Main Configurator -class ConfiguratorOverlay : public tsl::Gui { -private: - std::string modeName; - bool isMiniMode; - bool isMicroMode; - bool isFullMode; - bool isGameResolutionsMode; - bool isFPSCounterMode; - bool isFPSGraphMode; - -public: - ConfiguratorOverlay(const std::string& mode) : modeName(mode) { - isMiniMode = (mode == "Mini"); - isMicroMode = (mode == "Micro"); - isFullMode = (mode == "Full"); - isGameResolutionsMode = (mode == "Game Resolutions"); - isFPSCounterMode = (mode == "FPS Counter"); - isFPSGraphMode = (mode == "FPS Graph"); - } - - virtual tsl::elm::Element* createUI() override { - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CategoryHeader("Configuration")); - - // 5. Elements (Mini/Micro only) - if (isMiniMode || isMicroMode) { - auto* showSettings = new tsl::elm::ListItem("Elements"); - showSettings->setValue(ult::DROPDOWN_SYMBOL); - showSettings->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(showSettings); - } - - // 3. Toggles (All modes) - //if (isMiniMode || isMicroMode || isFullMode || isFPSGraphMode) { - auto* toggles = new tsl::elm::ListItem("Toggles"); - toggles->setValue(ult::DROPDOWN_SYMBOL); - toggles->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(toggles); - //} - - // 2. Colors (not Full mode - it has no color settings) - //if (!isFullMode) { - auto* colors = new tsl::elm::ListItem("Colors"); - colors->setValue(ult::DROPDOWN_SYMBOL); - colors->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(colors); - //} - - - // 4. Font Sizes (Mini/Micro/FPS Counter only) - if (isMiniMode || isMicroMode || isFPSCounterMode) { - auto* fontSizes = new tsl::elm::ListItem("Font Sizes"); - fontSizes->setValue(ult::DROPDOWN_SYMBOL); - fontSizes->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(fontSizes); - } - - // 1. Refresh Rate (all modes) - auto* refreshRate = new tsl::elm::ListItem("Refresh Rate"); - refreshRate->setValue(std::to_string(getCurrentRefreshRate()) + " Hz"); - refreshRate->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(refreshRate); - - // 6. DTC Format (Mini/Micro only) - NEW ADDITION - if (isMiniMode || isMicroMode) { - auto* dtcFormat = new tsl::elm::ListItem("DTC Format"); - dtcFormat->setValue(getCurrentDTCFormat()); - dtcFormat->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(dtcFormat); - } - - // 7. Frame Padding (Mini only) - NEW ADDITION - if (isMiniMode || isGameResolutionsMode || isFPSCounterMode || isFPSGraphMode) { - auto* framePadding = new tsl::elm::ListItem("Frame Padding"); - framePadding->setValue(std::to_string(getCurrentFramePadding()) + " px"); - framePadding->setClickListener([this](uint64_t keys) { - if (keys & KEY_A) { - tsl::changeTo(modeName); - return true; - } - return false; - }); - list->addItem(framePadding); - } - - // 7. Mode-specific positioning settings - if (isMicroMode) { - // Text Alignment for Micro - auto* textAlign = new tsl::elm::ListItem("Text Alignment"); - textAlign->setValue(getCurrentTextAlign()); - textAlign->setClickListener([this, textAlign](uint64_t keys) { - if (keys & KEY_A) { - const std::string next = cycleTextAlign(); - textAlign->setValue(next); - return true; - } - return false; - }); - list->addItem(textAlign); - - // Vertical Position for Micro (Top/Bottom only) - auto* layerPos = new tsl::elm::ListItem("Vertical Position"); - layerPos->setValue(getCurrentLayerPosBottom()); - layerPos->setClickListener([this, layerPos](uint64_t keys) { - if (keys & KEY_A) { - const std::string next = cycleLayerPosBottom(); - layerPos->setValue(next); - return true; - } - return false; - }); - list->addItem(layerPos); - - } else if (isFullMode) { - // Horizontal Position for Full (Left/Right only) - auto* layerPos = new tsl::elm::ListItem("Horizontal Position"); - layerPos->setValue(getCurrentLayerPosRight()); - layerPos->setClickListener([this, layerPos](uint64_t keys) { - if (keys & KEY_A) { - const std::string next = cycleLayerPosRight(); - layerPos->setValue(next); - return true; - } - return false; - }); - list->addItem(layerPos); - - //} else if (isGameResolutionsMode || isFPSCounterMode || isFPSGraphMode) { - // // Both horizontal and vertical positioning - // auto* layerPosH = new tsl::elm::ListItem("Horizontal Position"); - // layerPosH->setValue(getCurrentLayerPosRight()); - // layerPosH->setClickListener([this, layerPosH](uint64_t keys) { - // if (keys & KEY_A) { - // const std::string next = cycleLayerPosRight(); - // layerPosH->setValue(next); - // return true; - // } - // return false; - // }); - // list->addItem(layerPosH); - // - // auto* layerPosV = new tsl::elm::ListItem("Vertical Position"); - // layerPosV->setValue(getCurrentLayerPosBottom()); - // layerPosV->setClickListener([this, layerPosV](uint64_t keys) { - // if (keys & KEY_A) { - // const std::string next = cycleLayerPosBottom(); - // layerPosV->setValue(next); - // return true; - // } - // return false; - // }); - // list->addItem(layerPosV); - } - - list->jumpToItem(jumpItemName, jumpItemValue, jumpItemExactMatch.load(std::memory_order_acquire)); - { - jumpItemName = ""; - jumpItemValue = ""; - jumpItemExactMatch = false; - } - - tsl::elm::OverlayFrame* rootFrame = new tsl::elm::OverlayFrame("Horizon OC Monitor", modeName); - rootFrame->setContent(list); - return rootFrame; - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysDown & KEY_B) { - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - lastSelectedItem = modeName; - tsl::swapTo(); - return true; - } - return false; - } - -private: - int getCurrentRefreshRate() { - std::string section; - if (isMiniMode) section = "mini"; - else if (isMicroMode) section = "micro"; - else if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - std::string value = ult::parseValueFromIniSection(configIniPath, section, "refresh_rate"); - int defaultRate = (isGameResolutionsMode) ? 10 : ((isFPSCounterMode || isFPSGraphMode) ? 30 : 1); - return value.empty() ? defaultRate : atoi(value.c_str()); - } - - // NEW METHOD: Get current DTC format for display - std::string getCurrentDTCFormat() { - if (isMiniMode || isMicroMode) { - const std::string section = isMiniMode ? "mini" : "micro"; - std::string value = ult::parseValueFromIniSection(configIniPath, section, "dtc_format"); - - // Handle defaults properly - if (value.empty()) { - value = isMiniMode ? "%m-%d-%Y"+ult::DIVIDER_SYMBOL+"%H:%M:%S" : "%H:%M:%S"; - } - - // Convert format string to display name - return getDTCFormatName(value); - } - return ""; - } - - // Helper function to convert format string to display name - std::string getDTCFormatName(const std::string& formatStr) { - - for (const auto& format : dtcFormats) { - if (format.second == formatStr) { - return format.first; - } - } - - // Return the format string itself if no match found - return formatStr; - } - - int getCurrentFramePadding() { - if (isMiniMode) { - std::string value = ult::parseValueFromIniSection(configIniPath, "mini", "frame_padding"); - return value.empty() ? 10 : atoi(value.c_str()); - } - return 10; - } - - std::string getCurrentTextAlign() { - if (isMicroMode) { - std::string value = ult::parseValueFromIniSection(configIniPath, "micro", "text_align"); - convertToUpper(value); - if (value == "LEFT") return "Left"; - if (value == "RIGHT") return "Right"; - return "Center"; - } - return ""; - } - - std::string getCurrentLayerPosRight() { - std::string section; - if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - std::string value = ult::parseValueFromIniSection(configIniPath, section, "layer_width_align"); - convertToUpper(value); - - if (isFullMode) { - // Full mode: only Left and Right allowed - if (value == "RIGHT") return "Right"; - return "Left"; - } else { - // Other modes: allow Center - if (value == "RIGHT") return "Right"; - if (value == "CENTER") return "Center"; - return "Left"; - } - } - - std::string getCurrentLayerPosBottom() { - std::string section; - if (isMicroMode) section = "micro"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - std::string value = ult::parseValueFromIniSection(configIniPath, section, "layer_height_align"); - convertToUpper(value); - - if (isMicroMode) { - // Micro mode: only Top and Bottom allowed - if (value == "BOTTOM") return "Bottom"; - return "Top"; - } else { - // Other modes: allow Center - if (value == "BOTTOM") return "Bottom"; - if (value == "CENTER") return "Center"; - return "Top"; - } - } - - std::string cycleTextAlign() { - if (isMicroMode) { - const std::string current = getCurrentTextAlign(); - std::string next; - if (current == "Left") next = "Center"; - else if (current == "Center") next = "Right"; - else if (current == "Right") next = "Left"; - else next = "Center"; - - ult::setIniFileValue(configIniPath, "micro", "text_align", next); - return next; - } - return ""; - } - - std::string cycleLayerPosRight() { - std::string section; - if (isFullMode) section = "full"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - const std::string current = getCurrentLayerPosRight(); - std::string next; - - if (isFullMode) { - // Full mode: only Left and Right - if (current == "Left") next = "Right"; - else next = "Left"; - } else { - // Other modes: Left -> Center -> Right -> Left - if (current == "Left") next = "Center"; - else if (current == "Center") next = "Right"; - else next = "Left"; - } - - const std::string value = (next == "Right") ? "right" : (next == "Center" ? "center" : "left"); - ult::setIniFileValue(configIniPath, section, "layer_width_align", value); - return next; - } - - std::string cycleLayerPosBottom() { - std::string section; - if (isMicroMode) section = "micro"; - else if (isGameResolutionsMode) section = "game_resolutions"; - else if (isFPSCounterMode) section = "fps-counter"; - else if (isFPSGraphMode) section = "fps-graph"; - - const std::string current = getCurrentLayerPosBottom(); - std::string next; - - if (isMicroMode) { - // Micro mode: only Top and Bottom - if (current == "Top") next = "Bottom"; - else next = "Top"; - } else { - // Other modes: Top -> Center -> Bottom -> Top - if (current == "Top") next = "Center"; - else if (current == "Center") next = "Bottom"; - else next = "Top"; - } - - const std::string value = (next == "Bottom") ? "bottom" : (next == "Center" ? "center" : "top"); - ult::setIniFileValue(configIniPath, section, "layer_height_align", value); - return next; - } -}; diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Counter.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Counter.hpp deleted file mode 100644 index 56ee9ba6..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Counter.hpp +++ /dev/null @@ -1,525 +0,0 @@ -class MainMenu; - -class com_FPS : public tsl::Gui { -private: - char FPSavg_c[8]; - FpsCounterSettings settings; - size_t fontsize = 0; - ApmPerformanceMode performanceMode = ApmPerformanceMode_Invalid; - bool skipOnce = true; - bool runOnce = true; - - // Repositioning variables - int frameOffsetX = 0; - int frameOffsetY = 0; - bool isDragging = false; - size_t framePadding = 10; - static constexpr int screenWidth = 1280; - static constexpr int screenHeight = 720; - static constexpr int border = 8; - - bool originalUseRightAlignment = ult::useRightAlignment; - - struct ButtonState { - std::atomic minusDragActive{false}; - std::atomic plusDragActive{false}; - } buttonState; - - Thread touchPollThread; - std::atomic touchPollRunning{false}; - - // Store actual rendered dimensions - size_t actualTextWidth = 0; - size_t actualTotalWidth = 0; - size_t actualTotalHeight = 0; - -public: - com_FPS() { - tsl::hlp::requestForeground(false); - disableJumpTo = true; - GetConfigSettings(&settings); - apmGetPerformanceMode(&performanceMode); - if (performanceMode == ApmPerformanceMode_Normal) { - fontsize = settings.handheldFontSize; - } - else if (performanceMode == ApmPerformanceMode_Boost) { - fontsize = settings.dockedFontSize; - } - - // Load saved frame offsets - frameOffsetX = settings.frameOffsetX; - frameOffsetY = settings.frameOffsetY; - framePadding = settings.framePadding; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - - FullMode = false; - TeslaFPS = settings.refreshRate; - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().removeScreenshotStacks(); - } - deactivateOriginalFooter = true; - StartFPSCounterThread(); - - // Start touch polling thread for instant response at low FPS - touchPollRunning.store(true, std::memory_order_release); - threadCreate(&touchPollThread, [](void* arg) -> void { - com_FPS* overlay = static_cast(arg); - - // Allow only Player 1 and handheld mode - const HidNpadIdType id_list[2] = { HidNpadIdType_No1, HidNpadIdType_Handheld }; - - // Configure HID system to only listen to these IDs - hidSetSupportedNpadIdType(id_list, 2); - - // Configure input for up to 2 supported controllers (P1 + Handheld) - padConfigureInput(2, HidNpadStyleSet_NpadStandard | HidNpadStyleTag_NpadSystemExt); - - // Initialize separate pad states for both controllers - PadState pad_p1; - PadState pad_handheld; - padInitialize(&pad_p1, HidNpadIdType_No1); - padInitialize(&pad_handheld, HidNpadIdType_Handheld); - - u64 minusHoldStart = 0; - u64 plusHoldStart = 0; - static constexpr u64 HOLD_THRESHOLD_NS = 500'000'000ULL; - - HidTouchScreenState state = {0}; - bool inputDetected; - - while (overlay->touchPollRunning.load(std::memory_order_acquire)) { - // Only poll when rendering and not dragging - { - inputDetected = false; - - // Check touch in bounds - if (hidGetTouchScreenStates(&state, 1) && state.count > 0) { - const int touchX = state.touches[0].x; - const int touchY = state.touches[0].y; - - // Use actual dimensions, fallback to estimate if not yet rendered - size_t totalWidth = overlay->actualTotalWidth; - size_t totalHeight = overlay->actualTotalHeight; - - if (totalWidth == 0) { - // Fallback calculation - size_t approxFontSize = overlay->fontsize; - if (approxFontSize == 0) approxFontSize = 50; - const size_t textWidth = approxFontSize * 4; - const size_t margin = (approxFontSize / 8); - const size_t innerWidth = textWidth + margin; - const size_t innerHeight = approxFontSize; - totalWidth = innerWidth + (2 * border); - totalHeight = innerHeight + (2 * border); - } - - // Apply frame offsets - const int overlayX = overlay->frameOffsetX; - const int overlayY = overlay->frameOffsetY; - - // Touch padding - const int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = totalWidth + (touchPadding * 2); - const int touchableHeight = totalHeight + (touchPadding * 2); - - // Check if touch is within bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - inputDetected = true; - } - } - - // Poll buttons from both controllers - padUpdate(&pad_p1); - padUpdate(&pad_handheld); - - // Combine input from both controllers - const u64 keysHeld = padGetButtons(&pad_p1) | padGetButtons(&pad_handheld); - const u64 now = armTicksToNs(armGetSystemTick()); - - // Track MINUS hold duration - if ((keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK)) { - if (minusHoldStart == 0) { - minusHoldStart = now; - } - if (now - minusHoldStart >= HOLD_THRESHOLD_NS) { - inputDetected = true; - overlay->buttonState.minusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - // Track PLUS hold duration - else if ((keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK)) { - if (plusHoldStart == 0) { - plusHoldStart = now; - } - if (now - plusHoldStart >= HOLD_THRESHOLD_NS) { - inputDetected = true; - overlay->buttonState.plusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - else { - minusHoldStart = plusHoldStart = 0; - overlay->buttonState.minusDragActive.exchange(false, std::memory_order_acq_rel); - overlay->buttonState.plusDragActive.exchange(false, std::memory_order_acq_rel); - } - - // Disable rendering on any input, re-enable when no input - static bool resetOnce = true; - if (inputDetected) { - if (resetOnce && isRendering) { - isRendering = false; - leventSignal(&renderingStopEvent); - resetOnce = false; - } - } else { - resetOnce = true; - } - } - - if (ult::limitedMemory) { - static auto lastUnderscanPixels = std::make_pair(0, 0); - - if (lastUnderscanPixels != tsl::impl::currentUnderscanPixels) { - for (int i = 0; i < 2; i++) { - tsl::gfx::Renderer::get().updateLayerSize(); - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(overlay->frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - lastUnderscanPixels = tsl::impl::currentUnderscanPixels; - } - - svcSleepThread(16000000ULL*2); // 16ms polling - } - }, this, NULL, 0x1000, 0x2B, -2); - threadStart(&touchPollThread); - } - - ~com_FPS() { - // Stop touch polling thread - touchPollRunning.store(false, std::memory_order_release); - threadWaitForExit(&touchPollThread); - threadClose(&touchPollThread); - - TeslaFPS = 60; - EndFPSCounterThread(); - FullMode = true; - fixForeground = true; - ult::useRightAlignment = originalUseRightAlignment; - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().addScreenshotStacks(); - } - deactivateOriginalFooter = false; - } - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - // Calculate text dimensions - const auto [textWidth, textHeight] = renderer->getTextDimensions( - (FPSavg != 254.0) ? FPSavg_c : "--", false, fontsize - ); - - const size_t margin = (fontsize / 8); - - // Inner rectangle dimensions (content area) - const size_t innerWidth = textWidth + margin; - const size_t innerHeight = textHeight; - - // Total dimensions including border - const size_t totalWidth = innerWidth + (2 * border); - const size_t totalHeight = innerHeight + (2 * border); - - // Store actual dimensions for input handling - actualTextWidth = textWidth; - actualTotalWidth = totalWidth; - actualTotalHeight = totalHeight; - - // Calculate position with frame offsets - //int posX = frameOffsetX; - //int posY = frameOffsetY; - - int _frameOffsetX = ult::limitedMemory ? std::max(0, frameOffsetX - (1280-448)) : frameOffsetX; - - // Clamp to screen bounds (accounting for total size including border) - const int posX = std::max(int(framePadding), std::min(_frameOffsetX, static_cast(screenWidth - totalWidth - framePadding))); - const int posY = std::max(int(framePadding), std::min(frameOffsetY, static_cast(screenHeight - totalHeight - framePadding))); - - // Draw the rounded rectangle (background) - const tsl::Color bgColor = !isDragging - ? settings.backgroundColor - : settings.focusBackgroundColor; - - renderer->drawRoundedRectSingleThreaded( - posX, - posY, - totalWidth, - totalHeight, - 16, - aWithOpacity(bgColor) - ); - - // Calculate centered text position within the bordered area - const int textX = posX + border + (margin / 2); - const int textY = posY + border + (fontsize - margin); - - // Draw the text - renderer->drawString( - (FPSavg != 254.0) ? FPSavg_c : "--", - false, - textX, - textY, - fontsize, - settings.textColor - ); - }); - - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("", ""); - rootFrame->setContent(Status); - - return rootFrame; - } - - virtual void update() override { - apmGetPerformanceMode(&performanceMode); - if (performanceMode == ApmPerformanceMode_Normal) { - fontsize = settings.handheldFontSize; - } - else if (performanceMode == ApmPerformanceMode_Boost) { - fontsize = settings.dockedFontSize; - } - if (settings.useIntegerCounter) { - snprintf(FPSavg_c, sizeof FPSavg_c, "%d", (int)round(useOldFPSavg ? FPSavg_old : FPSavg)); - } else { - snprintf(FPSavg_c, sizeof FPSavg_c, "%2.1f", useOldFPSavg ? FPSavg_old : FPSavg); - } - - if (!skipOnce) { - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - // Static variables to maintain drag state between function calls - static bool oldTouchDetected = false; - static bool oldMinusHeld = false; - static bool oldPlusHeld = false; - static HidTouchState initialTouchPos = {0}; - static int initialFrameOffsetX = 0; - static int initialFrameOffsetY = 0; - static constexpr int TOUCH_THRESHOLD = 8; - static bool hasMoved = false; - - // Touch detection - const bool currentTouchDetected = (touchPos.x > 0 && touchPos.y > 0 && - touchPos.x < screenWidth && touchPos.y < screenHeight); - - static bool clearOnRelease = false; - - if (clearOnRelease && !isRendering) { - clearOnRelease = false; - isRendering = true; - leventClear(&renderingStopEvent); - } - - // Use actual dimensions from last render, fallback to estimate if not available - size_t totalWidth = actualTotalWidth; - size_t totalHeight = actualTotalHeight; - - if (totalWidth == 0) { - // Fallback calculation if not yet rendered - const size_t textWidth = fontsize * 4; - const size_t margin = (fontsize / 8); - const size_t innerWidth = textWidth + margin; - const size_t innerHeight = fontsize + (margin / 2); - totalWidth = innerWidth + (2 * border); - totalHeight = innerHeight + (2 * border); - } - - // Current overlay position - const int overlayX = frameOffsetX; - const int overlayY = frameOffsetY; - - // Touch detection area (with padding for easier interaction) - static constexpr int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = totalWidth + (touchPadding * 2); - const int touchableHeight = totalHeight + (touchPadding * 2); - - // Screen boundaries for clamping (accounting for total size) - const int minX = framePadding; - const int maxX = screenWidth - totalWidth - framePadding; - const int minY = framePadding; - const int maxY = screenHeight - totalHeight - framePadding; - - const bool minusDragReady = buttonState.minusDragActive.load(std::memory_order_acquire); - const bool plusDragReady = buttonState.plusDragActive.load(std::memory_order_acquire); - - // Check button states - const bool currentMinusHeld = (keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK) && minusDragReady; - const bool currentPlusHeld = (keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK) && plusDragReady; - - // Handle touch dragging - if (currentTouchDetected && !isDragging) { - const int touchX = touchPos.x; - const int touchY = touchPos.y; - - if (!oldTouchDetected) { - // Touch just started - check if within overlay bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - - // Start touch dragging - isDragging = true; - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - hasMoved = false; - initialTouchPos = touchPos; - initialFrameOffsetX = frameOffsetX; - initialFrameOffsetY = frameOffsetY; - } - } - } else if (currentTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Continue touch dragging - const int touchX = touchPos.x; - const int touchY = touchPos.y; - const int deltaX = touchX - initialTouchPos.x; - const int deltaY = touchY - initialTouchPos.y; - - // Check if we've moved enough to consider this a drag - if (!hasMoved) { - const int totalMovement = abs(deltaX) + abs(deltaY); - if (totalMovement >= TOUCH_THRESHOLD) { - hasMoved = true; - } - } - - if (hasMoved) { - // Update frame offsets with boundary checking - frameOffsetX = std::max(minX, std::min(maxX, initialFrameOffsetX + deltaX)); - frameOffsetY = std::max(minY, std::min(maxY, initialFrameOffsetY + deltaY)); - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - } else if (!currentTouchDetected && oldTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Touch just released - if (hasMoved) { - // Save position when touch drag ends - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["fps-counter"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["fps-counter"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - } - - // Reset touch drag state - isDragging = false; - hasMoved = false; - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Handle joystick dragging (MINUS + right joystick OR PLUS + left joystick) - if ((currentMinusHeld || currentPlusHeld) && !isDragging) { - // Start joystick dragging - isDragging = true; - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - } else if ((currentMinusHeld || currentPlusHeld) && isDragging) { - // Continue joystick dragging - static constexpr int JOYSTICK_DEADZONE = 20; - - // Choose the appropriate joystick based on which button is held - const HidAnalogStickState& activeJoystick = currentMinusHeld ? joyStickPosRight : joyStickPosLeft; - - // Only move if joystick is outside deadzone - if (abs(activeJoystick.x) > JOYSTICK_DEADZONE || abs(activeJoystick.y) > JOYSTICK_DEADZONE) { - // Calculate joystick magnitude - const float magnitude = sqrt((float)(activeJoystick.x * activeJoystick.x + activeJoystick.y * activeJoystick.y)); - const float normalizedMagnitude = magnitude / 32767.0f; - - // Smooth curve for sensitivity - static constexpr float baseSensitivity = 0.00008f; - static constexpr float maxSensitivity = 0.0005f; - - const float curveValue = pow(normalizedMagnitude, 8.0f); - const float currentSensitivity = baseSensitivity + (maxSensitivity - baseSensitivity) * curveValue; - - // Calculate movement delta with fractional accumulation - static float accumulatedX = 0.0f; - static float accumulatedY = 0.0f; - - accumulatedX += (float)activeJoystick.x * currentSensitivity; - accumulatedY += -(float)activeJoystick.y * currentSensitivity; - - const int deltaX = (int)accumulatedX; - const int deltaY = (int)accumulatedY; - accumulatedX -= deltaX; - accumulatedY -= deltaY; - - // Update frame offsets with boundary checking - frameOffsetX = std::max(minX, std::min(maxX, frameOffsetX + deltaX)); - frameOffsetY = std::max(minY, std::min(maxY, frameOffsetY + deltaY)); - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - } else if (((!currentMinusHeld && oldMinusHeld) || (!currentPlusHeld && oldPlusHeld)) && isDragging) { - // Button just released - stop joystick dragging - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["fps-counter"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["fps-counter"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - isDragging = false; - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Update state for next frame - oldTouchDetected = currentTouchDetected; - oldMinusHeld = currentMinusHeld; - oldPlusHeld = currentPlusHeld; - - // Handle existing key input logic (but don't interfere with dragging) - if (!isDragging) { - if (isKeyComboPressed(keysHeld, keysDown)) { - isRendering = false; - leventSignal(&renderingStopEvent); - runOnce = true; - skipOnce = true; - TeslaFPS = 60; - lastSelectedItem = "FPS Counter"; - lastMode = ""; - if (skipMain) { - lastMode = "return"; - tsl::goBack(); - } - else { - tsl::setNextOverlay(filepath.c_str(), "--lastSelectedItem 'FPS Counter'"); - tsl::Overlay::get()->close(); - } - return true; - } - } - - // Return true if we handled the input (during dragging) - return isDragging; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Graph.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Graph.hpp deleted file mode 100644 index aa90a055..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/FPS_Graph.hpp +++ /dev/null @@ -1,757 +0,0 @@ -class MainMenu; - -class com_FPSGraph : public tsl::Gui { -private: - uint8_t refreshRate = 0; - char FPSavg_c[8]; - FpsGraphSettings settings; - uint64_t systemtickfrequency_impl = systemtickfrequency; - uint32_t cnt = 0; - char CPU_Load_c[12] = " -"; - char GPU_Load_c[12] = " -"; - char RAM_Load_c[12] = " -"; - char SOC_TEMP_c[12] = " -"; - char PCB_TEMP_c[12] = " -"; - char SKIN_TEMP_c[12] = " -"; - char CPU_TEMP_c[12] = " -"; - char GPU_TEMP_c[12] = " -"; - char RAM_TEMP_c[12] = " -"; - bool skipOnce = true; - bool runOnce = true; - - // Repositioning variables (matching Mini) - int frameOffsetX = 0; - int frameOffsetY = 0; - bool isDragging = false; - size_t framePadding = 10; - static constexpr int screenWidth = 1280; - static constexpr int screenHeight = 720; - static constexpr int border = 8; - - bool originalUseRightAlignment = ult::useRightAlignment; - - struct ButtonState { - std::atomic minusDragActive{false}; - std::atomic plusDragActive{false}; - } buttonState; - - Thread touchPollThread; - std::atomic touchPollRunning{false}; - - // Store actual rendered dimensions (including border) - size_t actualTotalWidth = 0; - size_t actualTotalHeight = 0; - -public: - bool isStarted = false; - com_FPSGraph() { - tsl::hlp::requestForeground(false); - disableJumpTo = true; - GetConfigSettings(&settings); - - if (R_SUCCEEDED(SaltySD_Connect())) { - if (R_FAILED(SaltySD_GetDisplayRefreshRate(&refreshRate))) - refreshRate = 0; - svcSleepThread(100'000); - SaltySD_Term(); - } - - // Load saved frame offsets - frameOffsetX = settings.frameOffsetX; - frameOffsetY = settings.frameOffsetY; - framePadding = settings.framePadding; - - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - - FullMode = false; - TeslaFPS = settings.refreshRate; - systemtickfrequency_impl /= settings.refreshRate; - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().removeScreenshotStacks(); - } - deactivateOriginalFooter = true; - mutexInit(&mutex_Misc); - StartInfoThread(); - StartFPSCounterThread(); - - // Start touch polling thread for instant response at low FPS - touchPollRunning.store(true, std::memory_order_release); - threadCreate(&touchPollThread, [](void* arg) -> void { - com_FPSGraph* overlay = static_cast(arg); - - // Allow only Player 1 and handheld mode - const HidNpadIdType id_list[2] = { HidNpadIdType_No1, HidNpadIdType_Handheld }; - - // Configure HID system to only listen to these IDs - hidSetSupportedNpadIdType(id_list, 2); - - // Configure input for up to 2 supported controllers (P1 + Handheld) - padConfigureInput(2, HidNpadStyleSet_NpadStandard | HidNpadStyleTag_NpadSystemExt); - - // Initialize separate pad states for both controllers - PadState pad_p1; - PadState pad_handheld; - padInitialize(&pad_p1, HidNpadIdType_No1); - padInitialize(&pad_handheld, HidNpadIdType_Handheld); - - u64 minusHoldStart = 0; - u64 plusHoldStart = 0; - static constexpr u64 HOLD_THRESHOLD_NS = 500'000'000ULL; - - HidTouchScreenState state = {0}; - bool inputDetected; - - while (overlay->touchPollRunning.load(std::memory_order_acquire)) { - // Only poll when rendering and not dragging - { - inputDetected = false; - - // Check touch in bounds - if (hidGetTouchScreenStates(&state, 1) && state.count > 0) { - const int touchX = state.touches[0].x; - const int touchY = state.touches[0].y; - - // Use actual dimensions, fallback to estimate if not yet rendered - size_t totalWidth = overlay->actualTotalWidth; - size_t totalHeight = overlay->actualTotalHeight; - - if (totalWidth == 0) { - // Fallback calculation - const s16 refresh_rate_offset = (overlay->refreshRate < 100) ? 21 : 28; - const s16 info_width = overlay->settings.showInfo ? (6 + overlay->rectangle_width/2 - 4) : 0; - const s16 content_width = overlay->rectangle_width + refresh_rate_offset + info_width; - const s16 content_height = overlay->rectangle_height + 12; - totalWidth = content_width + (2 * border); - totalHeight = content_height + (2 * border); - } - - // Apply frame offsets (base position already includes border offset) - const int overlayX = overlay->base_x + overlay->frameOffsetX - border; - const int overlayY = overlay->base_y + overlay->frameOffsetY - border; - - // Touch padding - const int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = totalWidth + (touchPadding * 2); - const int touchableHeight = totalHeight + (touchPadding * 2); - - // Check if touch is within bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - inputDetected = true; - } - } - - // Poll buttons from both controllers - padUpdate(&pad_p1); - padUpdate(&pad_handheld); - - // Combine input from both controllers - const u64 keysHeld = padGetButtons(&pad_p1) | padGetButtons(&pad_handheld); - const u64 now = armTicksToNs(armGetSystemTick()); - - // Track MINUS hold duration - if ((keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK)) { - if (minusHoldStart == 0) { - minusHoldStart = now; - } - if (now - minusHoldStart >= HOLD_THRESHOLD_NS) { - inputDetected = true; - overlay->buttonState.minusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - // Track PLUS hold duration - else if ((keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK)) { - if (plusHoldStart == 0) { - plusHoldStart = now; - } - if (now - plusHoldStart >= HOLD_THRESHOLD_NS) { - inputDetected = true; - overlay->buttonState.plusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - else { - minusHoldStart = plusHoldStart = 0; - overlay->buttonState.minusDragActive.exchange(false, std::memory_order_acq_rel); - overlay->buttonState.plusDragActive.exchange(false, std::memory_order_acq_rel); - } - - // Disable rendering on any input, re-enable when no input - static bool resetOnce = true; - if (inputDetected) { - if (resetOnce && isRendering) { - isRendering = false; - leventSignal(&renderingStopEvent); - resetOnce = false; - } - } else { - resetOnce = true; - } - } - - if (ult::limitedMemory) { - static auto lastUnderscanPixels = std::make_pair(0, 0); - - if (lastUnderscanPixels != tsl::impl::currentUnderscanPixels) { - for (int i = 0; i < 2; i++) { - tsl::gfx::Renderer::get().updateLayerSize(); - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(overlay->frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - lastUnderscanPixels = tsl::impl::currentUnderscanPixels; - } - - svcSleepThread(16000000ULL*2); // 16ms polling - } - }, this, NULL, 0x1000, 0x2B, -2); - threadStart(&touchPollThread); - } - - ~com_FPSGraph() { - // Stop touch polling thread - touchPollRunning.store(false, std::memory_order_release); - threadWaitForExit(&touchPollThread); - threadClose(&touchPollThread); - - EndInfoThread(); - EndFPSCounterThread(); - FullMode = true; - fixForeground = true; - ult::useRightAlignment = originalUseRightAlignment; - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().addScreenshotStacks(); - } - deactivateOriginalFooter = false; - } - - struct stats { - s16 value; - bool zero_rounded; - }; - - std::vector readings; - - s16 base_y = 0; - s16 base_x = 0; - s16 rectangle_width = 180; - s16 rectangle_height = 60; - s16 rectangle_x = 15; - s16 rectangle_y = 5; - s16 rectangle_range_max = 60; - s16 rectangle_range_min = 0; - char legend_max[4] = "60"; - char legend_min[2] = "0"; - s32 range = std::abs(rectangle_range_max - rectangle_range_min) + 1; - s16 x_end = rectangle_x + rectangle_width; - s16 y_old = rectangle_y+rectangle_height; - s16 y_30FPS = rectangle_y+(rectangle_height / 2); - s16 y_60FPS = rectangle_y; - bool isAbove = false; - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - - // Calculate content dimensions (what goes inside the border) - const s16 refresh_rate_offset = (refreshRate < 100) ? 21 : 28; - const s16 info_width = settings.showInfo ? (6 + rectangle_width/2 - 4) : 6; - const s16 content_width = rectangle_width + refresh_rate_offset + info_width; - const s16 content_height = rectangle_height + 12; - - // Total dimensions including border - const size_t totalWidth = content_width + (2 * border); - const size_t totalHeight = content_height + (2 * border); - - // Store actual dimensions for input handling - actualTotalWidth = totalWidth; - actualTotalHeight = totalHeight; - - if (refreshRate && refreshRate < 240) { - rectangle_height = refreshRate; - rectangle_range_max = refreshRate; - if (refreshRate < 100) { - rectangle_x = 15; - legend_max[0] = 0x30 + (refreshRate / 10); - legend_max[1] = 0x30 + (refreshRate % 10); - legend_max[2] = 0; - } - else { - rectangle_x = 22; - legend_max[0] = 0x30 + (refreshRate / 100); - legend_max[1] = 0x30 + ((refreshRate / 10) % 10); - legend_max[2] = 0x30 + (refreshRate % 10); - } - y_30FPS = rectangle_y+(rectangle_height / 2); - range = std::abs(rectangle_range_max - rectangle_range_min) + 1; - }; - - int _frameOffsetX = ult::limitedMemory ? std::max(0, frameOffsetX - (1280-448)) : frameOffsetX; - - // Calculate position with frame offsets (for the rounded rect, which includes border) - int posX = base_x + _frameOffsetX - border; - int posY = base_y + frameOffsetY - border; - - // Clamp to screen bounds (accounting for total size including border) - posX = std::max(int(framePadding), std::min(posX, static_cast(screenWidth - totalWidth - framePadding))); - posY = std::max(int(framePadding), std::min(posY, static_cast(screenHeight - totalHeight - framePadding))); - - // Draw the rounded rectangle (background) - const tsl::Color bgColor = !isDragging - ? settings.backgroundColor - : settings.focusBackgroundColor; - - renderer->drawRoundedRectSingleThreaded( - posX, - posY, - totalWidth, - totalHeight, - 16, - aWithOpacity(bgColor) - ); - - posX += 4; - - // Content drawing position (inside the border) - const int final_base_x = posX + border; - const int final_base_y = posY + border; - - const s16 size = (refreshRate > 60 || !refreshRate) ? 63 : (s32)(63.0/(60.0/refreshRate)); - const auto width = renderer->getTextDimensions(FPSavg_c, false, size).first; - - const s16 pos_y = size + final_base_y + rectangle_y + ((rectangle_height - size) / 2); - const s16 pos_x = final_base_x + rectangle_x + ((rectangle_width - width) / 2); - - if (FPSavg != 254.0) - renderer->drawString(FPSavg_c, false, pos_x, pos_y-5, size, settings.fpsColor); - renderer->drawEmptyRect(final_base_x+(rectangle_x - 1)+2, final_base_y+(rectangle_y - 1), rectangle_width + 2, rectangle_height + 4, aWithOpacity(settings.borderColor)); - renderer->drawDashedLine(final_base_x+rectangle_x+2, final_base_y+y_30FPS, final_base_x+rectangle_x+rectangle_width, final_base_y+y_30FPS, 6, aWithOpacity(settings.dashedLineColor)); - renderer->drawString(&legend_max[0], false, final_base_x+(rectangle_x-((refreshRate < 100) ? 15 : 22)), final_base_y+(rectangle_y+7), 10, (settings.maxFPSTextColor)); - renderer->drawString(&legend_min[0], false, final_base_x+(rectangle_x-10), final_base_y+(rectangle_y+rectangle_height+3), 10, settings.minFPSTextColor); - - size_t last_element = readings.size() - 1; - - s16 offset = 0; - if (refreshRate >= 100) offset = 7; - - static s32 y_on_range; - static tsl::Color color = {0}; - for (s16 x = x_end; x > static_cast(x_end-readings.size()); x--) { - y_on_range = readings[last_element].value + std::abs(rectangle_range_min) + 1; - if (y_on_range < 0) { - y_on_range = 0; - } - else if (y_on_range > range) { - isAbove = true; - y_on_range = range; - } - - const s16 y = rectangle_y + static_cast(std::lround((float)rectangle_height * ((float)(range - y_on_range) / (float)range))); - color = (settings.mainLineColor); - if (y == y_old && !isAbove && readings[last_element].zero_rounded) { - if ((y == y_30FPS || y == y_60FPS)) - color = (settings.perfectLineColor); - else - color = (settings.dashedLineColor); - } - - if (x == x_end) { - y_old = y; - } - - renderer->drawLine(final_base_x+x+offset, final_base_y+y, final_base_x+x+offset, final_base_y+y_old, color); - isAbove = false; - y_old = y; - last_element--; - } - - if (settings.showInfo) { - const s16 info_x = final_base_x+rectangle_width+rectangle_x + 6 +8; - const s16 info_y = final_base_y + 3; - const s16 fontSize = 11; - - // Get line height from font size (we'll use the actual rendered height) - const auto testDimensions = renderer->getTextDimensions("A", false, fontSize); - const s16 lineHeight = testDimensions.second; - - // Starting Y position for first line - const s16 startY = info_y + lineHeight; - - // Value X position (offset from labels) - const s16 value_x = info_x + 40; - - static constexpr s16 SPACING = 1; - - // Compute gradient colors for temperatures - const tsl::Color socColor = settings.useDynamicColors ? tsl::GradientColor(SOC_temperatureF) : settings.textColor; - const tsl::Color pcbColor = settings.useDynamicColors ? tsl::GradientColor(PCB_temperatureF) : settings.textColor; - const tsl::Color skinColor = settings.useDynamicColors ? tsl::GradientColor(static_cast(skin_temperaturemiliC) / 1000.0f) : settings.textColor; - - // Draw each label and value pair on the same baseline - // Line 0: CPU - renderer->drawString("CPU", false, info_x, startY, fontSize, settings.catColor); - renderer->drawString(CPU_Load_c, false, value_x, startY, fontSize, settings.textColor); - - // Line 1: GPU - renderer->drawString("GPU", false, info_x, startY + lineHeight+SPACING, fontSize, settings.catColor); - renderer->drawString(GPU_Load_c, false, value_x, startY + lineHeight+SPACING, fontSize, settings.textColor); - - // Line 2: RAM - renderer->drawString("RAM", false, info_x, startY + lineHeight * 2+2*SPACING, fontSize, settings.catColor); - renderer->drawString(RAM_Load_c, false, value_x, startY + lineHeight * 2+2*SPACING, fontSize, settings.textColor); - - // Line 3: CPU or SOC (with gradient color) - if (settings.realTemps && realCPU_Temp != 0) { - const tsl::Color cpuTempColor = settings.useDynamicColors ? tsl::GradientColor(realCPU_Temp / 1000.0f) : settings.textColor; - renderer->drawString("CPU", false, info_x, startY + lineHeight * 3+3*SPACING, fontSize, settings.catColor); - renderer->drawString(CPU_TEMP_c, false, value_x, startY + lineHeight * 3+3*SPACING, fontSize, cpuTempColor); - } else { - renderer->drawString("SOC", false, info_x, startY + lineHeight * 3+3*SPACING, fontSize, settings.catColor); - renderer->drawString(SOC_TEMP_c, false, value_x, startY + lineHeight * 3+3*SPACING, fontSize, socColor); - } - - // Line 4: GPU or PCB (with gradient color) - if (settings.realTemps && realGPU_Temp != 0) { - const tsl::Color gpuTempColor = settings.useDynamicColors ? tsl::GradientColor(realGPU_Temp / 1000.0f) : settings.textColor; - renderer->drawString("GPU", false, info_x, startY + lineHeight * 4+4*SPACING, fontSize, settings.catColor); - renderer->drawString(GPU_TEMP_c, false, value_x, startY + lineHeight * 4+4*SPACING, fontSize, gpuTempColor); - } else { - renderer->drawString("PCB", false, info_x, startY + lineHeight * 4+4*SPACING, fontSize, settings.catColor); - renderer->drawString(PCB_TEMP_c, false, value_x, startY + lineHeight * 4+4*SPACING, fontSize, pcbColor); - } - - // Line 5: RAM or SKIN (with gradient color) - if (settings.realTemps && realRAM_Temp != 0) { - const tsl::Color ramTempColor = settings.useDynamicColors ? tsl::GradientColor(realRAM_Temp / 1000.0f) : settings.textColor; - renderer->drawString("RAM", false, info_x, startY + lineHeight * 5+5*SPACING, fontSize, settings.catColor); - renderer->drawString(RAM_TEMP_c, false, value_x, startY + lineHeight * 5+5*SPACING, fontSize, ramTempColor); - } else { - renderer->drawString("Skin", false, info_x, startY + lineHeight * 5+5*SPACING, fontSize, settings.catColor); - renderer->drawString(SKIN_TEMP_c, false, value_x, startY + lineHeight * 5+5*SPACING, fontSize, skinColor); - } - } - }); - - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("", ""); - rootFrame->setContent(Status); - - return rootFrame; - } - - virtual void update() override { - cnt++; - if (cnt >= TeslaFPS) - cnt = 0; - - ///FPS - stats temp = {0, false}; - static uint64_t lastFrame = 0; - - snprintf(FPSavg_c, sizeof FPSavg_c, "%2.1f", FPSavg); - const uint8_t SaltySharedDisplayRefreshRate = *(uint8_t*)((uintptr_t)shmemGetAddr(&_sharedmemory) + 1); - if (SaltySharedDisplayRefreshRate) - refreshRate = SaltySharedDisplayRefreshRate; - else refreshRate = 60; - if (FPSavg < 254) { - snprintf(FPSavg_c, sizeof(FPSavg_c), "%.1f", useOldFPSavg ? FPSavg_old : FPSavg); - - if (lastFrame == lastFrameNumber) return; - else lastFrame = lastFrameNumber; - if ((s16)(readings.size()) >= rectangle_width) { - readings.erase(readings.begin()); - } - const float whole = std::round(useOldFPSavg ? FPSavg_old : FPSavg); - temp.value = static_cast(std::lround(useOldFPSavg ? FPSavg_old : FPSavg)); - if ((useOldFPSavg ? FPSavg_old : FPSavg) < whole+0.04 && (useOldFPSavg ? FPSavg_old : FPSavg) > whole-0.05) { - temp.zero_rounded = true; - } - readings.push_back(temp); - } - else { - if (readings.size()) { - readings.clear(); - readings.shrink_to_fit(); - lastFrame = 0; - } - FPSavg_c[0] = 0; - } - - if (cnt) - return; - - mutexLock(&mutex_Misc); - - // Format temperature strings separately for proper alignment - snprintf(SOC_TEMP_c, sizeof SOC_TEMP_c, "%2.1f\u00B0C", SOC_temperatureF); - snprintf(PCB_TEMP_c, sizeof PCB_TEMP_c, "%2.1f\u00B0C", PCB_temperatureF); - snprintf(SKIN_TEMP_c, sizeof SKIN_TEMP_c, "%2d.%d\u00B0C", - skin_temperaturemiliC / 1000, (skin_temperaturemiliC / 100) % 10); - - if (realCPU_Temp != 0) { - snprintf(CPU_TEMP_c, sizeof(CPU_TEMP_c), "%.1f\u00B0C", realCPU_Temp / 1000.0f); - } - if (realGPU_Temp != 0) { - snprintf(GPU_TEMP_c, sizeof(GPU_TEMP_c), "%.1f\u00B0C", realGPU_Temp / 1000.0f); - } - if (realRAM_Temp != 0) { - snprintf(RAM_TEMP_c, sizeof(RAM_TEMP_c), "%.1f\u00B0C", realRAM_Temp / 1000.0f); - } - - // Atomically snapshot each idle tick once - const uint64_t idle0 = idletick0.load(std::memory_order_acquire); - const uint64_t idle1 = idletick1.load(std::memory_order_acquire); - const uint64_t idle2 = idletick2.load(std::memory_order_acquire); - const uint64_t idle3 = idletick3.load(std::memory_order_acquire); - - // Clamp values to systemtickfrequency_impl (avoid div-by-zero / runaway) - const uint64_t safe0 = std::min(idle0, systemtickfrequency_impl); - const uint64_t safe1 = std::min(idle1, systemtickfrequency_impl); - const uint64_t safe2 = std::min(idle2, systemtickfrequency_impl); - const uint64_t safe3 = std::min(idle3, systemtickfrequency_impl); - - // Compute per-core CPU usage - const double cpu_usage0 = (1.0 - (static_cast(safe0) / systemtickfrequency_impl)) * 100.0; - const double cpu_usage1 = (1.0 - (static_cast(safe1) / systemtickfrequency_impl)) * 100.0; - const double cpu_usage2 = (1.0 - (static_cast(safe2) / systemtickfrequency_impl)) * 100.0; - const double cpu_usage3 = (1.0 - (static_cast(safe3) / systemtickfrequency_impl)) * 100.0; - - // Compute max core load (the highest usage) - const double cpu_usageM = std::max({cpu_usage0, cpu_usage1, cpu_usage2, cpu_usage3}); - - // Format output strings - snprintf(CPU_Load_c, sizeof(CPU_Load_c), "%.1f%%", cpu_usageM); - snprintf(GPU_Load_c, sizeof(GPU_Load_c), "%d.%d%%", GPU_Load_u / 10, GPU_Load_u % 10); - snprintf(RAM_Load_c, sizeof(RAM_Load_c), "%hu.%hhu%%", - partLoad[HocClkPartLoad_EMC] / 10, - partLoad[HocClkPartLoad_EMC] % 10); - - mutexUnlock(&mutex_Misc); - - if (!skipOnce) { - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - // Static variables to maintain drag state between function calls - static bool oldTouchDetected = false; - static bool oldMinusHeld = false; - static bool oldPlusHeld = false; - static HidTouchState initialTouchPos = {0}; - static int initialFrameOffsetX = 0; - static int initialFrameOffsetY = 0; - static constexpr int TOUCH_THRESHOLD = 8; - static bool hasMoved = false; - - // Touch detection - const bool currentTouchDetected = (touchPos.x > 0 && touchPos.y > 0 && - touchPos.x < screenWidth && touchPos.y < screenHeight); - - static bool clearOnRelease = false; - - if (clearOnRelease && !isRendering) { - clearOnRelease = false; - isRendering = true; - leventClear(&renderingStopEvent); - } - - // Use actual dimensions from last render, fallback to estimate if not available - size_t totalWidth = actualTotalWidth; - size_t totalHeight = actualTotalHeight; - - if (totalWidth == 0) { - // Fallback calculation if not yet rendered - const s16 refresh_rate_offset = (refreshRate < 100) ? 21 : 28; - const s16 info_width = settings.showInfo ? (6 + rectangle_width/2 - 4) : 0; - const s16 content_width = rectangle_width + refresh_rate_offset + info_width; - const s16 content_height = rectangle_height + 12; - totalWidth = content_width + (2 * border); - totalHeight = content_height + (2 * border); - } - - // Current overlay position (top-left of rounded rect) - const int overlayX = base_x + frameOffsetX - border; - const int overlayY = base_y + frameOffsetY - border; - - // Touch detection area (with padding for easier interaction) - static constexpr int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = totalWidth + (touchPadding * 2); - const int touchableHeight = totalHeight + (touchPadding * 2); - - // Screen boundaries for clamping (accounting for total size) - const int minX = -(base_x - border) + framePadding; - const int maxX = screenWidth - totalWidth - (base_x - border) - framePadding; - const int minY = -(base_y - border) + framePadding; - const int maxY = screenHeight - totalHeight - (base_y - border) - framePadding; - - const bool minusDragReady = buttonState.minusDragActive.load(std::memory_order_acquire); - const bool plusDragReady = buttonState.plusDragActive.load(std::memory_order_acquire); - - // Check button states - const bool currentMinusHeld = (keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK) && minusDragReady; - const bool currentPlusHeld = (keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK) && plusDragReady; - - // Handle touch dragging - if (currentTouchDetected && !isDragging) { - const int touchX = touchPos.x; - const int touchY = touchPos.y; - - if (!oldTouchDetected) { - // Touch just started - check if within overlay bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - - // Start touch dragging - isDragging = true; - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - hasMoved = false; - initialTouchPos = touchPos; - initialFrameOffsetX = frameOffsetX; - initialFrameOffsetY = frameOffsetY; - } - } - } else if (currentTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Continue touch dragging - const int touchX = touchPos.x; - const int touchY = touchPos.y; - const int deltaX = touchX - initialTouchPos.x; - const int deltaY = touchY - initialTouchPos.y; - - // Check if we've moved enough to consider this a drag - if (!hasMoved) { - const int totalMovement = abs(deltaX) + abs(deltaY); - if (totalMovement >= TOUCH_THRESHOLD) { - hasMoved = true; - } - } - - if (hasMoved) { - // Update frame offsets with boundary checking - frameOffsetX = std::max(minX, std::min(maxX, initialFrameOffsetX + deltaX)); - frameOffsetY = std::max(minY, std::min(maxY, initialFrameOffsetY + deltaY)); - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - } else if (!currentTouchDetected && oldTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Touch just released - if (hasMoved) { - // Save position when touch drag ends - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["fps-graph"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["fps-graph"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - } - - // Reset touch drag state - isDragging = false; - hasMoved = false; - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Handle joystick dragging (MINUS + right joystick OR PLUS + left joystick) - if ((currentMinusHeld || currentPlusHeld) && !isDragging) { - // Start joystick dragging - isDragging = true; - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - } else if ((currentMinusHeld || currentPlusHeld) && isDragging) { - // Continue joystick dragging - static constexpr int JOYSTICK_DEADZONE = 20; - - // Choose the appropriate joystick based on which button is held - const HidAnalogStickState& activeJoystick = currentMinusHeld ? joyStickPosRight : joyStickPosLeft; - - // Only move if joystick is outside deadzone - if (abs(activeJoystick.x) > JOYSTICK_DEADZONE || abs(activeJoystick.y) > JOYSTICK_DEADZONE) { - // Calculate joystick magnitude - const float magnitude = sqrt((float)(activeJoystick.x * activeJoystick.x + activeJoystick.y * activeJoystick.y)); - const float normalizedMagnitude = magnitude / 32767.0f; - - // Smooth curve for sensitivity - static constexpr float baseSensitivity = 0.00008f; - static constexpr float maxSensitivity = 0.0005f; - - const float curveValue = pow(normalizedMagnitude, 8.0f); - const float currentSensitivity = baseSensitivity + (maxSensitivity - baseSensitivity) * curveValue; - - // Calculate movement delta with fractional accumulation - static float accumulatedX = 0.0f; - static float accumulatedY = 0.0f; - - accumulatedX += (float)activeJoystick.x * currentSensitivity; - accumulatedY += -(float)activeJoystick.y * currentSensitivity; - - const int deltaX = (int)accumulatedX; - const int deltaY = (int)accumulatedY; - accumulatedX -= deltaX; - accumulatedY -= deltaY; - - // Update frame offsets with boundary checking - frameOffsetX = std::max(minX, std::min(maxX, frameOffsetX + deltaX)); - frameOffsetY = std::max(minY, std::min(maxY, frameOffsetY + deltaY)); - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - } else if (((!currentMinusHeld && oldMinusHeld) || (!currentPlusHeld && oldPlusHeld)) && isDragging) { - // Button just released - stop joystick dragging - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["fps-graph"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["fps-graph"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - isDragging = false; - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Update state for next frame - oldTouchDetected = currentTouchDetected; - oldMinusHeld = currentMinusHeld; - oldPlusHeld = currentPlusHeld; - - // Handle existing key input logic (but don't interfere with dragging) - if (!isDragging) { - if (isKeyComboPressed(keysHeld, keysDown)) { - isRendering = false; - leventSignal(&renderingStopEvent); - runOnce = true; - skipOnce = true; - TeslaFPS = 60; - lastSelectedItem = "FPS Graph"; - lastMode = ""; - if (skipMain) { - lastMode = "return"; - tsl::goBack(); - } - else { - tsl::setNextOverlay(filepath.c_str(), "--lastSelectedItem 'FPS Graph'"); - tsl::Overlay::get()->close(); - } - return true; - } - } - - // Return true if we handled the input (during dragging) - return isDragging; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Full.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Full.hpp deleted file mode 100644 index 06965099..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Full.hpp +++ /dev/null @@ -1,727 +0,0 @@ -class MainMenu; - -class FullOverlay : public tsl::Gui { -private: - char DeltaCPU_c[12] = ""; - char DeltaGPU_c[12] = ""; - char DeltaRAM_c[12] = ""; - char RealCPU_Hz_c[64] = ""; - char RealGPU_Hz_c[64] = ""; - char RealRAM_Hz_c[64] = ""; - char GPU_Load_c[32] = ""; - char Rotation_SpeedLevel_c[64] = ""; - char RAM_compressed_c[64] = ""; - char RAM_var_compressed_c[128] = ""; - char RAM_percentage_var_compressed_c[128] = ""; - char CPU_Hz_c[64] = ""; - char GPU_Hz_c[64] = ""; - char RAM_Hz_c[64] = ""; - char CPU_compressed_c[160] = ""; - char SOC_temperature_c[32] = ""; - char PCB_temperature_c[32] = ""; - char skin_temperature_c[32] = ""; - char CPU_temp_c[32] = ""; - char GPU_temp_c[32] = ""; - char RAM_temp_c[32] = ""; - char BatteryDraw_c[64] = ""; - char FPS_var_compressed_c[64] = ""; - char RAM_load_c[64] = ""; - char RAM_load2_c[64] = ""; - char RAM_bw_peak_c[16] = ""; - char RAM_bw_total_c[16] = ""; - char RAM_bw_gpu_c[16] = ""; - char RAM_bw_cpu_c[16] = ""; - char Resolutions_c[64] = ""; - char readSpeed_c[32] = ""; - - // New separated value buffers for CPU cores - char CPU_Core0_c[16] = ""; - char CPU_Core1_c[16] = ""; - char CPU_Core2_c[16] = ""; - char CPU_Core3_c[16] = ""; - - // New separated value buffers for FPS - char PFPS_value_c[16] = ""; - char FPS_value_c[16] = ""; - - static constexpr uint8_t COMMON_MARGIN = 20; - FullSettings settings; - uint64_t systemtickfrequency_impl = systemtickfrequency; - std::string formattedKeyCombo = keyCombo; - std::string message; - const std::vector KEY_SYMBOLS = { - "\uE0E4", "\uE0E5", "\uE0E6", "\uE0E7", - "\uE0E8", "\uE0E9", "\uE0ED", "\uE0EB", - "\uE0EE", "\uE0EC", "\uE0E0", "\uE0E1", - "\uE0E2", "\uE0E3", "\uE08A", "\uE08B", - "\uE0B6", "\uE0B5" - }; - - bool skipOnce = true; - bool runOnce = true; - - bool originalUseRightAlignment = ult::useRightAlignment; -public: - FullOverlay() { - disableJumpTo = true; - GetConfigSettings(&settings); - mutexInit(&mutex_BatteryChecker); - mutexInit(&mutex_Misc); - tsl::hlp::requestForeground(false); - TeslaFPS = settings.refreshRate; - systemtickfrequency_impl /= settings.refreshRate; - idletick0.store(systemtickfrequency_impl, std::memory_order_relaxed); - idletick1.store(systemtickfrequency_impl, std::memory_order_relaxed); - idletick2.store(systemtickfrequency_impl, std::memory_order_relaxed); - idletick3.store(systemtickfrequency_impl, std::memory_order_relaxed); - if (settings.setPosRight) { - const auto [horizontalUnderscanPixels, verticalUnderscanPixels] = tsl::gfx::getUnderscanPixels(); - tsl::gfx::Renderer::get().setLayerPos(1280-32 - horizontalUnderscanPixels, 0); - ult::useRightAlignment = true; - } else { - tsl::gfx::Renderer::get().setLayerPos(0, 0); - ult::useRightAlignment = false; - } - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().removeScreenshotStacks(); - } - deactivateOriginalFooter = true; - formatButtonCombination(formattedKeyCombo); - //message = "Press " + formattedKeyCombo + " to Exit"; - - realVoltsPolling = false; - StartThreads(); - } - ~FullOverlay() { - CloseThreads(); - fixForeground = true; - ult::useRightAlignment = originalUseRightAlignment; - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().addScreenshotStacks(); - } - deactivateOriginalFooter = false; - } - - resolutionCalls m_resolutionRenderCalls[8] = {0}; - resolutionCalls m_resolutionViewportCalls[8] = {0}; - resolutionCalls m_resolutionOutput[8] = {0}; - uint8_t resolutionLookup = 0; - - virtual tsl::elm::Element* createUI() override { - - - auto Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - //static auto targetFreqWidth = renderer->getTextDimensions("Target Frequency", false, 15).first; - //static auto realFreqWidth = renderer->getTextDimensions("Real Frequency", false, 15).first; - //static auto freqWidth = std::max(targetFreqWidth, realFreqWidth); - - //static auto batteryLabelWidth = renderer->getTextDimensions("Battery Power Flow", false, 15).first; - //static auto fanLabelWidth = renderer->getTextDimensions("Fan Rotation Level", false, 15).first; - //static auto boardWidth = std::max(batteryLabelWidth, fanLabelWidth); - - static constexpr size_t valueOffset = 150+10; - static constexpr size_t deltaOffset = 246+10; - static constexpr size_t ramPercentageOffset = 350+10; - - //Print strings - ///CPU - if (1) { - - uint32_t height_offset = 155; - if (realCPU_Hz && settings.showRealFreqs) { - height_offset = 162; - } - renderer->drawString("CPU Usage", false, COMMON_MARGIN, 120, 20, (settings.catColor1)); - if (settings.showTargetFreqs) { - //static auto targetFreqWidth = renderer->getTextDimensions("Target Frequency: ", false, 15).first; - renderer->drawString("Target Frequency", false, COMMON_MARGIN, height_offset, 15, (settings.catColor2)); - renderer->drawString(CPU_Hz_c, false, COMMON_MARGIN + valueOffset, height_offset, 15, (settings.textColor)); - } - if (realCPU_Hz && settings.showRealFreqs) { - //static auto realFreqWidth = renderer->getTextDimensions("Real Frequency: ", false, 15).first; - renderer->drawString("Real Frequency", false, COMMON_MARGIN, height_offset - 15, 15, (settings.catColor2)); - renderer->drawString(RealCPU_Hz_c, false, COMMON_MARGIN + valueOffset, height_offset - 15, 15, (settings.textColor)); - if (settings.showDeltas && settings.showTargetFreqs) { - renderer->drawString(DeltaCPU_c, false, COMMON_MARGIN + deltaOffset, height_offset - 7, 15, (settings.textColor)); - } - else if (settings.showDeltas && !settings.showTargetFreqs) { - renderer->drawString(DeltaCPU_c, false, COMMON_MARGIN + deltaOffset, height_offset - 15, 15, (settings.textColor)); - } - } - else if (realCPU_Hz && settings.showDeltas && (settings.showRealFreqs || settings.showTargetFreqs)) { - renderer->drawString(DeltaCPU_c, false, COMMON_MARGIN + deltaOffset, height_offset, 15, (settings.textColor)); - } - - // CPU Core labels and values - static auto core0Width = renderer->getTextDimensions("Core 0 ", false, 15).first; - static auto core1Width = renderer->getTextDimensions("Core 1 ", false, 15).first; - static auto core2Width = renderer->getTextDimensions("Core 2 ", false, 15).first; - static auto core3Width = renderer->getTextDimensions("Core 3 ", false, 15).first; - - const uint32_t core_height = height_offset + 30; - renderer->drawString("Core 0 ", false, COMMON_MARGIN, core_height, 15, (settings.catColor2)); - renderer->drawString(CPU_Core0_c, false, COMMON_MARGIN + core0Width, core_height, 15, (settings.textColor)); - - renderer->drawString("Core 1 ", false, COMMON_MARGIN, core_height + 15, 15, (settings.catColor2)); - renderer->drawString(CPU_Core1_c, false, COMMON_MARGIN + core1Width, core_height + 15, 15, (settings.textColor)); - - renderer->drawString("Core 2 ", false, COMMON_MARGIN, core_height + 30, 15, (settings.catColor2)); - renderer->drawString(CPU_Core2_c, false, COMMON_MARGIN + core2Width, core_height + 30, 15, (settings.textColor)); - - renderer->drawString("Core 3 ", false, COMMON_MARGIN, core_height + 45, 15, (settings.catColor2)); - renderer->drawString(CPU_Core3_c, false, COMMON_MARGIN + core3Width, core_height + 45, 15, (settings.textColor)); - } - - ///GPU - if (R_SUCCEEDED(nvCheck)) { - - uint32_t height_offset = 320-8; - if (realGPU_Hz && settings.showRealFreqs) { - height_offset = 327-8; - } - - renderer->drawString("GPU Usage", false, COMMON_MARGIN, 285-8, 20, (settings.catColor1)); - if (1) { - if (settings.showTargetFreqs) { - //static auto targetFreqWidth = renderer->getTextDimensions("Target Frequency: ", false, 15).first; - renderer->drawString("Target Frequency", false, COMMON_MARGIN, height_offset, 15, (settings.catColor2)); - renderer->drawString(GPU_Hz_c, false, COMMON_MARGIN + valueOffset, height_offset, 15, (settings.textColor)); - } - if (realCPU_Hz && settings.showRealFreqs) { - //static auto realFreqWidth = renderer->getTextDimensions("Real Frequency: ", false, 15).first; - renderer->drawString("Real Frequency", false, COMMON_MARGIN, height_offset - 15, 15, (settings.catColor2)); - renderer->drawString(RealGPU_Hz_c, false, COMMON_MARGIN + valueOffset, height_offset - 15, 15, (settings.textColor)); - if (settings.showDeltas && settings.showTargetFreqs) { - renderer->drawString(DeltaGPU_c, false, COMMON_MARGIN + deltaOffset, height_offset - 7, 15, (settings.textColor)); - } - else if (settings.showDeltas && !settings.showTargetFreqs) { - renderer->drawString(DeltaGPU_c, false, COMMON_MARGIN + deltaOffset, height_offset - 15, 15, (settings.textColor)); - } - } - else if (realGPU_Hz && settings.showDeltas && (settings.showRealFreqs || settings.showTargetFreqs)) { - renderer->drawString(DeltaGPU_c, false, COMMON_MARGIN + deltaOffset, height_offset, 15, (settings.textColor)); - } - } - if (R_SUCCEEDED(nvCheck)) { - //static auto loadWidth = renderer->getTextDimensions("Load: ", false, 15).first; - renderer->drawString("Load", false, COMMON_MARGIN, height_offset + 15, 15, (settings.catColor2)); - renderer->drawString(GPU_Load_c, false, COMMON_MARGIN + valueOffset, height_offset + 15, 15, (settings.textColor)); - } - - } - - static std::vector specialChars = {""}; - - ///RAM - if (R_SUCCEEDED(Hinted)) { - - uint32_t height_offset = 410; - if (realRAM_Hz && settings.showRealFreqs) { - height_offset += 7; - } - - renderer->drawString("RAM Usage", false, COMMON_MARGIN, 375, 20, (settings.catColor1)); - if (1) { - if (settings.showTargetFreqs) { - //static auto targetFreqWidth = renderer->getTextDimensions("Target Frequency: ", false, 15).first; - renderer->drawString("Target Frequency", false, COMMON_MARGIN, height_offset, 15, (settings.catColor2)); - renderer->drawString(RAM_Hz_c, false, COMMON_MARGIN + valueOffset, height_offset, 15, (settings.textColor)); - } - if (realRAM_Hz && settings.showRealFreqs) { - //static auto realFreqWidth = renderer->getTextDimensions("Real Frequency: ", false, 15).first; - renderer->drawString("Real Frequency", false, COMMON_MARGIN, height_offset - 15, 15, (settings.catColor2)); - renderer->drawString(RealRAM_Hz_c, false, COMMON_MARGIN + valueOffset, height_offset - 15, 15, (settings.textColor)); - if (settings.showDeltas && settings.showTargetFreqs) { - renderer->drawString(DeltaRAM_c, false, COMMON_MARGIN + deltaOffset, height_offset - 7, 15, (settings.textColor)); - } - else if (settings.showDeltas && !settings.showTargetFreqs) { - renderer->drawString(DeltaRAM_c, false, COMMON_MARGIN + deltaOffset, height_offset - 15, 15, (settings.textColor)); - } - } - else if (realRAM_Hz && settings.showDeltas && (settings.showRealFreqs || settings.showTargetFreqs)) { - renderer->drawString(DeltaRAM_c, false, COMMON_MARGIN + deltaOffset, height_offset, 15, (settings.textColor)); - } - if (R_SUCCEEDED(hocclkCheck)) { - if (settings.ramInfoMode == "Bandwidth") { - // Fixed column layout: labels at fixed x, values at fixed x after max label width - // Col1: Peak/GPU labels, Col2: Total/CPU labels - // Values start at a fixed offset so columns don't shift with different digit counts - static const uint32_t bwLbl1W = renderer->getTextDimensions("Peak ", false, 15).first; - static const uint32_t bwLbl2W = renderer->getTextDimensions("Total ", false, 15).first; - static const uint32_t bwValW = renderer->getTextDimensions("99.9 GB/s", false, 15).first; - static const uint32_t bwGap = renderer->getTextDimensions(" ", false, 15).first; - const uint32_t xV1 = COMMON_MARGIN + bwLbl1W; - const uint32_t xL2 = xV1 + bwValW + bwGap; - const uint32_t xV2 = xL2 + bwLbl2W; - // Row 1: Peak ... Total - renderer->drawString("Peak", false, COMMON_MARGIN, height_offset+15, 15, settings.catColor2); - renderer->drawString(RAM_bw_peak_c, false, xV1, height_offset+15, 15, settings.textColor); - renderer->drawString("Total", false, xL2, height_offset+15, 15, settings.catColor2); - renderer->drawString(RAM_bw_total_c, false, xV2, height_offset+15, 15, settings.textColor); - // Row 2: GPU ... CPU - renderer->drawString("GPU", false, COMMON_MARGIN, height_offset+30, 15, settings.catColor2); - renderer->drawString(RAM_bw_gpu_c, false, xV1, height_offset+30, 15, settings.textColor); - renderer->drawString("CPU", false, xL2, height_offset+30, 15, settings.catColor2); - renderer->drawString(RAM_bw_cpu_c, false, xV2, height_offset+30, 15, settings.textColor); - } else { - static std::vector partLoadColoredChars = {"CPU", "GPU"}; - renderer->drawString("Load", false, COMMON_MARGIN, height_offset+15, 15, (settings.catColor2)); - renderer->drawStringWithColoredSections(RAM_load_c, false, partLoadColoredChars, COMMON_MARGIN + valueOffset, height_offset+15, 15, (settings.textColor), settings.catColor2); - } - } - } - if (R_SUCCEEDED(Hinted)) { - const uint32_t ramUsageOffset = (R_SUCCEEDED(hocclkCheck) && settings.ramInfoMode == "Bandwidth") ? height_offset + 50 : height_offset + 40; - //static auto textWidth = renderer->getTextDimensions("Total \nApplication \nApplet \nSystem \nSystem Unsafe ", false, 15).first; - renderer->drawString("Total\nApplication\nApplet\nSystem\nSystem Unsafe", false, COMMON_MARGIN, ramUsageOffset, 15, (settings.catColor2)); - renderer->drawString(RAM_var_compressed_c, false, COMMON_MARGIN + valueOffset, ramUsageOffset, 15, (settings.textColor)); - renderer->drawString(RAM_percentage_var_compressed_c, false, ramPercentageOffset, ramUsageOffset, 15, (settings.textColor)); - } - } - - ///Thermal - if (R_SUCCEEDED(i2cCheck) || R_SUCCEEDED(tcCheck) || R_SUCCEEDED(pwmCheck)) { - renderer->drawString("Board", false, 20, 550+2, 20, (settings.catColor1)); - if (R_SUCCEEDED(i2cCheck)) { - renderer->drawString("Battery Power Flow", false, COMMON_MARGIN, 575+2, 15, (settings.catColor2)); - renderer->drawStringWithColoredSections(BatteryDraw_c, false, specialChars, COMMON_MARGIN + valueOffset, 575+2, 15, (settings.textColor), settings.separatorColor); - } - if (R_SUCCEEDED(pwmCheck)) { - renderer->drawString("Fan Rotation Level", false, COMMON_MARGIN, 590+2, 15, (settings.catColor2)); - renderer->drawString(Rotation_SpeedLevel_c, false, COMMON_MARGIN + valueOffset, 590+2, 15, (settings.textColor)); - } - if (R_SUCCEEDED(i2cCheck) || R_SUCCEEDED(tcCheck)) { - static auto socLabelWidth = renderer->getTextDimensions("SOC ", false, 15).first; - static auto pcbLabelWidth = renderer->getTextDimensions("PCB ", false, 15).first; - static auto maxLabelWidth = std::max(socLabelWidth, pcbLabelWidth); - static auto skinLabelWidth = renderer->getTextDimensions("Skin ", false, 15).first; - - // Compute gradient colors for temperatures - const tsl::Color socColor = settings.useDynamicColors ? tsl::GradientColor(SOC_temperatureF) : settings.textColor; - const tsl::Color pcbColor = settings.useDynamicColors ? tsl::GradientColor(PCB_temperatureF) : settings.textColor; - const tsl::Color skinColor = settings.useDynamicColors ? tsl::GradientColor(static_cast(skin_temperaturemiliC) / 1000.0f) : settings.textColor; - - renderer->drawString("Temperatures", false, COMMON_MARGIN, 605+2, 15, (settings.catColor2)); - - // SOC - starts at valueOffset next to "Temperatures" - uint32_t current_x = COMMON_MARGIN + valueOffset; - renderer->drawString("SOC ", false, current_x, 605+2, 15, (settings.catColor2)); - current_x += maxLabelWidth; - renderer->drawString(SOC_temperature_c, false, current_x, 605+2, 15, socColor); - - // SKIN - same spacing to the right - current_x += renderer->getTextDimensions(SOC_temperature_c, false, 15).first + 15; - renderer->drawString("Skin ", false, current_x, 605+2, 15, (settings.catColor2)); - current_x += skinLabelWidth; - renderer->drawString(skin_temperature_c, false, current_x, 605+2, 15, skinColor); - - // PCB - below SOC on next line - current_x = COMMON_MARGIN + valueOffset; - renderer->drawString("PCB ", false, current_x, 620+2, 15, (settings.catColor2)); - current_x += maxLabelWidth; - renderer->drawString(PCB_temperature_c, false, current_x, 620+2, 15, pcbColor); - } - } - - // Real temps - CPU, GPU, RAM - if (settings.realTemps && (realCPU_Temp != 0 || realGPU_Temp != 0 || realRAM_Temp != 0)) { - static auto cpuTempLabelWidth = renderer->getTextDimensions("CPU ", false, 15).first; - static auto gpuTempLabelWidth = renderer->getTextDimensions("GPU ", false, 15).first; - static auto ramTempLabelWidth = renderer->getTextDimensions("RAM ", false, 15).first; - - uint32_t current_x = COMMON_MARGIN + 58;; - - // CPU temp - if (realCPU_Temp != 0) { - const tsl::Color cpuTempColor = settings.useDynamicColors ? tsl::GradientColor(realCPU_Temp / 1000.0f) : settings.textColor; - renderer->drawString("CPU ", false, current_x, 635+2, 15, (settings.catColor2)); - current_x += cpuTempLabelWidth; - renderer->drawString(CPU_temp_c, false, current_x, 635+2, 15, cpuTempColor); - current_x += renderer->getTextDimensions(CPU_temp_c, false, 15).first + 15; - } - - // GPU temp - if (realGPU_Temp != 0) { - const tsl::Color gpuTempColor = settings.useDynamicColors ? tsl::GradientColor(realGPU_Temp / 1000.0f) : settings.textColor; - renderer->drawString("GPU ", false, current_x, 635+2, 15, (settings.catColor2)); - current_x += gpuTempLabelWidth; - renderer->drawString(GPU_temp_c, false, current_x, 635+2, 15, gpuTempColor); - current_x += renderer->getTextDimensions(GPU_temp_c, false, 15).first + 15; - } - - // RAM temp - if (realRAM_Temp != 0) { - const tsl::Color ramTempColor = settings.useDynamicColors ? tsl::GradientColor(realRAM_Temp / 1000.0f) : settings.textColor; - renderer->drawString("RAM ", false, current_x, 635+2, 15, (settings.catColor2)); - current_x += ramTempLabelWidth; - renderer->drawString(RAM_temp_c, false, current_x, 635+2, 15, ramTempColor); - } - } - - ///FPS - if (GameRunning) { - const uint32_t width_offset = valueOffset; - if (settings.showFPS || settings.showRES || settings.showRDSD) { - renderer->drawString("Game", false, COMMON_MARGIN + width_offset, 185+12, 20, (settings.catColor1)); - } - uint32_t height = 210+12; - if (settings.showFPS == true) { - static auto pfpsWidth = renderer->getTextDimensions("PFPS ", false, 15).first; - static auto fpsWidth = renderer->getTextDimensions("FPS ", false, 15).first; - - renderer->drawString("PFPS ", false, COMMON_MARGIN + width_offset, height, 15, (settings.catColor2)); - renderer->drawString(PFPS_value_c, false, COMMON_MARGIN + width_offset + pfpsWidth, height, 15, (settings.textColor)); - - // Calculate position for "FPS " label - add some spacing - const uint32_t fps_x_offset = COMMON_MARGIN + width_offset + pfpsWidth + renderer->getTextDimensions(PFPS_value_c, false, 15).first + 15; - renderer->drawString("FPS ", false, fps_x_offset, height, 15, (settings.catColor2)); - renderer->drawString(FPS_value_c, false, fps_x_offset + fpsWidth, height, 15, (settings.textColor)); - - height += 15; - } - if ((settings.showRES == true) && NxFps && SharedMemoryUsed && (NxFps -> API >= 1)) { - static auto resLabelWidth = renderer->getTextDimensions("Resolutions ", false, 15).first; - renderer->drawString("Resolutions ", false, COMMON_MARGIN + width_offset, height, 15, (settings.catColor2)); - - renderer->drawStringWithColoredSections(Resolutions_c, false, specialChars, COMMON_MARGIN + width_offset + resLabelWidth, height, 15, (settings.textColor), settings.separatorColor); - height += 15; - } - if (settings.showRDSD == true) { - static auto readLabelWidth = renderer->getTextDimensions("Read Speed ", false, 15).first; - renderer->drawString("Read Speed ", false, COMMON_MARGIN + width_offset, height, 15, (settings.catColor2)); - renderer->drawString(readSpeed_c, false, COMMON_MARGIN + width_offset + readLabelWidth, height, 15, (settings.textColor)); - } - } - - //renderer->drawStringWithColoredSections(message, false, KEY_SYMBOLS, 30, 693, 23, a(tsl::bottomTextColor), a(tsl::buttonColor)); - - - static const auto pressWidth = renderer->getTextDimensions("Press ", false, 23).first; - static const auto keyComboWidth = renderer->getTextDimensions(formattedKeyCombo.c_str(), false, 23).first; - - static constexpr u16 baseX = 30; - static constexpr u16 baseY = 693; - static constexpr u8 fontSize = 23; - - // Draw "Press " - renderer->drawString("Press ", false, baseX, baseY, fontSize, (tsl::bottomTextColor)); - - // Draw formatted key combo with colored sections - renderer->drawStringWithColoredSections(formattedKeyCombo, false, KEY_SYMBOLS, baseX + pressWidth, baseY, fontSize, (tsl::bottomTextColor), (tsl::buttonColor)); - - // Draw " to Exit" - renderer->drawString(" to Exit", false, baseX + pressWidth + keyComboWidth, baseY, fontSize, (tsl::bottomTextColor)); - }); - - auto rootFrame = new tsl::elm::HeaderOverlayFrame("Horizon OC Monitor", APP_VERSION); - rootFrame->setContent(Status); - - return rootFrame; - } - - virtual void update() override { - //Make stuff ready to print - ///CPU - if (systemtickfrequency_impl > 0) { - const uint64_t idle0_val = std::min(idletick0.load(std::memory_order_acquire), systemtickfrequency_impl); - const uint64_t idle1_val = std::min(idletick1.load(std::memory_order_acquire), systemtickfrequency_impl); - const uint64_t idle2_val = std::min(idletick2.load(std::memory_order_acquire), systemtickfrequency_impl); - const uint64_t idle3_val = std::min(idletick3.load(std::memory_order_acquire), systemtickfrequency_impl); - - const float usage0 = std::clamp(100.0f * (1.0f - float(idle0_val) / systemtickfrequency_impl), 0.0f, 100.0f); - const float usage1 = std::clamp(100.0f * (1.0f - float(idle1_val) / systemtickfrequency_impl), 0.0f, 100.0f); - const float usage2 = std::clamp(100.0f * (1.0f - float(idle2_val) / systemtickfrequency_impl), 0.0f, 100.0f); - const float usage3 = std::clamp(100.0f * (1.0f - float(idle3_val) / systemtickfrequency_impl), 0.0f, 100.0f); - - // Format individual core values - snprintf(CPU_Core0_c, sizeof(CPU_Core0_c), "%.2f%%", usage0); - snprintf(CPU_Core1_c, sizeof(CPU_Core1_c), "%.2f%%", usage1); - snprintf(CPU_Core2_c, sizeof(CPU_Core2_c), "%.2f%%", usage2); - snprintf(CPU_Core3_c, sizeof(CPU_Core3_c), "%.2f%%", usage3); - } - - mutexLock(&mutex_Misc); - snprintf(CPU_Hz_c, sizeof(CPU_Hz_c), "%u.%u MHz", CPU_Hz / 1000000, (CPU_Hz / 100000) % 10); - if (realCPU_Hz) { - snprintf(RealCPU_Hz_c, sizeof(RealCPU_Hz_c), "%u.%u MHz", realCPU_Hz / 1000000, (realCPU_Hz / 100000) % 10); - const int32_t deltaCPU = (int32_t)(realCPU_Hz / 1000) - (CPU_Hz / 1000); - snprintf(DeltaCPU_c, sizeof(DeltaCPU_c), "Δ %d.%u", deltaCPU / 1000, abs(deltaCPU / 100) % 10); - } - - ///GPU - snprintf(GPU_Hz_c, sizeof GPU_Hz_c, "%u.%u MHz", GPU_Hz / 1000000, (GPU_Hz / 100000) % 10); - if (realGPU_Hz) { - snprintf(RealGPU_Hz_c, sizeof(RealGPU_Hz_c), "%u.%u MHz", realGPU_Hz / 1000000, (realGPU_Hz / 100000) % 10); - const int32_t deltaGPU = (int32_t)(realGPU_Hz / 1000) - (GPU_Hz / 1000); - snprintf(DeltaGPU_c, sizeof(DeltaGPU_c), "Δ %d.%u", deltaGPU / 1000, abs(deltaGPU / 100) % 10); - } - snprintf(GPU_Load_c, sizeof GPU_Load_c, "%u.%u%%", GPU_Load_u / 10, GPU_Load_u % 10); - - ///RAM - snprintf(RAM_Hz_c, sizeof RAM_Hz_c, "%u.%u MHz", RAM_Hz / 1000000, (RAM_Hz / 100000) % 10); - if (realRAM_Hz) { - snprintf(RealRAM_Hz_c, sizeof(RealRAM_Hz_c), "%u.%u MHz", realRAM_Hz / 1000000, (realRAM_Hz / 100000) % 10); - const int32_t deltaRAM = (int32_t)(realRAM_Hz / 1000) - (RAM_Hz / 1000); - snprintf(DeltaRAM_c, sizeof(DeltaRAM_c), "Δ %d.%u", deltaRAM / 1000, abs(deltaRAM / 100) % 10); - } - - const float RAM_Total_application_f = (float)RAM_Total_application_u / 1024 / 1024; - const float RAM_Total_applet_f = (float)RAM_Total_applet_u / 1024 / 1024; - const float RAM_Total_system_f = (float)RAM_Total_system_u / 1024 / 1024; - const float RAM_Total_systemunsafe_f = (float)RAM_Total_systemunsafe_u / 1024 / 1024; - const float RAM_Total_all_f = RAM_Total_application_f + RAM_Total_applet_f + RAM_Total_system_f + RAM_Total_systemunsafe_f; - - const float RAM_Used_application_f = (float)RAM_Used_application_u / 1024 / 1024; - const float RAM_Used_applet_f = (float)RAM_Used_applet_u / 1024 / 1024; - const float RAM_Used_system_f = (float)RAM_Used_system_u / 1024 / 1024; - const float RAM_Used_systemunsafe_f = (float)RAM_Used_systemunsafe_u / 1024 / 1024; - const float RAM_Used_all_f = RAM_Used_application_f + RAM_Used_applet_f + RAM_Used_system_f + RAM_Used_systemunsafe_f; - - // Compute percentages - const int RAMPct_all = (int)((RAM_Used_all_f / RAM_Total_all_f) * 100.0f ); - const int RAMPct_app = (int)((RAM_Used_application_f / RAM_Total_application_f) * 100.0f ); - const int RAMPct_applet = (int)((RAM_Used_applet_f / RAM_Total_applet_f) * 100.0f ); - const int RAMPct_system = (int)((RAM_Used_system_f / RAM_Total_system_f) * 100.0f ); - const int RAMPct_systemunsafe = (int)((RAM_Used_systemunsafe_f/ RAM_Total_systemunsafe_f)* 100.0f ); - - snprintf(RAM_var_compressed_c, sizeof(RAM_var_compressed_c), - "%.1f MB / %.1f MB\n" - "%.1f MB / %.1f MB\n" - "%.1f MB / %.1f MB\n" - "%.1f MB / %.1f MB\n" - "%.1f MB / %.1f MB", - RAM_Used_all_f, RAM_Total_all_f, - RAM_Used_application_f, RAM_Total_application_f, - RAM_Used_applet_f, RAM_Total_applet_f, - RAM_Used_system_f, RAM_Total_system_f, - RAM_Used_systemunsafe_f, RAM_Total_systemunsafe_f - ); - - // 2. Percentages only (newlines preserved) - snprintf(RAM_percentage_var_compressed_c, sizeof(RAM_percentage_var_compressed_c), - "(%d%%)\n" - "(%d%%)\n" - "(%d%%)\n" - "(%d%%)\n" - "(%d%%)", - RAMPct_all, - RAMPct_app, - RAMPct_applet, - RAMPct_system, - RAMPct_systemunsafe - ); - - if (R_SUCCEEDED(hocclkCheck)) { - if (settings.ramInfoMode == "Bandwidth") { - const unsigned bwAll = partLoad[HocClkPartLoad_RamBWAll] / 1000; - const unsigned bwAllD = (partLoad[HocClkPartLoad_RamBWAll] % 1000) / 100; - const unsigned bwPeak = partLoad[HocClkPartLoad_RamBWPeak] / 1000; - const unsigned bwPeakD= (partLoad[HocClkPartLoad_RamBWPeak]% 1000) / 100; - const unsigned bwCpu = partLoad[HocClkPartLoad_RamBWCpu] / 1000; - const unsigned bwCpuD = (partLoad[HocClkPartLoad_RamBWCpu] % 1000) / 100; - const unsigned bwGpu = partLoad[HocClkPartLoad_RamBWGpu] / 1000; - const unsigned bwGpuD = (partLoad[HocClkPartLoad_RamBWGpu] % 1000) / 100; - snprintf(RAM_bw_peak_c, sizeof RAM_bw_peak_c, "%u.%u GB/s", bwPeak, bwPeakD); - snprintf(RAM_bw_total_c, sizeof RAM_bw_total_c, "%u.%u GB/s", bwAll, bwAllD); - snprintf(RAM_bw_gpu_c, sizeof RAM_bw_gpu_c, "%u.%u GB/s", bwGpu, bwGpuD); - snprintf(RAM_bw_cpu_c, sizeof RAM_bw_cpu_c, "%u.%u GB/s", bwCpu, bwCpuD); - } else { - const int RAM_GPU_Load = partLoad[HocClkPartLoad_EMC] - partLoad[HocClkPartLoad_EMCCpu]; - snprintf(RAM_load_c, sizeof RAM_load_c, - "%u.%u%% CPU %u.%u%% GPU %u.%u%%", - partLoad[HocClkPartLoad_EMC] / 10, partLoad[HocClkPartLoad_EMC] % 10, - partLoad[HocClkPartLoad_EMCCpu] / 10, partLoad[HocClkPartLoad_EMCCpu] % 10, - RAM_GPU_Load / 10, RAM_GPU_Load % 10); - } - } - ///Thermal - snprintf(SOC_temperature_c, sizeof SOC_temperature_c, "%.1f\u00B0C", SOC_temperatureF); - snprintf(PCB_temperature_c, sizeof PCB_temperature_c, "%.1f\u00B0C", PCB_temperatureF); - snprintf(skin_temperature_c, sizeof skin_temperature_c, "%d.%d\u00B0C", skin_temperaturemiliC / 1000, (skin_temperaturemiliC / 100) % 10); - - snprintf(Rotation_SpeedLevel_c, sizeof Rotation_SpeedLevel_c, "%.1f%%", Rotation_Duty); - - if (settings.realTemps) { - if (realCPU_Temp != 0) { - snprintf(CPU_temp_c, sizeof(CPU_temp_c), "%.1f°C", realCPU_Temp / 1000.0f); - } - if (realGPU_Temp != 0) { - snprintf(GPU_temp_c, sizeof(GPU_temp_c), "%.1f°C", realGPU_Temp / 1000.0f); - } - if (realRAM_Temp != 0) { - snprintf(RAM_temp_c, sizeof(RAM_temp_c), "%.1f°C", realRAM_Temp / 1000.0f); - } - } - ///FPS - if (settings.showFPS == true) { - snprintf(PFPS_value_c, sizeof PFPS_value_c, "%1u", FPS); - snprintf(FPS_value_c, sizeof FPS_value_c, "%.1f", useOldFPSavg ? FPSavg_old : FPSavg); - } - - //Resolutions - if ((settings.showRES == true) && GameRunning && NxFps) { - if (!resolutionLookup) { - (NxFps -> renderCalls[0].calls) = 0xFFFF; - resolutionLookup = 1; - } - else if (resolutionLookup == 1) { - if ((NxFps -> renderCalls[0].calls) != 0xFFFF) resolutionLookup = 2; - } - else { - if (NxFps && SharedMemoryUsed) { - memcpy(&m_resolutionRenderCalls, &(NxFps -> renderCalls), sizeof(m_resolutionRenderCalls)); - memcpy(&m_resolutionViewportCalls, &(NxFps -> viewportCalls), sizeof(m_resolutionViewportCalls)); - } else { - memset(&m_resolutionRenderCalls, 0, sizeof(m_resolutionRenderCalls)); - memset(&m_resolutionViewportCalls, 0, sizeof(m_resolutionViewportCalls)); - } - qsort(m_resolutionRenderCalls, 8, sizeof(resolutionCalls), compare); - qsort(m_resolutionViewportCalls, 8, sizeof(resolutionCalls), compare); - memset(&m_resolutionOutput, 0, sizeof(m_resolutionOutput)); - size_t out_iter = 0; - bool found = false; - for (size_t i = 0; i < 8; i++) { - for (size_t x = 0; x < 8; x++) { - if (m_resolutionRenderCalls[i].width == 0) { - break; - } - if ((m_resolutionRenderCalls[i].width == m_resolutionViewportCalls[x].width) && (m_resolutionRenderCalls[i].height == m_resolutionViewportCalls[x].height)) { - m_resolutionOutput[out_iter].width = m_resolutionRenderCalls[i].width; - m_resolutionOutput[out_iter].height = m_resolutionRenderCalls[i].height; - m_resolutionOutput[out_iter].calls = (m_resolutionRenderCalls[i].calls > m_resolutionViewportCalls[x].calls) ? m_resolutionRenderCalls[i].calls : m_resolutionViewportCalls[x].calls; - out_iter++; - found = true; - break; - } - } - if (!found && m_resolutionRenderCalls[i].width != 0) { - m_resolutionOutput[out_iter].width = m_resolutionRenderCalls[i].width; - m_resolutionOutput[out_iter].height = m_resolutionRenderCalls[i].height; - m_resolutionOutput[out_iter].calls = m_resolutionRenderCalls[i].calls; - out_iter++; - } - found = false; - if (out_iter == 8) break; - } - if (out_iter < 8) { - const size_t out_iter_s = out_iter; - for (size_t x = 0; x < 8; x++) { - for (size_t y = 0; y < out_iter_s; y++) { - if (m_resolutionViewportCalls[x].width == 0) { - break; - } - if ((m_resolutionViewportCalls[x].width == m_resolutionOutput[y].width) && (m_resolutionViewportCalls[x].height == m_resolutionOutput[y].height)) { - found = true; - break; - } - } - if (!found && m_resolutionViewportCalls[x].width != 0) { - m_resolutionOutput[out_iter].width = m_resolutionViewportCalls[x].width; - m_resolutionOutput[out_iter].height = m_resolutionViewportCalls[x].height; - m_resolutionOutput[out_iter].calls = m_resolutionViewportCalls[x].calls; - out_iter++; - } - found = false; - if (out_iter == 8) break; - } - } - qsort(m_resolutionOutput, 8, sizeof(resolutionCalls), compare); - static std::pair old_res[2]; - - // Only swap if BOTH resolutions exist (prevent swapping with empty slot) - if (m_resolutionOutput[0].width && m_resolutionOutput[1].width) { - if ((m_resolutionOutput[0].width == old_res[1].first && m_resolutionOutput[0].height == old_res[1].second) || - (m_resolutionOutput[1].width == old_res[0].first && m_resolutionOutput[1].height == old_res[0].second)) { - const uint16_t swap_width = m_resolutionOutput[0].width; - const uint16_t swap_height = m_resolutionOutput[0].height; - m_resolutionOutput[0].width = m_resolutionOutput[1].width; - m_resolutionOutput[0].height = m_resolutionOutput[1].height; - m_resolutionOutput[1].width = swap_width; - m_resolutionOutput[1].height = swap_height; - } - } - - //if (!m_resolutionOutput[1].width) { - // snprintf(Resolutions_c, sizeof(Resolutions_c), "%dx%d", m_resolutionOutput[0].width, m_resolutionOutput[0].height); - //} - //else { - // snprintf(Resolutions_c, sizeof(Resolutions_c), "%dx%d%dx%d", m_resolutionOutput[0].width, m_resolutionOutput[0].height, m_resolutionOutput[1].width, m_resolutionOutput[1].height); - //} - - if (!m_resolutionOutput[1].width || !m_resolutionOutput[0].width) { - if (!m_resolutionOutput[1].width) - snprintf(Resolutions_c, sizeof(Resolutions_c), "%dx%d", m_resolutionOutput[0].width, m_resolutionOutput[0].height); - else snprintf(Resolutions_c, sizeof(Resolutions_c), "%dx%d", m_resolutionOutput[1].width, m_resolutionOutput[1].height); - } - else snprintf(Resolutions_c, sizeof(Resolutions_c),"%dx%d%dx%d", m_resolutionOutput[0].width, m_resolutionOutput[0].height, m_resolutionOutput[1].width, m_resolutionOutput[1].height); - - old_res[0] = std::make_pair(m_resolutionOutput[0].width, m_resolutionOutput[0].height); - old_res[1] = std::make_pair(m_resolutionOutput[1].width, m_resolutionOutput[1].height); - } - if (settings.showRDSD == true && GameRunning && NxFps) { - if ((NxFps -> readSpeedPerSecond) != 0.f) snprintf(readSpeed_c, sizeof(readSpeed_c), "%.2f MiB/s", (NxFps -> readSpeedPerSecond) / 1048576.f); - else snprintf(readSpeed_c, sizeof(readSpeed_c), "n/d"); - } - } - else if (!GameRunning && resolutionLookup != 0) { - resolutionLookup = 0; - } - - mutexUnlock(&mutex_Misc); - - /* ── Battery / power draw ───────────────────────────────────── */ - char remainingBatteryLife[8]; - - /* Normalise "-0.00" → "0.00" W */ - const float drawW = (fabsf(PowerConsumption) < 0.01f) ? 0.0f - : PowerConsumption; - - mutexLock(&mutex_BatteryChecker); - - /* keep "--:--" whenever estimate is negative */ - if (batTimeEstimate >= 0 && !(drawW <= 0.01f && drawW >= -0.01f)) { - snprintf(remainingBatteryLife, sizeof(remainingBatteryLife), - "%d:%02d", batTimeEstimate / 60, batTimeEstimate % 60); - } else { - strcpy(remainingBatteryLife, "--:--"); - } - - const float batteryPercent = (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f; - - snprintf(BatteryDraw_c, sizeof(BatteryDraw_c), - "%.2f W%.0f%% [%s]", - drawW, - batteryPercent, - remainingBatteryLife); - - mutexUnlock(&mutex_BatteryChecker); - - if (!skipOnce) { - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (isKeyComboPressed(keysHeld, keysDown)) { - isRendering = false; - leventSignal(&renderingStopEvent); - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - skipOnce = true; - runOnce = true; - TeslaFPS = 60; - lastSelectedItem = "Full"; - lastMode = ""; - tsl::swapTo(); - return true; - } - return false; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Micro.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Micro.hpp deleted file mode 100644 index 9c999d13..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Micro.hpp +++ /dev/null @@ -1,1300 +0,0 @@ -class MainMenu; - -class MicroOverlay : public tsl::Gui { -private: - char GPU_Load_c[32]; - char RAM_var_compressed_c[128]; - char CPU_compressed_c[160]; - char CPU_Usage0[32]; - char CPU_Usage1[32]; - char CPU_Usage2[32]; - char CPU_Usage3[32]; - char CPU_UsageM[32]; - char soc_temperature_c[32]; - char skin_temperature_c[32]; - char FPS_var_compressed_c[64]; - char Battery_c[32]; - char CPU_volt_c[16]; - char GPU_volt_c[16]; - char RAM_volt_c[32]; - char SOC_volt_c[16]; - char CPU_temp_c[32]; - char GPU_temp_c[32]; - char RAM_temp_c[32]; - char RES_var_compressed_c[32]; - char READ_var_compressed_c[32]; - char DTC_c[32]; - - static constexpr uint32_t margin = 4; - - // Performance optimization members - bool Initialized = false; - MicroSettings settings; - size_t text_width = 0; - size_t fps_width = 0; - ApmPerformanceMode performanceMode = ApmPerformanceMode_Invalid; - size_t fontsize = 0; - bool showFPS = false; - uint64_t systemtickfrequency_impl = systemtickfrequency; - - // Pre-compiled render data structures - struct RenderItem { - uint8_t type; - const char* label; - const char* data_ptr; - const char* volt_ptr; - bool has_voltage; - }; - - // Resolution tracking - resolutionCalls m_resolutionRenderCalls[8] = {0}; - resolutionCalls m_resolutionViewportCalls[8] = {0}; - resolutionCalls m_resolutionOutput[8] = {0}; - uint8_t resolutionLookup = 0; - bool resolutionShow = false; - - std::vector renderItems; - uint32_t cachedMargin = 0; - tsl::Color catColorA = 0; - tsl::Color textColorA = 0; - uint32_t base_y = 0; - bool renderDataDirty = true; - - bool skipOnce = true; - bool runOnce = true; - - // Fixed spacing system - calculate actual widths at render time - struct LayoutMetrics { - uint32_t label_data_gap = 8; // Fixed gap between label and data - uint32_t volt_separator_gap = 0; // Fixed gap before voltage separator - uint32_t volt_data_gap = 0; // Fixed gap after voltage separator - uint32_t item_spacing = 16; // Minimum spacing between complete items - uint32_t side_margin = 3; // Margins on left and right - bool calculated = false; - } layout; - - // Lookup table for difference symbols - static constexpr const char* diffSymbols[4] = {"△", "@", "▽", "≠"}; - - inline const char* getDifferenceSymbol(int32_t delta) { - if (delta > 20000) return diffSymbols[0]; // △ - if (delta > -20000) return diffSymbols[1]; // @ - if (delta < -50000) return diffSymbols[3]; // ≠ - return diffSymbols[2]; // ▽ - } - - void calculateLayoutMetrics(tsl::gfx::Renderer *renderer) { - if (layout.calculated) return; - - // Use font size to determine appropriate spacing - if (fontsize <= 16) { - layout.label_data_gap = 6; - layout.volt_separator_gap = 0; - layout.volt_data_gap = 0; - layout.item_spacing = 12; - } else if (fontsize <= 20) { - layout.label_data_gap = 8; - layout.volt_separator_gap = 0; - layout.volt_data_gap = 0; - layout.item_spacing = 16; - } else { - layout.label_data_gap = 10; - layout.volt_separator_gap = 0; - layout.volt_data_gap = 0; - layout.item_spacing = 20; - } - - layout.calculated = true; - } - -public: - MicroOverlay() { - CPU_temp_c[0] = '\0'; - GPU_temp_c[0] = '\0'; - RAM_temp_c[0] = '\0'; - - tsl::hlp::requestForeground(false); - disableJumpTo = true; - //tsl::initializeUltrahandSettings(); - GetConfigSettings(&settings); - apmGetPerformanceMode(&performanceMode); - if (performanceMode == ApmPerformanceMode_Normal) { - fontsize = settings.handheldFontSize; - } - else fontsize = settings.dockedFontSize; - - if (ult::limitedMemory && settings.setPosBottom) { - const auto [horizontalUnderscanPixels, verticalUnderscanPixels] = tsl::gfx::getUnderscanPixels(); - tsl::gfx::Renderer::get().setLayerPos(0, !verticalUnderscanPixels ? 1038 : 1038- (tsl::cfg::ScreenHeight/720. * verticalUnderscanPixels) +0.5); - } - - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().removeScreenshotStacks(); - } - mutexInit(&mutex_BatteryChecker); - mutexInit(&mutex_Misc); - TeslaFPS = settings.refreshRate; - systemtickfrequency_impl /= settings.refreshRate; - FullMode = false; - //alphabackground = 0x0; - deactivateOriginalFooter = true; - StartThreads(); - - // Pre-allocate render items vector - //renderItems.reserve(8); - realVoltsPolling = settings.realVolts; - - // Get initial battery readings BEFORE starting threads - if (R_SUCCEEDED(psmCheck) && R_SUCCEEDED(i2cCheck)) { - uint16_t data = 0; - float tempA = 0.0; - - // Get initial power consumption - Max17050ReadReg(MAX17050_AvgCurrent, &data); - tempA = (1.5625 / (max17050SenseResistor * max17050CGain)) * (s16)data; - PowerConsumption = tempA * batVoltageAvg / 1000000.0; // Rough initial estimate - - // Get initial battery info - psmGetBatteryChargeInfoFields(psmService, &_batteryChargeInfoFields); - - // Get initial time estimate - if (tempA >= 0) { - batTimeEstimate = -1; - } else { - Max17050ReadReg(MAX17050_TTE, &data); - const float batteryTimeEstimateInMinutes = (5.625 * data) / 60; - if (batteryTimeEstimateInMinutes > (99.0*60.0)+59.0) { - batTimeEstimate = (99*60)+59; - } else { - batTimeEstimate = (int16_t)batteryTimeEstimateInMinutes; - } - } - } else { - // Fallback if checks failed - PowerConsumption = 0.0f; - batTimeEstimate = -1; - _batteryChargeInfoFields = {0}; - } - - // Now format the initial Battery_c string - char remainingBatteryLife[8]; - const float drawW = (fabsf(PowerConsumption) < 0.01f) ? 0.0f : PowerConsumption; - - if (batTimeEstimate >= 0 && !(drawW <= 0.01f && drawW >= -0.01f)) { - snprintf(remainingBatteryLife, sizeof(remainingBatteryLife), - "%d:%02d", batTimeEstimate / 60, batTimeEstimate % 60); - } else { - strcpy(remainingBatteryLife, "--:--"); - } - - if (!settings.invertBatteryDisplay) { - snprintf(Battery_c, sizeof(Battery_c), - "%.2f W%.1f%% [%s]", - drawW, - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife); - } else { - snprintf(Battery_c, sizeof(Battery_c), - "%.1f%% [%s]%.2f W", - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife, - drawW); - } - - - } - - ~MicroOverlay() { - CloseThreads(); - fixForeground = true; - FullMode = true; - } - - // Fast parsing and render item preparation - void prepareRenderItems() { - if (!renderDataDirty) return; - - renderItems.clear(); - - // Fast manual parsing of settings.show - const std::string& show = settings.show; - size_t start = 0, end = 0; - uint8_t seen_flags = 0; - - static size_t len; - static uint32_t key3; - while (start < show.length()) { - end = show.find('+', start); - if (end == std::string::npos) end = show.length(); - - len = end - start; - if (len >= 3) { - const char* key = &show[start]; - - // Use first 3 chars for fast comparison - key3 = (key[0] << 16) | (key[1] << 8) | key[2]; - - switch (key3) { - case 0x435055: // "CPU" - if (!(seen_flags & 1)) { - renderItems.push_back({0, "CPU", CPU_compressed_c, CPU_volt_c, settings.realVolts}); - seen_flags |= 1; - } - break; - case 0x475055: // "GPU" - if (!(seen_flags & 2)) { - renderItems.push_back({1, "GPU", GPU_Load_c, GPU_volt_c, settings.realVolts}); - seen_flags |= 2; - } - break; - case 0x52414D: // "RAM" - if (!(seen_flags & 4)) { - renderItems.push_back({2, "RAM", RAM_var_compressed_c, RAM_volt_c, settings.realVolts}); - seen_flags |= 4; - } - break; - case 0x534F43: // "SOC" - if (!(seen_flags & 8)) { - renderItems.push_back({3, "SOC", soc_temperature_c, SOC_volt_c, settings.realVolts && settings.showSOCVoltage}); - seen_flags |= 8; - } - break; - case 0x544D50: // "TMP" - if (!(seen_flags & 16)) { - renderItems.push_back({4, "TMP", skin_temperature_c, SOC_volt_c, settings.realVolts && settings.showSOCVoltage}); - seen_flags |= 16; - } - break; - case 0x524553: // "RES" - if (!(seen_flags & 128)) { - renderItems.push_back({7, "RES", RES_var_compressed_c, nullptr, false}); // We'll reuse FPS buffer temporarily - seen_flags |= 128; - resolutionShow = true; - } - break; - case 0x465053: // "FPS" - if (!(seen_flags & 32)) { - renderItems.push_back({5, "FPS", FPS_var_compressed_c, nullptr, false}); - seen_flags |= 32; - } - break; - case 0x424154: // "BAT" - if (!(seen_flags & 64)) { - renderItems.push_back({6, "BAT", Battery_c, nullptr, false}); - seen_flags |= 64; - } - break; - case 0x524541: // "REA" (for READ) - if (len >= 4 && key[3] == 'D' && !(seen_flags & 512)) { - renderItems.push_back({9, "READ", READ_var_compressed_c, nullptr, false}); - seen_flags |= 512; - } - break; - case 0x445443: // "DTC" - if (!(seen_flags & 256) && settings.showDTC) { - renderItems.push_back({8, settings.useDTCSymbol ? "\uE007" : "DTC", DTC_c, nullptr, false}); - seen_flags |= 256; - } - break; - } - } - start = end + 1; - } - - renderDataDirty = false; - } - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - cachedMargin = renderer->getTextDimensions("CPUGPURAMSOCBAT[]", false, fontsize).second; - if (!Initialized) { - //cachedMargin = renderer->drawString(" ", false, 0, 0, fontsize, renderer->a(0x0000)).first; - - catColorA = settings.catColor; - textColorA = settings.textColor; - base_y = settings.setPosBottom ? - tsl::cfg::FramebufferHeight - (fontsize + (fontsize / 4)) +1: 0; - Initialized = true; - renderDataDirty = true; - layout.calculated = false; // Force recalculation - tsl::hlp::requestForeground(false); - } - - //renderer->drawRect(0, 0, tsl::cfg::FramebufferWidth, cachedMargin + 4, a(settings.backgroundColor)); - renderer->drawRect(0, settings.setPosBottom ? base_y-1 : 0, tsl::cfg::FramebufferWidth, cachedMargin + 4, a(settings.backgroundColor)); - - // Prepare render items if settings changed - prepareRenderItems(); - calculateLayoutMetrics(renderer); - - // Separate battery from other items - std::vector main_items; - //RenderItem* battery_item = nullptr; - - for (auto& item : renderItems) { - //if (item.type == 6) { // BAT - // battery_item = &item; - if (item.type == 5 && (!GameRunning || (strcmp(FPS_var_compressed_c, "254.0") == 0))) { - // Skip FPS if no game running - continue; - } else if (item.type == 7 && (!GameRunning || !m_resolutionOutput[0].width)) { - // Skip RES if no game running or no resolution data yet - continue; - } else if (item.type == 8 && !settings.showDTC) { - // Skip DTC if disabled in settings - continue; - } else if (item.type == 9 && (!GameRunning || !NxFps)) { - // Skip READ if no game running or no NxFps available - continue; - } else { - main_items.push_back(item); - } - } - - // Calculate actual widths for all main items - struct ItemLayout { - uint32_t label_width; - uint32_t data_width; - uint32_t volt_width; - uint32_t total_width; - }; - - std::vector item_layouts; - uint32_t total_main_width = 0; - - static const auto sep_width = renderer->getTextDimensions("", false, fontsize).first; - - static ItemLayout item_layout; - for (const auto& item : main_items) { - item_layout = {}; - - // Calculate actual label width - //auto label_dim = renderer->drawString(item.label, false, 0, 0, fontsize, renderer->a(0x0000)); - //auto label_dim = renderer->getTextDimensions(item.label, fontsize); - item_layout.label_width = renderer->getTextDimensions(item.label, false, fontsize).first; - - // Calculate actual data width - //auto data_dim = renderer->drawString(item.data_ptr, false, 0, 0, fontsize, renderer->a(0x0000)); - //auto data_dim = renderer->getTextDimensions(item.data_ptr, fontsize); - item_layout.data_width = renderer->getTextDimensions(item.data_ptr, false, fontsize).first; - - // Calculate voltage width if present - if (item.has_voltage && item.volt_ptr) { - //uto volt_dim = renderer->drawString(item.volt_ptr, false, 0, 0, fontsize, renderer->a(0x0000)); - //auto volt_dim = renderer->getTextDimensions(item.volt_ptr, fontsize); - item_layout.volt_width = renderer->getTextDimensions(item.volt_ptr, false, fontsize).first; - - // Total: label + gap + data + gap + "|" + gap + voltage - //auto sep_width = renderer->drawString("", false, 0, 0, fontsize, renderer->a(0x0000)); - item_layout.total_width = item_layout.label_width + layout.label_data_gap + - item_layout.data_width + layout.volt_separator_gap + - sep_width + layout.volt_data_gap + item_layout.volt_width; - } else { - // Total: label + gap + data - item_layout.total_width = item_layout.label_width + layout.label_data_gap + item_layout.data_width; - } - - item_layouts.push_back(item_layout); - total_main_width += item_layout.total_width; - } - - - - // Determine if we have battery and handle it as the rightmost item - std::vector all_items_ordered; - std::vector all_layouts_ordered; - - // Add main items first - for (size_t i = 0; i < main_items.size(); i++) { - all_items_ordered.push_back(main_items[i]); - all_layouts_ordered.push_back(item_layouts[i]); - } - - // Add battery as the last item if present - //if (battery_item) { - // //auto bat_label_dim = renderer->drawString("BAT", false, 0, 0, fontsize, renderer->a(0x0000)); - // //auto bat_label_dim = renderer->getTextDimensions("BAT", fontsize); - // //auto bat_data_dim = renderer->drawString(battery_item->data_ptr, false, 0, 0, fontsize, renderer->a(0x0000)); - // //auto bat_data_dim = renderer->getTextDimensions(battery_item->data_ptr, fontsize); - // - // ItemLayout battery_layout = {}; - // battery_layout.label_width = renderer->getTextDimensions("BAT", false, fontsize).first; - // battery_layout.data_width = renderer->getTextDimensions(battery_item->data_ptr, false, fontsize).first; - // battery_layout.volt_width = 0; - // battery_layout.total_width = battery_layout.label_width + layout.label_data_gap + battery_layout.data_width; - // - // all_items_ordered.push_back(*battery_item); - // all_layouts_ordered.push_back(battery_layout); - //} - - // Calculate total width of all items - uint32_t total_all_width = 0; - for (const auto& item_layout : all_layouts_ordered) { - total_all_width += item_layout.total_width; - } - - // Calculate available space for distribution - //uint32_t available_width = tsl::cfg::FramebufferWidth - (2 * layout.side_margin); - //uint32_t remaining_space = available_width - total_all_width; - - // Calculate positions based on alignment mode - std::vector item_positions; - const size_t N = all_items_ordered.size(); - if (N == 0) return; - - if (N == 1) { - // Single item positioning based on alignment - if (settings.alignTo == 2) { // RIGHT - const uint32_t total_width = all_layouts_ordered[0].total_width; - item_positions.push_back(tsl::cfg::FramebufferWidth - layout.side_margin - total_width); - } else { // LEFT or CENTER - item_positions.push_back(layout.side_margin); - } - } else { - uint32_t total_widths = 0; - for (const auto& layout : all_layouts_ordered) { - total_widths += layout.total_width; - } - - if (settings.alignTo == 0) { // LEFT alignment - // All items except last positioned from left with small gaps - // Last item (battery if present) positioned at far right - const uint32_t small_gap = layout.item_spacing; - - // Position items from left - uint32_t current_x = layout.side_margin; - for (size_t i = 0; i < N - 1; ++i) { - item_positions.push_back(current_x); - current_x += all_layouts_ordered[i].total_width + small_gap; - } - - // Position last item at far right - const uint32_t last_width = all_layouts_ordered[N-1].total_width; - item_positions.push_back(tsl::cfg::FramebufferWidth - layout.side_margin - last_width); - - } else if (settings.alignTo == 2) { // RIGHT alignment - // First item at far left, remaining items packed at right - const uint32_t small_gap = layout.item_spacing; - - // Resize vector to hold all positions - item_positions.resize(N); - - // Position first item at far left - item_positions[0] = layout.side_margin; - - // Calculate total width of items 1 to N-1 plus gaps between them - uint32_t right_group_width = 0; - for (size_t i = 1; i < N; ++i) { - right_group_width += all_layouts_ordered[i].total_width; - if (i < N - 1) right_group_width += small_gap; // Gap after each item except the last - } - - // Start positioning from right margin minus total width of right group - uint32_t current_x = tsl::cfg::FramebufferWidth - layout.side_margin - right_group_width; - - // Position items 1 to N-1 sequentially from left to right within the right group - for (size_t i = 1; i < N; ++i) { - item_positions[i] = current_x; - current_x += all_layouts_ordered[i].total_width + small_gap; - } - } else { // CENTER alignment (default behavior) - // Total available width for spacing = framebuffer width minus total item widths minus margins - const int32_t total_spacing = (int32_t)tsl::cfg::FramebufferWidth - (2 * (int32_t)layout.side_margin) - (int32_t)total_widths; - - // Number of gaps between items is N-1 - const uint32_t gap = total_spacing > 0 ? (uint32_t)(total_spacing / (N - 1)) : 0; - - // Position first item flush left - item_positions.push_back(layout.side_margin); - static uint32_t prev_pos, prev_width; - // Position subsequent items - for (size_t i = 1; i < N; ++i) { - prev_pos = item_positions[i - 1]; - prev_width = all_layouts_ordered[i - 1].total_width; - item_positions.push_back(prev_pos + prev_width + gap); - } - - // Fix any rounding error for center alignment - const int32_t last_item_end = item_positions.back() + all_layouts_ordered.back().total_width; - const int32_t overflow = (int32_t)tsl::cfg::FramebufferWidth - layout.side_margin - last_item_end; - - if (overflow != 0) { - for (size_t i = 1; i < item_positions.size(); ++i) { - item_positions[i] += overflow; - } - } - } - } - - - uint32_t current_x; - static std::vector specialChars = {""}; - - // Render all items at calculated positions - for (size_t i = 0; i < all_items_ordered.size(); i++) { - const auto& item = all_items_ordered[i]; - const auto& item_layout = all_layouts_ordered[i]; - current_x = item_positions[i]; - - // Draw label - renderer->drawString(item.label, false, current_x, base_y + cachedMargin, fontsize, catColorA); - current_x += item_layout.label_width + layout.label_data_gap; - - // Draw data - //renderer->drawString(item.data_ptr, false, current_x, base_y + fontsize, fontsize, textColorA); - - if (settings.useDynamicColors) { - // Draw data with temperature gradient support - if (item.type == 0) { // CPU - std::string dataStr(item.data_ptr); - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos && settings.realTemps && realCPU_Temp != 0) { - size_t tempStart = dataStr.rfind(' ', degreesPos); - if (tempStart != std::string::npos) { - tempStart++; - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; - - const std::string preTempPart = dataStr.substr(0, tempStart); - const std::string tempPart = dataStr.substr(tempStart, tempEnd - tempStart); - const std::string postTempPart = dataStr.substr(tempEnd); - - const float temp = realCPU_Temp / 1000.0f; - const tsl::Color tempColor = tsl::GradientColor(temp); - - uint32_t renderX = current_x; - if (!preTempPart.empty()) { - renderer->drawStringWithColoredSections(preTempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - renderX += renderer->getTextDimensions(preTempPart, false, fontsize).first; - } - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, tempColor, a(settings.separatorColor)); - - if (!postTempPart.empty()) { - renderX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(postTempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - - } else if (item.type == 1) { // GPU - std::string dataStr(item.data_ptr); - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos && settings.realTemps && realGPU_Temp != 0) { - size_t tempStart = dataStr.rfind(' ', degreesPos); - if (tempStart != std::string::npos) { - tempStart++; - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; - - const std::string preTempPart = dataStr.substr(0, tempStart); - const std::string tempPart = dataStr.substr(tempStart, tempEnd - tempStart); - const std::string postTempPart = dataStr.substr(tempEnd); - - const float temp = realGPU_Temp / 1000.0f; - const tsl::Color tempColor = tsl::GradientColor(temp); - - uint32_t renderX = current_x; - if (!preTempPart.empty()) { - renderer->drawStringWithColoredSections(preTempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - renderX += renderer->getTextDimensions(preTempPart, false, fontsize).first; - } - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, tempColor, a(settings.separatorColor)); - - if (!postTempPart.empty()) { - renderX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(postTempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - - } else if (item.type == 2) { // RAM - std::string dataStr(item.data_ptr); - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos && settings.realTemps && realRAM_Temp != 0) { - size_t tempStart = dataStr.rfind(' ', degreesPos); - if (tempStart != std::string::npos) { - tempStart++; - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; - - const std::string preTempPart = dataStr.substr(0, tempStart); - const std::string tempPart = dataStr.substr(tempStart, tempEnd - tempStart); - const std::string postTempPart = dataStr.substr(tempEnd); - - const float temp = realRAM_Temp / 1000.0f; - const tsl::Color tempColor = tsl::GradientColor(temp); - - uint32_t renderX = current_x; - if (!preTempPart.empty()) { - renderer->drawStringWithColoredSections(preTempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - renderX += renderer->getTextDimensions(preTempPart, false, fontsize).first; - } - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, tempColor, a(settings.separatorColor)); - - if (!postTempPart.empty()) { - renderX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(postTempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - - } else if (item.type == 3) { // SOC temperature - // Parse SOC temperature: "XX°C (XX%)" - std::string dataStr(item.data_ptr); - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos) { - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; // Include the 'C' - - // Extract temperature value and apply gradient - const int temp = atoi(item.data_ptr); - const tsl::Color tempColor = tsl::GradientColor((float)temp); - - // Split into temperature part and remaining part - const std::string tempPart = dataStr.substr(0, tempEnd); - const std::string restPart = dataStr.substr(tempEnd); - - // Render temperature with gradient color - renderer->drawString(tempPart, false, current_x, base_y + cachedMargin, fontsize, tempColor); - - // Render remaining text with normal color - if (!restPart.empty()) { - const uint32_t tempPartWidth = renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(restPart, false, specialChars, current_x + tempPartWidth, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - // Fallback: render normally - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - // Fallback: render normally - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - - } else if (item.type == 4) { // TMP multiple temperatures - // Parse TMP temperatures: "XX°C XX°C XX°C (XX%)" - std::string dataStr(item.data_ptr); - uint32_t renderX = current_x; - size_t pos = 0; - bool parseSuccess = true; - - // Parse up to 3 temperatures - for (int tempCount = 0; tempCount < 3 && parseSuccess && pos < dataStr.length(); tempCount++) { - // Skip any leading spaces - while (pos < dataStr.length() && dataStr[pos] == ' ') { - renderer->drawString(" ", false, renderX, base_y + cachedMargin, fontsize, textColorA); - renderX += renderer->getTextDimensions(" ", false, fontsize).first; - pos++; - } - - if (pos >= dataStr.length()) break; - - // Find degrees symbol - const size_t degreesPos = dataStr.find("°", pos); - if (degreesPos == std::string::npos) { - parseSuccess = false; - break; - } - - // Find 'C' after degrees symbol - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos == std::string::npos) { - parseSuccess = false; - break; - } - - const size_t tempEnd = cPos + 1; // Include the 'C' - - // Extract and render temperature with gradient - const std::string tempPart = dataStr.substr(pos, tempEnd - pos); - const int temp = atoi(tempPart.c_str()); - const tsl::Color tempColor = tsl::GradientColor((float)temp); - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, tempColor, a(settings.separatorColor)); - renderX += renderer->getTextDimensions(tempPart, false, fontsize).first; - - pos = tempEnd; - } - - // Render any remaining text (like " (50%)") - if (pos < dataStr.length()) { - const std::string restPart = dataStr.substr(pos); - renderer->drawStringWithColoredSections(restPart, false, specialChars, renderX, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - - // If parsing failed, fall back to normal rendering - if (!parseSuccess) { - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - - } else { - // Normal rendering for all other item types - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } else { - // Normal rendering for all other item types - renderer->drawStringWithColoredSections(item.data_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - current_x += item_layout.data_width; - - // Draw voltage if present - if (item.has_voltage && item.volt_ptr) { - current_x += layout.volt_separator_gap; - renderer->drawString("", false, current_x, base_y + cachedMargin, fontsize, a(settings.separatorColor)); - //auto sep_width = renderer->drawString("", false, 0, 0, fontsize, renderer->a(0x0000)); - //auto sep_width = renderer->getTextDimensions("", fontsize); - current_x += sep_width + layout.volt_data_gap; - renderer->drawStringWithColoredSections(item.volt_ptr, false, specialChars, current_x, base_y + cachedMargin, fontsize, textColorA, a(settings.separatorColor)); - } - } - }); - - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("", ""); - rootFrame->setContent(Status); - return rootFrame; - } - - virtual void update() override { - if (triggerExitNow) - return; - - if (!SaltySD) { - SaltySD = CheckPort(); - - if (SaltySD) { - LoadSharedMemory(); - //Assign NX-FPS to default core - threadCreate(&t6, CheckIfGameRunning, NULL, NULL, 0x1000, 0x38, -2); - threadStart(&t6); - } - } - - //static bool triggerExit = false; - //if (triggerExit) { - // ult::setIniFileValue( - // ult::ULTRAHAND_CONFIG_INI_PATH, - // ult::ULTRAHAND_PROJECT_NAME, - // ult::IN_OVERLAY_STR, - // ult::FALSE_STR - // ); - // tsl::setNextOverlay( - // ult::OVERLAY_PATH + "ovlmenu.ovl" - // ); - // tsl::Overlay::get()->close(); - // return; - //} - - apmGetPerformanceMode(&performanceMode); - if (performanceMode == ApmPerformanceMode_Normal) { - if (fontsize != settings.handheldFontSize) { - Initialized = false; - layout.calculated = false; // Recalculate layout for new font size - fontsize = settings.handheldFontSize; - } - } - else if (performanceMode == ApmPerformanceMode_Boost) { - if (fontsize != settings.dockedFontSize) { - Initialized = false; - layout.calculated = false; // Recalculate layout for new font size - fontsize = settings.dockedFontSize; - } - } - - // CPU usage calculations - optimized with fewer conditionals - const double inv_freq = 1.0 / systemtickfrequency_impl; - - // Capture systemtickfrequency_impl and inv_freq safely - const auto formatUsage = [this](char* buf, size_t size, uint64_t idletick, double inv_freq) { - if (idletick > systemtickfrequency_impl) { - strcpy(buf, "0%"); - } else { - snprintf(buf, size, "%.0f%%", (1.0 - (idletick * inv_freq)) * 100.0); - } - }; - - // Atomically load idle ticks before using them - const uint64_t idle0 = idletick0.load(std::memory_order_acquire); - const uint64_t idle1 = idletick1.load(std::memory_order_acquire); - const uint64_t idle2 = idletick2.load(std::memory_order_acquire); - const uint64_t idle3 = idletick3.load(std::memory_order_acquire); - - formatUsage(CPU_Usage0, sizeof(CPU_Usage0), idle0, inv_freq); - formatUsage(CPU_Usage1, sizeof(CPU_Usage1), idle1, inv_freq); - formatUsage(CPU_Usage2, sizeof(CPU_Usage2), idle2, inv_freq); - formatUsage(CPU_Usage3, sizeof(CPU_Usage3), idle3, inv_freq); - - mutexLock(&mutex_Misc); - - // CPU frequency and voltage - const char* cpuDiff = "@"; - if (realCPU_Hz) { - const int32_t deltaCPU = (int32_t)(realCPU_Hz / 1000) - (CPU_Hz / 1000); - cpuDiff = getDifferenceSymbol(deltaCPU); - } - - const uint32_t cpuFreq = settings.realFrequencies && realCPU_Hz ? realCPU_Hz : CPU_Hz; - - if (settings.showFullCPU) { - snprintf(CPU_compressed_c, sizeof(CPU_compressed_c), - "[%s,%s,%s,%s]%s%u.%u", - CPU_Usage0, CPU_Usage1, CPU_Usage2, CPU_Usage3, - cpuDiff, cpuFreq / 1000000, (cpuFreq / 100000) % 10); - } else { - // Find max CPU usage across all cores - const auto extractUsage = [](const char* usage_str) -> double { - return strtod(usage_str, nullptr); - }; - - const double usage0 = extractUsage(CPU_Usage0); - const double usage1 = extractUsage(CPU_Usage1); - const double usage2 = extractUsage(CPU_Usage2); - const double usage3 = extractUsage(CPU_Usage3); - - const double maxUsage = std::max({usage0, usage1, usage2, usage3}); - - snprintf(CPU_compressed_c, sizeof(CPU_compressed_c), - "%.0f%%%s%u.%u", - maxUsage, cpuDiff, cpuFreq / 1000000, (cpuFreq / 100000) % 10); - } - - if (settings.realTemps && realCPU_Temp != 0 && CPU_temp_c[0] != '\0') { - char temp_buffer[48]; - snprintf(temp_buffer, sizeof(temp_buffer), " %s", CPU_temp_c); - strncat(CPU_compressed_c, temp_buffer, sizeof(CPU_compressed_c) - strlen(CPU_compressed_c) - 1); - } - - //if (settings.realVolts) { - // snprintf(CPU_volt_c, sizeof(CPU_volt_c), "%u.%u mV", - // realCPU_mV/1000, (isMariko ? (realCPU_mV/100)%10 : (realCPU_mV/10)%100)); - //} - - /* ── CPU voltage ───────────────────────────── */ - if (settings.realVolts) { - const uint32_t mv = realCPU_mV / 1000; // µV → mV - snprintf(CPU_volt_c, sizeof(CPU_volt_c), "%u mV", mv); - } - - // GPU frequency and voltage - const char* gpuDiff = "@"; - if (realGPU_Hz) { - const int32_t deltaGPU = (int32_t)(realGPU_Hz / 1000) - (GPU_Hz / 1000); - gpuDiff = getDifferenceSymbol(deltaGPU); - } - - const uint32_t gpuFreq = settings.realFrequencies && realGPU_Hz ? realGPU_Hz : GPU_Hz; - snprintf(GPU_Load_c, sizeof(GPU_Load_c), - "%u%%%s%u.%u", - GPU_Load_u / 10, - gpuDiff, gpuFreq / 1000000, (gpuFreq / 100000) % 10); - - if (settings.realTemps && realGPU_Temp != 0 && GPU_temp_c[0] != '\0') { - char temp_buffer[48]; - snprintf(temp_buffer, sizeof(temp_buffer), " %s", GPU_temp_c); - strncat(GPU_Load_c, temp_buffer, sizeof(GPU_Load_c) - strlen(GPU_Load_c) - 1); - } - - //if (settings.realVolts) { - // snprintf(GPU_volt_c, sizeof(GPU_volt_c), "%u.%u mV", - // realGPU_mV/1000, (isMariko ? (realGPU_mV/100)%10 : (realGPU_mV/10)%100)); - //} - - // For properly handling sleep exit - if (settings.sleepExit) { - const auto GPU_Hz_int = int(GPU_Hz / 1000000); - static auto lastGPU_Hz_int = GPU_Hz_int; - if (GPU_Hz_int == 0 && lastGPU_Hz_int != 0) { - isRendering = false; - leventSignal(&renderingStopEvent); - - triggerExitNow = true; - return; - } - lastGPU_Hz_int = GPU_Hz_int; - } - - - /* ── GPU voltage ───────────────────────────── */ - if (settings.realVolts) { - const uint32_t mv = realGPU_mV / 1000; - snprintf(GPU_volt_c, sizeof(GPU_volt_c), "%u mV", mv); - } - - // RAM usage and frequency - char MICRO_RAM_all_c[16]; - if (!settings.showpartLoad) { - // User wants GB display - const float RAM_Total_all_f = (RAM_Total_application_u + RAM_Total_applet_u + RAM_Total_system_u + RAM_Total_systemunsafe_u) / (1024.0f * 1024.0f * 1024.0f); - const float RAM_Used_all_f = (RAM_Used_application_u + RAM_Used_applet_u + RAM_Used_system_u + RAM_Used_systemunsafe_u) / (1024.0f * 1024.0f * 1024.0f); - snprintf(MICRO_RAM_all_c, sizeof(MICRO_RAM_all_c), "%.0f%.0fGB", RAM_Used_all_f, RAM_Total_all_f); - } else if (settings.ramInfoMode == "Bandwidth" && R_SUCCEEDED(hocclkCheck)) { - // Bandwidth mode: show GB/s from context (partLoad values are in MB/s) - const unsigned bwAll = partLoad[HocClkPartLoad_RamBWAll] / 1000; - const unsigned bwAllD = (partLoad[HocClkPartLoad_RamBWAll] % 1000) / 100; - snprintf(MICRO_RAM_all_c, sizeof(MICRO_RAM_all_c), "%u.%uGB/s", bwAll, bwAllD); - } else { - // User wants percentage display - if (R_SUCCEEDED(hocclkCheck)) { - // Use sys-clk's RAM load if available - snprintf(MICRO_RAM_all_c, sizeof(MICRO_RAM_all_c), "%hu%%", - partLoad[HocClkPartLoad_EMC] / 10); - } else { - // Calculate percentage manually when sys-clk isn't available - const uint64_t RAM_Total_all = RAM_Total_application_u + RAM_Total_applet_u + RAM_Total_system_u + RAM_Total_systemunsafe_u; - const uint64_t RAM_Used_all = RAM_Used_application_u + RAM_Used_applet_u + RAM_Used_system_u + RAM_Used_systemunsafe_u; - const unsigned partLoadPercent = (RAM_Total_all > 0) ? (unsigned)((RAM_Used_all * 100) / RAM_Total_all) : 0; - snprintf(MICRO_RAM_all_c, sizeof(MICRO_RAM_all_c), "%u%%", partLoadPercent); - } - } - - const char* ramDiff = "@"; - if (realRAM_Hz) { - const int32_t deltaRAM = (int32_t)(realRAM_Hz / 1000) - (RAM_Hz / 1000); - ramDiff = getDifferenceSymbol(deltaRAM); - } - - const uint32_t ramFreq = settings.realFrequencies && realRAM_Hz ? realRAM_Hz : RAM_Hz; - snprintf(RAM_var_compressed_c, sizeof(RAM_var_compressed_c), - "%s%s%u.%u", MICRO_RAM_all_c, ramDiff, - ramFreq / 1000000, (ramFreq / 100000) % 10); - - if (settings.realTemps && realRAM_Temp != 0 && RAM_temp_c[0] != '\0') { - char temp_buffer[48]; - snprintf(temp_buffer, sizeof(temp_buffer), " %s", RAM_temp_c); - strncat(RAM_var_compressed_c, temp_buffer, sizeof(RAM_var_compressed_c) - strlen(RAM_var_compressed_c) - 1); - } - - //if (settings.realVolts) { - // uint32_t vdd2 = realRAM_mV / 10000; - // uint32_t vddq = realRAM_mV % 10000; - // if (isMariko) { - // snprintf(RAM_volt_c, sizeof(RAM_volt_c), "%u.%u%u.%u mV", - // vdd2/10, vdd2%10, vddq/10, vddq%10); - // } else { - // snprintf(RAM_volt_c, sizeof(RAM_volt_c), "%u.%u mV", vdd2/10, vdd2%10); - // } - //} - - /* ── RAM voltage ───────────────────────────── */ - if (settings.realVolts && (settings.showVDD2 || settings.showVDDQ)) { - /* realRAM_mV packs VDD2 | VDDQ in 10-µV units * - * → split, convert to mV - */ - const float mv_vdd2 = realVDD2_mV / 1000.0f; // VDD2 - const uint32_t mv_vddq = realVDDQ_mV / 1000; // VDDQ - - // Build voltage string based on settings - RAM_volt_c[0] = '\0'; // Start with empty string - char temp_buffer[16]; - - if (settings.showVDD2) { - if (settings.decimalVDD2) { - snprintf(temp_buffer, sizeof(temp_buffer), "%.1f mV", mv_vdd2); - } else { - snprintf(temp_buffer, sizeof(temp_buffer), "%u mV", (uint32_t)mv_vdd2); - } - strcat(RAM_volt_c, temp_buffer); - } - - if (settings.showVDDQ && isMariko) { - if (RAM_volt_c[0] != '\0') { - strcat(RAM_volt_c, ""); - } - snprintf(temp_buffer, sizeof(temp_buffer), "%u mV", mv_vddq); - strcat(RAM_volt_c, temp_buffer); - } - } else { - RAM_volt_c[0] = '\0'; // Empty if voltages disabled - } - - /* ── Battery / power draw ───────────────────────────── */ - char remainingBatteryLife[8]; - - /* Normalise “-0.00” → “0.00” W */ - const float drawW = (fabsf(PowerConsumption) < 0.01f) ? 0.0f - : PowerConsumption; - - mutexLock(&mutex_BatteryChecker); - - /* show a time only when the estimate is valid **and** draw ≥ 0.01 W */ - if (batTimeEstimate >= 0 && !(drawW <= 0.01f && drawW >= -0.01f)) { - snprintf(remainingBatteryLife, sizeof remainingBatteryLife, - "%d:%02d", batTimeEstimate / 60, batTimeEstimate % 60); - } else { - strcpy(remainingBatteryLife, "--:--"); - } - - if (!settings.invertBatteryDisplay) { - snprintf(Battery_c, sizeof Battery_c, - "%.2f W%.1f%% [%s]", - drawW, - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife); - } else { - snprintf(Battery_c, sizeof Battery_c, - "%.1f%% [%s]%.2f W", - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife, - drawW); - } - - mutexUnlock(&mutex_BatteryChecker); - - - // Format current datetime for DTC - if (settings.showDTC) { - time_t rawtime = time(NULL); - struct tm *timeinfo = localtime(&rawtime); - strftime(DTC_c, sizeof(DTC_c), settings.dtcFormat.c_str(), timeinfo); - } - - // Thermal info - const int duty = safeFanDuty((int)Rotation_Duty); - - /* Integer SoC temperature + duty */ - snprintf(soc_temperature_c, sizeof soc_temperature_c, - "%d°C %d%%", - (int)SOC_temperatureF, // SoC °C, no decimals - duty); // fan % - - /* Integer SOC, PCB and skin temperatures + duty * - * skin_temperaturemiliC is in milli-degrees C → divide by 1000 */ - snprintf(skin_temperature_c, sizeof skin_temperature_c, - "%d°C %d°C %hu°C %d%%", - (int)SOC_temperatureF, // SoC - (int)PCB_temperatureF, // PCB - (uint16_t)(skin_temperaturemiliC / 1000), // skin - duty); - - //if (settings.realVolts) { - // snprintf(SOC_volt_c, sizeof(SOC_volt_c), "%u.%u mV", - // realSOC_mV/1000, (realSOC_mV/100)%10); - //} - - /* ── SoC voltage ───────────────────────────── */ - if (settings.realVolts && settings.showSOCVoltage) { - const uint32_t mv = realSOC_mV / 1000; - snprintf(SOC_volt_c, sizeof(SOC_volt_c), "%u mV", mv); - } else { - SOC_volt_c[0] = '\0'; // Clear the buffer when disabled - } - - if (settings.realTemps) { - if (realCPU_Temp != 0) { - snprintf(CPU_temp_c, sizeof(CPU_temp_c), "%u°C", static_cast(realCPU_Temp / 1000.0)); - } - if (realGPU_Temp != 0) { - snprintf(GPU_temp_c, sizeof(GPU_temp_c), "%u°C", static_cast(realGPU_Temp / 1000.0)); - } - if (realRAM_Temp != 0) { - snprintf(RAM_temp_c, sizeof(RAM_temp_c), "%u°C", static_cast(realRAM_Temp / 1000.0)); - } - } - - // Resolution processing - //char RES_var_compressed_c[32] = ""; - if (GameRunning && NxFps && resolutionShow) { - if (!resolutionLookup) { - if (NxFps && SharedMemoryUsed) { - (NxFps -> renderCalls[0].calls) = 0xFFFF; - resolutionLookup = 1; - } - } - else if (resolutionLookup == 1) { - if (NxFps && SharedMemoryUsed && (NxFps -> renderCalls[0].calls) != 0xFFFF) { - resolutionLookup = 2; - } - } - else { - if (NxFps && SharedMemoryUsed) { - memcpy(&m_resolutionRenderCalls, &(NxFps -> renderCalls), sizeof(m_resolutionRenderCalls)); - memcpy(&m_resolutionViewportCalls, &(NxFps -> viewportCalls), sizeof(m_resolutionViewportCalls)); - } else { - memset(&m_resolutionRenderCalls, 0, sizeof(m_resolutionRenderCalls)); - memset(&m_resolutionViewportCalls, 0, sizeof(m_resolutionViewportCalls)); - } - qsort(m_resolutionRenderCalls, 8, sizeof(resolutionCalls), compare); - qsort(m_resolutionViewportCalls, 8, sizeof(resolutionCalls), compare); - memset(&m_resolutionOutput, 0, sizeof(m_resolutionOutput)); - size_t out_iter = 0; - bool found = false; - for (size_t i = 0; i < 8; i++) { - for (size_t x = 0; x < 8; x++) { - if (m_resolutionRenderCalls[i].width == 0) { - break; - } - if ((m_resolutionRenderCalls[i].width == m_resolutionViewportCalls[x].width) && (m_resolutionRenderCalls[i].height == m_resolutionViewportCalls[x].height)) { - m_resolutionOutput[out_iter].width = m_resolutionRenderCalls[i].width; - m_resolutionOutput[out_iter].height = m_resolutionRenderCalls[i].height; - m_resolutionOutput[out_iter].calls = (m_resolutionRenderCalls[i].calls > m_resolutionViewportCalls[x].calls) ? m_resolutionRenderCalls[i].calls : m_resolutionViewportCalls[x].calls; - out_iter++; - found = true; - break; - } - } - if (!found && m_resolutionRenderCalls[i].width != 0) { - m_resolutionOutput[out_iter].width = m_resolutionRenderCalls[i].width; - m_resolutionOutput[out_iter].height = m_resolutionRenderCalls[i].height; - m_resolutionOutput[out_iter].calls = m_resolutionRenderCalls[i].calls; - out_iter++; - } - found = false; - if (out_iter == 8) break; - } - if (out_iter < 8) { - const size_t out_iter_s = out_iter; - for (size_t x = 0; x < 8; x++) { - for (size_t y = 0; y < out_iter_s; y++) { - if (m_resolutionViewportCalls[x].width == 0) { - break; - } - if ((m_resolutionViewportCalls[x].width == m_resolutionOutput[y].width) && (m_resolutionViewportCalls[x].height == m_resolutionOutput[y].height)) { - found = true; - break; - } - } - if (!found && m_resolutionViewportCalls[x].width != 0) { - m_resolutionOutput[out_iter].width = m_resolutionViewportCalls[x].width; - m_resolutionOutput[out_iter].height = m_resolutionViewportCalls[x].height; - m_resolutionOutput[out_iter].calls = m_resolutionViewportCalls[x].calls; - out_iter++; - } - found = false; - if (out_iter == 8) break; - } - } - qsort(m_resolutionOutput, 8, sizeof(resolutionCalls), compare); - - // Anti-flicker swap logic - static std::pair old_res[2]; - - // Only swap if BOTH resolutions exist (prevent swapping with empty slot) - if (m_resolutionOutput[0].width && m_resolutionOutput[1].width) { - if ((m_resolutionOutput[0].width == old_res[1].first && m_resolutionOutput[0].height == old_res[1].second) || - (m_resolutionOutput[1].width == old_res[0].first && m_resolutionOutput[1].height == old_res[0].second)) { - const uint16_t swap_width = m_resolutionOutput[0].width; - const uint16_t swap_height = m_resolutionOutput[0].height; - m_resolutionOutput[0].width = m_resolutionOutput[1].width; - m_resolutionOutput[0].height = m_resolutionOutput[1].height; - m_resolutionOutput[1].width = swap_width; - m_resolutionOutput[1].height = swap_height; - } - } - - // Format resolution string - if (m_resolutionOutput[0].width) { - if (settings.showFullResolution) { - if (!m_resolutionOutput[1].width) { - snprintf(RES_var_compressed_c, sizeof(RES_var_compressed_c), "%dx%d", - m_resolutionOutput[0].width, m_resolutionOutput[0].height); - } - else { - snprintf(RES_var_compressed_c, sizeof(RES_var_compressed_c), "%dx%d%dx%d", - m_resolutionOutput[0].width, m_resolutionOutput[0].height, - m_resolutionOutput[1].width, m_resolutionOutput[1].height); - } - } else { - if (!m_resolutionOutput[1].width) { - snprintf(RES_var_compressed_c, sizeof(RES_var_compressed_c), "%dp", - m_resolutionOutput[0].height); - } - else { - snprintf(RES_var_compressed_c, sizeof(RES_var_compressed_c), "%dp%dp", - m_resolutionOutput[0].height, m_resolutionOutput[1].height); - } - } - } - - // Always store current resolutions for next frame comparison - old_res[0] = std::make_pair(m_resolutionOutput[0].width, m_resolutionOutput[0].height); - old_res[1] = std::make_pair(m_resolutionOutput[1].width, m_resolutionOutput[1].height); - } - } - else if (!GameRunning && resolutionLookup != 0) { - resolutionLookup = 0; - } - - // FPS - snprintf(FPS_var_compressed_c, sizeof FPS_var_compressed_c, "%2.1f", useOldFPSavg ? FPSavg_old : FPSavg); - - - // Read Speed - if (GameRunning && NxFps && SharedMemoryUsed) { - float readSpeed = 0.0f; - memcpy(&readSpeed, &(NxFps->readSpeedPerSecond), sizeof(float)); - if (readSpeed != 0.f) { - snprintf(READ_var_compressed_c, sizeof(READ_var_compressed_c), "%.2f MiB/s", readSpeed / 1048576.f); - } else { - strcpy(READ_var_compressed_c, "n/d"); - } - } else { - strcpy(READ_var_compressed_c, "n/d"); - } - - mutexUnlock(&mutex_Misc); - - //static bool skipOnce = true; - - if (!skipOnce) { - //static bool runOnce = true; - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; // Add this to prevent repeated calls - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (isKeyComboPressed(keysHeld, keysDown)) { - isRendering = false; - leventSignal(&renderingStopEvent); - //triggerRumbleDoubleClick.store(true, std::memory_order_release); - skipOnce = true; - runOnce = true; - //TeslaFPS = 60; - if (skipMain) { - //lastSelectedItem = "Micro"; - lastMode = "returning"; - //tsl::swapTo(); - tsl::goBack(); - } - else { - tsl::setNextOverlay(filepath.c_str(), "--lastSelectedItem Micro"); - tsl::Overlay::get()->close(); - } - return true; - } - return false; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Mini.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Mini.hpp deleted file mode 100644 index 5d97ccc1..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Mini.hpp +++ /dev/null @@ -1,1853 +0,0 @@ -class MainMenu; - -class MiniOverlay : public tsl::Gui { -private: - char GPU_Load_c[32] = ""; - char Rotation_SpeedLevel_c[64] = ""; - char RAM_var_compressed_c[128] = ""; - char Battery_c[64] = ""; - char soc_temperature_c[64] = ""; - char skin_temperature_c[64] = ""; - char CPU_temp_c[32]; - char GPU_temp_c[32]; - char RAM_temp_c[32]; - - uint32_t rectangleWidth; - char Variables[512]; - size_t fontsize; - MiniSettings settings; - bool Initialized = false; - ApmPerformanceMode performanceMode = ApmPerformanceMode_Invalid; - uint64_t systemtickfrequency_impl = systemtickfrequency; - int frameOffsetX, frameOffsetY; - int topPadding, bottomPadding; - bool isDragging = false; - - bool skipOnce = true; - bool runOnce = true; - - size_t framePadding = 10; - static constexpr int screenWidth = 1280; - static constexpr int screenHeight = 720; - - struct ButtonState { - std::atomic minusDragActive{false}; - std::atomic plusDragActive{false}; - } buttonState; - - Thread touchPollThread; - std::atomic touchPollRunning{false}; -public: - MiniOverlay() { - CPU_temp_c[0] = '\0'; - GPU_temp_c[0] = '\0'; - RAM_temp_c[0] = '\0'; - - tsl::hlp::requestForeground(false); - disableJumpTo = true; - //tsl::initializeUltrahandSettings(); - PowerConsumption = 0.0f; - batTimeEstimate = -1; - strcpy(Battery_c, "-.-- W-.-% [--:--]"); // Default display - - GetConfigSettings(&settings); - apmGetPerformanceMode(&performanceMode); - if (performanceMode == ApmPerformanceMode_Normal) { - fontsize = settings.handheldFontSize; - } - else fontsize = settings.dockedFontSize; - - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().removeScreenshotStacks(); - } - mutexInit(&mutex_BatteryChecker); - mutexInit(&mutex_Misc); - //alphabackground = 0x0; - frameOffsetX = settings.frameOffsetX; - frameOffsetY = settings.frameOffsetY; - framePadding = settings.framePadding; - topPadding = 5; - bottomPadding = 2; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - - FullMode = false; - TeslaFPS = settings.refreshRate; - systemtickfrequency_impl /= settings.refreshRate; - deactivateOriginalFooter = true; - realVoltsPolling = settings.realVolts; - StartThreads(); - - // Get initial battery readings BEFORE starting threads - if (R_SUCCEEDED(psmCheck) && R_SUCCEEDED(i2cCheck)) { - uint16_t data = 0; - float tempA = 0.0; - - // Get initial power consumption - Max17050ReadReg(MAX17050_AvgCurrent, &data); - tempA = (1.5625 / (max17050SenseResistor * max17050CGain)) * (s16)data; - PowerConsumption = tempA * batVoltageAvg / 1000000.0; // Rough initial estimate - - // Get initial battery info - psmGetBatteryChargeInfoFields(psmService, &_batteryChargeInfoFields); - - // Get initial time estimate - if (tempA >= 0) { - batTimeEstimate = -1; - } else { - Max17050ReadReg(MAX17050_TTE, &data); - const float batteryTimeEstimateInMinutes = (5.625 * data) / 60; - if (batteryTimeEstimateInMinutes > (99.0*60.0)+59.0) { - batTimeEstimate = (99*60)+59; - } else { - batTimeEstimate = (int16_t)batteryTimeEstimateInMinutes; - } - } - } else { - // Fallback if checks failed - PowerConsumption = 0.0f; - batTimeEstimate = -1; - _batteryChargeInfoFields = {0}; - } - - // Now format the initial Battery_c string - char remainingBatteryLife[8]; - const float drawW = (fabsf(PowerConsumption) < 0.01f) ? 0.0f : PowerConsumption; - - if (batTimeEstimate >= 0 && !(drawW <= 0.01f && drawW >= -0.01f)) { - snprintf(remainingBatteryLife, sizeof(remainingBatteryLife), - "%d:%02d", batTimeEstimate / 60, batTimeEstimate % 60); - } else { - strcpy(remainingBatteryLife, "--:--"); - } - - if (!settings.invertBatteryDisplay) { - snprintf(Battery_c, sizeof(Battery_c), - "%.2f W%.1f%% [%s]", - drawW, - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife); - } else { - snprintf(Battery_c, sizeof(Battery_c), - "%.1f%% [%s]%.2f W", - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife, - drawW); - } - - - - - // Start touch polling thread for instant response at low FPS - touchPollRunning.store(true, std::memory_order_release); - threadCreate(&touchPollThread, [](void* arg) -> void { - MiniOverlay* overlay = static_cast(arg); - - // Allow only Player 1 and handheld mode - const HidNpadIdType id_list[2] = { HidNpadIdType_No1, HidNpadIdType_Handheld }; - - // Configure HID system to only listen to these IDs - hidSetSupportedNpadIdType(id_list, 2); - - // Configure input for up to 2 supported controllers (P1 + Handheld) - padConfigureInput(2, HidNpadStyleSet_NpadStandard | HidNpadStyleTag_NpadSystemExt); - - // Initialize separate pad states for both controllers - PadState pad_p1; - PadState pad_handheld; - padInitialize(&pad_p1, HidNpadIdType_No1); - padInitialize(&pad_handheld, HidNpadIdType_Handheld); - - u64 minusHoldStart = 0; - u64 plusHoldStart = 0; - static constexpr u64 HOLD_THRESHOLD_NS = 500'000'000ULL; - - HidTouchScreenState state = {0}; - bool inputDetected; - size_t actualEntryCount; - - while (overlay->touchPollRunning.load(std::memory_order_acquire)) { - // Only poll when rendering and not dragging - { - inputDetected = false; - - // Check touch in bounds - if (hidGetTouchScreenStates(&state, 1) && state.count > 0) { - const int touchX = state.touches[0].x; - const int touchY = state.touches[0].y; - - // Calculate bounds (same logic as handleInput) - const uint32_t margin = (overlay->fontsize * 4); - const int overlayX = overlay->frameOffsetX; - const int overlayY = overlay->frameOffsetY; - const int overlayWidth = margin + overlay->rectangleWidth + (overlay->fontsize / 3); - - // Calculate height from Variables string - actualEntryCount = 1; - for (size_t i = 0; overlay->Variables[i] != '\0'; i++) { - if (overlay->Variables[i] == '\n') { - actualEntryCount++; - } - } - const int overlayHeight = ((overlay->fontsize + overlay->settings.spacing) * actualEntryCount) + - (overlay->fontsize / 3) + overlay->settings.spacing + - overlay->topPadding + overlay->bottomPadding; - - // Add touch padding - const int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = overlayWidth + (touchPadding * 2); - const int touchableHeight = overlayHeight + (touchPadding * 2); - - // Check if touch is within bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - inputDetected = true; - } - } - - // Poll buttons from both controllers - padUpdate(&pad_p1); - padUpdate(&pad_handheld); - //const u64 keysHeld_p1 = padGetButtons(&pad_p1); - //const u64 keysHeld_handheld = padGetButtons(&pad_handheld); - - // Combine input from both controllers - const u64 keysHeld = padGetButtons(&pad_p1) | padGetButtons(&pad_handheld); - const u64 now = armTicksToNs(armGetSystemTick()); - - // Track MINUS hold duration - if ((keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK)) { - if (minusHoldStart == 0) { - minusHoldStart = now; - } - if (now - minusHoldStart >= HOLD_THRESHOLD_NS) { - // Long enough to start drag - inputDetected = true; - overlay->buttonState.minusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - // Track PLUS hold duration - else if ((keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK)) { - if (plusHoldStart == 0) { - plusHoldStart = now; - } - if (now - plusHoldStart >= HOLD_THRESHOLD_NS) { - // Long enough to start drag - inputDetected = true; - overlay->buttonState.plusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - else { - minusHoldStart = plusHoldStart = 0; - overlay->buttonState.minusDragActive.exchange(false, std::memory_order_acq_rel); - overlay->buttonState.plusDragActive.exchange(false, std::memory_order_acq_rel); - } - - // Disable rendering on any input, re-enable when no input - static bool resetOnce = true; - if (inputDetected) { - if (resetOnce && isRendering) { - isRendering = false; - leventSignal(&renderingStopEvent); - resetOnce = false; - } - } else { - resetOnce = true; - } - } - - if (ult::limitedMemory) { - static auto lastUnderscanPixels = std::make_pair(0, 0); - - if (lastUnderscanPixels != tsl::impl::currentUnderscanPixels) { - for (int i = 0; i < 2; i++) { - tsl::gfx::Renderer::get().updateLayerSize(); - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(overlay->frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - lastUnderscanPixels = tsl::impl::currentUnderscanPixels; - } - - svcSleepThread(32000000ULL); // 32ms polling - } - }, this, NULL, 0x1000, 0x2B, -2); - threadStart(&touchPollThread); - } - ~MiniOverlay() { - // Stop touch polling thread - touchPollRunning.store(false, std::memory_order_release); - threadWaitForExit(&touchPollThread); - threadClose(&touchPollThread); - - CloseThreads(); - FullMode = true; - fixForeground = true; - //tsl::hlp::requestForeground(true); - //alphabackground = 0xD; - deactivateOriginalFooter = false; - } - - resolutionCalls m_resolutionRenderCalls[8] = {0}; - resolutionCalls m_resolutionViewportCalls[8] = {0}; - resolutionCalls m_resolutionOutput[8] = {0}; - uint8_t resolutionLookup = 0; - bool resolutionShow = false; - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - //static constexpr u16 frameWidth = 448; - - // Cache parsed settings and calculations - static std::vector showKeys; - static std::string lastShowSetting; - static bool needsRecalc = true; - static std::vector labelLines; // Store individual label lines - static std::string lastVariables; // Track changes in Variables content - static size_t entryCount = 0; - static uint32_t cachedHeight = 0; - static int cachedBaseX = 0, cachedBaseY = 0; - static bool lastGameRunning = false; // Track game state changes - - // Check if we need to recalculate due to content changes - const bool contentChanged = (std::string(Variables) != lastVariables) || - (GameRunning != lastGameRunning); - - // Only recalculate if settings changed or content changed - if (settings.show != lastShowSetting || !Initialized || contentChanged) { - showKeys.clear(); - - // Parse once and cache - size_t start = 0, end = 0; - const std::string& show = settings.show; - while ((end = show.find('+', start)) != std::string::npos) { - showKeys.emplace_back(show.substr(start, end - start)); - start = end + 1; - } - if (start < show.length()) { - showKeys.emplace_back(show.substr(start)); - } - - lastShowSetting = settings.show; - lastVariables = Variables; - lastGameRunning = GameRunning; - needsRecalc = true; - } - - // Initial width calculation (only once) - if (!Initialized) { - - rectangleWidth = 0; - //std::pair dimensions; - u32 width; - - for (const auto& key : showKeys) { - if (key == "CPU") { - //dimensions = renderer->drawString("[100%,100%,100%,100%]@4444.4", false, 0, 0, fontsize, renderer->a(0x0000)); - if (!settings.realVolts) { - if (settings.showFullCPU) - width = renderer->getTextDimensions("[100%,100%,100%,100%]@4444.4", false, fontsize).first; - else - width = renderer->getTextDimensions("100%@4444.4", false, fontsize).first; - } else { - if (settings.showFullCPU) - width = renderer->getTextDimensions("[100%,100%,100%,100%]@4444.4444 mV", false, fontsize).first; - else - width = renderer->getTextDimensions("100%@4444.4444 mV", false, fontsize).first; - } - if (settings.realTemps) { - width += renderer->getTextDimensions(" 88.8°C ", false, fontsize).first; - } - } else if (key == "RAM" && settings.ramInfoMode == "Bandwidth" && R_SUCCEEDED(hocclkCheck)) { - width = renderer->getTextDimensions("99.9GB/s@4444.4", false, fontsize).first; - if (settings.realVolts) { - if (isMariko) { - if (settings.showVDD2 && settings.decimalVDD2 && settings.showVDDQ) - width += renderer->getTextDimensions("4444.4444 mV 4444 mV", false, fontsize).first; - else if (settings.showVDD2 && !settings.decimalVDD2 && settings.showVDDQ) - width += renderer->getTextDimensions("4444 mV 4444 mV", false, fontsize).first; - else if (settings.showVDD2 && settings.decimalVDD2) - width += renderer->getTextDimensions("4444.4 mV", false, fontsize).first; - else if (settings.showVDD2 && !settings.decimalVDD2) - width += renderer->getTextDimensions("4444 mV", false, fontsize).first; - else if (settings.showVDDQ) - width += renderer->getTextDimensions("4444 mV", false, fontsize).first; - } else { - if (settings.decimalVDD2) - width += renderer->getTextDimensions("4444.44 mV", false, fontsize).first; - else - width += renderer->getTextDimensions("4444 mV", false, fontsize).first; - } - } - if (settings.realTemps) { - width += renderer->getTextDimensions(" 88.8°C ", false, fontsize).first; - } - } else if (key == "GPU" || (key == "RAM" && settings.showpartLoad && R_SUCCEEDED(hocclkCheck))) { - //dimensions = renderer->drawString("100.0%@4444.4", false, 0, 0, fontsize, renderer->a(0x0000)); - - if (!settings.showpartLoadCPUGPU) { - if (!settings.realVolts) { - width = renderer->getTextDimensions("100%@4444.4", false, fontsize).first; - } else { - width = renderer->getTextDimensions("100%@4444.4444 mV", false, fontsize).first; - } - } else { - if (!settings.realVolts) { - width = renderer->getTextDimensions("100%[100%,100%]@4444.4", false, fontsize).first; - } else { - width = renderer->getTextDimensions("100%[100%,100%]@4444.4444 mV", false, fontsize).first; - } - } - if (settings.realTemps) { - width += renderer->getTextDimensions(" 88.8°C ", false, fontsize).first; - } - } else if (key == "RAM" && (!settings.showpartLoad || R_FAILED(hocclkCheck))) { - //dimensions = renderer->drawString("44444444MB@4444.4", false, 0, 0, fontsize, renderer->a(0x0000)); - if (!settings.realVolts) { - width = renderer->getTextDimensions("100%@4444.4", false, fontsize).first; - if (settings.realTemps) { - width += renderer->getTextDimensions(" 88.8°C ", false, fontsize).first; - } - } else { - if (isMariko) { - if (settings.showVDD2 && settings.decimalVDD2 && settings.showVDDQ) - width = renderer->getTextDimensions("100%@4444.44444.4444 mV", false, fontsize).first; - else if (settings.showVDD2 && !settings.decimalVDD2 && settings.showVDDQ) - width = renderer->getTextDimensions("100%@4444.44444444 mV", false, fontsize).first; - else if (settings.showVDD2 && settings.decimalVDD2) - width = renderer->getTextDimensions("100%@4444.44444.4 mV", false, fontsize).first; - else if (settings.showVDD2 && !settings.decimalVDD2) - width = renderer->getTextDimensions("100%@4444.44444 mV", false, fontsize).first; - else if (settings.showVDDQ) - width = renderer->getTextDimensions("100%@4444.4444 mV", false, fontsize).first; - } else { - if (settings.decimalVDD2) - width = renderer->getTextDimensions("100%@4444.44444.4 mV", false, fontsize).first; - else - width = renderer->getTextDimensions("100%@4444.44444 mV", false, fontsize).first; - } - } - } else if (key == "SOC") { // new block - if (!settings.realVolts) - if (settings.showFanPercentage) - width = renderer->getTextDimensions("88°C (100%)", false, fontsize).first; - else - width = renderer->getTextDimensions("88°C", false, fontsize).first; - else - if (settings.showSOCVoltage) { - if (settings.showFanPercentage) - width = renderer->getTextDimensions("88°C 100%444 mV", false, fontsize).first; - else - width = renderer->getTextDimensions("88°C444 mV", false, fontsize).first; - } else { - if (settings.showFanPercentage) - width = renderer->getTextDimensions("88°C 100%", false, fontsize).first; - else - width = renderer->getTextDimensions("88°C", false, fontsize).first; - } - } else if (key == "TMP") { - //dimensions = renderer->drawString("88.8\u00B0C88.8\u00B0C88.8\u00B0C (100%)", false, 0, 0, fontsize, renderer->a(0x0000)); - if (!settings.realVolts) { - if (settings.showFanPercentage) - width = renderer->getTextDimensions("88\u00B0C 88\u00B0C 88\u00B0C 100%", false, fontsize).first; - else - width = renderer->getTextDimensions("88\u00B0C 88\u00B0C 88\u00B0C", false, fontsize).first; - } else { - if (settings.showSOCVoltage) { - if (settings.showFanPercentage) - width = renderer->getTextDimensions("88\u00B0C 88\u00B0C 88\u00B0C 100%444 mV", false, fontsize).first; - else - width = renderer->getTextDimensions("88\u00B0C 88\u00B0C 88\u00B0C444 mV", false, fontsize).first; - } else { - if (settings.showFanPercentage) - width = renderer->getTextDimensions("88\u00B0C 88\u00B0C 88\u00B0C 100%", false, fontsize).first; - else - width = renderer->getTextDimensions("88\u00B0C 88\u00B0C 88\u00B0C", false, fontsize).first; - } - } - } else if (key == "BAT") { - //dimensions = renderer->drawString("-44.44 W100.0% [44:44]", false, 0, 0, fontsize, renderer->a(0x0000)); - width = renderer->getTextDimensions("-44.44 W100.0% [44:44]", false, fontsize).first; - } else if (key == "FPS") { - //dimensions = renderer->drawString("444.4", false, 0, 0, fontsize, renderer->a(0x0000)); - width = renderer->getTextDimensions("444.4", false, fontsize).first; - } else if (key == "RES") { - //dimensions = renderer->drawString("3840x21603840x2160", false, 0, 0, fontsize, renderer->a(0x0000)); - if (settings.showFullResolution) - width = renderer->getTextDimensions("3840x21603840x2160", false, fontsize).first; - else - width = renderer->getTextDimensions("2160p2160p", false, fontsize).first; - } else if (key == "READ") { - // Calculate width for read speed display - width = renderer->getTextDimensions("999.99 MiB/s", false, fontsize).first; - } else if (key == "MEM") { - // Calculate width for system memory display (System + divider + memory value) - const u32 memValueWidth = renderer->getTextDimensions("999.9 MB "+ult::FREE, false, fontsize).first; - const u32 dividerWidth = renderer->getTextDimensions(ult::DIVIDER_SYMBOL, false, fontsize).first; - const u32 systemWidth = renderer->getTextDimensions("System", false, fontsize).first; - width = memValueWidth + dividerWidth + systemWidth; - } else if (key == "DTC" && settings.showDTC) { - // Calculate width based on the datetime format - // Use multiple sample dates to ensure longest possible textual output - - char sampleDateTime[64]; - size_t maxWidth = 0; - - // Representative dates that produce long names in most locales - constexpr int testDays[][3] = { - {2025, 11, 26}, // Wednesday – longest weekday - {2025, 9, 30}, // September – long month - {2025, 12, 31}, // December – another long month - {2025, 2, 28}, // February – to cover locales where it's long - }; - - struct tm t = {}; - for (auto &d : testDays) { - - t.tm_year = d[0] - 1900; - t.tm_mon = d[1] - 1; - t.tm_mday = d[2]; - t.tm_hour = 23; - t.tm_min = 59; - t.tm_sec = 59; - mktime(&t); // normalize (sets weekday, etc.) - - strftime(sampleDateTime, sizeof(sampleDateTime), settings.dtcFormat.c_str(), &t); - const size_t w = renderer->getTextDimensions(std::string(sampleDateTime) + " ", false, fontsize).first; - if (w > maxWidth) - maxWidth = w; - } - - width = maxWidth; - - } else { - continue; - } - - if (rectangleWidth < width) { - rectangleWidth = width; - } - } - Initialized = true; - needsRecalc = true; - } - - // Recalculate layout when needed (including content changes) - if (needsRecalc) { - // Build label lines array for individual centering - labelLines.clear(); - entryCount = 0; - uint16_t flags = 0; - - bool shouldAdd; - std::string labelText; - for (const auto& key : showKeys) { - shouldAdd = false; - labelText = ""; - - if (key == "CPU" && !(flags & 1)) { - shouldAdd = true; - labelText = "CPU"; - flags |= 1; - } else if (key == "GPU" && !(flags & 2)) { - shouldAdd = true; - labelText = "GPU"; - flags |= 2; - } else if (key == "RAM" && !(flags & 4)) { - shouldAdd = true; - labelText = "RAM"; - flags |= 4; - } else if (key == "SOC" && !(flags & 8)) { - shouldAdd = true; - labelText = "SOC"; - flags |= 8; - } else if (key == "TMP" && !(flags & 16)) { - shouldAdd = true; - labelText = "TMP"; - flags |= 16; - } else if ((key == "BAT" || key == "DRAW") && !(flags & 32)) { - shouldAdd = true; - labelText = "BAT"; - flags |= 32; - } else if (key == "FPS" && !(flags & 64) && GameRunning) { - shouldAdd = true; - labelText = "FPS"; - flags |= 64; - } else if (key == "RES" && !(flags & 128) && GameRunning) { - shouldAdd = true; - labelText = "RES"; - flags |= 128; - resolutionShow = true; - } else if (key == "READ" && !(flags & 512) && GameRunning) { - shouldAdd = true; - labelText = "READ"; - flags |= 512; - } else if (key == "DTC" && !(flags & 256) && settings.showDTC) { - shouldAdd = true; - labelText = settings.useDTCSymbol ? "\uE007" : "DTC"; - flags |= 256; - } else if (key == "MEM" && !(flags & 1024)) { - shouldAdd = true; - labelText = "MEM"; - flags |= 1024; - } - - - if (shouldAdd) { - labelLines.push_back(labelText); - entryCount++; - - //if (settings.realVolts && key != "BAT" && key != "DRAW" && key != "FPS" && key != "RES") { - // labelLines.push_back(""); // Empty line for voltage info - // entryCount++; - //} - } - } - - // Calculate actual entry count from Variables string - size_t actualEntryCount = 1; // Start with 1 for the first line - for (size_t i = 0; Variables[i] != '\0'; i++) { - if (Variables[i] == '\n') { - actualEntryCount++; - } - } - - // Use the actual entry count for height calculation - cachedHeight = ((fontsize + settings.spacing) * actualEntryCount) + (fontsize / 3) + settings.spacing + topPadding + bottomPadding; - //const uint32_t margin = (fontsize * 4); - - cachedBaseX = 0; - cachedBaseY = 0; - - needsRecalc = false; - } - - // Fast rendering using cached values - const uint32_t margin = (fontsize * 4); - - // Draw background - const tsl::Color bgColor = !isDragging - ? settings.backgroundColor // full opacity - : settings.focusBackgroundColor; - - int clippingOffsetX = 0, clippingOffsetY = 0; - - int _frameOffsetX = ult::limitedMemory ? std::max(0, frameOffsetX - (1280-448)) : frameOffsetX; - - // Check X bounds and calculate clipping offset - if (cachedBaseX + _frameOffsetX < int(framePadding)) { - clippingOffsetX = framePadding - (cachedBaseX + _frameOffsetX); - } else if ((cachedBaseX + _frameOffsetX + margin + rectangleWidth + (fontsize / 3)) > screenWidth - framePadding) { - clippingOffsetX = (screenWidth - framePadding) - (cachedBaseX + _frameOffsetX + margin + rectangleWidth + (fontsize / 3)); - } - - // Check Y bounds and calculate clipping offset - if (cachedBaseY + frameOffsetY < int(framePadding)) { - clippingOffsetY = framePadding - (cachedBaseY + frameOffsetY); - } else if ((cachedBaseY + frameOffsetY + cachedHeight) > screenHeight - framePadding) { - clippingOffsetY = (screenHeight - framePadding) - (cachedBaseY + frameOffsetY + cachedHeight); - } - - // Apply to all drawing calls - renderer->drawRoundedRectSingleThreaded( - cachedBaseX + _frameOffsetX + clippingOffsetX, - cachedBaseY + frameOffsetY + clippingOffsetY, - margin + rectangleWidth + (fontsize / 3), - cachedHeight, - 16, - a(bgColor) - ); - - - // Split Variables into lines for individual positioning - std::vector variableLines; - const std::string variablesStr(Variables); - size_t start = 0; - size_t pos = 0; - while ((pos = variablesStr.find('\n', start)) != std::string::npos) { - variableLines.push_back(variablesStr.substr(start, pos - start)); - start = pos + 1; - } - if (start < variablesStr.length()) { - variableLines.push_back(variablesStr.substr(start)); - } - - // Draw each label and variable line individually - uint32_t currentY = cachedBaseY + fontsize + settings.spacing + topPadding; - size_t labelIndex = 0; - - static const std::vector specialChars = {""}; - static uint32_t labelWidth, labelCenterX; - static std::vector _variableLines; - if (!delayUpdate) - _variableLines = variableLines; - for (size_t i = 0; i < _variableLines.size() && labelIndex < labelLines.size(); i++) { - // Check for RES label without corresponding RES data - if (labelIndex < labelLines.size() && labelLines[labelIndex] == "RES") { - //const std::string& currentLine = _variableLines[i]; - // Check if this data line looks like resolution data (contains 'x' or 'p') - bool isResolutionData = m_resolutionOutput[0].width; - - if (!isResolutionData) { - // This is RES label but data isn't resolution data - skip the label - ++labelIndex; - // Don't increment i, so the current data line gets paired with the next label - --i; - continue; - } - } - - // Draw label (centered in label region) - if (!labelLines[labelIndex].empty()) { - labelWidth = renderer->getTextDimensions(labelLines[labelIndex], false, fontsize).first; - labelCenterX = cachedBaseX + (margin / 2) - (labelWidth / 2); - renderer->drawString(labelLines[labelIndex], false, labelCenterX + _frameOffsetX + clippingOffsetX, currentY + frameOffsetY + clippingOffsetY, fontsize, settings.catColor); - } - - // Determine rendering method based on label type - const std::string& currentLine = _variableLines[i]; - const int baseX = cachedBaseX + margin + _frameOffsetX + clippingOffsetX; - const int baseY = currentY + frameOffsetY + clippingOffsetY; - - if (settings.useDynamicColors) { - if (labelIndex < labelLines.size() && labelLines[labelIndex] == "CPU") { - std::string dataStr = currentLine; - - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos && settings.realTemps && realCPU_Temp != 0) { - size_t tempStart = dataStr.rfind(' ', degreesPos); - if (tempStart != std::string::npos) { - tempStart++; - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; - - const std::string preTempPart = dataStr.substr(0, tempStart); - const std::string tempPart = dataStr.substr(tempStart, tempEnd - tempStart); - const std::string postTempPart = dataStr.substr(tempEnd); - - const float temp = realCPU_Temp / 1000.0f; - const tsl::Color tempColor = tsl::GradientColor(temp); - - int currentX = baseX; - if (!preTempPart.empty()) { - renderer->drawStringWithColoredSections(preTempPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - currentX += renderer->getTextDimensions(preTempPart, false, fontsize).first; - } - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, currentX, baseY, fontsize, tempColor, settings.separatorColor); - - if (!postTempPart.empty()) { - currentX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(postTempPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - - } else if (labelIndex < labelLines.size() && labelLines[labelIndex] == "GPU") { - std::string dataStr = currentLine; - - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos && settings.realTemps && realGPU_Temp != 0) { - size_t tempStart = dataStr.rfind(' ', degreesPos); - if (tempStart != std::string::npos) { - tempStart++; - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; - - const std::string preTempPart = dataStr.substr(0, tempStart); - const std::string tempPart = dataStr.substr(tempStart, tempEnd - tempStart); - const std::string postTempPart = dataStr.substr(tempEnd); - - const float temp = realGPU_Temp / 1000.0f; - const tsl::Color tempColor = tsl::GradientColor(temp); - - int currentX = baseX; - if (!preTempPart.empty()) { - renderer->drawStringWithColoredSections(preTempPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - currentX += renderer->getTextDimensions(preTempPart, false, fontsize).first; - } - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, currentX, baseY, fontsize, tempColor, settings.separatorColor); - - if (!postTempPart.empty()) { - currentX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(postTempPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - - } else if (labelIndex < labelLines.size() && labelLines[labelIndex] == "RAM") { - std::string dataStr = currentLine; - - const size_t degreesPos = dataStr.find("°"); - if (degreesPos != std::string::npos && settings.realTemps && realRAM_Temp != 0) { - size_t tempStart = dataStr.rfind(' ', degreesPos); - if (tempStart != std::string::npos) { - tempStart++; - const size_t cPos = dataStr.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; - - const std::string preTempPart = dataStr.substr(0, tempStart); - const std::string tempPart = dataStr.substr(tempStart, tempEnd - tempStart); - const std::string postTempPart = dataStr.substr(tempEnd); - - const float temp = realRAM_Temp / 1000.0f; - const tsl::Color tempColor = tsl::GradientColor(temp); - - int currentX = baseX; - if (!preTempPart.empty()) { - renderer->drawStringWithColoredSections(preTempPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - currentX += renderer->getTextDimensions(preTempPart, false, fontsize).first; - } - - renderer->drawStringWithColoredSections(tempPart, false, specialChars, currentX, baseY, fontsize, tempColor, settings.separatorColor); - - if (!postTempPart.empty()) { - currentX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(postTempPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - - } else if (labelIndex < labelLines.size() && labelLines[labelIndex] == "SOC") { - // SOC temperature rendering with gradient - const size_t degreesPos = currentLine.find("°"); - if (degreesPos != std::string::npos) { - // Find the 'C' after the degrees symbol - const size_t cPos = currentLine.find("C", degreesPos); - if (cPos != std::string::npos) { - const size_t tempEnd = cPos + 1; // Include the 'C' - - // Extract temperature value and apply gradient - const int temp = atoi(currentLine.c_str()); - const tsl::Color tempColor = tsl::GradientColor((float)temp); - - // Split into temperature part and remaining part - const std::string tempPart = currentLine.substr(0, tempEnd); - const std::string restPart = currentLine.substr(tempEnd); - - // Render temperature with gradient color - int currentX = baseX; - renderer->drawString(tempPart, false, currentX, baseY, fontsize, tempColor); - - // Render remaining text with normal color - if (!restPart.empty()) { - currentX += renderer->getTextDimensions(tempPart, false, fontsize).first; - renderer->drawStringWithColoredSections(restPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - // Fallback: no C found after degrees, render normally - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - // Fallback: no degrees symbol found, render normally - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - - } else if (labelIndex < labelLines.size() && labelLines[labelIndex] == "TMP") { - // TMP multiple temperatures rendering with gradients - int currentX = baseX; - size_t pos = 0; - bool parseSuccess = true; - - // Parse up to 3 temperatures in the format "XX°C XX°C XX°C (XX%)" - for (int tempCount = 0; tempCount < 3 && parseSuccess && pos < currentLine.length(); tempCount++) { - // Find start of current temperature (skip any leading spaces) - while (pos < currentLine.length() && currentLine[pos] == ' ') { - renderer->drawString(" ", false, currentX, baseY, fontsize, settings.textColor); - currentX += renderer->getTextDimensions(" ", false, fontsize).first; - pos++; - } - - if (pos >= currentLine.length()) break; - - // Find degrees symbol - const size_t degreesPos = currentLine.find("°", pos); - if (degreesPos == std::string::npos) { - parseSuccess = false; - break; - } - - // Find 'C' after degrees symbol - const size_t cPos = currentLine.find("C", degreesPos); - if (cPos == std::string::npos) { - parseSuccess = false; - break; - } - - const size_t tempEnd = cPos + 1; // Include the 'C' - - // Extract and render temperature with gradient - const std::string tempPart = currentLine.substr(pos, tempEnd - pos); - const int temp = atoi(tempPart.c_str()); - const tsl::Color tempColor = tsl::GradientColor((float)temp); - - renderer->drawString(tempPart, false, currentX, baseY, fontsize, tempColor); - currentX += renderer->getTextDimensions(tempPart, false, fontsize).first; - - pos = tempEnd; - } - - // Render any remaining text (like " (50%)" or voltage info) - if (pos < currentLine.length()) { - std::string restPart = currentLine.substr(pos); - renderer->drawStringWithColoredSections(restPart, false, specialChars, currentX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - - // If parsing failed, fall back to normal rendering - if (!parseSuccess) { - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else if (labelIndex < labelLines.size() && labelLines[labelIndex] == "MEM") { - // MEM memory rendering with gradient color - // Extract numeric value for color determination - float sysValue = 0.0f; - sscanf(currentLine.c_str(), "%f", &sysValue); - - // Determine unit from string - const bool isGB = (currentLine.find("GB") != std::string::npos); - const float sysValueMB = isGB ? (sysValue * 1024.0f) : sysValue; - - // Apply same color scheme as in drawMemoryWidget - tsl::Color sysColor = settings.textColor; - if (sysValueMB >= 9.0f) { - sysColor = settings.useDynamicColors ? tsl::healthyRamTextColor : settings.textColor; - } else if (sysValueMB >= 3.0f) { - sysColor = settings.useDynamicColors ? tsl::neutralRamTextColor : settings.textColor; - } else { - sysColor = settings.useDynamicColors ? tsl::badRamTextColor : settings.textColor; - } - - // Draw the memory value with color on the left - int currentX = baseX; - renderer->drawStringWithColoredSections(currentLine, false, specialChars, currentX, baseY, fontsize, sysColor, settings.separatorColor); - currentX += renderer->getTextDimensions(currentLine, false, fontsize).first; - - // Draw separator " | " - renderer->drawString(ult::DIVIDER_SYMBOL, false, currentX, baseY, fontsize, settings.separatorColor); - currentX += renderer->getTextDimensions(ult::DIVIDER_SYMBOL, false, fontsize).first; - - // Draw "System" on the right - renderer->drawString("System", false, currentX, baseY, fontsize, settings.textColor); - } else { - // Normal rendering for all other line types (CPU, GPU, RAM, BAT, FPS, RES, DTC) - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - } else { - // Normal rendering for all other line types (CPU, GPU, RAM, BAT, FPS, RES, DTC) - renderer->drawStringWithColoredSections(currentLine, false, specialChars, baseX, baseY, fontsize, settings.textColor, settings.separatorColor); - } - - currentY += fontsize + settings.spacing; - ++labelIndex; - } - }); - - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("", ""); - rootFrame->setContent(Status); - return rootFrame; - } - - virtual void update() override { - if (triggerExitNow) - return; - - if (!SaltySD) { - SaltySD = CheckPort(); - if (SaltySD) { - LoadSharedMemory(); - threadCreate(&t6, CheckIfGameRunning, NULL, NULL, 0x1000, 0x38, -2); - threadStart(&t6); - } - } - - // Handle performance mode changes - apmGetPerformanceMode(&performanceMode); - if (performanceMode == ApmPerformanceMode_Normal) { - if (fontsize != settings.handheldFontSize) { - Initialized = false; - fontsize = settings.handheldFontSize; - } - } - else if (performanceMode == ApmPerformanceMode_Boost) { - if (fontsize != settings.dockedFontSize) { - Initialized = false; - fontsize = settings.dockedFontSize; - } - } - - // Parse show settings to determine what to calculate - std::vector showKeys; - { - size_t start = 0, end = 0; - const std::string& show = settings.show; - while ((end = show.find('+', start)) != std::string::npos) { - showKeys.emplace_back(show.substr(start, end - start)); - start = end + 1; - } - if (start < show.length()) { - showKeys.emplace_back(show.substr(start)); - } - } - - // Helper to check if a key is active - static auto isActive = [&showKeys](const std::string& key) { - return std::find(showKeys.begin(), showKeys.end(), key) != showKeys.end(); - }; - - mutexLock(&mutex_Misc); - - // Variables to store formatted strings - char MINI_CPU_compressed_c[42] = ""; - char MINI_CPU_volt_c[16] = ""; - char MINI_GPU_Load_c[32] = ""; - char MINI_GPU_volt_c[20] = ""; - char MINI_RAM_var_compressed_c[35] = ""; - char MINI_RAM_volt_c[32] = ""; - char MINI_MEM_RAM_c[32] = ""; - char MINI_SOC_volt_c[16] = ""; - - // Only process CPU if needed - if (isActive("CPU")) { - char MINI_CPU_Usage0[7], MINI_CPU_Usage1[7], MINI_CPU_Usage2[7], MINI_CPU_Usage3[7]; - - const uint64_t idle0 = idletick0.load(std::memory_order_acquire); - const uint64_t idle1 = idletick1.load(std::memory_order_acquire); - const uint64_t idle2 = idletick2.load(std::memory_order_acquire); - const uint64_t idle3 = idletick3.load(std::memory_order_acquire); - - auto formatMiniUsage = [this](char* buf, size_t size, uint64_t idletick) { - if (idletick > systemtickfrequency_impl) { - strcpy(buf, "0%"); - } else { - snprintf(buf, size, "%.0f%%", - (1.0 - (static_cast(idletick) / systemtickfrequency_impl)) * 100.0); - } - }; - - formatMiniUsage(MINI_CPU_Usage0, sizeof(MINI_CPU_Usage0), idle0); - formatMiniUsage(MINI_CPU_Usage1, sizeof(MINI_CPU_Usage1), idle1); - formatMiniUsage(MINI_CPU_Usage2, sizeof(MINI_CPU_Usage2), idle2); - formatMiniUsage(MINI_CPU_Usage3, sizeof(MINI_CPU_Usage3), idle3); - - if (settings.showFullCPU) { - if (settings.realFrequencies && realCPU_Hz) { - snprintf(MINI_CPU_compressed_c, sizeof(MINI_CPU_compressed_c), - "[%s,%s,%s,%s]@%hu.%hhu", - MINI_CPU_Usage0, MINI_CPU_Usage1, MINI_CPU_Usage2, MINI_CPU_Usage3, - realCPU_Hz / 1000000, (realCPU_Hz / 100000) % 10); - } else { - snprintf(MINI_CPU_compressed_c, sizeof(MINI_CPU_compressed_c), - "[%s,%s,%s,%s]@%hu.%hhu", - MINI_CPU_Usage0, MINI_CPU_Usage1, MINI_CPU_Usage2, MINI_CPU_Usage3, - CPU_Hz / 1000000, (CPU_Hz / 100000) % 10); - } - } else { - double usage0 = 0, usage1 = 0, usage2 = 0, usage3 = 0; - sscanf(MINI_CPU_Usage0, "%lf%%", &usage0); - sscanf(MINI_CPU_Usage1, "%lf%%", &usage1); - sscanf(MINI_CPU_Usage2, "%lf%%", &usage2); - sscanf(MINI_CPU_Usage3, "%lf%%", &usage3); - - double maxUsage = std::max({usage0, usage1, usage2, usage3}); - - if (settings.realFrequencies && realCPU_Hz) { - snprintf(MINI_CPU_compressed_c, sizeof(MINI_CPU_compressed_c), - "%.0f%%@%hu.%hhu", maxUsage, - realCPU_Hz / 1000000, (realCPU_Hz / 100000) % 10); - } else { - snprintf(MINI_CPU_compressed_c, sizeof(MINI_CPU_compressed_c), - "%.0f%%@%hu.%hhu", maxUsage, - CPU_Hz / 1000000, (CPU_Hz / 100000) % 10); - } - } - - if (settings.realVolts) { - const uint32_t mv = realCPU_mV / 1000; - snprintf(MINI_CPU_volt_c, sizeof(MINI_CPU_volt_c), "%u mV", mv); - } - } - - if (settings.realTemps && realCPU_Temp != 0 && CPU_temp_c[0] != '\0') { - char temp_buffer[48]; - snprintf(temp_buffer, sizeof(temp_buffer), " %s", CPU_temp_c); - strncat(MINI_CPU_compressed_c, temp_buffer, sizeof(MINI_CPU_compressed_c) - strlen(MINI_CPU_compressed_c) - 1); - } - - // Only process GPU if needed - if (isActive("GPU")) { - if (settings.realFrequencies && realGPU_Hz) { - snprintf(MINI_GPU_Load_c, sizeof(MINI_GPU_Load_c), - "%hu%%%s%hu.%hhu", - GPU_Load_u / 10, "@", - realGPU_Hz / 1000000, (realGPU_Hz / 100000) % 10); - } else { - snprintf(MINI_GPU_Load_c, sizeof(MINI_GPU_Load_c), - "%hu%%%s%hu.%hhu", - GPU_Load_u / 10, "@", - GPU_Hz / 1000000, (GPU_Hz / 100000) % 10); - } - - // Handle sleep exit - if (settings.sleepExit) { - const auto GPU_Hz_int = int(GPU_Hz / 1000000); - static auto lastGPU_Hz_int = GPU_Hz_int; - if (GPU_Hz_int == 0 && lastGPU_Hz_int != 0) { - isRendering = false; - leventSignal(&renderingStopEvent); - triggerExitNow = true; - mutexUnlock(&mutex_Misc); - return; - } - lastGPU_Hz_int = GPU_Hz_int; - } - - if (settings.realVolts) { - const uint32_t mv = realGPU_mV / 1000; - snprintf(MINI_GPU_volt_c, sizeof(MINI_GPU_volt_c), "%u mV", mv); - } - } - - if (settings.realTemps && realGPU_Temp != 0 && GPU_temp_c[0] != '\0') { - char temp_buffer[48]; - snprintf(temp_buffer, sizeof(temp_buffer), " %s", GPU_temp_c); - strncat(MINI_GPU_Load_c, temp_buffer, sizeof(MINI_GPU_Load_c) - strlen(MINI_GPU_Load_c) - 1); - } - - // Only process RAM if needed - if (isActive("RAM")) { - if (!settings.showpartLoad) { - const float ramTotalGiB = (RAM_Total_application_u + RAM_Total_applet_u + - RAM_Total_system_u + RAM_Total_systemunsafe_u) / - (1024.0f * 1024.0f); - const float ramUsedGiB = (RAM_Used_application_u + RAM_Used_applet_u + - RAM_Used_system_u + RAM_Used_systemunsafe_u) / - (1024.0f * 1024.0f); - - if (settings.realFrequencies && realRAM_Hz) { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%.0f/%.0fMB@%hu.%hhu", - ramUsedGiB, ramTotalGiB, - realRAM_Hz / 1000000, (realRAM_Hz / 100000) % 10); - } else { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%.0f/%.0fMB@%hu.%hhu", - ramUsedGiB, ramTotalGiB, - RAM_Hz / 1000000, (RAM_Hz / 100000) % 10); - } - } else { - if (settings.ramInfoMode == "Bandwidth" && R_SUCCEEDED(hocclkCheck)) { - // Bandwidth mode: show GB/s from context (partLoad values are in MB/s) - const uint32_t ramFreq = settings.realFrequencies && realRAM_Hz ? realRAM_Hz : RAM_Hz; - const unsigned bwAll = partLoad[HocClkPartLoad_RamBWAll] / 1000; - const unsigned bwAllD = (partLoad[HocClkPartLoad_RamBWAll] % 1000) / 100; - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u.%uGB/s@%hu.%hhu", - bwAll, bwAllD, - ramFreq / 1000000, (ramFreq / 100000) % 10); - } else { - unsigned partLoadInt; - - if (R_SUCCEEDED(hocclkCheck)) { - partLoadInt = partLoad[HocClkPartLoad_EMC] / 10; - - if (settings.showpartLoadCPUGPU) { - unsigned ramCpuLoadInt = partLoad[HocClkPartLoad_EMCCpu] / 10; - int RAM_GPU_Load = partLoad[HocClkPartLoad_EMC] - partLoad[HocClkPartLoad_EMCCpu]; - unsigned ramGpuLoadInt = RAM_GPU_Load / 10; - - if (settings.realFrequencies && realRAM_Hz) { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u%%[%u%%,%u%%]@%hu.%hhu", - partLoadInt, ramCpuLoadInt, ramGpuLoadInt, - realRAM_Hz / 1000000, (realRAM_Hz / 100000) % 10); - } else { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u%%[%u%%,%u%%]@%hu.%hhu", - partLoadInt, ramCpuLoadInt, ramGpuLoadInt, - RAM_Hz / 1000000, (RAM_Hz / 100000) % 10); - } - } else { - if (settings.realFrequencies && realRAM_Hz) { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u%%@%hu.%hhu", partLoadInt, - realRAM_Hz / 1000000, (realRAM_Hz / 100000) % 10); - } else { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u%%@%hu.%hhu", partLoadInt, - RAM_Hz / 1000000, (RAM_Hz / 100000) % 10); - } - } - } else { - const uint64_t RAM_Total_all = RAM_Total_application_u + RAM_Total_applet_u + - RAM_Total_system_u + RAM_Total_systemunsafe_u; - const uint64_t RAM_Used_all = RAM_Used_application_u + RAM_Used_applet_u + - RAM_Used_system_u + RAM_Used_systemunsafe_u; - partLoadInt = (RAM_Total_all > 0) ? (unsigned)((RAM_Used_all * 100) / RAM_Total_all) : 0; - - if (settings.realFrequencies && realRAM_Hz) { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u%%@%hu.%hhu", partLoadInt, - realRAM_Hz / 1000000, (realRAM_Hz / 100000) % 10); - } else { - snprintf(MINI_RAM_var_compressed_c, sizeof(MINI_RAM_var_compressed_c), - "%u%%@%hu.%hhu", partLoadInt, - RAM_Hz / 1000000, (RAM_Hz / 100000) % 10); - } - } - } - } - - if (settings.realVolts) { - const float mv_vdd2_f = realVDD2_mV / 1000.0f; // VDD2 - const uint32_t mv_vddq = realVDDQ_mV / 1000; // VDDQ - const uint32_t mv_vdd2_i = realVDD2_mV / 1000; - - if (isMariko) { - if (settings.showVDDQ && settings.showVDD2) { - if (settings.decimalVDD2) - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), - "%.1f mV%u mV", mv_vdd2_f, mv_vddq); - else - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), - "%u mV%u mV", mv_vdd2_i, mv_vddq); - } else if (settings.showVDDQ) { - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), "%u mV", mv_vddq); - } else if (settings.showVDD2) { - if (settings.decimalVDD2) - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), "%.1f mV", mv_vdd2_f); - else - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), "%u mV", mv_vdd2_i); - } - } else { - if (settings.decimalVDD2) - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), "%.1f mV", mv_vdd2_f); - else - snprintf(MINI_RAM_volt_c, sizeof(MINI_RAM_volt_c), "%u mV", mv_vdd2_i); - } - } - } - - if (settings.realTemps && realRAM_Temp != 0 && RAM_temp_c[0] != '\0') { - char temp_buffer[48]; - snprintf(temp_buffer, sizeof(temp_buffer), " %s", RAM_temp_c); - strncat(MINI_RAM_var_compressed_c, temp_buffer, sizeof(MINI_RAM_var_compressed_c) - strlen(MINI_RAM_var_compressed_c) - 1); - } - - // Only process MEM if needed - if (isActive("MEM")) { - const u64 freeRamBytes = RAM_Total_system_u - RAM_Used_system_u; - - float value; - const char* unit; - - if (freeRamBytes >= 1024ULL * 1024 * 1024) { - value = static_cast(freeRamBytes) / (1024.0f * 1024.0f * 1024.0f); - unit = "GB"; - } else { - value = static_cast(freeRamBytes) / (1024.0f * 1024.0f); - unit = "MB"; - } - - int decimalPlaces; - if (value >= 1000.0f) { - decimalPlaces = 0; - } else if (value >= 100.0f) { - decimalPlaces = 1; - } else if (value >= 10.0f) { - decimalPlaces = 2; - } else { - decimalPlaces = 3; - } - - snprintf(MINI_MEM_RAM_c, sizeof(MINI_MEM_RAM_c), "%.*f %s %s", - decimalPlaces, value, unit, ult::FREE.c_str()); - } - - // Only process temperature/fan data if SOC or TMP is active - if (isActive("TMP") || isActive("SOC")) { - const int duty = safeFanDuty((int)Rotation_Duty); - - if (settings.realVolts && settings.showSOCVoltage) { - const uint32_t mv = realSOC_mV / 1000; - snprintf(MINI_SOC_volt_c, sizeof(MINI_SOC_volt_c), "%u mV", mv); - } - - if (isActive("SOC")) { - if (settings.showFanPercentage) { - snprintf(soc_temperature_c, sizeof(soc_temperature_c), - "%d°C %d%%", (int)SOC_temperatureF, duty); - } else { - snprintf(soc_temperature_c, sizeof(soc_temperature_c), - "%d°C", (int)SOC_temperatureF); - } - } - - if (isActive("TMP")) { - if (settings.showFanPercentage) { - snprintf(skin_temperature_c, sizeof(skin_temperature_c), - "%d\u00B0C %d\u00B0C %hu\u00B0C %d%%", - (int)SOC_temperatureF, (int)PCB_temperatureF, - skin_temperaturemiliC / 1000, duty); - } else { - snprintf(skin_temperature_c, sizeof(skin_temperature_c), - "%d\u00B0C %d\u00B0C %hu\u00B0C", - (int)SOC_temperatureF, (int)PCB_temperatureF, - skin_temperaturemiliC / 1000); - } - } - } - - if (settings.realTemps) { - if (realCPU_Temp != 0) { - snprintf(CPU_temp_c, sizeof(CPU_temp_c), "%u°C", static_cast(realCPU_Temp / 1000.0)); - } - if (realGPU_Temp != 0) { - snprintf(GPU_temp_c, sizeof(GPU_temp_c), "%u°C", static_cast(realGPU_Temp / 1000.0)); - } - if (realRAM_Temp != 0) { - snprintf(RAM_temp_c, sizeof(RAM_temp_c), "%u°C", static_cast(realRAM_Temp / 1000.0)); - } - } - - // Only process resolution if RES is active and game is running - if (isActive("RES") && GameRunning && NxFps) { - if (!resolutionLookup) { - (NxFps->renderCalls[0].calls) = 0xFFFF; - resolutionLookup = 1; - } else if (resolutionLookup == 1) { - if ((NxFps->renderCalls[0].calls) != 0xFFFF) resolutionLookup = 2; - } else { - memcpy(&m_resolutionRenderCalls, &(NxFps->renderCalls), sizeof(m_resolutionRenderCalls)); - memcpy(&m_resolutionViewportCalls, &(NxFps->viewportCalls), sizeof(m_resolutionViewportCalls)); - qsort(m_resolutionRenderCalls, 8, sizeof(resolutionCalls), compare); - qsort(m_resolutionViewportCalls, 8, sizeof(resolutionCalls), compare); - memset(&m_resolutionOutput, 0, sizeof(m_resolutionOutput)); - size_t out_iter = 0; - bool found = false; - for (size_t i = 0; i < 8; i++) { - for (size_t x = 0; x < 8; x++) { - if (m_resolutionRenderCalls[i].width == 0) break; - if ((m_resolutionRenderCalls[i].width == m_resolutionViewportCalls[x].width) && - (m_resolutionRenderCalls[i].height == m_resolutionViewportCalls[x].height)) { - m_resolutionOutput[out_iter].width = m_resolutionRenderCalls[i].width; - m_resolutionOutput[out_iter].height = m_resolutionRenderCalls[i].height; - m_resolutionOutput[out_iter].calls = (m_resolutionRenderCalls[i].calls > m_resolutionViewportCalls[x].calls) - ? m_resolutionRenderCalls[i].calls : m_resolutionViewportCalls[x].calls; - out_iter++; - found = true; - break; - } - } - if (!found && m_resolutionRenderCalls[i].width != 0) { - m_resolutionOutput[out_iter].width = m_resolutionRenderCalls[i].width; - m_resolutionOutput[out_iter].height = m_resolutionRenderCalls[i].height; - m_resolutionOutput[out_iter].calls = m_resolutionRenderCalls[i].calls; - out_iter++; - } - found = false; - if (out_iter == 8) break; - } - if (out_iter < 8) { - const size_t out_iter_s = out_iter; - for (size_t x = 0; x < 8; x++) { - for (size_t y = 0; y < out_iter_s; y++) { - if (m_resolutionViewportCalls[x].width == 0) break; - if ((m_resolutionViewportCalls[x].width == m_resolutionOutput[y].width) && - (m_resolutionViewportCalls[x].height == m_resolutionOutput[y].height)) { - found = true; - break; - } - } - if (!found && m_resolutionViewportCalls[x].width != 0) { - m_resolutionOutput[out_iter].width = m_resolutionViewportCalls[x].width; - m_resolutionOutput[out_iter].height = m_resolutionViewportCalls[x].height; - m_resolutionOutput[out_iter].calls = m_resolutionViewportCalls[x].calls; - out_iter++; - } - found = false; - if (out_iter == 8) break; - } - } - qsort(m_resolutionOutput, 8, sizeof(resolutionCalls), compare); - } - } else if (!GameRunning && resolutionLookup != 0) { - resolutionLookup = 0; - } - - mutexUnlock(&mutex_Misc); - - // Battery/power draw - always update since BAT/DRAW might be displayed - if (isActive("BAT") || isActive("DRAW")) { - char remainingBatteryLife[8]; - const float drawW = (fabsf(PowerConsumption) < 0.01f) ? 0.0f : PowerConsumption; - - mutexLock(&mutex_BatteryChecker); - - if (batTimeEstimate >= 0 && !(drawW <= 0.01f && drawW >= -0.01f)) { - snprintf(remainingBatteryLife, sizeof(remainingBatteryLife), - "%d:%02d", batTimeEstimate / 60, batTimeEstimate % 60); - } else { - strcpy(remainingBatteryLife, "--:--"); - } - - if (!settings.invertBatteryDisplay) { - snprintf(Battery_c, sizeof(Battery_c), - "%.2f W%.1f%% [%s]", - drawW, - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife); - } else { - snprintf(Battery_c, sizeof(Battery_c), - "%.1f%% [%s]%.2f W", - (float)_batteryChargeInfoFields.RawBatteryCharge / 1000.0f, - remainingBatteryLife, - drawW); - } - - mutexUnlock(&mutex_BatteryChecker); - } - - // Build Variables string - char Temp[512] = ""; - uint16_t flags = 0; - - for (const auto& key : showKeys) { - if (key == "CPU" && !(flags & 1)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, MINI_CPU_compressed_c); - if (settings.realVolts && MINI_CPU_volt_c[0]) { - strcat(Temp, ""); - strcat(Temp, MINI_CPU_volt_c); - } - flags |= 1; - } - else if (key == "GPU" && !(flags & 2)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, MINI_GPU_Load_c); - if (settings.realVolts && MINI_GPU_volt_c[0]) { - strcat(Temp, ""); - strcat(Temp, MINI_GPU_volt_c); - } - flags |= 2; - } - else if (key == "RAM" && !(flags & 4)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, MINI_RAM_var_compressed_c); - if (settings.realVolts && MINI_RAM_volt_c[0]) { - strcat(Temp, ""); - strcat(Temp, MINI_RAM_volt_c); - } - flags |= 4; - } - else if (key == "SOC" && !(flags & 8)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, soc_temperature_c); - if (settings.realVolts && settings.showSOCVoltage && MINI_SOC_volt_c[0]) { - strcat(Temp, ""); - strcat(Temp, MINI_SOC_volt_c); - } - flags |= 8; - } - else if (key == "TMP" && !(flags & 16)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, skin_temperature_c); - if (settings.realVolts && settings.showSOCVoltage && MINI_SOC_volt_c[0]) { - strcat(Temp, ""); - strcat(Temp, MINI_SOC_volt_c); - } - flags |= 16; - } - else if ((key == "BAT" || key == "DRAW") && !(flags & 32)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, Battery_c); - flags |= 32; - } - else if (key == "FPS" && !(flags & 64) && GameRunning) { - if (Temp[0]) strcat(Temp, "\n"); - char Temp_s[24]; - snprintf(Temp_s, sizeof(Temp_s), "%2.1f [%2.1f - %2.1f]", FPSavg, FPSmin, FPSmax); - strcat(Temp, Temp_s); - flags |= 64; - } - else if (key == "RES" && !(flags & 128) && GameRunning && m_resolutionOutput[0].width) { - if (Temp[0]) strcat(Temp, "\n"); - char Temp_s[32] = ""; - static std::pair old_res[2]; - - uint16_t w0 = m_resolutionOutput[0].width; - uint16_t h0 = m_resolutionOutput[0].height; - uint16_t w1 = m_resolutionOutput[1].width; - uint16_t h1 = m_resolutionOutput[1].height; - - if (w0 || w1) { - if (w0 && w1) { - if ((w0 == old_res[1].first && h0 == old_res[1].second) || - (w1 == old_res[0].first && h1 == old_res[0].second)) { - std::swap(w0, w1); - std::swap(h0, h1); - } - } - - - // Format based on whether we show full resolution or just height (p) - if (settings.showFullResolution) { - if (!w1 || !h1) - snprintf(Temp_s, sizeof(Temp_s), "%dx%d", w0 ? w0 : w1, h0 ? h0 : h1); - else - snprintf(Temp_s, sizeof(Temp_s), "%dx%d%dx%d", w0, h0, w1, h1); - } else { - if (!w1 || !h1) - snprintf(Temp_s, sizeof(Temp_s), "%dp", h0 ? h0 : h1); - else - snprintf(Temp_s, sizeof(Temp_s), "%dp%dp", h0, h1); - } - - // Update last-frame cache - old_res[0] = {m_resolutionOutput[0].width, m_resolutionOutput[0].height}; - old_res[1] = {m_resolutionOutput[1].width, m_resolutionOutput[1].height}; - - strcat(Temp, Temp_s); - flags |= 128; - } - } - else if (key == "READ" && !(flags & 512) && GameRunning && NxFps) { - if (Temp[0]) strcat(Temp, "\n"); - char Temp_s[24]; - if ((NxFps->readSpeedPerSecond) != 0.f) { - snprintf(Temp_s, sizeof(Temp_s), "%.2f MiB/s", (NxFps->readSpeedPerSecond) / 1048576.f); - } else { - strcpy(Temp_s, "n/d"); - } - strcat(Temp, Temp_s); - flags |= 512; - } - else if (key == "DTC" && !(flags & 256) && settings.showDTC) { - if (Temp[0]) strcat(Temp, "\n"); - char dateTimeStr[64]; - time_t rawtime = time(NULL); - struct tm *timeinfo = localtime(&rawtime); - strftime(dateTimeStr, sizeof(dateTimeStr), settings.dtcFormat.c_str(), timeinfo); - strcat(Temp, dateTimeStr); - flags |= 256; - } - else if (key == "MEM" && !(flags & 1024)) { - if (Temp[0]) strcat(Temp, "\n"); - strcat(Temp, MINI_MEM_RAM_c); - flags |= 1024; - } - } - - strcpy(Variables, Temp); - - // Enable rendering if needed - if (!skipOnce) { - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - // Static variables to maintain drag state between function calls - static bool oldTouchDetected = false; - static bool oldMinusHeld = false; - static bool oldPlusHeld = false; - - static HidTouchState initialTouchPos = {0}; - static int initialFrameOffsetX = 0; - static int initialFrameOffsetY = 0; - static constexpr int TOUCH_THRESHOLD = 8; - static bool hasMoved = false; - //static u64 lastTouchTime = 0; - //static constexpr u64 TOUCH_DEBOUNCE_NS = 16000000ULL; // 16ms debounce - - // Get current time for debouncing - //const u64 currentTime = armTicksToNs(armGetSystemTick()); - - // Better touch detection - check if coordinates are within reasonable screen bounds - const bool currentTouchDetected = (touchPos.x > 0 && touchPos.y > 0 && - touchPos.x < screenWidth && touchPos.y < screenHeight); - - // Debounce touch detection - //if (currentTouchDetected && !oldTouchDetected) { - // if (currentTime - lastTouchTime < TOUCH_DEBOUNCE_NS) { - // currentTouchDetected = false; // Ignore rapid touch changes - // } else { - // lastTouchTime = currentTime; - // } - //} - - static bool clearOnRelease = false; - - if (clearOnRelease && !isRendering) { - clearOnRelease = false; - isRendering = true; - leventClear(&renderingStopEvent); - } - - // Calculate overlay bounds - const uint32_t margin = (fontsize * 4); - - // Cache bounds calculation - static int cachedBaseX = 0; - static int cachedBaseY = 0; - static uint32_t cachedOverlayHeight = 0; - static bool boundsNeedUpdate = true; - static std::string lastVariables = ""; - - // Only recalculate bounds when Variables change or first time - if (boundsNeedUpdate || std::string(Variables) != lastVariables) { - // Calculate actual entry count from Variables string - size_t actualEntryCount = 1; - for (size_t i = 0; Variables[i] != '\0'; i++) { - if (Variables[i] == '\n') { - actualEntryCount++; - } - } - - cachedOverlayHeight = ((fontsize + settings.spacing) * actualEntryCount) + - (fontsize / 3) + settings.spacing + topPadding + bottomPadding; - - // Position calculation based on settings - cachedBaseX = 0; - cachedBaseY = 0; - - boundsNeedUpdate = false; - lastVariables = Variables; - } - - const int overlayX = frameOffsetX;//ult::limitedMemory ? cachedBaseX + std::max(0, frameOffsetX - (1280-448)) : cachedBaseX + frameOffsetX; - const int overlayY = cachedBaseY + frameOffsetY; - const int overlayWidth = margin + rectangleWidth + (fontsize / 3); - const int overlayHeight = cachedOverlayHeight; - - // Add padding to make touch detection more forgiving - static constexpr int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = overlayWidth + (touchPadding * 2); - const int touchableHeight = overlayHeight + (touchPadding * 2); - - // Screen boundaries for clamping - const int minX = -cachedBaseX + framePadding; - const int maxX = screenWidth - overlayWidth - cachedBaseX - framePadding; - const int minY = -cachedBaseY + framePadding; - const int maxY = screenHeight - overlayHeight - cachedBaseY - framePadding; - - const bool minusDragReady = buttonState.minusDragActive.load(std::memory_order_acquire); - const bool plusDragReady = buttonState.plusDragActive.load(std::memory_order_acquire); - - // Check button states - const bool currentMinusHeld = (keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK) && minusDragReady; - const bool currentPlusHeld = (keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK) && plusDragReady; - - // Handle touch dragging - if (currentTouchDetected && !isDragging) { - // Touch detected and not currently dragging - check if we should start - const int touchX = touchPos.x; - const int touchY = touchPos.y; - - if (!oldTouchDetected) { - // Touch just started - check if within overlay bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - - // Start touch dragging - isDragging = true; - //isRendering = false; - //leventSignal(&renderingStopEvent); - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - hasMoved = false; - initialTouchPos = touchPos; - initialFrameOffsetX = frameOffsetX; - initialFrameOffsetY = frameOffsetY; - } - } - } else if (currentTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Continue touch dragging (only if neither MINUS nor PLUS is held) - const int touchX = touchPos.x; - const int touchY = touchPos.y; - const int deltaX = touchX - initialTouchPos.x; - const int deltaY = touchY - initialTouchPos.y; - - // Check if we've moved enough to consider this a drag - if (!hasMoved) { - const int totalMovement = abs(deltaX) + abs(deltaY); - if (totalMovement >= TOUCH_THRESHOLD) { - hasMoved = true; - } - } - - if (hasMoved) { - // Update frame offsets with boundary checking - const int newFrameOffsetX = std::max(minX, std::min(maxX, initialFrameOffsetX + deltaX)); - const int newFrameOffsetY = std::max(minY, std::min(maxY, initialFrameOffsetY + deltaY)); - - frameOffsetX = newFrameOffsetX; - frameOffsetY = newFrameOffsetY; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - boundsNeedUpdate = true; - } - } else if (!currentTouchDetected && oldTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Touch just released and we were touch dragging - if (hasMoved) { - // Save position when touch drag ends - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["mini"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["mini"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - } - - // Reset touch drag state - isDragging = false; - hasMoved = false; - //isRendering = true; - //leventClear(&renderingStopEvent); - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - - // Handle joystick dragging (MINUS + right joystick OR PLUS + left joystick) - if ((currentMinusHeld || currentPlusHeld) && !isDragging) { - // Start joystick dragging - isDragging = true; - //isRendering = false; - //leventSignal(&renderingStopEvent); - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - } else if ((currentMinusHeld || currentPlusHeld) && isDragging) { - // Continue joystick dragging - static constexpr int JOYSTICK_DEADZONE = 20; - - // Choose the appropriate joystick based on which button is held - const HidAnalogStickState& activeJoystick = currentMinusHeld ? joyStickPosRight : joyStickPosLeft; - - // Only move if joystick is outside deadzone - if (abs(activeJoystick.x) > JOYSTICK_DEADZONE || abs(activeJoystick.y) > JOYSTICK_DEADZONE) { - // Calculate joystick magnitude (distance from center) - const float magnitude = sqrt((float)(activeJoystick.x * activeJoystick.x + activeJoystick.y * activeJoystick.y)); - const float normalizedMagnitude = magnitude / 32767.0f; // Normalize to 0-1 range - - // Single smooth curve: stays very slow for wide range, then accelerates - static constexpr float baseSensitivity = 0.00008f; // Higher so small movements register - static constexpr float maxSensitivity = 0.0005f; - - // Use x^8 curve - stays very low until ~70% then curves up sharply - const float curveValue = pow(normalizedMagnitude, 8.0f); - const float currentSensitivity = baseSensitivity + (maxSensitivity - baseSensitivity) * curveValue; - - // Calculate movement delta with fractional accumulation - static float accumulatedX = 0.0f; - static float accumulatedY = 0.0f; - - accumulatedX += (float)activeJoystick.x * currentSensitivity; - accumulatedY += -(float)activeJoystick.y * currentSensitivity; - - // Extract integer movement and keep fractional part - const int deltaX = (int)accumulatedX; - const int deltaY = (int)accumulatedY; - accumulatedX -= deltaX; - accumulatedY -= deltaY; - - // Update frame offsets with boundary checking - const int newFrameOffsetX = std::max(minX, std::min(maxX, frameOffsetX + deltaX)); - const int newFrameOffsetY = std::max(minY, std::min(maxY, frameOffsetY + deltaY)); - - frameOffsetX = newFrameOffsetX; - frameOffsetY = newFrameOffsetY; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - boundsNeedUpdate = true; - } - } else if (((!currentMinusHeld && oldMinusHeld) || (!currentPlusHeld && oldPlusHeld)) && isDragging) { - // Button just released - stop joystick dragging - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["mini"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["mini"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - isDragging = false; - //isRendering = true; - //leventClear(&renderingStopEvent); - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Update state for next frame - oldTouchDetected = currentTouchDetected; - oldMinusHeld = currentMinusHeld; - oldPlusHeld = currentPlusHeld; - - // Handle existing key input logic (but don't interfere with dragging) - if (!isDragging) { - if (isKeyComboPressed(keysHeld, keysDown)) { - isRendering = false; - leventSignal(&renderingStopEvent); - //triggerRumbleDoubleClick.store(true, std::memory_order_release); - skipOnce = true; - runOnce = true; - //TeslaFPS = 60; - if (skipMain) { - //lastSelectedItem = "Mini"; - lastMode = "returning"; - tsl::goBack(); - } - else { - tsl::setNextOverlay(filepath.c_str(), "--lastSelectedItem Mini"); - tsl::Overlay::get()->close(); - } - return true; - } - else if (((keysDown & KEY_L) && (keysDown & KEY_ZL)) || ((keysDown & KEY_L) && (keysHeld & KEY_ZL)) || ((keysHeld & KEY_L) && (keysDown & KEY_ZL))) { - FPSmin = 254; - FPSmax = 0; - } - } - - // Return true if we handled the input (during dragging) - return isDragging; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Misc.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Misc.hpp deleted file mode 100644 index 98f52528..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Misc.hpp +++ /dev/null @@ -1,189 +0,0 @@ -class OtherMenu; - -void StartMiscThread() { - // Wait for existing thread to exit - threadWaitForExit(&t0); - - // Clear the thread exit event for new thread - leventClear(&threadexit); - - // Close and recreate thread - threadClose(&t0); - threadCreate(&t0, Misc2, NULL, NULL, 0x1000, 0x3F, 3); - threadStart(&t0); -} - -void EndMiscThread() { - // Signal the thread exit event - leventSignal(&threadexit); - - // Wait for thread to exit - threadWaitForExit(&t0); - - // Close thread handle - threadClose(&t0); -} - -class MiscOverlay : public tsl::Gui { -private: - char DSP_Load_c[16]; - // Separated value buffers for NV clocks - char NVDEC_value_c[16] = ""; - char NVENC_value_c[16] = ""; - char NVJPG_value_c[16] = ""; - char Nifm_pass[96]; - FullSettings settings; -public: - MiscOverlay() { - GetConfigSettings(&settings); - disableJumpTo = true; - smInitialize(); - nifmCheck = nifmInitialize(NifmServiceType_Admin); - if (R_SUCCEEDED(mmuInitialize())) { - nvdecCheck = mmuRequestInitialize(&nvdecRequest, MmuModuleId(5), 8, false); - nvencCheck = mmuRequestInitialize(&nvencRequest, MmuModuleId(6), 8, false); - nvjpgCheck = mmuRequestInitialize(&nvjpgRequest, MmuModuleId(7), 8, false); - } - - if (R_SUCCEEDED(audsnoopInitialize())) - audsnoopCheck = audsnoopEnableDspUsageMeasurement(); - - smExit(); - StartMiscThread(); - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - } - - ~MiscOverlay() { - EndMiscThread(); - nifmExit(); - mmuRequestFinalize(&nvdecRequest); - mmuRequestFinalize(&nvencRequest); - mmuRequestFinalize(&nvjpgRequest); - mmuExit(); - if (R_SUCCEEDED(audsnoopCheck)) { - audsnoopDisableDspUsageMeasurement(); - } - audsnoopExit(); - } - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - static constexpr u16 X_OFFSET = 30; - static constexpr u16 NV_VALUE_X = 120; // Aligned X position for NV values - - ///DSP - if (R_SUCCEEDED(audsnoopCheck)) { - renderer->drawString(DSP_Load_c, false, X_OFFSET, 120, 20, (settings.textColor)); - } - - //Multimedia engines - if (R_SUCCEEDED(nvdecCheck | nvencCheck | nvjpgCheck)) { - renderer->drawString("Multimedia Clock Rates", false, X_OFFSET, 165, 20, (settings.catColor1)); - - u16 currentY = 185; - - if (R_SUCCEEDED(nvdecCheck)) { - renderer->drawString("NVDEC", false, X_OFFSET+15, currentY, 15, (settings.catColor2)); - renderer->drawString(NVDEC_value_c, false, NV_VALUE_X, currentY, 15, (settings.textColor)); - currentY += 15; - } - if (R_SUCCEEDED(nvencCheck)) { - renderer->drawString("NVENC", false, X_OFFSET+15, currentY, 15, (settings.catColor2)); - renderer->drawString(NVENC_value_c, false, NV_VALUE_X, currentY, 15, (settings.textColor)); - currentY += 15; - } - if (R_SUCCEEDED(nvjpgCheck)) { - renderer->drawString("NVJPG", false, X_OFFSET+15, currentY, 15, (settings.catColor2)); - renderer->drawString(NVJPG_value_c, false, NV_VALUE_X, currentY, 15, (settings.textColor)); - } - } - - if (R_SUCCEEDED(nifmCheck)) { - renderer->drawString("Network", false, X_OFFSET, 255, 20, (settings.catColor1)); - if (!Nifm_internet_rc) { - if (NifmConnectionType == NifmInternetConnectionType_WiFi) { - renderer->drawString("Type: Wi-Fi", false, X_OFFSET, 280, 18, (settings.catColor2)); - if (!Nifm_profile_rc) { - if (Nifm_showpass) - renderer->drawString(Nifm_pass, false, X_OFFSET, 305, 15, (settings.textColor)); - else - renderer->drawString("Press Y to show password", false, X_OFFSET, 305, 15, (settings.textColor)); - } - } - else if (NifmConnectionType == NifmInternetConnectionType_Ethernet) - renderer->drawString("Type: Ethernet", false, X_OFFSET, 280, 18, (settings.textColor)); - } - else - renderer->drawString("Type: Not connected", false, X_OFFSET, 280, 18, (settings.textColor)); - } - - - }); - - // tsl::elm::g_disableMenuCacheOnReturn.store(true, std::memory_order_release); - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("Horizon OC Monitor", APP_VERSION, true); - rootFrame->setContent(Status); - - return rootFrame; - } - - virtual void update() override { - - snprintf(DSP_Load_c, sizeof DSP_Load_c, "DSP usage: %u%%", DSP_Load_u); - - // Format just the values for NV clocks - snprintf(NVDEC_value_c, sizeof(NVDEC_value_c), "%.1f MHz", (float)NVDEC_Hz / 1000000); - snprintf(NVENC_value_c, sizeof(NVENC_value_c), "%.1f MHz", (float)NVENC_Hz / 1000000); - snprintf(NVJPG_value_c, sizeof(NVJPG_value_c), "%.1f MHz", (float)NVJPG_Hz / 1000000); - - char pass_temp1[25] = ""; - char pass_temp2[25] = ""; - char pass_temp3[17] = ""; - if (Nifm_profile.wireless_setting_data.passphrase_len > 48) { - memcpy(&pass_temp1, &(Nifm_profile.wireless_setting_data.passphrase[0]), 24); - memcpy(&pass_temp2, &(Nifm_profile.wireless_setting_data.passphrase[24]), 24); - memcpy(&pass_temp3, &(Nifm_profile.wireless_setting_data.passphrase[48]), 16); - } - else if (Nifm_profile.wireless_setting_data.passphrase_len > 24) { - memcpy(&pass_temp1, &(Nifm_profile.wireless_setting_data.passphrase[0]), 24); - memcpy(&pass_temp2, &(Nifm_profile.wireless_setting_data.passphrase[24]), 24); - } - else { - memcpy(&pass_temp1, &(Nifm_profile.wireless_setting_data.passphrase[0]), 24); - } - snprintf(Nifm_pass, sizeof Nifm_pass, "%s\n%s\n%s", pass_temp1, pass_temp2, pass_temp3); - - static bool skipOnce = true; - - if (!skipOnce) { - static bool runOnce = true; - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - if (keysHeld & KEY_Y) { - Nifm_showpass = true; - } - else Nifm_showpass = false; - - if (keysDown & KEY_B) { - isRendering = false; - leventSignal(&renderingStopEvent); - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerExitSound.store(true, std::memory_order_release); - lastSelectedItem = "Miscellaneous"; - lastMode = ""; - tsl::swapTo(); - return true; - } - return false; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Resolutions.hpp b/Source/Horizon-OC-Monitor (deprecated)/source/modes/Resolutions.hpp deleted file mode 100644 index aca519b7..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/modes/Resolutions.hpp +++ /dev/null @@ -1,581 +0,0 @@ -class MainMenu; - -class ResolutionsOverlay : public tsl::Gui { -private: - char Resolutions_c[512] = {0}; - char Resolutions2_c[512] = {0}; - ResolutionSettings settings; - bool skipOnce = true; - bool runOnce = true; - - // Repositioning variables (matching Mini) - int frameOffsetX = 0; - int frameOffsetY = 0; - bool isDragging = false; - size_t framePadding = 10; - static constexpr int screenWidth = 1280; - static constexpr int screenHeight = 720; - - bool originalUseRightAlignment = ult::useRightAlignment; - - struct ButtonState { - std::atomic minusDragActive{false}; - std::atomic plusDragActive{false}; - } buttonState; - - Thread touchPollThread; - std::atomic touchPollRunning{false}; - - std::atomic inputDetected{false}; - -public: - ResolutionsOverlay() { - tsl::hlp::requestForeground(false); - disableJumpTo = true; - GetConfigSettings(&settings); - - // Load saved frame offsets - frameOffsetX = settings.frameOffsetX; - frameOffsetY = settings.frameOffsetY; - framePadding = settings.framePadding; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().removeScreenshotStacks(); - } - deactivateOriginalFooter = true; - FullMode = false; - TeslaFPS = settings.refreshRate; - StartFPSCounterThread(); - - // Start touch polling thread for instant response at low FPS - touchPollRunning.store(true, std::memory_order_release); - threadCreate(&touchPollThread, [](void* arg) -> void { - ResolutionsOverlay* overlay = static_cast(arg); - - // Allow only Player 1 and handheld mode - const HidNpadIdType id_list[2] = { HidNpadIdType_No1, HidNpadIdType_Handheld }; - - // Configure HID system to only listen to these IDs - hidSetSupportedNpadIdType(id_list, 2); - - // Configure input for up to 2 supported controllers (P1 + Handheld) - padConfigureInput(2, HidNpadStyleSet_NpadStandard | HidNpadStyleTag_NpadSystemExt); - - // Initialize separate pad states for both controllers - PadState pad_p1; - PadState pad_handheld; - padInitialize(&pad_p1, HidNpadIdType_No1); - padInitialize(&pad_handheld, HidNpadIdType_Handheld); - - u64 minusHoldStart = 0; - u64 plusHoldStart = 0; - static constexpr u64 HOLD_THRESHOLD_NS = 500'000'000ULL; - - HidTouchScreenState state = {0}; - - - while (overlay->touchPollRunning.load(std::memory_order_acquire)) { - // Only poll when rendering and not dragging - { - overlay->inputDetected.store(false, std::memory_order_release); - - // Check touch in bounds - if (hidGetTouchScreenStates(&state, 1) && state.count > 0) { - const int touchX = state.touches[0].x; - const int touchY = state.touches[0].y; - - // Calculate bounds (same logic as handleInput) - const int overlayX = overlay->frameOffsetX; - const int overlayY = overlay->frameOffsetY; - - // Overlay dimensions based on game state - int overlayWidth, overlayHeight; - overlayWidth = 360-20; - overlayHeight = 200; - - // Add touch padding - const int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = overlayWidth + (touchPadding * 2); - const int touchableHeight = overlayHeight + (touchPadding * 2); - - // Check if touch is within bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - overlay->inputDetected.store(true, std::memory_order_release); - } - } - - // Poll buttons from both controllers - padUpdate(&pad_p1); - padUpdate(&pad_handheld); - - // Combine input from both controllers - const u64 keysHeld = padGetButtons(&pad_p1) | padGetButtons(&pad_handheld); - const u64 now = armTicksToNs(armGetSystemTick()); - - // Track MINUS hold duration - if ((keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK)) { - if (minusHoldStart == 0) { - minusHoldStart = now; - } - if (now - minusHoldStart >= HOLD_THRESHOLD_NS) { - // Long enough to start drag - overlay->inputDetected.store(true, std::memory_order_release); - overlay->buttonState.minusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - // Track PLUS hold duration - else if ((keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK)) { - if (plusHoldStart == 0) { - plusHoldStart = now; - } - if (now - plusHoldStart >= HOLD_THRESHOLD_NS) { - // Long enough to start drag - overlay->inputDetected.store(true, std::memory_order_release); - overlay->buttonState.plusDragActive.exchange(true, std::memory_order_acq_rel); - } - } - - else { - minusHoldStart = plusHoldStart = 0; - overlay->buttonState.minusDragActive.exchange(false, std::memory_order_acq_rel); - overlay->buttonState.plusDragActive.exchange(false, std::memory_order_acq_rel); - } - - // Disable rendering on any input, re-enable when no input - static bool resetOnce = true; - if (overlay->inputDetected.load(std::memory_order_acquire)) { - if (resetOnce && isRendering) { - isRendering = false; - leventSignal(&renderingStopEvent); - resetOnce = false; - } - } else { - resetOnce = true; - } - } - - if (ult::limitedMemory) { - static auto lastUnderscanPixels = std::make_pair(0, 0); - - if (lastUnderscanPixels != tsl::impl::currentUnderscanPixels) { - for (int i = 0; i < 2; i++) { - tsl::gfx::Renderer::get().updateLayerSize(); - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(overlay->frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - } - lastUnderscanPixels = tsl::impl::currentUnderscanPixels; - } - - svcSleepThread(16000000ULL*2); // 16ms polling - } - }, this, NULL, 0x1000, 0x2B, -2); - threadStart(&touchPollThread); - } - - ~ResolutionsOverlay() { - // Stop touch polling thread - touchPollRunning.store(false, std::memory_order_release); - threadWaitForExit(&touchPollThread); - threadClose(&touchPollThread); - - EndFPSCounterThread(); - TeslaFPS = 60; - if (settings.disableScreenshots) { - tsl::gfx::Renderer::get().addScreenshotStacks(); - } - deactivateOriginalFooter = false; - ult::useRightAlignment = originalUseRightAlignment; - fixForeground = true; - FullMode = true; - } - - resolutionCalls m_resolutionRenderCalls[8] = {0}; - resolutionCalls m_resolutionViewportCalls[8] = {0}; - bool gameStart = false; - uint8_t resolutionLookup = 0; - u64 lastGameSeenTick = 0; - bool waitingForGame = true; - - virtual tsl::elm::Element* createUI() override { - - auto* Status = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - int base_y = 0; - int base_x = 0; - int clippingOffsetX = 0, clippingOffsetY = 0; - - int total_width = 360 - 20; - int total_height = 200; - - // Check clipping bounds (same as before) - if (base_x + frameOffsetX < int(framePadding)) - clippingOffsetX = framePadding - (base_x + frameOffsetX); - else if ((base_x + frameOffsetX + total_width) > static_cast(screenWidth - framePadding)) - clippingOffsetX = (screenWidth - framePadding) - (base_x + frameOffsetX + total_width); - - if (base_y + frameOffsetY < int(framePadding)) - clippingOffsetY = framePadding - (base_y + frameOffsetY); - else if ((base_y + frameOffsetY + total_height) > static_cast(screenHeight - framePadding)) - clippingOffsetY = (screenHeight - framePadding) - (base_y + frameOffsetY + total_height); - - int _frameOffsetX = ult::limitedMemory ? std::max(0, frameOffsetX - (1280-448)) : frameOffsetX; - - const int final_base_x = base_x + _frameOffsetX + clippingOffsetX; - const int final_base_y = base_y + frameOffsetY + clippingOffsetY; - - const tsl::Color bgColor = !isDragging ? settings.backgroundColor : settings.focusBackgroundColor; - - const u64 curTick = armGetSystemTick(); - - // guard: ensure lastGameSeenTick is initialized to something reasonable - if (lastGameSeenTick == 0) lastGameSeenTick = curTick; - - // threshold in ns (100 ms) - static constexpr u64 CHECK_NS = 2000000000ULL; - - // Game detected - if (gameStart && NxFps && NxFps->API >= 1 && (Resolutions_c[0] != '\0' && Resolutions2_c[0] != '\0')) { - lastGameSeenTick = curTick; - waitingForGame = true; // reset waiting state so next missing cycle shows "Checking..." - renderer->drawRoundedRectSingleThreaded(final_base_x, final_base_y, total_width, total_height, 16, aWithOpacity(bgColor)); - - int xOffset = 10; - int yOffset = 10; - renderer->drawString("Depth", false, xOffset + final_base_x + 20, yOffset + final_base_y + 20, 20, settings.catColor); - renderer->drawString(Resolutions_c, false, xOffset + final_base_x + 20, yOffset + final_base_y + 55, 18, settings.textColor); - renderer->drawString("Viewport", false, xOffset + final_base_x + 180, yOffset + final_base_y + 20, 20, settings.catColor); - renderer->drawString(Resolutions2_c, false, xOffset + final_base_x + 180, yOffset + final_base_y + 55, 18, settings.textColor); - } - // Game not detected - else { - renderer->drawRoundedRectSingleThreaded(final_base_x, final_base_y, total_width, total_height, 16, aWithOpacity(bgColor)); - - // Check elapsed time since last game detection - u64 elapsed_ns = armTicksToNs(curTick - lastGameSeenTick); - const bool under100ms = (elapsed_ns < CHECK_NS); // 100ms - - std::string msg; - if (under100ms && waitingForGame) - msg = "Checking for game..."; - else { - msg = "Game is not running\nor is incompatible."; - waitingForGame = false; - } - - const auto [textWidth, textHeight] = renderer->getTextDimensions(msg, false, 20); - const int text_x = final_base_x + (total_width - textWidth) / 2; - const int text_y = final_base_y + (total_height) / 2; - - renderer->drawString(msg, false, text_x, (under100ms && waitingForGame) ? text_y+textHeight/2 : text_y, 20, (under100ms && waitingForGame) ? 0xFFFF : 0xF00F); - } - }); - - tsl::elm::HeaderOverlayFrame* rootFrame = new tsl::elm::HeaderOverlayFrame("", ""); - rootFrame->setContent(Status); - - return rootFrame; - } - - virtual void update() override { - - if (gameStart && NxFps) { - if (!resolutionLookup) { - NxFps -> renderCalls[0].calls = 0xFFFF; - resolutionLookup = 1; - } - else if (resolutionLookup == 1) { - if ((NxFps -> renderCalls[0].calls) != 0xFFFF) resolutionLookup = 2; - else return; - } - memcpy(&m_resolutionRenderCalls, &(NxFps -> renderCalls), sizeof(m_resolutionRenderCalls)); - memcpy(&m_resolutionViewportCalls, &(NxFps -> viewportCalls), sizeof(m_resolutionViewportCalls)); - qsort(m_resolutionRenderCalls, 8, sizeof(resolutionCalls), compare); - qsort(m_resolutionViewportCalls, 8, sizeof(resolutionCalls), compare); - snprintf(Resolutions_c, sizeof Resolutions_c, - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d", - m_resolutionRenderCalls[0].width, m_resolutionRenderCalls[0].height, m_resolutionRenderCalls[0].calls, - m_resolutionRenderCalls[1].width, m_resolutionRenderCalls[1].height, m_resolutionRenderCalls[1].calls, - m_resolutionRenderCalls[2].width, m_resolutionRenderCalls[2].height, m_resolutionRenderCalls[2].calls, - m_resolutionRenderCalls[3].width, m_resolutionRenderCalls[3].height, m_resolutionRenderCalls[3].calls, - m_resolutionRenderCalls[4].width, m_resolutionRenderCalls[4].height, m_resolutionRenderCalls[4].calls, - m_resolutionRenderCalls[5].width, m_resolutionRenderCalls[5].height, m_resolutionRenderCalls[5].calls, - m_resolutionRenderCalls[6].width, m_resolutionRenderCalls[6].height, m_resolutionRenderCalls[6].calls, - m_resolutionRenderCalls[7].width, m_resolutionRenderCalls[7].height, m_resolutionRenderCalls[7].calls - ); - snprintf(Resolutions2_c, sizeof Resolutions2_c, - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d\n" - "%dx%d, %d", - m_resolutionViewportCalls[0].width, m_resolutionViewportCalls[0].height, m_resolutionViewportCalls[0].calls, - m_resolutionViewportCalls[1].width, m_resolutionViewportCalls[1].height, m_resolutionViewportCalls[1].calls, - m_resolutionViewportCalls[2].width, m_resolutionViewportCalls[2].height, m_resolutionViewportCalls[2].calls, - m_resolutionViewportCalls[3].width, m_resolutionViewportCalls[3].height, m_resolutionViewportCalls[3].calls, - m_resolutionViewportCalls[4].width, m_resolutionViewportCalls[4].height, m_resolutionViewportCalls[4].calls, - m_resolutionViewportCalls[5].width, m_resolutionViewportCalls[5].height, m_resolutionViewportCalls[5].calls, - m_resolutionViewportCalls[6].width, m_resolutionViewportCalls[6].height, m_resolutionViewportCalls[6].calls, - m_resolutionViewportCalls[7].width, m_resolutionViewportCalls[7].height, m_resolutionViewportCalls[7].calls - ); - } - if (FPSavg < 254) { - gameStart = true; - } - else { - gameStart = false; - resolutionLookup = false; - } - - if (!skipOnce) { - if (runOnce) { - isRendering = true; - leventClear(&renderingStopEvent); - runOnce = false; - } - } else { - skipOnce = false; - } - } - - virtual bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) override { - // Static variables to maintain drag state between function calls - static bool oldTouchDetected = false; - static bool oldMinusHeld = false; - static bool oldPlusHeld = false; - static HidTouchState initialTouchPos = {0}; - static int initialFrameOffsetX = 0; - static int initialFrameOffsetY = 0; - static constexpr int TOUCH_THRESHOLD = 8; - static bool hasMoved = false; - - // Better touch detection - check if coordinates are within reasonable screen bounds - const bool currentTouchDetected = (touchPos.x > 0 && touchPos.y > 0 && - touchPos.x < screenWidth && touchPos.y < screenHeight); - - static bool clearOnRelease = false; - - if (clearOnRelease && !isRendering) { - clearOnRelease = false; - isRendering = true; - leventClear(&renderingStopEvent); - } - - // Calculate overlay bounds - // Cache bounds calculation - static int cachedBaseX = 0; - static int cachedBaseY = 0; - static bool boundsNeedUpdate = true; - - // Only recalculate bounds when needed - if (boundsNeedUpdate) { - cachedBaseX = 0; - cachedBaseY = 0; - boundsNeedUpdate = false; - } - - const int overlayX = cachedBaseX + frameOffsetX; - const int overlayY = cachedBaseY + frameOffsetY; - - // Overlay dimensions based on game state - int overlayWidth, overlayHeight; - overlayWidth = 360-20; - overlayHeight = 200; - - // Add padding to make touch detection more forgiving - static constexpr int touchPadding = 4; - const int touchableX = overlayX - touchPadding; - const int touchableY = overlayY - touchPadding; - const int touchableWidth = overlayWidth + (touchPadding * 2); - const int touchableHeight = overlayHeight + (touchPadding * 2); - - // Screen boundaries for clamping - const int minX = -cachedBaseX + framePadding; - const int maxX = screenWidth - overlayWidth - cachedBaseX - framePadding; - const int minY = -cachedBaseY + framePadding; - const int maxY = screenHeight - overlayHeight - cachedBaseY - framePadding; - - const bool minusDragReady = buttonState.minusDragActive.load(std::memory_order_acquire); - const bool plusDragReady = buttonState.plusDragActive.load(std::memory_order_acquire); - - // Check button states - const bool currentMinusHeld = (keysHeld & KEY_MINUS) && !(keysHeld & ~KEY_MINUS & ALL_KEYS_MASK) && minusDragReady; - const bool currentPlusHeld = (keysHeld & KEY_PLUS) && !(keysHeld & ~KEY_PLUS & ALL_KEYS_MASK) && plusDragReady; - - // Handle touch dragging - if (currentTouchDetected && !isDragging) { - const int touchX = touchPos.x; - const int touchY = touchPos.y; - - if (!oldTouchDetected) { - // Touch just started - check if within overlay bounds - if (touchX >= touchableX && touchX <= touchableX + touchableWidth && - touchY >= touchableY && touchY <= touchableY + touchableHeight) { - - // Start touch dragging - isDragging = true; - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - hasMoved = false; - initialTouchPos = touchPos; - initialFrameOffsetX = frameOffsetX; - initialFrameOffsetY = frameOffsetY; - } - } - } else if (currentTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Continue touch dragging - const int touchX = touchPos.x; - const int touchY = touchPos.y; - const int deltaX = touchX - initialTouchPos.x; - const int deltaY = touchY - initialTouchPos.y; - - // Check if we've moved enough to consider this a drag - if (!hasMoved) { - const int totalMovement = abs(deltaX) + abs(deltaY); - if (totalMovement >= TOUCH_THRESHOLD) { - hasMoved = true; - } - } - - if (hasMoved) { - // Update frame offsets with boundary checking - const int newFrameOffsetX = std::max(minX, std::min(maxX, initialFrameOffsetX + deltaX)); - const int newFrameOffsetY = std::max(minY, std::min(maxY, initialFrameOffsetY + deltaY)); - - frameOffsetX = newFrameOffsetX; - frameOffsetY = newFrameOffsetY; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - - boundsNeedUpdate = true; - } - } else if (!currentTouchDetected && oldTouchDetected && isDragging && !currentMinusHeld && !currentPlusHeld) { - // Touch just released - if (hasMoved) { - // Save position when touch drag ends - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["game_resolutions"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["game_resolutions"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - } - - // Reset touch drag state - isDragging = false; - hasMoved = false; - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Handle joystick dragging (MINUS + right joystick OR PLUS + left joystick) - if ((currentMinusHeld || currentPlusHeld) && !isDragging) { - // Start joystick dragging - isDragging = true; - triggerRumbleClick.store(true, std::memory_order_release); - triggerOnSound.store(true, std::memory_order_release); - } else if ((currentMinusHeld || currentPlusHeld) && isDragging) { - // Continue joystick dragging - static constexpr int JOYSTICK_DEADZONE = 20; - - // Choose the appropriate joystick based on which button is held - const HidAnalogStickState& activeJoystick = currentMinusHeld ? joyStickPosRight : joyStickPosLeft; - - // Only move if joystick is outside deadzone - if (abs(activeJoystick.x) > JOYSTICK_DEADZONE || abs(activeJoystick.y) > JOYSTICK_DEADZONE) { - // Calculate joystick magnitude - const float magnitude = sqrt((float)(activeJoystick.x * activeJoystick.x + activeJoystick.y * activeJoystick.y)); - const float normalizedMagnitude = magnitude / 32767.0f; - - // Smooth curve for sensitivity - static constexpr float baseSensitivity = 0.00008f; - static constexpr float maxSensitivity = 0.0005f; - - const float curveValue = pow(normalizedMagnitude, 8.0f); - const float currentSensitivity = baseSensitivity + (maxSensitivity - baseSensitivity) * curveValue; - - // Calculate movement delta with fractional accumulation - static float accumulatedX = 0.0f; - static float accumulatedY = 0.0f; - - accumulatedX += (float)activeJoystick.x * currentSensitivity; - accumulatedY += -(float)activeJoystick.y * currentSensitivity; - - const int deltaX = (int)accumulatedX; - const int deltaY = (int)accumulatedY; - accumulatedX -= deltaX; - accumulatedY -= deltaY; - - // Update frame offsets with boundary checking - const int newFrameOffsetX = std::max(minX, std::min(maxX, frameOffsetX + deltaX)); - const int newFrameOffsetY = std::max(minY, std::min(maxY, frameOffsetY + deltaY)); - - frameOffsetX = newFrameOffsetX; - frameOffsetY = newFrameOffsetY; - - if (ult::limitedMemory) { - tsl::gfx::Renderer::get().setLayerPos(std::max(std::min((int)(frameOffsetX*1.5 + 0.5) - tsl::impl::currentUnderscanPixels.first, 1280-32 - tsl::impl::currentUnderscanPixels.first), 0), 0); - } - - boundsNeedUpdate = true; - } - } else if (((!currentMinusHeld && oldMinusHeld) || (!currentPlusHeld && oldPlusHeld)) && isDragging) { - // Button just released - stop joystick dragging - auto iniData = ult::getParsedDataFromIniFile(configIniPath); - iniData["game_resolutions"]["frame_offset_x"] = std::to_string(frameOffsetX); - iniData["game_resolutions"]["frame_offset_y"] = std::to_string(frameOffsetY); - ult::saveIniFileData(configIniPath, iniData); - isDragging = false; - clearOnRelease = true; - triggerRumbleDoubleClick.store(true, std::memory_order_release); - triggerOffSound.store(true, std::memory_order_release); - } - - // Update state for next frame - oldTouchDetected = currentTouchDetected; - oldMinusHeld = currentMinusHeld; - oldPlusHeld = currentPlusHeld; - - // Handle existing key input logic (but don't interfere with dragging) - if (!isDragging) { - if (isKeyComboPressed(keysHeld, keysDown)) { - isRendering = false; - leventSignal(&renderingStopEvent); - runOnce = true; - skipOnce = true; - TeslaFPS = 60; - lastSelectedItem = "Game Resolutions"; - lastMode = ""; - if (skipMain) { - lastMode = "return"; - tsl::goBack(); - } - else { - tsl::setNextOverlay(filepath.c_str(), "--lastSelectedItem 'Game Resolutions'"); - tsl::Overlay::get()->close(); - } - return true; - } - } - - // Return true if we handled the input (during dragging) - return isDragging; - } -}; \ No newline at end of file diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/pwm.c b/Source/Horizon-OC-Monitor (deprecated)/source/pwm.c deleted file mode 100644 index d556e7ca..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/pwm.c +++ /dev/null @@ -1,35 +0,0 @@ -#define NX_SERVICE_ASSUME_NON_DOMAIN -#include -#include -#include "pwm.h" - -static Service g_pwmSrv; - -NX_GENERATE_SERVICE_GUARD(pwm); - -Result _pwmInitialize(void) { - return smGetService(&g_pwmSrv, "pwm"); -} - -void _pwmCleanup(void) { - serviceClose(&g_pwmSrv); -} - -Service* pwmGetServiceSession(void) { - return &g_pwmSrv; -} - -Result pwmOpenSession2(PwmChannelSession *out, u32 device_code) { - return serviceDispatchIn(&g_pwmSrv, 2, device_code, - .out_num_objects = 1, - .out_objects = &out->s, - ); -} - -Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out) { - return serviceDispatchOut(&c->s, 7, *out); -} - -void pwmChannelSessionClose(PwmChannelSession *c) { - serviceClose(&c->s); -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/rgltr_services.cpp b/Source/Horizon-OC-Monitor (deprecated)/source/rgltr_services.cpp deleted file mode 100644 index 5f2160db..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/rgltr_services.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// rgltr_services.cpp (no changes needed here—just compile it once) -#include -#include "rgltr.h" -#include "rgltr_services.h" // for extern Service g_rgltrSrv, etc. - -// Global service handle -Service g_rgltrSrv; - -Result rgltrInitialize(void) { - if (hosversionBefore(8, 0, 0)) { - return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - } - return smGetService(&g_rgltrSrv, "rgltr"); -} - -void rgltrExit(void) { - serviceClose(&g_rgltrSrv); -} - -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id) { - const u32 in = (u32)module_id; - return serviceDispatchIn( - &g_rgltrSrv, - 0, - in, - .out_num_objects = 1, - .out_objects = &session_out->s - ); -} - -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt) { - // Service returns µV (microvolts) in a local u32: - u32 temp = 0; - Result rc = serviceDispatchOut(&session->s, 4, temp); - if (R_SUCCEEDED(rc)) { - *out_volt = temp; - } - return rc; -} - -void rgltrCloseSession(RgltrSession* session) { - serviceClose(&session->s); -} diff --git a/Source/Horizon-OC-Monitor (deprecated)/source/sysclk_ipc.c b/Source/Horizon-OC-Monitor (deprecated)/source/sysclk_ipc.c deleted file mode 100644 index 6d3172b3..00000000 --- a/Source/Horizon-OC-Monitor (deprecated)/source/sysclk_ipc.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* -------------------------------------------------------------------------- - * "THE BEER-WARE LICENSE" (Revision 42): - * , , - * wrote this file. As long as you retain this notice you can do whatever you - * want with this stuff. If you meet any of us some day, and you think this - * stuff is worth it, you can buy us a beer in return. - The sys-clk authors - * -------------------------------------------------------------------------- - */ - - -#define NX_SERVICE_ASSUME_NON_DOMAIN -#include -#include -#include -#include - -static Service g_hocclkSrv; -static atomic_size_t g_refCnt; - -bool hocclkIpcRunning() -{ - Handle handle; - bool running = R_FAILED(smRegisterService(&handle, smEncodeName(HOCCLK_IPC_SERVICE_NAME), false, 1)); - - if (!running) - { - smUnregisterService(smEncodeName(HOCCLK_IPC_SERVICE_NAME)); - } - - return running; -} - -Result hocclkIpcInitialize(void) -{ - Result rc = 0; - - g_refCnt++; - - if (serviceIsActive(&g_hocclkSrv)) - return 0; - - rc = smGetService(&g_hocclkSrv, HOCCLK_IPC_SERVICE_NAME); - - if (R_FAILED(rc)) hocclkIpcExit(); - - return rc; -} - -void hocclkIpcExit(void) -{ - if (--g_refCnt == 0) - { - serviceClose(&g_hocclkSrv); - } -} - -Result hocclkIpcGetAPIVersion(u32* out_ver) -{ - return serviceDispatchOut(&g_hocclkSrv, HocClkIpcCmd_GetApiVersion, *out_ver); -} - -Result hocclkIpcGetVersionString(char* out, size_t len) -{ - return serviceDispatch(&g_hocclkSrv, HocClkIpcCmd_GetVersionString, - .buffer_attrs = { SfBufferAttr_HipcAutoSelect | SfBufferAttr_Out }, - .buffers = {{out, len}}, - ); -} - -Result hocclkIpcGetCurrentContext(HocClkContext* out_context) -{ - return serviceDispatch(&g_hocclkSrv, HocClkIpcCmd_GetCurrentContext, - .buffer_attrs = { SfBufferAttr_HipcAutoSelect | SfBufferAttr_Out }, - .buffers = {{out_context, sizeof(HocClkContext)}}, - ); -} - -Result hocclkIpcGetProfileCount(u64 tid, u8* out_count) -{ - return serviceDispatchInOut(&g_hocclkSrv, HocClkIpcCmd_GetProfileCount, tid, *out_count); -} - -Result hocclkIpcSetEnabled(bool enabled) -{ - u8 enabledRaw = (u8)enabled; - return serviceDispatchIn(&g_hocclkSrv, HocClkIpcCmd_SetEnabled, enabledRaw); -} - -Result hocclkIpcSetOverride(HocClkModule module, u32 hz) -{ - HocClkIpc_SetOverride_Args args = { - .module = module, - .hz = hz - }; - return serviceDispatchIn(&g_hocclkSrv, HocClkIpcCmd_SetOverride, args); -} - -Result hocclkIpcGetProfiles(u64 tid, HocClkTitleProfileList* out_profiles) -{ - return serviceDispatchIn(&g_hocclkSrv, HocClkIpcCmd_GetProfiles, tid, - .buffer_attrs = { SfBufferAttr_HipcAutoSelect | SfBufferAttr_Out }, - .buffers = {{out_profiles, sizeof(HocClkTitleProfileList)}}, - ); -} - -Result hocclkIpcSetProfiles(u64 tid, HocClkTitleProfileList* profiles) -{ - HocClkIpc_SetProfiles_Args args; - args.tid = tid; - memcpy(&args.profiles, profiles, sizeof(HocClkTitleProfileList)); - return serviceDispatchIn(&g_hocclkSrv, HocClkIpcCmd_SetProfiles, args); -} - -Result hocclkIpcGetConfigValues(HocClkConfigValueList* out_configValues) -{ - return serviceDispatch(&g_hocclkSrv, HocClkIpcCmd_GetConfigValues, - .buffer_attrs = { SfBufferAttr_HipcAutoSelect | SfBufferAttr_Out }, - .buffers = {{out_configValues, sizeof(HocClkConfigValueList)}}, - ); -} - -Result hocclkIpcSetConfigValues(HocClkConfigValueList* configValues) -{ - return serviceDispatch(&g_hocclkSrv, HocClkIpcCmd_SetConfigValues, - .buffer_attrs = { SfBufferAttr_HipcAutoSelect | SfBufferAttr_In }, - .buffers = {{configValues, sizeof(HocClkConfigValueList)}}, - ); -} - -Result hocclkIpcGetFreqList(HocClkModule module, u32* list, u32 maxCount, u32* outCount) -{ - HocClkIpc_GetFreqList_Args args = { - .module = module, - .maxCount = maxCount - }; - return serviceDispatchInOut(&g_hocclkSrv, HocClkIpcCmd_GetFreqList, args, *outCount, - .buffer_attrs = { SfBufferAttr_HipcAutoSelect | SfBufferAttr_Out }, - .buffers = {{list, maxCount * sizeof(u32)}}, - ); -} - -Result hocClkIpcSetKipData() -{ - u32 temp = 0; - return serviceDispatchIn(&g_hocclkSrv, HocClkIpcCmd_SetKipData, temp); -} - -Result hocClkIpcGetKipData() -{ - u32 temp = 0; - return serviceDispatchIn(&g_hocclkSrv, HocClkIpcCmd_GetKipData, temp); -} \ No newline at end of file From 63601e35fa0310eb894635730cafde90205921fb Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 20:08:37 -0400 Subject: [PATCH 108/205] allow hoc-clk to panic --- Source/hoc-clk/sysmodule/perms.json | 8 +++++ Source/hoc-clk/sysmodule/src/board/board.cpp | 37 ++++++++++++++++++-- Source/hoc-clk/sysmodule/src/board/board.hpp | 6 +++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/sysmodule/perms.json b/Source/hoc-clk/sysmodule/perms.json index 57e821af..d6f859d8 100644 --- a/Source/hoc-clk/sysmodule/perms.json +++ b/Source/hoc-clk/sysmodule/perms.json @@ -46,6 +46,14 @@ "size": "0x00001000", "is_io": true } + }, { + "type": "map", + "value": { + "address": "0x60005000", + "is_ro": false, + "size": "0x00001000", + "is_io": true + } }, { "type": "map", "value": { diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 692d83c5..61dd8dfe 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -49,10 +49,16 @@ #include "board_volt.hpp" #include #include - +#include "../mapping/mem_map.hpp" namespace board { - u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr; + u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr, tmrVirtAddr; + consteval inline u32 PackCode(u32 r, u32 g, u32 b) { + return ((r & 0xF) << 8) | ((g & 0xF) << 4) | ((b & 0xF) << 0); + } + const u32 GpuPanic = PackCode(0xF, 0x7, 0x0); + const u32 CpuPanic = PackCode(0xF, 0x0, 0x0); + const u32 RamPanic = PackCode(0x0, 0xF, 0xF); HocClkSocType gSocType; u8 gDramID; @@ -160,6 +166,9 @@ namespace board { rc = QueryMemoryMapping(&gpuVirtAddr, 0x57000000, 0x1000000); ASSERT_RESULT_OK(rc, "QueryMemoryMapping (gpu)"); + rc = QueryMemoryMapping(&tmrVirtAddr, 0x60005000, 0x1000); + ASSERT_RESULT_OK(rc, "QueryMemoryMapping (tmr)"); + FetchHardwareInfos(); Result nvCheck = 1; @@ -244,6 +253,30 @@ namespace board { nvExit(); } + #define MMIO32(addr) (*reinterpret_cast(addr)) + NX_NORETURN void panic(u32 r, u32 g, u32 b) { + SmcReadWriteRegister(0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */, ~0, ((r & 0xF) << 8) | ((g & 0xF) << 4) | ((b & 0xF) << 0)); + + /* Write timer magic */ + MMIO32(tmrVirtAddr + 0x18C) = 0xC45A; + + /* Disable counters */ + MMIO32(tmrVirtAddr + 0x188) = 0x2; + + /* Start periodic timer */ + MMIO32(tmrVirtAddr + 0x80) = 0xC0000000; + + /* Set the reboot source to the timer */ + MMIO32(tmrVirtAddr + 0x180) = 0x8019; + + /* Enable counter */ + MMIO32(tmrVirtAddr + 0x188) = 0x1; + + /* Hang. */ + for(;;) + ; + } + HocClkSocType GetSocType() { return gSocType; } diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index e1d57ea5..671ccc56 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -48,6 +48,9 @@ namespace board { extern HocClkConsoleType gConsoleType; extern FuseData fuseData; extern u8 speedoBracket; + extern const u32 GpuPanic; + extern const u32 CpuPanic; + extern const u32 RamPanic; void Initialize(); void Exit(); @@ -58,5 +61,6 @@ namespace board { bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); - + NX_NORETURN void panic(u32 r, u32 g, u32 b); + } // namespace board From 39c612779b9e84a338b2bc73e92926c81830cb1f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 27 Aug 2026 20:10:50 -0400 Subject: [PATCH 109/205] allow hoc-clk to panic --- Source/hoc-clk/sysmodule/src/board/board.cpp | 4 ++-- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 +- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 61dd8dfe..4923f46c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -254,8 +254,8 @@ namespace board { } #define MMIO32(addr) (*reinterpret_cast(addr)) - NX_NORETURN void panic(u32 r, u32 g, u32 b) { - SmcReadWriteRegister(0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */, ~0, ((r & 0xF) << 8) | ((g & 0xF) << 4) | ((b & 0xF) << 0)); + NX_NORETURN void panic(u32 c) { + SmcReadWriteRegister(0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */, ~0, c); /* Write timer magic */ MMIO32(tmrVirtAddr + 0x18C) = 0xC45A; diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 671ccc56..57fa514e 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -61,6 +61,6 @@ namespace board { bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); - NX_NORETURN void panic(u32 r, u32 g, u32 b); + NX_NORETURN void panic(u32 c); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 4fe5003c..23b5dd35 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -146,6 +146,7 @@ namespace bpmp { } fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: BPMP timeout (cannot sleep)"); + board::panic(board::CpuPanic); } void EnableBpmpSmmu() { From 6b88b43cb9ac0a756591f9f54cf262adedf2db30 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 28 Aug 2026 13:43:50 -0400 Subject: [PATCH 110/205] add bpmp-fw cmd interface --- Source/hoc-clk/bpmpfw/source/main.cpp | 37 ++++++++++++----- Source/hoc-clk/bpmpfw/source/regs.cpp | 8 ++++ Source/hoc-clk/bpmpfw/source/regs.hpp | 2 + Source/hoc-clk/common/include/hocclk/bpmp.h | 14 ++++++- .../common/include/hocclk/clock_manager.h | 2 +- Source/hoc-clk/sysmodule/Makefile | 8 +++- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 40 ++++++++++++++++++- 7 files changed, 94 insertions(+), 17 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index b3f49cea..e5c13d36 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -39,11 +39,35 @@ namespace { } // namespace +[[noreturn]] void HandleShutdown(HocClkBpmpSharedInfo &info) { + /* Deinit MMU otherwise sleep will fatal. */ + bpmpMmu::Disable(); + info.magic = 0x0; + printf("[hoc-bpmpfw]: Halting...\n"); + for (;;) + ; +} + +void HandleCommand(HocClkBpmpSharedInfo &info) { + switch (info.cmd) { + case HocClkBpmpCmd_None: + break; + case HocClkBpmpCmd_RequestShutdown: + HandleShutdown(info); + break; + case HocClkBpmpCmd_SetUartEnabled: + g_uartLoggingEnabled = (info.cmdArg1 != 0); + info.cmd = HocClkBpmpCmd_None; + break; + default: + info.cmd = HocClkBpmpCmd_None; + break; + } +} + void MainLoop(HocClkBpmpSharedInfo &info) { for (;;) { - if (info.exitRequested) { - break; - } + HandleCommand(info); const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); @@ -60,13 +84,6 @@ void MainLoop(HocClkBpmpSharedInfo &info) { msleep(250); } - - /* Deinit MMU otherwise sleep will fatal. */ - bpmpMmu::Disable(); - info.magic = 0x0; - - for (;;) - ; } extern "C" void main() { diff --git a/Source/hoc-clk/bpmpfw/source/regs.cpp b/Source/hoc-clk/bpmpfw/source/regs.cpp index 3b80f9af..0a6084b6 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.cpp +++ b/Source/hoc-clk/bpmpfw/source/regs.cpp @@ -33,13 +33,21 @@ } } +bool g_uartLoggingEnabled = true; + void UartPutc(char c) { + if (!g_uartLoggingEnabled) { + return; + } while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) ; MMIO32(UartBBase + UartThr) = static_cast(static_cast(c)); } void UartFlush() { + if (!g_uartLoggingEnabled) { + return; + } while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) ; } diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index 9e0b1d9c..512b305c 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -45,6 +45,8 @@ constexpr u32 UartLsr = 0x14; constexpr u32 UartLsrThre = (1u << 5); constexpr u32 UartLsrTmty = (1u << 6); +extern bool g_uartLoggingEnabled; + void UartPutc(char c); void UartFlush(); diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h index 016719c6..d9c6ffba 100644 --- a/Source/hoc-clk/common/include/hocclk/bpmp.h +++ b/Source/hoc-clk/common/include/hocclk/bpmp.h @@ -22,6 +22,12 @@ #define HOCCLK_BPMP_MAGIC 0x42504D50 // 'BPMP' +typedef enum { + HocClkBpmpCmd_None = 0, + HocClkBpmpCmd_RequestShutdown = 1, // Request BPMP-FW to shut down for sleep mode. + HocClkBpmpCmd_SetUartEnabled = 2, // cmdArg1: 0/1. +} HocClkBpmpCmd; + /* * Shared with BPMP-FW * Any 64 bit data type is not permitted. @@ -41,8 +47,12 @@ typedef struct { u32 emcBwAll; u32 emcBwCpu; u32 emcBwGpu; - u32 exitRequested; // Request BPMP-FW to shutdown for sleep mode + u32 cmd; // HocClkBpmpCmd; 0 = no command pending + u32 cmdArg1; + u32 cmdArg2; + u32 cmdArg3; + u32 cmdArg4; s32 tempAO; } HocClkBpmpSharedInfo; -static_assert(sizeof(HocClkBpmpSharedInfo) == 0x40); +static_assert(sizeof(HocClkBpmpSharedInfo) == 0x50); diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 766412cb..9b6830e5 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -89,7 +89,7 @@ typedef struct { HocClkBpmpSharedInfo bpmpInfo; // Reserved for future use - u8 reserved[0x33C]; + u8 reserved[0x32C]; } HocClkContext; typedef struct diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index 01693f80..7c2eb292 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -105,7 +105,7 @@ export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC) export APP_JSON := $(TOPDIR)/perms.json -.PHONY: $(BUILD) clean clean-libs clean-build all libs +.PHONY: $(BUILD) clean clean-libs clean-build all libs sync-bpmpfw #--------------------------------------------------------------------------------- all: $(BUILD) @@ -116,7 +116,11 @@ libs: $(LIBNAMES): @echo $@ -$(BUILD): libs +sync-bpmpfw: + @$(MAKE) --no-print-directory -C $(TOPDIR)/../bpmpfw + @cp -f $(TOPDIR)/../bpmpfw/out/bpmpfw.bin $(TOPDIR)/data/bpmpfw.bin + +$(BUILD): libs sync-bpmpfw @[ -d $@ ] || mkdir -p $@ @[ -d $(OUTDIR) ] || mkdir -p $(OUTDIR) @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 23b5dd35..ee5e8d6e 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -125,8 +125,8 @@ namespace bpmp { return; } - const u32 one = 1; - Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, exitRequested), &one, sizeof(one)); + const u32 cmd = HocClkBpmpCmd_RequestShutdown; + Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, cmd), &cmd, sizeof(cmd)); if (R_FAILED(rc)) { fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: SmcCopyToIram failed: 0x%x", rc); return; @@ -186,6 +186,40 @@ namespace bpmp { SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); } + bool WaitForBpmpReady(int maxAttempts = 50, u64 pollIntervalNs = 20'000'000) { + HocClkBpmpSharedInfo info = {}; + for (int i = 0; i < maxAttempts; i++) { + Result rc = SmcCopyFromIram(&info, WorkRamPhysBase, sizeof(info)); + if (R_SUCCEEDED(rc) && info.magic == HOCCLK_BPMP_MAGIC) { + return true; + } + svcSleepThread(pollIntervalNs); + } + return false; + } + + void SendBpmpCommand(HocClkBpmpCmd cmd, u32 arg1 = 0, u32 arg2 = 0, u32 arg3 = 0, u32 arg4 = 0) { + if (!WaitForBpmpReady()) { + fileUtils::LogLine("[bpmp] SendBpmpCommand: BPMP never signaled ready (cmd=%u)", static_cast(cmd)); + return; + } + + struct { + u32 cmd; + u32 cmdArg1; + u32 cmdArg2; + u32 cmdArg3; + u32 cmdArg4; + } req = { static_cast(cmd), arg1, arg2, arg3, arg4 }; + static_assert(offsetof(HocClkBpmpSharedInfo, cmdArg1) == offsetof(HocClkBpmpSharedInfo, cmd) + 1 * sizeof(u32)); + static_assert(offsetof(HocClkBpmpSharedInfo, cmdArg4) == offsetof(HocClkBpmpSharedInfo, cmd) + 4 * sizeof(u32)); + + const Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, cmd), &req, sizeof(req)); + if (R_FAILED(rc)) { + fileUtils::LogLine("[bpmp] SendBpmpCommand: SmcCopyToIram failed: 0x%x (cmd=%u)", rc, static_cast(cmd)); + } + } + void RestoreStockState() { RequestBpmpExitAndWait(); @@ -306,6 +340,8 @@ namespace bpmp { /* Clear the halt written by bootloader. */ SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0xFFFFFFFF, FlowModeNone); + SendBpmpCommand(HocClkBpmpCmd_SetUartEnabled, fileUtils::IsUartEnabled() ? 1u : 0u); + return 0; } From 4ac7f472d9fe2f62f173564053603b67da39ae4d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 28 Aug 2026 14:45:37 -0400 Subject: [PATCH 111/205] bpmpfw uart changes --- Source/hoc-clk/bpmpfw/source/main.cpp | 6 +++--- Source/hoc-clk/bpmpfw/source/regs.cpp | 13 ++++++++++++- Source/hoc-clk/bpmpfw/source/regs.hpp | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp index e5c13d36..e32885cf 100644 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ b/Source/hoc-clk/bpmpfw/source/main.cpp @@ -43,7 +43,7 @@ namespace { /* Deinit MMU otherwise sleep will fatal. */ bpmpMmu::Disable(); info.magic = 0x0; - printf("[hoc-bpmpfw]: Halting...\n"); + UartPutsForce("[hoc-bpmpfw]: Halting...\n"); for (;;) ; } @@ -91,7 +91,7 @@ extern "C" void main() { InitializeLibc(); - printf("[hoc-bpmpfw]: Starting bpmpfw\n"); + UartPutsForce("[hoc-bpmpfw]: Starting bpmpfw\n"); HocClkBpmpSharedInfo &info = SharedInfo(); memset(&info, 0, sizeof(info)); @@ -104,7 +104,7 @@ extern "C" void main() { /* If the main loop exits then it is a panic or invalid state */ MainLoop(info); - printf("[hoc-bpmpfw]: PANIC\n"); + UartPutsForce("[hoc-bpmpfw]: PANIC\n"); /* Kill execution */ _panic_reboot(); diff --git a/Source/hoc-clk/bpmpfw/source/regs.cpp b/Source/hoc-clk/bpmpfw/source/regs.cpp index 0a6084b6..3995fea4 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.cpp +++ b/Source/hoc-clk/bpmpfw/source/regs.cpp @@ -33,7 +33,7 @@ } } -bool g_uartLoggingEnabled = true; +bool g_uartLoggingEnabled = false; void UartPutc(char c) { if (!g_uartLoggingEnabled) { @@ -64,3 +64,14 @@ void UartPutHex32(u32 v) { UartPutc(digits[(v >> i) & 0xF]); } } + +void UartPutsForce(const char *s) { + while (*s) { + while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) + ; + MMIO32(UartBBase + UartThr) = static_cast(static_cast(*s++)); + } + + while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) + ; +} diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp index 512b305c..d0ebf3d6 100644 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ b/Source/hoc-clk/bpmpfw/source/regs.hpp @@ -54,3 +54,5 @@ void UartFlush(); void UartPuts(const char *s); void UartPutHex32(u32 v); + +void UartPutsForce(const char *s); From ac31a3defa0fe5889d0d239be69f320986ead8a2 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 30 Aug 2026 20:16:38 +0200 Subject: [PATCH 112/205] Revert "ipc: allow mismatached provided buffer size as long as the stable region is covered" This reverts commit 40ec8dee8cd912b607925b9ef3ef0525a83e368a. --- Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index c51f8195..f1e01d9b 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -24,7 +24,6 @@ * -------------------------------------------------------------------------- */ -#include #include #include #include @@ -49,8 +48,6 @@ namespace ipcService { LockableMutex gThreadMutex; IpcServer gServer; - constexpr size_t gMinContextBufSize = offsetof(HocClkContext, stable) + sizeof(HocClkContext::stable); - Result GetApiVersion(u32 *out_version) { *out_version = HOCCLK_IPC_API_VERSION; return 0; @@ -63,9 +60,8 @@ namespace ipcService { return 0; } - Result GetCurrentContext(void *out_buf, size_t bufSize) { - HocClkContext ctx = clockManager::GetCurrentContext(); - memcpy(out_buf, &ctx, bufSize < sizeof(ctx) ? bufSize : sizeof(ctx)); + Result GetCurrentContext(HocClkContext *out_ctx) { + *out_ctx = clockManager::GetCurrentContext(); return 0; } @@ -166,8 +162,8 @@ namespace ipcService { case HocClkIpcCmd_GetCurrentContext: if (r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); - if (bufSize >= gMinContextBufSize) { - return GetCurrentContext(hipcGetBufferAddress(r->hipc.data.recv_buffers), bufSize); + if (bufSize >= sizeof(HocClkContext)) { + return GetCurrentContext((HocClkContext *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; From 79c6b81da2133ad9c0bcd739b554e670ea684ab7 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 30 Aug 2026 20:20:45 +0200 Subject: [PATCH 113/205] fix context size --- Source/hoc-clk/common/include/hocclk/clock_manager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 9b6830e5..794e0c1e 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -89,7 +89,7 @@ typedef struct { HocClkBpmpSharedInfo bpmpInfo; // Reserved for future use - u8 reserved[0x32C]; + u8 reserved[0x30C]; } HocClkContext; typedef struct @@ -104,4 +104,4 @@ typedef struct #define HOCCLK_GLOBAL_PROFILE_TID 0xA111111111111111 -static_assert(sizeof(HocClkContext) == 0x520); +static_assert(sizeof(HocClkContext) == 0x500); From 349a9200c5291857adc25a3946e2481e5e24b72d Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 1 Sep 2026 16:51:57 +0200 Subject: [PATCH 114/205] more accurate mariko timings --- .../loader/source/oc/mtc_timing_value.hpp | 2 + .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 2 - .../pcv/mariko/calculate_timings_mariko.cpp | 40 +++++++++++++------ .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 2 - 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 15eaea19..6dcf9ef0 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -30,6 +30,8 @@ namespace ams::ldr::hoc { #define PACK_U32(high, low) ((static_cast(high) << 16) | (static_cast(low) & 0xFFFF)) #define PACK_U32_NIBBLE_HIGH_BYTE_LOW(high, low) ((static_cast(high & 0xF) << 28) | (static_cast(low) & 0xFF)) + #define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg)) + /* Burst latency, not to be confused with base latency (tWRL). */ const u32 BL = 16; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index c0265464..f2c7808b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -48,8 +48,6 @@ namespace ams::ldr::hoc::pcv::erista { TABLE->shadow_regs_ca_train.PARAM = VALUE; \ TABLE->shadow_regs_rdwr_train.PARAM = VALUE; - #define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg)) - /* Ram power down */ /* B31: DRAM_CLKSTOP_PD */ /* B30: DRAM_CLKSTOP_SR */ diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 7aa207cd..b424ea81 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -149,7 +149,7 @@ namespace ams::ldr::hoc::pcv::mariko { u32 tREFI = lowFreq ? C.low_t8_tREFI : C.t8_tREFI; refresh_raw = 0xFFFF; if (tREFI != 6) { - refresh_raw = CEIL(tREFpb_values[tREFI] / tCK_avg) - 0x40; + refresh_raw = GET_CYCLE_CEIL(tREFpb_values[tREFI]) - 0x40; refresh_raw = MIN(refresh_raw, static_cast(0xFFFF)); } @@ -164,9 +164,9 @@ namespace ams::ldr::hoc::pcv::mariko { tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); - u32 fullRoundDelay = CEIL((flyByTime + tDQSCK_max) / tCK_avg); + double fullRoundDelay = flyByTime + tDQSCK_max; /* Read data valid: Read command -> data ready to be latched into the registers. */ - rdv = RL + fullRoundDelay + 16; + rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 16; /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ qpop = rdv - 14; @@ -174,21 +174,35 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr double TrimmerStepPs = 3.0; constexpr double MaxTrimmerSteps = 96.0; - double tCkAvgPs = tCK_avg * 1000.0; - double tckDerated = tCkAvgPs * 0.85; - u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); - double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; - u32 fullTripDerating = fullRoundDelay - CEIL((flyByTime + tDQSCK_max - deratedNsDelay) / tCK_avg); - u32 readEyeStart = FLOOR((flyByTime + 0.94) / tCK_avg) + RL; + double tCkAvgPs = tCK_avg * 1000.0; + double tckDerated = tCkAvgPs * 0.85; + u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); + double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; + /* readEyeEndDerated, nv call this quseExtra. */ + u32 quseExtra = GET_CYCLE_CEIL(fullRoundDelay - deratedNsDelay); + /* The amount of deration from the perspective of a full round trip. */ + u32 readEyeEndDerateMargin = GET_CYCLE_CEIL(fullRoundDelay) - quseExtra; + + u32 tQuse = FLOOR((flyByTime + 0.94) / tCK_avg); + u32 readEyeStart = tQuse + RL + 1; + + u32 einputMinimal = readEyeStart + readEyeEndDerateMargin - 2; /* Data valid window, quse aligns with the start of the read eye (probably). */ /* DQS needs to be logically and'ed with quse in order to be valid. */ - quse = readEyeStart + fullTripDerating - 2; + /* einputMinimal satisfies this. */ + quse = einputMinimal; + + /* input takes time to enable. */ + u32 einputLatency = GET_CYCLE_CEIL(10.0); + + /* Enable input receiver. */ + einput = einputMinimal - einputLatency; + + /* Difference between the two eye edges. */ + quse_width = quseExtra - tQuse + 4; - quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); - quse = FLOOR(RL + ((5.082 / tCK_avg) + FLOOR(2.560 / tCK_avg))) - CEIL(4.820 / tCK_avg); einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; - einput = quse - CEIL(9.928 / tCK_avg); u32 qrst_duration = FLOOR(8.399 - tCK_avg); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 4b2c6531..d7187425 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -47,8 +47,6 @@ namespace ams::ldr::hoc::pcv::mariko { const double tCK_avg = 1000'000.0 / table->rate_khz; - #define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg)) - /* Ram power down */ /* B31: DRAM_CLKSTOP_PD */ /* B30: DRAM_CLKSTOP_SR */ From 1b32d21860f1e330afe4d15a3276024d648ee143 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 1 Sep 2026 17:04:20 +0200 Subject: [PATCH 115/205] mariko timings: einput_duration, seems reasonable? --- .../source/oc/pcv/mariko/calculate_timings_mariko.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index b424ea81..6bf01902 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -166,10 +166,10 @@ namespace ams::ldr::hoc::pcv::mariko { double fullRoundDelay = flyByTime + tDQSCK_max; /* Read data valid: Read command -> data ready to be latched into the registers. */ - rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 16; + rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 16; /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ - qpop = rdv - 14; + qpop = rdv - 14; constexpr double TrimmerStepPs = 3.0; constexpr double MaxTrimmerSteps = 96.0; @@ -202,7 +202,7 @@ namespace ams::ldr::hoc::pcv::mariko { /* Difference between the two eye edges. */ quse_width = quseExtra - tQuse + 4; - einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; + einput_duration = einputLatency + quse_width + 4; u32 qrst_duration = FLOOR(8.399 - tCK_avg); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); From 196121884f7481db458454c0843fcbb1cab4b58b Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:13:46 +0200 Subject: [PATCH 116/205] mariko timings: improve qrst_duration (brute forced values) --- .../source/oc/pcv/mariko/calculate_timings_mariko.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 6bf01902..83085b53 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -193,7 +193,7 @@ namespace ams::ldr::hoc::pcv::mariko { /* einputMinimal satisfies this. */ quse = einputMinimal; - /* input takes time to enable. */ + /* input receiver takes time to enable. */ u32 einputLatency = GET_CYCLE_CEIL(10.0); /* Enable input receiver. */ @@ -202,8 +202,12 @@ namespace ams::ldr::hoc::pcv::mariko { /* Difference between the two eye edges. */ quse_width = quseExtra - tQuse + 4; + /* Duration of input receiver being enabled? */ einput_duration = einputLatency + quse_width + 4; - u32 qrst_duration = FLOOR(8.399 - tCK_avg); + + /* qrst_duration is CEIL(a / tCK_avg + b) */ + /* a and b were derived through a brute forcer. */ + u32 qrst_duration = CEIL(1.4 / tCK_avg + 3.5); u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); qrst = PACK_U32(qrst_duration, qrstLow); ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); From afde93e2b9a18e6e65e4572ce9dabeb0d58e0967 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:40:18 +0200 Subject: [PATCH 117/205] mariko timings: rw2pden cleanup --- .../loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 83085b53..ac58276b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -213,7 +213,7 @@ namespace ams::ldr::hoc::pcv::mariko { ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + tWTPDEN = CEIL(((1.8 / tCK_avg) + MAX(RL + (2.7 / tCK_avg), static_cast(tW2P))) + (BL / 2)); const s32 wlToRl = static_cast(WL) - static_cast(RL); tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * wlToRl), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; tWTM = CEIL(WL + ((7.570 / tCK_avg) + 8.753)); From 427e5cfded4ced46d735067de7b48cb3761e68ec Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Fri, 4 Sep 2026 17:53:27 -0400 Subject: [PATCH 118/205] change defaults + comments --- .../Atmosphere/stratosphere/loader/source/oc/customize.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index dc0a21b5..423ee84f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -36,14 +36,14 @@ volatile CustomizeTable C = { .hpMode = DISABLED, .commonEmcMemVolt = 1175000, /* LPDDR4(X) JEDEC Specification */ -.eristaEmcMaxClock = 1600000, /* Maximum HB-MGCH ram rating */ +.eristaEmcMaxClock = 1600000, /* Erista ram rating*/ /* Available: 33MHz step rate, 66MHz step rate, 100MHz step rate, 133MHz step rate and jedec. */ /* Jedec freqs are 1333MHz, 1600MHz, 1866MHz, 2133MHz, 2400MHz, 2666MHz, 2933MHz, 3200MHz. */ .stepMode = StepMode_Jedec, -.marikoEmcMaxClock = 2133000, /* Requires the EMC DVFS 63-entry patches (EMC DVFS Count / EMC SoC LUT). */ -.marikoEmcVddqVolt = 600000, +.marikoEmcMaxClock = 2133000, /* Should work for every ram*/ +.marikoEmcVddqVolt = 640000, /* Optimal for DRAM OC */ .emcDvbShift = 0, .marikoSocVmax = 0, /* 0 = stock limits (1450 - 1597 is 1050mV, 1598-1708 is 1025mV, 1709+ is 1000mV). */ From 0169e44b3b5ef7de485837fe1c523636ffd76c38 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 5 Sep 2026 10:30:48 -0400 Subject: [PATCH 119/205] reduce heap size --- Source/hoc-clk/sysmodule/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index f2452f05..782f2e3c 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -38,7 +38,7 @@ #include "mgr/clock_manager.hpp" -#define INNER_HEAP_SIZE 0x48000 +#define INNER_HEAP_SIZE 0x41000 extern "C" { void virtmemSetup(void); From 28265faedcd8e36419716beb64607c2b0deb5c11 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 5 Sep 2026 15:58:08 -0400 Subject: [PATCH 120/205] complete config refactor --- Source/hoc-clk/build.sh | 6 +- Source/hoc-clk/common/include/hocclk/config.h | 5 + Source/hoc-clk/config.ini.template | 19 - Source/hoc-clk/sysmodule/src/file/config.cpp | 533 +++++++++++++++--- Source/hoc-clk/sysmodule/src/file/config.hpp | 6 + .../hoc-clk/sysmodule/src/file/file_utils.hpp | 5 + Source/hoc-clk/sysmodule/src/main.cpp | 2 +- .../templates/kip/current.ini.template | 1 + Source/hoc-clk/templates/profiles/README.ini | 11 + .../hoc-clk/templates/settings.ini.template | 1 + 10 files changed, 504 insertions(+), 85 deletions(-) delete mode 100644 Source/hoc-clk/config.ini.template create mode 100644 Source/hoc-clk/templates/kip/current.ini.template create mode 100644 Source/hoc-clk/templates/profiles/README.ini create mode 100644 Source/hoc-clk/templates/settings.ini.template diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index 74634101..70b045d0 100755 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -53,7 +53,11 @@ echo echo "*** Copying assets ***" mkdir -p "$DIST_DIR/config/horizon-oc" -cp -vf "$ROOT_DIR/config.ini.template" "$DIST_DIR/config/horizon-oc/config.ini.template" +cp -vf "$ROOT_DIR/templates/settings.ini.template" "$DIST_DIR/config/horizon-oc/settings.ini.template" +mkdir -p "$DIST_DIR/config/horizon-oc/kip" +cp -vf "$ROOT_DIR/templates/kip/current.ini.template" "$DIST_DIR/config/horizon-oc/kip/current.ini.template" +mkdir -p "$DIST_DIR/config/horizon-oc/profiles" +cp -vf "$ROOT_DIR/templates/profiles/README.ini" "$DIST_DIR/config/horizon-oc/profiles/README.ini" mkdir -p "$DIST_DIR/config/ultrahand/assets/notifications" cp -vf "$ROOT_DIR/assets/hoc.rgba" "$DIST_DIR/config/ultrahand/assets/notifications/hoc.rgba" diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index c9262f81..e1d411dc 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -555,6 +555,11 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr } } +static inline bool hocclkIsKipConfigValue(HocClkConfigValue val) +{ + return val >= KipConfigValue_custRev && val <= KipCrc32; +} + static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) { switch(val) diff --git a/Source/hoc-clk/config.ini.template b/Source/hoc-clk/config.ini.template deleted file mode 100644 index 4305c725..00000000 --- a/Source/hoc-clk/config.ini.template +++ /dev/null @@ -1,19 +0,0 @@ -[values] -; Defines how often sys-clk log temperatures, in milliseconds (set 0 to disable) -temp_log_interval_ms=0 -; Defines how often sys-clk writes to the CSV, in milliseconds (set 0 to disable) -csv_write_interval_ms=0 - -; Example #1: BOTW -; Overclock CPU when docked -; Overclock MEM to docked clocks when handheld -;[01007EF00011E000] -;docked_cpu=1224 -;handheld_mem=1600 - -; Example #2: Picross -; Underclock to save battery -;[0100BA0003EEA000] -;handheld_cpu=816 -;handheld_gpu=153 -;handheld_mem=800 \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index 018571a5..e36d8013 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -55,30 +56,37 @@ namespace config { namespace { bool gLoaded = false; - std::string gPath; - time_t gMtime = 0; + std::string gSettingsPath; + std::string gKipPath; + std::string gProfilesDir; + std::string gLegacyPath; + time_t gSettingsMtime = 0; + time_t gKipMtime = 0; std::atomic_bool gEnabled{ false }; std::uint32_t gOverrideFreqs[HocClkModule_EnumMax]; std::map, std::uint32_t> gProfileMHzMap; std::map gProfileCountMap; + std::set gLoadedTids; + std::map gProfileMtimes; + std::uint64_t gCurrentGameTid = 0; + bool gProfilesDirty = false; + bool gMigrationHappened = false; LockableMutex gConfigMutex; LockableMutex gOverrideMutex; - time_t CheckModificationTime() { + time_t CheckFileMtime(const std::string &path) { time_t mtime = 0; struct stat st; - if (stat(gPath.c_str(), &st) == 0) { + if (stat(path.c_str(), &st) == 0) { mtime = st.st_mtime; } return mtime; } std::uint32_t FindClockMHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile) { - if (gLoaded) { - auto it = gProfileMHzMap.find(std::make_tuple(tid, profile, module)); - if (it != gProfileMHzMap.end()) { - return it->second; - } + auto it = gProfileMHzMap.find(std::make_tuple(tid, profile, module)); + if (it != gProfileMHzMap.end()) { + return it->second; } return 0; } @@ -99,33 +107,59 @@ namespace config { return std::max((std::uint32_t)0, mhz * mhzMultiplier); } - int BrowseIniFunc(const char *section, const char *key, const char *value, void *userdata) { + int BrowseSettingsIni(const char *section, const char *key, const char *value, void *userdata) { (void)userdata; - std::uint64_t input; - if (!strcmp(section, CONFIG_VAL_SECTION)) { - for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { - if (!strcmp(key, hocclkFormatConfigValue((HocClkConfigValue)kval, false))) { - input = strtoul(value, NULL, 0); - if (!hocclkValidConfigValue((HocClkConfigValue)kval, input)) { - input = hocclkDefaultConfigValue((HocClkConfigValue)kval); - fileUtils::LogLine("[cfg] Invalid value for key '%s' in section '%s': using default %d", key, section, input); - } - configValues[kval] = input; - return 1; - } + if (strcmp(section, CONFIG_VAL_SECTION) != 0) { + return 1; + } + + for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { + if (hocclkIsKipConfigValue((HocClkConfigValue)kval)) { + continue; } + if (!strcmp(key, hocclkFormatConfigValue((HocClkConfigValue)kval, false))) { + std::uint64_t input = strtoul(value, NULL, 0); + if (!hocclkValidConfigValue((HocClkConfigValue)kval, input)) { + input = hocclkDefaultConfigValue((HocClkConfigValue)kval); + fileUtils::LogLine("[cfg] Invalid value for key '%s': using default %llu", key, input); + } + configValues[kval] = input; + return 1; + } + } - fileUtils::LogLine("[cfg] Skipping key '%s' in section '%s': Unrecognized config value", key, section); + fileUtils::LogLine("[cfg] Skipping key '%s' in settings: Unrecognized config value", key); + return 1; + } + + int BrowseKipIni(const char *section, const char *key, const char *value, void *userdata) { + (void)userdata; + if (strcmp(section, CONFIG_VAL_SECTION) != 0) { return 1; } - std::uint64_t tid = strtoul(section, NULL, 16); - - if (!tid || strlen(section) != 16) { - fileUtils::LogLine("[cfg] Skipping key '%s' in section '%s': Invalid TitleID", key, section); - return 1; + for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { + if (!hocclkIsKipConfigValue((HocClkConfigValue)kval)) { + continue; + } + if (!strcmp(key, hocclkFormatConfigValue((HocClkConfigValue)kval, false))) { + std::uint64_t input = strtoul(value, NULL, 0); + if (!hocclkValidConfigValue((HocClkConfigValue)kval, input)) { + input = hocclkDefaultConfigValue((HocClkConfigValue)kval); + fileUtils::LogLine("[cfg] Invalid value for key '%s': using default %llu", key, input); + } + configValues[kval] = input; + return 1; + } } + fileUtils::LogLine("[cfg] Skipping key '%s' in kip: Unrecognized config value", key); + return 1; + } + + int BrowseProfileIni(const char *section, const char *key, const char *value, void *userdata) { + std::uint64_t tid = (std::uint64_t)(uintptr_t)userdata; + HocClkProfile parsedProfile = HocClkProfile_EnumMax; HocClkModule parsedModule = HocClkModule_EnumMax; @@ -148,13 +182,11 @@ namespace config { } if (parsedModule == HocClkModule_EnumMax || parsedProfile == HocClkProfile_EnumMax) { - fileUtils::LogLine("[cfg] Skipping key '%s' in section '%s': Unrecognized key", key, section); return 1; } std::uint32_t mhz = strtoul(value, NULL, 10); if (!mhz) { - fileUtils::LogLine("[cfg] Skipping key '%s' in section '%s': Invalid value", key, section); return 1; } @@ -173,33 +205,305 @@ namespace config { gLoaded = false; gProfileMHzMap.clear(); gProfileCountMap.clear(); + gLoadedTids.clear(); + gProfileMtimes.clear(); + gCurrentGameTid = 0; + gProfilesDirty = false; for (unsigned int i = 0; i < HocClkConfigValue_EnumMax; i++) { configValues[i] = hocclkDefaultConfigValue((HocClkConfigValue)i); } } - void Load() { - fileUtils::LogLine("[cfg] Reading %s", gPath.c_str()); + void LoadSettings() { + fileUtils::LogLine("[cfg] Reading %s", gSettingsPath.c_str()); + gSettingsMtime = CheckFileMtime(gSettingsPath); + if (!gSettingsMtime) { + fileUtils::LogLine("[cfg] Settings file not found, using defaults"); + return; + } + if (!ini_browse(&BrowseSettingsIni, nullptr, gSettingsPath.c_str())) { + fileUtils::LogLine("[cfg] Error loading settings file"); + } + } - Close(); - gMtime = CheckModificationTime(); - if (!gMtime) { - fileUtils::LogLine("[cfg] Error finding file"); - } else if (!ini_browse(&BrowseIniFunc, nullptr, gPath.c_str())) { - fileUtils::LogLine("[cfg] Error loading file"); + void LoadKip() { + fileUtils::LogLine("[cfg] Reading %s", gKipPath.c_str()); + gKipMtime = CheckFileMtime(gKipPath); + if (!gKipMtime) { + fileUtils::LogLine("[cfg] KIP config file not found, using defaults"); + return; + } + if (!ini_browse(&BrowseKipIni, nullptr, gKipPath.c_str())) { + fileUtils::LogLine("[cfg] Error loading KIP config file"); + } + } + + std::string ProfilePathForTid(std::uint64_t tid) { + char filename[32]; + snprintf(filename, sizeof(filename), "%016lX.ini", tid); + return gProfilesDir + "/" + filename; + } + + void EvictProfile(std::uint64_t tid) { + if (tid == HOCCLK_GLOBAL_PROFILE_TID) { + return; } + for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { + for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { + gProfileMHzMap.erase(std::make_tuple(tid, (HocClkProfile)profile, (HocClkModule)module)); + } + } + gProfileCountMap.erase(tid); + gProfileMtimes.erase(tid); + gLoadedTids.erase(tid); + } + + void LoadProfileTid(std::uint64_t tid) { + if (tid == 0) { + return; + } + + if (gLoadedTids.count(tid)) { + return; + } + + if (tid != HOCCLK_GLOBAL_PROFILE_TID && gCurrentGameTid != 0) { + EvictProfile(gCurrentGameTid); + } + + std::string path = ProfilePathForTid(tid); + + struct stat st; + if (stat(path.c_str(), &st) == 0) { + fileUtils::LogLine("[cfg] Loading profile %s", path.c_str()); + ini_browse(&BrowseProfileIni, (void *)(uintptr_t)tid, path.c_str()); + gProfileMtimes[tid] = st.st_mtime; + } else { + gProfileMtimes.erase(tid); + } + gLoadedTids.insert(tid); + if (tid != HOCCLK_GLOBAL_PROFILE_TID) { + gCurrentGameTid = tid; + } + } + + void Load() { + gLoaded = false; + for (unsigned int i = 0; i < HocClkConfigValue_EnumMax; i++) { + configValues[i] = hocclkDefaultConfigValue((HocClkConfigValue)i); + } + LoadSettings(); + LoadKip(); gLoaded = true; } + struct MigrationData { + std::vector> settingsKeys; + std::vector> kipKeys; + std::vector>> profileEntries; + }; + + int MigrationBrowseFunc(const char *section, const char *key, const char *value, void *userdata) { + MigrationData *data = static_cast(userdata); + + if (!strcmp(section, CONFIG_VAL_SECTION)) { + for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { + if (!strcmp(key, hocclkFormatConfigValue((HocClkConfigValue)kval, false))) { + if (hocclkIsKipConfigValue((HocClkConfigValue)kval)) { + data->kipKeys.push_back({key, value}); + return 1; + } + data->settingsKeys.push_back({key, value}); + return 1; + } + } + fileUtils::LogLine("[cfg] Skipping unrecognized key '%s'", key); + } else { + std::uint64_t tid = strtoul(section, NULL, 16); + if (tid && strlen(section) == 16) { + data->profileEntries.push_back({tid, {key, value}}); + } + } + return 1; + } + + void MigrateLegacyConfig() { + struct stat st; + if (stat(gLegacyPath.c_str(), &st) != 0) { + return; + } + + fileUtils::LogLine("[cfg] Migrating legacy config.ini"); + fileUtils::LogLine("[cfg] Legacy path: %s", gLegacyPath.c_str()); + fileUtils::LogLine("[cfg] Settings path: %s", gSettingsPath.c_str()); + fileUtils::LogLine("[cfg] Profiles dir: %s", gProfilesDir.c_str()); + + MigrationData data; + fileUtils::LogLine("[cfg] Parsing legacy config.ini..."); + ini_browse(&MigrationBrowseFunc, &data, gLegacyPath.c_str()); + fileUtils::LogLine("[cfg] Found %zu settings keys, %zu KIP keys, %zu profile entries", + data.settingsKeys.size(), data.kipKeys.size(), data.profileEntries.size()); + + if (!data.settingsKeys.empty()) { + fileUtils::LogLine("[cfg] Creating kip directory: %s", FILE_KIP_DIR); + mkdir(FILE_KIP_DIR, 0777); + fileUtils::LogLine("[cfg] Writing %zu settings to %s", data.settingsKeys.size(), gSettingsPath.c_str()); + + std::vector sKeys; + std::vector sVals; + sKeys.reserve(data.settingsKeys.size()); + sVals.reserve(data.settingsKeys.size()); + for (const auto &entry : data.settingsKeys) { + fileUtils::LogLine("[cfg] %s = %s", entry.first.c_str(), entry.second.c_str()); + sKeys.push_back(entry.first); + sVals.push_back(entry.second); + } + + std::vector keyPtrs; + std::vector valPtrs; + keyPtrs.reserve(sKeys.size() + 1); + valPtrs.reserve(sVals.size() + 1); + for (size_t i = 0; i < sKeys.size(); i++) { + keyPtrs.push_back(sKeys[i].c_str()); + valPtrs.push_back(sVals[i].c_str()); + } + keyPtrs.push_back(NULL); + valPtrs.push_back(NULL); + + if (!ini_putsection(CONFIG_VAL_SECTION, keyPtrs.data(), valPtrs.data(), gSettingsPath.c_str())) { + fileUtils::LogLine("[cfg] FAILED to write settings section"); + } else { + fileUtils::LogLine("[cfg] Settings migration done"); + } + } else { + fileUtils::LogLine("[cfg] No settings keys to migrate"); + } + + if (!data.kipKeys.empty()) { + fileUtils::LogLine("[cfg] Writing %zu KIP keys to %s", data.kipKeys.size(), gKipPath.c_str()); + + std::vector kKeys; + std::vector kVals; + kKeys.reserve(data.kipKeys.size()); + kVals.reserve(data.kipKeys.size()); + for (const auto &entry : data.kipKeys) { + fileUtils::LogLine("[cfg] %s = %s", entry.first.c_str(), entry.second.c_str()); + kKeys.push_back(entry.first); + kVals.push_back(entry.second); + } + + std::vector kKeyPtrs; + std::vector kValPtrs; + kKeyPtrs.reserve(kKeys.size() + 1); + kValPtrs.reserve(kVals.size() + 1); + for (size_t i = 0; i < kKeys.size(); i++) { + kKeyPtrs.push_back(kKeys[i].c_str()); + kValPtrs.push_back(kVals[i].c_str()); + } + kKeyPtrs.push_back(NULL); + kValPtrs.push_back(NULL); + + if (!ini_putsection(CONFIG_VAL_SECTION, kKeyPtrs.data(), kValPtrs.data(), gKipPath.c_str())) { + fileUtils::LogLine("[cfg] FAILED to write KIP section"); + } else { + fileUtils::LogLine("[cfg] KIP migration done"); + } + + for (const auto &entry : data.kipKeys) { + for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { + if (!hocclkIsKipConfigValue((HocClkConfigValue)kval)) { + continue; + } + if (!strcmp(entry.first.c_str(), hocclkFormatConfigValue((HocClkConfigValue)kval, false))) { + std::uint64_t input = strtoul(entry.second.c_str(), NULL, 0); + if (hocclkValidConfigValue((HocClkConfigValue)kval, input)) { + configValues[kval] = input; + } + break; + } + } + } + } else { + fileUtils::LogLine("[cfg] No KIP keys to migrate"); + } + + fileUtils::LogLine("[cfg] Creating profiles directory: %s", FILE_PROFILES_DIR); + mkdir(FILE_PROFILES_DIR, 0777); + + std::map>> profileBuckets; + for (const auto &entry : data.profileEntries) { + profileBuckets[entry.first].push_back(entry.second); + } + + fileUtils::LogLine("[cfg] Writing %zu profiles (%zu TIDs)", data.profileEntries.size(), profileBuckets.size()); + for (const auto &bucket : profileBuckets) { + char filename[32]; + snprintf(filename, sizeof(filename), "%016lX.ini", bucket.first); + std::string profilePath = gProfilesDir + "/" + filename; + + fileUtils::LogLine("[cfg] TID=%016lX %zu keys -> %s", bucket.first, bucket.second.size(), profilePath.c_str()); + + std::vector pKeys; + std::vector pVals; + pKeys.reserve(bucket.second.size()); + pVals.reserve(bucket.second.size()); + for (const auto &kv : bucket.second) { + fileUtils::LogLine("[cfg] %s = %s", kv.first.c_str(), kv.second.c_str()); + pKeys.push_back(kv.first); + pVals.push_back(kv.second); + } + + std::vector keyPtrs; + std::vector valPtrs; + keyPtrs.reserve(pKeys.size() + 1); + valPtrs.reserve(pVals.size() + 1); + for (size_t i = 0; i < pKeys.size(); i++) { + keyPtrs.push_back(pKeys[i].c_str()); + valPtrs.push_back(pVals[i].c_str()); + } + keyPtrs.push_back(NULL); + valPtrs.push_back(NULL); + + if (!ini_putsection(CONFIG_VAL_SECTION, keyPtrs.data(), valPtrs.data(), profilePath.c_str())) { + fileUtils::LogLine("[cfg] FAILED to write profile for TID %016lX", bucket.first); + } + } + fileUtils::LogLine("[cfg] Profiles migration done"); + + fileUtils::LogLine("[cfg] Renaming legacy config to config.ini.migrated"); + if (rename(gLegacyPath.c_str(), (gLegacyPath + ".migrated").c_str()) != 0) { + fileUtils::LogLine("[cfg] WARNING: Failed to rename legacy config file"); + } + gMigrationHappened = true; + fileUtils::LogLine("[cfg] Migration complete"); + } + } // namespace + bool IsProfileDirty() { + return gProfilesDirty; + } + + void SetProfileDirty(bool dirty) { + gProfilesDirty = dirty; + } + void Initialize() { - gPath = FILE_CONFIG_DIR "/config.ini"; + gSettingsPath = FILE_SETTINGS_PATH; + gKipPath = FILE_KIP_CONFIG_PATH; + gProfilesDir = FILE_PROFILES_DIR; + gLegacyPath = FILE_LEGACY_CONFIG_PATH; gLoaded = false; + gMigrationHappened = false; gProfileMHzMap.clear(); gProfileCountMap.clear(); - gMtime = 0; + gLoadedTids.clear(); + gProfileMtimes.clear(); + gCurrentGameTid = 0; + gProfilesDirty = false; + gSettingsMtime = 0; + gKipMtime = 0; gEnabled = false; for (unsigned int i = 0; i < HocClkModule_EnumMax; i++) { gOverrideFreqs[i] = 0; @@ -207,6 +511,15 @@ namespace config { for (unsigned int i = 0; i < HocClkConfigValue_EnumMax; i++) { configValues[i] = hocclkDefaultConfigValue((HocClkConfigValue)i); } + + mkdir(FILE_CONFIG_DIR, 0777); + mkdir(FILE_KIP_DIR, 0777); + mkdir(FILE_PROFILES_DIR, 0777); + + MigrateLegacyConfig(); + + gLoaded = true; + LoadProfileTid(HOCCLK_GLOBAL_PROFILE_TID); } void Exit() { @@ -216,11 +529,38 @@ namespace config { bool Refresh() { std::scoped_lock lock{ gConfigMutex }; - if (!gLoaded || gMtime != CheckModificationTime()) { + time_t settingsMtime = CheckFileMtime(gSettingsPath); + time_t kipMtime = CheckFileMtime(gKipPath); + if (!gLoaded || gSettingsMtime != settingsMtime || gKipMtime != kipMtime) { Load(); return true; } - return false; + if (IsProfileDirty()) { + SetProfileDirty(false); + return true; + } + + std::vector staleTids; + for (std::uint64_t tid : gLoadedTids) { + time_t mtime = CheckFileMtime(ProfilePathForTid(tid)); + auto it = gProfileMtimes.find(tid); + time_t known = (it != gProfileMtimes.end()) ? it->second : 0; + if (mtime != known) { + staleTids.push_back(tid); + } + } + for (std::uint64_t tid : staleTids) { + fileUtils::LogLine("[cfg] Profile %016lX changed on disk, dropping cache", tid); + for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { + for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { + gProfileMHzMap.erase(std::make_tuple(tid, (HocClkProfile)profile, (HocClkModule)module)); + } + } + gProfileCountMap.erase(tid); + gProfileMtimes.erase(tid); + gLoadedTids.erase(tid); + } + return !staleTids.empty(); } bool HasProfilesLoaded() { @@ -230,6 +570,9 @@ namespace config { std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw) { std::scoped_lock lock{ gConfigMutex }; + if (gLoaded && !gLoadedTids.count(tid)) { + LoadProfileTid(tid); + } switch (profile) { case HocClkProfile_Handheld: return FindClockHzFromProfiles(tid, module, { HocClkProfile_Handheld }, returnRaw ? 1 : 1000000); @@ -252,6 +595,7 @@ namespace config { void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles) { std::scoped_lock lock{ gConfigMutex }; + LoadProfileTid(tid); for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { out_profiles->mhzMap[profile][module] = FindClockMHz(tid, (HocClkModule)module, (HocClkProfile)profile); @@ -261,10 +605,12 @@ namespace config { bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate) { std::scoped_lock lock{ gConfigMutex }; - uint8_t numProfiles = 0; - char section[17] = { 0 }; - snprintf(section, sizeof(section), "%016lX", tid); + mkdir(FILE_PROFILES_DIR, 0777); + + std::string profilePath = ProfilePathForTid(tid); + + uint8_t numProfiles = 0; std::vector keys; std::vector values; @@ -301,10 +647,18 @@ namespace config { keyPointers.push_back(NULL); valuePointers.push_back(NULL); - if (!ini_putsection(section, keyPointers.data(), valuePointers.data(), gPath.c_str())) { + if (keys.empty()) { + struct stat st; + if (stat(profilePath.c_str(), &st) == 0 && remove(profilePath.c_str()) != 0) { + fileUtils::LogLine("[cfg] Failed to remove empty profile %s", profilePath.c_str()); + return false; + } + } else if (!ini_putsection(CONFIG_VAL_SECTION, keyPointers.data(), valuePointers.data(), profilePath.c_str())) { return false; } + gProfileMtimes[tid] = CheckFileMtime(profilePath); + if (immediate) { mhz = &profiles->mhz[0]; gProfileCountMap[tid] = numProfiles; @@ -318,12 +672,22 @@ namespace config { mhz++; } } + gLoadedTids.insert(tid); + if (tid != HOCCLK_GLOBAL_PROFILE_TID) { + gCurrentGameTid = tid; + } + + SetProfileDirty(true); } return true; } std::uint8_t GetProfileCount(std::uint64_t tid) { + std::scoped_lock lock{ gConfigMutex }; + if (tid != 0 && gLoaded && !gLoadedTids.count(tid)) { + LoadProfileTid(tid); + } auto it = gProfileCountMap.find(tid); if (it == gProfileCountMap.end()) { return 0; @@ -339,6 +703,10 @@ namespace config { return gEnabled; } + bool MigrationHappened() { + return gMigrationHappened; + } + void SetOverrideHz(HocClkModule module, std::uint32_t hz) { ASSERT_ENUM_VALID(HocClkModule, module); std::scoped_lock lock{ gOverrideMutex }; @@ -372,31 +740,60 @@ namespace config { bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate) { std::scoped_lock lock{ gConfigMutex }; - std::vector iniKeys; - std::vector iniValues; - iniKeys.reserve(HocClkConfigValue_EnumMax + 1); - iniValues.reserve(HocClkConfigValue_EnumMax); + std::vector settingsKeys; + std::vector settingsValues; + std::vector kipKeys; + std::vector kipValues; for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { if (!hocclkValidConfigValue((HocClkConfigValue)kval, configValues->values[kval]) || configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) { continue; } - iniValues.push_back(std::to_string(configValues->values[kval])); - iniKeys.push_back(hocclkFormatConfigValue((HocClkConfigValue)kval, false)); + std::string key = hocclkFormatConfigValue((HocClkConfigValue)kval, false); + std::string value = std::to_string(configValues->values[kval]); + + if (hocclkIsKipConfigValue((HocClkConfigValue)kval)) { + kipKeys.push_back(key); + kipValues.push_back(value); + } else { + settingsKeys.push_back(key); + settingsValues.push_back(value); + } } - iniKeys.push_back(NULL); + bool success = true; - std::vector valuePointers; - valuePointers.reserve(iniValues.size() + 1); - for (const auto &val : iniValues) { - valuePointers.push_back(val.c_str()); + if (!settingsKeys.empty()) { + std::vector sKeyPtrs; + std::vector sValPtrs; + sKeyPtrs.reserve(settingsKeys.size() + 1); + sValPtrs.reserve(settingsValues.size() + 1); + for (size_t i = 0; i < settingsKeys.size(); i++) { + sKeyPtrs.push_back(settingsKeys[i].c_str()); + sValPtrs.push_back(settingsValues[i].c_str()); + } + sKeyPtrs.push_back(NULL); + sValPtrs.push_back(NULL); + if (!ini_putsection(CONFIG_VAL_SECTION, sKeyPtrs.data(), sValPtrs.data(), gSettingsPath.c_str())) { + success = false; + } } - valuePointers.push_back(NULL); - if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), gPath.c_str())) { - return false; + if (!kipKeys.empty()) { + std::vector kKeyPtrs; + std::vector kValPtrs; + kKeyPtrs.reserve(kipKeys.size() + 1); + kValPtrs.reserve(kipValues.size() + 1); + for (size_t i = 0; i < kipKeys.size(); i++) { + kKeyPtrs.push_back(kipKeys[i].c_str()); + kValPtrs.push_back(kipValues[i].c_str()); + } + kKeyPtrs.push_back(NULL); + kValPtrs.push_back(NULL); + if (!ini_putsection(CONFIG_VAL_SECTION, kKeyPtrs.data(), kValPtrs.data(), gKipPath.c_str())) { + success = false; + } } if (immediate) { @@ -407,9 +804,10 @@ namespace config { config::configValues[kval] = hocclkDefaultConfigValue((HocClkConfigValue)kval); } } + SetProfileDirty(true); } - return true; + return success; } bool ResetConfigValue(HocClkConfigValue kval) { @@ -438,13 +836,16 @@ namespace config { } valuePointers.push_back(NULL); - if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), gPath.c_str())) { + const char *targetPath = hocclkIsKipConfigValue(kval) ? gKipPath.c_str() : gSettingsPath.c_str(); + + if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), targetPath)) { fileUtils::LogLine("[cfg] Failed to reset config value %u in INI", kval); return false; } configValues[kval] = defaultValue; fileUtils::LogLine("[cfg] Reset config value %u to default: %llu", kval, defaultValue); + SetProfileDirty(true); return true; } @@ -473,12 +874,15 @@ namespace config { valuePointers.push_back(iniValues[0].c_str()); valuePointers.push_back(NULL); - if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), gPath.c_str())) { + const char *targetPath = hocclkIsKipConfigValue(kval) ? gKipPath.c_str() : gSettingsPath.c_str(); + + if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), targetPath)) { return false; } if (immediate) { configValues[kval] = value; + SetProfileDirty(true); } return true; @@ -486,6 +890,7 @@ namespace config { void DeleteKey(const char *section, const char *key) { std::scoped_lock lock{ gConfigMutex }; - ini_puts(section, key, NULL, gPath.c_str()); + ini_puts(section, key, NULL, gSettingsPath.c_str()); + ini_puts(section, key, NULL, gKipPath.c_str()); } } // namespace config diff --git a/Source/hoc-clk/sysmodule/src/file/config.hpp b/Source/hoc-clk/sysmodule/src/file/config.hpp index 969fa24b..3ea6fc5d 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.hpp +++ b/Source/hoc-clk/sysmodule/src/file/config.hpp @@ -26,6 +26,8 @@ #pragma once +#include +#include #include #include @@ -39,6 +41,9 @@ namespace config { bool Refresh(); bool HasProfilesLoaded(); + bool IsProfileDirty(); + void SetProfileDirty(bool dirty); + std::uint8_t GetProfileCount(std::uint64_t tid); void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles); bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate); @@ -46,6 +51,7 @@ namespace config { void SetEnabled(bool enabled); bool Enabled(); + bool MigrationHappened(); void SetOverrideHz(HocClkModule module, std::uint32_t hz); std::uint32_t GetOverrideHz(HocClkModule module); diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index f2ab4b2a..954f8889 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -39,6 +39,11 @@ #define FILE_LOG_FLAG_PATH FILE_CONFIG_DIR "/log.flag" #define FILE_UART_FLAG_PATH FILE_CONFIG_DIR "/uart.flag" #define FILE_LOG_FILE_PATH FILE_CONFIG_DIR "/log.txt" +#define FILE_SETTINGS_PATH FILE_CONFIG_DIR "/settings.ini" +#define FILE_KIP_DIR FILE_CONFIG_DIR "/kip" +#define FILE_KIP_CONFIG_PATH FILE_KIP_DIR "/current.ini" +#define FILE_PROFILES_DIR FILE_CONFIG_DIR "/profiles" +#define FILE_LEGACY_CONFIG_PATH FILE_CONFIG_DIR "/config.ini" namespace fileUtils { diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 782f2e3c..f7c5b0c1 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -38,7 +38,7 @@ #include "mgr/clock_manager.hpp" -#define INNER_HEAP_SIZE 0x41000 +#define INNER_HEAP_SIZE 0x40000 extern "C" { void virtmemSetup(void); diff --git a/Source/hoc-clk/templates/kip/current.ini.template b/Source/hoc-clk/templates/kip/current.ini.template new file mode 100644 index 00000000..762564df --- /dev/null +++ b/Source/hoc-clk/templates/kip/current.ini.template @@ -0,0 +1 @@ +; Customize values applied to hoc.kip diff --git a/Source/hoc-clk/templates/profiles/README.ini b/Source/hoc-clk/templates/profiles/README.ini new file mode 100644 index 00000000..69c29ac1 --- /dev/null +++ b/Source/hoc-clk/templates/profiles/README.ini @@ -0,0 +1,11 @@ +; Per-title overclock profiles in this folder (one .ini file per game). +; .ini + +; Example: +; BOTW: DRAM OC in handheld for free performance + +; The Legend of Zelda Breath of the Wild (01007EF00011E000) +; File: 01007EF00011E000.ini +; [values] +; handheld_mem=1996 + diff --git a/Source/hoc-clk/templates/settings.ini.template b/Source/hoc-clk/templates/settings.ini.template new file mode 100644 index 00000000..d517e2bf --- /dev/null +++ b/Source/hoc-clk/templates/settings.ini.template @@ -0,0 +1 @@ +; General sysmodule settings From e16735d16db6bfc5309ecd8643fdbe32d72b57ee Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 5 Sep 2026 16:24:49 -0400 Subject: [PATCH 121/205] Update config.cpp --- Source/hoc-clk/sysmodule/src/file/config.cpp | 128 ++++++++++++------- 1 file changed, 79 insertions(+), 49 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index e36d8013..d46089b4 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -66,18 +66,19 @@ namespace config { std::uint32_t gOverrideFreqs[HocClkModule_EnumMax]; std::map, std::uint32_t> gProfileMHzMap; std::map gProfileCountMap; - std::set gLoadedTids; std::map gProfileMtimes; + + bool gGlobalLoaded = false; std::uint64_t gCurrentGameTid = 0; bool gProfilesDirty = false; bool gMigrationHappened = false; LockableMutex gConfigMutex; LockableMutex gOverrideMutex; - time_t CheckFileMtime(const std::string &path) { + time_t CheckFileMtime(const char *path) { time_t mtime = 0; struct stat st; - if (stat(path.c_str(), &st) == 0) { + if (stat(path, &st) == 0) { mtime = st.st_mtime; } return mtime; @@ -205,8 +206,8 @@ namespace config { gLoaded = false; gProfileMHzMap.clear(); gProfileCountMap.clear(); - gLoadedTids.clear(); gProfileMtimes.clear(); + gGlobalLoaded = false; gCurrentGameTid = 0; gProfilesDirty = false; for (unsigned int i = 0; i < HocClkConfigValue_EnumMax; i++) { @@ -216,7 +217,7 @@ namespace config { void LoadSettings() { fileUtils::LogLine("[cfg] Reading %s", gSettingsPath.c_str()); - gSettingsMtime = CheckFileMtime(gSettingsPath); + gSettingsMtime = CheckFileMtime(gSettingsPath.c_str()); if (!gSettingsMtime) { fileUtils::LogLine("[cfg] Settings file not found, using defaults"); return; @@ -228,7 +229,7 @@ namespace config { void LoadKip() { fileUtils::LogLine("[cfg] Reading %s", gKipPath.c_str()); - gKipMtime = CheckFileMtime(gKipPath); + gKipMtime = CheckFileMtime(gKipPath.c_str()); if (!gKipMtime) { fileUtils::LogLine("[cfg] KIP config file not found, using defaults"); return; @@ -238,17 +239,25 @@ namespace config { } } - std::string ProfilePathForTid(std::uint64_t tid) { - char filename[32]; - snprintf(filename, sizeof(filename), "%016lX.ini", tid); - return gProfilesDir + "/" + filename; + // "/<16-hex-tid>.ini" + NUL + constexpr size_t PROFILE_PATH_MAX = 64; + + void ProfilePathForTid(std::uint64_t tid, char *outPath, size_t outSize) { + snprintf(outPath, outSize, "%s/%016lX.ini", gProfilesDir.c_str(), tid); } - void EvictProfile(std::uint64_t tid) { + bool IsProfileLoaded(std::uint64_t tid) { if (tid == HOCCLK_GLOBAL_PROFILE_TID) { + return gGlobalLoaded; + } + return tid != 0 && tid == gCurrentGameTid; + } + + void EvictCurrentGame() { + if (gCurrentGameTid == 0) { return; } - + const std::uint64_t tid = gCurrentGameTid; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { gProfileMHzMap.erase(std::make_tuple(tid, (HocClkProfile)profile, (HocClkModule)module)); @@ -256,7 +265,18 @@ namespace config { } gProfileCountMap.erase(tid); gProfileMtimes.erase(tid); - gLoadedTids.erase(tid); + gCurrentGameTid = 0; + } + + void DropGlobalProfile() { + for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { + for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { + gProfileMHzMap.erase(std::make_tuple(HOCCLK_GLOBAL_PROFILE_TID, (HocClkProfile)profile, (HocClkModule)module)); + } + } + gProfileCountMap.erase(HOCCLK_GLOBAL_PROFILE_TID); + gProfileMtimes.erase(HOCCLK_GLOBAL_PROFILE_TID); + gGlobalLoaded = false; } void LoadProfileTid(std::uint64_t tid) { @@ -264,26 +284,29 @@ namespace config { return; } - if (gLoadedTids.count(tid)) { + const bool isGlobal = (tid == HOCCLK_GLOBAL_PROFILE_TID); + if (IsProfileLoaded(tid)) { return; } - if (tid != HOCCLK_GLOBAL_PROFILE_TID && gCurrentGameTid != 0) { - EvictProfile(gCurrentGameTid); + if (!isGlobal) { + EvictCurrentGame(); } - std::string path = ProfilePathForTid(tid); + char path[PROFILE_PATH_MAX]; + ProfilePathForTid(tid, path, sizeof(path)); struct stat st; - if (stat(path.c_str(), &st) == 0) { - fileUtils::LogLine("[cfg] Loading profile %s", path.c_str()); - ini_browse(&BrowseProfileIni, (void *)(uintptr_t)tid, path.c_str()); + if (stat(path, &st) == 0) { + fileUtils::LogLine("[cfg] Loading profile %s", path); + ini_browse(&BrowseProfileIni, (void *)(uintptr_t)tid, path); gProfileMtimes[tid] = st.st_mtime; } else { gProfileMtimes.erase(tid); } - gLoadedTids.insert(tid); - if (tid != HOCCLK_GLOBAL_PROFILE_TID) { + if (isGlobal) { + gGlobalLoaded = true; + } else { gCurrentGameTid = tid; } } @@ -498,8 +521,8 @@ namespace config { gMigrationHappened = false; gProfileMHzMap.clear(); gProfileCountMap.clear(); - gLoadedTids.clear(); gProfileMtimes.clear(); + gGlobalLoaded = false; gCurrentGameTid = 0; gProfilesDirty = false; gSettingsMtime = 0; @@ -529,8 +552,8 @@ namespace config { bool Refresh() { std::scoped_lock lock{ gConfigMutex }; - time_t settingsMtime = CheckFileMtime(gSettingsPath); - time_t kipMtime = CheckFileMtime(gKipPath); + time_t settingsMtime = CheckFileMtime(gSettingsPath.c_str()); + time_t kipMtime = CheckFileMtime(gKipPath.c_str()); if (!gLoaded || gSettingsMtime != settingsMtime || gKipMtime != kipMtime) { Load(); return true; @@ -540,27 +563,29 @@ namespace config { return true; } - std::vector staleTids; - for (std::uint64_t tid : gLoadedTids) { - time_t mtime = CheckFileMtime(ProfilePathForTid(tid)); - auto it = gProfileMtimes.find(tid); + bool profilesChanged = false; + char profilePath[PROFILE_PATH_MAX]; + if (gGlobalLoaded) { + ProfilePathForTid(HOCCLK_GLOBAL_PROFILE_TID, profilePath, sizeof(profilePath)); + auto it = gProfileMtimes.find(HOCCLK_GLOBAL_PROFILE_TID); time_t known = (it != gProfileMtimes.end()) ? it->second : 0; - if (mtime != known) { - staleTids.push_back(tid); + if (CheckFileMtime(profilePath) != known) { + fileUtils::LogLine("[cfg] Global profile changed on disk, dropping cache"); + DropGlobalProfile(); + profilesChanged = true; } } - for (std::uint64_t tid : staleTids) { - fileUtils::LogLine("[cfg] Profile %016lX changed on disk, dropping cache", tid); - for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { - for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { - gProfileMHzMap.erase(std::make_tuple(tid, (HocClkProfile)profile, (HocClkModule)module)); - } + if (gCurrentGameTid != 0) { + ProfilePathForTid(gCurrentGameTid, profilePath, sizeof(profilePath)); + auto it = gProfileMtimes.find(gCurrentGameTid); + time_t known = (it != gProfileMtimes.end()) ? it->second : 0; + if (CheckFileMtime(profilePath) != known) { + fileUtils::LogLine("[cfg] Profile %016lX changed on disk, dropping cache", gCurrentGameTid); + EvictCurrentGame(); + profilesChanged = true; } - gProfileCountMap.erase(tid); - gProfileMtimes.erase(tid); - gLoadedTids.erase(tid); } - return !staleTids.empty(); + return profilesChanged; } bool HasProfilesLoaded() { @@ -570,7 +595,7 @@ namespace config { std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw) { std::scoped_lock lock{ gConfigMutex }; - if (gLoaded && !gLoadedTids.count(tid)) { + if (gLoaded && !IsProfileLoaded(tid)) { LoadProfileTid(tid); } switch (profile) { @@ -608,7 +633,8 @@ namespace config { mkdir(FILE_PROFILES_DIR, 0777); - std::string profilePath = ProfilePathForTid(tid); + char profilePath[PROFILE_PATH_MAX]; + ProfilePathForTid(tid, profilePath, sizeof(profilePath)); uint8_t numProfiles = 0; @@ -649,11 +675,11 @@ namespace config { if (keys.empty()) { struct stat st; - if (stat(profilePath.c_str(), &st) == 0 && remove(profilePath.c_str()) != 0) { - fileUtils::LogLine("[cfg] Failed to remove empty profile %s", profilePath.c_str()); + if (stat(profilePath, &st) == 0 && remove(profilePath) != 0) { + fileUtils::LogLine("[cfg] Failed to remove empty profile %s", profilePath); return false; } - } else if (!ini_putsection(CONFIG_VAL_SECTION, keyPointers.data(), valuePointers.data(), profilePath.c_str())) { + } else if (!ini_putsection(CONFIG_VAL_SECTION, keyPointers.data(), valuePointers.data(), profilePath)) { return false; } @@ -672,8 +698,12 @@ namespace config { mhz++; } } - gLoadedTids.insert(tid); - if (tid != HOCCLK_GLOBAL_PROFILE_TID) { + if (tid == HOCCLK_GLOBAL_PROFILE_TID) { + gGlobalLoaded = true; + } else { + if (tid != gCurrentGameTid) { + EvictCurrentGame(); + } gCurrentGameTid = tid; } @@ -685,7 +715,7 @@ namespace config { std::uint8_t GetProfileCount(std::uint64_t tid) { std::scoped_lock lock{ gConfigMutex }; - if (tid != 0 && gLoaded && !gLoadedTids.count(tid)) { + if (tid != 0 && gLoaded && !IsProfileLoaded(tid)) { LoadProfileTid(tid); } auto it = gProfileCountMap.find(tid); From 21a21df4ba39cc2a50a384f5bba7f5fa605d9640 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 5 Sep 2026 21:20:56 -0400 Subject: [PATCH 122/205] hocclk: DRAMID from MRR --- .../diff/secmon_memory_layout.diff | 6 +- .../diff/secmon_smc_register_access.diff | 7 +- .../secmon_define_emc01_access_table.inc | 25 + .../secmon_emc01_access_table_data.inc | 1040 +++++++++++++++++ .../secmon_memory_layout.hpp | 4 +- .../secmon_smc_register_access.cpp | 3 + Source/hoc-clk/sysmodule/src/board/board.cpp | 5 + Source/hoc-clk/sysmodule/src/board/board.hpp | 1 + Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp | 382 ++++++ Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp | 106 ++ build.sh | 2 + 11 files changed, 1576 insertions(+), 5 deletions(-) create mode 100644 Source/Atmosphere-Patches/secmon_define_emc01_access_table.inc create mode 100644 Source/Atmosphere-Patches/secmon_emc01_access_table_data.inc create mode 100644 Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp create mode 100644 Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp diff --git a/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff b/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff index 4daf88e7..1cb6ab99 100644 --- a/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff +++ b/Source/Atmosphere-Patches/diff/secmon_memory_layout.diff @@ -1,4 +1,4 @@ -131,156c131,157 +131,156c131,159 < #define AMS_SECMON_FOREACH_DEVICE_REGION(HANDLER, ...) \ < HANDLER(GicDistributor, Empty, UINT64_C(0x50041000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ < HANDLER(GicCpuInterface, GicDistributor, UINT64_C(0x50042000), UINT64_C(0x2000), true, ## __VA_ARGS__) \ @@ -49,7 +49,9 @@ > HANDLER(ExceptionVectors, I2c1, UINT64_C(0x6000F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ > HANDLER(MemoryController0, ExceptionVectors, UINT64_C(0x7001C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ > HANDLER(MemoryController1, MemoryController0, UINT64_C(0x7001D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ -> HANDLER(Sdmmc, MemoryController1, UINT64_C(0x700B0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(ExternalMemoryController0, MemoryController1, UINT64_C(0x7001E000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(ExternalMemoryController1, ExternalMemoryController0, UINT64_C(0x7001F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ +> HANDLER(Sdmmc, ExternalMemoryController1, UINT64_C(0x700B0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ > HANDLER(Disp1, Sdmmc, UINT64_C(0x54200000), UINT64_C(0x3000), true, ## __VA_ARGS__) \ > HANDLER(Dsi, Disp1, UINT64_C(0x54300000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ > HANDLER(MipiCal, Dsi, UINT64_C(0x700E3000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ diff --git a/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff b/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff index 0817bad4..e4c4375a 100644 --- a/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff +++ b/Source/Atmosphere-Patches/diff/secmon_smc_register_access.diff @@ -1,9 +1,10 @@ -100a101,104 +100a101,105 > #include "secmon_define_emc_access_table.inc" +> #include "secmon_define_emc01_access_table.inc" > #include "secmon_define_flow_controller_access_table.inc" > #include "secmon_define_exception_vectors_access_table.inc" > #include "secmon_define_rtc_pmc_access_table.inc" -104,107c108,115 +104,107c109,118 < { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, < { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, < { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, @@ -12,6 +13,8 @@ > { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, > { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, > { EmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExternalMemoryController.GetAddress(), EmcAccessTable::Address, EmcAccessTable::Size, }, +> { Emc01AccessTable::ReducedAccessTable.data(), Emc01AccessTable::Address + MemoryRegionVirtualDeviceExternalMemoryController0.GetAddress(), Emc01AccessTable::Address + MemoryRegionPhysicalDeviceExternalMemoryController0.GetAddress(), Emc01AccessTable::Size, }, +> { Emc01AccessTable::ReducedAccessTable.data(), Emc01AccessTable::Address + MemoryRegionVirtualDeviceExternalMemoryController1.GetAddress(), Emc01AccessTable::Address + MemoryRegionPhysicalDeviceExternalMemoryController1.GetAddress(), Emc01AccessTable::Size, }, > { FlowControllerAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceFlowController.GetAddress(), FlowControllerAccessTable::Address, FlowControllerAccessTable::Size, }, > { ExceptionVectorsAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExceptionVectors.GetAddress(), ExceptionVectorsAccessTable::Address, ExceptionVectorsAccessTable::Size, }, > { RtcPmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceRtcPmc.GetAddress(), RtcPmcAccessTable::Address, RtcPmcAccessTable::Size, }, diff --git a/Source/Atmosphere-Patches/secmon_define_emc01_access_table.inc b/Source/Atmosphere-Patches/secmon_define_emc01_access_table.inc new file mode 100644 index 00000000..3a34e1dc --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_define_emc01_access_table.inc @@ -0,0 +1,25 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define __ACCESS_TABLE_NAME__ Emc01AccessTable +#define __ACCESS_TABLE_ADDRESS__ 0 +#define __ACCESS_TABLE_INC__ "secmon_emc01_access_table_data.inc" + +#include "secmon_define_access_table.inc" + +#undef __ACCESS_TABLE_INC__ +#undef __ACCESS_TABLE_ADDRESS__ +#undef __ACCESS_TABLE_NAME__ diff --git a/Source/Atmosphere-Patches/secmon_emc01_access_table_data.inc b/Source/Atmosphere-Patches/secmon_emc01_access_table_data.inc new file mode 100644 index 00000000..a3718c5e --- /dev/null +++ b/Source/Atmosphere-Patches/secmon_emc01_access_table_data.inc @@ -0,0 +1,1040 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +SetRegisterAllowed(0x0); +SetRegisterAllowed(0x4); +SetRegisterAllowed(0x8); +SetRegisterAllowed(0xC); +SetRegisterAllowed(0x10); +SetRegisterAllowed(0x14); +SetRegisterAllowed(0x18); +SetRegisterAllowed(0x1C); +SetRegisterAllowed(0x20); +SetRegisterAllowed(0x24); +SetRegisterAllowed(0x28); +SetRegisterAllowed(0x2C); +SetRegisterAllowed(0x30); +SetRegisterAllowed(0x34); +SetRegisterAllowed(0x38); +SetRegisterAllowed(0x3C); +SetRegisterAllowed(0x40); +SetRegisterAllowed(0x44); +SetRegisterAllowed(0x48); +SetRegisterAllowed(0x4C); +SetRegisterAllowed(0x50); +SetRegisterAllowed(0x54); +SetRegisterAllowed(0x58); +SetRegisterAllowed(0x5C); +SetRegisterAllowed(0x60); +SetRegisterAllowed(0x64); +SetRegisterAllowed(0x68); +SetRegisterAllowed(0x6C); +SetRegisterAllowed(0x70); +SetRegisterAllowed(0x74); +SetRegisterAllowed(0x78); +SetRegisterAllowed(0x7C); +SetRegisterAllowed(0x80); +SetRegisterAllowed(0x84); +SetRegisterAllowed(0x88); +SetRegisterAllowed(0x8C); +SetRegisterAllowed(0x90); +SetRegisterAllowed(0x94); +SetRegisterAllowed(0x98); +SetRegisterAllowed(0x9C); +SetRegisterAllowed(0xA0); +SetRegisterAllowed(0xA4); +SetRegisterAllowed(0xA8); +SetRegisterAllowed(0xAC); +SetRegisterAllowed(0xB0); +SetRegisterAllowed(0xB4); +SetRegisterAllowed(0xB8); +SetRegisterAllowed(0xBC); +SetRegisterAllowed(0xC0); +SetRegisterAllowed(0xC4); +SetRegisterAllowed(0xC8); +SetRegisterAllowed(0xCC); +SetRegisterAllowed(0xD0); +SetRegisterAllowed(0xD4); +SetRegisterAllowed(0xD8); +SetRegisterAllowed(0xDC); +SetRegisterAllowed(0xE0); +SetRegisterAllowed(0xE4); +SetRegisterAllowed(0xE8); +SetRegisterAllowed(0xEC); +SetRegisterAllowed(0xF0); +SetRegisterAllowed(0xF4); +SetRegisterAllowed(0xF8); +SetRegisterAllowed(0xFC); +SetRegisterAllowed(0x100); +SetRegisterAllowed(0x104); +SetRegisterAllowed(0x108); +SetRegisterAllowed(0x10C); +SetRegisterAllowed(0x110); +SetRegisterAllowed(0x114); +SetRegisterAllowed(0x118); +SetRegisterAllowed(0x11C); +SetRegisterAllowed(0x120); +SetRegisterAllowed(0x124); +SetRegisterAllowed(0x128); +SetRegisterAllowed(0x12C); +SetRegisterAllowed(0x130); +SetRegisterAllowed(0x134); +SetRegisterAllowed(0x138); +SetRegisterAllowed(0x13C); +SetRegisterAllowed(0x140); +SetRegisterAllowed(0x144); +SetRegisterAllowed(0x148); +SetRegisterAllowed(0x14C); +SetRegisterAllowed(0x150); +SetRegisterAllowed(0x154); +SetRegisterAllowed(0x158); +SetRegisterAllowed(0x15C); +SetRegisterAllowed(0x160); +SetRegisterAllowed(0x164); +SetRegisterAllowed(0x168); +SetRegisterAllowed(0x16C); +SetRegisterAllowed(0x170); +SetRegisterAllowed(0x174); +SetRegisterAllowed(0x178); +SetRegisterAllowed(0x17C); +SetRegisterAllowed(0x180); +SetRegisterAllowed(0x184); +SetRegisterAllowed(0x188); +SetRegisterAllowed(0x18C); +SetRegisterAllowed(0x190); +SetRegisterAllowed(0x194); +SetRegisterAllowed(0x198); +SetRegisterAllowed(0x19C); +SetRegisterAllowed(0x1A0); +SetRegisterAllowed(0x1A4); +SetRegisterAllowed(0x1A8); +SetRegisterAllowed(0x1AC); +SetRegisterAllowed(0x1B0); +SetRegisterAllowed(0x1B4); +SetRegisterAllowed(0x1B8); +SetRegisterAllowed(0x1BC); +SetRegisterAllowed(0x1C0); +SetRegisterAllowed(0x1C4); +SetRegisterAllowed(0x1C8); +SetRegisterAllowed(0x1CC); +SetRegisterAllowed(0x1D0); +SetRegisterAllowed(0x1D4); +SetRegisterAllowed(0x1D8); +SetRegisterAllowed(0x1DC); +SetRegisterAllowed(0x1E0); +SetRegisterAllowed(0x1E4); +SetRegisterAllowed(0x1E8); +SetRegisterAllowed(0x1EC); +SetRegisterAllowed(0x1F0); +SetRegisterAllowed(0x1F4); +SetRegisterAllowed(0x1F8); +SetRegisterAllowed(0x1FC); +SetRegisterAllowed(0x200); +SetRegisterAllowed(0x204); +SetRegisterAllowed(0x208); +SetRegisterAllowed(0x20C); +SetRegisterAllowed(0x210); +SetRegisterAllowed(0x214); +SetRegisterAllowed(0x218); +SetRegisterAllowed(0x21C); +SetRegisterAllowed(0x220); +SetRegisterAllowed(0x224); +SetRegisterAllowed(0x228); +SetRegisterAllowed(0x22C); +SetRegisterAllowed(0x230); +SetRegisterAllowed(0x234); +SetRegisterAllowed(0x238); +SetRegisterAllowed(0x23C); +SetRegisterAllowed(0x240); +SetRegisterAllowed(0x244); +SetRegisterAllowed(0x248); +SetRegisterAllowed(0x24C); +SetRegisterAllowed(0x250); +SetRegisterAllowed(0x254); +SetRegisterAllowed(0x258); +SetRegisterAllowed(0x25C); +SetRegisterAllowed(0x260); +SetRegisterAllowed(0x264); +SetRegisterAllowed(0x268); +SetRegisterAllowed(0x26C); +SetRegisterAllowed(0x270); +SetRegisterAllowed(0x274); +SetRegisterAllowed(0x278); +SetRegisterAllowed(0x27C); +SetRegisterAllowed(0x280); +SetRegisterAllowed(0x284); +SetRegisterAllowed(0x288); +SetRegisterAllowed(0x28C); +SetRegisterAllowed(0x290); +SetRegisterAllowed(0x294); +SetRegisterAllowed(0x298); +SetRegisterAllowed(0x29C); +SetRegisterAllowed(0x2A0); +SetRegisterAllowed(0x2A4); +SetRegisterAllowed(0x2A8); +SetRegisterAllowed(0x2AC); +SetRegisterAllowed(0x2B0); +SetRegisterAllowed(0x2B4); +SetRegisterAllowed(0x2B8); +SetRegisterAllowed(0x2BC); +SetRegisterAllowed(0x2C0); +SetRegisterAllowed(0x2C4); +SetRegisterAllowed(0x2C8); +SetRegisterAllowed(0x2CC); +SetRegisterAllowed(0x2D0); +SetRegisterAllowed(0x2D4); +SetRegisterAllowed(0x2D8); +SetRegisterAllowed(0x2DC); +SetRegisterAllowed(0x2E0); +SetRegisterAllowed(0x2E4); +SetRegisterAllowed(0x2E8); +SetRegisterAllowed(0x2EC); +SetRegisterAllowed(0x2F0); +SetRegisterAllowed(0x2F4); +SetRegisterAllowed(0x2F8); +SetRegisterAllowed(0x2FC); +SetRegisterAllowed(0x300); +SetRegisterAllowed(0x304); +SetRegisterAllowed(0x308); +SetRegisterAllowed(0x30C); +SetRegisterAllowed(0x310); +SetRegisterAllowed(0x314); +SetRegisterAllowed(0x318); +SetRegisterAllowed(0x31C); +SetRegisterAllowed(0x320); +SetRegisterAllowed(0x324); +SetRegisterAllowed(0x328); +SetRegisterAllowed(0x32C); +SetRegisterAllowed(0x330); +SetRegisterAllowed(0x334); +SetRegisterAllowed(0x338); +SetRegisterAllowed(0x33C); +SetRegisterAllowed(0x340); +SetRegisterAllowed(0x344); +SetRegisterAllowed(0x348); +SetRegisterAllowed(0x34C); +SetRegisterAllowed(0x350); +SetRegisterAllowed(0x354); +SetRegisterAllowed(0x358); +SetRegisterAllowed(0x35C); +SetRegisterAllowed(0x360); +SetRegisterAllowed(0x364); +SetRegisterAllowed(0x368); +SetRegisterAllowed(0x36C); +SetRegisterAllowed(0x370); +SetRegisterAllowed(0x374); +SetRegisterAllowed(0x378); +SetRegisterAllowed(0x37C); +SetRegisterAllowed(0x380); +SetRegisterAllowed(0x384); +SetRegisterAllowed(0x388); +SetRegisterAllowed(0x38C); +SetRegisterAllowed(0x390); +SetRegisterAllowed(0x394); +SetRegisterAllowed(0x398); +SetRegisterAllowed(0x39C); +SetRegisterAllowed(0x3A0); +SetRegisterAllowed(0x3A4); +SetRegisterAllowed(0x3A8); +SetRegisterAllowed(0x3AC); +SetRegisterAllowed(0x3B0); +SetRegisterAllowed(0x3B4); +SetRegisterAllowed(0x3B8); +SetRegisterAllowed(0x3BC); +SetRegisterAllowed(0x3C0); +SetRegisterAllowed(0x3C4); +SetRegisterAllowed(0x3C8); +SetRegisterAllowed(0x3CC); +SetRegisterAllowed(0x3D0); +SetRegisterAllowed(0x3D4); +SetRegisterAllowed(0x3D8); +SetRegisterAllowed(0x3DC); +SetRegisterAllowed(0x3E0); +SetRegisterAllowed(0x3E4); +SetRegisterAllowed(0x3E8); +SetRegisterAllowed(0x3EC); +SetRegisterAllowed(0x3F0); +SetRegisterAllowed(0x3F4); +SetRegisterAllowed(0x3F8); +SetRegisterAllowed(0x3FC); +SetRegisterAllowed(0x400); +SetRegisterAllowed(0x404); +SetRegisterAllowed(0x408); +SetRegisterAllowed(0x40C); +SetRegisterAllowed(0x410); +SetRegisterAllowed(0x414); +SetRegisterAllowed(0x418); +SetRegisterAllowed(0x41C); +SetRegisterAllowed(0x420); +SetRegisterAllowed(0x424); +SetRegisterAllowed(0x428); +SetRegisterAllowed(0x42C); +SetRegisterAllowed(0x430); +SetRegisterAllowed(0x434); +SetRegisterAllowed(0x438); +SetRegisterAllowed(0x43C); +SetRegisterAllowed(0x440); +SetRegisterAllowed(0x444); +SetRegisterAllowed(0x448); +SetRegisterAllowed(0x44C); +SetRegisterAllowed(0x450); +SetRegisterAllowed(0x454); +SetRegisterAllowed(0x458); +SetRegisterAllowed(0x45C); +SetRegisterAllowed(0x460); +SetRegisterAllowed(0x464); +SetRegisterAllowed(0x468); +SetRegisterAllowed(0x46C); +SetRegisterAllowed(0x470); +SetRegisterAllowed(0x474); +SetRegisterAllowed(0x478); +SetRegisterAllowed(0x47C); +SetRegisterAllowed(0x480); +SetRegisterAllowed(0x484); +SetRegisterAllowed(0x488); +SetRegisterAllowed(0x48C); +SetRegisterAllowed(0x490); +SetRegisterAllowed(0x494); +SetRegisterAllowed(0x498); +SetRegisterAllowed(0x49C); +SetRegisterAllowed(0x4A0); +SetRegisterAllowed(0x4A4); +SetRegisterAllowed(0x4A8); +SetRegisterAllowed(0x4AC); +SetRegisterAllowed(0x4B0); +SetRegisterAllowed(0x4B4); +SetRegisterAllowed(0x4B8); +SetRegisterAllowed(0x4BC); +SetRegisterAllowed(0x4C0); +SetRegisterAllowed(0x4C4); +SetRegisterAllowed(0x4C8); +SetRegisterAllowed(0x4CC); +SetRegisterAllowed(0x4D0); +SetRegisterAllowed(0x4D4); +SetRegisterAllowed(0x4D8); +SetRegisterAllowed(0x4DC); +SetRegisterAllowed(0x4E0); +SetRegisterAllowed(0x4E4); +SetRegisterAllowed(0x4E8); +SetRegisterAllowed(0x4EC); +SetRegisterAllowed(0x4F0); +SetRegisterAllowed(0x4F4); +SetRegisterAllowed(0x4F8); +SetRegisterAllowed(0x4FC); +SetRegisterAllowed(0x500); +SetRegisterAllowed(0x504); +SetRegisterAllowed(0x508); +SetRegisterAllowed(0x50C); +SetRegisterAllowed(0x510); +SetRegisterAllowed(0x514); +SetRegisterAllowed(0x518); +SetRegisterAllowed(0x51C); +SetRegisterAllowed(0x520); +SetRegisterAllowed(0x524); +SetRegisterAllowed(0x528); +SetRegisterAllowed(0x52C); +SetRegisterAllowed(0x530); +SetRegisterAllowed(0x534); +SetRegisterAllowed(0x538); +SetRegisterAllowed(0x53C); +SetRegisterAllowed(0x540); +SetRegisterAllowed(0x544); +SetRegisterAllowed(0x548); +SetRegisterAllowed(0x54C); +SetRegisterAllowed(0x550); +SetRegisterAllowed(0x554); +SetRegisterAllowed(0x558); +SetRegisterAllowed(0x55C); +SetRegisterAllowed(0x560); +SetRegisterAllowed(0x564); +SetRegisterAllowed(0x568); +SetRegisterAllowed(0x56C); +SetRegisterAllowed(0x570); +SetRegisterAllowed(0x574); +SetRegisterAllowed(0x578); +SetRegisterAllowed(0x57C); +SetRegisterAllowed(0x580); +SetRegisterAllowed(0x584); +SetRegisterAllowed(0x588); +SetRegisterAllowed(0x58C); +SetRegisterAllowed(0x590); +SetRegisterAllowed(0x594); +SetRegisterAllowed(0x598); +SetRegisterAllowed(0x59C); +SetRegisterAllowed(0x5A0); +SetRegisterAllowed(0x5A4); +SetRegisterAllowed(0x5A8); +SetRegisterAllowed(0x5AC); +SetRegisterAllowed(0x5B0); +SetRegisterAllowed(0x5B4); +SetRegisterAllowed(0x5B8); +SetRegisterAllowed(0x5BC); +SetRegisterAllowed(0x5C0); +SetRegisterAllowed(0x5C4); +SetRegisterAllowed(0x5C8); +SetRegisterAllowed(0x5CC); +SetRegisterAllowed(0x5D0); +SetRegisterAllowed(0x5D4); +SetRegisterAllowed(0x5D8); +SetRegisterAllowed(0x5DC); +SetRegisterAllowed(0x5E0); +SetRegisterAllowed(0x5E4); +SetRegisterAllowed(0x5E8); +SetRegisterAllowed(0x5EC); +SetRegisterAllowed(0x5F0); +SetRegisterAllowed(0x5F4); +SetRegisterAllowed(0x5F8); +SetRegisterAllowed(0x5FC); +SetRegisterAllowed(0x600); +SetRegisterAllowed(0x604); +SetRegisterAllowed(0x608); +SetRegisterAllowed(0x60C); +SetRegisterAllowed(0x610); +SetRegisterAllowed(0x614); +SetRegisterAllowed(0x618); +SetRegisterAllowed(0x61C); +SetRegisterAllowed(0x620); +SetRegisterAllowed(0x624); +SetRegisterAllowed(0x628); +SetRegisterAllowed(0x62C); +SetRegisterAllowed(0x630); +SetRegisterAllowed(0x634); +SetRegisterAllowed(0x638); +SetRegisterAllowed(0x63C); +SetRegisterAllowed(0x640); +SetRegisterAllowed(0x644); +SetRegisterAllowed(0x648); +SetRegisterAllowed(0x64C); +SetRegisterAllowed(0x650); +SetRegisterAllowed(0x654); +SetRegisterAllowed(0x658); +SetRegisterAllowed(0x65C); +SetRegisterAllowed(0x660); +SetRegisterAllowed(0x664); +SetRegisterAllowed(0x668); +SetRegisterAllowed(0x66C); +SetRegisterAllowed(0x670); +SetRegisterAllowed(0x674); +SetRegisterAllowed(0x678); +SetRegisterAllowed(0x67C); +SetRegisterAllowed(0x680); +SetRegisterAllowed(0x684); +SetRegisterAllowed(0x688); +SetRegisterAllowed(0x68C); +SetRegisterAllowed(0x690); +SetRegisterAllowed(0x694); +SetRegisterAllowed(0x698); +SetRegisterAllowed(0x69C); +SetRegisterAllowed(0x6A0); +SetRegisterAllowed(0x6A4); +SetRegisterAllowed(0x6A8); +SetRegisterAllowed(0x6AC); +SetRegisterAllowed(0x6B0); +SetRegisterAllowed(0x6B4); +SetRegisterAllowed(0x6B8); +SetRegisterAllowed(0x6BC); +SetRegisterAllowed(0x6C0); +SetRegisterAllowed(0x6C4); +SetRegisterAllowed(0x6C8); +SetRegisterAllowed(0x6CC); +SetRegisterAllowed(0x6D0); +SetRegisterAllowed(0x6D4); +SetRegisterAllowed(0x6D8); +SetRegisterAllowed(0x6DC); +SetRegisterAllowed(0x6E0); +SetRegisterAllowed(0x6E4); +SetRegisterAllowed(0x6E8); +SetRegisterAllowed(0x6EC); +SetRegisterAllowed(0x6F0); +SetRegisterAllowed(0x6F4); +SetRegisterAllowed(0x6F8); +SetRegisterAllowed(0x6FC); +SetRegisterAllowed(0x700); +SetRegisterAllowed(0x704); +SetRegisterAllowed(0x708); +SetRegisterAllowed(0x70C); +SetRegisterAllowed(0x710); +SetRegisterAllowed(0x714); +SetRegisterAllowed(0x718); +SetRegisterAllowed(0x71C); +SetRegisterAllowed(0x720); +SetRegisterAllowed(0x724); +SetRegisterAllowed(0x728); +SetRegisterAllowed(0x72C); +SetRegisterAllowed(0x730); +SetRegisterAllowed(0x734); +SetRegisterAllowed(0x738); +SetRegisterAllowed(0x73C); +SetRegisterAllowed(0x740); +SetRegisterAllowed(0x744); +SetRegisterAllowed(0x748); +SetRegisterAllowed(0x74C); +SetRegisterAllowed(0x750); +SetRegisterAllowed(0x754); +SetRegisterAllowed(0x758); +SetRegisterAllowed(0x75C); +SetRegisterAllowed(0x760); +SetRegisterAllowed(0x764); +SetRegisterAllowed(0x768); +SetRegisterAllowed(0x76C); +SetRegisterAllowed(0x770); +SetRegisterAllowed(0x774); +SetRegisterAllowed(0x778); +SetRegisterAllowed(0x77C); +SetRegisterAllowed(0x780); +SetRegisterAllowed(0x784); +SetRegisterAllowed(0x788); +SetRegisterAllowed(0x78C); +SetRegisterAllowed(0x790); +SetRegisterAllowed(0x794); +SetRegisterAllowed(0x798); +SetRegisterAllowed(0x79C); +SetRegisterAllowed(0x7A0); +SetRegisterAllowed(0x7A4); +SetRegisterAllowed(0x7A8); +SetRegisterAllowed(0x7AC); +SetRegisterAllowed(0x7B0); +SetRegisterAllowed(0x7B4); +SetRegisterAllowed(0x7B8); +SetRegisterAllowed(0x7BC); +SetRegisterAllowed(0x7C0); +SetRegisterAllowed(0x7C4); +SetRegisterAllowed(0x7C8); +SetRegisterAllowed(0x7CC); +SetRegisterAllowed(0x7D0); +SetRegisterAllowed(0x7D4); +SetRegisterAllowed(0x7D8); +SetRegisterAllowed(0x7DC); +SetRegisterAllowed(0x7E0); +SetRegisterAllowed(0x7E4); +SetRegisterAllowed(0x7E8); +SetRegisterAllowed(0x7EC); +SetRegisterAllowed(0x7F0); +SetRegisterAllowed(0x7F4); +SetRegisterAllowed(0x7F8); +SetRegisterAllowed(0x7FC); +SetRegisterAllowed(0x800); +SetRegisterAllowed(0x804); +SetRegisterAllowed(0x808); +SetRegisterAllowed(0x80C); +SetRegisterAllowed(0x810); +SetRegisterAllowed(0x814); +SetRegisterAllowed(0x818); +SetRegisterAllowed(0x81C); +SetRegisterAllowed(0x820); +SetRegisterAllowed(0x824); +SetRegisterAllowed(0x828); +SetRegisterAllowed(0x82C); +SetRegisterAllowed(0x830); +SetRegisterAllowed(0x834); +SetRegisterAllowed(0x838); +SetRegisterAllowed(0x83C); +SetRegisterAllowed(0x840); +SetRegisterAllowed(0x844); +SetRegisterAllowed(0x848); +SetRegisterAllowed(0x84C); +SetRegisterAllowed(0x850); +SetRegisterAllowed(0x854); +SetRegisterAllowed(0x858); +SetRegisterAllowed(0x85C); +SetRegisterAllowed(0x860); +SetRegisterAllowed(0x864); +SetRegisterAllowed(0x868); +SetRegisterAllowed(0x86C); +SetRegisterAllowed(0x870); +SetRegisterAllowed(0x874); +SetRegisterAllowed(0x878); +SetRegisterAllowed(0x87C); +SetRegisterAllowed(0x880); +SetRegisterAllowed(0x884); +SetRegisterAllowed(0x888); +SetRegisterAllowed(0x88C); +SetRegisterAllowed(0x890); +SetRegisterAllowed(0x894); +SetRegisterAllowed(0x898); +SetRegisterAllowed(0x89C); +SetRegisterAllowed(0x8A0); +SetRegisterAllowed(0x8A4); +SetRegisterAllowed(0x8A8); +SetRegisterAllowed(0x8AC); +SetRegisterAllowed(0x8B0); +SetRegisterAllowed(0x8B4); +SetRegisterAllowed(0x8B8); +SetRegisterAllowed(0x8BC); +SetRegisterAllowed(0x8C0); +SetRegisterAllowed(0x8C4); +SetRegisterAllowed(0x8C8); +SetRegisterAllowed(0x8CC); +SetRegisterAllowed(0x8D0); +SetRegisterAllowed(0x8D4); +SetRegisterAllowed(0x8D8); +SetRegisterAllowed(0x8DC); +SetRegisterAllowed(0x8E0); +SetRegisterAllowed(0x8E4); +SetRegisterAllowed(0x8E8); +SetRegisterAllowed(0x8EC); +SetRegisterAllowed(0x8F0); +SetRegisterAllowed(0x8F4); +SetRegisterAllowed(0x8F8); +SetRegisterAllowed(0x8FC); +SetRegisterAllowed(0x900); +SetRegisterAllowed(0x904); +SetRegisterAllowed(0x908); +SetRegisterAllowed(0x90C); +SetRegisterAllowed(0x910); +SetRegisterAllowed(0x914); +SetRegisterAllowed(0x918); +SetRegisterAllowed(0x91C); +SetRegisterAllowed(0x920); +SetRegisterAllowed(0x924); +SetRegisterAllowed(0x928); +SetRegisterAllowed(0x92C); +SetRegisterAllowed(0x930); +SetRegisterAllowed(0x934); +SetRegisterAllowed(0x938); +SetRegisterAllowed(0x93C); +SetRegisterAllowed(0x940); +SetRegisterAllowed(0x944); +SetRegisterAllowed(0x948); +SetRegisterAllowed(0x94C); +SetRegisterAllowed(0x950); +SetRegisterAllowed(0x954); +SetRegisterAllowed(0x958); +SetRegisterAllowed(0x95C); +SetRegisterAllowed(0x960); +SetRegisterAllowed(0x964); +SetRegisterAllowed(0x968); +SetRegisterAllowed(0x96C); +SetRegisterAllowed(0x970); +SetRegisterAllowed(0x974); +SetRegisterAllowed(0x978); +SetRegisterAllowed(0x97C); +SetRegisterAllowed(0x980); +SetRegisterAllowed(0x984); +SetRegisterAllowed(0x988); +SetRegisterAllowed(0x98C); +SetRegisterAllowed(0x990); +SetRegisterAllowed(0x994); +SetRegisterAllowed(0x998); +SetRegisterAllowed(0x99C); +SetRegisterAllowed(0x9A0); +SetRegisterAllowed(0x9A4); +SetRegisterAllowed(0x9A8); +SetRegisterAllowed(0x9AC); +SetRegisterAllowed(0x9B0); +SetRegisterAllowed(0x9B4); +SetRegisterAllowed(0x9B8); +SetRegisterAllowed(0x9BC); +SetRegisterAllowed(0x9C0); +SetRegisterAllowed(0x9C4); +SetRegisterAllowed(0x9C8); +SetRegisterAllowed(0x9CC); +SetRegisterAllowed(0x9D0); +SetRegisterAllowed(0x9D4); +SetRegisterAllowed(0x9D8); +SetRegisterAllowed(0x9DC); +SetRegisterAllowed(0x9E0); +SetRegisterAllowed(0x9E4); +SetRegisterAllowed(0x9E8); +SetRegisterAllowed(0x9EC); +SetRegisterAllowed(0x9F0); +SetRegisterAllowed(0x9F4); +SetRegisterAllowed(0x9F8); +SetRegisterAllowed(0x9FC); +SetRegisterAllowed(0xA00); +SetRegisterAllowed(0xA04); +SetRegisterAllowed(0xA08); +SetRegisterAllowed(0xA0C); +SetRegisterAllowed(0xA10); +SetRegisterAllowed(0xA14); +SetRegisterAllowed(0xA18); +SetRegisterAllowed(0xA1C); +SetRegisterAllowed(0xA20); +SetRegisterAllowed(0xA24); +SetRegisterAllowed(0xA28); +SetRegisterAllowed(0xA2C); +SetRegisterAllowed(0xA30); +SetRegisterAllowed(0xA34); +SetRegisterAllowed(0xA38); +SetRegisterAllowed(0xA3C); +SetRegisterAllowed(0xA40); +SetRegisterAllowed(0xA44); +SetRegisterAllowed(0xA48); +SetRegisterAllowed(0xA4C); +SetRegisterAllowed(0xA50); +SetRegisterAllowed(0xA54); +SetRegisterAllowed(0xA58); +SetRegisterAllowed(0xA5C); +SetRegisterAllowed(0xA60); +SetRegisterAllowed(0xA64); +SetRegisterAllowed(0xA68); +SetRegisterAllowed(0xA6C); +SetRegisterAllowed(0xA70); +SetRegisterAllowed(0xA74); +SetRegisterAllowed(0xA78); +SetRegisterAllowed(0xA7C); +SetRegisterAllowed(0xA80); +SetRegisterAllowed(0xA84); +SetRegisterAllowed(0xA88); +SetRegisterAllowed(0xA8C); +SetRegisterAllowed(0xA90); +SetRegisterAllowed(0xA94); +SetRegisterAllowed(0xA98); +SetRegisterAllowed(0xA9C); +SetRegisterAllowed(0xAA0); +SetRegisterAllowed(0xAA4); +SetRegisterAllowed(0xAA8); +SetRegisterAllowed(0xAAC); +SetRegisterAllowed(0xAB0); +SetRegisterAllowed(0xAB4); +SetRegisterAllowed(0xAB8); +SetRegisterAllowed(0xABC); +SetRegisterAllowed(0xAC0); +SetRegisterAllowed(0xAC4); +SetRegisterAllowed(0xAC8); +SetRegisterAllowed(0xACC); +SetRegisterAllowed(0xAD0); +SetRegisterAllowed(0xAD4); +SetRegisterAllowed(0xAD8); +SetRegisterAllowed(0xADC); +SetRegisterAllowed(0xAE0); +SetRegisterAllowed(0xAE4); +SetRegisterAllowed(0xAE8); +SetRegisterAllowed(0xAEC); +SetRegisterAllowed(0xAF0); +SetRegisterAllowed(0xAF4); +SetRegisterAllowed(0xAF8); +SetRegisterAllowed(0xAFC); +SetRegisterAllowed(0xB00); +SetRegisterAllowed(0xB04); +SetRegisterAllowed(0xB08); +SetRegisterAllowed(0xB0C); +SetRegisterAllowed(0xB10); +SetRegisterAllowed(0xB14); +SetRegisterAllowed(0xB18); +SetRegisterAllowed(0xB1C); +SetRegisterAllowed(0xB20); +SetRegisterAllowed(0xB24); +SetRegisterAllowed(0xB28); +SetRegisterAllowed(0xB2C); +SetRegisterAllowed(0xB30); +SetRegisterAllowed(0xB34); +SetRegisterAllowed(0xB38); +SetRegisterAllowed(0xB3C); +SetRegisterAllowed(0xB40); +SetRegisterAllowed(0xB44); +SetRegisterAllowed(0xB48); +SetRegisterAllowed(0xB4C); +SetRegisterAllowed(0xB50); +SetRegisterAllowed(0xB54); +SetRegisterAllowed(0xB58); +SetRegisterAllowed(0xB5C); +SetRegisterAllowed(0xB60); +SetRegisterAllowed(0xB64); +SetRegisterAllowed(0xB68); +SetRegisterAllowed(0xB6C); +SetRegisterAllowed(0xB70); +SetRegisterAllowed(0xB74); +SetRegisterAllowed(0xB78); +SetRegisterAllowed(0xB7C); +SetRegisterAllowed(0xB80); +SetRegisterAllowed(0xB84); +SetRegisterAllowed(0xB88); +SetRegisterAllowed(0xB8C); +SetRegisterAllowed(0xB90); +SetRegisterAllowed(0xB94); +SetRegisterAllowed(0xB98); +SetRegisterAllowed(0xB9C); +SetRegisterAllowed(0xBA0); +SetRegisterAllowed(0xBA4); +SetRegisterAllowed(0xBA8); +SetRegisterAllowed(0xBAC); +SetRegisterAllowed(0xBB0); +SetRegisterAllowed(0xBB4); +SetRegisterAllowed(0xBB8); +SetRegisterAllowed(0xBBC); +SetRegisterAllowed(0xBC0); +SetRegisterAllowed(0xBC4); +SetRegisterAllowed(0xBC8); +SetRegisterAllowed(0xBCC); +SetRegisterAllowed(0xBD0); +SetRegisterAllowed(0xBD4); +SetRegisterAllowed(0xBD8); +SetRegisterAllowed(0xBDC); +SetRegisterAllowed(0xBE0); +SetRegisterAllowed(0xBE4); +SetRegisterAllowed(0xBE8); +SetRegisterAllowed(0xBEC); +SetRegisterAllowed(0xBF0); +SetRegisterAllowed(0xBF4); +SetRegisterAllowed(0xBF8); +SetRegisterAllowed(0xBFC); +SetRegisterAllowed(0xC00); +SetRegisterAllowed(0xC04); +SetRegisterAllowed(0xC08); +SetRegisterAllowed(0xC0C); +SetRegisterAllowed(0xC10); +SetRegisterAllowed(0xC14); +SetRegisterAllowed(0xC18); +SetRegisterAllowed(0xC1C); +SetRegisterAllowed(0xC20); +SetRegisterAllowed(0xC24); +SetRegisterAllowed(0xC28); +SetRegisterAllowed(0xC2C); +SetRegisterAllowed(0xC30); +SetRegisterAllowed(0xC34); +SetRegisterAllowed(0xC38); +SetRegisterAllowed(0xC3C); +SetRegisterAllowed(0xC40); +SetRegisterAllowed(0xC44); +SetRegisterAllowed(0xC48); +SetRegisterAllowed(0xC4C); +SetRegisterAllowed(0xC50); +SetRegisterAllowed(0xC54); +SetRegisterAllowed(0xC58); +SetRegisterAllowed(0xC5C); +SetRegisterAllowed(0xC60); +SetRegisterAllowed(0xC64); +SetRegisterAllowed(0xC68); +SetRegisterAllowed(0xC6C); +SetRegisterAllowed(0xC70); +SetRegisterAllowed(0xC74); +SetRegisterAllowed(0xC78); +SetRegisterAllowed(0xC7C); +SetRegisterAllowed(0xC80); +SetRegisterAllowed(0xC84); +SetRegisterAllowed(0xC88); +SetRegisterAllowed(0xC8C); +SetRegisterAllowed(0xC90); +SetRegisterAllowed(0xC94); +SetRegisterAllowed(0xC98); +SetRegisterAllowed(0xC9C); +SetRegisterAllowed(0xCA0); +SetRegisterAllowed(0xCA4); +SetRegisterAllowed(0xCA8); +SetRegisterAllowed(0xCAC); +SetRegisterAllowed(0xCB0); +SetRegisterAllowed(0xCB4); +SetRegisterAllowed(0xCB8); +SetRegisterAllowed(0xCBC); +SetRegisterAllowed(0xCC0); +SetRegisterAllowed(0xCC4); +SetRegisterAllowed(0xCC8); +SetRegisterAllowed(0xCCC); +SetRegisterAllowed(0xCD0); +SetRegisterAllowed(0xCD4); +SetRegisterAllowed(0xCD8); +SetRegisterAllowed(0xCDC); +SetRegisterAllowed(0xCE0); +SetRegisterAllowed(0xCE4); +SetRegisterAllowed(0xCE8); +SetRegisterAllowed(0xCEC); +SetRegisterAllowed(0xCF0); +SetRegisterAllowed(0xCF4); +SetRegisterAllowed(0xCF8); +SetRegisterAllowed(0xCFC); +SetRegisterAllowed(0xD00); +SetRegisterAllowed(0xD04); +SetRegisterAllowed(0xD08); +SetRegisterAllowed(0xD0C); +SetRegisterAllowed(0xD10); +SetRegisterAllowed(0xD14); +SetRegisterAllowed(0xD18); +SetRegisterAllowed(0xD1C); +SetRegisterAllowed(0xD20); +SetRegisterAllowed(0xD24); +SetRegisterAllowed(0xD28); +SetRegisterAllowed(0xD2C); +SetRegisterAllowed(0xD30); +SetRegisterAllowed(0xD34); +SetRegisterAllowed(0xD38); +SetRegisterAllowed(0xD3C); +SetRegisterAllowed(0xD40); +SetRegisterAllowed(0xD44); +SetRegisterAllowed(0xD48); +SetRegisterAllowed(0xD4C); +SetRegisterAllowed(0xD50); +SetRegisterAllowed(0xD54); +SetRegisterAllowed(0xD58); +SetRegisterAllowed(0xD5C); +SetRegisterAllowed(0xD60); +SetRegisterAllowed(0xD64); +SetRegisterAllowed(0xD68); +SetRegisterAllowed(0xD6C); +SetRegisterAllowed(0xD70); +SetRegisterAllowed(0xD74); +SetRegisterAllowed(0xD78); +SetRegisterAllowed(0xD7C); +SetRegisterAllowed(0xD80); +SetRegisterAllowed(0xD84); +SetRegisterAllowed(0xD88); +SetRegisterAllowed(0xD8C); +SetRegisterAllowed(0xD90); +SetRegisterAllowed(0xD94); +SetRegisterAllowed(0xD98); +SetRegisterAllowed(0xD9C); +SetRegisterAllowed(0xDA0); +SetRegisterAllowed(0xDA4); +SetRegisterAllowed(0xDA8); +SetRegisterAllowed(0xDAC); +SetRegisterAllowed(0xDB0); +SetRegisterAllowed(0xDB4); +SetRegisterAllowed(0xDB8); +SetRegisterAllowed(0xDBC); +SetRegisterAllowed(0xDC0); +SetRegisterAllowed(0xDC4); +SetRegisterAllowed(0xDC8); +SetRegisterAllowed(0xDCC); +SetRegisterAllowed(0xDD0); +SetRegisterAllowed(0xDD4); +SetRegisterAllowed(0xDD8); +SetRegisterAllowed(0xDDC); +SetRegisterAllowed(0xDE0); +SetRegisterAllowed(0xDE4); +SetRegisterAllowed(0xDE8); +SetRegisterAllowed(0xDEC); +SetRegisterAllowed(0xDF0); +SetRegisterAllowed(0xDF4); +SetRegisterAllowed(0xDF8); +SetRegisterAllowed(0xDFC); +SetRegisterAllowed(0xE00); +SetRegisterAllowed(0xE04); +SetRegisterAllowed(0xE08); +SetRegisterAllowed(0xE0C); +SetRegisterAllowed(0xE10); +SetRegisterAllowed(0xE14); +SetRegisterAllowed(0xE18); +SetRegisterAllowed(0xE1C); +SetRegisterAllowed(0xE20); +SetRegisterAllowed(0xE24); +SetRegisterAllowed(0xE28); +SetRegisterAllowed(0xE2C); +SetRegisterAllowed(0xE30); +SetRegisterAllowed(0xE34); +SetRegisterAllowed(0xE38); +SetRegisterAllowed(0xE3C); +SetRegisterAllowed(0xE40); +SetRegisterAllowed(0xE44); +SetRegisterAllowed(0xE48); +SetRegisterAllowed(0xE4C); +SetRegisterAllowed(0xE50); +SetRegisterAllowed(0xE54); +SetRegisterAllowed(0xE58); +SetRegisterAllowed(0xE5C); +SetRegisterAllowed(0xE60); +SetRegisterAllowed(0xE64); +SetRegisterAllowed(0xE68); +SetRegisterAllowed(0xE6C); +SetRegisterAllowed(0xE70); +SetRegisterAllowed(0xE74); +SetRegisterAllowed(0xE78); +SetRegisterAllowed(0xE7C); +SetRegisterAllowed(0xE80); +SetRegisterAllowed(0xE84); +SetRegisterAllowed(0xE88); +SetRegisterAllowed(0xE8C); +SetRegisterAllowed(0xE90); +SetRegisterAllowed(0xE94); +SetRegisterAllowed(0xE98); +SetRegisterAllowed(0xE9C); +SetRegisterAllowed(0xEA0); +SetRegisterAllowed(0xEA4); +SetRegisterAllowed(0xEA8); +SetRegisterAllowed(0xEAC); +SetRegisterAllowed(0xEB0); +SetRegisterAllowed(0xEB4); +SetRegisterAllowed(0xEB8); +SetRegisterAllowed(0xEBC); +SetRegisterAllowed(0xEC0); +SetRegisterAllowed(0xEC4); +SetRegisterAllowed(0xEC8); +SetRegisterAllowed(0xECC); +SetRegisterAllowed(0xED0); +SetRegisterAllowed(0xED4); +SetRegisterAllowed(0xED8); +SetRegisterAllowed(0xEDC); +SetRegisterAllowed(0xEE0); +SetRegisterAllowed(0xEE4); +SetRegisterAllowed(0xEE8); +SetRegisterAllowed(0xEEC); +SetRegisterAllowed(0xEF0); +SetRegisterAllowed(0xEF4); +SetRegisterAllowed(0xEF8); +SetRegisterAllowed(0xEFC); +SetRegisterAllowed(0xF00); +SetRegisterAllowed(0xF04); +SetRegisterAllowed(0xF08); +SetRegisterAllowed(0xF0C); +SetRegisterAllowed(0xF10); +SetRegisterAllowed(0xF14); +SetRegisterAllowed(0xF18); +SetRegisterAllowed(0xF1C); +SetRegisterAllowed(0xF20); +SetRegisterAllowed(0xF24); +SetRegisterAllowed(0xF28); +SetRegisterAllowed(0xF2C); +SetRegisterAllowed(0xF30); +SetRegisterAllowed(0xF34); +SetRegisterAllowed(0xF38); +SetRegisterAllowed(0xF3C); +SetRegisterAllowed(0xF40); +SetRegisterAllowed(0xF44); +SetRegisterAllowed(0xF48); +SetRegisterAllowed(0xF4C); +SetRegisterAllowed(0xF50); +SetRegisterAllowed(0xF54); +SetRegisterAllowed(0xF58); +SetRegisterAllowed(0xF5C); +SetRegisterAllowed(0xF60); +SetRegisterAllowed(0xF64); +SetRegisterAllowed(0xF68); +SetRegisterAllowed(0xF6C); +SetRegisterAllowed(0xF70); +SetRegisterAllowed(0xF74); +SetRegisterAllowed(0xF78); +SetRegisterAllowed(0xF7C); +SetRegisterAllowed(0xF80); +SetRegisterAllowed(0xF84); +SetRegisterAllowed(0xF88); +SetRegisterAllowed(0xF8C); +SetRegisterAllowed(0xF90); +SetRegisterAllowed(0xF94); +SetRegisterAllowed(0xF98); +SetRegisterAllowed(0xF9C); +SetRegisterAllowed(0xFA0); +SetRegisterAllowed(0xFA4); +SetRegisterAllowed(0xFA8); +SetRegisterAllowed(0xFAC); +SetRegisterAllowed(0xFB0); +SetRegisterAllowed(0xFB4); +SetRegisterAllowed(0xFB8); +SetRegisterAllowed(0xFBC); +SetRegisterAllowed(0xFC0); +SetRegisterAllowed(0xFC4); +SetRegisterAllowed(0xFC8); +SetRegisterAllowed(0xFCC); +SetRegisterAllowed(0xFD0); +SetRegisterAllowed(0xFD4); +SetRegisterAllowed(0xFD8); +SetRegisterAllowed(0xFDC); +SetRegisterAllowed(0xFE0); +SetRegisterAllowed(0xFE4); +SetRegisterAllowed(0xFE8); +SetRegisterAllowed(0xFEC); +SetRegisterAllowed(0xFF0); +SetRegisterAllowed(0xFF4); +SetRegisterAllowed(0xFF8); +SetRegisterAllowed(0xFFC); diff --git a/Source/Atmosphere-Patches/secmon_memory_layout.hpp b/Source/Atmosphere-Patches/secmon_memory_layout.hpp index 7c0e499a..ba3e3ab8 100644 --- a/Source/Atmosphere-Patches/secmon_memory_layout.hpp +++ b/Source/Atmosphere-Patches/secmon_memory_layout.hpp @@ -151,7 +151,9 @@ namespace ams::secmon { HANDLER(ExceptionVectors, I2c1, UINT64_C(0x6000F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ HANDLER(MemoryController0, ExceptionVectors, UINT64_C(0x7001C000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ HANDLER(MemoryController1, MemoryController0, UINT64_C(0x7001D000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ - HANDLER(Sdmmc, MemoryController1, UINT64_C(0x700B0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ + HANDLER(ExternalMemoryController0, MemoryController1, UINT64_C(0x7001E000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ + HANDLER(ExternalMemoryController1, ExternalMemoryController0, UINT64_C(0x7001F000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ + HANDLER(Sdmmc, ExternalMemoryController1, UINT64_C(0x700B0000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ HANDLER(Disp1, Sdmmc, UINT64_C(0x54200000), UINT64_C(0x3000), true, ## __VA_ARGS__) \ HANDLER(Dsi, Disp1, UINT64_C(0x54300000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ HANDLER(MipiCal, Dsi, UINT64_C(0x700E3000), UINT64_C(0x1000), true, ## __VA_ARGS__) \ diff --git a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp index af04fa04..36932196 100644 --- a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp +++ b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp @@ -99,6 +99,7 @@ namespace ams::secmon::smc { #include "secmon_define_pmc_access_table.inc" #include "secmon_define_mc_access_table.inc" #include "secmon_define_emc_access_table.inc" + #include "secmon_define_emc01_access_table.inc" #include "secmon_define_flow_controller_access_table.inc" #include "secmon_define_exception_vectors_access_table.inc" #include "secmon_define_rtc_pmc_access_table.inc" @@ -108,6 +109,8 @@ namespace ams::secmon::smc { { PmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDevicePmc.GetAddress(), PmcAccessTable::Address, PmcAccessTable::Size, }, { McAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController.GetAddress(), McAccessTable::Address, McAccessTable::Size, }, { EmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExternalMemoryController.GetAddress(), EmcAccessTable::Address, EmcAccessTable::Size, }, + { Emc01AccessTable::ReducedAccessTable.data(), Emc01AccessTable::Address + MemoryRegionVirtualDeviceExternalMemoryController0.GetAddress(), Emc01AccessTable::Address + MemoryRegionPhysicalDeviceExternalMemoryController0.GetAddress(), Emc01AccessTable::Size, }, + { Emc01AccessTable::ReducedAccessTable.data(), Emc01AccessTable::Address + MemoryRegionVirtualDeviceExternalMemoryController1.GetAddress(), Emc01AccessTable::Address + MemoryRegionPhysicalDeviceExternalMemoryController1.GetAddress(), Emc01AccessTable::Size, }, { FlowControllerAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceFlowController.GetAddress(), FlowControllerAccessTable::Address, FlowControllerAccessTable::Size, }, { ExceptionVectorsAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExceptionVectors.GetAddress(), ExceptionVectorsAccessTable::Address, ExceptionVectorsAccessTable::Size, }, { RtcPmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceRtcPmc.GetAddress(), RtcPmcAccessTable::Address, RtcPmcAccessTable::Size, }, diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 4923f46c..503c282b 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -50,6 +50,7 @@ #include #include #include "../mapping/mem_map.hpp" +#include "../soc/dram_mrr.hpp" namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr, tmrVirtAddr; @@ -286,6 +287,10 @@ namespace board { } u8 GetDramID() { + return soc::mrr::IdentifyDramId(); + } + + u8 GetFuseDramId() { return gDramID; } diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 57fa514e..9f9cf356 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -56,6 +56,7 @@ namespace board { void Exit(); HocClkSocType GetSocType(); HocClkConsoleType GetConsoleType(); + u8 GetFuseDramId(); u8 GetDramID(); u8 GetGpuSpeedoBracket(); bool IsDram8GB(); diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp new file mode 100644 index 00000000..29d6603d --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp @@ -0,0 +1,382 @@ +/* + * Copyright (c) CtCaer + * + * Copyright (c) Souldbminer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "dram_mrr.hpp" +#include "../board/board.hpp" + +#include +#include +#include + +namespace soc::mrr { + constexpr u64 EmcPhysBase = 0x7001B000; + constexpr u64 Emc0PhysBase = 0x7001E000; + constexpr u64 Emc1PhysBase = 0x7001F000; + + constexpr u32 EmcRegMrr = 0xEC; + constexpr u32 EmcRegAdrCfg = 0x10; + constexpr u32 EmcRegFbioCfg7 = 0x584; + constexpr u32 EmcRegEmcStatus = 0x2B4; + constexpr u32 EmcStatusMrrDivld = (1u << 20); + constexpr int EmcStatusUpdateTimeout = 100000; + + static bool SmcRead(u64 phys_addr, u32 *out) { + SecmonArgs args = {}; + args.X[0] = 0xF0000002; + args.X[1] = phys_addr; + args.X[2] = 0; + args.X[3] = 0; + svcCallSecureMonitor(&args); + if (args.X[1] == phys_addr) { + return false; + } + *out = static_cast(args.X[1]); + return true; + } + + static bool SmcWrite(u64 phys_addr, u32 value) { + SecmonArgs args = {}; + args.X[0] = 0xF0000002; + args.X[1] = phys_addr; + args.X[2] = 0xFFFFFFFF; + args.X[3] = value; + svcCallSecureMonitor(&args); + return args.X[1] != phys_addr; + } + + static bool EmcRead(u32 offset, u32 *out) { return SmcRead(EmcPhysBase + offset, out); } + static bool EmcWrite(u32 offset, u32 value) { return SmcWrite(EmcPhysBase + offset, value); } + static bool Emc0Read(u32 offset, u32 *out) { return SmcRead(Emc0PhysBase + offset, out); } + static bool Emc1Read(u32 offset, u32 *out) { return SmcRead(Emc1PhysBase + offset, out); } + + /* 0 = ignore */ + + const DramRevisionMap rev[DRAM_COUNT] = { + /* Erista */ + { .soc = HocClkSocType_Erista, .mfg = MFG_Samsung, .major = 0, .minor = 0, .density = 0, .densityCount = 0 }, /* HB-MGCH */ + { .soc = HocClkSocType_Erista, .mfg = MFG_SKHynix, .major = 0, .minor = 0, .density = 0, .densityCount = 0 }, /* NLE */ + { .soc = HocClkSocType_Erista, .mfg = MFG_Micron, .major = 0, .minor = 0, .density = 0, .densityCount = 0 }, /* WT:C */ + + /* Mariko */ + /* Samsung */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 6, .minor = 0x10, .density = 1, .densityCount = 2 }, /* AM-MGCJ (6.10, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 7, .minor = 0, .density = 1, .densityCount = 2 }, /* AA-MGCL (7.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 8, .minor = 0, .density = 1, .densityCount = 2 }, /* AB-MGCL (8.00, 4GB) */ + + /* Micron */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 4, .minor = 0x10, .density = 1, .densityCount = 2 }, /* WT:E (4.10, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 5, .minor = 0, .density = 1, .densityCount = 2 }, /* WT:F (5.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 7, .minor = 0, .density = 1, .densityCount = 2 }, /* WT:B (7.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 7, .minor = 0, .density = 1, .densityCount = 4 }, /* WT:B (7.00, 8GB) */ + + /* SK Hynix */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 4, .minor = 0, .density = 1, .densityCount = 2 }, /* NME (4.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 6, .minor = 0, .density = 1, .densityCount = 2 }, /* NEE (6.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 6, .minor = 0, .density = 1, .densityCount = 4 }, /* NEE (6.00, 8GB) */ + }; + + /* Ported from hekate */ + + bool IsMrrAvailable() { + u32 val = 0; + return EmcRead(EmcRegAdrCfg, &val); + } + + static int _sdram_wait_emc_status(u32 reg_offset, u32 bit_mask, bool updated_state, s32 emc_channel) + { + for (s32 i = 0; i < EmcStatusUpdateTimeout; i++) + { + u32 val = 0; + bool ok; + if (emc_channel) + { + if (emc_channel != 1) + return 1; + + ok = Emc1Read(reg_offset, &val); + } + else + { + ok = EmcRead(reg_offset, &val); + } + + if (ok && (((val & bit_mask) != 0) == updated_state)) + return 0; + + usleep(1); + } + + return 1; + } + + static bool _sdram_req_mrr_data(u32 data, bool dual_channel) + { + if (!EmcWrite(EmcRegMrr, data)) + return false; + if (_sdram_wait_emc_status(EmcRegEmcStatus, EmcStatusMrrDivld, true, EMC_CHAN0) != 0) + return false; + if (dual_channel && _sdram_wait_emc_status(EmcRegEmcStatus, EmcStatusMrrDivld, true, EMC_CHAN1) != 0) + return false; + return true; + } + + struct EmcTopology { + u32 ranks; + u32 channels; + }; + + static bool QueryTopology(EmcTopology *topo) { + u32 tmp = 0; + if (!EmcRead(EmcRegAdrCfg, &tmp)) + return false; + topo->ranks = (tmp & 1) + 1; + if (!EmcRead(EmcRegFbioCfg7, &tmp)) + return false; + u32 ch = (tmp >> 1) & 3; + topo->channels = (ch & 1) + ((ch & 2) >> 1); + return topo->channels != 0; + } + + static void ClearMrrLeftovers() { + u32 tmp = 0; + for (u32 i = 0; i < 16; i++) + { + (void)EmcRead(EmcRegMrr, &tmp); + usleep(1); + } + } + + static void StoreMrrBytes(u32 mrr, u8 *lo, u8 *hi) { + *lo = mrr & 0xFF; + *hi = (mrr >> 8) & 0xFF; + } + + static bool ReadMrxRank(emc_mr_t mrx, bool dual_rank, bool dual_channel, emc_mr_data_t *out) { + memset(out, 0xFF, sizeof(*out)); + u32 mrr = 0; + + // Get Device 0 (Rank 0) info from both dram chips (channels). + if (!_sdram_req_mrr_data((2u << 30) | (static_cast(mrx) << 16), dual_channel)) + return false; + + // Ram module 0 info. + if (!Emc0Read(EmcRegMrr, &mrr)) + return false; + StoreMrrBytes(mrr, &out->chip0.rank0_ch0, &out->chip0.rank0_ch1); + + // Ram module 1 info. + if (dual_channel) + { + if (!Emc1Read(EmcRegMrr, &mrr)) + return false; + StoreMrrBytes(mrr, &out->chip1.rank0_ch0, &out->chip1.rank0_ch1); + } + + // If Rank 1 exists, get info. + if (dual_rank) + { + // Get Device 1 (Rank 1) info from both dram chips (channels). + if (!_sdram_req_mrr_data((1u << 30) | (static_cast(mrx) << 16), dual_channel)) + return false; + + // Ram module 0 info. + if (!Emc0Read(EmcRegMrr, &mrr)) + return false; + StoreMrrBytes(mrr, &out->chip0.rank1_ch0, &out->chip0.rank1_ch1); + + // Ram module 1 info. + if (dual_channel) + { + if (!Emc1Read(EmcRegMrr, &mrr)) + return false; + StoreMrrBytes(mrr, &out->chip1.rank1_ch0, &out->chip1.rank1_ch1); + } + } + + return true; + } + + static bool ReadMrxSet(emc_mr_data_t *vendor, emc_mr_data_t *rev0, emc_mr_data_t *rev1, + emc_mr_data_t *density, EmcTopology *topo) { + EmcTopology t = {}; + if (!QueryTopology(&t)) + return false; + const bool dual_rank = t.ranks > 1; + const bool dual_channel = t.channels > 1; + + ClearMrrLeftovers(); + + if (!ReadMrxRank(MR5_MAN_ID, dual_rank, dual_channel, vendor)) + return false; + if (!ReadMrxRank(MR6_REV_ID1, dual_rank, dual_channel, rev0)) + return false; + if (!ReadMrxRank(MR7_REV_ID2, dual_rank, dual_channel, rev1)) + return false; + if (!ReadMrxRank(MR8_DENSITY, dual_rank, dual_channel, density)) + return false; + + *topo = t; + return true; + } + + emc_mr_data_t sdram_read_mrx(emc_mr_t mrx) + { + emc_mr_data_t data; + memset(&data, 0xFF, sizeof(emc_mr_data_t)); + + EmcTopology topo = {}; + if (!QueryTopology(&topo)) + return data; + + ClearMrrLeftovers(); + + (void)ReadMrxRank(mrx, topo.ranks > 1, topo.channels > 1, &data); + return data; + } + + /* MR8 density field (bits 5:2) to MB */ + static bool DecodeDensityMb(u8 mr8, u32 *mb) { + switch ((mr8 & 0x3C) >> 2) + { + case 2: *mb = 512; break; + case 3: *mb = 768; break; + case 4: *mb = 1024; break; + case 5: *mb = 1536; break; + case 6: *mb = 2048; break; + default: return false; + } + return true; + } + + static bool MatchModule(HocClkSocType soc, DramMfg mfg, u8 major, u8 minor, + u32 densityMb, u32 densityCount, RealDramModule *mod) { + for (int i = 0; i < DRAM_COUNT; i++) + { + const DramRevisionMap &e = rev[i]; + if (e.soc != soc || e.mfg != mfg) + continue; + if (soc != HocClkSocType_Erista) + { + if (e.major != major || e.minor != minor) + continue; + if (e.density * 1024u != densityMb) + continue; + if (e.densityCount != densityCount) + continue; + } + *mod = static_cast(i); + return true; + } + return false; + } + + static u8 FuseIdForModule(RealDramModule mod, HocClkConsoleType console, u8 fuseFallback) { + switch (mod) + { + case DRAM_HBMGCH: + case DRAM_NLE: + case DRAM_WTC: + return fuseFallback; + case DRAM_AMMGCJ: + if (console == HocClkConsoleType_Hoag) return 12; + if (console == HocClkConsoleType_Iowa) return 8; + return fuseFallback; + case DRAM_AAMGCL: + if (console == HocClkConsoleType_Iowa) return 17; + if (console == HocClkConsoleType_Hoag) return 19; + if (console == HocClkConsoleType_Aula) return 24; + return fuseFallback; + case DRAM_ABMGCL: + if (console == HocClkConsoleType_Iowa) return 20; + if (console == HocClkConsoleType_Hoag) return 21; + if (console == HocClkConsoleType_Aula) return 22; + return fuseFallback; + case DRAM_WTE: + if (console == HocClkConsoleType_Iowa) return 11; + if (console == HocClkConsoleType_Hoag) return 15; + return fuseFallback; + case DRAM_WTF: + if (console == HocClkConsoleType_Iowa) return 25; + if (console == HocClkConsoleType_Hoag) return 26; + if (console == HocClkConsoleType_Aula) return 27; + return fuseFallback; + case DRAM_WTB: + if (console == HocClkConsoleType_Iowa) return 32; + if (console == HocClkConsoleType_Hoag) return 33; + if (console == HocClkConsoleType_Aula) return 34; + return fuseFallback; + case DRAM_WTB_8GB: + case DRAM_NEE_8GB: + /* Used in atmosphere and commonly burnt for 8gb upgrade */ + return 28; + case DRAM_NME: + if (console == HocClkConsoleType_Iowa) return 10; + if (console == HocClkConsoleType_Hoag) return 14; + return fuseFallback; + case DRAM_NEE: + if (console == HocClkConsoleType_Iowa) return 6; + if (console == HocClkConsoleType_Hoag) return 3; + if (console == HocClkConsoleType_Aula) return 5; + return fuseFallback; + default: + return fuseFallback; + } + } + + u8 IdentifyDramId() { + const u8 fuseId = board::GetFuseDramId(); + const HocClkSocType soc = board::GetSocType(); + + if (soc == HocClkSocType_Erista) + return fuseId; + + if (!IsMrrAvailable()) + return fuseId; + + emc_mr_data_t vendor = {}, rev0 = {}, rev1 = {}, density = {}; + EmcTopology topo = {}; + if (!ReadMrxSet(&vendor, &rev0, &rev1, &density, &topo)) + return fuseId; + + DramMfg mfg; + switch (vendor.chip0.rank0_ch0) + { + case MFG_Samsung: + case MFG_SKHynix: + case MFG_Micron: + mfg = static_cast(vendor.chip0.rank0_ch0); + break; + default: + return fuseId; + } + + u32 densityMb = 0; + if (!DecodeDensityMb(density.chip0.rank0_ch0, &densityMb)) + return fuseId; + + RealDramModule mod = DRAM_COUNT; + if (!MatchModule(soc, mfg, rev0.chip0.rank0_ch0, rev1.chip0.rank0_ch0, + densityMb, topo.ranks * topo.channels, &mod)) + return fuseId; /* TODO: Find hynix x267 config */ + + return FuseIdForModule(mod, board::GetConsoleType(), fuseId); + } + + +} \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp new file mode 100644 index 00000000..4a425df1 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) CtCaer + * + * Copyright (c) Souldbminer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include + +namespace soc::mrr { + typedef enum RealDramModule { + /* Erista */ + DRAM_HBMGCH = 0, + DRAM_NLE, + DRAM_WTC, + + /* Mariko */ + + /* Samsung */ + DRAM_AMMGCJ, + DRAM_AAMGCL, + DRAM_ABMGCL, + + /* Micron */ + DRAM_WTE, + DRAM_WTF, + DRAM_WTB, + DRAM_WTB_8GB, + + /* SK Hynix */ + DRAM_NME, + DRAM_NEE, + DRAM_NEE_8GB, + DRAM_COUNT, + } RealDramModule; + + typedef enum _emc_mr_t + { + MR0_FEAT = 0, + MR4_TEMP = 4, + MR5_MAN_ID = 5, + MR6_REV_ID1 = 6, + MR7_REV_ID2 = 7, + MR8_DENSITY = 8, + } emc_mr_t; + + enum + { + EMC_CHAN0 = 0, + EMC_CHAN1 = 1 + }; + + typedef struct _emc_mr_chip_data_t + { + // Device 0. + u8 rank0_ch0; + u8 rank0_ch1; + + // Device 1. + u8 rank1_ch0; + u8 rank1_ch1; + } emc_mr_chip_data_t; + + typedef struct _emc_mr_data_t + { + emc_mr_chip_data_t chip0; + emc_mr_chip_data_t chip1; + } emc_mr_data_t; + + typedef enum DramMfg { + MFG_Samsung = 1, + MFG_SKHynix = 6, + MFG_Micron = 255, + } DramMfg; + + typedef struct DramRevisionMap { + HocClkSocType soc; + DramMfg mfg; + u8 major; + u8 minor; + u8 density; // GB per die + u8 densityCount; // number of dies (2 = 4GB, 4 = 8GB) + } DramRevisionMap; + + extern const DramRevisionMap rev[DRAM_COUNT]; + + emc_mr_data_t sdram_read_mrx(emc_mr_t mrx); + bool IsMrrAvailable(); + + /* Fuse-style DRAM ID (hekate numbering, as in board::GetDramID): + derived from MRR when the patched exosphere grants EMC access, + otherwise falls back to the fuse ODM4 ID. MRR-detected 8GB WT:B/NEE + (no dedicated fuse numbering) alias to Aula AA-MGCL 8GB (28). */ + u8 IdentifyDramId(); +} \ No newline at end of file diff --git a/build.sh b/build.sh index 29b842fa..c2161a58 100755 --- a/build.sh +++ b/build.sh @@ -114,6 +114,8 @@ if [ "$NO_EXO" -eq 0 ]; then cp -v "$EXO_SRC/secmon_setup.cpp" "$EXO_PROGRAM_DEST/" cp -v "$EXO_SRC/secmon_define_emc_access_table.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_emc_access_table_data.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_define_emc01_access_table.inc" "$EXO_DEST/" + cp -v "$EXO_SRC/secmon_emc01_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_define_rtc_pmc_access_table.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_rtc_pmc_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_define_flow_controller_access_table.inc" "$EXO_DEST/" From 763ef09020c1b96823b73bbc49561330263eda44 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 5 Sep 2026 21:25:22 -0400 Subject: [PATCH 123/205] add x267 --- Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp | 24 ++++++++++++------- Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp index 29d6603d..5c8b396a 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp @@ -76,19 +76,20 @@ namespace soc::mrr { /* Mariko */ /* Samsung */ { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 6, .minor = 0x10, .density = 1, .densityCount = 2 }, /* AM-MGCJ (6.10, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 7, .minor = 0, .density = 1, .densityCount = 2 }, /* AA-MGCL (7.00, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 8, .minor = 0, .density = 1, .densityCount = 2 }, /* AB-MGCL (8.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 7, .minor = 0, .density = 1, .densityCount = 2 }, /* AA-MGCL (7.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Samsung, .major = 8, .minor = 0, .density = 1, .densityCount = 2 }, /* AB-MGCL (8.00, 4GB) */ /* Micron */ { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 4, .minor = 0x10, .density = 1, .densityCount = 2 }, /* WT:E (4.10, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 5, .minor = 0, .density = 1, .densityCount = 2 }, /* WT:F (5.00, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 7, .minor = 0, .density = 1, .densityCount = 2 }, /* WT:B (7.00, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 7, .minor = 0, .density = 1, .densityCount = 4 }, /* WT:B (7.00, 8GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 5, .minor = 0, .density = 1, .densityCount = 2 }, /* WT:F (5.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 7, .minor = 0, .density = 1, .densityCount = 2 }, /* WT:B (7.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_Micron, .major = 7, .minor = 0, .density = 1, .densityCount = 4 }, /* WT:B (7.00, 8GB) */ /* SK Hynix */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 4, .minor = 0, .density = 1, .densityCount = 2 }, /* NME (4.00, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 6, .minor = 0, .density = 1, .densityCount = 2 }, /* NEE (6.00, 4GB) */ - { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 6, .minor = 0, .density = 1, .densityCount = 4 }, /* NEE (6.00, 8GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 4, .minor = 0, .density = 1, .densityCount = 2 }, /* NME (4.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 6, .minor = 0, .density = 1, .densityCount = 2 }, /* NEE (6.00, 4GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 6, .minor = 0, .density = 1, .densityCount = 4 }, /* NEE (6.00, 8GB) */ + { .soc = HocClkSocType_Mariko, .mfg = MFG_SKHynix, .major = 8, .minor = 0, .density = 1, .densityCount = 2 }, /* x267 (8.00, 4GB) */ }; /* Ported from hekate */ @@ -334,6 +335,11 @@ namespace soc::mrr { if (console == HocClkConsoleType_Hoag) return 3; if (console == HocClkConsoleType_Aula) return 5; return fuseFallback; + case DRAM_X267: + if (console == HocClkConsoleType_Iowa) return 29; + if (console == HocClkConsoleType_Hoag) return 30; + if (console == HocClkConsoleType_Aula) return 31; + return fuseFallback; default: return fuseFallback; } @@ -373,7 +379,7 @@ namespace soc::mrr { RealDramModule mod = DRAM_COUNT; if (!MatchModule(soc, mfg, rev0.chip0.rank0_ch0, rev1.chip0.rank0_ch0, densityMb, topo.ranks * topo.channels, &mod)) - return fuseId; /* TODO: Find hynix x267 config */ + return fuseId; return FuseIdForModule(mod, board::GetConsoleType(), fuseId); } diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp index 4a425df1..98eab47c 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp @@ -42,6 +42,7 @@ namespace soc::mrr { DRAM_NME, DRAM_NEE, DRAM_NEE_8GB, + DRAM_X267, DRAM_COUNT, } RealDramModule; From bd6d6151431b326064c300361d70d20cf7bfe9a6 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 6 Sep 2026 15:37:36 +0200 Subject: [PATCH 124/205] improve timings --- .../loader/source/oc/customize.hpp | 4 +- .../loader/source/oc/mtc_timing_value.hpp | 41 +- .../pcv/common/calculate_timings_common.cpp | 186 +++++++++ .../calculate_timings_common.hpp} | 18 +- .../pcv/erista/calculate_timings_erista.cpp | 285 +++++++------- .../pcv/erista/calculate_timings_erista.hpp | 1 + .../source/oc/pcv/erista/pcv_erista_mtc.cpp | 38 +- .../pcv/mariko/calculate_timings_mariko.cpp | 356 +++++++++--------- .../pcv/mariko/calculate_timings_mariko.hpp | 1 - .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 5 +- .../source/oc/pcv/mariko/timing_tables.cpp | 47 --- .../loader/source/oc/pcv/pcv_common.hpp | 5 - .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 15 +- 13 files changed, 566 insertions(+), 436 deletions(-) create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp rename Source/Atmosphere/stratosphere/loader/source/oc/pcv/{mariko/timing_tables.hpp => common/calculate_timings_common.hpp} (69%) delete mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index c34cfbcb..e5e9051e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -47,14 +47,14 @@ enum ReadLatency: u32 { RL_2133 = 40, RL_1866 = 36, RL_1600 = 32, - RL_1331 = 28, + RL_1333 = 28, }; enum WriteLatency: u32 { WL_2133 = 18, WL_1866 = 16, WL_1600 = 14, - WL_1331 = 12, + WL_1333 = 12, }; using CustomizeCpuDvfsTable = pcv::cvb_entry_t[pcv::DvfsTableEntryLimit]; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 6dcf9ef0..67c1370f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -1,7 +1,7 @@ /* * Copyright (c) 2023 hanai3Bi * - * Copyright (c) 2025 Lightos_ + * Copyright (c) Lightos_ * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -20,7 +20,7 @@ #include "oc_common.hpp" -namespace ams::ldr::hoc { +namespace ams::ldr::hoc::pcv { #define MAX(A, B) std::max(A, B) #define MIN(A, B) std::min(A, B) #define CEIL(A) std::ceil(A) @@ -31,6 +31,7 @@ namespace ams::ldr::hoc { #define PACK_U32_NIBBLE_HIGH_BYTE_LOW(high, low) ((static_cast(high & 0xF) << 28) | (static_cast(low) & 0xFF)) #define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg)) + #define GET_CYCLE_FLOOR(PARAM) u32(FLOOR(double(PARAM) / tCK_avg)) /* Burst latency, not to be confused with base latency (tWRL). */ const u32 BL = 16; @@ -41,6 +42,9 @@ namespace ams::ldr::hoc { /* DQS output access time from CK_t/CK_c. */ const double tDQSCK_max = 3.5; + /* Turn-around time RDQS to WDQS for WDQS control case. */ + const double tDQSTA = 0.25; + /* Write preamble. (tCK) */ const u32 tWPRE = 2; @@ -59,12 +63,22 @@ namespace ams::ldr::hoc { /* DQ-to-DQS offset(max) (ns) */ const double tDQS2DQ_max = 0.8; + /* Internal READ to PRECHARGE command delay */ + const double tRTP = 7.5; + /* Write recovery time. */ const u32 tWR = 18; - const double roundTripDelay = 0.5; /* ns. */ + /* Write-to-Read delay. */ + const u32 tWTRStock = 10; - namespace pcv::erista { + /* Round trace routing delay(?) Guessed based on tK1 (ns) */ + const double roundTripDelay = 0.5; + + inline u32 RL; + inline u32 WL; + + namespace erista { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRAS_values = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 }; @@ -88,9 +102,6 @@ namespace ams::ldr::hoc { const u32 tFAW = static_cast(tRRD * 4.0); const double tRPab = tRPpb + 3; - inline u32 RL; - inline u32 WL; - inline u32 tR2P; inline u32 tR2W; inline u32 rext; @@ -124,13 +135,15 @@ namespace ams::ldr::hoc { inline u8 mrw2; namespace { - double chipDelay = 1.165; /* Guessed. */ + /* Delay of entering soc? Guessed based on tK1. (ns) */ + double chipDelay = 1.655; } + /* Soc->dram->soc delay(?) */ const double flyByTime = chipDelay + roundTripDelay; } - namespace pcv::mariko { + namespace mariko { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRAS_values = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 }; @@ -153,9 +166,6 @@ namespace ams::ldr::hoc { inline u32 refresh_raw; - inline u32 RL; - inline u32 WL; - inline u32 tR2P; inline u32 tR2W; inline u32 tRTM; @@ -188,15 +198,16 @@ namespace ams::ldr::hoc { inline u32 tCLKSTOP; - inline u32 pdex2mrr; + inline double pdex2mrr; inline u8 mrw2; - /* TODO: Add comments (lazy) */ namespace { - const double chipDelay = 1.109; /* ns. */ + /* Delay of entering soc? Guessed based on tK1. (ns) */ + const double chipDelay = 1.109; } + /* Soc->dram->soc delay(?) */ const double flyByTime = chipDelay + roundTripDelay; } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp new file mode 100644 index 00000000..1a366a80 --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp @@ -0,0 +1,186 @@ +/* + * Copyright (c) Lightos_ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "../../oc_common.hpp" +#include "../../mtc_timing_value.hpp" + +namespace ams::ldr::hoc::pcv { + + namespace { + void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) { + latency += index * latencyStep; + } + + void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { + if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ + latency += latencyStep * 2; + } else { /* 2133tRWL */ + latency += latencyStep * 3; + } + } + + static s32 GetMaxLatencyIndex(volatile u32 *latencyArray, u32 latencySize) { + s32 maxIndex = -1; + for (u32 i = 0; i < latencySize; ++i) { + if (latencyArray[i]) { + maxIndex = i; + } + } + + return maxIndex; + } + + void HandleLatency(u32 freq, volatile u32 &latency, volatile u32 *latencyArray, u32 indexMax, u32 latencyStep) { + for (u32 i = 0; i <= indexMax; ++i) { + if (latencyArray[i] != 0 && freq <= latencyArray[i]) { + SwitchLatency(latency, i, latencyStep); + return; + } + } + + SwitchLatency(latency, indexMax, latencyStep); + } + + u32 RoundUpToEven(u32 value) { + return value + (value % 2); + } + + + double GetTckAvg(u32 khz) { + return 1000'000.0 / static_cast(khz); + } + } + + void HandleLatency(u32 freq) { + static s32 rlIndexMax = GetMaxLatencyIndex(C.readLatency, std::size(C.readLatency)); + static s32 wlIndexMax = GetMaxLatencyIndex(C.writeLatency, std::size(C.writeLatency)); + constexpr u32 ReadLatencyStep = 4; + constexpr u32 WriteLatencyStep = 2; + bool autoLatencyRead = false, autoLatencyWrite = false; + + if (rlIndexMax == -1) { + AutoLatency(RL, freq, ReadLatencyStep); + autoLatencyRead = true; + } + + if (wlIndexMax == -1) { + AutoLatency(WL, freq, WriteLatencyStep); + autoLatencyWrite = true; + } + + if (autoLatencyRead && autoLatencyWrite) { + return; + } + + if (!autoLatencyRead) { + HandleLatency(freq, RL, C.readLatency, rlIndexMax, ReadLatencyStep); + } + + if (!autoLatencyWrite) { + HandleLatency(freq, WL, C.writeLatency, wlIndexMax, WriteLatencyStep); + } + } + + u32 GetRlFrequency() { + switch (RL) { + case RL_1333: + return 1333'000; + case RL_1600: + return 1600'000; + case RL_1866: + return 1866'000; + case RL_2133: + return 2133'000; + default: + return 2133'000; + } + } + + u32 GetWlFrequency() { + switch (WL) { + case WL_1333: + return 1333'000; + case WL_1600: + return 1600'000; + case WL_1866: + return 1866'000; + case WL_2133: + return 2133'000; + default: + return 2133'000; + } + } + + u32 GetWdqsOn() { + /* Set A. */ + switch (WL) { + case WL_1333: + return 4; + case WL_1600: + case WL_1866: + return 6; + case WL_2133: + return 8; + default: + return 8; + } + } + + u32 CalculateNWr() { + const u32 latencyFrequency = GetWlFrequency(); + const double tCK = GetTckAvg(latencyFrequency); + const u32 nWr = CEIL(tWR / tCK); + + return RoundUpToEven(nWr); + } + + u32 CalculateNTRTP() { + const u32 latencyFrequency = GetRlFrequency(); + const double tCK = GetTckAvg(latencyFrequency); + + return CEIL(tRTP / tCK); + } + + u8 CalculateMrw2() { + static const u8 rlMapDBI[8] = { + 6, 12, 16, 22, 28, 32, 36, 40 + }; + + static const u8 wlMapSetA[8] = { + 4, 6, 8, 10, 12, 14, 16, 18 + }; + + u32 rlIndex = 0; + u32 wlIndex = 0; + + for (u32 i = 0; i < std::size(rlMapDBI); ++i) { + if (rlMapDBI[i] == RL) { + rlIndex = i; + break; + } + } + + for (u32 i = 0; i < std::size(wlMapSetA); ++i) { + if (wlMapSetA[i] == WL) { + wlIndex = i; + break; + } + } + + /* DBI is always enabled. */ + return static_cast(((rlIndex & 0x7) | ((wlIndex & 0x7) << 3) | ((0 & 0x1) << 6))); + } +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp similarity index 69% rename from Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp rename to Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp index a1aa7f0a..e6d37e18 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp @@ -15,12 +15,20 @@ */ #pragma once -#include -namespace ams::ldr::hoc::pcv::mariko { +namespace ams::ldr::hoc::pcv { - extern const RextPatch g_rext_table[]; - extern const u32 g_rext_table_size; - const RextPatch *FindRext(u32 freq); + struct RextPatch { + u32 freq; + u32 rext; + }; + + void HandleLatency(u32 freq); + u32 GetRlFrequency(); + u32 GetWlFrequency(); + u32 GetWdqsOn(); + u32 CalculateNWr(); + u32 CalculateNTRTP(); + u8 CalculateMrw2(); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 1a40676f..e4521a08 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -15,189 +15,174 @@ */ #include "../../mtc_timing_value.hpp" +#include "../common/calculate_timings_common.hpp" namespace ams::ldr::hoc::pcv::erista { - /* Dumped from bpmp fw mtc table (l4t). */ - const RextPatch g_rext_table[] = { - {1'633'000, 0x17}, {1'728'000, 0x17}, {1'795'200, 0x19}, - {1'862'400, 0x1A}, {1'894'400, 0x1A}, {1'932'800, 0x1A}, - {1'958'400, 0x1A}, {1'996'800, 0x1A}, {2'035'200, 0x1A}, - {2'064'000, 0x19}, {2'099'200, 0x19}, {2'131'200, 0x1A}, - {2'163'200, 0x1A}, {2'188'800, 0x1A}, {2'227'200, 0x1A}, - {2'265'600, 0x1B}, {2'291'200, 0x1B}, {2'329'600, 0x1A}, - {2'361'600, 0x1A}, - }; + namespace { + /* Dumped from bpmp fw mtc table (l4t). */ + const RextPatch gRextTable[] = { + {1'633'000, 0x17}, {1'728'000, 0x17}, {1'795'200, 0x19}, + {1'862'400, 0x1A}, {1'894'400, 0x1A}, {1'932'800, 0x1A}, + {1'958'400, 0x1A}, {1'996'800, 0x1A}, {2'035'200, 0x1A}, + {2'064'000, 0x19}, {2'099'200, 0x19}, {2'131'200, 0x1A}, + {2'163'200, 0x1A}, {2'188'800, 0x1A}, {2'227'200, 0x1A}, + {2'265'600, 0x1B}, {2'291'200, 0x1B}, {2'329'600, 0x1A}, + {2'361'600, 0x1A}, + }; - const RextPatch *LookupRext(u32 freq) { - for (u32 i = 0; i < std::size(g_rext_table); i++) { - if (g_rext_table[i].freq >= freq) { - return &g_rext_table[i]; + const RextPatch *LookupRext(u32 freq) { + for (u32 i = 0; i < std::size(gRextTable); i++) { + if (gRextTable[i].freq >= freq) { + return &gRextTable[i]; + } } - } - return nullptr; - } - - void GetRext(u32 freq) { - if (auto r = LookupRext(freq)) { - rext = r->rext; - return; + return nullptr; } - /* Fallback */ - rext = 0x1A; - } - - void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) { - latency += index * latencyStep; - } - - static s32 GetMaxLatencyIndex(volatile u32 *latencyArray, u32 latencySize) { - s32 maxIndex = -1; - for (u32 i = 0; i < latencySize; ++i) { - if (latencyArray[i]) { - maxIndex = i; - } - } - - return maxIndex; - } - - void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ - latency += latencyStep * 2; - } else { /* 2133tRWL */ - latency += latencyStep * 3; - } - } - - void HandleLatency(u32 freq, volatile u32 &latency, volatile u32 *latencyArray, u32 indexMax, u32 latencyStep) { - for (u32 i = 0; i <= indexMax; ++i) { - if (latencyArray[i] != 0 && freq <= latencyArray[i]) { - SwitchLatency(latency, i, latencyStep); + void GetRext(u32 freq) { + if (auto r = LookupRext(freq)) { + rext = r->rext; return; } + + /* Fallback */ + rext = 0x1A; } - SwitchLatency(latency, indexMax, latencyStep); - } + void CalculateReadTimings(u32 freq, double tCK_avg) { + tR2P = CalculateNTRTP(); - void HandleLatency(u32 freq) { - static s32 rlIndexMax = GetMaxLatencyIndex(C.readLatency, std::size(C.readLatency)); - static s32 wlIndexMax = GetMaxLatencyIndex(C.writeLatency, std::size(C.writeLatency)); - constexpr u32 ReadLatencyStep = 4; - constexpr u32 WriteLatencyStep = 2; - bool autoLatencyRead = false, autoLatencyWrite = false; + double fullRoundDelay = flyByTime + tDQSCK_max; - if (rlIndexMax == -1) { - AutoLatency(RL, freq, ReadLatencyStep); - autoLatencyRead = true; + /* Read to write turnaround. */ + /* Nvidia seem to use a 0.25 constant here for tK1, I am 99% certain this is tDQSTA. */ + /* This still left a mismatch; after some brute forcing I got GET_CYCLE_FLOOR(1.5) - 8 (using a static latency) as the cleanest result. */ + /* The latency definitely is not WL, but when testing for every latency, it lines up perfectly with wqsOn and wl seems to cancel out? */ + tR2W = RL + (BL / 2) + CEIL((fullRoundDelay / tCK_avg) + tDQSTA) - GET_CYCLE_FLOOR(1.5) - GetWdqsOn() + tWPRE - (C.t6_tRTW * 3) + finetRTW; + + /* Read data valid: Read command -> data ready to be latched into the registers. */ + rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 18; + + /* Read command -> data poppable at the pad macros, 16 cycles ahead of rdv. */ + qpop = rdv - 16; + + constexpr double TrimmerStepPs = 3.0; + constexpr double MaxTrimmerSteps = 95.0; + + double tCkAvgPs = tCK_avg * 1000.0; + double tckDerated = tCkAvgPs * 0.85; + u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); + double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; + + /* readEyeEndDerated, nv call this quseExtra. */ + u32 quseExtra = GET_CYCLE_CEIL(fullRoundDelay - deratedNsDelay); + + /* The amount of deration from the perspective of a full round trip. */ + u32 readEyeEndDerateMargin = GET_CYCLE_CEIL(fullRoundDelay) - quseExtra; + + u32 tQuse = FLOOR((flyByTime + 0.94) / tCK_avg); + u32 readEyeStart = tQuse + RL + 1; + + u32 einputMinimal = readEyeStart + readEyeEndDerateMargin - 2; + + /* Data valid window, quse aligns with the start of the read eye (probably). */ + /* DQS needs to be logically and'ed with quse in order to be valid. */ + /* einputMinimal satisfies this. */ + quse = einputMinimal; + + /* Difference between the two eye edges. */ + quse_width = quseExtra - tQuse + 4; + + /* input receiver takes time to enable. */ + u32 einputLatency = GET_CYCLE_CEIL(10.0); + + /* Enable input receiver. */ + einput = einputMinimal - einputLatency; + + /* Duration of input receiver being enabled? */ + einput_duration = einputLatency + quse_width + 4; + + /* qrst_duration is CEIL(a / tCK_avg + b) */ + /* a and b were derived through a brute forcer. */ + u32 qrst_duration = CEIL(1.4 / tCK_avg + 3.5); + u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); + + /* quse reset? */ + qrst = PACK_U32(qrst_duration, qrstLow); + + /* Qsafe, safe to reset quse? */ + qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); + + /* Input buffer delay? */ + ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); + + GetRext(freq); } - if (wlIndexMax == -1) { - AutoLatency(WL, freq, WriteLatencyStep); - autoLatencyWrite = true; + void CalculateWriteTimings(double tCK_avg) { + /* Write to read turnaround. */ + /* According to jedec specifications: nWR >= tWTR + nRTP */ + /* Therefore tWTR >= nWR - tRTP. */ + const u32 nTWTR = GET_CYCLE_CEIL(tWTRStock); + const u32 nWr = CalculateNWr(); + u32 autoPrecharcetWTRMin = nWr - tR2P; + + /* tWTR reduction is applied in a weird way to not break existing setups. */ + tW2R = WL + 1 + MAX(autoPrecharcetWTRMin, nTWTR) - GET_CYCLE_CEIL(tWTR) + finetWTR; + tW2P = (CEIL(WL * 1.7303) * 2) - 5; + tWTPDEN = CEIL(((1.8 / tCK_avg) + MAX(RL + (2.7 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + + wdv = WL; + wsv = WL - 2; + wev = WL - 4; + + /* Output buffer delay? */ + u32 obdlyHigh = 3 / FLOOR(MIN(static_cast(2), tCK_avg * (WL - 7))); + u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); + obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); } - if (autoLatencyRead && autoLatencyWrite) { - return; - } + void CalculatePowerDownTimings(double tCK_avg) { + pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); + tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; - if (!autoLatencyRead) { - HandleLatency(freq, RL, C.readLatency, rlIndexMax, ReadLatencyStep); - } - - if (!autoLatencyWrite) { - HandleLatency(freq, WL, C.writeLatency, wlIndexMax, WriteLatencyStep); + const double tMMRI = tRCD + (tCK_avg * 3); + pdex2mrr = tMMRI + 10; } } - void CalculateMrw2() { - static const u8 rlMapDBI[8] = { - 6, 12, 16, 22, 28, 32, 36, 40 + u8 GetNWrIndex() { + static const u8 nWrMap[8] = { + 6, 10, 16, 20, 24, 30, 34, 40 }; - static const u8 wlMapSetA[8] = { - 4, 6, 8, 10, 12, 14, 16, 18 - }; + const u32 nWr = CalculateNWr(); - u32 rlIndex = 0; - u32 wlIndex = 0; - - for (u32 i = 0; i < std::size(rlMapDBI); ++i) { - if (rlMapDBI[i] == 32) { - rlIndex = i; - break; + for (u8 i = 0; i < std::size(nWrMap); ++i) { + if (nWrMap[i] >= nWr) { + return i; } } - for (u32 i = 0; i < std::size(wlMapSetA); ++i) { - if (wlMapSetA[i] == WL) { - wlIndex = i; - break; - } - } - - /* DBI is always enabled. */ - mrw2 = static_cast(((rlIndex & 0x7) | ((wlIndex & 0x7) << 3) | ((0 & 0x1) << 6))); + return static_cast(std::size(nWrMap) - 1); } void CalculateTimings(double tCK_avg, u32 freq) { - RL = RL_1331; - WL = WL_1331; + RL = RL_1333; + WL = WL_1333; + /* I don't understand why, I don't want to know why, but for some fucking reason erista doesn't handle RL 40. */ + /* This should not be required but for these fuck damn reasons any type of dram oc will crash instantly with RL 40. */ + /* But it works fine in l4t? Even when copying the tables it still doesn't work??? WTF */ + readLatency[std::size(readLatency) - 1] = 0; HandleLatency(freq); - GetRext(freq); - CalculateMrw2(); + RL = std::min(static_cast(RL_1866), RL); - tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; - - u32 fullRoundDelay = CEIL((flyByTime + tDQSCK_max) / tCK_avg); - rdv = RL + fullRoundDelay + 19; - qpop = rdv - 16; - - constexpr double TrimmerStepPs = 3.0; - constexpr double MaxTrimmerSteps = 96.0; - - double tCkAvgPs = tCK_avg * 1000.0; - double tckDerated = tCkAvgPs * 0.85; - u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); - double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; - u32 fullTripDerating = fullRoundDelay - CEIL((flyByTime + tDQSCK_max - deratedNsDelay) / tCK_avg); - u32 readEyeStart = FLOOR((flyByTime + 0.94) / tCK_avg) + RL; - - /* Data valid window, quse aligns with the start of the read eye (probably). */ - /* DQS needs to be logically and'ed with quse in order to be valid. */ - quse = readEyeStart + fullTripDerating - 2; - - quse_width = CEIL(((4.897 / tCK_avg) - FLOOR(2.538 / tCK_avg)) + 3.782); - einput_duration = FLOOR(9.936 / tCK_avg) + 5.0 + quse_width; - einput = quse - CEIL(9.928 / tCK_avg); - u32 qrst_duration = FLOOR(8.399 - tCK_avg); - u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); - qrst = PACK_U32(qrst_duration, qrstLow); - ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); - qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); - - tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - const s32 wlToRl = static_cast(WL) - static_cast(RL); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * wlToRl), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; - - wdv = WL; - wsv = WL - 2; - wev = 0xA + (WL - 14); - - u32 obdlyHigh = 3 / FLOOR(MIN(static_cast(2), tCK_avg * (WL - 7))); - u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); - obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - - pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); - tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; - - const double tMMRI = tRCD + (tCK_avg * 3); - pdex2mrr = tMMRI + 10; + CalculateReadTimings(freq, tCK_avg); + CalculateWriteTimings(tCK_avg); + CalculatePowerDownTimings(tCK_avg); + mrw2 = CalculateMrw2(); } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.hpp index 7a61386d..668f44fc 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.hpp @@ -18,6 +18,7 @@ namespace ams::ldr::hoc::pcv::erista { + u8 GetNWrIndex(); void CalculateTimings(double tCK_avg, u32 freq); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp index f2c7808b..12dd90a3 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_mtc.cpp @@ -46,6 +46,7 @@ namespace ams::ldr::hoc::pcv::erista { #define WRITE_PARAM_ALL_REG(TABLE, PARAM, VALUE) \ TABLE->burst_regs.PARAM = VALUE; \ TABLE->shadow_regs_ca_train.PARAM = VALUE; \ + TABLE->shadow_regs_quse_train.PARAM = VALUE; \ TABLE->shadow_regs_rdwr_train.PARAM = VALUE; /* Ram power down */ @@ -109,28 +110,28 @@ namespace ams::ldr::hoc::pcv::erista { /* Accept imperfection or prepare for suffering. */ // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) - // WRITE_PARAM_ALL_REG(table, emc_einput, einput); - // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); - // WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); + WRITE_PARAM_ALL_REG(table, emc_einput, einput); + WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); + WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); WRITE_PARAM_ALL_REG(table, emc_ibdly, ibdly); WRITE_PARAM_ALL_REG(table, emc_wdv_mask, wdv); - // WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); - // WRITE_PARAM_ALL_REG(table, emc_quse, quse); + WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); + WRITE_PARAM_ALL_REG(table, emc_quse, quse); WRITE_PARAM_ALL_REG(table, emc_wdv, wdv); WRITE_PARAM_ALL_REG(table, emc_wsv, wsv); WRITE_PARAM_ALL_REG(table, emc_wev, wev); - // WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); - // WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); - // WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); - // WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); - // WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); - // WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); - // WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); - // WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); - // WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); - // WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); - // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); - // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); + WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); + WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); + WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); + WRITE_PARAM_ALL_REG(table, emc_tr_qsafe, qsafe); + WRITE_PARAM_ALL_REG(table, emc_tr_qpop, qpop); + WRITE_PARAM_ALL_REG(table, emc_qpop, qpop); + WRITE_PARAM_ALL_REG(table, emc_rdv, rdv); + WRITE_PARAM_ALL_REG(table, emc_tr_rdv_mask, rdv + 2); + WRITE_PARAM_ALL_REG(table, emc_rdv_early, rdv - 2); + WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); + WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); + WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); table->dram_timings.rl = RL; // #endif @@ -223,8 +224,7 @@ namespace ams::ldr::hoc::pcv::erista { const u32 tRFCabStock = tRFC_values[0] * 2; table->dram_timings.t_rfc = tRFCabStock; - table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); - table->emc_mrw = (table->emc_mrw & ~0x70u) | 0x40; /* nWR */ + table->emc_mrw = (table->emc_mrw & ~0x70u) | (GetNWrIndex() << 4); table->emc_cfg_2 = 0x11083D; table->min_volt = std::clamp(900 + (C.emcDvbShift * 25), 900, 1050); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index ac58276b..a939a2d4 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -14,227 +14,209 @@ * along with this program. If not, see . */ -#include #include "../../mtc_timing_value.hpp" -#include "timing_tables.hpp" +#include "../common/calculate_timings_common.hpp" namespace ams::ldr::hoc::pcv::mariko { - void GetRext(u32 freq) { - if (auto r = FindRext(freq)) { - rext = r->rext; - return; - } + namespace { + const RextPatch gRextTable[] = { + {1'633'000, 0x17}, {1'666'000, 0x18}, {1'700'000, 0x18}, + {1'733'000, 0x18}, {1'766'000, 0x18}, {1'800'000, 0x1A}, + {1'833'000, 0x1A}, {1'866'000, 0x1A}, {1'900'000, 0x19}, + {1'933'000, 0x19}, {1'966'000, 0x19}, {2'100'000, 0x1A}, + {2'133'000, 0x1A}, {2'166'000, 0x19}, {2'200'000, 0x19}, + {2'233'000, 0x19}, {2'266'000, 0x1A}, {2'300'000, 0x1B}, + {2'333'000, 0x1B}, {2'366'000, 0x1B}, {2'400'000, 0x1B}, + {2'433'000, 0x1B}, {2'466'000, 0x1B}, {2'500'000, 0x1A}, + {2'533'000, 0x1C}, {2'566'000, 0x1B}, {2'600'000, 0x1B}, + {2'633'000, 0x1B}, {2'666'000, 0x1B}, {2'700'000, 0x1C}, + {2'733'000, 0x1C}, {2'766'000, 0x1D}, {2'800'000, 0x1D}, + {2'833'000, 0x1D}, {2'866'000, 0x1D}, {2'900'000, 0x1D}, + {2'933'000, 0x1C}, {2'966'000, 0x1D}, {3'000'000, 0x1D}, + {3'033'000, 0x1D}, {3'066'000, 0x1D}, {3'100'000, 0x1D}, + {3'133'000, 0x1D}, {3'166'000, 0x1C}, {3'200'000, 0x1C}, + {3'233'000, 0x1E}, {3'266'000, 0x1F}, {3'300'000, 0x1E}, + {3'333'000, 0x1F}, {3'366'000, 0x1F}, {3'400'000, 0x1F}, + {3'433'000, 0x1F}, {3'466'000, 0x1F}, {3'500'000, 0x1E}, + {3'533'000, 0x1E}, {3'566'000, 0x1E}, {3'600'000, 0x1E}, + {3'633'000, 0x1E}, {3'666'000, 0x1E}, {3'700'000, 0x1F}, + }; - /* Fallback */ - rext = 0x1E; - } - - void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) { - latency += index * latencyStep; - } - - static s32 GetMaxLatencyIndex(volatile u32 *latencyArray, u32 latencySize) { - s32 maxIndex = -1; - for (u32 i = 0; i < latencySize; ++i) { - if (latencyArray[i]) { - maxIndex = i; + const RextPatch *LookupRext(u32 freq) { + for (u32 i = 0; i < std::size(gRextTable); i++) { + if (gRextTable[i].freq >= freq) { + return &gRextTable[i]; + } } + return nullptr; } - return maxIndex; - } - - void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ - latency += latencyStep * 2; - } else { /* 2133tRWL */ - latency += latencyStep * 3; - } - } - - void HandleLatency(u32 freq, volatile u32 &latency, volatile u32 *latencyArray, u32 indexMax, u32 latencyStep) { - for (u32 i = 0; i <= indexMax; ++i) { - if (latencyArray[i] != 0 && freq <= latencyArray[i]) { - SwitchLatency(latency, i, latencyStep); + void GetRext(u32 freq) { + if (auto r = LookupRext(freq)) { + rext = r->rext; return; } + + /* Fallback */ + rext = 0x1E; } - SwitchLatency(latency, indexMax, latencyStep); - } + void CalculateActivatePrechargeTimings(bool lowFreq) { + tRCD = tRCD_values[lowFreq ? C.low_t1_tRCD : C.t1_tRCD]; + tRPpb = tRP_values[lowFreq ? C.low_t2_tRP : C.t2_tRP]; + tRAS = tRAS_values[lowFreq ? C.low_t3_tRAS : C.t3_tRAS]; - void HandleLatency(u32 freq) { - static s32 rlIndexMax = GetMaxLatencyIndex(C.readLatency, std::size(C.readLatency)); - static s32 wlIndexMax = GetMaxLatencyIndex(C.writeLatency, std::size(C.writeLatency)); - constexpr u32 ReadLatencyStep = 4; - constexpr u32 WriteLatencyStep = 2; - bool autoLatencyRead = false, autoLatencyWrite = false; - - if (rlIndexMax == -1) { - AutoLatency(RL, freq, ReadLatencyStep); - autoLatencyRead = true; + tRC = tRAS + tRPpb; + tRPab = tRPpb + 3; } - if (wlIndexMax == -1) { - AutoLatency(WL, freq, WriteLatencyStep); - autoLatencyWrite = true; + void CalculateActivateWindowTimings(bool lowFreq) { + tRRD = tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD]; + tFAW = static_cast(tRRD * 4.0); } - if (autoLatencyRead && autoLatencyWrite) { - return; + void CalculateReadTimings(u32 freq, double tCK_avg, bool lowFreq) { + u32 tRTW = lowFreq ? C.low_t6_tRTW : C.t6_tRTW; + s32 finetRTW = C.fineTune_t6_tRTW; + + double fullRoundDelay = flyByTime + tDQSCK_max; + + /* Read to precharge delay. */ + tR2P = CalculateNTRTP(); + + /* Read to write turnaround. */ + /* Nvidia seem to use a 0.25 constant here for tK1, I am 99% certain this is tDQSTA. */ + /* This still left a mismatch; after some brute forcing I got GET_CYCLE_FLOOR(1.5) - 8 (using a static latency) as the cleanest result. */ + /* The latency definitely is not WL, but when testing for every latency, it lines up perfectly with wqsOn and wl seems to cancel out? */ + tR2W = RL + (BL / 2) + CEIL((fullRoundDelay / tCK_avg) + tDQSTA) - GET_CYCLE_FLOOR(1.5) - GetWdqsOn() - (tRTW * 3) + finetRTW; + tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + GET_CYCLE_FLOOR(7.489); + tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); + + /* Read data valid: Read command -> data ready to be latched into the registers. */ + rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 16; + + /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ + qpop = rdv - 14; + + constexpr double TrimmerStepPs = 3.0; + constexpr double MaxTrimmerSteps = 96.0; + + double tCkAvgPs = tCK_avg * 1000.0; + double tckDerated = tCkAvgPs * 0.85; + u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); + double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; + /* readEyeEndDerated, nv call this quseExtra. */ + u32 quseExtra = GET_CYCLE_CEIL(fullRoundDelay - deratedNsDelay); + + /* The amount of deration from the perspective of a full round trip. */ + u32 readEyeEndDerateMargin = GET_CYCLE_CEIL(fullRoundDelay) - quseExtra; + + u32 tQuse = FLOOR((flyByTime + 0.94) / tCK_avg); + u32 readEyeStart = tQuse + RL + 1; + + u32 einputMinimal = readEyeStart + readEyeEndDerateMargin - 2; + + /* Data valid window, quse aligns with the start of the read eye (probably). */ + /* DQS needs to be logically and'ed with quse in order to be valid. */ + /* einputMinimal satisfies this. */ + quse = einputMinimal; + + /* input receiver takes time to enable. */ + u32 einputLatency = GET_CYCLE_CEIL(10.0); + + /* Enable input receiver. */ + einput = einputMinimal - einputLatency; + + /* Difference between the two eye edges. */ + quse_width = quseExtra - tQuse + 4; + + /* Duration of input receiver being enabled? */ + einput_duration = einputLatency + quse_width + 4; + + /* qrst_duration is CEIL(a / tCK_avg + b) */ + /* a and b were derived through a brute forcer. */ + u32 qrst_duration = CEIL(1.4 / tCK_avg + 3.5); + u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); + + /* quse reset? */ + qrst = PACK_U32(qrst_duration, qrstLow); + + /* Input buffer delay? */ + ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); + + /* Qsafe, safe to reset quse? */ + qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); + + GetRext(freq); } - if (!autoLatencyRead) { - HandleLatency(freq, RL, C.readLatency, rlIndexMax, ReadLatencyStep); + void CalculateWriteTimings(double tCK_avg, bool lowFreq) { + u32 tWTR = 10 - tWTR_values[lowFreq ? C.low_t7_tWTR : C.t7_tWTR]; + s32 finetWTR = C.fineTune_t7_tWTR; + + /* Write to read turnaround. */ + /* According to jedec specifications: nWR >= tWTR + nRTP */ + /* Therefore tWTR >= nWR - tRTP. */ + const u32 nTWTR = GET_CYCLE_CEIL(tWTRStock); + const u32 nWr = CalculateNWr(); + u32 autoPrecharcetWTRMin = nWr - tR2P; + + /* tWTR reduction is applied in a weird way to not break existing setups. */ + tW2R = WL + 1 + MAX(autoPrecharcetWTRMin, nTWTR) - GET_CYCLE_CEIL(tWTR) + finetWTR; + tW2P = (CEIL(WL * 1.7303) * 2) - 5; + tWTM = CEIL(WL + ((7.570 / tCK_avg) + 8.753)); + tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; + + wdv = WL; + wsv = WL - 2; + wev = WL - 4; + + /* Output buffer delay? */ + u32 obdlyHigh = 3 / FLOOR(MIN(static_cast(2), tCK_avg * (WL - 7))); + u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); + obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); } - if (!autoLatencyWrite) { - HandleLatency(freq, WL, C.writeLatency, wlIndexMax, WriteLatencyStep); - } - } + void CalculateRefreshTimings(double tCK_avg, bool lowFreq) { + tRFCpb = tRFC_values[lowFreq ? C.low_t5_tRFC : C.t5_tRFC]; + tRFCab = tRFCpb * 2; + tXSR = static_cast(tRFCab + 7.5); - void CalculateMrw2() { - static const u8 rlMapDBI[8] = { - 6, 12, 16, 22, 28, 32, 36, 40 - }; - - static const u8 wlMapSetA[8] = { - 4, 6, 8, 10, 12, 14, 16, 18 - }; - - u32 rlIndex = 0; - u32 wlIndex = 0; - - for (u32 i = 0; i < std::size(rlMapDBI); ++i) { - if (rlMapDBI[i] == RL) { - rlIndex = i; - break; + u32 tREFI = lowFreq ? C.low_t8_tREFI : C.t8_tREFI; + refresh_raw = 0xFFFF; + if (tREFI != 6) { + refresh_raw = GET_CYCLE_CEIL(tREFpb_values[tREFI]) - 0x40; + refresh_raw = MIN(refresh_raw, static_cast(0xFFFF)); } } - for (u32 i = 0; i < std::size(wlMapSetA); ++i) { - if (wlMapSetA[i] == WL) { - wlIndex = i; - break; - } - } + void CalculatePowerDownTimings(double tCK_avg) { + tWTPDEN = CEIL(((1.8 / tCK_avg) + MAX(RL + (2.7 / tCK_avg), static_cast(tW2P))) + (BL / 2)); + pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); - /* DBI is always enabled. */ - mrw2 = static_cast(((rlIndex & 0x7) | ((wlIndex & 0x7) << 3) | ((0 & 0x1) << 6))); + tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; + + double tMMRI = tRCD + (tCK_avg * 3); + pdex2mrr = tMMRI + 10; + } } void CalculateTimings(double tCK_avg, u32 freq) { - RL = RL_1331; - WL = WL_1331; + RL = RL_1333; + WL = WL_1333; HandleLatency(freq); - GetRext(freq); - const bool lowFreq = freq < C.timingEmcTbreak; - tRCD = tRCD_values[lowFreq ? C.low_t1_tRCD : C.t1_tRCD]; - tRPpb = tRP_values[lowFreq ? C.low_t2_tRP : C.t2_tRP]; - tRAS = tRAS_values[lowFreq ? C.low_t3_tRAS : C.t3_tRAS]; - tRRD = tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD]; - tRFCpb = tRFC_values[lowFreq ? C.low_t5_tRFC : C.t5_tRFC]; - - u32 tRTW = lowFreq ? C.low_t6_tRTW : C.t6_tRTW; - u32 tWTR = 10 - tWTR_values[lowFreq ? C.low_t7_tWTR : C.t7_tWTR]; - - s32 finetRTW = C.fineTune_t6_tRTW; - s32 finetWTR = C.fineTune_t7_tWTR; - - u32 tREFI = lowFreq ? C.low_t8_tREFI : C.t8_tREFI; - refresh_raw = 0xFFFF; - if (tREFI != 6) { - refresh_raw = GET_CYCLE_CEIL(tREFpb_values[tREFI]) - 0x40; - refresh_raw = MIN(refresh_raw, static_cast(0xFFFF)); - } - - tRC = tRAS + tRPpb; - tRFCab = tRFCpb * 2; - tXSR = static_cast(tRFCab + 7.5); - tFAW = static_cast(tRRD * 4.0); - tRPab = tRPpb + 3; - - tR2P = CEIL((RL * 0.426) - 2.0); - tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (tRTW * 3) + finetRTW; - tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + FLOOR(7.489 / tCK_avg); - tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); - - double fullRoundDelay = flyByTime + tDQSCK_max; - /* Read data valid: Read command -> data ready to be latched into the registers. */ - rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 16; - - /* Read command -> data poppable at the pad macros, 14 cycles ahead of rdv. */ - qpop = rdv - 14; - - constexpr double TrimmerStepPs = 3.0; - constexpr double MaxTrimmerSteps = 96.0; - - double tCkAvgPs = tCK_avg * 1000.0; - double tckDerated = tCkAvgPs * 0.85; - u32 derateStepCount = MIN(FLOOR(tckDerated / TrimmerStepPs), MaxTrimmerSteps); - double deratedNsDelay = (derateStepCount * TrimmerStepPs) / 1000.0; - /* readEyeEndDerated, nv call this quseExtra. */ - u32 quseExtra = GET_CYCLE_CEIL(fullRoundDelay - deratedNsDelay); - - /* The amount of deration from the perspective of a full round trip. */ - u32 readEyeEndDerateMargin = GET_CYCLE_CEIL(fullRoundDelay) - quseExtra; - - u32 tQuse = FLOOR((flyByTime + 0.94) / tCK_avg); - u32 readEyeStart = tQuse + RL + 1; - - u32 einputMinimal = readEyeStart + readEyeEndDerateMargin - 2; - /* Data valid window, quse aligns with the start of the read eye (probably). */ - /* DQS needs to be logically and'ed with quse in order to be valid. */ - /* einputMinimal satisfies this. */ - quse = einputMinimal; - - /* input receiver takes time to enable. */ - u32 einputLatency = GET_CYCLE_CEIL(10.0); - - /* Enable input receiver. */ - einput = einputMinimal - einputLatency; - - /* Difference between the two eye edges. */ - quse_width = quseExtra - tQuse + 4; - - /* Duration of input receiver being enabled? */ - einput_duration = einputLatency + quse_width + 4; - - /* qrst_duration is CEIL(a / tCK_avg + b) */ - /* a and b were derived through a brute forcer. */ - u32 qrst_duration = CEIL(1.4 / tCK_avg + 3.5); - u32 qrstLow = MAX(static_cast(einput - qrst_duration - 2), static_cast(0)); - qrst = PACK_U32(qrst_duration, qrstLow); - ibdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(1, quse - qrst_duration - 2.0); - qsafe = (einput_duration + 3) + MAX(MIN(qrstLow * rdv, qrst_duration + qrst_duration), einput); - tW2P = (CEIL(WL * 1.7303) * 2) - 5; - tWTPDEN = CEIL(((1.8 / tCK_avg) + MAX(RL + (2.7 / tCK_avg), static_cast(tW2P))) + (BL / 2)); - const s32 wlToRl = static_cast(WL) - static_cast(RL); - tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * wlToRl), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; - tWTM = CEIL(WL + ((7.570 / tCK_avg) + 8.753)); - tWATM = (tWTM + (FLOOR(WL / 0.816) * 2.0)) - 4.0; - - wdv = WL; - wsv = WL - 2; - wev = 0xA + (WL - 14); - - u32 obdlyHigh = 3 / FLOOR(MIN(static_cast(2), tCK_avg * (WL - 7))); - u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); - obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); - - pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); - - tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; - - u32 tMMRI = tRCD + (tCK_avg * 3); - pdex2mrr = tMMRI + 10; - - CalculateMrw2(); + CalculateActivatePrechargeTimings(lowFreq); + CalculateActivateWindowTimings(lowFreq); + CalculateReadTimings(freq, tCK_avg, lowFreq); + CalculateWriteTimings(tCK_avg, lowFreq); + CalculateRefreshTimings(tCK_avg, lowFreq); + CalculatePowerDownTimings(tCK_avg); + mrw2 = CalculateMrw2(); } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.hpp index 8659d3f2..c908a220 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.hpp @@ -21,4 +21,3 @@ namespace ams::ldr::hoc::pcv::mariko { void CalculateTimings(double tCK_avg, u32 freq); } - diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index d7187425..3f41ecf4 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -57,13 +57,12 @@ namespace ams::ldr::hoc::pcv::mariko { WRITE_PARAM_ALL_REG(table, emc_cfg, 0xF3200000); } + CalculateTimings(tCK_avg, table->rate_khz); + u32 trefbw = refresh_raw + 0x40; trefbw = MIN(trefbw, static_cast(0x3FFF)); - const u32 dyn_self_ref_control = (static_cast(7605.0 / tCK_avg) + 260) | (table->burst_regs.emc_dyn_self_ref_control & 0xffff0000); - CalculateTimings(tCK_avg, table->rate_khz); - WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD)); WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD)); WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast(0xB9))); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp deleted file mode 100644 index dea73cfc..00000000 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/timing_tables.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) Lightos_ - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "../../oc_common.hpp" -#include "timing_tables.hpp" - -namespace ams::ldr::hoc::pcv::mariko { - - const RextPatch g_rext_table[] = { - {2'133'000, 0x1A}, {2'166'000, 0x19}, {2'200'000, 0x19}, - {2'233'000, 0x19}, {2'266'000, 0x1A}, {2'300'000, 0x1B}, - {2'333'000, 0x1B}, {2'366'000, 0x1B}, {2'400'000, 0x1B}, - {2'433'000, 0x1B}, {2'466'000, 0x1B}, {2'500'000, 0x1A}, - {2'533'000, 0x1C}, {2'566'000, 0x1B}, {2'600'000, 0x1B}, - {2'633'000, 0x1B}, {2'666'000, 0x1B}, {2'700'000, 0x1C}, - {2'733'000, 0x1C}, {2'766'000, 0x1D}, {2'800'000, 0x1D}, - {2'833'000, 0x1D}, {2'866'000, 0x1D}, {2'900'000, 0x1D}, - {2'933'000, 0x1C}, {2'966'000, 0x1D}, {3'000'000, 0x1D}, - {3'033'000, 0x1D}, {3'066'000, 0x1D}, {3'100'000, 0x1D}, - {3'133'000, 0x1D}, {3'166'000, 0x1C}, {3'200'000, 0x1C}, - }; - - const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]); - - const RextPatch *FindRext(u32 freq) { - for (u32 i = 0; i < g_rext_table_size; i++) { - if (g_rext_table[i].freq >= freq) { - return &g_rext_table[i]; - } - } - return nullptr; - } - -} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index 49a60aa3..bdda0361 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -187,11 +187,6 @@ namespace ams::ldr::hoc::pcv { }; static_assert(sizeof(SharedClkBus) == 0x58); - struct RextPatch { - u32 freq; - u32 rext; - }; - constexpr u32 CpuClkOSLimit = 1785'000; constexpr u32 GpuClkOsLimit = 921'600; constexpr u32 EmcClkOSLimit = 1600'000; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index a5be9c83..91188eee 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1308,7 +1308,10 @@ class RamSubmenuGui : public MiscGui { NamedValue("3300 MHz", 3300000, "±1760 speedo"), NamedValue("3333 MHz", 3333000, "±1780 speedo"), NamedValue("3366 MHz", 3366000, "±1800 speedo"), - NamedValue("3400 MHz", 3400000, "±1820 speedo") + NamedValue("3400 MHz", 3400000, "±1820 speedo"), + NamedValue("3433 MHz", 3433000, "±???? speedo"), + NamedValue("3466 MHz", 3466000, "±???? speedo"), + NamedValue("3500 MHz", 3500000, "±???? speedo"), }; } @@ -1532,6 +1535,9 @@ class RamTimingsSubmenuGui : public MiscGui { NamedValue("3333 MHz", 3333000, "±1780 speedo"), NamedValue("3366 MHz", 3366000, "±1800 speedo"), NamedValue("3400 MHz", 3400000, "±1820 speedo"), + NamedValue("3433 MHz", 3433000, "±???? speedo"), + NamedValue("3466 MHz", 3466000, "±???? speedo"), + NamedValue("3500 MHz", 3500000, "±???? speedo"), }; RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; @@ -2294,8 +2300,10 @@ class RamLatenciesSubmenuGui : public MiscGui { this->listElement->addItem(graph); } + const int readTierCount = IsMariko() ? 4 : 3; + this->listElement->addItem(new CompactCategoryHeader("Read Latency")); - for (int i = 0; i < 4; i++) + for (int i = 0; i < readTierCount; i++) addLatencyRow(kTierLabels[i], i, kLatencyRKeys); this->listElement->addItem(new CompactCategoryHeader("Write Latency")); @@ -2436,6 +2444,9 @@ class CpuSubmenuGui : public MiscGui { NamedValue("3333 MHz", 3333000, "±1780 speedo"), NamedValue("3366 MHz", 3366000, "±1800 speedo"), NamedValue("3400 MHz", 3400000, "±1820 speedo"), + NamedValue("3433 MHz", 3433000, "±???? speedo"), + NamedValue("3466 MHz", 3466000, "±???? speedo"), + NamedValue("3500 MHz", 3500000, "±???? speedo"), }; addConfigToggle(HocClkConfigValue_AutoRAMCPUOverclock, "Auto CPU RAM OC"); addConfigButton(HocClkConfigValue_AutoRamCpuCpuOCFreq, "Auto CPU RAM OC CPU clock", ValueRange(0, 0, 1, "", 1), "CPU Clock", From 5c215fcd02e646f724ac60e21b7cfea3b5f9b288 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 6 Sep 2026 12:50:11 -0400 Subject: [PATCH 125/205] DRAM MR4 tsensor reading --- Source/hoc-clk/common/include/hocclk/board.h | 3 ++ .../common/include/hocclk/clock_manager.h | 2 +- .../hoc-clk/overlay/src/ui/gui/about_gui.cpp | 9 +++++ .../sysmodule/src/board/board_sensor.cpp | 39 ++++++++++++++++++- Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp | 15 +++++++ Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp | 6 +-- 6 files changed, 67 insertions(+), 7 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 389ba513..0b424f9d 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -95,6 +95,7 @@ typedef enum HocClkThermalSensor_PLLX, // PLLX temperature in millicelcius HocClkThermalSensor_AO, // AOTAG HocClkThermalSensor_BQ24193, // BQ24193 temperature. Refer to BQ24193Temp for returned values + HocClkThermalSensor_DRAM, // DRAM die temperature from LPDDR4(X) MR4. Use in combination with PCB and AO to get accurate reading HocClkThermalSensor_EnumMax } HocClkThermalSensor; @@ -292,6 +293,8 @@ static inline const char* hocclkFormatThermalSensor(HocClkThermalSensor thermSen return pretty ? "AO" : "ao"; case HocClkThermalSensor_BQ24193: return pretty ? "BQ24193" : "bq24193"; + case HocClkThermalSensor_DRAM: + return pretty ? "DRAM" : "dram"; default: return "unknown"; } diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 794e0c1e..bbe70207 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -89,7 +89,7 @@ typedef struct { HocClkBpmpSharedInfo bpmpInfo; // Reserved for future use - u8 reserved[0x30C]; + u8 reserved[0x308]; } HocClkContext; typedef struct diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index a0dd851a..a72db69a 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -41,6 +41,7 @@ tsl::elm::ListItem* ramBWItemGpu = NULL; tsl::elm::ListItem* ramBWItemMax = NULL; tsl::elm::ListItem* bqtempitem = NULL; tsl::elm::ListItem* aotagTempItem = NULL; +tsl::elm::ListItem* dramTempItem = NULL; tsl::elm::ListItem* cTypeItem = NULL; tsl::elm::ListItem* creditsItem = NULL; tsl::elm::ListItem* bpmpStatusItem = NULL; @@ -96,6 +97,10 @@ void AboutGui::listUI() new tsl::elm::ListItem("BQ24193 Temp:"); this->listElement->addItem(bqtempitem); + dramTempItem = + new tsl::elm::ListItem("DRAM Temp:"); + this->listElement->addItem(dramTempItem); + this->listElement->addItem( new tsl::elm::CategoryHeader("RAM Bandwidth") ); @@ -275,6 +280,10 @@ void AboutGui::refresh() bqtempitem->setValue(strings[10]); + millis = context->temps[HocClkThermalSensor_DRAM]; + sprintf(strings[12], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); + dramTempItem->setValue(strings[12]); + cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); bpmpStatusItem->setValue(this->context->bpmpInfo.magic == HOCCLK_BPMP_MAGIC ? "Enabled" : "Halted"); } diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index 1a274050..23add9ab 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -36,6 +36,7 @@ #include "../file/config.hpp" #include "../hos/apm_ext.h" #include "../i2c/i2cDrv.h" +#include "../soc/dram_mrr.hpp" #include "../tsensor/aotag.hpp" #include "../tsensor/bq24193.hpp" #include "../tsensor/soctherm.hpp" @@ -46,6 +47,32 @@ namespace board { + namespace { + /* Only poll every 10 ticks to avoid stalling EMC too much */ + constexpr u32 DramMr4PollDivisor = 20; // 1 - 20 seconds depending on polling interval + u32 gDramMr4Tick = DramMr4PollDivisor; + s32 gDramMr4Millis = 30000; /* 4x refresh default */ + + s32 PollDramMr4TempMilli() { + u8 mr4 = 0; + if (!soc::mrr::ReadRamMr4(&mr4)) + return 0; /* stock exosphere */ + + /* TODO: verify this table manually*/ + switch (mr4 & 0x7) + { + case 0x0: return 0; /* below operating range */ + case 0x1: return 30000; /* 4x refresh */ + case 0x2: return 50000; /* 2x refresh */ + case 0x3: return 85000; /* 1x refresh */ + case 0x4: return 95000; /* 0.5x refresh */ + case 0x5: return 100000; /* 0.25x refresh */ + case 0x6: return 105000; /* 0.25x refresh, de-rated */ + default: return 110000; /* above operating range */ + } + } + } + s32 GetTemperatureMilli(HocClkThermalSensor sensor) { s32 millis = 0; BatteryChargeInfo info; @@ -90,9 +117,9 @@ namespace board { case HocClkThermalSensor_MEM: { if (board::GetSocType() == HocClkSocType_Mariko && tsensor::IsInitialized() && tsensor::ReadAotag() > 0) { if(board::GetConsoleType() == HocClkConsoleType_Aula) { // Aula has a misplaced thermal sensor that makes tBoard report too high - millis = tsensor::ReadAotag(); + millis = (tsensor::ReadAotag() * 0.40f) + (gDramMr4Millis * 0.60f); } else { // On other consoles it's placed correctly so avoid relying on AOTAG - millis = (tsensor::ReadAotag() * 0.40f) + (tmp451TempPcb() * 0.6f); + millis = (tsensor::ReadAotag() * 0.20f) + (tmp451TempPcb() * 0.40f) + (gDramMr4Millis * 0.40f); } } else { millis = board::GetSocType() == HocClkSocType_Mariko ? temps.pllx : temps.mem; @@ -111,6 +138,14 @@ namespace board { millis = tsensor::ReadAotag(); break; } + case HocClkThermalSensor_DRAM: { + if (++gDramMr4Tick >= DramMr4PollDivisor) { + gDramMr4Tick = 0; + gDramMr4Millis = PollDramMr4TempMilli(); + } + millis = gDramMr4Millis; + break; + } default: { ASSERT_ENUM_VALID(HocClkThermalSensor, sensor); } diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp index 5c8b396a..0bea9f15 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp @@ -251,6 +251,21 @@ namespace soc::mrr { return data; } + bool ReadRamMr4(u8 *mr4) { + EmcTopology topo = {}; + if (!QueryTopology(&topo)) + return false; + + ClearMrrLeftovers(); + + emc_mr_data_t data = {}; + if (!ReadMrxRank(MR4_TEMP, topo.ranks > 1, topo.channels > 1, &data)) + return false; + + *mr4 = data.chip0.rank0_ch0; + return true; + } + /* MR8 density field (bits 5:2) to MB */ static bool DecodeDensityMb(u8 mr8, u32 *mb) { switch ((mr8 & 0x3C) >> 2) diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp index 98eab47c..c37f540a 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp @@ -99,9 +99,7 @@ namespace soc::mrr { emc_mr_data_t sdram_read_mrx(emc_mr_t mrx); bool IsMrrAvailable(); - /* Fuse-style DRAM ID (hekate numbering, as in board::GetDramID): - derived from MRR when the patched exosphere grants EMC access, - otherwise falls back to the fuse ODM4 ID. MRR-detected 8GB WT:B/NEE - (no dedicated fuse numbering) alias to Aula AA-MGCL 8GB (28). */ + bool ReadRamMr4(u8 *mr4); + u8 IdentifyDramId(); } \ No newline at end of file From 080daeee5a4145087ee81f4ac35c78b13692378a Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 6 Sep 2026 12:55:53 -0400 Subject: [PATCH 126/205] Update board_sensor.cpp --- Source/hoc-clk/sysmodule/src/board/board_sensor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index 23add9ab..ba1a7ae8 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -59,6 +59,7 @@ namespace board { return 0; /* stock exosphere */ /* TODO: verify this table manually*/ + /* Higher tREFI multiplier = slower refresh and vice versa */ switch (mr4 & 0x7) { case 0x0: return 0; /* below operating range */ From 01d85ca9ff0c3ef1ce212b7faeb4d462b0529715 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 6 Sep 2026 13:27:03 -0400 Subject: [PATCH 127/205] cleanup mfg identification as i dont need to support nonstandard ones --- Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp index 0bea9f15..74c20a5f 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp @@ -375,17 +375,7 @@ namespace soc::mrr { if (!ReadMrxSet(&vendor, &rev0, &rev1, &density, &topo)) return fuseId; - DramMfg mfg; - switch (vendor.chip0.rank0_ch0) - { - case MFG_Samsung: - case MFG_SKHynix: - case MFG_Micron: - mfg = static_cast(vendor.chip0.rank0_ch0); - break; - default: - return fuseId; - } + DramMfg mfg = static_cast(vendor.chip0.rank0_ch0); u32 densityMb = 0; if (!DecodeDensityMb(density.chip0.rank0_ch0, &densityMb)) From 9c892ee365c5c96bd1788a5a9fd889b03b3d0471 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 6 Sep 2026 15:20:55 -0400 Subject: [PATCH 128/205] governor configuration options + gm20b driver fixes --- Source/hoc-clk/common/include/hocclk/config.h | 24 +++++++++++++ .../src/ui/gui/config_info_strings.cpp | 20 +++++++++++ .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 9 ++++- .../sysmodule/src/board/board_freq.cpp | 11 ++++-- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 35 ++++++++++++++----- 5 files changed, 87 insertions(+), 12 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index e1d411dc..a7ea4285 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -62,6 +62,9 @@ typedef enum { HocClkConfigValue_RAMVoltDisplayMode, HocClkConfigValue_CpuGovernorMinimumFreq, + HocClkConfigValue_GovernorPollRateMs, + HocClkConfigValue_GovernorDownHoldTicks, + HocClkConfigValue_GovernorStepUtil, HocClkConfigValue_DisplayVoltage, HocClkConfigValue_MemoryFrequencyMeasurementMode, @@ -305,6 +308,12 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr return pretty ? "RAM Voltage / Usage Display Mode" : "ram_volt_usage_display_mode"; case HocClkConfigValue_CpuGovernorMinimumFreq: return pretty ? "CPU Governor Minimum Frequency" : "cpu_gov_min_freq"; + case HocClkConfigValue_GovernorPollRateMs: + return pretty ? "Governor Poll Rate" : "gov_poll_rate_ms"; + case HocClkConfigValue_GovernorDownHoldTicks: + return pretty ? "Governor Down Hold" : "gov_down_hold_ticks"; + case HocClkConfigValue_GovernorStepUtil: + return pretty ? "Governor Step Divisor" : "gov_step_util"; case HocClkConfigValue_DisplayVoltage: return pretty ? "Display Voltage" : "display_voltage"; @@ -603,6 +612,12 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) return 70ULL; case HocClkConfigValue_CpuGovernorMinimumFreq: return 612000000ULL; // 612MHz + case HocClkConfigValue_GovernorPollRateMs: + return 5ULL; // 5ms + case HocClkConfigValue_GovernorDownHoldTicks: + return 10ULL; // 10 ticks (50ms at 5ms poll) + case HocClkConfigValue_GovernorStepUtil: + return 900ULL; // max freq at 90% load case HocClkConfigValue_MaxDisplayClockH: return 60ULL; case HocClkConfigValue_DisplayVoltage: @@ -795,6 +810,15 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_BatteryChargeCurrent: return ((input >= 1024) && (input <= 3072)) || !input; + case HocClkConfigValue_GovernorPollRateMs: + return ((input >= 1) && (input <= 50)); + + case HocClkConfigValue_GovernorDownHoldTicks: + return (input <= 100); + + case HocClkConfigValue_GovernorStepUtil: + return ((input >= 100) && (input <= 1500)); + case HocClkConfigValue_InputCurrentLimit: return ((input >= 100) && (input <= 3000)) || !input; diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index e6fbcc31..51abe481 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -107,6 +107,26 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 612MHz" }; + case HocClkConfigValue_GovernorPollRateMs: + return { + "How often the CPU/GPU governor runs its loop.", + "Default: 5ms" + }; + + case HocClkConfigValue_GovernorDownHoldTicks: + return { + "How many governor ticks to hold the current frequency", + "before ramping down. 0 disables holding", + "Default: 10 ticks" + }; + + case HocClkConfigValue_GovernorStepUtil: + return { + "Load divisor mapping utilization to frequency.", + "Lower ramps up faster, above 1000 caps the top end", + "Default: 900" + }; + case HocClkConfigValue_OverwriteRefreshRate: return { "Controls the availability of display refresh rate features.", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 91188eee..fcbebdaa 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1007,6 +1007,13 @@ class GovernorSettingsSubMenuGui : public MiscGui { addConfigButton(HocClkConfigValue_CpuGovernorMinimumFreq, "CPU Governor Minimum Frequency", ValueRange(0, 0, 1, "", 0), "CPU Governor Minimum Frequency", &thresholdsDisabled, {}, GovernorMinHz, false); + + addConfigButton(HocClkConfigValue_GovernorPollRateMs, "Governor Poll Rate", ValueRange(1, 50, 1, " ms", 1), + "Governor Poll Rate", &thresholdsDisabled, {}, {}, false); + addConfigButton(HocClkConfigValue_GovernorDownHoldTicks, "Governor Down Hold", ValueRange(0, 100, 1, " ticks", 1), + "Governor Down Hold", &thresholdsDisabled, {}, {}, false); + addConfigButton(HocClkConfigValue_GovernorStepUtil, "Governor Step Divisor", ValueRange(100, 1500, 25, "", 1), + "Governor Step Divisor", &thresholdsDisabled, {}, {}, false); } }; @@ -1471,7 +1478,7 @@ class RamTimingsSubmenuGui : public MiscGui { addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, IsErista() ? 7u : 6u , 1)); addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 7436e60c..458419cc 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -134,8 +134,9 @@ namespace board { HandleCpuUv(); } if (useGm20b) { - gm20b::setClock(hz / 1000); - currentInjectedHz = hz; + if (gm20b::setClock(hz / 1000)) { + currentInjectedHz = hz; + } } } @@ -153,7 +154,11 @@ namespace board { } if (module == HocClkModule_GPU && currentInjectedHz != 0) { - return currentInjectedHz; + if (GetRealHz(HocClkModule_GPU) != currentInjectedHz) { + currentInjectedHz = 0; + } else { + return currentInjectedHz; + } } if (HOSSVC_HAS_CLKRST) { diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 670f2636..c8a73399 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -21,9 +21,27 @@ namespace governor { -#define POLL_NS 5'000'000 // 5 ms – governor poll rate -#define DOWN_HOLD_TICKS 10 // 50 ms – how long to in POLL_NS to hold while ramping down -#define STEP_UTIL 900 // multiplier for step calculations +#define DOWN_HOLD_TICKS_DEFAULT 10 // 50 ms at 5ms poll – how long to hold while ramping down +#define STEP_UTIL_DEFAULT 900 // multiplier for step calculations (max freq at 90% load) + + u64 GovernorPollNs() { + u64 ms = config::GetConfigValue(HocClkConfigValue_GovernorPollRateMs); + if (ms < 1 || ms > 50) + ms = 5; + return ms * 1'000'000ULL; + } + + u32 GovernorDownHoldTicks() { + u64 ticks = config::GetConfigValue(HocClkConfigValue_GovernorDownHoldTicks); + return (ticks <= 100) ? (u32)ticks : DOWN_HOLD_TICKS_DEFAULT; + } + + u32 GovernorStepUtil() { + u64 step = config::GetConfigValue(HocClkConfigValue_GovernorStepUtil); + if (step < 100 || step > 1500) + step = STEP_UTIL_DEFAULT; + return (u32)step; + } bool isGpuGovernorEnabled = false; bool isCpuGovernorEnabled = false; @@ -82,7 +100,7 @@ namespace governor { } u32 SchedutilTargetHz(u32 util, u32 tableMaxHz) { - u64 hz = (u64)tableMaxHz * util / STEP_UTIL; + u64 hz = (u64)tableMaxHz * util / GovernorStepUtil(); return (u32)(std::min(hz, static_cast(tableMaxHz))); } @@ -115,13 +133,14 @@ namespace governor { u8 vrrFocusTick = 0; for (;;) { + const u64 pollNs = GovernorPollNs(); if (!clockManager::gRunning) { cpuDownHoldRemaining = 0; cpuLastHz = 0; gpuDownHoldRemaining = 0; gpuLastHz = 0; - svcSleepThread(POLL_NS); + svcSleepThread(pollNs); continue; } @@ -156,7 +175,7 @@ namespace governor { if (!goingDown) cpuDownHoldRemaining = 0; else if (cpuDownHoldRemaining == 0) - cpuDownHoldRemaining = DOWN_HOLD_TICKS; + cpuDownHoldRemaining = GovernorDownHoldTicks(); if (cpuDownHoldRemaining > 0) cpuDownHoldRemaining--; @@ -212,7 +231,7 @@ namespace governor { if (!goingDown) gpuDownHoldRemaining = 0; else if (gpuDownHoldRemaining == 0) - gpuDownHoldRemaining = DOWN_HOLD_TICKS; + gpuDownHoldRemaining = GovernorDownHoldTicks(); if (gpuDownHoldRemaining > 0) gpuDownHoldRemaining--; @@ -290,7 +309,7 @@ namespace governor { } } - svcSleepThread(POLL_NS); + svcSleepThread(pollNs); } } From b770f88b9b904b8a0147094ba1949f3d61d9436b Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 7 Sep 2026 15:40:18 -0400 Subject: [PATCH 129/205] fix lightos Z --- .../loader/source/oc/pcv/erista/calculate_timings_erista.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index e4521a08..63454858 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -175,7 +175,7 @@ namespace ams::ldr::hoc::pcv::erista { /* I don't understand why, I don't want to know why, but for some fucking reason erista doesn't handle RL 40. */ /* This should not be required but for these fuck damn reasons any type of dram oc will crash instantly with RL 40. */ /* But it works fine in l4t? Even when copying the tables it still doesn't work??? WTF */ - readLatency[std::size(readLatency) - 1] = 0; + C.readLatency[std::size(C.readLatency) - 1] = 0; HandleLatency(freq); RL = std::min(static_cast(RL_1866), RL); From 1741e27116ae660848260e3c4a28be5a0a03219a Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 10 Sep 2026 13:24:25 +0200 Subject: [PATCH 130/205] remove bss crap --- .../stratosphere/loader/source/ldr_process_creation.cpp | 6 ------ .../loader/source/oc/pcv/mariko/pcv_mariko.cpp | 7 +++---- .../Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp | 4 ---- .../stratosphere/loader/source/oc/pcv/pcv_common.hpp | 3 --- 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp index 9c7bc4f1..a4d90b00 100644 --- a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp @@ -820,12 +820,6 @@ namespace ams::ldr { } Result CreateProcessAndLoadAutoLoadModules(ProcessInfo *out, const Meta *meta, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit) { - /* Append extra .bss for 64LUT */ - /* TODO: REMOVE THIS. */ - if (g_is_pcv && ctx.main_nso_idx >= 0) { - g_nso_headers[ctx.main_nso_idx].bss_size += static_cast(hoc::pcv::HocPcvScratchSize); - } - /* Get CreateProcessParameter. */ svc::CreateProcessParameter param; R_TRY(GetCreateProcessParameter(std::addressof(param), meta, flags, resource_limit)); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index a7dcd47a..b41f2061 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -45,6 +45,7 @@ namespace ams::ldr::hoc::pcv::mariko { size_t g_nso_size = 0; } + /* Todo: Remove this bs. */ [[maybe_unused]] static uintptr_t CaveReserve(size_t count) { return reinterpret_cast(Hooks().Reserve(count)); } @@ -620,10 +621,8 @@ namespace ams::ldr::hoc::pcv::mariko { } void Patch(uintptr_t mapped_nso, size_t nso_size) { - nsoStart = reinterpret_cast(mapped_nso); - - g_pcv_scratch = mapped_nso + nso_size - HocPcvScratchSize; - g_nso_size = nso_size; + nsoStart = reinterpret_cast(mapped_nso); + g_nso_size = nso_size; MtcGenerateFreqTables(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp index 9807c4a6..1b45a170 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp @@ -212,10 +212,6 @@ namespace ams::ldr::hoc::pcv { Result MemFreqPllmLimit(u32 *ptr); Result MemVoltHandler(u32 *ptr); // Used for Erista MEM Vdd2 + EMC Vddq or Mariko MEM Vdd2 - /* Extra pcv .bss */ - constexpr size_t HocPcvScratchSize = 0x2000; - constexpr size_t HocBusFreqBufOffset = 0x1000; /* start of the SOC bus region */ - void SafetyCheck(); void Patch(uintptr_t mapped_nso, size_t nso_size, uintptr_t cave, size_t cave_size, uintptr_t nso_address, uintptr_t data_arena); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index bdda0361..156da655 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -204,9 +204,6 @@ namespace ams::ldr::hoc::pcv { // The pcv SoC-voltage DVB table is a fixed 32-entry region. (it doesn't need to be larger) constexpr size_t DvbTableCapacity = 32; - // extra .bss location, 0 until Patch() runs. - inline uintptr_t g_pcv_scratch = 0; - inline uintptr_t g_pcv_cave = 0; inline size_t g_pcv_cave_size = 0; From 8fc18ee3e820f1e3fab64d7dcdb76fb8dc2ca6cb Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 11 Sep 2026 13:11:04 +0200 Subject: [PATCH 131/205] fix namespace overusage --- Source/hoc-clk/sysmodule/src/board/board.cpp | 8 +- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 +- .../sysmodule/src/board/board_freq.cpp | 10 +- .../sysmodule/src/board/board_sensor.cpp | 4 +- .../sysmodule/src/board/board_volt.cpp | 10 +- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 30 +-- Source/hoc-clk/sysmodule/src/display/aula.cpp | 6 +- Source/hoc-clk/sysmodule/src/display/aula.hpp | 2 +- Source/hoc-clk/sysmodule/src/file/config.cpp | 96 +++---- Source/hoc-clk/sysmodule/src/file/config.hpp | 4 +- Source/hoc-clk/sysmodule/src/file/errors.cpp | 6 +- Source/hoc-clk/sysmodule/src/file/errors.hpp | 4 +- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 4 +- .../hoc-clk/sysmodule/src/file/file_utils.hpp | 4 +- Source/hoc-clk/sysmodule/src/file/kip.cpp | 240 +++++++++--------- Source/hoc-clk/sysmodule/src/file/kip.hpp | 4 +- .../sysmodule/src/hos/integrations.cpp | 8 +- .../sysmodule/src/hos/integrations.hpp | 4 +- Source/hoc-clk/sysmodule/src/hos/lang.cpp | 4 +- Source/hoc-clk/sysmodule/src/hos/lang.hpp | 4 +- .../sysmodule/src/hos/notification.cpp | 8 +- .../hoc-clk/sysmodule/src/hos/notification.h | 4 +- .../sysmodule/src/hos/process_management.cpp | 10 +- .../sysmodule/src/hos/process_management.hpp | 10 +- .../hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 36 +-- Source/hoc-clk/sysmodule/src/main.cpp | 32 +-- .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 2 +- .../sysmodule/src/mgr/clock_manager.cpp | 166 ++++++------ .../sysmodule/src/mgr/clock_manager.hpp | 4 +- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 98 +++---- Source/hoc-clk/sysmodule/src/mgr/governor.hpp | 8 +- Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp | 2 +- Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp | 2 +- Source/hoc-clk/sysmodule/src/soc/gm20b.cpp | 6 +- Source/hoc-clk/sysmodule/src/soc/gm20b.hpp | 4 +- .../hoc-clk/sysmodule/src/tsensor/aotag.cpp | 2 +- .../hoc-clk/sysmodule/src/tsensor/bq24193.cpp | 6 +- .../hoc-clk/sysmodule/src/tsensor/bq24193.hpp | 6 +- .../sysmodule/src/tsensor/soctherm.cpp | 2 +- Source/hoc-clk/sysmodule/src/util/crc32.cpp | 8 +- Source/hoc-clk/sysmodule/src/util/crc32.h | 8 +- 41 files changed, 438 insertions(+), 440 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 503c282b..2030a615 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -192,7 +192,7 @@ namespace board { Result bpmpfwRc = bpmp::StartBpmfwExecution(); if (R_FAILED(bpmpfwRc)) { - fileUtils::LogLine("[bpmp] StartBpmfwExecution failed: 0x%x", bpmpfwRc); + file::utils::LogLine("[bpmp] StartBpmfwExecution failed: 0x%x", bpmpfwRc); } bpmp::StartSleepMonitorThread(); @@ -255,7 +255,7 @@ namespace board { } #define MMIO32(addr) (*reinterpret_cast(addr)) - NX_NORETURN void panic(u32 c) { + NX_NORETURN void Panic(u32 c) { SmcReadWriteRegister(0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */, ~0, c); /* Write timer magic */ @@ -287,7 +287,7 @@ namespace board { } u8 GetDramID() { - return soc::mrr::IdentifyDramId(); + return soc::IdentifyDramId(); } u8 GetFuseDramId() { @@ -301,7 +301,7 @@ namespace board { svcCallSecureMonitor(&args); if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed - notification::writeNotification("Horizon OC\nSecmon read failed!\n This may be a hardware issue!"); + hos::WriteNotification("Horizon OC\nSecmon read failed!\n This may be a hardware issue!"); return false; } diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 9f9cf356..178ba09e 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -62,6 +62,6 @@ namespace board { bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); - NX_NORETURN void panic(u32 c); + NX_NORETURN void Panic(u32 c); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 458419cc..c700eb72 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -82,10 +82,10 @@ namespace board { void HandleCpuUv() { if (board::GetSocType() == HocClkSocType_Erista) - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz + board::SetDfllTunings(file::config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), - board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(file::config::GetConfigValue(KipConfigValue_marikoCpuUVLow), file::config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(file::config::GetConfigValue(KipConfigValue_tableConf))); } void SetHz(HocClkModule module, u32 hz) { @@ -130,11 +130,11 @@ namespace board { PcvSetHz(GetPcvModule(module), pcvHz); } } - if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) { + if (file::config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) { HandleCpuUv(); } if (useGm20b) { - if (gm20b::setClock(hz / 1000)) { + if (soc::SetClock(hz / 1000)) { currentInjectedHz = hz; } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index ba1a7ae8..4c383e7f 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -55,7 +55,7 @@ namespace board { s32 PollDramMr4TempMilli() { u8 mr4 = 0; - if (!soc::mrr::ReadRamMr4(&mr4)) + if (!soc::ReadRamMr4(&mr4)) return 0; /* stock exosphere */ /* TODO: verify this table manually*/ @@ -132,7 +132,7 @@ namespace board { break; } case HocClkThermalSensor_BQ24193: { - millis = bq24193::getBQTemp(); + millis = tsensor::GetBqTemp(); break; } case HocClkThermalSensor_AO: { diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index af43b344..21d0e3e1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -283,7 +283,7 @@ namespace board { bool ValidateHandle(Handle handle) { if (handle == INVALID_HANDLE) { - fileUtils::LogLine("Invalid handle!"); + file::utils::LogLine("Invalid handle!"); return false; } @@ -319,7 +319,7 @@ namespace board { if (R_FAILED(resultProcessMemory) || !address) { svcCloseHandle(handle); - fileUtils::LogLine("[dvfs] Failed to get process data. %u", R_DESCRIPTION(resultProcessMemory)); + file::utils::LogLine("[dvfs] Failed to get process data. %u", R_DESCRIPTION(resultProcessMemory)); handle = INVALID_HANDLE; return; } @@ -359,11 +359,11 @@ namespace board { // Print info AFTER we exit the handle to avoid hangs for (int i = 0; i < (int)std::size(cpuVoltTable); ++i) { - fileUtils::LogLine("[dvfs] cpu volt %d: %u mV", i, cpuVoltTable[i]); + file::utils::LogLine("[dvfs] cpu volt %d: %u mV", i, cpuVoltTable[i]); } for (int i = 0; i < (int)std::size(voltData.voltTableStock); ++i) { - fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTableStock[0][i]); + file::utils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTableStock[0][i]); } return; } @@ -412,7 +412,7 @@ namespace board { ASSERT_RESULT_OK(WriteGpuVoltTable(table), "WriteGpuVoltTable"); voltData.ramVmin = vmin; - fileUtils::LogLine("[dvfs] voltage set to %u mV", vmin); + file::utils::LogLine("[dvfs] voltage set to %u mV", vmin); } u32 GetGpuFreqIndex(u32 hz) { diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index ee5e8d6e..d28d3351 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -128,7 +128,7 @@ namespace bpmp { const u32 cmd = HocClkBpmpCmd_RequestShutdown; Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, cmd), &cmd, sizeof(cmd)); if (R_FAILED(rc)) { - fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: SmcCopyToIram failed: 0x%x", rc); + file::utils::LogLine("[bpmp] RequestBpmpExitAndWait: SmcCopyToIram failed: 0x%x", rc); return; } @@ -145,8 +145,8 @@ namespace bpmp { } } - fileUtils::LogLine("[bpmp] RequestBpmpExitAndWait: BPMP timeout (cannot sleep)"); - board::panic(board::CpuPanic); + file::utils::LogLine("[bpmp] RequestBpmpExitAndWait: BPMP timeout (cannot sleep)"); + board::Panic(board::CpuPanic); } void EnableBpmpSmmu() { @@ -200,7 +200,7 @@ namespace bpmp { void SendBpmpCommand(HocClkBpmpCmd cmd, u32 arg1 = 0, u32 arg2 = 0, u32 arg3 = 0, u32 arg4 = 0) { if (!WaitForBpmpReady()) { - fileUtils::LogLine("[bpmp] SendBpmpCommand: BPMP never signaled ready (cmd=%u)", static_cast(cmd)); + file::utils::LogLine("[bpmp] SendBpmpCommand: BPMP never signaled ready (cmd=%u)", static_cast(cmd)); return; } @@ -216,7 +216,7 @@ namespace bpmp { const Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, cmd), &req, sizeof(req)); if (R_FAILED(rc)) { - fileUtils::LogLine("[bpmp] SendBpmpCommand: SmcCopyToIram failed: 0x%x (cmd=%u)", rc, static_cast(cmd)); + file::utils::LogLine("[bpmp] SendBpmpCommand: SmcCopyToIram failed: 0x%x (cmd=%u)", rc, static_cast(cmd)); } } @@ -261,7 +261,7 @@ namespace bpmp { Result wrc = StartBpmfwExecution(); if (R_FAILED(wrc)) { - fileUtils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); + file::utils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); } s_isAwake = true; @@ -279,19 +279,19 @@ namespace bpmp { Result StartBpmfwExecution() { if (!IsPatchedExosphere()) { - fileUtils::LogLine("[bpmp] Cannot start without patched exosphere"); + file::utils::LogLine("[bpmp] Cannot start without patched exosphere"); return (Result)1; } const size_t fw_size = bpmpfw_bin_size; if (fw_size == 0 || fw_size > FwStagingSize) { - fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw of %zu bytes is invalid (should not happen)!", fw_size); + file::utils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw of %zu bytes is invalid (should not happen)!", fw_size); return (Result)1; } std::memcpy(s_fwStageBuf, bpmpfw_bin, fw_size); - fileUtils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx", + file::utils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx", fw_size, static_cast(FwIramPhysBase)); /* Disable the SMMU so DRAM can be accessed */ @@ -329,7 +329,7 @@ namespace bpmp { Result copy_rc = SmcCopyToIram(FwIramPhysBase + ofs, s_fwStageBuf + ofs, static_cast(chunk)); if (R_FAILED(copy_rc)) { - fileUtils::LogLine("[bpmp] SmcCopyToIram failed at +0x%zx: 0x%x", ofs, copy_rc); + file::utils::LogLine("[bpmp] SmcCopyToIram failed at +0x%zx: 0x%x", ofs, copy_rc); return copy_rc; } } @@ -340,26 +340,26 @@ namespace bpmp { /* Clear the halt written by bootloader. */ SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0xFFFFFFFF, FlowModeNone); - SendBpmpCommand(HocClkBpmpCmd_SetUartEnabled, fileUtils::IsUartEnabled() ? 1u : 0u); + SendBpmpCommand(HocClkBpmpCmd_SetUartEnabled, file::utils::IsUartEnabled() ? 1u : 0u); return 0; } void StartSleepMonitorThread() { if (!IsPatchedExosphere()) { - fileUtils::LogLine("[bpmp] Cant start BPMP without exosphere patch"); + file::utils::LogLine("[bpmp] Cant start BPMP without exosphere patch"); return; } Result rc = pscmInitialize(); if (R_FAILED(rc)) { - fileUtils::LogLine("[bpmp] pscmInitialize failed: 0x%x", rc); + file::utils::LogLine("[bpmp] pscmInitialize failed: 0x%x", rc); return; } rc = pscmGetPmModule(&s_pscModule, PscModuleId, pscDependencies, sizeof(pscDependencies) / sizeof(u32), true); if (R_FAILED(rc)) { - fileUtils::LogLine("[bpmp] pscmGetPmModule failed: 0x%x", rc); + file::utils::LogLine("[bpmp] pscmGetPmModule failed: 0x%x", rc); pscmExit(); return; } @@ -367,7 +367,7 @@ namespace bpmp { rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); if (R_FAILED(rc)) { - fileUtils::LogLine("[bpmp] failed to create psc thread: 0x%x", rc); + file::utils::LogLine("[bpmp] failed to create psc thread: 0x%x", rc); return; } threadStart(&s_pscThread); diff --git a/Source/hoc-clk/sysmodule/src/display/aula.cpp b/Source/hoc-clk/sysmodule/src/display/aula.cpp index 7a6297da..bb8e4eca 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.cpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.cpp @@ -22,11 +22,9 @@ // I *think* HOS changes this in some ways, so look into it more -namespace AulaDisplay { +namespace display { #define MMIO_REG32(base, off) *(vu32 *)((base) + (off)) #define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u) -#define DSI_WR_DATA 0xA -#define DSI_TRIGGER 0x13 void _display_dsi_send_cmd(u8 cmd, u32 param, u32 wait) { DSI(DSI_WR_DATA) = (param << 8) | cmd; @@ -43,4 +41,4 @@ namespace AulaDisplay { _display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0); } -} // namespace AulaDisplay \ No newline at end of file +} // namespace display \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/display/aula.hpp b/Source/hoc-clk/sysmodule/src/display/aula.hpp index 14537fd7..e42b2626 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.hpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.hpp @@ -18,6 +18,6 @@ #pragma once #include "../board/board.hpp" -namespace AulaDisplay { +namespace display { void SetDisplayColorMode(AulaColorMode mode); } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index d46089b4..92eb9053 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -49,7 +49,7 @@ #include #include -namespace config { +namespace file::config { uint64_t configValues[HocClkConfigValue_EnumMax]; @@ -122,14 +122,14 @@ namespace config { std::uint64_t input = strtoul(value, NULL, 0); if (!hocclkValidConfigValue((HocClkConfigValue)kval, input)) { input = hocclkDefaultConfigValue((HocClkConfigValue)kval); - fileUtils::LogLine("[cfg] Invalid value for key '%s': using default %llu", key, input); + file::utils::LogLine("[cfg] Invalid value for key '%s': using default %llu", key, input); } configValues[kval] = input; return 1; } } - fileUtils::LogLine("[cfg] Skipping key '%s' in settings: Unrecognized config value", key); + file::utils::LogLine("[cfg] Skipping key '%s' in settings: Unrecognized config value", key); return 1; } @@ -147,14 +147,14 @@ namespace config { std::uint64_t input = strtoul(value, NULL, 0); if (!hocclkValidConfigValue((HocClkConfigValue)kval, input)) { input = hocclkDefaultConfigValue((HocClkConfigValue)kval); - fileUtils::LogLine("[cfg] Invalid value for key '%s': using default %llu", key, input); + file::utils::LogLine("[cfg] Invalid value for key '%s': using default %llu", key, input); } configValues[kval] = input; return 1; } } - fileUtils::LogLine("[cfg] Skipping key '%s' in kip: Unrecognized config value", key); + file::utils::LogLine("[cfg] Skipping key '%s' in kip: Unrecognized config value", key); return 1; } @@ -216,26 +216,26 @@ namespace config { } void LoadSettings() { - fileUtils::LogLine("[cfg] Reading %s", gSettingsPath.c_str()); + file::utils::LogLine("[cfg] Reading %s", gSettingsPath.c_str()); gSettingsMtime = CheckFileMtime(gSettingsPath.c_str()); if (!gSettingsMtime) { - fileUtils::LogLine("[cfg] Settings file not found, using defaults"); + file::utils::LogLine("[cfg] Settings file not found, using defaults"); return; } if (!ini_browse(&BrowseSettingsIni, nullptr, gSettingsPath.c_str())) { - fileUtils::LogLine("[cfg] Error loading settings file"); + file::utils::LogLine("[cfg] Error loading settings file"); } } void LoadKip() { - fileUtils::LogLine("[cfg] Reading %s", gKipPath.c_str()); + file::utils::LogLine("[cfg] Reading %s", gKipPath.c_str()); gKipMtime = CheckFileMtime(gKipPath.c_str()); if (!gKipMtime) { - fileUtils::LogLine("[cfg] KIP config file not found, using defaults"); + file::utils::LogLine("[cfg] KIP config file not found, using defaults"); return; } if (!ini_browse(&BrowseKipIni, nullptr, gKipPath.c_str())) { - fileUtils::LogLine("[cfg] Error loading KIP config file"); + file::utils::LogLine("[cfg] Error loading KIP config file"); } } @@ -298,7 +298,7 @@ namespace config { struct stat st; if (stat(path, &st) == 0) { - fileUtils::LogLine("[cfg] Loading profile %s", path); + file::utils::LogLine("[cfg] Loading profile %s", path); ini_browse(&BrowseProfileIni, (void *)(uintptr_t)tid, path); gProfileMtimes[tid] = st.st_mtime; } else { @@ -341,7 +341,7 @@ namespace config { return 1; } } - fileUtils::LogLine("[cfg] Skipping unrecognized key '%s'", key); + file::utils::LogLine("[cfg] Skipping unrecognized key '%s'", key); } else { std::uint64_t tid = strtoul(section, NULL, 16); if (tid && strlen(section) == 16) { @@ -357,28 +357,28 @@ namespace config { return; } - fileUtils::LogLine("[cfg] Migrating legacy config.ini"); - fileUtils::LogLine("[cfg] Legacy path: %s", gLegacyPath.c_str()); - fileUtils::LogLine("[cfg] Settings path: %s", gSettingsPath.c_str()); - fileUtils::LogLine("[cfg] Profiles dir: %s", gProfilesDir.c_str()); + file::utils::LogLine("[cfg] Migrating legacy config.ini"); + file::utils::LogLine("[cfg] Legacy path: %s", gLegacyPath.c_str()); + file::utils::LogLine("[cfg] Settings path: %s", gSettingsPath.c_str()); + file::utils::LogLine("[cfg] Profiles dir: %s", gProfilesDir.c_str()); MigrationData data; - fileUtils::LogLine("[cfg] Parsing legacy config.ini..."); + file::utils::LogLine("[cfg] Parsing legacy config.ini..."); ini_browse(&MigrationBrowseFunc, &data, gLegacyPath.c_str()); - fileUtils::LogLine("[cfg] Found %zu settings keys, %zu KIP keys, %zu profile entries", + file::utils::LogLine("[cfg] Found %zu settings keys, %zu KIP keys, %zu profile entries", data.settingsKeys.size(), data.kipKeys.size(), data.profileEntries.size()); if (!data.settingsKeys.empty()) { - fileUtils::LogLine("[cfg] Creating kip directory: %s", FILE_KIP_DIR); + file::utils::LogLine("[cfg] Creating kip directory: %s", FILE_KIP_DIR); mkdir(FILE_KIP_DIR, 0777); - fileUtils::LogLine("[cfg] Writing %zu settings to %s", data.settingsKeys.size(), gSettingsPath.c_str()); + file::utils::LogLine("[cfg] Writing %zu settings to %s", data.settingsKeys.size(), gSettingsPath.c_str()); std::vector sKeys; std::vector sVals; sKeys.reserve(data.settingsKeys.size()); sVals.reserve(data.settingsKeys.size()); for (const auto &entry : data.settingsKeys) { - fileUtils::LogLine("[cfg] %s = %s", entry.first.c_str(), entry.second.c_str()); + file::utils::LogLine("[cfg] %s = %s", entry.first.c_str(), entry.second.c_str()); sKeys.push_back(entry.first); sVals.push_back(entry.second); } @@ -395,23 +395,23 @@ namespace config { valPtrs.push_back(NULL); if (!ini_putsection(CONFIG_VAL_SECTION, keyPtrs.data(), valPtrs.data(), gSettingsPath.c_str())) { - fileUtils::LogLine("[cfg] FAILED to write settings section"); + file::utils::LogLine("[cfg] FAILED to write settings section"); } else { - fileUtils::LogLine("[cfg] Settings migration done"); + file::utils::LogLine("[cfg] Settings migration done"); } } else { - fileUtils::LogLine("[cfg] No settings keys to migrate"); + file::utils::LogLine("[cfg] No settings keys to migrate"); } if (!data.kipKeys.empty()) { - fileUtils::LogLine("[cfg] Writing %zu KIP keys to %s", data.kipKeys.size(), gKipPath.c_str()); + file::utils::LogLine("[cfg] Writing %zu KIP keys to %s", data.kipKeys.size(), gKipPath.c_str()); std::vector kKeys; std::vector kVals; kKeys.reserve(data.kipKeys.size()); kVals.reserve(data.kipKeys.size()); for (const auto &entry : data.kipKeys) { - fileUtils::LogLine("[cfg] %s = %s", entry.first.c_str(), entry.second.c_str()); + file::utils::LogLine("[cfg] %s = %s", entry.first.c_str(), entry.second.c_str()); kKeys.push_back(entry.first); kVals.push_back(entry.second); } @@ -428,9 +428,9 @@ namespace config { kValPtrs.push_back(NULL); if (!ini_putsection(CONFIG_VAL_SECTION, kKeyPtrs.data(), kValPtrs.data(), gKipPath.c_str())) { - fileUtils::LogLine("[cfg] FAILED to write KIP section"); + file::utils::LogLine("[cfg] FAILED to write KIP section"); } else { - fileUtils::LogLine("[cfg] KIP migration done"); + file::utils::LogLine("[cfg] KIP migration done"); } for (const auto &entry : data.kipKeys) { @@ -448,10 +448,10 @@ namespace config { } } } else { - fileUtils::LogLine("[cfg] No KIP keys to migrate"); + file::utils::LogLine("[cfg] No KIP keys to migrate"); } - fileUtils::LogLine("[cfg] Creating profiles directory: %s", FILE_PROFILES_DIR); + file::utils::LogLine("[cfg] Creating profiles directory: %s", FILE_PROFILES_DIR); mkdir(FILE_PROFILES_DIR, 0777); std::map>> profileBuckets; @@ -459,20 +459,20 @@ namespace config { profileBuckets[entry.first].push_back(entry.second); } - fileUtils::LogLine("[cfg] Writing %zu profiles (%zu TIDs)", data.profileEntries.size(), profileBuckets.size()); + file::utils::LogLine("[cfg] Writing %zu profiles (%zu TIDs)", data.profileEntries.size(), profileBuckets.size()); for (const auto &bucket : profileBuckets) { char filename[32]; snprintf(filename, sizeof(filename), "%016lX.ini", bucket.first); std::string profilePath = gProfilesDir + "/" + filename; - fileUtils::LogLine("[cfg] TID=%016lX %zu keys -> %s", bucket.first, bucket.second.size(), profilePath.c_str()); + file::utils::LogLine("[cfg] TID=%016lX %zu keys -> %s", bucket.first, bucket.second.size(), profilePath.c_str()); std::vector pKeys; std::vector pVals; pKeys.reserve(bucket.second.size()); pVals.reserve(bucket.second.size()); for (const auto &kv : bucket.second) { - fileUtils::LogLine("[cfg] %s = %s", kv.first.c_str(), kv.second.c_str()); + file::utils::LogLine("[cfg] %s = %s", kv.first.c_str(), kv.second.c_str()); pKeys.push_back(kv.first); pVals.push_back(kv.second); } @@ -489,17 +489,17 @@ namespace config { valPtrs.push_back(NULL); if (!ini_putsection(CONFIG_VAL_SECTION, keyPtrs.data(), valPtrs.data(), profilePath.c_str())) { - fileUtils::LogLine("[cfg] FAILED to write profile for TID %016lX", bucket.first); + file::utils::LogLine("[cfg] FAILED to write profile for TID %016lX", bucket.first); } } - fileUtils::LogLine("[cfg] Profiles migration done"); + file::utils::LogLine("[cfg] Profiles migration done"); - fileUtils::LogLine("[cfg] Renaming legacy config to config.ini.migrated"); + file::utils::LogLine("[cfg] Renaming legacy config to config.ini.migrated"); if (rename(gLegacyPath.c_str(), (gLegacyPath + ".migrated").c_str()) != 0) { - fileUtils::LogLine("[cfg] WARNING: Failed to rename legacy config file"); + file::utils::LogLine("[cfg] WARNING: Failed to rename legacy config file"); } gMigrationHappened = true; - fileUtils::LogLine("[cfg] Migration complete"); + file::utils::LogLine("[cfg] Migration complete"); } } // namespace @@ -570,7 +570,7 @@ namespace config { auto it = gProfileMtimes.find(HOCCLK_GLOBAL_PROFILE_TID); time_t known = (it != gProfileMtimes.end()) ? it->second : 0; if (CheckFileMtime(profilePath) != known) { - fileUtils::LogLine("[cfg] Global profile changed on disk, dropping cache"); + file::utils::LogLine("[cfg] Global profile changed on disk, dropping cache"); DropGlobalProfile(); profilesChanged = true; } @@ -580,7 +580,7 @@ namespace config { auto it = gProfileMtimes.find(gCurrentGameTid); time_t known = (it != gProfileMtimes.end()) ? it->second : 0; if (CheckFileMtime(profilePath) != known) { - fileUtils::LogLine("[cfg] Profile %016lX changed on disk, dropping cache", gCurrentGameTid); + file::utils::LogLine("[cfg] Profile %016lX changed on disk, dropping cache", gCurrentGameTid); EvictCurrentGame(); profilesChanged = true; } @@ -676,7 +676,7 @@ namespace config { if (keys.empty()) { struct stat st; if (stat(profilePath, &st) == 0 && remove(profilePath) != 0) { - fileUtils::LogLine("[cfg] Failed to remove empty profile %s", profilePath); + file::utils::LogLine("[cfg] Failed to remove empty profile %s", profilePath); return false; } } else if (!ini_putsection(CONFIG_VAL_SECTION, keyPointers.data(), valuePointers.data(), profilePath)) { @@ -829,9 +829,9 @@ namespace config { if (immediate) { for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { if (hocclkValidConfigValue((HocClkConfigValue)kval, configValues->values[kval])) { - config::configValues[kval] = configValues->values[kval]; + file::config::configValues[kval] = configValues->values[kval]; } else { - config::configValues[kval] = hocclkDefaultConfigValue((HocClkConfigValue)kval); + file::config::configValues[kval] = hocclkDefaultConfigValue((HocClkConfigValue)kval); } } SetProfileDirty(true); @@ -842,7 +842,7 @@ namespace config { bool ResetConfigValue(HocClkConfigValue kval) { if (!HOCCLK_ENUM_VALID(HocClkConfigValue, kval)) { - fileUtils::LogLine("[cfg] Invalid HocClkConfigValue: %u", kval); + file::utils::LogLine("[cfg] Invalid HocClkConfigValue: %u", kval); return false; } @@ -869,12 +869,12 @@ namespace config { const char *targetPath = hocclkIsKipConfigValue(kval) ? gKipPath.c_str() : gSettingsPath.c_str(); if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), targetPath)) { - fileUtils::LogLine("[cfg] Failed to reset config value %u in INI", kval); + file::utils::LogLine("[cfg] Failed to reset config value %u in INI", kval); return false; } configValues[kval] = defaultValue; - fileUtils::LogLine("[cfg] Reset config value %u to default: %llu", kval, defaultValue); + file::utils::LogLine("[cfg] Reset config value %u to default: %llu", kval, defaultValue); SetProfileDirty(true); return true; @@ -923,4 +923,4 @@ namespace config { ini_puts(section, key, NULL, gSettingsPath.c_str()); ini_puts(section, key, NULL, gKipPath.c_str()); } -} // namespace config +} // namespace file::config diff --git a/Source/hoc-clk/sysmodule/src/file/config.hpp b/Source/hoc-clk/sysmodule/src/file/config.hpp index 3ea6fc5d..b23ed167 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.hpp +++ b/Source/hoc-clk/sysmodule/src/file/config.hpp @@ -33,7 +33,7 @@ #define CONFIG_VAL_SECTION "values" -namespace config { +namespace file::config { void Initialize(); void Exit(); @@ -65,4 +65,4 @@ namespace config { extern uint64_t configValues[HocClkConfigValue_EnumMax]; -} // namespace config +} // namespace file::config diff --git a/Source/hoc-clk/sysmodule/src/file/errors.cpp b/Source/hoc-clk/sysmodule/src/file/errors.cpp index 14625cdd..b01171a9 100644 --- a/Source/hoc-clk/sysmodule/src/file/errors.cpp +++ b/Source/hoc-clk/sysmodule/src/file/errors.cpp @@ -30,13 +30,13 @@ #include "errors.hpp" #include "file_utils.hpp" -namespace errors { +namespace file::utils { void ThrowException(const char *format, ...) { va_list args; va_start(args, format); - fileUtils::LogLine(format, args); + LogLine(format, args); va_end(args); diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); // throw std::runtime_error(msg); } -} // namespace errors +} // namespace file::utils diff --git a/Source/hoc-clk/sysmodule/src/file/errors.hpp b/Source/hoc-clk/sysmodule/src/file/errors.hpp index ff9d5c7b..6814c4a4 100644 --- a/Source/hoc-clk/sysmodule/src/file/errors.hpp +++ b/Source/hoc-clk/sysmodule/src/file/errors.hpp @@ -29,7 +29,7 @@ #include #include -#define ERROR_THROW(format, ...) errors::ThrowException(format "\n in %s:%u", ##__VA_ARGS__, __FILE__, __LINE__) +#define ERROR_THROW(format, ...) file::utils::ThrowException(format "\n in %s:%u", ##__VA_ARGS__, __FILE__, __LINE__) #define ERROR_RESULT_THROW(rc, format, ...) ERROR_THROW(format "\n RC: [0x%x] %04d-%04d", ##__VA_ARGS__, rc, R_MODULE(rc), R_DESCRIPTION(rc)) #define ASSERT_RESULT_OK(rc, format, ...) \ if (R_FAILED(rc)) { \ @@ -40,7 +40,7 @@ ERROR_THROW("No such %s: %u", #n, v); \ } -namespace errors { +namespace file::utils { void ThrowException(const char *format, ...); diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 169eb87b..9d049d7b 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -35,7 +35,7 @@ extern "C" void __libnx_init_time(void); -namespace fileUtils { +namespace file::utils { namespace { @@ -234,4 +234,4 @@ namespace fileUtils { fsExit(); } -} // namespace fileUtils +} // namespace file::utils diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index 954f8889..1ffc5c27 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -45,7 +45,7 @@ #define FILE_PROFILES_DIR FILE_CONFIG_DIR "/profiles" #define FILE_LEGACY_CONFIG_PATH FILE_CONFIG_DIR "/config.ini" -namespace fileUtils { +namespace file::utils { void Exit(); Result Initialize(); @@ -56,4 +56,4 @@ namespace fileUtils { void LogLine(const char *format, ...); void WriteContextToCsv(const HocClkContext *context); -} // namespace fileUtils +} // namespace file::utils diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index e1e63d5a..83e21af4 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -22,22 +22,22 @@ #include "../mapping/mem_map.hpp" #include "kip.hpp" -namespace kip { +namespace file::kip { bool kipAvailable = false; void SetKipData() { // TODO: figure out if this REALLY causes issues (i doubt it) // if(board::GetSocType() == HocClkSocType_Mariko) { - // if(R_FAILED(I2c_BuckConverter_SetMvOut(&I2c_Mariko_DRAM_VDDQ, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt) / 1000))) { - // fileUtils::LogLine("[clock_manager] Failed set i2c vddq"); - // notification::writeNotification("Horizon OC\nFailed to write I2C\nwhile setting vddq"); + // if(R_FAILED(I2c_BuckConverter_SetMvOut(&I2c_Mariko_DRAM_VDDQ, file::config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt) / 1000))) { + // file::utils::LogLine("[clock_manager] Failed set i2c vddq"); + // hos::WriteNotification("Horizon OC\nFailed to write I2C\nwhile setting vddq"); // } // } CustomizeTable table; FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r+b"); if (fp == NULL) { - notification::writeNotification("Horizon OC\nKip opening failed"); + hos::WriteNotification("Horizon OC\nKip opening failed"); kipAvailable = false; return; } @@ -45,8 +45,8 @@ namespace kip { if (!cust_read_table_f(fp, &table)) { fclose(fp); - fileUtils::LogLine("[kip] Failed to read KIP file"); - notification::writeNotification("Horizon OC\nKip read failed"); + file::utils::LogLine("[kip] Failed to read KIP file"); + hos::WriteNotification("Horizon OC\nKip read failed"); return; } @@ -54,121 +54,121 @@ namespace kip { u32 kipVersion = cust_get_kip_version(&table); if (custRev < CUST_REV || kipVersion < KIP_VERSION) { fclose(fp); - notification::writeNotification("Horizon OC\nOutdated kip detected!\nPlease update Horizon OC"); - fileUtils::LogLine("Cust revision: %u", custRev); - fileUtils::LogLine("Kip version: %u", kipVersion); + hos::WriteNotification("Horizon OC\nOutdated kip detected!\nPlease update Horizon OC"); + file::utils::LogLine("Cust revision: %u", custRev); + file::utils::LogLine("Kip version: %u", kipVersion); return; } else if (custRev > CUST_REV || kipVersion > KIP_VERSION) { fclose(fp); - notification::writeNotification("Horizon OC\nOutdated sysmodule detected!\nPlease update Horizon OC"); - fileUtils::LogLine("Cust revision: %u", custRev); - fileUtils::LogLine("Kip version: %u", kipVersion); + hos::WriteNotification("Horizon OC\nOutdated sysmodule detected!\nPlease update Horizon OC"); + file::utils::LogLine("Cust revision: %u", custRev); + file::utils::LogLine("Kip version: %u", kipVersion); return; } - // CUST_WRITE_FIELD_BATCH(&table, mtcConf, config::GetConfigValue(KipConfigValue_mtcConf)); - CUST_WRITE_FIELD_BATCH(&table, hpMode, config::GetConfigValue(KipConfigValue_hpMode)); + // CUST_WRITE_FIELD_BATCH(&table, mtcConf, file::config::GetConfigValue(KipConfigValue_mtcConf)); + CUST_WRITE_FIELD_BATCH(&table, hpMode, file::config::GetConfigValue(KipConfigValue_hpMode)); - CUST_WRITE_FIELD_BATCH(&table, commonEmcMemVolt, config::GetConfigValue(KipConfigValue_commonEmcMemVolt)); - CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoEmcMaxClock, config::GetConfigValue(KipConfigValue_marikoEmcMaxClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoEmcVddqVolt, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt)); - CUST_WRITE_FIELD_BATCH(&table, emcDvbShift, config::GetConfigValue(KipConfigValue_emcDvbShift)); - CUST_WRITE_FIELD_BATCH(&table, marikoSocVmax, config::GetConfigValue(KipConfigValue_marikoSocVmax)); + CUST_WRITE_FIELD_BATCH(&table, commonEmcMemVolt, file::config::GetConfigValue(KipConfigValue_commonEmcMemVolt)); + CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock, file::config::GetConfigValue(KipConfigValue_eristaEmcMaxClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoEmcMaxClock, file::config::GetConfigValue(KipConfigValue_marikoEmcMaxClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoEmcVddqVolt, file::config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt)); + CUST_WRITE_FIELD_BATCH(&table, emcDvbShift, file::config::GetConfigValue(KipConfigValue_emcDvbShift)); + CUST_WRITE_FIELD_BATCH(&table, marikoSocVmax, file::config::GetConfigValue(KipConfigValue_marikoSocVmax)); - CUST_WRITE_FIELD_BATCH(&table, t1_tRCD, config::GetConfigValue(KipConfigValue_t1_tRCD)); - CUST_WRITE_FIELD_BATCH(&table, t2_tRP, config::GetConfigValue(KipConfigValue_t2_tRP)); - CUST_WRITE_FIELD_BATCH(&table, t3_tRAS, config::GetConfigValue(KipConfigValue_t3_tRAS)); - CUST_WRITE_FIELD_BATCH(&table, t4_tRRD, config::GetConfigValue(KipConfigValue_t4_tRRD)); - CUST_WRITE_FIELD_BATCH(&table, t5_tRFC, config::GetConfigValue(KipConfigValue_t5_tRFC)); - CUST_WRITE_FIELD_BATCH(&table, t6_tRTW, config::GetConfigValue(KipConfigValue_t6_tRTW)); - CUST_WRITE_FIELD_BATCH(&table, t7_tWTR, config::GetConfigValue(KipConfigValue_t7_tWTR)); - CUST_WRITE_FIELD_BATCH(&table, t8_tREFI, config::GetConfigValue(KipConfigValue_t8_tREFI)); - CUST_WRITE_FIELD_BATCH(&table, stepMode, config::GetConfigValue(KipConfigValue_stepMode)); + CUST_WRITE_FIELD_BATCH(&table, t1_tRCD, file::config::GetConfigValue(KipConfigValue_t1_tRCD)); + CUST_WRITE_FIELD_BATCH(&table, t2_tRP, file::config::GetConfigValue(KipConfigValue_t2_tRP)); + CUST_WRITE_FIELD_BATCH(&table, t3_tRAS, file::config::GetConfigValue(KipConfigValue_t3_tRAS)); + CUST_WRITE_FIELD_BATCH(&table, t4_tRRD, file::config::GetConfigValue(KipConfigValue_t4_tRRD)); + CUST_WRITE_FIELD_BATCH(&table, t5_tRFC, file::config::GetConfigValue(KipConfigValue_t5_tRFC)); + CUST_WRITE_FIELD_BATCH(&table, t6_tRTW, file::config::GetConfigValue(KipConfigValue_t6_tRTW)); + CUST_WRITE_FIELD_BATCH(&table, t7_tWTR, file::config::GetConfigValue(KipConfigValue_t7_tWTR)); + CUST_WRITE_FIELD_BATCH(&table, t8_tREFI, file::config::GetConfigValue(KipConfigValue_t8_tREFI)); + CUST_WRITE_FIELD_BATCH(&table, stepMode, file::config::GetConfigValue(KipConfigValue_stepMode)); - CUST_WRITE_FIELD_BATCH(&table, timingEmcTbreak, config::GetConfigValue(KipConfigValue_timingEmcTbreak)); - CUST_WRITE_FIELD_BATCH(&table, low_t1_tRCD, config::GetConfigValue(KipConfigValue_low_t1_tRCD)); - CUST_WRITE_FIELD_BATCH(&table, low_t2_tRP, config::GetConfigValue(KipConfigValue_low_t2_tRP)); - CUST_WRITE_FIELD_BATCH(&table, low_t3_tRAS, config::GetConfigValue(KipConfigValue_low_t3_tRAS)); - CUST_WRITE_FIELD_BATCH(&table, low_t4_tRRD, config::GetConfigValue(KipConfigValue_low_t4_tRRD)); - CUST_WRITE_FIELD_BATCH(&table, low_t5_tRFC, config::GetConfigValue(KipConfigValue_low_t5_tRFC)); - CUST_WRITE_FIELD_BATCH(&table, low_t6_tRTW, config::GetConfigValue(KipConfigValue_low_t6_tRTW)); - CUST_WRITE_FIELD_BATCH(&table, low_t7_tWTR, config::GetConfigValue(KipConfigValue_low_t7_tWTR)); - CUST_WRITE_FIELD_BATCH(&table, low_t8_tREFI, config::GetConfigValue(KipConfigValue_low_t8_tREFI)); + CUST_WRITE_FIELD_BATCH(&table, timingEmcTbreak, file::config::GetConfigValue(KipConfigValue_timingEmcTbreak)); + CUST_WRITE_FIELD_BATCH(&table, low_t1_tRCD, file::config::GetConfigValue(KipConfigValue_low_t1_tRCD)); + CUST_WRITE_FIELD_BATCH(&table, low_t2_tRP, file::config::GetConfigValue(KipConfigValue_low_t2_tRP)); + CUST_WRITE_FIELD_BATCH(&table, low_t3_tRAS, file::config::GetConfigValue(KipConfigValue_low_t3_tRAS)); + CUST_WRITE_FIELD_BATCH(&table, low_t4_tRRD, file::config::GetConfigValue(KipConfigValue_low_t4_tRRD)); + CUST_WRITE_FIELD_BATCH(&table, low_t5_tRFC, file::config::GetConfigValue(KipConfigValue_low_t5_tRFC)); + CUST_WRITE_FIELD_BATCH(&table, low_t6_tRTW, file::config::GetConfigValue(KipConfigValue_low_t6_tRTW)); + CUST_WRITE_FIELD_BATCH(&table, low_t7_tWTR, file::config::GetConfigValue(KipConfigValue_low_t7_tWTR)); + CUST_WRITE_FIELD_BATCH(&table, low_t8_tREFI, file::config::GetConfigValue(KipConfigValue_low_t8_tREFI)); - CUST_WRITE_FIELD_BATCH(&table, readLatency1333, config::GetConfigValue(KipConfigValue_read_latency_1333)); - CUST_WRITE_FIELD_BATCH(&table, readLatency1600, config::GetConfigValue(KipConfigValue_read_latency_1600)); - CUST_WRITE_FIELD_BATCH(&table, readLatency1866, config::GetConfigValue(KipConfigValue_read_latency_1866)); - CUST_WRITE_FIELD_BATCH(&table, readLatency2133, config::GetConfigValue(KipConfigValue_read_latency_2133)); + CUST_WRITE_FIELD_BATCH(&table, readLatency1333, file::config::GetConfigValue(KipConfigValue_read_latency_1333)); + CUST_WRITE_FIELD_BATCH(&table, readLatency1600, file::config::GetConfigValue(KipConfigValue_read_latency_1600)); + CUST_WRITE_FIELD_BATCH(&table, readLatency1866, file::config::GetConfigValue(KipConfigValue_read_latency_1866)); + CUST_WRITE_FIELD_BATCH(&table, readLatency2133, file::config::GetConfigValue(KipConfigValue_read_latency_2133)); - CUST_WRITE_FIELD_BATCH(&table, writeLatency1333, config::GetConfigValue(KipConfigValue_write_latency_1333)); - CUST_WRITE_FIELD_BATCH(&table, writeLatency1600, config::GetConfigValue(KipConfigValue_write_latency_1600)); - CUST_WRITE_FIELD_BATCH(&table, writeLatency1866, config::GetConfigValue(KipConfigValue_write_latency_1866)); - CUST_WRITE_FIELD_BATCH(&table, writeLatency2133, config::GetConfigValue(KipConfigValue_write_latency_2133)); + CUST_WRITE_FIELD_BATCH(&table, writeLatency1333, file::config::GetConfigValue(KipConfigValue_write_latency_1333)); + CUST_WRITE_FIELD_BATCH(&table, writeLatency1600, file::config::GetConfigValue(KipConfigValue_write_latency_1600)); + CUST_WRITE_FIELD_BATCH(&table, writeLatency1866, file::config::GetConfigValue(KipConfigValue_write_latency_1866)); + CUST_WRITE_FIELD_BATCH(&table, writeLatency2133, file::config::GetConfigValue(KipConfigValue_write_latency_2133)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuUV, config::GetConfigValue(KipConfigValue_eristaCpuUV)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuVmin, config::GetConfigValue(KipConfigValue_eristaCpuVmin)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuMaxVolt, config::GetConfigValue(KipConfigValue_eristaCpuMaxVolt)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuUnlock, config::GetConfigValue(KipConfigValue_eristaCpuUnlock)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuUV, file::config::GetConfigValue(KipConfigValue_eristaCpuUV)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuVmin, file::config::GetConfigValue(KipConfigValue_eristaCpuVmin)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuMaxVolt, file::config::GetConfigValue(KipConfigValue_eristaCpuMaxVolt)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuUnlock, file::config::GetConfigValue(KipConfigValue_eristaCpuUnlock)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVLow, config::GetConfigValue(KipConfigValue_marikoCpuUVLow)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVHigh, config::GetConfigValue(KipConfigValue_marikoCpuUVHigh)); - CUST_WRITE_FIELD_BATCH(&table, tableConf, config::GetConfigValue(KipConfigValue_tableConf)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuLowVmin, config::GetConfigValue(KipConfigValue_marikoCpuLowVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuHighVmin, config::GetConfigValue(KipConfigValue_marikoCpuHighVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuMaxVolt, config::GetConfigValue(KipConfigValue_marikoCpuMaxVolt)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuMaxClock, config::GetConfigValue(KipConfigValue_marikoCpuMaxClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVLow, file::config::GetConfigValue(KipConfigValue_marikoCpuUVLow)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVHigh, file::config::GetConfigValue(KipConfigValue_marikoCpuUVHigh)); + CUST_WRITE_FIELD_BATCH(&table, tableConf, file::config::GetConfigValue(KipConfigValue_tableConf)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuLowVmin, file::config::GetConfigValue(KipConfigValue_marikoCpuLowVmin)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuHighVmin, file::config::GetConfigValue(KipConfigValue_marikoCpuHighVmin)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuMaxVolt, file::config::GetConfigValue(KipConfigValue_marikoCpuMaxVolt)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuMaxClock, file::config::GetConfigValue(KipConfigValue_marikoCpuMaxClock)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuBoostClock, config::GetConfigValue(KipConfigValue_eristaCpuBoostClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuBoostClock, config::GetConfigValue(KipConfigValue_marikoCpuBoostClock)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuBoostClock, file::config::GetConfigValue(KipConfigValue_eristaCpuBoostClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuBoostClock, file::config::GetConfigValue(KipConfigValue_marikoCpuBoostClock)); - CUST_WRITE_FIELD_BATCH(&table, eristaGpuUV, config::GetConfigValue(KipConfigValue_eristaGpuUV)); - CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmin, config::GetConfigValue(KipConfigValue_eristaGpuVmin)); + CUST_WRITE_FIELD_BATCH(&table, eristaGpuUV, file::config::GetConfigValue(KipConfigValue_eristaGpuUV)); + CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmin, file::config::GetConfigValue(KipConfigValue_eristaGpuVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuUV, config::GetConfigValue(KipConfigValue_marikoGpuUV)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmin, config::GetConfigValue(KipConfigValue_marikoGpuVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmax, config::GetConfigValue(KipConfigValue_marikoGpuVmax)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuUV, file::config::GetConfigValue(KipConfigValue_marikoGpuUV)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmin, file::config::GetConfigValue(KipConfigValue_marikoGpuVmin)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmax, file::config::GetConfigValue(KipConfigValue_marikoGpuVmax)); - CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, config::GetConfigValue(KipConfigValue_commonGpuVoltOffset)); + CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, file::config::GetConfigValue(KipConfigValue_commonGpuVoltOffset)); for (int i = 0; i < 25; i++) { - table.marikoGpuVoltArray[i] = config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_76800 + i)); + table.marikoGpuVoltArray[i] = file::config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_76800 + i)); } for (int i = 0; i < 27; i++) { - table.eristaGpuVoltArray[i] = config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_e_76800 + i)); + table.eristaGpuVoltArray[i] = file::config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_e_76800 + i)); } for (size_t i = 0; i < 28; ++i) { - table.marikoSocVoltArray[i] = config::GetConfigValue((HocClkConfigValue) (KipConfigValue_g_soc_volt_1866000 + i)); + table.marikoSocVoltArray[i] = file::config::GetConfigValue((HocClkConfigValue) (KipConfigValue_g_soc_volt_1866000 + i)); } - CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune)); - CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune)); - CUST_WRITE_FIELD_BATCH(&table, pcvLogVerbosity, config::GetConfigValue(KipConfigValue_PcvDebugVerbosity)); + CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, file::config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune)); + CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, file::config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune)); + CUST_WRITE_FIELD_BATCH(&table, pcvLogVerbosity, file::config::GetConfigValue(KipConfigValue_PcvDebugVerbosity)); if (!cust_write_table_f(fp, &table)) { fclose(fp); - fileUtils::LogLine("[kip] Failed to write KIP file"); - notification::writeNotification("Horizon OC\nKip write failed"); + file::utils::LogLine("[kip] Failed to write KIP file"); + hos::WriteNotification("Horizon OC\nKip write failed"); return; } fclose(fp); HocClkConfigValueList configValues; - config::GetConfigValues(&configValues); + file::config::GetConfigValues(&configValues); - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + configValues.values[KipCrc32] = (u64)util::ChecksumFile("sdmc:/atmosphere/kips/hoc.kip"); // write checksum - if (config::SetConfigValues(&configValues, true)) { - fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], + if (file::config::SetConfigValues(&configValues, true)) { + file::utils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { - fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); + file::utils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } } else { - fileUtils::LogLine("[kip] Warning: Failed to set config values from KIP"); - notification::writeNotification("Horizon OC\nKip config set failed"); + file::utils::LogLine("[kip] Warning: Failed to set config values from KIP"); + hos::WriteNotification("Horizon OC\nKip config set failed"); } } @@ -185,8 +185,8 @@ namespace kip { return true; } - notification::writeNotification("Kip is not loaded!"); - fileUtils::LogLine("Kip was not loaded!"); + hos::WriteNotification("Kip is not loaded!"); + file::utils::LogLine("Kip was not loaded!"); return false; } @@ -196,26 +196,26 @@ namespace kip { FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "rb"); if (fp == NULL) { - notification::writeNotification("Horizon OC\nKip opening failed"); + hos::WriteNotification("Horizon OC\nKip opening failed"); kipAvailable = false; return; } kipAvailable = true; HocClkConfigValueList configValues; - config::GetConfigValues(&configValues); + file::config::GetConfigValues(&configValues); CustomizeTable table; if (!cust_read_table_f(fp, &table)) { fclose(fp); - fileUtils::LogLine("[kip] Failed to read KIP file for GetKipData"); - notification::writeNotification("Horizon OC\nKip read failed"); + file::utils::LogLine("[kip] Failed to read KIP file for GetKipData"); + hos::WriteNotification("Horizon OC\nKip read failed"); return; } fclose(fp); // if(cust_get_cust_rev(&table) != CUST_REV) { - // notification::writeNotification("Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC"); + // hos::WriteNotification("Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC"); // return; // } @@ -223,47 +223,47 @@ namespace kip { /* I hate this. */ /* Don't fetch frequency if it's already set or we would overwrite it. */ /* This technically only applies to Mariko *for now*. */ - if (clockManager::patchedEmcMaxClock == 0) { + if (mgr::patchedEmcMaxClock == 0) { if (board::GetSocType() == HocClkSocType_Mariko) { - clockManager::patchedEmcMaxClock = cust_get_mariko_emc_max(&table); + mgr::patchedEmcMaxClock = cust_get_mariko_emc_max(&table); } else { - clockManager::patchedEmcMaxClock = cust_get_erista_emc_max(&table); + mgr::patchedEmcMaxClock = cust_get_erista_emc_max(&table); } } - if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && - !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { + if ((u64)util::ChecksumFile("sdmc:/atmosphere/kips/hoc.kip") != file::config::GetConfigValue(KipCrc32) && + !file::config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { MigrateKipData(cust_get_cust_rev(&table), cust_get_kip_version(&table)); SetKipData(); - clockManager::gContext.rebootRequired = true; - notification::writeNotification("Horizon OC\nKIP has been updated\nPlease reboot your console to use Horizon OC"); + mgr::gContext.rebootRequired = true; + hos::WriteNotification("Horizon OC\nKIP has been updated\nPlease reboot your console to use Horizon OC"); return; } - if (config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) { + if (file::config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) { configValues.values[HocClkConfigValue_IsFirstLoad] = (u64) false; - notification::writeNotification("Horizon OC has been installed"); + hos::WriteNotification("Horizon OC has been installed"); } - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + configValues.values[KipCrc32] = (u64)util::ChecksumFile("sdmc:/atmosphere/kips/hoc.kip"); // write checksum // configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); - clockManager::gContext.custRev = cust_get_cust_rev(&table); + mgr::gContext.custRev = cust_get_cust_rev(&table); u32 custRev = cust_get_cust_rev(&table); u32 kipVersion = cust_get_kip_version(&table); if (custRev < CUST_REV || kipVersion < KIP_VERSION) { - notification::writeNotification("Horizon OC\nOutdated kip detected!\nPlease update Horizon OC"); - fileUtils::LogLine("Cust revision: %u", custRev); - fileUtils::LogLine("Kip version: %u", kipVersion); + hos::WriteNotification("Horizon OC\nOutdated kip detected!\nPlease update Horizon OC"); + file::utils::LogLine("Cust revision: %u", custRev); + file::utils::LogLine("Kip version: %u", kipVersion); return; } else if (custRev > CUST_REV || kipVersion > KIP_VERSION) { - notification::writeNotification("Horizon OC\nOutdated sysmodule detected!\nPlease update Horizon OC"); - fileUtils::LogLine("Cust revision: %u", custRev); - fileUtils::LogLine("Kip version: %u", kipVersion); + hos::WriteNotification("Horizon OC\nOutdated sysmodule detected!\nPlease update Horizon OC"); + file::utils::LogLine("Cust revision: %u", custRev); + file::utils::LogLine("Kip version: %u", kipVersion); return; } - clockManager::gContext.isKipLoaded = IsKipLoaded(); - clockManager::gContext.kipVersion = kipVersion; + mgr::gContext.isKipLoaded = IsKipLoaded(); + mgr::gContext.kipVersion = kipVersion; configValues.values[KipConfigValue_custRev] = cust_get_cust_rev(&table); configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table); @@ -345,25 +345,25 @@ namespace kip { configValues.values[KipConfigValue_PcvDebugVerbosity] = cust_get_log_verbosity(&table); if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { - if (config::SetConfigValues(&configValues, true)) { - fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], + if (file::config::SetConfigValues(&configValues, true)) { + file::utils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { - fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); + file::utils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } } else { - fileUtils::LogLine("[kip] Warning: Failed to set config values from KIP"); - notification::writeNotification("Horizon OC\nKip config set failed"); + file::utils::LogLine("[kip] Warning: Failed to set config values from KIP"); + hos::WriteNotification("Horizon OC\nKip config set failed"); } } else { - fileUtils::LogLine("[kip] Error: Config value list buffer size mismatch"); - notification::writeNotification("Horizon OC\nConfig Buffer Mismatch"); + file::utils::LogLine("[kip] Error: Config value list buffer size mismatch"); + hos::WriteNotification("Horizon OC\nConfig Buffer Mismatch"); } } void MigrateKipData(u32 custRev, u32 version) { HocClkConfigValueList configValues; - config::GetConfigValues(&configValues); + file::config::GetConfigValues(&configValues); u32 previousVersion = configValues.values[KipConfigValue_KipVersion]; if (previousVersion < 240 && version >= 240) { // <2.4.0 -> 2.4.0 migration @@ -377,15 +377,15 @@ namespace kip { } // delete handheld TDP config entries - config::DeleteKey(CONFIG_VAL_SECTION, "handheld_tdp"); - config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit"); - config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l"); + file::config::DeleteKey(CONFIG_VAL_SECTION, "handheld_tdp"); + file::config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit"); + file::config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l"); } if(previousVersion < 300 && version >= 300) { configValues.values[KipConfigValue_g_volt_1574400] = 2000; } - config::SetConfigValues(&configValues, true); + file::config::SetConfigValues(&configValues, true); } -} // namespace kip +} // namespace file::kip diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 5c022144..9c692cfe 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -28,7 +28,7 @@ #include "file_utils.hpp" -namespace kip { +namespace file::kip { extern bool kipAvailable; typedef struct { @@ -825,4 +825,4 @@ namespace kip { void MigrateKipData(u32 custRev, u32 version); void SetKipData(); void GetKipData(); -} // namespace kip \ No newline at end of file +} // namespace file::kip \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index e566c3d0..2398d44b 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -21,7 +21,7 @@ #include "process_management.hpp" #include -namespace integrations { +namespace hos { namespace { @@ -98,7 +98,7 @@ namespace integrations { if (!gSharedMemoryUsed) return 254; - u64 tid = processManagement::GetCurrentApplicationId(); + u64 tid = GetCurrentApplicationId(); if (tid == 0) return 254; @@ -119,7 +119,7 @@ namespace integrations { if (!gSharedMemoryUsed) return 0; - u64 tid = processManagement::GetCurrentApplicationId(); + u64 tid = GetCurrentApplicationId(); if (tid == 0) return 0; @@ -151,4 +151,4 @@ namespace integrations { return 0; } -} // namespace integrations +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp index 1e808c85..8d9fee3a 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp @@ -20,7 +20,7 @@ #include #include -namespace integrations { +namespace hos { struct NxFpsSharedBlock { uint32_t MAGIC; @@ -66,4 +66,4 @@ namespace integrations { u8 GetSaltyNXFPS(); u16 GetSaltyNXResolutionHeight(); -} // namespace integrations +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/hos/lang.cpp b/Source/hoc-clk/sysmodule/src/hos/lang.cpp index 6d959c01..3c2b07ac 100644 --- a/Source/hoc-clk/sysmodule/src/hos/lang.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/lang.cpp @@ -24,7 +24,7 @@ #include "../file/file_utils.hpp" -namespace lang { +namespace hos { namespace { constexpr const char *UltrahandConfigPath = "sdmc:/config/ultrahand/config.ini"; @@ -138,4 +138,4 @@ namespace lang { return text; } -} // namespace lang +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/hos/lang.hpp b/Source/hoc-clk/sysmodule/src/hos/lang.hpp index 7b03635b..59a12b17 100644 --- a/Source/hoc-clk/sysmodule/src/hos/lang.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/lang.hpp @@ -19,11 +19,11 @@ #include -namespace lang { +namespace hos { // Translates text using Ultrahand's language setting and // /config/horizon-oc/lang/.json (same format as the overlay). // Returns the original text when no translation is available. std::string Translate(const std::string &text); -} // namespace lang +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/hos/notification.cpp b/Source/hoc-clk/sysmodule/src/hos/notification.cpp index 333b0604..c5a2f9fa 100644 --- a/Source/hoc-clk/sysmodule/src/hos/notification.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/notification.cpp @@ -18,8 +18,8 @@ #include "lang.hpp" #include "notification.h" -namespace notification { - void writeNotification(const std::string &message) { +namespace hos { + void WriteNotification(const std::string &message) { static const char *flagPath = "sdmc:/config/ultrahand/flags/NOTIFICATIONS.flag"; FILE *flagFile = fopen(flagPath, "r"); @@ -28,7 +28,7 @@ namespace notification { } fclose(flagFile); - const std::string translated = lang::Translate(message); + const std::string translated = Translate(message); std::string filename = "hoc-" + std::to_string(std::time(nullptr)) + ".notify"; std::string fullPath = "sdmc:/config/ultrahand/notifications/" + filename; @@ -42,4 +42,4 @@ namespace notification { fclose(file); } } -} // namespace notification +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/hos/notification.h b/Source/hoc-clk/sysmodule/src/hos/notification.h index 105d1512..ead5028a 100644 --- a/Source/hoc-clk/sysmodule/src/hos/notification.h +++ b/Source/hoc-clk/sysmodule/src/hos/notification.h @@ -20,6 +20,6 @@ #include #include #include -namespace notification { - void writeNotification(const std::string &message); +namespace hos { + void WriteNotification(const std::string &message); } diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index 1c2869fd..7c9e4654 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -31,7 +31,7 @@ #include "process_management.hpp" -namespace processManagement { +namespace hos { namespace { constexpr u64 Qlaunch = 0x0100000000001000ULL; @@ -39,7 +39,7 @@ namespace processManagement { Service pdmqryClone; } // namespace - void Initialize() { + void InitializeProcessManagement() { Result rc = 0; rc = pmdmntInitialize(); @@ -67,7 +67,7 @@ namespace processManagement { } // Ty to Masa for this function! - Result isApplicationOutOfFocus(bool *outOfFocus) { + Result IsApplicationOutOfFocus(bool *outOfFocus) { static s32 last_total_entries = 0; static bool isOutOfFocus = false; s32 total_entries = 0; @@ -158,10 +158,10 @@ namespace processManagement { return tid; } - void Exit() { + void ExitProcessManagement() { pmdmntExit(); pminfoExit(); pdmqryExit(); } -} // namespace processManagement +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.hpp b/Source/hoc-clk/sysmodule/src/hos/process_management.hpp index 6714e067..47cdafc4 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.hpp @@ -27,12 +27,12 @@ #pragma once #include -namespace processManagement { +namespace hos { - void Initialize(); + void InitializeProcessManagement(); void WaitForQLaunch(); u64 GetCurrentApplicationId(); - Result isApplicationOutOfFocus(bool *outOfFocus); - void Exit(); + Result IsApplicationOutOfFocus(bool *outOfFocus); + void ExitProcessManagement(); -} // namespace processManagement +} // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index f1e01d9b..81247151 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -61,44 +61,44 @@ namespace ipcService { } Result GetCurrentContext(HocClkContext *out_ctx) { - *out_ctx = clockManager::GetCurrentContext(); + *out_ctx = mgr::GetCurrentContext(); return 0; } Result ExitHandler() { - clockManager::SetRunning(false); + mgr::SetRunning(false); return 0; } Result GetProfileCount(std::uint64_t *tid, std::uint8_t *out_count) { - if (!config::HasProfilesLoaded()) { + if (!file::config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } - *out_count = config::GetProfileCount(*tid); + *out_count = file::config::GetProfileCount(*tid); return 0; } Result GetProfiles(std::uint64_t *tid, HocClkTitleProfileList *out_profiles) { - if (!config::HasProfilesLoaded()) { + if (!file::config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } - config::GetProfiles(*tid, out_profiles); + file::config::GetProfiles(*tid, out_profiles); return 0; } Result SetProfiles(HocClkIpc_SetProfiles_Args *args) { - if (!config::HasProfilesLoaded()) { + if (!file::config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } HocClkTitleProfileList profiles = args->profiles; - if (!config::SetProfiles(args->tid, &profiles, true)) { + if (!file::config::SetProfiles(args->tid, &profiles, true)) { return HOCCLK_ERROR(ConfigSaveFailed); } return 0; } Result SetEnabled(std::uint8_t *enabled) { - config::SetEnabled(*enabled); + file::config::SetEnabled(*enabled); return 0; } @@ -106,24 +106,24 @@ namespace ipcService { if (!HOCCLK_ENUM_VALID(HocClkModule, args->module)) { return HOCCLK_ERROR(Generic); } - config::SetOverrideHz(args->module, args->hz); + file::config::SetOverrideHz(args->module, args->hz); return 0; } Result GetConfigValuesHandler(HocClkConfigValueList *out_configValues) { - if (!config::HasProfilesLoaded()) { + if (!file::config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } - config::GetConfigValues(out_configValues); + file::config::GetConfigValues(out_configValues); return 0; } Result SetConfigValuesHandler(HocClkConfigValueList *configValues) { - if (!config::HasProfilesLoaded()) { + if (!file::config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } HocClkConfigValueList copy = *configValues; - if (!config::SetConfigValues(©, true)) { + if (!file::config::SetConfigValues(©, true)) { return HOCCLK_ERROR(ConfigSaveFailed); } return 0; @@ -136,12 +136,12 @@ namespace ipcService { if (args->maxCount != size / sizeof(*out_list)) { return HOCCLK_ERROR(Generic); } - clockManager::GetFreqList(args->module, out_list, args->maxCount, out_count); + mgr::GetFreqList(args->module, out_list, args->maxCount, out_count); return 0; } Result RequestGpuVoltage(HocClkIpc_RequestGpuVoltage_Args *args) { - clockManager::ApplyGpuFreqVoltRequest(args->voltage, args->hz); + mgr::ApplyGpuFreqVoltRequest(args->voltage, args->hz); return 0; } @@ -235,7 +235,7 @@ namespace ipcService { case HocClkIpcCmd_SetKipData: if (r->data.size >= 0) { - kip::SetKipData(); + file::kip::SetKipData(); return 0; } break; @@ -260,7 +260,7 @@ namespace ipcService { return; } if (rc != KERNELRESULT(ConnectionClosed)) { - fileUtils::LogLine("[ipc] ipcServerProcess: [0x%x] %04d-%04d", rc, R_MODULE(rc), R_DESCRIPTION(rc)); + file::utils::LogLine("[ipc] ipcServerProcess: [0x%x] %04d-%04d", rc, R_MODULE(rc), R_DESCRIPTION(rc)); } } } diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index f7c5b0c1..2a785506 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -120,44 +120,44 @@ void __appExit(void) { } int main(int argc, char **argv) { - Result rc = fileUtils::Initialize(); + Result rc = file::utils::Initialize(); if (R_FAILED(rc)) { fatalThrow(rc); return 1; } - config::Initialize(); - config::Refresh(); // Get config from file + file::config::Initialize(); + file::config::Refresh(); // Get config from file board::Initialize(); - processManagement::Initialize(); + hos::InitializeProcessManagement(); - processManagement::WaitForQLaunch(); + hos::WaitForQLaunch(); - clockManager::Initialize(); + mgr::Initialize(); ipcService::Initialize(); - clockManager::SetRunning(true); - config::SetEnabled(true); + mgr::SetRunning(true); + file::config::SetEnabled(true); ipcService::SetRunning(true); // TemperaturePoint *table; // ReadConfigFile(&table); // InitFanController(table); // StartFanControllerThread(); - while (clockManager::Running()) { - clockManager::Tick(); - clockManager::WaitForNextTick(); + while (mgr::Running()) { + mgr::Tick(); + mgr::WaitForNextTick(); } ipcService::SetRunning(false); ipcService::Exit(); - clockManager::Exit(); - processManagement::Exit(); + mgr::Exit(); + hos::ExitProcessManagement(); board::Exit(); - config::Exit(); - fileUtils::LogLine("Exiting hoc-clk"); + file::config::Exit(); + file::utils::LogLine("Exiting hoc-clk"); svcSleepThread(1000000ULL); - fileUtils::Exit(); + file::utils::Exit(); return 0; } diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index f0d52b4d..4f849aa7 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -31,7 +31,7 @@ Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size) { Result MapAddress(u64 &va, const u64 &physAddr, const char *name) { Result mapResult = QueryMemoryMapping(&va, physAddr, 0x1000); if (R_FAILED(mapResult)) { - fileUtils::LogLine("Failed to map %s! %u", name, R_DESCRIPTION(mapResult)); + file::utils::LogLine("Failed to map %s! %u", name, R_DESCRIPTION(mapResult)); } return mapResult; diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 487d1f11..5d705099 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -48,7 +48,7 @@ #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) -namespace clockManager { +namespace mgr { bool gRunning = false; LockableMutex gContextMutex; @@ -74,7 +74,7 @@ namespace clockManager { } std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile) { - if (config::GetConfigValue(HocClkConfigValue_UncappedClocks)) { + if (file::config::GetConfigValue(HocClkConfigValue_UncappedClocks)) { return ~0; // Integer limit, uncapped clocks ON } else { if (module == HocClkModule_GPU) { @@ -84,7 +84,7 @@ namespace clockManager { return 460800000; case HocClkSocType_Mariko: if (board::GetConsoleType() == HocClkConsoleType_Hoag) { - switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { + switch (file::config::GetConfigValue(KipConfigValue_marikoGpuUV)) { case 0 ... 2: return 614400000; case 3 ... 4: @@ -93,7 +93,7 @@ namespace clockManager { return 614400000; } } else { - switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { + switch (file::config::GetConfigValue(KipConfigValue_marikoGpuUV)) { case 0: return 614400000; case 1: @@ -116,7 +116,7 @@ namespace clockManager { case HocClkSocType_Erista: return 768000000; case HocClkSocType_Mariko: - switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { + switch (file::config::GetConfigValue(KipConfigValue_marikoGpuUV)) { case 0: return 844800000; case 1: @@ -165,19 +165,19 @@ namespace clockManager { void ResetToStockClocks() { board::ResetToStockCpu(); - if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { + if (file::config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { if (board::GetSocType() == HocClkSocType_Erista) - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); + board::SetDfllTunings(file::config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), - board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(file::config::GetConfigValue(KipConfigValue_marikoCpuUVLow), file::config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(file::config::GetConfigValue(KipConfigValue_tableConf))); } board::ResetToStockGpu(); } bool ConfigIntervalTimeout(HocClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t *lastLogNs) { - std::uint64_t logInterval = config::GetConfigValue(intervalMsConfigValue) * 1000000ULL; + std::uint64_t logInterval = file::config::GetConfigValue(intervalMsConfigValue) * 1000000ULL; bool shouldLog = logInterval && ((ns - *lastLogNs) > logInterval); if (shouldLog) { @@ -193,14 +193,14 @@ namespace clockManager { std::uint32_t freqs[HOCCLK_FREQ_LIST_MAX]; std::uint32_t count; - fileUtils::LogLine("[mgr] %s freq list refresh", board::GetModuleName(module, true)); + file::utils::LogLine("[mgr] %s freq list refresh", board::GetModuleName(module, true)); board::GetFreqList(module, &freqs[0], HOCCLK_FREQ_LIST_MAX, &count); std::uint32_t *hz = &gFreqTable[module].list[0]; gFreqTable[module].count = 0; if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko && - config::GetConfigValue(HocClkConfigValue_MarikoMiddleFreqs)) { + file::config::GetConfigValue(HocClkConfigValue_MarikoMiddleFreqs)) { constexpr u32 kStep = 38400000; constexpr u32 kPcvStep = 76800000; u32 kMax = ~0; @@ -282,7 +282,7 @@ namespace clockManager { bool skip = false; for (auto &entry : eristaGpuVoltMap) { if (entry.hz == freqs[i]) { - if (config::GetConfigValue(entry.kval) == 2000) { + if (file::config::GetConfigValue(entry.kval) == 2000) { skip = true; } break; @@ -293,7 +293,7 @@ namespace clockManager { } *hz = freqs[i]; - fileUtils::LogLine("[mgr] %02u - %u - %u.%u MHz", gFreqTable[module].count, *hz, *hz / 1000000, *hz / 100000 - *hz / 1000000 * 10); + file::utils::LogLine("[mgr] %02u - %u - %u.%u MHz", gFreqTable[module].count, *hz, *hz / 1000000, *hz / 100000 - *hz / 1000000 * 10); gFreqTable[module].count++; hz++; @@ -303,8 +303,8 @@ namespace clockManager { constexpr u64 EmcClkOSLimitHz = 1600000ULL * 1000; // 1600 MHz const u64 maxHz = patchedEmcMaxClock * 1000; if (module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && - kip::kipAvailable && maxHz >= EmcClkOSLimitHz && - config::GetConfigValue(KipConfigValue_stepMode) == 4 /* 33 MHz */) { + file::kip::kipAvailable && maxHz >= EmcClkOSLimitHz && + file::config::GetConfigValue(KipConfigValue_stepMode) == 4 /* 33 MHz */) { /* Drop the clkrst entries above the OS limit */ u32 kept = 0; @@ -340,12 +340,12 @@ namespace clockManager { } } - fileUtils::LogLine("[mgr] count = %u", gFreqTable[module].count); + file::utils::LogLine("[mgr] count = %u", gFreqTable[module].count); } bool HandleSafetyFeatures(bool isBoost) { - if (((tmp451TempSoc() / 1000) > (int)config::GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && - config::GetConfigValue(HocClkConfigValue_ThermalThrottle)) { + if (((tmp451TempSoc() / 1000) > (int)file::config::GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && + file::config::GetConfigValue(HocClkConfigValue_ThermalThrottle)) { ResetToStockClocks(); return true; } @@ -359,19 +359,19 @@ namespace clockManager { if (++tick > 10) { tick = 0; - if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { - I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); + if (file::config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { + I2c_Bq24193_SetFastChargeCurrentLimit(file::config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); } - if (config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)) { - I2c_Bq24193_SetInputCurrentLimit(config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)); + if (file::config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)) { + I2c_Bq24193_SetInputCurrentLimit(file::config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)); } - I2c_BuckConverter_SetMvOut(&I2c_Display, config::GetConfigValue(HocClkConfigValue_DisplayVoltage)); + I2c_BuckConverter_SetMvOut(&I2c_Display, file::config::GetConfigValue(HocClkConfigValue_DisplayVoltage)); if (board::GetConsoleType() == HocClkConsoleType_Aula) - AulaDisplay::SetDisplayColorMode((AulaColorMode)config::GetConfigValue(HocClkConfigValue_AulaDisplayColorPreset)); - if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { + display::SetDisplayColorMode((AulaColorMode)file::config::GetConfigValue(HocClkConfigValue_AulaDisplayColorPreset)); + if (file::config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { board::HandleCpuUv(); } } @@ -392,9 +392,9 @@ namespace clockManager { u32 GetNearestOverrideHz(HocClkModule module) { u32 targetHz = gContext.overrideFreqs[module]; if (!targetHz) { - targetHz = config::GetAutoClockHz(gContext.applicationId, module, gContext.profile, false); + targetHz = file::config::GetAutoClockHz(gContext.applicationId, module, gContext.profile, false); if (!targetHz) { - targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, gContext.profile, false); + targetHz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, gContext.profile, false); } } @@ -409,7 +409,7 @@ namespace clockManager { /* Apply nothing with disabled voltage. */ constexpr u32 DisabledVoltage = 2000; if (voltage == DisabledVoltage) { - notification::writeNotification("Horizon OC\nDeactivated frequency.\nReboot to apply."); + hos::WriteNotification("Horizon OC\nDeactivated frequency.\nReboot to apply."); return; } @@ -426,7 +426,7 @@ namespace clockManager { } void ApplyGpuDvfs(u32 targetHz) { - s32 dvfsOffset = config::GetConfigValue(HocClkConfigValue_DVFSOffset); + s32 dvfsOffset = file::config::GetConfigValue(HocClkConfigValue_DVFSOffset); dvfsOffset = std::max(dvfsOffset, -80); u32 vmin = board::GetMinimumGpuVmin(targetHz / 1000000, board::GetGpuSpeedoBracket()); @@ -450,7 +450,7 @@ namespace clockManager { } void DVFSReset() { - if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = GetNearestOverrideHz(HocClkModule_GPU); @@ -464,15 +464,15 @@ namespace clockManager { void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) { switch (module) { case HocClkModule_CPU: - if (!(isBoost || (config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode) && isBoost))) + if (!(isBoost || (file::config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode) && isBoost))) board::ResetToStockCpu(); - if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { + if (file::config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { if (board::GetSocType() == HocClkSocType_Erista) - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); + board::SetDfllTunings(file::config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), - config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), - board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(file::config::GetConfigValue(KipConfigValue_marikoCpuUVLow), + file::config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(file::config::GetConfigValue(KipConfigValue_tableConf))); } break; case HocClkModule_GPU: @@ -486,7 +486,7 @@ namespace clockManager { } break; case HocClkModule_Display: - if (config::GetConfigValue(HocClkConfigValue_OverwriteRefreshRate)) { + if (file::config::GetConfigValue(HocClkConfigValue_OverwriteRefreshRate)) { board::ResetToStockDisplay(); } break; @@ -505,7 +505,7 @@ namespace clockManager { u32 nearestFreq = GetCurrentNearestFrequency(HocClkModule_MEM); if (targetRamHz != nearestFreq) { - if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetRamHz); } @@ -520,7 +520,7 @@ namespace clockManager { static bool prepareBoostExit = false; bool didHijackPcv = false; - bool skipCpuDueToBoost = isBoost && !config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode); + bool skipCpuDueToBoost = isBoost && !file::config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode); if (skipCpuDueToBoost) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); prepareBoostExit = true; @@ -545,22 +545,22 @@ namespace clockManager { returnRaw = false; targetHz = gContext.overrideFreqs[module]; if (!targetHz) { - targetHz = config::GetAutoClockHz(gContext.applicationId, (HocClkModule)module, gContext.profile, returnRaw); + targetHz = file::config::GetAutoClockHz(gContext.applicationId, (HocClkModule)module, gContext.profile, returnRaw); if (!targetHz) - targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, (HocClkModule)module, gContext.profile, returnRaw); + targetHz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, (HocClkModule)module, gContext.profile, returnRaw); } if (module == HocClkModule_Governor) { - governor::HandleGovernor(targetHz); + mgr::HandleGovernor(targetHz); } - bool noCPU = governor::isCpuGovernorEnabled; - bool noGPU = governor::isGpuGovernorEnabled; - bool noDisp = governor::isVRREnabled; + bool noCPU = mgr::isCpuGovernorEnabled; + bool noGPU = mgr::isGpuGovernorEnabled; + bool noDisp = mgr::isVRREnabled; if (noDisp && module == HocClkModule_Display) continue; - if (module == HocClkModule_Display && config::GetConfigValue(HocClkConfigValue_OverwriteRefreshRate) && !noDisp) { + if (module == HocClkModule_Display && file::config::GetConfigValue(HocClkConfigValue_OverwriteRefreshRate) && !noDisp) { if (targetHz) { board::SetHz(HocClkModule_Display, targetHz); gContext.freqs[HocClkModule_Display] = targetHz; @@ -584,11 +584,11 @@ namespace clockManager { continue; u32 autoCpuOcHz = 0; - if (module == HocClkModule_CPU && config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock) && !isBoost && - !governor::isCpuGovernorEnabled && (board::GetSocType() == HocClkSocType_Mariko)) { - u32 threshold = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; + if (module == HocClkModule_CPU && file::config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock) && !isBoost && + !mgr::isCpuGovernorEnabled && (board::GetSocType() == HocClkSocType_Mariko)) { + u32 threshold = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; if (ramTargetHz >= threshold) - autoCpuOcHz = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; + autoCpuOcHz = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; } if (targetHz || autoCpuOcHz) { @@ -599,12 +599,12 @@ namespace clockManager { nearestHz = GetNearestHz(HocClkModule_CPU, autoCpuOcHz, maxHz); if (nearestHz != gContext.freqs[module]) { - fileUtils::LogLine("[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", board::GetModuleName((HocClkModule)module, true), + file::utils::LogLine("[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", board::GetModuleName((HocClkModule)module, true), nearestHz / 1000000, nearestHz / 100000 - nearestHz / 1000000 * 10, targetHz / 1000000, targetHz / 100000 - targetHz / 1000000 * 10); // The logic MUST be done in this order otherwise you WILL get crashes - if (module == HocClkModule_MEM && targetHz > oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz > oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } board::SetHz((HocClkModule)module, nearestHz); @@ -614,11 +614,11 @@ namespace clockManager { gContext.stable.freqs[module] = nearestHz; } - if (module == HocClkModule_MEM && targetHz < oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz < oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } - if (module == HocClkModule_MEM && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) + if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) didHijackPcv = false; } } else { @@ -636,16 +636,16 @@ namespace clockManager { Result rc = apmExtGetCurrentPerformanceConfiguration(&mode); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); - std::uint64_t applicationId = processManagement::GetCurrentApplicationId(); + std::uint64_t applicationId = hos::GetCurrentApplicationId(); if (applicationId != gContext.applicationId) { - fileUtils::LogLine("[mgr] TitleID change: %016lX", applicationId); + file::utils::LogLine("[mgr] TitleID change: %016lX", applicationId); gContext.applicationId = applicationId; hasChanged = true; } HocClkProfile profile = board::GetProfile(); if (profile != gContext.profile) { - fileUtils::LogLine("[mgr] Profile change: %s", board::GetProfileName(profile, true)); + file::utils::LogLine("[mgr] Profile change: %s", board::GetProfileName(profile, true)); gContext.profile = profile; hasChanged = true; } @@ -653,7 +653,7 @@ namespace clockManager { // restore clocks to stock values on app or profile change if (hasChanged) { board::ResetToStock(); - if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); board::ResetToStockGpu(); } @@ -664,7 +664,7 @@ namespace clockManager { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { hz = board::GetHz((HocClkModule)module); if (hz != 0 && hz != gContext.freqs[module]) { - fileUtils::LogLine("[mgr] %s clock change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, + file::utils::LogLine("[mgr] %s clock change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, hz / 100000 - hz / 1000000 * 10); gContext.freqs[module] = hz; @@ -674,10 +674,10 @@ namespace clockManager { hasChanged = true; } - hz = config::GetOverrideHz((HocClkModule)module); + hz = file::config::GetOverrideHz((HocClkModule)module); if (hz != gContext.overrideFreqs[module]) { if (hz) { - fileUtils::LogLine("[mgr] %s override change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, + file::utils::LogLine("[mgr] %s override change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, hz / 100000 - hz / 1000000 * 10); } gContext.overrideFreqs[module] = hz; @@ -697,7 +697,7 @@ namespace clockManager { for (unsigned int sensor = 0; sensor < HocClkThermalSensor_EnumMax; sensor++) { millis = board::GetTemperatureMilli((HocClkThermalSensor)sensor); if (shouldLogTemp) { - fileUtils::LogLine("[mgr] %s temp: %u.%u °C", board::GetThermalSensorName((HocClkThermalSensor)sensor, true), millis / 1000, + file::utils::LogLine("[mgr] %s temp: %u.%u °C", board::GetThermalSensorName((HocClkThermalSensor)sensor, true), millis / 1000, (millis - millis / 1000 * 1000) / 100); } gContext.temps[sensor] = millis; @@ -713,7 +713,7 @@ namespace clockManager { for (unsigned int sensor = 0; sensor < HocClkPowerSensor_EnumMax; sensor++) { mw = board::GetPowerMw((HocClkPowerSensor)sensor); if (shouldLogPower) { - fileUtils::LogLine("[mgr] Power %s: %d mW", board::GetPowerSensorName((HocClkPowerSensor)sensor, false), mw); + file::utils::LogLine("[mgr] Power %s: %d mW", board::GetPowerSensorName((HocClkPowerSensor)sensor, false), mw); } gContext.power[sensor] = mw; @@ -728,7 +728,7 @@ namespace clockManager { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { realHz = board::GetRealHz((HocClkModule)module); if (shouldLogFreq) { - fileUtils::LogLine("[mgr] %s real freq: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), realHz / 1000000, + file::utils::LogLine("[mgr] %s real freq: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), realHz / 1000000, realHz / 100000 - realHz / 1000000 * 10); } gContext.realFreqs[module] = realHz; @@ -756,27 +756,27 @@ namespace clockManager { } if (ConfigIntervalTimeout(HocClkConfigValue_CsvWriteIntervalMs, ns, &gLastCsvWriteNs)) { - fileUtils::WriteContextToCsv(&gContext); + file::utils::WriteContextToCsv(&gContext); } // this->context->maxDisplayFreq = board::GetHighestDockedDisplayRate(); u32 targetHz = gContext.overrideFreqs[HocClkModule_Display]; if (!targetHz) { - targetHz = config::GetAutoClockHz(gContext.applicationId, HocClkModule_Display, gContext.profile, true); + targetHz = file::config::GetAutoClockHz(gContext.applicationId, HocClkModule_Display, gContext.profile, true); if (!targetHz) - targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, gContext.profile, true); + targetHz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, gContext.profile, true); } if (board::GetConsoleType() != HocClkConsoleType_Hoag) board::SetDisplayRefreshDockedState(gContext.profile == HocClkProfile_Docked); if (gContext.isSaltyNXInstalled) - gContext.fps = integrations::GetSaltyNXFPS(); + gContext.fps = hos::GetSaltyNXFPS(); else gContext.fps = 254; // N/A if (gContext.isSaltyNXInstalled) - gContext.resolutionHeight = integrations::GetSaltyNXResolutionHeight(); + gContext.resolutionHeight = hos::GetSaltyNXResolutionHeight(); else gContext.resolutionHeight = 0; // N/A @@ -790,7 +790,7 @@ namespace clockManager { /* Load the KIP customize table before building the freq tables: the MEM freq-list synthesis in RefreshFreqTableRow reads marikoEmcMaxClock / stepMode from it. */ - kip::GetKipData(); + file::kip::GetKipData(); for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { gContext.freqs[module] = 0; @@ -824,23 +824,23 @@ namespace clockManager { gContext.dramID = board::GetDramID(); gContext.isDram8GB = board::IsDram8GB(); gContext.consoleType = board::GetConsoleType(); - gContext.isFirstLoad = config::GetConfigValue(HocClkConfigValue_IsFirstLoad); + gContext.isFirstLoad = file::config::GetConfigValue(HocClkConfigValue_IsFirstLoad); - board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), - (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); - gContext.gpuSchedulingMode = (GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling); + board::SetGpuSchedulingMode((GpuSchedulingMode)file::config::GetConfigValue(HocClkConfigValue_GPUScheduling), + (GpuSchedulingOverrideMethod)file::config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); + gContext.gpuSchedulingMode = (GpuSchedulingMode)file::config::GetConfigValue(HocClkConfigValue_GPUScheduling); - gContext.isSysDockInstalled = integrations::GetSysDockState(); - gContext.isSaltyNXInstalled = integrations::GetSaltyNXState(); + gContext.isSysDockInstalled = hos::GetSysDockState(); + gContext.isSaltyNXInstalled = hos::GetSaltyNXState(); if (gContext.isSaltyNXInstalled) { - integrations::LoadSaltyNX(); + hos::LoadSaltyNX(); } - governor::startThreads(); + mgr::StartThreads(); } void Exit() { - governor::exitThreads(); + mgr::ExitThreads(); } HocClkContext GetCurrentContext() { @@ -875,7 +875,7 @@ namespace clockManager { HandleMiscFeatures(); // GPU clock should always be the same unless PCV has overwriten our change, so reset it - if ((RefreshContext() || config::Refresh() || (board::GetRealHz(HocClkModule_GPU) != gContext.freqs[HocClkModule_GPU])) && + if ((RefreshContext() || file::config::Refresh() || (board::GetRealHz(HocClkModule_GPU) != gContext.freqs[HocClkModule_GPU])) && !shouldSkipClockSet) { SetClocks(isBoost); } @@ -888,8 +888,8 @@ namespace clockManager { } if (board::GetHz(HocClkModule_MEM) > 665000000) - svcSleepThread(config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); + svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); else svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode } -} // namespace clockManager +} // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp index 7dccdc8e..1a6741b3 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp @@ -31,7 +31,7 @@ #include "../util/lockable_mutex.h" -namespace clockManager { +namespace mgr { struct FreqTable { std::uint32_t count; @@ -68,4 +68,4 @@ namespace clockManager { void Tick(); void WaitForNextTick(); -} // namespace clockManager +} // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index c8a73399..8ab39d21 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -19,25 +19,25 @@ #include "governor.hpp" #include -namespace governor { +namespace mgr { #define DOWN_HOLD_TICKS_DEFAULT 10 // 50 ms at 5ms poll – how long to hold while ramping down #define STEP_UTIL_DEFAULT 900 // multiplier for step calculations (max freq at 90% load) u64 GovernorPollNs() { - u64 ms = config::GetConfigValue(HocClkConfigValue_GovernorPollRateMs); + u64 ms = file::config::GetConfigValue(HocClkConfigValue_GovernorPollRateMs); if (ms < 1 || ms > 50) ms = 5; return ms * 1'000'000ULL; } u32 GovernorDownHoldTicks() { - u64 ticks = config::GetConfigValue(HocClkConfigValue_GovernorDownHoldTicks); + u64 ticks = file::config::GetConfigValue(HocClkConfigValue_GovernorDownHoldTicks); return (ticks <= 100) ? (u32)ticks : DOWN_HOLD_TICKS_DEFAULT; } u32 GovernorStepUtil() { - u64 step = config::GetConfigValue(HocClkConfigValue_GovernorStepUtil); + u64 step = file::config::GetConfigValue(HocClkConfigValue_GovernorStepUtil); if (step < 100 || step > 1500) step = STEP_UTIL_DEFAULT; return (u32)step; @@ -55,11 +55,11 @@ namespace governor { Thread governorTHREAD; void HandleGovernor(uint32_t targetHz) { - u32 tempTargetHz = clockManager::gContext.overrideFreqs[HocClkModule_Governor]; + u32 tempTargetHz = mgr::gContext.overrideFreqs[HocClkModule_Governor]; if (!tempTargetHz) { - tempTargetHz = config::GetAutoClockHz(clockManager::gContext.applicationId, HocClkModule_Governor, clockManager::gContext.profile, true); + tempTargetHz = file::config::GetAutoClockHz(mgr::gContext.applicationId, HocClkModule_Governor, mgr::gContext.profile, true); if (!tempTargetHz) - tempTargetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Governor, clockManager::gContext.profile, true); + tempTargetHz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Governor, mgr::gContext.profile, true); } auto resolve = [](u8 app, u8 temp) -> u8 { @@ -91,7 +91,7 @@ namespace governor { if (newCpuGovernorState != lastCpuGovernorState || newGpuGovernorState != lastGpuGovernorState || newVrrGovernorState != lastVrrGovernorState) { - fileUtils::LogLine("[mgr] Governor state changed: CPU %s, GPU %s, VRR %s", newCpuGovernorState ? "enabled" : "disabled", + file::utils::LogLine("[mgr] Governor state changed: CPU %s, GPU %s, VRR %s", newCpuGovernorState ? "enabled" : "disabled", newGpuGovernorState ? "enabled" : "disabled", newVrrGovernorState ? "enabled" : "disabled"); lastCpuGovernorState = newCpuGovernorState; lastGpuGovernorState = newGpuGovernorState; @@ -104,7 +104,7 @@ namespace governor { return (u32)(std::min(hz, static_cast(tableMaxHz))); } - u32 TableIndexForHz(const clockManager::FreqTable &table, u32 targetHz) { + u32 TableIndexForHz(const mgr::FreqTable &table, u32 targetHz) { for (u32 i = 0; i < table.count; i++) if (table.list[i] >= targetHz) return i; @@ -112,11 +112,11 @@ namespace governor { } u32 ResolveTargetHz(HocClkModule module) { - u32 hz = clockManager::gContext.overrideFreqs[module]; + u32 hz = mgr::gContext.overrideFreqs[module]; if (!hz) - hz = config::GetAutoClockHz(clockManager::gContext.applicationId, module, clockManager::gContext.profile, false); + hz = file::config::GetAutoClockHz(mgr::gContext.applicationId, module, mgr::gContext.profile, false); if (!hz) - hz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, clockManager::gContext.profile, false); + hz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, mgr::gContext.profile, false); return hz; } @@ -135,7 +135,7 @@ namespace governor { for (;;) { const u64 pollNs = GovernorPollNs(); - if (!clockManager::gRunning) { + if (!mgr::gRunning) { cpuDownHoldRemaining = 0; cpuLastHz = 0; gpuDownHoldRemaining = 0; @@ -155,14 +155,14 @@ namespace governor { } else { isCpuGovernorInBoostMode = false; - auto &table = clockManager::gFreqTable[HocClkModule_CPU]; - std::scoped_lock lock{ clockManager::gContextMutex }; + auto &table = mgr::gFreqTable[HocClkModule_CPU]; + std::scoped_lock lock{ mgr::gContextMutex }; u32 cpuLoad = board::GetPartLoad(HocClkPartLoad_CPUMax); u32 tableMaxHz = table.list[table.count - 1]; u32 desiredHz = SchedutilTargetHz(cpuLoad, tableMaxHz); u32 targetHz = ResolveTargetHz(HocClkModule_CPU); - u32 maxHz = clockManager::GetMaxAllowedHz(HocClkModule_CPU, clockManager::gContext.profile); + u32 maxHz = mgr::GetMaxAllowedHz(HocClkModule_CPU, mgr::gContext.profile); if (targetHz && desiredHz > targetHz) desiredHz = targetHz; @@ -181,12 +181,12 @@ namespace governor { cpuDownHoldRemaining--; if (++cpuTick > 50) { - minHz = config::GetConfigValue(HocClkConfigValue_CpuGovernorMinimumFreq); - if (config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock)) { - u32 ramHz = clockManager::gContext.freqs[HocClkModule_MEM]; - u32 threshold = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; + minHz = file::config::GetConfigValue(HocClkConfigValue_CpuGovernorMinimumFreq); + if (file::config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock)) { + u32 ramHz = mgr::gContext.freqs[HocClkModule_MEM]; + u32 threshold = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; if (ramHz >= threshold) { - u32 overrideHz = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; + u32 overrideHz = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; if (overrideHz > minHz) minHz = overrideHz; } @@ -197,10 +197,10 @@ namespace governor { if (newHz < minHz) newHz = minHz; - if ((!goingDown || (cpuDownHoldRemaining == 0)) && clockManager::IsAssignableHz(HocClkModule_CPU, newHz)) { + if ((!goingDown || (cpuDownHoldRemaining == 0)) && mgr::IsAssignableHz(HocClkModule_CPU, newHz)) { board::SetHz(HocClkModule_CPU, newHz); - clockManager::gContext.freqs[HocClkModule_CPU] = newHz; - clockManager::gContext.stable.freqs[HocClkModule_CPU] = newHz; + mgr::gContext.freqs[HocClkModule_CPU] = newHz; + mgr::gContext.stable.freqs[HocClkModule_CPU] = newHz; cpuLastHz = newHz; } } @@ -211,14 +211,14 @@ namespace governor { } if (isGpuGovernorEnabled) { - auto &table = clockManager::gFreqTable[HocClkModule_GPU]; - std::scoped_lock lock{ clockManager::gContextMutex }; + auto &table = mgr::gFreqTable[HocClkModule_GPU]; + std::scoped_lock lock{ mgr::gContextMutex }; u32 gpuLoad = board::GetPartLoad(HocClkPartLoad_GPU); u32 tableMaxHz = table.list[table.count - 1]; u32 desiredHz = SchedutilTargetHz(gpuLoad, tableMaxHz); u32 targetHz = ResolveTargetHz(HocClkModule_GPU); - u32 maxHz = clockManager::GetMaxAllowedHz(HocClkModule_GPU, clockManager::gContext.profile); + u32 maxHz = mgr::GetMaxAllowedHz(HocClkModule_GPU, mgr::gContext.profile); if (targetHz && desiredHz > targetHz) desiredHz = targetHz; @@ -236,10 +236,10 @@ namespace governor { if (gpuDownHoldRemaining > 0) gpuDownHoldRemaining--; - if ((!goingDown || (gpuDownHoldRemaining == 0)) && clockManager::IsAssignableHz(HocClkModule_GPU, newHz)) { + if ((!goingDown || (gpuDownHoldRemaining == 0)) && mgr::IsAssignableHz(HocClkModule_GPU, newHz)) { board::SetHz(HocClkModule_GPU, newHz); - clockManager::gContext.freqs[HocClkModule_GPU] = newHz; - clockManager::gContext.stable.freqs[HocClkModule_GPU] = newHz; + mgr::gContext.freqs[HocClkModule_GPU] = newHz; + mgr::gContext.stable.freqs[HocClkModule_GPU] = newHz; gpuLastHz = newHz; } } else { @@ -247,13 +247,13 @@ namespace governor { gpuLastHz = 0; } - if (isVRREnabled && clockManager::gContext.profile != HocClkProfile_Docked && clockManager::gContext.isSaltyNXInstalled) { + if (isVRREnabled && mgr::gContext.profile != HocClkProfile_Docked && mgr::gContext.isSaltyNXInstalled) { bool skipVrr = false; if (++vrrFocusTick > 100) { vrrFocusTick = 0; bool isApplicationOutOfFocus = false; - Result rc = processManagement::isApplicationOutOfFocus(&isApplicationOutOfFocus); + Result rc = hos::IsApplicationOutOfFocus(&isApplicationOutOfFocus); if (R_FAILED(rc) || isApplicationOutOfFocus) { board::ResetToStockDisplay(); skipVrr = true; @@ -261,18 +261,18 @@ namespace governor { } if (!skipVrr) { - u8 fps = integrations::GetSaltyNXFPS(); + u8 fps = hos::GetSaltyNXFPS(); if (fps != 254) { - std::scoped_lock lock{ clockManager::gContextMutex }; + std::scoped_lock lock{ mgr::gContextMutex }; - u32 targetHz = clockManager::gContext.overrideFreqs[HocClkModule_Display]; + u32 targetHz = mgr::gContext.overrideFreqs[HocClkModule_Display]; if (!targetHz) { - targetHz = config::GetAutoClockHz(clockManager::gContext.applicationId, HocClkModule_Display, - clockManager::gContext.profile, false); + targetHz = file::config::GetAutoClockHz(mgr::gContext.applicationId, HocClkModule_Display, + mgr::gContext.profile, false); if (!targetHz) targetHz = - config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, clockManager::gContext.profile, false); + file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, mgr::gContext.profile, false); } u8 maxDisplay = targetHz ? (u8)targetHz : 60; @@ -281,19 +281,19 @@ namespace governor { if (maxDisplay != minDisplay) { if (fps >= minDisplay && fps <= maxDisplay) { board::SetHz(HocClkModule_Display, fps); - clockManager::gContext.freqs[HocClkModule_Display] = fps; - clockManager::gContext.realFreqs[HocClkModule_Display] = fps; - clockManager::gContext.stable.freqs[HocClkModule_Display] = fps; - clockManager::gContext.stable.realFreqs[HocClkModule_Display] = fps; + mgr::gContext.freqs[HocClkModule_Display] = fps; + mgr::gContext.realFreqs[HocClkModule_Display] = fps; + mgr::gContext.stable.freqs[HocClkModule_Display] = fps; + mgr::gContext.stable.realFreqs[HocClkModule_Display] = fps; } else { for (u32 i = 0; i < 10; i++) { u32 compareHz = fps * i; if (compareHz >= minDisplay && compareHz <= maxDisplay) { board::SetHz(HocClkModule_Display, compareHz); - clockManager::gContext.freqs[HocClkModule_Display] = compareHz; - clockManager::gContext.realFreqs[HocClkModule_Display] = compareHz; - clockManager::gContext.stable.freqs[HocClkModule_Display] = compareHz; - clockManager::gContext.stable.realFreqs[HocClkModule_Display] = compareHz; + mgr::gContext.freqs[HocClkModule_Display] = compareHz; + mgr::gContext.realFreqs[HocClkModule_Display] = compareHz; + mgr::gContext.stable.freqs[HocClkModule_Display] = compareHz; + mgr::gContext.stable.realFreqs[HocClkModule_Display] = compareHz; break; } } @@ -313,12 +313,12 @@ namespace governor { } } - void startThreads() { + void StartThreads() { threadCreate(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); threadStart(&governorTHREAD); } - void exitThreads() { + void ExitThreads() { threadClose(&governorTHREAD); } -} // namespace governor +} // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp index d9f2cb43..a5989a0c 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp @@ -28,7 +28,7 @@ #include "clock_manager.hpp" -namespace governor { +namespace mgr { extern bool isCpuGovernorInBoostMode; extern bool isVRREnabled; extern bool isGpuGovernorEnabled; @@ -36,7 +36,7 @@ namespace governor { extern bool lastGpuGovernorState; extern bool lastCpuGovernorState; extern bool lastVrrGovernorState; - void startThreads(); - void exitThreads(); + void StartThreads(); + void ExitThreads(); void HandleGovernor(uint32_t targetHz); -} // namespace governor \ No newline at end of file +} // namespace mgr \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp index 74c20a5f..2fd1ad8f 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp @@ -24,7 +24,7 @@ #include #include -namespace soc::mrr { +namespace soc { constexpr u64 EmcPhysBase = 0x7001B000; constexpr u64 Emc0PhysBase = 0x7001E000; constexpr u64 Emc1PhysBase = 0x7001F000; diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp index c37f540a..a148477e 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.hpp @@ -18,7 +18,7 @@ */ #include -namespace soc::mrr { +namespace soc { typedef enum RealDramModule { /* Erista */ DRAM_HBMGCH = 0, diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp index 9bf3a7e5..e394ae13 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp @@ -21,7 +21,7 @@ #include "gm20b.hpp" -namespace gm20b { +namespace soc { u64 gpu_base = 0; #define GPU_PA 0x57000000 #define GPU_SIZE 0x1000000 @@ -123,7 +123,7 @@ namespace gm20b { return success; } - bool setClock(u32 khz) { + bool SetClock(u32 khz) { if (!gpu_base) QueryMemoryMapping(&gpu_base, GPU_PA, GPU_SIZE); @@ -146,4 +146,4 @@ namespace gm20b { return _gpu_pllg_slide(new_divn); } -} // namespace gm20b \ No newline at end of file +} // namespace soc \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp index ec7726cc..9ebfb4be 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp @@ -19,6 +19,6 @@ #pragma once #include <../board/board.hpp> -namespace gm20b { - bool setClock(u32 khz); +namespace soc { + bool SetClock(u32 khz); } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp index 87aa66b2..ce6e6d94 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp @@ -206,7 +206,7 @@ namespace tsensor { SetBit(CFG_TAG_EN_POS, &r); ClearBit(CFG_DISABLE_CLK_POS, &r); WritePmcReg(r, PMC_AOTAG_CFG); - fileUtils::LogLine("[aotag] Init complete!"); + file::utils::LogLine("[aotag] Init complete!"); wasInit = true; } diff --git a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.cpp b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.cpp index 3cfad2e1..80cddc94 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.cpp @@ -19,14 +19,14 @@ #include "bq24193.hpp" -namespace bq24193 { +namespace tsensor { static u8 bq24193_get_reg(u8 reg) { u8 out; I2cRead_OutU8(I2cDevice_Bq24193, reg, &out); return out; } - u8 getBQTemp() { + u8 GetBqTemp() { u8 regVal = bq24193_get_reg(BQ24193_FaultReg); return regVal & BQ24193_FAULT_THERM_MASK; } -} // namespace bq24193 +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp index 2eac97a6..23b41fa7 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp @@ -23,7 +23,7 @@ #include "../i2c/i2cDrv.h" -namespace bq24193 { +namespace tsensor { #define BQ24193_I2C_ADDR 0x6B // REG 0 masks. @@ -126,5 +126,5 @@ namespace bq24193 { BQ24193_Temp_Cold = 5, BQ24193_Temp_Hot = 6, }; - u8 getBQTemp(); -} // namespace bq24193 + u8 GetBqTemp(); +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index af56a833..6d5b7961 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -491,7 +491,7 @@ namespace tsensor { StartSensors(); - fileUtils::LogLine("[Soctherm] Finished init."); + file::utils::LogLine("[Soctherm] Finished init."); } } // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/util/crc32.cpp b/Source/hoc-clk/sysmodule/src/util/crc32.cpp index 7588192f..7fcd5666 100644 --- a/Source/hoc-clk/sysmodule/src/util/crc32.cpp +++ b/Source/hoc-clk/sysmodule/src/util/crc32.cpp @@ -17,8 +17,8 @@ #include -namespace crc32 { - uint32_t crc32(const uint8_t *data, size_t length) { +namespace util { + uint32_t Crc32(const uint8_t *data, size_t length) { uint32_t crc = 0xFFFFFFFF; for (size_t i = 0; i < length; i++) { @@ -30,7 +30,7 @@ namespace crc32 { return ~crc; } - uint32_t checksum_file(const char *filename) { + uint32_t ChecksumFile(const char *filename) { FILE *file = fopen(filename, "rb"); if (!file) { perror("[crc32] Error opening file"); @@ -53,4 +53,4 @@ namespace crc32 { fclose(file); return ~crc; } -} // namespace crc32 +} // namespace util diff --git a/Source/hoc-clk/sysmodule/src/util/crc32.h b/Source/hoc-clk/sysmodule/src/util/crc32.h index 05e1bc70..779185c9 100644 --- a/Source/hoc-clk/sysmodule/src/util/crc32.h +++ b/Source/hoc-clk/sysmodule/src/util/crc32.h @@ -18,7 +18,7 @@ #pragma once #include #include -namespace crc32 { - uint32_t crc32(const uint8_t *data, size_t length); - uint32_t checksum_file(const char *filename); -} // namespace crc32 +namespace util { + uint32_t Crc32(const uint8_t *data, size_t length); + uint32_t ChecksumFile(const char *filename); +} // namespace util From 5dacd30dd30a0f0da43d41129aa0ba9ca1631e52 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 11 Sep 2026 14:16:29 +0200 Subject: [PATCH 132/205] ldr: code cleanup --- .../source/oc/pcv/mariko/pcv_mariko.cpp | 573 +----------------- .../source/oc/pcv/mariko/pcv_mariko.hpp | 146 ----- .../source/oc/pcv/mariko/pcv_mariko_log.cpp | 237 ++++++++ .../source/oc/pcv/mariko/pcv_mariko_log.hpp | 64 ++ .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 52 ++ .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 17 + .../source/oc/pcv/mariko/pcv_mariko_soc.cpp | 325 ++++++++++ .../source/oc/pcv/mariko/pcv_mariko_soc.hpp | 132 ++++ 8 files changed, 831 insertions(+), 715 deletions(-) create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.hpp create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.hpp diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index b41f2061..4db531f9 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -27,573 +27,17 @@ #include "pcv_mariko_cpu.hpp" #include "pcv_mariko_gpu.hpp" #include "pcv_mariko_mtc.hpp" +#include "pcv_mariko_soc.hpp" +#include "pcv_mariko_log.hpp" #include "calculate_timings_mariko.hpp" namespace ams::ldr::hoc::pcv::mariko { u32 *nsoStart; - - namespace { - struct { - u32 *site = nullptr; - } busInitCache; - } + size_t g_nso_size = 0; DEFINE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); - namespace { - size_t g_nso_size = 0; - } - - /* Todo: Remove this bs. */ - [[maybe_unused]] static uintptr_t CaveReserve(size_t count) { - return reinterpret_cast(Hooks().Reserve(count)); - } - - #if HOC_UART_LOG - namespace { - struct { - uintptr_t vsnprintf_addr = 0; - uintptr_t nvlog_addr = 0; - } nvLogCache; - } - - Result NvLogUartRedirect(u32 *ptr) { - const uintptr_t mapped_nso = reinterpret_cast(nsoStart); - const size_t nso_size = g_nso_size; - const uintptr_t textEnd = g_pcv_cave; /* .text ends where the cave begins */ - const uintptr_t vsnprintf_addr = reinterpret_cast(ptr); - - { - using namespace _asm::field; - R_UNLESS(_asm::Ignoring(ptr[1], NvLogStpFpLrAsm, PairOff8), ldr::ResultInvalidNvLogRedirect()); /* stp x29,x30,[sp,#imm] */ - R_UNLESS(_asm::Ignoring(ptr[2], NvLogStrSpillAsm, Rt, Off8), ldr::ResultInvalidNvLogRedirect()); /* str x?,[sp,#imm] */ - R_UNLESS(_asm::Ignoring(ptr[3], NvLogMovFpAsm, Imm12), ldr::ResultInvalidNvLogRedirect()); /* add x29,sp,#imm */ - R_UNLESS(ptr[4] == NvLogCmpSizeAsm, ldr::ResultInvalidNvLogRedirect()); /* cmp x1,#0 */ - } - - /* NvLog via the VDD_SOC log */ - static const char Fmt[] = "%s(%s): DVFS request VDD_SOC %d mV\n"; - constexpr size_t FmtLen = sizeof(Fmt) - 1; - uintptr_t strAddr = 0; - { - const char *hay = reinterpret_cast(mapped_nso); - for (size_t i = 0; i + FmtLen <= nso_size; ++i) { - if (std::memcmp(hay + i, Fmt, FmtLen) == 0) { strAddr = mapped_nso + i; break; } - } - } - if (strAddr == 0) { - LOGGING("NvLogRedirect: fmt string not found (vsnprintf@+%lx)", vsnprintf_addr - mapped_nso); - R_THROW(ldr::ResultInvalidNvLogRedirect()); - } - - uintptr_t nvlog_addr = 0; - for (u32 *p = nsoStart; reinterpret_cast(p + 2) <= textEnd; ++p) { - const uintptr_t pc = reinterpret_cast(p); - if (!_asm::IsOp(p[0], _asm::op::Adrp, _asm::field::Rd, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo)) { - continue; - } - if (_asm::TargetAdrp(p[0], pc) != (strAddr & ~static_cast(0xFFFu))) { - continue; - } - const u32 adrpReg = _asm::Get(p[0], _asm::field::Rd); - if (!(_asm::IsOp(p[1], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) - && _asm::Get(p[1], _asm::field::Rd) == adrpReg && _asm::Get(p[1], _asm::field::Rn) == adrpReg - && _asm::Get(p[1], _asm::field::Imm12) == (strAddr & 0xFFFu))) { - continue; - } - for (u32 k = 2; k <= 12 && (pc + (k + 1) * 4) <= textEnd; ++k) { - if (_asm::IsOp(p[k], _asm::op::Bl, _asm::field::Imm26)) { nvlog_addr = _asm::Target26(p[k], pc + k * 4); break; } - } - if (nvlog_addr != 0) { - break; - } - } - if (nvlog_addr == 0 || nvlog_addr < mapped_nso || nvlog_addr >= textEnd) { - LOGGING("NvLogRedirect: NvLog entry not found (fmt@+%lx)", strAddr - mapped_nso); - R_THROW(ldr::ResultInvalidNvLogRedirect()); - } - - nvLogCache.vsnprintf_addr = vsnprintf_addr; - nvLogCache.nvlog_addr = nvlog_addr; - R_SUCCEED(); - } - - Result InstallNvLogRedirect() { - const uintptr_t mapped_nso = reinterpret_cast(nsoStart); - const uintptr_t textEnd = g_pcv_cave; - const uintptr_t vsnprintf_addr = nvLogCache.vsnprintf_addr; - const uintptr_t nvlog_addr = nvLogCache.nvlog_addr; - - const uintptr_t helper = CaveReserve(40); - if (helper == 0) { - LOGGING("NvLogRedirect: cave unavailable (cave=%lx size=%lx)", - static_cast(g_pcv_cave), static_cast(g_pcv_cave_size)); - R_THROW(ldr::ResultInvalidNvLogRedirect()); - } - u32 *t = reinterpret_cast(helper); - size_t n = 0; - auto emit = [&](u32 ins) { t[n] = ins; ++n; }; - - using namespace _asm::field; - constexpr u32 SP = _asm::reg::Sp; - - emit(_asm::Encode(_asm::op::SubImm64, {Rd, SP}, {Rn, SP}, {Imm12, 0x200})); - emit(_asm::Encode(_asm::op::StpImm64, {Rt, 0}, {Rt2, 1}, {Rn, SP}, {PairOff8, 0x100})); - emit(_asm::Encode(_asm::op::StpImm64, {Rt, 2}, {Rt2, 3}, {Rn, SP}, {PairOff8, 0x110})); - emit(_asm::Encode(_asm::op::StpImm64, {Rt, 4}, {Rt2, 5}, {Rn, SP}, {PairOff8, 0x120})); - emit(_asm::Encode(_asm::op::StpImm64, {Rt, 6}, {Rt2, 7}, {Rn, SP}, {PairOff8, 0x130})); - emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 0}, {Rt2, 1}, {Rn, SP}, {PairOff16, 0x140})); - emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 2}, {Rt2, 3}, {Rn, SP}, {PairOff16, 0x160})); - emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 4}, {Rt2, 5}, {Rn, SP}, {PairOff16, 0x180})); - emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 6}, {Rt2, 7}, {Rn, SP}, {PairOff16, 0x1A0})); - emit(_asm::Encode(_asm::op::StrImm64, {Rt, _asm::reg::Lr}, {Rn, SP}, {Off8, 0x1E0})); - emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x200})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1C0})); /* __stack */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x140})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1C8})); /* __gr_top */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x1C0})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1D0})); /* __vr_top */ - emit(_asm::Encode(_asm::op::MovnW, {Rd, 9}, {Imm16, 0x37})); emit(_asm::Encode(_asm::op::StrImm32, {Rt, 9}, {Rn, SP}, {Off4, 0x1D8})); /* __gr_offs = -56 */ - emit(_asm::Encode(_asm::op::MovnW, {Rd, 9}, {Imm16, 0x7F})); emit(_asm::Encode(_asm::op::StrImm32, {Rt, 9}, {Rn, SP}, {Off4, 0x1DC})); /* __vr_offs = -128 */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, 0}, {Rn, SP}, {Imm12, 0x00})); /* mov x0,sp (buf) */ - emit(_asm::Encode(_asm::op::MovzW, {Rd, 1}, {Imm16, 0x100})); /* size = 0x100 */ - emit(_asm::Encode(_asm::op::LdrImm64, {Rt, 2}, {Rn, SP}, {Off8, 0x100})); /* fmt (saved x0) */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, 3}, {Rn, SP}, {Imm12, 0x1C0})); /* ap */ - emit(_asm::Retarget26(_asm::op::Bl, helper + n * 4, vsnprintf_addr)); - emit(_asm::MovReg64(1, 0)); /* len = retval */ - emit(_asm::CmpImm32(1, 0x100)); - { /* b.lo +2 */ - const size_t at = n; - emit(_asm::Retarget19(_asm::Encode(_asm::op::BCond, {BCond, _asm::cond::Lo}), helper + at * 4, helper + (at + 2) * 4)); - } - emit(_asm::Encode(_asm::op::MovzW, {Rd, 1}, {Imm16, 0xFF})); /* clamp len */ - emit(_asm::Encode(_asm::op::AddImm64, {Rd, 0}, {Rn, SP}, {Imm12, 0x00})); /* mov x0,sp (str) */ - emit(_asm::Encode(_asm::op::Svc, {Imm16, 0x27})); /* svcOutputDebugString */ - emit(_asm::Encode(_asm::op::LdrImm64, {Rt, _asm::reg::Lr}, {Rn, SP}, {Off8, 0x1E0})); - emit(_asm::Encode(_asm::op::AddImm64, {Rd, SP}, {Rn, SP}, {Imm12, 0x200})); - emit(_asm::RetIns); - - /* Redirect the call sites as patching the actual function causes crash */ - const uintptr_t roStart = g_pcv_cave + g_pcv_cave_size; /* module .rodata start */ - size_t patchedSites = 0; - for (u32 *p = nsoStart; reinterpret_cast(p + 1) <= textEnd; ++p) { - if (!_asm::IsOp(*p, _asm::op::Bl, _asm::field::Imm26)) { - continue; - } - const uintptr_t pc = reinterpret_cast(p); - if (_asm::Target26(*p, pc) != nvlog_addr) { - continue; - } - bool isFmtCall = false; - for (u32 j = 1; j <= 8 && reinterpret_cast(p - j) >= reinterpret_cast(nsoStart); ++j) { - const u32 w = *(p - j); - if (_asm::IsOp(w, _asm::op::Adrp, _asm::field::Rd, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo) && _asm::Get(w, _asm::field::Rd) == 0) { /* adrp x0, */ - const uintptr_t tgtPage = _asm::TargetAdrp(w, pc - j * 4); - if (tgtPage >= (roStart & ~static_cast(0xFFFu))) { isFmtCall = true; break; } - } - } - if (isFmtCall) { - PATCH_OFFSET(p, _asm::Retarget26(_asm::op::Bl, pc, helper)); - ++patchedSites; - } - } - - LOGGING("NvLogRedirect: stub@+%lx vsnprintf@+%lx helper@+%lx instr=%zu sites=%zu", nvlog_addr - mapped_nso, vsnprintf_addr - mapped_nso, helper - mapped_nso, n, patchedSites); - R_SUCCEED(); - } - #endif - - HOOK_PAYLOAD_FN u64 BusFreqExtendImpl(SharedClkBus *bus) { - HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); - - u32 *table = data->busData.next; - bus->allowedFreqTable = table; - data->busData.next = table + EmcDvfsTableEntryCount; - - /* Call the original function. */ - return reinterpret_cast(data->busData.originalFnCallback)(bus); - } - - /* Relocate and extend C2/C3Bus to avoid issues (likely buffer overflow) */ - Result BusFreqReloc(u32 *ptr) { - using namespace _asm::field; - - const u32 bus = _asm::Get(ptr[0], Rn); - R_UNLESS(_asm::IsOp(ptr[1], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[1], Imm12) == 0x18 && _asm::Get(ptr[1], Rn) == bus, - ldr::ResultInvalidBusFreqReloc()); /* add Xcnt,Xbus,#0x18 */ - R_UNLESS(_asm::IsOp(ptr[2], _asm::op::StrImm64, Rt, Rn, Off8) && _asm::Get(ptr[2], Off8) == 0x50 && _asm::Get(ptr[2], Rn) == bus, - ldr::ResultInvalidBusFreqReloc()); /* str Xrail,[Xbus,#0x50] */ - R_UNLESS(_asm::IsOp(ptr[3], _asm::op::Bl, Imm26), ldr::ResultInvalidBusFreqReloc()); /* bl GetDvfsRailUniqueFreqList */ - - constexpr u32 PrologueMargin = 140; - u32 *functionPrologue = _asm::FindFnPrologue(ptr, PrologueMargin, nsoStart); - R_UNLESS(functionPrologue != nullptr, ldr::ResultInvalidBusFreqReloc()); - - busInitCache.site = functionPrologue; - - R_SUCCEED(); - } - - #if HOC_UART_LOG - namespace { - struct { - u32 *sites[3] = {}; - u32 count = 0; - } forceVerbosityCache; - } - - HOOK_PAYLOAD_FN u32 ForceVerbosityImpl() { - HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); - return data->verbosityLevel; - } - - /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ - Result ForceVerbosity(u32 *ptr) { - using namespace _asm::field; - - R_UNLESS(_asm::IsOp(ptr[1], _asm::op::StrImm64, Rt, Rn, Off8) && _asm::Get(ptr[1], Rn) == _asm::reg::Sp, - ldr::ResultInvalidForceVerbosityPattern()); /* str x?,[sp,#imm] */ - R_UNLESS(_asm::IsOp(ptr[2], _asm::op::AddImm64, Rd, Rn, Imm12) - && _asm::Get(ptr[2], Rd) == _asm::reg::Fp && _asm::Get(ptr[2], Rn) == _asm::reg::Sp, - ldr::ResultInvalidForceVerbosityPattern()); /* add x29,sp,#imm */ - R_UNLESS(_asm::IsOp(ptr[3], _asm::op::AddImm64, Rn, Imm12) - && _asm::Get(ptr[3], Rd) == 0 && _asm::Get(ptr[3], Rn) == _asm::reg::Fp, - ldr::ResultInvalidForceVerbosityPattern()); /* add x0,x29,#imm */ - R_UNLESS(_asm::IsOp(ptr[4], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[4], Rn) == _asm::reg::Fp, - ldr::ResultInvalidForceVerbosityPattern()); /* add x?,x29,#imm */ - R_UNLESS(_asm::Get(ptr[3], Imm12) == _asm::Get(ptr[4], Imm12) - && _asm::IsOp(ptr[5], _asm::op::Bl, Imm26), - ldr::ResultInvalidForceVerbosityPattern()); - - bool foundCmp = false; - for (u32 j = 6; j <= 10; ++j) { - if (ptr[j] == 0x7100001Fu) { /* cmp w0,#0 */ - foundCmp = true; - break; - } - } - R_UNLESS(foundCmp, ldr::ResultInvalidForceVerbosityPattern()); - - R_UNLESS(forceVerbosityCache.count < std::size(forceVerbosityCache.sites), ldr::ResultInvalidForceVerbosityPattern()); - forceVerbosityCache.sites[forceVerbosityCache.count++] = ptr; - R_SUCCEED(); - } - #endif - - /* Widen InitDram for a >32-entry EMC DVFS list. Freq array can be dropped to free 264 bytes, relocate the Soc LUT to that space */ - Result EmcSocLutReloc(u32 *ptr) { - constexpr u32 Window = 48; - - using namespace _asm::field; - - R_UNLESS(_asm::Ignoring(ptr[1], EmcSocLutCountStoreAsm, Rt), ldr::ResultInvalidEmcSocLut()); /* str w?,[x0,#0x154] */ - - u32 *freqStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocFreqStoreAsm, Rt); /* str x?,[x8,#0x18] */ - u32 *voltStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocVoltStoreAsm, Rt); /* str w?,[x8,#0x48] */ - u32 *readLoad = _asm::ScanAssembly(ptr - Window, Window, EmcSocReadLoadAsm, Rt); /* ldr w?,[x9,#0x48] */ - R_UNLESS(freqStore && voltStore && readLoad, ldr::ResultInvalidEmcSocLut()); - - u32 *voltBase = voltStore - 2; /* `add Xb,Xsrc,Xi,LSL#2` (a cmn sits between it and store) */ - R_UNLESS(_asm::IsOp(*voltBase, _asm::op::AddShifted64, Rd, Rn, Rm, Imm6) && _asm::Get(*voltBase, Rd) == _asm::Get(*voltStore, Rn), ldr::ResultInvalidEmcSocLut()); - - /* adrp Xl ; add Xl,Xl,#off ; ... ; str Xl,[rail,#0x120] */ - const u32 lutReg = _asm::Get(ptr[0], Rt); - const u32 railReg = _asm::Get(ptr[0], Rn); - R_UNLESS(_asm::IsOp(ptr[-3], _asm::op::Adrp, Rd, ImmAdrpHi, ImmAdrpLo) && _asm::Get(ptr[-3], Rd) == lutReg, ldr::ResultInvalidEmcSocLut()); - R_UNLESS(_asm::IsOp(ptr[-2], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[-2], Rd) == lutReg && _asm::Get(ptr[-2], Rn) == lutReg, ldr::ResultInvalidEmcSocLut()); - - const u32 srcBase = _asm::Get(*voltBase, Rn); /* rail ptr at +0x20 */ - const u32 wBase = _asm::Get(*voltBase, Rd); /* base reg */ - const u32 wIdx = _asm::Get(*voltBase, Rm); /* loop index */ - - PATCH_OFFSET(freqStore, _asm::NopIns); /* Unneeded */ - PATCH_OFFSET(voltBase, _asm::Encode(_asm::op::LdrImm64, {Rt, wBase}, {Rn, srcBase}, {Off8, 0x20})); /* ldr Xb,[Xsrc,#0x20] (rail) */ - PATCH_OFFSET(voltStore - 1, _asm::Encode(_asm::op::AddImm64, {Rd, wBase}, {Rn, wBase}, {Imm12, 0x18})); /* add Xb,Xb,#0x18 (was cmn) */ - PATCH_OFFSET(voltStore, _asm::ToRegOffset(*voltStore, wIdx)); /* str Wv,[Xb,Xi,LSL#2] -> rail+0x18+i*4 */ - PATCH_OFFSET(voltStore + 1, _asm::NopIns); /* Unneeded */ - - /* rail+0x18 as the socMinLut pointer. */ - PATCH_OFFSET(ptr - 3, _asm::NopIns); - PATCH_OFFSET(ptr - 2, _asm::Encode(_asm::op::AddImm64, {Rd, lutReg}, {Rn, railReg}, {Imm12, 0x18})); /* add Xl,rail,#0x18 */ - - /* Drop the abort branch in case of a bad read */ - for (u32 i = 1; i <= 4; ++i) { - if (_asm::IsOp(readLoad[i], _asm::op::BCond, Imm19, BCond)) { - PATCH_OFFSET(&readLoad[i], _asm::NopIns); - break; - } - } - R_SUCCEED(); - } - - Result EmcDvfsCountLimit(u32 *ptr) { - R_UNLESS(_asm::IsOp(*(ptr - 1), _asm::op::Cbz, _asm::field::Imm19, _asm::field::Rt), ldr::ResultInvalidEmcDvfsCount()); /* cbz w?, */ - R_UNLESS(_asm::Ignoring(*(ptr + 1), _asm::Encode(_asm::op::BCond, {_asm::field::BCond, _asm::cond::Cs}), _asm::field::Imm19), - ldr::ResultInvalidEmcDvfsCount()); /* b.cs */ - - /* cmp w?,#0x21 -> cmp w?,#EmcDvfsTableEntryCount */ - PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); - R_SUCCEED(); - } - - Result EmcRateListLimit(u32 *ptr) { - R_UNLESS(_asm::Ignoring(ptr[1], EmcRateCapCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) - && _asm::Get(ptr[0], _asm::field::Rn) == _asm::Get(ptr[1], _asm::field::Rn), - ldr::ResultInvalidEmcRateList()); /* csel w?,w?,w?,lt, min(reg, 0x20) */ - R_UNLESS(_asm::IsOp(ptr[2], _asm::op::Bl, _asm::field::Imm26), ldr::ResultInvalidEmcRateList()); - - /* The csel's Rm holds the 32 cap. */ - const u32 capReg = _asm::Get(ptr[1], _asm::field::Rm); - const u32 capMov = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, capReg}, {_asm::field::Imm16, 0x20}); /* movz w,#0x20 */ - - u32 *movPtr = nullptr; - for (u32 i = 1; i <= 16; ++i) { - if (*(ptr - i) == capMov) { - movPtr = ptr - i; - break; - } - } - R_UNLESS(movPtr, ldr::ResultInvalidEmcRateList()); - - /* min(maxCount, 32) -> min(maxCount, EmcDvfsTableEntryCount). */ - PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); /* cmp w?,#64 */ - PATCH_OFFSET(movPtr, _asm::Set(*movPtr, _asm::field::Imm16, EmcDvfsTableEntryCount)); /* movz w?,#64 */ - R_SUCCEED(); - } - - Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { - struct { - u8 reg; - u8 val; - } __attribute__((packed)) cmd; - - I2cSession _session; - R_TRY(i2cOpenSession(&_session, dev)); - - cmd.reg = reg; - cmd.val = val; - Result res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); - i2csessionClose(&_session); - - return res; - } - - Result EmcVddqVolt(u32 *ptr) { - regulator *entry = reinterpret_cast(reinterpret_cast(ptr) - offsetof(regulator, type_2_3.default_uv)); - - constexpr u32 uv_step = 5'000; - constexpr u32 uv_min = 250'000; - - auto validator = [entry]() { - R_UNLESS(entry->id == 2, ldr::ResultInvalidRegulatorEntry()); - R_UNLESS(entry->type == 3, ldr::ResultInvalidRegulatorEntry()); - R_UNLESS(entry->type_2_3.step_uv == uv_step, ldr::ResultInvalidRegulatorEntry()); - R_UNLESS(entry->type_2_3.min_uv == uv_min, ldr::ResultInvalidRegulatorEntry()); - R_SUCCEED(); - }; - - R_TRY(validator()); - - u32 emc_uv = C.marikoEmcVddqVolt; - - if (!emc_uv) { - R_SKIP(); - } - - if (emc_uv % uv_step) { - emc_uv = (emc_uv + uv_step - 1) / uv_step * uv_step; // rounding - } - - PATCH_OFFSET(ptr, emc_uv); - - i2cInitialize(); - Result resultI2C = I2cSet_U8(I2cDevice_Max77812_2, 0x25, (emc_uv - uv_min) / uv_step); - i2cExit(); - - return resultI2C; - } - - Result GetSocSpeedo(u32 &socSpeedo) { - constexpr u64 FusePhysicalAddress = 0x7000F000; - u64 virtualAddress = 0; - constexpr u64 Size = 0x1000; - - u64 outSize; - /* TODO: use svc::QueryMemoryMapping instead. */ - R_TRY(svcQueryMemoryMapping(&virtualAddress, &outSize, FusePhysicalAddress, Size)); - - constexpr u32 FuseOffset = 2048; - constexpr u32 SocSpeedoOffset = 308; - socSpeedo = *reinterpret_cast(virtualAddress + FuseOffset + SocSpeedoOffset); - - R_SUCCEED(); - } - - u32 GetSocProcessId(u32 socSpeedo) { - if (socSpeedo <= 1597) { - return 0; - } - - if (socSpeedo <= 1708) { - return 1; - } - - /* >= 1709. */ - return 2; - } - - Result SocVoltAsm(u32 *compareSpeedos) { - using namespace _asm::field; - - constexpr u32 VoltageScanLimit = 10; - /* Might actually be speedo id. */ - u32 *writeProcessId = _asm::ScanAssembly(compareSpeedos, VoltageScanLimit, SocVoltWriteProcessIdAsm, Rd); - R_UNLESS(writeProcessId != nullptr, ldr::ResultInvalidSocVoltPattern()); - u8 writeProcessIdRd = _asm::Get(*writeProcessId, Rd); - - /* This writes 1050mV. */ - u32 *writeVoltage = _asm::ScanAssembly(writeProcessId, VoltageScanLimit, SocVoltWriteVoltageAsm, Rd); - R_UNLESS(writeVoltage != nullptr, ldr::ResultInvalidSocVoltPattern()); - u8 writeVoltageRd = _asm::Get(*writeVoltage, Rd); - - /* A csel instruction is used to select the soc voltage limit register. */ - /* We care about its destination register since that is used for verification. */ - constexpr u32 VoltageSelectScanLimit = 24; - u32 *selectVoltage = _asm::ScanAssembly(writeVoltage, VoltageSelectScanLimit, SocVoltSelectRegisterAsm, Rd, Rn, Rm); - R_UNLESS(selectVoltage != nullptr, ldr::ResultInvalidSocVoltPattern()); - /* Todo: check rm and rn? */ - u8 selectVoltageRd = _asm::Get(*selectVoltage, Rd); - - /* rdCsel is then multiplied by 1000 to convert to uV. */ - /* This is pretty far down the function. */ - constexpr u32 MultiplierScanLimit = 200; - u32 *multiplier = _asm::ScanAssembly(selectVoltage, MultiplierScanLimit, SocVoltMultiplyVoltsAsm, Rd, Rn, Rm); - R_UNLESS(multiplier != nullptr, ldr::ResultInvalidSocVoltPattern()); - u8 multiplierRn = _asm::Get(*multiplier, Rn); - u8 multiplierRm = _asm::Get(*multiplier, Rm); - /* One of the two registers has to be rdCsel. */ - R_UNLESS((multiplierRn == selectVoltageRd) || (multiplierRm == selectVoltageRd), ldr::ResultInvalidSocVoltPattern()); - u8 multiplierRd = _asm::Get(*multiplier, Rd); - - /* Subs instruction is then used to verify against absolute limit. */ - /* NB: Rn is written into the pattern and then ignored by the comparison; only Rm is matched. */ - u32 limitValidationPattern = _asm::Set(SocVoltValidateLimitAsm, Rn, multiplierRd); - u32 *limitValidation = _asm::ScanAssembly(multiplier, VoltageScanLimit, limitValidationPattern, Rd, Rn); - R_UNLESS(limitValidation != nullptr, ldr::ResultInvalidSocVoltPattern()); - - /* There is a b.gt instruction right after (checks for socVoltageCap < socVoltageMax). */ - u32 *branchToAbort = limitValidation + 1; - R_UNLESS(_asm::Ignoring(*branchToAbort, SocVoltBranchToAbortAsm, Imm19), ldr::ResultInvalidSocVoltPattern()); - - if (!C.marikoSocVmax || C.marikoSocVmax <= 1000) { - R_SKIP(); - } - - /* Adjust 1598 speedo minimum to ensure it always goes down process id 0 branch. */ - /* 2200 should be high enough :D */ - u32 compareSpeedosPatch = _asm::Set(*compareSpeedos, Imm12, 2200); - PATCH_OFFSET(compareSpeedos, compareSpeedosPatch); - - u32 socSpeedo = 0; - R_TRY(GetSocSpeedo(socSpeedo)); - - /* Adjust processId from 0 to [process id of switch booting this]. */ - /* We're overwriting the orr instruction entirly. */ - u32 processId = GetSocProcessId(socSpeedo); - u32 writeProcessIdPatch = _asm::Encode(_asm::op::MovzW, {Rd, writeProcessIdRd}, {Imm16, processId}); - PATCH_OFFSET(writeProcessId, writeProcessIdPatch); - - /* Adjust voltage limit. */ - u32 voltageLimitPatch = _asm::Encode(_asm::op::MovzW, {Rd, writeVoltageRd}, {Imm16, C.marikoSocVmax}); - PATCH_OFFSET(writeVoltage, voltageLimitPatch); - - /* Branches to an abort if limits are invalid -- we patch the branch instruction with NOP. */ - PATCH_OFFSET(branchToAbort, _asm::NopIns); - - R_SUCCEED(); - } - - Result SocVoltLimit(u32 *ptr) { - R_UNLESS(!std::memcmp(ptr - SocVoltLimitMaxDefaultIndex, socVoltLimitArray, sizeof(socVoltLimitArray)), ldr::ResultInvalidSocVoltLimit()); - if (!C.marikoSocVmax || C.marikoSocVmax <= SocVoltLimitOfficial) { - R_SKIP(); - } - - constexpr u32 Step = 25; - u32 maxVolt = C.marikoSocVmax; - if (maxVolt % Step) { - maxVolt = maxVolt / Step * Step; /* Round. */ - } - - u32 volt = SocVoltLimitOfficial; - for (u32 i = 1; i < DvfsTableEntryCount - SocVoltLimitMaxDefaultIndex && volt < maxVolt; ++i) { - volt += Step; - PATCH_OFFSET(ptr + i, volt); - } - - R_SUCCEED(); - } - - Result EmcRateSessLimit(u32 *ptr) { - u32 movzI = 0; - R_UNLESS(EmcRateSessFindClamp(ptr, nullptr, nullptr, &movzI), ldr::ResultInvalidEmcRateList()); - - /* Reject cmd11 GetDvfsTable. */ - for (u32 i = 1; i <= 24; ++i) { - const u32 w = ptr[i]; - if (_asm::IsOp(w, _asm::op::SubImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) - && _asm::Get(w, _asm::field::Rn) == _asm::reg::Fp && _asm::Get(w, _asm::field::Imm12) >= 0x20u) { /* sub x?,x29,#>=0x20 */ - R_THROW(ldr::ResultInvalidEmcRateList()); - } - } - - /* mov x,x2 */ - u32 descReg = 0xFFu; - for (u32 i = 1; i <= 24; ++i) { - if (_asm::Ignoring(ptr[i], _asm::MovReg64(0, 2), _asm::field::Rd)) { descReg = _asm::Get(ptr[i], _asm::field::Rd); break; } - } - R_UNLESS(descReg != 0xFFu, ldr::ResultInvalidEmcRateList()); - - /* Repoint the duplicated-imm pair */ - u32 *adds[8]; u32 addImm[8]; u32 nAdds = 0; - for (u32 i = 1; i <= 24 && nAdds < 8; ++i) { - const u32 w = ptr[i]; - if (_asm::IsOp(w, _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(w, _asm::field::Rn) == _asm::reg::Sp) { /* add x?,sp,#imm12 (shift 0) */ - adds[nAdds] = ptr + i; - addImm[nAdds] = _asm::Get(w, _asm::field::Imm12); - ++nAdds; - } - } - u32 patched = 0; - for (u32 a = 0; a < nAdds; ++a) { - bool dup = false; - for (u32 b = 0; b < nAdds; ++b) { - if (a != b && addImm[a] == addImm[b]) { dup = true; break; } - } - if (dup) { - PATCH_OFFSET(adds[a], _asm::Encode(_asm::op::LdrImm64, {_asm::field::Rt, _asm::Get(*adds[a], _asm::field::Rd)}, - {_asm::field::Rn, descReg}, - {_asm::field::Off8, 0})); /* ldr x?,[x] */ - ++patched; - } - } - R_UNLESS(patched == 2, ldr::ResultInvalidEmcRateList()); - - /* min(maxCount, 32) -> min(maxCount, EmcDvfsTableEntryCount) */ - PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); /* cmp w?,#64 */ - PATCH_OFFSET(ptr + movzI, _asm::Set(*(ptr + movzI), _asm::field::Imm16, EmcDvfsTableEntryCount)); /* movz w?,#64 */ - R_SUCCEED(); - } - - Result SharedClkBusInstallHooks(HookPayloadData *data) { - R_UNLESS(busInitCache.site != nullptr, ldr::ResultInvalidBusFreqReloc()); - - uintptr_t originalFn = 0; - R_TRY(INSTALL_IMPL_HOOK_ORIG(busInitCache.site, BusFreqExtendImpl, &originalFn)); - data->busData.originalFnCallback = originalFn; - data->busData.next = reinterpret_cast(Hooks().ToVa(data->busData.table[0])); - - R_SUCCEED(); - } - Result InstallHooks() { R_TRY(Hooks().CheckEnabled()); @@ -605,16 +49,7 @@ namespace ams::ldr::hoc::pcv::mariko { R_TRY(SharedClkBusInstallHooks(data)); #if HOC_UART_LOG - if (nvLogCache.nvlog_addr != 0) { - R_DISCARD(InstallNvLogRedirect()); - } - - if (forceVerbosityCache.count != 0 && C.pcvLogVerbosity != 0xff) { - data->verbosityLevel = C.pcvLogVerbosity; - for (u32 i = 0; i < forceVerbosityCache.count; ++i) { - R_DISCARD(INSTALL_IMPL_HOOK(forceVerbosityCache.sites[i], ForceVerbosityImpl)); - } - } + R_TRY(ForceVebosityInstallHooks(data)); #endif R_SUCCEED(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index a3381515..0bc99c18 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -40,152 +40,6 @@ namespace ams::ldr::hoc::pcv::mariko { }; DECLARE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); - extern u32 *nsoStart; - - struct DvbEntry { - u64 freq; - u32 volt[4] = {}; - }; - - constexpr DvbEntry EmcDvbTableDefault[] = { - { 204000, { 637, 637, 637, } }, - { 408000, { 637, 637, 637, } }, - { 800000, { 637, 637, 637, } }, - { 1065600, { 637, 637, 637, } }, - { 1331200, { 650, 637, 637, } }, - { 1600000, { 675, 650, 637, } }, - }; - - /* Movz */ - /* - SF | OPC | HW | Imm16 | RD - 31 | 30 29 28 27 26 25 24 23 | 22 21 | 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 | 4 3 2 1 0 - */ - constexpr u32 SocVoltCompareSpeedoAsm = 0x7118FAFF; /* subs imm, compares to >=1598 max speedo and then goes down process id 1 route. */ - constexpr u32 SocVoltWriteProcessIdAsm = 0x2A1F03F4; /* orr, writes id 0. */ - constexpr u32 SocVoltWriteVoltageAsm = 0x52808358; /* Movz imm, writes 1050mV. */ - constexpr u32 SocVoltSelectRegisterAsm = 0x1A9A3118; /* Csel, selects the voltage -- we need the register of this. */ - constexpr u32 SocVoltMultiplyVoltsAsm = 0x1B1A7F0B; /* Mul, converts from mV -> uV */ - constexpr u32 SocVoltValidateLimitAsm = 0x6B0A017F; /* Subs, checks limits */ - constexpr u32 SocVoltBranchToAbortAsm = 0x540020AC; /* B.ge Branches to abort if limits are invalid. */ - - ALWAYS_INLINE bool SocVoltPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, SocVoltCompareSpeedoAsm, _asm::field::Rd); - } - - constexpr u32 SocVoltLimitOfficial = 1050; - constexpr u32 SocVoltLimitMaxDefaultIndex = 17; - static const u32 socVoltLimitArray[DvfsTableEntryCount] = { 637, 650, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1025, 1050, }; - - constexpr u32 EmcCountCmpAsm = 0x7100851F; /* cmp w?,#0x21 (subs wzr,w?,#0x21) */ - - /* - str ,[,#0x120] ; volt-array pointer - str w?, [,#0x154] ; num_freqs - */ - constexpr u32 EmcSocLutPtrStoreAsm = 0xF9009009; /* str x?,[x0,#0x120] (anchor) */ - constexpr u32 EmcSocLutCountStoreAsm = 0xB9015408; /* str w?,[x0,#0x154] (anchor) */ - constexpr u32 EmcSocFreqStoreAsm = 0xF9000D00; /* str x?,[x8,#0x18] */ - constexpr u32 EmcSocVoltStoreAsm = 0xB9004900; /* str w?,[x8,#0x48] (socMinLut[i]) */ - constexpr u32 EmcSocReadLoadAsm = 0xB9404929; /* ldr w?,[x9,#0x48] (socMinLut) */ - - inline bool EmcDvfsCountPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, EmcCountCmpAsm, _asm::field::Rd); - } - - inline bool EmcSocLutPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, EmcSocLutPtrStoreAsm, _asm::field::Rt); /* str x?,[x0,#0x120] */ - } - - /* - mov w?,#0x20 ; the 32 cap - cmp w?,#0x20 - csel w?,w?,w?,lt ; w? = min(maxCount, 32) - bl TegraGetEmcDvfsFreqTable - - cmp w?,#0x20 ; (maxCount) - csel w?,,,lt ; min(maxCount, 32) - bl <_asm::Get*DvfsFreqTable> - */ - constexpr u32 EmcRateCapCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ - constexpr u32 EmcRateCapCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt */ - - inline bool EmcRateListPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, EmcRateCapCmpAsm, _asm::field::Rd, _asm::field::Rn); - } - - constexpr u32 EmcRateSessCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ - constexpr u32 EmcRateSessMovAsm = 0x52800400; /* movz w?,#0x20 */ - constexpr u32 EmcRateSessCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt (opcode + cond) */ - - inline bool EmcRateSessFindClamp(u32 *ptr, u32 *out_c, u32 *out_cap, u32 *out_movz_i) { - const u32 c = _asm::Get(ptr[0], _asm::field::Rn); - for (u32 i = 1; i <= 14; ++i) { - const u32 w = ptr[i]; - if (_asm::Ignoring(w, EmcRateSessCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) && _asm::Get(w, _asm::field::Rn) == c && _asm::Get(w, _asm::field::Rd) == c) { - const u32 cap = _asm::Get(w, _asm::field::Rm); - for (u32 j = 1; j < i; ++j) { - if (_asm::Ignoring(ptr[j], EmcRateSessMovAsm, _asm::field::Rd) && _asm::Get(ptr[j], _asm::field::Rd) == cap) { - if (out_c) *out_c = c; - if (out_cap) *out_cap = cap; - if (out_movz_i) *out_movz_i = j; - return true; - } - } - return false; - } - } - return false; - } - - inline bool EmcRateSessPatternFn(u32 *ptr) { - return _asm::Ignoring(*ptr, EmcRateSessCmpAsm, _asm::field::Rd, _asm::field::Rn); - } - - inline bool BusFreqRelocPatternFn(u32 *ptr) { - if (g_pcv_cave == 0) { - return false; - } - if (reinterpret_cast(ptr + 4) > g_pcv_cave) { /* the call site lives in .text */ - return false; - } - return _asm::IsOp(*ptr, _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) - && _asm::Get(*ptr, _asm::field::Off8) == 0x10; /* ldr Xbuf,[Xbus,#0x10] */ - } - - inline bool ForceVerbosityPatternFn(u32 *ptr) { - if (g_pcv_cave == 0) { - return false; - } - if (reinterpret_cast(ptr + 11) > g_pcv_cave) { /* .text only */ - return false; - } - return _asm::IsFramePushPre(*ptr); - } - - /* - sub sp, sp, #imm - stp x29,x30,[sp,#imm] - str x?, [sp,#imm] - add x29,sp, #imm - subs xzr, x1, #0 - */ - constexpr u32 NvLogSubSpAsm = 0xD10003FFu; /* sub sp,sp,#0 */ - constexpr u32 NvLogStpFpLrAsm = 0xA9007BFDu; /* stp x29,x30,[sp,#0] */ - constexpr u32 NvLogStrSpillAsm = 0xF90003E0u; /* str x?,[sp,#0] */ - constexpr u32 NvLogMovFpAsm = 0x910003FDu; /* add x29,sp,#0 */ - constexpr u32 NvLogCmpSizeAsm = 0xF100003Fu; /* subs xzr,x1,#0 */ - - inline bool NvLogVsnprintfPatternFn(u32 *ptr) { - if (HOC_UART_LOG == 0 || g_pcv_cave == 0) { - return false; - } - if (reinterpret_cast(ptr + 5) > g_pcv_cave) { /* must sit in .text */ - return false; - } - return _asm::Ignoring(*ptr, NvLogSubSpAsm, _asm::field::Imm12); - } - void Patch(uintptr_t mapped_nso, size_t nso_size); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp new file mode 100644 index 00000000..5f24e677 --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "../pcv.hpp" +#include "pcv_mariko_log.hpp" + +namespace ams::ldr::hoc::pcv::mariko { + + /* Todo: Remove this bs. */ + [[maybe_unused]] static uintptr_t CaveReserve(size_t count) { + return reinterpret_cast(Hooks().Reserve(count)); + } + + #if HOC_UART_LOG + namespace { + struct { + uintptr_t vsnprintf_addr = 0; + uintptr_t nvlog_addr = 0; + } nvLogCache; + } + + Result NvLogUartRedirect(u32 *ptr) { + const uintptr_t mapped_nso = reinterpret_cast(nsoStart); + const size_t nso_size = g_nso_size; + const uintptr_t textEnd = g_pcv_cave; /* .text ends where the cave begins */ + const uintptr_t vsnprintf_addr = reinterpret_cast(ptr); + + { + using namespace _asm::field; + R_UNLESS(_asm::Ignoring(ptr[1], NvLogStpFpLrAsm, PairOff8), ldr::ResultInvalidNvLogRedirect()); /* stp x29,x30,[sp,#imm] */ + R_UNLESS(_asm::Ignoring(ptr[2], NvLogStrSpillAsm, Rt, Off8), ldr::ResultInvalidNvLogRedirect()); /* str x?,[sp,#imm] */ + R_UNLESS(_asm::Ignoring(ptr[3], NvLogMovFpAsm, Imm12), ldr::ResultInvalidNvLogRedirect()); /* add x29,sp,#imm */ + R_UNLESS(ptr[4] == NvLogCmpSizeAsm, ldr::ResultInvalidNvLogRedirect()); /* cmp x1,#0 */ + } + + /* NvLog via the VDD_SOC log */ + static const char Fmt[] = "%s(%s): DVFS request VDD_SOC %d mV\n"; + constexpr size_t FmtLen = sizeof(Fmt) - 1; + uintptr_t strAddr = 0; + { + const char *hay = reinterpret_cast(mapped_nso); + for (size_t i = 0; i + FmtLen <= nso_size; ++i) { + if (std::memcmp(hay + i, Fmt, FmtLen) == 0) { strAddr = mapped_nso + i; break; } + } + } + if (strAddr == 0) { + LOGGING("NvLogRedirect: fmt string not found (vsnprintf@+%lx)", vsnprintf_addr - mapped_nso); + R_THROW(ldr::ResultInvalidNvLogRedirect()); + } + + uintptr_t nvlog_addr = 0; + for (u32 *p = nsoStart; reinterpret_cast(p + 2) <= textEnd; ++p) { + const uintptr_t pc = reinterpret_cast(p); + if (!_asm::IsOp(p[0], _asm::op::Adrp, _asm::field::Rd, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo)) { + continue; + } + if (_asm::TargetAdrp(p[0], pc) != (strAddr & ~static_cast(0xFFFu))) { + continue; + } + const u32 adrpReg = _asm::Get(p[0], _asm::field::Rd); + if (!(_asm::IsOp(p[1], _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) + && _asm::Get(p[1], _asm::field::Rd) == adrpReg && _asm::Get(p[1], _asm::field::Rn) == adrpReg + && _asm::Get(p[1], _asm::field::Imm12) == (strAddr & 0xFFFu))) { + continue; + } + for (u32 k = 2; k <= 12 && (pc + (k + 1) * 4) <= textEnd; ++k) { + if (_asm::IsOp(p[k], _asm::op::Bl, _asm::field::Imm26)) { nvlog_addr = _asm::Target26(p[k], pc + k * 4); break; } + } + if (nvlog_addr != 0) { + break; + } + } + if (nvlog_addr == 0 || nvlog_addr < mapped_nso || nvlog_addr >= textEnd) { + LOGGING("NvLogRedirect: NvLog entry not found (fmt@+%lx)", strAddr - mapped_nso); + R_THROW(ldr::ResultInvalidNvLogRedirect()); + } + + nvLogCache.vsnprintf_addr = vsnprintf_addr; + nvLogCache.nvlog_addr = nvlog_addr; + R_SUCCEED(); + } + + namespace { + Result InstallNvLogRedirect() { + const uintptr_t mapped_nso = reinterpret_cast(nsoStart); + const uintptr_t textEnd = g_pcv_cave; + const uintptr_t vsnprintf_addr = nvLogCache.vsnprintf_addr; + const uintptr_t nvlog_addr = nvLogCache.nvlog_addr; + + const uintptr_t helper = CaveReserve(40); + if (helper == 0) { + LOGGING("NvLogRedirect: cave unavailable (cave=%lx size=%lx)", + static_cast(g_pcv_cave), static_cast(g_pcv_cave_size)); + R_THROW(ldr::ResultInvalidNvLogRedirect()); + } + u32 *t = reinterpret_cast(helper); + size_t n = 0; + auto emit = [&](u32 ins) { t[n] = ins; ++n; }; + + using namespace _asm::field; + constexpr u32 SP = _asm::reg::Sp; + + emit(_asm::Encode(_asm::op::SubImm64, {Rd, SP}, {Rn, SP}, {Imm12, 0x200})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 0}, {Rt2, 1}, {Rn, SP}, {PairOff8, 0x100})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 2}, {Rt2, 3}, {Rn, SP}, {PairOff8, 0x110})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 4}, {Rt2, 5}, {Rn, SP}, {PairOff8, 0x120})); + emit(_asm::Encode(_asm::op::StpImm64, {Rt, 6}, {Rt2, 7}, {Rn, SP}, {PairOff8, 0x130})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 0}, {Rt2, 1}, {Rn, SP}, {PairOff16, 0x140})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 2}, {Rt2, 3}, {Rn, SP}, {PairOff16, 0x160})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 4}, {Rt2, 5}, {Rn, SP}, {PairOff16, 0x180})); + emit(_asm::Encode(_asm::op::StpImmQ, {Rt, 6}, {Rt2, 7}, {Rn, SP}, {PairOff16, 0x1A0})); + emit(_asm::Encode(_asm::op::StrImm64, {Rt, _asm::reg::Lr}, {Rn, SP}, {Off8, 0x1E0})); + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x200})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1C0})); /* __stack */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x140})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1C8})); /* __gr_top */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 9}, {Rn, SP}, {Imm12, 0x1C0})); emit(_asm::Encode(_asm::op::StrImm64, {Rt, 9}, {Rn, SP}, {Off8, 0x1D0})); /* __vr_top */ + emit(_asm::Encode(_asm::op::MovnW, {Rd, 9}, {Imm16, 0x37})); emit(_asm::Encode(_asm::op::StrImm32, {Rt, 9}, {Rn, SP}, {Off4, 0x1D8})); /* __gr_offs = -56 */ + emit(_asm::Encode(_asm::op::MovnW, {Rd, 9}, {Imm16, 0x7F})); emit(_asm::Encode(_asm::op::StrImm32, {Rt, 9}, {Rn, SP}, {Off4, 0x1DC})); /* __vr_offs = -128 */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 0}, {Rn, SP}, {Imm12, 0x00})); /* mov x0,sp (buf) */ + emit(_asm::Encode(_asm::op::MovzW, {Rd, 1}, {Imm16, 0x100})); /* size = 0x100 */ + emit(_asm::Encode(_asm::op::LdrImm64, {Rt, 2}, {Rn, SP}, {Off8, 0x100})); /* fmt (saved x0) */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 3}, {Rn, SP}, {Imm12, 0x1C0})); /* ap */ + emit(_asm::Retarget26(_asm::op::Bl, helper + n * 4, vsnprintf_addr)); + emit(_asm::MovReg64(1, 0)); /* len = retval */ + emit(_asm::CmpImm32(1, 0x100)); + { /* b.lo +2 */ + const size_t at = n; + emit(_asm::Retarget19(_asm::Encode(_asm::op::BCond, {BCond, _asm::cond::Lo}), helper + at * 4, helper + (at + 2) * 4)); + } + emit(_asm::Encode(_asm::op::MovzW, {Rd, 1}, {Imm16, 0xFF})); /* clamp len */ + emit(_asm::Encode(_asm::op::AddImm64, {Rd, 0}, {Rn, SP}, {Imm12, 0x00})); /* mov x0,sp (str) */ + emit(_asm::Encode(_asm::op::Svc, {Imm16, 0x27})); /* svcOutputDebugString */ + emit(_asm::Encode(_asm::op::LdrImm64, {Rt, _asm::reg::Lr}, {Rn, SP}, {Off8, 0x1E0})); + emit(_asm::Encode(_asm::op::AddImm64, {Rd, SP}, {Rn, SP}, {Imm12, 0x200})); + emit(_asm::RetIns); + + /* Redirect the call sites as patching the actual function causes crash */ + const uintptr_t roStart = g_pcv_cave + g_pcv_cave_size; /* module .rodata start */ + size_t patchedSites = 0; + for (u32 *p = nsoStart; reinterpret_cast(p + 1) <= textEnd; ++p) { + if (!_asm::IsOp(*p, _asm::op::Bl, _asm::field::Imm26)) { + continue; + } + const uintptr_t pc = reinterpret_cast(p); + if (_asm::Target26(*p, pc) != nvlog_addr) { + continue; + } + bool isFmtCall = false; + for (u32 j = 1; j <= 8 && reinterpret_cast(p - j) >= reinterpret_cast(nsoStart); ++j) { + const u32 w = *(p - j); + if (_asm::IsOp(w, _asm::op::Adrp, _asm::field::Rd, _asm::field::ImmAdrpHi, _asm::field::ImmAdrpLo) && _asm::Get(w, _asm::field::Rd) == 0) { /* adrp x0, */ + const uintptr_t tgtPage = _asm::TargetAdrp(w, pc - j * 4); + if (tgtPage >= (roStart & ~static_cast(0xFFFu))) { isFmtCall = true; break; } + } + } + if (isFmtCall) { + PATCH_OFFSET(p, _asm::Retarget26(_asm::op::Bl, pc, helper)); + ++patchedSites; + } + } + + LOGGING("NvLogRedirect: stub@+%lx vsnprintf@+%lx helper@+%lx instr=%zu sites=%zu", nvlog_addr - mapped_nso, vsnprintf_addr - mapped_nso, helper - mapped_nso, n, patchedSites); + R_SUCCEED(); + } + } + + namespace { + struct { + u32 *sites[3] = {}; + u32 count = 0; + } forceVerbosityCache; + } + + HOOK_PAYLOAD_FN u32 ForceVerbosityImpl() { + HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); + return data->verbosityLevel; + } + + /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ + Result ForceVerbosity(u32 *ptr) { + using namespace _asm::field; + + R_UNLESS(_asm::IsOp(ptr[1], _asm::op::StrImm64, Rt, Rn, Off8) && _asm::Get(ptr[1], Rn) == _asm::reg::Sp, + ldr::ResultInvalidForceVerbosityPattern()); /* str x?,[sp,#imm] */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::AddImm64, Rd, Rn, Imm12) + && _asm::Get(ptr[2], Rd) == _asm::reg::Fp && _asm::Get(ptr[2], Rn) == _asm::reg::Sp, + ldr::ResultInvalidForceVerbosityPattern()); /* add x29,sp,#imm */ + R_UNLESS(_asm::IsOp(ptr[3], _asm::op::AddImm64, Rn, Imm12) + && _asm::Get(ptr[3], Rd) == 0 && _asm::Get(ptr[3], Rn) == _asm::reg::Fp, + ldr::ResultInvalidForceVerbosityPattern()); /* add x0,x29,#imm */ + R_UNLESS(_asm::IsOp(ptr[4], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[4], Rn) == _asm::reg::Fp, + ldr::ResultInvalidForceVerbosityPattern()); /* add x?,x29,#imm */ + R_UNLESS(_asm::Get(ptr[3], Imm12) == _asm::Get(ptr[4], Imm12) + && _asm::IsOp(ptr[5], _asm::op::Bl, Imm26), + ldr::ResultInvalidForceVerbosityPattern()); + + bool foundCmp = false; + for (u32 j = 6; j <= 10; ++j) { + if (ptr[j] == 0x7100001Fu) { /* cmp w0,#0 */ + foundCmp = true; + break; + } + } + R_UNLESS(foundCmp, ldr::ResultInvalidForceVerbosityPattern()); + + R_UNLESS(forceVerbosityCache.count < std::size(forceVerbosityCache.sites), ldr::ResultInvalidForceVerbosityPattern()); + forceVerbosityCache.sites[forceVerbosityCache.count++] = ptr; + R_SUCCEED(); + } + + Result ForceVebosityInstallHooks(HookPayloadData *data) { + if (nvLogCache.nvlog_addr != 0) { + R_TRY(InstallNvLogRedirect()); + } + + if (forceVerbosityCache.count != 0 && C.pcvLogVerbosity != 0xff) { + data->verbosityLevel = C.pcvLogVerbosity; + for (u32 i = 0; i < forceVerbosityCache.count; ++i) { + R_DISCARD(INSTALL_IMPL_HOOK(forceVerbosityCache.sites[i], ForceVerbosityImpl)); + } + } + } +#endif + +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.hpp new file mode 100644 index 00000000..f9855e19 --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.hpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "../pcv.hpp" + +namespace ams::ldr::hoc::pcv::mariko { + + extern u32 *nsoStart; + extern size_t g_nso_size; + + inline bool ForceVerbosityPatternFn(u32 *ptr) { + if (g_pcv_cave == 0) { + return false; + } + if (reinterpret_cast(ptr + 11) > g_pcv_cave) { /* .text only */ + return false; + } + return _asm::IsFramePushPre(*ptr); + } + + /* + sub sp, sp, #imm + stp x29,x30,[sp,#imm] + str x?, [sp,#imm] + add x29,sp, #imm + subs xzr, x1, #0 + */ + constexpr u32 NvLogSubSpAsm = 0xD10003FFu; /* sub sp,sp,#0 */ + constexpr u32 NvLogStpFpLrAsm = 0xA9007BFDu; /* stp x29,x30,[sp,#0] */ + constexpr u32 NvLogStrSpillAsm = 0xF90003E0u; /* str x?,[sp,#0] */ + constexpr u32 NvLogMovFpAsm = 0x910003FDu; /* add x29,sp,#0 */ + constexpr u32 NvLogCmpSizeAsm = 0xF100003Fu; /* subs xzr,x1,#0 */ + + inline bool NvLogVsnprintfPatternFn(u32 *ptr) { + if (HOC_UART_LOG == 0 || g_pcv_cave == 0) { + return false; + } + if (reinterpret_cast(ptr + 5) > g_pcv_cave) { /* must sit in .text */ + return false; + } + return _asm::Ignoring(*ptr, NvLogSubSpAsm, _asm::field::Imm12); + } + + Result NvLogUartRedirect(u32 *ptr); + HOOK_PAYLOAD_FN u32 ForceVerbosityImpl(); + Result ForceVerbosity(u32 *ptr); + Result ForceVebosityInstallHooks(HookPayloadData *data); + +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 3f41ecf4..21c6a2a7 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -673,4 +673,56 @@ namespace ams::ldr::hoc::pcv::mariko { R_SUCCEED(); } + Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { + struct { + u8 reg; + u8 val; + } __attribute__((packed)) cmd; + + I2cSession _session; + R_TRY(i2cOpenSession(&_session, dev)); + + cmd.reg = reg; + cmd.val = val; + Result res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + i2csessionClose(&_session); + + return res; + } + + Result EmcVddqVolt(u32 *ptr) { + regulator *entry = reinterpret_cast(reinterpret_cast(ptr) - offsetof(regulator, type_2_3.default_uv)); + + constexpr u32 uv_step = 5'000; + constexpr u32 uv_min = 250'000; + + auto validator = [entry]() { + R_UNLESS(entry->id == 2, ldr::ResultInvalidRegulatorEntry()); + R_UNLESS(entry->type == 3, ldr::ResultInvalidRegulatorEntry()); + R_UNLESS(entry->type_2_3.step_uv == uv_step, ldr::ResultInvalidRegulatorEntry()); + R_UNLESS(entry->type_2_3.min_uv == uv_min, ldr::ResultInvalidRegulatorEntry()); + R_SUCCEED(); + }; + + R_TRY(validator()); + + u32 emc_uv = C.marikoEmcVddqVolt; + + if (!emc_uv) { + R_SKIP(); + } + + if (emc_uv % uv_step) { + emc_uv = (emc_uv + uv_step - 1) / uv_step * uv_step; // rounding + } + + PATCH_OFFSET(ptr, emc_uv); + + i2cInitialize(); + Result resultI2C = I2cSet_U8(I2cDevice_Max77812_2, 0x25, (emc_uv - uv_min) / uv_step); + i2cExit(); + + return resultI2C; + } + } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index ff05dbf5..f9c2826c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -26,6 +26,22 @@ namespace ams::ldr::hoc::pcv::mariko { + extern u32 *nsoStart; + + struct DvbEntry { + u64 freq; + u32 volt[4] = {}; + }; + + constexpr DvbEntry EmcDvbTableDefault[] = { + { 204000, { 637, 637, 637, } }, + { 408000, { 637, 637, 637, } }, + { 800000, { 637, 637, 637, } }, + { 1065600, { 637, 637, 637, } }, + { 1331200, { 650, 637, 637, } }, + { 1600000, { 675, 650, 637, } }, + }; + constexpr u32 EmcListDefault[] = { 204000, 1331200, 1600000, }; constexpr u32 EmcListSizeDefault = std::size(EmcListDefault); constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1; @@ -185,5 +201,6 @@ namespace ams::ldr::hoc::pcv::mariko { Result MemFreqDvbTable(u32 *ptr); Result MemFreqMax(u32 *ptr); Result MemMtcTableAsm(u32 *ptr); + Result EmcVddqVolt(u32 *ptr); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp new file mode 100644 index 00000000..432a7fab --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp @@ -0,0 +1,325 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "../pcv.hpp" +#include "pcv_mariko_soc.hpp" + +namespace ams::ldr::hoc::pcv::mariko { + + namespace { + + struct { + u32 *site = nullptr; + } busInitCache; + + Result GetSocSpeedo(u32 &socSpeedo) { + constexpr u64 FusePhysicalAddress = 0x7000F000; + u64 virtualAddress = 0; + constexpr u64 Size = 0x1000; + + u64 outSize; + /* TODO: use svc::QueryMemoryMapping instead. */ + R_TRY(svcQueryMemoryMapping(&virtualAddress, &outSize, FusePhysicalAddress, Size)); + + constexpr u32 FuseOffset = 2048; + constexpr u32 SocSpeedoOffset = 308; + socSpeedo = *reinterpret_cast(virtualAddress + FuseOffset + SocSpeedoOffset); + + R_SUCCEED(); + } + + u32 GetSocProcessId(u32 socSpeedo) { + if (socSpeedo <= 1597) { + return 0; + } + + if (socSpeedo <= 1708) { + return 1; + } + + /* >= 1709. */ + return 2; + } + + } + + Result SocVoltAsm(u32 *compareSpeedos) { + using namespace _asm::field; + + constexpr u32 VoltageScanLimit = 10; + /* Might actually be speedo id. */ + u32 *writeProcessId = _asm::ScanAssembly(compareSpeedos, VoltageScanLimit, SocVoltWriteProcessIdAsm, Rd); + R_UNLESS(writeProcessId != nullptr, ldr::ResultInvalidSocVoltPattern()); + u8 writeProcessIdRd = _asm::Get(*writeProcessId, Rd); + + /* This writes 1050mV. */ + u32 *writeVoltage = _asm::ScanAssembly(writeProcessId, VoltageScanLimit, SocVoltWriteVoltageAsm, Rd); + R_UNLESS(writeVoltage != nullptr, ldr::ResultInvalidSocVoltPattern()); + u8 writeVoltageRd = _asm::Get(*writeVoltage, Rd); + + /* A csel instruction is used to select the soc voltage limit register. */ + /* We care about its destination register since that is used for verification. */ + constexpr u32 VoltageSelectScanLimit = 24; + u32 *selectVoltage = _asm::ScanAssembly(writeVoltage, VoltageSelectScanLimit, SocVoltSelectRegisterAsm, Rd, Rn, Rm); + R_UNLESS(selectVoltage != nullptr, ldr::ResultInvalidSocVoltPattern()); + /* Todo: check rm and rn? */ + u8 selectVoltageRd = _asm::Get(*selectVoltage, Rd); + + /* rdCsel is then multiplied by 1000 to convert to uV. */ + /* This is pretty far down the function. */ + constexpr u32 MultiplierScanLimit = 200; + u32 *multiplier = _asm::ScanAssembly(selectVoltage, MultiplierScanLimit, SocVoltMultiplyVoltsAsm, Rd, Rn, Rm); + R_UNLESS(multiplier != nullptr, ldr::ResultInvalidSocVoltPattern()); + u8 multiplierRn = _asm::Get(*multiplier, Rn); + u8 multiplierRm = _asm::Get(*multiplier, Rm); + /* One of the two registers has to be rdCsel. */ + R_UNLESS((multiplierRn == selectVoltageRd) || (multiplierRm == selectVoltageRd), ldr::ResultInvalidSocVoltPattern()); + u8 multiplierRd = _asm::Get(*multiplier, Rd); + + /* Subs instruction is then used to verify against absolute limit. */ + /* NB: Rn is written into the pattern and then ignored by the comparison; only Rm is matched. */ + u32 limitValidationPattern = _asm::Set(SocVoltValidateLimitAsm, Rn, multiplierRd); + u32 *limitValidation = _asm::ScanAssembly(multiplier, VoltageScanLimit, limitValidationPattern, Rd, Rn); + R_UNLESS(limitValidation != nullptr, ldr::ResultInvalidSocVoltPattern()); + + /* There is a b.gt instruction right after (checks for socVoltageCap < socVoltageMax). */ + u32 *branchToAbort = limitValidation + 1; + R_UNLESS(_asm::Ignoring(*branchToAbort, SocVoltBranchToAbortAsm, Imm19), ldr::ResultInvalidSocVoltPattern()); + + if (!C.marikoSocVmax || C.marikoSocVmax <= 1000) { + R_SKIP(); + } + + /* Adjust 1598 speedo minimum to ensure it always goes down process id 0 branch. */ + /* 2200 should be high enough :D */ + u32 compareSpeedosPatch = _asm::Set(*compareSpeedos, Imm12, 2200); + PATCH_OFFSET(compareSpeedos, compareSpeedosPatch); + + u32 socSpeedo = 0; + R_TRY(GetSocSpeedo(socSpeedo)); + + /* Adjust processId from 0 to [process id of switch booting this]. */ + /* We're overwriting the orr instruction entirly. */ + u32 processId = GetSocProcessId(socSpeedo); + u32 writeProcessIdPatch = _asm::Encode(_asm::op::MovzW, {Rd, writeProcessIdRd}, {Imm16, processId}); + PATCH_OFFSET(writeProcessId, writeProcessIdPatch); + + /* Adjust voltage limit. */ + u32 voltageLimitPatch = _asm::Encode(_asm::op::MovzW, {Rd, writeVoltageRd}, {Imm16, C.marikoSocVmax}); + PATCH_OFFSET(writeVoltage, voltageLimitPatch); + + /* Branches to an abort if limits are invalid -- we patch the branch instruction with NOP. */ + PATCH_OFFSET(branchToAbort, _asm::NopIns); + + R_SUCCEED(); + } + + Result SocVoltLimit(u32 *ptr) { + R_UNLESS(!std::memcmp(ptr - SocVoltLimitMaxDefaultIndex, socVoltLimitArray, sizeof(socVoltLimitArray)), ldr::ResultInvalidSocVoltLimit()); + if (!C.marikoSocVmax || C.marikoSocVmax <= SocVoltLimitOfficial) { + R_SKIP(); + } + + constexpr u32 Step = 25; + u32 maxVolt = C.marikoSocVmax; + if (maxVolt % Step) { + maxVolt = maxVolt / Step * Step; /* Round. */ + } + + u32 volt = SocVoltLimitOfficial; + for (u32 i = 1; i < DvfsTableEntryCount - SocVoltLimitMaxDefaultIndex && volt < maxVolt; ++i) { + volt += Step; + PATCH_OFFSET(ptr + i, volt); + } + + R_SUCCEED(); + } + + HOOK_PAYLOAD_FN u64 BusFreqExtendImpl(SharedClkBus *bus) { + HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); + + u32 *table = data->busData.next; + bus->allowedFreqTable = table; + data->busData.next = table + EmcDvfsTableEntryCount; + + /* Call the original function. */ + return reinterpret_cast(data->busData.originalFnCallback)(bus); + } + + /* Relocate and extend C2/C3Bus to avoid issues (likely buffer overflow) */ + Result BusFreqReloc(u32 *ptr) { + using namespace _asm::field; + + const u32 bus = _asm::Get(ptr[0], Rn); + R_UNLESS(_asm::IsOp(ptr[1], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[1], Imm12) == 0x18 && _asm::Get(ptr[1], Rn) == bus, + ldr::ResultInvalidBusFreqReloc()); /* add Xcnt,Xbus,#0x18 */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::StrImm64, Rt, Rn, Off8) && _asm::Get(ptr[2], Off8) == 0x50 && _asm::Get(ptr[2], Rn) == bus, + ldr::ResultInvalidBusFreqReloc()); /* str Xrail,[Xbus,#0x50] */ + R_UNLESS(_asm::IsOp(ptr[3], _asm::op::Bl, Imm26), ldr::ResultInvalidBusFreqReloc()); /* bl GetDvfsRailUniqueFreqList */ + + constexpr u32 PrologueMargin = 140; + u32 *functionPrologue = _asm::FindFnPrologue(ptr, PrologueMargin, nsoStart); + R_UNLESS(functionPrologue != nullptr, ldr::ResultInvalidBusFreqReloc()); + + busInitCache.site = functionPrologue; + + R_SUCCEED(); + } + + /* Widen InitDram for a >32-entry EMC DVFS list. Freq array can be dropped to free 264 bytes, relocate the Soc LUT to that space */ + Result EmcSocLutReloc(u32 *ptr) { + constexpr u32 Window = 48; + + using namespace _asm::field; + + R_UNLESS(_asm::Ignoring(ptr[1], EmcSocLutCountStoreAsm, Rt), ldr::ResultInvalidEmcSocLut()); /* str w?,[x0,#0x154] */ + + u32 *freqStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocFreqStoreAsm, Rt); /* str x?,[x8,#0x18] */ + u32 *voltStore = _asm::ScanAssembly(ptr - Window, Window, EmcSocVoltStoreAsm, Rt); /* str w?,[x8,#0x48] */ + u32 *readLoad = _asm::ScanAssembly(ptr - Window, Window, EmcSocReadLoadAsm, Rt); /* ldr w?,[x9,#0x48] */ + R_UNLESS(freqStore && voltStore && readLoad, ldr::ResultInvalidEmcSocLut()); + + u32 *voltBase = voltStore - 2; /* `add Xb,Xsrc,Xi,LSL#2` (a cmn sits between it and store) */ + R_UNLESS(_asm::IsOp(*voltBase, _asm::op::AddShifted64, Rd, Rn, Rm, Imm6) && _asm::Get(*voltBase, Rd) == _asm::Get(*voltStore, Rn), ldr::ResultInvalidEmcSocLut()); + + /* adrp Xl ; add Xl,Xl,#off ; ... ; str Xl,[rail,#0x120] */ + const u32 lutReg = _asm::Get(ptr[0], Rt); + const u32 railReg = _asm::Get(ptr[0], Rn); + R_UNLESS(_asm::IsOp(ptr[-3], _asm::op::Adrp, Rd, ImmAdrpHi, ImmAdrpLo) && _asm::Get(ptr[-3], Rd) == lutReg, ldr::ResultInvalidEmcSocLut()); + R_UNLESS(_asm::IsOp(ptr[-2], _asm::op::AddImm64, Rd, Rn, Imm12) && _asm::Get(ptr[-2], Rd) == lutReg && _asm::Get(ptr[-2], Rn) == lutReg, ldr::ResultInvalidEmcSocLut()); + + const u32 srcBase = _asm::Get(*voltBase, Rn); /* rail ptr at +0x20 */ + const u32 wBase = _asm::Get(*voltBase, Rd); /* base reg */ + const u32 wIdx = _asm::Get(*voltBase, Rm); /* loop index */ + + PATCH_OFFSET(freqStore, _asm::NopIns); /* Unneeded */ + PATCH_OFFSET(voltBase, _asm::Encode(_asm::op::LdrImm64, {Rt, wBase}, {Rn, srcBase}, {Off8, 0x20})); /* ldr Xb,[Xsrc,#0x20] (rail) */ + PATCH_OFFSET(voltStore - 1, _asm::Encode(_asm::op::AddImm64, {Rd, wBase}, {Rn, wBase}, {Imm12, 0x18})); /* add Xb,Xb,#0x18 (was cmn) */ + PATCH_OFFSET(voltStore, _asm::ToRegOffset(*voltStore, wIdx)); /* str Wv,[Xb,Xi,LSL#2] -> rail+0x18+i*4 */ + PATCH_OFFSET(voltStore + 1, _asm::NopIns); /* Unneeded */ + + /* rail+0x18 as the socMinLut pointer. */ + PATCH_OFFSET(ptr - 3, _asm::NopIns); + PATCH_OFFSET(ptr - 2, _asm::Encode(_asm::op::AddImm64, {Rd, lutReg}, {Rn, railReg}, {Imm12, 0x18})); /* add Xl,rail,#0x18 */ + + /* Drop the abort branch in case of a bad read */ + for (u32 i = 1; i <= 4; ++i) { + if (_asm::IsOp(readLoad[i], _asm::op::BCond, Imm19, BCond)) { + PATCH_OFFSET(&readLoad[i], _asm::NopIns); + break; + } + } + R_SUCCEED(); + } + + Result EmcDvfsCountLimit(u32 *ptr) { + R_UNLESS(_asm::IsOp(*(ptr - 1), _asm::op::Cbz, _asm::field::Imm19, _asm::field::Rt), ldr::ResultInvalidEmcDvfsCount()); /* cbz w?, */ + R_UNLESS(_asm::Ignoring(*(ptr + 1), _asm::Encode(_asm::op::BCond, {_asm::field::BCond, _asm::cond::Cs}), _asm::field::Imm19), + ldr::ResultInvalidEmcDvfsCount()); /* b.cs */ + + /* cmp w?,#0x21 -> cmp w?,#EmcDvfsTableEntryCount */ + PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); + R_SUCCEED(); + } + + Result EmcRateListLimit(u32 *ptr) { + R_UNLESS(_asm::Ignoring(ptr[1], EmcRateCapCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) + && _asm::Get(ptr[0], _asm::field::Rn) == _asm::Get(ptr[1], _asm::field::Rn), + ldr::ResultInvalidEmcRateList()); /* csel w?,w?,w?,lt, min(reg, 0x20) */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::Bl, _asm::field::Imm26), ldr::ResultInvalidEmcRateList()); + + /* The csel's Rm holds the 32 cap. */ + const u32 capReg = _asm::Get(ptr[1], _asm::field::Rm); + const u32 capMov = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, capReg}, {_asm::field::Imm16, 0x20}); /* movz w,#0x20 */ + + u32 *movPtr = nullptr; + for (u32 i = 1; i <= 16; ++i) { + if (*(ptr - i) == capMov) { + movPtr = ptr - i; + break; + } + } + R_UNLESS(movPtr, ldr::ResultInvalidEmcRateList()); + + /* min(maxCount, 32) -> min(maxCount, EmcDvfsTableEntryCount). */ + PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); /* cmp w?,#64 */ + PATCH_OFFSET(movPtr, _asm::Set(*movPtr, _asm::field::Imm16, EmcDvfsTableEntryCount)); /* movz w?,#64 */ + R_SUCCEED(); + } + + Result EmcRateSessLimit(u32 *ptr) { + u32 movzI = 0; + R_UNLESS(EmcRateSessFindClamp(ptr, nullptr, nullptr, &movzI), ldr::ResultInvalidEmcRateList()); + + /* Reject cmd11 GetDvfsTable. */ + for (u32 i = 1; i <= 24; ++i) { + const u32 w = ptr[i]; + if (_asm::IsOp(w, _asm::op::SubImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) + && _asm::Get(w, _asm::field::Rn) == _asm::reg::Fp && _asm::Get(w, _asm::field::Imm12) >= 0x20u) { /* sub x?,x29,#>=0x20 */ + R_THROW(ldr::ResultInvalidEmcRateList()); + } + } + + /* mov x,x2 */ + u32 descReg = 0xFFu; + for (u32 i = 1; i <= 24; ++i) { + if (_asm::Ignoring(ptr[i], _asm::MovReg64(0, 2), _asm::field::Rd)) { descReg = _asm::Get(ptr[i], _asm::field::Rd); break; } + } + R_UNLESS(descReg != 0xFFu, ldr::ResultInvalidEmcRateList()); + + /* Repoint the duplicated-imm pair */ + u32 *adds[8]; u32 addImm[8]; u32 nAdds = 0; + for (u32 i = 1; i <= 24 && nAdds < 8; ++i) { + const u32 w = ptr[i]; + if (_asm::IsOp(w, _asm::op::AddImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(w, _asm::field::Rn) == _asm::reg::Sp) { /* add x?,sp,#imm12 (shift 0) */ + adds[nAdds] = ptr + i; + addImm[nAdds] = _asm::Get(w, _asm::field::Imm12); + ++nAdds; + } + } + u32 patched = 0; + for (u32 a = 0; a < nAdds; ++a) { + bool dup = false; + for (u32 b = 0; b < nAdds; ++b) { + if (a != b && addImm[a] == addImm[b]) { dup = true; break; } + } + if (dup) { + PATCH_OFFSET(adds[a], _asm::Encode(_asm::op::LdrImm64, {_asm::field::Rt, _asm::Get(*adds[a], _asm::field::Rd)}, + {_asm::field::Rn, descReg}, + {_asm::field::Off8, 0})); /* ldr x?,[x] */ + ++patched; + } + } + R_UNLESS(patched == 2, ldr::ResultInvalidEmcRateList()); + + /* min(maxCount, 32) -> min(maxCount, EmcDvfsTableEntryCount) */ + PATCH_OFFSET(ptr, _asm::Set(*ptr, _asm::field::Imm12, EmcDvfsTableEntryCount)); /* cmp w?,#64 */ + PATCH_OFFSET(ptr + movzI, _asm::Set(*(ptr + movzI), _asm::field::Imm16, EmcDvfsTableEntryCount)); /* movz w?,#64 */ + R_SUCCEED(); + } + + Result SharedClkBusInstallHooks(HookPayloadData *data) { + R_UNLESS(busInitCache.site != nullptr, ldr::ResultInvalidBusFreqReloc()); + + uintptr_t originalFn = 0; + R_TRY(INSTALL_IMPL_HOOK_ORIG(busInitCache.site, BusFreqExtendImpl, &originalFn)); + data->busData.originalFnCallback = originalFn; + data->busData.next = reinterpret_cast(Hooks().ToVa(data->busData.table[0])); + + R_SUCCEED(); + } + +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.hpp new file mode 100644 index 00000000..04ea6792 --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.hpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "pcv_mariko.hpp" + +namespace ams::ldr::hoc::pcv::mariko { + + extern u32 *nsoStart; + + /* Movz */ + /* + SF | OPC | HW | Imm16 | RD + 31 | 30 29 28 27 26 25 24 23 | 22 21 | 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 | 4 3 2 1 0 + */ + constexpr u32 SocVoltCompareSpeedoAsm = 0x7118FAFF; /* subs imm, compares to >=1598 max speedo and then goes down process id 1 route. */ + constexpr u32 SocVoltWriteProcessIdAsm = 0x2A1F03F4; /* orr, writes id 0. */ + constexpr u32 SocVoltWriteVoltageAsm = 0x52808358; /* Movz imm, writes 1050mV. */ + constexpr u32 SocVoltSelectRegisterAsm = 0x1A9A3118; /* Csel, selects the voltage -- we need the register of this. */ + constexpr u32 SocVoltMultiplyVoltsAsm = 0x1B1A7F0B; /* Mul, converts from mV -> uV */ + constexpr u32 SocVoltValidateLimitAsm = 0x6B0A017F; /* Subs, checks limits */ + constexpr u32 SocVoltBranchToAbortAsm = 0x540020AC; /* B.ge Branches to abort if limits are invalid. */ + + ALWAYS_INLINE bool SocVoltPatternFn(u32 *ptr) { + return _asm::Ignoring(*ptr, SocVoltCompareSpeedoAsm, _asm::field::Rd); + } + + constexpr u32 SocVoltLimitOfficial = 1050; + constexpr u32 SocVoltLimitMaxDefaultIndex = 17; + static const u32 socVoltLimitArray[DvfsTableEntryCount] = { 637, 650, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1025, 1050, }; + + constexpr u32 EmcCountCmpAsm = 0x7100851F; /* cmp w?,#0x21 (subs wzr,w?,#0x21) */ + + /* + str ,[,#0x120] ; volt-array pointer + str w?, [,#0x154] ; num_freqs + */ + constexpr u32 EmcSocLutPtrStoreAsm = 0xF9009009; /* str x?,[x0,#0x120] (anchor) */ + constexpr u32 EmcSocLutCountStoreAsm = 0xB9015408; /* str w?,[x0,#0x154] (anchor) */ + constexpr u32 EmcSocFreqStoreAsm = 0xF9000D00; /* str x?,[x8,#0x18] */ + constexpr u32 EmcSocVoltStoreAsm = 0xB9004900; /* str w?,[x8,#0x48] (socMinLut[i]) */ + constexpr u32 EmcSocReadLoadAsm = 0xB9404929; /* ldr w?,[x9,#0x48] (socMinLut) */ + + inline bool EmcDvfsCountPatternFn(u32 *ptr) { + return _asm::Ignoring(*ptr, EmcCountCmpAsm, _asm::field::Rd); + } + + inline bool EmcSocLutPatternFn(u32 *ptr) { + return _asm::Ignoring(*ptr, EmcSocLutPtrStoreAsm, _asm::field::Rt); /* str x?,[x0,#0x120] */ + } + + /* + mov w?,#0x20 ; the 32 cap + cmp w?,#0x20 + csel w?,w?,w?,lt ; w? = min(maxCount, 32) + bl TegraGetEmcDvfsFreqTable + + cmp w?,#0x20 ; (maxCount) + csel w?,,,lt ; min(maxCount, 32) + bl <_asm::Get*DvfsFreqTable> + */ + constexpr u32 EmcRateCapCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ + constexpr u32 EmcRateCapCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt */ + + inline bool EmcRateListPatternFn(u32 *ptr) { + return _asm::Ignoring(*ptr, EmcRateCapCmpAsm, _asm::field::Rd, _asm::field::Rn); + } + + constexpr u32 EmcRateSessCmpAsm = 0x710082FF; /* cmp w?,#0x20 */ + constexpr u32 EmcRateSessMovAsm = 0x52800400; /* movz w?,#0x20 */ + constexpr u32 EmcRateSessCselAsm = 0x1A80B000; /* csel w?,w?,w?,lt (opcode + cond) */ + + inline bool EmcRateSessFindClamp(u32 *ptr, u32 *out_c, u32 *out_cap, u32 *out_movz_i) { + const u32 c = _asm::Get(ptr[0], _asm::field::Rn); + for (u32 i = 1; i <= 14; ++i) { + const u32 w = ptr[i]; + if (_asm::Ignoring(w, EmcRateSessCselAsm, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm) && _asm::Get(w, _asm::field::Rn) == c && _asm::Get(w, _asm::field::Rd) == c) { + const u32 cap = _asm::Get(w, _asm::field::Rm); + for (u32 j = 1; j < i; ++j) { + if (_asm::Ignoring(ptr[j], EmcRateSessMovAsm, _asm::field::Rd) && _asm::Get(ptr[j], _asm::field::Rd) == cap) { + if (out_c) *out_c = c; + if (out_cap) *out_cap = cap; + if (out_movz_i) *out_movz_i = j; + return true; + } + } + return false; + } + } + return false; + } + + inline bool EmcRateSessPatternFn(u32 *ptr) { + return _asm::Ignoring(*ptr, EmcRateSessCmpAsm, _asm::field::Rd, _asm::field::Rn); + } + + inline bool BusFreqRelocPatternFn(u32 *ptr) { + if (g_pcv_cave == 0) { + return false; + } + if (reinterpret_cast(ptr + 4) > g_pcv_cave) { /* the call site lives in .text */ + return false; + } + return _asm::IsOp(*ptr, _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(*ptr, _asm::field::Off8) == 0x10; /* ldr Xbuf,[Xbus,#0x10] */ + } + + Result SocVoltAsm(u32 *compareSpeedos); + Result SocVoltLimit(u32 *ptr); + HOOK_PAYLOAD_FN u64 BusFreqExtendImpl(SharedClkBus *bus); + Result BusFreqReloc(u32 *ptr); + Result EmcSocLutReloc(u32 *ptr); + Result EmcDvfsCountLimit(u32 *ptr); + Result EmcRateListLimit(u32 *ptr); + Result EmcRateSessLimit(u32 *ptr); + Result SharedClkBusInstallHooks(HookPayloadData *data); + +} From 4fb9615653666c138e9de8462ef9bae1c581abd8 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 12 Sep 2026 17:17:21 -0400 Subject: [PATCH 133/205] benchmark-toolbox: CUDA95 integration --- Source/Benchmark-Toolbox/Makefile | 6 +- .../source/cuda95/compareD_csh.glsl | 57 ++ .../source/cuda95/compare_csh.glsl | 59 ++ .../source/cuda95/cuda95.cpp | 948 ++++++++++++++++++ .../Benchmark-Toolbox/source/cuda95/cuda95.h | 70 ++ .../source/cuda95/stress_csh.glsl | 202 ++++ Source/Benchmark-Toolbox/source/main.cpp | 125 +++ 7 files changed, 1464 insertions(+), 3 deletions(-) create mode 100644 Source/Benchmark-Toolbox/source/cuda95/compareD_csh.glsl create mode 100644 Source/Benchmark-Toolbox/source/cuda95/compare_csh.glsl create mode 100644 Source/Benchmark-Toolbox/source/cuda95/cuda95.cpp create mode 100644 Source/Benchmark-Toolbox/source/cuda95/cuda95.h create mode 100644 Source/Benchmark-Toolbox/source/cuda95/stress_csh.glsl diff --git a/Source/Benchmark-Toolbox/Makefile b/Source/Benchmark-Toolbox/Makefile index 975b9b43..c2dcf528 100644 --- a/Source/Benchmark-Toolbox/Makefile +++ b/Source/Benchmark-Toolbox/Makefile @@ -12,14 +12,14 @@ include $(DEVKITPRO)/libnx/switch_rules #--------------------------------------------------------------------------------- TARGET := Benchmark-Toolbox BUILD := build -SOURCES := source source/furmark source/memtester source/cpustress +SOURCES := source source/furmark source/memtester source/cpustress source/cuda95 DATA := data ICON := icon.jpg -INCLUDES := source source/furmark source/memtester source/cpustress ../hoc-clk/common/include +INCLUDES := source source/furmark source/memtester source/cpustress source/cuda95 ../hoc-clk/common/include APP_TITLE := Benchmark Toolbox APP_AUTHOR := Horizon-OC -APP_VERSION := 2.0.0 +APP_VERSION := 3.0.0 ROMFS := resources BOREALIS_PATH := lib/borealis diff --git a/Source/Benchmark-Toolbox/source/cuda95/compareD_csh.glsl b/Source/Benchmark-Toolbox/source/cuda95/compareD_csh.glsl new file mode 100644 index 00000000..71be7615 --- /dev/null +++ b/Source/Benchmark-Toolbox/source/cuda95/compareD_csh.glsl @@ -0,0 +1,57 @@ +#version 430 core +layout(local_size_x = 16, local_size_y = 16) in; + +layout(std430, binding = 0) readonly buffer DataBuffer { + double data[]; +}; + +layout(std430, binding = 1) buffer ResultBuffer { + uint result; +}; + +layout(std140, binding = 0) uniform Params { + uint n_rows; + uint n_repeats; +}; + +const double THRESHOLD = 1e-3LF; + +shared uint s_partial[256]; + +void main() { + uint total_cols = gl_NumWorkGroups.x * gl_WorkGroupSize.x + * gl_NumWorkGroups.y * gl_WorkGroupSize.y; + + uint col = (gl_GlobalInvocationID.y * (gl_NumWorkGroups.x * gl_WorkGroupSize.x)) + + gl_GlobalInvocationID.x; + + uint count = 0u; + + if (n_rows >= 2u) { + for (uint k = 0u; k < n_repeats; ++k) { + double bias = double(k) * 1e-12LF; + double ref = data[col] + bias; + + for (uint row = 1u; row < n_rows; ++row) { + double val = data[row * total_cols + col]; + if (abs(ref - val) > THRESHOLD) + count++; + } + } + } + + uint lid = gl_LocalInvocationIndex; + s_partial[lid] = count; + memoryBarrierShared(); + barrier(); + + for (uint s = 128u; s > 0u; s >>= 1) { + if (lid < s) + s_partial[lid] += s_partial[lid + s]; + memoryBarrierShared(); + barrier(); + } + + if (lid == 0u) + atomicAdd(result, s_partial[0]); +} diff --git a/Source/Benchmark-Toolbox/source/cuda95/compare_csh.glsl b/Source/Benchmark-Toolbox/source/cuda95/compare_csh.glsl new file mode 100644 index 00000000..8d08496c --- /dev/null +++ b/Source/Benchmark-Toolbox/source/cuda95/compare_csh.glsl @@ -0,0 +1,59 @@ +#version 430 core +layout(local_size_x = 16, local_size_y = 16) in; + +layout(std430, binding = 0) readonly buffer DataBuffer { + float data[]; +}; + +layout(std430, binding = 1) buffer ResultBuffer { + uint result; +}; + +layout(std140, binding = 0) uniform Params { + uint n_rows; + uint n_repeats; +}; + +const float THRESHOLD = 0.001f; + +// One partial sum to force one atomic per WGP instead of 256. +shared uint s_partial[256]; + +void main() { + uint total_cols = gl_NumWorkGroups.x * gl_WorkGroupSize.x + * gl_NumWorkGroups.y * gl_WorkGroupSize.y; + + uint col = (gl_GlobalInvocationID.y * (gl_NumWorkGroups.x * gl_WorkGroupSize.x)) + + gl_GlobalInvocationID.x; + + uint count = 0u; + + if (n_rows >= 2u) { + for (uint k = 0u; k < n_repeats; ++k) { + // Fuck compiler optimizations, imma start throwing bullshit + float bias = float(k) * 1e-9; + float ref = data[col] + bias; + + for (uint row = 1u; row < n_rows; ++row) { + float val = data[row * total_cols + col]; + if (abs(ref - val) > THRESHOLD) + count++; + } + } + } + + uint lid = gl_LocalInvocationIndex; + s_partial[lid] = count; + memoryBarrierShared(); + barrier(); + + for (uint s = 128u; s > 0u; s >>= 1) { + if (lid < s) + s_partial[lid] += s_partial[lid + s]; + memoryBarrierShared(); + barrier(); + } + + if (lid == 0u) + atomicAdd(result, s_partial[0]); +} diff --git a/Source/Benchmark-Toolbox/source/cuda95/cuda95.cpp b/Source/Benchmark-Toolbox/source/cuda95/cuda95.cpp new file mode 100644 index 00000000..dca7a990 --- /dev/null +++ b/Source/Benchmark-Toolbox/source/cuda95/cuda95.cpp @@ -0,0 +1,948 @@ +#include "cuda95.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef DK_UNIFORM_BUF_ALIGNMENT +#define DK_UNIFORM_BUF_ALIGNMENT 0x100 +#endif + +#define ALIGN_UP(x, a) (((x) + ((a) - 1)) & ~((uint32_t)(a) - 1)) + +#define WG_SIZE_X 16 +#define WG_SIZE_Y 16 +// groups are dispatched in a 4x4 grid, for 2048 threads total +// 2048 per SM = 4096 on TX1, so we fully saturate the GPU +#define NUM_GROUPS_X 4 +#define NUM_GROUPS_Y 4 + +#define N_THREADS ((NUM_GROUPS_X * WG_SIZE_X) * (NUM_GROUPS_Y * WG_SIZE_Y)) // 4096 +#define N_ROWS 64 + +// Thread buffers = N_ROWS * N_THREADS, must be power of 2 +#define N_VEC ((uint64_t)N_ROWS * N_THREADS) // uvec4 elements, 2^18 +#define N_ELEMS (N_VEC * 4) // uints, 2^20 + +static_assert((N_VEC & (N_VEC - 1)) == 0, + "N_ROWS * N_THREADS must be a power of two for the scatter mask"); + +// Gather size, 8192 * 16B = 128KB per SM. Fits into L2 perfectly +#define L2_WINDOW_VEC 8192u +#define DISPATCHES_PER_LIST 32 +#define NUM_INFLIGHT 3 +#define MAX_RECORDS 64 // fault records per batch, per slot + +#define FENCE_TIMEOUT_NS (5ULL * 1000000000ULL) +#define DATA_CHECK_INTERVAL 512 + +#define CODEMEM_SIZE (128 * 1024) +#define CMDMEM_SIZE (512 * 1024) + +#define DKSH_MAGIC UINT32_C(0x48534B44) + +// TOOLBOX: console drawing removed, log kept as a ring buffer. +#define SCR_COLS 79 +#define LOG_LINES 14 + +typedef struct { + uint32_t magic; + uint32_t header_sz; + uint32_t control_sz; + uint32_t code_sz; + uint32_t programs_off; + uint32_t num_programs; +} DkshHeaderLocal; + +// Shader parameters +typedef struct { + uint32_t n_rows; + uint32_t n_repeats; + uint32_t alu_iters; + uint32_t gather_iters; + uint32_t max_records; + uint32_t mode; // 0 = capture golden, 1 = compare, 2 = ignore + uint32_t scatter_mask; // Gather window - 1, used for errors. + uint32_t chain_bias; +} Params; + +// Result buffer +typedef struct { + uint32_t mismatches; + uint32_t digest; + uint32_t selfFail; + uint32_t errCount; +} GpuResult; + +// Errorlog +typedef struct { + uint32_t id; // thread index + uint32_t stage; // 1 = ALU self-check, 2 = per-thread digest + uint32_t got; + uint32_t want; +} GpuRecord; + + +// Presets for calibration +typedef struct { + const char* name; + uint32_t alu; + uint32_t gather; + uint32_t window; // 0 = whole buffer +} Profile; + +// Testing modes +// Balanced tried to hit both +// Core forces 2x chains and not as much memory access, although in practice it strains it enough. +// Dram scatters reads accross allocated size (4MB, lol, lmao even) +// L2 changes this to 256KB. +static const Profile kProfiles[] = { + { "balanced", 64, 32, 0 }, + { "core", 512, 4, 0 }, + { "dram", 8, 256, 0 }, + { "l2", 8, 256, L2_WINDOW_VEC }, +}; +#define NUM_PROFILES ((int)(sizeof(kProfiles) / sizeof(kProfiles[0]))) + +static uint32_t scatterMaskFor(int profile) +{ + uint32_t win = kProfiles[profile].window; + if (win == 0u) win = (uint32_t)N_VEC; + return win - 1u; +} + +// Error storage +typedef struct { + uint64_t batches; + uint64_t detected; // batches where digest=/count + uint64_t transient; // corrected by the re-run vote + uint64_t persistent; // reproduced on re-run + uint64_t selfFail; // ALU DUP/COMP Fails + uint64_t dataBad; // corrupt inputs (how did this happen) + uint64_t warnings; + uint64_t timeouts; +} Tally; + +static Tally g_tally; +static uint64_t g_tStart; + +static char g_log[LOG_LINES][SCR_COLS + 1]; +static uint32_t g_logCount; + +// TOOLBOX: shared state +static std::thread g_thread; +static std::mutex g_lock; +static std::atomic g_stop{ false }; +static std::atomic g_running{ false }; +static cuda95_status_t g_pub{}; + +static int s_profile; +static unsigned s_repeats; +static uint32_t s_goldDigest; +static uint32_t s_goldMismatch; +static double s_dps; +static double s_gbps; +static int s_cal; +static int s_error; +static char s_state[96]; + +static int s_cfgProfile; +static unsigned s_cfgRepeats; +static int s_wantProfile; +static unsigned s_wantRepeats; +static bool s_wantDirty; + +static uint64_t elapsedSec(void) +{ + return armTicksToNs(armGetSystemTick() - g_tStart) / 1000000000ULL; +} + +static void note(const char* fmt, ...) +{ + char body[SCR_COLS + 1]; + va_list ap; + va_start(ap, fmt); + vsnprintf(body, sizeof(body), fmt, ap); + va_end(ap); + + // TOOLBOX: console branch removed + uint32_t idx = g_logCount % LOG_LINES; + int n = snprintf(g_log[idx], sizeof(g_log[idx]), "[%5llus] ", + (unsigned long long)elapsedSec()); + if (n < 0) n = 0; + size_t off = (size_t)n; + if (off > sizeof(g_log[idx]) - 1) off = sizeof(g_log[idx]) - 1; + size_t room = sizeof(g_log[idx]) - 1 - off; + size_t len = strlen(body); + if (len > room) len = room; + memcpy(g_log[idx] + off, body, len); + g_log[idx][off + len] = 0; + g_logCount++; +} + +// Generate seeds +static uint32_t hash32(uint32_t x) +{ + x ^= x >> 16; + x *= 0x7FEB352Du; + x ^= x >> 15; + x *= 0x846CA68Bu; + x ^= x >> 16; + return x; +} + + +// RNG, clamped so nothing fucking explodes too hard +static uint32_t dataBits(uint64_t index) +{ + uint32_t bits = hash32((uint32_t)index); + uint32_t exp = (bits >> 23) & 0xFFu; + if (exp < 0x30u) exp = 0x30u + (exp & 0x0Fu); + if (exp > 0xC0u) exp = 0xC0u - (exp & 0x0Fu); + return (bits & 0x807FFFFFu) | (exp << 23); +} + + +typedef struct { + DkMemBlock block; + uint32_t offset; + uint32_t size; +} BumpAlloc; + +static uint32_t bumpAlloc(BumpAlloc* a, uint32_t size, uint32_t align) +{ + uint32_t off = ALIGN_UP(a->offset, align); + if (off + size > a->size) { + note("out of memory (need %u, have %u)", off + size, a->size); + return UINT32_MAX; + } + a->offset = off + size; + return off; +} + +static void* cpuPtr(BumpAlloc* a, uint32_t off) +{ + return (uint8_t*)dkMemBlockGetCpuAddr(a->block) + off; +} + +static DkGpuAddr gpuPtr(BumpAlloc* a, uint32_t off) +{ + return dkMemBlockGetGpuAddr(a->block) + off; +} + +// TOOLBOX: copy worker state for the UI thread. +static void publish(void) +{ + cuda95_status_t s{}; + s.batches = g_tally.batches; + s.detected = g_tally.detected; + s.transient = g_tally.transient; + s.persistent = g_tally.persistent; + s.selfFail = g_tally.selfFail; + s.dataBad = g_tally.dataBad; + s.warnings = g_tally.warnings; + s.timeouts = g_tally.timeouts; + s.dispPerSec = s_dps; + s.gbps = s_gbps; + s.goldDigest = s_goldDigest; + s.goldMismatch = s_goldMismatch; + s.elapsedSec = elapsedSec(); + s.profile = s_profile; + s.repeats = s_repeats; + s.calibrating = s_cal; + s.running = g_running.load() ? 1 : 0; + s.error = s_error; + snprintf(s.status, sizeof(s.status), "%s", s_state); + + uint32_t total = g_logCount < LOG_LINES ? g_logCount : LOG_LINES; + uint32_t keep = total < CUDA95_LOG_LINES ? total : CUDA95_LOG_LINES; + s.logLines = keep; + for (unsigned i = 0; i < keep; i++) { + uint32_t idx = (g_logCount - keep + i) % LOG_LINES; + snprintf(s.log[i], sizeof(s.log[i]), "%s", g_log[idx]); + } + + std::lock_guard lk(g_lock); + g_pub = s; +} + +static void debugCallback(void* userData, const char* context, + DkResult result, const char* message) +{ + (void)userData; + if (result == DkResult_Success) { + g_tally.warnings++; + note("deko3d warn [%s]: %s", context, message); + publish(); + return; + } + // TOOLBOX: flag the error instead. + note("deko3d ERROR [%s]: %s", context, message); + s_error = 1; + snprintf(s_state, sizeof(s_state), "GPU error"); + publish(); + g_stop.store(true); +} + +static bool loadShader(DkShader* shader, BumpAlloc* codeMem, const char* path) +{ + FILE* f = fopen(path, "rb"); + if (!f) { note("cannot open %s", path); return false; } + + DkshHeaderLocal hdr; + if (fread(&hdr, sizeof(hdr), 1, f) != 1 || hdr.magic != DKSH_MAGIC) { + note("%s is not a DKSH file", path); + fclose(f); + return false; + } + + void* control = malloc(hdr.control_sz); + if (!control) { fclose(f); return false; } + + rewind(f); + if (fread(control, hdr.control_sz, 1, f) != 1) { + free(control); fclose(f); return false; + } + + uint32_t codeOff = bumpAlloc(codeMem, hdr.code_sz, DK_SHADER_CODE_ALIGNMENT); + if (codeOff == UINT32_MAX) { free(control); fclose(f); return false; } + + fseek(f, hdr.control_sz, SEEK_SET); + if (fread(cpuPtr(codeMem, codeOff), hdr.code_sz, 1, f) != 1) { + free(control); fclose(f); return false; + } + fclose(f); + + DkShaderMaker maker; + dkShaderMakerDefaults(&maker, codeMem->block, codeOff); + maker.control = control; + dkShaderInitialize(shader, &maker); + + free(control); + return dkShaderIsValid(shader); +} + +// Usual Deko3D memory allocation +typedef struct { + DkQueue queue; + DkCmdBuf cmdbuf; + DkShader shader; + + DkGpuAddr uboAddr; + uint32_t uboSize; + + //3x slots, two are constantly worked on while a third is checked + DkGpuAddr resultAddr[NUM_INFLIGHT]; + GpuResult* resultCpu[NUM_INFLIGHT]; + DkGpuAddr recAddr[NUM_INFLIGHT]; + GpuRecord* recCpu[NUM_INFLIGHT]; + DkCmdList batch[NUM_INFLIGHT]; + + DkGpuAddr dataAddr; + uint32_t dataSize; + uint32_t* dataCpu; + + // Golden digests + DkGpuAddr expAddr; + uint32_t expSize; +} Ctx; + +static void recordBatches(Ctx* c, Params params, uint32_t dispatches) +{ + dkCmdBufClear(c->cmdbuf); + + for (uint32_t s = 0; s < NUM_INFLIGHT; s++) { + const DkShader* shaders[] = { &c->shader }; + dkCmdBufBindShaders(c->cmdbuf, DkStageFlag_Compute, shaders, 1); + + DkBufExtents ubo = { c->uboAddr, c->uboSize }; + dkCmdBufBindUniformBuffers(c->cmdbuf, DkStage_Compute, 0, &ubo, 1); + dkCmdBufPushConstants(c->cmdbuf, c->uboAddr, c->uboSize, + 0, sizeof(params), ¶ms); + + DkBufExtents ssbos[4]; + ssbos[0].addr = c->dataAddr; ssbos[0].size = c->dataSize; + ssbos[1].addr = c->resultAddr[s]; ssbos[1].size = sizeof(GpuResult); + ssbos[2].addr = c->recAddr[s]; ssbos[2].size = MAX_RECORDS * sizeof(GpuRecord); + ssbos[3].addr = c->expAddr; ssbos[3].size = c->expSize; + dkCmdBufBindStorageBuffers(c->cmdbuf, DkStage_Compute, 0, ssbos, 4); + + for (uint32_t i = 0; i < dispatches; i++) + dkCmdBufDispatchCompute(c->cmdbuf, NUM_GROUPS_X, NUM_GROUPS_Y, 1); + + c->batch[s] = dkCmdBufFinishList(c->cmdbuf); + } +} + +typedef enum { RUN_OK = 0, RUN_TIMEOUT, RUN_QUEUE_ERROR } RunStatus; + +static RunStatus runSync(Ctx* c, uint32_t slot, GpuResult* out, uint64_t* outNs) +{ + memset(c->resultCpu[slot], 0, sizeof(GpuResult)); + + DkFence fence; + memset(&fence, 0, sizeof(fence)); + + uint64_t t0 = armGetSystemTick(); + dkQueueSubmitCommands(c->queue, c->batch[slot]); + // CPU politely asks for the data + dkQueueSignalFence(c->queue, &fence, true); + dkQueueFlush(c->queue); + + DkResult r = dkFenceWait(&fence, (int64_t)FENCE_TIMEOUT_NS); + uint64_t t1 = armGetSystemTick(); + if (outNs) *outNs = armTicksToNs(t1 - t0); + + // FAHHHHHHH + if (r != DkResult_Success) + return dkQueueIsInErrorState(c->queue) ? RUN_QUEUE_ERROR : RUN_TIMEOUT; + if (dkQueueIsInErrorState(c->queue)) + return RUN_QUEUE_ERROR; + + *out = *c->resultCpu[slot]; + return RUN_OK; +} + +// Gets reports from GPU results, mainly fault records +static void reportRecords(Ctx* c, uint32_t slot, uint32_t errCount) +{ + uint32_t shown = errCount < MAX_RECORDS ? errCount : MAX_RECORDS; + if (shown > 3) shown = 3; + + for (uint32_t i = 0; i < shown; i++) { + GpuRecord r = c->recCpu[slot][i]; + note(" rec thread %u %s got %08x want %08x", r.id, + r.stage == 1u ? "ALU" : "digest", r.got, r.want); + } + if (errCount > shown) + note(" (%u more records)", errCount - shown); +} + + +// Seperated because this way we can distinguish between source corruption and the GPU on a bender. +static uint32_t checkDataIntegrity(Ctx* c) +{ + const uint32_t stride = 997; + uint32_t bad = 0; + for (uint64_t i = 0; i < N_ELEMS; i += stride) + if (c->dataCpu[i] != dataBits(i)) bad++; + return bad; +} + + +// Capture golden values to confirm them as valid. +// Runs which cannot reproduce their own digests as valid 3 times are assumed as always unstable. +// Used to refuse baking in bad data and instead re compute. +static bool calibrate(Ctx* c, Params base, uint32_t* goldDigest, uint32_t* goldMismatch) +{ + GpuResult r; + Params p = base; + + // Capture data + p.mode = 0; + recordBatches(c, p, 1); + if (runSync(c, 0, &r, NULL) != RUN_OK) { + note("calibration: capture run failed"); + return false; + } + + // Compare against what we have + p.mode = 1; + recordBatches(c, p, 1); + + uint32_t d[3], m[3]; + for (int i = 0; i < 3; i++) { + // TOOLBOX: abort calibration when stopped. + if (g_stop.load()) return false; + if (runSync(c, 0, &r, NULL) != RUN_OK) { + note("calibration: confirm run %d failed", i + 1); + return false; + } + d[i] = r.digest; + m[i] = r.mismatches; + if (r.selfFail || r.errCount) { + g_tally.selfFail += r.selfFail; + note("calibration: run %d reported %u selfFail, %u records", + i + 1, r.selfFail, r.errCount); + reportRecords(c, 0, r.errCount); + } + } + + if (d[0] == d[1] && d[1] == d[2]) { + *goldDigest = d[0]; + *goldMismatch = m[0]; + return true; + } + + // Weigh the results, if nothing appeared twice, then flag these values. + g_tally.detected++; + if (d[0] == d[1] || d[0] == d[2]) { *goldDigest = d[0]; *goldMismatch = m[0]; } + else if (d[1] == d[2]) { *goldDigest = d[1]; *goldMismatch = m[1]; } + else { *goldDigest = d[0]; *goldMismatch = m[0]; } + note("CALIBRATION UNSTABLE: %08x %08x %08x -- reference may be wrong", + d[0], d[1], d[2]); + return true; +} + +// TOOLBOX: worker thread, replace runDemo() loop. +static void workerMain(void) +{ + g_running.store(true); + appletSetAutoSleepDisabled(true); + + { + std::lock_guard lk(g_lock); + s_profile = s_cfgProfile; + s_repeats = s_cfgRepeats; + } + int profile = s_profile; + uint32_t repeats = s_repeats; + + memset(&g_tally, 0, sizeof(g_tally)); + g_logCount = 0; + g_tStart = armGetSystemTick(); + s_goldDigest = 0; + s_goldMismatch = 0; + s_dps = 0.0; + s_gbps = 0.0; + s_cal = 0; + s_error = 0; + snprintf(s_state, sizeof(s_state), "starting"); + + Ctx c; + memset(&c, 0, sizeof(c)); + + note("CUDA95 %d rows x %d threads", N_ROWS, N_THREADS); + + DkDeviceMaker devMaker; + dkDeviceMakerDefaults(&devMaker); + devMaker.cbDebug = debugCallback; + DkDevice device = dkDeviceCreate(&devMaker); + + // Setup queues + DkQueueMaker queueMaker; + dkQueueMakerDefaults(&queueMaker, device); + queueMaker.flags = DkQueueFlags_Compute + | DkQueueFlags_MediumPrio + | DkQueueFlags_DisableZcull; + queueMaker.commandMemorySize = 512 * 1024; + queueMaker.flushThreshold = 128 * 1024; + DkQueue queue = dkQueueCreate(&queueMaker); + c.queue = queue; + + // Allocate and create memory regions + DkMemBlockMaker mbMaker; + dkMemBlockMakerDefaults(&mbMaker, device, CODEMEM_SIZE); + mbMaker.flags = DkMemBlockFlags_CpuUncached + | DkMemBlockFlags_GpuCached + | DkMemBlockFlags_Code; + BumpAlloc codeMem = { dkMemBlockCreate(&mbMaker), 0, CODEMEM_SIZE }; + + uint32_t dataSize = (uint32_t)(N_ELEMS * sizeof(uint32_t)); // 4 MiB + uint32_t expSize = N_THREADS * sizeof(uint32_t); // 16 KiB + uint32_t recSize = MAX_RECORDS * sizeof(GpuRecord); // 1 KiB + uint32_t dataMemSize = ALIGN_UP(CMDMEM_SIZE + dataSize + expSize + + NUM_INFLIGHT * (recSize + 0x100) + 0x4000, + DK_MEMBLOCK_ALIGNMENT); + + dkMemBlockMakerDefaults(&mbMaker, device, dataMemSize); + mbMaker.flags = DkMemBlockFlags_CpuUncached | DkMemBlockFlags_GpuCached; + BumpAlloc dataMem = { dkMemBlockCreate(&mbMaker), 0, dataMemSize }; + + DkCmdBufMaker cbMaker; + dkCmdBufMakerDefaults(&cbMaker, device); + c.cmdbuf = dkCmdBufCreate(&cbMaker); + + uint32_t cmdOff = bumpAlloc(&dataMem, CMDMEM_SIZE, DK_CMDMEM_ALIGNMENT); + dkCmdBufAddMemory(c.cmdbuf, dataMem.block, cmdOff, CMDMEM_SIZE); + + c.uboSize = ALIGN_UP(sizeof(Params), DK_UNIFORM_BUF_ALIGNMENT); + uint32_t uboOff = bumpAlloc(&dataMem, c.uboSize, DK_UNIFORM_BUF_ALIGNMENT); + c.uboAddr = gpuPtr(&dataMem, uboOff); + + // Allocate the result slots so we do not stall + for (uint32_t s = 0; s < NUM_INFLIGHT; s++) { + uint32_t ro = bumpAlloc(&dataMem, sizeof(GpuResult), 0x100); + c.resultAddr[s] = gpuPtr(&dataMem, ro); + c.resultCpu[s] = (GpuResult*)cpuPtr(&dataMem, ro); + + uint32_t eo = bumpAlloc(&dataMem, recSize, 0x100); + c.recAddr[s] = gpuPtr(&dataMem, eo); + c.recCpu[s] = (GpuRecord*)cpuPtr(&dataMem, eo); + } + + uint32_t expOff = bumpAlloc(&dataMem, expSize, 0x100); + c.expAddr = gpuPtr(&dataMem, expOff); + c.expSize = expSize; + + uint32_t dataOff = bumpAlloc(&dataMem, dataSize, 0x100); + c.dataAddr = gpuPtr(&dataMem, dataOff); + c.dataSize = dataSize; + c.dataCpu = (uint32_t*)cpuPtr(&dataMem, dataOff); + + // Fill memory + note("filling %u KiB of test data...", dataSize / 1024); + for (uint64_t i = 0; i < N_ELEMS; i++) { + if ((i & 0xFFFFF) == 0 && g_stop.load()) break; + c.dataCpu[i] = dataBits(i); + } + + uint32_t goldDigest = 0, goldMismatch = 0; + uint32_t expDigest = 0, expMismatch = 0; + bool ready = false; + + // TOOLBOX: host app owns romfs + if (!g_stop.load() && loadShader(&c.shader, &codeMem, "romfs:/shaders/stress_csh.dksh")) { + Params base = { N_ROWS, repeats, + kProfiles[profile].alu, kProfiles[profile].gather, + MAX_RECORDS, 1, scatterMaskFor(profile), 0u }; + + s_cal = 1; + snprintf(s_state, sizeof(s_state), "calibrating"); + note("calibrating (%s, repeats %u)...", kProfiles[profile].name, repeats); + publish(); + if (!g_stop.load() && calibrate(&c, base, &goldDigest, &goldMismatch)) { + expDigest = goldDigest * DISPATCHES_PER_LIST; + expMismatch = goldMismatch * DISPATCHES_PER_LIST; + s_goldDigest = goldDigest; + s_goldMismatch = goldMismatch; + note("golden digest %08x, mismatches %u", goldDigest, goldMismatch); + + Params runParams = base; + runParams.mode = 1; + recordBatches(&c, runParams, DISPATCHES_PER_LIST); + ready = true; + } else if (!g_stop.load()) { + s_error = 1; + snprintf(s_state, sizeof(s_state), "calibration failed"); + note("initial calibration failed, aborting"); + } + s_cal = 0; + + if (ready) { + // Dispatches are idential and use atomicAdd, so batches must be DISPATCHES_PER_lIST * 1 dispatch. + DkFence fences[NUM_INFLIGHT]; + memset(fences, 0, sizeof(fences)); + + uint64_t submitted = 0; + uint64_t windowDisp = 0; + uint64_t tWindow = armGetSystemTick(); + double dps = 0.0; + bool dirty = false; + bool fatal = false; + snprintf(s_state, sizeof(s_state), "running"); + publish(); + + while (!g_stop.load() && !fatal) { + // TOOLBOX: settings from the UI + { + std::lock_guard lk(g_lock); + if (s_wantDirty) { + s_wantDirty = false; + profile = s_wantProfile; + repeats = s_wantRepeats; + s_profile = profile; + s_repeats = repeats; + dirty = true; + } + } + + if (dirty) { + // If we get an error, recapture golden digest for comparisons to actually work. + dkQueueWaitIdle(queue); + + base.n_repeats = repeats; + base.alu_iters = kProfiles[profile].alu; + base.gather_iters = kProfiles[profile].gather; + base.scatter_mask = scatterMaskFor(profile); + base.mode = 1; + + s_cal = 1; + snprintf(s_state, sizeof(s_state), "calibrating"); + note("recalibrating (%s, repeats %u)...", kProfiles[profile].name, repeats); + publish(); + + if (g_stop.load()) break; + if (!calibrate(&c, base, &goldDigest, &goldMismatch)) { + note("recalibration failed"); + s_error = 1; + snprintf(s_state, sizeof(s_state), "recalibration failed"); + fatal = true; + s_cal = 0; + publish(); + break; + } + expDigest = goldDigest * DISPATCHES_PER_LIST; + expMismatch = goldMismatch * DISPATCHES_PER_LIST; + s_goldDigest = goldDigest; + s_goldMismatch = goldMismatch; + note("calibrated %s repeats %u -> digest %08x", + kProfiles[profile].name, repeats, goldDigest); + + Params runParams = base; + runParams.mode = 1; + recordBatches(&c, runParams, DISPATCHES_PER_LIST); + + memset(fences, 0, sizeof(fences)); + submitted = 0; + dirty = false; + s_cal = 0; + snprintf(s_state, sizeof(s_state), "running"); + publish(); + } + + uint32_t slot = (uint32_t)(submitted % NUM_INFLIGHT); + + if (submitted >= NUM_INFLIGHT) { + DkResult r = dkFenceWait(&fences[slot], (int64_t)FENCE_TIMEOUT_NS); + + if (dkQueueIsInErrorState(queue)) { + note("FATAL: queue entered error state"); + s_error = 1; + snprintf(s_state, sizeof(s_state), "GPU queue error"); + fatal = true; + publish(); + break; + } + if (r != DkResult_Success) { + g_tally.timeouts++; + note("FATAL: batch exceeded %llu s deadline", + (unsigned long long)(FENCE_TIMEOUT_NS / 1000000000ULL)); + s_error = 1; + snprintf(s_state, sizeof(s_state), "batch timeout"); + fatal = true; + publish(); + break; + } + + g_tally.batches++; + GpuResult res = *c.resultCpu[slot]; + + bool bad = (res.digest != expDigest) || (res.mismatches != expMismatch); + + // Shader COMP/DUP still occurs even if digests are bad. + // Allows to distinguish what died. + if (res.selfFail) { + g_tally.selfFail += res.selfFail; + note("batch %llu: %u ALU self-check failures", + (unsigned long long)g_tally.batches, res.selfFail); + bad = true; + } + if (res.errCount) { + reportRecords(&c, slot, res.errCount); + bad = true; + } + + // We outa stability + if (bad) { + if (res.digest != expDigest) + note("batch %llu: digest %08x want %08x", + (unsigned long long)g_tally.batches, res.digest, expDigest); + + g_tally.detected++; + + // Re run batches twice and average, mainly for transience. + dkQueueWaitIdle(queue); + GpuResult a, b; + RunStatus s1 = runSync(&c, slot, &a, NULL); + RunStatus s2 = runSync(&c, slot, &b, NULL); + if (s1 != RUN_OK || s2 != RUN_OK) { + note("FATAL: re-run failed during vote"); + s_error = 1; + snprintf(s_state, sizeof(s_state), "re-run failed"); + fatal = true; + publish(); + break; + } + + // If we rerun, replay the same list so batches are compared to what they should result in, not the golden value for single dispatches + bool aOk = (a.digest == expDigest) && !a.selfFail && !a.errCount; + bool bOk = (b.digest == expDigest) && !b.selfFail && !b.errCount; + + // If we detect transience, then we sorta ball, if its persistent, fucking overvolt. + if (aOk && bOk) { + g_tally.transient++; + note(" -> transient, corrected"); + } else { + g_tally.persistent++; + note(" -> PERSISTENT (re-runs %08x, %08x)", a.digest, b.digest); + } + + // How did this happen + // A long time ago + uint32_t badElems = checkDataIntegrity(&c); + if (badElems) { + g_tally.dataBad += badElems; + note(" -> input buffer: %u sampled elements wrong", badElems); + } + + publish(); + memset(fences, 0, sizeof(fences)); + submitted = 0; + continue; + } + + // que + if ((g_tally.batches % DATA_CHECK_INTERVAL) == 0) { + uint32_t badElems = checkDataIntegrity(&c); + if (badElems) { + g_tally.dataBad += badElems; + note("input buffer: %u sampled elements wrong", badElems); + } + publish(); + } + } + + memset(c.resultCpu[slot], 0, sizeof(GpuResult)); + dkQueueSubmitCommands(queue, c.batch[slot]); + dkQueueSignalFence(queue, &fences[slot], true); + dkQueueFlush(queue); + + submitted++; + windowDisp += DISPATCHES_PER_LIST; + + uint64_t now = armGetSystemTick(); + uint64_t windowNs = armTicksToNs(now - tWindow); + if (windowNs >= 500000000ULL) { + double secs = windowNs / 1.0e9; + dps = windowDisp / secs; + + double bytesPer = (double)N_THREADS * 16.0 * repeats + * ((double)N_ROWS + (double)kProfiles[profile].gather); + + s_dps = dps; + s_gbps = (dps * bytesPer) / 1.0e9; + publish(); + + windowDisp = 0; + tWindow = now; + } + } + } + } else if (!g_stop.load()) { + s_error = 1; + snprintf(s_state, sizeof(s_state), "shader load failed"); + note("could not load stress_csh.dksh, aborting"); + publish(); + } + + if (!dkQueueIsInErrorState(queue)) + dkQueueWaitIdle(queue); + dkCmdBufDestroy(c.cmdbuf); + dkMemBlockDestroy(dataMem.block); + dkMemBlockDestroy(codeMem.block); + dkQueueDestroy(queue); + dkDeviceDestroy(device); + + if (!s_error && g_stop.load()) + snprintf(s_state, sizeof(s_state), "stopped"); + publish(); + + appletSetAutoSleepDisabled(false); + g_running.store(false); + publish(); +} + +static unsigned normRepeats(unsigned r) +{ + if (r < CUDA95_REPEATS_MIN) r = CUDA95_REPEATS_MIN; + if (r > CUDA95_REPEATS_MAX) r = CUDA95_REPEATS_MAX; + unsigned p = 1; + while (p * 2u <= r) p *= 2u; + return p; +} + +static int normProfile(int p) +{ + if (p < 0) return 0; + if (p >= NUM_PROFILES) return NUM_PROFILES - 1; + return p; +} + +extern "C" { + +void cuda95_start(int profile, unsigned repeats) +{ + cuda95_stop(); + + { + std::lock_guard lk(g_lock); + s_cfgProfile = normProfile(profile); + s_cfgRepeats = normRepeats(repeats); + s_wantProfile = s_cfgProfile; + s_wantRepeats = s_cfgRepeats; + s_wantDirty = false; + memset(&g_pub, 0, sizeof(g_pub)); + snprintf(g_pub.status, sizeof(g_pub.status), "starting"); + } + + g_stop.store(false); + g_thread = std::thread(workerMain); +} + +void cuda95_stop(void) +{ + g_stop.store(true); + if (g_thread.joinable()) + g_thread.join(); +} + +int cuda95_running(void) +{ + return g_running.load() ? 1 : 0; +} + +void cuda95_get(cuda95_status_t *out) +{ + if (!out) return; + std::lock_guard lk(g_lock); + *out = g_pub; +} + +void cuda95_set_profile(int profile) +{ + std::lock_guard lk(g_lock); + s_cfgProfile = normProfile(profile); + if (g_running.load()) { + s_wantProfile = s_cfgProfile; + s_wantDirty = true; + } +} + +void cuda95_set_repeats(unsigned repeats) +{ + std::lock_guard lk(g_lock); + s_cfgRepeats = normRepeats(repeats); + if (g_running.load()) { + s_wantRepeats = s_cfgRepeats; + s_wantDirty = true; + } +} + +const char *cuda95_profile_name(int profile) +{ + profile = normProfile(profile); + return kProfiles[profile].name; +} + +unsigned cuda95_profile_alu(int profile) +{ + profile = normProfile(profile); + return kProfiles[profile].alu; +} + +unsigned cuda95_profile_gather(int profile) +{ + profile = normProfile(profile); + return kProfiles[profile].gather; +} + +} // extern C + diff --git a/Source/Benchmark-Toolbox/source/cuda95/cuda95.h b/Source/Benchmark-Toolbox/source/cuda95/cuda95.h new file mode 100644 index 00000000..67d0002c --- /dev/null +++ b/Source/Benchmark-Toolbox/source/cuda95/cuda95.h @@ -0,0 +1,70 @@ +#pragma once + +// CUDA-95NX backend. + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define CUDA95_NUM_PROFILES 4 + +#define CUDA95_REPEATS_MIN 1u +#define CUDA95_REPEATS_MAX 256u + +#define CUDA95_LOG_LINES 8 +#define CUDA95_LOG_COLS 96 + +// Profiles +// 0 = balanced +// 1 = core +// 2 = dram +// 3 = l2 + +typedef struct { + uint64_t batches; + uint64_t detected; + uint64_t transient; + uint64_t persistent; + uint64_t selfFail; + uint64_t dataBad; + uint64_t warnings; + uint64_t timeouts; + + double dispPerSec; + double gbps; + + uint32_t goldDigest; + uint32_t goldMismatch; + + uint64_t elapsedSec; + + int profile; + unsigned repeats; + + int calibrating; + int running; + int error; + char status[96]; + + char log[CUDA95_LOG_LINES][CUDA95_LOG_COLS]; + unsigned logLines; +} cuda95_status_t; + +void cuda95_start(int profile, unsigned repeats); +void cuda95_stop(void); +int cuda95_running(void); +void cuda95_get(cuda95_status_t *out); + +void cuda95_set_profile(int profile); +void cuda95_set_repeats(unsigned repeats); + +const char *cuda95_profile_name(int profile); +unsigned cuda95_profile_alu(int profile); +unsigned cuda95_profile_gather(int profile); + +#ifdef __cplusplus +} +#endif + diff --git a/Source/Benchmark-Toolbox/source/cuda95/stress_csh.glsl b/Source/Benchmark-Toolbox/source/cuda95/stress_csh.glsl new file mode 100644 index 00000000..ac23b75d --- /dev/null +++ b/Source/Benchmark-Toolbox/source/cuda95/stress_csh.glsl @@ -0,0 +1,202 @@ +#version 430 core +// CRAWLING IN MY SKINNNNNN +// THESE WOUNDS THEY WILL NOT HEALLLLLLLL +// Furmark bored the fuck out of me tbh although the black hole bench I do want to revisit but thats besides the point. + +// Here we are, this compute shitpost draws more power than furmark. + +// TX1 has 2SMs with 4 schedulers with 2x issue. So 256 threads per block, 8 blocks per sm, 2048 threads dispatched as a max +layout(local_size_x = 16, local_size_y = 16) in; // 256 threads = 8 warps + + +// uvec4 used here to use LDG, essentially forcing data to be read from the unified instruction cache, diferenciating from a global/generic load +// For us, besdies the speedup this also means that lanes pulls 512 bytes instead of 128, forcing mem/l2 more. +layout(std430, binding = 0) readonly buffer DataBuffer { + uvec4 data[]; +}; + +layout(std430, binding = 1) buffer ResultBuffer { + uint mismatches; + uint digest; + uint selfFail; + uint errCount; +}; + +// ALU self checks/mismatch storage +layout(std430, binding = 2) buffer ErrorLog { + uvec4 record[]; +}; + +layout(std430, binding = 3) buffer ExpectedBuffer { + uint expected[]; +}; + +layout(std140, binding = 0) uniform Params { + uint n_rows; + uint n_repeats; + uint alu_iters; + uint gather_iters; + uint max_records; + uint mode; // 0 = capture golden, 1 = compare, 2 = ignore + uint scatter_mask; // limits size to stay in L2 or not + uint chain_bias; // normally 0; see aluChain2 +}; + +const float THRESHOLD = 0.001f; + + +// "scratchpad", not really. +// this is configured for 8kb per block (for 64Kb), any higher drops our block count +shared uint s_scratch[2048]; + +// FNV-1a. Surpringly heavy because maxwell. (XMAD) +uint hmix(uint h, uint v) +{ + h ^= v; + h *= 16777619u; + return h; +} + +// Constant shifts, so every index below must be a mask/add +uint xs32(uint x) +{ + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + return x; +} + +void pushRecord(uint id, uint stage, uint got, uint want) +{ + uint idx = atomicAdd(errCount, 1u); + if (idx < max_records) + record[idx] = uvec4(id, stage, got, want); +} + + +// Man fuck current limits. +// Here we issue 2 instructions per cycle, intervealing to achive this. +// chian_bias is only here to stop the compiler from optimizing it away. +// CPU side passes zero so results must be equal, otherwise we know an error occured. +// Giving anything else breaks. +uvec2 aluChain2(uint seed, uint iters) +{ + uint s2 = seed ^ chain_bias; + + uint h1 = seed, h2 = s2; + uint a1 = seed | 1u, a2 = s2 | 1u; + float f1 = uintBitsToFloat((seed & 0x007FFFFFu) | 0x3F800000u); + float f2 = uintBitsToFloat((s2 & 0x007FFFFFu) | 0x3F800000u); + + for (uint i = 0u; i < iters; ++i) { + // int/FP work + a1 = xs32(a1) + 0x9E3779B9u; + a2 = xs32(a2) + 0x9E3779B9u; + f1 = fma(f1, f1, 0.5); + f2 = fma(f2, f2, 0.5); + // Force values back into [1,2]. + f1 = uintBitsToFloat((floatBitsToUint(f1) & 0x007FFFFFu) | 0x3F800000u); + f2 = uintBitsToFloat((floatBitsToUint(f2) & 0x007FFFFFu) | 0x3F800000u); + h1 = hmix(h1 ^ a1, floatBitsToUint(f1)); + h2 = hmix(h2 ^ a2, floatBitsToUint(f2)); + } + return uvec2(h1, h2); +} + +// I hate myself +void main() +{ + uint gx = gl_NumWorkGroups.x * gl_WorkGroupSize.x; + uint tid = gl_GlobalInvocationID.y * gx + gl_GlobalInvocationID.x; + + // Distance in elements between rows. Also serves as the thread count + uint stride = gx * gl_NumWorkGroups.y * gl_WorkGroupSize.y; + + uint lid = gl_LocalInvocationIndex; + + uint count = 0u; + uint h = 2166136261u ^ tid; + + for (uint k = 0u; k < n_repeats; ++k) { + + // read uvec4 data continously + uvec4 ref = data[tid]; + h = hmix(hmix(hmix(hmix(h, ref.x), ref.y), ref.z), ref.w); + + vec4 fref = uintBitsToFloat(ref); + uint idx = tid; + + for (uint row = 1u; row < n_rows; ++row) { + + // On reduced load, adss per row instead of IMAD, which because Nvidia would expand into XMAD competing for resorces. + idx += stride; + + uvec4 v = data[idx]; + h = hmix(hmix(hmix(hmix(h, v.x), v.y), v.z), v.w); + + // FSETP + used instead of creating divergence. + bvec4 hit = greaterThan(abs(fref - uintBitsToFloat(v)), vec4(THRESHOLD)); + count += uint(hit.x) + uint(hit.y) + uint(hit.z) + uint(hit.w); + } + + // Gather data in a different line every lane. + // Sized under L2 max, because fuck cache + uint st = xs32(h | 1u); + for (uint g = 0u; g < gather_iters; ++g) { + st = xs32(st); + uvec4 v = data[st & scatter_mask]; + h = hmix(hmix(hmix(hmix(h, v.x), v.y), v.z), v.w); + } + + // 2x issue redundancy + uvec2 cc = aluChain2(h, alu_iters); + if (cc.x != cc.y) { + atomicAdd(selfFail, 1u); + pushRecord(tid, 1u, cc.x, cc.y); + } + h = cc.x; + + + // Write back to memory + for (uint j = 0u; j < 8u; ++j) + s_scratch[lid + j * 256u] = h + j; + memoryBarrierShared(); + barrier(); + + uint t = 0u; + for (uint j = 0u; j < 8u; ++j) + t = hmix(t, s_scratch[((lid * 37u + 11u) + j * 251u) & 2047u]); + h = hmix(h, t); + memoryBarrierShared(); + barrier(); + } + + // Compare golden samples + if (mode == 0u) { + expected[tid] = h; + } else if (mode == 1u && h != expected[tid]) { + pushRecord(tid, 2u, h, expected[tid]); + } + + + // Fused reduction, digest/count reduced to 8 barriers with one pass instead of 2. + s_scratch[lid] = h; + s_scratch[256u + lid] = count; + memoryBarrierShared(); + barrier(); + + for (uint s = 128u; s > 0u; s >>= 1) { + if (lid < s) { + s_scratch[lid] += s_scratch[lid + s]; + s_scratch[256u + lid] += s_scratch[256u + lid + s]; + } + memoryBarrierShared(); + barrier(); + } + + // Atomic (16 per WGP) + if (lid == 0u) { + atomicAdd(digest, s_scratch[0]); + atomicAdd(mismatches, s_scratch[256u]); + } +} diff --git a/Source/Benchmark-Toolbox/source/main.cpp b/Source/Benchmark-Toolbox/source/main.cpp index dad466bf..91bc8bf2 100644 --- a/Source/Benchmark-Toolbox/source/main.cpp +++ b/Source/Benchmark-Toolbox/source/main.cpp @@ -14,6 +14,7 @@ extern "C" { #include "bench.h" #include "cpu_stress.h" +#include "cuda95.h" #include "gpu_bw.h" #include "gpu_stress.h" #include "hoc_clk.h" @@ -436,6 +437,126 @@ class StressTab : public brls::Box { brls::Label *statusL, *gflops, *dispatches, *mismatches; }; +class Cuda95Tab : public brls::Box { + public: + Cuda95Tab() { + this->setAxis(brls::Axis::COLUMN); + this->setGrow(1.0f); + this->setPadding(40.0f, 60.0f, 40.0f, 60.0f); + + auto *profRow = new brls::Box(brls::Axis::ROW); + profRow->setMarginBottom(14.0f); + auto *pl = new brls::Label(); + pl->setText("Profile"); + pl->setGrow(1.0f); + profRow->addView(pl); + profVal = new brls::Label(); + profRow->addView(profVal); + this->addView(profRow); + + refreshOpts(); + + auto *hint = new brls::Label(); + hint->setText("L / R: profile. A: start / stop."); + hint->setFontSize(15.0f); + hint->setTextColor(nvgRGB(150, 150, 150)); + hint->setMarginBottom(18.0f); + this->addView(hint); + + toggle = new brls::Button(); + toggle->setText("Start"); + toggle->registerClickAction([this](brls::View *) { + onToggle(); + return true; + }); + this->addView(toggle); + + this->registerAction("Prev profile", brls::ControllerButton::BUTTON_LB, [this](brls::View *) { + cycleProfile(-1); + return true; + }); + this->registerAction("Next profile", brls::ControllerButton::BUTTON_RB, [this](brls::View *) { + cycleProfile(1); + return true; + }); + + statusL = new brls::Label(); + statusL->setText("Stopped"); + statusL->setMarginTop(10.0f); + statusL->setMarginBottom(8.0f); + this->addView(statusL); + + auto *h = new brls::Header(); + h->setTitle("Info"); + this->addView(h); + rowRate = makeRow(this, "Read rate"); + rowBatches = makeRow(this, "Batches"); + rowMismatch = makeRow(this, "Mismatches"); + } + + ~Cuda95Tab() override { + if (cuda95_running()) + cuda95_stop(); + } + + void willDisappear(bool resetState = false) override { + if (cuda95_running()) + cuda95_stop(); + brls::Box::willDisappear(resetState); + } + + void frame(brls::FrameContext *ctx) override { + cuda95_status_t st; + cuda95_get(&st); + if (cuda95_running() || lastRunning) { + rowRate->setText(fstr("%.2f GB/s", st.gbps)); + rowBatches->setText(fstru("%llu", (unsigned long long)st.batches)); + unsigned long long mm = (unsigned long long)st.detected + (unsigned long long)st.selfFail + + (unsigned long long)st.dataBad + (unsigned long long)st.timeouts; + rowMismatch->setText(fstru("%llu", mm)); + if (cuda95_running()) + statusL->setText(st.error ? std::string("Error: ") + st.status : std::string(st.status)); + } + syncToggle(cuda95_running() != 0); + brls::Box::frame(ctx); + } + + private: + void refreshOpts() { + char b[64]; + std::snprintf(b, sizeof b, "%s (%u/%u)", cuda95_profile_name(profile), + cuda95_profile_alu(profile), cuda95_profile_gather(profile)); + profVal->setText(b); + } + void cycleProfile(int dir) { + profile = (profile + dir + CUDA95_NUM_PROFILES) % CUDA95_NUM_PROFILES; + refreshOpts(); + if (cuda95_running()) + cuda95_set_profile(profile); + } + void onToggle() { + if (cuda95_running()) { + cuda95_stop(); + } else { + rowRate->setText("-"); + rowBatches->setText("-"); + rowMismatch->setText("-"); + cuda95_start(profile, 4); + } + } + void syncToggle(bool running) { + if (running == lastRunning) + return; + lastRunning = running; + toggle->setText(running ? "Stop" : "Start"); + if (!running) + statusL->setText("Stopped"); + } + int profile = 0; + bool lastRunning = false; + brls::Label *profVal, *statusL, *rowRate, *rowBatches, *rowMismatch; + brls::Button *toggle; +}; class FurmarkTab : public brls::Box { public: FurmarkTab(int which, const char *desc) : which(which) { @@ -849,6 +970,7 @@ class CreditsTab : public brls::Box { makeRow(this, "Memtester")->setText("Simon Kirby, Charles Cazabon, KazushiMe & CTCaer"); makeRow(this, "FurMark")->setText("StanislavPetrovV & AnxietyTimmy"); makeRow(this, "GPU Test")->setText("NaGaa95"); + makeRow(this, "CUDA95")->setText("AnxietyTimmy"); makeRow(this, "Membench")->setText("Siarhei Siamashka, KazushiMe & Lineon"); makeRow(this, "Stress-ng")->setText("ColinIanKing & Lineon"); @@ -944,6 +1066,7 @@ class MainActivity : public brls::Activity { tab->addHeader("GPU"); tab->addTab("GPU Test", [] { return new StressTab(); }); + tab->addTab("CUDA95", [] { return new Cuda95Tab(); }); tab->addTab("Furmark", [] { return new FurmarkTab(0, "FurMark for Switch (48 step)"); }); tab->addTab("GPU Path Trace", [] { return new FurmarkTab(2, "GPU Path Tracer"); }); @@ -988,6 +1111,8 @@ int main(int argc, char *argv[]) { mt_cpu_stop(); if (cpu_stress_running()) cpu_stress_stop(); + if (cuda95_running()) + cuda95_stop(); _exit(EXIT_SUCCESS); } From 0e8c138187c10227d9d39046f2b9df68547536f8 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 20 Sep 2026 15:32:27 +0200 Subject: [PATCH 134/205] remove debug hardcode (yes I'm stupid) --- .../stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 21c6a2a7..f95f5484 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -475,7 +475,6 @@ namespace ams::ldr::hoc::pcv::mariko { Result MemFreqMtcTable(u32 *ptr) { static const DramId dramId = [] { DramId id = GetDramId(); - id = HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTF; return id; }(); From 056396804f81639612b1a4d588ed14b5b552881e Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 20 Sep 2026 15:39:33 +0200 Subject: [PATCH 135/205] hoc-clk-overlay: update cpu/gpu/ram temp colors --- Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp index 106bf7f6..daca578f 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp @@ -348,15 +348,15 @@ void BaseMenuGui::refresh() { millis = context->temps[HocClkThermalSensor_CPU]; sprintf(displayStrings[28], "%u.%u", millis / 1000U, (millis % 1000U) / 100U); - tempColors[HocClkThermalSensor_CPU] = tsl::GradientColor(millis * 0.001f); + tempColors[HocClkThermalSensor_CPU] = tsl::GradientColor(millis * 0.001f, tsl::DEFAULT_TEMP_RANGE_HIGH); millis = context->temps[HocClkThermalSensor_GPU]; sprintf(displayStrings[29], "%u.%u", millis / 1000U, (millis % 1000U) / 100U); - tempColors[HocClkThermalSensor_GPU] = tsl::GradientColor(millis * 0.001f); + tempColors[HocClkThermalSensor_GPU] = tsl::GradientColor(millis * 0.001f, tsl::DEFAULT_TEMP_RANGE_HIGH); millis = context->temps[HocClkThermalSensor_MEM]; sprintf(displayStrings[30], "%u.%u", millis / 1000U, (millis % 1000U) / 100U); - tempColors[HocClkThermalSensor_MEM] = tsl::GradientColor(millis * 0.001f); + tempColors[HocClkThermalSensor_MEM] = tsl::GradientColor(millis * 0.001f, tsl::DEFAULT_TEMP_RANGE_HIGH); } tsl::elm::Element *BaseMenuGui::baseUI() { From 9428309ac38b202fcaa3c566fdeaee95d049ff14 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 20 Sep 2026 20:36:46 +0200 Subject: [PATCH 136/205] swap ram settings order, move auto cpu oc to experimental settings (disabled auto cpu oc by default now), experimental setting cleanup --- Source/hoc-clk/common/include/hocclk/config.h | 3 +- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 190 ++++++++++-------- 2 files changed, 105 insertions(+), 88 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index a7ea4285..7581a5e3 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -602,8 +602,9 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_ThermalThrottle: case HocClkConfigValue_IsFirstLoad: case HocClkConfigValue_DVFSMode: - case HocClkConfigValue_AutoRAMCPUOverclock: return 1ULL; + case HocClkConfigValue_AutoRAMCPUOverclock: + return 0ULL; case HocClkConfigValue_AutoRamCpuCpuOCFreq: return 1683000ULL; case HocClkConfigValue_AutoRamCpuRamOCThreshold: diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index fcbebdaa..2d433860 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -841,13 +841,24 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new CompactCategoryHeader("Experimental Settings")); + auto addHeaderSpacer = [this]() { + tsl::elm::CustomDrawer *spacer = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); + spacer->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 12); + this->listElement->addItem(spacer); + }; + ValueThresholds thresholdsDisabled(0, 0); if (IsMariko()) { - addConfigToggle(HocClkConfigValue_MarikoMiddleFreqs, nullptr, true); + this->listElement->addItem(new CompactCategoryHeader("CPU Settings")); addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); } + if (IsMariko()) + addHeaderSpacer(); + this->listElement->addItem(new CompactCategoryHeader("GPU Settings")); + if (IsMariko()) + addConfigToggle(HocClkConfigValue_MarikoMiddleFreqs, nullptr, true); + addConfigToggle(HocClkConfigValue_LiveGpuVoltage, "Live GPU Volt Request", false); std::vector gpuSchedMethodValues = { @@ -857,6 +868,85 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { addConfigButton(HocClkConfigValue_GPUSchedulingMethod, "GPU Scheduling Override Method", ValueRange(0, 0, 1, "", 0), "GPU Scheduling Override Method", &thresholdsDisabled, {}, gpuSchedMethodValues, false); + if (IsMariko()) { + addHeaderSpacer(); + this->listElement->addItem(new CompactCategoryHeader("RAM Settings")); + std::vector clkOptionsRamOc = { + NamedValue("1122 MHz", 1122000), NamedValue("1224 MHz", 1224000), NamedValue("1326 MHz", 1326000), NamedValue("1428 MHz", 1428000), + NamedValue("1581 MHz", 1581000), NamedValue("1683 MHz", 1683000, "Default"), NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), + NamedValue("2805 MHz", 2805000), + }; + + std::vector emcMaxClock = { + NamedValue("1600 MHz", 1600000), + NamedValue("1633 MHz", 1633000), + NamedValue("1666 MHz", 1666000), + NamedValue("1700 MHz", 1700000), + NamedValue("1733 MHz", 1733000), + NamedValue("1766 MHz", 1766000), + NamedValue("1800 MHz", 1800000), + NamedValue("1833 MHz", 1833000), + NamedValue("1866 MHz", 1866000, "JEDEC."), + NamedValue("1900 MHz", 1900000), + NamedValue("1933 MHz", 1933000), + NamedValue("1966 MHz", 1966000), + NamedValue("1996 MHz", 1996800, "JEDEC."), + NamedValue("2000 MHz", 2000000), + NamedValue("2033 MHz", 2033000), + NamedValue("2066 MHz", 2066000), + NamedValue("2100 MHz", 2100000), + NamedValue("2133 MHz", 2133000, "JEDEC."), + NamedValue("2166 MHz", 2166000), + NamedValue("2200 MHz", 2200000), + NamedValue("2233 MHz", 2233000), + NamedValue("2266 MHz", 2266000), + NamedValue("2300 MHz", 2300000), + NamedValue("2333 MHz", 2333000), + NamedValue("2366 MHz", 2366000), + NamedValue("2400 MHz", 2400000, "JEDEC."), + NamedValue("2433 MHz", 2433000), + NamedValue("2466 MHz", 2466000), + NamedValue("2500 MHz", 2500000), + NamedValue("2533 MHz", 2533000), + NamedValue("2566 MHz", 2566000), + NamedValue("2600 MHz", 2600000), + NamedValue("2633 MHz", 2633000), + NamedValue("2666 MHz", 2666000, "JEDEC."), + NamedValue("2700 MHz", 2700000), + NamedValue("2733 MHz", 2733000), + NamedValue("2766 MHz", 2766000), + NamedValue("2800 MHz", 2800000), + NamedValue("2833 MHz", 2833000), + NamedValue("2866 MHz", 2866000), + NamedValue("2900 MHz", 2900000), + NamedValue("2933 MHz", 2933000, "JEDEC."), + NamedValue("2966 MHz", 2966000), + NamedValue("3000 MHz", 3000000), + NamedValue("3033 MHz", 3033000), + NamedValue("3066 MHz", 3066000), + NamedValue("3100 MHz", 3100000), + NamedValue("3133 MHz", 3133000), + NamedValue("3166 MHz", 3166000), + NamedValue("3200 MHz", 3200000, "JEDEC."), + NamedValue("3233 MHz", 3233000, "±1720 speedo"), + NamedValue("3266 MHz", 3266000, "±1740 speedo"), + NamedValue("3300 MHz", 3300000, "±1760 speedo"), + NamedValue("3333 MHz", 3333000, "±1780 speedo"), + NamedValue("3366 MHz", 3366000, "±1800 speedo"), + NamedValue("3400 MHz", 3400000, "±1820 speedo"), + NamedValue("3433 MHz", 3433000, "±???? speedo"), + NamedValue("3466 MHz", 3466000, "±???? speedo"), + NamedValue("3500 MHz", 3500000, "±???? speedo"), + }; + addConfigToggle(HocClkConfigValue_AutoRAMCPUOverclock, "Auto CPU RAM OC"); + addConfigButton(HocClkConfigValue_AutoRamCpuCpuOCFreq, "Auto CPU RAM OC CPU clock", ValueRange(0, 0, 1, "", 1), "CPU Clock", + &thresholdsDisabled, {}, clkOptionsRamOc, false, false); + addConfigButton(HocClkConfigValue_AutoRamCpuRamOCThreshold, "Auto CPU RAM OC Threshold", ValueRange(0, 0, 1, "", 1), "RAM Clock", + &thresholdsDisabled, {}, emcMaxClock, false, false); + } + tsl::elm::CustomDrawer *chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Overriding the charge current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("can be dangerous and may cause", false, x + 20, y + 50, 18, tsl::style::color::ColorText); @@ -1336,17 +1426,6 @@ class RamSubmenuGui : public MiscGui { emcMaxClock, false, true); } - tsl::elm::ListItem *latenciesSubmenu = new tsl::elm::ListItem("RAM Latency Editor"); - latenciesSubmenu->setClickListener([](u64 keys) { - if (keys & HidNpadButton_A) { - tsl::swapTo(); - return true; - } - return false; - }); - latenciesSubmenu->setValue(R_ARROW); - this->listElement->addItem(latenciesSubmenu); - tsl::elm::ListItem *timingsSubmenu = new tsl::elm::ListItem("RAM Timing Reductions"); timingsSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { @@ -1358,6 +1437,17 @@ class RamSubmenuGui : public MiscGui { timingsSubmenu->setValue(R_ARROW); this->listElement->addItem(timingsSubmenu); + tsl::elm::ListItem *latenciesSubmenu = new tsl::elm::ListItem("RAM Latency Editor"); + latenciesSubmenu->setClickListener([](u64 keys) { + if (keys & HidNpadButton_A) { + tsl::swapTo(); + return true; + } + return false; + }); + latenciesSubmenu->setValue(R_ARROW); + this->listElement->addItem(latenciesSubmenu); + if (IsMariko()) { tsl::elm::ListItem *socVoltageTable = new tsl::elm::ListItem("SOC Voltage Table"); socVoltageTable->setClickListener([](u64 keys) { @@ -2382,84 +2472,10 @@ class CpuSubmenuGui : public MiscGui { this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, maxClkOptions, false, true); - std::vector clkOptionsRamOc = { - NamedValue("1122 MHz", 1122000), NamedValue("1224 MHz", 1224000), NamedValue("1326 MHz", 1326000), NamedValue("1428 MHz", 1428000), - NamedValue("1581 MHz", 1581000), NamedValue("1683 MHz", 1683000, "Default"), NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), - NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), - NamedValue("2805 MHz", 2805000), - }; - addConfigButton(KipConfigValue_marikoCpuBoostClock, "CPU Boost Clock", ValueRange(0, 0, 1, "", 1), "CPU Boost Clock", this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, maxClkOptions, false, true); - std::vector emcMaxClock = { - NamedValue("1600 MHz", 1600000), - NamedValue("1633 MHz", 1633000), - NamedValue("1666 MHz", 1666000), - NamedValue("1700 MHz", 1700000), - NamedValue("1733 MHz", 1733000), - NamedValue("1766 MHz", 1766000), - NamedValue("1800 MHz", 1800000), - NamedValue("1833 MHz", 1833000), - NamedValue("1866 MHz", 1866000, "JEDEC."), - NamedValue("1900 MHz", 1900000), - NamedValue("1933 MHz", 1933000), - NamedValue("1966 MHz", 1966000), - NamedValue("1996 MHz", 1996800, "JEDEC."), - NamedValue("2000 MHz", 2000000), - NamedValue("2033 MHz", 2033000), - NamedValue("2066 MHz", 2066000), - NamedValue("2100 MHz", 2100000), - NamedValue("2133 MHz", 2133000, "JEDEC."), - NamedValue("2166 MHz", 2166000), - NamedValue("2200 MHz", 2200000), - NamedValue("2233 MHz", 2233000), - NamedValue("2266 MHz", 2266000), - NamedValue("2300 MHz", 2300000), - NamedValue("2333 MHz", 2333000), - NamedValue("2366 MHz", 2366000), - NamedValue("2400 MHz", 2400000, "JEDEC."), - NamedValue("2433 MHz", 2433000), - NamedValue("2466 MHz", 2466000), - NamedValue("2500 MHz", 2500000), - NamedValue("2533 MHz", 2533000), - NamedValue("2566 MHz", 2566000), - NamedValue("2600 MHz", 2600000), - NamedValue("2633 MHz", 2633000), - NamedValue("2666 MHz", 2666000, "JEDEC."), - NamedValue("2700 MHz", 2700000), - NamedValue("2733 MHz", 2733000), - NamedValue("2766 MHz", 2766000), - NamedValue("2800 MHz", 2800000), - NamedValue("2833 MHz", 2833000), - NamedValue("2866 MHz", 2866000), - NamedValue("2900 MHz", 2900000), - NamedValue("2933 MHz", 2933000, "JEDEC."), - NamedValue("2966 MHz", 2966000), - NamedValue("3000 MHz", 3000000), - NamedValue("3033 MHz", 3033000), - NamedValue("3066 MHz", 3066000), - NamedValue("3100 MHz", 3100000), - NamedValue("3133 MHz", 3133000), - NamedValue("3166 MHz", 3166000), - NamedValue("3200 MHz", 3200000, "JEDEC."), - NamedValue("3233 MHz", 3233000, "±1720 speedo"), - NamedValue("3266 MHz", 3266000, "±1740 speedo"), - NamedValue("3300 MHz", 3300000, "±1760 speedo"), - NamedValue("3333 MHz", 3333000, "±1780 speedo"), - NamedValue("3366 MHz", 3366000, "±1800 speedo"), - NamedValue("3400 MHz", 3400000, "±1820 speedo"), - NamedValue("3433 MHz", 3433000, "±???? speedo"), - NamedValue("3466 MHz", 3466000, "±???? speedo"), - NamedValue("3500 MHz", 3500000, "±???? speedo"), - }; - addConfigToggle(HocClkConfigValue_AutoRAMCPUOverclock, "Auto CPU RAM OC"); - addConfigButton(HocClkConfigValue_AutoRamCpuCpuOCFreq, "Auto CPU RAM OC CPU clock", ValueRange(0, 0, 1, "", 1), "CPU Clock", - &thresholdsDisabled, {}, clkOptionsRamOc, false, false); - addConfigButton(HocClkConfigValue_AutoRamCpuRamOCThreshold, "Auto CPU RAM OC Threshold", ValueRange(0, 0, 1, "", 1), "RAM Clock", - &thresholdsDisabled, {}, emcMaxClock, false, false); } else { addConfigTrackbar(KipConfigValue_eristaCpuUV, "CPU UV", ValueRange(0, 5, 1)); From ab60e553032656bb2c51c183939618ac4f5f606f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 22 Sep 2026 18:51:46 -0400 Subject: [PATCH 137/205] BPMP ABORT! --- .gitignore | 1 - .../diff/secmon_smc_power_management.diff | 9 - Source/Atmosphere-Patches/secmon_setup.cpp | 64 --- .../secmon_smc_power_management.cpp | 6 +- Source/hoc-clk/bpmpfw/Makefile | 68 --- Source/hoc-clk/bpmpfw/bpmpfw.ld | 151 ------- Source/hoc-clk/bpmpfw/source/actmon.cpp | 65 --- Source/hoc-clk/bpmpfw/source/actmon.hpp | 64 --- Source/hoc-clk/bpmpfw/source/aotag.cpp | 43 -- Source/hoc-clk/bpmpfw/source/aotag.hpp | 39 -- Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp | 96 ----- Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp | 91 ---- Source/hoc-clk/bpmpfw/source/defs.hpp | 28 -- Source/hoc-clk/bpmpfw/source/freq.cpp | 61 --- Source/hoc-clk/bpmpfw/source/freq.hpp | 44 -- Source/hoc-clk/bpmpfw/source/libc/LICENSE | 21 - .../bpmpfw/source/libc/include/assert.h | 6 - .../source/libc/include/fslc/fslc_assert.h | 35 -- .../source/libc/include/fslc/fslc_stdio.h | 74 ---- .../source/libc/include/fslc/fslc_stdlib.h | 25 -- .../source/libc/include/fslc/fslc_string.h | 50 --- .../bpmpfw/source/libc/include/fslc/stdlibx.h | 23 - .../bpmpfw/source/libc/include/fslc/stringx.h | 33 -- .../bpmpfw/source/libc/include/stdio.h | 6 - .../bpmpfw/source/libc/include/stdlib.h | 6 - .../bpmpfw/source/libc/include/string.h | 6 - .../bpmpfw/source/libc/src/fslc_bsearch.c | 12 - .../bpmpfw/source/libc/src/fslc_bsearch_i.c | 31 -- .../bpmpfw/source/libc/src/fslc_fprintf.c | 10 - .../bpmpfw/source/libc/src/fslc_fputc.c | 12 - .../bpmpfw/source/libc/src/fslc_fputs.c | 15 - .../bpmpfw/source/libc/src/fslc_fputs_impl.c | 13 - .../bpmpfw/source/libc/src/fslc_memcmp.c | 38 -- .../bpmpfw/source/libc/src/fslc_memcpy.c | 40 -- .../bpmpfw/source/libc/src/fslc_memmove.c | 69 --- .../bpmpfw/source/libc/src/fslc_memset.c | 22 - .../bpmpfw/source/libc/src/fslc_memset_l.c | 31 -- .../bpmpfw/source/libc/src/fslc_printf.c | 10 - .../bpmpfw/source/libc/src/fslc_putchar.c | 6 - .../bpmpfw/source/libc/src/fslc_puts.c | 21 - .../bpmpfw/source/libc/src/fslc_stdout.c | 3 - .../bpmpfw/source/libc/src/fslc_strchr.c | 10 - .../bpmpfw/source/libc/src/fslc_strcmp.c | 8 - .../bpmpfw/source/libc/src/fslc_strcpy.c | 8 - .../bpmpfw/source/libc/src/fslc_strcpy_e.c | 10 - .../bpmpfw/source/libc/src/fslc_strlen.c | 9 - .../bpmpfw/source/libc/src/fslc_strncmp.c | 8 - .../bpmpfw/source/libc/src/fslc_strncpy.c | 9 - .../bpmpfw/source/libc/src/fslc_strncpy_e.c | 9 - .../source/libc/src/fslc_strncpy_impl.c | 10 - .../bpmpfw/source/libc/src/fslc_strpbrk.c | 14 - .../bpmpfw/source/libc/src/fslc_strspn.c | 18 - .../bpmpfw/source/libc/src/fslc_strstr.c | 23 - .../bpmpfw/source/libc/src/fslc_strtok_r.c | 27 -- .../bpmpfw/source/libc/src/fslc_vfprintf.c | 347 --------------- .../bpmpfw/source/libc/src/fslc_vprintf.c | 6 - .../hoc-clk/bpmpfw/source/libc_platform.cpp | 39 -- Source/hoc-clk/bpmpfw/source/main.cpp | 111 ----- Source/hoc-clk/bpmpfw/source/pllmb.cpp | 84 ---- Source/hoc-clk/bpmpfw/source/pllmb.hpp | 39 -- Source/hoc-clk/bpmpfw/source/regs.cpp | 77 ---- Source/hoc-clk/bpmpfw/source/regs.hpp | 58 --- Source/hoc-clk/bpmpfw/source/sensors.cpp | 29 -- Source/hoc-clk/bpmpfw/source/sensors.hpp | 25 -- Source/hoc-clk/bpmpfw/source/start.s | 117 ----- Source/hoc-clk/build.sh | 10 - Source/hoc-clk/common/include/hocclk/board.h | 2 - Source/hoc-clk/common/include/hocclk/bpmp.h | 58 --- .../common/include/hocclk/clock_manager.h | 6 +- .../hoc-clk/overlay/src/ui/gui/about_gui.cpp | 4 - Source/hoc-clk/sysmodule/Makefile | 10 +- Source/hoc-clk/sysmodule/perms.json | 11 +- Source/hoc-clk/sysmodule/src/board/board.cpp | 50 +-- Source/hoc-clk/sysmodule/src/board/board.hpp | 6 +- .../sysmodule/src/board/board_freq.cpp | 32 +- .../sysmodule/src/board/board_load.cpp | 14 +- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 406 ------------------ Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp | 33 -- .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 32 -- .../hoc-clk/sysmodule/src/mapping/mem_map.hpp | 2 - .../sysmodule/src/mgr/clock_manager.cpp | 7 - Source/hoc-clk/sysmodule/src/soc/pllmb.cpp | 116 +++++ .../src/soc/pllmb.hpp} | 15 +- Source/hoc-clk/sysmodule/src/soc/t210.c | 297 +++++++++++++ Source/hoc-clk/sysmodule/src/soc/t210.h | 47 ++ .../hoc-clk/sysmodule/src/tsensor/aotag.cpp | 20 +- .../sysmodule/src/tsensor/soctherm.cpp | 45 +- 87 files changed, 553 insertions(+), 3213 deletions(-) delete mode 100644 Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff delete mode 100644 Source/hoc-clk/bpmpfw/Makefile delete mode 100644 Source/hoc-clk/bpmpfw/bpmpfw.ld delete mode 100644 Source/hoc-clk/bpmpfw/source/actmon.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/actmon.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/aotag.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/aotag.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/defs.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/freq.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/freq.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/LICENSE delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/assert.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/stdio.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/include/string.h delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c delete mode 100644 Source/hoc-clk/bpmpfw/source/libc_platform.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/main.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/pllmb.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/pllmb.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/regs.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/regs.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/sensors.cpp delete mode 100644 Source/hoc-clk/bpmpfw/source/sensors.hpp delete mode 100644 Source/hoc-clk/bpmpfw/source/start.s delete mode 100644 Source/hoc-clk/common/include/hocclk/bpmp.h delete mode 100644 Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp delete mode 100644 Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp create mode 100644 Source/hoc-clk/sysmodule/src/soc/pllmb.cpp rename Source/hoc-clk/{bpmpfw/source/libc_platform.hpp => sysmodule/src/soc/pllmb.hpp} (73%) create mode 100644 Source/hoc-clk/sysmodule/src/soc/t210.c create mode 100644 Source/hoc-clk/sysmodule/src/soc/t210.h diff --git a/.gitignore b/.gitignore index 8514104a..76dc4eee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,3 @@ build Source/hekate dist/* !dist/.gitignore -bpmpfw.bin diff --git a/Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff b/Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff deleted file mode 100644 index 78251361..00000000 --- a/Source/Atmosphere-Patches/diff/secmon_smc_power_management.diff +++ /dev/null @@ -1,9 +0,0 @@ -160c160 -< /* Validate that the bpmp is appropriately halted. */ ---- -> /* Horizon-OC: Halt BPMP here as hoc-clk may be running it, and if it's running there will be a panic. */ -161a162,165 -> reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM (HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), -> FLOW_REG_BITS_ENUM_SEL(HALT_COP_EVENTS_JTAG, jtag, ENABLED, DISABLED)); -> -> /* Validate that the bpmp is appropriately halted. */ diff --git a/Source/Atmosphere-Patches/secmon_setup.cpp b/Source/Atmosphere-Patches/secmon_setup.cpp index af6c3ed8..ca761033 100644 --- a/Source/Atmosphere-Patches/secmon_setup.cpp +++ b/Source/Atmosphere-Patches/secmon_setup.cpp @@ -900,32 +900,6 @@ namespace ams::secmon { reg::ReadWrite(PMC + APBDEV_PMC_SECURE_SCRATCH39, REG_BITS_VALUE(0, 27, WarmbootCarveoutConfig)); } - void EnableBpmpSmmu() { - /* Define the ASID contents. */ - constexpr int BpmpAsid = 1; - constexpr uintptr_t BpmpAsidPde = MemoryRegionPhysicalDeviceSecurityEngine.GetAddress(); - - /* Configure the ASID. */ - reg::Write(MC + MC_SMMU_PTB_ASID, MC_REG_BITS_VALUE(SMMU_PTB_ASID_CURRENT_ASID, BpmpAsid)); - - reg::Write(MC + MC_SMMU_PTB_DATA, MC_REG_BITS_VALUE(SMMU_PTB_DATA_ASID_PDE_BASE, BpmpAsidPde / 4_KB), - MC_REG_BITS_ENUM (SMMU_PTB_DATA_ASID_NONSECURE, DISABLE), - MC_REG_BITS_ENUM (SMMU_PTB_DATA_ASID_WRITABLE, DISABLE), - MC_REG_BITS_ENUM (SMMU_PTB_DATA_ASID_READABLE, DISABLE)); - - /* Configure the BPMP and PPCS1 to use the asid. */ - reg::Write(MC + MC_SMMU_AVPC_ASID, MC_REG_BITS_ENUM(SMMU_AVPC_ASID_AVPC_SMMU_ENABLE, ENABLE), MC_REG_BITS_VALUE(SMMU_AVPC_ASID_AVPC_ASID, BpmpAsid)); - reg::Write(MC + MC_SMMU_PPCS1_ASID, MC_REG_BITS_ENUM(SMMU_PPCS1_ASID_PPCS1_SMMU_ENABLE, ENABLE), MC_REG_BITS_VALUE(SMMU_PPCS1_ASID_PPCS1_ASID, BpmpAsid)); - - /* Flush the entire page table cache, and read TLB_CONFIG to ensure the flush takes. */ - reg::Write(MC + MC_SMMU_PTC_FLUSH_0, 0); - reg::Read (MC + MC_SMMU_TLB_CONFIG); - - /* Flush the entire translation lookaside buffer, and read TLB_CONFIG to ensure the flush takes. */ - reg::Write(MC + MC_SMMU_TLB_FLUSH, 0); - reg::Read (MC + MC_SMMU_TLB_CONFIG); - } - void ValidateResetExpected() { /* We're coming out of reset, so check that we expected to come out of reset. */ if (!IsResetExpected()) { @@ -935,11 +909,6 @@ namespace ams::secmon { SetResetExpected(false); } - void ActmonInterruptHandler() { - SetError(pkg1::ErrorInfo_ActivityMonitorInterrupt); - AMS_ABORT("actmon observed bpmp wakeup"); - } - void ExitChargerHiZMode() { /* Setup I2c-1. */ pinmux::SetupI2c1(); @@ -1182,39 +1151,6 @@ namespace ams::secmon { FinalizeCarveoutSecureScratchRegisters(); pmc::LockSecureRegister(pmc::SecureRegister_Carveout); - /* Clear all the BPMP exception vectors to a fixed value. */ - constexpr u32 BpmpExceptionVector = 0x7D000000; - reg::Write(EVP + EVP_COP_RESET_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_UNDEF_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_SWI_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_PREFETCH_ABORT_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_DATA_ABORT_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_RSVD_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_IRQ_VECTOR, BpmpExceptionVector); - reg::Write(EVP + EVP_COP_FIQ_VECTOR, BpmpExceptionVector); - - /* Disable arbitration for the bpmp. */ - reg::ReadWrite(SYSTEM + AHB_ARBITRATION_DISABLE, AHB_REG_BITS_ENUM(ARBITRATION_DISABLE_COP, DISABLE)); - - /* Turn on the SMMU for the BPMP. */ - EnableBpmpSmmu(); - - /* Wait until the flow controller reports that the BPMP is halted. */ - while (!reg::HasValue(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP))) { - util::WaitMicroSeconds(1); - } - - /* Enable clock to the activity monitor. */ - clkrst::EnableActmonClock(); - - /* If JTAG is disabled, disable JTAG. */ - if (!secmon::IsJtagEnabled()) { - reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), - FLOW_REG_BITS_ENUM(HALT_COP_EVENTS_JTAG, DISABLED)); - - /* Turn on the activity monitor to prevent booting up the bpmp. */ - actmon::StartMonitoringBpmp(ActmonInterruptHandler); - } } void SetupPmcAndMcSecure() { diff --git a/Source/Atmosphere-Patches/secmon_smc_power_management.cpp b/Source/Atmosphere-Patches/secmon_smc_power_management.cpp index 4d2214da..7747bb09 100644 --- a/Source/Atmosphere-Patches/secmon_smc_power_management.cpp +++ b/Source/Atmosphere-Patches/secmon_smc_power_management.cpp @@ -157,12 +157,8 @@ namespace ams::secmon::smc { /* Validate that all other cores are off. */ AMS_ABORT_UNLESS(reg::HasValue(PMC + APBDEV_PMC_PWRGATE_STATUS, PMC_REG_BITS_VALUE(PWRGATE_STATUS_CE123, 0))); - /* Horizon-OC: Halt BPMP here as hoc-clk may be running it, and if it's running there will be a panic. */ - const bool jtag = IsJtagEnabled(); - reg::Write(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS, FLOW_REG_BITS_ENUM (HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), - FLOW_REG_BITS_ENUM_SEL(HALT_COP_EVENTS_JTAG, jtag, ENABLED, DISABLED)); - /* Validate that the bpmp is appropriately halted. */ + const bool jtag = IsJtagEnabled(); AMS_ABORT_UNLESS(reg::Read(FLOW_CTLR + FLOW_CTLR_HALT_COP_EVENTS) == reg::Encode(FLOW_REG_BITS_ENUM (HALT_COP_EVENTS_MODE, FLOW_MODE_STOP), FLOW_REG_BITS_ENUM_SEL(HALT_COP_EVENTS_JTAG, jtag, ENABLED, DISABLED))); diff --git a/Source/hoc-clk/bpmpfw/Makefile b/Source/hoc-clk/bpmpfw/Makefile deleted file mode 100644 index b855a056..00000000 --- a/Source/hoc-clk/bpmpfw/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -ifeq ($(strip $(DEVKITARM)),) -$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") -endif -include $(DEVKITARM)/base_rules - -TARGET := bpmpfw -BUILDDIR := build -OUTPUTDIR := out -SOURCEDIR := source - -LIBCDIR := $(SOURCEDIR)/libc - -CPP_SOURCES := $(wildcard $(SOURCEDIR)/*.cpp) -C_SOURCES := $(wildcard $(LIBCDIR)/src/*.c) -S_SOURCES := $(wildcard $(SOURCEDIR)/*.s) - -OBJS := $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(CPP_SOURCES)) \ - $(patsubst $(LIBCDIR)/src/%.c,$(BUILDDIR)/libc/%.o,$(C_SOURCES)) \ - $(patsubst $(SOURCEDIR)/%.s,$(BUILDDIR)/%.o,$(S_SOURCES)) - -ARCH := -march=armv4t -mtune=arm7tdmi -mthumb-interwork -COMMONDIR := ../common/include -INCLUDE := -I$(SOURCEDIR) -I$(LIBCDIR)/include -I$(LIBCDIR)/include/fslc -I$(COMMONDIR) -CFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -ffunction-sections -fdata-sections \ - -fomit-frame-pointer -std=gnu11 -Wall -Wextra $(CUSTOMDEFINES) -CXXFLAGS := $(ARCH) -O2 -g -ffreestanding -nostdlib -fno-exceptions -fno-rtti \ - -fno-unwind-tables -fno-threadsafe-statics -ffunction-sections -fdata-sections \ - -fomit-frame-pointer -std=gnu++20 -Wall -Wextra $(CUSTOMDEFINES) -ASFLAGS := $(ARCH) -g -LDFLAGS := $(ARCH) -nostartfiles -nodefaultlibs -Wl,--nmagic,--gc-sections \ - -T $(SOURCEDIR)/../bpmpfw.ld -LDLIBS := -lgcc - -BIN_TARGET := $(OUTPUTDIR)/$(TARGET).bin - -.PHONY: all clean - -all: $(BIN_TARGET) - -$(BIN_TARGET): $(BUILDDIR)/$(TARGET).elf - @mkdir -p $(OUTPUTDIR) - @echo "bpmpfw.bin" - @$(OBJCOPY) -S -O binary $< $@ - -$(BUILDDIR)/$(TARGET).elf: $(OBJS) - @echo "linking $(TARGET).elf" - @$(CXX) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ - -$(BUILDDIR)/%.o: $(SOURCEDIR)/%.cpp | $(BUILDDIR) - @echo "$(notdir $<)" - @$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ - -$(BUILDDIR)/libc/%.o: $(LIBCDIR)/src/%.c | $(BUILDDIR)/libc - @echo "$(notdir $<)" - @$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ - -$(BUILDDIR)/%.o: $(SOURCEDIR)/%.s | $(BUILDDIR) - @echo "$(notdir $<)" - @$(CXX) $(ASFLAGS) $(INCLUDE) -c $< -o $@ - -$(BUILDDIR): - @mkdir -p $(BUILDDIR) - -$(BUILDDIR)/libc: | $(BUILDDIR) - @mkdir -p $(BUILDDIR)/libc - -clean: - @rm -rf $(BUILDDIR) $(OUTPUTDIR) diff --git a/Source/hoc-clk/bpmpfw/bpmpfw.ld b/Source/hoc-clk/bpmpfw/bpmpfw.ld deleted file mode 100644 index dc63a2ad..00000000 --- a/Source/hoc-clk/bpmpfw/bpmpfw.ld +++ /dev/null @@ -1,151 +0,0 @@ -OUTPUT_ARCH(arm) -ENTRY(reset) - -MEMORY -{ - bpmpfw : ORIGIN = 0x40004000, LENGTH = 32K -} - -SECTIONS -{ - PROVIDE(__start__ = ORIGIN(bpmpfw)); - . = __start__; - __code_start = . ; - - .vectors : - { - KEEP (*(.vectors .vectors.*)) - . = ALIGN(8); - } >bpmpfw - - .text : - { - *(.text.unlikely .text.*_unlikely .text.unlikely.*) - *(.text.exit .text.exit.*) - *(.text.startup .text.startup.*) - *(.text.hot .text.hot.*) - *(.text .stub .text.* .gnu.linkonce.t.*) - . = ALIGN(8); - } >bpmpfw - - .init : - { - KEEP( *(.init) ) - . = ALIGN(8); - } >bpmpfw - - .plt : - { - *(.plt) - *(.iplt) - . = ALIGN(8); - } >bpmpfw - - .fini : - { - KEEP( *(.fini) ) - . = ALIGN(8); - } >bpmpfw - - . = ALIGN(8); - __rodata_start = . ; - - .rodata : - { - *(.rodata .rodata.* .gnu.linkonce.r.*) - . = ALIGN(8); - } >bpmpfw - - .eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } >bpmpfw - .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } >bpmpfw - .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >bpmpfw - .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } >bpmpfw - - .hash : { *(.hash) } >bpmpfw - - . = ALIGN(8); - __data_start = . ; - - .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } >bpmpfw - .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >bpmpfw - .gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } >bpmpfw - .exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } >bpmpfw - - .preinit_array ALIGN(8) : - { - PROVIDE (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE (__preinit_array_end = .); - } >bpmpfw - - .init_array ALIGN(8) : - { - PROVIDE (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - PROVIDE (__init_array_end = .); - } >bpmpfw - - .fini_array ALIGN(8) : - { - PROVIDE (__fini_array_start = .); - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE (__fini_array_end = .); - } >bpmpfw - - .ctors ALIGN(8) : - { - KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >bpmpfw - - .dtors ALIGN(8) : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >bpmpfw - - __got_start__ = .; - - .got : { *(.got) *(.igot) } >bpmpfw - .got.plt : { *(.got.plt) *(.igot.plt) } >bpmpfw - - __got_end__ = .; - - .data ALIGN(8) : - { - *(.data .data.* .gnu.linkonce.d.*) - SORT(CONSTRUCTORS) - } >bpmpfw - - __bss_start__ = .; - .bss ALIGN(8) : - { - *(.dynbss) - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(16); - } >bpmpfw - __bss_end__ = .; - - __end__ = ABSOLUTE(.) ; - - __stack_top = ORIGIN(bpmpfw) + LENGTH(bpmpfw) - 0x10; - - /DISCARD/ : { *(.group .comment .note .interp .ARM.attributes) } - - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .debug_info 0 : { *(.debug_info) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } -} diff --git a/Source/hoc-clk/bpmpfw/source/actmon.cpp b/Source/hoc-clk/bpmpfw/source/actmon.cpp deleted file mode 100644 index f6faa312..00000000 --- a/Source/hoc-clk/bpmpfw/source/actmon.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "actmon.hpp" - -namespace actmon { - - u32 DevReg(ActmonDev dev, u32 off) { - return ActmonDevBase + (static_cast(dev) * ActmonDevSize) + off; - } - - void EnableDev(ActmonDev dev, u32 freqKhz, u32 weight) { - MMIO32(DevReg(dev, DevInitAvg)) = freqKhz * ActmonPeriodMs / 2; - MMIO32(DevReg(dev, DevCountWeight)) = weight; - MMIO32(DevReg(dev, DevCtrl)) = ActmonDevCtrlEnb | ActmonDevCtrlEnbPeriodic | ActmonDevCtrlKVal3; - } - - void Init() { - const u32 emcFreqKhz = static_cast(freq::MeasurePtoFreqHz(freq::ClkPtoEmc, 1) / 1000); - - if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMcallMonAct)) { - MMIO32(ActmonBase + ActmonGlbPeriodCtrl) = (ActmonPeriodMs - 1) & 0xFF; - EnableDev(DevMcAll, emcFreqKhz, 256 * 4); - } - - if (!(MMIO32(ActmonBase + ActmonGlbStatus) & ActmonMccpuMonAct)) { - EnableDev(DevMcCpu, emcFreqKhz, 256 * 4); - } - } - - void Update(HocClkBpmpSharedInfo &info) { - const u32 emcFreqKhz = info.freqMem; - if (emcFreqKhz == 0) { - return; - } - - const u32 avgAll = MMIO32(DevReg(DevMcAll, DevAvgCount)); - const u32 avgCpu = MMIO32(DevReg(DevMcCpu, DevAvgCount)); - - // Get 1000 -> 100.0. - info.emcLoadAll = static_cast((static_cast(avgAll) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); - info.emcLoadCpu = static_cast((static_cast(avgCpu) * 10 * 100) / (emcFreqKhz * ActmonPeriodMs)); - - info.emcBwAll = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadAll) / 1000000); - info.emcBwCpu = static_cast((static_cast(emcFreqKhz) * 16 * info.emcLoadCpu) / 1000000); - - // Not 100% accurate but should be enough. - info.emcBwGpu = (info.emcBwAll > info.emcBwCpu) ? (info.emcBwAll - info.emcBwCpu) : 0; - } - -} // namespace actmon diff --git a/Source/hoc-clk/bpmpfw/source/actmon.hpp b/Source/hoc-clk/bpmpfw/source/actmon.hpp deleted file mode 100644 index 42e935f6..00000000 --- a/Source/hoc-clk/bpmpfw/source/actmon.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "freq.hpp" -#include "regs.hpp" - -#include - -namespace actmon { - - constexpr u32 ActmonBase = 0x6000C800; - constexpr u32 ActmonDevBase = ActmonBase + 0x80; - constexpr u32 ActmonDevSize = 0x40; - - constexpr u32 ActmonGlbStatus = 0x0; - constexpr u32 ActmonGlbPeriodCtrl = 0x4; - constexpr u32 ActmonMccpuMonAct = (1u << 8); - constexpr u32 ActmonMcallMonAct = (1u << 9); - - constexpr u32 ActmonDevCtrlKVal3 = (3u << 10); - constexpr u32 ActmonDevCtrlEnbPeriodic = (1u << 18); - constexpr u32 ActmonDevCtrlEnb = (1u << 31); - - constexpr u32 ActmonPeriodMs = 20; - - enum ActmonDev : u32 { - DevCpu = 0, - DevBpmp, - DevAhb, - DevApb, - DevCpuFreq, - DevMcAll, - DevMcCpu, - }; - - constexpr u32 DevCtrl = 0x00; - constexpr u32 DevInitAvg = 0x0C; - constexpr u32 DevCountWeight = 0x18; - constexpr u32 DevAvgCount = 0x20; - - u32 DevReg(ActmonDev dev, u32 off); - - void EnableDev(ActmonDev dev, u32 freqKhz, u32 weight); - - void Init(); - - void Update(HocClkBpmpSharedInfo &info); - -} // namespace actmon diff --git a/Source/hoc-clk/bpmpfw/source/aotag.cpp b/Source/hoc-clk/bpmpfw/source/aotag.cpp deleted file mode 100644 index da71c08d..00000000 --- a/Source/hoc-clk/bpmpfw/source/aotag.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "aotag.hpp" - -namespace aotag { - - void Update(HocClkBpmpSharedInfo &info) { - const u32 regval = MMIO32(PmcBase + PmcTsensorStatus1); - - if (!(regval & Status1ValidBit)) { - info.tempAO = InvalidSentinel; - return; - } - - const u32 abs = (regval >> Status1AbsShift) & Status1AbsMask; - const bool frac = (regval & Status1FracBit) != 0; - const bool negative = (regval & Status1SignBit) != 0; - - s32 temp = static_cast(abs) * 1000 + (frac ? 500 : 0); - if (negative) { - temp = -temp; - } - - info.tempAO = temp; - } - -} // namespace aotag diff --git a/Source/hoc-clk/bpmpfw/source/aotag.hpp b/Source/hoc-clk/bpmpfw/source/aotag.hpp deleted file mode 100644 index 25e18a0a..00000000 --- a/Source/hoc-clk/bpmpfw/source/aotag.hpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, NVIDIA CORPORATION. All rights reserved. - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "regs.hpp" - -#include - -namespace aotag { - - constexpr u32 PmcBase = 0x7000E400; - constexpr u32 PmcTsensorStatus1 = 0x4AC; - - constexpr u32 Status1ValidBit = (1u << 31); - constexpr u32 Status1AbsShift = 8; - constexpr u32 Status1AbsMask = 0xFF; - constexpr u32 Status1FracBit = (1u << 7); - constexpr u32 Status1SignBit = (1u << 0); - - constexpr s32 InvalidSentinel = -125; - - void Update(HocClkBpmpSharedInfo &info); - -} // namespace aotag diff --git a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp deleted file mode 100644 index ad457560..00000000 --- a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2019-2025 CTCaer - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "bpmp_mmu.hpp" - -namespace bpmpMmu { - - u32 AlignUp(u32 x, u32 a) { - return (x + a - 1) & ~(a - 1); - } - - u32 AlignDown(u32 x, u32 a) { - return x & ~(a - 1); - } - - void Maintenance(u32 op, bool force) { - if (!force && !(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { - return; - } - - MMIO32(CacheBase + IntClear) = IntMaintDone; - - // Blocking operation. - MMIO32(CacheBase + MaintReq) = MaintReqWayBitmapAll | op; - - while (!(MMIO32(CacheBase + IntRawEvent) & IntMaintDone)) - ; - - MMIO32(CacheBase + IntClear) = MMIO32(CacheBase + IntRawEvent); - } - - void SetEntry(u32 idx, const MmuEntry &entry) { - MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x0) = AlignUp(entry.startAddr, CacheLineSize); - MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x4) = AlignDown(entry.endAddr, CacheLineSize); - MMIO32(ShadowEntryBase + sizeof(u32) * 4 * idx + 0x8) = entry.attr; - - MMIO32(CacheBase + MmuShadowCopyMask) |= (1u << idx); - } - - void Enable() { - if (MMIO32(CacheBase + CacheConfig) & CfgEnableCache) { - return; - } - - // Init BPMP MMU. - MMIO32(CacheBase + MmuCmd) = MmuCmdInit; - MMIO32(CacheBase + MmuFallbackEntry) = MmuEnRead | MmuEnWrite | MmuEnExec; // RWX for non-defined regions. - MMIO32(CacheBase + MmuCfg) = MmuCfgSeqEn | MmuCfgTlbEn | MmuCfgAbortStoreLast; - - // Init BPMP MMU entries. - MMIO32(CacheBase + MmuShadowCopyMask) = 0; - for (u32 idx = 0; idx < sizeof(Entries) / sizeof(Entries[0]); idx++) { - SetEntry(idx, Entries[idx]); - } - - MMIO32(CacheBase + MmuCmd) = MmuCmdCopyShadow; - - // Invalidate cache. - Maintenance(MaintInvalidWay, true); - - // Enable cache. - MMIO32(CacheBase + CacheConfig) = CfgEnableCache | CfgForceWriteThrough | - (TagModeParallel << CfgMmuTagModeShift) | CfgTagChkAbrtOnErr; - - // HW bug. Invalidate cache again. - Maintenance(MaintInvalidWay, false); - } - - void Disable() { - if (!(MMIO32(CacheBase + CacheConfig) & CfgEnableCache)) { - return; - } - - // Clean and invalidate cache. - Maintenance(MaintCleanInvalidWay, false); - - // Disable cache. - MMIO32(CacheBase + CacheConfig) = 0; - } - -} // namespace bpmpMmu diff --git a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp b/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp deleted file mode 100644 index 9e4f2ea9..00000000 --- a/Source/hoc-clk/bpmpfw/source/bpmp_mmu.hpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2019-2025 CTCaer - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "regs.hpp" - -// NOTE: MMU won't allow access to gpu address space (smmu carveout issue?) -namespace bpmpMmu { - - constexpr u32 CacheBase = 0x50040000; - - constexpr u32 CacheConfig = 0x000; - constexpr u32 CfgEnableCache = (1u << 0); - constexpr u32 CfgForceWriteThrough = (1u << 3); - constexpr u32 CfgMmuTagModeShift = 8; - constexpr u32 TagModeParallel = 0; - constexpr u32 CfgTagChkAbrtOnErr = (1u << 14); - - constexpr u32 MaintReq = 0x028; - constexpr u32 MaintReqWayBitmapAll = (0xFu << 8); - - constexpr u32 IntClear = 0x044; - constexpr u32 IntRawEvent = 0x048; - constexpr u32 IntMaintDone = (1u << 0); - - constexpr u32 MmuFallbackEntry = 0x0A0; - constexpr u32 MmuShadowCopyMask = 0x0A4; - - constexpr u32 MmuCfg = 0x0AC; - constexpr u32 MmuCfgSeqEn = (1u << 1); - constexpr u32 MmuCfgTlbEn = (1u << 2); - constexpr u32 MmuCfgAbortStoreLast = (1u << 4); - - constexpr u32 MmuCmd = 0x0B0; - constexpr u32 MmuCmdInit = 1; - constexpr u32 MmuCmdCopyShadow = 2; - - constexpr u32 ShadowEntryBase = CacheBase + 0x400; - - constexpr u32 MmuEnCached = (1u << 0); - constexpr u32 MmuEnExec = (1u << 1); - constexpr u32 MmuEnRead = (1u << 2); - constexpr u32 MmuEnWrite = (1u << 3); - - constexpr u32 MaintCleanInvalidWay = 19; - constexpr u32 MaintInvalidWay = 18; - - constexpr u32 CacheLineSize = 0x20; - - constexpr u32 DramStart = 0x80000000; - constexpr u32 IramBase = 0x40000000; - constexpr u32 IramEnd = 0x4003FFFF; - - struct MmuEntry { - u32 startAddr; - u32 endAddr; - u32 attr; - }; - - constexpr MmuEntry Entries[] = { - { DramStart, 0xFFFFFFFF, MmuEnRead | MmuEnWrite | MmuEnExec | MmuEnCached }, - { IramBase, IramEnd, MmuEnRead | MmuEnWrite | MmuEnExec | MmuEnCached }, - }; - - u32 AlignUp(u32 x, u32 a); - u32 AlignDown(u32 x, u32 a); - - void Maintenance(u32 op, bool force); - - void SetEntry(u32 idx, const MmuEntry &entry); - - void Enable(); - - void Disable(); - -} // namespace bpmpMmu diff --git a/Source/hoc-clk/bpmpfw/source/defs.hpp b/Source/hoc-clk/bpmpfw/source/defs.hpp deleted file mode 100644 index 6c2b8730..00000000 --- a/Source/hoc-clk/bpmpfw/source/defs.hpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include - -using u8 = std::uint8_t; -using u16 = std::uint16_t; -using u32 = std::uint32_t; -using u64 = std::uint64_t; -using s8 = std::int8_t; -using s16 = std::int16_t; -using s32 = std::int32_t; -using s64 = std::int64_t; diff --git a/Source/hoc-clk/bpmpfw/source/freq.cpp b/Source/hoc-clk/bpmpfw/source/freq.cpp deleted file mode 100644 index de97caaf..00000000 --- a/Source/hoc-clk/bpmpfw/source/freq.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "freq.hpp" - -namespace freq { - - u64 MeasurePtoFreqHz(u32 srcId, u32 multiplier) { - constexpr u32 win = 16; - constexpr u32 osc = 32768; - - const u32 val = (srcId << PtoSrcSelShift) | PtoDivSelDiv1 | PtoClkEnable | (win - 1); - - MMIO32(CarBase + CarPtoClkCntCntl) = val; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntRst; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - MMIO32(CarBase + CarPtoClkCntCntl) = val; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - MMIO32(CarBase + CarPtoClkCntCntl) = val | PtoCntEn; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep((1000000u * win / osc) + 12 + 2); // 502us - - while (MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntBusy) - ; - - const u32 cnt = MMIO32(CarBase + CarPtoClkCntStatus) & PtoClkCntMask; - - MMIO32(CarBase + CarPtoClkCntCntl) = 0; - (void)MMIO32(CarBase + CarPtoClkCntCntl); - usleep(2); - - return (static_cast(cnt) * multiplier * osc) / win; - } - - void Update(HocClkBpmpSharedInfo &info) { - info.freqMem = static_cast(MeasurePtoFreqHz(ClkPtoEmc, 1) / 1000); - info.freqCpu = static_cast(MeasurePtoFreqHz(ClkPtoCclkGDiv2, 2) / 1000); - } - -} // namespace freq diff --git a/Source/hoc-clk/bpmpfw/source/freq.hpp b/Source/hoc-clk/bpmpfw/source/freq.hpp deleted file mode 100644 index 95c24c65..00000000 --- a/Source/hoc-clk/bpmpfw/source/freq.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "regs.hpp" - -#include - -namespace freq { - - constexpr u32 CarBase = 0x60006000; - constexpr u32 CarPtoClkCntCntl = 0x60; - constexpr u32 CarPtoClkCntStatus = 0x64; - - constexpr u32 PtoCntEn = (1u << 9); - constexpr u32 PtoCntRst = (1u << 10); - constexpr u32 PtoClkEnable = (1u << 13); - constexpr u32 PtoSrcSelShift = 14; - constexpr u32 PtoDivSelDiv1 = (1u << 23); - constexpr u32 PtoClkCntBusy = (1u << 31); - constexpr u32 PtoClkCntMask = 0xFFFFFF; - - constexpr u32 ClkPtoCclkGDiv2 = 0x13; - constexpr u32 ClkPtoEmc = 0x24; - - u64 MeasurePtoFreqHz(u32 srcId, u32 multiplier); - - void Update(HocClkBpmpSharedInfo &info); - -} // namespace freq diff --git a/Source/hoc-clk/bpmpfw/source/libc/LICENSE b/Source/hoc-clk/bpmpfw/source/libc/LICENSE deleted file mode 100644 index 3ea91fc4..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2016 Jurģis Brigmanis - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/assert.h b/Source/hoc-clk/bpmpfw/source/libc/include/assert.h deleted file mode 100644 index a022cf62..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/assert.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STD_ASSERT_H -#define _STD_ASSERT_H - -#include "fslc/fslc_assert.h" - -#endif /* _STD_ASSERT_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h deleted file mode 100644 index 131498df..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_assert.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef FSLC_ASSERT_H -#define FSLC_ASSERT_H - -#ifndef ALT_FSLC_NAMES - -#define fslc_assert assert - -#endif /* ALT_FSLC_NAMES */ - - -#ifdef NDEBUG - -#define fslc_assert(expr) ((void)0) - -#else /* NDEBUG */ - -/* Note: __PRETTY_FUNCTION__ is GCC specific */ -#define fslc_assert(expr) ((expr) ? (void)0 : __fslc_assert_fail(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__)) - -#endif /* NDEBUG */ - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - - void __fslc_assert_fail(const char *expr, const char *file, unsigned int line, const char *func); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* FSLC_ASSERT_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h deleted file mode 100644 index ffdc222d..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdio.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef FSLC_STDIO_H -#define FSLC_STDIO_H - -#include -#include - -#ifndef ALT_FSLC_NAMES - -#define FSLC_FILE FILE -#define fslc_stdout stdout -#define fslc_stdin stdin -#define fslc_putchar putchar -#define fslc_fputc fputc -#define fslc_fputs fputs -#define fslc_puts puts - -#define fslc_vfprintf vfprintf -#define fslc_vprintf vprintf -#define fslc_fprintf fprintf -#define fslc_printf printf - -#define fslc_fwrite fwrite -#define fslc_fread fread - -#define fslc_getc getc -#define fslc_getchar getchar -#define fslc_ungetc ungetc -#define fslc_fgets fgets - -#endif /* ALT_FSLC_NAMES */ - -typedef struct _FSLC_FILE FSLC_FILE; - -struct _FSLC_FILE -{ - void *user_ptr; - int (*putc)(int c, FSLC_FILE *stream); - int (*getc)(FSLC_FILE *stream); - void (*pre_output)(FSLC_FILE *stream); - void (*post_output)(FSLC_FILE *stream); - int ungetc_buf; -}; - -extern FSLC_FILE *fslc_stdout; -extern FSLC_FILE *fslc_stdin; - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - int fslc_putchar(int c); - int fslc_fputc(int c, FSLC_FILE *stream); - int fslc_fputs(const char *str, FSLC_FILE *stream); - int fslc_puts(const char *str); - - int fslc_vfprintf(FSLC_FILE *stream, const char *format, va_list arg); - int fslc_vprintf(const char *format, va_list arg); - int fslc_fprintf(FSLC_FILE *stream, const char *format, ...); - int fslc_printf(const char *format, ...); - - size_t fslc_fwrite(const void *ptr, size_t size, size_t count, FSLC_FILE *stream); - size_t fslc_fread(void *ptr, size_t size, size_t count, FSLC_FILE *stream); - - int fslc_getc(FSLC_FILE *stream); - int fslc_getchar(void); - int fslc_ungetc(int c, FSLC_FILE *stream); - char *fslc_fgets(char *str, int num, FSLC_FILE *stream); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - - -#endif /* FSLC_STDIO_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h deleted file mode 100644 index 021b67aa..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_stdlib.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef FSLC_STDLIB_H -#define FSLC_STDLIB_H - -#include - -#ifndef ALT_FSLC_NAMES - -#define fslc_bsearch bsearch - -#endif /* ALT_FSLC_NAMES */ - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - - void *fslc_bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* FSLC_STDLIB_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h deleted file mode 100644 index a869054d..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/fslc_string.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef FSLC_STRING_H -#define FSLC_STRING_H - -#include - -#ifndef ALT_FSLC_NAMES -#define fslc_memset memset -#define fslc_memcpy memcpy -#define fslc_memmove memmove -#define fslc_memcmp memcmp - -#define fslc_strlen strlen -#define fslc_strcpy strcpy -#define fslc_strncpy strncpy -#define fslc_strcmp strcmp -#define fslc_strncmp strncmp -#define fslc_strchr strchr -#define fslc_strstr strstr -#define fslc_strpbrk strpbrk -#define fslc_strspn strspn -#define fslc_strtok_r strtok_r - -#endif /* ALT_FSLC_NAMES */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - void *fslc_memset(void *ptr, int value, size_t num); - void *fslc_memcpy(void *dest, const void *src, size_t len); - void *fslc_memmove(void *dest, const void *src, size_t len); - int fslc_memcmp(const void *ptr1, const void *ptr2, size_t num); - - size_t fslc_strlen(const char *str); - char *fslc_strcpy(char *dest, const char *src); - char *fslc_strncpy(char *dest, const char *src, size_t len); - int fslc_strcmp(const char *str1, const char *str2); - int fslc_strncmp(const char *str1, const char *str2, size_t num); - char *fslc_strchr(const char *str, int c); - char *fslc_strstr(const char *search_in, const char *search_for); - char *fslc_strpbrk(const char *str, const char *delim); - size_t fslc_strspn(const char *str, const char *delim); - char *fslc_strtok_r(char *str, const char *delim, char **save_p); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - - -#endif /* FSLC_STRING_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h deleted file mode 100644 index 2b86a1a4..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stdlibx.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef FSLC_STDLIBX_H -#define FSLC_STDLIBX_H - -#include - -#ifndef ALT_FSLC_NAMES - -#define fslc_bsearch_i bsearch_i - -#endif /* ALT_FSLC_NAMES */ - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - int fslc_bsearch_i(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* FSLC_STDLIBX_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h b/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h deleted file mode 100644 index 193d8913..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/fslc/stringx.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef FSLC_STRINGX_H -#define FSLC_STRINGX_H - -#include - -#ifndef ALT_FSLC_NAMES - -#define fslc_memset_l memset_l -#define fslc_strcpy_e strcpy_e -#define fslc_strncpy_e strncpy_e - -#endif /* ALT_FSLC_NAMES */ - -#if __SIZEOF_LONG__ == 4 -#define memset_32 memset_l -#elif __SIZEOF_LONG__ == 8 -#define memset_32(A, V, S) memset_l(A, (((unsigned long)(V)<<32)|(V)), S) -#endif - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - void *fslc_memset_l(void *ptr, unsigned long value, size_t num); - char *fslc_strcpy_e(char *dest, const char *src); - char *fslc_strncpy_e(char *dest, const char *src, size_t len); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* FSLC_STRINGX_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/stdio.h b/Source/hoc-clk/bpmpfw/source/libc/include/stdio.h deleted file mode 100644 index fb4853f2..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/stdio.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STD_STDIO_H -#define _STD_STDIO_H - -#include "fslc/fslc_stdio.h" - -#endif /* _STD_STDIO_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h b/Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h deleted file mode 100644 index 34259177..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/stdlib.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STD_STDLIB_H -#define _STD_STDLIB_H - -#include "fslc/fslc_stdlib.h" - -#endif /* _STD_STDLIB_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/include/string.h b/Source/hoc-clk/bpmpfw/source/libc/include/string.h deleted file mode 100644 index c35eec9c..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/include/string.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STD_STRING_H -#define _STD_STRING_H - -#include "fslc/fslc_string.h" - -#endif /* _STD_STRING_H */ diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c deleted file mode 100644 index 1f25f704..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "fslc_stdlib.h" -#include "stdlibx.h" - -void *fslc_bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)) -{ - int sidx = fslc_bsearch_i(key, base, num, size, cmp_proc); - - if (sidx < 0) - return NULL; - - return (char *)base + (sidx * size); -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c deleted file mode 100644 index 52cf54b4..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_bsearch_i.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -int fslc_bsearch_i(const void *key, const void *base, size_t num, size_t size, int (*cmp_proc)(const void *, const void *)) -{ - int lo = 0; - int hi = num - 1; - - char *cbase = (char *)base; - - while (lo <= hi) - { - int i = lo + ((hi - lo) >> 1); - - char *ptr = cbase + (i * size); - int cmp = cmp_proc(key, ptr); - - if (cmp == 0) - return i; - - if (cmp > 0) - { - lo = i + 1; - } - else - { - hi = i - 1; - } - } - - return ~lo; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c deleted file mode 100644 index 688d5912..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fprintf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "fslc_stdio.h" - -int fslc_fprintf(FSLC_FILE *stream, const char *format, ...) -{ - va_list args; - va_start(args, format); - int r = fslc_vfprintf(stream, format, args); - va_end(args); - return r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c deleted file mode 100644 index 2745b827..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputc.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "fslc_stdio.h" - -int fslc_fputc(int c, FSLC_FILE *stream) -{ - if (stream->pre_output) stream->pre_output(stream); - - int r = stream->putc(c, stream); - - if (stream->post_output) stream->post_output(stream); - - return r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c deleted file mode 100644 index be8d13a9..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "fslc_stdio.h" - -int _fslc_fputs_impl(const char *str, FSLC_FILE *stream); - -int fslc_fputs(const char *str, FSLC_FILE *stream) -{ - if (stream->pre_output) stream->pre_output(stream); - - int r = _fslc_fputs_impl(str, stream); - - if (stream->post_output) stream->post_output(stream); - - return r; -} - diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c deleted file mode 100644 index 9743de6b..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_fputs_impl.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "fslc_stdio.h" - -int _fslc_fputs_impl(const char *str, FSLC_FILE *stream) -{ - int res = 0; - for (;*str; ++str) - { - int pr = stream->putc(*str, stream); - if (pr < 0) return pr; - ++res; - } - return res; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c deleted file mode 100644 index 6719b878..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcmp.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "fslc_string.h" -#include - -int fslc_memcmp(const void *ptr1, const void *ptr2, size_t num) -{ - unsigned char *b_p1 = (unsigned char *)ptr1; - unsigned char *b_p2 = (unsigned char *)ptr2; - - for (;((uintptr_t)b_p1 & (sizeof(long)-1)) && num > 0; ++b_p1, ++b_p2, --num) - { - if (*b_p1 != *b_p2) - { - return *b_p1 > *b_p2 ? 1 : -1; - } - } - - unsigned long *w_p1 = (unsigned long *)b_p1; - unsigned long *w_p2 = (unsigned long *)b_p2; - for (;num >= sizeof(unsigned long); ++w_p1, ++w_p2, num -= sizeof(unsigned long)) - { - if (*w_p1 != *w_p2) - { - return *w_p1 > *w_p2 ? 1 : -1; - } - } - - b_p1 = (unsigned char *)w_p1; - b_p2 = (unsigned char *)w_p2; - for (; num > 0; ++b_p1, ++b_p2, --num) - { - if (*b_p1 != *b_p2) - { - return *b_p1 > *b_p2 ? 1 : -1; - } - } - - return 0; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c deleted file mode 100644 index 2383248c..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memcpy.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "fslc_string.h" -#include - -void *fslc_memcpy(void *dest, const void *src, size_t len) -{ - /* Copy byte-by-byte up to word-aligned. - * - * There's a possibility, that src and dest have different offsets - * to word boundary and can not both be used efficiently. - * - * In this case we use align to dest argument, because it then can be - * written in one operation, instead of read-modify-write of 2 words. - * - * Most of the time both parameters should be word-aligned, however. - */ - unsigned char *b_src = (unsigned char *)src; - unsigned char *b_dst = (unsigned char *)dest; - for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && len > 0; b_src++, b_dst++, len--) - { - *b_dst = *b_src; - } - - /* Then all word-aligned */ - unsigned long *w_src = (unsigned long*)b_src; - unsigned long *w_dst = (unsigned long*)b_dst; - for (;len >= sizeof(unsigned long); w_src++, w_dst++, len -= sizeof(unsigned long)) - { - *w_dst = *w_src; - } - - /* And byte-by-byte the rest */ - b_src = (unsigned char *)w_src; - b_dst = (unsigned char *)w_dst; - for (; len > 0; b_src++, b_dst++, len--) - { - *b_dst = *b_src; - } - - return dest; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c deleted file mode 100644 index 68426ca6..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memmove.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "fslc_string.h" -#include - -void *fslc_memmove(void *dest, const void *src, size_t len) -{ - unsigned char *b_dst = (unsigned char *)dest; - unsigned char *b_src = (unsigned char *)src; - - /* Need to check if memory regions overlaps. Then if the dest address is - * larger than source, we need to copy backwards (or else source regions - * ending will be overwritten by writes to dest, before they are read). - * - * In other cases it works identically as memcpy(). Same considerations - * about address alignment applies here. - */ - if ( b_dst < b_src + len && b_dst > b_src) - { - b_src += len; - b_dst += len; - - /* Byte-by-byte down to word-aligned. */ - for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && len > 0; ) - { - b_src--, b_dst--, len--; - *b_dst = *b_src; - } - - /* Then all word-aligned */ - unsigned long *w_src = (unsigned long*)b_src; - unsigned long *w_dst = (unsigned long*)b_dst; - for (;len >= sizeof(unsigned long); ) - { - w_src--, w_dst--, len -= sizeof(unsigned long); - *w_dst = *w_src; - } - - /* And byte-by-byte the rest */ - b_src = (unsigned char *)w_src; - b_dst = (unsigned char *)w_dst; - for (; len > 0; ) - { - b_src--, b_dst--, len--; - *b_dst = *b_src; - } - } else { - /* Byte-by-byte up to word-aligned. */ - for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && len > 0; b_src++, b_dst++, len--) - { - *b_dst = *b_src; - } - - /* Then all word-aligned */ - unsigned long *w_src = (unsigned long *)b_src; - unsigned long *w_dst = (unsigned long *)b_dst; - for (;len >= sizeof(unsigned long); w_src++, w_dst++, len -= sizeof(unsigned long)) - { - *w_dst = *w_src; - } - - /* And byte-by-byte the rest */ - b_src = (unsigned char *)w_src; - b_dst = (unsigned char *)w_dst; - for (; len > 0; b_src++, b_dst++, len--) - { - *b_dst = *b_src; - } - } - return dest; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c deleted file mode 100644 index 321211f8..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "fslc_string.h" -#include "stringx.h" - -void *fslc_memset(void *ptr, int value, size_t num) -{ - /* Will use memset_l() to actually fill the memory region. If value is non-zero, we need - * to replicate lowest byte to all the long's bytes. - */ - if (value) - { - unsigned char c_val = value; - unsigned long l_val = (c_val << 0) | (c_val << 8) | (c_val << 16) | (c_val << 24); - - #if __SIZEOF_LONG__ == 8 - l_val |= l_val << 32; - #endif - - return fslc_memset_l(ptr, l_val, num); - } - else - return fslc_memset_l(ptr, value, num); -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c deleted file mode 100644 index f4d46336..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_memset_l.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "stringx.h" -#include - -void *fslc_memset_l(void *ptr, unsigned long value, size_t num) -{ - unsigned char *b_src = (unsigned char *)&value; - unsigned char *b_dst = (unsigned char *)ptr; - - /* Byte by byte - to aligned word address */ - b_src += ((uintptr_t)b_dst & (sizeof(unsigned long)-1)); - for (;((uintptr_t)b_dst & (sizeof(unsigned long)-1)) && num > 0; b_dst++,b_src++,num--) - { - *b_dst = *b_src; - } - - /* All aligned */ - unsigned long *w_dst = (unsigned long *)b_dst; - for (;num >= sizeof(unsigned long); w_dst++,num -= sizeof(unsigned long)) - { - *w_dst= value; - } - - /* Unaligned ending */ - b_src = (unsigned char *)&value; - b_dst = (unsigned char *)w_dst; - for (; num > 0; b_dst++,b_src++,num--) - { - *b_dst = *b_src; - } - return ptr; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c deleted file mode 100644 index 2609e377..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_printf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "fslc_stdio.h" - -int fslc_printf(const char *format, ...) -{ - va_list args; - va_start(args, format); - int r = fslc_vfprintf(fslc_stdout, format, args); - va_end(args); - return r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c deleted file mode 100644 index d4c1a54d..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_putchar.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "fslc_stdio.h" - -int fslc_putchar(int c) -{ - return fslc_fputc(c, fslc_stdout); -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c deleted file mode 100644 index c1f5d94c..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_puts.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "fslc_stdio.h" - -int _fslc_fputs_impl(const char *str, FSLC_FILE *stream); - -int fslc_puts(const char *str) -{ - if (fslc_stdout->pre_output) fslc_stdout->pre_output(fslc_stdout); - - int r = _fslc_fputs_impl(str, fslc_stdout); - - if (r >= 0) - { - int nlr = fslc_stdout->putc('\n', fslc_stdout); - if (nlr < 0) - r = nlr; - } - - if (fslc_stdout->post_output) fslc_stdout->post_output(fslc_stdout); - - return r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c deleted file mode 100644 index 5418196a..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_stdout.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "fslc_stdio.h" - -FSLC_FILE *fslc_stdout; diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c deleted file mode 100644 index cf3e239c..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strchr.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "fslc_string.h" - -char *fslc_strchr(const char *str, int c) -{ - for (;*str; ++str) - if (*str == c) - return (char *)str; - - return NULL; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c deleted file mode 100644 index 216e147a..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcmp.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "fslc_string.h" - -int fslc_strcmp(const char *str1, const char *str2) -{ - for( ; *str1 && *str1 == *str2; ++str1, ++str2); - - return *((unsigned char *)str1) - *((unsigned char *)str2); -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c deleted file mode 100644 index e0fe5011..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "fslc_string.h" -#include "stringx.h" - -char *fslc_strcpy(char *dest, const char *src) -{ - fslc_strcpy_e(dest, src); - return dest; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c deleted file mode 100644 index 313243a5..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strcpy_e.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "stringx.h" - -char *fslc_strcpy_e(char *dest, const char *src) -{ - for(; *src; ++src, ++dest) - *dest = *src; - - *dest = 0; - return dest; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c deleted file mode 100644 index 15543224..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strlen.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "fslc_string.h" - -size_t fslc_strlen(const char *str) -{ - size_t res = 0; - for(; *str; ++str) ++res; - - return res; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c deleted file mode 100644 index 3ad69714..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncmp.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "fslc_string.h" - -int fslc_strncmp(const char *str1, const char *str2, size_t num) -{ - for( ; *str1 && *str1 == *str2 && num > 1; ++str1, ++str2, --num); - - return *((unsigned char *)str1) - *((unsigned char *)str2); -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c deleted file mode 100644 index 13e74f4a..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "fslc_string.h" - -char *_fslc_strncpy_impl(char *dest, const char *src, size_t len); - -char *fslc_strncpy(char *dest, const char *src, size_t len) -{ - _fslc_strncpy_impl(dest, src, len); - return dest; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c deleted file mode 100644 index b0ab743e..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_e.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "stringx.h" - -char *_fslc_strncpy_impl(char *dest, const char *src, size_t len); - -char *fslc_strncpy_e(char *dest, const char *src, size_t len) -{ - char *r = _fslc_strncpy_impl(dest, src, len); - return *r ? r + 1: r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c deleted file mode 100644 index 76e80a3c..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strncpy_impl.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -char *_fslc_strncpy_impl(char *dest, const char *src, size_t len) -{ - for(; *src && len > 1; ++src, ++dest, --len) - *dest = *src; - - *dest = *src; - return dest; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c deleted file mode 100644 index 743b5256..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strpbrk.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "fslc_string.h" - -char *fslc_strpbrk(const char *str, const char *delim) -{ - for (; *str; ++str) - { - const char *d; - for (d = delim; *d; ++d) - if (*str == *d) - return (char *)str; - } - - return NULL; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c deleted file mode 100644 index 583a0d2d..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strspn.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "fslc_string.h" - -size_t fslc_strspn(const char *str, const char *delim) -{ - size_t r; - - for (r = 0; *str; ++str, ++r) - { - const char *d; - for (d = delim; *d; ++d) - if (*str == *d) // skip to next if found - break; - - if (*d == 0) // inner loop exited on \0 - char was not there - break; - } - return r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c deleted file mode 100644 index 99966c97..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strstr.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "fslc_string.h" - -char *fslc_strstr(const char *search_in, const char *search_for) -{ - while (*search_in) - { - char *rc = fslc_strchr(search_in, search_for[0]); // find first char - - if (rc) - { - const char *si = rc + 1, *sf = search_for + 1; // search strcmp-style from second char - for( ; *si && *si == *sf; ++si, ++sf); - - if (*sf == 0) return rc; // end of search-for - found result - - search_in = rc + 1; // not this one, continue from next char - } - else - return NULL; // did not find first char - exit - } - - return NULL; // reached end of source - did not find -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c deleted file mode 100644 index 5859eb5e..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_strtok_r.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "fslc_string.h" - -char *fslc_strtok_r(char *str, const char *delim, char **save_p) -{ - if (str) - *save_p = str; - - if (*save_p == NULL) - return NULL; - - char *r = *save_p + fslc_strspn(*save_p, delim); - - char *p = fslc_strpbrk(r, delim); - - if (p) - { - *(p++) = 0; - *save_p = p; - } - else - { - if (*r == 0) r = NULL; - *save_p = NULL; - } - - return r; -} diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c deleted file mode 100644 index 53424299..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vfprintf.c +++ /dev/null @@ -1,347 +0,0 @@ -#include "fslc_stdio.h" - -/* There'a a funny behaviour of va_list and va_arg() macros: - * - on x86_64 compiler generates a branch of some sort for each va_arg() macro. Normally it is not a problem, - * however it kinda screws up branch coverage analysis. Therefore I decided to move va_arg() accesses into - * dedicated functions, minimizing the issue to one untaken branch per access function. - * - passing va_list by value works fine on x86_64, but makes some tests to fail on i386. It seems that modifications - * done by va_arg() is not passed back to caller. Subsequent calls to va_arg() or access functions returns wrong - * values on that platform. - * - OK, then. Let's pass pointer to va_list instead. Not so fast. Works fine on i386, but fails to compile on - * x86_64. Fine! Wrapping va_list into a dedicated struct and passing around pointer to it. - * - * Why such a fuss about a few untaken branches in tests? Well, just because! Also, if I ever decide to refactor - * _fslc_vfprintf_impl() - the case statement is getting a bit long and messy, it should make things easier if - * argument list can be passed around freely (as opposed to using it from single function). - */ - -struct va_list_w -{ - va_list arg; -}; - -/* Prototype for printf's internal implementation */ -static int _fslc_vfprintf_impl(FSLC_FILE *stream, const char *format, struct va_list_w *args); - - -/* Main exported function */ -int fslc_vfprintf(FSLC_FILE *stream, const char *format, va_list arg) -{ - if (stream->pre_output) stream->pre_output(stream); - - struct va_list_w argw; - va_copy(argw.arg, arg); // can not assign directly, should make a copy - - int res = _fslc_vfprintf_impl(stream, format, &argw); - - va_end(argw.arg); // and free it after use - - if (stream->post_output) stream->post_output(stream); - - return res; -} - -/* Prototype to private FSLIBC function - implemented elsewhere */ -int _fslc_fputs_impl(const char *str, FSLC_FILE *stream); - - -/* Prototypes for internal functions */ -static int _fslc_put_sint_l(signed long v, FSLC_FILE *stream); -static int _fslc_put_uint_l(unsigned long v, FSLC_FILE *stream); -static int _fslc_put_hex_l(unsigned long v, FSLC_FILE *stream, char alpha); - -static int _get_sint_arg(struct va_list_w *arg); -static unsigned _get_uint_arg(struct va_list_w *arg); -static long long _get_slonglong_arg(struct va_list_w *arg); -static unsigned long long _get_ulonglong_arg(struct va_list_w *arg); -static void *_get_ptr_arg(struct va_list_w *arg); - -/* There are some considerations when formatting Integers for output: - * - on 32-bit systems integers will mostly be 32 bits long, except when one REALLY - * wants to print long long. It should be more optimal to use 32-bit calculations - * when possible and invoke 64-bit only when needed. To support that we provide 2 - * separate implementations. - * - on 64-bit systems may be 32 or 64 bits, but there is no real benefit from - * using shorter bit size. Hence common implementation. - * - this library does not aim to support systems with shorter integer sizes (like 16-bit) - * but it it did, it would probably make sense to provide optimized ports for these cases - * as well. - * - * Buffer size calculations: - * Max UInt32 fits in 10 bytes (+1 for zero terminator) decimal - * 2**32 - 1 == 4294967295z - * FFFFFFFFz - * 01234567890 - * - * Max UInt64 fits in 10 bytes (and +1 for \0) - * 2**64 -1 == 18446744073709551615z - * FFFFFFFFFFFFFFFFz - * 012345678901234567890 - */ - -#define BUFSIZE_LONG_LONG_DECIMAL 20 -#define BUFSIZE_LONG_HEX (__SIZEOF_LONG__ * 2) -#define BUFSIZE_LONG_LONG_HEX (__SIZEOF_LONG_LONG__ * 2) -#if __SIZEOF_LONG__ == 4 - -#define BUFSIZE_LONG_DECIMAL 10 -static int _fslc_put_sint_ll(signed long long v, FSLC_FILE *stream); -static int _fslc_put_uint_ll(unsigned long long v, FSLC_FILE *stream); -static int _fslc_put_hex_ll(unsigned long long v, FSLC_FILE *stream, char alpha); - -#define _get_slong_arg _get_sint_arg -#define _get_ulong_arg _get_uint_arg - -#elif __SIZEOF_LONG__ == 8 - -#define BUFSIZE_LONG_DECIMAL BUFSIZE_LONG_LONG_DECIMAL -#define _fslc_put_sint_ll _fslc_put_sint_l -#define _fslc_put_uint_ll _fslc_put_uint_l -#define _fslc_put_hex_ll _fslc_put_hex_l - -#define _get_slong_arg _get_slonglong_arg -#define _get_ulong_arg _get_ulonglong_arg - -#endif - -#define FLAG_LONG 1 -#define FLAG_VERYLONG 3 - -static int _fslc_vfprintf_impl(FSLC_FILE *stream, const char *format, struct va_list_w *arg) -{ - int res = 0; - int pr; - const char *c; - - for (c = format; *c; ++c) - { - if (*c == '%') - { - int flags = 0; - - for (;;) - { - ++c; - switch (*c) - { - case 's': - pr = _fslc_fputs_impl((const char *)_get_ptr_arg(arg), stream); - if (pr < 0) return pr; - res += pr; - break; - - case 'c': - pr = stream->putc(_get_sint_arg(arg), stream); - if (pr < 0) return pr; - ++res; - break; - - case '%': - pr = stream->putc('%', stream); - if (pr < 0) return pr; - ++res; - break; - - case 'i': - case 'd': - if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) - pr = _fslc_put_sint_ll(_get_slonglong_arg(arg), stream); - else if (flags & FLAG_LONG) - pr = _fslc_put_sint_l(_get_slong_arg(arg), stream); - else - pr = _fslc_put_sint_l(_get_sint_arg(arg), stream); - - if (pr < 0) return pr; - res += pr; - break; - - case 'u': - if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) - pr = _fslc_put_uint_ll(_get_ulonglong_arg(arg), stream); - else if (flags & FLAG_LONG) - pr = _fslc_put_uint_l(_get_ulong_arg(arg), stream); - else - pr = _fslc_put_uint_l(_get_uint_arg(arg), stream); - - if (pr < 0) return pr; - res += pr; - break; - - case 'x': - if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) - pr = _fslc_put_hex_ll(_get_ulonglong_arg(arg), stream, 'a'); - else if (flags & FLAG_LONG) - pr = _fslc_put_hex_l(_get_ulong_arg(arg), stream, 'a'); - else - pr = _fslc_put_hex_l(_get_uint_arg(arg), stream, 'a'); - - if (pr < 0) return pr; - res += pr; - break; - - case 'X': - if ((flags & FLAG_VERYLONG) == FLAG_VERYLONG) - pr = _fslc_put_hex_ll(_get_ulonglong_arg(arg), stream, 'A'); - else if (flags & FLAG_LONG) - pr = _fslc_put_hex_l(_get_ulong_arg(arg), stream, 'A'); - else - pr = _fslc_put_hex_l(_get_uint_arg(arg), stream, 'A'); - - if (pr < 0) return pr; - res += pr; - break; - - case 'p': - pr = _fslc_fputs_impl("0x", stream); - if (pr < 0) return pr; - res += pr; - - pr = _fslc_put_hex_l(_get_ulong_arg(arg), stream, 'a'); - - if (pr < 0) return pr; - res += pr; - break; - - case 'l': - if (flags & FLAG_LONG) - flags |= FLAG_VERYLONG; - else - flags |= FLAG_LONG; - continue; - } - break; - } - } else { - pr = stream->putc(*c, stream); - if (pr < 0) return pr; - ++res; - } - } - - return res; -} - -static int _get_sint_arg(struct va_list_w *arg) -{ - return va_arg(arg->arg, signed int); -} - -static unsigned _get_uint_arg(struct va_list_w *arg) -{ - return va_arg(arg->arg, unsigned int); -} - -static long long _get_slonglong_arg(struct va_list_w *arg) -{ - return va_arg(arg->arg, signed long long); -} - -static unsigned long long _get_ulonglong_arg(struct va_list_w *arg) -{ - return va_arg(arg->arg, unsigned long long); -} - -static void *_get_ptr_arg(struct va_list_w *arg) -{ - return va_arg(arg->arg, void *); -} - -static int _fslc_put_sint_l(signed long v, FSLC_FILE *stream) -{ - if (v < 0) - { - int pr = stream->putc('-', stream); - if (pr < 0) return pr; - - pr = _fslc_put_uint_l(-v, stream); - if (pr < 0) return pr; - - return pr+1; - } else - return _fslc_put_uint_l(v, stream); -} - -static int _fslc_put_uint_l(unsigned long v, FSLC_FILE *stream) -{ - char dbuff[BUFSIZE_LONG_DECIMAL+1], *p; - - dbuff[BUFSIZE_LONG_DECIMAL] = 0; - - for (p = dbuff + BUFSIZE_LONG_DECIMAL; v ; v /= 10) - { - *(--p) = (v % 10) + '0'; - } - - if (*p == 0) *(--p) = '0'; - - return _fslc_fputs_impl(p, stream); -} - -static int _fslc_put_hex_l(unsigned long v, FSLC_FILE *stream, char alpha) -{ - char dbuff[BUFSIZE_LONG_HEX+1], *p; - - dbuff[BUFSIZE_LONG_HEX] = 0; - - for (p = dbuff + BUFSIZE_LONG_HEX; v ; v >>= 4) - { - char digit = (v & 0xF); - *(--p) = digit < 10 ? digit + '0' : digit - 10 + alpha; - } - - if (*p == 0) *(--p) = '0'; - - return _fslc_fputs_impl(p, stream); -} - -#if __SIZEOF_LONG__ == 4 - -static int _fslc_put_sint_ll(signed long long v, FSLC_FILE *stream) -{ - if (v < 0) - { - int pr = stream->putc('-', stream); - if (pr < 0) return pr; - - pr = _fslc_put_uint_ll(-v, stream); - if (pr < 0) return pr; - - return pr+1; - } else - return _fslc_put_uint_ll(v, stream); -} - -static int _fslc_put_uint_ll(unsigned long long v, FSLC_FILE *stream) -{ - char dbuff[BUFSIZE_LONG_LONG_DECIMAL+1], *p; - - dbuff[BUFSIZE_LONG_LONG_DECIMAL] = 0; - - for (p = dbuff + BUFSIZE_LONG_LONG_DECIMAL; v ; v /= 10) - { - *(--p) = (v % 10) + '0'; - } - - if (*p == 0) *(--p) = '0'; - - return _fslc_fputs_impl(p, stream); -} - -static int _fslc_put_hex_ll(unsigned long long v, FSLC_FILE *stream, char alpha) -{ - char dbuff[BUFSIZE_LONG_LONG_HEX+1], *p; - - dbuff[BUFSIZE_LONG_LONG_HEX] = 0; - - for (p = dbuff + BUFSIZE_LONG_LONG_HEX; v ; v >>= 4) - { - char digit = (v & 0xF); - *(--p) = digit < 10 ? digit + '0' : digit - 10 + alpha; - } - - if (*p == 0) *(--p) = '0'; - - return _fslc_fputs_impl(p, stream); -} - -#endif diff --git a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c b/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c deleted file mode 100644 index 6f5abd1e..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc/src/fslc_vprintf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "fslc_stdio.h" - -int fslc_vprintf(const char *format, va_list arg) -{ - return fslc_vfprintf(fslc_stdout, format, arg); -} diff --git a/Source/hoc-clk/bpmpfw/source/libc_platform.cpp b/Source/hoc-clk/bpmpfw/source/libc_platform.cpp deleted file mode 100644 index 9ba02640..00000000 --- a/Source/hoc-clk/bpmpfw/source/libc_platform.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include "regs.hpp" - -namespace { - - int UartStreamPutc(int c, FILE *) { - UartPutc(static_cast(c)); - return c; - } - - void UartStreamPostOutput(FILE *) { - UartFlush(); - } - - FILE g_uartStdout = { nullptr, UartStreamPutc, nullptr, nullptr, UartStreamPostOutput, -1 }; - -} // namespace - -void InitializeLibc() { - stdout = &g_uartStdout; -} diff --git a/Source/hoc-clk/bpmpfw/source/main.cpp b/Source/hoc-clk/bpmpfw/source/main.cpp deleted file mode 100644 index e32885cf..00000000 --- a/Source/hoc-clk/bpmpfw/source/main.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include - -#include "actmon.hpp" -#include "aotag.hpp" -#include "bpmp_mmu.hpp" -#include "freq.hpp" -#include "libc_platform.hpp" -#include "pllmb.hpp" -#include "regs.hpp" -#include "sensors.hpp" - -#include - -extern "C" [[noreturn]] void _panic_reboot(); - -namespace { - - HocClkBpmpSharedInfo &SharedInfo() { - return *reinterpret_cast(WorkRamStart); - } - -} // namespace - -[[noreturn]] void HandleShutdown(HocClkBpmpSharedInfo &info) { - /* Deinit MMU otherwise sleep will fatal. */ - bpmpMmu::Disable(); - info.magic = 0x0; - UartPutsForce("[hoc-bpmpfw]: Halting...\n"); - for (;;) - ; -} - -void HandleCommand(HocClkBpmpSharedInfo &info) { - switch (info.cmd) { - case HocClkBpmpCmd_None: - break; - case HocClkBpmpCmd_RequestShutdown: - HandleShutdown(info); - break; - case HocClkBpmpCmd_SetUartEnabled: - g_uartLoggingEnabled = (info.cmdArg1 != 0); - info.cmd = HocClkBpmpCmd_None; - break; - default: - info.cmd = HocClkBpmpCmd_None; - break; - } -} - -void MainLoop(HocClkBpmpSharedInfo &info) { - for (;;) { - HandleCommand(info); - - const u32 temp1 = MMIO32(SocthermBase + SocthermSensorTemp1); - const u32 temp2 = MMIO32(SocthermBase + SocthermSensorTemp2); - - info.tempCpu = TranslateSocthermTemp(static_cast(temp1 >> 16)); - info.tempGpu = TranslateSocthermTemp(static_cast(temp1)); - info.tempMem = TranslateSocthermTemp(static_cast(temp2 >> 16)); - info.tempPllx = TranslateSocthermTemp(static_cast(temp2)); - - freq::Update(info); - actmon::Update(info); - aotag::Update(info); - info.freqMemPll = static_cast(pllmb::MeasureRamClockHz() / 1000); - - msleep(250); - } -} - -extern "C" void main() { - bpmpMmu::Enable(); - - InitializeLibc(); - - UartPutsForce("[hoc-bpmpfw]: Starting bpmpfw\n"); - - HocClkBpmpSharedInfo &info = SharedInfo(); - memset(&info, 0, sizeof(info)); - info.status = 0; - - actmon::Init(); - - info.magic = HOCCLK_BPMP_MAGIC; // written last - - /* If the main loop exits then it is a panic or invalid state */ - MainLoop(info); - - UartPutsForce("[hoc-bpmpfw]: PANIC\n"); - - /* Kill execution */ - _panic_reboot(); -} diff --git a/Source/hoc-clk/bpmpfw/source/pllmb.cpp b/Source/hoc-clk/bpmpfw/source/pllmb.cpp deleted file mode 100644 index 559e149e..00000000 --- a/Source/hoc-clk/bpmpfw/source/pllmb.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) Souldbminer - * Copyright (c) KazushiMe - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "pllmb.hpp" - -namespace pllmb { - - u64 MeasurePtoHz(u32 ptoId, u32 divider, u32 preselReg, u32 preselMask) { - u32 preselOrigBit = 0; - - if (preselReg) { - u32 val = MMIO32(freq::CarBase + preselReg); - usleep(10); - preselOrigBit = val & preselMask; - val &= ~preselMask; - val |= preselMask; - MMIO32(freq::CarBase + preselReg) = val; - usleep(10); - } - - constexpr u32 cycleCount = 16; - const u32 savedCntl = MMIO32(freq::CarBase + freq::CarPtoClkCntCntl); - - u32 val = freq::PtoDivSelDiv1 | freq::PtoClkEnable | (cycleCount - 1); - val |= ptoId << freq::PtoSrcSelShift; - - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntRst; - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val; - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = val | freq::PtoCntEn; - usleep(500); - - while (MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & PtoCyclePeriod) - ; - - u32 cnt = MMIO32(freq::CarBase + freq::CarPtoClkCntStatus) & freq::PtoClkCntMask; - cnt *= divider; - - const u64 rateHz = (static_cast(cnt) * 32768) / cycleCount; - - usleep(10); - MMIO32(freq::CarBase + freq::CarPtoClkCntCntl) = savedCntl; - usleep(10); - - if (preselReg) { - u32 val2 = MMIO32(freq::CarBase + preselReg); - usleep(10); - val2 &= ~preselMask; - val2 |= preselOrigBit; - MMIO32(freq::CarBase + preselReg) = val2; - usleep(10); - } - - return rateHz; - } - - u64 MeasureRamClockHz() { - const u64 pllmbHz = MeasurePtoHz(PtoPllmb, 2, PllmMisc2, PllmMisc2PllmbBit); - if (pllmbHz != 0) { - return pllmbHz; - } - return MeasurePtoHz(PtoPllm, 2, PllmMisc2, PllmMisc2PllmBit); - } - -} // namespace pllmb diff --git a/Source/hoc-clk/bpmpfw/source/pllmb.hpp b/Source/hoc-clk/bpmpfw/source/pllmb.hpp deleted file mode 100644 index 5e296b76..00000000 --- a/Source/hoc-clk/bpmpfw/source/pllmb.hpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Souldbminer - * Copyright (c) KazushiMe - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "freq.hpp" -#include "regs.hpp" - -namespace pllmb { - - constexpr u32 PtoPllm = 2; - constexpr u32 PtoPllmb = 37; - - constexpr u32 PllmMisc2 = 0x9C; - constexpr u32 PllmMisc2PllmBit = (1u << 8); - constexpr u32 PllmMisc2PllmbBit = (1u << 9); - - constexpr u32 PtoCyclePeriod = (1u << 31); // PTO_CLK_CNT_STATUS busy bit - - u64 MeasurePtoHz(u32 ptoId, u32 divider, u32 preselReg, u32 preselMask); - - u64 MeasureRamClockHz(); - -} // namespace pllmb diff --git a/Source/hoc-clk/bpmpfw/source/regs.cpp b/Source/hoc-clk/bpmpfw/source/regs.cpp deleted file mode 100644 index 3995fea4..00000000 --- a/Source/hoc-clk/bpmpfw/source/regs.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "regs.hpp" - -[[maybe_unused]] void usleep(u32 us) { - while (us) { - const u32 delay = (us > HaltMaxCnt) ? HaltMaxCnt : us; - us -= delay; - MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltUsec | delay; - } -} - -[[maybe_unused]] void msleep(u32 ms) { - while (ms) { - const u32 delay = (ms > HaltMaxCnt) ? HaltMaxCnt : ms; - ms -= delay; - MMIO32(FlowCtlrBase + FlowCtlrHaltCopEvents) = HaltModeWaitEvent | HaltMsec | delay; - } -} - -bool g_uartLoggingEnabled = false; - -void UartPutc(char c) { - if (!g_uartLoggingEnabled) { - return; - } - while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) - ; - MMIO32(UartBBase + UartThr) = static_cast(static_cast(c)); -} - -void UartFlush() { - if (!g_uartLoggingEnabled) { - return; - } - while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) - ; -} - -void UartPuts(const char *s) { - while (*s) { - UartPutc(*s++); - } -} - -void UartPutHex32(u32 v) { - static const char digits[] = "0123456789ABCDEF"; - for (int i = 28; i >= 0; i -= 4) { - UartPutc(digits[(v >> i) & 0xF]); - } -} - -void UartPutsForce(const char *s) { - while (*s) { - while (!(MMIO32(UartBBase + UartLsr) & UartLsrThre)) - ; - MMIO32(UartBBase + UartThr) = static_cast(static_cast(*s++)); - } - - while (!(MMIO32(UartBBase + UartLsr) & UartLsrTmty)) - ; -} diff --git a/Source/hoc-clk/bpmpfw/source/regs.hpp b/Source/hoc-clk/bpmpfw/source/regs.hpp deleted file mode 100644 index d0ebf3d6..00000000 --- a/Source/hoc-clk/bpmpfw/source/regs.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "defs.hpp" - -#define MMIO32(addr) (*reinterpret_cast(addr)) - -constexpr u32 FwRamStart = 0x40004000; -constexpr u32 FwRamEnd = 0x4000C000; -constexpr u32 WorkRamStart = FwRamEnd; -constexpr u32 WorkRamEnd = 0x40010000; - -constexpr u32 FlowCtlrBase = 0x60007000; -constexpr u32 FlowCtlrHaltCopEvents = 0x004; - -constexpr u32 HaltModeWaitEvent = (2u << 29); -constexpr u32 HaltMsec = (1u << 24); -constexpr u32 HaltUsec = (1u << 25); -constexpr u32 HaltMaxCnt = 0xFF; - -[[maybe_unused]] void usleep(u32 us); -[[maybe_unused]] void msleep(u32 ms); - -constexpr u32 TmrBase = 0x60005000; -constexpr u32 TimerUsCntr1Us = 0x10; - -constexpr u32 UartBBase = 0x70006040; -constexpr u32 UartThr = 0x00; -constexpr u32 UartLsr = 0x14; -constexpr u32 UartLsrThre = (1u << 5); -constexpr u32 UartLsrTmty = (1u << 6); - -extern bool g_uartLoggingEnabled; - -void UartPutc(char c); - -void UartFlush(); - -void UartPuts(const char *s); - -void UartPutHex32(u32 v); - -void UartPutsForce(const char *s); diff --git a/Source/hoc-clk/bpmpfw/source/sensors.cpp b/Source/hoc-clk/bpmpfw/source/sensors.cpp deleted file mode 100644 index bd2af778..00000000 --- a/Source/hoc-clk/bpmpfw/source/sensors.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "sensors.hpp" - -s32 TranslateSocthermTemp(u16 val) { - s32 t = ((val >> 8) & 0xFF) * 1000; - if (val & (1u << 7)) { - t += 500; - } - if (val & (1u << 0)) { - t = -t; - } - return t; -} diff --git a/Source/hoc-clk/bpmpfw/source/sensors.hpp b/Source/hoc-clk/bpmpfw/source/sensors.hpp deleted file mode 100644 index 1c101a5d..00000000 --- a/Source/hoc-clk/bpmpfw/source/sensors.hpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include "regs.hpp" - -constexpr u32 SocthermBase = 0x700E2000; -constexpr u32 SocthermSensorTemp1 = 0x1C8; -constexpr u32 SocthermSensorTemp2 = 0x1CC; - -s32 TranslateSocthermTemp(u16 val); diff --git a/Source/hoc-clk/bpmpfw/source/start.s b/Source/hoc-clk/bpmpfw/source/start.s deleted file mode 100644 index 8c5c758f..00000000 --- a/Source/hoc-clk/bpmpfw/source/start.s +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) Atmosphere-NX - * - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -.section .vectors, "ax", %progbits -.align 3 -.global reset -reset: - b _start - b _panic - -.section .text.start, "ax", %progbits -.align 3 -.global _start -.extern main -_start: - /* Mask IRQ + FIQ, enter SVC mode. */ - msr cpsr_f, #0xC0 - msr cpsr_cf, #0xD3 - - /* Set the stack pointer. */ - ldr sp, =__stack_top - - /* Zero .bss. */ - ldr r0, =__bss_start__ - ldr r1, =__bss_end__ - mov r2, #0 -1: - cmp r0, r1 - bge 2f - str r2, [r0], #4 - b 1b -2: - - /* Run global constructors. */ - ldr r4, =__init_array_start - ldr r5, =__init_array_end -3: - cmp r4, r5 - bge 4f - ldr r0, [r4], #4 - mov lr, pc - bx r0 - b 3b -4: - - bl main - -.global _panic -_panic: - ldr r0, =0x70006040 /* UART_B_BASE */ - adr r3, _panic_msg -7: - ldrb r1, [r3], #1 - cmp r1, #0 - beq 9f -8: - ldr r2, [r0, #0x14] /* UART_LSR */ - tst r2, #0x20 /* UART_LSR_THRE */ - beq 8b - str r1, [r0] - b 7b -9: - ldr r2, [r0, #0x14] /* UART_LSR */ - tst r2, #0x40 /* UART_LSR_TMTY */ - beq 9b - b _panic_reboot - -_panic_msg: - .asciz "[bpmpfw] PANIC\n" - .align 2 - -.global _panic_reboot -_panic_reboot: - ldr r0, =0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */ - ldr r1, =0xF8F00000 /* Panic code. */ - str r1, [r0] - - ldr r4, =0x60005000 /* TMR_BASE */ - - /* Write the magic */ - ldr r1, =0xC45A - str r1, [r4, #0x18C] - - /* Disable the counters */ - mov r1, #0x2 - str r1, [r4, #0x188] - - /* Start periodic timer */ - ldr r1, =0xC0000000 - str r1, [r4, #0x080] - - /* Set reboot source to the timer we started */ - ldr r1, =0x8019 - str r1, [r4, #0x180] - - /* Enable the counters */ - mov r1, #0x1 - str r1, [r4, #0x188] - -_panic_hang: - b _panic_hang diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index 70b045d0..bd03f5e2 100755 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -19,16 +19,6 @@ for arg in "$@"; do esac done -echo -echo "*** Compiling bpmpfw ***" -pushd "$ROOT_DIR/bpmpfw" -make -j$CORES -popd > /dev/null - -mkdir -p "$ROOT_DIR/sysmodule/data" -cp -vf "$ROOT_DIR/bpmpfw/out/bpmpfw.bin" "$ROOT_DIR/sysmodule/data/bpmpfw.bin" -echo - echo "*** Compiling hoc-clk ***" TITLE_ID="$(grep -oP '"title_id":\s*"0x\K(\w+)' "$ROOT_DIR/sysmodule/perms.json")" diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 0b424f9d..351f3179 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -30,9 +30,7 @@ #include #include #include -#ifdef __SWITCH__ // Wont be defined in BPMP-FW #include -#endif typedef enum { diff --git a/Source/hoc-clk/common/include/hocclk/bpmp.h b/Source/hoc-clk/common/include/hocclk/bpmp.h deleted file mode 100644 index d9c6ffba..00000000 --- a/Source/hoc-clk/common/include/hocclk/bpmp.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once - -#include -#include "board.h" - -#define HOCCLK_BPMP_MAGIC 0x42504D50 // 'BPMP' - -typedef enum { - HocClkBpmpCmd_None = 0, - HocClkBpmpCmd_RequestShutdown = 1, // Request BPMP-FW to shut down for sleep mode. - HocClkBpmpCmd_SetUartEnabled = 2, // cmdArg1: 0/1. -} HocClkBpmpCmd; - -/* - * Shared with BPMP-FW - * Any 64 bit data type is not permitted. - */ -typedef struct { - u32 magic; // should be HOCCLK_BPMP_MAGIC once bpmpfw is running - u32 status; // Reserved for error codes and such - s32 tempCpu; - s32 tempGpu; - s32 tempMem; - s32 tempPllx; - u32 freqCpu; // kHz - u32 freqMem; // kHz - u32 freqMemPll; // kHz - u32 emcLoadAll; - u32 emcLoadCpu; - u32 emcBwAll; - u32 emcBwCpu; - u32 emcBwGpu; - u32 cmd; // HocClkBpmpCmd; 0 = no command pending - u32 cmdArg1; - u32 cmdArg2; - u32 cmdArg3; - u32 cmdArg4; - s32 tempAO; -} HocClkBpmpSharedInfo; - -static_assert(sizeof(HocClkBpmpSharedInfo) == 0x50); diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index bbe70207..eaf89b55 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -29,7 +29,6 @@ #include #include "board.h" -#include "bpmp.h" typedef struct { @@ -85,11 +84,8 @@ typedef struct { bool rebootRequired; bool isFirstLoad; - // Populated from bpmpfw's work-RAM via SmcCopyFromIram (see HocClkBpmpSharedInfo above). - HocClkBpmpSharedInfo bpmpInfo; - // Reserved for future use - u8 reserved[0x308]; + u8 reserved[0x358]; } HocClkContext; typedef struct diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index a72db69a..322cb480 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -44,7 +44,6 @@ tsl::elm::ListItem* aotagTempItem = NULL; tsl::elm::ListItem* dramTempItem = NULL; tsl::elm::ListItem* cTypeItem = NULL; tsl::elm::ListItem* creditsItem = NULL; -tsl::elm::ListItem* bpmpStatusItem = NULL; #define R_ARROW "\u2192" @@ -153,8 +152,6 @@ void AboutGui::listUI() // custRevItem = new tsl::elm::ListItem("CUST revision:"); // this->listElement->addItem(custRevItem); - bpmpStatusItem = new tsl::elm::ListItem("BPMP Status:"); - this->listElement->addItem(bpmpStatusItem); kipVersionItem = new tsl::elm::ListItem("KIP version:"); this->listElement->addItem(kipVersionItem); @@ -285,7 +282,6 @@ void AboutGui::refresh() dramTempItem->setValue(strings[12]); cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); - bpmpStatusItem->setValue(this->context->bpmpInfo.magic == HOCCLK_BPMP_MAGIC ? "Enabled" : "Halted"); } class CreditsSubMenu : public AboutGui { diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index 7c2eb292..03b7eb07 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -22,7 +22,7 @@ CONFIG_DIR := horizon-oc BUILD := build OUTDIR := out RESOURCES := res -SOURCES := src src/hos src/i2c src/ipc src/board src/bpmp src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util +SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util DATA := data INCLUDES := ../common/include src/hos src/soc src/i2c src/util src/pwr src/ipc EXEFS_SRC := exefs_src @@ -105,7 +105,7 @@ export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC) export APP_JSON := $(TOPDIR)/perms.json -.PHONY: $(BUILD) clean clean-libs clean-build all libs sync-bpmpfw +.PHONY: $(BUILD) clean clean-libs clean-build all libs #--------------------------------------------------------------------------------- all: $(BUILD) @@ -116,11 +116,7 @@ libs: $(LIBNAMES): @echo $@ -sync-bpmpfw: - @$(MAKE) --no-print-directory -C $(TOPDIR)/../bpmpfw - @cp -f $(TOPDIR)/../bpmpfw/out/bpmpfw.bin $(TOPDIR)/data/bpmpfw.bin - -$(BUILD): libs sync-bpmpfw +$(BUILD): libs @[ -d $@ ] || mkdir -p $@ @[ -d $(OUTDIR) ] || mkdir -p $(OUTDIR) @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile diff --git a/Source/hoc-clk/sysmodule/perms.json b/Source/hoc-clk/sysmodule/perms.json index d6f859d8..10f005cb 100644 --- a/Source/hoc-clk/sysmodule/perms.json +++ b/Source/hoc-clk/sysmodule/perms.json @@ -3,7 +3,7 @@ "title_id": "0x00FF0000636C6BFF", "title_id_range_min": "0x00FF0000636C6BFF", "title_id_range_max": "0x00FF0000636C6BFF", - "main_thread_stack_size": "0x0000F000", + "main_thread_stack_size": "0x0000C000", "main_thread_priority": 16, "default_cpu_id": 3, "process_category": 1, @@ -46,14 +46,7 @@ "size": "0x00001000", "is_io": true } - }, { - "type": "map", - "value": { - "address": "0x60005000", - "is_ro": false, - "size": "0x00001000", - "is_io": true - } + }, { "type": "map", "value": { diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 2030a615..1ca1f922 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -34,7 +34,6 @@ #include #include -#include "../bpmp/bpmp.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/file_utils.hpp" #include "../hos/apm_ext.h" @@ -53,13 +52,7 @@ #include "../soc/dram_mrr.hpp" namespace board { - u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr, tmrVirtAddr; - consteval inline u32 PackCode(u32 r, u32 g, u32 b) { - return ((r & 0xF) << 8) | ((g & 0xF) << 4) | ((b & 0xF) << 0); - } - const u32 GpuPanic = PackCode(0xF, 0x7, 0x0); - const u32 CpuPanic = PackCode(0xF, 0x0, 0x0); - const u32 RamPanic = PackCode(0x0, 0xF, 0xF); + u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; HocClkSocType gSocType; u8 gDramID; @@ -160,16 +153,6 @@ namespace board { rc = QueryMemoryMapping(&fuseVirtAddr, 0x7000F000, 0x1000); ASSERT_RESULT_OK(rc, "QueryMemoryMapping (fuse)"); - rc = QueryMemoryMapping(&sysVirtAddr, 0x6000C000, 0x1000); - ASSERT_RESULT_OK(rc, "QueryMemoryMapping (sys)"); - actmonVirtAddr = sysVirtAddr + 0x800; - - rc = QueryMemoryMapping(&gpuVirtAddr, 0x57000000, 0x1000000); - ASSERT_RESULT_OK(rc, "QueryMemoryMapping (gpu)"); - - rc = QueryMemoryMapping(&tmrVirtAddr, 0x60005000, 0x1000); - ASSERT_RESULT_OK(rc, "QueryMemoryMapping (tmr)"); - FetchHardwareInfos(); Result nvCheck = 1; @@ -190,12 +173,6 @@ namespace board { tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG - Result bpmpfwRc = bpmp::StartBpmfwExecution(); - if (R_FAILED(bpmpfwRc)) { - file::utils::LogLine("[bpmp] StartBpmfwExecution failed: 0x%x", bpmpfwRc); - } - bpmp::StartSleepMonitorThread(); - // PMC exosphere check SecmonArgs args = {}; args.X[0] = 0xF0000002; @@ -224,7 +201,6 @@ namespace board { } void Exit() { - bpmp::StopSleepMonitorThread(); if (HOSSVC_HAS_CLKRST) { clkrstExit(); @@ -254,30 +230,6 @@ namespace board { nvExit(); } - #define MMIO32(addr) (*reinterpret_cast(addr)) - NX_NORETURN void Panic(u32 c) { - SmcReadWriteRegister(0x7000EC40 /* PMC_BASE + APBDEV_PMC_SCRATCH200 */, ~0, c); - - /* Write timer magic */ - MMIO32(tmrVirtAddr + 0x18C) = 0xC45A; - - /* Disable counters */ - MMIO32(tmrVirtAddr + 0x188) = 0x2; - - /* Start periodic timer */ - MMIO32(tmrVirtAddr + 0x80) = 0xC0000000; - - /* Set the reboot source to the timer */ - MMIO32(tmrVirtAddr + 0x180) = 0x8019; - - /* Enable counter */ - MMIO32(tmrVirtAddr + 0x188) = 0x1; - - /* Hang. */ - for(;;) - ; - } - HocClkSocType GetSocType() { return gSocType; } diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 178ba09e..0ba40487 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -42,15 +42,12 @@ #define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0)) namespace board { - extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr; + extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; extern HocClkSocType gSocType; extern u8 gDramID; extern HocClkConsoleType gConsoleType; extern FuseData fuseData; extern u8 speedoBracket; - extern const u32 GpuPanic; - extern const u32 CpuPanic; - extern const u32 RamPanic; void Initialize(); void Exit(); @@ -62,6 +59,5 @@ namespace board { bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); - NX_NORETURN void Panic(u32 c); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index c700eb72..0e8944aa 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -28,15 +28,16 @@ #include #include #include +#include #include -#include "../bpmp/bpmp.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" #include "../file/errors.hpp" #include "../hos/apm_ext.h" #include "../i2c/i2cDrv.h" #include "../soc/gm20b.hpp" +#include "../soc/pllmb.hpp" #include "board.hpp" #include "board_name.hpp" #include @@ -183,30 +184,13 @@ namespace board { u32 hz = 0; switch (module) { case HocClkModule_CPU: - return bpmp::GetSharedInfo()->freqCpu * 1000; - case HocClkModule_GPU: { - constexpr u32 ClkOutEnbX = 0x280; - constexpr u32 RstDevicesX = 0x28C; - constexpr u32 GpuBit = (1u << 24); - - const bool gpuEnabled = (*reinterpret_cast(clkVirtAddr + ClkOutEnbX) & GpuBit) && - !(*reinterpret_cast(clkVirtAddr + RstDevicesX) & GpuBit); - if (!gpuEnabled) { - return 0; - } - - const u32 coeff = *reinterpret_cast(gpuVirtAddr + 0x137004); - const u32 divm = coeff & 0xFF; - const u32 divn = (coeff >> 8) & 0xFF; - const u32 divp = (coeff >> 16) & 0x3F; - if (divm == 0 || divp == 0) { - return 0; - } - - return static_cast((static_cast(38400000) * divn) / (divm * divp) / 2); - } + return t210ClkCpuFreq(); + case HocClkModule_GPU: + return t210ClkGpuFreq(); case HocClkModule_MEM: - return bpmp::GetSharedInfo()->freqMemPll * 1000; + return file::config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL + ? pllmb::getRamClockRatePLLMB() + : t210ClkMemFreq(); case HocClkModule_Display: return GetDisplayRate(hz); default: diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index 669f46d2..bf814453 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -33,9 +33,9 @@ #include #include #include +#include #include -#include "../bpmp/bpmp.hpp" #include "../hos/apm_ext.h" #include "board.hpp" #include "board_misc.hpp" @@ -116,9 +116,9 @@ namespace board { u32 GetPartLoad(HocClkPartLoad loadSource) { switch (loadSource) { case HocClkPartLoad_EMC: - return bpmp::GetSharedInfo()->emcLoadAll; + return t210EmcLoadAll(); case HocClkPartLoad_EMCCpu: - return bpmp::GetSharedInfo()->emcLoadCpu; + return t210EmcLoadCpu(); case HocClkPartLoad_GPU: return gpuLoad; case HocClkPartLoad_CPUMax: @@ -130,13 +130,13 @@ namespace board { case HocClkPartLoad_FAN: return GetFanLevel(); case HocClkPartLoad_RamBWAll: - return bpmp::GetSharedInfo()->emcBwAll; + return t210EmcBwAll(); case HocClkPartLoad_RamBWCpu: - return bpmp::GetSharedInfo()->emcBwCpu; + return t210EmcBwCpu(); case HocClkPartLoad_RamBWGpu: - return bpmp::GetSharedInfo()->emcBwGpu; + return t210EmcBwGpu(); case HocClkPartLoad_RamBWPeak: - return static_cast((static_cast(bpmp::GetSharedInfo()->freqMem) * 16) / 1000); + return t210EmcBwPeak(); default: ASSERT_ENUM_VALID(HocClkPartLoad, loadSource); } diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp deleted file mode 100644 index d28d3351..00000000 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include - -#include "../board/board.hpp" -#include "../file/config.hpp" -#include "../file/file_utils.hpp" -#include "../mapping/mem_map.hpp" -#include "../tsensor/soctherm.hpp" -#include "bpmp.hpp" - -#include "bpmpfw_bin.h" - -namespace bpmp { - - namespace { - - constexpr u64 FlowCtlrPhysBase = 0x60007000; - constexpr u64 EvpPhysBase = 0x6000F000; - - constexpr u32 ClkRstRstDevLSet = 0x300; - constexpr u32 ClkRstRstDevLClr = 0x304; - constexpr u32 RstDevLCopRstBit = (1u << 1); /* SWR_COP_RST */ - - constexpr u32 ApbMiscSlaveSecurityReg0 = 0xC00; - constexpr u32 ApbMiscSlaveSecurityReg1 = 0xC04; - constexpr u32 ApbMiscSlaveSecurityReg2 = 0xC08; - - /* Relative to actmonVirtAddr */ - constexpr u32 ActmonGlbPeriodCtrl = 0x004; - constexpr u32 ActmonCopCtrl = 0xC0; - constexpr u32 ActmonCopUpperWmark = 0xC4; - constexpr u32 ActmonCopIntrStatus = 0xE4; - - constexpr u32 ActmonGlbPeriodCtrlUsec = (1u << 8); - constexpr u32 ActmonCopCtrlStockArmed = (1u << 31) | (1u << 30) | (1u << 18); - - /* MC SMMU handling for the BPMP. */ - constexpr u64 McPhysBase = 0x70019000; - - constexpr u32 McSmmuTlbConfig = 0x014; - constexpr u32 McSmmuPtbAsid = 0x01C; - constexpr u32 McSmmuPtbData = 0x020; - constexpr u32 McSmmuTlbFlush = 0x030; - constexpr u32 McSmmuPtcFlush = 0x034; - constexpr u32 McSmmuAvpcAsid = 0x23C; - constexpr u32 McSmmuPpcs1Asid = 0x298; - - /* Page table is backed by the security engine's MMIO aperture. */ - constexpr u64 BpmpSmmuPdeBase = 0x70012000; - constexpr u32 BpmpSmmuAsid = 1; - - /* MC_SMMU_PTB_ASID */ - constexpr u32 SmmuPtbAsidCurrentAsid = BpmpSmmuAsid; /* [0:7] */ - - /* MC_SMMU_PTB_DATA */ - constexpr u32 SmmuPtbDataPdeMask = 0x7FFFFF; /* [0:22] */ - - /* MC_SMMU_AVPC_ASID / MC_SMMU_PPCS1_ASID */ - constexpr u32 SmmuClientSmmuEnableBit = (1u << 31); - constexpr u32 SmmuAvpcAsidValue = (SmmuClientSmmuEnableBit | BpmpSmmuAsid); - constexpr u32 SmmuPpcs1AsidValue = (SmmuClientSmmuEnableBit | BpmpSmmuAsid); - - constexpr u32 EvpCopResetVector = 0x200; - constexpr u32 EvpCopUndefVector = 0x204; - constexpr u32 EvpCopSwiVector = 0x208; - constexpr u32 EvpCopPrefetchAbortVector = 0x20C; - constexpr u32 EvpCopDataAbortVector = 0x210; - constexpr u32 EvpCopRsvdVector = 0x214; - constexpr u32 EvpCopIrqVector = 0x218; - constexpr u32 EvpCopFiqVector = 0x21C; - - constexpr u32 StockBpmpExceptionVector = 0x7D000000; - - constexpr u32 FlowCtlrHaltCopEvents = 0x004; - constexpr u32 FlowModeNone = 0x00000000; - constexpr u32 FlowModeStop = (2u << 29); - - constexpr u64 FwIramPhysBase = 0x40004000; - constexpr u32 FwStagingSize = 0x8000; - constexpr u64 WorkRamPhysBase = FwIramPhysBase + FwStagingSize; // matches bpmpfw's WorkRamStart - - /* secmon will return error unless we apply thiss workaround */ - alignas(4096) u8 s_fwStageBuf[FwStagingSize]; - - HocClkBpmpSharedInfo s_sharedInfo = {}; - - inline volatile u32 &Mmio(u64 base_va, u32 offset) { - return *reinterpret_cast(base_va + offset); - } - - // Late in the boot chain, otherwise a fatal will occur from invalid boot state - constexpr u32 pscDependencies[] = { PscPmModuleId_Olsc }; - constexpr PscPmModuleId PscModuleId = (PscPmModuleId)705; - - PscPmModule s_pscModule; - bool s_pscPrepared = false; - Thread s_pscThread; - bool s_pscExit = false; - - std::atomic_bool s_isAwake = true; - - - /* Must be called to prevent secmon/erpt panic on wake */ - void RequestBpmpExitAndWait() { - if (!IsPatchedExosphere()) { - return; - } - - const u32 cmd = HocClkBpmpCmd_RequestShutdown; - Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, cmd), &cmd, sizeof(cmd)); - if (R_FAILED(rc)) { - file::utils::LogLine("[bpmp] RequestBpmpExitAndWait: SmcCopyToIram failed: 0x%x", rc); - return; - } - - constexpr int MaxAttempts = 20; - constexpr u64 PollIntervalNs = 20'000'000; // 20ms - - HocClkBpmpSharedInfo info = {}; - for (int i = 0; i < MaxAttempts; i++) { - svcSleepThread(PollIntervalNs); - - rc = SmcCopyFromIram(&info, WorkRamPhysBase, sizeof(info)); - if (R_SUCCEEDED(rc) && info.magic != HOCCLK_BPMP_MAGIC) { - return; - } - } - - file::utils::LogLine("[bpmp] RequestBpmpExitAndWait: BPMP timeout (cannot sleep)"); - board::Panic(board::CpuPanic); - } - - void EnableBpmpSmmu() { - /* Point the ASID page table at the security engine aperture. */ - const u32 pde_base = static_cast(BpmpSmmuPdeBase / 0x1000); - - /* Select the ASID and configure its page table entry. */ - SmcReadWriteRegister(McPhysBase + McSmmuPtbAsid, 0xFFFFFFFF, SmmuPtbAsidCurrentAsid); - SmcReadWriteRegister(McPhysBase + McSmmuPtbData, 0xFFFFFFFF, pde_base & SmmuPtbDataPdeMask); - - /* Route BPMP (AVPC) and PPCS1 through the SMMU. */ - SmcReadWriteRegister(McPhysBase + McSmmuAvpcAsid, 0xFFFFFFFF, SmmuAvpcAsidValue); - SmcReadWriteRegister(McPhysBase + McSmmuPpcs1Asid, 0xFFFFFFFF, SmmuPpcs1AsidValue); - - /* Flush the page table cache. */ - SmcReadWriteRegister(McPhysBase + McSmmuPtcFlush, 0xFFFFFFFF, 0); - SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); - - /* Flush the translation lookaside buffer. */ - SmcReadWriteRegister(McPhysBase + McSmmuTlbFlush, 0xFFFFFFFF, 0); - SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); - } - - void DisableBpmpSmmu() { - /* Clear the ASID page table. */ - SmcReadWriteRegister(McPhysBase + McSmmuPtbAsid, 0xFFFFFFFF, SmmuPtbAsidCurrentAsid); - SmcReadWriteRegister(McPhysBase + McSmmuPtbData, 0xFFFFFFFF, 0); - SmcReadWriteRegister(McPhysBase + McSmmuAvpcAsid, 0xFFFFFFFF, 0); - SmcReadWriteRegister(McPhysBase + McSmmuPpcs1Asid, 0xFFFFFFFF, 0); - - /* Flush the page table cache. */ - SmcReadWriteRegister(McPhysBase + McSmmuPtcFlush, 0xFFFFFFFF, 0); - SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); - - /* Flush the translation lookaside buffer. */ - SmcReadWriteRegister(McPhysBase + McSmmuTlbFlush, 0xFFFFFFFF, 0); - SmcReadWriteRegister(McPhysBase + McSmmuTlbConfig, 0, 0); - } - - bool WaitForBpmpReady(int maxAttempts = 50, u64 pollIntervalNs = 20'000'000) { - HocClkBpmpSharedInfo info = {}; - for (int i = 0; i < maxAttempts; i++) { - Result rc = SmcCopyFromIram(&info, WorkRamPhysBase, sizeof(info)); - if (R_SUCCEEDED(rc) && info.magic == HOCCLK_BPMP_MAGIC) { - return true; - } - svcSleepThread(pollIntervalNs); - } - return false; - } - - void SendBpmpCommand(HocClkBpmpCmd cmd, u32 arg1 = 0, u32 arg2 = 0, u32 arg3 = 0, u32 arg4 = 0) { - if (!WaitForBpmpReady()) { - file::utils::LogLine("[bpmp] SendBpmpCommand: BPMP never signaled ready (cmd=%u)", static_cast(cmd)); - return; - } - - struct { - u32 cmd; - u32 cmdArg1; - u32 cmdArg2; - u32 cmdArg3; - u32 cmdArg4; - } req = { static_cast(cmd), arg1, arg2, arg3, arg4 }; - static_assert(offsetof(HocClkBpmpSharedInfo, cmdArg1) == offsetof(HocClkBpmpSharedInfo, cmd) + 1 * sizeof(u32)); - static_assert(offsetof(HocClkBpmpSharedInfo, cmdArg4) == offsetof(HocClkBpmpSharedInfo, cmd) + 4 * sizeof(u32)); - - const Result rc = SmcCopyToIram(WorkRamPhysBase + offsetof(HocClkBpmpSharedInfo, cmd), &req, sizeof(req)); - if (R_FAILED(rc)) { - file::utils::LogLine("[bpmp] SendBpmpCommand: SmcCopyToIram failed: 0x%x (cmd=%u)", rc, static_cast(cmd)); - } - } - - void RestoreStockState() { - RequestBpmpExitAndWait(); - - SmcReadWriteRegister(EvpPhysBase + EvpCopResetVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopUndefVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopSwiVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopPrefetchAbortVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopDataAbortVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopRsvdVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopIrqVector, 0xFFFFFFFF, StockBpmpExceptionVector); - SmcReadWriteRegister(EvpPhysBase + EvpCopFiqVector, 0xFFFFFFFF, StockBpmpExceptionVector); - - SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0xFFFFFFFF, FlowModeStop); - - Mmio(board::actmonVirtAddr, ActmonGlbPeriodCtrl) = ActmonGlbPeriodCtrlUsec; - Mmio(board::actmonVirtAddr, ActmonCopUpperWmark) = 0; - Mmio(board::actmonVirtAddr, ActmonCopIntrStatus) = Mmio(board::actmonVirtAddr, ActmonCopIntrStatus); - Mmio(board::actmonVirtAddr, ActmonCopCtrl) = ActmonCopCtrlStockArmed; - - EnableBpmpSmmu(); - } - - void PscThreadFunc(void *) { - while (!s_pscExit) { - Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); - if (R_FAILED(rc)) { - continue; // Timeout - } - - PscPmState state; - u32 flags; - rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); - if (R_SUCCEEDED(rc)) { - if (state == PscPmState_Awake) { - svcSleepThread(500'000'000); // 500ms - - /* I have no clue why this is needed as it wasn't needed before ¯\(ツ)/¯ */ - tsensor::InitializeSoctherm(); - - Result wrc = StartBpmfwExecution(); - if (R_FAILED(wrc)) { - file::utils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); - } - - s_isAwake = true; - } else if (state == PscPmState_ReadySleep || state == PscPmState_ReadyShutdown) { - RestoreStockState(); - s_isAwake = false; - } - - pscPmModuleAcknowledge(&s_pscModule, state); - } - } - } - - } // namespace - - Result StartBpmfwExecution() { - if (!IsPatchedExosphere()) { - file::utils::LogLine("[bpmp] Cannot start without patched exosphere"); - return (Result)1; - } - - const size_t fw_size = bpmpfw_bin_size; - if (fw_size == 0 || fw_size > FwStagingSize) { - file::utils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw of %zu bytes is invalid (should not happen)!", fw_size); - return (Result)1; - } - - std::memcpy(s_fwStageBuf, bpmpfw_bin, fw_size); - - file::utils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx", - fw_size, static_cast(FwIramPhysBase)); - - /* Disable the SMMU so DRAM can be accessed */ - DisableBpmpSmmu(); - - /* Set BPMP reset */ - Mmio(board::clkVirtAddr, ClkRstRstDevLSet) = RstDevLCopRstBit; - - /* Grant BPMP access to all a bunch of registers that are useful */ - Mmio(board::apbVirtAddr, ApbMiscSlaveSecurityReg0) = 0; - Mmio(board::apbVirtAddr, ApbMiscSlaveSecurityReg1) = 0; - Mmio(board::apbVirtAddr, ApbMiscSlaveSecurityReg2) = 0; - - /* Set up exeption vectors for bpmp */ - const u32 fw_reset_vector = static_cast(FwIramPhysBase + 0x0); - const u32 fw_panic_vector = static_cast(FwIramPhysBase + 0x4); - - SmcReadWriteRegister(EvpPhysBase + EvpCopResetVector, 0xFFFFFFFF, fw_reset_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopUndefVector, 0xFFFFFFFF, fw_panic_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopSwiVector, 0xFFFFFFFF, fw_panic_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopPrefetchAbortVector, 0xFFFFFFFF, fw_panic_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopDataAbortVector, 0xFFFFFFFF, fw_panic_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopRsvdVector, 0xFFFFFFFF, fw_panic_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopIrqVector, 0xFFFFFFFF, fw_panic_vector); - SmcReadWriteRegister(EvpPhysBase + EvpCopFiqVector, 0xFFFFFFFF, fw_panic_vector); - - /* Disable actmon monitoring to avoid hang on FW >4.0.0 */ - Mmio(board::actmonVirtAddr, ActmonCopCtrl) = 0; - Mmio(board::actmonVirtAddr, ActmonCopIntrStatus) = Mmio(board::actmonVirtAddr, ActmonCopIntrStatus); - - /* Load the BPMPFW into iram per page. TODO: determine if this is nessesary */ - constexpr size_t PageSize = 4096; - for (size_t ofs = 0; ofs < fw_size; ofs += PageSize) { - const size_t chunk = (fw_size - ofs) < PageSize ? (fw_size - ofs) : PageSize; - - Result copy_rc = SmcCopyToIram(FwIramPhysBase + ofs, s_fwStageBuf + ofs, static_cast(chunk)); - if (R_FAILED(copy_rc)) { - file::utils::LogLine("[bpmp] SmcCopyToIram failed at +0x%zx: 0x%x", ofs, copy_rc); - return copy_rc; - } - } - - /* Clear BPMP reset. */ - Mmio(board::clkVirtAddr, ClkRstRstDevLClr) = RstDevLCopRstBit; - - /* Clear the halt written by bootloader. */ - SmcReadWriteRegister(FlowCtlrPhysBase + FlowCtlrHaltCopEvents, 0xFFFFFFFF, FlowModeNone); - - SendBpmpCommand(HocClkBpmpCmd_SetUartEnabled, file::utils::IsUartEnabled() ? 1u : 0u); - - return 0; - } - - void StartSleepMonitorThread() { - if (!IsPatchedExosphere()) { - file::utils::LogLine("[bpmp] Cant start BPMP without exosphere patch"); - return; - } - - Result rc = pscmInitialize(); - if (R_FAILED(rc)) { - file::utils::LogLine("[bpmp] pscmInitialize failed: 0x%x", rc); - return; - } - - rc = pscmGetPmModule(&s_pscModule, PscModuleId, pscDependencies, sizeof(pscDependencies) / sizeof(u32), true); - if (R_FAILED(rc)) { - file::utils::LogLine("[bpmp] pscmGetPmModule failed: 0x%x", rc); - pscmExit(); - return; - } - s_pscPrepared = true; - - rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); - if (R_FAILED(rc)) { - file::utils::LogLine("[bpmp] failed to create psc thread: 0x%x", rc); - return; - } - threadStart(&s_pscThread); - } - - void StopSleepMonitorThread() { - if (!s_pscPrepared) { - return; - } - - s_pscExit = true; - eventFire(&s_pscModule.event); - threadWaitForExit(&s_pscThread); - threadClose(&s_pscThread); - - pscPmModuleFinalize(&s_pscModule); - pscPmModuleClose(&s_pscModule); - pscmExit(); - s_pscPrepared = false; - } - - const HocClkBpmpSharedInfo *GetSharedInfo() { - if (!IsPatchedExosphere()) { - s_sharedInfo = {}; - return &s_sharedInfo; - } - - SmcCopyFromIram(&s_sharedInfo, WorkRamPhysBase, sizeof(s_sharedInfo)); - return &s_sharedInfo; - } - - bool IsAwake() { - return s_isAwake; - } - -} // namespace bpmp diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp deleted file mode 100644 index f89810bb..00000000 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include - -#include - -namespace bpmp { - Result StartBpmfwExecution(); - - void StartSleepMonitorThread(); - void StopSleepMonitorThread(); - - const HocClkBpmpSharedInfo *GetSharedInfo(); - - // Always true on stock exosphere - bool IsAwake(); -} diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index 4f849aa7..0f807665 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -66,35 +66,3 @@ Result SmcCopyToIram(uintptr_t dest, const void *src, u32 size) { } return rc; } - -bool IsPatchedExosphere() { - static bool checked = false; - static bool patched = false; - - if (!checked) { - constexpr u64 EvpPhysBase = 0x6000F000; - constexpr u64 EvpCopResetVector = 0x200; - - SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = EvpPhysBase + EvpCopResetVector; - args.X[2] = 0; - args.X[3] = 0; - svcCallSecureMonitor(&args); - - patched = (args.X[0] == 0); - checked = true; - } - - return patched; -} - -u32 SmcReadWriteRegister(u64 phys_addr, u32 mask, u32 value) { - SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = phys_addr; - args.X[2] = mask; - args.X[3] = value; - svcCallSecureMonitor(&args); - return (u32)args.X[1]; -} \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp index fa5900aa..6cb6e1be 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp @@ -22,5 +22,3 @@ Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size); Result MapAddress(u64 &va, const u64 &physAddr, const char *name); Result SmcCopyFromIram(void *dest, uintptr_t src, u32 size); Result SmcCopyToIram(uintptr_t dest, const void *src, u32 size); -bool IsPatchedExosphere(); -u32 SmcReadWriteRegister(u64 phys_addr, u32 mask, u32 value); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 5d705099..03a9ed26 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -30,7 +30,6 @@ #include #include "../board/board.hpp" -#include "../bpmp/bpmp.hpp" #include "../display/aula.hpp" #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" @@ -630,8 +629,6 @@ namespace mgr { bool RefreshContext() { bool hasChanged = false; - gContext.bpmpInfo = *bpmp::GetSharedInfo(); - std::uint32_t mode = 0; Result rc = apmExtGetCurrentPerformanceConfiguration(&mode); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); @@ -882,10 +879,6 @@ namespace mgr { } void WaitForNextTick() { - if (!bpmp::IsAwake()) { - svcSleepThread(250 * 1000000ULL); // 250ms - return; - } if (board::GetHz(HocClkModule_MEM) > 665000000) svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp new file mode 100644 index 00000000..c9ad36bb --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) Souldbminer + * + * Copyright (c) KazushiMe + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "pllmb.hpp" + +namespace pllmb { +#define GET_BITS(VAL, HIGH, LOW) ((VAL & ((1UL << (HIGH + 1UL)) - 1UL)) >> LOW) +#define GET_BIT(VAL, BIT) GET_BITS(VAL, BIT, BIT) + + static inline volatile u32 ®(uintptr_t addr) { + return *reinterpret_cast(addr); + } + + // From jetson nano kernel + typedef enum { + /* divider = 2 */ + CLK_PLLX = 5, + CLK_PLLM = 2, + CLK_PLLMB = 37, + /* PLLX & PLLG are backup PLLs for CPU & GPU */ + /* divider = 1 */ + CLK_CCLK_G = 18, // A57 CPU cluster + CLK_EMC = 36, + } PTO_ID; // PLL Test Output Register ID + + /* See if GM20B clock GPC PLL regs are accessible. */ + +#define PLLX_MISC0 0xE4 +#define PLLM_MISC2 0x9C + + double ptoGetMHz(PTO_ID pto_id, u32 divider = 1, u32 presel_reg = 0, u32 presel_mask = 0) { + u32 pre_val, val, presel_val; + + if (presel_reg) { + val = REG(board::clkVirtAddr + presel_reg); + usleep(10); + presel_val = val & presel_mask; + val &= ~presel_mask; + val |= presel_mask; + REG(board::clkVirtAddr + presel_reg) = val; + usleep(10); + } + + constexpr u32 cycle_count = 16; + pre_val = REG(board::clkVirtAddr + 0x60); + val = BIT(23) | BIT(13) | (cycle_count - 1); + val |= pto_id << 14; + + REG(board::clkVirtAddr + 0x60) = val; + usleep(10); + REG(board::clkVirtAddr + 0x60) = val | BIT(10); + usleep(10); + REG(board::clkVirtAddr + 0x60) = val; + usleep(10); + REG(board::clkVirtAddr + 0x60) = val | BIT(9); + usleep(500); + + while (REG(board::clkVirtAddr + 0x64) & BIT(31)) + ; + + val = REG(board::clkVirtAddr + 0x64); + val &= 0xFFFFFF; + val *= divider; + + double rate_hz = (u64)val * 32768. / cycle_count; + usleep(10); + REG(board::clkVirtAddr + 0x60) = pre_val; + usleep(10); + + if (presel_reg) { + val = REG(board::clkVirtAddr + presel_reg); + usleep(10); + val &= ~presel_mask; + val |= presel_val; + REG(board::clkVirtAddr + presel_reg) = val; + usleep(10); + } + + return rate_hz; + } + + u64 getRamClockRatePLLMB() { + // printf("\n" + // "EMC: %6.1f MHz\n" + // "CCLK_G: %6.1f MHz\n" + // "PLLX: %6.1f MHz\n" + // "PLLM: %6.1f MHz\n" + // "PLLMB: %6.1f MHz\n", + // ptoGetMHz(CLK_EMC), + // ptoGetMHz(CLK_CCLK_G), + // ptoGetMHz(CLK_PLLX, 2, PLLX_MISC0, BIT(22)), + // ptoGetMHz(CLK_PLLM, 2, PLLM_MISC2, BIT(8)), + // ptoGetMHz(CLK_PLLMB, 2, PLLM_MISC2, BIT(9)) + // ); + + u32 pllmb = ptoGetMHz(CLK_PLLMB, 2, PLLM_MISC2, BIT(9)); + u32 pllm = ptoGetMHz(CLK_PLLM, 2, PLLM_MISC2, BIT(8)); + return pllmb == 0 ? pllm : pllmb; // pllmb is zeroed out at times, fallback to pllm + } +} // namespace pllmb \ No newline at end of file diff --git a/Source/hoc-clk/bpmpfw/source/libc_platform.hpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp similarity index 73% rename from Source/hoc-clk/bpmpfw/source/libc_platform.hpp rename to Source/hoc-clk/sysmodule/src/soc/pllmb.hpp index f29c8b03..e65472fd 100644 --- a/Source/hoc-clk/bpmpfw/source/libc_platform.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp @@ -1,5 +1,7 @@ /* - * Copyright (c) Souldbminer, Lightos and Horizon OC Contributors + * Copyright (c) Souldbminer + * + * Copyright (c) KazushiMe * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -16,5 +18,14 @@ */ #pragma once +#include +#include +#include +#include -void InitializeLibc(); +#include "../board/board.hpp" + +namespace pllmb { + + u64 getRamClockRatePLLMB(); +} \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.c b/Source/hoc-clk/sysmodule/src/soc/t210.c new file mode 100644 index 00000000..d787976f --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/soc/t210.c @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2020-2023 CTCaer + * Copyright (c) 2023 p-sam + * Copyright (c) 2023 Lineon + * Copyright (c) 2026 Souldbminer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "t210.h" + +#define WAIT_NS 1000000000UL + +#define usleep(x) svcSleepThread(1000UL * x) + +#define GPU_TRIM_SYS_GPCPLL_COEFF 0x4 +#define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(g_gpu_base + 0x137000ul + (x))) + +#define CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL 0x60 +#define CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS 0x64 +#define CLK_RST_CONTROLLER_CLK_OUT_ENB_X 0x280 +#define CLK_RST_CONTROLLER_RST_DEVICES_X 0x28C + +/*! PTO_CLK_CNT */ +#define PTO_REF_CLK_WIN_CFG_MASK 0xF +#define PTO_REF_CLK_WIN_CFG_16P 0xF +#define PTO_CNT_EN BIT(9) +#define PTO_CNT_RST BIT(10) +#define PTO_CLK_ENABLE BIT(13) +#define PTO_SRC_SEL_SHIFT 14 +#define PTO_SRC_SEL_MASK 0x1FF +#define PTO_DIV_SEL_MASK (3 << 23) +#define PTO_DIV_SEL_GATED (0 << 23) +#define PTO_DIV_SEL_DIV1 (1 << 23) +#define PTO_DIV_SEL_DIV2_RISING (2 << 23) +#define PTO_DIV_SEL_DIV2_FALLING (3 << 23) +#define PTO_DIV_SEL_CPU_EARLY (0 << 23) +#define PTO_DIV_SEL_CPU_LATE (1 << 23) + +#define PTO_CLK_CNT_BUSY BIT(31) +#define PTO_CLK_CNT 0xFFFFFF +#define CLK_PTO_CCLK_G_DIV2 0x13 +#define CLK_PTO_EMC 0x24 + +#define CLOCK(x) (*(volatile u32 *)(g_clk_base + (x))) + +/* Actmon Global registers */ +#define ACTMON_GLB_STATUS 0x0 +#define ACTMON_MCCPU_MON_ACT BIT(8) +#define ACTMON_MCALL_MON_ACT BIT(9) +#define ACTMON_CPU_FREQ_MON_ACT BIT(10) +#define ACTMON_BPMP_MON_ACT BIT(14) +#define ACTMON_CPU_MON_ACT BIT(15) + +#define ACTMON_GLB_PERIOD_CTRL 0x4 +#define ACTMON_GLB_PERIOD_USEC BIT(8) +#define ACTMON_GLB_PERIOD_SAMPLE(n) (((n) - 1) & 0xFF) + +/* Actmon Device Registers */ +#define ACTMON_DEV_SIZE 0x40 +/* Actmon CTRL */ +#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10) +#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18) +#define ACTMON_DEV_CTRL_ENB BIT(31) + +#define ACTMON_PERIOD_MS 20 +#define DEV_COUNT_WEIGHT 1024 + +#define ACTMON_BASE (g_act_base + 0x800) +#define ACTMON_DEV_BASE (ACTMON_BASE + 0x80) +#define ACTMON(x) (*(volatile u32 *)(ACTMON_BASE + (x))) + +typedef enum _actmon_dev_t { + ACTMON_DEV_CPU, + ACTMON_DEV_BPMP, + ACTMON_DEV_AHB, + ACTMON_DEV_APB, + ACTMON_DEV_CPU_FREQ, + ACTMON_DEV_MC_ALL, + ACTMON_DEV_MC_CPU, + + ACTMON_DEV_NUM, +} actmon_dev_t; + +typedef struct _actmon_dev_reg_t { + vu32 ctrl; + vu32 upper_wnark; + vu32 lower_wmark; + vu32 init_avg; + vu32 avg_upper_wmark; + vu32 avg_lower_wmark; + vu32 count_weight; + vu32 count; + vu32 avg_count; + vu32 intr_status; + vu32 ctrl2; + vu32 rsvd[5]; +} actmon_dev_reg_t; + +static uintptr_t g_clk_base = 0; +static uintptr_t g_gpu_base = 0; +static uintptr_t g_act_base = 0; +static u64 g_update_ticks = 0; +static u32 g_cpu_freq = 0; +static u32 g_gpu_freq = 0; +static u32 g_mem_freq = 0; +static u32 g_emc_lall = 0; +static u32 g_emc_lcpu = 0; +static u32 g_emc_bw_all = 0; +static u32 g_emc_bw_cpu = 0; +static u32 g_emc_bw_gpu = 0; + +static u32 _clock_get_dev_freq(u32 id, u32 multiplier) { + const u32 pto_win = 16; + const u32 pto_osc = 32768; + + u32 val = ((id & PTO_SRC_SEL_MASK) << PTO_SRC_SEL_SHIFT) | PTO_DIV_SEL_DIV1 | PTO_CLK_ENABLE | (pto_win - 1); + CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val; + (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); + usleep(2); + + CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_RST; + (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); + usleep(2); + + CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val; + (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); + usleep(2); + + CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_EN; + (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); + usleep((1000000ULL * pto_win / pto_osc) + 12 + 2); // 502 us. + + while (CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT_BUSY) + ; + + u32 cnt = CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT; + + CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = 0; + (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); + usleep(2); + + u32 freq_khz = (u64)cnt * multiplier * pto_osc / pto_win; + + return freq_khz; +} + +static void _actmon_dev_enable(actmon_dev_t dev, u32 freq, u32 weight) { + actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); + + regs->init_avg = (u32)freq * ACTMON_PERIOD_MS / 2; + regs->count_weight = weight; + + regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC | ACTMON_DEV_CTRL_K_VAL(3); // 8 samples average. +} + +static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) { + actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); + + return regs->avg_count; +} + +static inline Result _svcQueryMemoryMappingFallback(u64 *virtaddr, u64 physaddr, u64 size) { + if (hosversionAtLeast(10, 0, 0)) { + u64 out_size; + return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); + } else { + return svcLegacyQueryIoMapping(virtaddr, physaddr, size); + } +} + +static void _clock_update_freqs(void) { + u64 ticks = armGetSystemTick(); + if (armTicksToNs(ticks - g_update_ticks) <= WAIT_NS) { + return; + } + + g_update_ticks = ticks; + + if (!g_clk_base) { + _svcQueryMemoryMappingFallback(&g_clk_base, 0x60006000ul, 0x1000); + } + + if (!g_clk_base) { + return; + } + + g_mem_freq = _clock_get_dev_freq(CLK_PTO_EMC, 1); + g_cpu_freq = _clock_get_dev_freq(CLK_PTO_CCLK_G_DIV2, 2); + + if (!g_gpu_base) { + _svcQueryMemoryMappingFallback(&g_gpu_base, 0x57000000ul, 0x1000000); + } + + if (!g_gpu_base) { + return; + } + + bool gpu_enabled = (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_X) & BIT(24)) && !(CLOCK(CLK_RST_CONTROLLER_RST_DEVICES_X) & BIT(24)); + if (!gpu_enabled) { + return; + } + + if (!g_act_base) { + _svcQueryMemoryMappingFallback(&g_act_base, 0x6000C000ul, 0x1000); + } + + if (!g_act_base) { + return; + } + + const u32 osc = 38400000; + u32 coeff = GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF); + u32 divm = coeff & 0xFF; + u32 divn = (coeff >> 8) & 0xFF; + u32 divp = (coeff >> 16) & 0x3F; + g_gpu_freq = osc * divn / (divm * divp) / 2; + + u32 emc_freq = g_mem_freq / 1000; + + // Check if actmon is disabled + if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCALL_MON_ACT)) { + ACTMON(ACTMON_GLB_PERIOD_CTRL) = ACTMON_GLB_PERIOD_SAMPLE(ACTMON_PERIOD_MS); + _actmon_dev_enable(ACTMON_DEV_MC_ALL, emc_freq, 256 * 4); + } + + // Check if actmon is disabled + if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCCPU_MON_ACT)) + _actmon_dev_enable(ACTMON_DEV_MC_CPU, emc_freq, 256 * 4); + + // Get 1000 -> 100.0. + g_emc_lall = (u64)_actmon_dev_get_count_avg(ACTMON_DEV_MC_ALL) * 10 * 100 / (emc_freq * ACTMON_PERIOD_MS); + g_emc_lcpu = (u64)_actmon_dev_get_count_avg(ACTMON_DEV_MC_CPU) * 10 * 100 / (emc_freq * ACTMON_PERIOD_MS); + + // TODO: use PLL instead of actmon + // Avoid floating point arithematic + g_emc_bw_all = (u64)emc_freq * 16 * g_emc_lall / 1000000; + g_emc_bw_cpu = (u64)emc_freq * 16 * g_emc_lcpu / 1000000; + + // Not 100% accurate but should be enough + g_emc_bw_gpu = g_emc_bw_all - g_emc_bw_cpu; +} + +u32 t210ClkCpuFreq(void) { + _clock_update_freqs(); + return g_cpu_freq; +} + +u32 t210ClkMemFreq(void) { + _clock_update_freqs(); + return g_mem_freq; +} + +u32 t210ClkGpuFreq(void) { + _clock_update_freqs(); + return g_gpu_freq; +} + +u32 t210EmcLoadAll() { + _clock_update_freqs(); + return g_emc_lall; +} + +u32 t210EmcLoadCpu() { + _clock_update_freqs(); + return g_emc_lcpu; +} + +u32 t210EmcBwAll() { + _clock_update_freqs(); + return g_emc_bw_all; +} + +u32 t210EmcBwCpu() { + _clock_update_freqs(); + return g_emc_bw_cpu; +} + +u32 t210EmcBwGpu() { + _clock_update_freqs(); + return g_emc_bw_gpu; +} + +u32 t210EmcBwPeak() { + _clock_update_freqs(); + return ((u64)g_mem_freq * 16) / 1000000; +} \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.h b/Source/hoc-clk/sysmodule/src/soc/t210.h new file mode 100644 index 00000000..2ad618f6 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/soc/t210.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* -------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * , , + * wrote this file. As long as you retain this notice you can do whatever you + * want with this stuff. If you meet any of us some day, and you think this + * stuff is worth it, you can buy us a beer in return. - The sys-clk authors + * -------------------------------------------------------------------------- + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +u32 t210ClkCpuFreq(void); +u32 t210ClkMemFreq(void); +u32 t210ClkGpuFreq(void); +u32 t210EmcLoadAll(void); +u32 t210EmcLoadCpu(void); +u32 t210EmcBwAll(void); +u32 t210EmcBwCpu(void); +u32 t210EmcBwGpu(void); +u32 t210EmcBwPeak(void); + +#ifdef __cplusplus +} +#endif diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp index ce6e6d94..d1b028a5 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp @@ -22,7 +22,6 @@ #include -#include "../bpmp/bpmp.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "aotag.hpp" @@ -215,7 +214,24 @@ namespace tsensor { return -126; } - return bpmp::GetSharedInfo()->tempAO; + u32 regval = 0, abs = 0, fraction = 0, valid = 0, sign = 0; + s32 temp = 0; + regval = ReadPmcReg(PMC_TSENSOR_STATUS1); + valid = REG_GET(regval, STATUS1_TEMP_VALID); + + if (!valid) { + return -125; + } + + abs = REG_GET(regval, STATUS1_TEMP_ABS); + fraction = REG_GET(regval, STATUS1_TEMP_FRAC); + sign = REG_GET(regval, STATUS1_TEMP_SIGN); + temp = (abs * 1000) + (fraction * 500); + if (sign) { + temp = (-1) * (temp); + } + + return temp; } bool IsInitialized() { diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index 6d5b7961..26a1b43d 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -24,7 +24,6 @@ #include #include "../board/board.hpp" -#include "../bpmp/bpmp.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "soctherm.hpp" @@ -414,6 +413,15 @@ namespace tsensor { bool isMariko; } // namespace + bool IsDisabledThroughSleep() { + return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || + !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM); + } + + bool IsSensorEnabled() { + return ReadReg(socthermVa, TSENSOR_TSENSOR_CLKEN); + } + void EnableSensor(const TSensor *sensor, u32 sensorIdx) { u32 val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT; WriteReg(socthermVa, sensor->base + SENSOR_CONFIG0, val); @@ -426,6 +434,21 @@ namespace tsensor { WriteReg(socthermVa, sensor->base + SENSOR_CONFIG2, calib[sensorIdx]); } + s32 TranslateTemp(u16 val) { + s32 t; + + t = ((val & READBACK_VALUE_MASK) >> READBACK_VALUE_SHIFT) * 1000; + if (val & READBACK_ADD_HALF) { + t += 500; + } + + if (val & READBACK_NEGATE) { + t *= -1; + } + + return t; + } + void StartSensors() { u32 pdiv, hotspot; @@ -451,15 +474,23 @@ namespace tsensor { } void ReadTSensors(TSensorTemps &temps) { - const HocClkBpmpSharedInfo *bpmpInfo = bpmp::GetSharedInfo(); - if (bpmpInfo->magic != HOCCLK_BPMP_MAGIC) { + if (IsDisabledThroughSleep()) { return; } - temps.cpu = bpmpInfo->tempCpu; - temps.gpu = bpmpInfo->tempGpu; - temps.pllx = bpmpInfo->tempPllx; - temps.mem = (board::GetSocType() == HocClkSocType_Erista) ? bpmpInfo->tempMem : bpmpInfo->tempPllx; + if (!IsSensorEnabled()) { + StartSensors(); + } + + temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); + temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); + temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK); + + if (board::GetSocType() == HocClkSocType_Erista) { + temps.mem = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) >> 16); + } else { + temps.mem = -1; + } } void InitializeSoctherm() { From 94c1074a055226d2a41bf3c975169eb725823d75 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 22 Sep 2026 19:12:18 -0400 Subject: [PATCH 138/205] temporarily disable mrr due to crashes --- Source/hoc-clk/sysmodule/src/board/board_sensor.cpp | 6 +++--- Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index 4c383e7f..2bdf42ae 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -118,9 +118,9 @@ namespace board { case HocClkThermalSensor_MEM: { if (board::GetSocType() == HocClkSocType_Mariko && tsensor::IsInitialized() && tsensor::ReadAotag() > 0) { if(board::GetConsoleType() == HocClkConsoleType_Aula) { // Aula has a misplaced thermal sensor that makes tBoard report too high - millis = (tsensor::ReadAotag() * 0.40f) + (gDramMr4Millis * 0.60f); + millis = (tsensor::ReadAotag() * 1.0f);// + (gDramMr4Millis * 0.60f); } else { // On other consoles it's placed correctly so avoid relying on AOTAG - millis = (tsensor::ReadAotag() * 0.20f) + (tmp451TempPcb() * 0.40f) + (gDramMr4Millis * 0.40f); + millis = (tsensor::ReadAotag() * 0.40f) + (tmp451TempPcb() * 0.60f);// + (gDramMr4Millis * 0.40f); } } else { millis = board::GetSocType() == HocClkSocType_Mariko ? temps.pllx : temps.mem; @@ -142,7 +142,7 @@ namespace board { case HocClkThermalSensor_DRAM: { if (++gDramMr4Tick >= DramMr4PollDivisor) { gDramMr4Tick = 0; - gDramMr4Millis = PollDramMr4TempMilli(); + gDramMr4Millis = 0;//PollDramMr4TempMilli(); } millis = gDramMr4Millis; break; diff --git a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp index 2fd1ad8f..85265253 100644 --- a/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/dram_mrr.cpp @@ -364,11 +364,11 @@ namespace soc { const u8 fuseId = board::GetFuseDramId(); const HocClkSocType soc = board::GetSocType(); - if (soc == HocClkSocType_Erista) + // if (soc == HocClkSocType_Erista) return fuseId; - if (!IsMrrAvailable()) - return fuseId; + // if (!IsMrrAvailable()) + // return fuseId; emc_mr_data_t vendor = {}, rev0 = {}, rev1 = {}, density = {}; EmcTopology topo = {}; From 21390c05eb9ccc26979c7ac4653d5d4643cf6ba9 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 24 Sep 2026 11:09:17 +0200 Subject: [PATCH 139/205] Remove FUNDING.yml --- .github/FUNDING.yml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 3eaf2a46..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# Donate to us! - -https://ko-fi.com/souldbminer From 0d476cab266296c40a75e1c359e5faf01bc50b38 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 24 Sep 2026 17:11:59 +0200 Subject: [PATCH 140/205] revert bpmp related exosphere patches --- ..._define_exception_vectors_access_table.inc | 25 - ...on_define_flow_controller_access_table.inc | 25 - ...on_exception_vectors_access_table_data.inc | 1040 ----------------- ...cmon_flow_controller_access_table_data.inc | 1040 ----------------- .../secmon_smc_register_access.cpp | 4 - build.sh | 6 - 6 files changed, 2140 deletions(-) delete mode 100644 Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc delete mode 100644 Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc delete mode 100644 Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc delete mode 100644 Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc diff --git a/Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc b/Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc deleted file mode 100644 index 2c06ea01..00000000 --- a/Source/Atmosphere-Patches/secmon_define_exception_vectors_access_table.inc +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#define __ACCESS_TABLE_NAME__ ExceptionVectorsAccessTable -#define __ACCESS_TABLE_ADDRESS__ MemoryRegionPhysicalDeviceExceptionVectors.GetAddress() -#define __ACCESS_TABLE_INC__ "secmon_exception_vectors_access_table_data.inc" - -#include "secmon_define_access_table.inc" - -#undef __ACCESS_TABLE_INC__ -#undef __ACCESS_TABLE_ADDRESS__ -#undef __ACCESS_TABLE_NAME__ diff --git a/Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc b/Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc deleted file mode 100644 index 99589e76..00000000 --- a/Source/Atmosphere-Patches/secmon_define_flow_controller_access_table.inc +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#define __ACCESS_TABLE_NAME__ FlowControllerAccessTable -#define __ACCESS_TABLE_ADDRESS__ MemoryRegionPhysicalDeviceFlowController.GetAddress() -#define __ACCESS_TABLE_INC__ "secmon_flow_controller_access_table_data.inc" - -#include "secmon_define_access_table.inc" - -#undef __ACCESS_TABLE_INC__ -#undef __ACCESS_TABLE_ADDRESS__ -#undef __ACCESS_TABLE_NAME__ diff --git a/Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc b/Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc deleted file mode 100644 index a3718c5e..00000000 --- a/Source/Atmosphere-Patches/secmon_exception_vectors_access_table_data.inc +++ /dev/null @@ -1,1040 +0,0 @@ -/* - * Copyright (c) Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -SetRegisterAllowed(0x0); -SetRegisterAllowed(0x4); -SetRegisterAllowed(0x8); -SetRegisterAllowed(0xC); -SetRegisterAllowed(0x10); -SetRegisterAllowed(0x14); -SetRegisterAllowed(0x18); -SetRegisterAllowed(0x1C); -SetRegisterAllowed(0x20); -SetRegisterAllowed(0x24); -SetRegisterAllowed(0x28); -SetRegisterAllowed(0x2C); -SetRegisterAllowed(0x30); -SetRegisterAllowed(0x34); -SetRegisterAllowed(0x38); -SetRegisterAllowed(0x3C); -SetRegisterAllowed(0x40); -SetRegisterAllowed(0x44); -SetRegisterAllowed(0x48); -SetRegisterAllowed(0x4C); -SetRegisterAllowed(0x50); -SetRegisterAllowed(0x54); -SetRegisterAllowed(0x58); -SetRegisterAllowed(0x5C); -SetRegisterAllowed(0x60); -SetRegisterAllowed(0x64); -SetRegisterAllowed(0x68); -SetRegisterAllowed(0x6C); -SetRegisterAllowed(0x70); -SetRegisterAllowed(0x74); -SetRegisterAllowed(0x78); -SetRegisterAllowed(0x7C); -SetRegisterAllowed(0x80); -SetRegisterAllowed(0x84); -SetRegisterAllowed(0x88); -SetRegisterAllowed(0x8C); -SetRegisterAllowed(0x90); -SetRegisterAllowed(0x94); -SetRegisterAllowed(0x98); -SetRegisterAllowed(0x9C); -SetRegisterAllowed(0xA0); -SetRegisterAllowed(0xA4); -SetRegisterAllowed(0xA8); -SetRegisterAllowed(0xAC); -SetRegisterAllowed(0xB0); -SetRegisterAllowed(0xB4); -SetRegisterAllowed(0xB8); -SetRegisterAllowed(0xBC); -SetRegisterAllowed(0xC0); -SetRegisterAllowed(0xC4); -SetRegisterAllowed(0xC8); -SetRegisterAllowed(0xCC); -SetRegisterAllowed(0xD0); -SetRegisterAllowed(0xD4); -SetRegisterAllowed(0xD8); -SetRegisterAllowed(0xDC); -SetRegisterAllowed(0xE0); -SetRegisterAllowed(0xE4); -SetRegisterAllowed(0xE8); -SetRegisterAllowed(0xEC); -SetRegisterAllowed(0xF0); -SetRegisterAllowed(0xF4); -SetRegisterAllowed(0xF8); -SetRegisterAllowed(0xFC); -SetRegisterAllowed(0x100); -SetRegisterAllowed(0x104); -SetRegisterAllowed(0x108); -SetRegisterAllowed(0x10C); -SetRegisterAllowed(0x110); -SetRegisterAllowed(0x114); -SetRegisterAllowed(0x118); -SetRegisterAllowed(0x11C); -SetRegisterAllowed(0x120); -SetRegisterAllowed(0x124); -SetRegisterAllowed(0x128); -SetRegisterAllowed(0x12C); -SetRegisterAllowed(0x130); -SetRegisterAllowed(0x134); -SetRegisterAllowed(0x138); -SetRegisterAllowed(0x13C); -SetRegisterAllowed(0x140); -SetRegisterAllowed(0x144); -SetRegisterAllowed(0x148); -SetRegisterAllowed(0x14C); -SetRegisterAllowed(0x150); -SetRegisterAllowed(0x154); -SetRegisterAllowed(0x158); -SetRegisterAllowed(0x15C); -SetRegisterAllowed(0x160); -SetRegisterAllowed(0x164); -SetRegisterAllowed(0x168); -SetRegisterAllowed(0x16C); -SetRegisterAllowed(0x170); -SetRegisterAllowed(0x174); -SetRegisterAllowed(0x178); -SetRegisterAllowed(0x17C); -SetRegisterAllowed(0x180); -SetRegisterAllowed(0x184); -SetRegisterAllowed(0x188); -SetRegisterAllowed(0x18C); -SetRegisterAllowed(0x190); -SetRegisterAllowed(0x194); -SetRegisterAllowed(0x198); -SetRegisterAllowed(0x19C); -SetRegisterAllowed(0x1A0); -SetRegisterAllowed(0x1A4); -SetRegisterAllowed(0x1A8); -SetRegisterAllowed(0x1AC); -SetRegisterAllowed(0x1B0); -SetRegisterAllowed(0x1B4); -SetRegisterAllowed(0x1B8); -SetRegisterAllowed(0x1BC); -SetRegisterAllowed(0x1C0); -SetRegisterAllowed(0x1C4); -SetRegisterAllowed(0x1C8); -SetRegisterAllowed(0x1CC); -SetRegisterAllowed(0x1D0); -SetRegisterAllowed(0x1D4); -SetRegisterAllowed(0x1D8); -SetRegisterAllowed(0x1DC); -SetRegisterAllowed(0x1E0); -SetRegisterAllowed(0x1E4); -SetRegisterAllowed(0x1E8); -SetRegisterAllowed(0x1EC); -SetRegisterAllowed(0x1F0); -SetRegisterAllowed(0x1F4); -SetRegisterAllowed(0x1F8); -SetRegisterAllowed(0x1FC); -SetRegisterAllowed(0x200); -SetRegisterAllowed(0x204); -SetRegisterAllowed(0x208); -SetRegisterAllowed(0x20C); -SetRegisterAllowed(0x210); -SetRegisterAllowed(0x214); -SetRegisterAllowed(0x218); -SetRegisterAllowed(0x21C); -SetRegisterAllowed(0x220); -SetRegisterAllowed(0x224); -SetRegisterAllowed(0x228); -SetRegisterAllowed(0x22C); -SetRegisterAllowed(0x230); -SetRegisterAllowed(0x234); -SetRegisterAllowed(0x238); -SetRegisterAllowed(0x23C); -SetRegisterAllowed(0x240); -SetRegisterAllowed(0x244); -SetRegisterAllowed(0x248); -SetRegisterAllowed(0x24C); -SetRegisterAllowed(0x250); -SetRegisterAllowed(0x254); -SetRegisterAllowed(0x258); -SetRegisterAllowed(0x25C); -SetRegisterAllowed(0x260); -SetRegisterAllowed(0x264); -SetRegisterAllowed(0x268); -SetRegisterAllowed(0x26C); -SetRegisterAllowed(0x270); -SetRegisterAllowed(0x274); -SetRegisterAllowed(0x278); -SetRegisterAllowed(0x27C); -SetRegisterAllowed(0x280); -SetRegisterAllowed(0x284); -SetRegisterAllowed(0x288); -SetRegisterAllowed(0x28C); -SetRegisterAllowed(0x290); -SetRegisterAllowed(0x294); -SetRegisterAllowed(0x298); -SetRegisterAllowed(0x29C); -SetRegisterAllowed(0x2A0); -SetRegisterAllowed(0x2A4); -SetRegisterAllowed(0x2A8); -SetRegisterAllowed(0x2AC); -SetRegisterAllowed(0x2B0); -SetRegisterAllowed(0x2B4); -SetRegisterAllowed(0x2B8); -SetRegisterAllowed(0x2BC); -SetRegisterAllowed(0x2C0); -SetRegisterAllowed(0x2C4); -SetRegisterAllowed(0x2C8); -SetRegisterAllowed(0x2CC); -SetRegisterAllowed(0x2D0); -SetRegisterAllowed(0x2D4); -SetRegisterAllowed(0x2D8); -SetRegisterAllowed(0x2DC); -SetRegisterAllowed(0x2E0); -SetRegisterAllowed(0x2E4); -SetRegisterAllowed(0x2E8); -SetRegisterAllowed(0x2EC); -SetRegisterAllowed(0x2F0); -SetRegisterAllowed(0x2F4); -SetRegisterAllowed(0x2F8); -SetRegisterAllowed(0x2FC); -SetRegisterAllowed(0x300); -SetRegisterAllowed(0x304); -SetRegisterAllowed(0x308); -SetRegisterAllowed(0x30C); -SetRegisterAllowed(0x310); -SetRegisterAllowed(0x314); -SetRegisterAllowed(0x318); -SetRegisterAllowed(0x31C); -SetRegisterAllowed(0x320); -SetRegisterAllowed(0x324); -SetRegisterAllowed(0x328); -SetRegisterAllowed(0x32C); -SetRegisterAllowed(0x330); -SetRegisterAllowed(0x334); -SetRegisterAllowed(0x338); -SetRegisterAllowed(0x33C); -SetRegisterAllowed(0x340); -SetRegisterAllowed(0x344); -SetRegisterAllowed(0x348); -SetRegisterAllowed(0x34C); -SetRegisterAllowed(0x350); -SetRegisterAllowed(0x354); -SetRegisterAllowed(0x358); -SetRegisterAllowed(0x35C); -SetRegisterAllowed(0x360); -SetRegisterAllowed(0x364); -SetRegisterAllowed(0x368); -SetRegisterAllowed(0x36C); -SetRegisterAllowed(0x370); -SetRegisterAllowed(0x374); -SetRegisterAllowed(0x378); -SetRegisterAllowed(0x37C); -SetRegisterAllowed(0x380); -SetRegisterAllowed(0x384); -SetRegisterAllowed(0x388); -SetRegisterAllowed(0x38C); -SetRegisterAllowed(0x390); -SetRegisterAllowed(0x394); -SetRegisterAllowed(0x398); -SetRegisterAllowed(0x39C); -SetRegisterAllowed(0x3A0); -SetRegisterAllowed(0x3A4); -SetRegisterAllowed(0x3A8); -SetRegisterAllowed(0x3AC); -SetRegisterAllowed(0x3B0); -SetRegisterAllowed(0x3B4); -SetRegisterAllowed(0x3B8); -SetRegisterAllowed(0x3BC); -SetRegisterAllowed(0x3C0); -SetRegisterAllowed(0x3C4); -SetRegisterAllowed(0x3C8); -SetRegisterAllowed(0x3CC); -SetRegisterAllowed(0x3D0); -SetRegisterAllowed(0x3D4); -SetRegisterAllowed(0x3D8); -SetRegisterAllowed(0x3DC); -SetRegisterAllowed(0x3E0); -SetRegisterAllowed(0x3E4); -SetRegisterAllowed(0x3E8); -SetRegisterAllowed(0x3EC); -SetRegisterAllowed(0x3F0); -SetRegisterAllowed(0x3F4); -SetRegisterAllowed(0x3F8); -SetRegisterAllowed(0x3FC); -SetRegisterAllowed(0x400); -SetRegisterAllowed(0x404); -SetRegisterAllowed(0x408); -SetRegisterAllowed(0x40C); -SetRegisterAllowed(0x410); -SetRegisterAllowed(0x414); -SetRegisterAllowed(0x418); -SetRegisterAllowed(0x41C); -SetRegisterAllowed(0x420); -SetRegisterAllowed(0x424); -SetRegisterAllowed(0x428); -SetRegisterAllowed(0x42C); -SetRegisterAllowed(0x430); -SetRegisterAllowed(0x434); -SetRegisterAllowed(0x438); -SetRegisterAllowed(0x43C); -SetRegisterAllowed(0x440); -SetRegisterAllowed(0x444); -SetRegisterAllowed(0x448); -SetRegisterAllowed(0x44C); -SetRegisterAllowed(0x450); -SetRegisterAllowed(0x454); -SetRegisterAllowed(0x458); -SetRegisterAllowed(0x45C); -SetRegisterAllowed(0x460); -SetRegisterAllowed(0x464); -SetRegisterAllowed(0x468); -SetRegisterAllowed(0x46C); -SetRegisterAllowed(0x470); -SetRegisterAllowed(0x474); -SetRegisterAllowed(0x478); -SetRegisterAllowed(0x47C); -SetRegisterAllowed(0x480); -SetRegisterAllowed(0x484); -SetRegisterAllowed(0x488); -SetRegisterAllowed(0x48C); -SetRegisterAllowed(0x490); -SetRegisterAllowed(0x494); -SetRegisterAllowed(0x498); -SetRegisterAllowed(0x49C); -SetRegisterAllowed(0x4A0); -SetRegisterAllowed(0x4A4); -SetRegisterAllowed(0x4A8); -SetRegisterAllowed(0x4AC); -SetRegisterAllowed(0x4B0); -SetRegisterAllowed(0x4B4); -SetRegisterAllowed(0x4B8); -SetRegisterAllowed(0x4BC); -SetRegisterAllowed(0x4C0); -SetRegisterAllowed(0x4C4); -SetRegisterAllowed(0x4C8); -SetRegisterAllowed(0x4CC); -SetRegisterAllowed(0x4D0); -SetRegisterAllowed(0x4D4); -SetRegisterAllowed(0x4D8); -SetRegisterAllowed(0x4DC); -SetRegisterAllowed(0x4E0); -SetRegisterAllowed(0x4E4); -SetRegisterAllowed(0x4E8); -SetRegisterAllowed(0x4EC); -SetRegisterAllowed(0x4F0); -SetRegisterAllowed(0x4F4); -SetRegisterAllowed(0x4F8); -SetRegisterAllowed(0x4FC); -SetRegisterAllowed(0x500); -SetRegisterAllowed(0x504); -SetRegisterAllowed(0x508); -SetRegisterAllowed(0x50C); -SetRegisterAllowed(0x510); -SetRegisterAllowed(0x514); -SetRegisterAllowed(0x518); -SetRegisterAllowed(0x51C); -SetRegisterAllowed(0x520); -SetRegisterAllowed(0x524); -SetRegisterAllowed(0x528); -SetRegisterAllowed(0x52C); -SetRegisterAllowed(0x530); -SetRegisterAllowed(0x534); -SetRegisterAllowed(0x538); -SetRegisterAllowed(0x53C); -SetRegisterAllowed(0x540); -SetRegisterAllowed(0x544); -SetRegisterAllowed(0x548); -SetRegisterAllowed(0x54C); -SetRegisterAllowed(0x550); -SetRegisterAllowed(0x554); -SetRegisterAllowed(0x558); -SetRegisterAllowed(0x55C); -SetRegisterAllowed(0x560); -SetRegisterAllowed(0x564); -SetRegisterAllowed(0x568); -SetRegisterAllowed(0x56C); -SetRegisterAllowed(0x570); -SetRegisterAllowed(0x574); -SetRegisterAllowed(0x578); -SetRegisterAllowed(0x57C); -SetRegisterAllowed(0x580); -SetRegisterAllowed(0x584); -SetRegisterAllowed(0x588); -SetRegisterAllowed(0x58C); -SetRegisterAllowed(0x590); -SetRegisterAllowed(0x594); -SetRegisterAllowed(0x598); -SetRegisterAllowed(0x59C); -SetRegisterAllowed(0x5A0); -SetRegisterAllowed(0x5A4); -SetRegisterAllowed(0x5A8); -SetRegisterAllowed(0x5AC); -SetRegisterAllowed(0x5B0); -SetRegisterAllowed(0x5B4); -SetRegisterAllowed(0x5B8); -SetRegisterAllowed(0x5BC); -SetRegisterAllowed(0x5C0); -SetRegisterAllowed(0x5C4); -SetRegisterAllowed(0x5C8); -SetRegisterAllowed(0x5CC); -SetRegisterAllowed(0x5D0); -SetRegisterAllowed(0x5D4); -SetRegisterAllowed(0x5D8); -SetRegisterAllowed(0x5DC); -SetRegisterAllowed(0x5E0); -SetRegisterAllowed(0x5E4); -SetRegisterAllowed(0x5E8); -SetRegisterAllowed(0x5EC); -SetRegisterAllowed(0x5F0); -SetRegisterAllowed(0x5F4); -SetRegisterAllowed(0x5F8); -SetRegisterAllowed(0x5FC); -SetRegisterAllowed(0x600); -SetRegisterAllowed(0x604); -SetRegisterAllowed(0x608); -SetRegisterAllowed(0x60C); -SetRegisterAllowed(0x610); -SetRegisterAllowed(0x614); -SetRegisterAllowed(0x618); -SetRegisterAllowed(0x61C); -SetRegisterAllowed(0x620); -SetRegisterAllowed(0x624); -SetRegisterAllowed(0x628); -SetRegisterAllowed(0x62C); -SetRegisterAllowed(0x630); -SetRegisterAllowed(0x634); -SetRegisterAllowed(0x638); -SetRegisterAllowed(0x63C); -SetRegisterAllowed(0x640); -SetRegisterAllowed(0x644); -SetRegisterAllowed(0x648); -SetRegisterAllowed(0x64C); -SetRegisterAllowed(0x650); -SetRegisterAllowed(0x654); -SetRegisterAllowed(0x658); -SetRegisterAllowed(0x65C); -SetRegisterAllowed(0x660); -SetRegisterAllowed(0x664); -SetRegisterAllowed(0x668); -SetRegisterAllowed(0x66C); -SetRegisterAllowed(0x670); -SetRegisterAllowed(0x674); -SetRegisterAllowed(0x678); -SetRegisterAllowed(0x67C); -SetRegisterAllowed(0x680); -SetRegisterAllowed(0x684); -SetRegisterAllowed(0x688); -SetRegisterAllowed(0x68C); -SetRegisterAllowed(0x690); -SetRegisterAllowed(0x694); -SetRegisterAllowed(0x698); -SetRegisterAllowed(0x69C); -SetRegisterAllowed(0x6A0); -SetRegisterAllowed(0x6A4); -SetRegisterAllowed(0x6A8); -SetRegisterAllowed(0x6AC); -SetRegisterAllowed(0x6B0); -SetRegisterAllowed(0x6B4); -SetRegisterAllowed(0x6B8); -SetRegisterAllowed(0x6BC); -SetRegisterAllowed(0x6C0); -SetRegisterAllowed(0x6C4); -SetRegisterAllowed(0x6C8); -SetRegisterAllowed(0x6CC); -SetRegisterAllowed(0x6D0); -SetRegisterAllowed(0x6D4); -SetRegisterAllowed(0x6D8); -SetRegisterAllowed(0x6DC); -SetRegisterAllowed(0x6E0); -SetRegisterAllowed(0x6E4); -SetRegisterAllowed(0x6E8); -SetRegisterAllowed(0x6EC); -SetRegisterAllowed(0x6F0); -SetRegisterAllowed(0x6F4); -SetRegisterAllowed(0x6F8); -SetRegisterAllowed(0x6FC); -SetRegisterAllowed(0x700); -SetRegisterAllowed(0x704); -SetRegisterAllowed(0x708); -SetRegisterAllowed(0x70C); -SetRegisterAllowed(0x710); -SetRegisterAllowed(0x714); -SetRegisterAllowed(0x718); -SetRegisterAllowed(0x71C); -SetRegisterAllowed(0x720); -SetRegisterAllowed(0x724); -SetRegisterAllowed(0x728); -SetRegisterAllowed(0x72C); -SetRegisterAllowed(0x730); -SetRegisterAllowed(0x734); -SetRegisterAllowed(0x738); -SetRegisterAllowed(0x73C); -SetRegisterAllowed(0x740); -SetRegisterAllowed(0x744); -SetRegisterAllowed(0x748); -SetRegisterAllowed(0x74C); -SetRegisterAllowed(0x750); -SetRegisterAllowed(0x754); -SetRegisterAllowed(0x758); -SetRegisterAllowed(0x75C); -SetRegisterAllowed(0x760); -SetRegisterAllowed(0x764); -SetRegisterAllowed(0x768); -SetRegisterAllowed(0x76C); -SetRegisterAllowed(0x770); -SetRegisterAllowed(0x774); -SetRegisterAllowed(0x778); -SetRegisterAllowed(0x77C); -SetRegisterAllowed(0x780); -SetRegisterAllowed(0x784); -SetRegisterAllowed(0x788); -SetRegisterAllowed(0x78C); -SetRegisterAllowed(0x790); -SetRegisterAllowed(0x794); -SetRegisterAllowed(0x798); -SetRegisterAllowed(0x79C); -SetRegisterAllowed(0x7A0); -SetRegisterAllowed(0x7A4); -SetRegisterAllowed(0x7A8); -SetRegisterAllowed(0x7AC); -SetRegisterAllowed(0x7B0); -SetRegisterAllowed(0x7B4); -SetRegisterAllowed(0x7B8); -SetRegisterAllowed(0x7BC); -SetRegisterAllowed(0x7C0); -SetRegisterAllowed(0x7C4); -SetRegisterAllowed(0x7C8); -SetRegisterAllowed(0x7CC); -SetRegisterAllowed(0x7D0); -SetRegisterAllowed(0x7D4); -SetRegisterAllowed(0x7D8); -SetRegisterAllowed(0x7DC); -SetRegisterAllowed(0x7E0); -SetRegisterAllowed(0x7E4); -SetRegisterAllowed(0x7E8); -SetRegisterAllowed(0x7EC); -SetRegisterAllowed(0x7F0); -SetRegisterAllowed(0x7F4); -SetRegisterAllowed(0x7F8); -SetRegisterAllowed(0x7FC); -SetRegisterAllowed(0x800); -SetRegisterAllowed(0x804); -SetRegisterAllowed(0x808); -SetRegisterAllowed(0x80C); -SetRegisterAllowed(0x810); -SetRegisterAllowed(0x814); -SetRegisterAllowed(0x818); -SetRegisterAllowed(0x81C); -SetRegisterAllowed(0x820); -SetRegisterAllowed(0x824); -SetRegisterAllowed(0x828); -SetRegisterAllowed(0x82C); -SetRegisterAllowed(0x830); -SetRegisterAllowed(0x834); -SetRegisterAllowed(0x838); -SetRegisterAllowed(0x83C); -SetRegisterAllowed(0x840); -SetRegisterAllowed(0x844); -SetRegisterAllowed(0x848); -SetRegisterAllowed(0x84C); -SetRegisterAllowed(0x850); -SetRegisterAllowed(0x854); -SetRegisterAllowed(0x858); -SetRegisterAllowed(0x85C); -SetRegisterAllowed(0x860); -SetRegisterAllowed(0x864); -SetRegisterAllowed(0x868); -SetRegisterAllowed(0x86C); -SetRegisterAllowed(0x870); -SetRegisterAllowed(0x874); -SetRegisterAllowed(0x878); -SetRegisterAllowed(0x87C); -SetRegisterAllowed(0x880); -SetRegisterAllowed(0x884); -SetRegisterAllowed(0x888); -SetRegisterAllowed(0x88C); -SetRegisterAllowed(0x890); -SetRegisterAllowed(0x894); -SetRegisterAllowed(0x898); -SetRegisterAllowed(0x89C); -SetRegisterAllowed(0x8A0); -SetRegisterAllowed(0x8A4); -SetRegisterAllowed(0x8A8); -SetRegisterAllowed(0x8AC); -SetRegisterAllowed(0x8B0); -SetRegisterAllowed(0x8B4); -SetRegisterAllowed(0x8B8); -SetRegisterAllowed(0x8BC); -SetRegisterAllowed(0x8C0); -SetRegisterAllowed(0x8C4); -SetRegisterAllowed(0x8C8); -SetRegisterAllowed(0x8CC); -SetRegisterAllowed(0x8D0); -SetRegisterAllowed(0x8D4); -SetRegisterAllowed(0x8D8); -SetRegisterAllowed(0x8DC); -SetRegisterAllowed(0x8E0); -SetRegisterAllowed(0x8E4); -SetRegisterAllowed(0x8E8); -SetRegisterAllowed(0x8EC); -SetRegisterAllowed(0x8F0); -SetRegisterAllowed(0x8F4); -SetRegisterAllowed(0x8F8); -SetRegisterAllowed(0x8FC); -SetRegisterAllowed(0x900); -SetRegisterAllowed(0x904); -SetRegisterAllowed(0x908); -SetRegisterAllowed(0x90C); -SetRegisterAllowed(0x910); -SetRegisterAllowed(0x914); -SetRegisterAllowed(0x918); -SetRegisterAllowed(0x91C); -SetRegisterAllowed(0x920); -SetRegisterAllowed(0x924); -SetRegisterAllowed(0x928); -SetRegisterAllowed(0x92C); -SetRegisterAllowed(0x930); -SetRegisterAllowed(0x934); -SetRegisterAllowed(0x938); -SetRegisterAllowed(0x93C); -SetRegisterAllowed(0x940); -SetRegisterAllowed(0x944); -SetRegisterAllowed(0x948); -SetRegisterAllowed(0x94C); -SetRegisterAllowed(0x950); -SetRegisterAllowed(0x954); -SetRegisterAllowed(0x958); -SetRegisterAllowed(0x95C); -SetRegisterAllowed(0x960); -SetRegisterAllowed(0x964); -SetRegisterAllowed(0x968); -SetRegisterAllowed(0x96C); -SetRegisterAllowed(0x970); -SetRegisterAllowed(0x974); -SetRegisterAllowed(0x978); -SetRegisterAllowed(0x97C); -SetRegisterAllowed(0x980); -SetRegisterAllowed(0x984); -SetRegisterAllowed(0x988); -SetRegisterAllowed(0x98C); -SetRegisterAllowed(0x990); -SetRegisterAllowed(0x994); -SetRegisterAllowed(0x998); -SetRegisterAllowed(0x99C); -SetRegisterAllowed(0x9A0); -SetRegisterAllowed(0x9A4); -SetRegisterAllowed(0x9A8); -SetRegisterAllowed(0x9AC); -SetRegisterAllowed(0x9B0); -SetRegisterAllowed(0x9B4); -SetRegisterAllowed(0x9B8); -SetRegisterAllowed(0x9BC); -SetRegisterAllowed(0x9C0); -SetRegisterAllowed(0x9C4); -SetRegisterAllowed(0x9C8); -SetRegisterAllowed(0x9CC); -SetRegisterAllowed(0x9D0); -SetRegisterAllowed(0x9D4); -SetRegisterAllowed(0x9D8); -SetRegisterAllowed(0x9DC); -SetRegisterAllowed(0x9E0); -SetRegisterAllowed(0x9E4); -SetRegisterAllowed(0x9E8); -SetRegisterAllowed(0x9EC); -SetRegisterAllowed(0x9F0); -SetRegisterAllowed(0x9F4); -SetRegisterAllowed(0x9F8); -SetRegisterAllowed(0x9FC); -SetRegisterAllowed(0xA00); -SetRegisterAllowed(0xA04); -SetRegisterAllowed(0xA08); -SetRegisterAllowed(0xA0C); -SetRegisterAllowed(0xA10); -SetRegisterAllowed(0xA14); -SetRegisterAllowed(0xA18); -SetRegisterAllowed(0xA1C); -SetRegisterAllowed(0xA20); -SetRegisterAllowed(0xA24); -SetRegisterAllowed(0xA28); -SetRegisterAllowed(0xA2C); -SetRegisterAllowed(0xA30); -SetRegisterAllowed(0xA34); -SetRegisterAllowed(0xA38); -SetRegisterAllowed(0xA3C); -SetRegisterAllowed(0xA40); -SetRegisterAllowed(0xA44); -SetRegisterAllowed(0xA48); -SetRegisterAllowed(0xA4C); -SetRegisterAllowed(0xA50); -SetRegisterAllowed(0xA54); -SetRegisterAllowed(0xA58); -SetRegisterAllowed(0xA5C); -SetRegisterAllowed(0xA60); -SetRegisterAllowed(0xA64); -SetRegisterAllowed(0xA68); -SetRegisterAllowed(0xA6C); -SetRegisterAllowed(0xA70); -SetRegisterAllowed(0xA74); -SetRegisterAllowed(0xA78); -SetRegisterAllowed(0xA7C); -SetRegisterAllowed(0xA80); -SetRegisterAllowed(0xA84); -SetRegisterAllowed(0xA88); -SetRegisterAllowed(0xA8C); -SetRegisterAllowed(0xA90); -SetRegisterAllowed(0xA94); -SetRegisterAllowed(0xA98); -SetRegisterAllowed(0xA9C); -SetRegisterAllowed(0xAA0); -SetRegisterAllowed(0xAA4); -SetRegisterAllowed(0xAA8); -SetRegisterAllowed(0xAAC); -SetRegisterAllowed(0xAB0); -SetRegisterAllowed(0xAB4); -SetRegisterAllowed(0xAB8); -SetRegisterAllowed(0xABC); -SetRegisterAllowed(0xAC0); -SetRegisterAllowed(0xAC4); -SetRegisterAllowed(0xAC8); -SetRegisterAllowed(0xACC); -SetRegisterAllowed(0xAD0); -SetRegisterAllowed(0xAD4); -SetRegisterAllowed(0xAD8); -SetRegisterAllowed(0xADC); -SetRegisterAllowed(0xAE0); -SetRegisterAllowed(0xAE4); -SetRegisterAllowed(0xAE8); -SetRegisterAllowed(0xAEC); -SetRegisterAllowed(0xAF0); -SetRegisterAllowed(0xAF4); -SetRegisterAllowed(0xAF8); -SetRegisterAllowed(0xAFC); -SetRegisterAllowed(0xB00); -SetRegisterAllowed(0xB04); -SetRegisterAllowed(0xB08); -SetRegisterAllowed(0xB0C); -SetRegisterAllowed(0xB10); -SetRegisterAllowed(0xB14); -SetRegisterAllowed(0xB18); -SetRegisterAllowed(0xB1C); -SetRegisterAllowed(0xB20); -SetRegisterAllowed(0xB24); -SetRegisterAllowed(0xB28); -SetRegisterAllowed(0xB2C); -SetRegisterAllowed(0xB30); -SetRegisterAllowed(0xB34); -SetRegisterAllowed(0xB38); -SetRegisterAllowed(0xB3C); -SetRegisterAllowed(0xB40); -SetRegisterAllowed(0xB44); -SetRegisterAllowed(0xB48); -SetRegisterAllowed(0xB4C); -SetRegisterAllowed(0xB50); -SetRegisterAllowed(0xB54); -SetRegisterAllowed(0xB58); -SetRegisterAllowed(0xB5C); -SetRegisterAllowed(0xB60); -SetRegisterAllowed(0xB64); -SetRegisterAllowed(0xB68); -SetRegisterAllowed(0xB6C); -SetRegisterAllowed(0xB70); -SetRegisterAllowed(0xB74); -SetRegisterAllowed(0xB78); -SetRegisterAllowed(0xB7C); -SetRegisterAllowed(0xB80); -SetRegisterAllowed(0xB84); -SetRegisterAllowed(0xB88); -SetRegisterAllowed(0xB8C); -SetRegisterAllowed(0xB90); -SetRegisterAllowed(0xB94); -SetRegisterAllowed(0xB98); -SetRegisterAllowed(0xB9C); -SetRegisterAllowed(0xBA0); -SetRegisterAllowed(0xBA4); -SetRegisterAllowed(0xBA8); -SetRegisterAllowed(0xBAC); -SetRegisterAllowed(0xBB0); -SetRegisterAllowed(0xBB4); -SetRegisterAllowed(0xBB8); -SetRegisterAllowed(0xBBC); -SetRegisterAllowed(0xBC0); -SetRegisterAllowed(0xBC4); -SetRegisterAllowed(0xBC8); -SetRegisterAllowed(0xBCC); -SetRegisterAllowed(0xBD0); -SetRegisterAllowed(0xBD4); -SetRegisterAllowed(0xBD8); -SetRegisterAllowed(0xBDC); -SetRegisterAllowed(0xBE0); -SetRegisterAllowed(0xBE4); -SetRegisterAllowed(0xBE8); -SetRegisterAllowed(0xBEC); -SetRegisterAllowed(0xBF0); -SetRegisterAllowed(0xBF4); -SetRegisterAllowed(0xBF8); -SetRegisterAllowed(0xBFC); -SetRegisterAllowed(0xC00); -SetRegisterAllowed(0xC04); -SetRegisterAllowed(0xC08); -SetRegisterAllowed(0xC0C); -SetRegisterAllowed(0xC10); -SetRegisterAllowed(0xC14); -SetRegisterAllowed(0xC18); -SetRegisterAllowed(0xC1C); -SetRegisterAllowed(0xC20); -SetRegisterAllowed(0xC24); -SetRegisterAllowed(0xC28); -SetRegisterAllowed(0xC2C); -SetRegisterAllowed(0xC30); -SetRegisterAllowed(0xC34); -SetRegisterAllowed(0xC38); -SetRegisterAllowed(0xC3C); -SetRegisterAllowed(0xC40); -SetRegisterAllowed(0xC44); -SetRegisterAllowed(0xC48); -SetRegisterAllowed(0xC4C); -SetRegisterAllowed(0xC50); -SetRegisterAllowed(0xC54); -SetRegisterAllowed(0xC58); -SetRegisterAllowed(0xC5C); -SetRegisterAllowed(0xC60); -SetRegisterAllowed(0xC64); -SetRegisterAllowed(0xC68); -SetRegisterAllowed(0xC6C); -SetRegisterAllowed(0xC70); -SetRegisterAllowed(0xC74); -SetRegisterAllowed(0xC78); -SetRegisterAllowed(0xC7C); -SetRegisterAllowed(0xC80); -SetRegisterAllowed(0xC84); -SetRegisterAllowed(0xC88); -SetRegisterAllowed(0xC8C); -SetRegisterAllowed(0xC90); -SetRegisterAllowed(0xC94); -SetRegisterAllowed(0xC98); -SetRegisterAllowed(0xC9C); -SetRegisterAllowed(0xCA0); -SetRegisterAllowed(0xCA4); -SetRegisterAllowed(0xCA8); -SetRegisterAllowed(0xCAC); -SetRegisterAllowed(0xCB0); -SetRegisterAllowed(0xCB4); -SetRegisterAllowed(0xCB8); -SetRegisterAllowed(0xCBC); -SetRegisterAllowed(0xCC0); -SetRegisterAllowed(0xCC4); -SetRegisterAllowed(0xCC8); -SetRegisterAllowed(0xCCC); -SetRegisterAllowed(0xCD0); -SetRegisterAllowed(0xCD4); -SetRegisterAllowed(0xCD8); -SetRegisterAllowed(0xCDC); -SetRegisterAllowed(0xCE0); -SetRegisterAllowed(0xCE4); -SetRegisterAllowed(0xCE8); -SetRegisterAllowed(0xCEC); -SetRegisterAllowed(0xCF0); -SetRegisterAllowed(0xCF4); -SetRegisterAllowed(0xCF8); -SetRegisterAllowed(0xCFC); -SetRegisterAllowed(0xD00); -SetRegisterAllowed(0xD04); -SetRegisterAllowed(0xD08); -SetRegisterAllowed(0xD0C); -SetRegisterAllowed(0xD10); -SetRegisterAllowed(0xD14); -SetRegisterAllowed(0xD18); -SetRegisterAllowed(0xD1C); -SetRegisterAllowed(0xD20); -SetRegisterAllowed(0xD24); -SetRegisterAllowed(0xD28); -SetRegisterAllowed(0xD2C); -SetRegisterAllowed(0xD30); -SetRegisterAllowed(0xD34); -SetRegisterAllowed(0xD38); -SetRegisterAllowed(0xD3C); -SetRegisterAllowed(0xD40); -SetRegisterAllowed(0xD44); -SetRegisterAllowed(0xD48); -SetRegisterAllowed(0xD4C); -SetRegisterAllowed(0xD50); -SetRegisterAllowed(0xD54); -SetRegisterAllowed(0xD58); -SetRegisterAllowed(0xD5C); -SetRegisterAllowed(0xD60); -SetRegisterAllowed(0xD64); -SetRegisterAllowed(0xD68); -SetRegisterAllowed(0xD6C); -SetRegisterAllowed(0xD70); -SetRegisterAllowed(0xD74); -SetRegisterAllowed(0xD78); -SetRegisterAllowed(0xD7C); -SetRegisterAllowed(0xD80); -SetRegisterAllowed(0xD84); -SetRegisterAllowed(0xD88); -SetRegisterAllowed(0xD8C); -SetRegisterAllowed(0xD90); -SetRegisterAllowed(0xD94); -SetRegisterAllowed(0xD98); -SetRegisterAllowed(0xD9C); -SetRegisterAllowed(0xDA0); -SetRegisterAllowed(0xDA4); -SetRegisterAllowed(0xDA8); -SetRegisterAllowed(0xDAC); -SetRegisterAllowed(0xDB0); -SetRegisterAllowed(0xDB4); -SetRegisterAllowed(0xDB8); -SetRegisterAllowed(0xDBC); -SetRegisterAllowed(0xDC0); -SetRegisterAllowed(0xDC4); -SetRegisterAllowed(0xDC8); -SetRegisterAllowed(0xDCC); -SetRegisterAllowed(0xDD0); -SetRegisterAllowed(0xDD4); -SetRegisterAllowed(0xDD8); -SetRegisterAllowed(0xDDC); -SetRegisterAllowed(0xDE0); -SetRegisterAllowed(0xDE4); -SetRegisterAllowed(0xDE8); -SetRegisterAllowed(0xDEC); -SetRegisterAllowed(0xDF0); -SetRegisterAllowed(0xDF4); -SetRegisterAllowed(0xDF8); -SetRegisterAllowed(0xDFC); -SetRegisterAllowed(0xE00); -SetRegisterAllowed(0xE04); -SetRegisterAllowed(0xE08); -SetRegisterAllowed(0xE0C); -SetRegisterAllowed(0xE10); -SetRegisterAllowed(0xE14); -SetRegisterAllowed(0xE18); -SetRegisterAllowed(0xE1C); -SetRegisterAllowed(0xE20); -SetRegisterAllowed(0xE24); -SetRegisterAllowed(0xE28); -SetRegisterAllowed(0xE2C); -SetRegisterAllowed(0xE30); -SetRegisterAllowed(0xE34); -SetRegisterAllowed(0xE38); -SetRegisterAllowed(0xE3C); -SetRegisterAllowed(0xE40); -SetRegisterAllowed(0xE44); -SetRegisterAllowed(0xE48); -SetRegisterAllowed(0xE4C); -SetRegisterAllowed(0xE50); -SetRegisterAllowed(0xE54); -SetRegisterAllowed(0xE58); -SetRegisterAllowed(0xE5C); -SetRegisterAllowed(0xE60); -SetRegisterAllowed(0xE64); -SetRegisterAllowed(0xE68); -SetRegisterAllowed(0xE6C); -SetRegisterAllowed(0xE70); -SetRegisterAllowed(0xE74); -SetRegisterAllowed(0xE78); -SetRegisterAllowed(0xE7C); -SetRegisterAllowed(0xE80); -SetRegisterAllowed(0xE84); -SetRegisterAllowed(0xE88); -SetRegisterAllowed(0xE8C); -SetRegisterAllowed(0xE90); -SetRegisterAllowed(0xE94); -SetRegisterAllowed(0xE98); -SetRegisterAllowed(0xE9C); -SetRegisterAllowed(0xEA0); -SetRegisterAllowed(0xEA4); -SetRegisterAllowed(0xEA8); -SetRegisterAllowed(0xEAC); -SetRegisterAllowed(0xEB0); -SetRegisterAllowed(0xEB4); -SetRegisterAllowed(0xEB8); -SetRegisterAllowed(0xEBC); -SetRegisterAllowed(0xEC0); -SetRegisterAllowed(0xEC4); -SetRegisterAllowed(0xEC8); -SetRegisterAllowed(0xECC); -SetRegisterAllowed(0xED0); -SetRegisterAllowed(0xED4); -SetRegisterAllowed(0xED8); -SetRegisterAllowed(0xEDC); -SetRegisterAllowed(0xEE0); -SetRegisterAllowed(0xEE4); -SetRegisterAllowed(0xEE8); -SetRegisterAllowed(0xEEC); -SetRegisterAllowed(0xEF0); -SetRegisterAllowed(0xEF4); -SetRegisterAllowed(0xEF8); -SetRegisterAllowed(0xEFC); -SetRegisterAllowed(0xF00); -SetRegisterAllowed(0xF04); -SetRegisterAllowed(0xF08); -SetRegisterAllowed(0xF0C); -SetRegisterAllowed(0xF10); -SetRegisterAllowed(0xF14); -SetRegisterAllowed(0xF18); -SetRegisterAllowed(0xF1C); -SetRegisterAllowed(0xF20); -SetRegisterAllowed(0xF24); -SetRegisterAllowed(0xF28); -SetRegisterAllowed(0xF2C); -SetRegisterAllowed(0xF30); -SetRegisterAllowed(0xF34); -SetRegisterAllowed(0xF38); -SetRegisterAllowed(0xF3C); -SetRegisterAllowed(0xF40); -SetRegisterAllowed(0xF44); -SetRegisterAllowed(0xF48); -SetRegisterAllowed(0xF4C); -SetRegisterAllowed(0xF50); -SetRegisterAllowed(0xF54); -SetRegisterAllowed(0xF58); -SetRegisterAllowed(0xF5C); -SetRegisterAllowed(0xF60); -SetRegisterAllowed(0xF64); -SetRegisterAllowed(0xF68); -SetRegisterAllowed(0xF6C); -SetRegisterAllowed(0xF70); -SetRegisterAllowed(0xF74); -SetRegisterAllowed(0xF78); -SetRegisterAllowed(0xF7C); -SetRegisterAllowed(0xF80); -SetRegisterAllowed(0xF84); -SetRegisterAllowed(0xF88); -SetRegisterAllowed(0xF8C); -SetRegisterAllowed(0xF90); -SetRegisterAllowed(0xF94); -SetRegisterAllowed(0xF98); -SetRegisterAllowed(0xF9C); -SetRegisterAllowed(0xFA0); -SetRegisterAllowed(0xFA4); -SetRegisterAllowed(0xFA8); -SetRegisterAllowed(0xFAC); -SetRegisterAllowed(0xFB0); -SetRegisterAllowed(0xFB4); -SetRegisterAllowed(0xFB8); -SetRegisterAllowed(0xFBC); -SetRegisterAllowed(0xFC0); -SetRegisterAllowed(0xFC4); -SetRegisterAllowed(0xFC8); -SetRegisterAllowed(0xFCC); -SetRegisterAllowed(0xFD0); -SetRegisterAllowed(0xFD4); -SetRegisterAllowed(0xFD8); -SetRegisterAllowed(0xFDC); -SetRegisterAllowed(0xFE0); -SetRegisterAllowed(0xFE4); -SetRegisterAllowed(0xFE8); -SetRegisterAllowed(0xFEC); -SetRegisterAllowed(0xFF0); -SetRegisterAllowed(0xFF4); -SetRegisterAllowed(0xFF8); -SetRegisterAllowed(0xFFC); diff --git a/Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc b/Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc deleted file mode 100644 index a3718c5e..00000000 --- a/Source/Atmosphere-Patches/secmon_flow_controller_access_table_data.inc +++ /dev/null @@ -1,1040 +0,0 @@ -/* - * Copyright (c) Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -SetRegisterAllowed(0x0); -SetRegisterAllowed(0x4); -SetRegisterAllowed(0x8); -SetRegisterAllowed(0xC); -SetRegisterAllowed(0x10); -SetRegisterAllowed(0x14); -SetRegisterAllowed(0x18); -SetRegisterAllowed(0x1C); -SetRegisterAllowed(0x20); -SetRegisterAllowed(0x24); -SetRegisterAllowed(0x28); -SetRegisterAllowed(0x2C); -SetRegisterAllowed(0x30); -SetRegisterAllowed(0x34); -SetRegisterAllowed(0x38); -SetRegisterAllowed(0x3C); -SetRegisterAllowed(0x40); -SetRegisterAllowed(0x44); -SetRegisterAllowed(0x48); -SetRegisterAllowed(0x4C); -SetRegisterAllowed(0x50); -SetRegisterAllowed(0x54); -SetRegisterAllowed(0x58); -SetRegisterAllowed(0x5C); -SetRegisterAllowed(0x60); -SetRegisterAllowed(0x64); -SetRegisterAllowed(0x68); -SetRegisterAllowed(0x6C); -SetRegisterAllowed(0x70); -SetRegisterAllowed(0x74); -SetRegisterAllowed(0x78); -SetRegisterAllowed(0x7C); -SetRegisterAllowed(0x80); -SetRegisterAllowed(0x84); -SetRegisterAllowed(0x88); -SetRegisterAllowed(0x8C); -SetRegisterAllowed(0x90); -SetRegisterAllowed(0x94); -SetRegisterAllowed(0x98); -SetRegisterAllowed(0x9C); -SetRegisterAllowed(0xA0); -SetRegisterAllowed(0xA4); -SetRegisterAllowed(0xA8); -SetRegisterAllowed(0xAC); -SetRegisterAllowed(0xB0); -SetRegisterAllowed(0xB4); -SetRegisterAllowed(0xB8); -SetRegisterAllowed(0xBC); -SetRegisterAllowed(0xC0); -SetRegisterAllowed(0xC4); -SetRegisterAllowed(0xC8); -SetRegisterAllowed(0xCC); -SetRegisterAllowed(0xD0); -SetRegisterAllowed(0xD4); -SetRegisterAllowed(0xD8); -SetRegisterAllowed(0xDC); -SetRegisterAllowed(0xE0); -SetRegisterAllowed(0xE4); -SetRegisterAllowed(0xE8); -SetRegisterAllowed(0xEC); -SetRegisterAllowed(0xF0); -SetRegisterAllowed(0xF4); -SetRegisterAllowed(0xF8); -SetRegisterAllowed(0xFC); -SetRegisterAllowed(0x100); -SetRegisterAllowed(0x104); -SetRegisterAllowed(0x108); -SetRegisterAllowed(0x10C); -SetRegisterAllowed(0x110); -SetRegisterAllowed(0x114); -SetRegisterAllowed(0x118); -SetRegisterAllowed(0x11C); -SetRegisterAllowed(0x120); -SetRegisterAllowed(0x124); -SetRegisterAllowed(0x128); -SetRegisterAllowed(0x12C); -SetRegisterAllowed(0x130); -SetRegisterAllowed(0x134); -SetRegisterAllowed(0x138); -SetRegisterAllowed(0x13C); -SetRegisterAllowed(0x140); -SetRegisterAllowed(0x144); -SetRegisterAllowed(0x148); -SetRegisterAllowed(0x14C); -SetRegisterAllowed(0x150); -SetRegisterAllowed(0x154); -SetRegisterAllowed(0x158); -SetRegisterAllowed(0x15C); -SetRegisterAllowed(0x160); -SetRegisterAllowed(0x164); -SetRegisterAllowed(0x168); -SetRegisterAllowed(0x16C); -SetRegisterAllowed(0x170); -SetRegisterAllowed(0x174); -SetRegisterAllowed(0x178); -SetRegisterAllowed(0x17C); -SetRegisterAllowed(0x180); -SetRegisterAllowed(0x184); -SetRegisterAllowed(0x188); -SetRegisterAllowed(0x18C); -SetRegisterAllowed(0x190); -SetRegisterAllowed(0x194); -SetRegisterAllowed(0x198); -SetRegisterAllowed(0x19C); -SetRegisterAllowed(0x1A0); -SetRegisterAllowed(0x1A4); -SetRegisterAllowed(0x1A8); -SetRegisterAllowed(0x1AC); -SetRegisterAllowed(0x1B0); -SetRegisterAllowed(0x1B4); -SetRegisterAllowed(0x1B8); -SetRegisterAllowed(0x1BC); -SetRegisterAllowed(0x1C0); -SetRegisterAllowed(0x1C4); -SetRegisterAllowed(0x1C8); -SetRegisterAllowed(0x1CC); -SetRegisterAllowed(0x1D0); -SetRegisterAllowed(0x1D4); -SetRegisterAllowed(0x1D8); -SetRegisterAllowed(0x1DC); -SetRegisterAllowed(0x1E0); -SetRegisterAllowed(0x1E4); -SetRegisterAllowed(0x1E8); -SetRegisterAllowed(0x1EC); -SetRegisterAllowed(0x1F0); -SetRegisterAllowed(0x1F4); -SetRegisterAllowed(0x1F8); -SetRegisterAllowed(0x1FC); -SetRegisterAllowed(0x200); -SetRegisterAllowed(0x204); -SetRegisterAllowed(0x208); -SetRegisterAllowed(0x20C); -SetRegisterAllowed(0x210); -SetRegisterAllowed(0x214); -SetRegisterAllowed(0x218); -SetRegisterAllowed(0x21C); -SetRegisterAllowed(0x220); -SetRegisterAllowed(0x224); -SetRegisterAllowed(0x228); -SetRegisterAllowed(0x22C); -SetRegisterAllowed(0x230); -SetRegisterAllowed(0x234); -SetRegisterAllowed(0x238); -SetRegisterAllowed(0x23C); -SetRegisterAllowed(0x240); -SetRegisterAllowed(0x244); -SetRegisterAllowed(0x248); -SetRegisterAllowed(0x24C); -SetRegisterAllowed(0x250); -SetRegisterAllowed(0x254); -SetRegisterAllowed(0x258); -SetRegisterAllowed(0x25C); -SetRegisterAllowed(0x260); -SetRegisterAllowed(0x264); -SetRegisterAllowed(0x268); -SetRegisterAllowed(0x26C); -SetRegisterAllowed(0x270); -SetRegisterAllowed(0x274); -SetRegisterAllowed(0x278); -SetRegisterAllowed(0x27C); -SetRegisterAllowed(0x280); -SetRegisterAllowed(0x284); -SetRegisterAllowed(0x288); -SetRegisterAllowed(0x28C); -SetRegisterAllowed(0x290); -SetRegisterAllowed(0x294); -SetRegisterAllowed(0x298); -SetRegisterAllowed(0x29C); -SetRegisterAllowed(0x2A0); -SetRegisterAllowed(0x2A4); -SetRegisterAllowed(0x2A8); -SetRegisterAllowed(0x2AC); -SetRegisterAllowed(0x2B0); -SetRegisterAllowed(0x2B4); -SetRegisterAllowed(0x2B8); -SetRegisterAllowed(0x2BC); -SetRegisterAllowed(0x2C0); -SetRegisterAllowed(0x2C4); -SetRegisterAllowed(0x2C8); -SetRegisterAllowed(0x2CC); -SetRegisterAllowed(0x2D0); -SetRegisterAllowed(0x2D4); -SetRegisterAllowed(0x2D8); -SetRegisterAllowed(0x2DC); -SetRegisterAllowed(0x2E0); -SetRegisterAllowed(0x2E4); -SetRegisterAllowed(0x2E8); -SetRegisterAllowed(0x2EC); -SetRegisterAllowed(0x2F0); -SetRegisterAllowed(0x2F4); -SetRegisterAllowed(0x2F8); -SetRegisterAllowed(0x2FC); -SetRegisterAllowed(0x300); -SetRegisterAllowed(0x304); -SetRegisterAllowed(0x308); -SetRegisterAllowed(0x30C); -SetRegisterAllowed(0x310); -SetRegisterAllowed(0x314); -SetRegisterAllowed(0x318); -SetRegisterAllowed(0x31C); -SetRegisterAllowed(0x320); -SetRegisterAllowed(0x324); -SetRegisterAllowed(0x328); -SetRegisterAllowed(0x32C); -SetRegisterAllowed(0x330); -SetRegisterAllowed(0x334); -SetRegisterAllowed(0x338); -SetRegisterAllowed(0x33C); -SetRegisterAllowed(0x340); -SetRegisterAllowed(0x344); -SetRegisterAllowed(0x348); -SetRegisterAllowed(0x34C); -SetRegisterAllowed(0x350); -SetRegisterAllowed(0x354); -SetRegisterAllowed(0x358); -SetRegisterAllowed(0x35C); -SetRegisterAllowed(0x360); -SetRegisterAllowed(0x364); -SetRegisterAllowed(0x368); -SetRegisterAllowed(0x36C); -SetRegisterAllowed(0x370); -SetRegisterAllowed(0x374); -SetRegisterAllowed(0x378); -SetRegisterAllowed(0x37C); -SetRegisterAllowed(0x380); -SetRegisterAllowed(0x384); -SetRegisterAllowed(0x388); -SetRegisterAllowed(0x38C); -SetRegisterAllowed(0x390); -SetRegisterAllowed(0x394); -SetRegisterAllowed(0x398); -SetRegisterAllowed(0x39C); -SetRegisterAllowed(0x3A0); -SetRegisterAllowed(0x3A4); -SetRegisterAllowed(0x3A8); -SetRegisterAllowed(0x3AC); -SetRegisterAllowed(0x3B0); -SetRegisterAllowed(0x3B4); -SetRegisterAllowed(0x3B8); -SetRegisterAllowed(0x3BC); -SetRegisterAllowed(0x3C0); -SetRegisterAllowed(0x3C4); -SetRegisterAllowed(0x3C8); -SetRegisterAllowed(0x3CC); -SetRegisterAllowed(0x3D0); -SetRegisterAllowed(0x3D4); -SetRegisterAllowed(0x3D8); -SetRegisterAllowed(0x3DC); -SetRegisterAllowed(0x3E0); -SetRegisterAllowed(0x3E4); -SetRegisterAllowed(0x3E8); -SetRegisterAllowed(0x3EC); -SetRegisterAllowed(0x3F0); -SetRegisterAllowed(0x3F4); -SetRegisterAllowed(0x3F8); -SetRegisterAllowed(0x3FC); -SetRegisterAllowed(0x400); -SetRegisterAllowed(0x404); -SetRegisterAllowed(0x408); -SetRegisterAllowed(0x40C); -SetRegisterAllowed(0x410); -SetRegisterAllowed(0x414); -SetRegisterAllowed(0x418); -SetRegisterAllowed(0x41C); -SetRegisterAllowed(0x420); -SetRegisterAllowed(0x424); -SetRegisterAllowed(0x428); -SetRegisterAllowed(0x42C); -SetRegisterAllowed(0x430); -SetRegisterAllowed(0x434); -SetRegisterAllowed(0x438); -SetRegisterAllowed(0x43C); -SetRegisterAllowed(0x440); -SetRegisterAllowed(0x444); -SetRegisterAllowed(0x448); -SetRegisterAllowed(0x44C); -SetRegisterAllowed(0x450); -SetRegisterAllowed(0x454); -SetRegisterAllowed(0x458); -SetRegisterAllowed(0x45C); -SetRegisterAllowed(0x460); -SetRegisterAllowed(0x464); -SetRegisterAllowed(0x468); -SetRegisterAllowed(0x46C); -SetRegisterAllowed(0x470); -SetRegisterAllowed(0x474); -SetRegisterAllowed(0x478); -SetRegisterAllowed(0x47C); -SetRegisterAllowed(0x480); -SetRegisterAllowed(0x484); -SetRegisterAllowed(0x488); -SetRegisterAllowed(0x48C); -SetRegisterAllowed(0x490); -SetRegisterAllowed(0x494); -SetRegisterAllowed(0x498); -SetRegisterAllowed(0x49C); -SetRegisterAllowed(0x4A0); -SetRegisterAllowed(0x4A4); -SetRegisterAllowed(0x4A8); -SetRegisterAllowed(0x4AC); -SetRegisterAllowed(0x4B0); -SetRegisterAllowed(0x4B4); -SetRegisterAllowed(0x4B8); -SetRegisterAllowed(0x4BC); -SetRegisterAllowed(0x4C0); -SetRegisterAllowed(0x4C4); -SetRegisterAllowed(0x4C8); -SetRegisterAllowed(0x4CC); -SetRegisterAllowed(0x4D0); -SetRegisterAllowed(0x4D4); -SetRegisterAllowed(0x4D8); -SetRegisterAllowed(0x4DC); -SetRegisterAllowed(0x4E0); -SetRegisterAllowed(0x4E4); -SetRegisterAllowed(0x4E8); -SetRegisterAllowed(0x4EC); -SetRegisterAllowed(0x4F0); -SetRegisterAllowed(0x4F4); -SetRegisterAllowed(0x4F8); -SetRegisterAllowed(0x4FC); -SetRegisterAllowed(0x500); -SetRegisterAllowed(0x504); -SetRegisterAllowed(0x508); -SetRegisterAllowed(0x50C); -SetRegisterAllowed(0x510); -SetRegisterAllowed(0x514); -SetRegisterAllowed(0x518); -SetRegisterAllowed(0x51C); -SetRegisterAllowed(0x520); -SetRegisterAllowed(0x524); -SetRegisterAllowed(0x528); -SetRegisterAllowed(0x52C); -SetRegisterAllowed(0x530); -SetRegisterAllowed(0x534); -SetRegisterAllowed(0x538); -SetRegisterAllowed(0x53C); -SetRegisterAllowed(0x540); -SetRegisterAllowed(0x544); -SetRegisterAllowed(0x548); -SetRegisterAllowed(0x54C); -SetRegisterAllowed(0x550); -SetRegisterAllowed(0x554); -SetRegisterAllowed(0x558); -SetRegisterAllowed(0x55C); -SetRegisterAllowed(0x560); -SetRegisterAllowed(0x564); -SetRegisterAllowed(0x568); -SetRegisterAllowed(0x56C); -SetRegisterAllowed(0x570); -SetRegisterAllowed(0x574); -SetRegisterAllowed(0x578); -SetRegisterAllowed(0x57C); -SetRegisterAllowed(0x580); -SetRegisterAllowed(0x584); -SetRegisterAllowed(0x588); -SetRegisterAllowed(0x58C); -SetRegisterAllowed(0x590); -SetRegisterAllowed(0x594); -SetRegisterAllowed(0x598); -SetRegisterAllowed(0x59C); -SetRegisterAllowed(0x5A0); -SetRegisterAllowed(0x5A4); -SetRegisterAllowed(0x5A8); -SetRegisterAllowed(0x5AC); -SetRegisterAllowed(0x5B0); -SetRegisterAllowed(0x5B4); -SetRegisterAllowed(0x5B8); -SetRegisterAllowed(0x5BC); -SetRegisterAllowed(0x5C0); -SetRegisterAllowed(0x5C4); -SetRegisterAllowed(0x5C8); -SetRegisterAllowed(0x5CC); -SetRegisterAllowed(0x5D0); -SetRegisterAllowed(0x5D4); -SetRegisterAllowed(0x5D8); -SetRegisterAllowed(0x5DC); -SetRegisterAllowed(0x5E0); -SetRegisterAllowed(0x5E4); -SetRegisterAllowed(0x5E8); -SetRegisterAllowed(0x5EC); -SetRegisterAllowed(0x5F0); -SetRegisterAllowed(0x5F4); -SetRegisterAllowed(0x5F8); -SetRegisterAllowed(0x5FC); -SetRegisterAllowed(0x600); -SetRegisterAllowed(0x604); -SetRegisterAllowed(0x608); -SetRegisterAllowed(0x60C); -SetRegisterAllowed(0x610); -SetRegisterAllowed(0x614); -SetRegisterAllowed(0x618); -SetRegisterAllowed(0x61C); -SetRegisterAllowed(0x620); -SetRegisterAllowed(0x624); -SetRegisterAllowed(0x628); -SetRegisterAllowed(0x62C); -SetRegisterAllowed(0x630); -SetRegisterAllowed(0x634); -SetRegisterAllowed(0x638); -SetRegisterAllowed(0x63C); -SetRegisterAllowed(0x640); -SetRegisterAllowed(0x644); -SetRegisterAllowed(0x648); -SetRegisterAllowed(0x64C); -SetRegisterAllowed(0x650); -SetRegisterAllowed(0x654); -SetRegisterAllowed(0x658); -SetRegisterAllowed(0x65C); -SetRegisterAllowed(0x660); -SetRegisterAllowed(0x664); -SetRegisterAllowed(0x668); -SetRegisterAllowed(0x66C); -SetRegisterAllowed(0x670); -SetRegisterAllowed(0x674); -SetRegisterAllowed(0x678); -SetRegisterAllowed(0x67C); -SetRegisterAllowed(0x680); -SetRegisterAllowed(0x684); -SetRegisterAllowed(0x688); -SetRegisterAllowed(0x68C); -SetRegisterAllowed(0x690); -SetRegisterAllowed(0x694); -SetRegisterAllowed(0x698); -SetRegisterAllowed(0x69C); -SetRegisterAllowed(0x6A0); -SetRegisterAllowed(0x6A4); -SetRegisterAllowed(0x6A8); -SetRegisterAllowed(0x6AC); -SetRegisterAllowed(0x6B0); -SetRegisterAllowed(0x6B4); -SetRegisterAllowed(0x6B8); -SetRegisterAllowed(0x6BC); -SetRegisterAllowed(0x6C0); -SetRegisterAllowed(0x6C4); -SetRegisterAllowed(0x6C8); -SetRegisterAllowed(0x6CC); -SetRegisterAllowed(0x6D0); -SetRegisterAllowed(0x6D4); -SetRegisterAllowed(0x6D8); -SetRegisterAllowed(0x6DC); -SetRegisterAllowed(0x6E0); -SetRegisterAllowed(0x6E4); -SetRegisterAllowed(0x6E8); -SetRegisterAllowed(0x6EC); -SetRegisterAllowed(0x6F0); -SetRegisterAllowed(0x6F4); -SetRegisterAllowed(0x6F8); -SetRegisterAllowed(0x6FC); -SetRegisterAllowed(0x700); -SetRegisterAllowed(0x704); -SetRegisterAllowed(0x708); -SetRegisterAllowed(0x70C); -SetRegisterAllowed(0x710); -SetRegisterAllowed(0x714); -SetRegisterAllowed(0x718); -SetRegisterAllowed(0x71C); -SetRegisterAllowed(0x720); -SetRegisterAllowed(0x724); -SetRegisterAllowed(0x728); -SetRegisterAllowed(0x72C); -SetRegisterAllowed(0x730); -SetRegisterAllowed(0x734); -SetRegisterAllowed(0x738); -SetRegisterAllowed(0x73C); -SetRegisterAllowed(0x740); -SetRegisterAllowed(0x744); -SetRegisterAllowed(0x748); -SetRegisterAllowed(0x74C); -SetRegisterAllowed(0x750); -SetRegisterAllowed(0x754); -SetRegisterAllowed(0x758); -SetRegisterAllowed(0x75C); -SetRegisterAllowed(0x760); -SetRegisterAllowed(0x764); -SetRegisterAllowed(0x768); -SetRegisterAllowed(0x76C); -SetRegisterAllowed(0x770); -SetRegisterAllowed(0x774); -SetRegisterAllowed(0x778); -SetRegisterAllowed(0x77C); -SetRegisterAllowed(0x780); -SetRegisterAllowed(0x784); -SetRegisterAllowed(0x788); -SetRegisterAllowed(0x78C); -SetRegisterAllowed(0x790); -SetRegisterAllowed(0x794); -SetRegisterAllowed(0x798); -SetRegisterAllowed(0x79C); -SetRegisterAllowed(0x7A0); -SetRegisterAllowed(0x7A4); -SetRegisterAllowed(0x7A8); -SetRegisterAllowed(0x7AC); -SetRegisterAllowed(0x7B0); -SetRegisterAllowed(0x7B4); -SetRegisterAllowed(0x7B8); -SetRegisterAllowed(0x7BC); -SetRegisterAllowed(0x7C0); -SetRegisterAllowed(0x7C4); -SetRegisterAllowed(0x7C8); -SetRegisterAllowed(0x7CC); -SetRegisterAllowed(0x7D0); -SetRegisterAllowed(0x7D4); -SetRegisterAllowed(0x7D8); -SetRegisterAllowed(0x7DC); -SetRegisterAllowed(0x7E0); -SetRegisterAllowed(0x7E4); -SetRegisterAllowed(0x7E8); -SetRegisterAllowed(0x7EC); -SetRegisterAllowed(0x7F0); -SetRegisterAllowed(0x7F4); -SetRegisterAllowed(0x7F8); -SetRegisterAllowed(0x7FC); -SetRegisterAllowed(0x800); -SetRegisterAllowed(0x804); -SetRegisterAllowed(0x808); -SetRegisterAllowed(0x80C); -SetRegisterAllowed(0x810); -SetRegisterAllowed(0x814); -SetRegisterAllowed(0x818); -SetRegisterAllowed(0x81C); -SetRegisterAllowed(0x820); -SetRegisterAllowed(0x824); -SetRegisterAllowed(0x828); -SetRegisterAllowed(0x82C); -SetRegisterAllowed(0x830); -SetRegisterAllowed(0x834); -SetRegisterAllowed(0x838); -SetRegisterAllowed(0x83C); -SetRegisterAllowed(0x840); -SetRegisterAllowed(0x844); -SetRegisterAllowed(0x848); -SetRegisterAllowed(0x84C); -SetRegisterAllowed(0x850); -SetRegisterAllowed(0x854); -SetRegisterAllowed(0x858); -SetRegisterAllowed(0x85C); -SetRegisterAllowed(0x860); -SetRegisterAllowed(0x864); -SetRegisterAllowed(0x868); -SetRegisterAllowed(0x86C); -SetRegisterAllowed(0x870); -SetRegisterAllowed(0x874); -SetRegisterAllowed(0x878); -SetRegisterAllowed(0x87C); -SetRegisterAllowed(0x880); -SetRegisterAllowed(0x884); -SetRegisterAllowed(0x888); -SetRegisterAllowed(0x88C); -SetRegisterAllowed(0x890); -SetRegisterAllowed(0x894); -SetRegisterAllowed(0x898); -SetRegisterAllowed(0x89C); -SetRegisterAllowed(0x8A0); -SetRegisterAllowed(0x8A4); -SetRegisterAllowed(0x8A8); -SetRegisterAllowed(0x8AC); -SetRegisterAllowed(0x8B0); -SetRegisterAllowed(0x8B4); -SetRegisterAllowed(0x8B8); -SetRegisterAllowed(0x8BC); -SetRegisterAllowed(0x8C0); -SetRegisterAllowed(0x8C4); -SetRegisterAllowed(0x8C8); -SetRegisterAllowed(0x8CC); -SetRegisterAllowed(0x8D0); -SetRegisterAllowed(0x8D4); -SetRegisterAllowed(0x8D8); -SetRegisterAllowed(0x8DC); -SetRegisterAllowed(0x8E0); -SetRegisterAllowed(0x8E4); -SetRegisterAllowed(0x8E8); -SetRegisterAllowed(0x8EC); -SetRegisterAllowed(0x8F0); -SetRegisterAllowed(0x8F4); -SetRegisterAllowed(0x8F8); -SetRegisterAllowed(0x8FC); -SetRegisterAllowed(0x900); -SetRegisterAllowed(0x904); -SetRegisterAllowed(0x908); -SetRegisterAllowed(0x90C); -SetRegisterAllowed(0x910); -SetRegisterAllowed(0x914); -SetRegisterAllowed(0x918); -SetRegisterAllowed(0x91C); -SetRegisterAllowed(0x920); -SetRegisterAllowed(0x924); -SetRegisterAllowed(0x928); -SetRegisterAllowed(0x92C); -SetRegisterAllowed(0x930); -SetRegisterAllowed(0x934); -SetRegisterAllowed(0x938); -SetRegisterAllowed(0x93C); -SetRegisterAllowed(0x940); -SetRegisterAllowed(0x944); -SetRegisterAllowed(0x948); -SetRegisterAllowed(0x94C); -SetRegisterAllowed(0x950); -SetRegisterAllowed(0x954); -SetRegisterAllowed(0x958); -SetRegisterAllowed(0x95C); -SetRegisterAllowed(0x960); -SetRegisterAllowed(0x964); -SetRegisterAllowed(0x968); -SetRegisterAllowed(0x96C); -SetRegisterAllowed(0x970); -SetRegisterAllowed(0x974); -SetRegisterAllowed(0x978); -SetRegisterAllowed(0x97C); -SetRegisterAllowed(0x980); -SetRegisterAllowed(0x984); -SetRegisterAllowed(0x988); -SetRegisterAllowed(0x98C); -SetRegisterAllowed(0x990); -SetRegisterAllowed(0x994); -SetRegisterAllowed(0x998); -SetRegisterAllowed(0x99C); -SetRegisterAllowed(0x9A0); -SetRegisterAllowed(0x9A4); -SetRegisterAllowed(0x9A8); -SetRegisterAllowed(0x9AC); -SetRegisterAllowed(0x9B0); -SetRegisterAllowed(0x9B4); -SetRegisterAllowed(0x9B8); -SetRegisterAllowed(0x9BC); -SetRegisterAllowed(0x9C0); -SetRegisterAllowed(0x9C4); -SetRegisterAllowed(0x9C8); -SetRegisterAllowed(0x9CC); -SetRegisterAllowed(0x9D0); -SetRegisterAllowed(0x9D4); -SetRegisterAllowed(0x9D8); -SetRegisterAllowed(0x9DC); -SetRegisterAllowed(0x9E0); -SetRegisterAllowed(0x9E4); -SetRegisterAllowed(0x9E8); -SetRegisterAllowed(0x9EC); -SetRegisterAllowed(0x9F0); -SetRegisterAllowed(0x9F4); -SetRegisterAllowed(0x9F8); -SetRegisterAllowed(0x9FC); -SetRegisterAllowed(0xA00); -SetRegisterAllowed(0xA04); -SetRegisterAllowed(0xA08); -SetRegisterAllowed(0xA0C); -SetRegisterAllowed(0xA10); -SetRegisterAllowed(0xA14); -SetRegisterAllowed(0xA18); -SetRegisterAllowed(0xA1C); -SetRegisterAllowed(0xA20); -SetRegisterAllowed(0xA24); -SetRegisterAllowed(0xA28); -SetRegisterAllowed(0xA2C); -SetRegisterAllowed(0xA30); -SetRegisterAllowed(0xA34); -SetRegisterAllowed(0xA38); -SetRegisterAllowed(0xA3C); -SetRegisterAllowed(0xA40); -SetRegisterAllowed(0xA44); -SetRegisterAllowed(0xA48); -SetRegisterAllowed(0xA4C); -SetRegisterAllowed(0xA50); -SetRegisterAllowed(0xA54); -SetRegisterAllowed(0xA58); -SetRegisterAllowed(0xA5C); -SetRegisterAllowed(0xA60); -SetRegisterAllowed(0xA64); -SetRegisterAllowed(0xA68); -SetRegisterAllowed(0xA6C); -SetRegisterAllowed(0xA70); -SetRegisterAllowed(0xA74); -SetRegisterAllowed(0xA78); -SetRegisterAllowed(0xA7C); -SetRegisterAllowed(0xA80); -SetRegisterAllowed(0xA84); -SetRegisterAllowed(0xA88); -SetRegisterAllowed(0xA8C); -SetRegisterAllowed(0xA90); -SetRegisterAllowed(0xA94); -SetRegisterAllowed(0xA98); -SetRegisterAllowed(0xA9C); -SetRegisterAllowed(0xAA0); -SetRegisterAllowed(0xAA4); -SetRegisterAllowed(0xAA8); -SetRegisterAllowed(0xAAC); -SetRegisterAllowed(0xAB0); -SetRegisterAllowed(0xAB4); -SetRegisterAllowed(0xAB8); -SetRegisterAllowed(0xABC); -SetRegisterAllowed(0xAC0); -SetRegisterAllowed(0xAC4); -SetRegisterAllowed(0xAC8); -SetRegisterAllowed(0xACC); -SetRegisterAllowed(0xAD0); -SetRegisterAllowed(0xAD4); -SetRegisterAllowed(0xAD8); -SetRegisterAllowed(0xADC); -SetRegisterAllowed(0xAE0); -SetRegisterAllowed(0xAE4); -SetRegisterAllowed(0xAE8); -SetRegisterAllowed(0xAEC); -SetRegisterAllowed(0xAF0); -SetRegisterAllowed(0xAF4); -SetRegisterAllowed(0xAF8); -SetRegisterAllowed(0xAFC); -SetRegisterAllowed(0xB00); -SetRegisterAllowed(0xB04); -SetRegisterAllowed(0xB08); -SetRegisterAllowed(0xB0C); -SetRegisterAllowed(0xB10); -SetRegisterAllowed(0xB14); -SetRegisterAllowed(0xB18); -SetRegisterAllowed(0xB1C); -SetRegisterAllowed(0xB20); -SetRegisterAllowed(0xB24); -SetRegisterAllowed(0xB28); -SetRegisterAllowed(0xB2C); -SetRegisterAllowed(0xB30); -SetRegisterAllowed(0xB34); -SetRegisterAllowed(0xB38); -SetRegisterAllowed(0xB3C); -SetRegisterAllowed(0xB40); -SetRegisterAllowed(0xB44); -SetRegisterAllowed(0xB48); -SetRegisterAllowed(0xB4C); -SetRegisterAllowed(0xB50); -SetRegisterAllowed(0xB54); -SetRegisterAllowed(0xB58); -SetRegisterAllowed(0xB5C); -SetRegisterAllowed(0xB60); -SetRegisterAllowed(0xB64); -SetRegisterAllowed(0xB68); -SetRegisterAllowed(0xB6C); -SetRegisterAllowed(0xB70); -SetRegisterAllowed(0xB74); -SetRegisterAllowed(0xB78); -SetRegisterAllowed(0xB7C); -SetRegisterAllowed(0xB80); -SetRegisterAllowed(0xB84); -SetRegisterAllowed(0xB88); -SetRegisterAllowed(0xB8C); -SetRegisterAllowed(0xB90); -SetRegisterAllowed(0xB94); -SetRegisterAllowed(0xB98); -SetRegisterAllowed(0xB9C); -SetRegisterAllowed(0xBA0); -SetRegisterAllowed(0xBA4); -SetRegisterAllowed(0xBA8); -SetRegisterAllowed(0xBAC); -SetRegisterAllowed(0xBB0); -SetRegisterAllowed(0xBB4); -SetRegisterAllowed(0xBB8); -SetRegisterAllowed(0xBBC); -SetRegisterAllowed(0xBC0); -SetRegisterAllowed(0xBC4); -SetRegisterAllowed(0xBC8); -SetRegisterAllowed(0xBCC); -SetRegisterAllowed(0xBD0); -SetRegisterAllowed(0xBD4); -SetRegisterAllowed(0xBD8); -SetRegisterAllowed(0xBDC); -SetRegisterAllowed(0xBE0); -SetRegisterAllowed(0xBE4); -SetRegisterAllowed(0xBE8); -SetRegisterAllowed(0xBEC); -SetRegisterAllowed(0xBF0); -SetRegisterAllowed(0xBF4); -SetRegisterAllowed(0xBF8); -SetRegisterAllowed(0xBFC); -SetRegisterAllowed(0xC00); -SetRegisterAllowed(0xC04); -SetRegisterAllowed(0xC08); -SetRegisterAllowed(0xC0C); -SetRegisterAllowed(0xC10); -SetRegisterAllowed(0xC14); -SetRegisterAllowed(0xC18); -SetRegisterAllowed(0xC1C); -SetRegisterAllowed(0xC20); -SetRegisterAllowed(0xC24); -SetRegisterAllowed(0xC28); -SetRegisterAllowed(0xC2C); -SetRegisterAllowed(0xC30); -SetRegisterAllowed(0xC34); -SetRegisterAllowed(0xC38); -SetRegisterAllowed(0xC3C); -SetRegisterAllowed(0xC40); -SetRegisterAllowed(0xC44); -SetRegisterAllowed(0xC48); -SetRegisterAllowed(0xC4C); -SetRegisterAllowed(0xC50); -SetRegisterAllowed(0xC54); -SetRegisterAllowed(0xC58); -SetRegisterAllowed(0xC5C); -SetRegisterAllowed(0xC60); -SetRegisterAllowed(0xC64); -SetRegisterAllowed(0xC68); -SetRegisterAllowed(0xC6C); -SetRegisterAllowed(0xC70); -SetRegisterAllowed(0xC74); -SetRegisterAllowed(0xC78); -SetRegisterAllowed(0xC7C); -SetRegisterAllowed(0xC80); -SetRegisterAllowed(0xC84); -SetRegisterAllowed(0xC88); -SetRegisterAllowed(0xC8C); -SetRegisterAllowed(0xC90); -SetRegisterAllowed(0xC94); -SetRegisterAllowed(0xC98); -SetRegisterAllowed(0xC9C); -SetRegisterAllowed(0xCA0); -SetRegisterAllowed(0xCA4); -SetRegisterAllowed(0xCA8); -SetRegisterAllowed(0xCAC); -SetRegisterAllowed(0xCB0); -SetRegisterAllowed(0xCB4); -SetRegisterAllowed(0xCB8); -SetRegisterAllowed(0xCBC); -SetRegisterAllowed(0xCC0); -SetRegisterAllowed(0xCC4); -SetRegisterAllowed(0xCC8); -SetRegisterAllowed(0xCCC); -SetRegisterAllowed(0xCD0); -SetRegisterAllowed(0xCD4); -SetRegisterAllowed(0xCD8); -SetRegisterAllowed(0xCDC); -SetRegisterAllowed(0xCE0); -SetRegisterAllowed(0xCE4); -SetRegisterAllowed(0xCE8); -SetRegisterAllowed(0xCEC); -SetRegisterAllowed(0xCF0); -SetRegisterAllowed(0xCF4); -SetRegisterAllowed(0xCF8); -SetRegisterAllowed(0xCFC); -SetRegisterAllowed(0xD00); -SetRegisterAllowed(0xD04); -SetRegisterAllowed(0xD08); -SetRegisterAllowed(0xD0C); -SetRegisterAllowed(0xD10); -SetRegisterAllowed(0xD14); -SetRegisterAllowed(0xD18); -SetRegisterAllowed(0xD1C); -SetRegisterAllowed(0xD20); -SetRegisterAllowed(0xD24); -SetRegisterAllowed(0xD28); -SetRegisterAllowed(0xD2C); -SetRegisterAllowed(0xD30); -SetRegisterAllowed(0xD34); -SetRegisterAllowed(0xD38); -SetRegisterAllowed(0xD3C); -SetRegisterAllowed(0xD40); -SetRegisterAllowed(0xD44); -SetRegisterAllowed(0xD48); -SetRegisterAllowed(0xD4C); -SetRegisterAllowed(0xD50); -SetRegisterAllowed(0xD54); -SetRegisterAllowed(0xD58); -SetRegisterAllowed(0xD5C); -SetRegisterAllowed(0xD60); -SetRegisterAllowed(0xD64); -SetRegisterAllowed(0xD68); -SetRegisterAllowed(0xD6C); -SetRegisterAllowed(0xD70); -SetRegisterAllowed(0xD74); -SetRegisterAllowed(0xD78); -SetRegisterAllowed(0xD7C); -SetRegisterAllowed(0xD80); -SetRegisterAllowed(0xD84); -SetRegisterAllowed(0xD88); -SetRegisterAllowed(0xD8C); -SetRegisterAllowed(0xD90); -SetRegisterAllowed(0xD94); -SetRegisterAllowed(0xD98); -SetRegisterAllowed(0xD9C); -SetRegisterAllowed(0xDA0); -SetRegisterAllowed(0xDA4); -SetRegisterAllowed(0xDA8); -SetRegisterAllowed(0xDAC); -SetRegisterAllowed(0xDB0); -SetRegisterAllowed(0xDB4); -SetRegisterAllowed(0xDB8); -SetRegisterAllowed(0xDBC); -SetRegisterAllowed(0xDC0); -SetRegisterAllowed(0xDC4); -SetRegisterAllowed(0xDC8); -SetRegisterAllowed(0xDCC); -SetRegisterAllowed(0xDD0); -SetRegisterAllowed(0xDD4); -SetRegisterAllowed(0xDD8); -SetRegisterAllowed(0xDDC); -SetRegisterAllowed(0xDE0); -SetRegisterAllowed(0xDE4); -SetRegisterAllowed(0xDE8); -SetRegisterAllowed(0xDEC); -SetRegisterAllowed(0xDF0); -SetRegisterAllowed(0xDF4); -SetRegisterAllowed(0xDF8); -SetRegisterAllowed(0xDFC); -SetRegisterAllowed(0xE00); -SetRegisterAllowed(0xE04); -SetRegisterAllowed(0xE08); -SetRegisterAllowed(0xE0C); -SetRegisterAllowed(0xE10); -SetRegisterAllowed(0xE14); -SetRegisterAllowed(0xE18); -SetRegisterAllowed(0xE1C); -SetRegisterAllowed(0xE20); -SetRegisterAllowed(0xE24); -SetRegisterAllowed(0xE28); -SetRegisterAllowed(0xE2C); -SetRegisterAllowed(0xE30); -SetRegisterAllowed(0xE34); -SetRegisterAllowed(0xE38); -SetRegisterAllowed(0xE3C); -SetRegisterAllowed(0xE40); -SetRegisterAllowed(0xE44); -SetRegisterAllowed(0xE48); -SetRegisterAllowed(0xE4C); -SetRegisterAllowed(0xE50); -SetRegisterAllowed(0xE54); -SetRegisterAllowed(0xE58); -SetRegisterAllowed(0xE5C); -SetRegisterAllowed(0xE60); -SetRegisterAllowed(0xE64); -SetRegisterAllowed(0xE68); -SetRegisterAllowed(0xE6C); -SetRegisterAllowed(0xE70); -SetRegisterAllowed(0xE74); -SetRegisterAllowed(0xE78); -SetRegisterAllowed(0xE7C); -SetRegisterAllowed(0xE80); -SetRegisterAllowed(0xE84); -SetRegisterAllowed(0xE88); -SetRegisterAllowed(0xE8C); -SetRegisterAllowed(0xE90); -SetRegisterAllowed(0xE94); -SetRegisterAllowed(0xE98); -SetRegisterAllowed(0xE9C); -SetRegisterAllowed(0xEA0); -SetRegisterAllowed(0xEA4); -SetRegisterAllowed(0xEA8); -SetRegisterAllowed(0xEAC); -SetRegisterAllowed(0xEB0); -SetRegisterAllowed(0xEB4); -SetRegisterAllowed(0xEB8); -SetRegisterAllowed(0xEBC); -SetRegisterAllowed(0xEC0); -SetRegisterAllowed(0xEC4); -SetRegisterAllowed(0xEC8); -SetRegisterAllowed(0xECC); -SetRegisterAllowed(0xED0); -SetRegisterAllowed(0xED4); -SetRegisterAllowed(0xED8); -SetRegisterAllowed(0xEDC); -SetRegisterAllowed(0xEE0); -SetRegisterAllowed(0xEE4); -SetRegisterAllowed(0xEE8); -SetRegisterAllowed(0xEEC); -SetRegisterAllowed(0xEF0); -SetRegisterAllowed(0xEF4); -SetRegisterAllowed(0xEF8); -SetRegisterAllowed(0xEFC); -SetRegisterAllowed(0xF00); -SetRegisterAllowed(0xF04); -SetRegisterAllowed(0xF08); -SetRegisterAllowed(0xF0C); -SetRegisterAllowed(0xF10); -SetRegisterAllowed(0xF14); -SetRegisterAllowed(0xF18); -SetRegisterAllowed(0xF1C); -SetRegisterAllowed(0xF20); -SetRegisterAllowed(0xF24); -SetRegisterAllowed(0xF28); -SetRegisterAllowed(0xF2C); -SetRegisterAllowed(0xF30); -SetRegisterAllowed(0xF34); -SetRegisterAllowed(0xF38); -SetRegisterAllowed(0xF3C); -SetRegisterAllowed(0xF40); -SetRegisterAllowed(0xF44); -SetRegisterAllowed(0xF48); -SetRegisterAllowed(0xF4C); -SetRegisterAllowed(0xF50); -SetRegisterAllowed(0xF54); -SetRegisterAllowed(0xF58); -SetRegisterAllowed(0xF5C); -SetRegisterAllowed(0xF60); -SetRegisterAllowed(0xF64); -SetRegisterAllowed(0xF68); -SetRegisterAllowed(0xF6C); -SetRegisterAllowed(0xF70); -SetRegisterAllowed(0xF74); -SetRegisterAllowed(0xF78); -SetRegisterAllowed(0xF7C); -SetRegisterAllowed(0xF80); -SetRegisterAllowed(0xF84); -SetRegisterAllowed(0xF88); -SetRegisterAllowed(0xF8C); -SetRegisterAllowed(0xF90); -SetRegisterAllowed(0xF94); -SetRegisterAllowed(0xF98); -SetRegisterAllowed(0xF9C); -SetRegisterAllowed(0xFA0); -SetRegisterAllowed(0xFA4); -SetRegisterAllowed(0xFA8); -SetRegisterAllowed(0xFAC); -SetRegisterAllowed(0xFB0); -SetRegisterAllowed(0xFB4); -SetRegisterAllowed(0xFB8); -SetRegisterAllowed(0xFBC); -SetRegisterAllowed(0xFC0); -SetRegisterAllowed(0xFC4); -SetRegisterAllowed(0xFC8); -SetRegisterAllowed(0xFCC); -SetRegisterAllowed(0xFD0); -SetRegisterAllowed(0xFD4); -SetRegisterAllowed(0xFD8); -SetRegisterAllowed(0xFDC); -SetRegisterAllowed(0xFE0); -SetRegisterAllowed(0xFE4); -SetRegisterAllowed(0xFE8); -SetRegisterAllowed(0xFEC); -SetRegisterAllowed(0xFF0); -SetRegisterAllowed(0xFF4); -SetRegisterAllowed(0xFF8); -SetRegisterAllowed(0xFFC); diff --git a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp index 36932196..4bd7c47e 100644 --- a/Source/Atmosphere-Patches/secmon_smc_register_access.cpp +++ b/Source/Atmosphere-Patches/secmon_smc_register_access.cpp @@ -100,8 +100,6 @@ namespace ams::secmon::smc { #include "secmon_define_mc_access_table.inc" #include "secmon_define_emc_access_table.inc" #include "secmon_define_emc01_access_table.inc" - #include "secmon_define_flow_controller_access_table.inc" - #include "secmon_define_exception_vectors_access_table.inc" #include "secmon_define_rtc_pmc_access_table.inc" #include "secmon_define_mc01_access_table.inc" @@ -111,8 +109,6 @@ namespace ams::secmon::smc { { EmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExternalMemoryController.GetAddress(), EmcAccessTable::Address, EmcAccessTable::Size, }, { Emc01AccessTable::ReducedAccessTable.data(), Emc01AccessTable::Address + MemoryRegionVirtualDeviceExternalMemoryController0.GetAddress(), Emc01AccessTable::Address + MemoryRegionPhysicalDeviceExternalMemoryController0.GetAddress(), Emc01AccessTable::Size, }, { Emc01AccessTable::ReducedAccessTable.data(), Emc01AccessTable::Address + MemoryRegionVirtualDeviceExternalMemoryController1.GetAddress(), Emc01AccessTable::Address + MemoryRegionPhysicalDeviceExternalMemoryController1.GetAddress(), Emc01AccessTable::Size, }, - { FlowControllerAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceFlowController.GetAddress(), FlowControllerAccessTable::Address, FlowControllerAccessTable::Size, }, - { ExceptionVectorsAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceExceptionVectors.GetAddress(), ExceptionVectorsAccessTable::Address, ExceptionVectorsAccessTable::Size, }, { RtcPmcAccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceRtcPmc.GetAddress(), RtcPmcAccessTable::Address, RtcPmcAccessTable::Size, }, { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, { Mc01AccessTable::ReducedAccessTable.data(), Mc01AccessTable::Address + MemoryRegionVirtualDeviceMemoryController1.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController1.GetAddress(), Mc01AccessTable::Size, }, diff --git a/build.sh b/build.sh index c2161a58..3dc32ae3 100755 --- a/build.sh +++ b/build.sh @@ -111,20 +111,14 @@ if [ "$NO_EXO" -eq 0 ]; then EXO_PROGRAM_DEST="build/atmosphere/exosphere/program/source" LIBEXO_DEST="build/atmosphere/libraries/libexosphere/include/exosphere/secmon" - cp -v "$EXO_SRC/secmon_setup.cpp" "$EXO_PROGRAM_DEST/" cp -v "$EXO_SRC/secmon_define_emc_access_table.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_emc_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_define_emc01_access_table.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_emc01_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_define_rtc_pmc_access_table.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_rtc_pmc_access_table_data.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_define_flow_controller_access_table.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_flow_controller_access_table_data.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_define_exception_vectors_access_table.inc" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_exception_vectors_access_table_data.inc" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_smc_register_access.cpp" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_smc_handler.cpp" "$EXO_DEST/" - cp -v "$EXO_SRC/secmon_smc_power_management.cpp" "$EXO_DEST/" cp -v "$EXO_SRC/secmon_memory_layout.hpp" "$LIBEXO_DEST/" fi From 7329ee2e80061846deec4e64e0d5eb14ef5e70df Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 24 Sep 2026 17:38:40 -0400 Subject: [PATCH 141/205] add hazel to contributor list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f1032e8a..a4d59b9b 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,7 @@ Refer to COMPILATION.md * **Lightos's Cats** - Cats * **Souldbminer** - hoc-clk and loader development * **Lightos** - Loader patches development, hoc-clk development, guides +* **HAZEL** - Perfect DRAM timings help * **TDRR** - HOC Logo Design * **tetetete-ctrl** - Website design * **SciresM** - Atmosphere CFW From 0393d59e57962cffe8d4ab282c7528fa25e27fdd Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 25 Sep 2026 17:48:39 +0200 Subject: [PATCH 142/205] hoc-clk: update soc volt array size in configurator --- Source/hoc-clk/sysmodule/src/file/kip.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 83e21af4..17277af6 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -335,7 +335,7 @@ namespace file::kip { configValues.values[KipConfigValue_g_volt_e_76800 + i] = cust_get_erista_gpu_volt(&table, i); } - for (size_t i = 0; i < 26; ++i) { + for (size_t i = 0; i < 28; ++i) { configValues.values[KipConfigValue_g_soc_volt_1866000 + i] = cust_get_mariko_soc_volt(&table, i); } From f2eadd8866686d1a6fb5f43bd6891af5045ddcd4 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 25 Sep 2026 17:56:22 +0200 Subject: [PATCH 143/205] ldr: remove extra line --- .../loader/source/oc/pcv/common/calculate_timings_common.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp index 1a366a80..78c0b03b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp @@ -58,7 +58,6 @@ namespace ams::ldr::hoc::pcv { return value + (value % 2); } - double GetTckAvg(u32 khz) { return 1000'000.0 / static_cast(khz); } From 3af1b89340c68ae454cf8283f7d4966b91d63652 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 25 Sep 2026 18:01:59 +0200 Subject: [PATCH 144/205] ldr: even more formating stuff --- .../loader/source/oc/pcv/common/calculate_timings_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp index 78c0b03b..1c5f98f3 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp @@ -168,7 +168,7 @@ namespace ams::ldr::hoc::pcv { for (u32 i = 0; i < std::size(rlMapDBI); ++i) { if (rlMapDBI[i] == RL) { rlIndex = i; - break; + break; } } From bc2830932acfeb4c5a09f005370aa9e344d4d668 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 28 Sep 2026 11:31:13 +0200 Subject: [PATCH 145/205] ldr_process_creation: update to latest ldr_process_creation: actually update to latest --- .../loader/source/ldr_process_creation.cpp | 170 ++-- .../ldr_process_creation_1_12_0.cpp | 960 ++++++++++++++++++ 2 files changed, 1051 insertions(+), 79 deletions(-) create mode 100644 Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp diff --git a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp index a4d90b00..e8ccf5df 100644 --- a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp @@ -124,11 +124,9 @@ namespace ams::ldr { /* Pcv/Ptm/NvServices check cache */ bool g_is_pcv; bool g_is_ptm; - bool g_is_nvsrv; /* Global Zstd decompression context. */ - constexpr size_t ZstdDctxWorkspaceSize = 0x176E8; - alignas(8) u8 g_zstd_dctx_workspace[ZstdDctxWorkspaceSize]; + alignas(8) u8 g_zstd_dctx_workspace[util::DecompressZstdWithBicWorkBufferSizeDefault]; Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) { /* No version verification is done before 8.1.0. */ @@ -182,8 +180,8 @@ namespace ams::ldr { return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; } - Npdm::AddressSpaceType GetAddressSpaceType(const Meta *meta) { - return static_cast((meta->npdm->flags & Npdm::MetaFlag_AddressSpaceTypeMask) >> Npdm::MetaFlag_AddressSpaceTypeShift); + Npdm::ProcessAddressSpace GetProcessAddressSpace(const Meta *meta) { + return static_cast((meta->npdm->flags0 & Npdm::MetaFlag0_ProcessAddressSpaceMask) >> Npdm::MetaFlag0_ProcessAddressSpaceShift); } Acid::PoolPartition GetPoolPartition(const Meta *meta) { @@ -226,7 +224,7 @@ namespace ams::ldr { /* Read NSO header. */ size_t read_size; R_TRY(fs::ReadFile(std::addressof(read_size), file, 0, g_nso_headers + ctx.nso_count, sizeof(NsoHeader))); - R_UNLESS(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso()); + R_UNLESS_LOG(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso(), "[ldr] NSO header truncated!\n"); /* Note nso is present. */ switch (i) { @@ -265,7 +263,7 @@ namespace ams::ldr { Result CheckAutoLoad(const AutoLoadModuleContext &ctx, u32 acid_flags) { /* We must always have a main. */ - R_UNLESS(ctx.ali.has_main, ldr::ResultInvalidNso()); + R_UNLESS_LOG(ctx.ali.has_main, ldr::ResultInvalidNso(), "[ldr] Missing main!\n"); /* Validate flags and extents for all present NSOs. */ for (int i = 0; i < ctx.nso_count; ++i) { @@ -273,11 +271,11 @@ namespace ams::ldr { /* All NSOs must not be --X. */ /* This is "probably" not checked on Ounce? */ - R_UNLESS((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso()); + R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] --x not allowed!\n", i); /* Zstd compression only allowed on main, and only when both rtld+sdk are present. */ if (i != ctx.main_nso_idx || ctx.rtld_idx < 0 || ctx.sdk_nso_idx < 0) { - R_UNLESS((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso()); + R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] zbic not allowed!\n", i); } /* NSOs must have page-aligned segments. */ @@ -300,13 +298,13 @@ namespace ams::ldr { const bool has_browser_dll = (acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) != 0; if (ctx.ali.has_rtld || ctx.ali.has_sdk) { /* If we have sdk we must have rtld. */ - R_UNLESS(ctx.ali.has_rtld, ldr::ResultInvalidNso()); + R_UNLESS_LOG(ctx.ali.has_rtld, ldr::ResultInvalidNso(), "[ldr] Missing rtld!\n"); /* If we have rtld, we must not have browser core dll. */ - R_UNLESS(!has_browser_dll, ldr::ResultInvalidNso()); + R_UNLESS_LOG(!has_browser_dll, ldr::ResultInvalidNso(), "[ldr] BrowserCoreDll must not be present!\n"); } else { /* We must not have both subsdk and browser dll. */ - R_UNLESS(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso()); + R_UNLESS_LOG(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso(), "[ldr] Can't have both subsdk and BrowserCoreDll!\n"); } R_SUCCEED(); @@ -380,7 +378,6 @@ namespace ams::ldr { /* Check if NCA is PCV or PTM */ g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; - g_is_nvsrv = meta->aci->program_id == ncm::SystemProgramId::NvServices; /* If we have data to validate, validate it. */ if (meta->check_verification_data) { @@ -396,6 +393,8 @@ namespace ams::ldr { /* If the signature check fails, we need to check if this is allowable. */ if (!is_signature_valid) { + AMS_LOG("[ldr] invalid signature!\n"); + /* We have to enforce signature checks on prod and when we have a signature to check on dev. */ R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature()); R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature()); @@ -409,52 +408,56 @@ namespace ams::ldr { R_SUCCEED(); } - Result GetCreateProcessFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { - const u8 meta_flags = meta->npdm->flags; + Result GetCreateProcessParameterFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { + const u8 meta_flags0 = meta->npdm->flags0; + const u8 meta_flags1 = meta->npdm->flags1; u32 flags = 0; /* Set Is64Bit. */ - if (meta_flags & Npdm::MetaFlag_Is64Bit) { - flags |= svc::CreateProcessFlag_Is64Bit; + if (meta_flags0 & Npdm::MetaFlag0_Is64BitInstruction) { + flags |= svc::CreateProcessParameterFlag_64Bit; } - /* Set AddressSpaceType. */ - switch (GetAddressSpaceType(meta)) { - case Npdm::AddressSpaceType_32Bit: - flags |= svc::CreateProcessFlag_AddressSpace32Bit; + /* Set ProcessAddressSpace. */ + switch (GetProcessAddressSpace(meta)) { + case Npdm::ProcessAddressSpace_32Bit: + flags |= svc::CreateProcessParameterFlag_AddressSpace32Bit; break; - case Npdm::AddressSpaceType_64BitDeprecated: - flags |= svc::CreateProcessFlag_AddressSpace64BitDeprecated; + case Npdm::ProcessAddressSpace_64Bit36: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit36; break; - case Npdm::AddressSpaceType_32BitWithoutAlias: - flags |= svc::CreateProcessFlag_AddressSpace32BitWithoutAlias; + case Npdm::ProcessAddressSpace_32BitNoReserved: + flags |= svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved; break; - case Npdm::AddressSpaceType_64Bit: - flags |= svc::CreateProcessFlag_AddressSpace64Bit; + case Npdm::ProcessAddressSpace_64Bit39: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit39; + break; + case Npdm::ProcessAddressSpace_64Bit42: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit42; break; default: R_THROW(ldr::ResultInvalidMeta()); } /* Set Enable Debug. */ - if (ldr_flags & CreateProcessFlag_EnableDebug) { - flags |= svc::CreateProcessFlag_EnableDebug; + if (ldr_flags & CreateProcessParameterFlag_EnableJitDebug) { + flags |= svc::CreateProcessParameterFlag_EnableJitDebug; } /* Set Enable ASLR. */ - if (!(ldr_flags & CreateProcessFlag_DisableAslr)) { - flags |= svc::CreateProcessFlag_EnableAslr; + if (!(ldr_flags & CreateProcessParameterFlag_DisableAslr)) { + flags |= svc::CreateProcessParameterFlag_EnableAslr; } /* Set Is Application. */ if (IsApplication(meta)) { - flags |= svc::CreateProcessFlag_IsApplication; + flags |= svc::CreateProcessParameterFlag_IsApplication; /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ if (hos::GetVersion() >= hos::Version_7_0_0) { - if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) { - flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation; + if (meta_flags0 & Npdm::MetaFlag0_OptimizeMemoryAllocation) { + flags |= svc::CreateProcessParameterFlag_OptimizeMemoryAllocation; } } } @@ -466,19 +469,19 @@ namespace ams::ldr { switch (GetPoolPartition(meta)) { case Acid::PoolPartition_Application: if (IsApplet(meta)) { - flags |= svc::CreateProcessFlag_PoolPartitionApplet; + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; } else { - flags |= svc::CreateProcessFlag_PoolPartitionApplication; + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplication; } break; case Acid::PoolPartition_Applet: - flags |= svc::CreateProcessFlag_PoolPartitionApplet; + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; break; case Acid::PoolPartition_System: - flags |= svc::CreateProcessFlag_PoolPartitionSystem; + flags |= svc::CreateProcessParameterFlag_PoolPartitionSystem; break; case Acid::PoolPartition_SystemNonSecure: - flags |= svc::CreateProcessFlag_PoolPartitionSystemNonSecure; + flags |= svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure; break; default: R_THROW(ldr::ResultInvalidMeta()); @@ -486,18 +489,23 @@ namespace ams::ldr { } else if (hos::GetVersion() >= hos::Version_4_0_0) { /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { - flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory; + flags |= svc::CreateProcessParameterFlag_DeprecatedUseSecureMemory; } } - /* 11.0.0+/meso Set Disable DAS merge. */ - if (meta_flags & Npdm::MetaFlag_DisableDeviceAddressSpaceMerge) { - flags |= svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; + /* 11.0.0+/meso Set Disable DAS Merge. */ + if (meta_flags0 & Npdm::MetaFlag0_DisableDeviceAddressSpaceMerge) { + flags |= svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge; } - /* 18.0.0+/meso Set Alias region extra size. */ - if (meta_flags & Npdm::MetaFlag_EnableAliasRegionExtraSize) { - flags |= svc::CreateProcessFlag_EnableAliasRegionExtraSize; + /* 18.0.0+/meso Set Enable Address Sanitizer . */ + if (meta_flags0 & Npdm::MetaFlag0_EnableAddressSanitizer) { + flags |= svc::CreateProcessParameterFlag_EnableAddressSanitizer; + } + + /* 23.0.0+/meso Set Enable Shadow Stack. */ + if (meta_flags1 & Npdm::MetaFlag1_EnableShadowStack) { + flags |= svc::CreateProcessParameterFlag_EnableShadowStack; } *out = flags; @@ -515,7 +523,7 @@ namespace ams::ldr { out->reslimit = resource_limit; /* Set flags. */ - R_TRY(GetCreateProcessFlags(std::addressof(out->flags), meta, flags)); + R_TRY(GetCreateProcessParameterFlags(std::addressof(out->flags), meta, flags)); /* 3.0.0+ System Resource Size. */ if (hos::GetVersion() >= hos::Version_3_0_0) { @@ -525,7 +533,7 @@ namespace ams::ldr { /* Validate system resource usage. */ if (meta->npdm->system_resource_size) { /* Process must be 64-bit. */ - R_UNLESS((out->flags & svc::CreateProcessFlag_AddressSpace64Bit), ldr::ResultInvalidMeta()); + R_UNLESS((out->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit39), ldr::ResultInvalidMeta()); /* Process must be application or applet. */ R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); @@ -598,25 +606,29 @@ namespace ams::ldr { uintptr_t aslr_start = 0; size_t aslr_size = 0; if (hos::GetVersion() >= hos::Version_2_0_0) { - switch (out_param->flags & svc::CreateProcessFlag_AddressSpaceMask) { - case svc::CreateProcessFlag_AddressSpace32Bit: - case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: + switch (out_param->flags & svc::CreateProcessParameterFlag_AddressSpaceMask) { + case svc::CreateProcessParameterFlag_AddressSpace32Bit: + case svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved: aslr_start = svc::AddressSmallMap32Start; aslr_size = svc::AddressSmallMap32Size; break; - case svc::CreateProcessFlag_AddressSpace64BitDeprecated: + case svc::CreateProcessParameterFlag_AddressSpace64Bit36: aslr_start = svc::AddressSmallMap36Start; aslr_size = svc::AddressSmallMap36Size; break; - case svc::CreateProcessFlag_AddressSpace64Bit: + case svc::CreateProcessParameterFlag_AddressSpace64Bit39: aslr_start = svc::AddressMap39Start; aslr_size = svc::AddressMap39Size; break; + case svc::CreateProcessParameterFlag_AddressSpace64Bit42: + aslr_start = svc::AddressMap42Start; + aslr_size = svc::AddressMap42Size; + break; AMS_UNREACHABLE_DEFAULT_CASE(); } } else { /* On 1.0.0, only 2 address space types existed. */ - if (out_param->flags & svc::CreateProcessFlag_AddressSpace64BitDeprecated) { + if (out_param->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit36) { aslr_start = svc::AddressSmallMap36Start; aslr_size = svc::AddressSmallMap36Size; } else { @@ -629,7 +641,7 @@ namespace ams::ldr { /* Set Create Process output. */ uintptr_t aslr_slide = 0; size_t free_size = (aslr_size - total_size); - if (out_param->flags & svc::CreateProcessFlag_EnableAslr) { + if (out_param->flags & svc::CreateProcessParameterFlag_EnableAslr) { aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; } @@ -651,10 +663,13 @@ namespace ams::ldr { R_SUCCEED(); } - Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zstd, uintptr_t map_base, uintptr_t map_end) { + Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zbic, uintptr_t map_base, uintptr_t map_end) { /* Select read size based on compression. */ size_t file_size = is_compressed ? compressed_size : segment_size; + AMS_LOG("[ldr] Loading segment @ 0x%016lx: compressed=%d, file_size=0x%08lx, compressed_size=0x%08lx, segment_size=0x%08lx\n", + map_base, is_compressed, file_size, compressed_size, segment_size); + /* Validate size. */ R_UNLESS(file_size <= segment_size, ldr::ResultInvalidNso()); R_UNLESS(file_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); @@ -664,19 +679,19 @@ namespace ams::ldr { uintptr_t load_address = is_compressed ? map_end - compressed_size : map_base; size_t read_size; R_TRY(fs::ReadFile(std::addressof(read_size), file, file_offset, reinterpret_cast(load_address), file_size)); - R_UNLESS(read_size == file_size, ldr::ResultInvalidNso()); + R_UNLESS_LOG(read_size == file_size, ldr::ResultInvalidNso(), "[ldr] Couldn't read segment from file!\n"); /* Uncompress if necessary. */ R_SUCCEED_IF(!is_compressed); auto compressed_data_buf = reinterpret_cast(load_address); - if (is_zstd) { - bool decompressed = util::DecompressZstdForLoader(reinterpret_cast(g_zstd_dctx_workspace), ZstdDctxWorkspaceSize, reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); - R_UNLESS(decompressed, ldr::ResultInvalidNso()); + if (is_zbic) { + bool decompressed = util::DecompressZstdWithBic(reinterpret_cast(g_zstd_dctx_workspace), sizeof(g_zstd_dctx_workspace), reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); + R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with zbic!\n"); } else { bool decompressed = (util::DecompressLZ4(reinterpret_cast(map_base), segment_size, compressed_data_buf, file_size) == static_cast(segment_size)); - R_UNLESS(decompressed, ldr::ResultInvalidNso()); + R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with lz4!\n"); } R_SUCCEED(); @@ -691,12 +706,12 @@ namespace ams::ldr { crypto::GenerateSha256(hash, sizeof(hash), reinterpret_cast(map_address + nso_header->segments[segment].dst_offset), nso_header->segments[segment].size); - R_UNLESS(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso()); + R_UNLESS_LOG(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso(), "[ldr] Invalid segment hash!\n"); R_SUCCEED(); } Result LoadAutoLoadModule(os::NativeHandle process_handle, fs::FileHandle file, const NsoHeader *nso_header, uintptr_t nso_address, size_t nso_size, size_t map_size) { - const bool is_zstd = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; + const bool is_zbic = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; const size_t module_size = static_cast(nso_header->rw_dst_offset) + util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize); const size_t arena_size = (nso_size > module_size) ? (nso_size - module_size) : 0; @@ -713,11 +728,11 @@ namespace ams::ldr { /* Load NSO segments. */ R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Text].file_offset, nso_header->text_compressed_size, nso_header->text_size, - (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zstd, map_address + nso_header->text_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zbic, map_address + nso_header->text_dst_offset, map_end)); R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Ro].file_offset, nso_header->ro_compressed_size, nso_header->ro_size, - (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zstd, map_address + nso_header->ro_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zbic, map_address + nso_header->ro_dst_offset, map_end)); R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Rw].file_offset, nso_header->rw_compressed_size, nso_header->rw_size, - (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zstd, map_address + nso_header->rw_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zbic, map_address + nso_header->rw_dst_offset, map_end)); /* Clear unused space to zero. */ const size_t text_end = static_cast(nso_header->text_dst_offset) + static_cast(nso_header->text_size); @@ -754,11 +769,6 @@ namespace ams::ldr { if (g_is_ptm) { hoc::ptm::Patch(map_address, nso_size); } - - // TODO: figure out the cause of crashes with nvsrv patches - if (g_is_nvsrv) { - // hoc::nvsrv::Patch(map_address, nso_size, nso_address); - } } /* Set permissions. */ @@ -785,15 +795,17 @@ namespace ams::ldr { for (int i = 0; i < ctx.nso_count; i++) { const NsoIndex nso_idx = static_cast(ctx.ali.nso_indices[i]); + const bool is_zbic = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; + const size_t map_size = is_zbic ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; + + AMS_LOG("[ldr] module[%d]: idx=%d, path='%s', zbic=%d\n", i, (int)nso_idx, GetNsoPath(nso_idx), is_zbic); fs::FileHandle file; R_TRY(fs::OpenFile(std::addressof(file), GetNsoPath(nso_idx), fs::OpenMode_Read)); ON_SCOPE_EXIT { fs::CloseFile(file); }; - const bool is_zstd = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; - const size_t map_size = is_zstd ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; - - R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, process_info->nso_address[i], process_info->nso_size[i], map_size)); + R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, + process_info->nso_address[i], process_info->nso_size[i], map_size)); } /* Load arguments, if present. */ @@ -834,7 +846,7 @@ namespace ams::ldr { /* Set the output handle, and ensure that if we fail after this point we clean it up. */ out->process_handle = process_handle; out->code_address = param.code_address; - ON_RESULT_FAILURE { svc::CloseHandle(process_handle); }; + ON_RESULT_FAILURE { R_DISCARD(svc::CloseHandle(process_handle)); }; /* Load all auto load modules. */ R_RETURN(LoadAutoLoadModules(out, ctx, argument)); @@ -892,8 +904,8 @@ namespace ams::ldr { os::ProcessId process_id = os::GetProcessId(info.process_handle); /* Register new process. */ - const auto as_type = GetAddressSpaceType(std::addressof(meta)); - RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::AddressSpaceType_64Bit || as_type == Npdm::AddressSpaceType_64BitDeprecated); + const auto as_type = GetProcessAddressSpace(std::addressof(meta)); + RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::ProcessAddressSpace_64Bit39 || as_type == Npdm::ProcessAddressSpace_64Bit36); /* Register all NSOs. */ for (int i = 0; i < ctx.nso_count; i++) { @@ -904,7 +916,7 @@ namespace ams::ldr { /* If we're overriding for HBL, perform HTML document redirection. */ if (override_status.IsHbl()) { /* Don't validate result, failure is okay. */ - RedirectHtmlDocumentPathForHbl(loc); + R_DISCARD(RedirectHtmlDocumentPathForHbl(loc)); } /* Clear the external code for the program. */ diff --git a/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp b/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp new file mode 100644 index 00000000..a4d90b00 --- /dev/null +++ b/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp @@ -0,0 +1,960 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include +#include "ldr_capabilities.hpp" +#include "ldr_content_management.hpp" +#include "ldr_development_manager.hpp" +#include "ldr_launch_record.hpp" +#include "ldr_meta.hpp" +#include "ldr_patcher.hpp" +#include "ldr_process_creation.hpp" +#include "ldr_ro_manager.hpp" +#include "oc/oc_loader.hpp" + +namespace ams::ldr { + + namespace { + + /* Convenience defines. */ + constexpr size_t SystemResourceSizeMax = 0x1FE00000; + constexpr size_t AutoLoadModuleSizeMax = 0x800000000; + + /* Types. */ + enum NsoIndex { + Nso_Rtld = 0, + Nso_Main = 1, + Nso_Wkc0 = 2, + Nso_Wkc1 = 3, + Nso_Wkc2 = 4, + Nso_Wkc3 = 5, + Nso_Wkc4 = 6, + Nso_Wkc5 = 7, + Nso_Wkc6 = 8, + Nso_Wkc7 = 9, + Nso_Wkc8 = 10, + Nso_Wkc9 = 11, + Nso_SubSdk0 = 12, + Nso_SubSdk1 = 13, + Nso_SubSdk2 = 14, + Nso_SubSdk3 = 15, + Nso_SubSdk4 = 16, + Nso_SubSdk5 = 17, + Nso_SubSdk6 = 18, + Nso_SubSdk7 = 19, + Nso_SubSdk8 = 20, + Nso_SubSdk9 = 21, + Nso_Sdk = 22, + Nso_Count, + }; + + constexpr inline const char *NsoPaths[Nso_Count] = { + ENCODE_ATMOSPHERE_CODE_PATH("/rtld"), + ENCODE_ATMOSPHERE_CODE_PATH("/main"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc0"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc1"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc2"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc3"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc4"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc5"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc6"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc7"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc8"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc9"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk0"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk1"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk2"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk3"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk4"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk5"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk6"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk7"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk8"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk9"), + ENCODE_ATMOSPHERE_CODE_PATH("/sdk"), + }; + + constexpr const char *GetNsoPath(size_t idx) { + AMS_ABORT_UNLESS(idx < Nso_Count); + return NsoPaths[idx]; + } + + struct ProcessInfo { + os::NativeHandle process_handle; + uintptr_t code_address; + size_t total_size; + uintptr_t args_address; + size_t args_size; + uintptr_t nso_address[Nso_Count]; + size_t nso_size[Nso_Count]; + }; + + struct AutoLoadModuleInfo { + bool has_rtld; + bool has_main; + bool has_sdk; + bool has_subsdk; + s8 nso_indices[Nso_Count]; + }; + + struct AutoLoadModuleContext { + NsoHeader *headers; + int nso_count; + int rtld_idx; + int main_nso_idx; + int sdk_nso_idx; + AutoLoadModuleInfo ali; + }; + + /* Global NSO header cache. */ + NsoHeader g_nso_headers[Nso_Count]; + + /* Pcv/Ptm/NvServices check cache */ + bool g_is_pcv; + bool g_is_ptm; + bool g_is_nvsrv; + + /* Global Zstd decompression context. */ + constexpr size_t ZstdDctxWorkspaceSize = 0x176E8; + alignas(8) u8 g_zstd_dctx_workspace[ZstdDctxWorkspaceSize]; + + Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) { + /* No version verification is done before 8.1.0. */ + R_SUCCEED_IF(hos::GetVersion() < hos::Version_8_1_0); + + /* No verification is done if development. */ + R_SUCCEED_IF(IsDevelopmentForAntiDowngradeCheck()); + + /* TODO: Anti-downgrade checking does not make very much sense for us. Should we do anything? */ + AMS_UNUSED(program_id, version); + + R_SUCCEED(); + } + + /* Helpers. */ + Result GetProgramInfoFromMeta(ProgramInfo *out, const Meta *meta) { + /* Copy basic info. */ + out->main_thread_priority = meta->npdm->main_thread_priority; + out->default_cpu_id = meta->npdm->default_cpu_id; + out->main_thread_stack_size = meta->npdm->main_thread_stack_size; + out->program_id = meta->aci->program_id; + + /* Copy access controls. */ + size_t offset = 0; +#define COPY_ACCESS_CONTROL(source, which) \ + ({ \ + const size_t size = meta->source->which##_size; \ + R_UNLESS(offset + size <= sizeof(out->ac_buffer), ldr::ResultInternalError()); \ + out->source##_##which##_size = size; \ + std::memcpy(out->ac_buffer + offset, meta->source##_##which, size); \ + offset += size; \ + }) + + /* Copy all access controls to buffer. */ + COPY_ACCESS_CONTROL(acid, sac); + COPY_ACCESS_CONTROL(aci, sac); + COPY_ACCESS_CONTROL(acid, fac); + COPY_ACCESS_CONTROL(aci, fah); +#undef COPY_ACCESS_CONTROL + + /* Copy flags. */ + out->flags = MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)); + R_SUCCEED(); + } + + bool IsApplet(const Meta *meta) { + return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Applet; + } + + bool IsApplication(const Meta *meta) { + return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; + } + + Npdm::AddressSpaceType GetAddressSpaceType(const Meta *meta) { + return static_cast((meta->npdm->flags & Npdm::MetaFlag_AddressSpaceTypeMask) >> Npdm::MetaFlag_AddressSpaceTypeShift); + } + + Acid::PoolPartition GetPoolPartition(const Meta *meta) { + return static_cast((meta->acid->flags & Acid::AcidFlag_PoolPartitionMask) >> Acid::AcidFlag_PoolPartitionShift); + } + + Result LoadAutoLoadHeaders(AutoLoadModuleContext &ctx, u32 acid_flags) { + /* Clear NSOs. */ + std::memset(g_nso_headers, 0, sizeof(g_nso_headers)); + ctx.headers = g_nso_headers; + ctx.nso_count = 0; + ctx.rtld_idx = -1; + ctx.main_nso_idx = -1; + ctx.sdk_nso_idx = -1; + ctx.ali = {}; + + for (size_t i = 0; i < Nso_Count; i++) { + /* Only load browser DLLs if acid flags say to do so. */ + switch (i) { + case Nso_Wkc0: + case Nso_Wkc1: + case Nso_Wkc2: + case Nso_Wkc3: + case Nso_Wkc4: + case Nso_Wkc5: + case Nso_Wkc6: + case Nso_Wkc7: + case Nso_Wkc8: + case Nso_Wkc9: + if ((acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) == 0) { + continue; + } + break; + } + + fs::FileHandle file; + if (R_SUCCEEDED(fs::OpenFile(std::addressof(file), GetNsoPath(i), fs::OpenMode_Read))) { + ON_SCOPE_EXIT { fs::CloseFile(file); }; + + /* Read NSO header. */ + size_t read_size; + R_TRY(fs::ReadFile(std::addressof(read_size), file, 0, g_nso_headers + ctx.nso_count, sizeof(NsoHeader))); + R_UNLESS(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso()); + + /* Note nso is present. */ + switch (i) { + case Nso_Rtld: + ctx.rtld_idx = ctx.nso_count; + ctx.ali.has_rtld = true; + break; + case Nso_Main: + ctx.main_nso_idx = ctx.nso_count; + ctx.ali.has_main = true; + break; + case Nso_SubSdk0: + case Nso_SubSdk1: + case Nso_SubSdk2: + case Nso_SubSdk3: + case Nso_SubSdk4: + case Nso_SubSdk5: + case Nso_SubSdk6: + case Nso_SubSdk7: + case Nso_SubSdk8: + case Nso_SubSdk9: + ctx.ali.has_subsdk = true; + break; + case Nso_Sdk: + ctx.sdk_nso_idx = ctx.nso_count; + ctx.ali.has_sdk = true; + break; + } + ctx.ali.nso_indices[ctx.nso_count] = static_cast(i); + ctx.nso_count++; + } + } + + R_SUCCEED(); + } + + Result CheckAutoLoad(const AutoLoadModuleContext &ctx, u32 acid_flags) { + /* We must always have a main. */ + R_UNLESS(ctx.ali.has_main, ldr::ResultInvalidNso()); + + /* Validate flags and extents for all present NSOs. */ + for (int i = 0; i < ctx.nso_count; ++i) { + const auto &hdr = ctx.headers[i]; + + /* All NSOs must not be --X. */ + /* This is "probably" not checked on Ounce? */ + R_UNLESS((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso()); + + /* Zstd compression only allowed on main, and only when both rtld+sdk are present. */ + if (i != ctx.main_nso_idx || ctx.rtld_idx < 0 || ctx.sdk_nso_idx < 0) { + R_UNLESS((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso()); + } + + /* NSOs must have page-aligned segments. */ + R_UNLESS(util::IsAligned(hdr.text_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); + R_UNLESS(util::IsAligned(hdr.ro_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); + R_UNLESS(util::IsAligned(hdr.rw_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); + + /* NSOs must have zero text offset. */ + R_UNLESS(hdr.text_dst_offset == 0, ldr::ResultInvalidNso()); + + /* NSO .text must precede .rodata. */ + const size_t text_end = static_cast(hdr.text_dst_offset) + static_cast(hdr.text_size); + R_UNLESS(text_end <= static_cast(hdr.ro_dst_offset), ldr::ResultInvalidNso()); + + /* NSO .rodata must precede .rwdata. */ + const size_t ro_end = static_cast(hdr.ro_dst_offset) + static_cast(hdr.ro_size); + R_UNLESS(ro_end <= static_cast(hdr.rw_dst_offset), ldr::ResultInvalidNso()); + } + + const bool has_browser_dll = (acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) != 0; + if (ctx.ali.has_rtld || ctx.ali.has_sdk) { + /* If we have sdk we must have rtld. */ + R_UNLESS(ctx.ali.has_rtld, ldr::ResultInvalidNso()); + + /* If we have rtld, we must not have browser core dll. */ + R_UNLESS(!has_browser_dll, ldr::ResultInvalidNso()); + } else { + /* We must not have both subsdk and browser dll. */ + R_UNLESS(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso()); + } + + R_SUCCEED(); + } + + constexpr const ncm::ProgramId UnqualifiedApprovalProgramIds[] = { + { 0x010003F003A34000 }, /* Pokemon: Let's Go, Pikachu! */ + { 0x0100152000022000 }, /* Mario Kart 8 Deluxe */ + { 0x0100165003504000 }, /* Nintendo Labo Toy-Con 04: VR Kit */ + { 0x0100187003A36000 }, /* Pokemon: Let's Go, Eevee! */ + { 0x01002E5008C56000 }, /* Pokemon Sword [Live Tournament] */ + { 0x01002FF008C24000 }, /* Ring Fit Adventure */ + { 0x010049900F546001 }, /* Super Mario 3D All-Stars: Super Mario 64 */ + { 0x010057D00ECE4000 }, /* Nintendo Switch Online (Nintendo 64) [for Japan] */ + { 0x01006F8002326000 }, /* Animal Crossing: New Horizons */ + { 0x01006FB00F50E000 }, /* 宝可梦 走吧!伊布 [Pokemon: Let's Go, Eevee! for China] */ + { 0x010070300F50C000 }, /* 宝可梦 走吧!皮卡丘 [Pokemon: Let's Go, Pikachu! for China] */ + { 0x010075100E8EC000 }, /* 马力欧卡丁车8 豪华版 [Mario Kart 8 Deluxe for China] */ + { 0x01008DB008C2C000 }, /* Pokemon Shield */ + { 0x01009AD008C4C000 }, /* Pokemon: Let's Go, Pikachu! [Kiosk] */ + { 0x0100A66003384000 }, /* Hulu */ + { 0x0100ABF008968000 }, /* Pokemon Sword */ + { 0x0100C9A00ECE6000 }, /* Nintendo Switch Online (Nintendo 64) [for America] */ + { 0x0100ED100BA3A000 }, /* Mario Kart Live: Home Circuit */ + { 0x0100F38011CFE000 }, /* Animal Crossing: New Horizons Island Transfer Tool */ + { 0x0100F6B011028000 }, /* 健身环大冒险 [Ring Fit Adventure for China] */ + }; + + /* Check that the unqualified approval programs are sorted. */ + static_assert([]() -> bool { + for (size_t i = 0; i < util::size(UnqualifiedApprovalProgramIds) - 1; ++i) { + if (UnqualifiedApprovalProgramIds[i].value >= UnqualifiedApprovalProgramIds[i + 1].value) { + return false; + } + } + + return true; + }()); + + bool IsUnqualifiedApprovalProgramId(ncm::ProgramId program_id) { + /* Check if the program id is one with unqualified approval. */ + return std::binary_search(std::begin(UnqualifiedApprovalProgramIds), std::end(UnqualifiedApprovalProgramIds), program_id); + } + + bool IsUnqualifiedApproval(const Meta *meta) { + /* If the meta has unqualified approval flag, it's unqualified approval. */ + if (meta->acid->flags & ldr::Acid::AcidFlag_UnqualifiedApproval) { + return true; + } + + /* If the unqualified approval flag is not set, the program must be an application. */ + if (!IsApplication(meta)) { + return false; + } + + /* The program id must be a force unqualified approval program id. */ + return IsUnqualifiedApprovalProgramId(meta->acid->program_id_min) && meta->acid->program_id_min == meta->acid->program_id_max; + } + + Result ValidateMeta(const Meta *meta, const ncm::ProgramLocation &loc, const fs::CodeVerificationData &code_verification_data) { + /* Validate version. */ + R_TRY(ValidateProgramVersion(loc.program_id, meta->npdm->version)); + + /* Validate program id. */ + R_UNLESS(meta->aci->program_id >= meta->acid->program_id_min, ldr::ResultInvalidProgramId()); + R_UNLESS(meta->aci->program_id <= meta->acid->program_id_max, ldr::ResultInvalidProgramId()); + + /* Validate the kernel capabilities. */ + R_TRY(TestCapability(static_cast(meta->acid_kac), meta->acid->kac_size / sizeof(util::BitPack32), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32))); + + /* Check if NCA is PCV or PTM */ + g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; + g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; + g_is_nvsrv = meta->aci->program_id == ncm::SystemProgramId::NvServices; + + /* If we have data to validate, validate it. */ + if (meta->check_verification_data) { + const u8 *sig = code_verification_data.signature; + const size_t sig_size = sizeof(code_verification_data.signature); + const u8 *mod = static_cast(meta->modulus); + const size_t mod_size = crypto::Rsa2048PssSha256Verifier::ModulusSize; + const u8 *exp = fssystem::GetAcidSignatureKeyPublicExponent(); + const size_t exp_size = fssystem::AcidSignatureKeyPublicExponentSize; + const u8 *hsh = code_verification_data.target_hash; + const size_t hsh_size = sizeof(code_verification_data.target_hash); + const bool is_signature_valid = crypto::VerifyRsa2048PssSha256WithHash(sig, sig_size, mod, mod_size, exp, exp_size, hsh, hsh_size); + + /* If the signature check fails, we need to check if this is allowable. */ + if (!is_signature_valid) { + /* We have to enforce signature checks on prod and when we have a signature to check on dev. */ + R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature()); + R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature()); + + /* There was no signature to check on dev. Check if this is acceptable. */ + R_UNLESS(IsUnqualifiedApproval(meta), ldr::ResultInvalidNcaSignature()); + } + } + + /* All good. */ + R_SUCCEED(); + } + + Result GetCreateProcessFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { + const u8 meta_flags = meta->npdm->flags; + + u32 flags = 0; + + /* Set Is64Bit. */ + if (meta_flags & Npdm::MetaFlag_Is64Bit) { + flags |= svc::CreateProcessFlag_Is64Bit; + } + + /* Set AddressSpaceType. */ + switch (GetAddressSpaceType(meta)) { + case Npdm::AddressSpaceType_32Bit: + flags |= svc::CreateProcessFlag_AddressSpace32Bit; + break; + case Npdm::AddressSpaceType_64BitDeprecated: + flags |= svc::CreateProcessFlag_AddressSpace64BitDeprecated; + break; + case Npdm::AddressSpaceType_32BitWithoutAlias: + flags |= svc::CreateProcessFlag_AddressSpace32BitWithoutAlias; + break; + case Npdm::AddressSpaceType_64Bit: + flags |= svc::CreateProcessFlag_AddressSpace64Bit; + break; + default: + R_THROW(ldr::ResultInvalidMeta()); + } + + /* Set Enable Debug. */ + if (ldr_flags & CreateProcessFlag_EnableDebug) { + flags |= svc::CreateProcessFlag_EnableDebug; + } + + /* Set Enable ASLR. */ + if (!(ldr_flags & CreateProcessFlag_DisableAslr)) { + flags |= svc::CreateProcessFlag_EnableAslr; + } + + /* Set Is Application. */ + if (IsApplication(meta)) { + flags |= svc::CreateProcessFlag_IsApplication; + + /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ + if (hos::GetVersion() >= hos::Version_7_0_0) { + if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) { + flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation; + } + } + } + + /* 5.0.0+ Set Pool Partition. */ + if (hos::GetVersion() >= hos::Version_5_0_0) { + /* TODO: Nintendo no longer accepts Applet when pool partition == application. Would this break hbl/anything else in the hb ecosystem? */ + /* TODO: Nintendo uses a helper bool MakeSvcPoolPartitionFlag(u32 *out, Acid::PoolPartition partition); */ + switch (GetPoolPartition(meta)) { + case Acid::PoolPartition_Application: + if (IsApplet(meta)) { + flags |= svc::CreateProcessFlag_PoolPartitionApplet; + } else { + flags |= svc::CreateProcessFlag_PoolPartitionApplication; + } + break; + case Acid::PoolPartition_Applet: + flags |= svc::CreateProcessFlag_PoolPartitionApplet; + break; + case Acid::PoolPartition_System: + flags |= svc::CreateProcessFlag_PoolPartitionSystem; + break; + case Acid::PoolPartition_SystemNonSecure: + flags |= svc::CreateProcessFlag_PoolPartitionSystemNonSecure; + break; + default: + R_THROW(ldr::ResultInvalidMeta()); + } + } else if (hos::GetVersion() >= hos::Version_4_0_0) { + /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ + if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { + flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory; + } + } + + /* 11.0.0+/meso Set Disable DAS merge. */ + if (meta_flags & Npdm::MetaFlag_DisableDeviceAddressSpaceMerge) { + flags |= svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; + } + + /* 18.0.0+/meso Set Alias region extra size. */ + if (meta_flags & Npdm::MetaFlag_EnableAliasRegionExtraSize) { + flags |= svc::CreateProcessFlag_EnableAliasRegionExtraSize; + } + + *out = flags; + R_SUCCEED(); + } + + Result GetCreateProcessParameter(svc::CreateProcessParameter *out, const Meta *meta, u32 flags, os::NativeHandle resource_limit) { + /* Clear output. */ + std::memset(out, 0, sizeof(*out)); + + /* Set name, version, program id, resource limit handle. */ + std::memcpy(out->name, meta->npdm->program_name, sizeof(out->name) - 1); + out->version = meta->npdm->version; + out->program_id = meta->aci->program_id.value; + out->reslimit = resource_limit; + + /* Set flags. */ + R_TRY(GetCreateProcessFlags(std::addressof(out->flags), meta, flags)); + + /* 3.0.0+ System Resource Size. */ + if (hos::GetVersion() >= hos::Version_3_0_0) { + /* Validate size is aligned. */ + R_UNLESS(util::IsAligned(meta->npdm->system_resource_size, os::MemoryBlockUnitSize), ldr::ResultInvalidSize()); + + /* Validate system resource usage. */ + if (meta->npdm->system_resource_size) { + /* Process must be 64-bit. */ + R_UNLESS((out->flags & svc::CreateProcessFlag_AddressSpace64Bit), ldr::ResultInvalidMeta()); + + /* Process must be application or applet. */ + R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); + + /* Size must be less than or equal to max. */ + R_UNLESS(meta->npdm->system_resource_size <= SystemResourceSizeMax, ldr::ResultInvalidMeta()); + } + out->system_resource_num_pages = meta->npdm->system_resource_size >> 12; + } + + R_SUCCEED(); + } + + u64 GenerateSecureRandom(u64 max) { + /* Generate a cryptographically random number. */ + u64 rand; + crypto::GenerateCryptographicallyRandomBytes(std::addressof(rand), sizeof(rand)); + + /* Coerce into range. */ + return rand % (max + 1); + } + + Result DecideAddressSpaceLayout(ProcessInfo *out, svc::CreateProcessParameter *out_param, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument) { + /* Clear output. */ + out->args_address = 0; + out->args_size = 0; + std::memset(out->nso_address, 0, sizeof(out->nso_address)); + std::memset(out->nso_size, 0, sizeof(out->nso_size)); + + size_t total_size = 0; + bool argument_allocated = false; + + /* Calculate base offsets. */ + for (int i = 0; i < ctx.nso_count; i++) { + out->nso_address[i] = total_size; + const size_t text_end = static_cast(ctx.headers[i].text_dst_offset) + static_cast(ctx.headers[i].text_size); + const size_t ro_end = static_cast(ctx.headers[i].ro_dst_offset) + static_cast(ctx.headers[i].ro_size); + const size_t rw_end = static_cast(ctx.headers[i].rw_dst_offset) + static_cast(ctx.headers[i].rw_size); + out->nso_size[i] = text_end; + out->nso_size[i] = std::max(out->nso_size[i], ro_end); + out->nso_size[i] = std::max(out->nso_size[i], rw_end); + out->nso_size[i] += static_cast(ctx.headers[i].bss_size); + + /* Reserve hook arena memory past pcv's bss. */ + if (g_is_pcv && i == ctx.main_nso_idx) { + out->nso_size[i] = util::AlignUp(out->nso_size[i], os::MemoryPageSize) + hoc::pcv::PcvDataArenaSize; + } + + const size_t aligned_up_size = util::AlignUp(out->nso_size[i], os::MemoryPageSize) & (AutoLoadModuleSizeMax - 1); + R_UNLESS(out->nso_size[i] <= aligned_up_size, ldr::ResultInvalidNso()); + R_UNLESS(aligned_up_size > 0, ldr::ResultInvalidNso()); + + out->nso_size[i] = aligned_up_size; + + R_UNLESS(util::CanAddWithoutOverflow(total_size, out->nso_size[i]), ldr::ResultInvalidNso()); + total_size += out->nso_size[i]; + + if (!argument_allocated && argument != nullptr) { + out->args_address = total_size; + out->args_size = util::AlignUp(2 * sizeof(u32) + argument->argument_size * 2 + ArgumentStore::ArgumentBufferSize, os::MemoryPageSize); + + R_UNLESS(util::CanAddWithoutOverflow(total_size, out->args_size), ldr::ResultInvalidNso()); + total_size += out->args_size; + + argument_allocated = true; + } + } + + /* Calculate ASLR. */ + uintptr_t aslr_start = 0; + size_t aslr_size = 0; + if (hos::GetVersion() >= hos::Version_2_0_0) { + switch (out_param->flags & svc::CreateProcessFlag_AddressSpaceMask) { + case svc::CreateProcessFlag_AddressSpace32Bit: + case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: + aslr_start = svc::AddressSmallMap32Start; + aslr_size = svc::AddressSmallMap32Size; + break; + case svc::CreateProcessFlag_AddressSpace64BitDeprecated: + aslr_start = svc::AddressSmallMap36Start; + aslr_size = svc::AddressSmallMap36Size; + break; + case svc::CreateProcessFlag_AddressSpace64Bit: + aslr_start = svc::AddressMap39Start; + aslr_size = svc::AddressMap39Size; + break; + AMS_UNREACHABLE_DEFAULT_CASE(); + } + } else { + /* On 1.0.0, only 2 address space types existed. */ + if (out_param->flags & svc::CreateProcessFlag_AddressSpace64BitDeprecated) { + aslr_start = svc::AddressSmallMap36Start; + aslr_size = svc::AddressSmallMap36Size; + } else { + aslr_start = svc::AddressSmallMap32Start; + aslr_size = svc::AddressSmallMap32Size; + } + } + R_UNLESS(total_size <= aslr_size, svc::ResultOutOfMemory()); + + /* Set Create Process output. */ + uintptr_t aslr_slide = 0; + size_t free_size = (aslr_size - total_size); + if (out_param->flags & svc::CreateProcessFlag_EnableAslr) { + aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; + } + + /* Set out. */ + aslr_start += aslr_slide; + for (int i = 0; i < ctx.nso_count; i++) { + R_UNLESS(util::CanAddWithoutOverflow(out->nso_address[i], aslr_start), ldr::ResultInvalidNso()); + out->nso_address[i] += aslr_start; + } + if (out->args_address) { + R_UNLESS(util::CanAddWithoutOverflow(out->args_address, aslr_start), ldr::ResultInvalidNso()); + out->args_address += aslr_start; + } + + out_param->code_address = aslr_start; + out_param->code_num_pages = total_size >> 12; + out->total_size = total_size; + + R_SUCCEED(); + } + + Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zstd, uintptr_t map_base, uintptr_t map_end) { + /* Select read size based on compression. */ + size_t file_size = is_compressed ? compressed_size : segment_size; + + /* Validate size. */ + R_UNLESS(file_size <= segment_size, ldr::ResultInvalidNso()); + R_UNLESS(file_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); + R_UNLESS(segment_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); + + /* Load data from file. */ + uintptr_t load_address = is_compressed ? map_end - compressed_size : map_base; + size_t read_size; + R_TRY(fs::ReadFile(std::addressof(read_size), file, file_offset, reinterpret_cast(load_address), file_size)); + R_UNLESS(read_size == file_size, ldr::ResultInvalidNso()); + + /* Uncompress if necessary. */ + R_SUCCEED_IF(!is_compressed); + + auto compressed_data_buf = reinterpret_cast(load_address); + + if (is_zstd) { + bool decompressed = util::DecompressZstdForLoader(reinterpret_cast(g_zstd_dctx_workspace), ZstdDctxWorkspaceSize, reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); + R_UNLESS(decompressed, ldr::ResultInvalidNso()); + } else { + bool decompressed = (util::DecompressLZ4(reinterpret_cast(map_base), segment_size, compressed_data_buf, file_size) == static_cast(segment_size)); + R_UNLESS(decompressed, ldr::ResultInvalidNso()); + } + + R_SUCCEED(); + } + + Result CheckSegmentHash(const NsoHeader *nso_header, uintptr_t map_address, NsoHeader::Segment segment) { + if ((nso_header->flags & (NsoHeader::Flag_CheckHashText << segment)) == 0) { + R_SUCCEED(); + } + + u8 hash[crypto::Sha256Generator::HashSize]; + crypto::GenerateSha256(hash, sizeof(hash), + reinterpret_cast(map_address + nso_header->segments[segment].dst_offset), + nso_header->segments[segment].size); + R_UNLESS(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso()); + R_SUCCEED(); + } + + Result LoadAutoLoadModule(os::NativeHandle process_handle, fs::FileHandle file, const NsoHeader *nso_header, uintptr_t nso_address, size_t nso_size, size_t map_size) { + const bool is_zstd = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; + + const size_t module_size = static_cast(nso_header->rw_dst_offset) + util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize); + const size_t arena_size = (nso_size > module_size) ? (nso_size - module_size) : 0; + + /* Map and read data from file. */ + { + /* Map the process memory. */ + void *mapped_memory = nullptr; + R_TRY(os::MapProcessMemory(std::addressof(mapped_memory), process_handle, nso_address, map_size, GenerateSecureRandom)); + ON_SCOPE_EXIT { os::UnmapProcessMemory(mapped_memory, process_handle, nso_address, map_size); }; + + const uintptr_t map_address = reinterpret_cast(mapped_memory); + const uintptr_t map_end = map_address + map_size; + + /* Load NSO segments. */ + R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Text].file_offset, nso_header->text_compressed_size, nso_header->text_size, + (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zstd, map_address + nso_header->text_dst_offset, map_end)); + R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Ro].file_offset, nso_header->ro_compressed_size, nso_header->ro_size, + (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zstd, map_address + nso_header->ro_dst_offset, map_end)); + R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Rw].file_offset, nso_header->rw_compressed_size, nso_header->rw_size, + (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zstd, map_address + nso_header->rw_dst_offset, map_end)); + + /* Clear unused space to zero. */ + const size_t text_end = static_cast(nso_header->text_dst_offset) + static_cast(nso_header->text_size); + const size_t ro_end = static_cast(nso_header->ro_dst_offset) + static_cast(nso_header->ro_size); + const size_t rw_end = static_cast(nso_header->rw_dst_offset) + static_cast(nso_header->rw_size); + std::memset(reinterpret_cast(map_address + text_end), 0, nso_header->ro_dst_offset - text_end); + std::memset(reinterpret_cast(map_address + ro_end), 0, nso_header->rw_dst_offset - ro_end); + std::memset(reinterpret_cast(map_address + rw_end), 0, nso_size - rw_end); + + /* Check segment hashes. */ + R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Text)); + R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Ro)); + R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Rw)); + + /* Apply embedded patches. */ + ApplyEmbeddedPatchesToModule(nso_header->module_id, map_address, nso_size); + + /* Apply IPS patches. */ + LocateAndApplyIpsPatchesToModule(nso_header->module_id, map_address, nso_size); + + /* Apply PCV and PTM patches */ + if (g_is_pcv) { + const size_t text_end = static_cast(nso_header->text_size); + const size_t rx_end = util::AlignUp(text_end, os::MemoryPageSize); + const size_t ro_start = static_cast(nso_header->ro_dst_offset); + const size_t cave_end = (rx_end < ro_start) ? rx_end : ro_start; + const uintptr_t cave = map_address + text_end; + const size_t cave_size = (cave_end > text_end) ? (cave_end - text_end) : 0; + + /* module_size is used rather than nso_size to exclude the extra data section. */ + hoc::pcv::Patch(map_address, module_size, cave, cave_size, nso_address, arena_size ? (map_address + module_size) : 0); + } + + if (g_is_ptm) { + hoc::ptm::Patch(map_address, nso_size); + } + + // TODO: figure out the cause of crashes with nvsrv patches + if (g_is_nvsrv) { + // hoc::nvsrv::Patch(map_address, nso_size, nso_address); + } + } + + /* Set permissions. */ + const size_t text_size = util::AlignUp(nso_header->text_size, os::MemoryPageSize); + const size_t ro_size = util::AlignUp(nso_header->ro_size, os::MemoryPageSize); + const size_t rw_size = util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize) + arena_size; + if (text_size) { + const bool prevent_code_reads = (nso_header->flags & NsoHeader::Flag_PreventCodeReads); + R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->text_dst_offset, text_size, prevent_code_reads ? os::MemoryPermission_ExecuteOnly : os::MemoryPermission_ReadExecute)); + } + if (ro_size) { + R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->ro_dst_offset, ro_size, os::MemoryPermission_ReadOnly)); + } + if (rw_size) { + R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->rw_dst_offset, rw_size, os::MemoryPermission_ReadWrite)); + } + + R_SUCCEED(); + } + + Result LoadAutoLoadModules(const ProcessInfo *process_info, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument) { + /* Load each NSO. */ + const uintptr_t total_end = process_info->code_address + process_info->total_size; + + for (int i = 0; i < ctx.nso_count; i++) { + const NsoIndex nso_idx = static_cast(ctx.ali.nso_indices[i]); + + fs::FileHandle file; + R_TRY(fs::OpenFile(std::addressof(file), GetNsoPath(nso_idx), fs::OpenMode_Read)); + ON_SCOPE_EXIT { fs::CloseFile(file); }; + + const bool is_zstd = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; + const size_t map_size = is_zstd ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; + + R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, process_info->nso_address[i], process_info->nso_size[i], map_size)); + } + + /* Load arguments, if present. */ + if (argument != nullptr) { + /* Write argument data into memory. */ + { + void *map_address = nullptr; + R_TRY(os::MapProcessMemory(std::addressof(map_address), process_info->process_handle, process_info->args_address, process_info->args_size, GenerateSecureRandom)); + ON_SCOPE_EXIT { os::UnmapProcessMemory(map_address, process_info->process_handle, process_info->args_address, process_info->args_size); }; + + ProgramArguments *args = static_cast(map_address); + std::memset(args, 0, sizeof(*args)); + args->allocated_size = process_info->args_size; + args->arguments_size = argument->argument_size; + std::memcpy(args->arguments, argument->argument, argument->argument_size); + } + + /* Set argument region permissions. */ + /* NOTE: Nintendo uses svc::SetProcessMemoryPermission directly here. */ + R_TRY(os::SetProcessMemoryPermission(process_info->process_handle, process_info->args_address, process_info->args_size, os::MemoryPermission_ReadWrite)); + } + + R_SUCCEED(); + } + + Result CreateProcessAndLoadAutoLoadModules(ProcessInfo *out, const Meta *meta, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit) { + /* Get CreateProcessParameter. */ + svc::CreateProcessParameter param; + R_TRY(GetCreateProcessParameter(std::addressof(param), meta, flags, resource_limit)); + + /* Decide on an NSO layout. */ + R_TRY(DecideAddressSpaceLayout(out, std::addressof(param), ctx, argument)); + + /* Actually create process. */ + svc::Handle process_handle; + R_TRY(svc::CreateProcess(std::addressof(process_handle), std::addressof(param), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(u32))); + + /* Set the output handle, and ensure that if we fail after this point we clean it up. */ + out->process_handle = process_handle; + out->code_address = param.code_address; + ON_RESULT_FAILURE { svc::CloseHandle(process_handle); }; + + /* Load all auto load modules. */ + R_RETURN(LoadAutoLoadModules(out, ctx, argument)); + } + + } + + /* Process Creation API. */ + Result CreateProcess(os::NativeHandle *out, PinId pin_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status, const char *path, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit, const ldr::ProgramAttributes &attrs) { + /* Mount code. */ + AMS_UNUSED(path); + ScopedCodeMountForCode mount(loc, override_status, attrs); + R_TRY(mount.GetResult()); + + /* Load meta, possibly from cache. */ + Meta meta; + R_TRY(LoadMetaFromCache(std::addressof(meta), loc, override_status, attrs.platform)); + + /* Validate meta. */ + R_TRY(ValidateMeta(std::addressof(meta), loc, mount.GetCodeVerificationData())); + + /* If we should, load/validate the browser core dll. */ + util::optional bdll_mount; + if ((meta.acid->flags & Acid::AcidFlag_LoadBrowserCoreDll)) { + /* NOTE: I'm unsure whether we should be getting a fresh override status (allowing for different override between main and bdll?) */ + /* or whether we should be using the main override status. Going to go with main, for sanity's sake. */ + /* Also noting that Nintendo always passes ProgramAttributes=0 here, but this "should" be different on Ounce? */ + /* Kind of unclear how to handle this without knowing what exactly is being ifdef'd. */ + const ncm::ProgramLocation bdll_loc = ncm::ProgramLocation::Make(ncm::SystemProgramId::BrowserCoreDll, ncm::StorageId::BuiltInSystem); + const cfg::OverrideStatus bdll_override_status = override_status; + const ldr::ProgramAttributes bdll_attrs = attrs; + bdll_mount.emplace(bdll_loc, bdll_override_status, bdll_attrs); + R_TRY(bdll_mount->GetResult()); + + /* Load browser dll meta, possibly from cache. */ + Meta bdll_meta; + R_TRY(LoadMetaFromCacheForBrowserCoreDll(std::addressof(bdll_meta), bdll_loc, bdll_override_status, bdll_attrs.platform)); + + /* Validate browser dll meta. */ + R_TRY(ValidateMeta(std::addressof(bdll_meta), loc, mount.GetCodeVerificationData())); + } + + /* Load, validate NSO headers. */ + AutoLoadModuleContext ctx; + R_TRY(LoadAutoLoadHeaders(ctx, meta.acid->flags)); + R_TRY(CheckAutoLoad(ctx, meta.acid->flags)); + + /* Actually create the process and load NSOs into process memory. */ + ProcessInfo info; + R_TRY(CreateProcessAndLoadAutoLoadModules(std::addressof(info), std::addressof(meta), ctx, argument, flags, resource_limit)); + + /* Register NSOs with the RoManager. */ + { + /* Nintendo doesn't validate this get, but we do. */ + os::ProcessId process_id = os::GetProcessId(info.process_handle); + + /* Register new process. */ + const auto as_type = GetAddressSpaceType(std::addressof(meta)); + RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::AddressSpaceType_64Bit || as_type == Npdm::AddressSpaceType_64BitDeprecated); + + /* Register all NSOs. */ + for (int i = 0; i < ctx.nso_count; i++) { + RoManager::GetInstance().AddNso(pin_id, ctx.headers[i].module_id, info.nso_address[i], info.nso_size[i]); + } + } + + /* If we're overriding for HBL, perform HTML document redirection. */ + if (override_status.IsHbl()) { + /* Don't validate result, failure is okay. */ + RedirectHtmlDocumentPathForHbl(loc); + } + + /* Clear the external code for the program. */ + fssystem::DestroyExternalCode(loc.program_id); + + /* Note that we've created the program. */ + SetLaunchedBootProgram(loc.program_id); + + /* Move the process handle to output. */ + *out = info.process_handle; + + R_SUCCEED(); + } + + Result GetProgramInfo(ProgramInfo *out, cfg::OverrideStatus *out_status, const ncm::ProgramLocation &loc, const char *path, const ldr::ProgramAttributes &attrs) { + Meta meta; + + /* Load Meta. */ + { + AMS_UNUSED(path); + + ScopedCodeMountForCode mount(loc, attrs); + R_TRY(mount.GetResult()); + R_TRY(LoadMeta(std::addressof(meta), loc, mount.GetOverrideStatus(), attrs.platform, false)); + if (out_status != nullptr) { + *out_status = mount.GetOverrideStatus(); + } + } + + return GetProgramInfoFromMeta(out, std::addressof(meta)); + } + + Result PinProgram(PinId *out_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status) { + R_UNLESS(RoManager::GetInstance().Allocate(out_id, loc, override_status), ldr::ResultMaxProcess()); + R_SUCCEED(); + } + + Result UnpinProgram(PinId id) { + R_UNLESS(RoManager::GetInstance().Free(id), ldr::ResultNotPinned()); + R_SUCCEED(); + } + + Result GetProcessModuleInfo(u32 *out_count, ldr::ModuleInfo *out, size_t max_out_count, os::ProcessId process_id) { + R_UNLESS(RoManager::GetInstance().GetProcessModuleInfo(out_count, out, max_out_count, process_id), ldr::ResultNotPinned()); + R_SUCCEED(); + } + + Result GetProgramLocationAndOverrideStatusFromPinId(ncm::ProgramLocation *out, cfg::OverrideStatus *out_status, PinId pin_id) { + R_UNLESS(RoManager::GetInstance().GetProgramLocationAndStatus(out, out_status, pin_id), ldr::ResultNotPinned()); + R_SUCCEED(); + } + +} From 16a1a5306f3985a8bef24e41fffac933bbda7b3c Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 28 Sep 2026 16:09:49 -0400 Subject: [PATCH 146/205] Revert "ldr_process_creation: update to latest" This reverts commit bc2830932acfeb4c5a09f005370aa9e344d4d668. Atmosphere 1.12 is not supported, even via custom compilation --- .../loader/source/ldr_process_creation.cpp | 170 ++-- .../ldr_process_creation_1_12_0.cpp | 960 ------------------ 2 files changed, 79 insertions(+), 1051 deletions(-) delete mode 100644 Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp diff --git a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp index e8ccf5df..a4d90b00 100644 --- a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp @@ -124,9 +124,11 @@ namespace ams::ldr { /* Pcv/Ptm/NvServices check cache */ bool g_is_pcv; bool g_is_ptm; + bool g_is_nvsrv; /* Global Zstd decompression context. */ - alignas(8) u8 g_zstd_dctx_workspace[util::DecompressZstdWithBicWorkBufferSizeDefault]; + constexpr size_t ZstdDctxWorkspaceSize = 0x176E8; + alignas(8) u8 g_zstd_dctx_workspace[ZstdDctxWorkspaceSize]; Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) { /* No version verification is done before 8.1.0. */ @@ -180,8 +182,8 @@ namespace ams::ldr { return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; } - Npdm::ProcessAddressSpace GetProcessAddressSpace(const Meta *meta) { - return static_cast((meta->npdm->flags0 & Npdm::MetaFlag0_ProcessAddressSpaceMask) >> Npdm::MetaFlag0_ProcessAddressSpaceShift); + Npdm::AddressSpaceType GetAddressSpaceType(const Meta *meta) { + return static_cast((meta->npdm->flags & Npdm::MetaFlag_AddressSpaceTypeMask) >> Npdm::MetaFlag_AddressSpaceTypeShift); } Acid::PoolPartition GetPoolPartition(const Meta *meta) { @@ -224,7 +226,7 @@ namespace ams::ldr { /* Read NSO header. */ size_t read_size; R_TRY(fs::ReadFile(std::addressof(read_size), file, 0, g_nso_headers + ctx.nso_count, sizeof(NsoHeader))); - R_UNLESS_LOG(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso(), "[ldr] NSO header truncated!\n"); + R_UNLESS(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso()); /* Note nso is present. */ switch (i) { @@ -263,7 +265,7 @@ namespace ams::ldr { Result CheckAutoLoad(const AutoLoadModuleContext &ctx, u32 acid_flags) { /* We must always have a main. */ - R_UNLESS_LOG(ctx.ali.has_main, ldr::ResultInvalidNso(), "[ldr] Missing main!\n"); + R_UNLESS(ctx.ali.has_main, ldr::ResultInvalidNso()); /* Validate flags and extents for all present NSOs. */ for (int i = 0; i < ctx.nso_count; ++i) { @@ -271,11 +273,11 @@ namespace ams::ldr { /* All NSOs must not be --X. */ /* This is "probably" not checked on Ounce? */ - R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] --x not allowed!\n", i); + R_UNLESS((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso()); /* Zstd compression only allowed on main, and only when both rtld+sdk are present. */ if (i != ctx.main_nso_idx || ctx.rtld_idx < 0 || ctx.sdk_nso_idx < 0) { - R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] zbic not allowed!\n", i); + R_UNLESS((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso()); } /* NSOs must have page-aligned segments. */ @@ -298,13 +300,13 @@ namespace ams::ldr { const bool has_browser_dll = (acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) != 0; if (ctx.ali.has_rtld || ctx.ali.has_sdk) { /* If we have sdk we must have rtld. */ - R_UNLESS_LOG(ctx.ali.has_rtld, ldr::ResultInvalidNso(), "[ldr] Missing rtld!\n"); + R_UNLESS(ctx.ali.has_rtld, ldr::ResultInvalidNso()); /* If we have rtld, we must not have browser core dll. */ - R_UNLESS_LOG(!has_browser_dll, ldr::ResultInvalidNso(), "[ldr] BrowserCoreDll must not be present!\n"); + R_UNLESS(!has_browser_dll, ldr::ResultInvalidNso()); } else { /* We must not have both subsdk and browser dll. */ - R_UNLESS_LOG(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso(), "[ldr] Can't have both subsdk and BrowserCoreDll!\n"); + R_UNLESS(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso()); } R_SUCCEED(); @@ -378,6 +380,7 @@ namespace ams::ldr { /* Check if NCA is PCV or PTM */ g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; + g_is_nvsrv = meta->aci->program_id == ncm::SystemProgramId::NvServices; /* If we have data to validate, validate it. */ if (meta->check_verification_data) { @@ -393,8 +396,6 @@ namespace ams::ldr { /* If the signature check fails, we need to check if this is allowable. */ if (!is_signature_valid) { - AMS_LOG("[ldr] invalid signature!\n"); - /* We have to enforce signature checks on prod and when we have a signature to check on dev. */ R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature()); R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature()); @@ -408,56 +409,52 @@ namespace ams::ldr { R_SUCCEED(); } - Result GetCreateProcessParameterFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { - const u8 meta_flags0 = meta->npdm->flags0; - const u8 meta_flags1 = meta->npdm->flags1; + Result GetCreateProcessFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { + const u8 meta_flags = meta->npdm->flags; u32 flags = 0; /* Set Is64Bit. */ - if (meta_flags0 & Npdm::MetaFlag0_Is64BitInstruction) { - flags |= svc::CreateProcessParameterFlag_64Bit; + if (meta_flags & Npdm::MetaFlag_Is64Bit) { + flags |= svc::CreateProcessFlag_Is64Bit; } - /* Set ProcessAddressSpace. */ - switch (GetProcessAddressSpace(meta)) { - case Npdm::ProcessAddressSpace_32Bit: - flags |= svc::CreateProcessParameterFlag_AddressSpace32Bit; + /* Set AddressSpaceType. */ + switch (GetAddressSpaceType(meta)) { + case Npdm::AddressSpaceType_32Bit: + flags |= svc::CreateProcessFlag_AddressSpace32Bit; break; - case Npdm::ProcessAddressSpace_64Bit36: - flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit36; + case Npdm::AddressSpaceType_64BitDeprecated: + flags |= svc::CreateProcessFlag_AddressSpace64BitDeprecated; break; - case Npdm::ProcessAddressSpace_32BitNoReserved: - flags |= svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved; + case Npdm::AddressSpaceType_32BitWithoutAlias: + flags |= svc::CreateProcessFlag_AddressSpace32BitWithoutAlias; break; - case Npdm::ProcessAddressSpace_64Bit39: - flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit39; - break; - case Npdm::ProcessAddressSpace_64Bit42: - flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit42; + case Npdm::AddressSpaceType_64Bit: + flags |= svc::CreateProcessFlag_AddressSpace64Bit; break; default: R_THROW(ldr::ResultInvalidMeta()); } /* Set Enable Debug. */ - if (ldr_flags & CreateProcessParameterFlag_EnableJitDebug) { - flags |= svc::CreateProcessParameterFlag_EnableJitDebug; + if (ldr_flags & CreateProcessFlag_EnableDebug) { + flags |= svc::CreateProcessFlag_EnableDebug; } /* Set Enable ASLR. */ - if (!(ldr_flags & CreateProcessParameterFlag_DisableAslr)) { - flags |= svc::CreateProcessParameterFlag_EnableAslr; + if (!(ldr_flags & CreateProcessFlag_DisableAslr)) { + flags |= svc::CreateProcessFlag_EnableAslr; } /* Set Is Application. */ if (IsApplication(meta)) { - flags |= svc::CreateProcessParameterFlag_IsApplication; + flags |= svc::CreateProcessFlag_IsApplication; /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ if (hos::GetVersion() >= hos::Version_7_0_0) { - if (meta_flags0 & Npdm::MetaFlag0_OptimizeMemoryAllocation) { - flags |= svc::CreateProcessParameterFlag_OptimizeMemoryAllocation; + if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) { + flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation; } } } @@ -469,19 +466,19 @@ namespace ams::ldr { switch (GetPoolPartition(meta)) { case Acid::PoolPartition_Application: if (IsApplet(meta)) { - flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; + flags |= svc::CreateProcessFlag_PoolPartitionApplet; } else { - flags |= svc::CreateProcessParameterFlag_PoolPartitionApplication; + flags |= svc::CreateProcessFlag_PoolPartitionApplication; } break; case Acid::PoolPartition_Applet: - flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; + flags |= svc::CreateProcessFlag_PoolPartitionApplet; break; case Acid::PoolPartition_System: - flags |= svc::CreateProcessParameterFlag_PoolPartitionSystem; + flags |= svc::CreateProcessFlag_PoolPartitionSystem; break; case Acid::PoolPartition_SystemNonSecure: - flags |= svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure; + flags |= svc::CreateProcessFlag_PoolPartitionSystemNonSecure; break; default: R_THROW(ldr::ResultInvalidMeta()); @@ -489,23 +486,18 @@ namespace ams::ldr { } else if (hos::GetVersion() >= hos::Version_4_0_0) { /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { - flags |= svc::CreateProcessParameterFlag_DeprecatedUseSecureMemory; + flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory; } } - /* 11.0.0+/meso Set Disable DAS Merge. */ - if (meta_flags0 & Npdm::MetaFlag0_DisableDeviceAddressSpaceMerge) { - flags |= svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge; + /* 11.0.0+/meso Set Disable DAS merge. */ + if (meta_flags & Npdm::MetaFlag_DisableDeviceAddressSpaceMerge) { + flags |= svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; } - /* 18.0.0+/meso Set Enable Address Sanitizer . */ - if (meta_flags0 & Npdm::MetaFlag0_EnableAddressSanitizer) { - flags |= svc::CreateProcessParameterFlag_EnableAddressSanitizer; - } - - /* 23.0.0+/meso Set Enable Shadow Stack. */ - if (meta_flags1 & Npdm::MetaFlag1_EnableShadowStack) { - flags |= svc::CreateProcessParameterFlag_EnableShadowStack; + /* 18.0.0+/meso Set Alias region extra size. */ + if (meta_flags & Npdm::MetaFlag_EnableAliasRegionExtraSize) { + flags |= svc::CreateProcessFlag_EnableAliasRegionExtraSize; } *out = flags; @@ -523,7 +515,7 @@ namespace ams::ldr { out->reslimit = resource_limit; /* Set flags. */ - R_TRY(GetCreateProcessParameterFlags(std::addressof(out->flags), meta, flags)); + R_TRY(GetCreateProcessFlags(std::addressof(out->flags), meta, flags)); /* 3.0.0+ System Resource Size. */ if (hos::GetVersion() >= hos::Version_3_0_0) { @@ -533,7 +525,7 @@ namespace ams::ldr { /* Validate system resource usage. */ if (meta->npdm->system_resource_size) { /* Process must be 64-bit. */ - R_UNLESS((out->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit39), ldr::ResultInvalidMeta()); + R_UNLESS((out->flags & svc::CreateProcessFlag_AddressSpace64Bit), ldr::ResultInvalidMeta()); /* Process must be application or applet. */ R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); @@ -606,29 +598,25 @@ namespace ams::ldr { uintptr_t aslr_start = 0; size_t aslr_size = 0; if (hos::GetVersion() >= hos::Version_2_0_0) { - switch (out_param->flags & svc::CreateProcessParameterFlag_AddressSpaceMask) { - case svc::CreateProcessParameterFlag_AddressSpace32Bit: - case svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved: + switch (out_param->flags & svc::CreateProcessFlag_AddressSpaceMask) { + case svc::CreateProcessFlag_AddressSpace32Bit: + case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: aslr_start = svc::AddressSmallMap32Start; aslr_size = svc::AddressSmallMap32Size; break; - case svc::CreateProcessParameterFlag_AddressSpace64Bit36: + case svc::CreateProcessFlag_AddressSpace64BitDeprecated: aslr_start = svc::AddressSmallMap36Start; aslr_size = svc::AddressSmallMap36Size; break; - case svc::CreateProcessParameterFlag_AddressSpace64Bit39: + case svc::CreateProcessFlag_AddressSpace64Bit: aslr_start = svc::AddressMap39Start; aslr_size = svc::AddressMap39Size; break; - case svc::CreateProcessParameterFlag_AddressSpace64Bit42: - aslr_start = svc::AddressMap42Start; - aslr_size = svc::AddressMap42Size; - break; AMS_UNREACHABLE_DEFAULT_CASE(); } } else { /* On 1.0.0, only 2 address space types existed. */ - if (out_param->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit36) { + if (out_param->flags & svc::CreateProcessFlag_AddressSpace64BitDeprecated) { aslr_start = svc::AddressSmallMap36Start; aslr_size = svc::AddressSmallMap36Size; } else { @@ -641,7 +629,7 @@ namespace ams::ldr { /* Set Create Process output. */ uintptr_t aslr_slide = 0; size_t free_size = (aslr_size - total_size); - if (out_param->flags & svc::CreateProcessParameterFlag_EnableAslr) { + if (out_param->flags & svc::CreateProcessFlag_EnableAslr) { aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; } @@ -663,13 +651,10 @@ namespace ams::ldr { R_SUCCEED(); } - Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zbic, uintptr_t map_base, uintptr_t map_end) { + Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zstd, uintptr_t map_base, uintptr_t map_end) { /* Select read size based on compression. */ size_t file_size = is_compressed ? compressed_size : segment_size; - AMS_LOG("[ldr] Loading segment @ 0x%016lx: compressed=%d, file_size=0x%08lx, compressed_size=0x%08lx, segment_size=0x%08lx\n", - map_base, is_compressed, file_size, compressed_size, segment_size); - /* Validate size. */ R_UNLESS(file_size <= segment_size, ldr::ResultInvalidNso()); R_UNLESS(file_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); @@ -679,19 +664,19 @@ namespace ams::ldr { uintptr_t load_address = is_compressed ? map_end - compressed_size : map_base; size_t read_size; R_TRY(fs::ReadFile(std::addressof(read_size), file, file_offset, reinterpret_cast(load_address), file_size)); - R_UNLESS_LOG(read_size == file_size, ldr::ResultInvalidNso(), "[ldr] Couldn't read segment from file!\n"); + R_UNLESS(read_size == file_size, ldr::ResultInvalidNso()); /* Uncompress if necessary. */ R_SUCCEED_IF(!is_compressed); auto compressed_data_buf = reinterpret_cast(load_address); - if (is_zbic) { - bool decompressed = util::DecompressZstdWithBic(reinterpret_cast(g_zstd_dctx_workspace), sizeof(g_zstd_dctx_workspace), reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); - R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with zbic!\n"); + if (is_zstd) { + bool decompressed = util::DecompressZstdForLoader(reinterpret_cast(g_zstd_dctx_workspace), ZstdDctxWorkspaceSize, reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); + R_UNLESS(decompressed, ldr::ResultInvalidNso()); } else { bool decompressed = (util::DecompressLZ4(reinterpret_cast(map_base), segment_size, compressed_data_buf, file_size) == static_cast(segment_size)); - R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with lz4!\n"); + R_UNLESS(decompressed, ldr::ResultInvalidNso()); } R_SUCCEED(); @@ -706,12 +691,12 @@ namespace ams::ldr { crypto::GenerateSha256(hash, sizeof(hash), reinterpret_cast(map_address + nso_header->segments[segment].dst_offset), nso_header->segments[segment].size); - R_UNLESS_LOG(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso(), "[ldr] Invalid segment hash!\n"); + R_UNLESS(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso()); R_SUCCEED(); } Result LoadAutoLoadModule(os::NativeHandle process_handle, fs::FileHandle file, const NsoHeader *nso_header, uintptr_t nso_address, size_t nso_size, size_t map_size) { - const bool is_zbic = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; + const bool is_zstd = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; const size_t module_size = static_cast(nso_header->rw_dst_offset) + util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize); const size_t arena_size = (nso_size > module_size) ? (nso_size - module_size) : 0; @@ -728,11 +713,11 @@ namespace ams::ldr { /* Load NSO segments. */ R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Text].file_offset, nso_header->text_compressed_size, nso_header->text_size, - (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zbic, map_address + nso_header->text_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zstd, map_address + nso_header->text_dst_offset, map_end)); R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Ro].file_offset, nso_header->ro_compressed_size, nso_header->ro_size, - (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zbic, map_address + nso_header->ro_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zstd, map_address + nso_header->ro_dst_offset, map_end)); R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Rw].file_offset, nso_header->rw_compressed_size, nso_header->rw_size, - (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zbic, map_address + nso_header->rw_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zstd, map_address + nso_header->rw_dst_offset, map_end)); /* Clear unused space to zero. */ const size_t text_end = static_cast(nso_header->text_dst_offset) + static_cast(nso_header->text_size); @@ -769,6 +754,11 @@ namespace ams::ldr { if (g_is_ptm) { hoc::ptm::Patch(map_address, nso_size); } + + // TODO: figure out the cause of crashes with nvsrv patches + if (g_is_nvsrv) { + // hoc::nvsrv::Patch(map_address, nso_size, nso_address); + } } /* Set permissions. */ @@ -795,17 +785,15 @@ namespace ams::ldr { for (int i = 0; i < ctx.nso_count; i++) { const NsoIndex nso_idx = static_cast(ctx.ali.nso_indices[i]); - const bool is_zbic = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; - const size_t map_size = is_zbic ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; - - AMS_LOG("[ldr] module[%d]: idx=%d, path='%s', zbic=%d\n", i, (int)nso_idx, GetNsoPath(nso_idx), is_zbic); fs::FileHandle file; R_TRY(fs::OpenFile(std::addressof(file), GetNsoPath(nso_idx), fs::OpenMode_Read)); ON_SCOPE_EXIT { fs::CloseFile(file); }; - R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, - process_info->nso_address[i], process_info->nso_size[i], map_size)); + const bool is_zstd = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; + const size_t map_size = is_zstd ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; + + R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, process_info->nso_address[i], process_info->nso_size[i], map_size)); } /* Load arguments, if present. */ @@ -846,7 +834,7 @@ namespace ams::ldr { /* Set the output handle, and ensure that if we fail after this point we clean it up. */ out->process_handle = process_handle; out->code_address = param.code_address; - ON_RESULT_FAILURE { R_DISCARD(svc::CloseHandle(process_handle)); }; + ON_RESULT_FAILURE { svc::CloseHandle(process_handle); }; /* Load all auto load modules. */ R_RETURN(LoadAutoLoadModules(out, ctx, argument)); @@ -904,8 +892,8 @@ namespace ams::ldr { os::ProcessId process_id = os::GetProcessId(info.process_handle); /* Register new process. */ - const auto as_type = GetProcessAddressSpace(std::addressof(meta)); - RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::ProcessAddressSpace_64Bit39 || as_type == Npdm::ProcessAddressSpace_64Bit36); + const auto as_type = GetAddressSpaceType(std::addressof(meta)); + RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::AddressSpaceType_64Bit || as_type == Npdm::AddressSpaceType_64BitDeprecated); /* Register all NSOs. */ for (int i = 0; i < ctx.nso_count; i++) { @@ -916,7 +904,7 @@ namespace ams::ldr { /* If we're overriding for HBL, perform HTML document redirection. */ if (override_status.IsHbl()) { /* Don't validate result, failure is okay. */ - R_DISCARD(RedirectHtmlDocumentPathForHbl(loc)); + RedirectHtmlDocumentPathForHbl(loc); } /* Clear the external code for the program. */ diff --git a/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp b/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp deleted file mode 100644 index a4d90b00..00000000 --- a/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp +++ /dev/null @@ -1,960 +0,0 @@ -/* - * Copyright (c) Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include -#include "ldr_capabilities.hpp" -#include "ldr_content_management.hpp" -#include "ldr_development_manager.hpp" -#include "ldr_launch_record.hpp" -#include "ldr_meta.hpp" -#include "ldr_patcher.hpp" -#include "ldr_process_creation.hpp" -#include "ldr_ro_manager.hpp" -#include "oc/oc_loader.hpp" - -namespace ams::ldr { - - namespace { - - /* Convenience defines. */ - constexpr size_t SystemResourceSizeMax = 0x1FE00000; - constexpr size_t AutoLoadModuleSizeMax = 0x800000000; - - /* Types. */ - enum NsoIndex { - Nso_Rtld = 0, - Nso_Main = 1, - Nso_Wkc0 = 2, - Nso_Wkc1 = 3, - Nso_Wkc2 = 4, - Nso_Wkc3 = 5, - Nso_Wkc4 = 6, - Nso_Wkc5 = 7, - Nso_Wkc6 = 8, - Nso_Wkc7 = 9, - Nso_Wkc8 = 10, - Nso_Wkc9 = 11, - Nso_SubSdk0 = 12, - Nso_SubSdk1 = 13, - Nso_SubSdk2 = 14, - Nso_SubSdk3 = 15, - Nso_SubSdk4 = 16, - Nso_SubSdk5 = 17, - Nso_SubSdk6 = 18, - Nso_SubSdk7 = 19, - Nso_SubSdk8 = 20, - Nso_SubSdk9 = 21, - Nso_Sdk = 22, - Nso_Count, - }; - - constexpr inline const char *NsoPaths[Nso_Count] = { - ENCODE_ATMOSPHERE_CODE_PATH("/rtld"), - ENCODE_ATMOSPHERE_CODE_PATH("/main"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc0"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc1"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc2"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc3"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc4"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc5"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc6"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc7"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc8"), - ENCODE_ATMOSPHERE_BDLL_PATH("/wkc9"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk0"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk1"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk2"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk3"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk4"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk5"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk6"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk7"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk8"), - ENCODE_ATMOSPHERE_CODE_PATH("/subsdk9"), - ENCODE_ATMOSPHERE_CODE_PATH("/sdk"), - }; - - constexpr const char *GetNsoPath(size_t idx) { - AMS_ABORT_UNLESS(idx < Nso_Count); - return NsoPaths[idx]; - } - - struct ProcessInfo { - os::NativeHandle process_handle; - uintptr_t code_address; - size_t total_size; - uintptr_t args_address; - size_t args_size; - uintptr_t nso_address[Nso_Count]; - size_t nso_size[Nso_Count]; - }; - - struct AutoLoadModuleInfo { - bool has_rtld; - bool has_main; - bool has_sdk; - bool has_subsdk; - s8 nso_indices[Nso_Count]; - }; - - struct AutoLoadModuleContext { - NsoHeader *headers; - int nso_count; - int rtld_idx; - int main_nso_idx; - int sdk_nso_idx; - AutoLoadModuleInfo ali; - }; - - /* Global NSO header cache. */ - NsoHeader g_nso_headers[Nso_Count]; - - /* Pcv/Ptm/NvServices check cache */ - bool g_is_pcv; - bool g_is_ptm; - bool g_is_nvsrv; - - /* Global Zstd decompression context. */ - constexpr size_t ZstdDctxWorkspaceSize = 0x176E8; - alignas(8) u8 g_zstd_dctx_workspace[ZstdDctxWorkspaceSize]; - - Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) { - /* No version verification is done before 8.1.0. */ - R_SUCCEED_IF(hos::GetVersion() < hos::Version_8_1_0); - - /* No verification is done if development. */ - R_SUCCEED_IF(IsDevelopmentForAntiDowngradeCheck()); - - /* TODO: Anti-downgrade checking does not make very much sense for us. Should we do anything? */ - AMS_UNUSED(program_id, version); - - R_SUCCEED(); - } - - /* Helpers. */ - Result GetProgramInfoFromMeta(ProgramInfo *out, const Meta *meta) { - /* Copy basic info. */ - out->main_thread_priority = meta->npdm->main_thread_priority; - out->default_cpu_id = meta->npdm->default_cpu_id; - out->main_thread_stack_size = meta->npdm->main_thread_stack_size; - out->program_id = meta->aci->program_id; - - /* Copy access controls. */ - size_t offset = 0; -#define COPY_ACCESS_CONTROL(source, which) \ - ({ \ - const size_t size = meta->source->which##_size; \ - R_UNLESS(offset + size <= sizeof(out->ac_buffer), ldr::ResultInternalError()); \ - out->source##_##which##_size = size; \ - std::memcpy(out->ac_buffer + offset, meta->source##_##which, size); \ - offset += size; \ - }) - - /* Copy all access controls to buffer. */ - COPY_ACCESS_CONTROL(acid, sac); - COPY_ACCESS_CONTROL(aci, sac); - COPY_ACCESS_CONTROL(acid, fac); - COPY_ACCESS_CONTROL(aci, fah); -#undef COPY_ACCESS_CONTROL - - /* Copy flags. */ - out->flags = MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)); - R_SUCCEED(); - } - - bool IsApplet(const Meta *meta) { - return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Applet; - } - - bool IsApplication(const Meta *meta) { - return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; - } - - Npdm::AddressSpaceType GetAddressSpaceType(const Meta *meta) { - return static_cast((meta->npdm->flags & Npdm::MetaFlag_AddressSpaceTypeMask) >> Npdm::MetaFlag_AddressSpaceTypeShift); - } - - Acid::PoolPartition GetPoolPartition(const Meta *meta) { - return static_cast((meta->acid->flags & Acid::AcidFlag_PoolPartitionMask) >> Acid::AcidFlag_PoolPartitionShift); - } - - Result LoadAutoLoadHeaders(AutoLoadModuleContext &ctx, u32 acid_flags) { - /* Clear NSOs. */ - std::memset(g_nso_headers, 0, sizeof(g_nso_headers)); - ctx.headers = g_nso_headers; - ctx.nso_count = 0; - ctx.rtld_idx = -1; - ctx.main_nso_idx = -1; - ctx.sdk_nso_idx = -1; - ctx.ali = {}; - - for (size_t i = 0; i < Nso_Count; i++) { - /* Only load browser DLLs if acid flags say to do so. */ - switch (i) { - case Nso_Wkc0: - case Nso_Wkc1: - case Nso_Wkc2: - case Nso_Wkc3: - case Nso_Wkc4: - case Nso_Wkc5: - case Nso_Wkc6: - case Nso_Wkc7: - case Nso_Wkc8: - case Nso_Wkc9: - if ((acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) == 0) { - continue; - } - break; - } - - fs::FileHandle file; - if (R_SUCCEEDED(fs::OpenFile(std::addressof(file), GetNsoPath(i), fs::OpenMode_Read))) { - ON_SCOPE_EXIT { fs::CloseFile(file); }; - - /* Read NSO header. */ - size_t read_size; - R_TRY(fs::ReadFile(std::addressof(read_size), file, 0, g_nso_headers + ctx.nso_count, sizeof(NsoHeader))); - R_UNLESS(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso()); - - /* Note nso is present. */ - switch (i) { - case Nso_Rtld: - ctx.rtld_idx = ctx.nso_count; - ctx.ali.has_rtld = true; - break; - case Nso_Main: - ctx.main_nso_idx = ctx.nso_count; - ctx.ali.has_main = true; - break; - case Nso_SubSdk0: - case Nso_SubSdk1: - case Nso_SubSdk2: - case Nso_SubSdk3: - case Nso_SubSdk4: - case Nso_SubSdk5: - case Nso_SubSdk6: - case Nso_SubSdk7: - case Nso_SubSdk8: - case Nso_SubSdk9: - ctx.ali.has_subsdk = true; - break; - case Nso_Sdk: - ctx.sdk_nso_idx = ctx.nso_count; - ctx.ali.has_sdk = true; - break; - } - ctx.ali.nso_indices[ctx.nso_count] = static_cast(i); - ctx.nso_count++; - } - } - - R_SUCCEED(); - } - - Result CheckAutoLoad(const AutoLoadModuleContext &ctx, u32 acid_flags) { - /* We must always have a main. */ - R_UNLESS(ctx.ali.has_main, ldr::ResultInvalidNso()); - - /* Validate flags and extents for all present NSOs. */ - for (int i = 0; i < ctx.nso_count; ++i) { - const auto &hdr = ctx.headers[i]; - - /* All NSOs must not be --X. */ - /* This is "probably" not checked on Ounce? */ - R_UNLESS((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso()); - - /* Zstd compression only allowed on main, and only when both rtld+sdk are present. */ - if (i != ctx.main_nso_idx || ctx.rtld_idx < 0 || ctx.sdk_nso_idx < 0) { - R_UNLESS((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso()); - } - - /* NSOs must have page-aligned segments. */ - R_UNLESS(util::IsAligned(hdr.text_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); - R_UNLESS(util::IsAligned(hdr.ro_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); - R_UNLESS(util::IsAligned(hdr.rw_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); - - /* NSOs must have zero text offset. */ - R_UNLESS(hdr.text_dst_offset == 0, ldr::ResultInvalidNso()); - - /* NSO .text must precede .rodata. */ - const size_t text_end = static_cast(hdr.text_dst_offset) + static_cast(hdr.text_size); - R_UNLESS(text_end <= static_cast(hdr.ro_dst_offset), ldr::ResultInvalidNso()); - - /* NSO .rodata must precede .rwdata. */ - const size_t ro_end = static_cast(hdr.ro_dst_offset) + static_cast(hdr.ro_size); - R_UNLESS(ro_end <= static_cast(hdr.rw_dst_offset), ldr::ResultInvalidNso()); - } - - const bool has_browser_dll = (acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) != 0; - if (ctx.ali.has_rtld || ctx.ali.has_sdk) { - /* If we have sdk we must have rtld. */ - R_UNLESS(ctx.ali.has_rtld, ldr::ResultInvalidNso()); - - /* If we have rtld, we must not have browser core dll. */ - R_UNLESS(!has_browser_dll, ldr::ResultInvalidNso()); - } else { - /* We must not have both subsdk and browser dll. */ - R_UNLESS(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso()); - } - - R_SUCCEED(); - } - - constexpr const ncm::ProgramId UnqualifiedApprovalProgramIds[] = { - { 0x010003F003A34000 }, /* Pokemon: Let's Go, Pikachu! */ - { 0x0100152000022000 }, /* Mario Kart 8 Deluxe */ - { 0x0100165003504000 }, /* Nintendo Labo Toy-Con 04: VR Kit */ - { 0x0100187003A36000 }, /* Pokemon: Let's Go, Eevee! */ - { 0x01002E5008C56000 }, /* Pokemon Sword [Live Tournament] */ - { 0x01002FF008C24000 }, /* Ring Fit Adventure */ - { 0x010049900F546001 }, /* Super Mario 3D All-Stars: Super Mario 64 */ - { 0x010057D00ECE4000 }, /* Nintendo Switch Online (Nintendo 64) [for Japan] */ - { 0x01006F8002326000 }, /* Animal Crossing: New Horizons */ - { 0x01006FB00F50E000 }, /* 宝可梦 走吧!伊布 [Pokemon: Let's Go, Eevee! for China] */ - { 0x010070300F50C000 }, /* 宝可梦 走吧!皮卡丘 [Pokemon: Let's Go, Pikachu! for China] */ - { 0x010075100E8EC000 }, /* 马力欧卡丁车8 豪华版 [Mario Kart 8 Deluxe for China] */ - { 0x01008DB008C2C000 }, /* Pokemon Shield */ - { 0x01009AD008C4C000 }, /* Pokemon: Let's Go, Pikachu! [Kiosk] */ - { 0x0100A66003384000 }, /* Hulu */ - { 0x0100ABF008968000 }, /* Pokemon Sword */ - { 0x0100C9A00ECE6000 }, /* Nintendo Switch Online (Nintendo 64) [for America] */ - { 0x0100ED100BA3A000 }, /* Mario Kart Live: Home Circuit */ - { 0x0100F38011CFE000 }, /* Animal Crossing: New Horizons Island Transfer Tool */ - { 0x0100F6B011028000 }, /* 健身环大冒险 [Ring Fit Adventure for China] */ - }; - - /* Check that the unqualified approval programs are sorted. */ - static_assert([]() -> bool { - for (size_t i = 0; i < util::size(UnqualifiedApprovalProgramIds) - 1; ++i) { - if (UnqualifiedApprovalProgramIds[i].value >= UnqualifiedApprovalProgramIds[i + 1].value) { - return false; - } - } - - return true; - }()); - - bool IsUnqualifiedApprovalProgramId(ncm::ProgramId program_id) { - /* Check if the program id is one with unqualified approval. */ - return std::binary_search(std::begin(UnqualifiedApprovalProgramIds), std::end(UnqualifiedApprovalProgramIds), program_id); - } - - bool IsUnqualifiedApproval(const Meta *meta) { - /* If the meta has unqualified approval flag, it's unqualified approval. */ - if (meta->acid->flags & ldr::Acid::AcidFlag_UnqualifiedApproval) { - return true; - } - - /* If the unqualified approval flag is not set, the program must be an application. */ - if (!IsApplication(meta)) { - return false; - } - - /* The program id must be a force unqualified approval program id. */ - return IsUnqualifiedApprovalProgramId(meta->acid->program_id_min) && meta->acid->program_id_min == meta->acid->program_id_max; - } - - Result ValidateMeta(const Meta *meta, const ncm::ProgramLocation &loc, const fs::CodeVerificationData &code_verification_data) { - /* Validate version. */ - R_TRY(ValidateProgramVersion(loc.program_id, meta->npdm->version)); - - /* Validate program id. */ - R_UNLESS(meta->aci->program_id >= meta->acid->program_id_min, ldr::ResultInvalidProgramId()); - R_UNLESS(meta->aci->program_id <= meta->acid->program_id_max, ldr::ResultInvalidProgramId()); - - /* Validate the kernel capabilities. */ - R_TRY(TestCapability(static_cast(meta->acid_kac), meta->acid->kac_size / sizeof(util::BitPack32), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32))); - - /* Check if NCA is PCV or PTM */ - g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; - g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; - g_is_nvsrv = meta->aci->program_id == ncm::SystemProgramId::NvServices; - - /* If we have data to validate, validate it. */ - if (meta->check_verification_data) { - const u8 *sig = code_verification_data.signature; - const size_t sig_size = sizeof(code_verification_data.signature); - const u8 *mod = static_cast(meta->modulus); - const size_t mod_size = crypto::Rsa2048PssSha256Verifier::ModulusSize; - const u8 *exp = fssystem::GetAcidSignatureKeyPublicExponent(); - const size_t exp_size = fssystem::AcidSignatureKeyPublicExponentSize; - const u8 *hsh = code_verification_data.target_hash; - const size_t hsh_size = sizeof(code_verification_data.target_hash); - const bool is_signature_valid = crypto::VerifyRsa2048PssSha256WithHash(sig, sig_size, mod, mod_size, exp, exp_size, hsh, hsh_size); - - /* If the signature check fails, we need to check if this is allowable. */ - if (!is_signature_valid) { - /* We have to enforce signature checks on prod and when we have a signature to check on dev. */ - R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature()); - R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature()); - - /* There was no signature to check on dev. Check if this is acceptable. */ - R_UNLESS(IsUnqualifiedApproval(meta), ldr::ResultInvalidNcaSignature()); - } - } - - /* All good. */ - R_SUCCEED(); - } - - Result GetCreateProcessFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { - const u8 meta_flags = meta->npdm->flags; - - u32 flags = 0; - - /* Set Is64Bit. */ - if (meta_flags & Npdm::MetaFlag_Is64Bit) { - flags |= svc::CreateProcessFlag_Is64Bit; - } - - /* Set AddressSpaceType. */ - switch (GetAddressSpaceType(meta)) { - case Npdm::AddressSpaceType_32Bit: - flags |= svc::CreateProcessFlag_AddressSpace32Bit; - break; - case Npdm::AddressSpaceType_64BitDeprecated: - flags |= svc::CreateProcessFlag_AddressSpace64BitDeprecated; - break; - case Npdm::AddressSpaceType_32BitWithoutAlias: - flags |= svc::CreateProcessFlag_AddressSpace32BitWithoutAlias; - break; - case Npdm::AddressSpaceType_64Bit: - flags |= svc::CreateProcessFlag_AddressSpace64Bit; - break; - default: - R_THROW(ldr::ResultInvalidMeta()); - } - - /* Set Enable Debug. */ - if (ldr_flags & CreateProcessFlag_EnableDebug) { - flags |= svc::CreateProcessFlag_EnableDebug; - } - - /* Set Enable ASLR. */ - if (!(ldr_flags & CreateProcessFlag_DisableAslr)) { - flags |= svc::CreateProcessFlag_EnableAslr; - } - - /* Set Is Application. */ - if (IsApplication(meta)) { - flags |= svc::CreateProcessFlag_IsApplication; - - /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ - if (hos::GetVersion() >= hos::Version_7_0_0) { - if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) { - flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation; - } - } - } - - /* 5.0.0+ Set Pool Partition. */ - if (hos::GetVersion() >= hos::Version_5_0_0) { - /* TODO: Nintendo no longer accepts Applet when pool partition == application. Would this break hbl/anything else in the hb ecosystem? */ - /* TODO: Nintendo uses a helper bool MakeSvcPoolPartitionFlag(u32 *out, Acid::PoolPartition partition); */ - switch (GetPoolPartition(meta)) { - case Acid::PoolPartition_Application: - if (IsApplet(meta)) { - flags |= svc::CreateProcessFlag_PoolPartitionApplet; - } else { - flags |= svc::CreateProcessFlag_PoolPartitionApplication; - } - break; - case Acid::PoolPartition_Applet: - flags |= svc::CreateProcessFlag_PoolPartitionApplet; - break; - case Acid::PoolPartition_System: - flags |= svc::CreateProcessFlag_PoolPartitionSystem; - break; - case Acid::PoolPartition_SystemNonSecure: - flags |= svc::CreateProcessFlag_PoolPartitionSystemNonSecure; - break; - default: - R_THROW(ldr::ResultInvalidMeta()); - } - } else if (hos::GetVersion() >= hos::Version_4_0_0) { - /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ - if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { - flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory; - } - } - - /* 11.0.0+/meso Set Disable DAS merge. */ - if (meta_flags & Npdm::MetaFlag_DisableDeviceAddressSpaceMerge) { - flags |= svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; - } - - /* 18.0.0+/meso Set Alias region extra size. */ - if (meta_flags & Npdm::MetaFlag_EnableAliasRegionExtraSize) { - flags |= svc::CreateProcessFlag_EnableAliasRegionExtraSize; - } - - *out = flags; - R_SUCCEED(); - } - - Result GetCreateProcessParameter(svc::CreateProcessParameter *out, const Meta *meta, u32 flags, os::NativeHandle resource_limit) { - /* Clear output. */ - std::memset(out, 0, sizeof(*out)); - - /* Set name, version, program id, resource limit handle. */ - std::memcpy(out->name, meta->npdm->program_name, sizeof(out->name) - 1); - out->version = meta->npdm->version; - out->program_id = meta->aci->program_id.value; - out->reslimit = resource_limit; - - /* Set flags. */ - R_TRY(GetCreateProcessFlags(std::addressof(out->flags), meta, flags)); - - /* 3.0.0+ System Resource Size. */ - if (hos::GetVersion() >= hos::Version_3_0_0) { - /* Validate size is aligned. */ - R_UNLESS(util::IsAligned(meta->npdm->system_resource_size, os::MemoryBlockUnitSize), ldr::ResultInvalidSize()); - - /* Validate system resource usage. */ - if (meta->npdm->system_resource_size) { - /* Process must be 64-bit. */ - R_UNLESS((out->flags & svc::CreateProcessFlag_AddressSpace64Bit), ldr::ResultInvalidMeta()); - - /* Process must be application or applet. */ - R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); - - /* Size must be less than or equal to max. */ - R_UNLESS(meta->npdm->system_resource_size <= SystemResourceSizeMax, ldr::ResultInvalidMeta()); - } - out->system_resource_num_pages = meta->npdm->system_resource_size >> 12; - } - - R_SUCCEED(); - } - - u64 GenerateSecureRandom(u64 max) { - /* Generate a cryptographically random number. */ - u64 rand; - crypto::GenerateCryptographicallyRandomBytes(std::addressof(rand), sizeof(rand)); - - /* Coerce into range. */ - return rand % (max + 1); - } - - Result DecideAddressSpaceLayout(ProcessInfo *out, svc::CreateProcessParameter *out_param, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument) { - /* Clear output. */ - out->args_address = 0; - out->args_size = 0; - std::memset(out->nso_address, 0, sizeof(out->nso_address)); - std::memset(out->nso_size, 0, sizeof(out->nso_size)); - - size_t total_size = 0; - bool argument_allocated = false; - - /* Calculate base offsets. */ - for (int i = 0; i < ctx.nso_count; i++) { - out->nso_address[i] = total_size; - const size_t text_end = static_cast(ctx.headers[i].text_dst_offset) + static_cast(ctx.headers[i].text_size); - const size_t ro_end = static_cast(ctx.headers[i].ro_dst_offset) + static_cast(ctx.headers[i].ro_size); - const size_t rw_end = static_cast(ctx.headers[i].rw_dst_offset) + static_cast(ctx.headers[i].rw_size); - out->nso_size[i] = text_end; - out->nso_size[i] = std::max(out->nso_size[i], ro_end); - out->nso_size[i] = std::max(out->nso_size[i], rw_end); - out->nso_size[i] += static_cast(ctx.headers[i].bss_size); - - /* Reserve hook arena memory past pcv's bss. */ - if (g_is_pcv && i == ctx.main_nso_idx) { - out->nso_size[i] = util::AlignUp(out->nso_size[i], os::MemoryPageSize) + hoc::pcv::PcvDataArenaSize; - } - - const size_t aligned_up_size = util::AlignUp(out->nso_size[i], os::MemoryPageSize) & (AutoLoadModuleSizeMax - 1); - R_UNLESS(out->nso_size[i] <= aligned_up_size, ldr::ResultInvalidNso()); - R_UNLESS(aligned_up_size > 0, ldr::ResultInvalidNso()); - - out->nso_size[i] = aligned_up_size; - - R_UNLESS(util::CanAddWithoutOverflow(total_size, out->nso_size[i]), ldr::ResultInvalidNso()); - total_size += out->nso_size[i]; - - if (!argument_allocated && argument != nullptr) { - out->args_address = total_size; - out->args_size = util::AlignUp(2 * sizeof(u32) + argument->argument_size * 2 + ArgumentStore::ArgumentBufferSize, os::MemoryPageSize); - - R_UNLESS(util::CanAddWithoutOverflow(total_size, out->args_size), ldr::ResultInvalidNso()); - total_size += out->args_size; - - argument_allocated = true; - } - } - - /* Calculate ASLR. */ - uintptr_t aslr_start = 0; - size_t aslr_size = 0; - if (hos::GetVersion() >= hos::Version_2_0_0) { - switch (out_param->flags & svc::CreateProcessFlag_AddressSpaceMask) { - case svc::CreateProcessFlag_AddressSpace32Bit: - case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: - aslr_start = svc::AddressSmallMap32Start; - aslr_size = svc::AddressSmallMap32Size; - break; - case svc::CreateProcessFlag_AddressSpace64BitDeprecated: - aslr_start = svc::AddressSmallMap36Start; - aslr_size = svc::AddressSmallMap36Size; - break; - case svc::CreateProcessFlag_AddressSpace64Bit: - aslr_start = svc::AddressMap39Start; - aslr_size = svc::AddressMap39Size; - break; - AMS_UNREACHABLE_DEFAULT_CASE(); - } - } else { - /* On 1.0.0, only 2 address space types existed. */ - if (out_param->flags & svc::CreateProcessFlag_AddressSpace64BitDeprecated) { - aslr_start = svc::AddressSmallMap36Start; - aslr_size = svc::AddressSmallMap36Size; - } else { - aslr_start = svc::AddressSmallMap32Start; - aslr_size = svc::AddressSmallMap32Size; - } - } - R_UNLESS(total_size <= aslr_size, svc::ResultOutOfMemory()); - - /* Set Create Process output. */ - uintptr_t aslr_slide = 0; - size_t free_size = (aslr_size - total_size); - if (out_param->flags & svc::CreateProcessFlag_EnableAslr) { - aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; - } - - /* Set out. */ - aslr_start += aslr_slide; - for (int i = 0; i < ctx.nso_count; i++) { - R_UNLESS(util::CanAddWithoutOverflow(out->nso_address[i], aslr_start), ldr::ResultInvalidNso()); - out->nso_address[i] += aslr_start; - } - if (out->args_address) { - R_UNLESS(util::CanAddWithoutOverflow(out->args_address, aslr_start), ldr::ResultInvalidNso()); - out->args_address += aslr_start; - } - - out_param->code_address = aslr_start; - out_param->code_num_pages = total_size >> 12; - out->total_size = total_size; - - R_SUCCEED(); - } - - Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zstd, uintptr_t map_base, uintptr_t map_end) { - /* Select read size based on compression. */ - size_t file_size = is_compressed ? compressed_size : segment_size; - - /* Validate size. */ - R_UNLESS(file_size <= segment_size, ldr::ResultInvalidNso()); - R_UNLESS(file_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); - R_UNLESS(segment_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); - - /* Load data from file. */ - uintptr_t load_address = is_compressed ? map_end - compressed_size : map_base; - size_t read_size; - R_TRY(fs::ReadFile(std::addressof(read_size), file, file_offset, reinterpret_cast(load_address), file_size)); - R_UNLESS(read_size == file_size, ldr::ResultInvalidNso()); - - /* Uncompress if necessary. */ - R_SUCCEED_IF(!is_compressed); - - auto compressed_data_buf = reinterpret_cast(load_address); - - if (is_zstd) { - bool decompressed = util::DecompressZstdForLoader(reinterpret_cast(g_zstd_dctx_workspace), ZstdDctxWorkspaceSize, reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); - R_UNLESS(decompressed, ldr::ResultInvalidNso()); - } else { - bool decompressed = (util::DecompressLZ4(reinterpret_cast(map_base), segment_size, compressed_data_buf, file_size) == static_cast(segment_size)); - R_UNLESS(decompressed, ldr::ResultInvalidNso()); - } - - R_SUCCEED(); - } - - Result CheckSegmentHash(const NsoHeader *nso_header, uintptr_t map_address, NsoHeader::Segment segment) { - if ((nso_header->flags & (NsoHeader::Flag_CheckHashText << segment)) == 0) { - R_SUCCEED(); - } - - u8 hash[crypto::Sha256Generator::HashSize]; - crypto::GenerateSha256(hash, sizeof(hash), - reinterpret_cast(map_address + nso_header->segments[segment].dst_offset), - nso_header->segments[segment].size); - R_UNLESS(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso()); - R_SUCCEED(); - } - - Result LoadAutoLoadModule(os::NativeHandle process_handle, fs::FileHandle file, const NsoHeader *nso_header, uintptr_t nso_address, size_t nso_size, size_t map_size) { - const bool is_zstd = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; - - const size_t module_size = static_cast(nso_header->rw_dst_offset) + util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize); - const size_t arena_size = (nso_size > module_size) ? (nso_size - module_size) : 0; - - /* Map and read data from file. */ - { - /* Map the process memory. */ - void *mapped_memory = nullptr; - R_TRY(os::MapProcessMemory(std::addressof(mapped_memory), process_handle, nso_address, map_size, GenerateSecureRandom)); - ON_SCOPE_EXIT { os::UnmapProcessMemory(mapped_memory, process_handle, nso_address, map_size); }; - - const uintptr_t map_address = reinterpret_cast(mapped_memory); - const uintptr_t map_end = map_address + map_size; - - /* Load NSO segments. */ - R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Text].file_offset, nso_header->text_compressed_size, nso_header->text_size, - (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zstd, map_address + nso_header->text_dst_offset, map_end)); - R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Ro].file_offset, nso_header->ro_compressed_size, nso_header->ro_size, - (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zstd, map_address + nso_header->ro_dst_offset, map_end)); - R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Rw].file_offset, nso_header->rw_compressed_size, nso_header->rw_size, - (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zstd, map_address + nso_header->rw_dst_offset, map_end)); - - /* Clear unused space to zero. */ - const size_t text_end = static_cast(nso_header->text_dst_offset) + static_cast(nso_header->text_size); - const size_t ro_end = static_cast(nso_header->ro_dst_offset) + static_cast(nso_header->ro_size); - const size_t rw_end = static_cast(nso_header->rw_dst_offset) + static_cast(nso_header->rw_size); - std::memset(reinterpret_cast(map_address + text_end), 0, nso_header->ro_dst_offset - text_end); - std::memset(reinterpret_cast(map_address + ro_end), 0, nso_header->rw_dst_offset - ro_end); - std::memset(reinterpret_cast(map_address + rw_end), 0, nso_size - rw_end); - - /* Check segment hashes. */ - R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Text)); - R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Ro)); - R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Rw)); - - /* Apply embedded patches. */ - ApplyEmbeddedPatchesToModule(nso_header->module_id, map_address, nso_size); - - /* Apply IPS patches. */ - LocateAndApplyIpsPatchesToModule(nso_header->module_id, map_address, nso_size); - - /* Apply PCV and PTM patches */ - if (g_is_pcv) { - const size_t text_end = static_cast(nso_header->text_size); - const size_t rx_end = util::AlignUp(text_end, os::MemoryPageSize); - const size_t ro_start = static_cast(nso_header->ro_dst_offset); - const size_t cave_end = (rx_end < ro_start) ? rx_end : ro_start; - const uintptr_t cave = map_address + text_end; - const size_t cave_size = (cave_end > text_end) ? (cave_end - text_end) : 0; - - /* module_size is used rather than nso_size to exclude the extra data section. */ - hoc::pcv::Patch(map_address, module_size, cave, cave_size, nso_address, arena_size ? (map_address + module_size) : 0); - } - - if (g_is_ptm) { - hoc::ptm::Patch(map_address, nso_size); - } - - // TODO: figure out the cause of crashes with nvsrv patches - if (g_is_nvsrv) { - // hoc::nvsrv::Patch(map_address, nso_size, nso_address); - } - } - - /* Set permissions. */ - const size_t text_size = util::AlignUp(nso_header->text_size, os::MemoryPageSize); - const size_t ro_size = util::AlignUp(nso_header->ro_size, os::MemoryPageSize); - const size_t rw_size = util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize) + arena_size; - if (text_size) { - const bool prevent_code_reads = (nso_header->flags & NsoHeader::Flag_PreventCodeReads); - R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->text_dst_offset, text_size, prevent_code_reads ? os::MemoryPermission_ExecuteOnly : os::MemoryPermission_ReadExecute)); - } - if (ro_size) { - R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->ro_dst_offset, ro_size, os::MemoryPermission_ReadOnly)); - } - if (rw_size) { - R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->rw_dst_offset, rw_size, os::MemoryPermission_ReadWrite)); - } - - R_SUCCEED(); - } - - Result LoadAutoLoadModules(const ProcessInfo *process_info, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument) { - /* Load each NSO. */ - const uintptr_t total_end = process_info->code_address + process_info->total_size; - - for (int i = 0; i < ctx.nso_count; i++) { - const NsoIndex nso_idx = static_cast(ctx.ali.nso_indices[i]); - - fs::FileHandle file; - R_TRY(fs::OpenFile(std::addressof(file), GetNsoPath(nso_idx), fs::OpenMode_Read)); - ON_SCOPE_EXIT { fs::CloseFile(file); }; - - const bool is_zstd = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; - const size_t map_size = is_zstd ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; - - R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, process_info->nso_address[i], process_info->nso_size[i], map_size)); - } - - /* Load arguments, if present. */ - if (argument != nullptr) { - /* Write argument data into memory. */ - { - void *map_address = nullptr; - R_TRY(os::MapProcessMemory(std::addressof(map_address), process_info->process_handle, process_info->args_address, process_info->args_size, GenerateSecureRandom)); - ON_SCOPE_EXIT { os::UnmapProcessMemory(map_address, process_info->process_handle, process_info->args_address, process_info->args_size); }; - - ProgramArguments *args = static_cast(map_address); - std::memset(args, 0, sizeof(*args)); - args->allocated_size = process_info->args_size; - args->arguments_size = argument->argument_size; - std::memcpy(args->arguments, argument->argument, argument->argument_size); - } - - /* Set argument region permissions. */ - /* NOTE: Nintendo uses svc::SetProcessMemoryPermission directly here. */ - R_TRY(os::SetProcessMemoryPermission(process_info->process_handle, process_info->args_address, process_info->args_size, os::MemoryPermission_ReadWrite)); - } - - R_SUCCEED(); - } - - Result CreateProcessAndLoadAutoLoadModules(ProcessInfo *out, const Meta *meta, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit) { - /* Get CreateProcessParameter. */ - svc::CreateProcessParameter param; - R_TRY(GetCreateProcessParameter(std::addressof(param), meta, flags, resource_limit)); - - /* Decide on an NSO layout. */ - R_TRY(DecideAddressSpaceLayout(out, std::addressof(param), ctx, argument)); - - /* Actually create process. */ - svc::Handle process_handle; - R_TRY(svc::CreateProcess(std::addressof(process_handle), std::addressof(param), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(u32))); - - /* Set the output handle, and ensure that if we fail after this point we clean it up. */ - out->process_handle = process_handle; - out->code_address = param.code_address; - ON_RESULT_FAILURE { svc::CloseHandle(process_handle); }; - - /* Load all auto load modules. */ - R_RETURN(LoadAutoLoadModules(out, ctx, argument)); - } - - } - - /* Process Creation API. */ - Result CreateProcess(os::NativeHandle *out, PinId pin_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status, const char *path, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit, const ldr::ProgramAttributes &attrs) { - /* Mount code. */ - AMS_UNUSED(path); - ScopedCodeMountForCode mount(loc, override_status, attrs); - R_TRY(mount.GetResult()); - - /* Load meta, possibly from cache. */ - Meta meta; - R_TRY(LoadMetaFromCache(std::addressof(meta), loc, override_status, attrs.platform)); - - /* Validate meta. */ - R_TRY(ValidateMeta(std::addressof(meta), loc, mount.GetCodeVerificationData())); - - /* If we should, load/validate the browser core dll. */ - util::optional bdll_mount; - if ((meta.acid->flags & Acid::AcidFlag_LoadBrowserCoreDll)) { - /* NOTE: I'm unsure whether we should be getting a fresh override status (allowing for different override between main and bdll?) */ - /* or whether we should be using the main override status. Going to go with main, for sanity's sake. */ - /* Also noting that Nintendo always passes ProgramAttributes=0 here, but this "should" be different on Ounce? */ - /* Kind of unclear how to handle this without knowing what exactly is being ifdef'd. */ - const ncm::ProgramLocation bdll_loc = ncm::ProgramLocation::Make(ncm::SystemProgramId::BrowserCoreDll, ncm::StorageId::BuiltInSystem); - const cfg::OverrideStatus bdll_override_status = override_status; - const ldr::ProgramAttributes bdll_attrs = attrs; - bdll_mount.emplace(bdll_loc, bdll_override_status, bdll_attrs); - R_TRY(bdll_mount->GetResult()); - - /* Load browser dll meta, possibly from cache. */ - Meta bdll_meta; - R_TRY(LoadMetaFromCacheForBrowserCoreDll(std::addressof(bdll_meta), bdll_loc, bdll_override_status, bdll_attrs.platform)); - - /* Validate browser dll meta. */ - R_TRY(ValidateMeta(std::addressof(bdll_meta), loc, mount.GetCodeVerificationData())); - } - - /* Load, validate NSO headers. */ - AutoLoadModuleContext ctx; - R_TRY(LoadAutoLoadHeaders(ctx, meta.acid->flags)); - R_TRY(CheckAutoLoad(ctx, meta.acid->flags)); - - /* Actually create the process and load NSOs into process memory. */ - ProcessInfo info; - R_TRY(CreateProcessAndLoadAutoLoadModules(std::addressof(info), std::addressof(meta), ctx, argument, flags, resource_limit)); - - /* Register NSOs with the RoManager. */ - { - /* Nintendo doesn't validate this get, but we do. */ - os::ProcessId process_id = os::GetProcessId(info.process_handle); - - /* Register new process. */ - const auto as_type = GetAddressSpaceType(std::addressof(meta)); - RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::AddressSpaceType_64Bit || as_type == Npdm::AddressSpaceType_64BitDeprecated); - - /* Register all NSOs. */ - for (int i = 0; i < ctx.nso_count; i++) { - RoManager::GetInstance().AddNso(pin_id, ctx.headers[i].module_id, info.nso_address[i], info.nso_size[i]); - } - } - - /* If we're overriding for HBL, perform HTML document redirection. */ - if (override_status.IsHbl()) { - /* Don't validate result, failure is okay. */ - RedirectHtmlDocumentPathForHbl(loc); - } - - /* Clear the external code for the program. */ - fssystem::DestroyExternalCode(loc.program_id); - - /* Note that we've created the program. */ - SetLaunchedBootProgram(loc.program_id); - - /* Move the process handle to output. */ - *out = info.process_handle; - - R_SUCCEED(); - } - - Result GetProgramInfo(ProgramInfo *out, cfg::OverrideStatus *out_status, const ncm::ProgramLocation &loc, const char *path, const ldr::ProgramAttributes &attrs) { - Meta meta; - - /* Load Meta. */ - { - AMS_UNUSED(path); - - ScopedCodeMountForCode mount(loc, attrs); - R_TRY(mount.GetResult()); - R_TRY(LoadMeta(std::addressof(meta), loc, mount.GetOverrideStatus(), attrs.platform, false)); - if (out_status != nullptr) { - *out_status = mount.GetOverrideStatus(); - } - } - - return GetProgramInfoFromMeta(out, std::addressof(meta)); - } - - Result PinProgram(PinId *out_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status) { - R_UNLESS(RoManager::GetInstance().Allocate(out_id, loc, override_status), ldr::ResultMaxProcess()); - R_SUCCEED(); - } - - Result UnpinProgram(PinId id) { - R_UNLESS(RoManager::GetInstance().Free(id), ldr::ResultNotPinned()); - R_SUCCEED(); - } - - Result GetProcessModuleInfo(u32 *out_count, ldr::ModuleInfo *out, size_t max_out_count, os::ProcessId process_id) { - R_UNLESS(RoManager::GetInstance().GetProcessModuleInfo(out_count, out, max_out_count, process_id), ldr::ResultNotPinned()); - R_SUCCEED(); - } - - Result GetProgramLocationAndOverrideStatusFromPinId(ncm::ProgramLocation *out, cfg::OverrideStatus *out_status, PinId pin_id) { - R_UNLESS(RoManager::GetInstance().GetProgramLocationAndStatus(out, out_status, pin_id), ldr::ResultNotPinned()); - R_SUCCEED(); - } - -} From c78010a1e5f4175f2c0537a4656237f36469e2d2 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 29 Sep 2026 20:17:17 +0200 Subject: [PATCH 147/205] hoc-clk: fix config low t8 typo --- Source/hoc-clk/common/include/hocclk/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 7581a5e3..3bc27fa4 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -399,7 +399,7 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_low_t7_tWTR: return pretty ? "Low T7 - tWTR" : "low_t7_tWTR"; case KipConfigValue_low_t8_tREFI: - return pretty ? "Low T8 - tREFI" : "low_t7_tREFI"; + return pretty ? "Low T8 - tREFI" : "low_t8_tREFI"; case KipConfigValue_read_latency_1333: return pretty ? "1333 Read Latency" : "read_latency_1333"; From 8953cedd504d0e9b401781b5eb1d45192713dfa1 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 29 Sep 2026 19:28:07 -0400 Subject: [PATCH 148/205] add wip erista vmax --- .../loader/source/oc/customize.cpp | 1 + .../loader/source/oc/customize.hpp | 3 +- .../loader/source/oc/oc_common.hpp | 1 + .../source/oc/pcv/erista/pcv_erista.cpp | 3 +- .../source/oc/pcv/erista/pcv_erista_gpu.cpp | 44 ++++++++++++++++--- .../source/oc/pcv/erista/pcv_erista_gpu.hpp | 22 ++++++++-- .../stratosphere/loader/source/oc/pcv/pcv.cpp | 1 + Source/hoc-clk/common/include/hocclk/config.h | 4 ++ .../src/ui/gui/config_info_strings.cpp | 6 +++ .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 8 ++-- Source/hoc-clk/sysmodule/src/file/kip.cpp | 3 ++ Source/hoc-clk/sysmodule/src/file/kip.hpp | 7 +++ 12 files changed, 86 insertions(+), 17 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 423ee84f..1b9f7748 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -115,6 +115,7 @@ volatile CustomizeTable C = { .eristaGpuUV = 0, .eristaGpuVmin = 810, +.eristaGpuVmax = 1050, /* unused for now*/ .marikoGpuUV = 2, /* Vmin past 795mV won't work due boot voltage being 800mV. */ diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index e5e9051e..c66e581b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -118,7 +118,8 @@ struct CustomizeTable { u32 eristaGpuUV; u32 eristaGpuVmin; - + u32 eristaGpuVmax; + u32 marikoGpuUV; u32 marikoGpuVmin; u32 marikoGpuVmax; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index cb360cdb..1228fb72 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -93,6 +93,7 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(HookUnavailable, 1030); R_DEFINE_ERROR_RESULT(InvalidNvsrvDevTable, 1031); R_DEFINE_ERROR_RESULT(InvalidForceVerbosityPattern, 1032); + R_DEFINE_ERROR_RESULT(InvalidGpuRgltrPattern, 1033); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp index 742776cb..57b61eda 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp @@ -60,10 +60,11 @@ namespace ams::ldr::hoc::pcv::erista { {"CPU Volt Dfll", &CpuVoltDfll, 1, nullptr, CpuTune0Low }, {"GPU Volt DVFS", &GpuVoltDVFS, 1, nullptr, GpuVminOfficial }, {"GPU Volt Thermals", &GpuVoltThermals, 1, nullptr, GpuVminOfficial }, + // {"GPU Rgltr Max Vlt", &GpuRgltrMax, 2, nullptr, MaxGpuRgltrVolt }, {"GPU Freq Table", GpuFreqCvbTable, 1, nullptr, GpuCvbDefaultMaxFreq }, {"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn }, {"GPU PLL Max", &GpuFreqPllMax, 1, nullptr, GpuClkPllMax }, - // {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit }, + {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit }, {"MEM Table Asm", &MemMtcTableAsm, 4, &MemMtcGetGetTablePatternFn }, {"MEM Freq Mtc", &MemFreqMtcTable, 1, nullptr, EmcClkOSLimit }, {"MEM Freq Max", &MemFreqMax, 0, nullptr, EmcClkOSLimit }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp index bb17e547..affa9b72 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp @@ -34,6 +34,10 @@ namespace ams::ldr::hoc::pcv::erista { PATCH_OFFSET(ptr, C.eristaGpuVmin); } + // if(C.eristaGpuVmax) { + // PATCH_OFFSET(ptr + 1, C.eristaGpuVmax); + // } + R_SUCCEED(); } @@ -50,6 +54,15 @@ namespace ams::ldr::hoc::pcv::erista { PATCH_OFFSET(ptr + 12, C.eristaGpuVmin); } + // if(C.eristaGpuVmax) { + // PATCH_OFFSET(ptr - 2, C.eristaGpuVmax); + // PATCH_OFFSET(ptr + 1, C.eristaGpuVmax); + // PATCH_OFFSET(ptr + 4, C.eristaGpuVmax); + // PATCH_OFFSET(ptr + 7, C.eristaGpuVmax); + // PATCH_OFFSET(ptr + 10, C.eristaGpuVmax); + // PATCH_OFFSET(ptr + 13, C.eristaGpuVmax); + // } + R_SUCCEED(); } @@ -107,17 +120,34 @@ namespace ams::ldr::hoc::pcv::erista { R_SUCCEED(); } - // patch out 1305MHz limit on erista, don't use this! - // Result GpuFreqPllLimit(u32 *ptr) { - // u32 prev_freq = *(ptr - 1); + /* Not strictly needed but there for completeness. Table will limit far before this */ + Result GpuFreqPllLimit(u32 *ptr) { + u32 prev_freq = *(ptr - 1); - // if (prev_freq != 128000 && prev_freq != 1300000 && prev_freq != 76800) { - // R_THROW(ldr::ResultInvalidGpuPllEntry()); + if (prev_freq != 128000 && prev_freq != 1300000 && prev_freq != 76800) { + R_THROW(ldr::ResultInvalidGpuPllEntry()); + } + + PATCH_OFFSET(ptr, 3600000); + + R_SUCCEED(); + } + + // Result GpuRgltrMax(u32* ptr) { + // /* Confirm that we are in the correct struct */ + // if (std::memcmp(ptr - 5, GpuRgltrVoltPattern, sizeof(GpuRgltrVoltPattern))) { + // R_THROW(ldr::ResultInvalidGpuRgltrPattern()); // } - // PATCH_OFFSET(ptr, 3600000); + // /* Ensure that the max voltage is actually present before patching it */ + // if(C.eristaGpuVmax) { + // /* Rgltr Vmax is in uV for some reason? */ + // PATCH_OFFSET(ptr, C.eristaGpuVmax * 1000); + // } else { + // /* Lower the default max for safety */ + // PATCH_OFFSET(ptr, MaxGoodGpuRgltrVolt); + // } // R_SUCCEED(); // } - } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp index 9decf0db..009bdf8d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp @@ -71,12 +71,26 @@ namespace ams::ldr::hoc::pcv::erista { { }, }; + // constexpr u32 MaxGpuRgltrVolt = 1150'000; // 1.15V + // constexpr u32 MaxGoodGpuRgltrVolt = 1050'000; // NVIDIA rating + + // // 0x20 byte struct (8xu32), RgltrEntry. TODO: determine what the other values are + // inline constexpr u32 GpuRgltrVoltPattern[] = { + // 0x2, // unknown, -5 + // 0x0, // padding + // 6250, // Step + // 0x0, // padding + // 618750, // Min volt? + // 1150000, // max volt, anchor + // 0x0, // padding + // 1000000, // unknown + // }; + // static_assert(sizeof(GpuRgltrVoltPattern) == (sizeof(u32) * 8), "Invalid GpuRgltrVoltPattern"); + Result GpuVoltDVFS(u32 *ptr); Result GpuVoltThermals(u32 *ptr); Result GpuFreqMaxAsm(u32 *ptr32); Result GpuFreqPllMax(u32 *ptr); - - // patch out 1305MHz limit on erista, don't use this! - // Result GpuFreqPllLimit(u32 *ptr); - + Result GpuFreqPllLimit(u32 *ptr); + // Result GpuRgltrMax(u32* ptr); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index bd35f3bd..56c408e4 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -161,6 +161,7 @@ namespace ams::ldr::hoc::pcv { { eristaGpuDvfsMaxFreq, 768'000, 1152'000, panic::Gpu, }, { marikoGpuDvfsMaxFreq, 768'000, 1574'400, panic::Gpu, }, { C.marikoGpuVmax, 800, 995, panic::Gpu, }, /* Official GPU vMax is 1050mV */ + { C.eristaGpuVmax, 800, 1050, panic::Gpu }, }; for (auto &v : validators) { diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 3bc27fa4..576f8a06 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -139,6 +139,7 @@ typedef enum { KipConfigValue_eristaGpuUV, KipConfigValue_eristaGpuVmin, + KipConfigValue_eristaGpuVmax, KipConfigValue_marikoGpuUV, KipConfigValue_marikoGpuVmin, @@ -456,6 +457,8 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr return pretty ? "Erista GPU Undervolt" : "erista_gpu_uv"; case KipConfigValue_eristaGpuVmin: return pretty ? "Erista GPU Vmin" : "erista_gpu_vmin"; + case KipConfigValue_eristaGpuVmax: + return pretty ? "Erista GPU Vmax" : "erista_gpu_vmax"; // GPU – Mariko case KipConfigValue_marikoGpuUV: @@ -707,6 +710,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_marikoCpuMaxClock: case KipConfigValue_eristaGpuUV: case KipConfigValue_eristaGpuVmin: + case KipConfigValue_eristaGpuVmax: case KipConfigValue_marikoGpuUV: case KipConfigValue_marikoGpuVmin: case KipConfigValue_marikoGpuVmax: diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 51abe481..506959d8 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -538,6 +538,12 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 810 mV (812mV as erista is stepped by 6.5mV instead of 5mV)" }; + case KipConfigValue_eristaGpuVmax: + return { + "Maximum GPU voltage", + "Default: 1050mV" + }; + case KipConfigValue_commonGpuVoltOffset: return { "The offset added/subtracted to all GPU voltages marked as \"auto\"", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 2d433860..7ab4fe6f 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2570,6 +2570,8 @@ class GpuSubmenuGui : public MiscGui { {}, gpuUvConfE, false, true); addConfigButton(KipConfigValue_eristaGpuVmin, "GPU Minimum Voltage", ValueRange(675, 875, 5, "mV", 1), "GPU Minimum Voltage", &thresholdsDisabled, {}, {}, false, true); + // addConfigButton(KipConfigValue_eristaGpuVmax, "GPU Maximum Voltage", ValueRange(800, 1050, 5, "mV", 1), "GPU Maximum Voltage", + // &thresholdsDisabled, {}, {}, false, true); } else { addConfigButton(KipConfigValue_marikoGpuUV, "GPU Undervolt Table", ValueRange(0, 1, 1, "", 1), "GPU Undervolt Table", &thresholdsDisabled, {}, gpuUvConfM, false, true); @@ -2590,10 +2592,8 @@ class GpuSubmenuGui : public MiscGui { addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, false, true); ValueThresholds MgpuVmaxThresholds(805, 850); - if(IsMariko()) { - addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 995, 5, "mV", 1), "GPU Maximum Voltage", - &MgpuVmaxThresholds, {}, {}, false, true); - } + addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 995, 5, "mV", 1), "GPU Maximum Voltage", + &MgpuVmaxThresholds, {}, {}, false, true); } std::vector gpuOffset = { diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 17277af6..337e64fa 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -124,6 +124,7 @@ namespace file::kip { CUST_WRITE_FIELD_BATCH(&table, eristaGpuUV, file::config::GetConfigValue(KipConfigValue_eristaGpuUV)); CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmin, file::config::GetConfigValue(KipConfigValue_eristaGpuVmin)); + CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmax, file::config::GetConfigValue(KipConfigValue_eristaGpuVmax)); CUST_WRITE_FIELD_BATCH(&table, marikoGpuUV, file::config::GetConfigValue(KipConfigValue_marikoGpuUV)); CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmin, file::config::GetConfigValue(KipConfigValue_marikoGpuVmin)); @@ -322,6 +323,8 @@ namespace file::kip { configValues.values[KipConfigValue_eristaGpuUV] = cust_get_erista_gpu_uv(&table); configValues.values[KipConfigValue_eristaGpuVmin] = cust_get_erista_gpu_vmin(&table); + configValues.values[KipConfigValue_eristaGpuVmax] = cust_get_erista_gpu_vmax(&table); + configValues.values[KipConfigValue_marikoGpuUV] = cust_get_mariko_gpu_uv(&table); configValues.values[KipConfigValue_marikoGpuVmin] = cust_get_mariko_gpu_vmin(&table); configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table); diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 9c692cfe..14caefec 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -86,6 +86,7 @@ namespace file::kip { u32 eristaGpuUV; u32 eristaGpuVmin; + u32 eristaGpuVmax; u32 marikoGpuUV; u32 marikoGpuVmin; @@ -364,6 +365,9 @@ namespace file::kip { static inline bool cust_set_erista_gpu_vmin(const char *p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuVmin, v); } + static inline bool cust_set_erista_gpu_vmax(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaGpuVmax, v); + } static inline bool cust_set_mariko_gpu_uv(const char *p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuUV, v); } @@ -581,6 +585,9 @@ namespace file::kip { static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable *t) { return CUST_GET_FIELD(t, eristaGpuVmin); } + static inline u32 cust_get_erista_gpu_vmax(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaGpuVmax); + } static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable *t) { return CUST_GET_FIELD(t, marikoGpuUV); } From ee18a8242423c38ebdd8971942b541794f8ddedf Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 29 Sep 2026 20:31:44 -0400 Subject: [PATCH 149/205] Revert "add wip erista vmax" This reverts commit 8953cedd504d0e9b401781b5eb1d45192713dfa1. --- .../loader/source/oc/customize.cpp | 1 - .../loader/source/oc/customize.hpp | 3 +- .../loader/source/oc/oc_common.hpp | 1 - .../source/oc/pcv/erista/pcv_erista.cpp | 3 +- .../source/oc/pcv/erista/pcv_erista_gpu.cpp | 44 +++---------------- .../source/oc/pcv/erista/pcv_erista_gpu.hpp | 22 ++-------- .../stratosphere/loader/source/oc/pcv/pcv.cpp | 1 - Source/hoc-clk/common/include/hocclk/config.h | 4 -- .../src/ui/gui/config_info_strings.cpp | 6 --- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 8 ++-- Source/hoc-clk/sysmodule/src/file/kip.cpp | 3 -- Source/hoc-clk/sysmodule/src/file/kip.hpp | 7 --- 12 files changed, 17 insertions(+), 86 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 1b9f7748..423ee84f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -115,7 +115,6 @@ volatile CustomizeTable C = { .eristaGpuUV = 0, .eristaGpuVmin = 810, -.eristaGpuVmax = 1050, /* unused for now*/ .marikoGpuUV = 2, /* Vmin past 795mV won't work due boot voltage being 800mV. */ diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index c66e581b..e5e9051e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -118,8 +118,7 @@ struct CustomizeTable { u32 eristaGpuUV; u32 eristaGpuVmin; - u32 eristaGpuVmax; - + u32 marikoGpuUV; u32 marikoGpuVmin; u32 marikoGpuVmax; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 1228fb72..cb360cdb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -93,7 +93,6 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(HookUnavailable, 1030); R_DEFINE_ERROR_RESULT(InvalidNvsrvDevTable, 1031); R_DEFINE_ERROR_RESULT(InvalidForceVerbosityPattern, 1032); - R_DEFINE_ERROR_RESULT(InvalidGpuRgltrPattern, 1033); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp index 57b61eda..742776cb 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista.cpp @@ -60,11 +60,10 @@ namespace ams::ldr::hoc::pcv::erista { {"CPU Volt Dfll", &CpuVoltDfll, 1, nullptr, CpuTune0Low }, {"GPU Volt DVFS", &GpuVoltDVFS, 1, nullptr, GpuVminOfficial }, {"GPU Volt Thermals", &GpuVoltThermals, 1, nullptr, GpuVminOfficial }, - // {"GPU Rgltr Max Vlt", &GpuRgltrMax, 2, nullptr, MaxGpuRgltrVolt }, {"GPU Freq Table", GpuFreqCvbTable, 1, nullptr, GpuCvbDefaultMaxFreq }, {"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn }, {"GPU PLL Max", &GpuFreqPllMax, 1, nullptr, GpuClkPllMax }, - {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit }, + // {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit }, {"MEM Table Asm", &MemMtcTableAsm, 4, &MemMtcGetGetTablePatternFn }, {"MEM Freq Mtc", &MemFreqMtcTable, 1, nullptr, EmcClkOSLimit }, {"MEM Freq Max", &MemFreqMax, 0, nullptr, EmcClkOSLimit }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp index affa9b72..bb17e547 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.cpp @@ -34,10 +34,6 @@ namespace ams::ldr::hoc::pcv::erista { PATCH_OFFSET(ptr, C.eristaGpuVmin); } - // if(C.eristaGpuVmax) { - // PATCH_OFFSET(ptr + 1, C.eristaGpuVmax); - // } - R_SUCCEED(); } @@ -54,15 +50,6 @@ namespace ams::ldr::hoc::pcv::erista { PATCH_OFFSET(ptr + 12, C.eristaGpuVmin); } - // if(C.eristaGpuVmax) { - // PATCH_OFFSET(ptr - 2, C.eristaGpuVmax); - // PATCH_OFFSET(ptr + 1, C.eristaGpuVmax); - // PATCH_OFFSET(ptr + 4, C.eristaGpuVmax); - // PATCH_OFFSET(ptr + 7, C.eristaGpuVmax); - // PATCH_OFFSET(ptr + 10, C.eristaGpuVmax); - // PATCH_OFFSET(ptr + 13, C.eristaGpuVmax); - // } - R_SUCCEED(); } @@ -120,34 +107,17 @@ namespace ams::ldr::hoc::pcv::erista { R_SUCCEED(); } - /* Not strictly needed but there for completeness. Table will limit far before this */ - Result GpuFreqPllLimit(u32 *ptr) { - u32 prev_freq = *(ptr - 1); + // patch out 1305MHz limit on erista, don't use this! + // Result GpuFreqPllLimit(u32 *ptr) { + // u32 prev_freq = *(ptr - 1); - if (prev_freq != 128000 && prev_freq != 1300000 && prev_freq != 76800) { - R_THROW(ldr::ResultInvalidGpuPllEntry()); - } - - PATCH_OFFSET(ptr, 3600000); - - R_SUCCEED(); - } - - // Result GpuRgltrMax(u32* ptr) { - // /* Confirm that we are in the correct struct */ - // if (std::memcmp(ptr - 5, GpuRgltrVoltPattern, sizeof(GpuRgltrVoltPattern))) { - // R_THROW(ldr::ResultInvalidGpuRgltrPattern()); + // if (prev_freq != 128000 && prev_freq != 1300000 && prev_freq != 76800) { + // R_THROW(ldr::ResultInvalidGpuPllEntry()); // } - // /* Ensure that the max voltage is actually present before patching it */ - // if(C.eristaGpuVmax) { - // /* Rgltr Vmax is in uV for some reason? */ - // PATCH_OFFSET(ptr, C.eristaGpuVmax * 1000); - // } else { - // /* Lower the default max for safety */ - // PATCH_OFFSET(ptr, MaxGoodGpuRgltrVolt); - // } + // PATCH_OFFSET(ptr, 3600000); // R_SUCCEED(); // } + } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp index 009bdf8d..9decf0db 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/pcv_erista_gpu.hpp @@ -71,26 +71,12 @@ namespace ams::ldr::hoc::pcv::erista { { }, }; - // constexpr u32 MaxGpuRgltrVolt = 1150'000; // 1.15V - // constexpr u32 MaxGoodGpuRgltrVolt = 1050'000; // NVIDIA rating - - // // 0x20 byte struct (8xu32), RgltrEntry. TODO: determine what the other values are - // inline constexpr u32 GpuRgltrVoltPattern[] = { - // 0x2, // unknown, -5 - // 0x0, // padding - // 6250, // Step - // 0x0, // padding - // 618750, // Min volt? - // 1150000, // max volt, anchor - // 0x0, // padding - // 1000000, // unknown - // }; - // static_assert(sizeof(GpuRgltrVoltPattern) == (sizeof(u32) * 8), "Invalid GpuRgltrVoltPattern"); - Result GpuVoltDVFS(u32 *ptr); Result GpuVoltThermals(u32 *ptr); Result GpuFreqMaxAsm(u32 *ptr32); Result GpuFreqPllMax(u32 *ptr); - Result GpuFreqPllLimit(u32 *ptr); - // Result GpuRgltrMax(u32* ptr); + + // patch out 1305MHz limit on erista, don't use this! + // Result GpuFreqPllLimit(u32 *ptr); + } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index 56c408e4..bd35f3bd 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -161,7 +161,6 @@ namespace ams::ldr::hoc::pcv { { eristaGpuDvfsMaxFreq, 768'000, 1152'000, panic::Gpu, }, { marikoGpuDvfsMaxFreq, 768'000, 1574'400, panic::Gpu, }, { C.marikoGpuVmax, 800, 995, panic::Gpu, }, /* Official GPU vMax is 1050mV */ - { C.eristaGpuVmax, 800, 1050, panic::Gpu }, }; for (auto &v : validators) { diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 576f8a06..3bc27fa4 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -139,7 +139,6 @@ typedef enum { KipConfigValue_eristaGpuUV, KipConfigValue_eristaGpuVmin, - KipConfigValue_eristaGpuVmax, KipConfigValue_marikoGpuUV, KipConfigValue_marikoGpuVmin, @@ -457,8 +456,6 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr return pretty ? "Erista GPU Undervolt" : "erista_gpu_uv"; case KipConfigValue_eristaGpuVmin: return pretty ? "Erista GPU Vmin" : "erista_gpu_vmin"; - case KipConfigValue_eristaGpuVmax: - return pretty ? "Erista GPU Vmax" : "erista_gpu_vmax"; // GPU – Mariko case KipConfigValue_marikoGpuUV: @@ -710,7 +707,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_marikoCpuMaxClock: case KipConfigValue_eristaGpuUV: case KipConfigValue_eristaGpuVmin: - case KipConfigValue_eristaGpuVmax: case KipConfigValue_marikoGpuUV: case KipConfigValue_marikoGpuVmin: case KipConfigValue_marikoGpuVmax: diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 506959d8..51abe481 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -538,12 +538,6 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 810 mV (812mV as erista is stepped by 6.5mV instead of 5mV)" }; - case KipConfigValue_eristaGpuVmax: - return { - "Maximum GPU voltage", - "Default: 1050mV" - }; - case KipConfigValue_commonGpuVoltOffset: return { "The offset added/subtracted to all GPU voltages marked as \"auto\"", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 7ab4fe6f..2d433860 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2570,8 +2570,6 @@ class GpuSubmenuGui : public MiscGui { {}, gpuUvConfE, false, true); addConfigButton(KipConfigValue_eristaGpuVmin, "GPU Minimum Voltage", ValueRange(675, 875, 5, "mV", 1), "GPU Minimum Voltage", &thresholdsDisabled, {}, {}, false, true); - // addConfigButton(KipConfigValue_eristaGpuVmax, "GPU Maximum Voltage", ValueRange(800, 1050, 5, "mV", 1), "GPU Maximum Voltage", - // &thresholdsDisabled, {}, {}, false, true); } else { addConfigButton(KipConfigValue_marikoGpuUV, "GPU Undervolt Table", ValueRange(0, 1, 1, "", 1), "GPU Undervolt Table", &thresholdsDisabled, {}, gpuUvConfM, false, true); @@ -2592,8 +2590,10 @@ class GpuSubmenuGui : public MiscGui { addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, false, true); ValueThresholds MgpuVmaxThresholds(805, 850); - addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 995, 5, "mV", 1), "GPU Maximum Voltage", - &MgpuVmaxThresholds, {}, {}, false, true); + if(IsMariko()) { + addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 995, 5, "mV", 1), "GPU Maximum Voltage", + &MgpuVmaxThresholds, {}, {}, false, true); + } } std::vector gpuOffset = { diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 337e64fa..17277af6 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -124,7 +124,6 @@ namespace file::kip { CUST_WRITE_FIELD_BATCH(&table, eristaGpuUV, file::config::GetConfigValue(KipConfigValue_eristaGpuUV)); CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmin, file::config::GetConfigValue(KipConfigValue_eristaGpuVmin)); - CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmax, file::config::GetConfigValue(KipConfigValue_eristaGpuVmax)); CUST_WRITE_FIELD_BATCH(&table, marikoGpuUV, file::config::GetConfigValue(KipConfigValue_marikoGpuUV)); CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmin, file::config::GetConfigValue(KipConfigValue_marikoGpuVmin)); @@ -323,8 +322,6 @@ namespace file::kip { configValues.values[KipConfigValue_eristaGpuUV] = cust_get_erista_gpu_uv(&table); configValues.values[KipConfigValue_eristaGpuVmin] = cust_get_erista_gpu_vmin(&table); - configValues.values[KipConfigValue_eristaGpuVmax] = cust_get_erista_gpu_vmax(&table); - configValues.values[KipConfigValue_marikoGpuUV] = cust_get_mariko_gpu_uv(&table); configValues.values[KipConfigValue_marikoGpuVmin] = cust_get_mariko_gpu_vmin(&table); configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table); diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 14caefec..9c692cfe 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -86,7 +86,6 @@ namespace file::kip { u32 eristaGpuUV; u32 eristaGpuVmin; - u32 eristaGpuVmax; u32 marikoGpuUV; u32 marikoGpuVmin; @@ -365,9 +364,6 @@ namespace file::kip { static inline bool cust_set_erista_gpu_vmin(const char *p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuVmin, v); } - static inline bool cust_set_erista_gpu_vmax(const char *p, u32 v) { - CUST_WRITE_FIELD(p, eristaGpuVmax, v); - } static inline bool cust_set_mariko_gpu_uv(const char *p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuUV, v); } @@ -585,9 +581,6 @@ namespace file::kip { static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable *t) { return CUST_GET_FIELD(t, eristaGpuVmin); } - static inline u32 cust_get_erista_gpu_vmax(const CustomizeTable *t) { - return CUST_GET_FIELD(t, eristaGpuVmax); - } static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable *t) { return CUST_GET_FIELD(t, marikoGpuUV); } From 119a9a6ea4c2be5917909d6a8252c3f06f3eeb7f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 29 Sep 2026 20:33:04 -0400 Subject: [PATCH 150/205] soctherm: workaround TSOSC potential hw bug --- .../sysmodule/src/tsensor/soctherm.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index 26a1b43d..b483e8cf 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -24,6 +24,7 @@ #include #include "../board/board.hpp" +#include "../board/board_volt.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "soctherm.hpp" @@ -480,8 +481,32 @@ namespace tsensor { if (!IsSensorEnabled()) { StartSensors(); + } + + /* Workaround for potential HW bug */ + /* Refer to TRM 40.3.1.3 TSOSC Vmin limitations */ + /* Vmins estimated. TODO: find the correct ones via community testing */ + + /* Get the CPU voltage*/ + u32 cpuVoltage = board::GetVoltage(HocClkVoltage_CPU) / 1000; + + /* Infered from stock voltage. We know that below stock is unreliable */ + constexpr u32 kEristaTSOSCVmin = 825; + constexpr u32 kMarikoTSOSCVmin = 620; + + /* Get the correct vmin for the hardware type currently used */ + u32 TSOSCVmin = board::GetSocType() == HocClkSocType_Mariko ? kMarikoTSOSCVmin : kEristaTSOSCVmin; + + /* Mark the sensor as invalid so HW can recalibrate it */ + if(cpuVoltage >= TSOSCVmin) { + WriteReg(socthermVa, SENSOR_VALID, 1); + } else { + WriteReg(socthermVa, SENSOR_VALID, 0); } + /* Wait for HW recalibration */ + svcSleepThread(25'000); + temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK); From 82d3f2a93cbf1cf045e6860a0379074f09f4d044 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:01:21 +0200 Subject: [PATCH 151/205] benchmark-toolbox: make cpu readings *actually* match memtoolkit --- Source/Benchmark-Toolbox/source/bench.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Source/Benchmark-Toolbox/source/bench.c b/Source/Benchmark-Toolbox/source/bench.c index 36a492f7..ea5d5180 100644 --- a/Source/Benchmark-Toolbox/source/bench.c +++ b/Source/Benchmark-Toolbox/source/bench.c @@ -39,6 +39,7 @@ typedef struct { long size; int core; bool created; + uint64_t ticks; } bw_worker_t; typedef struct bw_pool { @@ -58,7 +59,9 @@ static void bw_worker_entry(void *arg) { bench_kernel_fn f = w->func; if (!f) break; + uint64_t t0 = armGetSystemTick(); f(w->dst, w->src, w->size); + w->ticks = armGetSystemTick() - t0; semaphoreSignal(&p->done); } } @@ -115,13 +118,14 @@ static double bw_run_once(bw_pool_t *p, bench_kernel_fn f, int64_t *dstbuf, int6 w->src = srcbuf + (size * i) / (long)sizeof(int64_t); w->size = size; } - uint64_t t0 = armGetSystemTick(); for (int i = 0; i < threads; i++) semaphoreSignal(&p->workers[i].start); for (int i = 0; i < threads; i++) semaphoreWait(&p->done); - uint64_t t1 = armGetSystemTick(); - return (double)armTicksToNs(t1 - t0) / 1000000000.0; + uint64_t sum = 0; + for (int i = 0; i < threads; i++) + sum += p->workers[i].ticks; + return (double)armTicksToNs(sum) / 1000000000.0 / threads; } #define BW_GPR_CLOBBERS \ @@ -201,14 +205,14 @@ static double gettime(void) { static double bandwidth_bench_helper(bw_pool_t *pool, int threads, int64_t *dstbuf, int64_t *srcbuf, long size, bench_kernel_fn f) { int i, loopcount, innerloopcount, n; - double t, speed, maxspeed, s, s0, s1, s2; + double t, speed, maxspeed; if (!pool || !pool->ok) return 0.; - s = s0 = s1 = s2 = 0.; maxspeed = 0.; for (n = 0; n < MAXREPEATS; n++) { + bw_run_once(pool, f, dstbuf, srcbuf, size); loopcount = 0; innerloopcount = 1; t = 0.; @@ -217,19 +221,11 @@ static double bandwidth_bench_helper(bw_pool_t *pool, int threads, int64_t *dstb for (i = 0; i < innerloopcount; i++) t += bw_run_once(pool, f, dstbuf, srcbuf, size); innerloopcount *= 2; - } while (t < 0.5); + } while (t < 0.25); speed = (double)size * threads * loopcount / t / 1000000.; - s0 += 1.; - s1 += speed; - s2 += speed * speed; if (speed > maxspeed) maxspeed = speed; - if (s0 > 2.) { - s = sqrt((s0 * s2 - s1 * s1) / (s0 * (s0 - 1))); - if (s < maxspeed / 1000.) - break; - } } return maxspeed; } From 5c097363c987a925854e7b9586b1e23085624012 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 3 Oct 2026 19:01:25 -0400 Subject: [PATCH 152/205] update build script and add AMS 1.12.x patches --- COMPILING.md | 2 + .../loader/source/ldr_process_creation.cpp | 173 ++-- .../ldr_process_creation_1_12_0.cpp | 973 ++++++++++++++++++ build.sh | 238 ++++- 4 files changed, 1255 insertions(+), 131 deletions(-) create mode 100644 Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp diff --git a/COMPILING.md b/COMPILING.md index 78b7331b..99a062e7 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -5,4 +5,6 @@ Horizon OC Compilation Instructions 3. Clone the Horizon OC develop branch (``git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules``) 4. Run ``./build.sh`` in the root directory - If you want to compile with extensions, append ``--ext`` + - To skip components, append ``-s``/``--skip`` followed by one or more of: ``ldr`` (loader), ``clk`` (hoc-clk), ``hek`` (hekate), ``btb`` (benchmark toolbox), ``exos`` (exosphere), ``sm`` (status-monitor download), ``zip`` (dist.zip packaging). Example: ``./build.sh --ext -s ldr hek`` + - Building the custom Hekate (``--ext`` without skipping ``hek``) additionally requires devkitARM with ``DEVKITARM`` exported - Installing ``ccache`` is optional; if it is on your PATH it is used automatically to speed up rebuilds diff --git a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp index a4d90b00..fd96684e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp @@ -13,6 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #include #include "ldr_capabilities.hpp" #include "ldr_content_management.hpp" @@ -121,14 +122,12 @@ namespace ams::ldr { /* Global NSO header cache. */ NsoHeader g_nso_headers[Nso_Count]; - /* Pcv/Ptm/NvServices check cache */ + /* Pcv/Ptm check cache */ bool g_is_pcv; bool g_is_ptm; - bool g_is_nvsrv; /* Global Zstd decompression context. */ - constexpr size_t ZstdDctxWorkspaceSize = 0x176E8; - alignas(8) u8 g_zstd_dctx_workspace[ZstdDctxWorkspaceSize]; + alignas(8) u8 g_zstd_dctx_workspace[util::DecompressZstdWithBicWorkBufferSizeDefault]; Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) { /* No version verification is done before 8.1.0. */ @@ -182,8 +181,8 @@ namespace ams::ldr { return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; } - Npdm::AddressSpaceType GetAddressSpaceType(const Meta *meta) { - return static_cast((meta->npdm->flags & Npdm::MetaFlag_AddressSpaceTypeMask) >> Npdm::MetaFlag_AddressSpaceTypeShift); + Npdm::ProcessAddressSpace GetProcessAddressSpace(const Meta *meta) { + return static_cast((meta->npdm->flags0 & Npdm::MetaFlag0_ProcessAddressSpaceMask) >> Npdm::MetaFlag0_ProcessAddressSpaceShift); } Acid::PoolPartition GetPoolPartition(const Meta *meta) { @@ -226,7 +225,7 @@ namespace ams::ldr { /* Read NSO header. */ size_t read_size; R_TRY(fs::ReadFile(std::addressof(read_size), file, 0, g_nso_headers + ctx.nso_count, sizeof(NsoHeader))); - R_UNLESS(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso()); + R_UNLESS_LOG(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso(), "[ldr] NSO header truncated!\n"); /* Note nso is present. */ switch (i) { @@ -265,7 +264,7 @@ namespace ams::ldr { Result CheckAutoLoad(const AutoLoadModuleContext &ctx, u32 acid_flags) { /* We must always have a main. */ - R_UNLESS(ctx.ali.has_main, ldr::ResultInvalidNso()); + R_UNLESS_LOG(ctx.ali.has_main, ldr::ResultInvalidNso(), "[ldr] Missing main!\n"); /* Validate flags and extents for all present NSOs. */ for (int i = 0; i < ctx.nso_count; ++i) { @@ -273,11 +272,11 @@ namespace ams::ldr { /* All NSOs must not be --X. */ /* This is "probably" not checked on Ounce? */ - R_UNLESS((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso()); + R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] --x not allowed!\n", i); /* Zstd compression only allowed on main, and only when both rtld+sdk are present. */ if (i != ctx.main_nso_idx || ctx.rtld_idx < 0 || ctx.sdk_nso_idx < 0) { - R_UNLESS((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso()); + R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] zbic not allowed!\n", i); } /* NSOs must have page-aligned segments. */ @@ -300,13 +299,13 @@ namespace ams::ldr { const bool has_browser_dll = (acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) != 0; if (ctx.ali.has_rtld || ctx.ali.has_sdk) { /* If we have sdk we must have rtld. */ - R_UNLESS(ctx.ali.has_rtld, ldr::ResultInvalidNso()); + R_UNLESS_LOG(ctx.ali.has_rtld, ldr::ResultInvalidNso(), "[ldr] Missing rtld!\n"); /* If we have rtld, we must not have browser core dll. */ - R_UNLESS(!has_browser_dll, ldr::ResultInvalidNso()); + R_UNLESS_LOG(!has_browser_dll, ldr::ResultInvalidNso(), "[ldr] BrowserCoreDll must not be present!\n"); } else { /* We must not have both subsdk and browser dll. */ - R_UNLESS(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso()); + R_UNLESS_LOG(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso(), "[ldr] Can't have both subsdk and BrowserCoreDll!\n"); } R_SUCCEED(); @@ -380,7 +379,6 @@ namespace ams::ldr { /* Check if NCA is PCV or PTM */ g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; - g_is_nvsrv = meta->aci->program_id == ncm::SystemProgramId::NvServices; /* If we have data to validate, validate it. */ if (meta->check_verification_data) { @@ -396,6 +394,8 @@ namespace ams::ldr { /* If the signature check fails, we need to check if this is allowable. */ if (!is_signature_valid) { + AMS_LOG("[ldr] invalid signature!\n"); + /* We have to enforce signature checks on prod and when we have a signature to check on dev. */ R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature()); R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature()); @@ -409,52 +409,56 @@ namespace ams::ldr { R_SUCCEED(); } - Result GetCreateProcessFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { - const u8 meta_flags = meta->npdm->flags; + Result GetCreateProcessParameterFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { + const u8 meta_flags0 = meta->npdm->flags0; + const u8 meta_flags1 = meta->npdm->flags1; u32 flags = 0; /* Set Is64Bit. */ - if (meta_flags & Npdm::MetaFlag_Is64Bit) { - flags |= svc::CreateProcessFlag_Is64Bit; + if (meta_flags0 & Npdm::MetaFlag0_Is64BitInstruction) { + flags |= svc::CreateProcessParameterFlag_64Bit; } - /* Set AddressSpaceType. */ - switch (GetAddressSpaceType(meta)) { - case Npdm::AddressSpaceType_32Bit: - flags |= svc::CreateProcessFlag_AddressSpace32Bit; + /* Set ProcessAddressSpace. */ + switch (GetProcessAddressSpace(meta)) { + case Npdm::ProcessAddressSpace_32Bit: + flags |= svc::CreateProcessParameterFlag_AddressSpace32Bit; break; - case Npdm::AddressSpaceType_64BitDeprecated: - flags |= svc::CreateProcessFlag_AddressSpace64BitDeprecated; + case Npdm::ProcessAddressSpace_64Bit36: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit36; break; - case Npdm::AddressSpaceType_32BitWithoutAlias: - flags |= svc::CreateProcessFlag_AddressSpace32BitWithoutAlias; + case Npdm::ProcessAddressSpace_32BitNoReserved: + flags |= svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved; break; - case Npdm::AddressSpaceType_64Bit: - flags |= svc::CreateProcessFlag_AddressSpace64Bit; + case Npdm::ProcessAddressSpace_64Bit39: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit39; + break; + case Npdm::ProcessAddressSpace_64Bit42: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit42; break; default: R_THROW(ldr::ResultInvalidMeta()); } /* Set Enable Debug. */ - if (ldr_flags & CreateProcessFlag_EnableDebug) { - flags |= svc::CreateProcessFlag_EnableDebug; + if (ldr_flags & CreateProcessParameterFlag_EnableJitDebug) { + flags |= svc::CreateProcessParameterFlag_EnableJitDebug; } /* Set Enable ASLR. */ - if (!(ldr_flags & CreateProcessFlag_DisableAslr)) { - flags |= svc::CreateProcessFlag_EnableAslr; + if (!(ldr_flags & CreateProcessParameterFlag_DisableAslr)) { + flags |= svc::CreateProcessParameterFlag_EnableAslr; } /* Set Is Application. */ if (IsApplication(meta)) { - flags |= svc::CreateProcessFlag_IsApplication; + flags |= svc::CreateProcessParameterFlag_IsApplication; /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ if (hos::GetVersion() >= hos::Version_7_0_0) { - if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) { - flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation; + if (meta_flags0 & Npdm::MetaFlag0_OptimizeMemoryAllocation) { + flags |= svc::CreateProcessParameterFlag_OptimizeMemoryAllocation; } } } @@ -466,19 +470,19 @@ namespace ams::ldr { switch (GetPoolPartition(meta)) { case Acid::PoolPartition_Application: if (IsApplet(meta)) { - flags |= svc::CreateProcessFlag_PoolPartitionApplet; + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; } else { - flags |= svc::CreateProcessFlag_PoolPartitionApplication; + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplication; } break; case Acid::PoolPartition_Applet: - flags |= svc::CreateProcessFlag_PoolPartitionApplet; + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; break; case Acid::PoolPartition_System: - flags |= svc::CreateProcessFlag_PoolPartitionSystem; + flags |= svc::CreateProcessParameterFlag_PoolPartitionSystem; break; case Acid::PoolPartition_SystemNonSecure: - flags |= svc::CreateProcessFlag_PoolPartitionSystemNonSecure; + flags |= svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure; break; default: R_THROW(ldr::ResultInvalidMeta()); @@ -486,18 +490,23 @@ namespace ams::ldr { } else if (hos::GetVersion() >= hos::Version_4_0_0) { /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { - flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory; + flags |= svc::CreateProcessParameterFlag_DeprecatedUseSecureMemory; } } - /* 11.0.0+/meso Set Disable DAS merge. */ - if (meta_flags & Npdm::MetaFlag_DisableDeviceAddressSpaceMerge) { - flags |= svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; + /* 11.0.0+/meso Set Disable DAS Merge. */ + if (meta_flags0 & Npdm::MetaFlag0_DisableDeviceAddressSpaceMerge) { + flags |= svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge; } - /* 18.0.0+/meso Set Alias region extra size. */ - if (meta_flags & Npdm::MetaFlag_EnableAliasRegionExtraSize) { - flags |= svc::CreateProcessFlag_EnableAliasRegionExtraSize; + /* 18.0.0+/meso Set Enable Address Sanitizer . */ + if (meta_flags0 & Npdm::MetaFlag0_EnableAddressSanitizer) { + flags |= svc::CreateProcessParameterFlag_EnableAddressSanitizer; + } + + /* 23.0.0+/meso Set Enable Shadow Stack. */ + if (meta_flags1 & Npdm::MetaFlag1_EnableShadowStack) { + flags |= svc::CreateProcessParameterFlag_EnableShadowStack; } *out = flags; @@ -515,7 +524,7 @@ namespace ams::ldr { out->reslimit = resource_limit; /* Set flags. */ - R_TRY(GetCreateProcessFlags(std::addressof(out->flags), meta, flags)); + R_TRY(GetCreateProcessParameterFlags(std::addressof(out->flags), meta, flags)); /* 3.0.0+ System Resource Size. */ if (hos::GetVersion() >= hos::Version_3_0_0) { @@ -525,7 +534,7 @@ namespace ams::ldr { /* Validate system resource usage. */ if (meta->npdm->system_resource_size) { /* Process must be 64-bit. */ - R_UNLESS((out->flags & svc::CreateProcessFlag_AddressSpace64Bit), ldr::ResultInvalidMeta()); + R_UNLESS((out->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit39), ldr::ResultInvalidMeta()); /* Process must be application or applet. */ R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); @@ -598,25 +607,29 @@ namespace ams::ldr { uintptr_t aslr_start = 0; size_t aslr_size = 0; if (hos::GetVersion() >= hos::Version_2_0_0) { - switch (out_param->flags & svc::CreateProcessFlag_AddressSpaceMask) { - case svc::CreateProcessFlag_AddressSpace32Bit: - case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: + switch (out_param->flags & svc::CreateProcessParameterFlag_AddressSpaceMask) { + case svc::CreateProcessParameterFlag_AddressSpace32Bit: + case svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved: aslr_start = svc::AddressSmallMap32Start; aslr_size = svc::AddressSmallMap32Size; break; - case svc::CreateProcessFlag_AddressSpace64BitDeprecated: + case svc::CreateProcessParameterFlag_AddressSpace64Bit36: aslr_start = svc::AddressSmallMap36Start; aslr_size = svc::AddressSmallMap36Size; break; - case svc::CreateProcessFlag_AddressSpace64Bit: + case svc::CreateProcessParameterFlag_AddressSpace64Bit39: aslr_start = svc::AddressMap39Start; aslr_size = svc::AddressMap39Size; break; + case svc::CreateProcessParameterFlag_AddressSpace64Bit42: + aslr_start = svc::AddressMap42Start; + aslr_size = svc::AddressMap42Size; + break; AMS_UNREACHABLE_DEFAULT_CASE(); } } else { /* On 1.0.0, only 2 address space types existed. */ - if (out_param->flags & svc::CreateProcessFlag_AddressSpace64BitDeprecated) { + if (out_param->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit36) { aslr_start = svc::AddressSmallMap36Start; aslr_size = svc::AddressSmallMap36Size; } else { @@ -629,7 +642,7 @@ namespace ams::ldr { /* Set Create Process output. */ uintptr_t aslr_slide = 0; size_t free_size = (aslr_size - total_size); - if (out_param->flags & svc::CreateProcessFlag_EnableAslr) { + if (out_param->flags & svc::CreateProcessParameterFlag_EnableAslr) { aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; } @@ -651,10 +664,13 @@ namespace ams::ldr { R_SUCCEED(); } - Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zstd, uintptr_t map_base, uintptr_t map_end) { + Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zbic, uintptr_t map_base, uintptr_t map_end) { /* Select read size based on compression. */ size_t file_size = is_compressed ? compressed_size : segment_size; + AMS_LOG("[ldr] Loading segment @ 0x%016lx: compressed=%d, file_size=0x%08lx, compressed_size=0x%08lx, segment_size=0x%08lx\n", + map_base, is_compressed, file_size, compressed_size, segment_size); + /* Validate size. */ R_UNLESS(file_size <= segment_size, ldr::ResultInvalidNso()); R_UNLESS(file_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); @@ -664,19 +680,19 @@ namespace ams::ldr { uintptr_t load_address = is_compressed ? map_end - compressed_size : map_base; size_t read_size; R_TRY(fs::ReadFile(std::addressof(read_size), file, file_offset, reinterpret_cast(load_address), file_size)); - R_UNLESS(read_size == file_size, ldr::ResultInvalidNso()); + R_UNLESS_LOG(read_size == file_size, ldr::ResultInvalidNso(), "[ldr] Couldn't read segment from file!\n"); /* Uncompress if necessary. */ R_SUCCEED_IF(!is_compressed); auto compressed_data_buf = reinterpret_cast(load_address); - if (is_zstd) { - bool decompressed = util::DecompressZstdForLoader(reinterpret_cast(g_zstd_dctx_workspace), ZstdDctxWorkspaceSize, reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); - R_UNLESS(decompressed, ldr::ResultInvalidNso()); + if (is_zbic) { + bool decompressed = util::DecompressZstdWithBic(reinterpret_cast(g_zstd_dctx_workspace), sizeof(g_zstd_dctx_workspace), reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); + R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with zbic!\n"); } else { bool decompressed = (util::DecompressLZ4(reinterpret_cast(map_base), segment_size, compressed_data_buf, file_size) == static_cast(segment_size)); - R_UNLESS(decompressed, ldr::ResultInvalidNso()); + R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with lz4!\n"); } R_SUCCEED(); @@ -691,12 +707,12 @@ namespace ams::ldr { crypto::GenerateSha256(hash, sizeof(hash), reinterpret_cast(map_address + nso_header->segments[segment].dst_offset), nso_header->segments[segment].size); - R_UNLESS(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso()); + R_UNLESS_LOG(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso(), "[ldr] Invalid segment hash!\n"); R_SUCCEED(); } Result LoadAutoLoadModule(os::NativeHandle process_handle, fs::FileHandle file, const NsoHeader *nso_header, uintptr_t nso_address, size_t nso_size, size_t map_size) { - const bool is_zstd = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; + const bool is_zbic = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; const size_t module_size = static_cast(nso_header->rw_dst_offset) + util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize); const size_t arena_size = (nso_size > module_size) ? (nso_size - module_size) : 0; @@ -713,11 +729,11 @@ namespace ams::ldr { /* Load NSO segments. */ R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Text].file_offset, nso_header->text_compressed_size, nso_header->text_size, - (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zstd, map_address + nso_header->text_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zbic, map_address + nso_header->text_dst_offset, map_end)); R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Ro].file_offset, nso_header->ro_compressed_size, nso_header->ro_size, - (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zstd, map_address + nso_header->ro_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zbic, map_address + nso_header->ro_dst_offset, map_end)); R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Rw].file_offset, nso_header->rw_compressed_size, nso_header->rw_size, - (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zstd, map_address + nso_header->rw_dst_offset, map_end)); + (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zbic, map_address + nso_header->rw_dst_offset, map_end)); /* Clear unused space to zero. */ const size_t text_end = static_cast(nso_header->text_dst_offset) + static_cast(nso_header->text_size); @@ -754,11 +770,6 @@ namespace ams::ldr { if (g_is_ptm) { hoc::ptm::Patch(map_address, nso_size); } - - // TODO: figure out the cause of crashes with nvsrv patches - if (g_is_nvsrv) { - // hoc::nvsrv::Patch(map_address, nso_size, nso_address); - } } /* Set permissions. */ @@ -785,15 +796,17 @@ namespace ams::ldr { for (int i = 0; i < ctx.nso_count; i++) { const NsoIndex nso_idx = static_cast(ctx.ali.nso_indices[i]); + const bool is_zbic = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; + const size_t map_size = is_zbic ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; + + AMS_LOG("[ldr] module[%d]: idx=%d, path='%s', zbic=%d\n", i, (int)nso_idx, GetNsoPath(nso_idx), is_zbic); fs::FileHandle file; R_TRY(fs::OpenFile(std::addressof(file), GetNsoPath(nso_idx), fs::OpenMode_Read)); ON_SCOPE_EXIT { fs::CloseFile(file); }; - const bool is_zstd = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; - const size_t map_size = is_zstd ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; - - R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, process_info->nso_address[i], process_info->nso_size[i], map_size)); + R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, + process_info->nso_address[i], process_info->nso_size[i], map_size)); } /* Load arguments, if present. */ @@ -834,7 +847,7 @@ namespace ams::ldr { /* Set the output handle, and ensure that if we fail after this point we clean it up. */ out->process_handle = process_handle; out->code_address = param.code_address; - ON_RESULT_FAILURE { svc::CloseHandle(process_handle); }; + ON_RESULT_FAILURE { R_DISCARD(svc::CloseHandle(process_handle)); }; /* Load all auto load modules. */ R_RETURN(LoadAutoLoadModules(out, ctx, argument)); @@ -892,8 +905,8 @@ namespace ams::ldr { os::ProcessId process_id = os::GetProcessId(info.process_handle); /* Register new process. */ - const auto as_type = GetAddressSpaceType(std::addressof(meta)); - RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::AddressSpaceType_64Bit || as_type == Npdm::AddressSpaceType_64BitDeprecated); + const auto as_type = GetProcessAddressSpace(std::addressof(meta)); + RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::ProcessAddressSpace_64Bit39 || as_type == Npdm::ProcessAddressSpace_64Bit36); /* Register all NSOs. */ for (int i = 0; i < ctx.nso_count; i++) { @@ -904,7 +917,7 @@ namespace ams::ldr { /* If we're overriding for HBL, perform HTML document redirection. */ if (override_status.IsHbl()) { /* Don't validate result, failure is okay. */ - RedirectHtmlDocumentPathForHbl(loc); + R_DISCARD(RedirectHtmlDocumentPathForHbl(loc)); } /* Clear the external code for the program. */ diff --git a/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp b/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp new file mode 100644 index 00000000..fd96684e --- /dev/null +++ b/Source/Old-Atmosphere-Patches/ldr_process_creation_1_12_0.cpp @@ -0,0 +1,973 @@ +/* + * Copyright (c) Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include "ldr_capabilities.hpp" +#include "ldr_content_management.hpp" +#include "ldr_development_manager.hpp" +#include "ldr_launch_record.hpp" +#include "ldr_meta.hpp" +#include "ldr_patcher.hpp" +#include "ldr_process_creation.hpp" +#include "ldr_ro_manager.hpp" +#include "oc/oc_loader.hpp" + +namespace ams::ldr { + + namespace { + + /* Convenience defines. */ + constexpr size_t SystemResourceSizeMax = 0x1FE00000; + constexpr size_t AutoLoadModuleSizeMax = 0x800000000; + + /* Types. */ + enum NsoIndex { + Nso_Rtld = 0, + Nso_Main = 1, + Nso_Wkc0 = 2, + Nso_Wkc1 = 3, + Nso_Wkc2 = 4, + Nso_Wkc3 = 5, + Nso_Wkc4 = 6, + Nso_Wkc5 = 7, + Nso_Wkc6 = 8, + Nso_Wkc7 = 9, + Nso_Wkc8 = 10, + Nso_Wkc9 = 11, + Nso_SubSdk0 = 12, + Nso_SubSdk1 = 13, + Nso_SubSdk2 = 14, + Nso_SubSdk3 = 15, + Nso_SubSdk4 = 16, + Nso_SubSdk5 = 17, + Nso_SubSdk6 = 18, + Nso_SubSdk7 = 19, + Nso_SubSdk8 = 20, + Nso_SubSdk9 = 21, + Nso_Sdk = 22, + Nso_Count, + }; + + constexpr inline const char *NsoPaths[Nso_Count] = { + ENCODE_ATMOSPHERE_CODE_PATH("/rtld"), + ENCODE_ATMOSPHERE_CODE_PATH("/main"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc0"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc1"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc2"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc3"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc4"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc5"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc6"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc7"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc8"), + ENCODE_ATMOSPHERE_BDLL_PATH("/wkc9"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk0"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk1"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk2"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk3"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk4"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk5"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk6"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk7"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk8"), + ENCODE_ATMOSPHERE_CODE_PATH("/subsdk9"), + ENCODE_ATMOSPHERE_CODE_PATH("/sdk"), + }; + + constexpr const char *GetNsoPath(size_t idx) { + AMS_ABORT_UNLESS(idx < Nso_Count); + return NsoPaths[idx]; + } + + struct ProcessInfo { + os::NativeHandle process_handle; + uintptr_t code_address; + size_t total_size; + uintptr_t args_address; + size_t args_size; + uintptr_t nso_address[Nso_Count]; + size_t nso_size[Nso_Count]; + }; + + struct AutoLoadModuleInfo { + bool has_rtld; + bool has_main; + bool has_sdk; + bool has_subsdk; + s8 nso_indices[Nso_Count]; + }; + + struct AutoLoadModuleContext { + NsoHeader *headers; + int nso_count; + int rtld_idx; + int main_nso_idx; + int sdk_nso_idx; + AutoLoadModuleInfo ali; + }; + + /* Global NSO header cache. */ + NsoHeader g_nso_headers[Nso_Count]; + + /* Pcv/Ptm check cache */ + bool g_is_pcv; + bool g_is_ptm; + + /* Global Zstd decompression context. */ + alignas(8) u8 g_zstd_dctx_workspace[util::DecompressZstdWithBicWorkBufferSizeDefault]; + + Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) { + /* No version verification is done before 8.1.0. */ + R_SUCCEED_IF(hos::GetVersion() < hos::Version_8_1_0); + + /* No verification is done if development. */ + R_SUCCEED_IF(IsDevelopmentForAntiDowngradeCheck()); + + /* TODO: Anti-downgrade checking does not make very much sense for us. Should we do anything? */ + AMS_UNUSED(program_id, version); + + R_SUCCEED(); + } + + /* Helpers. */ + Result GetProgramInfoFromMeta(ProgramInfo *out, const Meta *meta) { + /* Copy basic info. */ + out->main_thread_priority = meta->npdm->main_thread_priority; + out->default_cpu_id = meta->npdm->default_cpu_id; + out->main_thread_stack_size = meta->npdm->main_thread_stack_size; + out->program_id = meta->aci->program_id; + + /* Copy access controls. */ + size_t offset = 0; +#define COPY_ACCESS_CONTROL(source, which) \ + ({ \ + const size_t size = meta->source->which##_size; \ + R_UNLESS(offset + size <= sizeof(out->ac_buffer), ldr::ResultInternalError()); \ + out->source##_##which##_size = size; \ + std::memcpy(out->ac_buffer + offset, meta->source##_##which, size); \ + offset += size; \ + }) + + /* Copy all access controls to buffer. */ + COPY_ACCESS_CONTROL(acid, sac); + COPY_ACCESS_CONTROL(aci, sac); + COPY_ACCESS_CONTROL(acid, fac); + COPY_ACCESS_CONTROL(aci, fah); +#undef COPY_ACCESS_CONTROL + + /* Copy flags. */ + out->flags = MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)); + R_SUCCEED(); + } + + bool IsApplet(const Meta *meta) { + return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Applet; + } + + bool IsApplication(const Meta *meta) { + return (MakeProgramInfoFlag(static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; + } + + Npdm::ProcessAddressSpace GetProcessAddressSpace(const Meta *meta) { + return static_cast((meta->npdm->flags0 & Npdm::MetaFlag0_ProcessAddressSpaceMask) >> Npdm::MetaFlag0_ProcessAddressSpaceShift); + } + + Acid::PoolPartition GetPoolPartition(const Meta *meta) { + return static_cast((meta->acid->flags & Acid::AcidFlag_PoolPartitionMask) >> Acid::AcidFlag_PoolPartitionShift); + } + + Result LoadAutoLoadHeaders(AutoLoadModuleContext &ctx, u32 acid_flags) { + /* Clear NSOs. */ + std::memset(g_nso_headers, 0, sizeof(g_nso_headers)); + ctx.headers = g_nso_headers; + ctx.nso_count = 0; + ctx.rtld_idx = -1; + ctx.main_nso_idx = -1; + ctx.sdk_nso_idx = -1; + ctx.ali = {}; + + for (size_t i = 0; i < Nso_Count; i++) { + /* Only load browser DLLs if acid flags say to do so. */ + switch (i) { + case Nso_Wkc0: + case Nso_Wkc1: + case Nso_Wkc2: + case Nso_Wkc3: + case Nso_Wkc4: + case Nso_Wkc5: + case Nso_Wkc6: + case Nso_Wkc7: + case Nso_Wkc8: + case Nso_Wkc9: + if ((acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) == 0) { + continue; + } + break; + } + + fs::FileHandle file; + if (R_SUCCEEDED(fs::OpenFile(std::addressof(file), GetNsoPath(i), fs::OpenMode_Read))) { + ON_SCOPE_EXIT { fs::CloseFile(file); }; + + /* Read NSO header. */ + size_t read_size; + R_TRY(fs::ReadFile(std::addressof(read_size), file, 0, g_nso_headers + ctx.nso_count, sizeof(NsoHeader))); + R_UNLESS_LOG(read_size == sizeof(NsoHeader), ldr::ResultInvalidNso(), "[ldr] NSO header truncated!\n"); + + /* Note nso is present. */ + switch (i) { + case Nso_Rtld: + ctx.rtld_idx = ctx.nso_count; + ctx.ali.has_rtld = true; + break; + case Nso_Main: + ctx.main_nso_idx = ctx.nso_count; + ctx.ali.has_main = true; + break; + case Nso_SubSdk0: + case Nso_SubSdk1: + case Nso_SubSdk2: + case Nso_SubSdk3: + case Nso_SubSdk4: + case Nso_SubSdk5: + case Nso_SubSdk6: + case Nso_SubSdk7: + case Nso_SubSdk8: + case Nso_SubSdk9: + ctx.ali.has_subsdk = true; + break; + case Nso_Sdk: + ctx.sdk_nso_idx = ctx.nso_count; + ctx.ali.has_sdk = true; + break; + } + ctx.ali.nso_indices[ctx.nso_count] = static_cast(i); + ctx.nso_count++; + } + } + + R_SUCCEED(); + } + + Result CheckAutoLoad(const AutoLoadModuleContext &ctx, u32 acid_flags) { + /* We must always have a main. */ + R_UNLESS_LOG(ctx.ali.has_main, ldr::ResultInvalidNso(), "[ldr] Missing main!\n"); + + /* Validate flags and extents for all present NSOs. */ + for (int i = 0; i < ctx.nso_count; ++i) { + const auto &hdr = ctx.headers[i]; + + /* All NSOs must not be --X. */ + /* This is "probably" not checked on Ounce? */ + R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_PreventCodeReads) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] --x not allowed!\n", i); + + /* Zstd compression only allowed on main, and only when both rtld+sdk are present. */ + if (i != ctx.main_nso_idx || ctx.rtld_idx < 0 || ctx.sdk_nso_idx < 0) { + R_UNLESS_LOG((hdr.flags & NsoHeader::Flag_UseZbicCompression) == 0, ldr::ResultInvalidNso(), "[ldr] NSO[%d] zbic not allowed!\n", i); + } + + /* NSOs must have page-aligned segments. */ + R_UNLESS(util::IsAligned(hdr.text_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); + R_UNLESS(util::IsAligned(hdr.ro_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); + R_UNLESS(util::IsAligned(hdr.rw_dst_offset, os::MemoryPageSize), ldr::ResultInvalidNso()); + + /* NSOs must have zero text offset. */ + R_UNLESS(hdr.text_dst_offset == 0, ldr::ResultInvalidNso()); + + /* NSO .text must precede .rodata. */ + const size_t text_end = static_cast(hdr.text_dst_offset) + static_cast(hdr.text_size); + R_UNLESS(text_end <= static_cast(hdr.ro_dst_offset), ldr::ResultInvalidNso()); + + /* NSO .rodata must precede .rwdata. */ + const size_t ro_end = static_cast(hdr.ro_dst_offset) + static_cast(hdr.ro_size); + R_UNLESS(ro_end <= static_cast(hdr.rw_dst_offset), ldr::ResultInvalidNso()); + } + + const bool has_browser_dll = (acid_flags & Acid::AcidFlag_LoadBrowserCoreDll) != 0; + if (ctx.ali.has_rtld || ctx.ali.has_sdk) { + /* If we have sdk we must have rtld. */ + R_UNLESS_LOG(ctx.ali.has_rtld, ldr::ResultInvalidNso(), "[ldr] Missing rtld!\n"); + + /* If we have rtld, we must not have browser core dll. */ + R_UNLESS_LOG(!has_browser_dll, ldr::ResultInvalidNso(), "[ldr] BrowserCoreDll must not be present!\n"); + } else { + /* We must not have both subsdk and browser dll. */ + R_UNLESS_LOG(!(ctx.ali.has_subsdk && has_browser_dll), ldr::ResultInvalidNso(), "[ldr] Can't have both subsdk and BrowserCoreDll!\n"); + } + + R_SUCCEED(); + } + + constexpr const ncm::ProgramId UnqualifiedApprovalProgramIds[] = { + { 0x010003F003A34000 }, /* Pokemon: Let's Go, Pikachu! */ + { 0x0100152000022000 }, /* Mario Kart 8 Deluxe */ + { 0x0100165003504000 }, /* Nintendo Labo Toy-Con 04: VR Kit */ + { 0x0100187003A36000 }, /* Pokemon: Let's Go, Eevee! */ + { 0x01002E5008C56000 }, /* Pokemon Sword [Live Tournament] */ + { 0x01002FF008C24000 }, /* Ring Fit Adventure */ + { 0x010049900F546001 }, /* Super Mario 3D All-Stars: Super Mario 64 */ + { 0x010057D00ECE4000 }, /* Nintendo Switch Online (Nintendo 64) [for Japan] */ + { 0x01006F8002326000 }, /* Animal Crossing: New Horizons */ + { 0x01006FB00F50E000 }, /* 宝可梦 走吧!伊布 [Pokemon: Let's Go, Eevee! for China] */ + { 0x010070300F50C000 }, /* 宝可梦 走吧!皮卡丘 [Pokemon: Let's Go, Pikachu! for China] */ + { 0x010075100E8EC000 }, /* 马力欧卡丁车8 豪华版 [Mario Kart 8 Deluxe for China] */ + { 0x01008DB008C2C000 }, /* Pokemon Shield */ + { 0x01009AD008C4C000 }, /* Pokemon: Let's Go, Pikachu! [Kiosk] */ + { 0x0100A66003384000 }, /* Hulu */ + { 0x0100ABF008968000 }, /* Pokemon Sword */ + { 0x0100C9A00ECE6000 }, /* Nintendo Switch Online (Nintendo 64) [for America] */ + { 0x0100ED100BA3A000 }, /* Mario Kart Live: Home Circuit */ + { 0x0100F38011CFE000 }, /* Animal Crossing: New Horizons Island Transfer Tool */ + { 0x0100F6B011028000 }, /* 健身环大冒险 [Ring Fit Adventure for China] */ + }; + + /* Check that the unqualified approval programs are sorted. */ + static_assert([]() -> bool { + for (size_t i = 0; i < util::size(UnqualifiedApprovalProgramIds) - 1; ++i) { + if (UnqualifiedApprovalProgramIds[i].value >= UnqualifiedApprovalProgramIds[i + 1].value) { + return false; + } + } + + return true; + }()); + + bool IsUnqualifiedApprovalProgramId(ncm::ProgramId program_id) { + /* Check if the program id is one with unqualified approval. */ + return std::binary_search(std::begin(UnqualifiedApprovalProgramIds), std::end(UnqualifiedApprovalProgramIds), program_id); + } + + bool IsUnqualifiedApproval(const Meta *meta) { + /* If the meta has unqualified approval flag, it's unqualified approval. */ + if (meta->acid->flags & ldr::Acid::AcidFlag_UnqualifiedApproval) { + return true; + } + + /* If the unqualified approval flag is not set, the program must be an application. */ + if (!IsApplication(meta)) { + return false; + } + + /* The program id must be a force unqualified approval program id. */ + return IsUnqualifiedApprovalProgramId(meta->acid->program_id_min) && meta->acid->program_id_min == meta->acid->program_id_max; + } + + Result ValidateMeta(const Meta *meta, const ncm::ProgramLocation &loc, const fs::CodeVerificationData &code_verification_data) { + /* Validate version. */ + R_TRY(ValidateProgramVersion(loc.program_id, meta->npdm->version)); + + /* Validate program id. */ + R_UNLESS(meta->aci->program_id >= meta->acid->program_id_min, ldr::ResultInvalidProgramId()); + R_UNLESS(meta->aci->program_id <= meta->acid->program_id_max, ldr::ResultInvalidProgramId()); + + /* Validate the kernel capabilities. */ + R_TRY(TestCapability(static_cast(meta->acid_kac), meta->acid->kac_size / sizeof(util::BitPack32), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32))); + + /* Check if NCA is PCV or PTM */ + g_is_pcv = meta->aci->program_id == ncm::SystemProgramId::Pcv; + g_is_ptm = meta->aci->program_id == ncm::SystemProgramId::Ptm; + + /* If we have data to validate, validate it. */ + if (meta->check_verification_data) { + const u8 *sig = code_verification_data.signature; + const size_t sig_size = sizeof(code_verification_data.signature); + const u8 *mod = static_cast(meta->modulus); + const size_t mod_size = crypto::Rsa2048PssSha256Verifier::ModulusSize; + const u8 *exp = fssystem::GetAcidSignatureKeyPublicExponent(); + const size_t exp_size = fssystem::AcidSignatureKeyPublicExponentSize; + const u8 *hsh = code_verification_data.target_hash; + const size_t hsh_size = sizeof(code_verification_data.target_hash); + const bool is_signature_valid = crypto::VerifyRsa2048PssSha256WithHash(sig, sig_size, mod, mod_size, exp, exp_size, hsh, hsh_size); + + /* If the signature check fails, we need to check if this is allowable. */ + if (!is_signature_valid) { + AMS_LOG("[ldr] invalid signature!\n"); + + /* We have to enforce signature checks on prod and when we have a signature to check on dev. */ + R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature()); + R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature()); + + /* There was no signature to check on dev. Check if this is acceptable. */ + R_UNLESS(IsUnqualifiedApproval(meta), ldr::ResultInvalidNcaSignature()); + } + } + + /* All good. */ + R_SUCCEED(); + } + + Result GetCreateProcessParameterFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { + const u8 meta_flags0 = meta->npdm->flags0; + const u8 meta_flags1 = meta->npdm->flags1; + + u32 flags = 0; + + /* Set Is64Bit. */ + if (meta_flags0 & Npdm::MetaFlag0_Is64BitInstruction) { + flags |= svc::CreateProcessParameterFlag_64Bit; + } + + /* Set ProcessAddressSpace. */ + switch (GetProcessAddressSpace(meta)) { + case Npdm::ProcessAddressSpace_32Bit: + flags |= svc::CreateProcessParameterFlag_AddressSpace32Bit; + break; + case Npdm::ProcessAddressSpace_64Bit36: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit36; + break; + case Npdm::ProcessAddressSpace_32BitNoReserved: + flags |= svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved; + break; + case Npdm::ProcessAddressSpace_64Bit39: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit39; + break; + case Npdm::ProcessAddressSpace_64Bit42: + flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit42; + break; + default: + R_THROW(ldr::ResultInvalidMeta()); + } + + /* Set Enable Debug. */ + if (ldr_flags & CreateProcessParameterFlag_EnableJitDebug) { + flags |= svc::CreateProcessParameterFlag_EnableJitDebug; + } + + /* Set Enable ASLR. */ + if (!(ldr_flags & CreateProcessParameterFlag_DisableAslr)) { + flags |= svc::CreateProcessParameterFlag_EnableAslr; + } + + /* Set Is Application. */ + if (IsApplication(meta)) { + flags |= svc::CreateProcessParameterFlag_IsApplication; + + /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ + if (hos::GetVersion() >= hos::Version_7_0_0) { + if (meta_flags0 & Npdm::MetaFlag0_OptimizeMemoryAllocation) { + flags |= svc::CreateProcessParameterFlag_OptimizeMemoryAllocation; + } + } + } + + /* 5.0.0+ Set Pool Partition. */ + if (hos::GetVersion() >= hos::Version_5_0_0) { + /* TODO: Nintendo no longer accepts Applet when pool partition == application. Would this break hbl/anything else in the hb ecosystem? */ + /* TODO: Nintendo uses a helper bool MakeSvcPoolPartitionFlag(u32 *out, Acid::PoolPartition partition); */ + switch (GetPoolPartition(meta)) { + case Acid::PoolPartition_Application: + if (IsApplet(meta)) { + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; + } else { + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplication; + } + break; + case Acid::PoolPartition_Applet: + flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet; + break; + case Acid::PoolPartition_System: + flags |= svc::CreateProcessParameterFlag_PoolPartitionSystem; + break; + case Acid::PoolPartition_SystemNonSecure: + flags |= svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure; + break; + default: + R_THROW(ldr::ResultInvalidMeta()); + } + } else if (hos::GetVersion() >= hos::Version_4_0_0) { + /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ + if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { + flags |= svc::CreateProcessParameterFlag_DeprecatedUseSecureMemory; + } + } + + /* 11.0.0+/meso Set Disable DAS Merge. */ + if (meta_flags0 & Npdm::MetaFlag0_DisableDeviceAddressSpaceMerge) { + flags |= svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge; + } + + /* 18.0.0+/meso Set Enable Address Sanitizer . */ + if (meta_flags0 & Npdm::MetaFlag0_EnableAddressSanitizer) { + flags |= svc::CreateProcessParameterFlag_EnableAddressSanitizer; + } + + /* 23.0.0+/meso Set Enable Shadow Stack. */ + if (meta_flags1 & Npdm::MetaFlag1_EnableShadowStack) { + flags |= svc::CreateProcessParameterFlag_EnableShadowStack; + } + + *out = flags; + R_SUCCEED(); + } + + Result GetCreateProcessParameter(svc::CreateProcessParameter *out, const Meta *meta, u32 flags, os::NativeHandle resource_limit) { + /* Clear output. */ + std::memset(out, 0, sizeof(*out)); + + /* Set name, version, program id, resource limit handle. */ + std::memcpy(out->name, meta->npdm->program_name, sizeof(out->name) - 1); + out->version = meta->npdm->version; + out->program_id = meta->aci->program_id.value; + out->reslimit = resource_limit; + + /* Set flags. */ + R_TRY(GetCreateProcessParameterFlags(std::addressof(out->flags), meta, flags)); + + /* 3.0.0+ System Resource Size. */ + if (hos::GetVersion() >= hos::Version_3_0_0) { + /* Validate size is aligned. */ + R_UNLESS(util::IsAligned(meta->npdm->system_resource_size, os::MemoryBlockUnitSize), ldr::ResultInvalidSize()); + + /* Validate system resource usage. */ + if (meta->npdm->system_resource_size) { + /* Process must be 64-bit. */ + R_UNLESS((out->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit39), ldr::ResultInvalidMeta()); + + /* Process must be application or applet. */ + R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); + + /* Size must be less than or equal to max. */ + R_UNLESS(meta->npdm->system_resource_size <= SystemResourceSizeMax, ldr::ResultInvalidMeta()); + } + out->system_resource_num_pages = meta->npdm->system_resource_size >> 12; + } + + R_SUCCEED(); + } + + u64 GenerateSecureRandom(u64 max) { + /* Generate a cryptographically random number. */ + u64 rand; + crypto::GenerateCryptographicallyRandomBytes(std::addressof(rand), sizeof(rand)); + + /* Coerce into range. */ + return rand % (max + 1); + } + + Result DecideAddressSpaceLayout(ProcessInfo *out, svc::CreateProcessParameter *out_param, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument) { + /* Clear output. */ + out->args_address = 0; + out->args_size = 0; + std::memset(out->nso_address, 0, sizeof(out->nso_address)); + std::memset(out->nso_size, 0, sizeof(out->nso_size)); + + size_t total_size = 0; + bool argument_allocated = false; + + /* Calculate base offsets. */ + for (int i = 0; i < ctx.nso_count; i++) { + out->nso_address[i] = total_size; + const size_t text_end = static_cast(ctx.headers[i].text_dst_offset) + static_cast(ctx.headers[i].text_size); + const size_t ro_end = static_cast(ctx.headers[i].ro_dst_offset) + static_cast(ctx.headers[i].ro_size); + const size_t rw_end = static_cast(ctx.headers[i].rw_dst_offset) + static_cast(ctx.headers[i].rw_size); + out->nso_size[i] = text_end; + out->nso_size[i] = std::max(out->nso_size[i], ro_end); + out->nso_size[i] = std::max(out->nso_size[i], rw_end); + out->nso_size[i] += static_cast(ctx.headers[i].bss_size); + + /* Reserve hook arena memory past pcv's bss. */ + if (g_is_pcv && i == ctx.main_nso_idx) { + out->nso_size[i] = util::AlignUp(out->nso_size[i], os::MemoryPageSize) + hoc::pcv::PcvDataArenaSize; + } + + const size_t aligned_up_size = util::AlignUp(out->nso_size[i], os::MemoryPageSize) & (AutoLoadModuleSizeMax - 1); + R_UNLESS(out->nso_size[i] <= aligned_up_size, ldr::ResultInvalidNso()); + R_UNLESS(aligned_up_size > 0, ldr::ResultInvalidNso()); + + out->nso_size[i] = aligned_up_size; + + R_UNLESS(util::CanAddWithoutOverflow(total_size, out->nso_size[i]), ldr::ResultInvalidNso()); + total_size += out->nso_size[i]; + + if (!argument_allocated && argument != nullptr) { + out->args_address = total_size; + out->args_size = util::AlignUp(2 * sizeof(u32) + argument->argument_size * 2 + ArgumentStore::ArgumentBufferSize, os::MemoryPageSize); + + R_UNLESS(util::CanAddWithoutOverflow(total_size, out->args_size), ldr::ResultInvalidNso()); + total_size += out->args_size; + + argument_allocated = true; + } + } + + /* Calculate ASLR. */ + uintptr_t aslr_start = 0; + size_t aslr_size = 0; + if (hos::GetVersion() >= hos::Version_2_0_0) { + switch (out_param->flags & svc::CreateProcessParameterFlag_AddressSpaceMask) { + case svc::CreateProcessParameterFlag_AddressSpace32Bit: + case svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved: + aslr_start = svc::AddressSmallMap32Start; + aslr_size = svc::AddressSmallMap32Size; + break; + case svc::CreateProcessParameterFlag_AddressSpace64Bit36: + aslr_start = svc::AddressSmallMap36Start; + aslr_size = svc::AddressSmallMap36Size; + break; + case svc::CreateProcessParameterFlag_AddressSpace64Bit39: + aslr_start = svc::AddressMap39Start; + aslr_size = svc::AddressMap39Size; + break; + case svc::CreateProcessParameterFlag_AddressSpace64Bit42: + aslr_start = svc::AddressMap42Start; + aslr_size = svc::AddressMap42Size; + break; + AMS_UNREACHABLE_DEFAULT_CASE(); + } + } else { + /* On 1.0.0, only 2 address space types existed. */ + if (out_param->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit36) { + aslr_start = svc::AddressSmallMap36Start; + aslr_size = svc::AddressSmallMap36Size; + } else { + aslr_start = svc::AddressSmallMap32Start; + aslr_size = svc::AddressSmallMap32Size; + } + } + R_UNLESS(total_size <= aslr_size, svc::ResultOutOfMemory()); + + /* Set Create Process output. */ + uintptr_t aslr_slide = 0; + size_t free_size = (aslr_size - total_size); + if (out_param->flags & svc::CreateProcessParameterFlag_EnableAslr) { + aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; + } + + /* Set out. */ + aslr_start += aslr_slide; + for (int i = 0; i < ctx.nso_count; i++) { + R_UNLESS(util::CanAddWithoutOverflow(out->nso_address[i], aslr_start), ldr::ResultInvalidNso()); + out->nso_address[i] += aslr_start; + } + if (out->args_address) { + R_UNLESS(util::CanAddWithoutOverflow(out->args_address, aslr_start), ldr::ResultInvalidNso()); + out->args_address += aslr_start; + } + + out_param->code_address = aslr_start; + out_param->code_num_pages = total_size >> 12; + out->total_size = total_size; + + R_SUCCEED(); + } + + Result LoadAutoLoadModuleSegment(fs::FileHandle file, size_t file_offset, size_t compressed_size, size_t segment_size, bool is_compressed, bool is_zbic, uintptr_t map_base, uintptr_t map_end) { + /* Select read size based on compression. */ + size_t file_size = is_compressed ? compressed_size : segment_size; + + AMS_LOG("[ldr] Loading segment @ 0x%016lx: compressed=%d, file_size=0x%08lx, compressed_size=0x%08lx, segment_size=0x%08lx\n", + map_base, is_compressed, file_size, compressed_size, segment_size); + + /* Validate size. */ + R_UNLESS(file_size <= segment_size, ldr::ResultInvalidNso()); + R_UNLESS(file_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); + R_UNLESS(segment_size <= std::numeric_limits::max(), ldr::ResultInvalidNso()); + + /* Load data from file. */ + uintptr_t load_address = is_compressed ? map_end - compressed_size : map_base; + size_t read_size; + R_TRY(fs::ReadFile(std::addressof(read_size), file, file_offset, reinterpret_cast(load_address), file_size)); + R_UNLESS_LOG(read_size == file_size, ldr::ResultInvalidNso(), "[ldr] Couldn't read segment from file!\n"); + + /* Uncompress if necessary. */ + R_SUCCEED_IF(!is_compressed); + + auto compressed_data_buf = reinterpret_cast(load_address); + + if (is_zbic) { + bool decompressed = util::DecompressZstdWithBic(reinterpret_cast(g_zstd_dctx_workspace), sizeof(g_zstd_dctx_workspace), reinterpret_cast(map_base), static_cast(map_end - map_base), segment_size, compressed_data_buf, file_size); + R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with zbic!\n"); + } else { + bool decompressed = (util::DecompressLZ4(reinterpret_cast(map_base), segment_size, compressed_data_buf, file_size) == static_cast(segment_size)); + R_UNLESS_LOG(decompressed, ldr::ResultInvalidNso(), "[ldr] Failed to decompress segment with lz4!\n"); + } + + R_SUCCEED(); + } + + Result CheckSegmentHash(const NsoHeader *nso_header, uintptr_t map_address, NsoHeader::Segment segment) { + if ((nso_header->flags & (NsoHeader::Flag_CheckHashText << segment)) == 0) { + R_SUCCEED(); + } + + u8 hash[crypto::Sha256Generator::HashSize]; + crypto::GenerateSha256(hash, sizeof(hash), + reinterpret_cast(map_address + nso_header->segments[segment].dst_offset), + nso_header->segments[segment].size); + R_UNLESS_LOG(std::memcmp(hash, nso_header->segment_hashes[segment], sizeof(hash)) == 0, ldr::ResultInvalidNso(), "[ldr] Invalid segment hash!\n"); + R_SUCCEED(); + } + + Result LoadAutoLoadModule(os::NativeHandle process_handle, fs::FileHandle file, const NsoHeader *nso_header, uintptr_t nso_address, size_t nso_size, size_t map_size) { + const bool is_zbic = (nso_header->flags & NsoHeader::Flag_UseZbicCompression) != 0; + + const size_t module_size = static_cast(nso_header->rw_dst_offset) + util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize); + const size_t arena_size = (nso_size > module_size) ? (nso_size - module_size) : 0; + + /* Map and read data from file. */ + { + /* Map the process memory. */ + void *mapped_memory = nullptr; + R_TRY(os::MapProcessMemory(std::addressof(mapped_memory), process_handle, nso_address, map_size, GenerateSecureRandom)); + ON_SCOPE_EXIT { os::UnmapProcessMemory(mapped_memory, process_handle, nso_address, map_size); }; + + const uintptr_t map_address = reinterpret_cast(mapped_memory); + const uintptr_t map_end = map_address + map_size; + + /* Load NSO segments. */ + R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Text].file_offset, nso_header->text_compressed_size, nso_header->text_size, + (nso_header->flags & NsoHeader::Flag_CompressedText) != 0, is_zbic, map_address + nso_header->text_dst_offset, map_end)); + R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Ro].file_offset, nso_header->ro_compressed_size, nso_header->ro_size, + (nso_header->flags & NsoHeader::Flag_CompressedRo) != 0, is_zbic, map_address + nso_header->ro_dst_offset, map_end)); + R_TRY(LoadAutoLoadModuleSegment(file, nso_header->segments[NsoHeader::Segment_Rw].file_offset, nso_header->rw_compressed_size, nso_header->rw_size, + (nso_header->flags & NsoHeader::Flag_CompressedRw) != 0, is_zbic, map_address + nso_header->rw_dst_offset, map_end)); + + /* Clear unused space to zero. */ + const size_t text_end = static_cast(nso_header->text_dst_offset) + static_cast(nso_header->text_size); + const size_t ro_end = static_cast(nso_header->ro_dst_offset) + static_cast(nso_header->ro_size); + const size_t rw_end = static_cast(nso_header->rw_dst_offset) + static_cast(nso_header->rw_size); + std::memset(reinterpret_cast(map_address + text_end), 0, nso_header->ro_dst_offset - text_end); + std::memset(reinterpret_cast(map_address + ro_end), 0, nso_header->rw_dst_offset - ro_end); + std::memset(reinterpret_cast(map_address + rw_end), 0, nso_size - rw_end); + + /* Check segment hashes. */ + R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Text)); + R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Ro)); + R_TRY(CheckSegmentHash(nso_header, map_address, NsoHeader::Segment_Rw)); + + /* Apply embedded patches. */ + ApplyEmbeddedPatchesToModule(nso_header->module_id, map_address, nso_size); + + /* Apply IPS patches. */ + LocateAndApplyIpsPatchesToModule(nso_header->module_id, map_address, nso_size); + + /* Apply PCV and PTM patches */ + if (g_is_pcv) { + const size_t text_end = static_cast(nso_header->text_size); + const size_t rx_end = util::AlignUp(text_end, os::MemoryPageSize); + const size_t ro_start = static_cast(nso_header->ro_dst_offset); + const size_t cave_end = (rx_end < ro_start) ? rx_end : ro_start; + const uintptr_t cave = map_address + text_end; + const size_t cave_size = (cave_end > text_end) ? (cave_end - text_end) : 0; + + /* module_size is used rather than nso_size to exclude the extra data section. */ + hoc::pcv::Patch(map_address, module_size, cave, cave_size, nso_address, arena_size ? (map_address + module_size) : 0); + } + + if (g_is_ptm) { + hoc::ptm::Patch(map_address, nso_size); + } + } + + /* Set permissions. */ + const size_t text_size = util::AlignUp(nso_header->text_size, os::MemoryPageSize); + const size_t ro_size = util::AlignUp(nso_header->ro_size, os::MemoryPageSize); + const size_t rw_size = util::AlignUp(nso_header->rw_size + nso_header->bss_size, os::MemoryPageSize) + arena_size; + if (text_size) { + const bool prevent_code_reads = (nso_header->flags & NsoHeader::Flag_PreventCodeReads); + R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->text_dst_offset, text_size, prevent_code_reads ? os::MemoryPermission_ExecuteOnly : os::MemoryPermission_ReadExecute)); + } + if (ro_size) { + R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->ro_dst_offset, ro_size, os::MemoryPermission_ReadOnly)); + } + if (rw_size) { + R_TRY(os::SetProcessMemoryPermission(process_handle, nso_address + nso_header->rw_dst_offset, rw_size, os::MemoryPermission_ReadWrite)); + } + + R_SUCCEED(); + } + + Result LoadAutoLoadModules(const ProcessInfo *process_info, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument) { + /* Load each NSO. */ + const uintptr_t total_end = process_info->code_address + process_info->total_size; + + for (int i = 0; i < ctx.nso_count; i++) { + const NsoIndex nso_idx = static_cast(ctx.ali.nso_indices[i]); + const bool is_zbic = (ctx.headers[i].flags & NsoHeader::Flag_UseZbicCompression) != 0; + const size_t map_size = is_zbic ? (total_end - process_info->nso_address[i]) : process_info->nso_size[i]; + + AMS_LOG("[ldr] module[%d]: idx=%d, path='%s', zbic=%d\n", i, (int)nso_idx, GetNsoPath(nso_idx), is_zbic); + + fs::FileHandle file; + R_TRY(fs::OpenFile(std::addressof(file), GetNsoPath(nso_idx), fs::OpenMode_Read)); + ON_SCOPE_EXIT { fs::CloseFile(file); }; + + R_TRY(LoadAutoLoadModule(process_info->process_handle, file, ctx.headers + i, + process_info->nso_address[i], process_info->nso_size[i], map_size)); + } + + /* Load arguments, if present. */ + if (argument != nullptr) { + /* Write argument data into memory. */ + { + void *map_address = nullptr; + R_TRY(os::MapProcessMemory(std::addressof(map_address), process_info->process_handle, process_info->args_address, process_info->args_size, GenerateSecureRandom)); + ON_SCOPE_EXIT { os::UnmapProcessMemory(map_address, process_info->process_handle, process_info->args_address, process_info->args_size); }; + + ProgramArguments *args = static_cast(map_address); + std::memset(args, 0, sizeof(*args)); + args->allocated_size = process_info->args_size; + args->arguments_size = argument->argument_size; + std::memcpy(args->arguments, argument->argument, argument->argument_size); + } + + /* Set argument region permissions. */ + /* NOTE: Nintendo uses svc::SetProcessMemoryPermission directly here. */ + R_TRY(os::SetProcessMemoryPermission(process_info->process_handle, process_info->args_address, process_info->args_size, os::MemoryPermission_ReadWrite)); + } + + R_SUCCEED(); + } + + Result CreateProcessAndLoadAutoLoadModules(ProcessInfo *out, const Meta *meta, const AutoLoadModuleContext &ctx, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit) { + /* Get CreateProcessParameter. */ + svc::CreateProcessParameter param; + R_TRY(GetCreateProcessParameter(std::addressof(param), meta, flags, resource_limit)); + + /* Decide on an NSO layout. */ + R_TRY(DecideAddressSpaceLayout(out, std::addressof(param), ctx, argument)); + + /* Actually create process. */ + svc::Handle process_handle; + R_TRY(svc::CreateProcess(std::addressof(process_handle), std::addressof(param), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(u32))); + + /* Set the output handle, and ensure that if we fail after this point we clean it up. */ + out->process_handle = process_handle; + out->code_address = param.code_address; + ON_RESULT_FAILURE { R_DISCARD(svc::CloseHandle(process_handle)); }; + + /* Load all auto load modules. */ + R_RETURN(LoadAutoLoadModules(out, ctx, argument)); + } + + } + + /* Process Creation API. */ + Result CreateProcess(os::NativeHandle *out, PinId pin_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status, const char *path, const ArgumentStore::Entry *argument, u32 flags, os::NativeHandle resource_limit, const ldr::ProgramAttributes &attrs) { + /* Mount code. */ + AMS_UNUSED(path); + ScopedCodeMountForCode mount(loc, override_status, attrs); + R_TRY(mount.GetResult()); + + /* Load meta, possibly from cache. */ + Meta meta; + R_TRY(LoadMetaFromCache(std::addressof(meta), loc, override_status, attrs.platform)); + + /* Validate meta. */ + R_TRY(ValidateMeta(std::addressof(meta), loc, mount.GetCodeVerificationData())); + + /* If we should, load/validate the browser core dll. */ + util::optional bdll_mount; + if ((meta.acid->flags & Acid::AcidFlag_LoadBrowserCoreDll)) { + /* NOTE: I'm unsure whether we should be getting a fresh override status (allowing for different override between main and bdll?) */ + /* or whether we should be using the main override status. Going to go with main, for sanity's sake. */ + /* Also noting that Nintendo always passes ProgramAttributes=0 here, but this "should" be different on Ounce? */ + /* Kind of unclear how to handle this without knowing what exactly is being ifdef'd. */ + const ncm::ProgramLocation bdll_loc = ncm::ProgramLocation::Make(ncm::SystemProgramId::BrowserCoreDll, ncm::StorageId::BuiltInSystem); + const cfg::OverrideStatus bdll_override_status = override_status; + const ldr::ProgramAttributes bdll_attrs = attrs; + bdll_mount.emplace(bdll_loc, bdll_override_status, bdll_attrs); + R_TRY(bdll_mount->GetResult()); + + /* Load browser dll meta, possibly from cache. */ + Meta bdll_meta; + R_TRY(LoadMetaFromCacheForBrowserCoreDll(std::addressof(bdll_meta), bdll_loc, bdll_override_status, bdll_attrs.platform)); + + /* Validate browser dll meta. */ + R_TRY(ValidateMeta(std::addressof(bdll_meta), loc, mount.GetCodeVerificationData())); + } + + /* Load, validate NSO headers. */ + AutoLoadModuleContext ctx; + R_TRY(LoadAutoLoadHeaders(ctx, meta.acid->flags)); + R_TRY(CheckAutoLoad(ctx, meta.acid->flags)); + + /* Actually create the process and load NSOs into process memory. */ + ProcessInfo info; + R_TRY(CreateProcessAndLoadAutoLoadModules(std::addressof(info), std::addressof(meta), ctx, argument, flags, resource_limit)); + + /* Register NSOs with the RoManager. */ + { + /* Nintendo doesn't validate this get, but we do. */ + os::ProcessId process_id = os::GetProcessId(info.process_handle); + + /* Register new process. */ + const auto as_type = GetProcessAddressSpace(std::addressof(meta)); + RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::ProcessAddressSpace_64Bit39 || as_type == Npdm::ProcessAddressSpace_64Bit36); + + /* Register all NSOs. */ + for (int i = 0; i < ctx.nso_count; i++) { + RoManager::GetInstance().AddNso(pin_id, ctx.headers[i].module_id, info.nso_address[i], info.nso_size[i]); + } + } + + /* If we're overriding for HBL, perform HTML document redirection. */ + if (override_status.IsHbl()) { + /* Don't validate result, failure is okay. */ + R_DISCARD(RedirectHtmlDocumentPathForHbl(loc)); + } + + /* Clear the external code for the program. */ + fssystem::DestroyExternalCode(loc.program_id); + + /* Note that we've created the program. */ + SetLaunchedBootProgram(loc.program_id); + + /* Move the process handle to output. */ + *out = info.process_handle; + + R_SUCCEED(); + } + + Result GetProgramInfo(ProgramInfo *out, cfg::OverrideStatus *out_status, const ncm::ProgramLocation &loc, const char *path, const ldr::ProgramAttributes &attrs) { + Meta meta; + + /* Load Meta. */ + { + AMS_UNUSED(path); + + ScopedCodeMountForCode mount(loc, attrs); + R_TRY(mount.GetResult()); + R_TRY(LoadMeta(std::addressof(meta), loc, mount.GetOverrideStatus(), attrs.platform, false)); + if (out_status != nullptr) { + *out_status = mount.GetOverrideStatus(); + } + } + + return GetProgramInfoFromMeta(out, std::addressof(meta)); + } + + Result PinProgram(PinId *out_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status) { + R_UNLESS(RoManager::GetInstance().Allocate(out_id, loc, override_status), ldr::ResultMaxProcess()); + R_SUCCEED(); + } + + Result UnpinProgram(PinId id) { + R_UNLESS(RoManager::GetInstance().Free(id), ldr::ResultNotPinned()); + R_SUCCEED(); + } + + Result GetProcessModuleInfo(u32 *out_count, ldr::ModuleInfo *out, size_t max_out_count, os::ProcessId process_id) { + R_UNLESS(RoManager::GetInstance().GetProcessModuleInfo(out_count, out, max_out_count, process_id), ldr::ResultNotPinned()); + R_SUCCEED(); + } + + Result GetProgramLocationAndOverrideStatusFromPinId(ncm::ProgramLocation *out, cfg::OverrideStatus *out_status, PinId pin_id) { + R_UNLESS(RoManager::GetInstance().GetProgramLocationAndStatus(out, out_status, pin_id), ldr::ResultNotPinned()); + R_SUCCEED(); + } + +} diff --git a/build.sh b/build.sh index 3dc32ae3..6944a8cb 100755 --- a/build.sh +++ b/build.sh @@ -6,6 +6,7 @@ LDR_SET=0 NO_EXO=0 JOBS="" DEBUG_BUILD=0 +SKIP="" ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIST_DIR="$ROOT_DIR/dist" @@ -25,6 +26,35 @@ while [ $# -gt 0 ]; do --no-exo) NO_EXO=1 ;; + -s|--skip) + shift + SKIP_GOT=0 + while [ $# -gt 0 ]; do + case "$1" in + -*) + break + ;; + *) + SKIP="$SKIP $(printf '%s' "$1" | tr ',A-Z' ' a-z')" + SKIP_GOT=1 + shift + ;; + esac + done + if [ "$SKIP_GOT" -eq 0 ]; then + echo "Missing value for -s/--skip: expected one or more of: ldr clk hek btb exos sm zip" >&2 + exit 1 + fi + continue + ;; + --skip=*) + SKIP_ADD="$(printf '%s' "${1#*=}" | tr ',A-Z' ' a-z')" + if [ -z "$(printf '%s' "$SKIP_ADD" | tr -d ' ')" ]; then + echo "Missing value for --skip: expected one or more of: ldr clk hek btb exos sm zip" >&2 + exit 1 + fi + SKIP="$SKIP $SKIP_ADD" + ;; -j) shift JOBS="$1" @@ -44,9 +74,80 @@ if [ "$DEBUG_BUILD" -eq 1 ] && [ "$LDR_SET" -eq 0 ]; then LDR_MAKE="nx_audit" fi +should_skip() { + case " $SKIP " in + *" $1 "*) + return 0 + ;; + esac + return 1 +} + +require_toolchain() { + _tk_var="$1" + _tk_gcc="$2" + _tk_extra="$3" + _tk_need="$4" + eval "_tk_dir=\$$_tk_var" + if [ -z "$_tk_dir" ] && [ -n "$DEVKITPRO" ]; then + _tk_cand="$DEVKITPRO/devkit${_tk_var#DEVKIT}" + if [ -d "$_tk_cand" ]; then + eval "export $_tk_var=""$_tk_cand""" + _tk_dir="$_tk_cand" + fi + fi + if [ -z "$_tk_dir" ]; then + echo "error: $_tk_var is not set, but it is required to build $_tk_need." >&2 + echo "Install devkitPro (https://devkitpro.org/wiki/Getting_Started) and export $_tk_var." >&2 + exit 1 + fi + if [ ! -d "$_tk_dir" ]; then + echo "error: $_tk_var points to a missing directory: $_tk_dir" >&2 + exit 1 + fi + if [ -n "$_tk_extra" ] && [ ! -e "$_tk_dir/$_tk_extra" ]; then + echo "error: $_tk_dir/$_tk_extra not found. your devkitPro install looks incomplete." >&2 + exit 1 + fi + if ! command -v "$_tk_gcc" >/dev/null 2>&1 && [ ! -x "$_tk_dir/bin/$_tk_gcc" ]; then + echo "error: $_tk_gcc not found. Add $_tk_dir/bin to your PATH." >&2 + exit 1 + fi + unset _tk_var _tk_gcc _tk_extra _tk_need _tk_dir _tk_cand +} + +for _s in $SKIP; do + case "$_s" in + ldr|clk|hek|btb|exos|sm|zip) + ;; + *) + echo "Unknown skip component: $_s (valid components: ldr clk hek btb exos sm zip)" >&2 + exit 1 + ;; + esac +done +unset _s + +if should_skip exos; then + NO_EXO=1 +fi + +_NEED_A64=0 +if ! should_skip ldr; then _NEED_A64=1; fi +if ! should_skip clk; then _NEED_A64=1; fi +if [ "$EXT" -eq 1 ] && ! should_skip btb; then _NEED_A64=1; fi +if [ "$NO_EXO" -eq 0 ]; then _NEED_A64=1; fi +if [ "$_NEED_A64" -eq 1 ]; then + require_toolchain DEVKITA64 aarch64-none-elf-gcc "" "loader/exosphere/hoc-clk/benchmark-toolbox (devkitA64)" +fi +unset _NEED_A64 + LDR_BUILD_PATH="${LDR_MAKE#nx_}" echo +if [ -n "$SKIP" ]; then + echo "SKIP =$SKIP" +fi if [ "$EXT" -eq 1 ]; then echo "EXT = 1" fi @@ -144,13 +245,18 @@ EOF fi done -echo -echo "*** Compiling loader ***" -cd build/atmosphere/stratosphere/loader || exit 1 -make -j$JOBS HOC_UART_LOG=$DEBUG_BUILD "$LDR_MAKE" -hactool -t kip1 "out/nintendo_nx_arm64_armv8a/$LDR_BUILD_PATH/loader.kip" --uncompress=hoc.kip -cd "$ROOT_DIR" # exit -cp -v build/atmosphere/stratosphere/loader/hoc.kip dist/atmosphere/kips/hoc.kip +if should_skip ldr; then + echo + echo "*** Skipping loader ***" +else + echo + echo "*** Compiling loader ***" + cd build/atmosphere/stratosphere/loader || exit 1 + make -j$JOBS HOC_UART_LOG=$DEBUG_BUILD "$LDR_MAKE" + hactool -t kip1 "out/nintendo_nx_arm64_armv8a/$LDR_BUILD_PATH/loader.kip" --uncompress=hoc.kip + cd "$ROOT_DIR" # exit + cp -v build/atmosphere/stratosphere/loader/hoc.kip dist/atmosphere/kips/hoc.kip +fi if [ "$NO_EXO" -eq 0 ]; then echo @@ -167,67 +273,97 @@ if [ -n "$ATMOSPHERE_CCACHE" ]; then ccache --show-stats fi -cd Source/hoc-clk/ -if [ "$DEBUG_BUILD" -eq 1 ]; then - ./build.sh "" -d +if should_skip clk; then + echo + echo "*** Skipping hoc-clk ***" else - ./build.sh + cd Source/hoc-clk/ || exit 1 + if [ "$DEBUG_BUILD" -eq 1 ]; then + ./build.sh "" -d + else + ./build.sh + fi + cp -r dist/ ../../ + + cd "$ROOT_DIR" fi -cp -r dist/ ../../ -cd "$ROOT_DIR" - -echo "*** Downloading Status-Monitor ***" -wget "https://github.com/ppkantorski/Status-monitor-overlay/releases/latest/download/Status-Monitor-Overlay.ovl" -mv -v Status-Monitor-Overlay.ovl "$DIST_DIR"/switch/.overlays/Status-Monitor-Overlay.ovl +if should_skip sm; then + echo + echo "*** Skipping Status-Monitor ***" +else + echo "*** Downloading Status-Monitor ***" + wget "https://github.com/ppkantorski/Status-monitor-overlay/releases/latest/download/Status-Monitor-Overlay.ovl" + mv -v Status-Monitor-Overlay.ovl "$DIST_DIR"/switch/.overlays/Status-Monitor-Overlay.ovl +fi if [ "$EXT" -eq 1 ]; then - cd Source/ - echo echo "*** Compiling extensions ***" - HEKATE_DIR="hekate" - HEKATE_URL="https://github.com/Horizon-OC/hekate.git" - - if [ ! -d "$HEKATE_DIR" ]; then + if should_skip hek; then echo - echo "*** Cloning custom Hekate ***" - git clone "$HEKATE_URL" "$HEKATE_DIR" + echo "*** Skipping custom Hekate ***" + else + require_toolchain DEVKITARM arm-none-eabi-gcc base_rules "custom Hekate (devkitARM)" + + HEKATE_DIR="$ROOT_DIR/Source/hekate" + HEKATE_URL="https://github.com/Horizon-OC/hekate.git" + + if [ ! -d "$HEKATE_DIR" ]; then + echo + echo "*** Cloning custom Hekate ***" + git clone "$HEKATE_URL" "$HEKATE_DIR" || exit 1 + else + echo + echo "*** Updating custom Hekate ***" + git -C "$HEKATE_DIR" pull --ff-only || exit 1 + fi + + cd "$HEKATE_DIR" || exit 1 + echo + echo "*** Compiling custom Hekate ***" + # Prevent crash on MSYS2 + make -j"$JOBS" SHELL=/usr/bin/bash || exit 1 + echo + + mkdir -p "$DIST_DIR/bootloader/sys/" + cp -v output/nyx.bin "$DIST_DIR/bootloader/sys/nyx.bin" + cp -v output/hekate.bin "$DIST_DIR/bootloader/update.bin" + cp -v output/hekate.bin "$DIST_DIR/payload.bin" fi - cd hekate/ - echo - echo "*** Compiling custom Hekate ***" - make -j$JOBS - echo - - mkdir -p "$DIST_DIR/bootloader/sys/" - cp -v output/nyx.bin "$ROOT_DIR"/dist/bootloader/sys/nyx.bin - cp -v output/hekate.bin "$ROOT_DIR"/dist/bootloader/update.bin - cp -v output/hekate.bin "$ROOT_DIR"/dist/payload.bin - - cd "$ROOT_DIR"/Source/Benchmark-Toolbox - echo - echo "*** Compiling Benchmark-Toolbox ***" - make -j$JOBS - cp -v Benchmark-Toolbox.nro "$DIST_DIR"/switch/Benchmark-Toolbox.nro + if should_skip btb; then + echo + echo "*** Skipping Benchmark-Toolbox ***" + else + cd "$ROOT_DIR/Source/Benchmark-Toolbox" || exit 1 + echo + echo "*** Compiling Benchmark-Toolbox ***" + make -j"$JOBS" || exit 1 + cp -v Benchmark-Toolbox.nro "$DIST_DIR/switch/Benchmark-Toolbox.nro" + fi fi -echo -echo "*** Packaging dist.zip ***" +if should_skip zip; then + echo + echo "*** Skipping dist.zip packaging ***" +else + echo + echo "*** Packaging dist.zip ***" -cd "$DIST_DIR" || exit 1 + cd "$DIST_DIR" || exit 1 -rm -f dist.zip -rm .gitignore + rm -f dist.zip + rm .gitignore -zip -r dist.zip . >/dev/null + zip -r dist.zip . >/dev/null -echo "*** dist.zip created ***" -echo + echo "*** dist.zip created ***" + echo -touch .gitignore + touch .gitignore -cd "$ROOT_DIR" || exit 1 + cd "$ROOT_DIR" || exit 1 +fi From c9e9b87bd0d783d24d268804c28bc4f35a67f264 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 3 Oct 2026 19:47:29 -0400 Subject: [PATCH 153/205] hocclk: add watchdog --- Source/hoc-clk/sysmodule/src/board/board.cpp | 80 +++++++++++-- .../sysmodule/src/i2c/max77620_wdt.cpp | 106 ++++++++++++++++++ .../sysmodule/src/i2c/max77620_wdt.hpp | 37 ++++++ .../sysmodule/src/mgr/clock_manager.cpp | 9 +- 4 files changed, 220 insertions(+), 12 deletions(-) create mode 100644 Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp create mode 100644 Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 1ca1f922..9146adf7 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -50,6 +50,8 @@ #include #include "../mapping/mem_map.hpp" #include "../soc/dram_mrr.hpp" +#include "../i2c/max77620_wdt.hpp" + namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -63,13 +65,52 @@ namespace board { u32 fd = 0, fd2 = 0; -#define PMC_BASE 0x7000E400 -#define APB_MISC_GP_HIDREV 0x804 -#define GP_HIDREV_MAJOR_T210 0x1 -#define GP_HIDREV_MAJOR_T210B01 0x2 -#define APB_BASE 0x70000000 -#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) -#define FUSE_OFFSET 0x800 + #define PMC_BASE 0x7000E400 + #define APB_MISC_GP_HIDREV 0x804 + #define GP_HIDREV_MAJOR_T210 0x1 + #define GP_HIDREV_MAJOR_T210B01 0x2 + #define APB_BASE 0x70000000 + #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) + #define FUSE_OFFSET 0x800 + + constexpr u32 pscDependencies[] = { PscPmModuleId_Olsc }; + constexpr PscPmModuleId PscModuleId = (PscPmModuleId)705; + + PscPmModule s_pscModule; + bool s_pscPrepared = false; + Thread s_pscThread; + bool s_pscExit = false; + + std::atomic_bool s_isAwake = true; + + void PscThreadFunc(void *) { + while (!s_pscExit) { + Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); + if (R_FAILED(rc)) { + continue; // Timeout + } + + PscPmState state; + u32 flags; + rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); + if (R_SUCCEEDED(rc)) { + if (state == PscPmState_Awake) { + i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); + s_isAwake = true; + } else if (state == PscPmState_ReadySleep) { + i2c::wdt::Disarm(); + s_isAwake = false; + } else if (state == PscPmState_ReadyShutdown) { + i2c::wdt::Disarm(); + s_isAwake = false; + + } + + pscPmModuleAcknowledge(&s_pscModule, state); + } + } + } + void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); @@ -198,6 +239,21 @@ namespace board { CacheDfllData(); CacheGpuVoltTable(); + + rc = pscmInitialize(); + ASSERT_RESULT_OK(rc, "pscmInitialize"); + + rc = pscmGetPmModule(&s_pscModule, PscModuleId, pscDependencies, sizeof(pscDependencies) / sizeof(u32), true); + ASSERT_RESULT_OK(rc, "pscmGetPmModule"); + + rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); + ASSERT_RESULT_OK(rc, "threadCreate"); + + rc = threadStart(&s_pscThread); + ASSERT_RESULT_OK(rc, "threadStart"); + + /* Arm the watchdog */ + i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); } void Exit() { @@ -228,6 +284,16 @@ namespace board { batteryInfoExit(); pmdmntExit(); nvExit(); + + eventFire(&s_pscModule.event); + threadWaitForExit(&s_pscThread); + threadClose(&s_pscThread); + + pscPmModuleFinalize(&s_pscModule); + pscPmModuleClose(&s_pscModule); + pscmExit(); + + i2c::wdt::Disarm(); } HocClkSocType GetSocType() { diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp new file mode 100644 index 00000000..803741b5 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -0,0 +1,106 @@ +/* + * + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "max77620_wdt.hpp" + +/* PMIC Registers */ +#define MAX77620_REG_CNFGGLBL2 ((u8)0x01) +#define MAX77620_REG_CNFGGLBL3 ((u8)0x02) +#define MAX77620_REG_ONOFFCNFG2 ((u8)0x42) + +/* CNFGGLBL2 bits */ +#define MAX77620_WDTOFFC ((u8)(1u << 4)) /* WDT clear in OFF mode */ +#define MAX77620_WDTSLPC ((u8)(1u << 3)) /* WDT clear in sleep mode */ +#define MAX77620_WDTEN ((u8)(1u << 2)) /* WDT enabled */ + +/* Watchdog timeout period (CNFGGLBL2[1:0]) */ +#define MAX77620_TWD_MASK ((u8)0x03) +#define MAX77620_TWD_2s ((u8)0x00) +#define MAX77620_TWD_16s ((u8)0x01) +#define MAX77620_TWD_64s ((u8)0x02) +#define MAX77620_TWD_128s ((u8)0x03) + +/* CNFGGLBL3 watchdog-clear field (WDTC[1:0]). Writing 0x1 disables WDT. */ +#define MAX77620_WDTC_MASK ((u8)0x03) +#define MAX77620_WDTC_KICK ((u8)0x01) + +/* ONOFFCNFG2 bits */ +#define MAX77620_ONOFFCNFG2_WD_RST_WK ((u8)(1u << 6)) + +/* Is this a watchdog or a watchcat, that is the question */ + +namespace i2c::wdt { + + static Result update_bits(u8 reg, u8 mask, u8 val) { + u8 cur; + Result rc; + + rc = I2cRead_OutU8(I2cDevice_Max77620Pmic, reg, &cur); + if (R_FAILED(rc)) + return rc; + + cur = (u8)((cur & (u8)~mask) | (val & mask)); + return I2cSet_U8(I2cDevice_Max77620Pmic, reg, cur); + } + + void Arm(max77620_wdt_time_t timeout) { + Result rc; + u8 twd; + + if ((int)timeout < (int)MAX77620_WDT_2S || (int)timeout > (int)MAX77620_WDT_128S) + return; + + twd = (u8)timeout; + + /* WDT expiry results in a restart */ + rc = update_bits(MAX77620_REG_ONOFFCNFG2, + MAX77620_ONOFFCNFG2_WD_RST_WK, + MAX77620_ONOFFCNFG2_WD_RST_WK); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Clear WDT in OFF and sleep modes. */ + rc = update_bits(MAX77620_REG_CNFGGLBL2, + (u8)(MAX77620_WDTOFFC | MAX77620_WDTSLPC), + (u8)(MAX77620_WDTOFFC | MAX77620_WDTSLPC)); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Do what the kernel dows */ + rc = update_bits(MAX77620_REG_CNFGGLBL3, + MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Program the period. */ + rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_TWD_MASK, twd); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Enable. */ + rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, MAX77620_WDTEN); + ASSERT_RESULT_OK(rc, "update_bits"); + } + + void Disarm() { + Result rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, (u8)0x00); + ASSERT_RESULT_OK(rc, "update_bits"); + } + + void Pet() { + Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); + ASSERT_RESULT_OK(rc, "update_bits"); + } + +} // namespace pwr::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp new file mode 100644 index 00000000..25baa408 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include "i2cDrv.h" +#include "../file/errors.hpp" + +namespace i2c::wdt { + + typedef enum { + MAX77620_WDT_2S = 0, /* ~2 seconds */ + MAX77620_WDT_16S = 1, /* ~16 seconds */ + MAX77620_WDT_64S = 2, /* ~64 seconds */ + MAX77620_WDT_128S = 3, /* ~128 seconds */ + } max77620_wdt_time_t; + + void Arm(max77620_wdt_time_t timeout); + void Disarm(); + + void Pet(); + +} // namespace pwr::wdt diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 03a9ed26..a2d2b1da 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -44,6 +44,8 @@ #include "../util/lockable_mutex.h" #include "clock_manager.hpp" #include "governor.hpp" +#include "../i2c/max77620_wdt.hpp" + #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) @@ -879,10 +881,7 @@ namespace mgr { } void WaitForNextTick() { - - if (board::GetHz(HocClkModule_MEM) > 665000000) - svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); - else - svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode + i2c::wdt::Pet(); + svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); } } // namespace mgr From 1f1c28875c38cdcd0fc54091ee417109f5257acb Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sun, 4 Oct 2026 13:55:01 +0200 Subject: [PATCH 154/205] Revert "hocclk: add watchdog" This watchdog prevents fatal errors which are *kinda* important. This reverts commit c9e9b87bd0d783d24d268804c28bc4f35a67f264. --- Source/hoc-clk/sysmodule/src/board/board.cpp | 80 ++----------- .../sysmodule/src/i2c/max77620_wdt.cpp | 106 ------------------ .../sysmodule/src/i2c/max77620_wdt.hpp | 37 ------ .../sysmodule/src/mgr/clock_manager.cpp | 9 +- 4 files changed, 12 insertions(+), 220 deletions(-) delete mode 100644 Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp delete mode 100644 Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 9146adf7..1ca1f922 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -50,8 +50,6 @@ #include #include "../mapping/mem_map.hpp" #include "../soc/dram_mrr.hpp" -#include "../i2c/max77620_wdt.hpp" - namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -65,52 +63,13 @@ namespace board { u32 fd = 0, fd2 = 0; - #define PMC_BASE 0x7000E400 - #define APB_MISC_GP_HIDREV 0x804 - #define GP_HIDREV_MAJOR_T210 0x1 - #define GP_HIDREV_MAJOR_T210B01 0x2 - #define APB_BASE 0x70000000 - #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) - #define FUSE_OFFSET 0x800 - - constexpr u32 pscDependencies[] = { PscPmModuleId_Olsc }; - constexpr PscPmModuleId PscModuleId = (PscPmModuleId)705; - - PscPmModule s_pscModule; - bool s_pscPrepared = false; - Thread s_pscThread; - bool s_pscExit = false; - - std::atomic_bool s_isAwake = true; - - void PscThreadFunc(void *) { - while (!s_pscExit) { - Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); - if (R_FAILED(rc)) { - continue; // Timeout - } - - PscPmState state; - u32 flags; - rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); - if (R_SUCCEEDED(rc)) { - if (state == PscPmState_Awake) { - i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); - s_isAwake = true; - } else if (state == PscPmState_ReadySleep) { - i2c::wdt::Disarm(); - s_isAwake = false; - } else if (state == PscPmState_ReadyShutdown) { - i2c::wdt::Disarm(); - s_isAwake = false; - - } - - pscPmModuleAcknowledge(&s_pscModule, state); - } - } - } - +#define PMC_BASE 0x7000E400 +#define APB_MISC_GP_HIDREV 0x804 +#define GP_HIDREV_MAJOR_T210 0x1 +#define GP_HIDREV_MAJOR_T210B01 0x2 +#define APB_BASE 0x70000000 +#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) +#define FUSE_OFFSET 0x800 void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); @@ -239,21 +198,6 @@ namespace board { CacheDfllData(); CacheGpuVoltTable(); - - rc = pscmInitialize(); - ASSERT_RESULT_OK(rc, "pscmInitialize"); - - rc = pscmGetPmModule(&s_pscModule, PscModuleId, pscDependencies, sizeof(pscDependencies) / sizeof(u32), true); - ASSERT_RESULT_OK(rc, "pscmGetPmModule"); - - rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); - ASSERT_RESULT_OK(rc, "threadCreate"); - - rc = threadStart(&s_pscThread); - ASSERT_RESULT_OK(rc, "threadStart"); - - /* Arm the watchdog */ - i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); } void Exit() { @@ -284,16 +228,6 @@ namespace board { batteryInfoExit(); pmdmntExit(); nvExit(); - - eventFire(&s_pscModule.event); - threadWaitForExit(&s_pscThread); - threadClose(&s_pscThread); - - pscPmModuleFinalize(&s_pscModule); - pscPmModuleClose(&s_pscModule); - pscmExit(); - - i2c::wdt::Disarm(); } HocClkSocType GetSocType() { diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp deleted file mode 100644 index 803741b5..00000000 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "max77620_wdt.hpp" - -/* PMIC Registers */ -#define MAX77620_REG_CNFGGLBL2 ((u8)0x01) -#define MAX77620_REG_CNFGGLBL3 ((u8)0x02) -#define MAX77620_REG_ONOFFCNFG2 ((u8)0x42) - -/* CNFGGLBL2 bits */ -#define MAX77620_WDTOFFC ((u8)(1u << 4)) /* WDT clear in OFF mode */ -#define MAX77620_WDTSLPC ((u8)(1u << 3)) /* WDT clear in sleep mode */ -#define MAX77620_WDTEN ((u8)(1u << 2)) /* WDT enabled */ - -/* Watchdog timeout period (CNFGGLBL2[1:0]) */ -#define MAX77620_TWD_MASK ((u8)0x03) -#define MAX77620_TWD_2s ((u8)0x00) -#define MAX77620_TWD_16s ((u8)0x01) -#define MAX77620_TWD_64s ((u8)0x02) -#define MAX77620_TWD_128s ((u8)0x03) - -/* CNFGGLBL3 watchdog-clear field (WDTC[1:0]). Writing 0x1 disables WDT. */ -#define MAX77620_WDTC_MASK ((u8)0x03) -#define MAX77620_WDTC_KICK ((u8)0x01) - -/* ONOFFCNFG2 bits */ -#define MAX77620_ONOFFCNFG2_WD_RST_WK ((u8)(1u << 6)) - -/* Is this a watchdog or a watchcat, that is the question */ - -namespace i2c::wdt { - - static Result update_bits(u8 reg, u8 mask, u8 val) { - u8 cur; - Result rc; - - rc = I2cRead_OutU8(I2cDevice_Max77620Pmic, reg, &cur); - if (R_FAILED(rc)) - return rc; - - cur = (u8)((cur & (u8)~mask) | (val & mask)); - return I2cSet_U8(I2cDevice_Max77620Pmic, reg, cur); - } - - void Arm(max77620_wdt_time_t timeout) { - Result rc; - u8 twd; - - if ((int)timeout < (int)MAX77620_WDT_2S || (int)timeout > (int)MAX77620_WDT_128S) - return; - - twd = (u8)timeout; - - /* WDT expiry results in a restart */ - rc = update_bits(MAX77620_REG_ONOFFCNFG2, - MAX77620_ONOFFCNFG2_WD_RST_WK, - MAX77620_ONOFFCNFG2_WD_RST_WK); - ASSERT_RESULT_OK(rc, "update_bits"); - - /* Clear WDT in OFF and sleep modes. */ - rc = update_bits(MAX77620_REG_CNFGGLBL2, - (u8)(MAX77620_WDTOFFC | MAX77620_WDTSLPC), - (u8)(MAX77620_WDTOFFC | MAX77620_WDTSLPC)); - ASSERT_RESULT_OK(rc, "update_bits"); - - /* Do what the kernel dows */ - rc = update_bits(MAX77620_REG_CNFGGLBL3, - MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); - ASSERT_RESULT_OK(rc, "update_bits"); - - /* Program the period. */ - rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_TWD_MASK, twd); - ASSERT_RESULT_OK(rc, "update_bits"); - - /* Enable. */ - rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, MAX77620_WDTEN); - ASSERT_RESULT_OK(rc, "update_bits"); - } - - void Disarm() { - Result rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, (u8)0x00); - ASSERT_RESULT_OK(rc, "update_bits"); - } - - void Pet() { - Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); - ASSERT_RESULT_OK(rc, "update_bits"); - } - -} // namespace pwr::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp deleted file mode 100644 index 25baa408..00000000 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include "i2cDrv.h" -#include "../file/errors.hpp" - -namespace i2c::wdt { - - typedef enum { - MAX77620_WDT_2S = 0, /* ~2 seconds */ - MAX77620_WDT_16S = 1, /* ~16 seconds */ - MAX77620_WDT_64S = 2, /* ~64 seconds */ - MAX77620_WDT_128S = 3, /* ~128 seconds */ - } max77620_wdt_time_t; - - void Arm(max77620_wdt_time_t timeout); - void Disarm(); - - void Pet(); - -} // namespace pwr::wdt diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index a2d2b1da..03a9ed26 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -44,8 +44,6 @@ #include "../util/lockable_mutex.h" #include "clock_manager.hpp" #include "governor.hpp" -#include "../i2c/max77620_wdt.hpp" - #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) @@ -881,7 +879,10 @@ namespace mgr { } void WaitForNextTick() { - i2c::wdt::Pet(); - svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); + + if (board::GetHz(HocClkModule_MEM) > 665000000) + svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); + else + svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode } } // namespace mgr From eae39374a8409cffa44cbe8cfd50182d88059b98 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 4 Oct 2026 15:06:17 -0400 Subject: [PATCH 155/205] Reapply "hocclk: add watchdog" This reverts commit 1f1c28875c38cdcd0fc54091ee417109f5257acb. --- Source/hoc-clk/sysmodule/src/board/board.cpp | 80 +++++++++++-- .../sysmodule/src/i2c/max77620_wdt.cpp | 106 ++++++++++++++++++ .../sysmodule/src/i2c/max77620_wdt.hpp | 37 ++++++ .../sysmodule/src/mgr/clock_manager.cpp | 9 +- 4 files changed, 220 insertions(+), 12 deletions(-) create mode 100644 Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp create mode 100644 Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 1ca1f922..9146adf7 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -50,6 +50,8 @@ #include #include "../mapping/mem_map.hpp" #include "../soc/dram_mrr.hpp" +#include "../i2c/max77620_wdt.hpp" + namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -63,13 +65,52 @@ namespace board { u32 fd = 0, fd2 = 0; -#define PMC_BASE 0x7000E400 -#define APB_MISC_GP_HIDREV 0x804 -#define GP_HIDREV_MAJOR_T210 0x1 -#define GP_HIDREV_MAJOR_T210B01 0x2 -#define APB_BASE 0x70000000 -#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) -#define FUSE_OFFSET 0x800 + #define PMC_BASE 0x7000E400 + #define APB_MISC_GP_HIDREV 0x804 + #define GP_HIDREV_MAJOR_T210 0x1 + #define GP_HIDREV_MAJOR_T210B01 0x2 + #define APB_BASE 0x70000000 + #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) + #define FUSE_OFFSET 0x800 + + constexpr u32 pscDependencies[] = { PscPmModuleId_Olsc }; + constexpr PscPmModuleId PscModuleId = (PscPmModuleId)705; + + PscPmModule s_pscModule; + bool s_pscPrepared = false; + Thread s_pscThread; + bool s_pscExit = false; + + std::atomic_bool s_isAwake = true; + + void PscThreadFunc(void *) { + while (!s_pscExit) { + Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); + if (R_FAILED(rc)) { + continue; // Timeout + } + + PscPmState state; + u32 flags; + rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); + if (R_SUCCEEDED(rc)) { + if (state == PscPmState_Awake) { + i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); + s_isAwake = true; + } else if (state == PscPmState_ReadySleep) { + i2c::wdt::Disarm(); + s_isAwake = false; + } else if (state == PscPmState_ReadyShutdown) { + i2c::wdt::Disarm(); + s_isAwake = false; + + } + + pscPmModuleAcknowledge(&s_pscModule, state); + } + } + } + void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); @@ -198,6 +239,21 @@ namespace board { CacheDfllData(); CacheGpuVoltTable(); + + rc = pscmInitialize(); + ASSERT_RESULT_OK(rc, "pscmInitialize"); + + rc = pscmGetPmModule(&s_pscModule, PscModuleId, pscDependencies, sizeof(pscDependencies) / sizeof(u32), true); + ASSERT_RESULT_OK(rc, "pscmGetPmModule"); + + rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); + ASSERT_RESULT_OK(rc, "threadCreate"); + + rc = threadStart(&s_pscThread); + ASSERT_RESULT_OK(rc, "threadStart"); + + /* Arm the watchdog */ + i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); } void Exit() { @@ -228,6 +284,16 @@ namespace board { batteryInfoExit(); pmdmntExit(); nvExit(); + + eventFire(&s_pscModule.event); + threadWaitForExit(&s_pscThread); + threadClose(&s_pscThread); + + pscPmModuleFinalize(&s_pscModule); + pscPmModuleClose(&s_pscModule); + pscmExit(); + + i2c::wdt::Disarm(); } HocClkSocType GetSocType() { diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp new file mode 100644 index 00000000..803741b5 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -0,0 +1,106 @@ +/* + * + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "max77620_wdt.hpp" + +/* PMIC Registers */ +#define MAX77620_REG_CNFGGLBL2 ((u8)0x01) +#define MAX77620_REG_CNFGGLBL3 ((u8)0x02) +#define MAX77620_REG_ONOFFCNFG2 ((u8)0x42) + +/* CNFGGLBL2 bits */ +#define MAX77620_WDTOFFC ((u8)(1u << 4)) /* WDT clear in OFF mode */ +#define MAX77620_WDTSLPC ((u8)(1u << 3)) /* WDT clear in sleep mode */ +#define MAX77620_WDTEN ((u8)(1u << 2)) /* WDT enabled */ + +/* Watchdog timeout period (CNFGGLBL2[1:0]) */ +#define MAX77620_TWD_MASK ((u8)0x03) +#define MAX77620_TWD_2s ((u8)0x00) +#define MAX77620_TWD_16s ((u8)0x01) +#define MAX77620_TWD_64s ((u8)0x02) +#define MAX77620_TWD_128s ((u8)0x03) + +/* CNFGGLBL3 watchdog-clear field (WDTC[1:0]). Writing 0x1 disables WDT. */ +#define MAX77620_WDTC_MASK ((u8)0x03) +#define MAX77620_WDTC_KICK ((u8)0x01) + +/* ONOFFCNFG2 bits */ +#define MAX77620_ONOFFCNFG2_WD_RST_WK ((u8)(1u << 6)) + +/* Is this a watchdog or a watchcat, that is the question */ + +namespace i2c::wdt { + + static Result update_bits(u8 reg, u8 mask, u8 val) { + u8 cur; + Result rc; + + rc = I2cRead_OutU8(I2cDevice_Max77620Pmic, reg, &cur); + if (R_FAILED(rc)) + return rc; + + cur = (u8)((cur & (u8)~mask) | (val & mask)); + return I2cSet_U8(I2cDevice_Max77620Pmic, reg, cur); + } + + void Arm(max77620_wdt_time_t timeout) { + Result rc; + u8 twd; + + if ((int)timeout < (int)MAX77620_WDT_2S || (int)timeout > (int)MAX77620_WDT_128S) + return; + + twd = (u8)timeout; + + /* WDT expiry results in a restart */ + rc = update_bits(MAX77620_REG_ONOFFCNFG2, + MAX77620_ONOFFCNFG2_WD_RST_WK, + MAX77620_ONOFFCNFG2_WD_RST_WK); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Clear WDT in OFF and sleep modes. */ + rc = update_bits(MAX77620_REG_CNFGGLBL2, + (u8)(MAX77620_WDTOFFC | MAX77620_WDTSLPC), + (u8)(MAX77620_WDTOFFC | MAX77620_WDTSLPC)); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Do what the kernel dows */ + rc = update_bits(MAX77620_REG_CNFGGLBL3, + MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Program the period. */ + rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_TWD_MASK, twd); + ASSERT_RESULT_OK(rc, "update_bits"); + + /* Enable. */ + rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, MAX77620_WDTEN); + ASSERT_RESULT_OK(rc, "update_bits"); + } + + void Disarm() { + Result rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, (u8)0x00); + ASSERT_RESULT_OK(rc, "update_bits"); + } + + void Pet() { + Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); + ASSERT_RESULT_OK(rc, "update_bits"); + } + +} // namespace pwr::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp new file mode 100644 index 00000000..25baa408 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include "i2cDrv.h" +#include "../file/errors.hpp" + +namespace i2c::wdt { + + typedef enum { + MAX77620_WDT_2S = 0, /* ~2 seconds */ + MAX77620_WDT_16S = 1, /* ~16 seconds */ + MAX77620_WDT_64S = 2, /* ~64 seconds */ + MAX77620_WDT_128S = 3, /* ~128 seconds */ + } max77620_wdt_time_t; + + void Arm(max77620_wdt_time_t timeout); + void Disarm(); + + void Pet(); + +} // namespace pwr::wdt diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 03a9ed26..a2d2b1da 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -44,6 +44,8 @@ #include "../util/lockable_mutex.h" #include "clock_manager.hpp" #include "governor.hpp" +#include "../i2c/max77620_wdt.hpp" + #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) @@ -879,10 +881,7 @@ namespace mgr { } void WaitForNextTick() { - - if (board::GetHz(HocClkModule_MEM) > 665000000) - svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); - else - svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode + i2c::wdt::Pet(); + svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); } } // namespace mgr From e9d01a08785a49e9b9fb8f66ab9f8be0ce570350 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 4 Oct 2026 16:39:09 -0400 Subject: [PATCH 156/205] add watchcat --- .../common/include/hocclk/clock_manager.h | 3 +- Source/hoc-clk/common/include/hocclk/config.h | 6 ++- .../hoc-clk/overlay/src/ui/gui/about_gui.cpp | 5 ++ .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 1 + Source/hoc-clk/sysmodule/src/board/board.cpp | 6 +-- .../sysmodule/src/i2c/max77620_wdt.cpp | 52 +++++++++++++++++-- .../sysmodule/src/i2c/max77620_wdt.hpp | 6 ++- .../sysmodule/src/mgr/clock_manager.cpp | 2 + 8 files changed, 69 insertions(+), 12 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index eaf89b55..73978ec2 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -83,7 +83,8 @@ typedef struct { bool isKipLoaded; bool rebootRequired; bool isFirstLoad; - + + bool isWdtEnabled; // Reserved for future use u8 reserved[0x358]; } HocClkContext; diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 3bc27fa4..89d5baae 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -79,6 +79,8 @@ typedef enum { HocClkConfigValue_AutoRamCpuCpuOCFreq, HocClkConfigValue_AutoRamCpuRamOCThreshold, + HocClkConfigValue_Watchdog, + KipConfigValue_custRev, KipConfigValue_KipVersion, // KipConfigValue_mtcConf, @@ -337,7 +339,8 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr return pretty ? "Auto High RAM CPU OC Freq" : "auto_ram_cpu_cpu_oc_freq"; case HocClkConfigValue_AutoRamCpuRamOCThreshold: return pretty ? "Auto High RAM CPU OC RAM Threshold" : "auto_ram_cpu_ram_oc_threshold"; - + case HocClkConfigValue_Watchdog: + return pretty ? "Watchcat" : "watchdog"; // More dignified // KIP config values case KipConfigValue_custRev: return pretty ? "Custom Revision" : "kip_cust_rev"; @@ -656,6 +659,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_MarikoMiddleFreqs: case HocClkConfigValue_LiveGpuVoltage: case HocClkConfigValue_AutoRAMCPUOverclock: + case HocClkConfigValue_Watchdog: return (input & 0x1) == input; case KipConfigValue_KipVersion: diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 322cb480..a728757a 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -44,6 +44,7 @@ tsl::elm::ListItem* aotagTempItem = NULL; tsl::elm::ListItem* dramTempItem = NULL; tsl::elm::ListItem* cTypeItem = NULL; tsl::elm::ListItem* creditsItem = NULL; +tsl::elm::ListItem* wdtItem = NULL; #define R_ARROW "\u2192" @@ -159,6 +160,9 @@ void AboutGui::listUI() kipLoadedItem = new tsl::elm::ListItem("KIP status:"); this->listElement->addItem(kipLoadedItem); + wdtItem = new tsl::elm::ListItem("Watchcat:"); + this->listElement->addItem(wdtItem); + if(!IsHoag()) { sysdockStatusItem = new tsl::elm::ListItem("sys-dock status:"); @@ -282,6 +286,7 @@ void AboutGui::refresh() dramTempItem->setValue(strings[12]); cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); + wdtItem->setValue(context->isWdtEnabled ? "Enabled" : "Disabled"); } class CreditsSubMenu : public AboutGui { diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 2d433860..e02cfc88 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1191,6 +1191,7 @@ class SafetySubMenuGui : public MiscGui { this->listElement->addItem(new CompactCategoryHeader("Safety Settings")); addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr); addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr); + addConfigToggle(HocClkConfigValue_Watchdog, nullptr); #if IS_MINIMAL == 0 ValueThresholds throttleThresholds(70, 80); diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 9146adf7..69bd3d5d 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -95,7 +95,8 @@ namespace board { rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); if (R_SUCCEEDED(rc)) { if (state == PscPmState_Awake) { - i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); + i2c::wdt::ResetWdtEnableState(); + i2c::wdt::Pet(); s_isAwake = true; } else if (state == PscPmState_ReadySleep) { i2c::wdt::Disarm(); @@ -251,9 +252,6 @@ namespace board { rc = threadStart(&s_pscThread); ASSERT_RESULT_OK(rc, "threadStart"); - - /* Arm the watchdog */ - i2c::wdt::Arm(i2c::wdt::MAX77620_WDT_2S); } void Exit() { diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp index 803741b5..c6dca098 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -1,5 +1,5 @@ /* - * + * * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it @@ -17,6 +17,9 @@ */ #include "max77620_wdt.hpp" +#include "../file/config.hpp" +#include +#include /* PMIC Registers */ #define MAX77620_REG_CNFGGLBL2 ((u8)0x01) @@ -46,6 +49,9 @@ namespace i2c::wdt { + static LockableMutex g_wdt_mutex; + static bool isWdtEnabled = false; + static Result update_bits(u8 reg, u8 mask, u8 val) { u8 cur; Result rc; @@ -58,7 +64,11 @@ namespace i2c::wdt { return I2cSet_U8(I2cDevice_Max77620Pmic, reg, cur); } - void Arm(max77620_wdt_time_t timeout) { + static void ArmLocked(max77620_wdt_time_t timeout) { + if (isWdtEnabled) { + return; + } + Result rc; u8 twd; @@ -91,16 +101,48 @@ namespace i2c::wdt { /* Enable. */ rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, MAX77620_WDTEN); ASSERT_RESULT_OK(rc, "update_bits"); + + isWdtEnabled = true; } void Disarm() { + if (!isWdtEnabled) { + return; + } + Result rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, (u8)0x00); ASSERT_RESULT_OK(rc, "update_bits"); + + isWdtEnabled = false; + } + + void ResetWdtEnableState() { + std::scoped_lock lock{g_wdt_mutex}; + + isWdtEnabled = false; + } + + void Arm(max77620_wdt_time_t timeout) { + std::scoped_lock lock{g_wdt_mutex}; + + ArmLocked(timeout); + } + + bool IsWdtEnabled() { + return isWdtEnabled; } void Pet() { - Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); - ASSERT_RESULT_OK(rc, "update_bits"); + const bool watchdogEnabled = file::config::GetConfigValue(HocClkConfigValue_Watchdog); + std::scoped_lock lock{g_wdt_mutex}; + + if (watchdogEnabled) { + ArmLocked(i2c::wdt::MAX77620_WDT_2S); + Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); + ASSERT_RESULT_OK(rc, "update_bits"); + } else { + Disarm(); + } } -} // namespace pwr::wdt +} // namespace i2c::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp index 25baa408..005ef6e0 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp @@ -15,6 +15,8 @@ * */ +#pragma once + #include #include #include "i2cDrv.h" @@ -34,4 +36,6 @@ namespace i2c::wdt { void Pet(); -} // namespace pwr::wdt + void ResetWdtEnableState(); + bool IsWdtEnabled(); +} // namespace i2c::wdt diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index a2d2b1da..c2fb455e 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -779,6 +779,8 @@ namespace mgr { else gContext.resolutionHeight = 0; // N/A + gContext.isWdtEnabled = i2c::wdt::IsWdtEnabled(); + return hasChanged; } From 930f2efe637a925cd6553aa720cb10ade4400d77 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 4 Oct 2026 18:37:38 -0400 Subject: [PATCH 157/205] add CPU DVFS skeleton --- Source/hoc-clk/sysmodule/src/board/board.cpp | 8 +- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 + .../sysmodule/src/board/board_fuse.cpp | 29 +++ .../sysmodule/src/board/board_fuse.hpp | 1 + .../sysmodule/src/board/board_volt.cpp | 188 ++++++++++-------- .../sysmodule/src/board/board_volt.hpp | 2 +- .../sysmodule/src/mgr/clock_manager.cpp | 2 +- Source/hoc-clk/sysmodule/src/soc/registers.h | 1 + 8 files changed, 147 insertions(+), 86 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 69bd3d5d..68f18e53 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -61,6 +61,8 @@ namespace board { HocClkConsoleType gConsoleType = HocClkConsoleType_Icosa; FuseData fuseData; u8 speedoBracket; + u8 CpuSpeedoBracket; + PwmChannelSession iCon; u32 fd = 0, fd2 = 0; @@ -115,7 +117,7 @@ namespace board { void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); - + SetCpuBracket(fuseData.cpuSpeedo, CpuSpeedoBracket); u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV); if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) { gSocType = HocClkSocType_Mariko; @@ -339,4 +341,8 @@ namespace board { return speedoBracket; } + u8 GetCpuSpeedoBracket() { + return CpuSpeedoBracket; + } + } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 0ba40487..6dec814b 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -56,6 +56,8 @@ namespace board { u8 GetFuseDramId(); u8 GetDramID(); u8 GetGpuSpeedoBracket(); + u8 GetCpuSpeedoBracket(); + bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index 3fd3b849..76021617 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -60,6 +60,35 @@ namespace board { } } + void SetCpuBracket(u16 speedo, u8 &cpuBracket) { + switch (speedo) { + // Mariko + case 1451 ... 1500: + cpuBracket = 6; + break; + case 1501 ... 1550: + cpuBracket = 5; + break; + case 1551 ... 1600: + cpuBracket = 4; + break; + case 1601 ... 1650: + cpuBracket = 3; + break; + case 1651 ... 1700: + cpuBracket = 2; + break; + case 1701 ... 1750: + cpuBracket = 1; + break; + case 1751 ... 1800: + cpuBracket = 0; + break; + default: + cpuBracket = 6; + } + } + void ReadFuses(FuseData &speedo, u64 fuseVa) { constexpr u32 FuseOffset = 0x800; u8 *fusePtr = reinterpret_cast(fuseVa) + FuseOffset; diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp index 5d81f835..9c9a961c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp @@ -36,5 +36,6 @@ namespace board { void ReadFuses(FuseData &speedo, u64 fuseVa); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket); + void SetCpuBracket(u16 speedo, u8 &cpuBracket); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 21d0e3e1..b53946a7 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -30,6 +30,7 @@ #include "board.hpp" #include "board_freq.hpp" #include "board_volt.hpp" +#include "../i2c/max77620_wdt.hpp" namespace board { @@ -456,6 +457,11 @@ namespace board { } } + struct DvfsEntry { + u32 freq; + u32 volt; + }; + u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) { u32 baseVolt = 800; if (GetSocType() == HocClkSocType_Mariko) { @@ -511,89 +517,38 @@ namespace board { } return baseVolt; } else { - struct DvfsEntry { - u32 freq; - u32 volt; - }; - static const DvfsEntry ramTable[][19] = { - { { 1733, 725 }, - { 1800, 730 }, - { 1866, 735 }, - { 1920, 740 }, - { 1958, 745 }, - { 1996, 750 }, - { 2035, 755 }, - { 2073, 760 }, - { 2112, 765 }, - { 2131, 770 }, - { 2150, 775 }, - { 2169, 780 }, - { 2188, 785 }, - { 2227, 790 }, - { 2265, 795 }, - { 2304, 800 }, - { 2342, 805 }, - { 2380, 810 }, - { 2400, 815 } }, // Bracket 0 - { { 1733, 715 }, - { 1800, 720 }, - { 1866, 725 }, - { 1920, 730 }, - { 1958, 735 }, - { 1996, 740 }, - { 2035, 745 }, - { 2073, 750 }, - { 2112, 755 }, - { 2131, 760 }, - { 2150, 765 }, - { 2169, 770 }, - { 2188, 775 }, - { 2227, 780 }, - { 2265, 785 }, - { 2304, 790 }, - { 2342, 795 }, - { 2380, 800 }, - { 2400, 805 } }, // Bracket 1 - { { 1733, 705 }, - { 1800, 710 }, - { 1866, 715 }, - { 1920, 720 }, - { 1958, 725 }, - { 1996, 730 }, - { 2035, 735 }, - { 2073, 740 }, - { 2112, 745 }, - { 2131, 750 }, - { 2150, 755 }, - { 2169, 760 }, - { 2188, 765 }, - { 2227, 770 }, - { 2265, 775 }, - { 2304, 780 }, - { 2342, 785 }, - { 2380, 790 }, - { 2400, 795 } }, // Bracket 2 - { { 1733, 695 }, - { 1800, 700 }, - { 1866, 705 }, - { 1920, 710 }, - { 1958, 715 }, - { 1996, 720 }, - { 2035, 725 }, - { 2073, 730 }, - { 2112, 735 }, - { 2131, 740 }, - { 2150, 745 }, - { 2169, 750 }, - { 2188, 755 }, - { 2227, 760 }, - { 2265, 765 }, - { 2304, 770 }, - { 2342, 775 }, - { 2380, 780 }, - { 2400, 785 } }, // Bracket 3 - }; + static const DvfsEntry ramTable[][19] = { + { // Bracket 0 + {1733, 725}, {1800, 730}, {1866, 735}, {1920, 740}, + {1958, 745}, {1996, 750}, {2035, 755}, {2073, 760}, + {2112, 765}, {2131, 770}, {2150, 775}, {2169, 780}, + {2188, 785}, {2227, 790}, {2265, 795}, {2304, 800}, + {2342, 805}, {2380, 810}, {2400, 815} + }, + { // Bracket 1 + {1733, 715}, {1800, 720}, {1866, 725}, {1920, 730}, + {1958, 735}, {1996, 740}, {2035, 745}, {2073, 750}, + {2112, 755}, {2131, 760}, {2150, 765}, {2169, 770}, + {2188, 775}, {2227, 780}, {2265, 785}, {2304, 790}, + {2342, 795}, {2380, 800}, {2400, 805} + }, + { // Bracket 2 + {1733, 705}, {1800, 710}, {1866, 715}, {1920, 720}, + {1958, 725}, {1996, 730}, {2035, 735}, {2073, 740}, + {2112, 745}, {2131, 750}, {2150, 755}, {2169, 760}, + {2188, 765}, {2227, 770}, {2265, 775}, {2304, 780}, + {2342, 785}, {2380, 790}, {2400, 795} + }, + { // Bracket 3 + {1733, 695}, {1800, 700}, {1866, 705}, {1920, 710}, + {1958, 715}, {1996, 720}, {2035, 725}, {2073, 730}, + {2112, 735}, {2131, 740}, {2150, 745}, {2169, 750}, + {2188, 755}, {2227, 760}, {2265, 765}, {2304, 770}, + {2342, 775}, {2380, 780}, {2400, 785} + }, + }; + if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin if (bracket >= std::size(ramTable)) @@ -610,4 +565,71 @@ namespace board { return baseVolt; } } -} // namespace board \ No newline at end of file + /* TODO: Verify table on consoles */ + const DvfsEntry CpuVminRamTable[/* Bracket */7][/* Entry */12] = { + { {1866, 550}, {1996, 560}, {2133, 570}, {2400, 580}, {2533, 590}, {2666, 600}, {2800, 610}, {2933, 620}, {3066, 630}, {3200, 640}, {3333, 660}, {3466, 680} }, // Bracket 0 (Speedo 1751-1800) + { {1866, 555}, {1996, 565}, {2133, 575}, {2400, 585}, {2533, 595}, {2666, 605}, {2800, 615}, {2933, 625}, {3066, 635}, {3200, 645}, {3333, 665}, {3466, 685} }, // Bracket 1 (Speedo 1701-1750) + { {1866, 560}, {1996, 570}, {2133, 580}, {2400, 590}, {2533, 600}, {2666, 610}, {2800, 620}, {2933, 630}, {3066, 640}, {3200, 650}, {3333, 670}, {3466, 690} }, // Bracket 2 (Speedo 1651-1700) + { {1866, 565}, {1996, 575}, {2133, 585}, {2400, 595}, {2533, 605}, {2666, 615}, {2800, 625}, {2933, 635}, {3066, 645}, {3200, 655}, {3333, 675}, {3466, 695} }, // Bracket 3 (Speedo 1601-1650) + { {1866, 570}, {1996, 580}, {2133, 590}, {2400, 600}, {2533, 610}, {2666, 620}, {2800, 630}, {2933, 640}, {3066, 650}, {3200, 660}, {3333, 680}, {3466, 700} }, // Bracket 4 (Speedo 1551-1600) + { {1866, 575}, {1996, 585}, {2133, 595}, {2400, 605}, {2533, 615}, {2666, 625}, {2800, 635}, {2933, 645}, {3066, 655}, {3200, 665}, {3333, 685}, {3466, 705} }, // Bracket 5 (Speedo 1501-1550) + { {1866, 580}, {1996, 590}, {2133, 600}, {2400, 610}, {2533, 620}, {2666, 630}, {2800, 640}, {2933, 650}, {3066, 660}, {3200, 670}, {3333, 690}, {3466, 710} }, // Bracket 6 (Speedo 1451-1500) + }; + + u32 GetMinimumCpuVmin(u32 freqMhz, u32 bracket) { + if (freqMhz <= 1600) + return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + if (bracket >= std::size(CpuVminRamTable)) + bracket = 0; + + const auto &entries = CpuVminRamTable[bracket]; + u32 baseVolt = entries[std::size(entries) - 1].volt; + for (const auto &entry : entries) { + if (freqMhz <= entry.freq) { + baseVolt = entry.volt; + break; + } + } + return baseVolt; + } + + constexpr u32 PmicVmin = 250; + constexpr u32 PmicStep = 5; + + u32 ConvertVoltToLut(u32 mv) { + /* Refer to TRM 6.1.19 */ + return (mv - PmicVmin) / PmicStep; + } + + void ApplyCpuDvfs(u32 ramFreqMhz) { + /* Get the minimum DRAM OC Cpu Vmin */ + u32 vmin = GetMinimumCpuVmin(ramFreqMhz, GetCpuSpeedoBracket()); + + /* Create the new modified CPU LUT buffer */ + u32 NewCpuVoltTable[32] = { 0 }; + memcpy(NewCpuVoltTable, cpuVoltTable, sizeof(NewCpuVoltTable)); + + /* Apply the new vmin to the reconstructed table and convert it to the appropriate format */ + for(auto &vlt : NewCpuVoltTable) { + /* Will never run on freq zero so it just converts the table */ + if(vlt < vmin) { + vlt = vmin; + } + + /* Don't know if modifying and passing argument causes undefined behavior? */ + u32 tempVlt = vlt; + vlt = ConvertVoltToLut(tempVlt); + } + + /* Pet the watchdog to avoid it hanging the system during this operation */ + i2c::wdt::Pet(); + + /* DSB to prevent a hang during setting the new LUT */ + __asm__("dsb SY"); + + /* Copy the edited LUT into it's appropriate location */ + memcpy((void*)(cldvfs + CL_DVFS_OUTPUT_LUT_0), NewCpuVoltTable, sizeof(NewCpuVoltTable)); + + } +} // namespace board + diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index bf47470f..4dd20803 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -59,5 +59,5 @@ namespace board { void PcvHijackGpuVolts(u32 vmin); void PcvHijackGpuFrequency(u32 voltage, u32 hz); u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); - + void ApplyCpuDvfs(u32 ramFreqMhz); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index c2fb455e..cc971dd0 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -780,7 +780,7 @@ namespace mgr { gContext.resolutionHeight = 0; // N/A gContext.isWdtEnabled = i2c::wdt::IsWdtEnabled(); - + return hasChanged; } diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index 8e2be21d..023a90bc 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -525,6 +525,7 @@ #define CL_DVFS_I2C_STS_0 0x48 #define CL_DVFS_INTR_STS_0 0x5C #define CL_DVFS_I2C_CLK_DIVISOR_REGISTER_0 0x16C +#define CL_DVFS_OUTPUT_LUT_0 0x200 // Typo in TRM that says 0x20, correct value is 0x200. #define CLK_SOURCE_EMC 0x19c From befe98fa4b8c0354bcfc8724f84cc4bb5ee5c159 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 4 Oct 2026 18:45:40 -0400 Subject: [PATCH 158/205] Fix watchdog mutexing hang Due to how everything is on Core3 it should be good to not have mutexes --- Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp index c6dca098..22937f8b 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -49,7 +49,6 @@ namespace i2c::wdt { - static LockableMutex g_wdt_mutex; static bool isWdtEnabled = false; static Result update_bits(u8 reg, u8 mask, u8 val) { @@ -64,7 +63,7 @@ namespace i2c::wdt { return I2cSet_U8(I2cDevice_Max77620Pmic, reg, cur); } - static void ArmLocked(max77620_wdt_time_t timeout) { + void Arm(max77620_wdt_time_t timeout) { if (isWdtEnabled) { return; } @@ -117,27 +116,19 @@ namespace i2c::wdt { } void ResetWdtEnableState() { - std::scoped_lock lock{g_wdt_mutex}; isWdtEnabled = false; } - void Arm(max77620_wdt_time_t timeout) { - std::scoped_lock lock{g_wdt_mutex}; - - ArmLocked(timeout); - } - bool IsWdtEnabled() { return isWdtEnabled; } void Pet() { const bool watchdogEnabled = file::config::GetConfigValue(HocClkConfigValue_Watchdog); - std::scoped_lock lock{g_wdt_mutex}; if (watchdogEnabled) { - ArmLocked(i2c::wdt::MAX77620_WDT_2S); + Arm(i2c::wdt::MAX77620_WDT_2S); Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); ASSERT_RESULT_OK(rc, "update_bits"); } else { From a8f221aed82fa0d259f835d7d2d8c3225e70b18d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 4 Oct 2026 20:52:27 -0400 Subject: [PATCH 159/205] hocclk: actually implement cpu dvfs --- Source/hoc-clk/common/include/hocclk/board.h | 8 +++ Source/hoc-clk/common/include/hocclk/config.h | 31 ++++++--- .../src/ui/gui/config_info_strings.cpp | 20 +++++- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 25 ++++++- .../sysmodule/src/board/board_volt.cpp | 17 ++++- .../sysmodule/src/i2c/max77620_wdt.cpp | 4 ++ .../sysmodule/src/mgr/clock_manager.cpp | 69 ++++++++++++++++--- 7 files changed, 148 insertions(+), 26 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 351f3179..99a609a5 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -143,6 +143,14 @@ enum { DVFSMode_EnumMax, }; +enum { + CPUDVFSMode_Disabled = 0, + CPUDVFSMode_Modify, // LUT Modify dvfs + // DVFSMode_OfficialService, + // DVFSMode_Hack, + CPUDVFSMode_EnumMax, +}; + typedef enum { GpuSchedulingMode_DoNotOverride = 0, GpuSchedulingMode_Enabled, diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 89d5baae..34d2994b 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -52,8 +52,12 @@ typedef enum { HocClkConfigValue_OverwriteRefreshRate, HocClkConfigValue_MaxDisplayClockH, - HocClkConfigValue_DVFSMode, - HocClkConfigValue_DVFSOffset, + HocClkConfigValue_GPUDVFSMode, + HocClkConfigValue_GPUDVFSOffset, + + HocClkConfigValue_CPUDVFSMode, + HocClkConfigValue_CPUDVFSOffset, + HocClkConfigValue_LiveCpuUv, HocClkConfigValue_EnableExperimentalSettings, @@ -288,11 +292,17 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_MaxDisplayClockH: return pretty ? "Max Display Clock (Handheld)" : "drr_max_clock"; - case HocClkConfigValue_DVFSMode: - return pretty ? "DVFS Mode" : "dvfs_mode"; + case HocClkConfigValue_GPUDVFSMode: + return pretty ? "GPU DVFS Mode" : "dvfs_mode"; - case HocClkConfigValue_DVFSOffset: - return pretty ? "DVFS Offset" : "dvfs_offset"; + case HocClkConfigValue_GPUDVFSOffset: + return pretty ? "GPU DVFS Offset" : "dvfs_offset"; + + case HocClkConfigValue_CPUDVFSMode: + return pretty ? "CPU DVFS Mode" : "cpu_dvfs_mode"; + + case HocClkConfigValue_CPUDVFSOffset: + return pretty ? "CPU DVFS Offset" : "cpu_dvfs_offset"; case HocClkConfigValue_GPUScheduling: return pretty ? "GPU Scheduling" : "gpu_scheduling"; @@ -604,7 +614,8 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_ThermalThrottle: case HocClkConfigValue_IsFirstLoad: - case HocClkConfigValue_DVFSMode: + case HocClkConfigValue_GPUDVFSMode: + case HocClkConfigValue_CPUDVFSMode: return 1ULL; case HocClkConfigValue_AutoRAMCPUOverclock: return 0ULL; @@ -800,8 +811,10 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_t6_tRTW_fine_tune: case KipConfigValue_t7_tWTR_fine_tune: case KipCrc32: - case HocClkConfigValue_DVFSMode: - case HocClkConfigValue_DVFSOffset: + case HocClkConfigValue_GPUDVFSMode: + case HocClkConfigValue_GPUDVFSOffset: + case HocClkConfigValue_CPUDVFSMode: + case HocClkConfigValue_CPUDVFSOffset: case HocClkConfigValue_GPUScheduling: case HocClkConfigValue_RAMVoltDisplayMode: case HocClkConfigValue_CpuGovernorMinimumFreq: diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 51abe481..0d384311 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -506,7 +506,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 800 mV" }; - case HocClkConfigValue_DVFSMode: + case HocClkConfigValue_GPUDVFSMode: return { "The mode used for GPU DVFS", "Adjusts GPU vmin when RAM clock is changed due to a higher requirement", @@ -516,12 +516,28 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: PCV Hijack" }; - case HocClkConfigValue_DVFSOffset: + case HocClkConfigValue_GPUDVFSOffset: return { "The offset added/subtracted to the GPU vmin when the RAM clock is changed due to a higher requirement in PCV Hijack mode", "Default: 0 mV (Disabled)" }; + case HocClkConfigValue_CPUDVFSMode: + return { + "The mode used for CPU DVFS", + "Adjusts CPU vmin when RAM clock is changed due to a higher requirement", + "Options:", + "- Disabled: disabled...", + "- LUT Modify: Modify CLDVFS Lut", + "Default: LUT Modify" + }; + + case HocClkConfigValue_CPUDVFSOffset: + return { + "The offset added/subtracted to the CPU vmin when the RAM clock is changed due to a higher requirement in LUT Modify mode", + "Default: 0 mV (Disabled)" + }; + case KipConfigValue_eristaGpuUV: return { "GPU undervolt level", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index e02cfc88..08b9adbf 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2477,6 +2477,27 @@ class CpuSubmenuGui : public MiscGui { this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, maxClkOptions, false, true); + std::vector dvfsOffset = { + NamedValue("-80 mV", 0xFFFFFFB0), NamedValue("-75 mV", 0xFFFFFFB5), NamedValue("-70 mV", 0xFFFFFFBA), NamedValue("-65 mV", 0xFFFFFFBF), + NamedValue("-60 mV", 0xFFFFFFC4), NamedValue("-55 mV", 0xFFFFFFC9), NamedValue("-50 mV", 0xFFFFFFCE), NamedValue("-45 mV", 0xFFFFFFD3), + NamedValue("-40 mV", 0xFFFFFFD8), NamedValue("-35 mV", 0xFFFFFFDD), NamedValue("-30 mV", 0xFFFFFFE2), NamedValue("-25 mV", 0xFFFFFFE7), + NamedValue("-20 mV", 0xFFFFFFEC), NamedValue("-15 mV", 0xFFFFFFF1), NamedValue("-10 mV", 0xFFFFFFF6), NamedValue(" -5 mV", 0xFFFFFFFB), + NamedValue("Disabled", 0), NamedValue(" +5 mV", 5), NamedValue("+10 mV", 10), NamedValue("+15 mV", 15), + NamedValue("+20 mV", 20), + }; + + std::vector dvfsValues = { + NamedValue("Disabled", CPUDVFSMode_Disabled), + NamedValue("LUT Modify", CPUDVFSMode_Modify), + // NamedValue("Official Service", DVFSMode_OfficialService), + }; + + addConfigButton(HocClkConfigValue_CPUDVFSMode, "CPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "CPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, + false); + + addConfigButton(HocClkConfigValue_CPUDVFSOffset, "CPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "CPU DVFS Offset", &thresholdsDisabled, {}, + dvfsOffset, false); + } else { addConfigTrackbar(KipConfigValue_eristaCpuUV, "CPU UV", ValueRange(0, 5, 1)); @@ -2648,10 +2669,10 @@ class GpuSubmenuGui : public MiscGui { // NamedValue("Official Service", DVFSMode_OfficialService), }; - addConfigButton(HocClkConfigValue_DVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, + addConfigButton(HocClkConfigValue_GPUDVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, false); - addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, + addConfigButton(HocClkConfigValue_GPUDVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); tsl::elm::ListItem *customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index b53946a7..d65d099c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -25,6 +25,7 @@ #include #include "../file/file_utils.hpp" +#include "../file/config.hpp" #include "../hos/rgltr.h" #include "../i2c/i2cDrv.h" #include "board.hpp" @@ -593,6 +594,7 @@ namespace board { return baseVolt; } + /* Mariko only! */ constexpr u32 PmicVmin = 250; constexpr u32 PmicStep = 5; @@ -602,6 +604,12 @@ namespace board { } void ApplyCpuDvfs(u32 ramFreqMhz) { + /* Don't reapply the table if it has been*/ + static u32 lastRamFreqMhz = 0; + if(ramFreqMhz == lastRamFreqMhz) { + return; + } + /* Get the minimum DRAM OC Cpu Vmin */ u32 vmin = GetMinimumCpuVmin(ramFreqMhz, GetCpuSpeedoBracket()); @@ -615,7 +623,6 @@ namespace board { if(vlt < vmin) { vlt = vmin; } - /* Don't know if modifying and passing argument causes undefined behavior? */ u32 tempVlt = vlt; vlt = ConvertVoltToLut(tempVlt); @@ -624,12 +631,18 @@ namespace board { /* Pet the watchdog to avoid it hanging the system during this operation */ i2c::wdt::Pet(); - /* DSB to prevent a hang during setting the new LUT */ + /* DSB to prevent a hang during setting the new LUT. ST will not work, SY is needed */ __asm__("dsb SY"); /* Copy the edited LUT into it's appropriate location */ memcpy((void*)(cldvfs + CL_DVFS_OUTPUT_LUT_0), NewCpuVoltTable, sizeof(NewCpuVoltTable)); + + file::utils::LogLine("[cpudvfs]: Set voltage to %dmV for %dMHz", vmin, ramFreqMhz); + /* Pet the watchdog to avoid it hanging the system during this operation */ + i2c::wdt::Pet(); + svcSleepThread(100'000'000); // 100ms + lastRamFreqMhz = ramFreqMhz; } } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp index 22937f8b..a93de5c3 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -20,6 +20,7 @@ #include "../file/config.hpp" #include #include +#include "../file/file_utils.hpp" /* PMIC Registers */ #define MAX77620_REG_CNFGGLBL2 ((u8)0x01) @@ -68,6 +69,8 @@ namespace i2c::wdt { return; } + file::utils::LogLine("[Watchdog] armed"); + Result rc; u8 twd; @@ -108,6 +111,7 @@ namespace i2c::wdt { if (!isWdtEnabled) { return; } + file::utils::LogLine("[Watchdog] disarmed"); Result rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, (u8)0x00); ASSERT_RESULT_OK(rc, "update_bits"); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index cc971dd0..f38e3814 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -427,7 +427,7 @@ namespace mgr { } void ApplyGpuDvfs(u32 targetHz) { - s32 dvfsOffset = file::config::GetConfigValue(HocClkConfigValue_DVFSOffset); + s32 dvfsOffset = file::config::GetConfigValue(HocClkConfigValue_GPUDVFSOffset); dvfsOffset = std::max(dvfsOffset, -80); u32 vmin = board::GetMinimumGpuVmin(targetHz / 1000000, board::GetGpuSpeedoBracket()); @@ -450,8 +450,39 @@ namespace mgr { } } + void ApplyCpuDvfs(u32 targetHz) { + if(file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { + board::ApplyCpuDvfs(targetHz / 1'000'000); // convert to mhz + u32 ltargetHz = gContext.overrideFreqs[HocClkModule_CPU]; + if (!ltargetHz) { + ltargetHz = file::config::GetAutoClockHz(gContext.applicationId, HocClkModule_CPU, gContext.profile, false); + if (!ltargetHz) + ltargetHz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_CPU, gContext.profile, false); + } + + u32 maxHz = GetMaxAllowedHz(HocClkModule_CPU, gContext.profile); + u32 nearestHz = ltargetHz ? GetNearestHz(HocClkModule_CPU, ltargetHz, maxHz) : 0; + board::SetHz(HocClkModule_CPU, 1'785'000'000); + svcSleepThread(5'000'000); + if(nearestHz != 0) { + board::SetHz(HocClkModule_CPU, nearestHz); + } else { + board::ResetToStockCpu(); + } + } + } + + void ResetCpuDvfs() { + if(file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { + board::ApplyCpuDvfs(0); + board::SetHz(HocClkModule_CPU, 1'785'000'000); + svcSleepThread(5'000'000); + board::ResetToStockCpu(); + } + } + void DVFSReset() { - if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = GetNearestOverrideHz(HocClkModule_GPU); @@ -462,7 +493,7 @@ namespace mgr { } } - void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) { + void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv, bool didApplyCpuDvfs) { switch (module) { case HocClkModule_CPU: if (!(isBoost || (file::config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode) && isBoost))) @@ -485,6 +516,10 @@ namespace mgr { DVFSReset(); didHijackPcv = true; } + if(!didApplyCpuDvfs) { + ResetCpuDvfs(); + didApplyCpuDvfs = true; + } break; case HocClkModule_Display: if (file::config::GetConfigValue(HocClkConfigValue_OverwriteRefreshRate)) { @@ -506,9 +541,10 @@ namespace mgr { u32 nearestFreq = GetCurrentNearestFrequency(HocClkModule_MEM); if (targetRamHz != nearestFreq) { - if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetRamHz); } + ApplyCpuDvfs(targetRamHz); board::SetHz(HocClkModule_MEM, targetRamHz); } @@ -520,7 +556,7 @@ namespace mgr { std::uint32_t nearestHz = 0; static bool prepareBoostExit = false; - bool didHijackPcv = false; + bool didHijackPcv = false, didApplyCpuDvfs = false; bool skipCpuDueToBoost = isBoost && !file::config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode); if (skipCpuDueToBoost) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); @@ -570,7 +606,7 @@ namespace mgr { gContext.stable.freqs[HocClkModule_Display] = targetHz; gContext.stable.realFreqs[HocClkModule_Display] = targetHz; } else { - HandleFreqReset(HocClkModule_Display, isBoost, didHijackPcv); + HandleFreqReset(HocClkModule_Display, isBoost, didHijackPcv, didApplyCpuDvfs); } } @@ -605,9 +641,13 @@ namespace mgr { targetHz / 100000 - targetHz / 1000000 * 10); // The logic MUST be done in this order otherwise you WILL get crashes - if (module == HocClkModule_MEM && targetHz > oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz > oldHz && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } + if (module == HocClkModule_MEM && targetHz > oldHz && board::GetSocType() == HocClkSocType_Mariko) { + ApplyCpuDvfs(targetHz); + } + board::SetHz((HocClkModule)module, nearestHz); gContext.freqs[module] = nearestHz; @@ -615,15 +655,22 @@ namespace mgr { gContext.stable.freqs[module] = nearestHz; } - if (module == HocClkModule_MEM && targetHz < oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz < oldHz && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } + if (module == HocClkModule_MEM && targetHz < oldHz && board::GetSocType() == HocClkSocType_Mariko) { + ApplyCpuDvfs(targetHz); + } - if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) + if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) didHijackPcv = false; + + if(module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { + didApplyCpuDvfs = true; + } } } else { - HandleFreqReset((HocClkModule)module, isBoost, didHijackPcv); + HandleFreqReset((HocClkModule)module, isBoost, didHijackPcv, didApplyCpuDvfs); } } } @@ -652,7 +699,7 @@ namespace mgr { // restore clocks to stock values on app or profile change if (hasChanged) { board::ResetToStock(); - if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); board::ResetToStockGpu(); } From c9dafc0e2af109fcb718a2b00b7ae335b8e42845 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:30:15 +0200 Subject: [PATCH 160/205] Revert "hocclk: actually implement cpu dvfs" This reverts commit a8f221aed82fa0d259f835d7d2d8c3225e70b18d. --- Source/hoc-clk/common/include/hocclk/board.h | 8 --- Source/hoc-clk/common/include/hocclk/config.h | 31 +++------ .../src/ui/gui/config_info_strings.cpp | 20 +----- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 25 +------ .../sysmodule/src/board/board_volt.cpp | 17 +---- .../sysmodule/src/i2c/max77620_wdt.cpp | 4 -- .../sysmodule/src/mgr/clock_manager.cpp | 69 +++---------------- 7 files changed, 26 insertions(+), 148 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 99a609a5..351f3179 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -143,14 +143,6 @@ enum { DVFSMode_EnumMax, }; -enum { - CPUDVFSMode_Disabled = 0, - CPUDVFSMode_Modify, // LUT Modify dvfs - // DVFSMode_OfficialService, - // DVFSMode_Hack, - CPUDVFSMode_EnumMax, -}; - typedef enum { GpuSchedulingMode_DoNotOverride = 0, GpuSchedulingMode_Enabled, diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 34d2994b..89d5baae 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -52,12 +52,8 @@ typedef enum { HocClkConfigValue_OverwriteRefreshRate, HocClkConfigValue_MaxDisplayClockH, - HocClkConfigValue_GPUDVFSMode, - HocClkConfigValue_GPUDVFSOffset, - - HocClkConfigValue_CPUDVFSMode, - HocClkConfigValue_CPUDVFSOffset, - + HocClkConfigValue_DVFSMode, + HocClkConfigValue_DVFSOffset, HocClkConfigValue_LiveCpuUv, HocClkConfigValue_EnableExperimentalSettings, @@ -292,17 +288,11 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_MaxDisplayClockH: return pretty ? "Max Display Clock (Handheld)" : "drr_max_clock"; - case HocClkConfigValue_GPUDVFSMode: - return pretty ? "GPU DVFS Mode" : "dvfs_mode"; + case HocClkConfigValue_DVFSMode: + return pretty ? "DVFS Mode" : "dvfs_mode"; - case HocClkConfigValue_GPUDVFSOffset: - return pretty ? "GPU DVFS Offset" : "dvfs_offset"; - - case HocClkConfigValue_CPUDVFSMode: - return pretty ? "CPU DVFS Mode" : "cpu_dvfs_mode"; - - case HocClkConfigValue_CPUDVFSOffset: - return pretty ? "CPU DVFS Offset" : "cpu_dvfs_offset"; + case HocClkConfigValue_DVFSOffset: + return pretty ? "DVFS Offset" : "dvfs_offset"; case HocClkConfigValue_GPUScheduling: return pretty ? "GPU Scheduling" : "gpu_scheduling"; @@ -614,8 +604,7 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_ThermalThrottle: case HocClkConfigValue_IsFirstLoad: - case HocClkConfigValue_GPUDVFSMode: - case HocClkConfigValue_CPUDVFSMode: + case HocClkConfigValue_DVFSMode: return 1ULL; case HocClkConfigValue_AutoRAMCPUOverclock: return 0ULL; @@ -811,10 +800,8 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_t6_tRTW_fine_tune: case KipConfigValue_t7_tWTR_fine_tune: case KipCrc32: - case HocClkConfigValue_GPUDVFSMode: - case HocClkConfigValue_GPUDVFSOffset: - case HocClkConfigValue_CPUDVFSMode: - case HocClkConfigValue_CPUDVFSOffset: + case HocClkConfigValue_DVFSMode: + case HocClkConfigValue_DVFSOffset: case HocClkConfigValue_GPUScheduling: case HocClkConfigValue_RAMVoltDisplayMode: case HocClkConfigValue_CpuGovernorMinimumFreq: diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 0d384311..51abe481 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -506,7 +506,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 800 mV" }; - case HocClkConfigValue_GPUDVFSMode: + case HocClkConfigValue_DVFSMode: return { "The mode used for GPU DVFS", "Adjusts GPU vmin when RAM clock is changed due to a higher requirement", @@ -516,28 +516,12 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: PCV Hijack" }; - case HocClkConfigValue_GPUDVFSOffset: + case HocClkConfigValue_DVFSOffset: return { "The offset added/subtracted to the GPU vmin when the RAM clock is changed due to a higher requirement in PCV Hijack mode", "Default: 0 mV (Disabled)" }; - case HocClkConfigValue_CPUDVFSMode: - return { - "The mode used for CPU DVFS", - "Adjusts CPU vmin when RAM clock is changed due to a higher requirement", - "Options:", - "- Disabled: disabled...", - "- LUT Modify: Modify CLDVFS Lut", - "Default: LUT Modify" - }; - - case HocClkConfigValue_CPUDVFSOffset: - return { - "The offset added/subtracted to the CPU vmin when the RAM clock is changed due to a higher requirement in LUT Modify mode", - "Default: 0 mV (Disabled)" - }; - case KipConfigValue_eristaGpuUV: return { "GPU undervolt level", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 08b9adbf..e02cfc88 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2477,27 +2477,6 @@ class CpuSubmenuGui : public MiscGui { this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, maxClkOptions, false, true); - std::vector dvfsOffset = { - NamedValue("-80 mV", 0xFFFFFFB0), NamedValue("-75 mV", 0xFFFFFFB5), NamedValue("-70 mV", 0xFFFFFFBA), NamedValue("-65 mV", 0xFFFFFFBF), - NamedValue("-60 mV", 0xFFFFFFC4), NamedValue("-55 mV", 0xFFFFFFC9), NamedValue("-50 mV", 0xFFFFFFCE), NamedValue("-45 mV", 0xFFFFFFD3), - NamedValue("-40 mV", 0xFFFFFFD8), NamedValue("-35 mV", 0xFFFFFFDD), NamedValue("-30 mV", 0xFFFFFFE2), NamedValue("-25 mV", 0xFFFFFFE7), - NamedValue("-20 mV", 0xFFFFFFEC), NamedValue("-15 mV", 0xFFFFFFF1), NamedValue("-10 mV", 0xFFFFFFF6), NamedValue(" -5 mV", 0xFFFFFFFB), - NamedValue("Disabled", 0), NamedValue(" +5 mV", 5), NamedValue("+10 mV", 10), NamedValue("+15 mV", 15), - NamedValue("+20 mV", 20), - }; - - std::vector dvfsValues = { - NamedValue("Disabled", CPUDVFSMode_Disabled), - NamedValue("LUT Modify", CPUDVFSMode_Modify), - // NamedValue("Official Service", DVFSMode_OfficialService), - }; - - addConfigButton(HocClkConfigValue_CPUDVFSMode, "CPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "CPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, - false); - - addConfigButton(HocClkConfigValue_CPUDVFSOffset, "CPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "CPU DVFS Offset", &thresholdsDisabled, {}, - dvfsOffset, false); - } else { addConfigTrackbar(KipConfigValue_eristaCpuUV, "CPU UV", ValueRange(0, 5, 1)); @@ -2669,10 +2648,10 @@ class GpuSubmenuGui : public MiscGui { // NamedValue("Official Service", DVFSMode_OfficialService), }; - addConfigButton(HocClkConfigValue_GPUDVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, + addConfigButton(HocClkConfigValue_DVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, false); - addConfigButton(HocClkConfigValue_GPUDVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, + addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); tsl::elm::ListItem *customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index d65d099c..b53946a7 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -25,7 +25,6 @@ #include #include "../file/file_utils.hpp" -#include "../file/config.hpp" #include "../hos/rgltr.h" #include "../i2c/i2cDrv.h" #include "board.hpp" @@ -594,7 +593,6 @@ namespace board { return baseVolt; } - /* Mariko only! */ constexpr u32 PmicVmin = 250; constexpr u32 PmicStep = 5; @@ -604,12 +602,6 @@ namespace board { } void ApplyCpuDvfs(u32 ramFreqMhz) { - /* Don't reapply the table if it has been*/ - static u32 lastRamFreqMhz = 0; - if(ramFreqMhz == lastRamFreqMhz) { - return; - } - /* Get the minimum DRAM OC Cpu Vmin */ u32 vmin = GetMinimumCpuVmin(ramFreqMhz, GetCpuSpeedoBracket()); @@ -623,6 +615,7 @@ namespace board { if(vlt < vmin) { vlt = vmin; } + /* Don't know if modifying and passing argument causes undefined behavior? */ u32 tempVlt = vlt; vlt = ConvertVoltToLut(tempVlt); @@ -631,18 +624,12 @@ namespace board { /* Pet the watchdog to avoid it hanging the system during this operation */ i2c::wdt::Pet(); - /* DSB to prevent a hang during setting the new LUT. ST will not work, SY is needed */ + /* DSB to prevent a hang during setting the new LUT */ __asm__("dsb SY"); /* Copy the edited LUT into it's appropriate location */ memcpy((void*)(cldvfs + CL_DVFS_OUTPUT_LUT_0), NewCpuVoltTable, sizeof(NewCpuVoltTable)); - - file::utils::LogLine("[cpudvfs]: Set voltage to %dmV for %dMHz", vmin, ramFreqMhz); - /* Pet the watchdog to avoid it hanging the system during this operation */ - i2c::wdt::Pet(); - svcSleepThread(100'000'000); // 100ms - lastRamFreqMhz = ramFreqMhz; } } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp index a93de5c3..22937f8b 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -20,7 +20,6 @@ #include "../file/config.hpp" #include #include -#include "../file/file_utils.hpp" /* PMIC Registers */ #define MAX77620_REG_CNFGGLBL2 ((u8)0x01) @@ -69,8 +68,6 @@ namespace i2c::wdt { return; } - file::utils::LogLine("[Watchdog] armed"); - Result rc; u8 twd; @@ -111,7 +108,6 @@ namespace i2c::wdt { if (!isWdtEnabled) { return; } - file::utils::LogLine("[Watchdog] disarmed"); Result rc = update_bits(MAX77620_REG_CNFGGLBL2, MAX77620_WDTEN, (u8)0x00); ASSERT_RESULT_OK(rc, "update_bits"); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index f38e3814..cc971dd0 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -427,7 +427,7 @@ namespace mgr { } void ApplyGpuDvfs(u32 targetHz) { - s32 dvfsOffset = file::config::GetConfigValue(HocClkConfigValue_GPUDVFSOffset); + s32 dvfsOffset = file::config::GetConfigValue(HocClkConfigValue_DVFSOffset); dvfsOffset = std::max(dvfsOffset, -80); u32 vmin = board::GetMinimumGpuVmin(targetHz / 1000000, board::GetGpuSpeedoBracket()); @@ -450,39 +450,8 @@ namespace mgr { } } - void ApplyCpuDvfs(u32 targetHz) { - if(file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { - board::ApplyCpuDvfs(targetHz / 1'000'000); // convert to mhz - u32 ltargetHz = gContext.overrideFreqs[HocClkModule_CPU]; - if (!ltargetHz) { - ltargetHz = file::config::GetAutoClockHz(gContext.applicationId, HocClkModule_CPU, gContext.profile, false); - if (!ltargetHz) - ltargetHz = file::config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_CPU, gContext.profile, false); - } - - u32 maxHz = GetMaxAllowedHz(HocClkModule_CPU, gContext.profile); - u32 nearestHz = ltargetHz ? GetNearestHz(HocClkModule_CPU, ltargetHz, maxHz) : 0; - board::SetHz(HocClkModule_CPU, 1'785'000'000); - svcSleepThread(5'000'000); - if(nearestHz != 0) { - board::SetHz(HocClkModule_CPU, nearestHz); - } else { - board::ResetToStockCpu(); - } - } - } - - void ResetCpuDvfs() { - if(file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { - board::ApplyCpuDvfs(0); - board::SetHz(HocClkModule_CPU, 1'785'000'000); - svcSleepThread(5'000'000); - board::ResetToStockCpu(); - } - } - void DVFSReset() { - if (file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = GetNearestOverrideHz(HocClkModule_GPU); @@ -493,7 +462,7 @@ namespace mgr { } } - void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv, bool didApplyCpuDvfs) { + void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) { switch (module) { case HocClkModule_CPU: if (!(isBoost || (file::config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode) && isBoost))) @@ -516,10 +485,6 @@ namespace mgr { DVFSReset(); didHijackPcv = true; } - if(!didApplyCpuDvfs) { - ResetCpuDvfs(); - didApplyCpuDvfs = true; - } break; case HocClkModule_Display: if (file::config::GetConfigValue(HocClkConfigValue_OverwriteRefreshRate)) { @@ -541,10 +506,9 @@ namespace mgr { u32 nearestFreq = GetCurrentNearestFrequency(HocClkModule_MEM); if (targetRamHz != nearestFreq) { - if (file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetRamHz); } - ApplyCpuDvfs(targetRamHz); board::SetHz(HocClkModule_MEM, targetRamHz); } @@ -556,7 +520,7 @@ namespace mgr { std::uint32_t nearestHz = 0; static bool prepareBoostExit = false; - bool didHijackPcv = false, didApplyCpuDvfs = false; + bool didHijackPcv = false; bool skipCpuDueToBoost = isBoost && !file::config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode); if (skipCpuDueToBoost) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); @@ -606,7 +570,7 @@ namespace mgr { gContext.stable.freqs[HocClkModule_Display] = targetHz; gContext.stable.realFreqs[HocClkModule_Display] = targetHz; } else { - HandleFreqReset(HocClkModule_Display, isBoost, didHijackPcv, didApplyCpuDvfs); + HandleFreqReset(HocClkModule_Display, isBoost, didHijackPcv); } } @@ -641,13 +605,9 @@ namespace mgr { targetHz / 100000 - targetHz / 1000000 * 10); // The logic MUST be done in this order otherwise you WILL get crashes - if (module == HocClkModule_MEM && targetHz > oldHz && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz > oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } - if (module == HocClkModule_MEM && targetHz > oldHz && board::GetSocType() == HocClkSocType_Mariko) { - ApplyCpuDvfs(targetHz); - } - board::SetHz((HocClkModule)module, nearestHz); gContext.freqs[module] = nearestHz; @@ -655,22 +615,15 @@ namespace mgr { gContext.stable.freqs[module] = nearestHz; } - if (module == HocClkModule_MEM && targetHz < oldHz && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz < oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } - if (module == HocClkModule_MEM && targetHz < oldHz && board::GetSocType() == HocClkSocType_Mariko) { - ApplyCpuDvfs(targetHz); - } - if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) + if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) didHijackPcv = false; - - if(module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { - didApplyCpuDvfs = true; - } } } else { - HandleFreqReset((HocClkModule)module, isBoost, didHijackPcv, didApplyCpuDvfs); + HandleFreqReset((HocClkModule)module, isBoost, didHijackPcv); } } } @@ -699,7 +652,7 @@ namespace mgr { // restore clocks to stock values on app or profile change if (hasChanged) { board::ResetToStock(); - if (file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) { + if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); board::ResetToStockGpu(); } From 32fa50a2527b6fec8ebd5a3aa85c5b69d36222ef Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:30:29 +0200 Subject: [PATCH 161/205] Revert "add CPU DVFS skeleton" This reverts commit 930f2efe637a925cd6553aa720cb10ade4400d77. --- Source/hoc-clk/sysmodule/src/board/board.cpp | 8 +- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 - .../sysmodule/src/board/board_fuse.cpp | 29 --- .../sysmodule/src/board/board_fuse.hpp | 1 - .../sysmodule/src/board/board_volt.cpp | 188 ++++++++---------- .../sysmodule/src/board/board_volt.hpp | 2 +- .../sysmodule/src/mgr/clock_manager.cpp | 2 +- Source/hoc-clk/sysmodule/src/soc/registers.h | 1 - 8 files changed, 86 insertions(+), 147 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 68f18e53..69bd3d5d 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -61,8 +61,6 @@ namespace board { HocClkConsoleType gConsoleType = HocClkConsoleType_Icosa; FuseData fuseData; u8 speedoBracket; - u8 CpuSpeedoBracket; - PwmChannelSession iCon; u32 fd = 0, fd2 = 0; @@ -117,7 +115,7 @@ namespace board { void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); - SetCpuBracket(fuseData.cpuSpeedo, CpuSpeedoBracket); + u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV); if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) { gSocType = HocClkSocType_Mariko; @@ -341,8 +339,4 @@ namespace board { return speedoBracket; } - u8 GetCpuSpeedoBracket() { - return CpuSpeedoBracket; - } - } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 6dec814b..0ba40487 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -56,8 +56,6 @@ namespace board { u8 GetFuseDramId(); u8 GetDramID(); u8 GetGpuSpeedoBracket(); - u8 GetCpuSpeedoBracket(); - bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index 76021617..3fd3b849 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -60,35 +60,6 @@ namespace board { } } - void SetCpuBracket(u16 speedo, u8 &cpuBracket) { - switch (speedo) { - // Mariko - case 1451 ... 1500: - cpuBracket = 6; - break; - case 1501 ... 1550: - cpuBracket = 5; - break; - case 1551 ... 1600: - cpuBracket = 4; - break; - case 1601 ... 1650: - cpuBracket = 3; - break; - case 1651 ... 1700: - cpuBracket = 2; - break; - case 1701 ... 1750: - cpuBracket = 1; - break; - case 1751 ... 1800: - cpuBracket = 0; - break; - default: - cpuBracket = 6; - } - } - void ReadFuses(FuseData &speedo, u64 fuseVa) { constexpr u32 FuseOffset = 0x800; u8 *fusePtr = reinterpret_cast(fuseVa) + FuseOffset; diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp index 9c9a961c..5d81f835 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp @@ -36,6 +36,5 @@ namespace board { void ReadFuses(FuseData &speedo, u64 fuseVa); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket); - void SetCpuBracket(u16 speedo, u8 &cpuBracket); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index b53946a7..21d0e3e1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -30,7 +30,6 @@ #include "board.hpp" #include "board_freq.hpp" #include "board_volt.hpp" -#include "../i2c/max77620_wdt.hpp" namespace board { @@ -457,11 +456,6 @@ namespace board { } } - struct DvfsEntry { - u32 freq; - u32 volt; - }; - u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) { u32 baseVolt = 800; if (GetSocType() == HocClkSocType_Mariko) { @@ -517,38 +511,89 @@ namespace board { } return baseVolt; } else { - - static const DvfsEntry ramTable[][19] = { - { // Bracket 0 - {1733, 725}, {1800, 730}, {1866, 735}, {1920, 740}, - {1958, 745}, {1996, 750}, {2035, 755}, {2073, 760}, - {2112, 765}, {2131, 770}, {2150, 775}, {2169, 780}, - {2188, 785}, {2227, 790}, {2265, 795}, {2304, 800}, - {2342, 805}, {2380, 810}, {2400, 815} - }, - { // Bracket 1 - {1733, 715}, {1800, 720}, {1866, 725}, {1920, 730}, - {1958, 735}, {1996, 740}, {2035, 745}, {2073, 750}, - {2112, 755}, {2131, 760}, {2150, 765}, {2169, 770}, - {2188, 775}, {2227, 780}, {2265, 785}, {2304, 790}, - {2342, 795}, {2380, 800}, {2400, 805} - }, - { // Bracket 2 - {1733, 705}, {1800, 710}, {1866, 715}, {1920, 720}, - {1958, 725}, {1996, 730}, {2035, 735}, {2073, 740}, - {2112, 745}, {2131, 750}, {2150, 755}, {2169, 760}, - {2188, 765}, {2227, 770}, {2265, 775}, {2304, 780}, - {2342, 785}, {2380, 790}, {2400, 795} - }, - { // Bracket 3 - {1733, 695}, {1800, 700}, {1866, 705}, {1920, 710}, - {1958, 715}, {1996, 720}, {2035, 725}, {2073, 730}, - {2112, 735}, {2131, 740}, {2150, 745}, {2169, 750}, - {2188, 755}, {2227, 760}, {2265, 765}, {2304, 770}, - {2342, 775}, {2380, 780}, {2400, 785} - }, + struct DvfsEntry { + u32 freq; + u32 volt; }; - + static const DvfsEntry ramTable[][19] = { + { { 1733, 725 }, + { 1800, 730 }, + { 1866, 735 }, + { 1920, 740 }, + { 1958, 745 }, + { 1996, 750 }, + { 2035, 755 }, + { 2073, 760 }, + { 2112, 765 }, + { 2131, 770 }, + { 2150, 775 }, + { 2169, 780 }, + { 2188, 785 }, + { 2227, 790 }, + { 2265, 795 }, + { 2304, 800 }, + { 2342, 805 }, + { 2380, 810 }, + { 2400, 815 } }, // Bracket 0 + { { 1733, 715 }, + { 1800, 720 }, + { 1866, 725 }, + { 1920, 730 }, + { 1958, 735 }, + { 1996, 740 }, + { 2035, 745 }, + { 2073, 750 }, + { 2112, 755 }, + { 2131, 760 }, + { 2150, 765 }, + { 2169, 770 }, + { 2188, 775 }, + { 2227, 780 }, + { 2265, 785 }, + { 2304, 790 }, + { 2342, 795 }, + { 2380, 800 }, + { 2400, 805 } }, // Bracket 1 + { { 1733, 705 }, + { 1800, 710 }, + { 1866, 715 }, + { 1920, 720 }, + { 1958, 725 }, + { 1996, 730 }, + { 2035, 735 }, + { 2073, 740 }, + { 2112, 745 }, + { 2131, 750 }, + { 2150, 755 }, + { 2169, 760 }, + { 2188, 765 }, + { 2227, 770 }, + { 2265, 775 }, + { 2304, 780 }, + { 2342, 785 }, + { 2380, 790 }, + { 2400, 795 } }, // Bracket 2 + { { 1733, 695 }, + { 1800, 700 }, + { 1866, 705 }, + { 1920, 710 }, + { 1958, 715 }, + { 1996, 720 }, + { 2035, 725 }, + { 2073, 730 }, + { 2112, 735 }, + { 2131, 740 }, + { 2150, 745 }, + { 2169, 750 }, + { 2188, 755 }, + { 2227, 760 }, + { 2265, 765 }, + { 2304, 770 }, + { 2342, 775 }, + { 2380, 780 }, + { 2400, 785 } }, // Bracket 3 + }; + if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin if (bracket >= std::size(ramTable)) @@ -565,71 +610,4 @@ namespace board { return baseVolt; } } - /* TODO: Verify table on consoles */ - const DvfsEntry CpuVminRamTable[/* Bracket */7][/* Entry */12] = { - { {1866, 550}, {1996, 560}, {2133, 570}, {2400, 580}, {2533, 590}, {2666, 600}, {2800, 610}, {2933, 620}, {3066, 630}, {3200, 640}, {3333, 660}, {3466, 680} }, // Bracket 0 (Speedo 1751-1800) - { {1866, 555}, {1996, 565}, {2133, 575}, {2400, 585}, {2533, 595}, {2666, 605}, {2800, 615}, {2933, 625}, {3066, 635}, {3200, 645}, {3333, 665}, {3466, 685} }, // Bracket 1 (Speedo 1701-1750) - { {1866, 560}, {1996, 570}, {2133, 580}, {2400, 590}, {2533, 600}, {2666, 610}, {2800, 620}, {2933, 630}, {3066, 640}, {3200, 650}, {3333, 670}, {3466, 690} }, // Bracket 2 (Speedo 1651-1700) - { {1866, 565}, {1996, 575}, {2133, 585}, {2400, 595}, {2533, 605}, {2666, 615}, {2800, 625}, {2933, 635}, {3066, 645}, {3200, 655}, {3333, 675}, {3466, 695} }, // Bracket 3 (Speedo 1601-1650) - { {1866, 570}, {1996, 580}, {2133, 590}, {2400, 600}, {2533, 610}, {2666, 620}, {2800, 630}, {2933, 640}, {3066, 650}, {3200, 660}, {3333, 680}, {3466, 700} }, // Bracket 4 (Speedo 1551-1600) - { {1866, 575}, {1996, 585}, {2133, 595}, {2400, 605}, {2533, 615}, {2666, 625}, {2800, 635}, {2933, 645}, {3066, 655}, {3200, 665}, {3333, 685}, {3466, 705} }, // Bracket 5 (Speedo 1501-1550) - { {1866, 580}, {1996, 590}, {2133, 600}, {2400, 610}, {2533, 620}, {2666, 630}, {2800, 640}, {2933, 650}, {3066, 660}, {3200, 670}, {3333, 690}, {3466, 710} }, // Bracket 6 (Speedo 1451-1500) - }; - - u32 GetMinimumCpuVmin(u32 freqMhz, u32 bracket) { - if (freqMhz <= 1600) - return 0; // DVFS doesnt work below 1600MHz, it will just use vMin - if (bracket >= std::size(CpuVminRamTable)) - bracket = 0; - - const auto &entries = CpuVminRamTable[bracket]; - u32 baseVolt = entries[std::size(entries) - 1].volt; - for (const auto &entry : entries) { - if (freqMhz <= entry.freq) { - baseVolt = entry.volt; - break; - } - } - return baseVolt; - } - - constexpr u32 PmicVmin = 250; - constexpr u32 PmicStep = 5; - - u32 ConvertVoltToLut(u32 mv) { - /* Refer to TRM 6.1.19 */ - return (mv - PmicVmin) / PmicStep; - } - - void ApplyCpuDvfs(u32 ramFreqMhz) { - /* Get the minimum DRAM OC Cpu Vmin */ - u32 vmin = GetMinimumCpuVmin(ramFreqMhz, GetCpuSpeedoBracket()); - - /* Create the new modified CPU LUT buffer */ - u32 NewCpuVoltTable[32] = { 0 }; - memcpy(NewCpuVoltTable, cpuVoltTable, sizeof(NewCpuVoltTable)); - - /* Apply the new vmin to the reconstructed table and convert it to the appropriate format */ - for(auto &vlt : NewCpuVoltTable) { - /* Will never run on freq zero so it just converts the table */ - if(vlt < vmin) { - vlt = vmin; - } - - /* Don't know if modifying and passing argument causes undefined behavior? */ - u32 tempVlt = vlt; - vlt = ConvertVoltToLut(tempVlt); - } - - /* Pet the watchdog to avoid it hanging the system during this operation */ - i2c::wdt::Pet(); - - /* DSB to prevent a hang during setting the new LUT */ - __asm__("dsb SY"); - - /* Copy the edited LUT into it's appropriate location */ - memcpy((void*)(cldvfs + CL_DVFS_OUTPUT_LUT_0), NewCpuVoltTable, sizeof(NewCpuVoltTable)); - - } -} // namespace board - +} // namespace board \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index 4dd20803..bf47470f 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -59,5 +59,5 @@ namespace board { void PcvHijackGpuVolts(u32 vmin); void PcvHijackGpuFrequency(u32 voltage, u32 hz); u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); - void ApplyCpuDvfs(u32 ramFreqMhz); + } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index cc971dd0..c2fb455e 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -780,7 +780,7 @@ namespace mgr { gContext.resolutionHeight = 0; // N/A gContext.isWdtEnabled = i2c::wdt::IsWdtEnabled(); - + return hasChanged; } diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index 023a90bc..8e2be21d 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -525,7 +525,6 @@ #define CL_DVFS_I2C_STS_0 0x48 #define CL_DVFS_INTR_STS_0 0x5C #define CL_DVFS_I2C_CLK_DIVISOR_REGISTER_0 0x16C -#define CL_DVFS_OUTPUT_LUT_0 0x200 // Typo in TRM that says 0x20, correct value is 0x200. #define CLK_SOURCE_EMC 0x19c From aec025fd9d8d20e0dc9e413fd38a2c81ad72a7ec Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 5 Oct 2026 22:16:44 +0200 Subject: [PATCH 162/205] hoc-clk: add (half finished) cpu dvfs --- Source/hoc-clk/common/include/hocclk/board.h | 6 + Source/hoc-clk/common/include/hocclk/config.h | 31 ++- .../src/ui/gui/config_info_strings.cpp | 20 +- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 24 ++- Source/hoc-clk/sysmodule/src/board/board.cpp | 14 +- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 + .../sysmodule/src/board/board_fuse.cpp | 30 +++ .../sysmodule/src/board/board_fuse.hpp | 1 + .../sysmodule/src/board/board_volt.cpp | 188 +++++++++++++++++- .../sysmodule/src/board/board_volt.hpp | 4 + .../sysmodule/src/mgr/clock_manager.cpp | 84 +++++--- Source/hoc-clk/sysmodule/src/soc/registers.h | 2 + 12 files changed, 360 insertions(+), 46 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 351f3179..ad04100b 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -143,6 +143,12 @@ enum { DVFSMode_EnumMax, }; +enum { + CPUDVFSMode_Disabled = 0, + CPUDVFSMode_Modify, // LUT Modify dvfs + CPUDVFSMode_EnumMax, +}; + typedef enum { GpuSchedulingMode_DoNotOverride = 0, GpuSchedulingMode_Enabled, diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 89d5baae..34d2994b 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -52,8 +52,12 @@ typedef enum { HocClkConfigValue_OverwriteRefreshRate, HocClkConfigValue_MaxDisplayClockH, - HocClkConfigValue_DVFSMode, - HocClkConfigValue_DVFSOffset, + HocClkConfigValue_GPUDVFSMode, + HocClkConfigValue_GPUDVFSOffset, + + HocClkConfigValue_CPUDVFSMode, + HocClkConfigValue_CPUDVFSOffset, + HocClkConfigValue_LiveCpuUv, HocClkConfigValue_EnableExperimentalSettings, @@ -288,11 +292,17 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_MaxDisplayClockH: return pretty ? "Max Display Clock (Handheld)" : "drr_max_clock"; - case HocClkConfigValue_DVFSMode: - return pretty ? "DVFS Mode" : "dvfs_mode"; + case HocClkConfigValue_GPUDVFSMode: + return pretty ? "GPU DVFS Mode" : "dvfs_mode"; - case HocClkConfigValue_DVFSOffset: - return pretty ? "DVFS Offset" : "dvfs_offset"; + case HocClkConfigValue_GPUDVFSOffset: + return pretty ? "GPU DVFS Offset" : "dvfs_offset"; + + case HocClkConfigValue_CPUDVFSMode: + return pretty ? "CPU DVFS Mode" : "cpu_dvfs_mode"; + + case HocClkConfigValue_CPUDVFSOffset: + return pretty ? "CPU DVFS Offset" : "cpu_dvfs_offset"; case HocClkConfigValue_GPUScheduling: return pretty ? "GPU Scheduling" : "gpu_scheduling"; @@ -604,7 +614,8 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_ThermalThrottle: case HocClkConfigValue_IsFirstLoad: - case HocClkConfigValue_DVFSMode: + case HocClkConfigValue_GPUDVFSMode: + case HocClkConfigValue_CPUDVFSMode: return 1ULL; case HocClkConfigValue_AutoRAMCPUOverclock: return 0ULL; @@ -800,8 +811,10 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_t6_tRTW_fine_tune: case KipConfigValue_t7_tWTR_fine_tune: case KipCrc32: - case HocClkConfigValue_DVFSMode: - case HocClkConfigValue_DVFSOffset: + case HocClkConfigValue_GPUDVFSMode: + case HocClkConfigValue_GPUDVFSOffset: + case HocClkConfigValue_CPUDVFSMode: + case HocClkConfigValue_CPUDVFSOffset: case HocClkConfigValue_GPUScheduling: case HocClkConfigValue_RAMVoltDisplayMode: case HocClkConfigValue_CpuGovernorMinimumFreq: diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 51abe481..76cbbf1d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -506,7 +506,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 800 mV" }; - case HocClkConfigValue_DVFSMode: + case HocClkConfigValue_GPUDVFSMode: return { "The mode used for GPU DVFS", "Adjusts GPU vmin when RAM clock is changed due to a higher requirement", @@ -516,12 +516,28 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: PCV Hijack" }; - case HocClkConfigValue_DVFSOffset: + case HocClkConfigValue_GPUDVFSOffset: return { "The offset added/subtracted to the GPU vmin when the RAM clock is changed due to a higher requirement in PCV Hijack mode", "Default: 0 mV (Disabled)" }; + case HocClkConfigValue_CPUDVFSMode: + return { + "The mode used for CPU DVFS", + "Adjusts CPU vmin when RAM clock is changed due to a higher requirement", + "Options:", + "- Disabled: No CPU vmin adjustment", + "- LUT Modify: Modifies the CLDVFS LUT", + "Default: LUT Modify" + }; + + case HocClkConfigValue_CPUDVFSOffset: + return { + "The offset added/subtracted to the CPU vmin when the RAM clock is changed due to a higher requirement in LUT Modify mode", + "Default: 0 mV (Disabled)" + }; + case KipConfigValue_eristaGpuUV: return { "GPU undervolt level", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index e02cfc88..5b0226d5 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2477,6 +2477,26 @@ class CpuSubmenuGui : public MiscGui { this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, maxClkOptions, false, true); + std::vector cpuDvfsOffset = { + NamedValue("-80 mV", 0xFFFFFFB0), NamedValue("-75 mV", 0xFFFFFFB5), NamedValue("-70 mV", 0xFFFFFFBA), NamedValue("-65 mV", 0xFFFFFFBF), + NamedValue("-60 mV", 0xFFFFFFC4), NamedValue("-55 mV", 0xFFFFFFC9), NamedValue("-50 mV", 0xFFFFFFCE), NamedValue("-45 mV", 0xFFFFFFD3), + NamedValue("-40 mV", 0xFFFFFFD8), NamedValue("-35 mV", 0xFFFFFFDD), NamedValue("-30 mV", 0xFFFFFFE2), NamedValue("-25 mV", 0xFFFFFFE7), + NamedValue("-20 mV", 0xFFFFFFEC), NamedValue("-15 mV", 0xFFFFFFF1), NamedValue("-10 mV", 0xFFFFFFF6), NamedValue(" -5 mV", 0xFFFFFFFB), + NamedValue("Disabled", 0), NamedValue(" +5 mV", 5), NamedValue("+10 mV", 10), NamedValue("+15 mV", 15), + NamedValue("+20 mV", 20), + }; + + std::vector cpuDvfsValues = { + NamedValue("Disabled", CPUDVFSMode_Disabled), + NamedValue("LUT Modify", CPUDVFSMode_Modify), + }; + + addConfigButton(HocClkConfigValue_CPUDVFSMode, "CPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "CPU DVFS Mode", &thresholdsDisabled, {}, cpuDvfsValues, + false); + + addConfigButton(HocClkConfigValue_CPUDVFSOffset, "CPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "CPU DVFS Offset", &thresholdsDisabled, {}, + cpuDvfsOffset, false); + } else { addConfigTrackbar(KipConfigValue_eristaCpuUV, "CPU UV", ValueRange(0, 5, 1)); @@ -2648,10 +2668,10 @@ class GpuSubmenuGui : public MiscGui { // NamedValue("Official Service", DVFSMode_OfficialService), }; - addConfigButton(HocClkConfigValue_DVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, + addConfigButton(HocClkConfigValue_GPUDVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, false); - addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, + addConfigButton(HocClkConfigValue_GPUDVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); tsl::elm::ListItem *customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 69bd3d5d..2a441dc2 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -61,6 +61,7 @@ namespace board { HocClkConsoleType gConsoleType = HocClkConsoleType_Icosa; FuseData fuseData; u8 speedoBracket; + u8 cpuSpeedoBracket; PwmChannelSession iCon; u32 fd = 0, fd2 = 0; @@ -104,17 +105,17 @@ namespace board { } else if (state == PscPmState_ReadyShutdown) { i2c::wdt::Disarm(); s_isAwake = false; - } pscPmModuleAcknowledge(&s_pscModule, state); } } } - + void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); + SetCpuBracket(fuseData.cpuSpeedo, cpuSpeedoBracket); u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV); if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) { @@ -239,6 +240,7 @@ namespace board { display::Initialize(&cfg); CacheDfllData(); + InitializeCpuLut(); CacheGpuVoltTable(); rc = pscmInitialize(); @@ -249,7 +251,7 @@ namespace board { rc = threadCreate(&s_pscThread, PscThreadFunc, nullptr, NULL, 0x1000, 0x10, 3); ASSERT_RESULT_OK(rc, "threadCreate"); - + rc = threadStart(&s_pscThread); ASSERT_RESULT_OK(rc, "threadStart"); } @@ -282,7 +284,7 @@ namespace board { batteryInfoExit(); pmdmntExit(); nvExit(); - + eventFire(&s_pscModule.event); threadWaitForExit(&s_pscThread); threadClose(&s_pscThread); @@ -339,4 +341,8 @@ namespace board { return speedoBracket; } + u8 GetCpuSpeedoBracket() { + return cpuSpeedoBracket; + } + } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 0ba40487..6361c575 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -48,6 +48,7 @@ namespace board { extern HocClkConsoleType gConsoleType; extern FuseData fuseData; extern u8 speedoBracket; + extern u8 cpuSpeedoBracket; void Initialize(); void Exit(); @@ -56,6 +57,7 @@ namespace board { u8 GetFuseDramId(); u8 GetDramID(); u8 GetGpuSpeedoBracket(); + u8 GetCpuSpeedoBracket(); bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index 3fd3b849..68b0f102 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -60,6 +60,36 @@ namespace board { } } + void SetCpuBracket(u16 speedo, u8 &cpuBracket) { + switch (speedo) { + // Mariko + case 1451 ... 1500: + cpuBracket = 6; + break; + case 1501 ... 1550: + cpuBracket = 5; + break; + case 1551 ... 1600: + cpuBracket = 4; + break; + case 1601 ... 1650: + cpuBracket = 3; + break; + case 1651 ... 1700: + cpuBracket = 2; + break; + case 1701 ... 1750: + cpuBracket = 1; + break; + case 1751 ... 1800: + cpuBracket = 0; + break; + default: + cpuBracket = 6; + break; + } + } + void ReadFuses(FuseData &speedo, u64 fuseVa) { constexpr u32 FuseOffset = 0x800; u8 *fusePtr = reinterpret_cast(fuseVa) + FuseOffset; diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp index 5d81f835..554e2004 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp @@ -36,5 +36,6 @@ namespace board { void ReadFuses(FuseData &speedo, u64 fuseVa); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket); + void SetCpuBracket(u16 cpuSpeedo, u8 &cpuBracket); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 21d0e3e1..b20554a0 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -290,7 +290,6 @@ namespace board { return true; } - void CacheGpuVoltTable() { // Likely CPU regulator? UnkRegulator reg = { @@ -610,4 +609,189 @@ namespace board { return baseVolt; } } -} // namespace board \ No newline at end of file + + namespace { + constexpr size_t LutSize = 33; + constexpr u32 PmicVmin = 250; + constexpr u32 PmicStep = 5; + + struct { + volatile u32 *lut = nullptr; + u32 table[LutSize] = {}; + bool initialized = false; + } cpuVoltData; + } + + namespace { + inline void DataSyncBarrier() { + __asm__ volatile("dsb sy" ::: "memory"); + } + + void VolatileCopyDwords(volatile u32 *dst, const volatile u32 *src, size_t dwords) { + for (size_t i = 0; i < dwords; ++i) { + dst[i] = src[i]; + } + + DataSyncBarrier(); + } + + u32 GetLutCode(u32 mv) { + return mv <= PmicVmin ? 0 : (mv - PmicVmin) / PmicStep; + } + + u32 GetLutVolt(u32 code) { + return code * PmicStep + PmicVmin; + } + + void InitializeLutPtr() { + cpuVoltData.lut = reinterpret_cast(cldvfs + CL_DVFS_LUT_TABLE_0); + } + + void CacheCpuLut() { + VolatileCopyDwords(cpuVoltData.table, cpuVoltData.lut, LutSize); + } + + /* todo debug edge cases of this. */ + void UnstuckFreqWar() { + u32 hz = board::GetHz(HocClkModule_CPU); + board::SetHz(HocClkModule_CPU, ~0); + board::SetHz(HocClkModule_CPU, hz); + } + + void RestoreCpuLut() { + VolatileCopyDwords(cpuVoltData.lut, cpuVoltData.table, LutSize); + UnstuckFreqWar(); + } + + u32 FloorLutTable(u32 *lut, u32 minCode) { + u32 floored = 0; + while (floored < LutSize && lut[floored] < minCode) { + lut[floored++] = minCode; + } + return floored; + } + + u32 StripRedundantLutEntries(u32 *lut, u32 redundant) { + const u32 strippedCount = LutSize - redundant; + std::memmove(lut, lut + redundant, sizeof(u32) * strippedCount); + + return strippedCount; + } + + /* Naiive interpolation. */ + u32 InterpolateLut(u32 low, u32 high) { + return low + (high - low) / 2; + } + + /* Find biggest deltas, shift to create a new slot in between it, interpolate later. */ + u32 SplitAndInterpolateDeltas(u32 *lut, u32 validCount) { + while (validCount < LutSize) { + u32 biggestDelta = 0; + u32 upperIdx = 0; + + for (u32 i = 0; i + 1 < validCount; ++i) { + const u32 delta = lut[i + 1] - lut[i]; + if (delta > biggestDelta) { + biggestDelta = delta; + upperIdx = i + 1; + } + } + + if (biggestDelta < 2) { + break; + } + + const u32 mid = InterpolateLut(lut[upperIdx - 1], lut[upperIdx]); + std::memmove(lut + upperIdx + 1, lut + upperIdx, (validCount - upperIdx) * sizeof(u32)); + lut[upperIdx] = mid; + ++validCount; + } + + return validCount; + } + + void PadLutTail(u32 *lut, u32 validCount) { + for (u32 i = validCount; i < LutSize; ++i) { + lut[i] = lut[validCount - 1]; + } + } + } + + void InitializeCpuLut() { + InitializeLutPtr(); + CacheCpuLut(); + + cpuVoltData.initialized = true; + } + + /* TODO: Verify table on consoles */ + u32 GetMinimumCpuVmin(u32 freqMhz, u32 bracket) { + struct CpuVminEntry { + u32 freq; + u32 volt; + }; + + static const CpuVminEntry cpuVminRamTable[/* Bracket */ 7][/* Entry */ 12] = { + { {1866, 550}, {1996, 560}, {2133, 570}, {2400, 580}, {2533, 590}, {2666, 600}, {2800, 610}, {2933, 620}, {3066, 630}, {3200, 640}, {3333, 660}, {3466, 680} }, // Bracket 0 (Speedo 1751-1800) + { {1866, 555}, {1996, 565}, {2133, 575}, {2400, 585}, {2533, 595}, {2666, 605}, {2800, 615}, {2933, 625}, {3066, 635}, {3200, 645}, {3333, 665}, {3466, 685} }, // Bracket 1 (Speedo 1701-1750) + { {1866, 560}, {1996, 570}, {2133, 580}, {2400, 590}, {2533, 600}, {2666, 610}, {2800, 620}, {2933, 630}, {3066, 640}, {3200, 650}, {3333, 670}, {3466, 690} }, // Bracket 2 (Speedo 1651-1700) + { {1866, 565}, {1996, 575}, {2133, 585}, {2400, 595}, {2533, 605}, {2666, 615}, {2800, 625}, {2933, 635}, {3066, 645}, {3200, 655}, {3333, 675}, {3466, 695} }, // Bracket 3 (Speedo 1601-1650) + { {1866, 570}, {1996, 580}, {2133, 590}, {2400, 600}, {2533, 610}, {2666, 620}, {2800, 630}, {2933, 640}, {3066, 650}, {3200, 660}, {3333, 680}, {3466, 700} }, // Bracket 4 (Speedo 1551-1600) + { {1866, 575}, {1996, 585}, {2133, 595}, {2400, 605}, {2533, 615}, {2666, 625}, {2800, 635}, {2933, 645}, {3066, 655}, {3200, 665}, {3333, 685}, {3466, 705} }, // Bracket 5 (Speedo 1501-1550) + { {1866, 580}, {1996, 590}, {2133, 600}, {2400, 610}, {2533, 620}, {2666, 630}, {2800, 640}, {2933, 650}, {3066, 660}, {3200, 670}, {3333, 690}, {3466, 710} }, // Bracket 6 (Speedo 1451-1500) + }; + + if (freqMhz <= 1600) { + return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + } + + if (bracket >= std::size(cpuVminRamTable)) { + bracket = 0; + } + + const auto &entries = cpuVminRamTable[bracket]; + u32 baseVolt = entries[std::size(entries) - 1].volt; + for (const auto &entry : entries) { + if (freqMhz <= entry.freq) { + baseVolt = entry.volt; + break; + } + } + + return baseVolt; + } + + void ApplyCpuMinVolt(u32 vmin) { + if (!cpuVoltData.initialized) { + return; + } + + if (vmin == 0) { + RestoreCpuLut(); + return; + } + + u32 tmpLut[LutSize]; + std::memcpy(tmpLut, cpuVoltData.table, sizeof(tmpLut)); + + const u32 minCode = std::min(GetLutCode(vmin), tmpLut[LutSize - 1]); + + const u32 floored = FloorLutTable(tmpLut, minCode); + if (floored == 0) { + RestoreCpuLut(); + return; + } + + u32 redundant = floored - 1; + if (floored < LutSize && tmpLut[floored] == minCode) { + redundant = floored; + } + + u32 valid = StripRedundantLutEntries(tmpLut, redundant); + valid = SplitAndInterpolateDeltas(tmpLut, valid); + PadLutTail(tmpLut, valid); + + VolatileCopyDwords(cpuVoltData.lut, tmpLut, LutSize); + } + +} diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index bf47470f..6baa54de 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -60,4 +60,8 @@ namespace board { void PcvHijackGpuFrequency(u32 voltage, u32 hz); u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); + void InitializeCpuLut(); + void ApplyCpuMinVolt(u32 vmin); + u32 GetMinimumCpuVmin(u32 freqMhz, u32 bracket); + } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index c2fb455e..3aa84d9a 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -426,32 +426,54 @@ namespace mgr { board::SetHz(HocClkModule_GPU, currentFreq); } - void ApplyGpuDvfs(u32 targetHz) { - s32 dvfsOffset = file::config::GetConfigValue(HocClkConfigValue_DVFSOffset); - dvfsOffset = std::max(dvfsOffset, -80); - u32 vmin = board::GetMinimumGpuVmin(targetHz / 1000000, board::GetGpuSpeedoBracket()); + bool IsGpuDvfsEnabled() { + return file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack; + } - if (vmin) { - vmin += dvfsOffset; + bool IsCpuDvfsEnabled() { + return board::GetSocType() == HocClkSocType_Mariko && file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify; + } + + void ApplyRamOcDvfs(u32 targetHz) { + if (IsGpuDvfsEnabled()) { + s32 gpuDvfsOffset = file::config::GetConfigValue(HocClkConfigValue_GPUDVFSOffset); + gpuDvfsOffset = std::max(gpuDvfsOffset, -80); + u32 gpuVmin = board::GetMinimumGpuVmin(targetHz / 1000000, board::GetGpuSpeedoBracket()); + + if (gpuVmin) { + gpuVmin += gpuDvfsOffset; + } + + /* Prevent console from combusting if for some reason bad shit happens :P */ + gpuVmin = ClampGpuVoltage(gpuVmin); + + /* Hijack gpu volt table. */ + board::PcvHijackGpuVolts(gpuVmin); + + /* Update gpu frequency to actually use the voltage. */ + if (targetHz) { + board::SetHz(HocClkModule_GPU, GetCurrentNearestFrequency(HocClkModule_GPU)); + } else { + /* If the target frequency is zero, we reset the frequency to ensure it gets updated even without any frequency override. */ + board::ResetToStockGpu(); + } } - /* Prevent console from combusting if for some reason bad shit happens :P */ - vmin = ClampGpuVoltage(vmin); + if (IsCpuDvfsEnabled()) { + s32 cpuDvfsOffset = file::config::GetConfigValue(HocClkConfigValue_CPUDVFSOffset); + cpuDvfsOffset = std::max(cpuDvfsOffset, -80); + u32 cpuVmin = board::GetMinimumCpuVmin(targetHz / 1000000, board::GetCpuSpeedoBracket()); - /* Hijack gpu volt table. */ - board::PcvHijackGpuVolts(vmin); + if (cpuVmin) { + cpuVmin += cpuDvfsOffset; + } - /* Update gpu frequency to actually use the voltage. */ - if (targetHz) { - board::SetHz(HocClkModule_GPU, GetCurrentNearestFrequency(HocClkModule_GPU)); - } else { - /* If the target frequency is zero, we reset the frequency to ensure it gets updated even without any frequency override. */ - board::ResetToStockGpu(); + board::ApplyCpuMinVolt(cpuVmin); } } void DVFSReset() { - if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (IsGpuDvfsEnabled()) { board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = GetNearestOverrideHz(HocClkModule_GPU); @@ -460,6 +482,10 @@ namespace mgr { if (targetHz) board::SetHz(HocClkModule_GPU, targetHz); } + + if (IsCpuDvfsEnabled()) { + board::ApplyCpuMinVolt(0); + } } void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) { @@ -506,9 +532,7 @@ namespace mgr { u32 nearestFreq = GetCurrentNearestFrequency(HocClkModule_MEM); if (targetRamHz != nearestFreq) { - if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { - ApplyGpuDvfs(targetRamHz); - } + ApplyRamOcDvfs(targetRamHz); board::SetHz(HocClkModule_MEM, targetRamHz); } @@ -605,9 +629,10 @@ namespace mgr { targetHz / 100000 - targetHz / 1000000 * 10); // The logic MUST be done in this order otherwise you WILL get crashes - if (module == HocClkModule_MEM && targetHz > oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { - ApplyGpuDvfs(targetHz); + if (module == HocClkModule_MEM && targetHz > oldHz) { + ApplyRamOcDvfs(targetHz); } + board::SetHz((HocClkModule)module, nearestHz); gContext.freqs[module] = nearestHz; @@ -615,12 +640,13 @@ namespace mgr { gContext.stable.freqs[module] = nearestHz; } - if (module == HocClkModule_MEM && targetHz < oldHz && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { - ApplyGpuDvfs(targetHz); + if (module == HocClkModule_MEM && targetHz < oldHz) { + ApplyRamOcDvfs(targetHz); } - if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) + if (module == HocClkModule_MEM && file::config::GetConfigValue(HocClkConfigValue_GPUDVFSMode) == DVFSMode_Hijack) didHijackPcv = false; + } } else { HandleFreqReset((HocClkModule)module, isBoost, didHijackPcv); @@ -652,10 +678,14 @@ namespace mgr { // restore clocks to stock values on app or profile change if (hasChanged) { board::ResetToStock(); - if (file::config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (IsGpuDvfsEnabled()) { board::PcvHijackGpuVolts(0); board::ResetToStockGpu(); } + + if (IsCpuDvfsEnabled()) { + board::ApplyCpuMinVolt(0); + } WaitForNextTick(); } @@ -780,7 +810,7 @@ namespace mgr { gContext.resolutionHeight = 0; // N/A gContext.isWdtEnabled = i2c::wdt::IsWdtEnabled(); - + return hasChanged; } diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index 8e2be21d..576075eb 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -528,6 +528,8 @@ #define CLK_SOURCE_EMC 0x19c +#define CL_DVFS_LUT_TABLE_0 0x200 + #define PLLC_BASE 0x080 #define PLLM_BASE 0x090 #define PLLP_BASE 0x0a0 From 79ee323cbe8fdb75f8537c5e669d09c9291c696d Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Mon, 5 Oct 2026 22:53:30 +0200 Subject: [PATCH 163/205] hoc-clk: apply ram oc cpu dvfs unstuck fix when decreasing voltage --- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index b20554a0..2366c592 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -616,9 +616,10 @@ namespace board { constexpr u32 PmicStep = 5; struct { - volatile u32 *lut = nullptr; + volatile u32 *lut = nullptr; u32 table[LutSize] = {}; - bool initialized = false; + u32 lastVmin = 0; + bool initialized = false; } cpuVoltData; } @@ -762,7 +763,7 @@ namespace board { } void ApplyCpuMinVolt(u32 vmin) { - if (!cpuVoltData.initialized) { + if (!cpuVoltData.initialized || vmin == cpuVoltData.lastVmin) { return; } @@ -792,6 +793,12 @@ namespace board { PadLutTail(tmpLut, valid); VolatileCopyDwords(cpuVoltData.lut, tmpLut, LutSize); + + if (vmin < cpuVoltData.lastVmin) { + UnstuckFreqWar(); + } + + cpuVoltData.lastVmin = vmin; } } From b144c8d6334d1a6ce296736baa2838758ae2ad5b Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 17:45:36 -0400 Subject: [PATCH 164/205] dvfs: fix bugs and edge cases with cpu dvfs --- Source/hoc-clk/sysmodule/src/board/board.cpp | 41 ++++++++++++++++++- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 +- .../sysmodule/src/board/board_volt.cpp | 26 ++++++++---- .../sysmodule/src/board/board_volt.hpp | 2 +- .../sysmodule/src/mgr/clock_manager.cpp | 6 +-- .../sysmodule/src/mgr/clock_manager.hpp | 2 + 6 files changed, 63 insertions(+), 16 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 2a441dc2..0a71ed1c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -51,7 +51,8 @@ #include "../mapping/mem_map.hpp" #include "../soc/dram_mrr.hpp" #include "../i2c/max77620_wdt.hpp" - +#include "../mgr/clock_manager.hpp" +#include "../file/config.hpp" namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -95,15 +96,45 @@ namespace board { u32 flags; rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); if (R_SUCCEEDED(rc)) { - if (state == PscPmState_Awake) { + if (state == PscPmState_ReadyAwaken) { i2c::wdt::ResetWdtEnableState(); i2c::wdt::Pet(); + + if(board::GetSocType() == HocClkSocType_Mariko && + file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { + s32 cpuDvfsOffset = file::config::GetConfigValue(HocClkConfigValue_CPUDVFSOffset); + cpuDvfsOffset = std::max(cpuDvfsOffset, -80); + u32 cpuVmin = GetMinimumCpuVmin(mgr::GetNearestOverrideHz(HocClkModule_MEM) / 1000000, GetCpuSpeedoBracket()); + + if (cpuVmin) { + cpuVmin += cpuDvfsOffset; + } + + ApplyCpuMinVolt(cpuVmin, true); + } + + file::utils::LogLine("[brd]: Ready to awaken"); + s_isAwake = true; } else if (state == PscPmState_ReadySleep) { i2c::wdt::Disarm(); + + ResetToStockMem(); + ResetToStockCpu(); + ApplyCpuMinVolt(0, true); + + file::utils::LogLine("[brd]: Ready to sleep"); + s_isAwake = false; } else if (state == PscPmState_ReadyShutdown) { i2c::wdt::Disarm(); + + ResetToStockMem(); + ResetToStockCpu(); + ApplyCpuMinVolt(0, true); + + file::utils::LogLine("[brd]: Ready to shutdown"); + s_isAwake = false; } @@ -254,6 +285,8 @@ namespace board { rc = threadStart(&s_pscThread); ASSERT_RESULT_OK(rc, "threadStart"); + + s_isAwake = true; } void Exit() { @@ -345,4 +378,8 @@ namespace board { return cpuSpeedoBracket; } + bool IsAwake() { + return s_isAwake; + } + } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 6361c575..15b50a9b 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -61,5 +61,5 @@ namespace board { bool IsDram8GB(); void SetDisplayRefreshDockedState(bool docked); FuseData *GetFuseData(); - + bool IsAwake(); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 2366c592..6a1b8639 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -640,7 +640,7 @@ namespace board { return mv <= PmicVmin ? 0 : (mv - PmicVmin) / PmicStep; } - u32 GetLutVolt(u32 code) { + [[maybe_unused]] u32 GetLutVolt(u32 code) { return code * PmicStep + PmicVmin; } @@ -652,14 +652,17 @@ namespace board { VolatileCopyDwords(cpuVoltData.table, cpuVoltData.lut, LutSize); } - /* todo debug edge cases of this. */ + /* TODO: Dynamically get this from the PCV LUT */ void UnstuckFreqWar() { + constexpr u32 KNOWN_GOOD_WAR_FREQUENCY = 1'785'000'000; u32 hz = board::GetHz(HocClkModule_CPU); - board::SetHz(HocClkModule_CPU, ~0); + board::SetHz(HocClkModule_CPU, KNOWN_GOOD_WAR_FREQUENCY); + svcSleepThread(5'000'000); board::SetHz(HocClkModule_CPU, hz); } void RestoreCpuLut() { + cpuVoltData.lastVmin = 0; VolatileCopyDwords(cpuVoltData.lut, cpuVoltData.table, LutSize); UnstuckFreqWar(); } @@ -762,16 +765,22 @@ namespace board { return baseVolt; } - void ApplyCpuMinVolt(u32 vmin) { - if (!cpuVoltData.initialized || vmin == cpuVoltData.lastVmin) { - return; + void ApplyCpuMinVolt(u32 vmin, bool force) { + if(!force) { + if (!cpuVoltData.initialized || (vmin == cpuVoltData.lastVmin)) { + return; + } } + file::utils::LogLine("[dvfs]: %setting cpu vmin to %dmV", force ? "Forcefully s" : "S", vmin); + if (vmin == 0) { RestoreCpuLut(); + file::utils::LogLine("[dvfs]: Restored LUT"); return; } + u32 tmpLut[LutSize]; std::memcpy(tmpLut, cpuVoltData.table, sizeof(tmpLut)); @@ -780,6 +789,7 @@ namespace board { const u32 floored = FloorLutTable(tmpLut, minCode); if (floored == 0) { RestoreCpuLut(); + file::utils::LogLine("[dvfs]: Floored, restored LUT"); return; } @@ -794,9 +804,7 @@ namespace board { VolatileCopyDwords(cpuVoltData.lut, tmpLut, LutSize); - if (vmin < cpuVoltData.lastVmin) { - UnstuckFreqWar(); - } + UnstuckFreqWar(); cpuVoltData.lastVmin = vmin; } diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index 6baa54de..215afaf1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -61,7 +61,7 @@ namespace board { u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); void InitializeCpuLut(); - void ApplyCpuMinVolt(u32 vmin); + void ApplyCpuMinVolt(u32 vmin, bool force); u32 GetMinimumCpuVmin(u32 freqMhz, u32 bracket); } // namespace board diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 3aa84d9a..8c7865e1 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -468,7 +468,7 @@ namespace mgr { cpuVmin += cpuDvfsOffset; } - board::ApplyCpuMinVolt(cpuVmin); + board::ApplyCpuMinVolt(cpuVmin, false); } } @@ -484,7 +484,7 @@ namespace mgr { } if (IsCpuDvfsEnabled()) { - board::ApplyCpuMinVolt(0); + board::ApplyCpuMinVolt(0, false); } } @@ -684,7 +684,7 @@ namespace mgr { } if (IsCpuDvfsEnabled()) { - board::ApplyCpuMinVolt(0); + board::ApplyCpuMinVolt(0, false); } WaitForNextTick(); } diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp index 1a6741b3..3532a30e 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp @@ -66,6 +66,8 @@ namespace mgr { void ApplyGpuFreqVoltRequest(u32 voltage, u32 hz); + u32 GetNearestOverrideHz(HocClkModule module); + void Tick(); void WaitForNextTick(); } // namespace mgr From 018325747d53a1d0d7a3757a326cdffdb5fd290d Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:15:19 -0400 Subject: [PATCH 165/205] c++ bindings for libnx --- Source/hoc-clk/common/include/switch.hpp | 28929 ++++++++++++++++ Source/hoc-clk/common/src/switch.cpp | 4804 +++ Source/hoc-clk/overlay/Makefile | 2 + Source/hoc-clk/overlay/src/ipc.h | 4 +- Source/hoc-clk/sysmodule/Makefile | 2 +- .../sysmodule/src/board/board_freq.cpp | 17 +- .../sysmodule/src/board/board_load.cpp | 5 +- .../sysmodule/src/board/board_misc.cpp | 4 +- .../sysmodule/src/board/board_sensor.cpp | 2 +- .../sysmodule/src/board/board_volt.cpp | 2 +- Source/hoc-clk/sysmodule/src/display/aula.cpp | 3 +- .../hoc-clk/sysmodule/src/display/common.hpp | 3 + .../src/display/display_refresh_rate.cpp | 13 +- .../hoc-clk/sysmodule/src/file/file_utils.hpp | 1 + .../hoc-clk/sysmodule/src/hos/clkrst_ext.cpp | 53 + .../hoc-clk/sysmodule/src/hos/clkrst_ext.hpp | 24 + .../sysmodule/src/hos/integrations.cpp | 5 +- .../sysmodule/src/hos/process_management.cpp | 2 +- Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp | 7 +- Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h | 2 +- Source/hoc-clk/sysmodule/src/main.cpp | 4 +- .../sysmodule/src/mgr/clock_manager.cpp | 6 +- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 6 +- .../sysmodule/src/soc/{t210.c => t210.cpp} | 6 +- .../sysmodule/src/soc/{t210.h => t210.hpp} | 0 .../sysmodule/src/tsensor/soctherm.cpp | 4 +- 26 files changed, 33869 insertions(+), 41 deletions(-) create mode 100644 Source/hoc-clk/common/include/switch.hpp create mode 100644 Source/hoc-clk/common/src/switch.cpp create mode 100644 Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp create mode 100644 Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp rename Source/hoc-clk/sysmodule/src/soc/{t210.c => t210.cpp} (98%) rename Source/hoc-clk/sysmodule/src/soc/{t210.h => t210.hpp} (100%) diff --git a/Source/hoc-clk/common/include/switch.hpp b/Source/hoc-clk/common/include/switch.hpp new file mode 100644 index 00000000..b39225be --- /dev/null +++ b/Source/hoc-clk/common/include/switch.hpp @@ -0,0 +1,28929 @@ +/** + * @file switch.hpp + * @brief Libnx C++ bindings (AUTO-GENERATED, do not edit). + * @copyright libnx Authors + */ +#pragma once + +#ifndef __cplusplus +#error "libnx C++ bindings require a C++ compiler." +#endif + +#include + +extern "C++" { +/// @brief Root namespace of the libnx C++ bindings. +namespace nx { + +/// @brief Version string of the generated C++ bindings. +/// @return Generator description (see switch.cpp). +const char *CppBindingsVersion(); + +/// NetworkServiceAccountId +using ::AccountNetworkServiceAccountId; +/// Profile +using ::AccountProfile; +/// ProfileBase +using ::AccountProfileBase; +using ::AccountServiceType; +/// Account UserId. +using ::AccountUid; +/// UserData +using ::AccountUserData; +/// Context for AES-128 CBC. +using ::Aes128CbcContext; +/// Context for AES-128 CMAC. +using ::Aes128CmacContext; +/// Context for AES-128 operations. +using ::Aes128Context; +/// Context for AES-128 CTR. +using ::Aes128CtrContext; +/// Context for AES-128 XTS. +using ::Aes128XtsContext; +/// Context for AES-192 CBC. +using ::Aes192CbcContext; +/// Context for AES-192 CMAC. +using ::Aes192CmacContext; +/// Context for AES-192 operations. +using ::Aes192Context; +/// Context for AES-192 CTR. +using ::Aes192CtrContext; +/// Context for AES-192 XTS. +using ::Aes192XtsContext; +/// Context for AES-256 CBC. +using ::Aes256CbcContext; +/// Context for AES-256 CMAC. +using ::Aes256CmacContext; +/// Context for AES-256 operations. +using ::Aes256Context; +/// Context for AES-256 CTR. +using ::Aes256CtrContext; +/// Context for AES-256 XTS. +using ::Aes256XtsContext; +/// ImageOrientation +using ::AlbumImageOrientation; +/// Arg type values pushed for the applet input storage, stored as an u8. +using ::AlbumLaArg; +/// AlbumReportOption +using ::AlbumReportOption; +/// CpuBoostMode. With \ref appletSetCpuBoostMode, only values 0/1 are available. This allows using higher clock rates. +using ::ApmCpuBoostMode; +/// PerformanceMode +using ::ApmPerformanceMode; +/// IApplicationAccessor container. +using ::AppletApplication; +/// ApplicationAttribute +using ::AppletApplicationAttribute; +/// Attributes for launching applications for Quest. +using ::AppletApplicationAttributeForQuest; +/// AppletApplicationExitReason +using ::AppletApplicationExitReason; +/// ApplicationLaunchProperty +using ::AppletApplicationLaunchProperty; +/// ApplicationLaunchRequestInfo +using ::AppletApplicationLaunchRequestInfo; +/// Used by \ref appletInitialize with __nx_applet_AppletAttribute for cmd OpenLibraryAppletProxy (AppletType_LibraryApplet), on [3.0.0+]. The default for this struct is all-zero. +using ::AppletAttribute; +/// CaptureSharedBuffer for the IDisplayController commands. +using ::AppletCaptureSharedBuffer; +/// FocusHandlingMode +using ::AppletFocusHandlingMode; +/// FocusState +using ::AppletFocusState; +/// GpuErrorHandler +using ::AppletGpuErrorHandler; +/// LibraryApplet state. +using ::AppletHolder; +/// applet hook cookie. +using ::AppletHookCookie; +/// applet hook function. +using ::AppletHookFn; +/// applet hook types. +using ::AppletHookType; +/// AppletId +using ::AppletId; +/// IdentityInfo +using ::AppletIdentityInfo; +/// Extension values for \ref appletSetIdleTimeDetectionExtension / \ref appletGetIdleTimeDetectionExtension, for extending user inactivity detection. +using ::AppletIdleTimeDetectionExtension; +/// Cached info for the current LibraryApplet, from \ref appletGetAppletInfo. +using ::AppletInfo; +/// Input policy values for \ref appletSetInputDetectionPolicy. +using ::AppletInputDetectionPolicy; +/// LaunchParameterKind +using ::AppletLaunchParameterKind; +/// LockAccessor +using ::AppletLockAccessor; +/// AppletMessage, for \ref appletGetMessage. See also \ref AppletHookType. +using ::AppletMessage; +/// OperationMode +using ::AppletOperationMode; +/// AppletProcessLaunchReason, from GetLaunchReason. +using ::AppletProcessLaunchReason; +/// ProgramSpecifyKind for the ExecuteProgram cmd. Controls the type of the u64 passed to the ExecuteProgram cmd. +using ::AppletProgramSpecifyKind; +/// AppletResourceUsageInfo, from \ref appletGetAppletResourceUsageInfo. +using ::AppletResourceUsageInfo; +/// Permission values for \ref appletSetScreenShotPermission. +using ::AppletScreenShotPermission; +/// applet IStorage +using ::AppletStorage; +/// Type values for \ref appletPerformSystemButtonPressingIfInFocus. +using ::AppletSystemButtonType; +/// ThemeColorType +using ::AppletThemeColorType; +/// Mode values for \ref appletSetTvPowerStateMatchingMode. +using ::AppletTvPowerStateMatchingMode; +/// AppletType +using ::AppletType; +/// WindowOriginMode +using ::AppletWindowOriginMode; +/// Input mode values for \ref appletSetWirelessPriorityMode. +using ::AppletWirelessPriorityMode; +/// WaitForAddress behaviors. +using ::ArbitrationType; +/// AsyncResult +using ::AsyncResult; +/// AsyncValue +using ::AsyncValue; +/// AudioDeviceName +using ::AudioDeviceName; +using ::AudioDriver; +using ::AudioDriverEtc; +using ::AudioDriverWaveBuf; +using ::AudioDriverWaveBufState; +using ::AudioForceMutePolicy; +using ::AudioHeadphoneOutputLevelMode; +/// Audio input buffer format +using ::AudioInBuffer; +using ::AudioInState; +/// Audio output buffer format +using ::AudioOutBuffer; +using ::AudioOutputMode; +using ::AudioOutState; +using ::AudioRendererAdpcmContext; +using ::AudioRendererAdpcmParameters; +using ::AudioRendererBehaviorInfoIn; +using ::AudioRendererBehaviorInfoOut; +using ::AudioRendererBiquadFilter; +using ::AudioRendererChannelInfoIn; +using ::AudioRendererCircularBufferSinkInfoIn; +using ::AudioRendererConfig; +using ::AudioRendererDeviceSinkInfoIn; +using ::AudioRendererDownMixParameters; +using ::AudioRendererMemPoolInfoIn; +using ::AudioRendererMemPoolInfoOut; +using ::AudioRendererMemPoolState; +using ::AudioRendererMixInfoIn; +using ::AudioRendererOutputRate; +using ::AudioRendererPerformanceBufferInfoIn; +using ::AudioRendererPerformanceBufferInfoOut; +using ::AudioRendererSinkInfoIn; +using ::AudioRendererSinkInfoOut; +using ::AudioRendererSinkType; +using ::AudioRendererUpdateDataHeader; +using ::AudioRendererVoiceInfoIn; +using ::AudioRendererVoiceInfoOut; +using ::AudioRendererVoicePlayState; +using ::AudioRendererWaveBuf; +using ::AudioTarget; +using ::AudrecRecorder; +using ::AvmRequiredVersionEntry; +using ::AvmVersionListEntry; +using ::AvmVersionListImporter; +/// Barrier structure. +using ::Barrier; +using ::Binder; +using ::BpcSleepButtonState; +using ::BqBufferInput; +using ::BqBufferOutput; +using ::BqGraphicBuffer; +using ::BqRect; +/// Break point types +using ::BreakPointType; +/// Break reasons +using ::BreakReason; +/// BSD service type used by the socket driver. +using ::BsdServiceType; +/// GattAttribute +using ::BtdevGattAttribute; +/// GattCharacteristic +using ::BtdevGattCharacteristic; +/// GattDescriptor +using ::BtdevGattDescriptor; +/// GattService +using ::BtdevGattService; +/// AdapterProperty [12.0.0+] +using ::BtdrvAdapterProperty; +/// AdapterProperty [1.0.0-11.0.1] +using ::BtdrvAdapterPropertyOld; +/// AdapterPropertySet [12.0.0+] +using ::BtdrvAdapterPropertySet; +/// AdapterPropertyType [12.0.0+] +using ::BtdrvAdapterPropertyType; +/// Address +using ::BtdrvAddress; +/// AdType +using ::BtdrvAdType; +/// AppearanceCategoryType +using ::BtdrvAppearanceCategoryType; +/// AppearanceType +using ::BtdrvAppearanceType; +/// AudioCodec +using ::BtdrvAudioCodec; +/// AudioControlButtonState +using ::BtdrvAudioControlButtonState; +/// Data for \ref btdrvGetAudioEventInfo. The data stored here depends on the \ref BtdrvAudioEventType. +using ::BtdrvAudioEventInfo; +/// AudioEventType +using ::BtdrvAudioEventType; +/// AudioOutState +using ::BtdrvAudioOutState; +/// BtdrvBleAdBit +using ::BtdrvBleAdBit; +/// BtdrvBleAdFlag +using ::BtdrvBleAdFlag; +/// BleAdvertiseFilter +using ::BtdrvBleAdvertiseFilter; +/// BleAdvertisement +using ::BtdrvBleAdvertisement; +/// BtdrvBleAdvertisePacketData +using ::BtdrvBleAdvertisePacketData; +/// BleAdvertisePacketParameter +using ::BtdrvBleAdvertisePacketParameter; +/// BleClientGattOperationInfo +using ::BtdrvBleClientGattOperationInfo; +/// BleConnectionInfo +using ::BtdrvBleConnectionInfo; +/// BleConnectionParameter [9.0.0+] +using ::BtdrvBleConnectionParameter; +/// Data for \ref btdrvGetBleManagedEventInfo and \ref btdrvGetLeHidEventInfo. The data stored here depends on the \ref BtdrvBleEventType. +using ::BtdrvBleEventInfo; +/// BleEventType +using ::BtdrvBleEventType; +/// BleScanResult +using ::BtdrvBleScanResult; +/// BluetoothHhReportType +/// Bit0-1 directly control the HID bluetooth transaction report-type value. +/// Bit2-3: these directly control the Parameter Reserved field for SetReport, for GetReport these control the Parameter Reserved and Size bits. +using ::BtdrvBluetoothHhReportType; +/// BluetoothPinCode [1.0.0-11.0.1] +using ::BtdrvBluetoothPinCode; +/// BluetoothPropertyType [1.0.0-11.0.1] +using ::BtdrvBluetoothPropertyType; +/// ChannelMapList +using ::BtdrvChannelMapList; +/// CircularBuffer +using ::BtdrvCircularBuffer; +/// ClassOfDevice +using ::BtdrvClassOfDevice; +/// ConnectionEventType +using ::BtdrvConnectionEventType; +/// Data for \ref btdrvGetEventInfo. The data stored here depends on the \ref BtdrvEventType. +using ::BtdrvEventInfo; +/// EventType +using ::BtdrvEventType; +/// ExtEventType [1.0.0-11.0.1] +using ::BtdrvExtEventType; +/// This determines the u16 data to write into a CircularBuffer. +using ::BtdrvFatalReason; +/// GattAttribute +using ::BtdrvGattAttribute; +/// GattAttributePermission +using ::BtdrvGattAttributePermission; +/// GattAttributeType +using ::BtdrvGattAttributeType; +/// GattAttributeUuid +using ::BtdrvGattAttributeUuid; +/// GattAuthReqType +using ::BtdrvGattAuthReqType; +/// GattCharacteristicProperty +using ::BtdrvGattCharacteristicProperty; +/// GattCharacteristicUuidType +using ::BtdrvGattCharacteristicUuidType; +/// GattDescriptorUuidType +using ::BtdrvGattDescriptorUuidType; +/// GattId +using ::BtdrvGattId; +/// GattServiceUuidType +using ::BtdrvGattServiceUuidType; +/// HidConnectionStatus [12.0.0+] +using ::BtdrvHidConnectionStatus; +/// HidData [1.0.0-8.1.1] +using ::BtdrvHidData; +/// Data for \ref btdrvGetHidEventInfo. The data stored here depends on the \ref BtdrvHidEventType. +using ::BtdrvHidEventInfo; +/// HidEventType +using ::BtdrvHidEventType; +/// HidReport [9.0.0+]. +using ::BtdrvHidReport; +/// Data for \ref btdrvGetHidReportEventInfo. The data stored here depends on the \ref BtdrvHidEventType. +using ::BtdrvHidReportEventInfo; +/// The raw sharedmem data for HidReportEventInfo. +using ::BtdrvHidReportEventInfoBufferData; +/// BtdrvInquiryStatus +using ::BtdrvInquiryStatus; +/// LeConnectionParams [5.0.0-8.1.1] +using ::BtdrvLeConnectionParams; +/// LeEventInfo +using ::BtdrvLeEventInfo; +/// PcmParameter +using ::BtdrvPcmParameter; +/// BtdrvPinCode [12.0.0+] +using ::BtdrvPinCode; +/// PlrList +using ::BtdrvPlrList; +/// PlrStatistics +using ::BtdrvPlrStatistics; +/// AudioDevice +using ::BtmAudioDevice; +/// AudioDeviceCondition [13.0.0+] +using ::BtmAudioDeviceCondition; +/// AudioDeviceInfo [13.0.0+] +using ::BtmAudioDeviceInfo; +/// BdName +using ::BtmBdName; +/// BleDataPath +using ::BtmBleDataPath; +/// BluetoothMode +using ::BtmBluetoothMode; +/// ClassOfDevice +using ::BtmClassOfDevice; +/// DeviceCondition [13.0.0+] +using ::BtmDeviceCondition; +/// DeviceCondition [1.0.0-12.1.0] +using ::BtmDeviceConditionLegacy; +/// DeviceConditionList [1.0.0-12.1.0] +using ::BtmDeviceConditionList; +/// DeviceConditionList [1.0.0-5.0.2] +using ::BtmDeviceConditionListV100; +/// DeviceConditionList [5.1.0-7.0.1] +using ::BtmDeviceConditionListV510; +/// DeviceConditionList [8.0.0-8.1.1] +using ::BtmDeviceConditionListV800; +/// DeviceConditionList [9.0.0-12.1.0] +using ::BtmDeviceConditionListV900; +/// DeviceInfo [13.0.0+] +using ::BtmDeviceInfo; +/// DeviceInfo [1.0.0-12.1.0] +using ::BtmDeviceInfoLegacy; +/// DeviceInfoList +using ::BtmDeviceInfoList; +/// DeviceProperty +using ::BtmDeviceProperty; +/// DevicePropertyList +using ::BtmDevicePropertyList; +/// DeviceSlotMode +using ::BtmDeviceSlotMode; +/// DeviceSlotModeList +using ::BtmDeviceSlotModeList; +/// GattCharacteristic +using ::BtmGattCharacteristic; +/// GattClientConditionList +using ::BtmGattClientConditionList; +/// GattDescriptor +using ::BtmGattDescriptor; +/// GattService +using ::BtmGattService; +/// HidDeviceCondition +using ::BtmHidDeviceCondition; +/// HidDeviceInfo +using ::BtmHidDeviceInfo; +/// HostDeviceProperty +using ::BtmHostDeviceProperty; +/// LinkKey +using ::BtmLinkKey; +/// Profile +using ::BtmProfile; +/// ShortenedDeviceCondition [14.0.0+] +using ::BtmShortenedDeviceCondition; +/// ShortenedDeviceInfo [13.0.0+] +using ::BtmShortenedDeviceInfo; +/// SlotMode +using ::BtmSlotMode; +using ::BtmSniffMode; +/// BtmState +using ::BtmState; +/// TsiMode +using ::BtmTsiMode; +/// WlanMode +using ::BtmWlanMode; +/// ZeroRetransmissionList +using ::BtmZeroRetransmissionList; +/// AlbumCache +using ::CapsAlbumCache; +using ::CapsAlbumContentsUsage; +using ::CapsAlbumContentsUsageFlag; +/// AlbumEntry +using ::CapsAlbumEntry; +/// AlbumFileContents +using ::CapsAlbumFileContents; +/// AlbumFileContentsFlag +using ::CapsAlbumFileContentsFlag; +/// AlbumFileDateTime. This corresponds to each field in the Album entry filename, prior to the "-": "YYYYMMDDHHMMSSII". +using ::CapsAlbumFileDateTime; +/// AlbumEntryId +using ::CapsAlbumFileId; +using ::CapsAlbumStorage; +using ::CapsAlbumUsage16; +using ::CapsAlbumUsage2; +using ::CapsAlbumUsage3; +/// ApplicationAlbumEntry +using ::CapsApplicationAlbumEntry; +/// ApplicationAlbumFileEntry +using ::CapsApplicationAlbumFileEntry; +/// ApplicationData +using ::CapsApplicationData; +using ::CapsApplicationId; +/// ContentType +using ::CapsContentType; +/// LoadAlbumScreenShotImageOutput +using ::CapsLoadAlbumScreenShotImageOutput; +/// LoadAlbumScreenShotImageOutputForApplication +using ::CapsLoadAlbumScreenShotImageOutputForApplication; +/// ScreenShotAttribute +using ::CapsScreenShotAttribute; +/// ScreenShotAttributeForApplication. Only unk_x0 is used by official sw. +using ::CapsScreenShotAttributeForApplication; +/// ScreenShotDecodeOption +using ::CapsScreenShotDecodeOption; +/// ScreenShotDecoderFlag +using ::CapsScreenShotDecoderFlag; +/// UserIdList +using ::CapsUserIdList; +using ::ClkrstSession; +using ::CmifCommandType; +using ::CmifDomainInHeader; +using ::CmifDomainOutHeader; +using ::CmifDomainRequestType; +using ::CmifInHeader; +using ::CmifOutHeader; +using ::CmifRequest; +using ::CmifRequestFormat; +using ::CmifResponse; +/// Code memory mapping operations +using ::CodeMapOperation; +using ::ColorSetId; +/// Condition variable. +using ::CondVar; +/// Structure representing an entry in the homebrew environment configuration. +using ::ConfigEntry; +/// A font struct for the console. +using ::ConsoleFont; +/// Renderer interface for the console. +using ::ConsoleRenderer; +/// Armv8 CPU register. +using ::CpuRegister; +/// Address space types for CreateProcessFlags +using ::CreateProcessFlagAddressSpace; +/// Flags for svcCreateProcess and CreateProcess event +using ::CreateProcessFlags; +/// Console debug devices supported by libnx. +using ::debugDevice; +/// DebugEvent flags +using ::DebugEventFlag; +/// DebugEvent structure +using ::DebugEventInfo; +/// DebugEvent types +using ::DebugEventType; +/// Debug exception types +using ::DebugException; +/// Debug Thread Parameters. +using ::DebugThreadParam; +/// ApplicationErrorArg +using ::ErrorApplicationArg; +/// Error application config. +using ::ErrorApplicationConfig; +/// Stores error-codes which are displayed as XXXX-XXXX, low for the former and desc for the latter. +using ::ErrorCode; +/// Common error arg data. +using ::ErrorCommonArg; +/// Common header for the start of the arg storage. +using ::ErrorCommonHeader; +/// Error context. +using ::ErrorContext; +/// Error type for ErrorContext.type +using ::ErrorContextType; +/// Error arg data for EULA. +using ::ErrorEulaArg; +/// Additional input storage data for \ref errorSystemUpdateEulaShow. +using ::ErrorEulaData; +/// Error arg data for certain errors with module PCTL. +using ::ErrorPctlArg; +/// Error arg data for Record. +using ::ErrorRecordArg; +/// ResultBacktrace +using ::ErrorResultBacktrace; +/// SystemErrorArg +using ::ErrorSystemArg; +/// Error system config. +using ::ErrorSystemConfig; +/// Error type for ErrorCommonHeader.type. +using ::ErrorType; +/// Kernel-mode event structure. +using ::Event; +using ::FanController; +/// Struct for fatal Cpu context, 32-bit. +using ::FatalAarch32Context; +/// Struct for fatal Cpu context, 64-bit. +using ::FatalAarch64Context; +using ::FatalCpuContext; +/// Type of thrown fatal error. +using ::FatalPolicy; +/// FatFatError +using ::FatFatError; +/// FatFatReportInfo1 +using ::FatFatReportInfo1; +/// FatFatReportInfo2 +using ::FatFatReportInfo2; +/// FatFatSafeInfo +using ::FatFatSafeInfo; +using ::FinalOutputRecorderBuffer; +using ::FinalOutputRecorderParameter; +using ::FinalOutputRecorderParameterInternal; +/// Armv8 NEON register. +using ::FpuRegister; +/// Framebuffer structure. +using ::Framebuffer; +/// FriendInvitationGameModeDescription +using ::FriendsFriendInvitationGameModeDescription; +/// FriendInvitationGroupId +using ::FriendsFriendInvitationGroupId; +/// FriendInvitationId +using ::FriendsFriendInvitationId; +/// InAppScreenName +using ::FriendsInAppScreenName; +/// Arg struct pushed for the applet input storage, for [9.0.0+]. +using ::FriendsLaArg; +/// Common data for the arg struct, for the pre-9.0.0 types. +/// This is only set for ::FriendsLaArgType_ShowUserDetailInfo/::FriendsLaArgType_StartSendingFriendRequest, for everything else this is cleared. +using ::FriendsLaArgCommonData; +/// Header for the arg struct. +using ::FriendsLaArgHeader; +/// Arg type values used with \ref FriendsLaArg. +using ::FriendsLaArgType; +/// Arg struct pushed for the applet input storage, for pre-9.0.0. +using ::FriendsLaArgV1; +using ::FriendsServiceType; +/// FriendsUserSetting +using ::FriendsUserSetting; +/// This is nn::fssystem::ArchiveMacKey. Used by \ref setsysGetThemeKey and \ref setsysSetThemeKey. Does not appear to be in use elsewhere. +using ::FsArchiveMacKey; +/// BisPartitionId +using ::FsBisPartitionId; +using ::FsCodeInfo; +/// FsContentAttributes +using ::FsContentAttributes; +using ::FsContentStorageId; +/// For use with fsFsCreateFile. +using ::FsCreateOption; +using ::FsCustomStorageId; +/// Open directory struct +using ::fsdev_dir_t; +using ::FsDeviceOperator; +using ::FsDir; +/// Directory entry. +using ::FsDirectoryEntry; +/// Returned by fsFsGetEntryType. +using ::FsDirEntryType; +/// For use with fsFsOpenDirectory. +using ::FsDirOpenMode; +using ::FsEventNotifier; +using ::FsFile; +using ::FsFileSystem; +/// FileSystemAttribute +using ::FsFileSystemAttribute; +/// FsFileSystemProxyErrorInfo +using ::FsFileSystemProxyErrorInfo; +/// FileSystemQueryId +using ::FsFileSystemQueryId; +/// FileSystemType +using ::FsFileSystemType; +using ::FsGameCardAttribute; +/// FsGameCardErrorReportInfo +using ::FsGameCardErrorReportInfo; +using ::FsGameCardHandle; +using ::FsGameCardPartition; +using ::FsGameCardUpdatePartitionInfo; +/// ImageDirectoryId +using ::FsImageDirectoryId; +/// FsMemoryReportInfo +using ::FsMemoryReportInfo; +/// For use with fsOpenHostFileSystemWithOption +using ::FsMountHostOption; +/// For use with fsFsOpenFile. +using ::FsOpenMode; +using ::FsOperationId; +/// FsPriority +using ::FsPriority; +using ::FsRangeInfo; +/// For use with fsFileRead. +using ::FsReadOption; +using ::FsRightsId; +/// SaveDataAttribute +using ::FsSaveDataAttribute; +/// SaveDataCreationInfo +using ::FsSaveDataCreationInfo; +/// SaveDataExtraData +using ::FsSaveDataExtraData; +/// SaveDataFilter +using ::FsSaveDataFilter; +/// SaveDataFlags +using ::FsSaveDataFlags; +/// SaveDataInfo +using ::FsSaveDataInfo; +using ::FsSaveDataInfoReader; +/// SaveDataMetaInfo +using ::FsSaveDataMetaInfo; +/// SaveDataMetaType +using ::FsSaveDataMetaType; +/// SaveDataRank +using ::FsSaveDataRank; +/// SaveDataSpaceId +using ::FsSaveDataSpaceId; +/// SaveDataType +using ::FsSaveDataType; +using ::FsStorage; +/// FsStorageErrorInfo +using ::FsStorageErrorInfo; +using ::FsStorageForBatchRead; +using ::FsTimeStampRaw; +/// For use with fsFileWrite. +using ::FsWriteOption; +using ::GpioDirection; +using ::GpioInterruptMode; +using ::GpioInterruptStatus; +using ::GpioPadName; +using ::GpioPadSession; +using ::GpioValue; +/// GameMovieId +using ::GrcGameMovieId; +/// GameMovieTrimmer +using ::GrcGameMovieTrimmer; +/// IMovieMaker +using ::GrcMovieMaker; +/// OffscreenRecordingParameter +using ::GrcOffscreenRecordingParameter; +/// Stream type values for \ref grcdTransfer. +using ::GrcStream; +///< 128-bit volatile signed integer. +using ::Handle; +/// HidAnalogStickCalibrationStateImpl +using ::HidAnalogStickCalibrationStateImpl; +/// HidAnalogStickCalibrationStateImplAtomicStorage +using ::HidAnalogStickCalibrationStateImplAtomicStorage; +/// HidAnalogStickCalibrationStateImplLifo +using ::HidAnalogStickCalibrationStateImplLifo; +/// HidAnalogStickState +using ::HidAnalogStickState; +/// AppletFooterUiType (system) +using ::HidAppletFooterUiType; +/// HidBasicXpadLifo +using ::HidBasicXpadLifo; +/// HidBasicXpadSharedMemoryEntry +using ::HidBasicXpadSharedMemoryEntry; +/// HidBasicXpadSharedMemoryFormat +using ::HidBasicXpadSharedMemoryFormat; +/// HidBasicXpadState +using ::HidBasicXpadState; +/// HidBasicXpadStateAtomicStorage +using ::HidBasicXpadStateAtomicStorage; +/// BusHandle +using ::HidbusBusHandle; +/// BusType +using ::HidbusBusType; +/// HidbusDataAccessorHeader +using ::HidbusDataAccessorHeader; +/// HidbusJoyButtonOnlyPollingDataAccessor +using ::HidbusJoyButtonOnlyPollingDataAccessor; +/// HidbusJoyButtonOnlyPollingDataAccessorEntry +using ::HidbusJoyButtonOnlyPollingDataAccessorEntry; +/// HidbusJoyButtonOnlyPollingDataAccessorEntryData +using ::HidbusJoyButtonOnlyPollingDataAccessorEntryData; +/// HidbusJoyDisableSixAxisPollingDataAccessor +using ::HidbusJoyDisableSixAxisPollingDataAccessor; +/// HidbusJoyDisableSixAxisPollingDataAccessorEntry +using ::HidbusJoyDisableSixAxisPollingDataAccessorEntry; +/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData +using ::HidbusJoyDisableSixAxisPollingDataAccessorEntryData; +/// HidbusJoyEnableSixAxisPollingDataAccessor +using ::HidbusJoyEnableSixAxisPollingDataAccessor; +/// HidbusJoyEnableSixAxisPollingDataAccessorEntry +using ::HidbusJoyEnableSixAxisPollingDataAccessorEntry; +/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData +using ::HidbusJoyEnableSixAxisPollingDataAccessorEntryData; +/// JoyPollingMode +using ::HidbusJoyPollingMode; +/// JoyPollingReceivedData +using ::HidbusJoyPollingReceivedData; +/// StatusManager +using ::HidbusStatusManager; +/// HidbusStatusManagerEntry +using ::HidbusStatusManagerEntry; +/// Common data for HidbusStatusManagerEntry*. +using ::HidbusStatusManagerEntryCommon; +/// HidbusStatusManagerEntry on 5.x. +using ::HidbusStatusManagerEntryV5; +/// StatusManager on 5.x. +using ::HidbusStatusManagerV5; +/// HidCaptureButtonLifo +using ::HidCaptureButtonLifo; +/// HidCaptureButtonSharedMemoryFormat +using ::HidCaptureButtonSharedMemoryFormat; +/// HidCaptureButtonState +using ::HidCaptureButtonState; +/// HidCaptureButtonStateAtomicStorage +using ::HidCaptureButtonStateAtomicStorage; +/// AnalogStickAssignment +using ::HidcfgAnalogStickAssignment; +/// AnalogStickRotation +using ::HidcfgAnalogStickRotation; +/// ButtonConfigEmbedded +using ::HidcfgButtonConfigEmbedded; +/// ButtonConfigFull +using ::HidcfgButtonConfigFull; +/// ButtonConfigLeft +using ::HidcfgButtonConfigLeft; +/// ButtonConfigRight +using ::HidcfgButtonConfigRight; +/// Selects what button to map to. +using ::HidcfgDigitalButtonAssignment; +/// StorageName +using ::HidcfgStorageName; +/// HidColorAttribute +using ::HidColorAttribute; +/// HidCommonLifoHeader +using ::HidCommonLifoHeader; +/// HidConsoleSixAxisSensor +using ::HidConsoleSixAxisSensor; +/// AbstractedPadHandle +using ::HiddbgAbstractedPadHandle; +/// AbstractedPadState +using ::HiddbgAbstractedPadState; +/// State for overriding \ref HidDebugPadState. +using ::HiddbgDebugPadAutoPilotState; +/// HdlsAttribute +using ::HiddbgHdlsAttribute; +/// HdlsDeviceInfo, for [9.0.0+]. Converted to/from \ref HiddbgHdlsDeviceInfoV7 on prior sysvers. +using ::HiddbgHdlsDeviceInfo; +/// HdlsDeviceInfo, for [7.0.0-8.1.0]. +using ::HiddbgHdlsDeviceInfoV7; +/// HdlsHandle +using ::HiddbgHdlsHandle; +/// HdlsNpadAssignment. Same controllers as \ref HiddbgHdlsStateList, with different entry data. +using ::HiddbgHdlsNpadAssignment; +/// HdlsNpadAssignmentEntry +using ::HiddbgHdlsNpadAssignmentEntry; +/// HdlsSessionId, returned by \ref hiddbgAttachHdlsWorkBuffer. +using ::HiddbgHdlsSessionId; +/// HdlsState, for [12.0.0+]. +using ::HiddbgHdlsState; +/// HdlsStateList, for [12.0.0+]. +/// This contains a list of all controllers, including non-virtual controllers. +using ::HiddbgHdlsStateList; +/// HdlsStateListEntry, for [12.0.0+]. +using ::HiddbgHdlsStateListEntry; +/// HdlsStateListEntryV7, for [7.0.0-8.1.0]. +using ::HiddbgHdlsStateListEntryV7; +/// HdlsStateListEntry, for [9.0.0-11.0.1]. +using ::HiddbgHdlsStateListEntryV9; +/// HdlsStateListV7, for [7.0.0-8.1.0]. This contains a list of all controllers, including non-virtual controllers. +using ::HiddbgHdlsStateListV7; +/// HdlsStateList, for [9.0.0-11.0.1]. +using ::HiddbgHdlsStateListV9; +/// HdlsState, for [7.0.0-8.1.0]. +using ::HiddbgHdlsStateV7; +/// HdlsState, for [9.0.0-11.0.1]. +using ::HiddbgHdlsStateV9; +/// State for overriding \ref HidKeyboardState. +using ::HiddbgKeyboardAutoPilotState; +/// State for overriding \ref HidMouseState. +using ::HiddbgMouseAutoPilotState; +/// HiddbgNpadButton. For the remaining buttons, see \ref HidNpadButton. +using ::HiddbgNpadButton; +/// State for overriding SleepButtonState. +using ::HiddbgSleepButtonAutoPilotState; +/// HidDebugPadAttribute +using ::HidDebugPadAttribute; +/// HidDebugPadButton +using ::HidDebugPadButton; +/// HidDebugPadLifo +using ::HidDebugPadLifo; +/// HidDebugPadSharedMemoryFormat +using ::HidDebugPadSharedMemoryFormat; +/// HidDebugPadState +using ::HidDebugPadState; +/// HidDebugPadStateAtomicStorage +using ::HidDebugPadStateAtomicStorage; +/// Internal DeviceType for [9.0.0+]. Converted to/from the pre-9.0.0 version of this by the hiddbg funcs. +using ::HidDeviceType; +/// DeviceType (system) +using ::HidDeviceTypeBits; +/// HidDigitizerLifo +using ::HidDigitizerLifo; +/// HidDigitizerSharedMemoryFormat +using ::HidDigitizerSharedMemoryFormat; +/// HidDigitizerState +using ::HidDigitizerState; +/// HidDigitizerStateAtomicStorage +using ::HidDigitizerStateAtomicStorage; +/// HidDirectionState +using ::HidDirectionState; +/// HidGestureAttribute +using ::HidGestureAttribute; +/// HidGestureDirection +using ::HidGestureDirection; +/// HidGestureDummyStateAtomicStorage +using ::HidGestureDummyStateAtomicStorage; +/// HidGestureLifo +using ::HidGestureLifo; +/// HidGesturePoint +using ::HidGesturePoint; +/// HidGestureSharedMemoryFormat +using ::HidGestureSharedMemoryFormat; +/// HidGestureState +using ::HidGestureState; +/// HidGestureType +using ::HidGestureType; +/// GyroscopeZeroDriftMode +using ::HidGyroscopeZeroDriftMode; +/// HidHomeButtonLifo +using ::HidHomeButtonLifo; +/// HidHomeButtonSharedMemoryFormat +using ::HidHomeButtonSharedMemoryFormat; +/// HidHomeButtonState +using ::HidHomeButtonState; +/// HidHomeButtonStateAtomicStorage +using ::HidHomeButtonStateAtomicStorage; +/// HidInputDetectorLifo +using ::HidInputDetectorLifo; +/// HidInputDetectorSharedMemoryEntry +using ::HidInputDetectorSharedMemoryEntry; +/// HidInputDetectorSharedMemoryFormat +using ::HidInputDetectorSharedMemoryFormat; +/// HidInputDetectorState +using ::HidInputDetectorState; +/// HidInputDetectorStateAtomicStorage +using ::HidInputDetectorStateAtomicStorage; +/// HidKeyboardKey +using ::HidKeyboardKey; +/// HidKeyboardLifo +using ::HidKeyboardLifo; +/// KeyboardLockKeyEvent +using ::HidKeyboardLockKeyEvent; +/// HidKeyboardModifier +using ::HidKeyboardModifier; +/// HidKeyboardSharedMemoryFormat +using ::HidKeyboardSharedMemoryFormat; +/// HidKeyboardState +using ::HidKeyboardState; +/// HidKeyboardStateAtomicStorage +using ::HidKeyboardStateAtomicStorage; +/// ControllerFirmwareUpdateArg +using ::HidLaControllerFirmwareUpdateArg; +/// ControllerKeyRemappingArg +using ::HidLaControllerKeyRemappingArg; +/// ControllerSupportArg for [8.0.0+], converted to \ref HidLaControllerSupportArgV3 on pre-8.0.0. +using ::HidLaControllerSupportArg; +/// Identification color used by HidLaControllerSupportArg*. When HidLaControllerSupportArgHeader::enable_identification_color is set this controls the color of the UI player box outline. +using ::HidLaControllerSupportArgColor; +/// Common header used by HidLaControllerSupportArg*. +/// max_supported_players is 4 on pre-8.0.0, 8 on [8.0.0+]. player_count_min and player_count_max are overriden with value 4 when larger than value 4, during conversion handling for \ref HidLaControllerSupportArg on pre-8.0.0. +using ::HidLaControllerSupportArgHeader; +/// ControllerSupportArgPrivate +using ::HidLaControllerSupportArgPrivate; +/// ControllerSupportArg for [1.0.0+]. +using ::HidLaControllerSupportArgV3; +/// ControllerSupportCaller +using ::HidLaControllerSupportCaller; +/// Mode values for HidLaControllerSupportArgPrivate::mode. +using ::HidLaControllerSupportMode; +/// ControllerSupportResultInfo. First 8-bytes from the applet output storage. +using ::HidLaControllerSupportResultInfo; +/// Struct for the applet output storage. +using ::HidLaControllerSupportResultInfoInternal; +/// HidMouseAttribute +using ::HidMouseAttribute; +/// HidMouseButton +using ::HidMouseButton; +/// HidMouseLifo +using ::HidMouseLifo; +/// HidMouseSharedMemoryFormat +using ::HidMouseSharedMemoryFormat; +/// HidMouseState +using ::HidMouseState; +/// HidMouseStateAtomicStorage +using ::HidMouseStateAtomicStorage; +/// HidNfcXcdDeviceHandleState +using ::HidNfcXcdDeviceHandleState; +/// HidNfcXcdDeviceHandleStateImpl +using ::HidNfcXcdDeviceHandleStateImpl; +/// HidNfcXcdDeviceHandleStateImplAtomicStorage +using ::HidNfcXcdDeviceHandleStateImplAtomicStorage; +/// HidNpadAttribute +using ::HidNpadAttribute; +/// HidNpadButton +using ::HidNpadButton; +/// HidNpadCommonLifo +using ::HidNpadCommonLifo; +/// HidNpadCommonState +using ::HidNpadCommonState; +///< State for ::HidNpadStyleTag_NpadSystem. Analog-sticks state are always zero. Only the following button bits are available: HidNpadButton_A, HidNpadButton_B, HidNpadButton_X, HidNpadButton_Y, HidNpadButton_Left, HidNpadButton_Up, HidNpadButton_Right, HidNpadButton_Down, HidNpadButton_L, HidNpadButton_R. +/// HidNpadCommonStateAtomicStorage +using ::HidNpadCommonStateAtomicStorage; +/// NpadCommunicationMode +using ::HidNpadCommunicationMode; +/// Npad colors. +/// Color fields are zero when not set. +using ::HidNpadControllerColor; +/// HidNpadFullKeyColorState +using ::HidNpadFullKeyColorState; +using ::HidNpadFullKeyState; +///< State for ::HidNpadStyleTag_NpadJoyRight. +/// State for ::HidNpadStyleTag_NpadGc. Loaded from the same lifo as \ref HidNpadFullKeyState, with the additional trigger_l/trigger_r loaded from elsewhere. +using ::HidNpadGcState; +/// HidNpadGcTriggerLifo +using ::HidNpadGcTriggerLifo; +/// HidNpadGcTriggerState +using ::HidNpadGcTriggerState; +/// HidNpadGcTriggerStateAtomicStorage +using ::HidNpadGcTriggerStateAtomicStorage; +/// This controls how many Joy-Cons must be attached for handheld-mode to be activated. +using ::HidNpadHandheldActivationMode; +/// State for ::HidNpadStyleTag_NpadHandheldLark. The base state is loaded from the same lifo as \ref HidNpadHandheldState. +using ::HidNpadHandheldLarkState; +///< State for ::HidNpadStyleTag_NpadFullKey. +using ::HidNpadHandheldState; +/// HID controller IDs +using ::HidNpadIdType; +/// NpadInterfaceType (system) +using ::HidNpadInterfaceType; +/// HidNpadInternalState +using ::HidNpadInternalState; +/// NpadJoyAssignmentMode +using ::HidNpadJoyAssignmentMode; +/// HidNpadJoyColorState +using ::HidNpadJoyColorState; +/// NpadJoyDeviceType +using ::HidNpadJoyDeviceType; +///< State for ::HidNpadStyleTag_NpadHandheld. +using ::HidNpadJoyDualState; +/// NpadJoyHoldType +using ::HidNpadJoyHoldType; +///< State for ::HidNpadStyleTag_NpadJoyDual. +using ::HidNpadJoyLeftState; +///< State for ::HidNpadStyleTag_NpadJoyLeft. +using ::HidNpadJoyRightState; +using ::HidNpadLagerState; +/// NpadLagerType +using ::HidNpadLagerType; +///< State for ::HidNpadStyleTag_NpadPalma. +/// State for ::HidNpadStyleTag_NpadLark. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. +using ::HidNpadLarkState; +/// NpadLarkType +using ::HidNpadLarkType; +/// State for ::HidNpadStyleTag_NpadLucia. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. +using ::HidNpadLuciaState; +/// NpadLuciaType +using ::HidNpadLuciaType; +using ::HidNpadPalmaState; +/// HidNpadSharedMemoryEntry +using ::HidNpadSharedMemoryEntry; +/// HidNpadSharedMemoryFormat +using ::HidNpadSharedMemoryFormat; +/// HidNpadSixAxisSensorLifo +using ::HidNpadSixAxisSensorLifo; +/// HID controller styles +using ::HidNpadStyleTag; +/// NpadSystemButtonProperties +using ::HidNpadSystemButtonProperties; +///< State for ::HidNpadStyleTag_NpadLager. Analog-sticks state are always zero. +using ::HidNpadSystemExtState; +/// NpadSystemProperties +using ::HidNpadSystemProperties; +///< State for ::HidNpadStyleTag_NpadSystemExt. +using ::HidNpadSystemState; +/// PalmaActivityEntry +using ::HidPalmaActivityEntry; +/// PalmaApplicationSectionAccessBuffer +using ::HidPalmaApplicationSectionAccessBuffer; +/// PalmaConnectionHandle +using ::HidPalmaConnectionHandle; +/// PalmaFeature +using ::HidPalmaFeature; +/// PalmaFrModeType +using ::HidPalmaFrModeType; +/// PalmaOperationInfo +using ::HidPalmaOperationInfo; +/// PalmaOperationType +using ::HidPalmaOperationType; +/// PalmaWaveSet +using ::HidPalmaWaveSet; +/// HidPowerInfo (system) +using ::HidPowerInfo; +/// HidSevenSixAxisSensorState +using ::HidSevenSixAxisSensorState; +/// HidSevenSixAxisSensorStateEntry +using ::HidSevenSixAxisSensorStateEntry; +/// HidSevenSixAxisSensorStates +using ::HidSevenSixAxisSensorStates; +/// HidSharedMemory +using ::HidSharedMemory; +/// HidSixAxisSensorAttribute +using ::HidSixAxisSensorAttribute; +/// HidSixAxisSensorHandle +using ::HidSixAxisSensorHandle; +/// HidSixAxisSensorState +using ::HidSixAxisSensorState; +/// HidSixAxisSensorStateAtomicStorage +using ::HidSixAxisSensorStateAtomicStorage; +/// HidSixAxisSensorUserCalibrationState +using ::HidSixAxisSensorUserCalibrationState; +/// HidSixAxisSensorUserCalibrationStateAtomicStorage +using ::HidSixAxisSensorUserCalibrationStateAtomicStorage; +/// HidSixAxisSensorUserCalibrationStateLifo +using ::HidSixAxisSensorUserCalibrationStateLifo; +/// HidSleepButtonLifo +using ::HidSleepButtonLifo; +/// HidSleepButtonSharedMemoryFormat +using ::HidSleepButtonSharedMemoryFormat; +/// HidSleepButtonState +using ::HidSleepButtonState; +/// HidSleepButtonStateAtomicStorage +using ::HidSleepButtonStateAtomicStorage; +/// ButtonConfigEmbedded +using ::HidsysButtonConfigEmbedded; +/// ButtonConfigFull +using ::HidsysButtonConfigFull; +/// ButtonConfigLeft +using ::HidsysButtonConfigLeft; +/// ButtonConfigRight +using ::HidsysButtonConfigRight; +/// Structure for \ref hidsysSetNotificationLedPattern. +/// See also: https://switchbrew.org/wiki/HID_services#NotificationLedPattern +/// Only the low 4bits of each used byte in this struct is used. +using ::HidsysNotificationLedPattern; +/// Mini Cycle struct for \ref HidsysNotificationLedPattern. +using ::HidsysNotificationLedPatternCycle; +/// UniquePadId for a controller. +using ::HidsysUniquePadId; +/// UniquePadSerialNumber +using ::HidsysUniquePadSerialNumber; +/// UniquePadType +using ::HidsysUniquePadType; +/// HidTouchAttribute +using ::HidTouchAttribute; +/// HidTouchScreenConfigurationForNx +using ::HidTouchScreenConfigurationForNx; +/// HidTouchScreenLifo +using ::HidTouchScreenLifo; +/// HidTouchScreenModeForNx +using ::HidTouchScreenModeForNx; +/// HidTouchScreenSharedMemoryFormat +using ::HidTouchScreenSharedMemoryFormat; +/// HidTouchScreenState +using ::HidTouchScreenState; +/// HidTouchScreenStateAtomicStorage +using ::HidTouchScreenStateAtomicStorage; +/// HidTouchState +using ::HidTouchState; +/// HidUniquePadConfig +using ::HidUniquePadConfig; +/// HidUniquePadConfigAtomicStorage +using ::HidUniquePadConfigAtomicStorage; +/// HidUniquePadConfigLifo +using ::HidUniquePadConfigLifo; +/// HidUniquePadConfigMutex +using ::HidUniquePadConfigMutex; +/// HidUniquePadLifo +using ::HidUniquePadLifo; +/// HidUniquePadSharedMemoryEntry +using ::HidUniquePadSharedMemoryEntry; +/// HidUniquePadSharedMemoryFormat +using ::HidUniquePadSharedMemoryFormat; +/// HidVector +using ::HidVector; +/// HidVibrationDeviceHandle +using ::HidVibrationDeviceHandle; +/// HidVibrationDeviceInfo +using ::HidVibrationDeviceInfo; +/// VibrationDevicePosition +using ::HidVibrationDevicePosition; +/// Type values for HidVibrationDeviceInfo::type. +using ::HidVibrationDeviceType; +/// VibrationGcErmCommand +using ::HidVibrationGcErmCommand; +/// HidVibrationValue +using ::HidVibrationValue; +using ::HipcBufferDescriptor; +using ::HipcBufferMode; +using ::HipcHeader; +using ::HipcMetadata; +using ::HipcParsedRequest; +using ::HipcRecvListEntry; +using ::HipcRequest; +using ::HipcResponse; +using ::HipcSpecialHeader; +using ::HipcStaticDescriptor; +/// Context for HMAC-SHA1 operations. +using ::HmacSha1Context; +/// Context for HMAC-SHA256 operations. +using ::HmacSha256Context; +using ::HwopusDecoder; +/// This structure is the start of opusin for \ref hwopusDecodeInterleaved, with the actual opus packet following this. +/// These fields are big-endian. +using ::HwopusHeader; +/// Used internally. +using ::HwopusMultistreamState; +using ::I2cDevice; +using ::I2cSession; +using ::I2cTransactionOption; +using ::in_addr; +/// GetInfo IDs. +using ::InfoType; +/// GetInfo InitialProcessIdRange Sub IDs. +using ::InitialProcessIdRangeInfo; +/// Io Pools. +using ::IoPoolType; +using ::iova_t; +/// AdaptiveClusteringMode +using ::IrsAdaptiveClusteringMode; +/// AdaptiveClusteringProcessorConfig +using ::IrsAdaptiveClusteringProcessorConfig; +/// AdaptiveClusteringTargetDistance +using ::IrsAdaptiveClusteringTargetDistance; +/// AruidFormat +using ::IrsAruidFormat; +/// ClusteringData +using ::IrsClusteringData; +/// ClusteringProcessorConfig +using ::IrsClusteringProcessorConfig; +/// ClusteringProcessorState +using ::IrsClusteringProcessorState; +/// DeviceFormat +using ::IrsDeviceFormat; +/// HandAnalysisConfig +using ::IrsHandAnalysisConfig; +/// HandAnalysisMode +using ::IrsHandAnalysisMode; +/// ImageProcessorStatus +using ::IrsImageProcessorStatus; +/// ImageTransferProcessorConfig +using ::IrsImageTransferProcessorConfig; +/// ImageTransferProcessorExConfig +using ::IrsImageTransferProcessorExConfig; +/// ImageTransferProcessorFormat. IR Sensor image resolution. +using ::IrsImageTransferProcessorFormat; +/// ImageTransferProcessorState +using ::IrsImageTransferProcessorState; +/// IrCameraHandle +using ::IrsIrCameraHandle; +/// IrCameraInternalStatus +using ::IrsIrCameraInternalStatus; +/// IrCameraStatus +using ::IrsIrCameraStatus; +/// IrLedProcessorConfig +using ::IrsIrLedProcessorConfig; +/// IrSensorMode +using ::IrsIrSensorMode; +/// IrsMomentProcessorConfig +using ::IrsMomentProcessorConfig; +/// MomentProcessorState +using ::IrsMomentProcessorState; +/// MomentStatistic +using ::IrsMomentStatistic; +/// PackedClusteringProcessorConfig +using ::IrsPackedClusteringProcessorConfig; +/// PackedFunctionLevel +using ::IrsPackedFunctionLevel; +/// PackedImageTransferProcessorConfig +using ::IrsPackedImageTransferProcessorConfig; +/// PackedImageTransferProcessorExConfig +using ::IrsPackedImageTransferProcessorExConfig; +/// PackedIrLedProcessorConfig +using ::IrsPackedIrLedProcessorConfig; +/// PackedMcuVersion +using ::IrsPackedMcuVersion; +/// PackedMomentProcessorConfig +using ::IrsPackedMomentProcessorConfig; +/// PackedPointingProcessorConfig +using ::IrsPackedPointingProcessorConfig; +/// PackedTeraPluginProcessorConfig +using ::IrsPackedTeraPluginProcessorConfig; +/// PointingProcessorMarkerState +using ::IrsPointingProcessorMarkerState; +/// PointingProcessorState +using ::IrsPointingProcessorState; +/// ProcessorState +using ::IrsProcessorState; +/// Rect +using ::IrsRect; +/// StatusManager +using ::IrsStatusManager; +/// TeraPluginProcessorConfig +using ::IrsTeraPluginProcessorConfig; +/// TeraPluginProcessorState +using ::IrsTeraPluginProcessorState; +/// Internal validation callblack. +using ::IrsValidationCb; +/// JIT buffer object. +using ::Jit; +/// JIT implementation type. +using ::JitType; +/// Context of a scheduled thread. +using ::LastThreadContext; +using ::LblBacklightSwitchStatus; +/// AcceptPolicy +using ::LdnAcceptPolicy; +/// ActionFrameSettings +using ::LdnActionFrameSettings; +/// AddressEntry +using ::LdnAddressEntry; +/// CommonNetworkInfo +using ::LdnCommonNetworkInfo; +/// DisconnectReason loaded by \ref ldnGetDisconnectReason. +using ::LdnDisconnectReason; +/// IntentId +using ::LdnIntentId; +/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). +using ::LdnIpv4Address; +/// MacAddress +using ::LdnMacAddress; +/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate). +using ::LdnNetworkConfig; +/// NetworkId +using ::LdnNetworkId; +/// NetworkInfo +using ::LdnNetworkInfo; +/// NodeInfo +using ::LdnNodeInfo; +/// NodeLatestUpdate +using ::LdnNodeLatestUpdate; +/// OperationMode +using ::LdnOperationMode; +/// Protocol +using ::LdnProtocol; +/// ScanFilter. \ref ldnScan / \ref ldnScanPrivate will only return the \ref LdnNetworkInfo when validating the \ref LdnNetworkInfo with LdnScanFilter was sucessful, with the fields enabled by \ref LdnScanFilterFlag. +using ::LdnScanFilter; +/// ScanFilterFlag +using ::LdnScanFilterFlag; +/// SecurityConfig +using ::LdnSecurityConfig; +/// SecurityMode. LdnSecurityMode_Product can be used as the default value. The ldn cmds which use an input SecurityMode normally overwrite the SecurityMode. +using ::LdnSecurityMode; +/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated. +using ::LdnSecurityParameter; +using ::LdnServiceType; +/// SessionId +using ::LdnSessionId; +/// Ssid +using ::LdnSsid; +/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState. +using ::LdnState; +/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). +using ::LdnSubnetMask; +/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd. +using ::LdnUserConfig; +/// WirelessControllerRestriction +using ::LdnWirelessControllerRestriction; +/// User-mode light event structure. +using ::LEvent; +/// CommonArguments +using ::LibAppletArgs; +/// LibraryAppletExitReason +using ::LibAppletExitReason; +/// LibraryAppletInfo +using ::LibAppletInfo; +/// LibraryAppletMode +using ::LibAppletMode; +/// Limitable Resources. +using ::LimitableResource; +using ::LoaderModuleInfo; +using ::LoaderProgramAttributes; +using ::LoaderProgramInfo; +using ::LoaderProgramInfoV1; +/// Loader return function. +using ::LoaderReturnFn; +/// GroupId +using ::Lp2pGroupId; +/// GroupInfo +/// \ref lp2pScan only uses the following fields for the cmd input struct: supported_platform/priority, frequency/channel, and preshared_key_binary_size/preshared_key. +using ::Lp2pGroupInfo; +/// IpConfig. Only contains IPv4 addresses. +using ::Lp2pIpConfig; +/// MacAddress +using ::Lp2pMacAddress; +/// NodeInfo +using ::Lp2pNodeInfo; +/// ScanResult +using ::Lp2pScanResult; +using ::Lp2pServiceType; +using ::LrLocationResolver; +using ::LrRegisteredLocationResolver; +/// Memory attribute bitmasks. +using ::MemoryAttribute; +/// Memory information structure. +using ::MemoryInfo; +/// Memory mapping type. +using ::MemoryMapping; +/// Memory regions +using ::MemoryRegion; +/// Memory state bitmasks. +using ::MemoryState; +/// Memory type enumeration (lower 8 bits of \ref MemoryState) +using ::MemoryType; +/// Mii age. +using ::MiiAge; +using ::MiiCharInfo; +using ::MiiCreateId; +using ::MiiDatabase; +/// Mii face color. +using ::MiiFaceColor; +/// Mii gender. +using ::MiiGender; +/// Image attribute. +using ::MiiimgImageAttribute; +/// Image ID. +using ::MiiimgImageId; +/// AppletInput +using ::MiiLaAppletInput; +/// AppletMode +using ::MiiLaAppletMode; +/// AppletOutput +using ::MiiLaAppletOutput; +/// AppletOutputForCharInfoEditing +using ::MiiLaAppletOutputForCharInfoEditing; +using ::MiiNfpStoreDataExtension; +using ::MiiServiceType; +using ::MiiSourceFlag; +using ::MiiSpecialKeyCode; +using ::MiiStoreData; +using ::MiiVer3StoreData; +using ::MmuModuleId; +using ::MmuRequest; +/// Mutex datatype, defined in newlib. +using ::Mutex; +/// ApplicationControlDataCondition +using ::NacpApplicationControlDataCondition; +/// ApplicationJitConfiguration +using ::NacpApplicationJitConfiguration; +/// ApplicationNeighborDetectionGroupConfiguration +using ::NacpApplicationNeighborDetectionGroupConfiguration; +/// Language entry. These strings are UTF-8. +using ::NacpLanguageEntry; +using ::NacpLanguageEntryData; +/// NeighborDetectionClientConfiguration +using ::NacpNeighborDetectionClientConfiguration; +/// ns ApplicationControlProperty +using ::NacpStruct; +using ::NativeHandle; +/// AddOnContentMetaExtendedHeader [15.0.0+] +using ::NcmAddOnContentMetaExtendedHeader; +/// ApplicationContentMetaKey +using ::NcmApplicationContentMetaKey; +/// ApplicationMetaExtendedHeader +using ::NcmApplicationMetaExtendedHeader; +/// ContentId +using ::NcmContentId; +/// ContentInfo +using ::NcmContentInfo; +/// ContentInstallType +using ::NcmContentInstallType; +/// ContentMetaAttribute +using ::NcmContentMetaAttribute; +/// ContentMetaDatabase +using ::NcmContentMetaDatabase; +/// ContentMetaHeader +using ::NcmContentMetaHeader; +/// ContentMetaInfo +using ::NcmContentMetaInfo; +/// ContentMetaKey +using ::NcmContentMetaKey; +/// ContentMetaPlatform +using ::NcmContentMetaPlatform; +/// ContentMetaType +using ::NcmContentMetaType; +/// ContentStorage +using ::NcmContentStorage; +/// ContentType +using ::NcmContentType; +/// DataPatchMetaExtendedHeader +using ::NcmDataPatchMetaExtendedHeader; +/// LegacyAddOnContentMetaExtendedHeader [1.0.0-14.1.2] +using ::NcmLegacyAddOnContentMetaExtendedHeader; +/// PackagedContentInfo +using ::NcmPackagedContentInfo; +/// PatchMetaExtendedHeader +using ::NcmPatchMetaExtendedHeader; +/// PlaceHolderId +using ::NcmPlaceHolderId; +/// ProgramLocation +using ::NcmProgramLocation; +/// RightsId +using ::NcmRightsId; +/// StorageId +using ::NcmStorageId; +/// SystemUpdateMetaExtendedHeader +using ::NcmSystemUpdateMetaExtendedHeader; +using ::NewsDatabaseService; +using ::NewsDataService; +using ::NewsNewlyArrivedEventHolder; +using ::NewsOverwriteEventHolder; +using ::NewsRecord; +using ::NewsRecordV1; +using ::NewsServiceType; +using ::NewsTopicName; +/// Nfc/Nfp DeviceHandle +using ::NfcDeviceHandle; +using ::NfcDeviceState; +using ::NfcMifareCommand; +using ::NfcMifareDeviceState; +using ::NfcMifareReadBlockData; +using ::NfcMifareReadBlockParameter; +using ::NfcMifareWriteBlockParameter; +using ::NfcProtocol; +using ::NfcRequiredMcuVersionData; +using ::NfcSectorKey; +/// NfcServiceType +using ::NfcServiceType; +using ::NfcState; +using ::NfcTagInfo; +using ::NfcTagType; +using ::NfcTagUid; +using ::NfpAdminInfo; +using ::NfpAmiiboFlag; +using ::NfpApplicationAreaVersion; +using ::NfpBreakType; +using ::NfpCommonInfo; +using ::NfpData; +using ::NfpDate; +using ::NfpDeviceState; +using ::NfpDeviceType; +/// AmiiboSettingsStartParam +using ::NfpLaAmiiboSettingsStartParam; +/// ReturnValueForAmiiboSettings +using ::NfpLaReturnValueForAmiiboSettings; +/// StartParamForAmiiboSettings +using ::NfpLaStartParamForAmiiboSettings; +/// Values for NfpLaStartParamForAmiiboSettings::type. +using ::NfpLaStartParamTypeForAmiiboSettings; +using ::NfpModelInfo; +using ::NfpMountTarget; +using ::NfpRegisterInfo; +using ::NfpRegisterInfoPrivate; +/// NfpServiceType +using ::NfpServiceType; +using ::NfpTagInfo; +/// Authentication +using ::NifmAuthentication; +/// ClientId +using ::NifmClientId; +/// DnsSetting +using ::NifmDnsSetting; +/// Encryption +using ::NifmEncryption; +using ::NifmInternetConnectionStatus; +using ::NifmInternetConnectionType; +/// IpAddressSetting +using ::NifmIpAddressSetting; +/// IpSettingData +using ::NifmIpSettingData; +/// IpV4Address +using ::NifmIpV4Address; +/// NetworkProfileBasicInfo. Converted from/to \ref NifmSfNetworkProfileBasicInfo. +using ::NifmNetworkProfileBasicInfo; +/// NetworkProfileData. Converted from/to \ref NifmSfNetworkProfileData. +using ::NifmNetworkProfileData; +using ::NifmNetworkProfileType; +/// ProxySetting +using ::NifmProxySetting; +/// Request +using ::NifmRequest; +using ::NifmRequestState; +using ::NifmServiceType; +/// SfNetworkProfileBasicInfo. Converted from/to \ref NifmNetworkProfileBasicInfo. +using ::NifmSfNetworkProfileBasicInfo; +/// SfNetworkProfileData. Converted to/from \ref NifmNetworkProfileData. +using ::NifmSfNetworkProfileData; +/// SfWirelessSettingData +using ::NifmSfWirelessSettingData; +/// WirelessSettingData +using ::NifmWirelessSettingData; +/// SystemUpdateTaskId +using ::NimSystemUpdateTaskId; +/// AlarmSetting +using ::NotifAlarmSetting; +/// Data extracted from NotifWeeklyScheduleAlarmSetting::settings. This uses local-time. +using ::NotifAlarmTime; +/// ServiceType for \ref notifInitialize. +using ::NotifServiceType; +/// WeeklyScheduleAlarmSetting +using ::NotifWeeklyScheduleAlarmSetting; +/// Custom asset header. +using ::NroAssetHeader; +/// Custom asset section. +using ::NroAssetSection; +/// This follows NroStart, the actual nro-header. +using ::NroHeader; +/// Entry for each segment in the codebin. +using ::NroSegment; +/// Offset 0x0 in the NRO. +using ::NroStart; +/// NsApplicationContentMetaStatus +using ::NsApplicationContentMetaStatus; +/// ApplicationControlData +using ::NsApplicationControlData; +/// ApplicationControlSource +using ::NsApplicationControlSource; +/// ApplicationDeliveryInfo +using ::NsApplicationDeliveryInfo; +/// ApplicationOccupiedSize +using ::NsApplicationOccupiedSize; +/// ApplicationRecord +using ::NsApplicationRecord; +/// NsApplicationRightsOnClient +using ::NsApplicationRightsOnClient; +/// ApplicationView +using ::NsApplicationView; +/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. +using ::NsApplicationViewDeprecated; +/// NsApplicationViewWithPromotionInfo +using ::NsApplicationViewWithPromotionInfo; +/// BackgroundNetworkUpdateState +using ::NsBackgroundNetworkUpdateState; +/// DownloadTaskStatus +using ::NsDownloadTaskStatus; +/// EulaDataPath +using ::NsEulaDataPath; +/// LatestSystemUpdate +using ::NsLatestSystemUpdate; +/// LaunchProperties +using ::NsLaunchProperties; +/// ProgressAsyncResult +using ::NsProgressAsyncResult; +/// ProgressForDeleteUserSaveDataAll +using ::NsProgressForDeleteUserSaveDataAll; +/// ProgressMonitorForDeleteUserSaveDataAll +using ::NsProgressMonitorForDeleteUserSaveDataAll; +/// NsPromotionInfo +using ::NsPromotionInfo; +/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsReceiveApplicationProgress; +/// RequestServerStopper +using ::NsRequestServerStopper; +/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsSendApplicationProgress; +/// ShellEvent +using ::NsShellEvent; +/// ShellEventInfo +using ::NsShellEventInfo; +/// SystemDeliveryInfo +using ::NsSystemDeliveryInfo; +/// SystemUpdateControl +using ::NsSystemUpdateControl; +/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. +using ::NsSystemUpdateProgress; +using ::NvAddressSpace; +using ::NvAllocSpaceFlags; +using ::NvChannel; +using ::NvChannelPriority; +using ::NvClassNumber; +using ::NvColorFormat; +using ::NvDisplayScanFormat; +using ::NvError; +using ::NvEventId; +using ::NvFence; +using ::NvGpuChannel; +using ::NvGraphicBuffer; +using ::nvioctl_clk_rate; +using ::nvioctl_cmdbuf; +using ::nvioctl_command_buffer_map; +using ::nvioctl_fence; +using ::nvioctl_gpfifo_entry; +using ::nvioctl_gpu_characteristics; +using ::nvioctl_gpu_time; +using ::nvioctl_reloc; +using ::nvioctl_reloc_shift; +using ::nvioctl_syncpt_incr; +using ::nvioctl_va_region; +using ::nvioctl_zbc_entry; +using ::nvioctl_zbc_slot_mask; +using ::nvioctl_zcull_info; +using ::NvKind; +using ::NvLayout; +using ::NvMap; +using ::NvMapBufferFlags; +using ::NvMapParam; +using ::NvMultiFence; +using ::NvNotification; +using ::NvNotificationType; +/// NvServiceType, for __nx_nv_service_type. +using ::NvServiceType; +using ::NvSurface; +using ::NvZcullConfig; +/// Native window structure. +using ::NWindow; +///OperationMode +using ::OmmOperationMode; +///OperationModePolicy +using ::OmmOperationModePolicy; +/// EnqueuePosition +using ::OvlnEnqueuePosition; +/// OverflowOption +using ::OvlnOverflowOption; +/// QueueAttribute +using ::OvlnQueueAttribute; +/// RawMessage +using ::OvlnRawMessage; +/// Receiver +using ::OvlnReceiver; +/// Sender +using ::OvlnSender; +/// SendOption +using ::OvlnSendOption; +/// SourceName +using ::OvlnSourceName; +/// Pad button repeater state object. +using ::PadRepeater; +/// Pad state object. +using ::PadState; +using ::Parcel; +using ::ParcelHeader; +/// PcmFormat +using ::PcmFormat; +/// Input arg storage for the applet. +using ::PctlAuthArg; +/// Type values for PctlAuthArg::type. +using ::PctlAuthType; +using ::PctlRestrictionSettings; +using ::PcvClockRatesListType; +using ::PcvModule; +/// Module id returned by [8.0.0+] pcv services +/// See also: https://switchbrew.org/wiki/PCV_services#Modules +using ::PcvModuleId; +/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed. +using ::PdmAccountEvent; +/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed. +using ::PdmAccountEventV10; +/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed. +using ::PdmAccountEventV3; +/// AccountPlayEvent. +/// This is the raw entry struct directly read from FS, without any entry filtering. This is separate from \ref PdmPlayEvent. +using ::PdmAccountPlayEvent; +/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1]. +using ::PdmAppletEvent; +/// AppletEventType +using ::PdmAppletEventType; +/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed. +/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00. +/// See \ref pdmPlayTimestampToPosix. +using ::PdmAppletEventV1; +/// ApplicationPlayStatistics +using ::PdmApplicationPlayStatistics; +/// LastPlayTime. +/// This contains data from the last time the application was played. +using ::PdmLastPlayTime; +/// PlayEvent. +/// This is the raw entry struct directly read from FS, without any entry filtering. +using ::PdmPlayEvent; +/// PlayEventType +using ::PdmPlayEventType; +/// PlayLogPolicy +using ::PdmPlayLogPolicy; +/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1]. +using ::PdmPlayStatistics; +/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed. +using ::PdmPlayStatisticsV1; +/// Memory permission bitmasks. +using ::Permission; +using ::PglEventObserver; +/// LaunchFlag +using ::PglLaunchFlag; +using ::PglProgramLaunchProperty; +/// SnapShotDumpType +using ::PglSnapShotDumpType; +/// Physical memory information structure. +using ::PhysicalMemoryInfo; +/// GetSystemInfo PhysicalMemory Sub IDs. +using ::PhysicalMemorySystemInfo; +/// FontData +using ::PlFontData; +using ::PlServiceType; +/// SharedFontType +using ::PlSharedFontType; +/// BootMode +using ::PmBootMode; +/// LaunchFlag +using ::PmLaunchFlag; +/// ProcessEvent +using ::PmProcessEvent; +/// ProcessEventInfo +using ::PmProcessEventInfo; +/// ResourceLimitValues +using ::PmResourceLimitValues; +using ::PrintConsole; +/// Process Activity. +using ::ProcessActivity; +/// Process exit reasons +using ::ProcessExitReason; +/// Process Information. +using ::ProcessInfoType; +/// Process States. +using ::ProcessState; +using ::PscPmModule; +using ::PscPmModuleId; +using ::PscPmState; +/// NintendoAccountStartupDialogType +using ::PselNintendoAccountStartupDialogType; +/// playerSelect UI modes. +using ::PselUiMode; +/// Return data sent after execution. +using ::PselUiReturnArg; +/// UI settings for versions starting with 0x10000. +using ::PselUiSettings; +/// Base UI settings for playerSelect. +using ::PselUiSettingsV1; +/// UI message text to display with ::PselUiMode_UserSelector. Invalid values are handled as ::PselUserSelectionPurpose_General. +using ::PselUserSelectionPurpose; +/// UserSelectionSettings +using ::PselUserSelectionSettings; +/// [2.0.0+] UserSelectionSettingsForSystemService +using ::PselUserSelectionSettingsForSystemService; +/// BatteryChargeInfoFields [17.0.0+] +using ::PsmBatteryChargeInfoFields; +/// BatteryChargeInfoFieldsOld [1.0.0-16.1.0] +using ::PsmBatteryChargeInfoFieldsOld; +/// BatteryVoltageState +using ::PsmBatteryVoltageState; +/// ChargerType +using ::PsmChargerType; +/// IPsmSession +using ::PsmSession; +/// Vdd50State +using ::PsmVdd50State; +/// Armv8 register group. @ref svcGetThreadContext3 uses @ref RegisterGroup_All. +using ::RegisterGroup; +///< Kernel object handle. +using ::Result; +/// Ring-Con state object. +using ::RingCon; +/// Whether the output data is valid. +using ::RingConDataValid; +using ::RingConErrorFlag; +/// Ring-Con firmware version. +using ::RingConFwVersion; +/// Ring-Con manufacturer calibration. +using ::RingConManuCal; +/// Polling data extracted from \ref HidbusJoyPollingReceivedData. +using ::RingConPollingData; +/// Ring-Con user calibration. +using ::RingConUserCal; +/// Recursive mutex datatype, defined in newlib. +using ::RMutex; +/// RomFS directory. +using ::romfs_dir; +/// RomFS file. +using ::romfs_file; +/// RomFS header. +using ::romfs_header; +using ::RsaKeyVersion; +/// Read/write lock structure. +using ::RwLock; +///< 64-bit signed integer. +using ::s128; +///< 8-bit signed integer. +using ::s16; +///< 16-bit signed integer. +using ::s32; +///< 32-bit signed integer. +using ::s64; +///< 128-bit unsigned integer. +using ::s8; +/// Secure monitor arguments. +using ::SecmonArgs; +/// Semaphore structure. +using ::Semaphore; +/// Service object structure +using ::Service; +using ::SessionMgr; +/// BatteryLot +using ::SetBatteryLot; +using ::SetCalAccelerometerOffset; +using ::SetCalAccelerometerScale; +using ::SetCalAmiiboEcdsaCertificate; +using ::SetCalAmiiboEcqvBlsCertificate; +using ::SetCalAmiiboEcqvBlsKey; +using ::SetCalAmiiboEcqvBlsRootCertificate; +using ::SetCalAmiiboEcqvCertificate; +using ::SetCalAmiiboKey; +using ::SetCalAnalogStickFactoryCalibration; +using ::SetCalAnalogStickModelParameter; +using ::SetCalBdAddress; +using ::SetCalConfigurationId1; +using ::SetCalConsoleSixAxisSensorHorizontalOffset; +using ::SetCalCountryCode; +using ::SetCalEccB233DeviceCertificate; +using ::SetCalEccB233DeviceKey; +using ::SetCalGameCardCertificate; +using ::SetCalGameCardKey; +using ::SetCalGyroscopeOffset; +using ::SetCalGyroscopeScale; +using ::SetCalMacAddress; +using ::SetCalRegionCode; +using ::SetCalRsa2048DeviceCertificate; +using ::SetCalRsa2048DeviceKey; +using ::SetCalSerialNumber; +using ::SetCalSpeakerParameter; +using ::SetCalSslCertificate; +using ::SetCalSslKey; +/// ChineseTraditionalInputMethod +using ::SetChineseTraditionalInputMethod; +/// KeyboardLayout +using ::SetKeyboardLayout; +/// IDs for Language. +using ::SetLanguage; +/// Region codes. +using ::SetRegion; +/// AccessPointSecurityStandard +using ::SetSysAccessPointSecurityStandard; +/// AccessPointSecurityType +using ::SetSysAccessPointSecurityType; +/// AccountNotificationSettings +using ::SetSysAccountNotificationSettings; +/// AccountOnlineStorageSettings +using ::SetSysAccountOnlineStorageSettings; +/// AccountSettings +using ::SetSysAccountSettings; +/// AllowedSslHosts +using ::SetSysAllowedSslHosts; +/// AnalogStickUserCalibration +using ::SetSysAnalogStickUserCalibration; +/// AudioDevice +using ::SetSysAudioDevice; +/// AudioOutputMode +using ::SetSysAudioOutputMode; +/// AudioOutputModeTarget +using ::SetSysAudioOutputModeTarget; +using ::SetSysAudioVolume; +/// AutoSettings +using ::SetSysAutoSettings; +/// BacklightSettings +using ::SetSysBacklightSettings; +/// BacklightSettingsEx +using ::SetSysBacklightSettingsEx; +/// BlePairingSettings +using ::SetSysBlePairingSettings; +/// BlockType +using ::SetSysBlockType; +/// BluetoothDevicesSettings +using ::SetSysBluetoothDevicesSettings; +/// ButtonConfigRegisteredSettings +using ::SetSysButtonConfigRegisteredSettings; +/// ButtonConfigSettings +using ::SetSysButtonConfigSettings; +/// Actually nn::util::Color4u8Type. +using ::SetSysColor4u8Type; +/// ConnectionFlag +using ::SetSysConnectionFlag; +/// ConsoleSixAxisSensorAccelerationBias +using ::SetSysConsoleSixAxisSensorAccelerationBias; +/// ConsoleSixAxisSensorAccelerationGain +using ::SetSysConsoleSixAxisSensorAccelerationGain; +/// ConsoleSixAxisSensorAngularAcceleration +using ::SetSysConsoleSixAxisSensorAngularAcceleration; +/// ConsoleSixAxisSensorAngularVelocityBias +using ::SetSysConsoleSixAxisSensorAngularVelocityBias; +/// ConsoleSixAxisSensorAngularVelocityGain +using ::SetSysConsoleSixAxisSensorAngularVelocityGain; +/// ConsoleSixAxisSensorAngularVelocityTimeBias +using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; +/// ConsoleSleepPlan +using ::SetSysConsoleSleepPlan; +/// ControllerType +using ::SetSysControllerType; +using ::SetSysDataBlock; +/// DataDeletionSettings +using ::SetSysDataDeletionSettings; +/// DeviceNickName +using ::SetSysDeviceNickName; +/// Edid +using ::SetSysEdid; +/// ErrorReportSharePermission +using ::SetSysErrorReportSharePermission; +/// EulaVersion +using ::SetSysEulaVersion; +/// EulaVersionClockType +using ::SetSysEulaVersionClockType; +using ::SetSysExtensionBlock; +/// Structure returned by \ref setsysGetFirmwareVersion. +using ::SetSysFirmwareVersion; +/// Structure returned by \ref setsysGetFirmwareVersionDigest. +using ::SetSysFirmwareVersionDigest; +/// FriendPresenceOverlayPermission +using ::SetSysFriendPresenceOverlayPermission; +/// HandheldSleepPlan +using ::SetSysHandheldSleepPlan; +/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. +using ::SetSysHomeMenuScheme; +/// HostFsMountPoint +using ::SetSysHostFsMountPoint; +/// InitialLaunchSettings +using ::SetSysInitialLaunchSettings; +/// LcdBacklightBrightnessMapping +using ::SetSysLcdBacklightBrightnessMapping; +using ::SetSysModeLine; +/// NetworkSettings +using ::SetSysNetworkSettings; +/// NotificationSettings +using ::SetSysNotificationSettings; +/// NotificationTime +using ::SetSysNotificationTime; +/// NotificationVolume +using ::SetSysNotificationVolume; +/// NxControllerLegacySettings +using ::SetSysNxControllerLegacySettings; +/// NxControllerSettings +using ::SetSysNxControllerSettings; +/// PlatformRegion. Other values not listed here should be handled as "Unknown". +using ::SetSysPlatformRegion; +/// PrimaryAlbumStorage +using ::SetSysPrimaryAlbumStorage; +/// Console Product Models +using ::SetSysProductModel; +/// ProxyFlags +using ::SetSysProxyFlags; +/// PtmCycleCountReliability +using ::SetSysPtmCycleCountReliability; +/// PtmFuelGaugeParameter +using ::SetSysPtmFuelGaugeParameter; +/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. +using ::SetSysRebootlessSystemUpdateVersion; +/// Structure returned by \ref setsysGetSerialNumber. +using ::SetSysSerialNumber; +/// ServiceDiscoveryControlSettings +using ::SetSysServiceDiscoveryControlSettings; +/// SleepSettings +using ::SetSysSleepSettings; +/// ThemeId +using ::SetSysThemeId; +/// ThemeSettings +using ::SetSysThemeSettings; +/// TouchScreenMode, for "Touch-Screen Sensitivity". +using ::SetSysTouchScreenMode; +/// TvSettings +using ::SetSysTvSettings; +/// UserSelectorFlag +using ::SetSysUserSelectorFlag; +/// UserSelectorSettings +using ::SetSysUserSelectorSettings; +using ::SfBuffer; +using ::SfBufferAttrs; +using ::SfDispatchParams; +using ::SfOutHandleAttr; +using ::SfOutHandleAttrs; +/// Context for SHA1 operations. +using ::Sha1Context; +/// Context for SHA256 operations. +using ::Sha256Context; +/// Shared memory information structure. +using ::SharedMemory; +/// SignalToAddress behaviors. +using ::SignalType; +/// Structure representing a service name (null terminated, remaining characters set to zero). +using ::SmServiceName; +#ifdef _SOCKLEN_T_DECLARED +using ::sockaddr; +#endif +/// Configuration structure for socketInitalize +using ::SocketInitConfig; +using ::SplConfigItem; +/// AlpnProtoState +using ::SslAlpnProtoState; +/// BuiltInCertificateInfo +using ::SslBuiltInCertificateInfo; +/// CaCertificateId +using ::SslCaCertificateId; +/// CertificateFormat +using ::SslCertificateFormat; +/// CipherInfo +using ::SslCipherInfo; +/// SslConnection +using ::SslConnection; +/// SslContext +using ::SslContext; +/// ContextOption +using ::SslContextOption; +/// DebugOptionType +using ::SslDebugOptionType; +/// FlushSessionCacheOptionType +using ::SslFlushSessionCacheOptionType; +/// InternalPki +using ::SslInternalPki; +/// IoMode. The default value at the time of \ref sslContextCreateConnection is ::SslIoMode_Blocking. +/// The socket non-blocking flag is always set regardless of this field, this is only used internally for calculating the timeout used by various cmds. +using ::SslIoMode; +/// KeyAndCertParams +using ::SslKeyAndCertParams; +/// OptionType. The default bool flags value for these at the time of \ref sslContextCreateConnection is cleared. +using ::SslOptionType; +/// PollEvent +using ::SslPollEvent; +/// PrivateOptionType +using ::SslPrivateOptionType; +/// RenegotiationMode +using ::SslRenegotiationMode; +/// SslServerCertDetailEntry +using ::SslServerCertDetailEntry; +/// SslServerCertDetailHeader +using ::SslServerCertDetailHeader; +/// Values for __nx_ssl_service_type, controls which ssl service to initialize. +using ::SslServiceType; +/// SessionCacheMode +using ::SslSessionCacheMode; +/// TrustedCertStatus +using ::SslTrustedCertStatus; +/// VerifyOption. The default bitmask value at the time of \ref sslContextCreateConnection is ::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName. +/// [5.0.0+] \ref sslConnectionSetVerifyOption: (::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName) must be set, unless: ::SslOptionType_SkipDefaultVerify is set, or [9.0.0+] ::SslDebugOptionType_AllowDisableVerifyOption is set. +/// [6.0.0+] \ref sslConnectionSetVerifyOption: Following that, if ::SslVerifyOption_EvPolicyOid is set, then the following options must be set (besides the previously mentioned one): ::SslVerifyOption_PeerCa and ::SslVerifyOption_DateCheck. +using ::SslVerifyOption; +/// SslVersion. This is a bitmask which controls the min/max TLS versions to use, depending on which lowest/highest bits are set (if Auto* isn't set). +using ::SslVersion; +using ::SwkbdAppearArg; +/// Base swkbd arg struct. +using ::SwkbdArgCommon; +using ::SwkbdArgV0; +/// Arg struct for version 0x30007+. +using ::SwkbdArgV7; +/// Arg struct for version 0x6000B+. +using ::SwkbdArgVB; +/// Struct data for SwkbdInline Interactive reply storage ChangedString*, at the end following the string. +using ::SwkbdChangedStringArg; +/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString* replies (text changed by the user or by \ref swkbdInlineSetInputText). +/// str is the UTF-8 string for the current text. +using ::SwkbdChangedStringCb; +/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString*V2 replies (text changed by the user or by \ref swkbdInlineSetInputText). +/// str is the UTF-8 string for the current text. +using ::SwkbdChangedStringV2Cb; +using ::SwkbdConfig; +using ::SwkbdCustomizedDictionarySet; +/// Input data for SwkbdInline request SetCustomizeDic. +using ::SwkbdCustomizeDicInfo; +/// Struct data for SwkbdInline Interactive reply storage DecidedEnter*, at the end following the string. +using ::SwkbdDecidedEnterArg; +/// This callback is used by \ref swkbdInlineUpdate when handling DecidedEnter* replies (when the final text was submitted via the button). +/// str is the UTF-8 string for the current text. +using ::SwkbdDecidedEnterCb; +/// User dictionary word. +using ::SwkbdDictWord; +/// InitializeArg for SwkbdInline. +using ::SwkbdInitializeArg; +/// InlineKeyboard +using ::SwkbdInline; +using ::SwkbdInlineCalcArg; +/// Value for \ref SwkbdInitializeArg mode. Controls the LibAppletMode when launching the applet. +using ::SwkbdInlineMode; +/// Struct data for SwkbdInline Interactive reply storage MovedCursor*, at the end following the string. +using ::SwkbdMovedCursorArg; +/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor* replies. +/// str is the UTF-8 string for the current text. +using ::SwkbdMovedCursorCb; +/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor*V2 replies. +/// str is the UTF-8 string for the current text. +using ::SwkbdMovedCursorV2Cb; +/// Struct data for SwkbdInline Interactive reply storage MovedTab*, at the end following the string. +using ::SwkbdMovedTabArg; +/// This callback is used by \ref swkbdInlineUpdate when handling MovedTab* replies. +/// str is the UTF-8 string for the current text. +using ::SwkbdMovedTabCb; +/// Rect +using ::SwkbdRect; +/// SwkbdInline Interactive output storage reply ID. +using ::SwkbdReplyType; +/// SwkbdInline Interactive input storage request ID. +using ::SwkbdRequestCommand; +/// SwkbdInline State +using ::SwkbdState; +/// TextCheck callback set by \ref swkbdConfigSetTextCheckCallback, for validating the input string when the swkbd ok-button is pressed. This buffer contains an UTF-8 string. This callback should validate the input string, then return a \ref SwkbdTextCheckResult indicating success/failure. On failure, this function must write an error message to the tmp_string buffer, which will then be displayed by swkbd. +using ::SwkbdTextCheckCb; +/// Output result returned by \ref SwkbdTextCheckCb. +using ::SwkbdTextCheckResult; +/// Value for SwkbdArgCommon::textDrawType. Only applies when stringLenMax is 1..32, otherwise swkbd will only use SwkbdTextDrawType_Box. +using ::SwkbdTextDrawType; +/// Type of keyboard. +using ::SwkbdType; +/// GetSystemInfo IDs. +using ::SystemInfoType; +/// Thread information structure. +using ::Thread; +/// Thread Activity. +using ::ThreadActivity; +/// Thread context structure (register dump) +using ::ThreadContext; +/// This is for \ref ThreadExceptionDump error_desc. +using ::ThreadExceptionDesc; +/// Thread exception dump structure. +using ::ThreadExceptionDump; +using ::ThreadExceptionFrameA32; +using ::ThreadExceptionFrameA64; +/// Thread exit reasons +using ::ThreadExitReason; +///< Function error code result type. +using ::ThreadFunc; +/// GetInfo Idle/Thread Tick Count Sub IDs. +using ::TickCountInfo; +using ::TimeCalendarAdditionalInfo; +using ::TimeCalendarTime; +using ::TimeLocationName; +/// Valid types for a user-mode timer. +using ::TimerType; +/// Values for __nx_time_service_type. +using ::TimeServiceType; +using ::TimeStandardSteadyClockTimePointType; +using ::TimeSteadyClockTimePoint; +using ::TimeSystemClockContext; +/// Time clock type. +using ::TimeType; +using ::TimeZoneRule; +using ::TipcCommandType; +using ::TipcDispatchParams; +using ::TipcRequestFormat; +/// tipc Service object structure +using ::TipcService; +/// Transfer memory information structure. +using ::TransferMemory; +using ::TsDeviceCode; +/// Location +using ::TsLocation; +using ::TsSession; +///< 64-bit unsigned integer. +using ::u128; +///< 8-bit unsigned integer. +using ::u16; +///< 16-bit unsigned integer. +using ::u32; +///< 32-bit unsigned integer. +using ::u64; +using ::u8; +/// FlowControlMode +using ::UartFlowControlMode; +/// UartPort +using ::UartPort; +/// PortEventType +using ::UartPortEventType; +/// UartPortForDev +using ::UartPortForDev; +/// PortSession +using ::UartPortSession; +using ::UEvent; +/// Imported from libusb, with changed names. +using ::usb_class_code; +/// Imported from libusb, with some adjustments. +using ::usb_config_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_control_setup; +/// Imported from libusb, with changed names. +using ::usb_descriptor_type; +/// Imported from libusb, with some adjustments. +using ::usb_device_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_endpoint_descriptor; +/// Imported from libusb, with changed names. +using ::usb_endpoint_direction; +/// Imported from libusb, with some adjustments. +using ::usb_hid_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_interface_association_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_interface_descriptor; +/// Imported from libusb, with changed names. +using ::usb_iso_sync_type; +/// Imported from libusb, with changed names. +using ::usb_iso_usage_type; +/// Imported from libusb, with changed names. +using ::usb_request_recipient; +/// Imported from libusb, with changed names. +using ::usb_request_type; +/// Imported from libusb, with some adjustments. +using ::usb_ss_endpoint_companion_descriptor; +/// Imported from libusb, with changed names. +using ::usb_standard_request; +/// Imported from libusb, with some adjustments. +using ::usb_string_descriptor; +/// Imported from libusb, with changed names. +using ::usb_transfer_type; +using ::UsbCommsInterfaceInfo; +using ::UsbComplexId; +using ::UsbDeviceSpeed; +using ::UsbDsDeviceInfo; +using ::UsbDsEndpoint; +using ::UsbDsInterface; +using ::UsbDsReportData; +using ::UsbDsReportEntry; +using ::UsbHsClientEpSession; +/// The interface service object. These Events have autoclear=false. +using ::UsbHsClientIfSession; +/// Interface struct. Note that devices have a seperate \ref UsbHsInterface for each interface. +using ::UsbHsInterface; +/// Interface filtering struct. When the associated flag bit is set, the associated descriptor field and struct field are compared, on mismatch the interface is filtered out. +/// [7.0.0+]: The filter struct has to be unique, it can't be used by anything else (including other processes). Hence, Flags has to be non-zero. When initialized with usb:hs:a and VID and/or PID filtering is enabled, the VID/PID will be checked against a blacklist. +using ::UsbHsInterfaceFilter; +using ::UsbHsInterfaceFilterFlags; +/// Descriptors which are not available are set to all-zero. +/// The INPUT/OUTPUT endpoint descriptors were swapped with [8.0.0+], libnx converts this struct to the newer layout when running on pre-8.0.0. +using ::UsbHsInterfaceInfo; +using ::UsbHsRingHeader; +using ::UsbHsXferReport; +/// USB Device States, per USB 2.0 spec +using ::UsbState; +///< Unique identifier. +using ::UtilFloat3; +using ::UTimer; +///< Function without arguments nor return value. +using ::Uuid; +/// Used as argument for certain drawing commands. +using ::ViColorRgba4444; +using ::ViColorRgba8888; +using ::ViDisplay; +using ::ViDisplayName; +using ::ViLayer; +/// Used by viCreateLayer when CreateStrayLayer is used internally. +using ::ViLayerFlags; +/// Used as argument to many capture functions. +using ::ViLayerStack; +/// Used with viSetDisplayPowerState. +using ::ViPowerState; +/// Address space reservation type (see \ref virtmemAddReservation) +using ::VirtmemReservation; +/// Used with viSetLayerScalingMode. +using ::ViScalingMode; +using ::ViServiceType; +///< Thread entrypoint function. +using ::VoidFn; +///< 64-bit volatile signed integer. +using ::vs128; +///< 8-bit volatile signed integer. +using ::vs16; +///< 16-bit volatile signed integer. +using ::vs32; +///< 32-bit volatile signed integer. +using ::vs64; +///< 128-bit volatile unsigned integer. +using ::vs8; +///< 64-bit volatile unsigned integer. +using ::vu128; +///< 8-bit volatile unsigned integer. +using ::vu16; +///< 16-bit volatile unsigned integer. +using ::vu32; +///< 32-bit volatile unsigned integer. +using ::vu64; +///< 128-bit unsigned integer. +using ::vu8; +using ::Waitable; +using ::WaitableMethods; +using ::WaitableNode; +/// Waiter structure, representing any generic waitable synchronization object; both kernel-mode and user-mode. +using ::Waiter; +using ::WaiterType; +/// Header struct at offset 0 in the web Arg storage (non-webWifi). +using ::WebArgHeader; +/// Web TLV used in the web Arg storage. +using ::WebArgTLV; +/// Types for \ref WebArgTLV, input storage. +using ::WebArgType; +/// Kind values for \ref webConfigSetBackgroundKind. Controls the background color while displaying the loading screen during applet boot. Only used when \ref WebBootDisplayKind is ::WebBootDisplayKind_Default. If the applet was not launched by an Application, the applet will only use WebBackgroundKind_Default. +using ::WebBackgroundKind; +/// Kind values for \ref webConfigSetBootDisplayKind. Controls the background color while displaying the loading screen during applet boot. Also controls the BackgroundKind when value is non-zero. +using ::WebBootDisplayKind; +/// Entry data for ::WebArgType_BootFooterButton. +using ::WebBootFooterButtonEntry; +/// Config struct for web applets, non-WebWifi. +using ::WebCommonConfig; +/// Common container struct for applets' reply data, from the output storage. +using ::WebCommonReply; +/// Common struct for the applet output storage, for non-TLV-storage. +using ::WebCommonReturnValue; +/// TLV storage, starts with \ref WebArgHeader followed by \ref WebArgTLV entries. +using ::WebCommonTLVStorage; +/// This controls the kind of content to mount with Offline-applet. +using ::WebDocumentKind; +/// ExitReason +using ::WebExitReason; +/// Button values for \ref webConfigSetBootFooterButtonVisible. +using ::WebFooterButtonId; +/// Kind values for \ref webConfigSetFooterFixedKind. Controls UI footer display behaviour. +using ::WebFooterFixedKind; +/// Mode values for \ref webConfigSetLeftStickMode. Controls the initial mode, this can be toggled by the user via the pressing the left-stick button. If the Pointer flag is set to false (\ref webConfigSetPointer), only ::WebLeftStickMode_Cursor will be used and mode toggle by the user is disabled (input value ignored). +using ::WebLeftStickMode; +/// Types for \ref WebArgTLV, output storage. +using ::WebReplyType; +/// WebSession +using ::WebSession; +/// WebSessionBootMode +using ::WebSessionBootMode; +/// SessionMessageHeader +using ::WebSessionMessageHeader; +/// WebSessionReceiveMessageKind +using ::WebSessionReceiveMessageKind; +/// WebSessionSendMessageKind +using ::WebSessionSendMessageKind; +/// StorageHandleQueue +using ::WebSessionStorageHandleQueue; +/// This controls the initial page for ShareApplet, used by \ref webShareCreate. +using ::WebShareStartPage; +/// This indicates the type of web-applet. +using ::WebShimKind; +/// Config for WebWifi. +using ::WebWifiConfig; +/// Struct for the WebWifi applet input storage. +using ::WebWifiPageArg; +/// Struct for the WebWifi applet output storage. +using ::WebWifiReturnValue; +/// WLAN State. +using ::WlanInfState; +/// XcdDeviceHandle +using ::XcdDeviceHandle; +/// XcdInterfaceType +using ::XcdInterfaceType; +/// SleepThread yield types. +using ::YieldType; + +/// Address of the host connected through nxlink +using ::__nxlink_host; + +/// @brief C++ wrappers for the `account` API. +/// @details Wraps: switch/services/acc.h. +namespace account { + +/// NetworkServiceAccountId +using ::AccountNetworkServiceAccountId; +/// Profile +using ::AccountProfile; +/// ProfileBase +using ::AccountProfileBase; +using ::AccountServiceType; +/// Account UserId. +using ::AccountUid; +/// UserData +using ::AccountUserData; + +/// Initialize account. +Result Initialize(AccountServiceType service_type); + +/// Exit account. +void Exit(void); + +/// Gets the Service object for the actual account service session. +Service* GetServiceSession(void); + +/// Get the total number of user profiles. +Result GetUserCount(s32* user_count); + +/** + * @brief Get a list of all userIds. The returned list will never be larger than ACC_USER_LIST_SIZE. + * @param uids Pointer to array of userIds. + * @param max_uids Maximum number of userIds to return. + * @param actual_total The actual total number of userIds found. + */ +Result ListAllUsers(AccountUid* uids, s32 max_uids, s32 *actual_total); + +/// Get the userId for the last opened user. +Result GetLastOpenedUser(AccountUid *uid); + +/// Get an AccountProfile for the specified userId. +Result GetProfile(AccountProfile* out, AccountUid uid); + +/// IsUserRegistrationRequestPermitted +Result IsUserRegistrationRequestPermitted(bool *out); + +/// TrySelectUserWithoutInteraction +Result TrySelectUserWithoutInteraction(AccountUid *uid, bool is_network_service_account_required); + +/// Close the AccountProfile. +void ProfileClose(AccountProfile* profile); + +/// Get \ref AccountUserData and \ref AccountProfileBase for the specified profile, userdata is optional (can be NULL). +Result ProfileGet(AccountProfile* profile, AccountUserData* userdata, AccountProfileBase* profilebase); + +/// Get the icon image size. +Result ProfileGetImageSize(AccountProfile* profile, u32* image_size); + +/// Load the JPEG profile icon, valid for both Miis and character icons. The output image_size is the same as the one from \ref accountProfileGetImageSize. +Result ProfileLoadImage(AccountProfile* profile, void* buf, size_t len, u32* image_size); + +/// Gets the userId which was selected by the profile-selector applet (if any), prior to launching the currently running Application. +/// This gets the cached PreselectedUser loaded during accountInitialize, when PreselectedUser is available. +Result GetPreselectedUser(AccountUid *uid); + +/** + * @brief Checks whether the specified \ref AccountUid is valid/set (non-zero). + * @param[in] Uid \ref AccountUid + */ +bool UidIsValid(const AccountUid *Uid); + +} // namespace account + +/// @brief C++ wrappers for the `aes128` API. +/// @details Wraps: switch/crypto/aes.h, switch/crypto/aes_cbc.h, switch/crypto/aes_ctr.h, switch/crypto/aes_xts.h. +namespace aes128 { + +/// Context for AES-128 CBC. +using ::Aes128CbcContext; +/// Context for AES-128 operations. +using ::Aes128Context; +/// Context for AES-128 CTR. +using ::Aes128CtrContext; +/// Context for AES-128 XTS. +using ::Aes128XtsContext; +/// Context for AES-192 CBC. +using ::Aes192CbcContext; +/// Context for AES-192 operations. +using ::Aes192Context; +/// Context for AES-192 CTR. +using ::Aes192CtrContext; +/// Context for AES-192 XTS. +using ::Aes192XtsContext; +/// Context for AES-256 CBC. +using ::Aes256CbcContext; +/// Context for AES-256 operations. +using ::Aes256Context; +/// Context for AES-256 CTR. +using ::Aes256CtrContext; +/// Context for AES-256 XTS. +using ::Aes256XtsContext; + +/// Initialize a 128-bit AES context. +void ContextCreate(Aes128Context *out, const void *key, bool is_encryptor); + +/// Encrypt using an AES context (Requires is_encryptor when initializing) +void EncryptBlock(const Aes128Context *ctx, void *dst, const void *src); + +/// Decrypt using an AES context (Requires !is_encryptor when initializing) +void DecryptBlock(const Aes128Context *ctx, void *dst, const void *src); + +/// 128-bit CBC API. +void CbcContextCreate(Aes128CbcContext *out, const void *key, const void *iv, bool is_encryptor); + +void CbcContextResetIv(Aes128CbcContext *ctx, const void *iv); + +size_t CbcEncrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size); + +size_t CbcDecrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size); + +/// 128-bit CTR API. +void CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr); + +void CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr); + +void CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t size); + +/// 128-bit XTS API. +void XtsContextCreate(Aes128XtsContext *out, const void *key0, const void *key1, bool is_encryptor); + +void XtsContextResetTweak(Aes128XtsContext *ctx, const void *tweak); + +void XtsContextResetSector(Aes128XtsContext *ctx, uint64_t sector, bool is_nintendo); + +size_t XtsEncrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size); + +size_t XtsDecrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size); + +} // namespace aes128 + +/// @brief C++ wrappers for the `aes192` API. +/// @details Wraps: switch/crypto/aes.h, switch/crypto/aes_cbc.h, switch/crypto/aes_ctr.h, switch/crypto/aes_xts.h. +namespace aes192 { + +/// Context for AES-128 CBC. +using ::Aes128CbcContext; +/// Context for AES-128 operations. +using ::Aes128Context; +/// Context for AES-128 CTR. +using ::Aes128CtrContext; +/// Context for AES-128 XTS. +using ::Aes128XtsContext; +/// Context for AES-192 CBC. +using ::Aes192CbcContext; +/// Context for AES-192 operations. +using ::Aes192Context; +/// Context for AES-192 CTR. +using ::Aes192CtrContext; +/// Context for AES-192 XTS. +using ::Aes192XtsContext; +/// Context for AES-256 CBC. +using ::Aes256CbcContext; +/// Context for AES-256 operations. +using ::Aes256Context; +/// Context for AES-256 CTR. +using ::Aes256CtrContext; +/// Context for AES-256 XTS. +using ::Aes256XtsContext; + +/// Initialize a 192-bit AES context. +void ContextCreate(Aes192Context *out, const void *key, bool is_encryptor); + +/// Encrypt using an AES context (Requires is_encryptor when initializing) +void EncryptBlock(const Aes192Context *ctx, void *dst, const void *src); + +/// Decrypt using an AES context (Requires !is_encryptor when initializing) +void DecryptBlock(const Aes192Context *ctx, void *dst, const void *src); + +/// 192-bit CBC API. +void CbcContextCreate(Aes192CbcContext *out, const void *key, const void *iv, bool is_encryptor); + +void CbcContextResetIv(Aes192CbcContext *ctx, const void *iv); + +size_t CbcEncrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size); + +size_t CbcDecrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size); + +/// 192-bit CTR API. +void CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr); + +void CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr); + +void CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t size); + +/// 192-bit XTS API. +void XtsContextCreate(Aes192XtsContext *out, const void *key0, const void *key1, bool is_encryptor); + +void XtsContextResetTweak(Aes192XtsContext *ctx, const void *tweak); + +void XtsContextResetSector(Aes192XtsContext *ctx, uint64_t sector, bool is_nintendo); + +size_t XtsEncrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size); + +size_t XtsDecrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size); + +} // namespace aes192 + +/// @brief C++ wrappers for the `aes256` API. +/// @details Wraps: switch/crypto/aes.h, switch/crypto/aes_cbc.h, switch/crypto/aes_ctr.h, switch/crypto/aes_xts.h. +namespace aes256 { + +/// Context for AES-128 CBC. +using ::Aes128CbcContext; +/// Context for AES-128 operations. +using ::Aes128Context; +/// Context for AES-128 CTR. +using ::Aes128CtrContext; +/// Context for AES-128 XTS. +using ::Aes128XtsContext; +/// Context for AES-192 CBC. +using ::Aes192CbcContext; +/// Context for AES-192 operations. +using ::Aes192Context; +/// Context for AES-192 CTR. +using ::Aes192CtrContext; +/// Context for AES-192 XTS. +using ::Aes192XtsContext; +/// Context for AES-256 CBC. +using ::Aes256CbcContext; +/// Context for AES-256 operations. +using ::Aes256Context; +/// Context for AES-256 CTR. +using ::Aes256CtrContext; +/// Context for AES-256 XTS. +using ::Aes256XtsContext; + +/// Initialize a 256-bit AES context. +void ContextCreate(Aes256Context *out, const void *key, bool is_encryptor); + +/// Encrypt using an AES context (Requires is_encryptor when initializing) +void EncryptBlock(const Aes256Context *ctx, void *dst, const void *src); + +/// Decrypt using an AES context (Requires !is_encryptor when initializing) +void DecryptBlock(const Aes256Context *ctx, void *dst, const void *src); + +/// 256-bit CBC API. +void CbcContextCreate(Aes256CbcContext *out, const void *key, const void *iv, bool is_encryptor); + +void CbcContextResetIv(Aes256CbcContext *ctx, const void *iv); + +size_t CbcEncrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size); + +size_t CbcDecrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size); + +/// 256-bit CTR API. +void CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr); + +void CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr); + +void CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size); + +/// 256-bit XTS API. +void XtsContextCreate(Aes256XtsContext *out, const void *key0, const void *key1, bool is_encryptor); + +void XtsContextResetTweak(Aes256XtsContext *ctx, const void *tweak); + +void XtsContextResetSector(Aes256XtsContext *ctx, uint64_t sector, bool is_nintendo); + +size_t XtsEncrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size); + +size_t XtsDecrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size); + +} // namespace aes256 + +/// @brief C++ wrappers for the `album` API. +/// @details Wraps: switch/applets/album_la.h. +namespace album { + +/// Arg type values pushed for the applet input storage, stored as an u8. +using ::AlbumLaArg; + +/** + * @brief Launches the applet with ::AlbumLaArg_ShowAlbumFiles and playStartupSound=false. + */ +Result LaShowAlbumFiles(void); + +/** + * @brief Launches the applet with ::AlbumLaArg_ShowAllAlbumFiles and playStartupSound=false. + */ +Result LaShowAllAlbumFiles(void); + +/** + * @brief Launches the applet with ::AlbumLaArg_ShowAllAlbumFilesForHomeMenu and playStartupSound=true. + */ +Result LaShowAllAlbumFilesForHomeMenu(void); + +} // namespace album + +/// @brief C++ wrappers for the `apm` API. +/// @details Wraps: switch/services/apm.h. +namespace apm { + +/// CpuBoostMode. With \ref appletSetCpuBoostMode, only values 0/1 are available. This allows using higher clock rates. +using ::ApmCpuBoostMode; +/// PerformanceMode +using ::ApmPerformanceMode; + +/// Initialize apm. Used automatically by \ref appletInitialize with AppletType_Application. +Result Initialize(void); + +/// Exit apm. Used automatically by \ref appletExit with AppletType_Application. +void Exit(void); + +/// Gets the Service object for the actual apm service session. +Service* GetServiceSession(void); + +/// Gets the Service object for ISession. +Service* GetServiceSession_Session(void); + +/** + * @brief Gets the current ApmPerformanceMode. + * @param[out] out_performanceMode ApmPerformanceMode + */ +Result GetPerformanceMode(ApmPerformanceMode* out_performanceMode); + +/** + * @brief Sets the PerformanceConfiguration for the specified PerformanceMode. + * @param[in] PerformanceMode \ref ApmPerformanceMode + * @param[in] PerformanceConfiguration PerformanceConfiguration + */ +Result SetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 PerformanceConfiguration); + +/** + * @brief Gets the PerformanceConfiguration for the specified PerformanceMode. + * @param[in] PerformanceMode \ref ApmPerformanceMode + * @param[out] PerformanceConfiguration PerformanceConfiguration + */ +Result GetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 *PerformanceConfiguration); + +} // namespace apm + +/// @brief C++ wrappers for the `applet` API. +/// @details Wraps: switch/services/applet.h. +namespace applet { + +/// IApplicationAccessor container. +using ::AppletApplication; +/// ApplicationAttribute +using ::AppletApplicationAttribute; +/// Attributes for launching applications for Quest. +using ::AppletApplicationAttributeForQuest; +/// AppletApplicationExitReason +using ::AppletApplicationExitReason; +/// ApplicationLaunchProperty +using ::AppletApplicationLaunchProperty; +/// ApplicationLaunchRequestInfo +using ::AppletApplicationLaunchRequestInfo; +/// Used by \ref appletInitialize with __nx_applet_AppletAttribute for cmd OpenLibraryAppletProxy (AppletType_LibraryApplet), on [3.0.0+]. The default for this struct is all-zero. +using ::AppletAttribute; +/// CaptureSharedBuffer for the IDisplayController commands. +using ::AppletCaptureSharedBuffer; +/// FocusHandlingMode +using ::AppletFocusHandlingMode; +/// FocusState +using ::AppletFocusState; +/// GpuErrorHandler +using ::AppletGpuErrorHandler; +/// LibraryApplet state. +using ::AppletHolder; +/// applet hook cookie. +using ::AppletHookCookie; +/// applet hook function. +using ::AppletHookFn; +/// applet hook types. +using ::AppletHookType; +/// AppletId +using ::AppletId; +/// IdentityInfo +using ::AppletIdentityInfo; +/// Extension values for \ref appletSetIdleTimeDetectionExtension / \ref appletGetIdleTimeDetectionExtension, for extending user inactivity detection. +using ::AppletIdleTimeDetectionExtension; +/// Cached info for the current LibraryApplet, from \ref appletGetAppletInfo. +using ::AppletInfo; +/// Input policy values for \ref appletSetInputDetectionPolicy. +using ::AppletInputDetectionPolicy; +/// LaunchParameterKind +using ::AppletLaunchParameterKind; +/// LockAccessor +using ::AppletLockAccessor; +/// AppletMessage, for \ref appletGetMessage. See also \ref AppletHookType. +using ::AppletMessage; +/// OperationMode +using ::AppletOperationMode; +/// AppletProcessLaunchReason, from GetLaunchReason. +using ::AppletProcessLaunchReason; +/// ProgramSpecifyKind for the ExecuteProgram cmd. Controls the type of the u64 passed to the ExecuteProgram cmd. +using ::AppletProgramSpecifyKind; +/// AppletResourceUsageInfo, from \ref appletGetAppletResourceUsageInfo. +using ::AppletResourceUsageInfo; +/// Permission values for \ref appletSetScreenShotPermission. +using ::AppletScreenShotPermission; +/// applet IStorage +using ::AppletStorage; +/// Type values for \ref appletPerformSystemButtonPressingIfInFocus. +using ::AppletSystemButtonType; +/// ThemeColorType +using ::AppletThemeColorType; +/// Mode values for \ref appletSetTvPowerStateMatchingMode. +using ::AppletTvPowerStateMatchingMode; +/// AppletType +using ::AppletType; +/// WindowOriginMode +using ::AppletWindowOriginMode; +/// Input mode values for \ref appletSetWirelessPriorityMode. +using ::AppletWirelessPriorityMode; +/// LibraryAppletExitReason +using ::LibAppletExitReason; +/// LibraryAppletInfo +using ::LibAppletInfo; +/// LibraryAppletMode +using ::LibAppletMode; + +/// Initialize applet, called automatically during app startup. +Result Initialize(void); + +/// Exit applet, called automatically during app exit. +void Exit(void); + +/// Gets the Service object for the actual "appletOE"/"appletAE" service session. +Service* GetServiceSession_Proxy(void); + +/// Gets the Service object for IAppletCommonFunctions. Only initialized with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+]. +Service* GetServiceSession_AppletCommonFunctions(void); + +/// Gets the Service object for I*Functions, specific to each AppletType (IApplicationFunctions for AppletType_*Application). Not initialized with AppletType_LibraryApplet pre-15.0.0. On [15.0.0+] with AppletType_LibraryApplet this returns the object for IHomeMenuFunctions. +Service* GetServiceSession_Functions(void); + +/// Gets the Service object for IGlobalStateController. Only initialized with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. +Service* GetServiceSession_GlobalStateController(void); + +/// Gets the Service object for IApplicationCreator. Only initialized with AppletType_SystemApplet. +Service* GetServiceSession_ApplicationCreator(void); + +/// Gets the Service object for ILibraryAppletSelfAccessor. Only initialized with AppletType_LibraryApplet. +Service* GetServiceSession_LibraryAppletSelfAccessor(void); + +/// Gets the Service object for IProcessWindingController. Only initialized with AppletType_LibraryApplet. +Service* GetServiceSession_ProcessWindingController(void); + +/// Gets the Service object for ILibraryAppletCreator. +Service* GetServiceSession_LibraryAppletCreator(void); + +/// Gets the Service object for ICommonStateGetter. +Service* GetServiceSession_CommonStateGetter(void); + +/// Gets the Service object for ISelfController. +Service* GetServiceSession_SelfController(void); + +/// Gets the Service object for IWindowController. +Service* GetServiceSession_WindowController(void); + +/// Gets the Service object for IAudioController. +Service* GetServiceSession_AudioController(void); + +/// Gets the Service object for IDisplayController. +Service* GetServiceSession_DisplayController(void); + +/// Gets the Service object for IDebugFunctions. +Service* GetServiceSession_DebugFunctions(void); + +/// Get the cached AppletResourceUserId. +u64 GetAppletResourceUserId(void); + +/// Get the \ref AppletType. +AppletType GetAppletType(void); + +/// Sets the state field for \ref AppletThemeColorType. +void SetThemeColorType(AppletThemeColorType theme); + +/// Gets the state field for \ref AppletThemeColorType. Used internally by \ref libappletArgsCreate. +AppletThemeColorType GetThemeColorType(void); + +/** + * @brief Gets the CradleStatus. + * @param[out] status Output Dock status. + */ +Result GetCradleStatus(u8 *status); + +/** + * @brief Gets the BootMode which originated from \ref pmbmGetBootMode. + * @param[out] mode \ref PmBootMode + */ +Result GetBootMode(PmBootMode *mode); + +/** + * @brief Request to AcquireSleepLock. + * @note On success, this then uses cmd GetAcquiredSleepLockEvent and waits on that event. + */ +Result RequestToAcquireSleepLock(void); + +/** + * @brief Release the SleepLock. + */ +Result ReleaseSleepLock(void); + +/** + * @brief Release the SleepLock transiently. + * @note On success, this then uses cmd GetAcquiredSleepLockEvent and waits on that event. + */ +Result ReleaseSleepLockTransiently(void); + +/** + * @brief GetWakeupCount + * @note Only available with [11.0.0+]. + * @param[out] out Output value. + */ +Result GetWakeupCount(u64 *out); + +/** + * @brief Pushes a storage to the general channel. Used for sending requests to SystemApplet. + * @note This is not usable under an Application, however it is usable under a LibraryApplet. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result PushToGeneralChannel(AppletStorage *s); + +/** + * @brief Gets a \ref AppletLockAccessor for HomeButtonReader. + * @note Similar to using \ref appletGetReaderLockAccessorEx with inval=0. + * @param a LockAccessor object. + */ +Result GetHomeButtonReaderLockAccessor(AppletLockAccessor *a); + +/** + * @brief Gets a Reader \ref AppletLockAccessor. + * @note Only available with [2.0.0+]. + * @param a LockAccessor object. + * @param[in] inval Input value, must be 0-3. 0 = HomeButton. + */ +Result GetReaderLockAccessorEx(AppletLockAccessor *a, u32 inval); + +/** + * @brief Gets a Writer \ref AppletLockAccessor. + * @note Only available with [7.0.0+]. On older sysvers, this is only available with AppletType_SystemApplet on [2.0.0+]. + * @param a LockAccessor object. + * @param[in] inval Input value, must be 0-3. 0 = HomeButton. + */ +Result GetWriterLockAccessorEx(AppletLockAccessor *a, u32 inval); + +/** + * @brief Gets the Dock firmware version. + * @note Only available with [2.0.0+]. + * @param[out] out0 First output value. + * @param[out] out1 Second output value. + * @param[out] out2 Third output value. + * @param[out] out3 Fourth output value. + */ +Result GetCradleFwVersion(u32 *out0, u32 *out1, u32 *out2, u32 *out3); + +/** + * @brief Gets whether VrMode is enabled. + * @note Only available with [3.0.0+]. + * @param out Output flag + */ +Result IsVrModeEnabled(bool *out); + +/** + * @brief Sets whether VrMode is enabled. + * @note This is only fully usable system-side with [6.0.0+]. + * @note For checking Parental Controls, see \ref pctlIsStereoVisionPermitted. + * @note On pre-7.0.0 this uses cmd SetVrModeEnabled internally, while on [7.0.0+] this uses cmds BeginVrModeEx/EndVrModeEx. + * @param flag Flag + */ +Result SetVrModeEnabled(bool flag); + +/** + * @brief Sets whether the LCD screen backlight is turned off. + * @note Only available with [4.0.0+]. + * @param[in] flag Flag + */ +Result SetLcdBacklightOffEnabled(bool flag); + +/** + * @brief Gets the ControllerFirmwareUpdateSection flag. + * @note Only available with [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsInControllerFirmwareUpdateSection(bool *out); + +/** + * @brief SetVrPositionForDebug + * @note The cached value loaded from \ref setsysGetDebugModeFlag must be 1, otherwise an error is returned. + * @note Only available with [11.0.0+]. + * @param[in] x X, must not be negative. x+width must be <=1280. + * @param[in] y Y, must not be negative. y+height must be <=720. + * @param[in] width Width, must be 1-1280. + * @param[in] height Height, must be 1-720. + */ +Result SetVrPositionForDebug(s32 x, s32 y, s32 width, s32 height); + +/** + * @brief Gets the DefaultDisplayResolution. + * @note Only available with [3.0.0+]. + * @param[out] width Output width. + * @param[out] height Output height. + */ +Result GetDefaultDisplayResolution(s32 *width, s32 *height); + +/** + * @brief Gets an Event which is signaled when the output from \ref appletGetDefaultDisplayResolution changes. + * @note Only available with [3.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result GetDefaultDisplayResolutionChangeEvent(Event *out_event); + +/** + * @brief Gets the HdcpAuthenticationState. + * @note Only available with [4.0.0+]. + * @param[out] state Output state. + */ +Result GetHdcpAuthenticationState(s32 *state); + +/** + * @brief Gets an Event which is signaled when the output from \ref appletGetHdcpAuthenticationState changes. + * @note Only available with [4.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result GetHdcpAuthenticationStateChangeEvent(Event *out_event); + +/** + * @brief Sets the \ref AppletTvPowerStateMatchingMode. + * @note Only available with [5.0.0+]. + * @param[in] mode \ref AppletTvPowerStateMatchingMode + */ +Result SetTvPowerStateMatchingMode(AppletTvPowerStateMatchingMode mode); + +/** + * @brief Gets the ApplicationId for the specified ContentActionName string. + * @note Only available when the current applet is an AppletType_SystemApplication on [5.1.0+]. + * @param[out] application_id ApplicationId. + * @param[in] name ContentActionName string. + */ +Result GetApplicationIdByContentActionName(u64 *application_id, const char *name); + +/** + * @brief Sets the \ref ApmCpuBoostMode. + * @note Only available with [7.0.0+] (not fully usable system-side with 6.x). + * @param mode \ref ApmCpuBoostMode. + */ +Result SetCpuBoostMode(ApmCpuBoostMode mode); + +/** + * @brief CancelCpuBoostMode + * @note Only available with [10.0.0+]. + */ +Result CancelCpuBoostMode(void); + +/** + * @brief GetBuiltInDisplayType + * @note Only available with [11.0.0+]. + * @param[out] out Output value. + */ +Result GetBuiltInDisplayType(s32 *out); + +/** + * @brief Perform SystemButtonPressing with the specified \ref AppletSystemButtonType. Internally this cmd checks a state field, verifies that the type is allowed, then runs the same func as \ref appletPerformSystemButtonPressing internally. + * @note Only available with [6.0.0+]. + * @param[in] type \ref AppletSystemButtonType + */ +Result PerformSystemButtonPressingIfInFocus(AppletSystemButtonType type); + +/** + * @brief Sets whether PerformanceConfigurationChangedNotification is enabled. + * @note Only available with [7.0.0+]. + * @param[in] flag Whether to enable the notification. + */ +Result SetPerformanceConfigurationChangedNotification(bool flag); + +/** + * @brief Gets the current PerformanceConfiguration. + * @note Only available with [7.0.0+]. + * @param PerformanceConfiguration Output PerformanceConfiguration. + */ +Result GetCurrentPerformanceConfiguration(u32 *PerformanceConfiguration); + +/** + * @brief Opens an \ref AppletGpuErrorHandler. + * @note The cached value loaded from \ref setsysGetDebugModeFlag must be 1, otherwise an error is returned. + * @note Only available with [11.0.0+]. + * @param[out] g \ref AppletGpuErrorHandler + */ +Result OpenMyGpuErrorHandler(AppletGpuErrorHandler *g); + +/** + * @brief Gets the OperationModeSystemInfo. + * @note Only available with [7.0.0+]. + * @param[out] info Output info. + */ +Result GetOperationModeSystemInfo(u32 *info); + +/** + * @brief This uses \ref setsysGetPlatformRegion internally. + * @note Only available with [9.0.0+]. + * @param[out] out \ref SetSysPlatformRegion + */ +Result GetSettingsPlatformRegion(SetSysPlatformRegion *out); + +/** + * @brief ActivateMigrationService + * @note Only available with [10.0.0+]. + */ +Result ActivateMigrationService(void); + +/** + * @brief DeactivateMigrationService + * @note Only available with [10.0.0+]. + */ +Result DeactivateMigrationService(void); + +/** + * @brief DisableSleepTillShutdown + * @note Only available with [11.0.0+]. + */ +Result DisableSleepTillShutdown(void); + +/** + * @brief SuppressDisablingSleepTemporarily + * @param[in] val Nanoseconds value. + * @note Only available with [11.0.0+]. + */ +Result SuppressDisablingSleepTemporarily(u64 val); + +/** + * @brief SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled + * @note Only available with [11.0.0+]. + */ +Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(void); + +/** + * @brief Close an \ref AppletGpuErrorHandler. + * @param g \ref AppletGpuErrorHandler + */ +void GpuErrorHandlerClose(AppletGpuErrorHandler *g); + +/** + * @brief Gets the size of the info available with \ref appletGpuErrorHandlerGetManualGpuErrorInfo. + * @param g \ref AppletGpuErrorHandler + * @param[out] out Output size. + */ +Result GpuErrorHandlerGetManualGpuErrorInfoSize(AppletGpuErrorHandler *g, u64 *out); + +/** + * @brief GetManualGpuErrorInfo + * @param g \ref AppletGpuErrorHandler + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size, must be >= the output size from \ref appletGpuErrorHandlerGetManualGpuErrorInfoSize. + * @param[out] out Output value. + */ +Result GpuErrorHandlerGetManualGpuErrorInfo(AppletGpuErrorHandler *g, void* buffer, size_t size, u64 *out); + +/** + * @brief GetManualGpuErrorDetectionSystemEvent + * @param g \ref AppletGpuErrorHandler + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(AppletGpuErrorHandler *g, Event *out_event); + +/** + * @brief FinishManualGpuErrorHandling + * @param g \ref AppletGpuErrorHandler + */ +Result GpuErrorHandlerFinishManualGpuErrorHandling(AppletGpuErrorHandler *g); + +/** + * @brief Delay exiting until \ref appletUnlockExit is called, with a 15 second timeout once exit is requested. + * @note When exit is requested \ref appletMainLoop will return false, hence any main-loop using appletMainLoop will exit. This allows the app to handle cleanup post-main-loop instead of being force-terminated. + * @note If the above timeout occurs after exit was requested where \ref appletUnlockExit was not called, the process will be forced-terminated. + * @note \ref appletUnlockExit must be used before main() returns. + */ +Result LockExit(void); + +/// Unlocks exiting, see \ref appletLockExit. +Result UnlockExit(void); + +/** + * @brief Enter FatalSection. + */ +Result EnterFatalSection(void); + +/** + * @brief Leave FatalSection. + */ +Result LeaveFatalSection(void); + +/** + * @brief Controls whether screenshot-capture is allowed. + * @param permission \ref AppletScreenShotPermission + */ +Result SetScreenShotPermission(AppletScreenShotPermission permission); + +/** + * @brief Sets whether ::AppletMessage_Resume is enabled. + * @param[in] flag Whether to enable the notification. + */ +Result SetRestartMessageEnabled(bool flag); + +/** + * @brief Sets the \ref AppletIdentityInfo for screenshots. + * @param[in] info \ref AppletIdentityInfo + */ +Result SetScreenShotAppletIdentityInfo(AppletIdentityInfo *info); + +/** + * @brief Sets ControllerFirmwareUpdateSection. + * @note Only available with [3.0.0+]. + * @note This throws error 0x40280 when the internal state flag already matches the input value. + * @param[in] flag Flag + */ +Result SetControllerFirmwareUpdateSection(bool flag); + +/** + * @brief Sets whether ::AppletMessage_CaptureButtonShortPressed is enabled. + * @note Only available with [3.0.0+]. + * @note When enabled with a non-Overlay applet, Overlay applet will not be notified of capture button short-presses for screenshots. + * @param[in] flag Whether to enable the notification. + */ +Result SetRequiresCaptureButtonShortPressedMessage(bool flag); + +/** + * @brief Sets the Album screenshot ImageOrientation. + * @note Only available with [3.0.0+]. + * @param[in] orientation \ref AlbumImageOrientation + */ +Result SetAlbumImageOrientation(AlbumImageOrientation orientation); + +/** + * @brief Sets the DesirableKeyboardLayout. + * @note Only available with [4.0.0+]. + * @param[in] layout Input \ref SetKeyboardLayout. + */ +Result SetDesirableKeyboardLayout(SetKeyboardLayout layout); + +Result CreateManagedDisplayLayer(u64 *out); + +/** + * @brief Checks whether SystemBufferSharing is enabled, throwing an error otherwise. + * @note Only available with [4.0.0+]. Not usable with AppletType_*Application. + */ +Result IsSystemBufferSharingEnabled(void); + +/** + * @brief Gets the System SharedBufferHandle and SharedLayerHandle. + * @note Only available with [4.0.0+]. Not usable with AppletType_*Application. + * @param[out] SharedBufferHandle Output System SharedBufferHandle. + * @param[out] SharedLayerHandle Output System SharedLayerHandle. + */ +Result GetSystemSharedLayerHandle(u64 *SharedBufferHandle, u64 *SharedLayerHandle); + +/** + * @brief Same as \ref appletGetSystemSharedLayerHandle except this just gets the SharedBufferHandle. + * @note Only available with [5.0.0+]. Not usable with AppletType_*Application. + * @param[out] SharedBufferHandle Output System SharedBufferHandle. + */ +Result GetSystemSharedBufferHandle(u64 *SharedBufferHandle); + +/** + * @brief CreateManagedDisplaySeparableLayer + * @note Only available with [10.0.0+]. + * @param[out] display_layer Output display_layer. + * @param[out] recording_layer Output recording_layer. + */ +Result CreateManagedDisplaySeparableLayer(u64 *display_layer, u64 *recording_layer); + +/** + * @brief SetManagedDisplayLayerSeparationMode + * @note Only available with [10.0.0+]. + * @param[in] mode Mode. Must be 0-1. + */ +Result SetManagedDisplayLayerSeparationMode(u32 mode); + +/** + * @brief Sets whether ::AppletMessage_RequestToDisplay is enabled. + * @note Sets an internal state flag. When the input flag is 0, this will in additional run the same code as \ref appletApproveToDisplay. + * @param[in] flag Flag + */ +Result SetHandlesRequestToDisplay(bool flag); + +/** + * @brief Approve the display requested by ::AppletMessage_RequestToDisplay, see also \ref appletSetHandlesRequestToDisplay. + */ +Result ApproveToDisplay(void); + +/** + * @brief OverrideAutoSleepTimeAndDimmingTime + * @param[in] inval0 Unknown input value. + * @param[in] inval1 Unknown input value. + * @param[in] inval2 Unknown input value. + * @param[in] inval3 Unknown input value. + */ +Result OverrideAutoSleepTimeAndDimmingTime(s32 inval0, s32 inval1, s32 inval2, s32 inval3); + +/** + * @brief Sets the IdleTimeDetectionExtension. + * @param[in] ext \ref AppletIdleTimeDetectionExtension Must be 0-2: 0 = disabled, 1 = Extended, and 2 = ExtendedUnsafe. + */ +Result SetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension ext); + +/** + * @brief Gets the value set by \ref appletSetIdleTimeDetectionExtension. + * @param[out] ext \ref AppletIdleTimeDetectionExtension + */ +Result GetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension *ext); + +/** + * @brief Sets the InputDetectionSourceSet. + * @param[in] val Input value. + */ +Result SetInputDetectionSourceSet(u32 val); + +/** + * @brief Reports that the user is active, for idle detection (screen dimming / auto-sleep). This is equivalent to when the user uses HID input. + * @note Only available with [2.0.0+]. + */ +Result ReportUserIsActive(void); + +/** + * @brief Gets the current Illuminance from the light sensor. + * @note Only available with [3.0.0+]. + * @param fLux Output fLux + */ +Result GetCurrentIlluminance(float *fLux); + +/** + * @brief Gets whether Illuminance is available. + * @note Only available with [3.0.0+]. + * @param out Output flag + */ +Result IsIlluminanceAvailable(bool *out); + +/** + * @brief Sets AutoSleepDisabled. + * @note Only available with [5.0.0+]. + * @param[in] flag Flag + */ +Result SetAutoSleepDisabled(bool flag); + +/** + * @brief Gets AutoSleepDisabled. + * @note Only available with [5.0.0+]. + * @param[out] out Output flag + */ +Result IsAutoSleepDisabled(bool *out); + +/** + * @brief Gets the current Illuminance from the light sensor. Same as \ref appletGetCurrentIlluminance except for the additional param. + * @note Only available with [5.0.0+]. + * @param bOverLimit Output bOverLimit + * @param fLux Output fLux + */ +Result GetCurrentIlluminanceEx(bool *bOverLimit, float *fLux); + +/** + * @brief Sets the \ref AppletInputDetectionPolicy. + * @note Only available with [9.0.0+]. + * @param[in] policy \ref AppletInputDetectionPolicy + */ +Result SetInputDetectionPolicy(AppletInputDetectionPolicy policy); + +/** + * @brief Sets the WirelessPriorityMode. + * @note Only available with [4.0.0+]. + * @param[in] mode \ref AppletWirelessPriorityMode + */ +Result SetWirelessPriorityMode(AppletWirelessPriorityMode mode); + +/** + * @brief Gets the total time in nanoseconds that the current process was actively running (not suspended), relative to when \ref appletInitialize was last used. + * @note Only available with [6.0.0+]. + * @param[out] activeTime Output nanoseconds value. + */ +Result GetProgramTotalActiveTime(u64 *activeTime); + +/** + * @brief Sets whether ::AppletMessage_AlbumScreenShotTaken is enabled. + * @note Only available with [7.0.0+]. + * @param[in] flag Whether to enable the notification. + */ +Result SetAlbumImageTakenNotificationEnabled(bool flag); + +/** + * @brief Sets the Application AlbumUserData. + * @note Only available with [8.0.0+]. + * @param[in] buffer Buffer containing arbitrary UserData. + * @param[in] size Buffer size, must be <=0x400. + */ +Result SetApplicationAlbumUserData(const void* buffer, size_t size); + +/** + * @brief SaveCurrentScreenshot + * @note Only available with [11.0.0+]. + * @param[in] option \ref AlbumReportOption + */ +Result SaveCurrentScreenshot(AlbumReportOption option); + +/** + * @brief Gets the AppletResourceUserId of the CallerApplet. + * @note Only available with [6.0.0+]. + * @param[out] out AppletResourceUserId + */ +Result GetAppletResourceUserIdOfCallerApplet(u64 *out); + +/** + * @brief Sets the current applet WindowVisibility. + * @note Only available with [7.0.0+]. + * @param[in] flag Flag + */ +Result SetAppletWindowVisibility(bool flag); + +/** + * @brief Sets the AppletGpuTimeSlice. + * @note Only available with [7.0.0+]. + * @param[in] val Input value, must not be negative. + */ +Result SetAppletGpuTimeSlice(s64 val); + +/** + * @brief Sets the ExpectedMasterVolume for MainApplet and LibraryApplet. + * @note Used by some official apps before/after launching LibraryApplets. Prior to changing the volume, the official app uses \ref appletGetExpectedMasterVolume, with the output being used to restore the volume after LibraryApplet handling. + * @param[in] mainAppletVolume MainApplet ExpectedMasterVolume. + * @param[in] libraryAppletVolume LibraryApplet ExpectedMasterVolume. + */ +Result SetExpectedMasterVolume(float mainAppletVolume, float libraryAppletVolume); + +/** + * @brief Gets the ExpectedMasterVolume for MainApplet and LibraryApplet. + * @note See also \ref appletSetExpectedMasterVolume. + * @param[out] mainAppletVolume MainApplet ExpectedMasterVolume. Optional, can be NULL. Used with cmd GetMainAppletExpectedMasterVolume when not NULL. + * @param[out] libraryAppletVolume LibraryApplet ExpectedMasterVolume. Optional, can be NULL. Used with cmd GetLibraryAppletExpectedMasterVolume when not NULL. + */ +Result GetExpectedMasterVolume(float *mainAppletVolume, float *libraryAppletVolume); + +/** + * @brief Change the MainApplet MasterVolume. + * @param[in] volume MainApplet MasterVolume. + * @param[in] unk Unknown. + */ +Result ChangeMainAppletMasterVolume(float volume, u64 unk); + +/** + * @brief Sets the TransparentVolumeRate. + * @param[in] val Input value. + */ +Result SetTransparentVolumeRate(float val); + +/** + * @brief Update the LastForeground CaptureImage. + */ +Result UpdateLastForegroundCaptureImage(void); + +/** + * @brief Update the CallerApplet CaptureImage. + */ +Result UpdateCallerAppletCaptureImage(void); + +/** + * @brief Gets the LastForeground CaptureImage. + * @param[out] buffer Output buffer containing the 1280x720 RGBA8 image. + * @param[out] size Buffer size, must match 0x384000. + * @param[out] flag Output flag. + */ +Result GetLastForegroundCaptureImageEx(void* buffer, size_t size, bool *flag); + +/** + * @brief Gets the LastApplication CaptureImage. + * @param[out] buffer Output buffer containing the 1280x720 RGBA8 image. + * @param[out] size Buffer size, must match 0x384000. + * @param[out] flag Output flag. + */ +Result GetLastApplicationCaptureImageEx(void* buffer, size_t size, bool *flag); + +/** + * @brief Gets the CallerApplet CaptureImage. + * @param[out] buffer Output buffer containing the 1280x720 RGBA8 image. + * @param[out] size Buffer size, must match 0x384000. + * @param[out] flag Output flag. + */ +Result GetCallerAppletCaptureImageEx(void* buffer, size_t size, bool *flag); + +/** + * @brief Takes a screenshot of the current applet Layer into the specified CaptureSharedBuffer. + * @note Only available with [2.0.0+]. + * @param[in] flag Flag. + * @param[in] captureBuf \ref AppletCaptureSharedBuffer + */ +Result TakeScreenShotOfOwnLayer(bool flag, AppletCaptureSharedBuffer captureBuf); + +/** + * @brief Copies image data from a CaptureSharedBuffer to another CaptureSharedBuffer. + * @note Only available with [5.0.0+]. + * @param[in] dstCaptureBuf Destination \ref AppletCaptureSharedBuffer. + * @param[in] srcCaptureBuf Source \ref AppletCaptureSharedBuffer. + */ +Result CopyBetweenCaptureBuffers(AppletCaptureSharedBuffer dstCaptureBuf, AppletCaptureSharedBuffer srcCaptureBuf); + +/** + * @brief Clear the input CaptureSharedBuffer with the specified color. + * @note Only available with [3.0.0+]. + * @param[in] flag Flag. + * @param[in] captureBuf \ref AppletCaptureSharedBuffer + * @param[in] color RGBA8 color. + */ +Result ClearCaptureBuffer(bool flag, AppletCaptureSharedBuffer captureBuf, u32 color); + +/** + * @brief Clear the AppletTransitionBuffer with the specified color. + * @note Only available with [3.0.0+]. + * @param[in] color RGBA8 color. + */ +Result ClearAppletTransitionBuffer(u32 color); + +/** + * @brief Acquire the LastApplication CaptureSharedBuffer. + * @note Only available with [4.0.0+]. + * @param[out] flag Output flag. + * @param[out] id Output ID. + */ +Result AcquireLastApplicationCaptureSharedBuffer(bool *flag, s32 *id); + +/** + * @brief Release the LastApplication CaptureSharedBuffer. + * @note Only available with [4.0.0+]. + */ +Result ReleaseLastApplicationCaptureSharedBuffer(void); + +/** + * @brief Acquire the LastForeground CaptureSharedBuffer. + * @note Only available with [4.0.0+]. + * @param[out] flag Output flag. + * @param[out] id Output ID. + */ +Result AcquireLastForegroundCaptureSharedBuffer(bool *flag, s32 *id); + +/** + * @brief Release the LastForeground CaptureSharedBuffer. + * @note Only available with [4.0.0+]. + */ +Result ReleaseLastForegroundCaptureSharedBuffer(void); + +/** + * @brief Acquire the CallerApplet CaptureSharedBuffer. + * @note Only available with [4.0.0+]. + * @param[out] flag Output flag. + * @param[out] id Output ID. + */ +Result AcquireCallerAppletCaptureSharedBuffer(bool *flag, s32 *id); + +/** + * @brief Release the CallerApplet CaptureSharedBuffer. + * @note Only available with [4.0.0+]. + */ +Result ReleaseCallerAppletCaptureSharedBuffer(void); + +/** + * @brief Takes a screenshot of the current applet Layer into the specified CaptureSharedBuffer. Same as \ref appletTakeScreenShotOfOwnLayer except for the additional immediately param. + * @note Only available with [6.0.0+]. + * @param[in] flag0 Flag0. + * @param[in] immediately Whether the screenshot should be taken immediately. + * @param[in] captureBuf \ref AppletCaptureSharedBuffer + */ +Result TakeScreenShotOfOwnLayerEx(bool flag0, bool immediately, AppletCaptureSharedBuffer captureBuf); + +/** + * @brief Pushes a storage to the ContextStack. Normally this should only be used when AppletInfo::caller_flag is true. + * @note Only available with AppletType_LibraryApplet. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result PushContext(AppletStorage *s); + +/** + * @brief Pops a storage from the ContextStack. Normally this should only be used when AppletInfo::caller_flag is true. + * @note Only available with AppletType_LibraryApplet. + * @param[out] s Storage object. + */ +Result PopContext(AppletStorage *s); + +/** + * @brief Closes a LockAccessor. + * @param a LockAccessor object. + */ +void LockAccessorClose(AppletLockAccessor *a); + +/** + * @brief TryLock a LockAccessor. + * @param a LockAccessor object. + * @param[out] flag Whether locking was successful, when false this indicates that this func should be called again. + */ +Result LockAccessorTryLock(AppletLockAccessor *a, bool *flag); + +/** + * @brief Lock a LockAccessor. + * @note Similar to \ref appletLockAccessorTryLock, except this uses timeout UINT64_MAX with the eventWait call, and this uses TryLock repeatedly until the output flag value is true. + * @param a LockAccessor object. + */ +Result LockAccessorLock(AppletLockAccessor *a); + +/** + * @brief Unlock a LockAccessor. + * @param a LockAccessor object. + */ +Result LockAccessorUnlock(AppletLockAccessor *a); + +/** + * @brief Creates a LibraryApplet. + * @param h AppletHolder object. + * @param id See \ref AppletId. + * @param mode See \ref LibAppletMode. + */ +Result CreateLibraryApplet(AppletHolder *h, AppletId id, LibAppletMode mode); + +/** + * @brief Creates a LibraryApplet. This is for when a LibraryApplet creates itself. + * @note Identical to \ref appletCreateLibraryApplet except this sets the creating_self flag to true. + * @param h AppletHolder object. + * @param id See \ref AppletId. + * @param mode See \ref LibAppletMode. + */ +Result CreateLibraryAppletSelf(AppletHolder *h, AppletId id, LibAppletMode mode); + +/** + * @brief TerminateAllLibraryApplets which were created by the current applet. + * @note Normally LibraryApplet cleanup should be handled via \ref AppletHolder. + */ +Result TerminateAllLibraryApplets(void); + +/** + * @brief AreAnyLibraryAppletsLeft which were created by the current applet. + * @param[out] out Output flag. + */ +Result AreAnyLibraryAppletsLeft(bool *out); + +/// Closes an AppletHolder object. +void HolderClose(AppletHolder *h); + +/// Returns whether the AppletHolder object was initialized. +bool HolderActive(AppletHolder *h); + +/** + * @brief Gets the IndirectLayerConsumerHandle loaded during \ref appletCreateLibraryApplet, on [2.0.0+]. + * @note Only available when \ref LibAppletMode is ::LibAppletMode_BackgroundIndirect. + * @param h AppletHolder object. + * @param out Output IndirectLayerConsumerHandle. + */ +Result HolderGetIndirectLayerConsumerHandle(AppletHolder *h, u64 *out); + +/** + * @brief Starts the LibraryApplet. + * @param h AppletHolder object. + */ +Result HolderStart(AppletHolder *h); + +/** + * @brief Jumps to the LibraryApplet, with the current-LibraryApplet being terminated. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_LibraryApplet. + * @param h AppletHolder object. + */ +Result HolderJump(AppletHolder *h); + +/** + * @brief Requests the LibraryApplet to exit. The command is only used if \ref appletHolderCheckFinished returns false. + * @param h AppletHolder object. + */ +Result HolderRequestExit(AppletHolder *h); + +/** + * @brief Terminate the LibraryApplet. + * @param h AppletHolder object. + */ +Result HolderTerminate(AppletHolder *h); + +/** + * @brief Uses cmds GetAppletStateChangedEvent and RequestExit, then waits for the LibraryApplet to exit with the specified timeout. If a timeout occurs, the Terminate cmd is used. + * @param h AppletHolder object. + * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. + */ +Result HolderRequestExitOrTerminate(AppletHolder *h, u64 timeout); + +/** + * @brief Waits for the LibraryApplet to exit. + * @param h AppletHolder object. + */ +void HolderJoin(AppletHolder *h); + +/** + * @brief Gets the LibraryApplet StateChangedEvent. + * @param h AppletHolder object. + */ +Event * HolderGetExitEvent(AppletHolder *h); + +/** + * @brief Waits on the LibraryApplet StateChangedEvent with timeout=0, and returns whether it was successful. + * @param h AppletHolder object. + */ +bool HolderCheckFinished(AppletHolder *h); + +/** + * @brief Gets the \ref LibAppletExitReason set by \ref appletHolderJoin. + * @param h AppletHolder object. + */ +LibAppletExitReason HolderGetExitReason(AppletHolder *h); + +/** + * @brief Sets OutOfFocusApplicationSuspendingEnabled. + * @note Only available with AppletType_*Application. + * @param h AppletHolder object. + * @param[in] flag Flag + */ +Result HolderSetOutOfFocusApplicationSuspendingEnabled(AppletHolder *h, bool flag); + +/** + * @brief PresetLibraryAppletGpuTimeSliceZero + * @note Only available with [10.0.0+]. + * @param h AppletHolder object. + */ +Result HolderPresetLibraryAppletGpuTimeSliceZero(AppletHolder *h); + +/** + * @brief Gets the PopInteractiveOutDataEvent. + * @param h AppletHolder object. + * @param[out] out_event Output Event. + */ +Result HolderGetPopInteractiveOutDataEvent(AppletHolder *h, Event **out_event); + +/** + * @brief Waits for the PopInteractiveOutDataEvent and StateChangedEvent. + * @return false for error / when StateChangedEvent was signaled, and true when PopInteractiveOutDataEvent was signaled. The latter is signaled when a new storage is available with \ref appletHolderPopInteractiveOutData where previously no storage was available (this willl not clear the event), this event is automatically cleared by the system once the last storage is popped. + * @param h AppletHolder object. + */ +bool HolderWaitInteractiveOut(AppletHolder *h); + +/** + * @brief Pushes a storage for LibraryApplet input. + * @note This uses \ref appletStorageClose automatically. + * @param h AppletHolder object. + * @param[in] s Storage object. + */ +Result HolderPushInData(AppletHolder *h, AppletStorage *s); + +/** + * @brief Pops a storage from LibraryApplet output. + * @param h AppletHolder object. + * @param[out] s Storage object. + */ +Result HolderPopOutData(AppletHolder *h, AppletStorage *s); + +/** + * @brief Pushes a storage for LibraryApplet Extra storage input. + * @note This uses \ref appletStorageClose automatically. + * @param h AppletHolder object. + * @param[in] s Storage object. + */ +Result HolderPushExtraStorage(AppletHolder *h, AppletStorage *s); + +/** + * @brief Pushes a storage for LibraryApplet Interactive input. + * @note This uses \ref appletStorageClose automatically. + * @param h AppletHolder object. + * @param[in] s Storage object. + */ +Result HolderPushInteractiveInData(AppletHolder *h, AppletStorage *s); + +/** + * @brief Pops a storage from LibraryApplet Interactive output. + * @param h AppletHolder object. + * @param[out] s Storage object. + */ +Result HolderPopInteractiveOutData(AppletHolder *h, AppletStorage *s); + +/** + * @brief Gets the \ref LibAppletInfo for the specified LibraryApplet. + * @param h AppletHolder object. + * @param[out] info \ref LibAppletInfo + */ +Result HolderGetLibraryAppletInfo(AppletHolder *h, LibAppletInfo *info); + +/** + * @brief Creates a storage. + * @param s Storage object. + * @param size Size of storage. + */ +Result CreateStorage(AppletStorage *s, s64 size); + +/** + * @brief Creates a TransferMemory storage. + * @param s Storage object. + * @param buffer TransferMemory buffer, will be automatically allocated if NULL. + * @param size Size of storage. + * @param writable Controls whether writing to the storage is allowed with \ref appletStorageWrite. + */ +Result CreateTransferMemoryStorage(AppletStorage *s, void* buffer, s64 size, bool writable); + +/** + * @brief Creates a HandleStorage. + * @note Only available on [2.0.0+]. + * @param s Storage object. + * @param inval Arbitrary input value. + * @param handle Arbitrary input handle. + */ +Result CreateHandleStorage(AppletStorage *s, s64 inval, Handle handle); + +/** + * @brief Creates a HandleStorage using TransferMemory. Wrapper for \ref appletCreateHandleStorage. + * @param s Storage object. + * @param buffer TransferMemory buffer, will be automatically allocated if NULL. + * @param size Size of storage. + */ +Result CreateHandleStorageTmem(AppletStorage *s, void* buffer, s64 size); + +/// Closes the storage object. TransferMemory closing is seperate, see \ref appletStorageCloseTmem. +/// Other applet functions which push an input storage will automatically call this. +void StorageClose(AppletStorage *s); + +/// Closes the TransferMemory in the storage object. For TransferMemory storage created by the current process, this must be called after the LibraryApplet finishes using it (if sent to one). +void StorageCloseTmem(AppletStorage *s); + +/// Gets the size of the storage. This is not usable with HandleStorage, use \ref appletStorageGetHandle or \ref appletStorageMap instead for that. +Result StorageGetSize(AppletStorage *s, s64 *size); + +/** + * @brief Writes to a storage. offset(+size) must be within the actual storage size. + * @note This is not usable with HandleStorage. + * @param s Storage object. + * @param offset Offset in storage. + * @param buffer Input data. + * @param size Data size. + */ +Result StorageWrite(AppletStorage *s, s64 offset, const void* buffer, size_t size); + +/** + * @brief Reads from a storage. offset(+size) must be within the actual storage size. + * @note This is not usable with HandleStorage. + * @param s Storage object. + * @param offset Offset in storage. + * @param buffer Input data. + * @param size Data size. + */ +Result StorageRead(AppletStorage *s, s64 offset, void* buffer, size_t size); + +/** + * @brief Gets data for a HandleStorage originally from \ref appletCreateHandleStorage input. + * @note Only available on [2.0.0+]. + * @param s Storage object. + * @param out Output value. + * @param handle Output handle. + */ +Result StorageGetHandle(AppletStorage *s, s64 *out, Handle *handle); + +/** + * @brief Maps TransferMemory for a HandleStorage. Wrapper for \ref appletCreateHandleStorage. + * @note The TransferMemory can be unmapped with \ref appletStorageCloseTmem. + * @note Do not use this if the AppletStorage already contains initialized TransferMemory state. + * @param s Storage object. + * @param addr Output mapped address (optional). + * @param size Output size (optional). + */ +Result StorageMap(AppletStorage *s, void** addr, size_t *size); + +/** + * @brief Pops a LaunchParameter AppletStorage, the storage will be removed from sysmodule state during this. + * @param[out] s Output storage. + * @param kind See \ref AppletLaunchParameterKind. + * @note Only available with AppletType_*Application. + * @note See also acc.h \ref accountGetPreselectedUser (wrapper for appletPopLaunchParameter etc). + */ +Result PopLaunchParameter(AppletStorage *s, AppletLaunchParameterKind kind); + +/** + * @brief Requests to launch the specified application. + * @note Only available with AppletType_*Application, or AppletType_LibraryApplet on [5.0.0+]. + * @param[in] application_id ApplicationId. Value 0 can be used to relaunch the current application. + * @param[in] s Optional AppletStorage object, can be NULL. This is automatically closed. When NULL on pre-4.0.0 (or with AppletType_LibraryApplet), this will internally create a tmp storage with size 0 for use with the cmd. This is the storage available to the launched application via \ref appletPopLaunchParameter with ::AppletLaunchParameterKind_UserChannel. + */ +Result RequestLaunchApplication(u64 application_id, AppletStorage* s); + +/** + * @brief Requests to launch the specified application, for kiosk systems. + * @note Only available with AppletType_*Application on [3.0.0+]. + * @note Identical to \ref appletRequestLaunchApplication, except this allows the user to specify the attribute fields instead of the defaults being used. + * @param[in] application_id ApplicationId + * @param[in] s Optional AppletStorage object, can be NULL. This is automatically closed. When NULL on pre-4.0.0, this will internally create a tmp storage with size 0 for use with the cmd. This is the storage available to the launched application via \ref appletPopLaunchParameter with ::AppletLaunchParameterKind_UserChannel. + * @param[in] attr Kiosk application attributes. + */ +Result RequestLaunchApplicationForQuest(u64 application_id, AppletStorage* s, const AppletApplicationAttributeForQuest *attr); + +/** + * @brief Gets the DesiredLanguage for the current host application control.nacp. + * @note Only available with AppletType_*Application. + * @param[out] LanguageCode Output LanguageCode, see set.h. + */ +Result GetDesiredLanguage(u64 *LanguageCode); + +/** + * @brief Gets the DisplayVersion for the current host application control.nacp. + * @note Only available with AppletType_*Application. + * @param[out] displayVersion Output DisplayVersion string, must be at least 0x10-bytes. This is always NUL-terminated. + */ +Result GetDisplayVersion(char *displayVersion); + +/** + * @brief Blocks the usage of the home button, for short (Home Menu) and long (Overlay) presses. + * @note Only available with AppletType_*Application. + * @param val Unknown. Official sw only uses hard-coded value 0 for this. + */ +Result BeginBlockingHomeButtonShortAndLongPressed(s64 val); + +/** + * @brief Ends the blocking started by \ref appletBeginBlockingHomeButtonShortAndLongPressed. + * @note Only available with AppletType_*Application. + */ +Result EndBlockingHomeButtonShortAndLongPressed(void); + +/** + * @brief Blocks the usage of the home button, for short presses (Home Menu). + * @note Only available with AppletType_*Application. + * @param val Unknown nanoseconds. Value 0 can be used. + */ +Result BeginBlockingHomeButton(s64 val); + +/** + * @brief Ends the blocking started by \ref appletBeginBlockingHomeButton. + * @note Only available with AppletType_*Application. + */ +Result EndBlockingHomeButton(void); + +/** + * @brief Notify that the app is now running, for the Application logo screen. This throws a fatal-error on failure. + * @note This will just return when applet-type isn't AppletType_Application, or when this was already used previously. Used automatically by \ref appletInitialize when __nx_applet_auto_notifyrunning is set to true (the default value). + */ +void NotifyRunning(bool *out); + +/** + * @brief Gets the PseudoDeviceId. This is derived from the output of a ns command, and from data in the host application control.nacp. + * @note Only available with AppletType_*Application on [2.0.0+]. + * @param[out] out Output PseudoDeviceId. + */ +Result GetPseudoDeviceId(Uuid *out); + +/// Set media playback state. +/// If state is set to true, screen dimming and auto sleep is disabled. +/// For *Application, this uses cmd SetMediaPlaybackStateForApplication, otherwise cmd SetMediaPlaybackState is used. +Result SetMediaPlaybackState(bool state); + +/// Gets whether video recording is supported. +/// See also \ref appletInitializeGamePlayRecording. +Result IsGamePlayRecordingSupported(bool *flag); + +/// Disable/enable video recording. Only available after \ref appletInitializeGamePlayRecording was used. +/// See also \ref appletInitializeGamePlayRecording. +Result SetGamePlayRecordingState(bool state); + +/// Initializes video recording. This allocates a 0x6000000-byte buffer for the TransferMemory, cleanup is handled automatically during app exit in \ref appletExit. +/// Only available with AppletType_Application on [3.0.0+], hence errors from this can be ignored. +/// Video recording is only fully available system-side with [4.0.0+]. +/// Only usable when running under an application which supports video recording. Using this is only needed when the host application control.nacp has VideoCaptureMode set to Enabled, with Automatic appletInitializeGamePlayRecording is not needed. +Result InitializeGamePlayRecording(void); + +/** + * @brief Requests to save the video recording, as if the Capture-button was held. + * @note Only available with AppletType_*Application on [4.0.0+]. + */ +Result RequestFlushGamePlayingMovieForDebug(void); + +/** + * @brief Requests a system shutdown. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_*Application on [3.0.0+]. + */ +Result RequestToShutdown(void); + +/** + * @brief Requests a system reboot. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_*Application on [3.0.0+]. + */ +Result RequestToReboot(void); + +/** + * @brief RequestToSleep + * @note Only available with AppletType_*Application on [10.0.0+]. + */ +Result RequestToSleep(void); + +/** + * @brief Exit the application and return to the kiosk demo menu. This terminates the current process. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_*Application on [4.0.0+], on kiosk systems (QuestFlag set). + */ +Result ExitAndRequestToShowThanksMessage(void); + +/** + * @brief Initializes the ApplicationCopyrightFrameBuffer, with dimensions 1280x720 + the tmem for it. This is used as an overlay for screenshots. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @note Cleanup for this is handled automatically during app exit in \ref appletExit. + */ +Result InitializeApplicationCopyrightFrameBuffer(void); + +/** + * @brief Sets the RGBA8 image for use with \ref appletInitializeApplicationCopyrightFrameBuffer. Overrides the current image, if this was already used previously. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @note The specified coordinates and width/height must be within the bounds of the framebuffer setup by \ref appletInitializeApplicationCopyrightFrameBuffer. + * @param[in] buffer Input image buffer. + * @param[in] size Input image buffer size. + * @param[in] x X coordinate. Must not be negative. + * @param[in] y Y coordinate. Must not be negative. + * @param[in] width Image width. Must be >=1. + * @param[in] height Image height. Must be >=1. + * @param[in] mode \ref AppletWindowOriginMode + */ +Result SetApplicationCopyrightImage(const void* buffer, size_t size, s32 x, s32 y, s32 width, s32 height, AppletWindowOriginMode mode); + +/** + * @brief Sets the visibility for the image set by \ref appletSetApplicationCopyrightImage, in screenshots. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @param[in] visible Whether the image is visible. The default is true. + */ +Result SetApplicationCopyrightVisibility(bool visible); + +/** + * @brief Gets ApplicationPlayStatistics. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @note The input ApplicationIds must be allowed via control.nacp with the current host application. The minimum allowed ApplicationId is the ApplicationId for the current application. + * @param stats Output \ref PdmApplicationPlayStatistics array. + * @param application_ids Input ApplicationIds array. + * @param count Total entries in the input/output arrays. + * @param total_out Total output entries. + */ +Result QueryApplicationPlayStatistics(PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out); + +/** + * @brief Same as \ref appletQueryApplicationPlayStatistics except this gets playstats specific to the input userId. + * @note Only available with AppletType_*Application on [6.0.0+]. + * @param[in] uid \ref AccountUid + * @param[out] stats Output \ref PdmApplicationPlayStatistics array. + * @param[in] application_ids Input ApplicationIds array. + * @param[in] count Total entries in the input/output arrays. + * @param[out] total_out Total output entries. + */ +Result QueryApplicationPlayStatisticsByUid(AccountUid uid, PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out); + +/** + * @brief Launches Application {current_ApplicationId}+programIndex. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @note Creates the storage if needed. Uses cmd ClearUserChannel. Uses cmd UnpopToUserChannel when the storage was created. Lastly cmd ExecuteProgramCmd is used. + * @param[in] programIndex ProgramIndex, must be 0x0-0xFF. 0 is the same as the current application. ProgramIndex values where the application is not installed should not be used. + * @param[in] buffer Optional buffer containing the storage data which will be used for ::AppletLaunchParameterKind_UserChannel with the launched Application, can be NULL. + * @param[in] size Size of the above buffer, 0 to not use the storage. Must be <=0x1000. + */ +Result ExecuteProgram(s32 programIndex, const void* buffer, size_t size); + +/** + * @brief Launches the specified ApplicationId. + * @note Only available with AppletType_*Application on [5.0.0+], with DebugMode enabled. + * @note Creates the storage if needed. Uses cmd ClearUserChannel. Uses cmd UnpopToUserChannel when the storage was created. Lastly cmd ExecuteProgramCmd is used. + * @param[in] application_id ApplicationId. + * @param[in] buffer Optional buffer containing the storage data which will be used for ::AppletLaunchParameterKind_UserChannel with the launched Application, can be NULL. + * @param[in] size Size of the above buffer, 0 to not use the storage. Must be <=0x1000. + */ +Result JumpToSubApplicationProgramForDevelopment(u64 application_id, const void* buffer, size_t size); + +/** + * @brief Relaunches the current Application. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @note Creates the storage if needed. Uses cmd ClearUserChannel. Uses cmd UnpopToUserChannel when the storage was created. Lastly cmd ExecuteProgramCmd is used. + * @param[in] buffer Optional buffer containing the storage data which will be used for ::AppletLaunchParameterKind_UserChannel with the launched Application, can be NULL. + * @param[in] size Size of the above buffer, 0 to not use the storage. Must be <=0x1000. + */ +Result RestartProgram(const void* buffer, size_t size); + +/** + * @brief Gets the ProgramIndex of the program which launched this program. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @param[out] programIndex ProgramIndex, -1 when there was no previous program. + */ +Result GetPreviousProgramIndex(s32 *programIndex); + +/** + * @brief SetDelayTimeToAbortOnGpuError + * @note Only available with AppletType_*Application on [11.0.0+]. + * @param[in] val Input nanoseconds value. + */ +Result SetDelayTimeToAbortOnGpuError(u64 val); + +/** + * @brief Gets an Event which is signaled when a new storage is available with \ref appletTryPopFromFriendInvitationStorageChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. + * @note This is used by \ref friendsGetFriendInvitationNotificationEvent. + * @note Only available with AppletType_*Application on [9.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetFriendInvitationStorageChannelEvent(Event *out_event); + +/** + * @brief Pops a storage from the FriendInvitation StorageChannel. + * @note This is used by \ref friendsTryPopFriendInvitationNotificationInfo. + * @note Only available with AppletType_*Application on [9.0.0+]. + * @param[out] s Storage object. + */ +Result TryPopFromFriendInvitationStorageChannel(AppletStorage *s); + +/** + * @brief Gets an Event which is signaled when a new storage is available with \ref appletTryPopFromNotificationStorageChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. + * @note This is used by \ref notifGetNotificationSystemEvent. + * @note Only available with AppletType_*Application on [9.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetNotificationStorageChannelEvent(Event *out_event); + +/** + * @brief Pops a storage from the Notification StorageChannel. + * @note This is used by \ref notifTryPopNotifiedApplicationParameter. + * @note Only available with AppletType_*Application on [9.0.0+]. + * @param[out] s Storage object. + */ +Result TryPopFromNotificationStorageChannel(AppletStorage *s); + +/** + * @brief GetHealthWarningDisappearedSystemEvent + * @note Only available with AppletType_*Application on [9.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetHealthWarningDisappearedSystemEvent(Event *out_event); + +/** + * @brief SetHdcpAuthenticationActivated + * @note Only available with AppletType_*Application on [9.0.0+]. + * @param[in] flag Whether HdcpAuthentication is activated. + */ +Result SetHdcpAuthenticationActivated(bool flag); + +/** + * @brief GetLastApplicationExitReason + * @note Only available with AppletType_*Application on [11.0.0+]. + * @param[out] out Output value. + */ +Result GetLastApplicationExitReason(s32 *out); + +/** + * @brief CreateMovieMaker. Do not use this directly, use \ref grcCreateMovieMaker instead. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @param[out] srv_out Output Service for applet IMovieMaker. + * @param[in] tmem TransferMemory + */ +Result CreateMovieMaker(Service* srv_out, TransferMemory *tmem); + +/** + * @brief Launches the jit-sysmodule when it was not previously launched by this cmd. Returns 0 when it was previously launched. + * @note Only available with AppletType_*Application on [5.0.0+]. + * @note Requires the jit-sysmodule to actually be installed. + */ +Result PrepareForJit(void); + +/** + * @brief RequestToGetForeground + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. + */ +Result RequestToGetForeground(void); + +/** + * @brief LockForeground + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. + */ +Result LockForeground(void); + +/** + * @brief UnlockForeground + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. + */ +Result UnlockForeground(void); + +/** + * @brief Pops a storage from the general channel. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. + * @param[out] s Storage object. + */ +Result PopFromGeneralChannel(AppletStorage *s); + +/** + * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopFromGeneralChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetPopFromGeneralChannelEvent(Event *out_event); + +/** + * @brief Gets a \ref AppletLockAccessor for HomeButtonWriter. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. + * @note Similar to using \ref appletGetWriterLockAccessorEx with inval=0. + * @param a LockAccessor object. + */ +Result GetHomeButtonWriterLockAccessor(AppletLockAccessor *a); + +/** + * @brief IsSleepEnabled + * @note Only available with AppletType_SystemApplet on [11.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. + * @param[out] out Output flag. + */ +Result IsSleepEnabled(bool *out); + +/** + * @brief PopRequestLaunchApplicationForDebug + * @note Only available with AppletType_SystemApplet on [6.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. + * @param[out] uids Output array of \ref AccountUid. + * @param[in] count Size of the uids array in entries, must be at least the size stored in state. + * @param[out] application_id Output ApplicationId. + * @param[out] total_out Total output userID entries. + */ +Result PopRequestLaunchApplicationForDebug(AccountUid *uids, s32 count, u64 *application_id, s32 *total_out); + +/** + * @brief IsForceTerminateApplicationDisabledForDebug + * @note Only available with AppletType_SystemApplet on [9.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. + * @param[out] out Output flag. 0 when DebugMode is not enabled, otherwise this is loaded from a system-setting. + */ +Result IsForceTerminateApplicationDisabledForDebug(bool *out); + +/** + * @brief Launches DevMenu and the dev Overlay-applet. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_SystemApplet on [8.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. + * @note This verifies that DebugMode is enabled, then uses a ns cmd. That cmd then loads the system-settings for these two ProgramIds (which normally only exist on devunits), and verifies that these programs are installed + launches them. + */ +Result LaunchDevMenu(void); + +/** + * @brief SetLastApplicationExitReason + * @note Only available with AppletType_SystemApplet on [11.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. + * @param[in] reason Reason + */ +Result SetLastApplicationExitReason(s32 reason); + +/** + * @brief Start the sequence for entering sleep-mode. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + * @param[in] flag Flag, official sw uses hard-coded value = true. + */ +Result StartSleepSequence(bool flag); + +/** + * @brief Start the system-shutdown sequence. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + */ +Result StartShutdownSequence(void); + +/** + * @brief Start the system-reboot sequence. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + */ +Result StartRebootSequence(void); + +/** + * @brief IsAutoPowerDownRequested. Uses an idle:sys cmd internally. + * @note Only available with AppletType_SystemApplet on [7.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + * @param[out] out Output flag. + */ +Result IsAutoPowerDownRequested(bool *out); + +/** + * @brief LoadAndApplyIdlePolicySettings. Uses an idle:sys cmd internally. + * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + */ +Result LoadAndApplyIdlePolicySettings(void); + +/** + * @brief NotifyCecSettingsChanged. Uses an omm cmd internally. + * @note Only available with AppletType_SystemApplet on [2.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + */ +Result NotifyCecSettingsChanged(void); + +/** + * @brief Sets the DefaultHomeButtonLongPressTime. + * @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + * @param[in] val Input value. + */ +Result SetDefaultHomeButtonLongPressTime(s64 val); + +/** + * @brief UpdateDefaultDisplayResolution. Uses an omm cmd internally. + * @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + */ +Result UpdateDefaultDisplayResolution(void); + +/** + * @brief ShouldSleepOnBoot. Uses an omm cmd internally. + * @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + * @param[out] out Output flag. + */ +Result ShouldSleepOnBoot(bool *out); + +/** + * @brief Gets an Event which is signaled for HdcpAuthenticationFailed. + * @note Only available with AppletType_SystemApplet on [4.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetHdcpAuthenticationFailedEvent(Event *out_event); + +/** + * @brief Creates an Application. + * @note Only available with AppletType_SystemApplet. + * @param[out] a \ref AppletApplication + * @param[in] application_id ApplicationId. + */ +Result CreateApplication(AppletApplication *a, u64 application_id); + +/** + * @brief Pops a \ref AppletApplication for a requested Application launch. + * @note Only available with AppletType_SystemApplet. + * @param[out] a \ref AppletApplication + */ +Result PopLaunchRequestedApplication(AppletApplication *a); + +/** + * @brief Creates a SystemApplication. + * @note Only available with AppletType_SystemApplet. + * @param[out] a \ref AppletApplication + * @param[in] system_application_id SystemApplicationId. + */ +Result CreateSystemApplication(AppletApplication *a, u64 system_application_id); + +/** + * @brief PopFloatingApplicationForDevelopment. + * @note Only available with AppletType_SystemApplet. Should not be used if no FloatingApplication is available. + * @param[out] a \ref AppletApplication + */ +Result PopFloatingApplicationForDevelopment(AppletApplication *a); + +/** + * @brief Close an \ref AppletApplication. + * @param a \ref AppletApplication + */ +void ApplicationClose(AppletApplication *a); + +/** + * @brief Returns whether the AppletApplication object was initialized. + * @param a \ref AppletApplication + */ +bool ApplicationActive(AppletApplication *a); + +/** + * @brief Starts the Application. + * @param a \ref AppletApplication + */ +Result ApplicationStart(AppletApplication *a); + +/** + * @brief Requests the Application to exit. + * @param a \ref AppletApplication + */ +Result ApplicationRequestExit(AppletApplication *a); + +/** + * @brief Terminate the Application. + * @param a \ref AppletApplication + */ +Result ApplicationTerminate(AppletApplication *a); + +/** + * @brief Waits for the Application to exit. + * @param a \ref AppletApplication + */ +void ApplicationJoin(AppletApplication *a); + +/** + * @brief Waits on the Application StateChangedEvent with timeout=0, and returns whether it was successful. + * @param a \ref AppletApplication + */ +bool ApplicationCheckFinished(AppletApplication *a); + +/** + * @brief Gets the \ref AppletApplicationExitReason set by \ref appletApplicationJoin. + * @param a \ref AppletApplication + */ +AppletApplicationExitReason ApplicationGetExitReason(AppletApplication *a); + +/** + * @brief RequestForApplicationToGetForeground. + * @param a \ref AppletApplication + */ +Result ApplicationRequestForApplicationToGetForeground(AppletApplication *a); + +/** + * @brief TerminateAllLibraryApplets which were created by the Application. + */ +Result ApplicationTerminateAllLibraryApplets(AppletApplication *a); + +/** + * @brief AreAnyLibraryAppletsLeft which were created by the Application. + * @param a \ref AppletApplication + * @param[out] out Output flag. + */ +Result ApplicationAreAnyLibraryAppletsLeft(AppletApplication *a, bool *out); + +/** + * @brief Calls the same func as \ref appletHolderRequestExitOrTerminate with the output IAppletAccessor from the GetCurrentLibraryApplet cmd. + * @param a \ref AppletApplication + * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. + */ +Result ApplicationRequestExitLibraryAppletOrTerminate(AppletApplication *a, u64 timeout); + +/** + * @brief Gets the ApplicationId for the Application. + * @param a \ref AppletApplication + * @param[out] application_id Output ApplicationId. + */ +Result ApplicationGetApplicationId(AppletApplication *a, u64 *application_id); + +/** + * @brief Pushes a LaunchParameter AppletStorage to the Application. + * @note This uses \ref appletStorageClose automatically. + * @param a \ref AppletApplication + * @param[in] kind \ref AppletLaunchParameterKind + * @param[in] s Input storage. + */ +Result ApplicationPushLaunchParameter(AppletApplication *a, AppletLaunchParameterKind kind, AppletStorage* s); + +/** + * @brief Gets the \ref NacpStruct for the Application. + * @note Not usable when the \ref AppletApplication is for an AppletType_SystemApplication. + * @param a \ref AppletApplication + * @param[out] nacp \ref NacpStruct + */ +Result ApplicationGetApplicationControlProperty(AppletApplication *a, NacpStruct *nacp); + +/** + * @brief Gets the \ref AppletApplicationLaunchProperty for the Application. + * @note Only available on [2.0.0+]. Not usable when the \ref AppletApplication is for an AppletType_SystemApplication. + * @param a \ref AppletApplication + * @param[out] out \ref AppletApplicationLaunchProperty + */ +Result ApplicationGetApplicationLaunchProperty(AppletApplication *a, AppletApplicationLaunchProperty *out); + +/** + * @brief Gets the \ref AppletApplicationLaunchRequestInfo for the Application. + * @note Only available on [6.0.0+]. + * @param a \ref AppletApplication + * @param[out] out \ref AppletApplicationLaunchRequestInfo + */ +Result ApplicationGetApplicationLaunchRequestInfo(AppletApplication *a, AppletApplicationLaunchRequestInfo *out); + +/** + * @brief SetUsers for the Application. + * @note Only available on [6.0.0+]. + * @param a \ref AppletApplication + * @param[in] uids Input array of \ref AccountUid. + * @param[in] count Size of the uids array in entries, must be <=ACC_USER_LIST_SIZE. + * @param[in] flag When this flag is true, this just clears the users_available state flag to 0 and returns. + */ +Result ApplicationSetUsers(AppletApplication *a, const AccountUid *uids, s32 count, bool flag); + +/** + * @brief CheckRightsEnvironmentAvailable. + * @note Only available on [6.0.0+]. + * @param a \ref AppletApplication + * @param[out] out Output flag. + */ +Result ApplicationCheckRightsEnvironmentAvailable(AppletApplication *a, bool *out); + +/** + * @brief GetNsRightsEnvironmentHandle. + * @note Only available on [6.0.0+]. + * @param a \ref AppletApplication + * @param[out] handle Output NsRightsEnvironmentHandle. + */ +Result ApplicationGetNsRightsEnvironmentHandle(AppletApplication *a, u64 *handle); + +/** + * @brief Gets an array of userIds for the Application DesirableUids. + * @note Only available on [6.0.0+]. + * @note qlaunch only uses 1 userId with this. + * @param a \ref AppletApplication + * @param[out] uids Output array of \ref AccountUid. + * @param[in] count Size of the uids array in entries, must be at least the size stored in state. + * @param[out] total_out Total output entries. + */ +Result ApplicationGetDesirableUids(AppletApplication *a, AccountUid *uids, s32 count, s32 *total_out); + +/** + * @brief ReportApplicationExitTimeout. + * @note Only available on [6.0.0+]. + * @param a \ref AppletApplication + */ +Result ApplicationReportApplicationExitTimeout(AppletApplication *a); + +/** + * @brief Sets the \ref AppletApplicationAttribute for the Application. + * @note Only available on [8.0.0+]. + * @param a \ref AppletApplication + * @param[in] attr \ref AppletApplicationAttribute + */ +Result ApplicationSetApplicationAttribute(AppletApplication *a, const AppletApplicationAttribute *attr); + +/** + * @brief Gets whether the savedata specified by the input ApplicationId is accessible. + * @note Only available on [8.0.0+]. + * @param a \ref AppletApplication + * @param[in] application_id ApplicationId for the savedata. + * @param[out] out Output flag. + */ +Result ApplicationHasSaveDataAccessPermission(AppletApplication *a, u64 application_id, bool *out); + +/** + * @brief Creates a storage using the specified input then pushes it to the FriendInvitation StorageChannel. + * @note The system will clear the StorageChannel before pushing the storage. + * @note Only available on [9.0.0+]. + * @param a \ref AppletApplication + * @param[in] uid \ref AccountUid + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + */ +Result ApplicationPushToFriendInvitationStorageChannel(AppletApplication *a, AccountUid uid, const void* buffer, u64 size); + +/** + * @brief Creates a storage using the specified input then pushes it to the Notification StorageChannel. + * @note The system will clear the StorageChannel before pushing the storage. + * @note Only available on [9.0.0+]. + * @param a \ref AppletApplication + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + */ +Result ApplicationPushToNotificationStorageChannel(AppletApplication *a, const void* buffer, u64 size); + +/** + * @brief RequestApplicationSoftReset + * @note Only available on [10.0.0+]. + * @param a \ref AppletApplication + */ +Result ApplicationRequestApplicationSoftReset(AppletApplication *a); + +/** + * @brief RestartApplicationTimer + * @note Only available on [10.0.0+]. + * @param a \ref AppletApplication + */ +Result ApplicationRestartApplicationTimer(AppletApplication *a); + +/** + * @brief Pops a storage from current-LibraryApplet input. + * @note Only available with AppletType_LibraryApplet. + * @param[out] s Storage object. + */ +Result PopInData(AppletStorage *s); + +/** + * @brief Pushes a storage for current-LibraryApplet output. + * @note Only available with AppletType_LibraryApplet. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result PushOutData(AppletStorage *s); + +/** + * @brief Pops a storage from current-LibraryApplet Interactive input. + * @note Only available with AppletType_LibraryApplet. + * @param[out] s Storage object. + */ +Result PopInteractiveInData(AppletStorage *s); + +/** + * @brief Pushes a storage for current-LibraryApplet Interactive output. + * @note Only available with AppletType_LibraryApplet. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result PushInteractiveOutData(AppletStorage *s); + +/** + * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopInData where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. + * @note Only available with AppletType_LibraryApplet. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetPopInDataEvent(Event *out_event); + +/** + * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopInteractiveInData where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. + * @note Only available with AppletType_LibraryApplet. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetPopInteractiveInDataEvent(Event *out_event); + +/** + * @brief Gets the \ref LibAppletInfo for the current LibraryApplet. + * @note Only available with AppletType_LibraryApplet. + * @param[out] info \ref LibAppletInfo + */ +Result GetLibraryAppletInfo(LibAppletInfo *info); + +/** + * @brief Gets the \ref AppletIdentityInfo for the MainApplet. + * @note Only available with AppletType_LibraryApplet. + * @param[out] info \ref AppletIdentityInfo + */ +Result GetMainAppletIdentityInfo(AppletIdentityInfo *info); + +/** + * @brief CanUseApplicationCore + * @note Only available with AppletType_LibraryApplet. + * @param[out] out Output flag. + */ +Result CanUseApplicationCore(bool *out); + +/** + * @brief Gets the \ref AppletIdentityInfo for the CallerApplet. + * @note Only available with AppletType_LibraryApplet. + * @param[out] info \ref AppletIdentityInfo + */ +Result GetCallerAppletIdentityInfo(AppletIdentityInfo *info); + +/** + * @brief Gets the \ref NacpStruct for the MainApplet. + * @note Only available with AppletType_LibraryApplet on [2.0.0+]. + * @param[out] nacp \ref NacpStruct + */ +Result GetMainAppletApplicationControlProperty(NacpStruct *nacp); + +/** + * @brief Gets the NcmStorageId for the MainApplet. + * @note Only available with AppletType_LibraryApplet on [2.0.0+]. + * @param[out] storageId \ref NcmStorageId + */ +Result GetMainAppletStorageId(NcmStorageId *storageId); + +/** + * @brief Gets an array of \ref AppletIdentityInfo for the CallerStack. + * @note Only available with AppletType_LibraryApplet on [3.0.0+]. + * @param[out] stack Output array of \ref AppletIdentityInfo. + * @param[in] count Size of the stack array. + * @param[out] total_out Total output entries. + */ +Result GetCallerAppletIdentityInfoStack(AppletIdentityInfo *stack, s32 count, s32 *total_out); + +/** + * @brief Gets the \ref AppletIdentityInfo for the NextReturnDestinationApplet. + * @note Only available with AppletType_LibraryApplet on [4.0.0+]. + * @param[out] info \ref AppletIdentityInfo + */ +Result GetNextReturnDestinationAppletIdentityInfo(AppletIdentityInfo *info); + +/** + * @brief Gets the DesirableKeyboardLayout previously set by \ref appletSetDesirableKeyboardLayout. An error is returned when it's not set. + * @note Only available with AppletType_LibraryApplet on [4.0.0+]. + * @param[out] layout Output \ref SetKeyboardLayout. + */ +Result GetDesirableKeyboardLayout(SetKeyboardLayout *layout); + +/** + * @brief Pops a storage from current-LibraryApplet Extra input. + * @note Only available with AppletType_LibraryApplet. + * @param[out] s Storage object. + */ +Result PopExtraStorage(AppletStorage *s); + +/** + * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopExtraStorage where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. + * @note Only available with AppletType_LibraryApplet. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetPopExtraStorageEvent(Event *out_event); + +/** + * @brief Unpop a storage for current-LibraryApplet input. + * @note Only available with AppletType_LibraryApplet. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result UnpopInData(AppletStorage *s); + +/** + * @brief Unpop a storage for current-LibraryApplet Extra input. + * @note Only available with AppletType_LibraryApplet. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result UnpopExtraStorage(AppletStorage *s); + +/** + * @brief Gets the IndirectLayerProducerHandle. + * @note Only available with AppletType_LibraryApplet on [2.0.0+]. + * @param[out] out Output IndirectLayerProducerHandle. + */ +Result GetIndirectLayerProducerHandle(u64 *out); + +/** + * @brief Gets the DesiredLanguage for the MainApplet. + * @note Only available with AppletType_LibraryApplet on [4.0.0+]. + * @param[out] LanguageCode Output LanguageCode, see set.h. + */ +Result GetMainAppletApplicationDesiredLanguage(u64 *LanguageCode); + +/** + * @brief Gets the ApplicationId for the currently running Application. + * @note Only available with AppletType_LibraryApplet on [8.0.0+]. + * @param[out] application_id Output ApplicationId, 0 when no Application is running. + */ +Result GetCurrentApplicationId(u64 *application_id); + +/** + * @brief Exits the current applet. Same as \ref appletHolderRequestExit except this is for the current applet. + * @note Only available with AppletType_LibraryApplet on [6.0.0+]. + */ +Result RequestExitToSelf(void); + +/** + * @brief CreateGameMovieTrimmer. Do not use this directly, use \ref grcTrimGameMovie instead. + * @note Only available with AppletType_LibraryApplet on [4.0.0+]. + * @note See also \ref appletReserveResourceForMovieOperation and \ref appletUnreserveResourceForMovieOperation. + * @param[out] srv_out Output Service for grc IGameMovieTrimmer. + * @param[in] tmem TransferMemory + */ +Result CreateGameMovieTrimmer(Service* srv_out, TransferMemory *tmem); + +/** + * @brief ReserveResourceForMovieOperation. Must be used at some point prior to \ref appletCreateGameMovieTrimmer. + * @note Only available with AppletType_LibraryApplet on [5.0.0+]. + */ +Result ReserveResourceForMovieOperation(void); + +/** + * @brief UnreserveResourceForMovieOperation. Must be used at some point after all finished with GameMovieTrimmer usage (\ref appletCreateGameMovieTrimmer). + * @note Only available with AppletType_LibraryApplet on [5.0.0+]. + */ +Result UnreserveResourceForMovieOperation(void); + +/** + * @brief Gets an array of userIds for the MainApplet AvailableUsers. + * @note Only available with AppletType_LibraryApplet on [6.0.0+]. + * @param[out] uids Output array of \ref AccountUid. + * @param[in] count Size of the uids array in entries, must be at least ACC_USER_LIST_SIZE. + * @param[out] flag When true, this indicates that no users are available. + * @param[out] total_out Total output entries. This is -1 when flag is true. + */ +Result GetMainAppletAvailableUsers(AccountUid *uids, s32 count, bool *flag, s32 *total_out); + +/** + * @brief SetApplicationMemoryReservation + * @note Only available with AppletType_LibraryApplet on [10.0.0+]. + * @note An Application must be currently running. + * @param[in] val Input value. + */ +Result SetApplicationMemoryReservation(u64 val); + +/** + * @brief ShouldSetGpuTimeSliceManually + * @note Only available with AppletType_LibraryApplet on [10.0.0+]. + * @param[out] out Output flag. + */ +Result ShouldSetGpuTimeSliceManually(bool *out); + +/** + * @brief Stops forwarding the input to the foreground app. + * @note Only available with AppletType_OverlayApplet. + * @note You have to call this to receive inputs through the hid service when running as the overlay applet. + */ +Result BeginToWatchShortHomeButtonMessage(void); + +/** + * @brief Forwards input to the foreground app. + * @note Only available with AppletType_OverlayApplet. + * @note After calling this the overlay applet won't receive any input until \ref appletBeginToWatchShortHomeButtonMessage is called again. + */ +Result EndToWatchShortHomeButtonMessage(void); + +/** + * @brief Gets the ApplicationId for displaying the logo screen during application launch. + * @note Only available with AppletType_OverlayApplet. + * @param[out] application_id Output ApplicationId, 0 when no application is running. + */ +Result GetApplicationIdForLogo(u64 *application_id); + +/** + * @brief Sets the GpuTimeSliceBoost. + * @note Only available with AppletType_OverlayApplet. + * @param[in] val Input value. + */ +Result SetGpuTimeSliceBoost(u64 val); + +/** + * @brief Sets AutoSleepTimeAndDimmingTimeEnabled. + * @note Only available with AppletType_OverlayApplet on [2.0.0+]. + * @param[in] flag Flag + */ +Result SetAutoSleepTimeAndDimmingTimeEnabled(bool flag); + +/** + * @brief TerminateApplicationAndSetReason + * @note Only available with AppletType_OverlayApplet on [2.0.0+]. + * @param[in] reason Result reason. + */ +Result TerminateApplicationAndSetReason(Result reason); + +/** + * @brief Sets ScreenShotPermissionGlobally. + * @note Only available with AppletType_OverlayApplet on [3.0.0+]. + * @param[in] flag Flag + */ +Result SetScreenShotPermissionGlobally(bool flag); + +/** + * @brief Start the system-shutdown sequence. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_OverlayApplet on [6.0.0+]. + */ +Result StartShutdownSequenceForOverlay(void); + +/** + * @brief Start the system-reboot sequence. This will enter an infinite-sleep-loop on success. + * @note Only available with AppletType_OverlayApplet on [6.0.0+]. + */ +Result StartRebootSequenceForOverlay(void); + +/** + * @brief SetHealthWarningShowingState + * @note Only available with AppletType_OverlayApplet on [9.0.0+]. + * @param[in] flag Flag + */ +Result SetHealthWarningShowingState(bool flag); + +/** + * @brief IsHealthWarningRequired + * @note Only available with AppletType_OverlayApplet on [10.0.0+]. + * @param[out] out Output flag. + */ +Result IsHealthWarningRequired(bool *out); + +/** + * @brief Enables HID input for the OverlayApplet, without disabling input for the foreground applet. Generally \ref appletBeginToWatchShortHomeButtonMessage / appletEndToWatchShortHomeButtonMessage should be used instead. + * @note Only available with AppletType_OverlayApplet on [5.0.0+]. + */ +Result BeginToObserveHidInputForDevelop(void); + +/** + * @brief Reads the ThemeStorage for the current applet. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+]. + * @note offset(+size) must be <=0x400. + * @param[out] buffer Output buffer data. + * @param[in] size Size to read. + * @param[in] offset Offset within the ThemeStorage. + * @param[out] transfer_size Actual read size. + */ +Result ReadThemeStorage(void* buffer, size_t size, u64 offset, u64 *transfer_size); + +/** + * @brief Writes the ThemeStorage for the current applet. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+]. + * @note offset(+size) must be <=0x400. + * @param[in] buffer Input buffer data. + * @param[in] size Size to write. + * @param[in] offset Offset within the ThemeStorage. + */ +Result WriteThemeStorage(const void* buffer, size_t size, u64 offset); + +/** + * @brief This is similar to \ref appletPushToAppletBoundChannelForDebug (no DebugMode check), except the used channel is loaded from elsewhere and must be in the range 31-32. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [9.0.0+]. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + */ +Result PushToAppletBoundChannel(AppletStorage *s); + +/** + * @brief This is similar to \ref appletTryPopFromAppletBoundChannelForDebug (no DebugMode check), except the used channel is loaded from elsewhere and must be in the range 31-32. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [9.0.0+]. + * @param[out] s Storage object. + */ +Result TryPopFromAppletBoundChannel(AppletStorage *s); + +/** + * @brief Gets the DisplayLogicalResolution. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. + * @param[out] width Output width. + * @param[out] height Output height. + */ +Result GetDisplayLogicalResolution(s32 *width, s32 *height); + +/** + * @brief Sets the DisplayMagnification. This is essentially layer image crop, for everything non-Overlay. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. + * @note x and width are multiplied with the same width value returned by \ref appletGetDisplayLogicalResolution, so these should be in the range 0.0f-1.0f. Likewise for y and height, except these are multipled with the height value. + * @param[in] x X position. + * @param[in] y Y position. + * @param[in] width Width. + * @param[in] height Height. + */ +Result SetDisplayMagnification(float x, float y, float width, float height); + +/** + * @brief Sets whether HomeButtonDoubleClick is enabled. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. + * @param[in] flag Flag + */ +Result SetHomeButtonDoubleClickEnabled(bool flag); + +/** + * @brief Gets whether HomeButtonDoubleClick is enabled. + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. + * @param[out] out Output flag. + */ +Result GetHomeButtonDoubleClickEnabled(bool *out); + +/** + * @brief IsHomeButtonShortPressedBlocked + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [10.0.0+]. + * @param[out] out Output flag. + */ +Result IsHomeButtonShortPressedBlocked(bool *out); + +/** + * @brief IsVrModeCurtainRequired + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [11.0.0+]. + * @param[out] out Output flag. + */ +Result IsVrModeCurtainRequired(bool *out); + +/** + * @brief SetCpuBoostRequestPriority + * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [11.0.0+]. + * @param[in] priority Priority + */ +Result SetCpuBoostRequestPriority(s32 priority); + +/** + * @brief Open an \ref AppletApplication for the currently running Application. + * @note Should not be used when no Application is running. + * @note Only available on [1.0.0-9.2.0]. + * @param[out] a \ref AppletApplication + */ +Result OpenMainApplication(AppletApplication *a); + +/** + * @brief Perform SystemButtonPressing with the specified \ref AppletSystemButtonType. + * @param[in] type \ref AppletSystemButtonType + */ +Result PerformSystemButtonPressing(AppletSystemButtonType type); + +/** + * @brief InvalidateTransitionLayer. + */ +Result InvalidateTransitionLayer(void); + +/** + * @brief Requests to launch the specified Application, with the specified users. + * @note Only available on [6.0.0+]. + * @param[in] application_id ApplicationId. + * @param[in] uids Input array of \ref AccountUid. + * @param[in] total_uids Total input uids, must be <=ACC_USER_LIST_SIZE. + * @param[in] flag Whether to use the specified buffer to create a storage which will be pushed for ::AppletLaunchParameterKind_UserChannel. + * @param[in] buffer Buffer containing the above storage data. + * @param[in] size Size of the storage buffer. + */ +Result RequestLaunchApplicationWithUserAndArgumentForDebug(u64 application_id, const AccountUid *uids, s32 total_uids, bool flag, const void* buffer, size_t size); + +/** + * @brief Gets the \ref AppletResourceUsageInfo. + * @note Only available on [6.0.0+]. + * @param[out] info \ref AppletResourceUsageInfo + */ +Result GetAppletResourceUsageInfo(AppletResourceUsageInfo *info); + +/** + * @brief The channel must match the value already stored in state when the state value is non-zero, otherwise an error is returned. When the state value is 0, the channel is written into state. Then the input storage is pushed to the StorageChannel. + * @note Only available on [9.0.0+]. DebugMode must be enabled. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + * @param[in] channel Channel. + */ +Result PushToAppletBoundChannelForDebug(AppletStorage *s, s32 channel); + +/** + * @brief The channel must not be 0 and must match the value previously saved by \ref appletPushToAppletBoundChannelForDebug, otherwise errors are returned. Then the output storage is popped from the StorageChannel. + * @note Only available on [9.0.0+]. DebugMode must be enabled. + * @param[out] s Storage object. + * @param[in] channel Channel. + */ +Result TryPopFromAppletBoundChannelForDebug(AppletStorage *s, s32 channel); + +/** + * @brief Clears a StorageChannel, pushes the input storage there, and writes the ApplicationId into state. + * @note Only available on [9.0.0+]. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + * @param[in] application_id ApplicationId + */ +Result AlarmSettingNotificationEnableAppEventReserve(AppletStorage *s, u64 application_id); + +/** + * @brief Clears the StorageChannel/saved-ApplicationId used by \ref appletAlarmSettingNotificationEnableAppEventReserve. + * @note Only available on [9.0.0+]. + */ +Result AlarmSettingNotificationDisableAppEventReserve(void); + +/** + * @brief Same as \ref appletApplicationPushToNotificationStorageChannel except this uses the MainApplication. + * @note Only available on [9.0.0+]. + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + */ +Result AlarmSettingNotificationPushAppEventNotify(const void* buffer, u64 size); + +/** + * @brief Clears a StorageChannel, pushes the input storage there, and writes the ApplicationId into state. + * @note Only available on [9.0.0+]. + * @note This uses \ref appletStorageClose automatically. + * @param[in] s Storage object. + * @param[in] application_id ApplicationId + */ +Result FriendInvitationSetApplicationParameter(AppletStorage *s, u64 application_id); + +/** + * @brief Clears the StorageChannel/saved-ApplicationId used by \ref appletFriendInvitationSetApplicationParameter. + * @note Only available on [9.0.0+]. + */ +Result FriendInvitationClearApplicationParameter(void); + +/** + * @brief Same as \ref appletApplicationPushToFriendInvitationStorageChannel except this uses the MainApplication. + * @note Only available on [9.0.0+]. + * @param[in] uid \ref AccountUid + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + */ +Result FriendInvitationPushApplicationParameter(AccountUid uid, const void* buffer, u64 size); + +/** + * @brief Creates a GeneralStorage with the specified Id and size. + * @note Only available on [18.0.0+]. + * @param[in] id Id value, high-byte must be 0. + * @param[in] size Storage size. + */ +Result CreateGeneralStorageForDebug(u64 id, u64 size); + +/** + * @brief Reads data from the buffer previously allocated by \ref appletCreateGeneralStorageForDebug. + * @note Only available on [18.0.0+]. + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size. + * @param[in] id Id value which was previously used with \ref appletCreateGeneralStorageForDebug, high-byte must be 0. + * @param[in] offset Offset in the storage. + * @param[out] out_size Output size. + */ +Result ReadGeneralStorageForDebug(void* buffer, size_t size, u64 id, u64 offset, u64 *out_size); + +/** + * @brief Writes data to the buffer previously allocated by \ref appletCreateGeneralStorageForDebug. + * @note Only available on [18.0.0+]. + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + * @param[in] id Id value which was previously used with \ref appletCreateGeneralStorageForDebug, high-byte must be 0. + * @param[in] offset Offset in the storage. + */ +Result WriteGeneralStorageForDebug(const void* buffer, size_t size, u64 id, u64 offset); + +/** + * @brief SetTerminateResult + * @note Only available with AppletType_*Application. Or with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [9.0.0+]. + * @param[in] res Result + */ +Result SetTerminateResult(Result res); + +/** + * @brief Gets the LaunchStorageInfo. + * @note Only available with AppletType_*Application on [2.0.0+], or with AppletType_LibraryApplet on [9.0.0+]. + * @param[out] app_storageId Same as AppletApplicationLaunchProperty::app_storageId. + * @param[out] update_storageId Same as AppletApplicationLaunchProperty::update_storageId. + */ +Result GetLaunchStorageInfoForDebug(NcmStorageId *app_storageId, NcmStorageId *update_storageId); + +/** + * @brief Gets an Event which is signaled for GpuErrorDetected. + * @note Only available with AppletType_*Application on [8.0.0+], or with AppletType_LibraryApplet on [9.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @note Official sw waits on this Event from a seperate thread, triggering an abort when it's signaled. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetGpuErrorDetectedSystemEvent(Event *out_event); + +/** + * @brief Sets HandlingHomeButtonShortPressedEnabled. + * @note Only available with AppletType_OverlayApplet on [8.0.0+]. Or with non-AppletType_OverlayApplet on [9.1.0+]. + * @param[in] flag Flag + */ +Result SetHandlingHomeButtonShortPressedEnabled(bool flag); + +/** + * @brief Gets the cached \ref AppletInfo loaded during \ref appletInitialize. This will return NULL when the info is not initialized, due to not running as AppletType_LibraryApplet, or when any of the used cmds fail. + * @note Only available with AppletType_LibraryApplet. + */ +AppletInfo * GetAppletInfo(void); + +/** + * @brief Gets the event associated with notification messages. + */ +Event * GetMessageEvent(void); + +/** + * @brief Gets a notification message, see \ref AppletMessage. + */ +Result GetMessage(u32 *msg); + +/** + * @brief Processes the current applet status using the specified msg. + * @param msg Notification message, normally from \ref appletGetMessage. + * @return Whether the application should continue running. + */ +bool ProcessMessage(u32 msg); + +/** + * @brief Processes the current applet status. Generally used within a main loop. + * @note Uses \ref appletGetMessage and \ref appletProcessMessage internally. + * @return Whether the application should continue running. + */ +bool MainLoop(void); + +/** + * @brief Sets up an applet status hook. + * @param cookie Hook cookie to use. + * @param callback Function to call when applet's status changes. + * @param param User-defined parameter to pass to the callback. + */ +void Hook(AppletHookCookie* cookie, AppletHookFn callback, void* param); + +/** + * @brief Removes an applet status hook. + * @param cookie Hook cookie to remove. + */ +void Unhook(AppletHookCookie* cookie); + +/// These return state which is updated by appletMainLoop() when notifications are received. +AppletOperationMode GetOperationMode(void); + +ApmPerformanceMode GetPerformanceMode(void); + +AppletFocusState GetFocusState(void); + +/** + * @brief Sets the current \ref AppletFocusHandlingMode. + * @note Should only be called with AppletType_Application. + */ +Result SetFocusHandlingMode(AppletFocusHandlingMode mode); + +} // namespace applet + +/// @brief C++ wrappers for the `arm` API. +/// @details Wraps: switch/arm/cache.h, switch/arm/counter.h, switch/arm/tls.h. +namespace arm { + +/** + * @brief Performs a data cache flush on the specified buffer. + * @param addr Address of the buffer. + * @param size Size of the buffer, in bytes. + * @remarks Cache flush is defined as Clean + Invalidate. + * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). + */ +void DCacheFlush(void* addr, size_t size); + +/** + * @brief Performs a data cache clean on the specified buffer. + * @param addr Address of the buffer. + * @param size Size of the buffer, in bytes. + * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). + */ +void DCacheClean(void* addr, size_t size); + +/** + * @brief Performs an instruction cache invalidation clean on the specified buffer. + * @param addr Address of the buffer. + * @param size Size of the buffer, in bytes. + * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). + */ +void ICacheInvalidate(void* addr, size_t size); + +/** + * @brief Performs a data cache zeroing operation on the specified buffer. + * @param addr Address of the buffer. + * @param size Size of the buffer, in bytes. + * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). + */ +void DCacheZero(void* addr, size_t size); + +/** + * @brief Gets the current system tick. + * @return The current system tick. + */ +u64 GetSystemTick(void); + +/** + * @brief Gets the system counter-timer frequency + * @return The system counter-timer frequency, in Hz. + */ +u64 GetSystemTickFreq(void); + +/** + * @brief Converts from nanoseconds to CPU ticks unit. + * @param ns Time in nanoseconds. + * @return Time in CPU ticks. + */ +u64 NsToTicks(u64 ns); + +/** + * @brief Converts from CPU ticks unit to nanoseconds. + * @param tick Time in ticks. + * @return Time in nanoseconds. + */ +u64 TicksToNs(u64 tick); + +/** + * @brief Gets the thread local storage buffer. + * @return The thread local storage buffer. + */ +void* GetTls(void); + +} // namespace arm + +/// @brief C++ wrappers for the `async` API. +/// @details Wraps: switch/services/async.h. +namespace async { + +/// AsyncResult +using ::AsyncResult; +/// AsyncValue +using ::AsyncValue; + +/** + * @brief Close a \ref AsyncValue. + * @note When the object is initialized, this uses \ref asyncValueCancel then \ref asyncValueWait with timeout=UINT64_MAX. + * @param a \ref AsyncValue + */ +void ValueClose(AsyncValue *a); + +/** + * @brief Waits for the async operation to finish using the specified timeout. + * @param a \ref AsyncValue + * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. + */ +Result ValueWait(AsyncValue *a, u64 timeout); + +/** + * @brief Gets the value size. + * @param a \ref AsyncValue + * @param[out] size Output size. + */ +Result ValueGetSize(AsyncValue *a, u64 *size); + +/** + * @brief Gets the value. + * @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX. + * @param a \ref AsyncValue + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size. + */ +Result ValueGet(AsyncValue *a, void* buffer, size_t size); + +/** + * @brief Cancels the async operation. + * @note Used automatically by \ref asyncValueClose. + * @param a \ref AsyncValue + */ +Result ValueCancel(AsyncValue *a); + +/** + * @brief Gets the \ref ErrorContext. + * @note Only available on [4.0.0+]. + * @param a \ref AsyncValue + * @param[out] context \ref ErrorContext + */ +Result ValueGetErrorContext(AsyncValue *a, ErrorContext *context); + +/** + * @brief Close a \ref AsyncResult. + * @note When the object is initialized, this uses \ref asyncResultCancel then \ref asyncResultWait with timeout=UINT64_MAX. + * @param a \ref AsyncResult + */ +void ResultClose(AsyncResult *a); + +/** + * @brief Waits for the async operation to finish using the specified timeout. + * @param a \ref AsyncResult + * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. + */ +Result ResultWait(AsyncResult *a, u64 timeout); + +/** + * @brief Gets the Result. + * @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX. + * @param a \ref AsyncResult + */ +Result ResultGet(AsyncResult *a); + +/** + * @brief Cancels the async operation. + * @note Used automatically by \ref asyncResultClose. + * @param a \ref AsyncResult + */ +Result ResultCancel(AsyncResult *a); + +/** + * @brief Gets the \ref ErrorContext. + * @note Only available on [4.0.0+]. + * @param a \ref AsyncResult + * @param[out] context \ref ErrorContext + */ +Result ResultGetErrorContext(AsyncResult *a, ErrorContext *context); + +} // namespace async + +/// @brief C++ wrappers for the `auda` API. +/// @details Wraps: switch/services/aud.h. +namespace auda { + +/// Initialize aud:a. Only available on [11.0.0+]. +Result Initialize(void); + +/// Exit aud:a. +void Exit(void); + +/// Gets the Service for aud:a. +Service* GetServiceSession(void); + +Result RequestSuspendAudio(u64 pid, u64 delay); + +Result RequestResumeAudio(u64 pid, u64 delay); + +Result GetAudioOutputProcessMasterVolume(u64 pid, float* volume_out); + +Result SetAudioOutputProcessMasterVolume(u64 pid, u64 delay, float volume); + +Result GetAudioInputProcessMasterVolume(u64 pid, float* volume_out); + +Result SetAudioInputProcessMasterVolume(u64 pid, u64 delay, float volume); + +Result GetAudioOutputProcessRecordVolume(u64 pid, float* volume_out); + +Result SetAudioOutputProcessRecordVolume(u64 pid, u64 delay, float volume); + +} // namespace auda + +/// @brief C++ wrappers for the `audctl` API. +/// @details Wraps: switch/services/audctl.h. +namespace audctl { + +using ::AudioForceMutePolicy; +using ::AudioHeadphoneOutputLevelMode; +using ::AudioOutputMode; +using ::AudioTarget; + +Result Initialize(void); + +void Exit(void); + +Service* GetServiceSession(void); + +Result GetTargetVolume(s32* volume_out, AudioTarget target); + +Result SetTargetVolume(AudioTarget target, s32 volume); + +Result GetTargetVolumeMin(s32* volume_out); + +Result GetTargetVolumeMax(s32* volume_out); + +Result IsTargetMute(bool* mute_out, AudioTarget target); + +Result SetTargetMute(AudioTarget target, bool mute); + +Result IsTargetConnected(bool* connected_out, AudioTarget target); + +///< [1.0.0-17.0.1] +Result SetDefaultTarget(AudioTarget target, u64 fade_in_ns, u64 fade_out_ns); + +Result GetDefaultTarget(AudioTarget* target_out); + +Result GetAudioOutputMode(AudioOutputMode* mode_out, AudioTarget target); + +Result SetAudioOutputMode(AudioTarget target, AudioOutputMode mode); + +Result SetForceMutePolicy(AudioForceMutePolicy policy); + +///< [1.0.0-13.2.1] +Result GetForceMutePolicy(AudioForceMutePolicy* policy_out); + +///< [1.0.0-13.2.1] +Result GetOutputModeSetting(AudioOutputMode* mode_out, AudioTarget target); + +Result SetOutputModeSetting(AudioTarget target, AudioOutputMode mode); + +Result SetOutputTarget(AudioTarget target); + +Result SetInputTargetForceEnabled(bool enable); + +Result SetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode mode); + +///< [3.0.0+] +Result GetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode* mode_out); + +///< [3.0.0+] +Result AcquireAudioVolumeUpdateEventForPlayReport(Event* event_out); + +///< [3.0.0-13.2.1] +Result AcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_out); + +///< [3.0.0-13.2.1] +Result GetAudioOutputTargetForPlayReport(AudioTarget* target_out); + +///< [3.0.0+] +Result NotifyHeadphoneVolumeWarningDisplayedEvent(void); + +///< [3.0.0+] +Result SetSystemOutputMasterVolume(float volume); + +///< [4.0.0+] +Result GetSystemOutputMasterVolume(float* volume_out); + +///< [4.0.0+] +Result GetActiveOutputTarget(AudioTarget* target); + +} // namespace audctl + +/// @brief C++ wrappers for the `audd` API. +/// @details Wraps: switch/services/aud.h. +namespace audd { + +/// Initialize aud:d. Only available on [11.0.0+]. +Result Initialize(void); + +/// Exit aud:d. +void Exit(void); + +/// Gets the Service for aud:d. +Service* GetServiceSession(void); + +Result RequestSuspendAudioForDebug(u64 pid, u64 delay); + +Result RequestResumeAudioForDebug(u64 pid, u64 delay); + +} // namespace audd + +/// @brief C++ wrappers for the `auddev` API. +/// @details Wraps: switch/services/auddev.h. +namespace auddev { + +/// Initialize IAudioDevice. +Result Initialize(void); + +/// Exit IAudioDevice. +void Exit(void); + +/// Gets the Service object for IAudioDevice. +Service* GetServiceSession(void); + +Result ListAudioDeviceName(AudioDeviceName *DeviceNames, s32 max_names, s32 *total_names); + +Result SetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float volume); + +Result GetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float *volume); + +Result GetActiveAudioDeviceName(AudioDeviceName *DeviceName); + +} // namespace auddev + +/// @brief C++ wrappers for the `audin` API. +/// @details Wraps: switch/services/audin.h. +namespace audin { + +/// Audio input buffer format +using ::AudioInBuffer; +using ::AudioInState; + +/// Initialize audin. +Result Initialize(void); + +/// Exit audin. +void Exit(void); + +/// Gets the Service object for the actual audin service session. +Service* GetServiceSession(void); + +/// Gets the Service object for IAudioIn. +Service* GetServiceSession_AudioIn(void); + +Result ListAudioIns(char *DeviceNames, s32 count, u32 *DeviceNamesCount); + +Result OpenAudioIn(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioInState *State); + +Result GetAudioInState(AudioInState *State); + +Result StartAudioIn(void); + +Result StopAudioIn(void); + +/// Submits an \ref AudioInBuffer for capturing. +Result AppendAudioInBuffer(AudioInBuffer *Buffer); + +Result GetReleasedAudioInBuffer(AudioInBuffer **Buffer, u32 *ReleasedBuffersCount); + +Result ContainsAudioInBuffer(AudioInBuffer *Buffer, bool *ContainsBuffer); + +/** + * @brief Submits an audio sample data buffer for capturing and waits for it to finish capturing. + * @brief Uses \ref audinAppendAudioInBuffer and \ref audinWaitCaptureFinish internally. + * @param source AudioInBuffer containing the buffer to hold the captured sample data. + * @param released AudioInBuffer to receive the captured buffer after being released. + */ +Result CaptureBuffer(AudioInBuffer *source, AudioInBuffer **released); + +/** + * @brief Waits for audio capture to finish. + * @param released AudioInBuffer to receive the first captured buffer after being released. + * @param released_count Pointer to receive the number of captured buffers. + * @param timeout Timeout value, use UINT64_MAX to wait until all finished. + */ +Result WaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout); + +/// These return the state associated with the currently active audio input device. +u32 GetSampleRate(void); + +///< Supported sample rate (48000Hz). +u32 GetChannelCount(void); + +///< Supported channel count (2 channels). +PcmFormat GetPcmFormat(void); + +///< Supported PCM format (Int16). +AudioInState GetDeviceState(void); + +} // namespace audin + +/// @brief C++ wrappers for the `audout` API. +/// @details Wraps: switch/services/audout.h. +namespace audout { + +/// Audio output buffer format +using ::AudioOutBuffer; +using ::AudioOutState; + +/// Initialize audout. +Result Initialize(void); + +/// Exit audout. +void Exit(void); + +/// Gets the Service object for the actual audout service session. +Service* GetServiceSession(void); + +/// Gets the Service object for IAudioOut. +Service* GetServiceSession_AudioOut(void); + +Result ListAudioOuts(char *DeviceNames, s32 count, u32 *DeviceNamesCount); + +Result OpenAudioOut(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioOutState *State); + +Result GetAudioOutState(AudioOutState *State); + +Result StartAudioOut(void); + +Result StopAudioOut(void); + +/// Submits an \ref AudioOutBuffer for playing. +Result AppendAudioOutBuffer(AudioOutBuffer *Buffer); + +Result GetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount); + +Result ContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer); + +/// Only available with [4.0.0+]. +Result GetAudioOutBufferCount(u32 *count); + +/// Only available with [4.0.0+]. +Result GetAudioOutPlayedSampleCount(u64 *count); + +/// Only available with [4.0.0+]. +Result FlushAudioOutBuffers(bool *flushed); + +/// Only available with [6.0.0+]. +Result SetAudioOutVolume(float volume); + +/// Only available with [6.0.0+]. +Result GetAudioOutVolume(float *volume); + +/** + * @brief Submits an audio sample data buffer for playing and waits for it to finish playing. + * @brief Uses \ref audoutAppendAudioOutBuffer and \ref audoutWaitPlayFinish internally. + * @param source AudioOutBuffer containing the source sample data to be played. + * @param released AudioOutBuffer to receive the played buffer after being released. + */ +Result PlayBuffer(AudioOutBuffer *source, AudioOutBuffer **released); + +/** + * @brief Waits for audio playback to finish. + * @param released AudioOutBuffer to receive the first played buffer after being released. + * @param released_count Pointer to receive the number of played buffers. + * @param timeout Timeout value, use UINT64_MAX to wait until all finished. + */ +Result WaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout); + +/// These return the state associated with the currently active audio output device. +u32 GetSampleRate(void); + +///< Supported sample rate (48000Hz). +u32 GetChannelCount(void); + +///< Supported channel count (2 channels). +PcmFormat GetPcmFormat(void); + +///< Supported PCM format (Int16). +AudioOutState GetDeviceState(void); + +} // namespace audout + +/// @brief C++ wrappers for the `audouta` API. +/// @details Wraps: switch/services/audout.h. +namespace audouta { + +/// Audio output buffer format +using ::AudioOutBuffer; +using ::AudioOutState; + +/// Initialize audout:a. Removed in [11.0.0]. +Result Initialize(void); + +/// Exit audout:a. +void Exit(void); + +/// Gets the Service for audout:a. +Service* GetServiceSession(void); + +///< Initial device state (stopped). +Result RequestSuspend(u64 pid, u64 delay); + +Result RequestResume(u64 pid, u64 delay); + +Result GetProcessMasterVolume(u64 pid, float* volume_out); + +Result SetProcessMasterVolume(u64 pid, u64 delay, float volume); + +Result GetProcessRecordVolume(u64 pid, float* volume_out); + +Result SetProcessRecordVolume(u64 pid, u64 delay, float volume); + +} // namespace audouta + +/// @brief C++ wrappers for the `audoutd` API. +/// @details Wraps: switch/services/audout.h. +namespace audoutd { + +/// Audio output buffer format +using ::AudioOutBuffer; +using ::AudioOutState; + +/// Initialize audout:d. Removed in [11.0.0]. +Result Initialize(void); + +/// Exit audout:d. +void Exit(void); + +/// Gets the Service for audout:d. +Service* GetServiceSession(void); + +Result RequestSuspendForDebug(u64 pid, u64 delay); + +Result RequestResumeForDebug(u64 pid, u64 delay); + +} // namespace audoutd + +/// @brief C++ wrappers for the `audrec` API. +/// @details Wraps: switch/services/audrec.h. +namespace audrec { + +using ::AudrecRecorder; +using ::FinalOutputRecorderBuffer; +using ::FinalOutputRecorderParameter; +using ::FinalOutputRecorderParameterInternal; + +Result Initialize(void); + +void Exit(void); + +Service* GetServiceSession(void); + +Result OpenFinalOutputRecorder(AudrecRecorder* recorder_out, FinalOutputRecorderParameter* param_in, u64 aruid, FinalOutputRecorderParameterInternal* param_out); + +Result RecorderStart(AudrecRecorder* recorder); + +Result RecorderStop(AudrecRecorder* recorder); + +Result RecorderRegisterBufferEvent(AudrecRecorder* recorder, Event* out_event); + +Result RecorderAppendFinalOutputRecorderBuffer(AudrecRecorder* recorder, u64 buffer_client_ptr, FinalOutputRecorderBuffer* param); + +Result RecorderGetReleasedFinalOutputRecorderBuffers(AudrecRecorder* recorder, u64* out_buffers, u64* inout_count, u64* out_released); + +void RecorderClose(AudrecRecorder* recorder); + +} // namespace audrec + +/// @brief C++ wrappers for the `audren` API. +/// @details Wraps: switch/services/audren.h. +namespace audren { + +using ::AudioRendererAdpcmContext; +using ::AudioRendererAdpcmParameters; +using ::AudioRendererBehaviorInfoIn; +using ::AudioRendererBehaviorInfoOut; +using ::AudioRendererBiquadFilter; +using ::AudioRendererChannelInfoIn; +using ::AudioRendererCircularBufferSinkInfoIn; +using ::AudioRendererConfig; +using ::AudioRendererDeviceSinkInfoIn; +using ::AudioRendererDownMixParameters; +using ::AudioRendererMemPoolInfoIn; +using ::AudioRendererMemPoolInfoOut; +using ::AudioRendererMemPoolState; +using ::AudioRendererMixInfoIn; +using ::AudioRendererOutputRate; +using ::AudioRendererPerformanceBufferInfoIn; +using ::AudioRendererPerformanceBufferInfoOut; +using ::AudioRendererSinkInfoIn; +using ::AudioRendererSinkInfoOut; +using ::AudioRendererSinkType; +using ::AudioRendererUpdateDataHeader; +using ::AudioRendererVoiceInfoIn; +using ::AudioRendererVoiceInfoOut; +using ::AudioRendererVoicePlayState; +using ::AudioRendererWaveBuf; + +u32 GetRevision(void); + +int GetMemPoolCount(const AudioRendererConfig* config); + +size_t GetInputParamSize(const AudioRendererConfig* config); + +size_t GetOutputParamSize(const AudioRendererConfig* config); + +/// Initialize audren. +Result Initialize(const AudioRendererConfig* config); + +/// Exit audren. +void Exit(void); + +/// Gets the Service object for IAudioRenderer. +Service* GetServiceSession_AudioRenderer(void); + +/// Returns event that is signalled on new frame (autoclear=true). +Event* GetFrameEvent(void); + +void WaitFrame(void); + +Result GetState(u32* out_state); + +Result RequestUpdateAudioRenderer(const void* in_param_buf, size_t in_param_buf_size, void* out_param_buf, size_t out_param_buf_size, void* perf_buf, size_t perf_buf_size); + +Result StartAudioRenderer(void); + +Result StopAudioRenderer(void); + +Result SetAudioRendererRenderingTimeLimit(int percent); + +} // namespace audren + +/// @brief C++ wrappers for the `audrv` API. +/// @details Wraps: switch/audio/driver.h. +namespace audrv { + +using ::AudioDriver; +using ::AudioDriverEtc; +using ::AudioDriverWaveBuf; +using ::AudioDriverWaveBufState; + +Result Create(AudioDriver* d, const AudioRendererConfig* config, int num_final_mix_channels); + +Result Update(AudioDriver* d); + +void Close(AudioDriver* d); + +int MemPoolAdd(AudioDriver* d, void* buffer, size_t size); + +bool MemPoolRemove(AudioDriver* d, int id); + +bool MemPoolAttach(AudioDriver* d, int id); + +bool MemPoolDetach(AudioDriver* d, int id); + +bool VoiceInit(AudioDriver* d, int id, int num_channels, PcmFormat format, int sample_rate); + +void VoiceDrop(AudioDriver* d, int id); + +void VoiceStop(AudioDriver* d, int id); + +bool VoiceIsPaused(AudioDriver* d, int id); + +bool VoiceIsPlaying(AudioDriver* d, int id); + +bool VoiceAddWaveBuf(AudioDriver* d, int id, AudioDriverWaveBuf* wavebuf); + +u32 VoiceGetWaveBufSeq(AudioDriver* d, int id); + +u32 VoiceGetPlayedSampleCount(AudioDriver* d, int id); + +u32 VoiceGetVoiceDropsCount(AudioDriver* d, int id); + +void VoiceSetBiquadFilter(AudioDriver* d, int id, int biquad_id, float a0, float a1, float a2, float b0, float b1, float b2); + +void VoiceSetExtraParams(AudioDriver* d, int id, const void* params, size_t params_size); + +void VoiceSetDestinationMix(AudioDriver* d, int id, int mix_id); + +void VoiceSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id); + +void VoiceSetVolume(AudioDriver* d, int id, float volume); + +void VoiceSetPitch(AudioDriver* d, int id, float pitch); + +void VoiceSetPriority(AudioDriver* d, int id, int priority); + +void VoiceClearBiquadFilter(AudioDriver* d, int id, int biquad_id); + +void VoiceSetPaused(AudioDriver* d, int id, bool paused); + +void VoiceStart(AudioDriver* d, int id); + +int MixAdd(AudioDriver* d, int sample_rate, int num_channels); + +void MixRemove(AudioDriver* d, int id); + +void MixSetDestinationMix(AudioDriver* d, int id, int mix_id); + +void MixSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id); + +void MixSetVolume(AudioDriver* d, int id, float volume); + +int DeviceSinkAdd(AudioDriver* d, const char* device_name, int num_channels, const u8* channel_ids); + +void SinkRemove(AudioDriver* d, int id); + +} // namespace audrv + +/// @brief C++ wrappers for the `avm` API. +/// @details Wraps: switch/services/avm.h. +namespace avm { + +using ::AvmRequiredVersionEntry; +using ::AvmVersionListEntry; +using ::AvmVersionListImporter; + +Result Initialize(void); + +void Exit(void); + +Service * GetServiceSession(void); + +Result GetHighestAvailableVersion(u64 id_1, u64 id_2, u32 *version); + +Result GetHighestRequiredVersion(u64 id_1, u64 id_2, u32 *version); + +Result GetVersionListEntry(u64 application_id, AvmVersionListEntry *entry); + +Result GetVersionListImporter(AvmVersionListImporter *out); + +Result GetLaunchRequiredVersion(u64 application_id, u32 *version); + +Result UpgradeLaunchRequiredVersion(u64 application_id, u32 version); + +Result PushLaunchVersion(u64 application_id, u32 version); + +Result ListVersionList(AvmVersionListEntry *buffer, size_t count, u32 *out); + +Result ListRequiredVersion(AvmRequiredVersionEntry *buffer, size_t count, u32 *out); + +void VersionListImporterClose(AvmVersionListImporter *srv); + +Result VersionListImporterSetTimestamp(AvmVersionListImporter *srv, u64 timestamp); + +Result VersionListImporterSetData(AvmVersionListImporter *srv, const AvmVersionListEntry *entries, u32 count); + +Result VersionListImporterFlush(AvmVersionListImporter *srv); + +} // namespace avm + +/// @brief C++ wrappers for the `barrier` API. +/// @details Wraps: switch/kernel/barrier.h. +namespace barrier { + +/// Barrier structure. +using ::Barrier; + +/** + * @brief Initializes a barrier and the number of threads to wait on. + * @param b Barrier object. + * @param thread_count Initial value for the number of threads the barrier must wait for. + */ +void Init(Barrier *b, u64 thread_count); + +/** + * @brief Forces threads to wait until all threads have called barrierWait. + * @param b Barrier object. + */ +void Wait(Barrier *b); + +} // namespace barrier + +/// @brief C++ wrappers for the `binder` API. +/// @details Wraps: switch/display/binder.h. +namespace binder { + +using ::Binder; + +void Create(Binder* b, s32 id); + +void Close(Binder* b); + +Result InitSession(Binder* b, Service* relay); + +Result TransactParcel(Binder* b, u32 code, void* parcel_data, size_t parcel_data_size, void* parcel_reply, size_t parcel_reply_size, u32 flags); + +Result ConvertErrorCode(s32 code); + +Result AdjustRefcount(Binder* b, s32 addval, s32 type); + +Result GetNativeHandle(Binder* b, u32 unk0, Event *event_out); + +Result IncreaseWeakRef(Binder* b); + +Result DecreaseWeakRef(Binder* b); + +Result IncreaseStrongRef(Binder* b); + +Result DecreaseStrongRef(Binder* b); + +} // namespace binder + +/// @brief C++ wrappers for the `bpc` API. +/// @details Wraps: switch/services/bpc.h. +namespace bpc { + +using ::BpcSleepButtonState; + +/// Initialize bpc. +Result Initialize(void); + +/// Exit bpc. +void Exit(void); + +/// Gets the Service object for the actual bpc service session. +Service* GetServiceSession(void); + +Result ShutdownSystem(void); + +Result RebootSystem(void); + +Result GetSleepButtonState(BpcSleepButtonState *out); + +///< [2.0.0-13.2.1] +Result GetPowerButton(bool* out_is_pushed); + +} // namespace bpc + +/// @brief C++ wrappers for the `bq` API. +/// @details Wraps: switch/display/buffer_producer.h. +namespace bq { + +using ::BqBufferInput; +using ::BqBufferOutput; +using ::BqGraphicBuffer; +using ::BqRect; + +Result RequestBuffer(Binder *b, s32 bufferIdx, BqGraphicBuffer *buf); + +Result DequeueBuffer(Binder *b, bool async, u32 width, u32 height, s32 format, u32 usage, s32 *buf, NvMultiFence *fence); + +Result DetachBuffer(Binder *b, s32 slot); + +Result QueueBuffer(Binder *b, s32 buf, const BqBufferInput *input, BqBufferOutput *output); + +Result CancelBuffer(Binder *b, s32 buf, const NvMultiFence *fence); + +Result Query(Binder *b, s32 what, s32* value); + +Result Connect(Binder *b, s32 api, bool producerControlledByApp, BqBufferOutput *output); + +Result Disconnect(Binder *b, s32 api); + +Result SetPreallocatedBuffer(Binder *b, s32 buf, const BqGraphicBuffer *input); + +} // namespace bq + +/// @brief C++ wrappers for the `bt` API. +/// @details Wraps: switch/services/bt.h. +namespace bt { + +/// Initialize bt. Only available on [5.0.0+]. +Result Initialize(void); + +/// Exit bt. +void Exit(void); + +/// Gets the Service object for the actual bt service session. +Service* GetServiceSession(void); + +/** + * @brief LeClientReadCharacteristic + * @note This is essentially the same as \ref btdrvReadGattCharacteristic. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] auth_req \ref BtdrvGattAuthReqType + */ +Result LeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req); + +/** + * @brief LeClientReadDescriptor + * @note This is essentially the same as \ref btdrvReadGattDescriptor. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId + * @param[in] auth_req \ref BtdrvGattAuthReqType + */ +Result LeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req); + +/** + * @brief LeClientWriteCharacteristic + * @note This is essentially the same as \ref btdrvWriteGattCharacteristic. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, must be <=0x258. + * @param[in] auth_req \ref BtdrvGattAuthReqType + * @param[in] with_response Whether to use Write-With-Response write type or not + */ +Result LeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response); + +/** + * @brief LeClientWriteDescriptor + * @note This is essentially the same as \ref btdrvWriteGattDescriptor. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, must be <=0x258. + * @param[in] auth_req \ref BtdrvGattAuthReqType + */ +Result LeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req); + +/** + * @brief LeClientRegisterNotification + * @note This is essentially the same as \ref btdrvRegisterGattNotification. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + */ +Result LeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); + +/** + * @brief LeClientDeregisterNotification + * @note This is essentially the same as \ref btdrvUnregisterGattNotification. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + */ +Result LeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); + +/** + * @brief SetLeResponse + * @param[in] server_if Server interface ID + * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid + * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, must be <=0x258. + */ +Result SetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size); + +/** + * @brief LeSendIndication + * @param[in] server_if Server interface ID + * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid + * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, clamped to max size 0x258. + * @param[in] noconfirm Whether no confirmation is required (notification) or not (indication) + */ +Result LeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm); + +/** + * @brief GetLeEventInfo + * @note This is identical to \ref btdrvGetLeHidEventInfo except different state is used. + * @note The state used by this is reset after writing the data to output. + * @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo. + * @param[in] size Output buffer size. + * @param[out] type Output BtdrvBleEventType. + */ +Result GetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); + +/** + * @brief RegisterBleEvent + * @note This is identical to \ref btdrvRegisterBleHidEvent except different state is used. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result RegisterBleEvent(Event* out_event); + +} // namespace bt + +/// @brief C++ wrappers for the `btdev` API. +/// @details Wraps: switch/runtime/btdev.h. +namespace btdev { + +/// GattAttribute +using ::BtdevGattAttribute; +/// GattCharacteristic +using ::BtdevGattCharacteristic; +/// GattDescriptor +using ::BtdevGattDescriptor; +/// GattService +using ::BtdevGattService; + +/// Initialize bt/btmu. +Result Initialize(void); + +/// Exit bt/btmu. +void Exit(void); + +/// Compares two \ref BtdrvGattAttributeUuid, returning whether these match. +bool GattAttributeUuidIsSame(const BtdrvGattAttributeUuid *a, const BtdrvGattAttributeUuid *b); + +/// Wrapper for \ref btmuAcquireBleScanEvent. +Result AcquireBleScanEvent(Event* out_event); + +/// Wrapper for \ref btmuGetBleScanFilterParameter. +Result GetBleScanParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out); + +/// Wrapper for \ref btmuGetBleScanFilterParameter2. +Result GetBleScanParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out); + +/// Wrapper for \ref btdevStartBleScanGeneral. +Result StartBleScanGeneral(BtdrvBleAdvertisePacketParameter param); + +/// Wrapper for \ref btmuStopBleScanForGeneral. +Result StopBleScanGeneral(void); + +/** + * @brief Wrapper for \ref btmuGetBleScanResultsForGeneral and \ref btmuGetBleScanResultsForSmartDevice. + * @param[out] results Output array of \ref BtdrvBleScanResult. + * @param[in] count Size of the results array in entries. + * @param[out] total_out Total output entries. + */ +Result GetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out); + +/// Wrapper for \ref btmuStartBleScanForPaired. +Result EnableBleAutoConnection(BtdrvBleAdvertisePacketParameter param); + +/// Wrapper for \ref btmuStopBleScanForPaired. +Result DisableBleAutoConnection(void); + +/// Wrapper for \ref btmuStartBleScanForSmartDevice. +Result StartBleScanSmartDevice(const BtdrvGattAttributeUuid *uuid); + +/// Wrapper for \ref btmuStopBleScanForSmartDevice. +Result StopBleScanSmartDevice(void); + +/// Wrapper for \ref btmuAcquireBleConnectionEvent. +Result AcquireBleConnectionStateChangedEvent(Event* out_event); + +/// Wrapper for \ref btmuBleConnect. +Result ConnectToGattServer(BtdrvAddress addr); + +/// Wrapper for \ref btmuBleDisconnect. +Result DisconnectFromGattServer(u32 connection_handle); + +/// Wrapper for \ref btmuBleGetConnectionState. +Result GetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out); + +/// Wrapper for \ref btmuAcquireBleServiceDiscoveryEvent. +Result AcquireBleServiceDiscoveryEvent(Event* out_event); + +/** + * @brief Wrapper for \ref btmuGetGattServices. + * @param[in] connection_handle ConnectionHandle + * @param[out] services Output array of \ref BtdevGattService. + * @param[in] count Size of the services array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out); + +/** + * @brief Wrapper for \ref btmuGetGattService. + * @param[in] connection_handle ConnectionHandle + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[out] service \ref BtdevGattService + * @param[out] flag Whether a \ref BtdevGattService was returned. + */ +Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag); + +/// Wrapper for \ref btmuAcquireBlePairingEvent. +Result AcquireBlePairingEvent(Event* out_event); + +/// Wrapper for \ref btmuBlePairDevice. +Result PairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); + +/// Wrapper for \ref btmuBleUnPairDevice. +Result UnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); + +/// Wrapper for \ref btmuBleUnPairDevice2. +Result UnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param); + +/// Wrapper for \ref btmuBleGetPairedDevices. +Result GetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out); + +/// Wrapper for \ref btmuAcquireBleMtuConfigEvent. +Result AcquireBleMtuConfigEvent(Event* out_event); + +/** + * @brief Wrapper for \ref btmuConfigureBleMtu. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] mtu MTU, must be 0x18-0x200. + */ +Result ConfigureBleMtu(u32 connection_handle, u16 mtu); + +/// Wrapper for \ref btmuGetBleMtu. +Result GetBleMtu(u32 connection_handle, u16 *out); + +/// Wrapper for \ref btRegisterBleEvent. +Result AcquireBleGattOperationEvent(Event* out_event); + +/** + * @brief Wrapper for \ref btmuRegisterBleGattDataPath. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result RegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief Wrapper for \ref btmuUnregisterBleGattDataPath. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result UnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief Wrapper for \ref btGetLeEventInfo. + * @param[out] out \ref BtdrvBleClientGattOperationInfo + */ +Result GetGattOperationResult(BtdrvBleClientGattOperationInfo *out); + +/** + * @brief Wrapper for \ref btLeClientReadCharacteristic. + * @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this. + * @param c \ref BtdevGattCharacteristic + */ +Result ReadGattCharacteristic(BtdevGattCharacteristic *c); + +/** + * @brief Wrapper for \ref btLeClientWriteCharacteristic. + * @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this. + * @note This uses the Value from \ref btdevGattCharacteristicSetValue. + * @param c \ref BtdevGattCharacteristic + */ +Result WriteGattCharacteristic(BtdevGattCharacteristic *c); + +/** + * @brief Wrapper for \ref btLeClientRegisterNotification / \ref btLeClientDeregisterNotification. + * @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this. + * @param c \ref BtdevGattCharacteristic + * @param[in] flag Whether to enable/disable, controls which func to call. + */ +Result EnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag); + +/** + * @brief Wrapper for \ref btLeClientReadDescriptor. + * @param d \ref BtdevGattDescriptor + */ +Result ReadGattDescriptor(BtdevGattDescriptor *d); + +/** + * @brief Wrapper for \ref btLeClientWriteDescriptor. + * @note This uses the Value from \ref btdevGattDescriptorSetValue. + * @param d \ref BtdevGattDescriptor + */ +Result WriteGattDescriptor(BtdevGattDescriptor *d); + +/** + * @brief Creates a \ref BtdevGattAttribute object. This is intended for internal use. + * @param a \ref BtdevGattAttribute + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[in] handle Handle + * @param[in] connection_handle ConnectionHandle + */ +void GattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle); + +/** + * @brief Gets the Type. + * @param a \ref BtdevGattAttribute + */ +u8 GattAttributeGetType(BtdevGattAttribute *a); + +/** + * @brief Gets the Uuid. + * @param a \ref BtdevGattAttribute + * @param[out] out \ref BtdrvGattAttributeUuid + */ +void GattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out); + +/** + * @brief Gets the Handle. + * @param a \ref BtdevGattAttribute + */ +u16 GattAttributeGetHandle(BtdevGattAttribute *a); + +/** + * @brief Gets the ConnectionHandle. + * @param a \ref BtdevGattAttribute + */ +u32 GattAttributeGetConnectionHandle(BtdevGattAttribute *a); + +/** + * @brief Creates a \ref BtdevGattService object. This is intended for internal use. + * @param s \ref BtdevGattService + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[in] handle Handle + * @param[in] connection_handle ConnectionHandle + * @param[in] instance_id InstanceId + * @param[in] end_group_handle EndGroupHandle + * @param[in] primary_service PrimaryService + */ +void GattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service); + +/** + * @brief Gets the InstanceId. + * @param s \ref BtdevGattService + */ +u16 GattServiceGetInstanceId(BtdevGattService *s); + +/** + * @brief Gets the EndGroupHandle. + * @param s \ref BtdevGattService + */ +u16 GattServiceGetEndGroupHandle(BtdevGattService *s); + +/** + * @brief Gets whether this is the PrimaryService. + * @param s \ref BtdevGattService + */ +u16 GattServiceIsPrimaryService(BtdevGattService *s); + +/** + * @brief Wrapper for \ref btmuGetGattIncludedServices. + * @param s \ref BtdevGattService + * @param[out] services Output array of \ref BtdevGattService. + * @param[in] count Size of the services array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out); + +/** + * @brief Wrapper for \ref btmuGetGattCharacteristics. + * @param s \ref BtdevGattService + * @param[out] characteristics Output array of \ref BtdevGattCharacteristic. + * @param[in] count Size of the characteristics array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out); + +/** + * @brief Same as \ref btdevGattServiceGetCharacteristics except this only returns the \ref BtdevGattCharacteristic which contains a matching \ref BtdrvGattAttributeUuid. + * @param s \ref BtdevGattService + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[out] characteristic \ref BtdevGattCharacteristic + * @param[out] flag Whether a \ref BtdevGattService was returned. + */ +Result GattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag); + +/** + * @brief Creates a \ref BtdevGattCharacteristic object. This is intended for internal use. + * @param c \ref BtdevGattCharacteristic + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[in] handle Handle + * @param[in] connection_handle ConnectionHandle + * @param[in] instance_id InstanceId + * @param[in] properties Properties + */ +void GattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties); + +/** + * @brief Gets the InstanceId. + * @param c \ref BtdevGattCharacteristic + */ +u16 GattCharacteristicGetInstanceId(BtdevGattCharacteristic *c); + +/** + * @brief Gets the Properties. + * @param c \ref BtdevGattCharacteristic + */ +u8 GattCharacteristicGetProperties(BtdevGattCharacteristic *c); + +/** + * @brief Wrapper for \ref btmuGetBelongingGattService. + * @note Gets the \ref BtdevGattService which belongs to this object. + * @param c \ref BtdevGattCharacteristic. + * @param[out] service \ref BtdevGattService + */ +Result GattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service); + +/** + * @brief Wrapper for \ref btmuGetGattDescriptors. + * @note Gets the descriptors which belongs to this object. + * @param c \ref BtdevGattCharacteristic + * @param[out] descriptors Output array of \ref BtdevGattDescriptor. + * @param[in] count Size of the descriptors array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out); + +/** + * @brief Same as \ref btdevGattCharacteristicGetDescriptors except this only returns a \ref BtdevGattDescriptor which contains a matching \ref BtdrvGattAttributeUuid. + * @param c \ref BtdevGattCharacteristic + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[out] descriptor \ref BtdevGattDescriptor + * @param[out] flag Whether a \ref BtdevGattDescriptor was returned. + */ +Result GattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag); + +/** + * @brief Sets the Value in the object. + * @note See also \ref btdevWriteGattCharacteristic. + * @param c \ref BtdevGattCharacteristic + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, max is 0x200. + */ +void GattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size); + +/** + * @brief Gets the Value in the object, returns the copied value size. + * @param c \ref BtdevGattCharacteristic + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size, max is 0x200. + */ +u64 GattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size); + +/** + * @brief Creates a \ref BtdevGattDescriptor object. This is intended for internal use. + * @param d \ref BtdevGattDescriptor + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[in] handle Handle + * @param[in] connection_handle ConnectionHandle + */ +void GattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle); + +/** + * @brief Wrapper for \ref btmuGetBelongingGattService. + * @note Gets the \ref BtdevGattService which belongs to this object. + * @param d \ref BtdevGattDescriptor + * @param[out] service \ref BtdevGattService + */ +Result GattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service); + +/** + * @brief Wrapper for \ref btmuGetGattCharacteristics. + * @note Gets the \ref BtdevGattCharacteristic which belongs to this object. + * @param d \ref BtdevGattDescriptor + * @param[out] characteristic \ref BtdevGattCharacteristic + */ +Result GattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic); + +/** + * @brief Sets the Value in the object. + * @note See also \ref btdevWriteGattDescriptor. + * @param d \ref BtdevGattDescriptor + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, max is 0x200. + */ +void GattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size); + +/** + * @brief Gets the Value in the object, returns the copied value size. + * @param d \ref BtdevGattDescriptor + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size, max is 0x200. + */ +u64 GattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size); + +} // namespace btdev + +/// @brief C++ wrappers for the `btdrv` API. +/// @details Wraps: switch/services/btdrv.h. +namespace btdrv { + +/// Data for \ref btdrvGetAudioEventInfo. The data stored here depends on the \ref BtdrvAudioEventType. +using ::BtdrvAudioEventInfo; +/// Data for \ref btdrvGetBleManagedEventInfo and \ref btdrvGetLeHidEventInfo. The data stored here depends on the \ref BtdrvBleEventType. +using ::BtdrvBleEventInfo; +/// CircularBuffer +using ::BtdrvCircularBuffer; +/// Data for \ref btdrvGetEventInfo. The data stored here depends on the \ref BtdrvEventType. +using ::BtdrvEventInfo; +/// Data for \ref btdrvGetHidEventInfo. The data stored here depends on the \ref BtdrvHidEventType. +using ::BtdrvHidEventInfo; +/// Data for \ref btdrvGetHidReportEventInfo. The data stored here depends on the \ref BtdrvHidEventType. +using ::BtdrvHidReportEventInfo; +/// The raw sharedmem data for HidReportEventInfo. +using ::BtdrvHidReportEventInfoBufferData; + +/// Initialize btdrv. +Result Initialize(void); + +/// Exit btdrv. +void Exit(void); + +/// Gets the Service object for the actual btdrv service session. +Service* GetServiceSession(void); + +/** + * @brief InitializeBluetooth + * @note This is used by btm-sysmodule, this should not be used by other processes. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result InitializeBluetooth(Event* out_event); + +/** + * @brief EnableBluetooth + * @note This is used by btm-sysmodule. + */ +Result EnableBluetooth(void); + +/** + * @brief DisableBluetooth + * @note This is used by btm-sysmodule. + */ +Result DisableBluetooth(void); + +/** + * @brief FinalizeBluetooth + * @note This is not used by btm-sysmodule, this should not be used by other processes. + */ +Result FinalizeBluetooth(void); + +/** + * @brief GetAdapterProperties [1.0.0-11.0.1] + * @param[out] properties \ref BtdrvAdapterPropertyOld + */ +Result LegacyGetAdapterProperties(BtdrvAdapterPropertyOld *properties); + +/** + * @brief GetAdapterProperties [12.0.0+] + * @param[out] properties \ref BtdrvAdapterPropertySet + */ +Result GetAdapterProperties(BtdrvAdapterPropertySet *properties); + +/** + * @brief GetAdapterProperty [1.0.0-11.0.1] + * @param[in] type \ref BtdrvBluetoothPropertyType + * @param[out] buffer Output buffer, see \ref BtdrvBluetoothPropertyType for the contents. + * @param[in] size Output buffer size. + */ +Result LegacyGetAdapterProperty(BtdrvBluetoothPropertyType type, void* buffer, size_t size); + +/** + * @brief GetAdapterProperty [12.0.0+] + * @param[in] type \ref BtdrvAdapterPropertyType + * @param[in] property \ref BtdrvAdapterProperty + */ +Result GetAdapterProperty(BtdrvAdapterPropertyType type, BtdrvAdapterProperty *property); + +/** + * @brief SetAdapterProperty [1.0.0-11.0.1] + * @param[in] type \ref BtdrvBluetoothPropertyType + * @param[in] buffer Input buffer, see \ref BtdrvBluetoothPropertyType for the contents. + * @param[in] size Input buffer size. + */ +Result LegacySetAdapterProperty(BtdrvBluetoothPropertyType type, const void* buffer, size_t size); + +/** + * @brief SetAdapterProperty [12.0.0+] + * @param[in] type \ref BtdrvAdapterPropertyType + * @param[in] property \ref BtdrvAdapterProperty + */ +Result SetAdapterProperty(BtdrvAdapterPropertyType type, const BtdrvAdapterProperty *property); + +/** + * @brief StartInquiry [1.0.0-11.0.1]. This starts Inquiry, the output data will be available via \ref btdrvGetEventInfo. Inquiry will automatically stop in 10.24 seconds. + * @note This is used by btm-sysmodule. + */ +Result LegacyStartInquiry(void); + +/** + * @brief StartInquiry [12.0.0+]. This starts Inquiry, the output data will be available via \ref btdrvGetEventInfo. + * @param[in] services Bitfield of allowed services. When -1 the original defaults from pre-12.0.0 are used. + * @param[in] duration Inquiry duration in nanoseconds. + * @note This is used by btm-sysmodule. + */ +Result StartInquiry(u32 services, s64 duration); + +/** + * @brief This stops Inquiry which was started by \ref btdrvStartInquiry, if it's still active. + * @note This is used by btm-sysmodule. + */ +Result StopInquiry(void); + +/** + * @brief CreateBond + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[in] type TransportType + */ +Result CreateBond(BtdrvAddress addr, u32 type); + +/** + * @brief RemoveBond + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + */ +Result RemoveBond(BtdrvAddress addr); + +/** + * @brief CancelBond + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + */ +Result CancelBond(BtdrvAddress addr); + +/** + * @brief RespondToPinRequest [1.0.0-11.0.1] + * @note The official sysmodule only uses the input \ref BtdrvAddress. + * @param[in] addr \ref BtdrvAddress + * @param[in] flag Flag + * @param[in] pin_code \ref BtdrvBluetoothPinCode + * @param[in] length Length of pin_code + */ +Result LegacyRespondToPinRequest(BtdrvAddress addr, bool flag, const BtdrvBluetoothPinCode *pin_code, u8 length); + +/** + * @brief RespondToPinRequest [12.0.0+] + * @param[in] addr \ref BtdrvAddress + * @param[in] pin_code \ref BtdrvPinCode + */ +Result RespondToPinRequest(BtdrvAddress addr, const BtdrvPinCode *pin_code); + +/** + * @brief RespondToSspRequest + * @note The official sysmodule only uses the input \ref BtdrvAddress and the flag. + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[in] variant BluetoothSspVariant + * @param[in] accept Whether the request is accepted. + * @param[in] passkey Passkey. + */ +Result RespondToSspRequest(BtdrvAddress addr, u32 variant, bool accept, u32 passkey); + +/** + * @brief GetEventInfo + * @note This is used by btm-sysmodule. + * @param[out] buffer Output buffer, see \ref BtdrvEventInfo. + * @param[in] size Output buffer size. + * @param[out] type Output BtdrvEventType. + */ +Result GetEventInfo(void* buffer, size_t size, BtdrvEventType *type); + +/** + * @brief InitializeHid + * @note This is used by btm-sysmodule, this should not be used by other processes. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result InitializeHid(Event* out_event); + +/** + * @brief OpenHidConnection + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + */ +Result OpenHidConnection(BtdrvAddress addr); + +/** + * @brief CloseHidConnection + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + */ +Result CloseHidConnection(BtdrvAddress addr); + +/** + * @brief This sends a HID DATA transaction packet with report-type Output. + * @param[in] addr \ref BtdrvAddress + * @param[in] buffer Input \ref BtdrvHidReport, on pre-9.0.0 this is \ref BtdrvHidData. + */ +Result WriteHidData(BtdrvAddress addr, const BtdrvHidReport *buffer); + +/** + * @brief WriteHidData2 + * @param[in] addr \ref BtdrvAddress + * @param[in] buffer Input buffer, same as the buffer for \ref btdrvWriteHidData. + * @param[in] size Input buffer size. + */ +Result WriteHidData2(BtdrvAddress addr, const void* buffer, size_t size); + +/** + * @brief This sends a HID SET_REPORT transaction packet. + * @param[in] addr \ref BtdrvAddress + * @param[in] type \ref BtdrvBluetoothHhReportType + * @param[in] buffer Input \ref BtdrvHidReport, on pre-9.0.0 this is \ref BtdrvHidData. + */ +Result SetHidReport(BtdrvAddress addr, BtdrvBluetoothHhReportType type, const BtdrvHidReport *buffer); + +/** + * @brief This sends a HID GET_REPORT transaction packet. + * @param[in] addr \ref BtdrvAddress + * @param[in] report_id This is sent in the packet for the Report Id, when non-zero. + * @param[in] type \ref BtdrvBluetoothHhReportType + */ +Result GetHidReport(BtdrvAddress addr, u8 report_id, BtdrvBluetoothHhReportType type); + +/** + * @brief TriggerConnection + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[in] timeout [9.0.0+] Host trigger timeout + */ +Result TriggerConnection(BtdrvAddress addr, u16 timeout); + +/** + * @brief AddPairedDeviceInfo + * @note This is used by btm-sysmodule. + * @param[in] settings \ref SetSysBluetoothDevicesSettings + */ +Result AddPairedDeviceInfo(const SetSysBluetoothDevicesSettings *settings); + +/** + * @brief GetPairedDeviceInfo + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[out] settings \ref SetSysBluetoothDevicesSettings + */ +Result GetPairedDeviceInfo(BtdrvAddress addr, SetSysBluetoothDevicesSettings *settings); + +/** + * @brief FinalizeHid + * @note This is not used by btm-sysmodule, this should not be used by other processes. + */ +Result FinalizeHid(void); + +/** + * @brief GetHidEventInfo + * @note This is used by btm-sysmodule. + * @param[out] buffer Output buffer, see \ref BtdrvHidEventInfo. + * @param[in] size Output buffer size. + * @param[out] type \ref BtdrvHidEventType, always ::BtdrvHidEventType_Connection or ::BtdrvHidEventType_Ext. + */ +Result GetHidEventInfo(void* buffer, size_t size, BtdrvHidEventType *type); + +/** + * @brief SetTsi + * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[in] tsi Tsi: non-value-0xFF to Set, value 0xFF to Exit. See also \ref BtmTsiMode. + */ +Result SetTsi(BtdrvAddress addr, u8 tsi); + +/** + * @brief EnableBurstMode + * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[in] flag Flag: true = Set, false = Exit. + */ +Result EnableBurstMode(BtdrvAddress addr, bool flag); + +/** + * @brief SetZeroRetransmission + * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). + * @note This is used by btm-sysmodule. + * @param[in] addr \ref BtdrvAddress + * @param[in] report_ids Input buffer containing an array of u8s. + * @param[in] count Total u8s in the input buffer. This can be 0, the max is 5. + */ +Result SetZeroRetransmission(BtdrvAddress addr, u8 *report_ids, u8 count); + +/** + * @brief EnableMcMode + * @note This is used by btm-sysmodule. + * @param[in] flag Flag + */ +Result EnableMcMode(bool flag); + +/** + * @brief EnableLlrScan + * @note This is used by btm-sysmodule. + */ +Result EnableLlrScan(void); + +/** + * @brief DisableLlrScan + * @note This is used by btm-sysmodule. + */ +Result DisableLlrScan(void); + +/** + * @brief EnableRadio + * @note This is used by btm-sysmodule. + * @param[in] flag Flag + */ +Result EnableRadio(bool flag); + +/** + * @brief SetVisibility + * @note This is used by btm-sysmodule. + * @param[in] inquiry_scan Controls Inquiry Scan, whether the device can be discovered during Inquiry. + * @param[in] page_scan Controls Page Scan, whether the device accepts connections. + */ +Result SetVisibility(bool inquiry_scan, bool page_scan); + +/** + * @brief EnableTbfcScan + * @note Only available on [4.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] flag Flag + */ +Result EnableTbfcScan(bool flag); + +/** + * @brief RegisterHidReportEvent + * @note This also does sharedmem init/handling if needed, on [7.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. This is signaled when data is available with \ref btdrvGetHidReportEventInfo. + */ +Result RegisterHidReportEvent(Event* out_event); + +/** + * @brief GetHidReportEventInfo + * @note \ref btdrvRegisterHidReportEvent must be used before this, on [7.0.0+]. + * @note This is used by hid-sysmodule. When used by other processes, hid/user-process will conflict. No events will be received by that user-process, or it will be corrupted, etc. + * @note [7.0.0+] When data isn't available, the type is set to ::BtdrvHidEventType_Data, with the buffer cleared to all-zero. + * @param[out] buffer Output buffer, see \ref BtdrvHidReportEventInfo. + * @param[in] size Output buffer size. + * @param[out] type \ref BtdrvHidEventType + */ +Result GetHidReportEventInfo(void* buffer, size_t size, BtdrvHidEventType *type); + +/// Gets the SharedMemory addr for HidReportEventInfo (\ref BtdrvCircularBuffer), only valid when \ref btdrvRegisterHidReportEvent was previously used, on [7.0.0+]. +void* GetHidReportEventInfoSharedmemAddr(void); + +/** + * @brief GetLatestPlr + * @param[out] out Output \ref BtdrvPlrList, on pre-9.0.0 this is \ref BtdrvPlrStatistics. + */ +Result GetLatestPlr(BtdrvPlrList *out); + +/** + * @brief GetPendingConnections + * @note The output data will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). + * @note This is used by btm-sysmodule. + * @note Only available on [3.0.0+]. + */ +Result GetPendingConnections(void); + +/** + * @brief GetChannelMap + * @note Only available on [3.0.0+]. + * @param[out] out \ref BtdrvChannelMapList + */ +Result GetChannelMap(BtdrvChannelMapList *out); + +/** + * @brief EnableTxPowerBoostSetting + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result EnableTxPowerBoostSetting(bool flag); + +/** + * @brief IsTxPowerBoostSettingEnabled + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsTxPowerBoostSettingEnabled(bool *out); + +/** + * @brief EnableAfhSetting + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result EnableAfhSetting(bool flag); + +/** + * @brief IsAfhSettingEnabled + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsAfhSettingEnabled(bool *out); + +/** + * @brief InitializeBle + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result InitializeBle(Event* out_event); + +/** + * @brief EnableBle + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + */ +Result EnableBle(void); + +/** + * @brief DisableBle + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + */ +Result DisableBle(void); + +/** + * @brief FinalizeBle + * @note Only available on [5.0.0+]. + */ +Result FinalizeBle(void); + +/** + * @brief SetBleVisibility + * @note Only available on [5.0.0+]. + * @param[in] discoverable Whether the BLE device is discoverable. + * @param[in] connectable Whether the BLE device is connectable. + */ +Result SetBleVisibility(bool discoverable, bool connectable); + +/** + * @brief SetLeConnectionParameter + * @note Only available on [5.0.0-8.1.1]. This is the older version of \ref btdrvSetBleConnectionParameter. + * @param[in] param \ref BtdrvLeConnectionParams + */ +Result SetLeConnectionParameter(const BtdrvLeConnectionParams *param); + +/** + * @brief SetBleConnectionParameter + * @note Only available on [9.0.0+]. This is the newer version of \ref btdrvSetLeConnectionParameter. + * @param[in] addr \ref BtdrvAddress + * @param[in] param \ref BtdrvBleConnectionParameter + * @param[in] preference Unused + */ +Result SetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool preference); + +/** + * @brief SetLeDefaultConnectionParameter + * @note Only available on [5.0.0-8.1.1]. This is the older version of \ref btdrvSetBleDefaultConnectionParameter. + * @param[in] param \ref BtdrvLeConnectionParams + */ +Result SetLeDefaultConnectionParameter(const BtdrvLeConnectionParams *param); + +/** + * @brief SetBleDefaultConnectionParameter + * @note Only available on [9.0.0+]. This is the newer version of \ref btdrvSetLeDefaultConnectionParameter. + * @param[in] param \ref BtdrvBleConnectionParameter + */ +Result SetBleDefaultConnectionParameter(const BtdrvBleConnectionParameter *param); + +/** + * @brief SetBleAdvertiseData + * @note Only available on [5.0.0+]. + * @param[in] data \ref BtdrvBleAdvertisePacketData + */ +Result SetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data); + +/** + * @brief SetBleAdvertiseParameter + * @note Only available on [5.0.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[in] min_interval Minimum advertisement interval + * @param[in] max_interval Maximum advertisement interval + */ +Result SetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval); + +/** + * @brief StartBleScan + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + */ +Result StartBleScan(void); + +/** + * @brief StopBleScan + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + */ +Result StopBleScan(void); + +/** + * @brief AddBleScanFilterCondition + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] filter \ref BtdrvBleAdvertiseFilter + */ +Result AddBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter); + +/** + * @brief DeleteBleScanFilterCondition + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] filter \ref BtdrvBleAdvertiseFilter + */ +Result DeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter); + +/** + * @brief DeleteBleScanFilter + * @note Only available on [5.0.0+]. + * @param[in] index Filter index + */ +Result DeleteBleScanFilter(u8 index); + +/** + * @brief ClearBleScanFilters + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + */ +Result ClearBleScanFilters(void); + +/** + * @brief EnableBleScanFilter + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] flag Flag + */ +Result EnableBleScanFilter(bool flag); + +/** + * @brief RegisterGattClient + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result RegisterGattClient(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief UnregisterGattClient + * @note Only available on [5.0.0+]. + * @param[in] client_if Client interface ID + */ +Result UnregisterGattClient(u8 client_if); + +/** + * @brief UnregisterAllGattClients + * @note Only available on [5.0.0+]. + */ +Result UnregisterAllGattClients(void); + +/** + * @brief ConnectGattServer + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] client_if Client interface ID + * @param[in] addr \ref BtdrvAddress + * @param[in] is_direct Whether a direct connection or a background auto connection + * @param[in] AppletResourceUserId AppletResourceUserId + */ +Result ConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId); + +/** + * @brief CancelConnectGattServer + * @note Only available on [5.1.0+]. + * @note This is used by btm-sysmodule. + * @param[in] client_if Client interface ID + * @param[in] addr \ref BtdrvAddress + * @param[in] is_direct Whether a direct connection or a background auto connection + */ +Result CancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct); + +/** + * @brief DisconnectGattServer + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] conn_id Connection ID + */ +Result DisconnectGattServer(u32 conn_id); + +/** + * @brief GetGattAttribute + * @note Only available on [5.0.0+]. + * @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0. + * @param[in] conn_id Connection ID + */ +Result GetGattAttribute(BtdrvAddress addr, u32 conn_id); + +/** + * @brief GetGattService + * @note Only available on [5.0.0+]. + * @param[in] conn_id Connection ID + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result GetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid); + +/** + * @brief ConfigureAttMtu + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] conn_id Connection ID + * @param[in] mtu MTU + */ +Result ConfigureAttMtu(u32 conn_id, u16 mtu); + +/** + * @brief RegisterGattServer + * @note Only available on [5.0.0+]. + * @note Event data generated by this call contains uninitialized junk instead of the server_if value received internally. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result RegisterGattServer(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief UnregisterGattServer + * @note Only available on [5.0.0+]. + * @param[in] server_if Server interface ID + */ +Result UnregisterGattServer(u8 server_if); + +/** + * @brief ConnectGattClient + * @note Only available on [5.0.0+]. + * @param[in] server_if Server interface ID + * @param[in] addr \ref BtdrvAddress + * @param[in] is_direct Whether a direct connection or a background auto connection + */ +Result ConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct); + +/** + * @brief DisconnectGattClient + * @note Only available on [5.0.0+]. + * @param[in] conn_id Connection ID + * @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0. + */ +Result DisconnectGattClient(u8 conn_id, BtdrvAddress addr); + +/** + * @brief AddGattService + * @note Only available on [5.0.0+]. + * @note Broken behaviour due to internal bugs. + * @param[in] server_if Server interface ID + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[in] num_handle Number of handles + * @param[in] is_primary Is a primary service or not + */ +Result AddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary); + +/** + * @brief EnableGattService + * @note Only available on [5.0.0+]. + * @note Broken behaviour due to internal bugs. + * @param[in] server_if Server interface ID + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result EnableGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid); + +/** + * @brief AddGattCharacteristic + * @note Only available on [5.0.0+]. + * @note Broken behaviour due to internal bugs. + * @param[in] server_if Server interface ID + * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid + * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid + * @param[in] permissions \ref BtdrvGattAttributePermission + * @param[in] property \ref BtdrvGattCharacteristicProperty + */ +Result AddGattCharacteristic(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u16 permissions, u8 property); + +/** + * @brief AddGattDescriptor + * @note Only available on [5.0.0+]. + * @note Broken behaviour due to internal bugs. + * @param[in] server_if Server interface ID + * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid + * @param[in] desc_uuid Descriptor UUID \ref BtdrvGattAttributeUuid + * @param[in] permissions \ref BtdrvGattAttributePermission + */ +Result AddGattDescriptor(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions); + +/** + * @brief GetBleManagedEventInfo + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo. + * @param[in] size Output buffer size. + * @param[out] type Output BtdrvBleEventType. + */ +Result GetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); + +/** + * @brief GetGattFirstCharacteristic + * @note Only available on [5.0.0+]. + * @param[in] conn_id Connection ID + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty + * @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId + */ +Result GetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id); + +/** + * @brief GetGattNextCharacteristic + * @note Only available on [5.0.0+]. + * @param[in] conn_id Connection ID + * @param[in] serv_id Service ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] char_id Previous characteristic GATT ID \ref BtdrvGattId + * @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty + * @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId + */ +Result GetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id); + +/** + * @brief GetGattFirstDescriptor + * @note Only available on [5.0.0+]. + * @param[in] conn_id Connection ID + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId + */ +Result GetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id); + +/** + * @brief GetGattNextDescriptor + * @note Only available on [5.0.0+]. + * @param[in] conn_id Connection ID + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Previous descriptor GATT ID \ref BtdrvGattId + * @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId + */ +Result GetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id); + +/** + * @brief RegisterGattManagedDataPath + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result RegisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief UnregisterGattManagedDataPath + * @note Only available on [5.0.0+]. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result UnregisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief RegisterGattHidDataPath + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result RegisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief UnregisterGattHidDataPath + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result UnregisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief RegisterGattDataPath + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result RegisterGattDataPath(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief UnregisterGattDataPath + * @note Only available on [5.0.0+]. + * @note This is used by btm-sysmodule. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result UnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief ReadGattCharacteristic + * @note Only available on [5.0.0+]. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] auth_req \ref BtdrvGattAuthReqType + */ +Result ReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req); + +/** + * @brief ReadGattDescriptor + * @note Only available on [5.0.0+]. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId + * @param[in] auth_req \ref BtdrvGattAuthReqType + */ +Result ReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req); + +/** + * @brief WriteGattCharacteristic + * @note Only available on [5.0.0+]. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, must be <=0x258. + * @param[in] auth_req \ref BtdrvGattAuthReqType + * @param[in] with_response Whether to use Write-With-Response write type or not + */ +Result WriteGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response); + +/** + * @brief WriteGattDescriptor + * @note Only available on [5.0.0+]. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size, must be <=0x258. + * @param[in] auth_req \ref BtdrvGattAuthReqType + */ +Result WriteGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req); + +/** + * @brief RegisterGattNotification + * @note Only available on [5.0.0+]. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + */ +Result RegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); + +/** + * @brief UnregisterGattNotification + * @note Only available on [5.0.0+]. + * @param[in] connection_handle ConnectionHandle + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + */ +Result UnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); + +/** + * @brief GetLeHidEventInfo + * @note Only available on [5.0.0+]. + * @note The state used by this is reset after writing the data to output. + * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo. + * @param[in] size Output buffer size. + * @param[out] type \ref BtdrvBleEventType. + */ +Result GetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); + +/** + * @brief RegisterBleHidEvent + * @note Only available on [5.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result RegisterBleHidEvent(Event* out_event); + +/** + * @brief SetBleScanParameter + * @note Only available on [5.1.0+]. + * @note This is used by btm-sysmodule. + * @param[in] scan_interval Scan interval + * @param[in] scan_window Scan window + */ +Result SetBleScanParameter(u16 scan_interval, u16 scan_window); + +/** + * @brief MoveToSecondaryPiconet + * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). + * @note Only available on [10.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result MoveToSecondaryPiconet(BtdrvAddress addr); + +/** + * @brief IsBluetoothEnabled + * @note Only available on [12.0.0+]. + * @param[out] out Output flag. + */ +Result IsBluetoothEnabled(bool *out); + +/** + * @brief AcquireAudioEvent + * @note Only available on [12.0.0+]. + * @param[out] out_event Output Event. + * @param[in] autoclear Event autoclear. + */ +Result AcquireAudioEvent(Event* out_event, bool autoclear); + +/** + * @brief GetAudioEventInfo + * @note Only available on [12.0.0+]. + * @param[out] buffer Output buffer, see \ref BtdrvAudioEventInfo. + * @param[in] size Output buffer size. + * @param[out] type \ref BtdrvAudioEventType. + */ +Result GetAudioEventInfo(void* buffer, size_t size, BtdrvAudioEventType *type); + +/** + * @brief OpenAudioConnection + * @note Only available on [12.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result OpenAudioConnection(BtdrvAddress addr); + +/** + * @brief CloseAudioConnection + * @note Only available on [12.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result CloseAudioConnection(BtdrvAddress addr); + +/** + * @brief OpenAudioOut + * @note Only available on [12.0.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[out] audio_handle Audio handle. + */ +Result OpenAudioOut(BtdrvAddress addr, u32 *audio_handle); + +/** + * @brief CloseAudioOut + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + */ +Result CloseAudioOut(u32 audio_handle); + +/** + * @brief StartAudioOut + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[in] pcm_param \ref BtdrvPcmParameter + * @param[in] in_latency Input latency in nanoseconds. + * @param[out] out_latency Output latency in nanoseconds. + * @param[out] out1 Unknown output. + */ +Result StartAudioOut(u32 audio_handle, const BtdrvPcmParameter *pcm_param, s64 in_latency, s64 *out_latency, u64 *out1); + +/** + * @brief StopAudioOut + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + */ +Result StopAudioOut(u32 audio_handle); + +/** + * @brief GetAudioOutState + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[out] out \ref BtdrvAudioOutState + */ +Result GetAudioOutState(u32 audio_handle, BtdrvAudioOutState *out); + +/** + * @brief GetAudioOutFeedingCodec + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[out] out \ref BtdrvAudioCodec + */ +Result GetAudioOutFeedingCodec(u32 audio_handle, BtdrvAudioCodec *out); + +/** + * @brief GetAudioOutFeedingParameter + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[out] out \ref BtdrvPcmParameter + */ +Result GetAudioOutFeedingParameter(u32 audio_handle, BtdrvPcmParameter *out); + +/** + * @brief AcquireAudioOutStateChangedEvent + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[out] out_event Output Event. + * @param[in] autoclear Event autoclear. + */ +Result AcquireAudioOutStateChangedEvent(u32 audio_handle, Event* out_event, bool autoclear); + +/** + * @brief AcquireAudioOutBufferAvailableEvent + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[out] out_event Output Event. + * @param[in] autoclear Event autoclear. + */ +Result AcquireAudioOutBufferAvailableEvent(u32 audio_handle, Event* out_event, bool autoclear); + +/** + * @brief SendAudioData + * @note Only available on [12.0.0+]. + * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + * @param[out] Output transferred size. This is always either 0 (error occured) or the buffer size. + */ +Result SendAudioData(u32 audio_handle, const void* buffer, size_t size, u64 *transferred_size); + +/** + * @brief AcquireAudioControlInputStateChangedEvent + * @note Only available on [12.0.0+]. + * @param[out] out_event Output Event. + * @param[in] autoclear Event autoclear. + */ +Result AcquireAudioControlInputStateChangedEvent(Event* out_event, bool autoclear); + +/** + * @brief GetAudioControlInputState + * @note Only available on [12.0.0+]. + * @param[out] states Output array of \ref BtdrvAudioControlButtonState. + * @param[in] count Size of the states array in entries, the maximum is 0xF. + * @param[out] total_out Total output entries. + */ +Result GetAudioControlInputState(BtdrvAudioControlButtonState *states, s32 count, s32 *total_out); + +/** + * @brief AcquireAudioConnectionStateChangedEvent + * @note Only available on [12.0.0-13.2.1]. + * @param[out] out_event Output Event. + * @param[in] autoclear Event autoclear. + */ +Result AcquireAudioConnectionStateChangedEvent(Event* out_event, bool autoclear); + +/** + * @brief GetConnectedAudioDevice + * @note Only available on [12.0.0-13.2.1]. + * @param[out] addrs Output array of \ref BtdrvAddress. + * @param[in] count Size of the addrs array in entries, the maximum is 0x8. + * @param[out] total_out Total output entries. + */ +Result GetConnectedAudioDevice(BtdrvAddress *addrs, s32 count, s32 *total_out); + +/** + * @brief CloseAudioControlInput + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result CloseAudioControlInput(BtdrvAddress addr); + +/** + * @brief RegisterAudioControlNotification + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[in] event_type AvrcEventType + */ +Result RegisterAudioControlNotification(BtdrvAddress addr, u32 event_type); + +/** + * @brief SendAudioControlPassthroughCommand + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[in] op_id AvrcOperationId + * @param[in] state_type AvrcStateType + */ +Result SendAudioControlPassthroughCommand(BtdrvAddress addr, u32 op_id, u32 state_type); + +/** + * @brief SendAudioControlSetAbsoluteVolumeCommand + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[in] val Input value + */ +Result SendAudioControlSetAbsoluteVolumeCommand(BtdrvAddress addr, s32 val); + +/** + * @brief IsManufacturingMode + * @note Only available on [5.0.0+]. + * @param[out] out Output flag. + */ +Result IsManufacturingMode(bool *out); + +/** + * @brief EmulateBluetoothCrash + * @note Only available on [7.0.0+]. + * @param[in] reason \ref BtdrvFatalReason + */ +Result EmulateBluetoothCrash(BtdrvFatalReason reason); + +/** + * @brief GetBleChannelMap + * @note Only available on [9.0.0+]. + * @param[out] out \ref BtdrvChannelMapList + */ +Result GetBleChannelMap(BtdrvChannelMapList *out); + +/** + * @brief Read + * @note Used by \ref btdrvGetHidReportEventInfo on [7.0.0+]. + * @param c \ref BtdrvCircularBuffer + */ +void* CircularBufferRead(BtdrvCircularBuffer *c); + +/** + * @brief Free + * @note Used by \ref btdrvGetHidReportEventInfo on [7.0.0+]. + * @param c \ref BtdrvCircularBuffer + */ +bool CircularBufferFree(BtdrvCircularBuffer *c); + +} // namespace btdrv + +/// @brief C++ wrappers for the `btm` API. +/// @details Wraps: switch/services/btm.h. +namespace btm { + +/// Initialize btm. +Result Initialize(void); + +/// Exit btm. +void Exit(void); + +/// Gets the Service object for the actual btm service session. +Service* GetServiceSession(void); + +/** + * @brief GetState + * @param[out] out \ref BtmState + */ +Result GetState(BtmState *out); + +/** + * @brief GetHostDeviceProperty + * @param[out] out \ref BtmHostDeviceProperty + */ +Result GetHostDeviceProperty(BtmHostDeviceProperty *out); + +/** + * @brief AcquireDeviceConditionEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireDeviceConditionEvent(Event* out_event); + +/** + * @brief GetDeviceCondition [1.0.0-12.1.0] + * @param[out] out \ref BtmDeviceConditionList + */ +Result LegacyGetDeviceCondition(BtmDeviceConditionList *out); + +/** + * @brief GetDeviceCondition [13.0.0+] + * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. + * @param[out] out \ref BtmDeviceCondition + * @param[in] count Size of the out array in entries. + * @param[out] total_out Total output entries. + */ +Result GetDeviceCondition(BtmProfile profile, BtmDeviceCondition *out, size_t count, s32 *total_out); + +/** + * @brief SetBurstMode + * @param[in] addr \ref BtdrvAddress + * @param[in] flag Flag + */ +Result SetBurstMode(BtdrvAddress addr, bool flag); + +/** + * @brief SetSlotMode + * @param[in] list \ref BtmDeviceSlotModeList + */ +Result SetSlotMode(const BtmDeviceSlotModeList *list); + +/** + * @brief SetBluetoothMode + * @note Only available on pre-9.0.0. + * @param[in] mode \ref BtmBluetoothMode + */ +Result SetBluetoothMode(BtmBluetoothMode mode); + +/** + * @brief SetWlanMode + * @param[in] mode \ref BtmWlanMode + */ +Result SetWlanMode(BtmWlanMode mode); + +/** + * @brief AcquireDeviceInfoEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireDeviceInfoEvent(Event* out_event); + +/** + * @brief GetDeviceInfo [1.0.0-12.1.0] + * @param[out] out \ref BtmDeviceInfoList + */ +Result LegacyGetDeviceInfo(BtmDeviceInfoList *out); + +/** + * @brief GetDeviceInfo [13.0.0+] + * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. + * @param[out] out \ref BtmDeviceInfo + * @param[in] count Size of the out array in entries. + * @param[out] total_out Total output entries. + */ +Result GetDeviceInfo(BtmProfile profile, BtmDeviceInfo *out, size_t count, s32 *total_out); + +/** + * @brief AddDeviceInfo [1.0.0-12.1.0] + * @param[in] info \ref BtmDeviceInfo + */ +Result LegacyAddDeviceInfo(const BtmDeviceInfoLegacy *info); + +/** + * @brief AddDeviceInfo [13.0.0+] + * @param[in] info \ref BtmDeviceInfo + */ +Result AddDeviceInfo(const BtmDeviceInfo *info); + +/** + * @brief RemoveDeviceInfo + * @param[in] addr \ref BtdrvAddress + */ +Result RemoveDeviceInfo(BtdrvAddress addr); + +/** + * @brief IncreaseDeviceInfoOrder + * @param[in] addr \ref BtdrvAddress + */ +Result IncreaseDeviceInfoOrder(BtdrvAddress addr); + +/** + * @brief LlrNotify + * @param[in] addr \ref BtdrvAddress + * @param[in] unk [9.0.0+] Unknown + */ +Result LlrNotify(BtdrvAddress addr, s32 unk); + +/** + * @brief EnableRadio + */ +Result EnableRadio(void); + +/** + * @brief DisableRadio + */ +Result DisableRadio(void); + +/** + * @brief HidDisconnect + * @param[in] addr \ref BtdrvAddress + */ +Result HidDisconnect(BtdrvAddress addr); + +/** + * @brief HidSetRetransmissionMode + * @param[in] addr \ref BtdrvAddress + * @param[in] list \ref BtmZeroRetransmissionList + */ +Result HidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list); + +/** + * @brief AcquireAwakeReqEvent + * @note Only available on [2.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireAwakeReqEvent(Event* out_event); + +/** + * @brief AcquireLlrStateEvent + * @note Only available on [4.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireLlrStateEvent(Event* out_event); + +/** + * @brief IsLlrStarted + * @note Only available on [4.0.0+]. + * @param[out] out Output flag. + */ +Result IsLlrStarted(bool *out); + +/** + * @brief EnableSlotSaving + * @note Only available on [4.0.0+]. + * @param[in] flag Flag + */ +Result EnableSlotSaving(bool flag); + +/** + * @brief ProtectDeviceInfo + * @note Only available on [5.0.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[in] flag Flag + */ +Result ProtectDeviceInfo(BtdrvAddress addr, bool flag); + +/** + * @brief AcquireBleScanEvent + * @note Only available on [5.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleScanEvent(Event* out_event); + +/** + * @brief GetBleScanParameterGeneral + * @note Only available on [5.1.0+]. + * @param[in] parameter_id Must be value 0x1 or 0xFFFF. + * @param[out] out \ref BtdrvBleAdvertisePacketParameter + */ +Result GetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out); + +/** + * @brief GetBleScanParameterSmartDevice + * @note Only available on [5.1.0+]. + * @param[in] parameter_id Must be value 0x2. + * @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0. + */ +Result GetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out); + +/** + * @brief StartBleScanForGeneral + * @note Only available on [5.1.0+]. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param); + +/** + * @brief StopBleScanForGeneral + * @note Only available on [5.1.0+]. + */ +Result StopBleScanForGeneral(void); + +/** + * @brief GetBleScanResultsForGeneral + * @note Only available on [5.1.0+]. + * @param[out] results Output array of \ref BtdrvBleScanResult. + * @param[in] count Size of the results array in entries. The max is 10. + * @param[out] total_out Total output entries. + */ +Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out); + +/** + * @brief StartBleScanForPaired + * @note Only available on [5.1.0+]. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param); + +/** + * @brief StopBleScanForPaired + * @note Only available on [5.1.0+]. + */ +Result StopBleScanForPaired(void); + +/** + * @brief StartBleScanForSmartDevice + * @note Only available on [5.1.0+]. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief StopBleScanForSmartDevice + * @note Only available on [5.1.0+]. + */ +Result StopBleScanForSmartDevice(void); + +/** + * @brief GetBleScanResultsForSmartDevice + * @note Only available on [5.1.0+]. + * @param[out] results Output array of \ref BtdrvBleScanResult. + * @param[in] count Size of the results array in entries. The max is 10. + * @param[out] total_out Total output entries. + */ +Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out); + +/** + * @brief AcquireBleConnectionEvent + * @note Only available on [5.1.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleConnectionEvent(Event* out_event); + +/** + * @brief BleConnect + * @note Only available on [5.0.0+]. + * @note The \ref BtdrvAddress must not be already connected. A maximum of 4 devices can be connected. + * @param[in] addr \ref BtdrvAddress + */ +Result BleConnect(BtdrvAddress addr); + +/** + * @brief BleOverrideConnection + * @note Only available on [5.1.0+]. + * @param[in] id Same as \ref btmBleDisconnect. + */ +Result BleOverrideConnection(u32 id); + +/** + * @brief BleDisconnect + * @note Only available on [5.0.0+]. + * @param[in] connection_handle This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid. + */ +Result BleDisconnect(u32 connection_handle); + +/** + * @brief BleGetConnectionState + * @note Only available on [5.0.0+]. + * @param[out] info Output array of \ref BtdrvBleConnectionInfo. + * @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4. + * @param[out] total_out Total output entries. + */ +Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out); + +/** + * @brief BleGetGattClientConditionList + * @note Only available on [5.0.0+]. + * @param[out] list \ref BtmGattClientConditionList + */ +Result BleGetGattClientConditionList(BtmGattClientConditionList *list); + +/** + * @brief AcquireBlePairingEvent + * @note Only available on [5.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBlePairingEvent(Event* out_event); + +/** + * @brief BlePairDevice + * @note Only available on [5.1.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); + +/** + * @brief BleUnpairDeviceOnBoth + * @note Only available on [5.1.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result BleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); + +/** + * @brief BleUnPairDevice + * @note Only available on [5.1.0+]. + * @param[in] addr \ref BtdrvAddress + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result BleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param); + +/** + * @brief BleGetPairedAddresses + * @note Only available on [5.1.0+]. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + * @param[out] addrs Output array of \ref BtdrvAddress. + * @param[in] count Size of the addrs array in entries. + * @param[out] total_out Total output entries. The max is 10. + */ +Result BleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out); + +/** + * @brief AcquireBleServiceDiscoveryEvent + * @note Only available on [5.1.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleServiceDiscoveryEvent(Event* out_event); + +/** + * @brief GetGattServices + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[out] services Output array of \ref BtmGattService. + * @param[in] count Size of the services array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out); + +/** + * @brief Same as \ref btmGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid. + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[out] service \ref BtmGattService + * @param[out] flag Whether a \ref BtmGattService was returned. + */ +Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag); + +/** + * @brief Same as \ref btmGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields. + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] service_handle ServiceHandle + * @param[out] services \ref BtmGattService + * @param[in] count Size of the services array in entries. The max is 100. + * @param[out] out Output value. + */ +Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out); + +/** + * @brief This is similar to \ref btmGetGattIncludedServices except this only returns 1 \ref BtmGattService. + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] attribute_handle AttributeHandle + * @param[out] service \ref BtmGattService + * @param[out] flag Whether a \ref BtmGattService was returned. + */ +Result GetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag); + +/** + * @brief GetGattCharacteristics + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return. + * @param[out] characteristics \ref BtmGattCharacteristic + * @param[in] count Size of the characteristics array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out); + +/** + * @brief GetGattDescriptors + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return. + * @param[out] descriptors \ref BtmGattDescriptor + * @param[in] count Size of the descriptors array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out); + +/** + * @brief AcquireBleMtuConfigEvent + * @note Only available on [5.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleMtuConfigEvent(Event* out_event); + +/** + * @brief ConfigureBleMtu + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[in] mtu MTU + */ +Result ConfigureBleMtu(u32 connection_handle, u16 mtu); + +/** + * @brief GetBleMtu + * @note Only available on [5.0.0+]. + * @param[in] connection_handle Same as \ref btmBleDisconnect. + * @param[out] out Output MTU. + */ +Result GetBleMtu(u32 connection_handle, u16 *out); + +/** + * @brief RegisterBleGattDataPath + * @note Only available on [5.0.0+]. + * @param[in] path \ref BtmBleDataPath + */ +Result RegisterBleGattDataPath(const BtmBleDataPath *path); + +/** + * @brief UnregisterBleGattDataPath + * @note Only available on [5.0.0+]. + * @param[in] path \ref BtmBleDataPath + */ +Result UnregisterBleGattDataPath(const BtmBleDataPath *path); + +/** + * @brief RegisterAppletResourceUserId + * @note Only available on [5.0.0+]. + * @param[in] AppletResourceUserId AppletResourceUserId + * @param[in] unk Unknown + */ +Result RegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk); + +/** + * @brief UnregisterAppletResourceUserId + * @note Only available on [5.0.0+]. + * @param[in] AppletResourceUserId AppletResourceUserId + */ +Result UnregisterAppletResourceUserId(u64 AppletResourceUserId); + +/** + * @brief SetAppletResourceUserId + * @note Only available on [5.0.0+]. + * @param[in] AppletResourceUserId AppletResourceUserId + */ +Result SetAppletResourceUserId(u64 AppletResourceUserId); + +/** + * @brief GetShortenedDeviceInfo + * @note Only available on [13.0.0+]. + * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. + * @param[out] out \ref BtmShortenedDeviceInfo + * @param[in] count Size of the out array in entries. + * @param[out] total_out Total output entries. + */ +Result GetShortenedDeviceInfo(BtmProfile profile, BtmShortenedDeviceInfo *out, size_t count, s32 *total_out); + +/** + * @brief GetShortenedDeviceCondition + * @note Only available on [14.0.0+]. + * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. + * @param[out] out \ref BtmShortenedDeviceCondition + * @param[in] count Size of the out array in entries. + * @param[out] total_out Total output entries. + */ +Result GetShortenedDeviceCondition(BtmProfile profile, BtmShortenedDeviceCondition *out, size_t count, s32 *total_out); + +} // namespace btm + +/// @brief C++ wrappers for the `btmsys` API. +/// @details Wraps: switch/services/btmsys.h. +namespace btmsys { + +/// Initialize btm:sys. +Result Initialize(void); + +/// Exit btm:sys. +void Exit(void); + +/// Gets the Service object for the actual btm:sys service session. This object must be closed by the user once finished using cmds with this. +Result GetServiceSession(Service* srv_out); + +/// Gets the Service object for IBtmSystemCore. +Service* GetServiceSession_IBtmSystemCore(void); + +/** + * @brief StartGamepadPairing + */ +Result StartGamepadPairing(void); + +/** + * @brief CancelGamepadPairing + */ +Result CancelGamepadPairing(void); + +/** + * @brief ClearGamepadPairingDatabase + */ +Result ClearGamepadPairingDatabase(void); + +/** + * @brief GetPairedGamepadCount + * @param[out] out Output count. + */ +Result GetPairedGamepadCount(u8 *out); + +/** + * @brief EnableRadio + */ +Result EnableRadio(void); + +/** + * @brief DisableRadio + */ +Result DisableRadio(void); + +/** + * @brief GetRadioOnOff + * @param[out] out Output flag. + */ +Result GetRadioOnOff(bool *out); + +/** + * @brief AcquireRadioEvent + * @note Only available on [3.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireRadioEvent(Event* out_event); + +/** + * @brief AcquireGamepadPairingEvent + * @note Only available on [3.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireGamepadPairingEvent(Event* out_event); + +/** + * @brief IsGamepadPairingStarted + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsGamepadPairingStarted(bool *out); + +/** + * @brief StartAudioDeviceDiscovery + * @note Only available on [13.0.0+]. + */ +Result StartAudioDeviceDiscovery(void); + +/** + * @brief StopAudioDeviceDiscovery + * @note Only available on [13.0.0+]. + */ +Result StopAudioDeviceDiscovery(void); + +/** + * @brief IsDiscoveryingAudioDevice + * @note Only available on [13.0.0+]. + * @param[out] out Output flag. + */ +Result IsDiscoveryingAudioDevice(bool *out); + +/** + * @brief GetDiscoveredAudioDevice + * @note Only available on [13.0.0+]. + * @param[out] out Output array of \ref BtmAudioDevice. + * @param[in] count Size of the out array in entries. The max is 15. + * @param[out] total_out Total output entries. + */ +Result GetDiscoveredAudioDevice(BtmAudioDevice *out, s32 count, s32 *total_out); + +/** + * @brief AcquireAudioDeviceConnectionEvent + * @note Only available on [13.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireAudioDeviceConnectionEvent(Event* out_event); + +/** + * @brief ConnectAudioDevice + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result ConnectAudioDevice(BtdrvAddress addr); + +/** + * @brief IsConnectingAudioDevice + * @note Only available on [13.0.0+]. + * @param[out] out Output flag. + */ +Result IsConnectingAudioDevice(bool *out); + +/** + * @brief GetConnectedAudioDevices + * @note Only available on [13.0.0+]. + * @param[out] out Output array of \ref BtmAudioDevice. + * @param[in] count Size of the out array in entries. The max is 8. + * @param[out] total_out Total output entries. + */ +Result GetConnectedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out); + +/** + * @brief DisconnectAudioDevice + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result DisconnectAudioDevice(BtdrvAddress addr); + +/** + * @brief AcquirePairedAudioDeviceInfoChangedEvent + * @note Only available on [13.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquirePairedAudioDeviceInfoChangedEvent(Event* out_event); + +/** + * @brief GetPairedAudioDevices + * @note Only available on [13.0.0+]. + * @param[out] out Output array of \ref BtmAudioDevice. + * @param[in] count Size of the out array in entries. The max is 10. + * @param[out] total_out Total output entries. + */ +Result GetPairedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out); + +/** + * @brief RemoveAudioDevicePairing + * @note Only available on [13.0.0+]. + * @param[in] addr \ref BtdrvAddress + */ +Result RemoveAudioDevicePairing(BtdrvAddress addr); + +/** + * @brief RequestAudioDeviceConnectionRejection + * @note Only available on [13.0.0+]. + */ +Result RequestAudioDeviceConnectionRejection(void); + +/** + * @brief CancelAudioDeviceConnectionRejection + * @note Only available on [13.0.0+]. + */ +Result CancelAudioDeviceConnectionRejection(void); + +} // namespace btmsys + +/// @brief C++ wrappers for the `btmu` API. +/// @details Wraps: switch/services/btmu.h. +namespace btmu { + +/// Initialize btm:u. +Result Initialize(void); + +/// Exit btm:u. +void Exit(void); + +/// Gets the Service object for the actual btm:u service session. This object must be closed by the user once finished using cmds with this. +Result GetServiceSession(Service* srv_out); + +/// Gets the Service object for IBtmUserCore. +Service* GetServiceSession_IBtmUserCore(void); + +/** + * @brief AcquireBleScanEvent + * @note This is similar to \ref btmAcquireBleScanEvent. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleScanEvent(Event* out_event); + +/** + * @brief GetBleScanFilterParameter + * @note This is the same as \ref btmGetBleScanParameterGeneral. + * @param[in] parameter_id Must be value 0x1 or 0xFFFF. + * @param[out] out \ref BtdrvBleAdvertisePacketParameter + */ +Result GetBleScanFilterParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out); + +/** + * @brief GetBleScanFilterParameter2 + * @note This is the same as \ref btmGetBleScanParameterSmartDevice. + * @param[in] parameter_id Must be value 0x2. + * @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0. + */ +Result GetBleScanFilterParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out); + +/** + * @brief StartBleScanForGeneral + * @note This is similar to \ref btmStartBleScanForGeneral. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param); + +/** + * @brief StopBleScanForGeneral + * @note This is similar to \ref btmStopBleScanForGeneral. + */ +Result StopBleScanForGeneral(void); + +/** + * @brief GetBleScanResultsForGeneral + * @note This is similar to \ref btmGetBleScanResultsForGeneral. + * @param[out] results Output array of \ref BtdrvBleScanResult. + * @param[in] count Size of the results array in entries. The max is 10. + * @param[out] total_out Total output entries. + */ +Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out); + +/** + * @brief StartBleScanForPaired + * @note This is similar to \ref btmStartBleScanForPaired. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param); + +/** + * @brief StopBleScanForPaired + * @note This is similar to \ref btmStopBleScanForPaired. + */ +Result StopBleScanForPaired(void); + +/** + * @brief StartBleScanForSmartDevice + * @note This is similar to \ref btmStartBleScanForSmartDevice. + * @param[in] uuid \ref BtdrvGattAttributeUuid + */ +Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid); + +/** + * @brief StopBleScanForSmartDevice + * @note This is similar to \ref btmStopBleScanForSmartDevice. + */ +Result StopBleScanForSmartDevice(void); + +/** + * @brief GetBleScanResultsForSmartDevice + * @note This is similar to \ref btmGetBleScanResultsForSmartDevice. + * @param[out] results Output array of \ref BtdrvBleScanResult. + * @param[in] count Size of the results array in entries. The max is 10. + * @param[out] total_out Total output entries. + */ +Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out); + +/** + * @brief AcquireBleConnectionEvent + * @note This is similar to \ref btmAcquireBleConnectionEvent. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleConnectionEvent(Event* out_event); + +/** + * @brief BleConnect + * @note This is similar to \ref btmBleConnect. + * @param[in] addr \ref BtdrvAddress + */ +Result BleConnect(BtdrvAddress addr); + +/** + * @brief BleDisconnect + * @note This is similar to \ref btmBleDisconnect. + * @param[in] connection_handle This must match a BtdrvBleConnectionInfo::connection_handle from \ref btmuBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid. + */ +Result BleDisconnect(u32 connection_handle); + +/** + * @brief BleGetConnectionState + * @note This is similar to \ref btmBleGetConnectionState. + * @param[out] info Output array of \ref BtdrvBleConnectionInfo. + * @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4. + * @param[out] total_out Total output entries. + */ +Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out); + +/** + * @brief AcquireBlePairingEvent + * @note This is similar to \ref btmAcquireBlePairingEvent. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBlePairingEvent(Event* out_event); + +/** + * @brief BlePairDevice + * @note This is similar to \ref btmBlePairDevice. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); + +/** + * @brief BleUnPairDevice + * @note This is similar to \ref btmBleUnpairDeviceOnBoth. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result BleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); + +/** + * @brief BleUnPairDevice2 + * @note This is similar to \ref btmBleUnPairDevice. + * @param[in] addr \ref BtdrvAddress + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + */ +Result BleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param); + +/** + * @brief BleGetPairedDevices + * @note This is similar to \ref btmBleGetPairedAddresses. + * @param[in] param \ref BtdrvBleAdvertisePacketParameter + * @param[out] addrs Output array of \ref BtdrvAddress. + * @param[in] count Size of the addrs array in entries. + * @param[out] total_out Total output entries. The max is 10. + */ +Result BleGetPairedDevices(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out); + +/** + * @brief AcquireBleServiceDiscoveryEvent + * @note This is similar to \ref btmAcquireBleServiceDiscoveryEvent. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleServiceDiscoveryEvent(Event* out_event); + +/** + * @brief GetGattServices + * @note This is similar to \ref btmGetGattServices. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[out] services Output array of \ref BtmGattService. + * @param[in] count Size of the services array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out); + +/** + * @brief Same as \ref btmuGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid. + * @note This is similar to \ref btmGetGattService. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] uuid \ref BtdrvGattAttributeUuid + * @param[out] service \ref BtmGattService + * @param[out] flag Whether a \ref BtmGattService was returned. + */ +Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag); + +/** + * @brief Same as \ref btmuGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields. + * @note This is similar to \ref btmGetGattIncludedServices. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] service_handle ServiceHandle + * @param[out] services \ref BtmGattService + * @param[in] count Size of the services array in entries. The max is 100. + * @param[out] out Output value. + */ +Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out); + +/** + * @brief This is similar to \ref btmuGetGattIncludedServices except this only returns 1 \ref BtmGattService. + * @note This is similar to \ref btmGetBelongingService. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] attribute_handle AttributeHandle + * @param[out] service \ref BtmGattService + * @param[out] flag Whether a \ref BtmGattService was returned. + */ +Result GetBelongingGattService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag); + +/** + * @brief GetGattCharacteristics + * @note This is similar to \ref btmGetGattCharacteristics. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return. + * @param[out] characteristics \ref BtmGattCharacteristic + * @param[in] count Size of the characteristics array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out); + +/** + * @brief GetGattDescriptors + * @note This is similar to \ref btmGetGattDescriptors. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return. + * @param[out] descriptors \ref BtmGattDescriptor + * @param[in] count Size of the descriptors array in entries. The max is 100. + * @param[out] total_out Total output entries. + */ +Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out); + +/** + * @brief AcquireBleMtuConfigEvent + * @note This is similar to \ref btmAcquireBleMtuConfigEvent. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result AcquireBleMtuConfigEvent(Event* out_event); + +/** + * @brief ConfigureBleMtu + * @note This is similar to \ref btmConfigureBleMtu. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[in] mtu MTU + */ +Result ConfigureBleMtu(u32 connection_handle, u16 mtu); + +/** + * @brief GetBleMtu + * @note This is similar to \ref btmGetBleMtu. + * @param[in] connection_handle Same as \ref btmuBleDisconnect. + * @param[out] out Output MTU. + */ +Result GetBleMtu(u32 connection_handle, u16 *out); + +/** + * @brief RegisterBleGattDataPath + * @note This is similar to \ref btmRegisterBleGattDataPath. + * @param[in] path \ref BtmBleDataPath + */ +Result RegisterBleGattDataPath(const BtmBleDataPath *path); + +/** + * @brief UnregisterBleGattDataPath + * @note This is similar to \ref btmUnregisterBleGattDataPath. + * @param[in] path \ref BtmBleDataPath + */ +Result UnregisterBleGattDataPath(const BtmBleDataPath *path); + +} // namespace btmu + +/// @brief C++ wrappers for the `capmtp` API. +/// @details Wraps: switch/services/capmtp.h. +namespace capmtp { + +Result Initialize(void* mem, size_t size, u32 app_count, u32 max_img, u32 max_vid, const char *other_name); + +void Exit(void); + +Service* GetRootServiceSession(void); + +Service* GetServiceSession(void); + +Result StartCommandHandler(void); + +Result StopCommandHandler(void); + +bool IsRunning(void); + +Event * GetConnectionEvent(void); + +bool IsConnected(void); + +Event * GetScanErrorEvent(void); + +Result GetScanError(void); + +} // namespace capmtp + +/// @brief C++ wrappers for the `caps` API. +/// @details Wraps: switch/services/caps.h, switch/services/capsa.h. +namespace caps { + +/// ImageOrientation +using ::AlbumImageOrientation; +/// AlbumReportOption +using ::AlbumReportOption; +/// AlbumCache +using ::CapsAlbumCache; +using ::CapsAlbumContentsUsage; +using ::CapsAlbumContentsUsageFlag; +/// AlbumEntry +using ::CapsAlbumEntry; +/// AlbumFileContents +using ::CapsAlbumFileContents; +/// AlbumFileContentsFlag +using ::CapsAlbumFileContentsFlag; +/// AlbumFileDateTime. This corresponds to each field in the Album entry filename, prior to the "-": "YYYYMMDDHHMMSSII". +using ::CapsAlbumFileDateTime; +/// AlbumEntryId +using ::CapsAlbumFileId; +using ::CapsAlbumStorage; +using ::CapsAlbumUsage16; +using ::CapsAlbumUsage2; +using ::CapsAlbumUsage3; +/// ApplicationAlbumEntry +using ::CapsApplicationAlbumEntry; +/// ApplicationAlbumFileEntry +using ::CapsApplicationAlbumFileEntry; +/// ApplicationData +using ::CapsApplicationData; +/// ContentType +using ::CapsContentType; +/// LoadAlbumScreenShotImageOutput +using ::CapsLoadAlbumScreenShotImageOutput; +/// LoadAlbumScreenShotImageOutputForApplication +using ::CapsLoadAlbumScreenShotImageOutputForApplication; +/// ScreenShotAttribute +using ::CapsScreenShotAttribute; +/// ScreenShotAttributeForApplication. Only unk_x0 is used by official sw. +using ::CapsScreenShotAttributeForApplication; +/// ScreenShotDecodeOption +using ::CapsScreenShotDecodeOption; +/// ScreenShotDecoderFlag +using ::CapsScreenShotDecoderFlag; +/// UserIdList +using ::CapsUserIdList; + +/// Gets the ShimLibraryVersion. +u64 GetShimLibraryVersion(void); + +/// Gets the default start_datetime. +CapsAlbumFileDateTime GetDefaultStartDateTime(void); + +/// Gets the default end_datetime. +CapsAlbumFileDateTime GetDefaultEndDateTime(void); + +/// Convert a \ref CapsApplicationAlbumFileEntry to \ref CapsApplicationAlbumEntry. +void ConvertApplicationAlbumFileEntryToApplicationAlbumEntry(CapsApplicationAlbumEntry *out, CapsApplicationAlbumFileEntry *in); + +/// Convert a \ref CapsApplicationAlbumEntry to \ref CapsApplicationAlbumFileEntry. Should only be used on [7.0.0+]. +void ConvertApplicationAlbumEntryToApplicationAlbumFileEntry(CapsApplicationAlbumFileEntry *out, CapsApplicationAlbumEntry *in); + +/** + * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. + * @note Only available on [3.0.0+]. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[out] attr \ref CapsScreenShotAttribute + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] opts \ref CapsScreenShotDecodeOption + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotThumbnailImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +} // namespace caps + +/// @brief C++ wrappers for the `capsa` API. +/// @details Wraps: switch/services/capsa.h. +namespace capsa { + +/// Initialize caps:a. +Result Initialize(void); + +/// Exit caps:a. +void Exit(void); + +/// Gets the Service for caps:a. +Service* GetServiceSession(void); + +/// Gets the Service for IAlbumAccessorSession, only initialized after \ref capsaOpenAlbumMovieStream was used (unaffected by using \ref capsaCloseAlbumMovieStream). +Service* GetServiceSession_Accessor(void); + +/** + * @brief Gets the amount of files at a AlbumStorage. + * @param[in] storage \ref CapsAlbumStorage + * @param[out] count Amount of files. + */ +Result GetAlbumFileCount(CapsAlbumStorage storage, u64 *count); + +/** + * @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage matches the input one. + * @param[in] storage \ref CapsAlbumStorage + * @param[out] out Total output entries. + * @param[out] entries Output array of \ref CapsAlbumEntry. + * @param[in] count Reserved entry count. + */ +Result GetAlbumFileList(CapsAlbumStorage storage, u64 *out, CapsAlbumEntry *entries, u64 count); + +/** + * @brief Loads a file into the specified buffer. + * @param[in] file_id \ref CapsAlbumFileId + * @param[out] out_size Size of the AlbumFile. + * @param[out] filebuf File output buffer. + * @param[in] filebuf_size Size of the filebuf. + */ +Result LoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* filebuf, u64 filebuf_size); + +/** + * @brief Deletes an AlbumFile corresponding to the specified \ref CapsAlbumFileId. + * @param[in] file_id \ref CapsAlbumFileId + */ +Result DeleteAlbumFile(const CapsAlbumFileId *file_id); + +/** + * @brief Copies an AlbumFile to the specified \ref CapsAlbumStorage. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] dst_storage \ref CapsAlbumStorage + */ +Result StorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage); + +/** + * @brief Gets the mount status of the specified \ref CapsAlbumStorage. + * @param[in] storage \ref CapsAlbumStorage + * @param[out] is_mounted Boolean over whether the storage is mounted or not. + */ +Result IsAlbumMounted(CapsAlbumStorage storage, bool *is_mounted); + +/** + * @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage. + * @param[in] storage \ref CapsAlbumStorage + * @param[out] out \ref CapsAlbumUsage2 + */ +Result GetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out); + +/** + * @brief Gets the size for the specified AlbumFile. + * @param[in] file_id \ref CapsAlbumFileId + * @param[out] size Size of the file. + */ +Result GetAlbumFileSize(const CapsAlbumFileId *file_id, u64 *size); + +/** + * @brief Load the Thumbnail for the specified AlbumFile. + * @note Will always be 320x180. + * @param[in] file_id \ref CapsAlbumFileId + * @param[out] out_size Size of the Thumbnail. + * @param[out] image JPEG image output buffer. + * @param[in] image_size Image buffer size. + */ +Result LoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size); + +/** + * @brief Load the ScreenShotImage for the specified AlbumFile. + * @note Only available on [2.0.0+]. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[in] file_id \ref CapsAlbumFileId + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. + * @note Only available on [2.0.0+]. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[in] file_id \ref CapsAlbumFileId + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotThumbnailImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an ApplicationId. + * @note Only available on [2.0.0+]. + * @param[out] entry \ref CapsAlbumEntry + * @param[in] application_entry \ref CapsApplicationAlbumEntry + * @param[in] application_id ApplicationId + */ +Result GetAlbumEntryFromApplicationAlbumEntry(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry, u64 application_id); + +/** + * @brief Load the ScreenShotImage for the specified AlbumFile. + * @note Only available on [3.0.0+]. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] opts \ref CapsScreenShotDecodeOption + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. + * @note Only available on [3.0.0+]. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] opts \ref CapsScreenShotDecodeOption + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotThumbnailImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Load the ScreenShotImage for the specified AlbumFile. + * @note Only available on [3.0.0+]. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[out] attr \ref CapsScreenShotAttribute + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] opts \ref CapsScreenShotDecodeOption + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage. + * @note Only available on [4.0.0+]. + * @param[in] storage \ref CapsAlbumStorage + * @param[out] out \ref CapsAlbumUsage3 + */ +Result GetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out); + +/** + * @brief Returns the result for a AlbumStorage mount. + * @note Only available on [4.0.0+]. + * @param[in] storage \ref CapsAlbumStorage + */ +Result GetAlbumMountResult(CapsAlbumStorage storage); + +/** + * @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage. + * @note Only available on [4.0.0+]. + * @param[in] storage \ref CapsAlbumStorage + * @param[in] flags \ref CapsAlbumFileContentsFlag + * @param[out] out \ref CapsAlbumUsage16 + */ +Result GetAlbumUsage16(CapsAlbumStorage storage, u8 flags, CapsAlbumUsage16 *out); + +/** + * @brief Returns the start and end of the Applet Id range. + * @note Only available on [6.0.0+]. + * @param[out] success Returns bool over whether the call was handled or not. + * @param[out] min Mimimum applet id. Always 0x0100000000001000 + * @param[out] max Maximum applet id. Always 0x0100000000001FFF + */ +Result GetMinMaxAppletId(bool* success, u64* min, u64* max); + +/** + * @brief Gets the amount of files of the specified type at a AlbumStorage. + * @note Only available on [5.0.0+]. + * @param[in] storage \ref CapsAlbumStorage + * @param[in] flags \ref CapsAlbumFileContentsFlag + * @param[out] count Amount of files. + */ +Result GetAlbumFileCountEx0(CapsAlbumStorage storage, u8 flags, u64 *count); + +/** + * @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage and type matches the input one. + * @note Only available on [5.0.0+]. + * @param[in] storage \ref CapsAlbumStorage + * @param[in] flags \ref CapsAlbumFileContentsFlag + * @param[out] out Total output entries. + * @param[out] entries Output array of \ref CapsAlbumEntry. + * @param[in] count Reserved entry count. + */ +Result GetAlbumFileListEx0(CapsAlbumStorage storage, u8 flags, u64 *out, CapsAlbumEntry *entries, u64 count); + +/** + * @brief Returns the image from the last shown ScreenShot Overlay. + * @param[out] file_id \ref CapsAlbumFileId + * @param[out] out_size Size of the thumbnail image. Always 0x5100. + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54. + */ +Result GetLastOverlayScreenShotThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size); + +/** + * @brief Returns the image from the last shown Movie Overlay. + * @note Only available on [4.0.0+]. + * @param[out] file_id \ref CapsAlbumFileId + * @param[out] out_size Size of the thumbnail image. Always 0x5100. + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54. + */ +Result GetLastOverlayMovieThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size); + +/** + * @brief Gets the currently set autosaving storage. + * @note Wrapper around setsysGetPrimaryAlbumStorage but defaults to NAND if SD isn't available. + * @param[out] storage \ref CapsAlbumStorage + */ +Result GetAutoSavingStorage(CapsAlbumStorage *storage); + +/** + * @brief Gets required size to copy all files from one Storage to another. + * @param[in] dst_storage \ref CapsAlbumStorage + * @param[in] src_storage \ref CapsAlbumStorage + * @param[out] out Required storage space size. + */ +Result GetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64 *out); + +/** + * @brief Load the ScreenShotImage for the specified AlbumFile. + * @note Only available on [4.0.0+]. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] opts \ref CapsScreenShotDecodeOption + * @param[out] out \ref CapsLoadAlbumScreenShotImageOutput + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. + * @note Only available on [4.0.0+]. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] opts \ref CapsScreenShotDecodeOption + * @param[out] out \ref CapsLoadAlbumScreenShotImageOutput + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + */ +Result LoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size); + +/** + * @brief Unmounts the specified AlbumStorage. + * @param[in] storage \ref CapsAlbumStorage + */ +Result ForceAlbumUnmounted(CapsAlbumStorage storage); + +/** + * @brief Resets mount status for the specified AlbumStorage. + * @note Mounts the Storage if available. + * @param[in] storage \ref CapsAlbumStorage + */ +Result ResetAlbumMountStatus(CapsAlbumStorage storage); + +/** + * @brief Refreshs Album Cache for the specified AlbumStorage. + * @param[in] storage \ref CapsAlbumStorage + */ +Result RefreshAlbumCache(CapsAlbumStorage storage); + +/** + * @brief Gets the AlbumCache of the specified AlbumStorage. + * @note Stubbed on [4.0.0+]. + * @note use \ref capsaGetAlbumCacheEx instead. + * @param[in] storage \ref CapsAlbumStorage + * @param[out] cache \ref CapsAlbumCache + */ +Result GetAlbumCache(CapsAlbumStorage storage, CapsAlbumCache *cache); + +/** + * @brief Gets the AlbumCache for the specified type of the specified AlbumStorage. + * @param[in] storage \ref CapsAlbumStorage + * @param[in] contents \ref CapsAlbumFileContents + * @param[out] cache \ref CapsAlbumCache + */ +Result GetAlbumCacheEx(CapsAlbumStorage storage, CapsAlbumFileContents contents, CapsAlbumCache *cache); + +/** + * @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an AppletResourceUserId. + * @note Only available on [2.0.0+]. + * @param[out] entry \ref CapsAlbumEntry + * @param[in] application_entry \ref CapsApplicationAlbumEntry + */ +Result GetAlbumEntryFromApplicationAlbumEntryAruid(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry); + +/** + * @brief Opens an AlbumMovieStream. + * @note This opens IAlbumAccessorSession if not previously opened, it's closed during \ref capsaExit. + * @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId. + * @note Only available on [4.0.0+]. + * @param[out] stream Stream handle. + * @param[in] entry \ref CapsAlbumFileId + */ +Result OpenAlbumMovieStream(u64 *stream, const CapsAlbumFileId *file_id); + +/** + * @brief Closes an AlbumMovieStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result CloseAlbumMovieStream(u64 stream); + +/** + * @brief Gets the data size of an AlbumMovieStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Size of the actual MP4, without the JPEG at the end. + */ +Result GetAlbumMovieStreamSize(u64 stream, u64 *size); + +/** + * @brief Reads data from an AlbumMovieStream. + * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. + * @note When offset(+size) goes beyond the size from \ref capsaGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ +Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size); + +/** + * @brief Gets the BrokenReason for an AlbumMovieStream. + * @note Official sw doesn't use this. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result GetAlbumMovieReadStreamBrokenReason(u64 stream); + +/** + * @brief Gets the data size of an Image taken from an AlbumMovieStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Expected size of an Image. + */ +Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size); + +/** + * @brief Reads data of an Image taken from an AlbumMovieStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ +Result ReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size); + +/** + * @brief Gets the file attribute of an AlbumMovieStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] attr \ref CapsScreenShotAttribute + */ +Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attr); + +} // namespace capsa + +/// @brief C++ wrappers for the `capsc` API. +/// @details Wraps: switch/services/capsc.h. +namespace capsc { + +using ::CapsApplicationId; + +/// Initialize caps:c +Result Initialize(void); + +/// Exit caps:c. +void Exit(void); + +/// Gets the Service for caps:c. +Service* GetServiceSession(void); + +/** + * @brief Notify the service that a storage is now available. + * @note This will result in capsrv mounting the image directory on that storage medium. + * @param[in] storage \ref CapsAlbumStorage + */ +Result NotifyAlbumStorageIsAvailable(CapsAlbumStorage storage); + +/** + * @brief Notify the service that a storage is now unavailable. + * @note This will result in capsrv unmounting the image directory on that storage medium. + * @param[in] storage \ref CapsAlbumStorage + */ +Result NotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage); + +/** + * @brief Register an applet for later usage. + * @note Called at application launch by the system. + * @note Will generate a random AES-256 key for this application for use on Shim-Version 0. + * @note Only available on [2.0.0+]. + * @param[in] appletResourceUserId AppletResourceUserId. + * @param[in] application_id ApplicationId. + */ +Result RegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id); + +/** + * @brief Unregister an applet. + * @note Called at application exit by the system. + * @note Only available on [2.0.0+]. + * @param[in] appletResourceUserId AppletResourceUserId. + * @param[in] application_id ApplicationId. + */ +Result UnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id); + +/** + * @brief Get an ApplicationId that corresponds to an AppletResourceUserId. + * @note Returns value set by \ref capscRegisterAppletResourceUserId. + * @note Only available on [2.0.0+]. + * @param[out] application_id ApplicationId. + * @param[in] appletResourceUserId AppletResourceUserId. + */ +Result GetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid); + +/** + * @brief Checks whether an ApplicationId is registered. + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + */ +Result CheckApplicationIdRegistered(u64 application_id); + +/** + * @brief Generate an AlbumFileId based on parameters and current time. + * @param[in] application_id ApplicationId. + * @note Only available on [2.0.0+]. + * @param[in] contents \ref CapsAlbumFileContents + * @param[out] file_id \ref CapsAlbumFileId + */ +Result GenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id); + +/** + * @brief Generate an ApplicationAlbumEntry based on parameters. + * @note Output will be different between Shim Version 0 and 1. + * @note Only available on [2.0.0+]. + * @param[out] appEntry \ref CapsApplicationAlbumEntry + * @param[in] entry \ref CapsAlbumEntry + * @param[in] application_id ApplicationId. + */ +Result GenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id); + +/** + * @brief Save a jpeg image. + * @note Only available on [2.0.0-3.0.2]. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] buffer JPEG image buffer. + * @param[in] buffer_size Size of the JPEG image. + */ +Result SaveAlbumScreenShotFile(const CapsAlbumFileId *file_id, const void* buffer, u64 buffer_size); + +/** + * @brief Save a jpeg image. + * @note Only available on [4.0.0+]. + * @note Version 3 as of [9.1.0]. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] version Revision number. + * @param[in] makernote_offset Offset to makernote in JPEG buffer. + * @param[in] makernote_size Size of the makernote in JPEG buffer. + * @param[in] buffer JPEG image buffer. + * @param[in] buffer_size Size of the JPEG image. + */ +Result SaveAlbumScreenShotFileEx(const CapsAlbumFileId *file_id, u64 version, u64 makernote_offset, u64 makernote_size, const void* buffer, u64 buffer_size); + +/** + * @brief Sets thumbnail data for the last taken screenshot. + * @note 96×54 Image will get saved. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] image RGBA8 image buffer. + * @param[in] image_size size of the RGBA8 image buffer. + */ +Result SetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size); + +/** + * @brief Sets thumbnail data for the last recorded movie. + * @note Only availabe on [4.0.0+]. + * @note 96×54 Image will get saved. + * @param[in] file_id \ref CapsAlbumFileId + * @param[in] image RGBA8 image buffer. + * @param[in] image_size size of the RGBA8 image buffer. + */ +Result SetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size); + +/** + * @brief Opens an AlbumMovieReadStream. + * @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capscExit. + * @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId. + * @note Only available on [4.0.0+]. + * @param[out] stream Stream handle. + * @param[in] entry \ref CapsAlbumFileId + */ +Result OpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id); + +/** + * @brief Closes an AlbumMovieReadStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result CloseAlbumMovieStream(u64 stream); + +/** + * @brief Gets the data size of an AlbumMovieReadStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Size of the actual MP4, without the JPEG at the end. + */ +Result GetAlbumMovieStreamSize(u64 stream, u64 *size); + +/** + * @brief Reads data from an AlbumMovieReadStream. + * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. + * @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ +Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size); + +/** + * @brief Gets the BrokenReason for an AlbumMovieReadStream. + * @note Official sw doesn't use this. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result GetAlbumMovieReadStreamBrokenReason(u64 stream); + +/** + * @brief Gets the data size of an Image taken from an AlbumMovieReadStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Expected size of an Image. + */ +Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size); + +/** + * @brief Reads data of an Image taken from an AlbumMovieReadStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] buffer Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ +Result ReadImageDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size); + +/** + * @brief Gets the file attribute of an AlbumMovieReadStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] attr \ref CapsScreenShotAttribute + */ +Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute); + +/** + * @brief Opens an AlbumMovieWriteStream. + * @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capsaExit. + * @note Up to 2 streams can be open at the same time. + * @note Only available on [4.0.0+]. + * @param[out] stream Stream handle. + * @param[in] entry \ref CapsAlbumFileId + */ +Result OpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id); + +/** + * @brief Finish write to AlbumMovieWriteStream. + * @note Copies file from save to destination storage and deletes the temporary file. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result FinishAlbumMovieWriteStream(u64 stream); + +/** + * @brief Closes a finished AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result CommitAlbumMovieWriteStream(u64 stream); + +/** + * @brief Closes an AlbumMovieWriteStream in any state. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result DiscardAlbumMovieWriteStream(u64 stream); + +/** + * @brief Closes an AlbumMovieWriteStream in any state without deleting the temporary file. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result DiscardAlbumMovieWriteStreamNoDelete(u64 stream); + +/** + * @brief Closes a finished AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] entry \ref CapsAlbumEntry + */ +Result CommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry); + +/** + * @brief Start AlbumMovieWriteStream data section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result StartAlbumMovieWriteStreamDataSection(u64 stream); + +/** + * @brief End AlbumMovieWriteStream data section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result EndAlbumMovieWriteStreamDataSection(u64 stream); + +/** + * @brief Start AlbumMovieWriteStream meta section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result StartAlbumMovieWriteStreamMetaSection(u64 stream); + +/** + * @brief End AlbumMovieWriteStream meta section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result EndAlbumMovieWriteStreamMetaSection(u64 stream); + +/** + * @brief Reads data from an AlbumMovieWriteStream. + * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. + * @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] buffer Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ +Result ReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size); + +/** + * @brief Write data to an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[in] buffer Input data buffer. + * @param[in] size Data buffer size. + */ +Result WriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size); + +/** + * @brief Write meta data to an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[in] buffer Input data buffer. + * @param[in] size Data buffer size. + */ +Result WriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size); + +/** + * @brief Gets the BrokenReason for an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ +Result GetAlbumMovieWriteStreamBrokenReason(u64 stream); + +/** + * @brief Gets the data size of an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Size of the data section. + */ +Result GetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size); + +/** + * @brief Sets the data size of an AlbumMovieWriteStream. + * @note Must not be bigger than 2GiB. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Size of the data section. + */ +Result SetAlbumMovieWriteStreamDataSize(u64 stream, u64 size); + +} // namespace capsc + +/// @brief C++ wrappers for the `capsdc` API. +/// @details Wraps: switch/services/capsdc.h. +namespace capsdc { + +/// Initialize caps:dc +Result Initialize(void); + +/// Exit caps:dc. +void Exit(void); + +/// Gets the Service for caps:dc. +Service* GetServiceSession(void); + +/** + * @brief Decodes a jpeg buffer into RGBX. + * @param[in] width Image width. + * @param[in] height Image height. + * @param[in] opts \ref CapsScreenShotDecodeOption. + * @param[in] jpeg Jpeg image input buffer. + * @param[in] jpeg_size Input image buffer size. + * @param[out] out_image RGBA8 image output buffer. + * @param[in] out_image_size Output image buffer size, should be at least large enough for RGBA8 width x height. + */ +Result DecodeJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_image, size_t out_image_size); + +/** + * @brief Shrinks a jpeg's dimensions by 2. + * @note Tries to compress with jpeg quality in this order: 98, 95, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0. + * @note Only available on [17.0.0+]. + * @param[in] width Input image width. + * @param[in] height Input image width. + * @param[in] opts \ref CapsScreenShotDecodeOption. + * @param[in] jpeg Jpeg image input buffer. + * @param[in] jpeg_size Input image buffer size. + * @param[out] out_jpeg Jpeg image output buffer + * @param[in] out_jpeg_size Output image buffer size. + * @param[out] out_result_size size of the resulting JPEG. + */ +Result ShrinkJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size); + +/** + * @brief Shrinks a jpeg. + * @note Fails if the scaled size is larger than the original or the output buffer isn't large enough. + * @note Only available on [19.0.0+]. + * @param[in] scaled_width Wanted image width. + * @param[in] scaled_height Wanted image width. + * @param[in] jpeg_quality has to be in range 0-100. + * @param[in] opts \ref CapsScreenShotDecodeOption. + * @param[in] jpeg Jpeg image input buffer. + * @param[in] jpeg_size Input image buffer size. + * @param[out] out_jpeg Jpeg image output buffer + * @param[in] out_jpeg_size Output image buffer size. + * @param[out] out_result_size size of the resulting jpeg. + */ +Result ShrinkJpegEx(u32 scaled_width, u32 scaled_height, u32 jpeg_quality, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size); + +} // namespace capsdc + +/// @brief C++ wrappers for the `capssc` API. +/// @details Wraps: switch/services/capssc.h. +namespace capssc { + +/// Initialize caps:sc. Only available on [2.0.0+]. +Result Initialize(void); + +/// Exit caps:sc. +void Exit(void); + +/// Gets the Service for caps:sc. +Service* GetServiceSession(void); + +/** + * @brief This takes a screenshot, with the screenshot being written into the output buffer. + * @note Not available with [5.0.0+] (stubbed). + * @note buffer_index and buffer_count correspond to buffers with size 0x384000(1280*720*4). These must not be negative. + * @param buf Output buffer containing the RGBA8 image. + * @param size Size of buf, should be 0x384000(1280*720*4) * buffer_count. + * @param layer_stack \ref ViLayerStack + * @param width Image width, must be 1280. + * @param height Image height, must be 720. + * @param buffer_count Total number of output image buffers. + * @param buffer_index Starting image buffer index. Must be < buffer_count. + * @param timeout Timeout in nanoseconds. A default value of 100000000 can be used. + */ +Result CaptureRawImageWithTimeout(void* buf, size_t size, ViLayerStack layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, s64 timeout); + +/** + * @brief This takes a raw screenshot, with the screenshot being held until \ref capsscCloseRawScreenShotReadStream is called. + * @note Only available on [3.0.0+]. Requires debug mode. + * @param out_size Pointer to write the size of the captured raw image to. Always 0x384000(1280*720*4). + * @param out_width Pointer to write the width of the captured raw image to. Always 1280. + * @param out_height Pointer to write the height of the captured raw image to. Always 720. + * @param layer_stack \ref ViLayerStack + * @param timeout Timeout in nanoseconds. + */ +Result OpenRawScreenShotReadStream(u64 *out_size, u64 *out_width, u64 *out_height, ViLayerStack layer_stack, s64 timeout); + +/** + * @brief Discards a stream opened by \ref capsscOpenRawScreenShotReadStream. + * @note Only available on [3.0.0+]. Requires debug mode. + */ +Result CloseRawScreenShotReadStream(void); + +/** + * @brief Reads from a stream opened by \ref capsscOpenRawScreenShotReadStream. + * @note Only available on [3.0.0+]. Requires debug mode. + * @param bytes_read Pointer to write the amounts of bytes written to buffer. + * @param buf Output buffer containing the RGBA8 image. + * @param size Size of buf. + * @param offset Offset in image where read should start. + */ +Result ReadRawScreenShotReadStream(u64 *bytes_read, void* buf, size_t size, u64 offset); + +/** + * @brief This takes a screenshot, with the screenshot being written as jpeg into the output buffer. + * @note Only available on [9.0.0+]. Requires debug mode before [10.0.0]. + * @param out_jpeg_size Pointer to write the size of the captured jpeg to. + * @param jpeg_buf Output buffer containing the JPEG image. + * @param jpeg_buf_size Size of jpeg_buf, official software uses 0x80000. + * @param layer_stack \ref ViLayerStack + * @param timeout Timeout in nanoseconds. + */ +Result CaptureJpegScreenShot(u64* out_jpeg_size, void* jpeg_buf, size_t jpeg_buf_size, ViLayerStack layer_stack, s64 timeout); + +} // namespace capssc + +/// @brief C++ wrappers for the `capssu` API. +/// @details Wraps: switch/services/capssu.h. +namespace capssu { + +/// Initialize caps:su. Only available on [4.0.0+]. +Result Initialize(void); + +/// Exit caps:su. +void Exit(void); + +/// Gets the Service for caps:su. +Service* GetServiceSession(void); + +/** + * @brief This is a wrapper for \ref capssuSaveScreenShotEx0. + * @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1. + * @param[in] buffer RGBA8 1280x720 image buffer. + * @param[in] size Size of the buffer. + * @param[in] reportoption \ref AlbumReportOption + * @param[in] orientation \ref AlbumImageOrientation + * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. + */ +Result SaveScreenShot(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, CapsApplicationAlbumEntry *out); + +/** + * @brief Similar to \ref capssuSaveScreenShot, except this is a wrapper for \ref capssuSaveScreenShotEx1. + * @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1. + * @note Only available on [8.0.0+]. + * @param[in] buffer RGBA8 1280x720 image data buffer. + * @param[in] size Size of the buffer. + * @param[in] reportoption \ref AlbumReportOption + * @param[in] orientation \ref AlbumImageOrientation + * @param[in] userdata Input UserData buffer. If NULL, the \ref CapsApplicationData will be empty. + * @param[in] userdata_size Input UserData size, must be within bounds for CapsApplicationData::userdata. If 0, the \ref CapsApplicationData will be empty. + * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. + */ +Result SaveScreenShotWithUserData(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const void* userdata, size_t userdata_size, CapsApplicationAlbumEntry *out); + +/** + * @brief Similar to \ref capssuSaveScreenShot, except this is a wrapper for \ref capssuSaveScreenShotEx2. + * @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1. + * @note Only available on [6.0.0+]. + * @param[in] buffer RGBA8 1280x720 image data buffer. + * @param[in] size Size of the buffer. + * @param[in] reportoption \ref AlbumReportOption + * @param[in] orientation \ref AlbumImageOrientation + * @param[in] uids Input array of \ref AccountUid. If NULL, the \ref CapsUserIdList will be empty. + * @param[in] uid_count Size of the uids array in entries, must be within bounds for CapsUserIdList::uids. If 0, the \ref CapsUserIdList will be empty. + * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. + */ +Result SaveScreenShotWithUserIds(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const AccountUid* uids, size_t uid_count, CapsApplicationAlbumEntry *out); + +/** + * @brief Saves an Album screenshot using the specified gfx data in the buffer, with the specified \ref CapsScreenShotAttribute. + * @param[in] buffer RGBA8 1280x720 image data buffer. + * @param[in] size Size of the buffer, must be at least 0x384000. + * @param[in] attr \ref CapsScreenShotAttribute + * @param[in] reportoption \ref AlbumReportOption + * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. + */ +Result SaveScreenShotEx0(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationAlbumEntry *out); + +/** + * @brief Same as \ref capssuSaveScreenShotEx0, except this allows specifying the \ref CapsApplicationData. + * @note Only available on [8.0.0+]. + * @param[in] buffer RGBA8 1280x720 image data buffer. + * @param[in] size Size of the buffer, must be at least 0x384000. + * @param[in] attr \ref CapsScreenShotAttribute + * @param[in] reportoption \ref AlbumReportOption + * @param[in] appdata \ref CapsApplicationData + * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. + */ +Result SaveScreenShotEx1(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationData *appdata, CapsApplicationAlbumEntry *out); + +/** + * @brief Same as \ref capssuSaveScreenShotEx0, except this allows specifying the \ref CapsUserIdList. + * @note Only available on [6.0.0+]. + * @param[in] buffer RGBA8 1280x720 image data buffer. + * @param[in] size Size of the buffer, must be at least 0x384000. + * @param[in] attr \ref CapsScreenShotAttribute + * @param[in] reportoption \ref AlbumReportOption + * @param[in] list \ref CapsUserIdList + * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. + */ +Result SaveScreenShotEx2(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsUserIdList *list, CapsApplicationAlbumEntry *out); + +} // namespace capssu + +/// @brief C++ wrappers for the `capsu` API. +/// @details Wraps: switch/services/capsu.h. +namespace capsu { + +/// Initialize caps:u. Only available on [5.0.0+]. +Result Initialize(void); + +/// Exit caps:u. +void Exit(void); + +/// Gets the Service for caps:u. +Service* GetServiceSession(void); + +/// Gets the Service for IAlbumAccessorApplicationSession, only initialized after \ref capsuOpenAlbumMovieStream was used (unaffected by using \ref capsuCloseAlbumMovieStream). +Service* GetServiceSession_Accessor(void); + +/** + * @brief Gets a listing of \ref CapsApplicationAlbumFileEntry. + * @note On [6.0.0+] this uses GetAlbumFileList1AafeAruidDeprecated, otherwise this uses GetAlbumFileList0AafeAruidDeprecated. + * @note This is an old version of \ref capsuGetAlbumFileList3. + * @param[out] entries Output array of \ref CapsApplicationAlbumFileEntry. + * @param[in] count Max size of the output array in entries. + * @param[in] type \ref CapsContentType + * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[out] total_entries Total output entries. + */ +Result GetAlbumFileListDeprecated1(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries); + +/** + * @brief Gets a listing of \ref CapsApplicationAlbumFileEntry, where the AlbumFile has an UserId which matches the input one. See also \ref capssuSaveScreenShotWithUserIds. + * @note Only available on [6.0.0+]. + * @note This is an old version of \ref capsuGetAlbumFileList4. + * @param[out] entries Output array of \ref CapsApplicationAlbumFileEntry. + * @param[in] count Max size of the output array in entries. + * @param[in] type \ref CapsContentType + * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[in] uid \ref AccountUid + * @param[out] total_entries Total output entries. + */ +Result GetAlbumFileListDeprecated2(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries); + +/** + * @brief Gets a listing of \ref CapsApplicationAlbumEntry. + * @note Only available on [7.0.0+], on prior sysvers use \ref capsuGetAlbumFileListDeprecated1 instead. + * @param[out] entries Output array of \ref CapsApplicationAlbumEntry. + * @param[in] count Max size of the output array in entries. + * @param[in] type \ref CapsContentType + * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[out] total_entries Total output entries. + */ +Result GetAlbumFileList3(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries); + +/** + * @brief Gets a listing of \ref CapsApplicationAlbumEntry, where the AlbumFile has an UserId which matches the input one. See also \ref capssuSaveScreenShotWithUserIds. + * @note Only available on [7.0.0+], on prior sysvers use \ref capsuGetAlbumFileListDeprecated2 instead. + * @param[out] entries Output array of \ref CapsApplicationAlbumEntry. + * @param[in] count Max size of the output array in entries. + * @param[in] type \ref CapsContentType + * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. + * @param[in] uid \ref AccountUid + * @param[out] total_entries Total output entries. + */ +Result GetAlbumFileList4(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries); + +/** + * @brief Deletes the specified AlbumFile. + * @param[in] type \ref CapsContentType, must match ::CapsContentType_ExtraMovie. + * @param[in] entry \ref CapsApplicationAlbumFileEntry + */ +Result DeleteAlbumFile(CapsContentType type, const CapsApplicationAlbumFileEntry *entry); + +/** + * @brief Gets the filesize for the entire specified AlbumFile. + * @param[in] entry \ref CapsApplicationAlbumFileEntry + * @param[out] size Output filesize. + */ +Result GetAlbumFileSize(const CapsApplicationAlbumFileEntry *entry, u64 *size); + +/** + * @brief Load the ScreenShotImage for the specified AlbumFile. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[out] attr \ref CapsScreenShotAttributeForApplication + * @param[out] userdata Output buffer containing the UserData. Optional, can be NULL. This buffer is cleared to 0 using userdata_maxsize, prior to doing the memcpy. + * @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0. + * @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed. + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + * @param[in] entry \ref CapsApplicationAlbumFileEntry + * @param[in] option \ref CapsScreenShotDecodeOption + */ +Result LoadAlbumScreenShotImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option); + +/** + * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. + * @param[out] width Output image width. Optional, can be NULL. + * @param[out] height Output image height. Optional, can be NULL. + * @param[out] attr \ref CapsScreenShotAttributeForApplication + * @param[out] userdata Output buffer containing the UserData. Optional, can be NULL. This buffer is cleared to 0 using userdata_maxsize, prior to doing the memcpy. + * @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0. + * @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed. + * @param[out] image RGBA8 image output buffer. + * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. + * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. + * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. + * @param[in] entry \ref CapsApplicationAlbumFileEntry + * @param[in] option \ref CapsScreenShotDecodeOption + */ +Result LoadAlbumScreenShotThumbnailImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option); + +/** + * @brief PrecheckToCreateContents. Official sw only uses this with ::CapsContentType_ExtraMovie. + * @param[in] type \ref CapsContentType + * @param[in] unk Unknown. + */ +Result PrecheckToCreateContents(CapsContentType type, u64 unk); + +/** + * @brief Opens an AlbumMovieStream. + * @note This opens IAlbumAccessorApplicationSession if not previously opened, it's closed during \ref capsuExit. + * @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsApplicationAlbumFileEntry. + * @param[out] stream Stream handle. + * @param[in] entry \ref CapsApplicationAlbumFileEntry + */ +Result OpenAlbumMovieStream(u64 *stream, const CapsApplicationAlbumFileEntry *entry); + +/** + * @brief Closes an AlbumMovieStream. + * @param[in] stream Stream handle. + */ +Result CloseAlbumMovieStream(u64 stream); + +/** + * @brief Gets the data size of an AlbumMovieStream. + * @param[in] stream Stream handle. + * @param[out] size Size of the actual MP4, without the JPEG at the end. + */ +Result GetAlbumMovieStreamSize(u64 stream, u64 *size); + +/** + * @brief Reads data from an AlbumMovieStream. + * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. + * @note When offset(+size) goes beyond the size from \ref capsuGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ +Result ReadAlbumMovieStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size); + +/** + * @brief Gets the BrokenReason for an AlbumMovieStream. + * @note Official sw doesn't use this. + * @param[in] stream Stream handle. + */ +Result GetAlbumMovieStreamBrokenReason(u64 stream); + +} // namespace capsu + +/// @brief C++ wrappers for the `clkrst` API. +/// @details Wraps: switch/services/clkrst.h. +namespace clkrst { + +using ::ClkrstSession; + +/// Initialize clkrst. Only available on [8.0.0+]. +Result Initialize(void); + +/// Exit clkrst. +void Exit(void); + +/// Gets the Service object for the actual clkrst service session. +Service* GetServiceSession(void); + +/// Opens a ClkrstSession for the requested PcvModuleId, unk is set to 3 in official sysmodules. +Result OpenSession(ClkrstSession* session_out, PcvModuleId module_id, u32 unk); + +void CloseSession(ClkrstSession* session); + +Result SetClockRate(ClkrstSession* session, u32 hz); + +Result GetClockRate(ClkrstSession* session, u32 *out_hz); + +// Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz); + +Result GetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count); + +// Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count); + +} // namespace clkrst + +/// @brief C++ wrappers for the `cmac` API. +/// @details Wraps: switch/crypto/cmac.h. +namespace cmac { + +/// Context for AES-128 CMAC. +using ::Aes128CmacContext; +/// Context for AES-192 CMAC. +using ::Aes192CmacContext; +/// Context for AES-256 CMAC. +using ::Aes256CmacContext; + +/// Initialize an AES-128-CMAC context. +void Aes128ContextCreate(Aes128CmacContext *out, const void *key); + +/// Updates AES-128-CMAC context with data to hash +void Aes128ContextUpdate(Aes128CmacContext *ctx, const void *src, size_t size); + +/// Gets the context's output mac, finalizes the context. +void Aes128ContextGetMac(Aes128CmacContext *ctx, void *dst); + +/// Simple all-in-one AES-128-CMAC calculator. +void Aes128CalculateMac(void *dst, const void *key, const void *src, size_t size); + +/// Initialize an AES-192-CMAC context. +void Aes192ContextCreate(Aes192CmacContext *out, const void *key); + +/// Updates AES-192-CMAC context with data to hash +void Aes192ContextUpdate(Aes192CmacContext *ctx, const void *src, size_t size); + +/// Gets the context's output mac, finalizes the context. +void Aes192ContextGetMac(Aes192CmacContext *ctx, void *dst); + +/// Simple all-in-one AES-192-CMAC calculator. +void Aes192CalculateMac(void *dst, const void *key, const void *src, size_t size); + +/// Initialize an AES-256-CMAC context. +void Aes256ContextCreate(Aes256CmacContext *out, const void *key); + +/// Updates AES-256-CMAC context with data to hash +void Aes256ContextUpdate(Aes256CmacContext *ctx, const void *src, size_t size); + +/// Gets the context's output mac, finalizes the context. +void Aes256ContextGetMac(Aes256CmacContext *ctx, void *dst); + +/// Simple all-in-one AES-256-CMAC calculator. +void Aes256CalculateMac(void *dst, const void *key, const void *src, size_t size); + +} // namespace cmac + +/// @brief C++ wrappers for the `cmif` API. +/// @details Wraps: switch/sf/cmif.h. +namespace cmif { + +using ::CmifCommandType; +using ::CmifDomainInHeader; +using ::CmifDomainOutHeader; +using ::CmifDomainRequestType; +using ::CmifInHeader; +using ::CmifOutHeader; +using ::CmifRequest; +using ::CmifRequestFormat; +using ::CmifResponse; + +void* GetAlignedDataStart(u32* data_words, void* base); + +CmifRequest MakeRequest(void* base, CmifRequestFormat fmt); + +void* MakeControlRequest(void* base, u32 request_id, u32 size); + +void MakeCloseRequest(void* base, u32 object_id); + +void RequestInBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode); + +void RequestOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode); + +void RequestInOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode); + +void RequestInPointer(CmifRequest* req, const void* buffer, size_t size); + +void RequestOutFixedPointer(CmifRequest* req, void* buffer, size_t size); + +void RequestOutPointer(CmifRequest* req, void* buffer, size_t size); + +void RequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode); + +void RequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode); + +void RequestObject(CmifRequest* req, u32 object_id); + +void RequestHandle(CmifRequest* req, Handle handle); + +Result ParseResponse(CmifResponse* res, void* base, bool is_domain, u32 size); + +u32 ResponseGetObject(CmifResponse* res); + +Handle ResponseGetCopyHandle(CmifResponse* res); + +Handle ResponseGetMoveHandle(CmifResponse* res); + +Result ConvertCurrentObjectToDomain(Handle h, u32* out_object_id); + +Result CopyFromCurrentDomain(Handle h, u32 object_id, Handle* out_h); + +Result CloneCurrentObject(Handle h, Handle* out_h); + +Result QueryPointerBufferSize(Handle h, u16* out_size); + +Result CloneCurrentObjectEx(Handle h, u32 tag, Handle* out_h); + +} // namespace cmif + +/// @brief C++ wrappers for the `condvar` API. +/// @details Wraps: switch/kernel/condvar.h. +namespace condvar { + +/// Condition variable. +using ::CondVar; + +/** + * @brief Initializes a condition variable. + * @param[in] c Condition variable object. + */ +void Init(CondVar* c); + +/** + * @brief Waits on a condition variable with a timeout. + * @param[in] c Condition variable object. + * @param[in] m Mutex object to use inside the condition variable. + * @param[in] timeout Timeout in nanoseconds. + * @return Result code (0xEA01 on timeout). + * @remark On function return, the underlying mutex is acquired. + */ +Result WaitTimeout(CondVar* c, Mutex* m, u64 timeout); + +/** + * @brief Waits on a condition variable. + * @param[in] c Condition variable object. + * @param[in] m Mutex object to use inside the condition variable. + * @return Result code. + * @remark On function return, the underlying mutex is acquired. + */ +Result Wait(CondVar* c, Mutex* m); + +/** + * @brief Wakes up up to the specified number of threads waiting on a condition variable. + * @param[in] c Condition variable object. + * @param[in] num Maximum number of threads to wake up (or -1 to wake them all up). + * @return Result code. + */ +Result Wake(CondVar* c, int num); + +/** + * @brief Wakes up a single thread waiting on a condition variable. + * @param[in] c Condition variable object. + * @return Result code. + */ +Result WakeOne(CondVar* c); + +/** + * @brief Wakes up all thread waiting on a condition variable. + * @param[in] c Condition variable object. + * @return Result code. + */ +Result WakeAll(CondVar* c); + +} // namespace condvar + +/// @brief C++ wrappers for the `console` API. +/// @details Wraps: switch/runtime/devices/console.h. +namespace console { + +/// A font struct for the console. +using ::ConsoleFont; +/// Renderer interface for the console. +using ::ConsoleRenderer; +/// Console debug devices supported by libnx. +using ::debugDevice; +using ::PrintConsole; + +/** + * @brief Loads the font into the console. + * @param console Pointer to the console to update, if NULL it will update the current console. + * @param font The font to load. + */ +void SetFont(PrintConsole* console, ConsoleFont* font); + +/** + * @brief Sets the print window. + * @param console Console to set, if NULL it will set the current console window. + * @param x X location of the window. + * @param y Y location of the window. + * @param width Width of the window. + * @param height Height of the window. + */ +void SetWindow(PrintConsole* console, int x, int y, int width, int height); + +/** + * @brief Gets a pointer to the console with the default values. + * This should only be used when using a single console or without changing the console that is returned, otherwise use consoleInit(). + * @return A pointer to the console with the default values. + */ +PrintConsole* GetDefault(void); + +/** + * @brief Make the specified console the render target. + * @param console A pointer to the console struct (must have been initialized with consoleInit(PrintConsole* console)). + * @return A pointer to the previous console. + */ +PrintConsole * Select(PrintConsole* console); + +/** + * @brief Initialise the console. + * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). + * @return A pointer to the current console. + */ +PrintConsole* Init(PrintConsole* console); + +/** + * @brief Deinitialise the console. + * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). + */ +void Exit(PrintConsole* console); + +/** + * @brief Updates the console, submitting a new frame to the display. + * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). + * @remark This function should be called periodically. Failure to call this function will result in lack of screen updating. + */ +void Update(PrintConsole* console); + +/** + * @brief Initializes debug console output on stderr to the specified device. + * @param device The debug device (or devices) to output debug print statements to. + */ +void DebugInit(debugDevice device); + +/// Clears the screan by using printf("\x1b[2J"); +void Clear(void); + +} // namespace console + +/// @brief C++ wrappers for the `crc32` API. +/// @details Wraps: switch/crypto/crc.h. +namespace crc32 { + +/// Calculate a CRC32 over data using a seed. +/// Can be used to calculate a CRC32 in chunks using an initial seed of zero for the first chunk. +u32 CalculateWithSeed(u32 seed, const void *src, size_t size); + +/// Calculate a CRC32 over data. +u32 Calculate(const void *src, size_t size); + +} // namespace crc32 + +/// @brief C++ wrappers for the `crc32c` API. +/// @details Wraps: switch/crypto/crc.h. +namespace crc32c { + +/// Calculate a CRC32C over data using a seed. +/// Can be used to calculate a CRC32C in chunks using an initial seed of zero for the first chunk. +u32 CalculateWithSeed(u32 seed, const void *src, size_t size); + +/// Calculate a CRC32C over data. +u32 Calculate(const void *src, size_t size); + +} // namespace crc32c + +/// @brief C++ wrappers for the `csrng` API. +/// @details Wraps: switch/services/csrng.h. +namespace csrng { + +/// Initialize csrng. +Result Initialize(void); + +/// Exit csrng. +void Exit(void); + +/// Gets the Service object for the actual csrng service session. +Service* GetServiceSession(void); + +Result GetRandomBytes(void *out, size_t out_size); + +} // namespace csrng + +/// @brief C++ wrappers for the `detect` API. +/// @details Wraps: switch/kernel/detect.h. +namespace detect { + +/// Returns true if the process has a debugger attached. +bool Debugger(void); + +/// Returns true if the underlying kernel is Mesosphère. +bool Mesosphere(void); + +} // namespace detect + +/// @brief C++ wrappers for the `diag` API. +/// @details Wraps: switch/runtime/diag.h. +namespace diag { + +/** + * @brief Aborts program execution with a result code. + * @param[in] res Result code. + */ +[[noreturn]] void AbortWithResult(Result res); + +} // namespace diag + +/// @brief C++ wrappers for the `ectxr` API. +/// @details Wraps: switch/services/ectx.h. +namespace ectxr { + +/// Initialize ectx:r. +Result Initialize(void); + +/// Exit ectx:r. +void Exit(void); + +/// Gets the Service object for the actual ectx:r service session. +Service* GetServiceSession(void); + +/** + * @brief Retrieves the error context associated with an error descriptor and result. + * @param[out] out0 Output value. + * @param[out] out_total_size Total error context size. + * @param[out] out_size Error context size. + * @param[out] dst Buffer for output error context. + * @param[in] dst_size Buffer size for output error context. + * @param[in] descriptor Error descriptor. + * @param[in] result Error result. + * @return Result code. + */ +Result PullContext(s32 *out0, u32 *out_total_size, u32 *out_size, void *dst, size_t dst_size, u32 descriptor, Result result); + +} // namespace ectxr + +/// @brief C++ wrappers for the `env` API. +/// @details Wraps: switch/runtime/env.h. +namespace env { + +/// Structure representing an entry in the homebrew environment configuration. +using ::ConfigEntry; +/// Loader return function. +using ::LoaderReturnFn; + +/** + * @brief Parses the homebrew loader environment block (internally called). + * @param ctx Reserved. + * @param main_thread Reserved. + * @param saved_lr Reserved. + */ +void Setup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr); + +/// Returns information text about the loader, if present. +const char* GetLoaderInfo(void); + +/// Returns the size of the loader information text. +u64 GetLoaderInfoSize(void); + +/// Retrieves the handle to the main thread. +Handle GetMainThreadHandle(void); + +/// Returns true if the application is running as NSO, otherwise NRO. +bool IsNso(void); + +/// Returns true if the environment has a heap override. +bool HasHeapOverride(void); + +/// Returns the address of the overriden heap. +void* GetHeapOverrideAddr(void); + +/// Returns the size of the overriden heap. +u64 GetHeapOverrideSize(void); + +/// Returns true if the environment has an argv array. +bool HasArgv(void); + +/// Returns the pointer to the argv array. +void* GetArgv(void); + +/** + * @brief Returns whether a syscall is hinted to be available. + * @param svc Syscall number to test. + * @returns true if the syscall is available. + */ +bool IsSyscallHinted(unsigned svc); + +/// Returns the handle to the running homebrew process. +Handle GetOwnProcessHandle(void); + +/// Returns the loader's return function, to be called on program exit. +LoaderReturnFn GetExitFuncPtr(void); + +/// Sets the return function to be called on program exit. +void SetExitFuncPtr(LoaderReturnFn addr); + +/** + * @brief Configures the next homebrew application to load. + * @param path Path to the next homebrew application to load (.nro). + * @param argv Argument string to pass. + */ +Result SetNextLoad(const char* path, const char* argv); + +/// Returns true if the environment supports envSetNextLoad. +bool HasNextLoad(void); + +/// Returns the Result from the last NRO. +Result GetLastLoadResult(void); + +/// Returns true if the environment provides a random seed. +bool HasRandomSeed(void); + +/** + * @brief Retrieves the random seed provided by the environment. + * @param out Pointer to a u64[2] buffer which will contain the random seed on return. + */ +void GetRandomSeed(u64 out[2]); + +/// Returns a pointer to the user id storage area (if present). +AccountUid* GetUserIdStorage(void); + +} // namespace env + +/// @brief C++ wrappers for the `error` API. +/// @details Wraps: switch/applets/error.h. +namespace error { + +/// ApplicationErrorArg +using ::ErrorApplicationArg; +/// Error application config. +using ::ErrorApplicationConfig; +/// Stores error-codes which are displayed as XXXX-XXXX, low for the former and desc for the latter. +using ::ErrorCode; +/// Common error arg data. +using ::ErrorCommonArg; +/// Common header for the start of the arg storage. +using ::ErrorCommonHeader; +/// Error context. +using ::ErrorContext; +/// Error type for ErrorContext.type +using ::ErrorContextType; +/// Error arg data for EULA. +using ::ErrorEulaArg; +/// Additional input storage data for \ref errorSystemUpdateEulaShow. +using ::ErrorEulaData; +/// Error arg data for certain errors with module PCTL. +using ::ErrorPctlArg; +/// Error arg data for Record. +using ::ErrorRecordArg; +/// ResultBacktrace +using ::ErrorResultBacktrace; +/// SystemErrorArg +using ::ErrorSystemArg; +/// Error system config. +using ::ErrorSystemConfig; +/// Error type for ErrorCommonHeader.type. +using ::ErrorType; + +/** + * @brief Creates an \ref ErrorCode. + * @param low The module portion of the error, normally this should be set to module + 2000. + * @param desc The error description. + */ +ErrorCode CodeCreate(u32 low, u32 desc); + +/** + * @brief Creates an \ref ErrorCode with the input Result. Wrapper for \ref errorCodeCreate. + * @param res Input Result. + */ +ErrorCode CodeCreateResult(Result res); + +/** + * @brief Creates an invalid \ref ErrorCode. + */ +ErrorCode CodeCreateInvalid(void); + +/** + * @brief Checks whether the input ErrorCode is valid. + * @param errorCode \ref ErrorCode + */ +bool CodeIsValid(ErrorCode errorCode); + +/** + * @brief Launches the applet for displaying the specified Result. + * @param res Result + * @param jumpFlag Jump flag, normally this is true. + * @param ctx Optional \ref ErrorContext, can be NULL. Unused when jumpFlag=false. Ignored on pre-4.0.0, since it's only available for [4.0.0+]. + * @note Sets the following fields: jumpFlag and contextFlag2. Uses ::ErrorType_Normal normally. + * @note For module=PCTL errors with desc 100-119 this sets uses ::ErrorType_Pctl, in which case the applet will display the following special dialog: "This software is restricted by Parental Controls". + * @note If the input Result is 0xC8A2, the applet will display a special dialog regarding the current application requiring a software update, with buttons "Later" and "Restart". + * @note [3.0.0+] If the input Result is 0xCAA2, the applet will display a special dialog related to DLC version. + * @warning This applet creates an error report that is logged in the system, when not handling the above special dialogs. Proceed at your own risk! + */ +Result ResultShow(Result res, bool jumpFlag, const ErrorContext* ctx); + +/** + * @brief Launches the applet for displaying the specified ErrorCode. + * @param errorCode \ref ErrorCode + * @param jumpFlag Jump flag, normally this is true. + * @param ctx Optional \ref ErrorContext, can be NULL. Unused when jumpFlag=false. Ignored on pre-4.0.0, since it's only available for [4.0.0+]. + * @note Sets the following fields: jumpFlag and contextFlag2. resultFlag=1. Uses ::ErrorType_Normal. + * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! + */ +Result CodeShow(ErrorCode errorCode, bool jumpFlag, const ErrorContext* ctx); + +/** + * @brief Creates an ErrorResultBacktrace struct. + * @param backtrace \ref ErrorResultBacktrace struct. + * @param count Total number of entries. + * @param entries Input array of Result. + */ +Result ResultBacktraceCreate(ErrorResultBacktrace* backtrace, s32 count, const Result* entries); + +/** + * @brief Launches the applet for \ref ErrorResultBacktrace. + * @param backtrace ErrorResultBacktrace struct. + * @param res Result + * @note Sets the following fields: jumpFlag=1, contextFlag=1, and uses ::ErrorType_Normal. + * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! + */ +Result ResultBacktraceShow(Result res, const ErrorResultBacktrace* backtrace); + +/** + * @brief Launches the applet for displaying the EULA. + * @param RegionCode \ref SetRegion + * @note Sets the following fields: jumpFlag=1, regionCode, and uses ::ErrorType_Eula. + */ +Result EulaShow(SetRegion RegionCode); + +/** + * @brief Launches the applet for displaying the system-update EULA. + * @param RegionCode \ref SetRegion + * @param eula EULA data. Address must be 0x1000-byte aligned. + * @note Sets the following fields: jumpFlag=1, regionCode, and uses ::ErrorType_SystemUpdateEula. + */ +Result SystemUpdateEulaShow(SetRegion RegionCode, const ErrorEulaData* eula); + +/** + * @brief Launches the applet for displaying an error full-screen, using the specified ErrorCode and timestamp. + * @param errorCode \ref ErrorCode + * @param timestamp POSIX timestamp. + * @note Sets the following fields: jumpFlag=1, errorCode, timestamp, and uses ::ErrorType_Record. + * @note The applet does not log an error report for this. error*RecordShow is used by qlaunch for displaying previously logged error reports. + */ +Result CodeRecordShow(ErrorCode errorCode, u64 timestamp); + +/** + * @brief Launches the applet for displaying an error full-screen, using the specified Result and timestamp. + * @param res Result + * @param timestamp POSIX timestamp. + * @note Wrapper for \ref errorCodeRecordShow, see \ref errorCodeRecordShow notes. + */ +Result ResultRecordShow(Result res, u64 timestamp); + +/** + * @brief Creates an ErrorSystemConfig struct. + * @param c ErrorSystemConfig struct. + * @param dialog_message UTF-8 dialog message. + * @param fullscreen_message UTF-8 fullscreen message, displayed when the user clicks on "Details". Optional, can be NULL (which disables displaying Details). + * @note Sets the following fields: {strings}, and uses ::ErrorType_System. The rest are cleared. + * @note On pre-5.0.0 this will initialize languageCode by using: setInitialize(), setMakeLanguageCode(SetLanguage_ENUS, ...), and setExit(). This is needed since an empty languageCode wasn't supported until [5.0.0+] (which would also use SetLanguage_ENUS). + * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! + */ +Result SystemCreate(ErrorSystemConfig* c, const char* dialog_message, const char* fullscreen_message); + +/** + * @brief Launches the applet with the specified config. + * @param c ErrorSystemConfig struct. + */ +Result SystemShow(ErrorSystemConfig* c); + +/** + * @brief Sets the error code. + * @param c ErrorSystemConfig struct. + * @param errorCode \ref ErrorCode + */ +void SystemSetCode(ErrorSystemConfig* c, ErrorCode errorCode); + +/** + * @brief Sets the error code, using the input Result. Wrapper for \ref errorSystemSetCode. + * @param c ErrorSystemConfig struct. + * @param res The Result to set. + */ +void SystemSetResult(ErrorSystemConfig* c, Result res); + +/** + * @brief Sets the LanguageCode. + * @param c ErrorSystemConfig struct. + * @param LanguageCode LanguageCode, see set.h. + */ +void SystemSetLanguageCode(ErrorSystemConfig* c, u64 LanguageCode); + +/** + * @brief Sets the ErrorContext. + * @note Only available on [4.0.0+], on older versions this will return without setting the context. + * @param c ErrorSystemConfig struct. + * @param ctx ErrorContext, NULL to clear it. + */ +void SystemSetContext(ErrorSystemConfig* c, const ErrorContext* ctx); + +/** + * @brief Creates an ErrorApplicationConfig struct. + * @param c ErrorApplicationConfig struct. + * @param dialog_message UTF-8 dialog message. + * @param fullscreen_message UTF-8 fullscreen message, displayed when the user clicks on "Details". Optional, can be NULL (which disables displaying Details). + * @note Sets the following fields: jumpFlag=1, {strings}, and uses ::ErrorType_Application. The rest are cleared. + * @note On pre-5.0.0 this will initialize languageCode by using: setInitialize(), setMakeLanguageCode(SetLanguage_ENUS, ...), and setExit(). This is needed since an empty languageCode wasn't supported until [5.0.0+] (which would also use SetLanguage_ENUS). + * @note With [10.0.0+] this must only be used when running under an Application, since otherwise the applet will trigger a fatalerr. + * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! + */ +Result ApplicationCreate(ErrorApplicationConfig* c, const char* dialog_message, const char* fullscreen_message); + +/** + * @brief Launches the applet with the specified config. + * @param c ErrorApplicationConfig struct. + */ +Result ApplicationShow(ErrorApplicationConfig* c); + +/** + * @brief Sets the error code number. + * @param c ErrorApplicationConfig struct. + * @param errorNumber Error code number. Raw decimal error number which is displayed in the dialog. + */ +void ApplicationSetNumber(ErrorApplicationConfig* c, u32 errorNumber); + +/** + * @brief Sets the LanguageCode. + * @param c ErrorApplicationConfig struct. + * @param LanguageCode LanguageCode, see set.h. + */ +void ApplicationSetLanguageCode(ErrorApplicationConfig* c, u64 LanguageCode); + +} // namespace error + +/// @brief C++ wrappers for the `event` API. +/// @details Wraps: switch/kernel/event.h. +namespace event { + +/// Kernel-mode event structure. +using ::Event; + +/** + * @brief Creates a kernel-mode event. + * @param[out] t Pointer to \ref Event structure. + * @param[in] autoclear Autoclear flag. + * @return Result code. + * @warning This is a privileged operation; in normal circumstances applications shouldn't use this function. + */ +Result Create(Event* t, bool autoclear); + +/** + * @brief Loads a kernel-mode event obtained from IPC. + * @param[out] t Pointer to \ref Event structure. + * @param[in] handle Read-only event handle. + * @param[in] autoclear Autoclear flag. + */ +void LoadRemote(Event* t, Handle handle, bool autoclear); + +/** + * @brief Closes a kernel-mode event. + * @param[in] t Pointer to \ref Event structure. + */ +void Close(Event* t); + +/** + * @brief Returns whether an \ref Event is initialized. + * @param[in] t Pointer to \ref Event structure. + * @return Initialization status. + */ +bool Active(Event* t); + +/** + * @brief Waits on a kernel-mode event. + * @param[in] t Pointer to \ref Event structure. + * @param[in] timeout Timeout in nanoseconds (pass UINT64_MAX to wait indefinitely). + * @return Result code. + */ +Result Wait(Event* t, u64 timeout); + +/** + * @brief Signals a kernel-mode event. + * @param[in] t Pointer to \ref Event structure. + * @return Result code. + * @note This function only works for events initialized with \ref eventCreate, it doesn't work with events initialized with \ref eventLoadRemote. + * @warning This is a privileged operation; in normal circumstances applications shouldn't use this function. + */ +Result Fire(Event* t); + +/** + * @brief Clears a kernel-mode event. + * @param[in] t Pointer to \ref Event structure. + * @return Result code. + * @note This function shouldn't be used on autoclear events. + */ +Result Clear(Event* t); + +} // namespace event + +/// @brief C++ wrappers for the `fan` API. +/// @details Wraps: switch/services/fan.h. +namespace fan { + +using ::FanController; + +/// Initialize fan. +Result Initialize(void); + +/// Exit fan. +void Exit(void); + +/// Gets the Service object for the actual fan service session. +Service* GetServiceSession(void); + +/// Opens IController session. +Result OpenController(FanController *out, u32 device_code); + +/// Close IController session. +void ControllerClose(FanController *controller); + +/// @warning Disabling your fan can damage your system. +Result ControllerSetRotationSpeedLevel(FanController *controller, float level); + +Result ControllerGetRotationSpeedLevel(FanController *controller, float *level); + +} // namespace fan + +/// @brief C++ wrappers for the `fatal` API. +/// @details Wraps: switch/services/fatal.h. +namespace fatal { + +/// Struct for fatal Cpu context, 32-bit. +using ::FatalAarch32Context; +/// Struct for fatal Cpu context, 64-bit. +using ::FatalAarch64Context; +using ::FatalCpuContext; +/// Type of thrown fatal error. +using ::FatalPolicy; + +/** + * @brief Triggers a system fatal error. + * @param[in] err Result code to throw. + * @note This function does not return. + * @note This uses \ref fatalThrowWithPolicy with \ref FatalPolicy_ErrorScreen internally. + */ +[[noreturn]] void Throw(Result err); + +/** + * @brief Triggers a system fatal error with a custom \ref FatalPolicy. + * @param[in] err Result code to throw. + * @param[in] type Type of fatal error to throw. + * @note This function may not return, depending on \ref FatalPolicy. + */ +void ThrowWithPolicy(Result err, FatalPolicy type); + +/** + * @brief Triggers a system fatal error with a custom \ref FatalPolicy and \ref FatalCpuContext. + * @param[in] err Result code to throw. + * @param[in] type Type of fatal error to throw. + * @param[in] ctx Cpu context for fatal error to throw. + * @note This function may not return, depending on \ref FatalPolicy. + */ +void ThrowWithContext(Result err, FatalPolicy type, FatalCpuContext *ctx); + +} // namespace fatal + +/// @brief C++ wrappers for the `framebuffer` API. +/// @details Wraps: switch/display/framebuffer.h. +namespace framebuffer { + +/// Framebuffer structure. +using ::Framebuffer; + +/** + * @brief Creates a \ref Framebuffer object. + * @param[out] fb Output \ref Framebuffer structure. + * @param[in] win Pointer to the \ref NWindow to which the \ref Framebuffer will be registered. + * @param[in] width Desired width of the framebuffer (usually 1280). + * @param[in] height Desired height of the framebuffer (usually 720). + * @param[in] format Desired pixel format (see PIXEL_FORMAT_* enum). + * @param[in] num_fbs Number of buffers to create. Pass 1 for single-buffering, 2 for double-buffering or 3 for triple-buffering. + * @note Framebuffer images are stored in Tegra block linear format with 16Bx2 sector ordering, read TRM chapter 20.1 for more details. + * In order to use regular linear layout, consider calling \ref framebufferMakeLinear after the \ref Framebuffer object is created. + * @note Presently, only the following pixel formats are supported: + * \ref PIXEL_FORMAT_RGBA_8888 + * \ref PIXEL_FORMAT_RGBX_8888 + * \ref PIXEL_FORMAT_RGB_565 + * \ref PIXEL_FORMAT_BGRA_8888 + * \ref PIXEL_FORMAT_RGBA_4444 + */ +Result Create(Framebuffer* fb, NWindow *win, u32 width, u32 height, u32 format, u32 num_fbs); + +/// Enables linear framebuffer mode in a \ref Framebuffer, allocating a shadow buffer in the process. +Result MakeLinear(Framebuffer* fb); + +/// Closes a \ref Framebuffer object, freeing all resources associated with it. +void Close(Framebuffer* fb); + +/** + * @brief Begins rendering a frame in a \ref Framebuffer. + * @param[in] fb Pointer to \ref Framebuffer structure. + * @param[out] out_stride Output variable containing the distance in bytes between rows of pixels in memory. + * @return Pointer to buffer to which new graphics data should be written to. + * @note When this function is called, a buffer will be dequeued from the corresponding \ref NWindow. + * @note This function will return pointers to different buffers, depending on the number of buffers it was initialized with. + * @note If \ref framebufferMakeLinear was used, this function will instead return a pointer to the shadow linear buffer. + * In this case, the offset of a pixel is \p y * \p out_stride + \p x * \p bytes_per_pixel. + * @note Each call to \ref framebufferBegin must be paired with a \ref framebufferEnd call. + */ +void* Begin(Framebuffer* fb, u32* out_stride); + +/** + * @brief Finishes rendering a frame in a \ref Framebuffer. + * @param[in] fb Pointer to \ref Framebuffer structure. + * @note When this function is called, the written image data will be flushed and queued (presented) in the corresponding \ref NWindow. + * @note If \ref framebufferMakeLinear was used, this function will copy the image from the shadow linear buffer to the actual framebuffer, + * converting it in the process to the layout expected by the compositor. + * @note Each call to \ref framebufferBegin must be paired with a \ref framebufferEnd call. + */ +void End(Framebuffer* fb); + +} // namespace framebuffer + +/// @brief C++ wrappers for the `friends` API. +/// @details Wraps: switch/applets/friends_la.h, switch/services/friends.h. +namespace friends { + +/// FriendInvitationGameModeDescription +using ::FriendsFriendInvitationGameModeDescription; +/// FriendInvitationGroupId +using ::FriendsFriendInvitationGroupId; +/// FriendInvitationId +using ::FriendsFriendInvitationId; +/// InAppScreenName +using ::FriendsInAppScreenName; +/// Arg struct pushed for the applet input storage, for [9.0.0+]. +using ::FriendsLaArg; +/// Common data for the arg struct, for the pre-9.0.0 types. +/// This is only set for ::FriendsLaArgType_ShowUserDetailInfo/::FriendsLaArgType_StartSendingFriendRequest, for everything else this is cleared. +using ::FriendsLaArgCommonData; +/// Header for the arg struct. +using ::FriendsLaArgHeader; +/// Arg type values used with \ref FriendsLaArg. +using ::FriendsLaArgType; +/// Arg struct pushed for the applet input storage, for pre-9.0.0. +using ::FriendsLaArgV1; +using ::FriendsServiceType; +/// FriendsUserSetting +using ::FriendsUserSetting; + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowFriendList, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + */ +Result LaShowFriendList(AccountUid uid); + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowUserDetailInfo, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + * @param[in] id \ref AccountNetworkServiceAccountId for the user to show UserDetailInfo for. + * @param[in] first_inAppScreenName First \ref FriendsInAppScreenName. + * @param[in] second_inAppScreenName Second \ref FriendsInAppScreenName. + */ +Result LaShowUserDetailInfo(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName); + +/** + * @brief Launches the applet with ::FriendsLaArgType_StartSendingFriendRequest, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage. + * @param[in] uid \ref AccountUid + * @param[in] id \ref AccountNetworkServiceAccountId to send the friend request to. + * @param[in] first_inAppScreenName First \ref FriendsInAppScreenName. + * @param[in] second_inAppScreenName Second \ref FriendsInAppScreenName. + */ +Result LaStartSendingFriendRequest(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName); + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowMethodsOfSendingFriendRequest, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + */ +Result LaShowMethodsOfSendingFriendRequest(AccountUid uid); + +/** + * @brief Launches the applet with ::FriendsLaArgType_StartFacedFriendRequest, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + */ +Result LaStartFacedFriendRequest(AccountUid uid); + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowReceivedFriendRequestList, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + */ +Result LaShowReceivedFriendRequestList(AccountUid uid); + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowBlockedUserList, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + */ +Result LaShowBlockedUserList(AccountUid uid); + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowMyProfile, the specified input, and playStartupSound=false. + * @param[in] uid \ref AccountUid + */ +Result LaShowMyProfile(AccountUid uid); + +/** + * @brief Same as \ref friendsLaShowMyProfile except with playStartupSound=true. + * @param[in] uid \ref AccountUid + */ +Result LaShowMyProfileForHomeMenu(AccountUid uid); + +/** + * @brief Launches the applet with ::FriendsLaArgType_StartFriendInvitation, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage. + * @note Only available on [9.0.0+]. + * @param[in] uid \ref AccountUid + * @param[in] id_count \ref AccountNetworkServiceAccountId count, must be 1-15. Number of friends to invite. + * @param[in] desc \ref FriendsFriendInvitationGameModeDescription + * @param[in] userdata Arbitrary user-data. Can be NULL. + * @param[in] userdata_size User-data size, must be <=0x400. Can be 0 if userdata is NULL. + */ +Result LaStartFriendInvitation(AccountUid uid, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size); + +/** + * @brief Launches the applet with ::FriendsLaArgType_StartSendingFriendInvitation, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage. + * @note Only available on [9.0.0+]. + * @param[in] uid \ref AccountUid + * @param[in] id_list \ref AccountNetworkServiceAccountId list. + * @param[in] id_count Size of the id_list array in entries, must be 1-15. Number of friends to invite. + * @param[in] desc \ref FriendsFriendInvitationGameModeDescription + * @param[in] userdata Arbitrary user-data. Can be NULL. + * @param[in] userdata_size User-data size, must be <=0x400. Can be 0 if userdata is NULL. + */ +Result LaStartSendingFriendInvitation(AccountUid uid, const AccountNetworkServiceAccountId *id_list, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size); + +/** + * @brief Launches the applet with ::FriendsLaArgType_ShowReceivedInvitationDetail, the specified input, and playStartupSound=false. + * @note Only available on [9.0.0+]. + * @param[in] uid \ref AccountUid + * @param[in] invitation_id \ref FriendsFriendInvitationId + * @param[in] invitation_group_id \ref FriendsFriendInvitationGroupId + */ +Result LaShowReceivedInvitationDetail(AccountUid uid, FriendsFriendInvitationId invitation_id, FriendsFriendInvitationGroupId invitation_group_id); + +/// Initialize friends +Result Initialize(FriendsServiceType service_type); + +/// Exit friends +void Exit(void); + +/// Gets the Service object for the friends service session. +Service* GetServiceSession(void); + +/// Gets the Service object for the actual IFriendsService service session. +Service* GetServiceSession_IFriendsService(void); + +/** + * @brief Gets the \ref FriendsUserSetting details + * @param[in] uid \ref User AccountUid. + * @param[out] user_setting \ref FriendsUserSetting + */ +Result GetUserSetting(AccountUid uid, FriendsUserSetting *user_setting); + +/** + * @brief Gets an Event which is signaled when data is available with \ref friendsTryPopFriendInvitationNotificationInfo. + * @note This is a wrapper for \ref appletGetFriendInvitationStorageChannelEvent, see that for the usage requirements. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetFriendInvitationNotificationEvent(Event *out_event); + +/** + * @brief Uses \ref appletTryPopFromFriendInvitationStorageChannel then reads the data from there into the output params. + * @note This is a wrapper for \ref appletTryPopFromFriendInvitationStorageChannel, see that for the usage requirements. + * @param[out] uid \ref AccountUid. Optional, can be NULL. + * @param[out] buffer Output buffer. + * @param[out] size Output buffer size. + * @param[out] out_size Size of the data which was written into the output buffer. Optional, can be NULL. + */ +Result TryPopFriendInvitationNotificationInfo(AccountUid *uid, void* buffer, u64 size, u64 *out_size); + +} // namespace friends + +/// @brief C++ wrappers for the `fs` API. +/// @details Wraps: switch/services/fs.h. +namespace fs { + +/// FatFatError +using ::FatFatError; +/// FatFatReportInfo1 +using ::FatFatReportInfo1; +/// FatFatReportInfo2 +using ::FatFatReportInfo2; +/// FatFatSafeInfo +using ::FatFatSafeInfo; +/// This is nn::fssystem::ArchiveMacKey. Used by \ref setsysGetThemeKey and \ref setsysSetThemeKey. Does not appear to be in use elsewhere. +using ::FsArchiveMacKey; +/// BisPartitionId +using ::FsBisPartitionId; +/// FsContentAttributes +using ::FsContentAttributes; +using ::FsContentStorageId; +/// For use with fsFsCreateFile. +using ::FsCreateOption; +using ::FsCustomStorageId; +using ::FsDeviceOperator; +using ::FsDir; +/// Directory entry. +using ::FsDirectoryEntry; +/// Returned by fsFsGetEntryType. +using ::FsDirEntryType; +/// For use with fsFsOpenDirectory. +using ::FsDirOpenMode; +using ::FsEventNotifier; +using ::FsFile; +using ::FsFileSystem; +/// FileSystemAttribute +using ::FsFileSystemAttribute; +/// FsFileSystemProxyErrorInfo +using ::FsFileSystemProxyErrorInfo; +/// FileSystemQueryId +using ::FsFileSystemQueryId; +/// FileSystemType +using ::FsFileSystemType; +using ::FsGameCardAttribute; +/// FsGameCardErrorReportInfo +using ::FsGameCardErrorReportInfo; +using ::FsGameCardHandle; +using ::FsGameCardPartition; +using ::FsGameCardUpdatePartitionInfo; +/// ImageDirectoryId +using ::FsImageDirectoryId; +/// FsMemoryReportInfo +using ::FsMemoryReportInfo; +/// For use with fsOpenHostFileSystemWithOption +using ::FsMountHostOption; +/// For use with fsFsOpenFile. +using ::FsOpenMode; +using ::FsOperationId; +/// FsPriority +using ::FsPriority; +using ::FsRangeInfo; +/// For use with fsFileRead. +using ::FsReadOption; +using ::FsRightsId; +/// SaveDataAttribute +using ::FsSaveDataAttribute; +/// SaveDataCreationInfo +using ::FsSaveDataCreationInfo; +/// SaveDataExtraData +using ::FsSaveDataExtraData; +/// SaveDataFilter +using ::FsSaveDataFilter; +/// SaveDataFlags +using ::FsSaveDataFlags; +/// SaveDataInfo +using ::FsSaveDataInfo; +using ::FsSaveDataInfoReader; +/// SaveDataMetaInfo +using ::FsSaveDataMetaInfo; +/// SaveDataMetaType +using ::FsSaveDataMetaType; +/// SaveDataRank +using ::FsSaveDataRank; +/// SaveDataSpaceId +using ::FsSaveDataSpaceId; +/// SaveDataType +using ::FsSaveDataType; +using ::FsStorage; +/// FsStorageErrorInfo +using ::FsStorageErrorInfo; +using ::FsStorageForBatchRead; +using ::FsTimeStampRaw; +/// For use with fsFileWrite. +using ::FsWriteOption; + +/// Initialize fsp-srv. Used automatically during app startup. +Result Initialize(void); + +/// Exit fsp-srv. Used automatically during app exit. +void Exit(void); + +/// Gets the Service object for the actual fsp-srv service session. +Service* GetServiceSession(void); + +/// [5.0.0+] Configures the \ref FsPriority of all filesystem commands issued within the current thread. +void SetPriority(FsPriority prio); + +/// Mount requested filesystem type from content file +Result OpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); + +///< same as calling fsOpenFileSystemWithId with 0 as id +Result OpenDataFileSystemByCurrentProcess(FsFileSystem *out); + +Result OpenFileSystemWithPatch(FsFileSystem* out, u64 id, FsFileSystemType fsType); + +///< [2.0.0+], like OpenFileSystemWithId but without content path. +Result OpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath, FsContentAttributes attr); + +///< works on all firmwares, id is ignored on [1.0.0], attr is ignored before [16.0.0] +Result OpenDataFileSystemByProgramId(FsFileSystem *out, u64 program_id); + +///< [3.0.0+] +Result OpenBisFileSystem(FsFileSystem* out, FsBisPartitionId partitionId, const char* string); + +Result OpenBisStorage(FsStorage* out, FsBisPartitionId partitionId); + +/// Do not call this directly, see fs_dev.h. +Result OpenSdCardFileSystem(FsFileSystem* out); + +Result OpenHostFileSystem(FsFileSystem* out, const char *path); + +Result OpenHostFileSystemWithOption(FsFileSystem* out, const char *path, u32 flags); + +///< [9.0.0+] +Result DeleteSaveDataFileSystem(u64 application_id); + +Result CreateSaveDataFileSystem(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info, const FsSaveDataMetaInfo* meta); + +Result CreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info); + +Result DeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); + +///< [2.0.0+] +Result DeleteSaveDataFileSystemBySaveDataAttribute(FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute* attr); + +///< [4.0.0+] +Result IsExFatSupported(bool* out); + +Result OpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition); + +Result ExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); + +///< [3.0.0+] +Result OpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); + +Result OpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); + +Result OpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); + +///< [2.0.0+]. +Result ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID); + +Result ReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID); + +Result WriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID); + +Result OpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id); + +Result OpenSaveDataInfoReaderWithFilter(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataFilter *save_data_filter); + +///< [6.0.0+] +Result OpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id); + +Result OpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id); + +Result OpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); + +///< [7.0.0+] +Result OpenDataStorageByCurrentProcess(FsStorage* out); + +Result OpenDataStorageByProgramId(FsStorage *out, u64 program_id); + +///< [3.0.0+] +Result OpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId); + +Result OpenPatchDataStorageByCurrentProcess(FsStorage* out); + +Result OpenDataStorageByCurrentProcessForBatchRead(FsStorageForBatchRead* out); + +///< [23.0.0+] +Result OpenDataStorageByProgramIdForBatchRead(FsStorageForBatchRead* out, u64 id); + +///< [23.0.0+] +Result OpenDataStorageWithProgramIndexForBatchRead(FsStorageForBatchRead* out, u8 program_index); + +///< [23.0.0+] +Result OpenDataStorageByPathForBatchRead(FsStorageForBatchRead* out, const char* contentPath, FsContentAttributes attributes, FsFileSystemType fsType); + +///< [23.0.0+] +Result OpenDeviceOperator(FsDeviceOperator* out); + +Result OpenSdCardDetectionEventNotifier(FsEventNotifier* out); + +Result IsSignedSystemPartitionOnSdCardValid(bool *out); + +Result GetProgramId(u64* out, const char *path, FsContentAttributes attr); + +///< [17.0.0+] +/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0-15.0.1]. +Result GetRightsIdByPath(const char* path, FsRightsId* out_rights_id); + +/// Retrieves the rights id and key generation corresponding to the content path. Only available on [3.0.0+], attr is ignored before [16.0.0]. +Result GetRightsIdAndKeyGenerationByPath(const char* path, FsContentAttributes attr, u8* out_key_generation, FsRightsId* out_rights_id); + +Result GetContentStorageInfoIndex(s32 *out); + +///< [19.0.0+] +Result DisableAutoSaveDataCreation(void); + +///< [1.0.0-21.2.0] +Result SetGlobalAccessLogMode(u32 mode); + +Result GetGlobalAccessLogMode(u32* out_mode); + +Result OutputAccessLogToSdCard(const char *log, size_t size); + +Result GetAndClearErrorInfo(FsFileSystemProxyErrorInfo *out); + +///< [2.0.0+] +Result GetAndClearMemoryReportInfo(FsMemoryReportInfo* out); + +///< [4.0.0+] +/// Only available on [7.0.0+]. +Result GetProgramIndexForAccessLog(u32 *out_program_index, u32 *out_program_count); + +Result Create_TemporaryStorage(u64 application_id, u64 owner_id, s64 size, u32 flags); + +Result Create_SystemSaveDataWithOwner(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid, u64 owner_id, s64 size, s64 journal_size, u32 flags); + +Result Create_SystemSaveData(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, s64 size, s64 journal_size, u32 flags); + +/// Wrapper for fsOpenSaveDataFileSystem. +/// See \ref FsSaveDataAttribute for application_id and uid. +Result Open_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid); + +/// Wrapper for fsOpenReadOnlySaveDataFileSystem. +/// Only available on [2.0.0+]. +/// See \ref FsSaveDataAttribute for application_id and uid. +Result Open_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid); + +/// Wrapper for fsOpenSaveDataFileSystem, for opening BcatSaveData. +Result Open_BcatSaveData(FsFileSystem* out, u64 application_id); + +/// Wrapper for fsOpenSaveDataFileSystem, for opening DeviceSaveData. +/// See \ref FsSaveDataAttribute for application_id. +Result Open_DeviceSaveData(FsFileSystem* out, u64 application_id); + +/// Wrapper for fsOpenSaveDataFileSystem, for opening TemporaryStorage. +/// Only available on [3.0.0+]. +Result Open_TemporaryStorage(FsFileSystem* out); + +/// Wrapper for fsOpenSaveDataFileSystem, for opening CacheStorage. +/// Only available on [3.0.0+]. +/// See \ref FsSaveDataAttribute for application_id. +Result Open_CacheStorage(FsFileSystem* out, u64 application_id, u16 save_data_index); + +/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemSaveData. +/// WARNING: You can brick when writing to SystemSaveData, if the data is corrupted etc. +Result Open_SystemSaveData(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid); + +/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemBcatSaveData. +/// Only available on [4.0.0+]. +Result Open_SystemBcatSaveData(FsFileSystem* out, u64 system_save_data_id); + +Result FsCreateFile(FsFileSystem* fs, const char* path, s64 size, u32 option); + +Result FsDeleteFile(FsFileSystem* fs, const char* path); + +Result FsCreateDirectory(FsFileSystem* fs, const char* path); + +Result FsDeleteDirectory(FsFileSystem* fs, const char* path); + +Result FsDeleteDirectoryRecursively(FsFileSystem* fs, const char* path); + +Result FsRenameFile(FsFileSystem* fs, const char* cur_path, const char* new_path); + +Result FsRenameDirectory(FsFileSystem* fs, const char* cur_path, const char* new_path); + +Result FsGetEntryType(FsFileSystem* fs, const char* path, FsDirEntryType* out); + +Result FsOpenFile(FsFileSystem* fs, const char* path, u32 mode, FsFile* out); + +Result FsOpenDirectory(FsFileSystem* fs, const char* path, u32 mode, FsDir* out); + +Result FsCommit(FsFileSystem* fs); + +Result FsGetFreeSpace(FsFileSystem* fs, const char* path, s64* out); + +Result FsGetTotalSpace(FsFileSystem* fs, const char* path, s64* out); + +Result FsGetFileTimeStampRaw(FsFileSystem* fs, const char* path, FsTimeStampRaw *out); + +///< [3.0.0+] +Result FsCleanDirectoryRecursively(FsFileSystem* fs, const char* path); + +///< [3.0.0+] +Result FsQueryEntry(FsFileSystem* fs, void *out, size_t out_size, const void *in, size_t in_size, const char* path, FsFileSystemQueryId query_id); + +///< [4.0.0+] +Result FsGetFileSystemAttribute(FsFileSystem* fs, FsFileSystemAttribute *out); + +///< [15.0.0+] +void FsClose(FsFileSystem* fs); + +/// Uses \ref fsFsQueryEntry to set the archive bit on the specified absolute directory path. +/// This will cause HOS to treat the directory as if it were a file containing the directory's concatenated contents. +Result FsSetConcatenationFileAttribute(FsFileSystem* fs, const char *path); + +/// Wrapper for fsFsQueryEntry with FsFileSystemQueryId_IsValidSignedSystemPartitionOnSdCard. +/// Only available on [8.0.0+]. +Result FsIsValidSignedSystemPartitionOnSdCard(FsFileSystem* fs, bool *out); + +Result FileRead(FsFile* f, s64 off, void* buf, u64 read_size, u32 option, u64* bytes_read); + +Result FileWrite(FsFile* f, s64 off, const void* buf, u64 write_size, u32 option); + +Result FileFlush(FsFile* f); + +Result FileSetSize(FsFile* f, s64 sz); + +Result FileGetSize(FsFile* f, s64* out); + +Result FileOperateRange(FsFile* f, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); + +///< [4.0.0+] +void FileClose(FsFile* f); + +Result DirRead(FsDir* d, s64* total_entries, size_t max_entries, FsDirectoryEntry *buf); + +Result DirGetEntryCount(FsDir* d, s64* count); + +void DirClose(FsDir* d); + +Result StorageRead(FsStorage* s, s64 off, void* buf, u64 read_size); + +Result StorageWrite(FsStorage* s, s64 off, const void* buf, u64 write_size); + +Result StorageFlush(FsStorage* s); + +Result StorageSetSize(FsStorage* s, s64 sz); + +Result StorageGetSize(FsStorage* s, s64* out); + +Result StorageOperateRange(FsStorage* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); + +///< [4.0.0+] +void StorageClose(FsStorage* s); + +Result StorageForBatchReadRead(FsStorageForBatchRead* s, s64 off, void* buf, u64 read_size); + +Result StorageForBatchReadWrite(FsStorageForBatchRead* s, s64 off, const void* buf, u64 write_size); + +Result StorageForBatchReadFlush(FsStorageForBatchRead* s); + +Result StorageForBatchReadSetSize(FsStorageForBatchRead* s, s64 sz); + +Result StorageForBatchReadGetSize(FsStorageForBatchRead* s, s64* out); + +Result StorageForBatchReadOperateRange(FsStorageForBatchRead* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); + +Result StorageForBatchReadBatchRead(FsStorageForBatchRead* s, void* out0, void* out1, void* out2, void* out3, void* out4, void* out5, void* out6, const void* in); + +void StorageForBatchReadClose(FsStorageForBatchRead* s); + +/// Read FsSaveDataInfo data into the buf array. +Result SaveDataInfoReaderRead(FsSaveDataInfoReader *s, FsSaveDataInfo* buf, size_t max_entries, s64* total_entries); + +void SaveDataInfoReaderClose(FsSaveDataInfoReader *s); + +Result EventNotifierGetEventHandle(FsEventNotifier* e, Event* out, bool autoclear); + +void EventNotifierClose(FsEventNotifier* e); + +Result DeviceOperatorIsSdCardInserted(FsDeviceOperator* d, bool* out); + +Result DeviceOperatorGetSdCardSpeedMode(FsDeviceOperator* d, s64* out); + +Result DeviceOperatorGetSdCardCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); + +Result DeviceOperatorGetSdCardUserAreaSize(FsDeviceOperator* d, s64* out); + +Result DeviceOperatorGetSdCardProtectedAreaSize(FsDeviceOperator* d, s64* out); + +Result DeviceOperatorGetAndClearSdCardErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size); + +Result DeviceOperatorGetMmcCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); + +Result DeviceOperatorGetMmcSpeedMode(FsDeviceOperator* d, s64* out); + +Result DeviceOperatorGetMmcPatrolCount(FsDeviceOperator* d, u32* out); + +Result DeviceOperatorGetAndClearMmcErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size); + +Result DeviceOperatorGetMmcExtendedCsd(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); + +Result DeviceOperatorIsGameCardInserted(FsDeviceOperator* d, bool* out); + +Result DeviceOperatorGetGameCardHandle(FsDeviceOperator* d, FsGameCardHandle* out); + +Result DeviceOperatorGetGameCardUpdatePartitionInfo(FsDeviceOperator* d, const FsGameCardHandle* handle, FsGameCardUpdatePartitionInfo* out); + +Result DeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCardHandle* handle, u8 *out); + +Result DeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64* out_size, s64 size); + +Result DeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); + +Result DeviceOperatorGetGameCardErrorReportInfo(FsDeviceOperator* d, FsGameCardErrorReportInfo* out); + +Result DeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); + +Result DeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size); + +void DeviceOperatorClose(FsDeviceOperator* d); + +} // namespace fs + +/// @brief C++ wrappers for the `fsdev` API. +/// @details Wraps: switch/runtime/devices/fs_dev.h. +namespace fsdev { + +/// Open directory struct +using ::fsdev_dir_t; + +/// Retrieves a pointer to temporary stage for reading entries +FsDirectoryEntry* DirGetEntries(fsdev_dir_t *dir); + +/// Initializes and mounts the sdmc device if accessible. +Result MountSdmc(void); + +/// Mounts the specified SaveData. +Result MountSaveData(const char *name, u64 application_id, AccountUid uid); + +/// Mounts the specified SaveData as ReadOnly. +/// Only available on [2.0.0+]. +Result MountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid); + +/// Mounts the specified BcatSaveData. +Result MountBcatSaveData(const char *name, u64 application_id); + +/// Mounts the specified DeviceSaveData. +Result MountDeviceSaveData(const char *name, u64 application_id); + +/// Mounts the TemporaryStorage for the current process. +/// Only available on [3.0.0+]. +Result MountTemporaryStorage(const char *name); + +/// Mounts the specified CacheStorage. +/// Only available on [3.0.0+]. +Result MountCacheStorage(const char *name, u64 application_id, u16 save_data_index); + +/// Mounts the specified SystemSaveData. +Result MountSystemSaveData(const char *name, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid); + +/// Mounts the specified SystemBcatSaveData. +/// Only available on [4.0.0+]. +Result MountSystemBcatSaveData(const char *name, u64 system_save_data_id); + +/// Mounts the input fs with the specified device name. fsdev will handle closing the fs when required, including when fsdevMountDevice() fails. +/// Returns -1 when any errors occur. +/// Input device name string shouldn't exceed 31 characters, and shouldn't have a trailing colon. +int MountDevice(const char *name, FsFileSystem fs); + +/// Unmounts the specified device. +int UnmountDevice(const char *name); + +/// Uses fsFsCommit() with the specified device. This must be used after any savedata-write operations(not just file-write). This should be used after each file-close where file-writing was done. +/// This is not used automatically at device unmount. +Result CommitDevice(const char *name); + +/// Returns the FsFileSystem for the specified device. Returns NULL when the specified device isn't found. +FsFileSystem* GetDeviceFileSystem(const char *name); + +/// Writes the FS-path to outpath (which has buffer size FS_MAX_PATH), for the input path (as used in stdio). The FsFileSystem is also written to device when not NULL. +int TranslatePath(const char *path, FsFileSystem** device, char *outpath); + +/// This calls fsFsSetConcatenationFileAttribute on the filesystem specified by the input path (as used in stdio). +Result SetConcatenationFileAttribute(const char *path); + +Result IsValidSignedSystemPartitionOnSdCard(const char *name, bool *out); + +/// This calls fsFsCreateFile on the filesystem specified by the input path (as used in stdio). +Result CreateFile(const char* path, size_t size, u32 flags); + +/// Recursively deletes the directory specified by the input path (as used in stdio). +Result DeleteDirectoryRecursively(const char *path); + +/// Unmounts all devices and cleans up any resources used by the FS driver. +Result UnmountAll(void); + +/// Retrieves the last native result code generated during a failed fsdev operation. +Result GetLastResult(void); + +} // namespace fsdev + +/// @brief C++ wrappers for the `fsldr` API. +/// @details Wraps: switch/services/fsldr.h. +namespace fsldr { + +using ::FsCodeInfo; + +/// Initialize fsp-ldr. +Result Initialize(void); + +/// Exit fsp-ldr. +void Exit(void); + +/// Gets the Service object for the actual fsp-ldr service session. +Service* GetServiceSession(void); + +Result OpenCodeFileSystem(FsCodeInfo* out_code_info, u64 tid, NcmStorageId storage_id, const char *path, FsContentAttributes attr, FsFileSystem* out); + +Result IsArchivedProgram(u64 pid, bool *out); + +} // namespace fsldr + +/// @brief C++ wrappers for the `fspr` API. +/// @details Wraps: switch/services/fspr.h. +namespace fspr { + +/// Initialize fsp-pr. +Result Initialize(void); + +/// Exit fsp-pr. +void Exit(void); + +/// Gets the Service object for the actual fsp-pr service session. +Service* GetServiceSession(void); + +Result RegisterProgram(u64 pid, u64 tid, NcmStorageId sid, const void *fs_access_header, size_t fah_size, const void *fs_access_control, size_t fac_size, u8 fs_access_control_restriction_mode); + +Result UnregisterProgram(u64 pid); + +Result SetCurrentProcess(void); + +Result SetEnabledProgramVerification(bool enabled); + +} // namespace fspr + +/// @brief C++ wrappers for the `gpio` API. +/// @details Wraps: switch/services/gpio.h. +namespace gpio { + +using ::GpioDirection; +using ::GpioInterruptMode; +using ::GpioInterruptStatus; +using ::GpioPadName; +using ::GpioPadSession; +using ::GpioValue; + +/// Initialize gpio. +Result Initialize(void); + +/// Exit gpio. +void Exit(void); + +/// Gets the Service object for the actual gpio service session. +Service* GetServiceSession(void); + +Result OpenSession(GpioPadSession *out, GpioPadName name); + +Result OpenSession2(GpioPadSession *out, u32 device_code, u32 access_mode); + +Result IsWakeEventActive(bool *out, GpioPadName name); + +Result IsWakeEventActive2(bool *out, u32 device_code); + +Result PadSetDirection(GpioPadSession *p, GpioDirection dir); + +Result PadGetDirection(GpioPadSession *p, GpioDirection *out); + +Result PadSetInterruptMode(GpioPadSession *p, GpioInterruptMode mode); + +Result PadGetInterruptMode(GpioPadSession *p, GpioInterruptMode *out); + +Result PadSetInterruptEnable(GpioPadSession *p, bool en); + +Result PadGetInterruptEnable(GpioPadSession *p, bool *out); + +Result PadGetInterruptStatus(GpioPadSession *p, GpioInterruptStatus *out); + +///< [1.0.0-16.1.0] +Result PadClearInterruptStatus(GpioPadSession *p); + +///< [1.0.0-16.1.0] +Result PadSetValue(GpioPadSession *p, GpioValue val); + +Result PadGetValue(GpioPadSession *p, GpioValue *out); + +Result PadBindInterrupt(GpioPadSession *p, Event *out); + +Result PadUnbindInterrupt(GpioPadSession *p); + +Result PadSetDebounceEnabled(GpioPadSession *p, bool en); + +Result PadGetDebounceEnabled(GpioPadSession *p, bool *out); + +Result PadSetDebounceTime(GpioPadSession *p, s32 ms); + +Result PadGetDebounceTime(GpioPadSession *p, s32 *out); + +void PadClose(GpioPadSession *p); + +} // namespace gpio + +/// @brief C++ wrappers for the `grc` API. +/// @details Wraps: switch/services/grc.h. +namespace grc { + +/// GameMovieId +using ::GrcGameMovieId; +/// GameMovieTrimmer +using ::GrcGameMovieTrimmer; +/// IMovieMaker +using ::GrcMovieMaker; +/// OffscreenRecordingParameter +using ::GrcOffscreenRecordingParameter; +/// Stream type values for \ref grcdTransfer. +using ::GrcStream; + +/** + * @brief Creates a \ref GrcGameMovieTrimmer using \ref appletCreateGameMovieTrimmer, uses the cmds from it to trim the specified video, then closes it. + * @note See \ref appletCreateGameMovieTrimmer for the requirements for using this. + * @note This will block until video trimming finishes. + * @param[out] dst_movieid \ref GrcGameMovieId for the output video. + * @param[in] src_movieid \ref GrcGameMovieId for the input video. + * @param[in] tmem_size TransferMemory size. Official sw uses size 0x2000000. + * @param[in] thumbnail Optional, can be NULL. RGBA8 1280x720 thumbnail image data. + * @param[in] start Start timestamp in 0.5s units. + * @param[in] end End timestamp in 0.5s units. + */ +Result TrimGameMovie(GrcGameMovieId *dst_movieid, const GrcGameMovieId *src_movieid, size_t tmem_size, const void* thumbnail, s32 start, s32 end); + +/** + * @brief Creates a \ref GrcOffscreenRecordingParameter with the default values, see \ref GrcOffscreenRecordingParameter for the default values. + * @param[out] param \ref GrcOffscreenRecordingParameter + */ +void CreateOffscreenRecordingParameter(GrcOffscreenRecordingParameter *param); + +/** + * @brief Creates a \ref GrcMovieMaker using \ref appletCreateMovieMaker, and does the required initialization. + * @note See \ref appletCreateMovieMaker for the requirements for using this. + * @param[out] m \ref GrcMovieMaker + * @param[in] size TransferMemory WorkMemory size. See \ref GRC_MOVIEMAKER_WORKMEMORY_SIZE_DEFAULT. + */ +Result CreateMovieMaker(GrcMovieMaker *m, size_t size); + +/** + * @brief Closes a \ref GrcMovieMaker. + * @note This also uses \ref grcMovieMakerAbort. + * @param m \ref GrcMovieMaker + */ +void MovieMakerClose(GrcMovieMaker *m); + +/** + * @brief Gets the \ref NWindow for the specified MovieMaker. + * @param m \ref GrcMovieMaker + */ +NWindow* MovieMakerGetNWindow(GrcMovieMaker *m); + +/** + * @brief Aborts recording with the specified MovieMaker. + * @note This is used automatically by \ref grcMovieMakerClose. + * @note This will throw an error if \ref grcMovieMakerStart was not used previously, with the flag used for this being cleared afterwards on success. + * @param m \ref GrcMovieMaker + */ +Result MovieMakerAbort(GrcMovieMaker *m); + +/** + * @brief Starts recording with the specified MovieMaker and \ref GrcOffscreenRecordingParameter. + * @param m \ref GrcMovieMaker + * @param[in] param \ref GrcOffscreenRecordingParameter + */ +Result MovieMakerStart(GrcMovieMaker *m, const GrcOffscreenRecordingParameter *param); + +/** + * @brief Finishes recording with the specified MovieMaker. + * @note This automatically uses \ref grcMovieMakerAbort on error. + * @note The recorded video will not be accessible via the Album-applet since it's stored separately from other Album data. + * @param m \ref GrcMovieMaker + * @param width Width for the thumbnail, must be 1280. + * @param height Height for the thumbnail, must be 720. + * @param[in] userdata UserData input buffer for the JPEG thumbnail. Optional, can be NULL. + * @param[in] userdata_size Size of the UserData input buffer. Optional, can be 0. Must be <=0x400. + * @param[in] thumbnail RGBA8 image buffer containing the thumbnail. Optional, can be NULL. + * @param[in] thumbnail_size Size of the thumbnail buffer. Optional, can be 0. + * @param[out] entry Output \ref CapsApplicationAlbumEntry for the recorded video. Optional, can be NULL. Only available on [7.0.0+], if this is not NULL on pre-7.0.0 an error is thrown. + */ +Result MovieMakerFinish(GrcMovieMaker *m, s32 width, s32 height, const void* userdata, size_t userdata_size, const void* thumbnail, size_t thumbnail_size, CapsApplicationAlbumEntry *entry); + +/** + * @brief Gets the recording error with the specified MovieMaker. + * @param m \ref GrcMovieMaker + */ +Result MovieMakerGetError(GrcMovieMaker *m); + +/** + * @brief Encodes audio sample data with the specified MovieMaker. + * @note This waits on the event and uses the cmd repeatedly until the entire input buffer is handled. + * @note If you don't use this the recorded video will be missing audio. + * @param m \ref GrcMovieMaker + * @param[in] buffer Audio buffer. + * @param[in] size Size of the buffer. + */ +Result MovieMakerEncodeAudioSample(GrcMovieMaker *m, const void* buffer, size_t size); + +} // namespace grc + +/// @brief C++ wrappers for the `grcd` API. +/// @details Wraps: switch/services/grc.h. +namespace grcd { + +/// GameMovieId +using ::GrcGameMovieId; +/// GameMovieTrimmer +using ::GrcGameMovieTrimmer; +/// IMovieMaker +using ::GrcMovieMaker; +/// OffscreenRecordingParameter +using ::GrcOffscreenRecordingParameter; +/// Stream type values for \ref grcdTransfer. +using ::GrcStream; + +/// Initialize grc:d. +Result Initialize(void); + +/// Exit grc:d. +void Exit(void); + +/// Gets the Service for grc:d. +Service* GetServiceSession(void); + +/// Begins streaming. This must not be called more than once, even from a different service session: otherwise the sysmodule will assert. +Result Begin(void); + +/** + * @brief Retrieves stream data from the continuous recorder in use (from the video recording of the currently running application). + * @note This will block until data is available. This will hang if there is no application running which has video capture enabled. + * @param[in] stream \ref GrcStream + * @param[out] buffer Output buffer. + * @param[in] size Max size of the output buffer. + * @param[out] num_frames num_frames + * @param[out] data_size Actual output data size. + * @param[out] start_timestamp Start timestamp. + */ +Result Transfer(GrcStream stream, void* buffer, size_t size, u32 *num_frames, u32 *data_size, u64 *start_timestamp); + +} // namespace grcd + +/// @brief C++ wrappers for the `hid` API. +/// @details Wraps: switch/applets/hid_la.h, switch/services/hid.h. +namespace hid { + +/// HidAnalogStickCalibrationStateImpl +using ::HidAnalogStickCalibrationStateImpl; +/// HidAnalogStickCalibrationStateImplAtomicStorage +using ::HidAnalogStickCalibrationStateImplAtomicStorage; +/// HidAnalogStickCalibrationStateImplLifo +using ::HidAnalogStickCalibrationStateImplLifo; +/// HidAnalogStickState +using ::HidAnalogStickState; +/// AppletFooterUiType (system) +using ::HidAppletFooterUiType; +/// HidBasicXpadLifo +using ::HidBasicXpadLifo; +/// HidBasicXpadSharedMemoryEntry +using ::HidBasicXpadSharedMemoryEntry; +/// HidBasicXpadSharedMemoryFormat +using ::HidBasicXpadSharedMemoryFormat; +/// HidBasicXpadState +using ::HidBasicXpadState; +/// HidBasicXpadStateAtomicStorage +using ::HidBasicXpadStateAtomicStorage; +/// HidCaptureButtonLifo +using ::HidCaptureButtonLifo; +/// HidCaptureButtonSharedMemoryFormat +using ::HidCaptureButtonSharedMemoryFormat; +/// HidCaptureButtonState +using ::HidCaptureButtonState; +/// HidCaptureButtonStateAtomicStorage +using ::HidCaptureButtonStateAtomicStorage; +/// HidColorAttribute +using ::HidColorAttribute; +/// HidCommonLifoHeader +using ::HidCommonLifoHeader; +/// HidConsoleSixAxisSensor +using ::HidConsoleSixAxisSensor; +/// HidDebugPadAttribute +using ::HidDebugPadAttribute; +/// HidDebugPadButton +using ::HidDebugPadButton; +/// HidDebugPadLifo +using ::HidDebugPadLifo; +/// HidDebugPadSharedMemoryFormat +using ::HidDebugPadSharedMemoryFormat; +/// HidDebugPadState +using ::HidDebugPadState; +/// HidDebugPadStateAtomicStorage +using ::HidDebugPadStateAtomicStorage; +/// Internal DeviceType for [9.0.0+]. Converted to/from the pre-9.0.0 version of this by the hiddbg funcs. +using ::HidDeviceType; +/// DeviceType (system) +using ::HidDeviceTypeBits; +/// HidDigitizerLifo +using ::HidDigitizerLifo; +/// HidDigitizerSharedMemoryFormat +using ::HidDigitizerSharedMemoryFormat; +/// HidDigitizerState +using ::HidDigitizerState; +/// HidDigitizerStateAtomicStorage +using ::HidDigitizerStateAtomicStorage; +/// HidDirectionState +using ::HidDirectionState; +/// HidGestureAttribute +using ::HidGestureAttribute; +/// HidGestureDirection +using ::HidGestureDirection; +/// HidGestureDummyStateAtomicStorage +using ::HidGestureDummyStateAtomicStorage; +/// HidGestureLifo +using ::HidGestureLifo; +/// HidGesturePoint +using ::HidGesturePoint; +/// HidGestureSharedMemoryFormat +using ::HidGestureSharedMemoryFormat; +/// HidGestureState +using ::HidGestureState; +/// HidGestureType +using ::HidGestureType; +/// GyroscopeZeroDriftMode +using ::HidGyroscopeZeroDriftMode; +/// HidHomeButtonLifo +using ::HidHomeButtonLifo; +/// HidHomeButtonSharedMemoryFormat +using ::HidHomeButtonSharedMemoryFormat; +/// HidHomeButtonState +using ::HidHomeButtonState; +/// HidHomeButtonStateAtomicStorage +using ::HidHomeButtonStateAtomicStorage; +/// HidInputDetectorLifo +using ::HidInputDetectorLifo; +/// HidInputDetectorSharedMemoryEntry +using ::HidInputDetectorSharedMemoryEntry; +/// HidInputDetectorSharedMemoryFormat +using ::HidInputDetectorSharedMemoryFormat; +/// HidInputDetectorState +using ::HidInputDetectorState; +/// HidInputDetectorStateAtomicStorage +using ::HidInputDetectorStateAtomicStorage; +/// HidKeyboardKey +using ::HidKeyboardKey; +/// HidKeyboardLifo +using ::HidKeyboardLifo; +/// KeyboardLockKeyEvent +using ::HidKeyboardLockKeyEvent; +/// HidKeyboardModifier +using ::HidKeyboardModifier; +/// HidKeyboardSharedMemoryFormat +using ::HidKeyboardSharedMemoryFormat; +/// HidKeyboardState +using ::HidKeyboardState; +/// HidKeyboardStateAtomicStorage +using ::HidKeyboardStateAtomicStorage; +/// ControllerFirmwareUpdateArg +using ::HidLaControllerFirmwareUpdateArg; +/// ControllerKeyRemappingArg +using ::HidLaControllerKeyRemappingArg; +/// ControllerSupportArg for [8.0.0+], converted to \ref HidLaControllerSupportArgV3 on pre-8.0.0. +using ::HidLaControllerSupportArg; +/// Identification color used by HidLaControllerSupportArg*. When HidLaControllerSupportArgHeader::enable_identification_color is set this controls the color of the UI player box outline. +using ::HidLaControllerSupportArgColor; +/// Common header used by HidLaControllerSupportArg*. +/// max_supported_players is 4 on pre-8.0.0, 8 on [8.0.0+]. player_count_min and player_count_max are overriden with value 4 when larger than value 4, during conversion handling for \ref HidLaControllerSupportArg on pre-8.0.0. +using ::HidLaControllerSupportArgHeader; +/// ControllerSupportArgPrivate +using ::HidLaControllerSupportArgPrivate; +/// ControllerSupportArg for [1.0.0+]. +using ::HidLaControllerSupportArgV3; +/// ControllerSupportCaller +using ::HidLaControllerSupportCaller; +/// Mode values for HidLaControllerSupportArgPrivate::mode. +using ::HidLaControllerSupportMode; +/// ControllerSupportResultInfo. First 8-bytes from the applet output storage. +using ::HidLaControllerSupportResultInfo; +/// Struct for the applet output storage. +using ::HidLaControllerSupportResultInfoInternal; +/// HidMouseAttribute +using ::HidMouseAttribute; +/// HidMouseButton +using ::HidMouseButton; +/// HidMouseLifo +using ::HidMouseLifo; +/// HidMouseSharedMemoryFormat +using ::HidMouseSharedMemoryFormat; +/// HidMouseState +using ::HidMouseState; +/// HidMouseStateAtomicStorage +using ::HidMouseStateAtomicStorage; +/// HidNfcXcdDeviceHandleState +using ::HidNfcXcdDeviceHandleState; +/// HidNfcXcdDeviceHandleStateImpl +using ::HidNfcXcdDeviceHandleStateImpl; +/// HidNfcXcdDeviceHandleStateImplAtomicStorage +using ::HidNfcXcdDeviceHandleStateImplAtomicStorage; +/// HidNpadAttribute +using ::HidNpadAttribute; +/// HidNpadButton +using ::HidNpadButton; +/// HidNpadCommonLifo +using ::HidNpadCommonLifo; +/// HidNpadCommonState +using ::HidNpadCommonState; +///< State for ::HidNpadStyleTag_NpadSystem. Analog-sticks state are always zero. Only the following button bits are available: HidNpadButton_A, HidNpadButton_B, HidNpadButton_X, HidNpadButton_Y, HidNpadButton_Left, HidNpadButton_Up, HidNpadButton_Right, HidNpadButton_Down, HidNpadButton_L, HidNpadButton_R. +/// HidNpadCommonStateAtomicStorage +using ::HidNpadCommonStateAtomicStorage; +/// NpadCommunicationMode +using ::HidNpadCommunicationMode; +/// Npad colors. +/// Color fields are zero when not set. +using ::HidNpadControllerColor; +/// HidNpadFullKeyColorState +using ::HidNpadFullKeyColorState; +using ::HidNpadFullKeyState; +///< State for ::HidNpadStyleTag_NpadJoyRight. +/// State for ::HidNpadStyleTag_NpadGc. Loaded from the same lifo as \ref HidNpadFullKeyState, with the additional trigger_l/trigger_r loaded from elsewhere. +using ::HidNpadGcState; +/// HidNpadGcTriggerLifo +using ::HidNpadGcTriggerLifo; +/// HidNpadGcTriggerState +using ::HidNpadGcTriggerState; +/// HidNpadGcTriggerStateAtomicStorage +using ::HidNpadGcTriggerStateAtomicStorage; +/// This controls how many Joy-Cons must be attached for handheld-mode to be activated. +using ::HidNpadHandheldActivationMode; +/// State for ::HidNpadStyleTag_NpadHandheldLark. The base state is loaded from the same lifo as \ref HidNpadHandheldState. +using ::HidNpadHandheldLarkState; +///< State for ::HidNpadStyleTag_NpadFullKey. +using ::HidNpadHandheldState; +/// HID controller IDs +using ::HidNpadIdType; +/// NpadInterfaceType (system) +using ::HidNpadInterfaceType; +/// HidNpadInternalState +using ::HidNpadInternalState; +/// NpadJoyAssignmentMode +using ::HidNpadJoyAssignmentMode; +/// HidNpadJoyColorState +using ::HidNpadJoyColorState; +/// NpadJoyDeviceType +using ::HidNpadJoyDeviceType; +///< State for ::HidNpadStyleTag_NpadHandheld. +using ::HidNpadJoyDualState; +/// NpadJoyHoldType +using ::HidNpadJoyHoldType; +///< State for ::HidNpadStyleTag_NpadJoyDual. +using ::HidNpadJoyLeftState; +///< State for ::HidNpadStyleTag_NpadJoyLeft. +using ::HidNpadJoyRightState; +using ::HidNpadLagerState; +/// NpadLagerType +using ::HidNpadLagerType; +///< State for ::HidNpadStyleTag_NpadPalma. +/// State for ::HidNpadStyleTag_NpadLark. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. +using ::HidNpadLarkState; +/// NpadLarkType +using ::HidNpadLarkType; +/// State for ::HidNpadStyleTag_NpadLucia. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. +using ::HidNpadLuciaState; +/// NpadLuciaType +using ::HidNpadLuciaType; +using ::HidNpadPalmaState; +/// HidNpadSharedMemoryEntry +using ::HidNpadSharedMemoryEntry; +/// HidNpadSharedMemoryFormat +using ::HidNpadSharedMemoryFormat; +/// HidNpadSixAxisSensorLifo +using ::HidNpadSixAxisSensorLifo; +/// HID controller styles +using ::HidNpadStyleTag; +/// NpadSystemButtonProperties +using ::HidNpadSystemButtonProperties; +///< State for ::HidNpadStyleTag_NpadLager. Analog-sticks state are always zero. +using ::HidNpadSystemExtState; +/// NpadSystemProperties +using ::HidNpadSystemProperties; +///< State for ::HidNpadStyleTag_NpadSystemExt. +using ::HidNpadSystemState; +/// PalmaActivityEntry +using ::HidPalmaActivityEntry; +/// PalmaApplicationSectionAccessBuffer +using ::HidPalmaApplicationSectionAccessBuffer; +/// PalmaConnectionHandle +using ::HidPalmaConnectionHandle; +/// PalmaFeature +using ::HidPalmaFeature; +/// PalmaFrModeType +using ::HidPalmaFrModeType; +/// PalmaOperationInfo +using ::HidPalmaOperationInfo; +/// PalmaOperationType +using ::HidPalmaOperationType; +/// PalmaWaveSet +using ::HidPalmaWaveSet; +/// HidPowerInfo (system) +using ::HidPowerInfo; +/// HidSevenSixAxisSensorState +using ::HidSevenSixAxisSensorState; +/// HidSevenSixAxisSensorStateEntry +using ::HidSevenSixAxisSensorStateEntry; +/// HidSevenSixAxisSensorStates +using ::HidSevenSixAxisSensorStates; +/// HidSharedMemory +using ::HidSharedMemory; +/// HidSixAxisSensorAttribute +using ::HidSixAxisSensorAttribute; +/// HidSixAxisSensorHandle +using ::HidSixAxisSensorHandle; +/// HidSixAxisSensorState +using ::HidSixAxisSensorState; +/// HidSixAxisSensorStateAtomicStorage +using ::HidSixAxisSensorStateAtomicStorage; +/// HidSixAxisSensorUserCalibrationState +using ::HidSixAxisSensorUserCalibrationState; +/// HidSixAxisSensorUserCalibrationStateAtomicStorage +using ::HidSixAxisSensorUserCalibrationStateAtomicStorage; +/// HidSixAxisSensorUserCalibrationStateLifo +using ::HidSixAxisSensorUserCalibrationStateLifo; +/// HidSleepButtonLifo +using ::HidSleepButtonLifo; +/// HidSleepButtonSharedMemoryFormat +using ::HidSleepButtonSharedMemoryFormat; +/// HidSleepButtonState +using ::HidSleepButtonState; +/// HidSleepButtonStateAtomicStorage +using ::HidSleepButtonStateAtomicStorage; +/// HidTouchAttribute +using ::HidTouchAttribute; +/// HidTouchScreenConfigurationForNx +using ::HidTouchScreenConfigurationForNx; +/// HidTouchScreenLifo +using ::HidTouchScreenLifo; +/// HidTouchScreenModeForNx +using ::HidTouchScreenModeForNx; +/// HidTouchScreenSharedMemoryFormat +using ::HidTouchScreenSharedMemoryFormat; +/// HidTouchScreenState +using ::HidTouchScreenState; +/// HidTouchScreenStateAtomicStorage +using ::HidTouchScreenStateAtomicStorage; +/// HidTouchState +using ::HidTouchState; +/// HidUniquePadConfig +using ::HidUniquePadConfig; +/// HidUniquePadConfigAtomicStorage +using ::HidUniquePadConfigAtomicStorage; +/// HidUniquePadConfigLifo +using ::HidUniquePadConfigLifo; +/// HidUniquePadConfigMutex +using ::HidUniquePadConfigMutex; +/// HidUniquePadLifo +using ::HidUniquePadLifo; +/// HidUniquePadSharedMemoryEntry +using ::HidUniquePadSharedMemoryEntry; +/// HidUniquePadSharedMemoryFormat +using ::HidUniquePadSharedMemoryFormat; +/// HidVector +using ::HidVector; +/// HidVibrationDeviceHandle +using ::HidVibrationDeviceHandle; +/// HidVibrationDeviceInfo +using ::HidVibrationDeviceInfo; +/// VibrationDevicePosition +using ::HidVibrationDevicePosition; +/// Type values for HidVibrationDeviceInfo::type. +using ::HidVibrationDeviceType; +/// VibrationGcErmCommand +using ::HidVibrationGcErmCommand; +/// HidVibrationValue +using ::HidVibrationValue; +/// XcdDeviceHandle +using ::XcdDeviceHandle; +/// XcdInterfaceType +using ::XcdInterfaceType; + +/** + * @brief Initializes a \ref HidLaControllerSupportArg with the defaults. + * @note This clears the arg, then does: HidLaControllerSupportArgHeader::player_count_min = 0, HidLaControllerSupportArgHeader::player_count_max = 4, HidLaControllerSupportArgHeader::enable_take_over_connection = 1, HidLaControllerSupportArgHeader::enable_left_justify = 1, and HidLaControllerSupportArgHeader::enable_permit_joy_dual = 1. + * @note If preferred, you can also memset \ref HidLaControllerSupportArg manually and initialize it yourself. + * @param[out] arg \ref HidLaControllerSupportArg + */ +void LaCreateControllerSupportArg(HidLaControllerSupportArg *arg); + +/** + * @brief Initializes a \ref HidLaControllerFirmwareUpdateArg with the defaults. + * @note This just uses memset() with the arg. + * @param[out] arg \ref HidLaControllerFirmwareUpdateArg + */ +void LaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *arg); + +/** + * @brief Initializes a \ref HidLaControllerKeyRemappingArg with the defaults. + * @note This just uses memset() with the arg. + * @param[out] arg \ref HidLaControllerKeyRemappingArg + */ +void LaCreateControllerKeyRemappingArg(HidLaControllerKeyRemappingArg *arg); + +/** + * @brief Sets the ExplainText for the specified player and \ref HidLaControllerSupportArg. + * @note This string is displayed in the UI box for the player. + * @note HidLaControllerSupportArg::enable_explain_text must be set, otherwise this ExplainText is ignored. + * @param arg \ref HidLaControllerSupportArg + * @param[in] str Input ExplainText UTF-8 string, max length is 0x80 excluding NUL-terminator. + + @oaram[in] id Player controller, must be <8. + */ +Result LaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidNpadIdType id); + +/** + * @brief Launches the applet for ControllerSupport. + * @note This seems to only display the applet UI when doing so is actually needed? This doesn't apply to \ref hidLaShowControllerSupportForSystem. + * @param[out] result_info \ref HidLaControllerSupportResultInfo. Optional, can be NULL. + * @param[in] arg \ref HidLaControllerSupportArg + */ +Result LaShowControllerSupport(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg); + +/** + * @brief Launches the applet for ControllerStrapGuide. + * @note Only available on [3.0.0+]. + */ +Result LaShowControllerStrapGuide(void); + +/** + * @brief Launches the applet for ControllerFirmwareUpdate. + * @note Only available on [3.0.0+]. + * @param[in] arg \ref HidLaControllerFirmwareUpdateArg + */ +Result LaShowControllerFirmwareUpdate(const HidLaControllerFirmwareUpdateArg *arg); + +/** + * @brief This is the system version of \ref hidLaShowControllerSupport. + * @param[out] result_info \ref HidLaControllerSupportResultInfo. Optional, can be NULL. + * @param[in] arg \ref HidLaControllerSupportArg + * @param[in] flag Input flag. When true, the applet displays the menu as if launched by qlaunch. + */ +Result LaShowControllerSupportForSystem(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg, bool flag); + +/** + * @brief This is the system version of \ref hidLaShowControllerFirmwareUpdate. + * @note Only available on [3.0.0+]. + * @param[in] arg \ref HidLaControllerFirmwareUpdateArg + * @param[in] caller \ref HidLaControllerSupportCaller + */ +Result LaShowControllerFirmwareUpdateForSystem(const HidLaControllerFirmwareUpdateArg *arg, HidLaControllerSupportCaller caller); + +/** + * @brief Launches the applet for ControllerKeyRemappingForSystem. + * @note Only available on [11.0.0+]. + * @param[in] arg \ref HidLaControllerKeyRemappingArg + * @param[in] caller \ref HidLaControllerSupportCaller + */ +Result LaShowControllerKeyRemappingForSystem(const HidLaControllerKeyRemappingArg *arg, HidLaControllerSupportCaller caller); + +/// Initialize hid. Called automatically during app startup. +Result Initialize(void); + +/// Exit hid. Called automatically during app exit. +void Exit(void); + +/// Gets the Service object for the actual hid service session. +Service* GetServiceSession(void); + +/// Gets the address of the SharedMemory. +void* GetSharedmemAddr(void); + +/// Initialize TouchScreen. Must be called when TouchScreen is being used. Used automatically by \ref hidScanInput when required. +void InitializeTouchScreen(void); + +/** + * @brief Gets \ref HidTouchScreenState. + * @param[out] states Output array of \ref HidTouchScreenState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetTouchScreenStates(HidTouchScreenState *states, size_t count); + +/// Initialize Mouse. Must be called when Mouse is being used. Used automatically by \ref hidScanInput when required. +void InitializeMouse(void); + +/** + * @brief Gets \ref HidMouseState. + * @param[out] states Output array of \ref HidMouseState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetMouseStates(HidMouseState *states, size_t count); + +/// Initialize Keyboard. Must be called when Keyboard is being used. Used automatically by \ref hidScanInput when required. +void InitializeKeyboard(void); + +/** + * @brief Gets \ref HidKeyboardState. + * @param[out] states Output array of \ref HidKeyboardState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetKeyboardStates(HidKeyboardState *states, size_t count); + +/** + * @brief Gets the state of a key in a \ref HidKeyboardState. + * @param[in] state \ref HidKeyboardState. + * @param[in] key \ref HidKeyboardKey. + * @return true if the key is pressed, false if not. + */ +bool KeyboardStateGetKey(const HidKeyboardState *state, HidKeyboardKey key); + +/** + * @brief Gets \ref HidHomeButtonState. + * @note Home button shmem must be activated with \ref hidsysActivateHomeButton + * @param[out] states Output array of \ref HidHomeButtonState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetHomeButtonStates(HidHomeButtonState *states, size_t count); + +/** + * @brief Gets \ref HidSleepButtonState. + * @note Sleep button shmem must be activated with \ref hidsysActivateSleepButton + * @param[out] states Output array of \ref HidSleepButtonState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetSleepButtonStates(HidSleepButtonState *states, size_t count); + +/** + * @brief Gets \ref HidCaptureButtonState. + * @note Capture button shmem must be activated with \ref hidsysActivateCaptureButton + * @param[out] states Output array of \ref HidCaptureButtonState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetCaptureButtonStates(HidCaptureButtonState *states, size_t count); + +/// Initialize Npad. Must be called when Npad is being used. Used automatically by \ref hidScanInput when required. +void InitializeNpad(void); + +/** + * @brief Gets the StyleSet for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @return Bitfield of \ref HidNpadStyleTag. + */ +u32 GetNpadStyleSet(HidNpadIdType id); + +/** + * @brief Gets the \ref HidNpadJoyAssignmentMode for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @return \ref HidNpadJoyAssignmentMode + */ +HidNpadJoyAssignmentMode GetNpadJoyAssignment(HidNpadIdType id); + +/** + * @brief Gets the main \ref HidNpadControllerColor for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @param[out] color \ref HidNpadControllerColor + */ +Result GetNpadControllerColorSingle(HidNpadIdType id, HidNpadControllerColor *color); + +/** + * @brief Gets the left/right \ref HidNpadControllerColor for the specified Npad (Joy-Con pair in dual mode). + * @param[in] id \ref HidNpadIdType + * @param[out] color_left \ref HidNpadControllerColor + * @param[out] color_right \ref HidNpadControllerColor + */ +Result GetNpadControllerColorSplit(HidNpadIdType id, HidNpadControllerColor *color_left, HidNpadControllerColor *color_right); + +/** + * @brief Gets the DeviceType for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @return Bitfield of \ref HidDeviceTypeBits. + */ +u32 GetNpadDeviceType(HidNpadIdType id); + +/** + * @brief Gets the \ref HidNpadSystemProperties for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @param[out] out \ref HidNpadSystemProperties + */ +void GetNpadSystemProperties(HidNpadIdType id, HidNpadSystemProperties *out); + +/** + * @brief Gets the \ref HidNpadSystemButtonProperties for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @param[out] out \ref HidNpadSystemButtonProperties + */ +void GetNpadSystemButtonProperties(HidNpadIdType id, HidNpadSystemButtonProperties *out); + +/** + * @brief Gets the main \ref HidPowerInfo for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @param[out] info \ref HidPowerInfo + */ +void GetNpadPowerInfoSingle(HidNpadIdType id, HidPowerInfo *info); + +/** + * @brief Gets the left/right \ref HidPowerInfo for the specified Npad (Joy-Con pair in dual mode). + * @param[in] id \ref HidNpadIdType + * @param[out] info_left \ref HidPowerInfo + * @param[out] info_right \ref HidPowerInfo + */ +void GetNpadPowerInfoSplit(HidNpadIdType id, HidPowerInfo *info_left, HidPowerInfo *info_right); + +/** + * @brief Gets the AppletFooterUiAttributesSet for the specified Npad. + * @note Only available on [9.0.0+]. + * @param[in] id \ref HidNpadIdType + * @return Bitfield of AppletFooterUiAttribute (system). + */ +u32 GetAppletFooterUiAttributesSet(HidNpadIdType id); + +/** + * @brief Gets \ref HidAppletFooterUiType for the specified Npad. + * @note Only available on [9.0.0+]. + * @param[in] id \ref HidNpadIdType + * @return \ref HidAppletFooterUiType + */ +HidAppletFooterUiType GetAppletFooterUiTypes(HidNpadIdType id); + +/** + * @brief Gets \ref HidNpadLagerType for the specified Npad. + * @param[in] id \ref HidNpadIdType + * @return \ref HidNpadLagerType + */ +HidNpadLagerType GetNpadLagerType(HidNpadIdType id); + +/** + * @brief Gets \ref HidNpadFullKeyState. + * @param[out] states Output array of \ref HidNpadFullKeyState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesFullKey(HidNpadIdType id, HidNpadFullKeyState *states, size_t count); + +/** + * @brief Gets \ref HidNpadHandheldState. + * @param[out] states Output array of \ref HidNpadHandheldState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesHandheld(HidNpadIdType id, HidNpadHandheldState *states, size_t count); + +/** + * @brief Gets \ref HidNpadJoyDualState. + * @param[out] states Output array of \ref HidNpadJoyDualState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesJoyDual(HidNpadIdType id, HidNpadJoyDualState *states, size_t count); + +/** + * @brief Gets \ref HidNpadJoyLeftState. + * @param[out] states Output array of \ref HidNpadJoyLeftState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesJoyLeft(HidNpadIdType id, HidNpadJoyLeftState *states, size_t count); + +/** + * @brief Gets \ref HidNpadJoyRightState. + * @param[out] states Output array of \ref HidNpadJoyRightState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesJoyRight(HidNpadIdType id, HidNpadJoyRightState *states, size_t count); + +/** + * @brief Gets \ref HidNpadGcState. + * @param[out] states Output array of \ref HidNpadGcState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesGc(HidNpadIdType id, HidNpadGcState *states, size_t count); + +/** + * @brief Gets \ref HidNpadPalmaState. + * @param[out] states Output array of \ref HidNpadPalmaState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesPalma(HidNpadIdType id, HidNpadPalmaState *states, size_t count); + +/** + * @brief Gets \ref HidNpadLarkState. + * @param[out] states Output array of \ref HidNpadLarkState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesLark(HidNpadIdType id, HidNpadLarkState *states, size_t count); + +/** + * @brief Gets \ref HidNpadHandheldLarkState. + * @param[out] states Output array of \ref HidNpadHandheldLarkState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesHandheldLark(HidNpadIdType id, HidNpadHandheldLarkState *states, size_t count); + +/** + * @brief Gets \ref HidNpadLuciaState. + * @param[out] states Output array of \ref HidNpadLuciaState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesLucia(HidNpadIdType id, HidNpadLuciaState *states, size_t count); + +/** + * @brief Gets \ref HidNpadLagerState. + * @param[out] states Output array of \ref HidNpadLagerState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesLager(HidNpadIdType id, HidNpadLagerState *states, size_t count); + +/** + * @brief Gets \ref HidNpadSystemExtState. + * @param[out] states Output array of \ref HidNpadSystemExtState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesSystemExt(HidNpadIdType id, HidNpadSystemExtState *states, size_t count); + +/** + * @brief Gets \ref HidNpadSystemState. + * @param[out] states Output array of \ref HidNpadSystemState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetNpadStatesSystem(HidNpadIdType id, HidNpadSystemState *states, size_t count); + +/** + * @brief Gets \ref HidSixAxisSensorState for the specified handle. + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[out] states Output array of \ref HidSixAxisSensorState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetSixAxisSensorStates(HidSixAxisSensorHandle handle, HidSixAxisSensorState *states, size_t count); + +/// Initialize Gesture. Must be called when Gesture is being used. +void InitializeGesture(void); + +/** + * @brief Gets \ref HidGestureState. + * @param[out] states Output array of \ref HidGestureState. + * @param[in] count Size of the states array in entries. + * @return Total output entries. + */ +size_t GetGestureStates(HidGestureState *states, size_t count); + +/** + * @brief SendKeyboardLockKeyEvent + * @note Same as \ref hidsysSendKeyboardLockKeyEvent. + * @note Only available on [6.0.0+]. + * @param[in] events Bitfield of \ref HidKeyboardLockKeyEvent. + */ +Result SendKeyboardLockKeyEvent(u32 events); + +/** + * @brief Gets SixAxisSensorHandles. + * @note Only ::HidNpadStyleTag_NpadJoyDual supports total_handles==2. + * @param[out] handles Output array of \ref HidSixAxisSensorHandle. + * @param[in] total_handles Total handles for the handles array. Must be 1 or 2, if 2 handles aren't supported by the specified style an error is thrown. + * @param[in] id \ref HidNpadIdType + * @param[in] style \ref HidNpadStyleTag + */ +Result GetSixAxisSensorHandles(HidSixAxisSensorHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style); + +/** + * @brief Starts the SixAxisSensor for the specified handle. + * @param[in] handle \ref HidSixAxisSensorHandle + */ +Result StartSixAxisSensor(HidSixAxisSensorHandle handle); + +/** + * @brief Stops the SixAxisSensor for the specified handle. + * @param[in] handle \ref HidSixAxisSensorHandle + */ +Result StopSixAxisSensor(HidSixAxisSensorHandle handle); + +/** + * @brief IsSixAxisSensorFusionEnabled + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[out] out Output flag. + */ +Result IsSixAxisSensorFusionEnabled(HidSixAxisSensorHandle handle, bool *out); + +/** + * @brief EnableSixAxisSensorFusion + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[in] flag Flag + */ +Result EnableSixAxisSensorFusion(HidSixAxisSensorHandle handle, bool flag); + +/** + * @brief SetSixAxisSensorFusionParameters + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[in] unk0 Must be 0.0f-1.0f. + * @param[in] unk1 Unknown + */ +Result SetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float unk0, float unk1); + +/** + * @brief GetSixAxisSensorFusionParameters + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[out] unk0 Unknown + * @param[out] unk1 Unknown + */ +Result GetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float *unk0, float *unk1); + +/** + * @brief ResetSixAxisSensorFusionParameters + * @param[in] handle \ref HidSixAxisSensorHandle + */ +Result ResetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle); + +/** + * @brief Sets the ::HidGyroscopeZeroDriftMode for the specified SixAxisSensorHandle. + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[in] mode \ref HidGyroscopeZeroDriftMode + */ +Result SetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode mode); + +/** + * @brief Gets the ::HidGyroscopeZeroDriftMode for the specified SixAxisSensorHandle. + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[out] mode \ref HidGyroscopeZeroDriftMode + */ +Result GetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode *mode); + +/** + * @brief Resets the ::HidGyroscopeZeroDriftMode for the specified SixAxisSensorHandle to ::HidGyroscopeZeroDriftMode_Standard. + * @param[in] handle \ref HidSixAxisSensorHandle + */ +Result ResetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle); + +/** + * @brief IsSixAxisSensorAtRest + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[out] out Output flag. + */ +Result IsSixAxisSensorAtRest(HidSixAxisSensorHandle handle, bool *out); + +/** + * @brief IsFirmwareUpdateAvailableForSixAxisSensor + * @note Only available on [6.0.0+]. + * @param[in] handle \ref HidSixAxisSensorHandle + * @param[out] out Output flag. + */ +Result IsFirmwareUpdateAvailableForSixAxisSensor(HidSixAxisSensorHandle handle, bool *out); + +/** + * @brief Sets which controller styles are supported. + * @note This is automatically called with the needed styles in \ref hidScanInput when required. + * @param[in] style_set Bitfield of \ref HidNpadStyleTag. + */ +Result SetSupportedNpadStyleSet(u32 style_set); + +/** + * @brief Gets which controller styles are supported. + * @param[out] style_set Bitfield of \ref HidNpadStyleTag. + */ +Result GetSupportedNpadStyleSet(u32 *style_set); + +/** + * @brief Sets which \ref HidNpadIdType are supported. + * @note This is automatically called with HidNpadIdType_No{1-8} and HidNpadIdType_Handheld when required in \ref hidScanInput. + * @param[in] ids Input array of \ref HidNpadIdType. + * @param[in] count Total entries in the ids array. Must be <=10. + */ +Result SetSupportedNpadIdType(const HidNpadIdType *ids, size_t count); + +/** + * @brief Gets an Event which is signaled when the \ref hidGetNpadStyleSet output is updated for the specified controller. + * @note The Event must be closed by the user once finished with it. + * @param[in] id \ref HidNpadIdType + * @param[out] out_event Output Event. + * @param[in] autoclear The autoclear for the Event. +**/ +Result AcquireNpadStyleSetUpdateEventHandle(HidNpadIdType id, Event* out_event, bool autoclear); + +/** + * @brief DisconnectNpad + * @param[in] id \ref HidNpadIdType + */ +Result DisconnectNpad(HidNpadIdType id); + +/** + * @brief GetPlayerLedPattern + * @param[in] id \ref HidNpadIdType + * @param[out] out Output value. + */ +Result GetPlayerLedPattern(HidNpadIdType id, u8 *out); + +/** + * @brief Sets the \ref HidNpadJoyHoldType. + * @note Used automatically by \ref hidScanInput when required. + * @param[in] type \ref HidNpadJoyHoldType + */ +Result SetNpadJoyHoldType(HidNpadJoyHoldType type); + +/** + * @brief Gets the \ref HidNpadJoyHoldType. + * @param[out] type \ref HidNpadJoyHoldType + */ +Result GetNpadJoyHoldType(HidNpadJoyHoldType *type); + +/** + * @brief This is the same as \ref hidSetNpadJoyAssignmentModeSingle, except ::HidNpadJoyDeviceType_Left is used for the type. + * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. + */ +Result SetNpadJoyAssignmentModeSingleByDefault(HidNpadIdType id); + +/** + * @brief This is the same as \ref hidSetNpadJoyAssignmentModeSingleWithDestination, except without the output params. + * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. + * @param[in] type \ref HidNpadJoyDeviceType + */ +Result SetNpadJoyAssignmentModeSingle(HidNpadIdType id, HidNpadJoyDeviceType type); + +/** + * @brief Use this if you want to use a pair of joy-cons as a single HidNpadIdType_No*. When used, both joy-cons in a pair should be used with this (HidNpadIdType_No1 and HidNpadIdType_No2 for example). + * @note Used automatically by \ref hidScanInput when required. + * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. + */ +Result SetNpadJoyAssignmentModeDual(HidNpadIdType id); + +/** + * @brief Merge two single joy-cons into a dual-mode controller. Use this after \ref hidSetNpadJoyAssignmentModeDual, when \ref hidSetNpadJoyAssignmentModeSingleByDefault was previously used (this includes using this manually at application exit). + * @brief To be successful, id0/id1 must correspond to controllers supporting styles HidNpadStyleTag_NpadJoyLeft/Right, or HidNpadStyleTag_NpadJoyRight/Left. + * @brief If successful, the id of the resulting dual controller is set to id0. + * @param[in] id0 \ref HidNpadIdType + * @param[in] id1 \ref HidNpadIdType + */ +Result MergeSingleJoyAsDualJoy(HidNpadIdType id0, HidNpadIdType id1); + +/** + * @brief StartLrAssignmentMode + */ +Result StartLrAssignmentMode(void); + +/** + * @brief StopLrAssignmentMode + */ +Result StopLrAssignmentMode(void); + +/** + * @brief Sets the \ref HidNpadHandheldActivationMode. + * @param[in] mode \ref HidNpadHandheldActivationMode + */ +Result SetNpadHandheldActivationMode(HidNpadHandheldActivationMode mode); + +/** + * @brief Gets the \ref HidNpadHandheldActivationMode. + * @param[out] out \ref HidNpadHandheldActivationMode + */ +Result GetNpadHandheldActivationMode(HidNpadHandheldActivationMode *out); + +/** + * @brief SwapNpadAssignment + * @param[in] id0 \ref HidNpadIdType + * @param[in] id1 \ref HidNpadIdType + */ +Result SwapNpadAssignment(HidNpadIdType id0, HidNpadIdType id1); + +/** + * @brief EnableUnintendedHomeButtonInputProtection + * @note To get the state of this, use \ref hidGetNpadSystemButtonProperties to access HidNpadSystemButtonProperties::is_unintended_home_button_input_protection_enabled. + * @param[in] id \ref HidNpadIdType + * @param[in] flag Whether UnintendedHomeButtonInputProtection is enabled. + */ +Result EnableUnintendedHomeButtonInputProtection(HidNpadIdType id, bool flag); + +/** + * @brief Use this if you want to use a single joy-con as a dedicated HidNpadIdType_No*. When used, both joy-cons in a pair should be used with this (HidNpadIdType_No1 and HidNpadIdType_No2 for example). + * @note Only available on [5.0.0+]. + * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. + * @param[in] type \ref HidNpadJoyDeviceType + * @param[out] flag Whether the dest output is set. + * @param[out] dest \ref HidNpadIdType + */ +Result SetNpadJoyAssignmentModeSingleWithDestination(HidNpadIdType id, HidNpadJoyDeviceType type, bool *flag, HidNpadIdType *dest); + +/** + * @brief SetNpadAnalogStickUseCenterClamp + * @note Only available on [6.1.0+]. + * @param[in] flag Flag + */ +Result SetNpadAnalogStickUseCenterClamp(bool flag); + +/** + * @brief Assigns the button(s) which trigger the CaptureButton. + * @note Only available on [8.0.0+]. + * @param[in] style \ref HidNpadStyleTag, exactly 1 bit must be set. + * @param[in] buttons Bitfield of \ref HidNpadButton, multiple bits can be set. + */ +Result SetNpadCaptureButtonAssignment(HidNpadStyleTag style, u64 buttons); + +/** + * @brief ClearNpadCaptureButtonAssignment + * @note Only available on [8.0.0+]. + */ +Result ClearNpadCaptureButtonAssignment(void); + +/** + * @brief Gets and initializes vibration handles. + * @note Only the following styles support total_handles 2: ::HidNpadStyleTag_NpadFullKey, ::HidNpadStyleTag_NpadHandheld, ::HidNpadStyleTag_NpadJoyDual, ::HidNpadStyleTag_NpadHandheldLark, ::HidNpadStyleTag_NpadSystem, ::HidNpadStyleTag_NpadSystemExt. + * @param[out] handles Output array of \ref HidVibrationDeviceHandle. + * @param[in] total_handles Total handles for the handles array. Must be 1 or 2, if 2 handles aren't supported by the specified style an error is thrown. + * @param[in] id \ref HidNpadIdType + * @param[in] style \ref HidNpadStyleTag + */ +Result InitializeVibrationDevices(HidVibrationDeviceHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style); + +/** + * @brief Gets \ref HidVibrationDeviceInfo for the specified device. + * @param[in] handle \ref HidVibrationDeviceHandle + * @param[out] out \ref HidVibrationDeviceInfo + */ +Result GetVibrationDeviceInfo(HidVibrationDeviceHandle handle, HidVibrationDeviceInfo *out); + +/** + * @brief Sends the \ref HidVibrationDeviceHandle to the specified device. + * @note With ::HidVibrationDeviceType_GcErm, use \ref hidSendVibrationGcErmCommand instead. + * @param[in] handle \ref HidVibrationDeviceHandle + * @param[in] value \ref HidVibrationValue + */ +Result SendVibrationValue(HidVibrationDeviceHandle handle, const HidVibrationValue *value); + +/** + * @brief Gets the current \ref HidVibrationValue for the specified device. + * @note With ::HidVibrationDeviceType_GcErm, use \ref hidGetActualVibrationGcErmCommand instead. + * @param[in] handle \ref HidVibrationDeviceHandle + * @param[out] out \ref HidVibrationValue + */ +Result GetActualVibrationValue(HidVibrationDeviceHandle handle, HidVibrationValue *out); + +/** + * @brief Sets whether vibration is allowed, this also affects the config displayed by System Settings. + * @param[in] flag Flag + */ +Result PermitVibration(bool flag); + +/** + * @brief Gets whether vibration is allowed. + * @param[out] flag Flag + */ +Result IsVibrationPermitted(bool *flag); + +/** + * @brief Send vibration values[index] to handles[index]. + * @note With ::HidVibrationDeviceType_GcErm, use \ref hidSendVibrationGcErmCommand instead. + * @param[in] handles Input array of \ref HidVibrationDeviceHandle. + * @param[in] values Input array of \ref HidVibrationValue. + * @param[in] count Total entries in the handles/values arrays. + */ +Result SendVibrationValues(const HidVibrationDeviceHandle *handles, const HidVibrationValue *values, s32 count); + +/** + * @brief Send \ref HidVibrationGcErmCommand to the specified device, for ::HidVibrationDeviceType_GcErm. + * @note Only available on [4.0.0+]. + * @param[in] handle \ref HidVibrationDeviceHandle + * @param[in] cmd \ref HidVibrationGcErmCommand + */ +Result SendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand cmd); + +/** + * @brief Get \ref HidVibrationGcErmCommand for the specified device, for ::HidVibrationDeviceType_GcErm. + * @note Only available on [4.0.0+]. + * @param[in] handle \ref HidVibrationDeviceHandle + * @param[out] out \ref HidVibrationGcErmCommand + */ +Result GetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out); + +/** + * @brief Begins a forced-permitted vibration session. + * @note Only available on [4.0.0+]. + */ +Result BeginPermitVibrationSession(void); + +/** + * @brief Ends the session started by \ref hidBeginPermitVibrationSession. + * @note Only available on [4.0.0+]. + */ +Result EndPermitVibrationSession(void); + +/** + * @brief Gets whether vibration is available with the specified device. + * @note Only available on [7.0.0+]. + * @param[in] handle \ref HidVibrationDeviceHandle + * @param[out] flag Flag + */ +Result IsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag); + +/** + * @brief Starts the SevenSixAxisSensor. + * @note Only available on [5.0.0+]. + */ +Result StartSevenSixAxisSensor(void); + +/** + * @brief Stops the SevenSixAxisSensor. + * @note Only available on [5.0.0+]. + */ +Result StopSevenSixAxisSensor(void); + +/** + * @brief Initializes the SevenSixAxisSensor. + * @note Only available on [5.0.0+]. + */ +Result InitializeSevenSixAxisSensor(void); + +/** + * @brief Finalizes the SevenSixAxisSensor. + * @note This must be called before \ref hidExit. + * @note Only available on [5.0.0+]. + */ +Result FinalizeSevenSixAxisSensor(void); + +/** + * @brief Sets the SevenSixAxisSensor FusionStrength. + * @note Only available on [5.0.0+]. + * @param[in] strength Strength + */ +Result SetSevenSixAxisSensorFusionStrength(float strength); + +/** + * @brief Gets the SevenSixAxisSensor FusionStrength. + * @note Only available on [5.0.0+]. + * @param[out] strength Strength + */ +Result GetSevenSixAxisSensorFusionStrength(float *strength); + +/** + * @brief Resets the timestamp for the SevenSixAxisSensor. + * @note Only available on [6.0.0+]. + */ +Result ResetSevenSixAxisSensorTimestamp(void); + +/** + * @brief GetSevenSixAxisSensorStates + * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. + * @param[out] states Output array of \ref HidSevenSixAxisSensorState. + * @param[in] count Size of the states array in entries. + * @param[out] total_out Total output entries. + */ +Result GetSevenSixAxisSensorStates(HidSevenSixAxisSensorState *states, size_t count, size_t *total_out); + +/** + * @brief IsSevenSixAxisSensorAtRest + * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. + * @param[out] out Output flag. + */ +Result IsSevenSixAxisSensorAtRest(bool *out); + +/** + * @brief GetSensorFusionError + * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. + * @param[out] out Output data. + */ +Result GetSensorFusionError(float *out); + +/** + * @brief GetGyroBias + * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. + * @param[out] out \ref UtilFloat3 + */ +Result GetGyroBias(UtilFloat3 *out); + +/** + * @brief IsUsbFullKeyControllerEnabled + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsUsbFullKeyControllerEnabled(bool *out); + +/** + * @brief EnableUsbFullKeyController + * @note Only available on [3.0.0+]. + * @param[in] flag Flag + */ +Result EnableUsbFullKeyController(bool flag); + +/** + * @brief IsUsbFullKeyControllerConnected + * @note Only available on [3.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out Output flag. + */ +Result IsUsbFullKeyControllerConnected(HidNpadIdType id, bool *out); + +/** + * @brief Gets the \ref HidNpadInterfaceType for the specified controller. + * @note When available, \ref hidsysGetNpadInterfaceType should be used instead. + * @note Only available on [4.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out \ref HidNpadInterfaceType + */ +Result GetNpadInterfaceType(HidNpadIdType id, u8 *out); + +/** + * @brief GetNpadOfHighestBatteryLevel + * @note Only available on [10.0.0+]. + * @param[in] ids Input array of \ref HidNpadIdType, ::HidNpadIdType_Handheld is ignored. + * @param[in] count Total entries in the ids array. + * @param[out] out \ref HidNpadIdType + */ +Result GetNpadOfHighestBatteryLevel(const HidNpadIdType *ids, size_t count, HidNpadIdType *out); + +/** + * @brief GetPalmaConnectionHandle + * @note Only available on [5.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out \ref HidPalmaConnectionHandle + */ +Result GetPalmaConnectionHandle(HidNpadIdType id, HidPalmaConnectionHandle *out); + +/** + * @brief InitializePalma + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result InitializePalma(HidPalmaConnectionHandle handle); + +/** + * @brief Gets an Event which is signaled when data is available with \ref hidGetPalmaOperationInfo. + * @note The Event must be closed by the user once finished with it. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[out] out_event Output Event. + * @param[in] autoclear The autoclear for the Event. +**/ +Result AcquirePalmaOperationCompleteEvent(HidPalmaConnectionHandle handle, Event* out_event, bool autoclear); + +/** + * @brief Gets \ref HidPalmaOperationInfo for a completed operation. + * @note This must be used at some point following using any of the other Palma cmds which trigger an Operation, once the Event from \ref hidAcquirePalmaOperationCompleteEvent is signaled. Up to 4 Operations can be queued at once, the other cmds will throw an error once there's too many operations. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[out] out \ref HidPalmaOperationInfo + */ +Result GetPalmaOperationInfo(HidPalmaConnectionHandle handle, HidPalmaOperationInfo *out); + +/** + * @brief PlayPalmaActivity + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] val Input value. + */ +Result PlayPalmaActivity(HidPalmaConnectionHandle handle, u16 val); + +/** + * @brief SetPalmaFrModeType + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] type \ref HidPalmaFrModeType + */ +Result SetPalmaFrModeType(HidPalmaConnectionHandle handle, HidPalmaFrModeType type); + +/** + * @brief ReadPalmaStep + * @note See \ref hidGetPalmaOperationInfo. + * @note \ref hidEnablePalmaStep should be used before this. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result ReadPalmaStep(HidPalmaConnectionHandle handle); + +/** + * @brief EnablePalmaStep + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] flag Flag + */ +Result EnablePalmaStep(HidPalmaConnectionHandle handle, bool flag); + +/** + * @brief ResetPalmaStep + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result ResetPalmaStep(HidPalmaConnectionHandle handle); + +/** + * @brief ReadPalmaApplicationSection + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] inval0 First input value. + * @param[in] size This must be within the size of \ref HidPalmaApplicationSectionAccessBuffer. + */ +Result ReadPalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size); + +/** + * @brief WritePalmaApplicationSection + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] inval0 First input value. + * @param[in] size Size of the data in \ref HidPalmaApplicationSectionAccessBuffer. + * @param[in] buf \ref HidPalmaApplicationSectionAccessBuffer + */ +Result WritePalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size, const HidPalmaApplicationSectionAccessBuffer *buf); + +/** + * @brief ReadPalmaUniqueCode + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result ReadPalmaUniqueCode(HidPalmaConnectionHandle handle); + +/** + * @brief SetPalmaUniqueCodeInvalid + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result SetPalmaUniqueCodeInvalid(HidPalmaConnectionHandle handle); + +/** + * @brief WritePalmaActivityEntry + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] unk Unknown + * @param[in] entry \ref HidPalmaActivityEntry + */ +Result WritePalmaActivityEntry(HidPalmaConnectionHandle handle, u16 unk, const HidPalmaActivityEntry *entry); + +/** + * @brief WritePalmaRgbLedPatternEntry + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] unk Unknown + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + */ +Result WritePalmaRgbLedPatternEntry(HidPalmaConnectionHandle handle, u16 unk, const void* buffer, size_t size); + +/** + * @brief WritePalmaWaveEntry + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] wave_set \ref HidPalmaWaveSet + * @param[in] unk Unknown + * @param[in] buffer TransferMemory buffer, must be 0x1000-byte aligned. + * @param[in] tmem_size TransferMemory buffer size, must be 0x1000-byte aligned. + * @param[in] size Actual size of the data in the buffer. + */ +Result WritePalmaWaveEntry(HidPalmaConnectionHandle handle, HidPalmaWaveSet wave_set, u16 unk, const void* buffer, size_t tmem_size, size_t size); + +/** + * @brief SetPalmaDataBaseIdentificationVersion + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] version Version + */ +Result SetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle, s32 version); + +/** + * @brief GetPalmaDataBaseIdentificationVersion + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result GetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle); + +/** + * @brief SuspendPalmaFeature + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] features Bitfield of \ref HidPalmaFeature. + */ +Result SuspendPalmaFeature(HidPalmaConnectionHandle handle, u32 features); + +/** + * @brief ReadPalmaPlayLog + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.1.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] unk Unknown + */ +Result ReadPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk); + +/** + * @brief ResetPalmaPlayLog + * @note See \ref hidGetPalmaOperationInfo. + * @note Only available on [5.1.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[in] unk Unknown + */ +Result ResetPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk); + +/** + * @brief Sets whether any Palma can connect. + * @note Only available on [5.1.0+]. + * @param[in] flag Flag + */ +Result SetIsPalmaAllConnectable(bool flag); + +/** + * @brief Sets whether paired Palma can connect. + * @note Only available on [5.1.0+]. + * @param[in] flag Flag + */ +Result SetIsPalmaPairedConnectable(bool flag); + +/** + * @brief PairPalma + * @note Only available on [5.1.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result PairPalma(HidPalmaConnectionHandle handle); + +/** + * @brief CancelWritePalmaWaveEntry + * @note Only available on [7.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + */ +Result CancelWritePalmaWaveEntry(HidPalmaConnectionHandle handle); + +/** + * @brief EnablePalmaBoostMode + * @note Only available on [5.1.0+]. Uses cmd EnablePalmaBoostMode on [8.0.0+], otherwise cmd SetPalmaBoostMode is used. + * @param[in] flag Flag + */ +Result EnablePalmaBoostMode(bool flag); + +/** + * @brief GetPalmaBluetoothAddress + * @note Only available on [8.0.0+]. + * @param[in] handle \ref HidPalmaConnectionHandle + * @param[out] out \ref BtdrvAddress + */ +Result GetPalmaBluetoothAddress(HidPalmaConnectionHandle handle, BtdrvAddress *out); + +/** + * @brief SetDisallowedPalmaConnection + * @note Only available on [8.0.0+]. + * @param[in] addrs Input array of \ref BtdrvAddress. + * @param[in] count Total entries in the addrs array. + */ +Result SetDisallowedPalmaConnection(const BtdrvAddress *addrs, s32 count); + +/** + * @brief SetNpadCommunicationMode + * @note [2.0.0+] Stubbed, just returns 0. + * @param[in] mode \ref HidNpadCommunicationMode + */ +Result SetNpadCommunicationMode(HidNpadCommunicationMode mode); + +/** + * @brief GetNpadCommunicationMode + * @note [2.0.0+] Stubbed, always returns output mode ::HidNpadCommunicationMode_Default. + * @param[out] out \ref HidNpadCommunicationMode + */ +Result GetNpadCommunicationMode(HidNpadCommunicationMode *out); + +/** + * @brief SetTouchScreenConfiguration + * @note Only available on [9.0.0+]. + * @param[in] config \ref HidTouchScreenConfigurationForNx + */ +Result SetTouchScreenConfiguration(const HidTouchScreenConfigurationForNx *config); + +/** + * @brief IsFirmwareUpdateNeededForNotification + * @note Only available on [9.0.0+]. + * @param[out] out Output flag. + */ +Result IsFirmwareUpdateNeededForNotification(bool *out); + +} // namespace hid + +/// @brief C++ wrappers for the `hidbus` API. +/// @details Wraps: switch/services/hidbus.h. +namespace hidbus { + +/// BusHandle +using ::HidbusBusHandle; +/// BusType +using ::HidbusBusType; +/// HidbusDataAccessorHeader +using ::HidbusDataAccessorHeader; +/// HidbusJoyButtonOnlyPollingDataAccessor +using ::HidbusJoyButtonOnlyPollingDataAccessor; +/// HidbusJoyButtonOnlyPollingDataAccessorEntry +using ::HidbusJoyButtonOnlyPollingDataAccessorEntry; +/// HidbusJoyButtonOnlyPollingDataAccessorEntryData +using ::HidbusJoyButtonOnlyPollingDataAccessorEntryData; +/// HidbusJoyDisableSixAxisPollingDataAccessor +using ::HidbusJoyDisableSixAxisPollingDataAccessor; +/// HidbusJoyDisableSixAxisPollingDataAccessorEntry +using ::HidbusJoyDisableSixAxisPollingDataAccessorEntry; +/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData +using ::HidbusJoyDisableSixAxisPollingDataAccessorEntryData; +/// HidbusJoyEnableSixAxisPollingDataAccessor +using ::HidbusJoyEnableSixAxisPollingDataAccessor; +/// HidbusJoyEnableSixAxisPollingDataAccessorEntry +using ::HidbusJoyEnableSixAxisPollingDataAccessorEntry; +/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData +using ::HidbusJoyEnableSixAxisPollingDataAccessorEntryData; +/// JoyPollingMode +using ::HidbusJoyPollingMode; +/// JoyPollingReceivedData +using ::HidbusJoyPollingReceivedData; +/// StatusManager +using ::HidbusStatusManager; +/// HidbusStatusManagerEntry +using ::HidbusStatusManagerEntry; +/// Common data for HidbusStatusManagerEntry*. +using ::HidbusStatusManagerEntryCommon; +/// HidbusStatusManagerEntry on 5.x. +using ::HidbusStatusManagerEntryV5; +/// StatusManager on 5.x. +using ::HidbusStatusManagerV5; + +/// Gets the Service object for the actual hidbus service session. This object must be closed by the user once finished using cmds with this. +Result GetServiceSession(Service* srv_out); + +/// Gets the SharedMemory addr (\ref HidbusStatusManagerV5 on 5.x, otherwise \ref HidbusStatusManager). Only valid when at least one BusHandle is currently initialized (\ref hidbusInitialize). +void* GetSharedmemAddr(void); + +/** + * @brief GetBusHandle + * @param[out] handle \ref HidbusBusHandle + * @param[out] flag Output flag indicating whether the handle is valid. + * @param[in] id \ref HidNpadIdType + * @param[in] bus_type \ref HidbusBusType + */ +Result GetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type); + +/** + * @brief Initialize + * @param[in] handle \ref HidbusBusHandle + */ +Result Initialize(HidbusBusHandle handle); + +/** + * @brief Finalize + * @param[in] handle \ref HidbusBusHandle + */ +Result Finalize(HidbusBusHandle handle); + +/** + * @brief EnableExternalDevice + * @note This uses \ref hidLaShowControllerFirmwareUpdate if needed. + * @param[in] handle \ref HidbusBusHandle + * @param[in] flag Whether to enable the device (true = enable, false = disable). When false, this will internally use \ref hidbusDisableJoyPollingReceiveMode if needed. + * @param[in] device_id ExternalDeviceId which must match the connected device. Only used when flag is set. + */ +Result EnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id); + +/** + * @brief SendAndReceive + * @param[in] handle \ref HidbusBusHandle + * @param[in] inbuf Input buffer, containing the command data. + * @param[in] inbuf_size Input buffer size, must be <0x26. + * @param[out] outbuf Output buffer, containing the command reply data. + * @param[in] outbuf_size Output buffer max size. + * @param[out] out_size Actual output size. + */ +Result SendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size); + +/** + * @brief EnableJoyPollingReceiveMode + * @param[in] handle \ref HidbusBusHandle + * @param[in] inbuf Input buffer, containing the command data. + * @param[in] inbuf_size Input buffer size, must be <0x26. + * @param[out] workbuf TransferMemory buffer, must be 0x1000-byte aligned. This buffer must not be written to until after \ref hidbusDisableJoyPollingReceiveMode is used. + * @param[in] workbuf_size TransferMemory buffer size, must be 0x1000-byte aligned. + * @param[in] polling_mode \ref HidbusJoyPollingMode + */ +Result EnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode); + +/** + * @brief DisableJoyPollingReceiveMode + * @note This can also be used via \ref hidbusEnableExternalDevice with flag=false. + * @param[in] handle \ref HidbusBusHandle + */ +Result DisableJoyPollingReceiveMode(HidbusBusHandle handle); + +/** + * @brief GetJoyPollingReceivedData + * @param[in] handle \ref HidbusBusHandle + * @param[out] recv_data Output array of \ref HidbusJoyPollingReceivedData. + * @param[in] count Total entries for the recv_data array. The maximum is 0xa. Official apps use range 0x1-0x9. + */ +Result GetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count); + +} // namespace hidbus + +/// @brief C++ wrappers for the `hiddbg` API. +/// @details Wraps: switch/services/hiddbg.h. +namespace hiddbg { + +/// AbstractedPadHandle +using ::HiddbgAbstractedPadHandle; +/// AbstractedPadState +using ::HiddbgAbstractedPadState; +/// State for overriding \ref HidDebugPadState. +using ::HiddbgDebugPadAutoPilotState; +/// HdlsAttribute +using ::HiddbgHdlsAttribute; +/// HdlsDeviceInfo, for [9.0.0+]. Converted to/from \ref HiddbgHdlsDeviceInfoV7 on prior sysvers. +using ::HiddbgHdlsDeviceInfo; +/// HdlsDeviceInfo, for [7.0.0-8.1.0]. +using ::HiddbgHdlsDeviceInfoV7; +/// HdlsHandle +using ::HiddbgHdlsHandle; +/// HdlsNpadAssignment. Same controllers as \ref HiddbgHdlsStateList, with different entry data. +using ::HiddbgHdlsNpadAssignment; +/// HdlsNpadAssignmentEntry +using ::HiddbgHdlsNpadAssignmentEntry; +/// HdlsSessionId, returned by \ref hiddbgAttachHdlsWorkBuffer. +using ::HiddbgHdlsSessionId; +/// HdlsState, for [12.0.0+]. +using ::HiddbgHdlsState; +/// HdlsStateList, for [12.0.0+]. +/// This contains a list of all controllers, including non-virtual controllers. +using ::HiddbgHdlsStateList; +/// HdlsStateListEntry, for [12.0.0+]. +using ::HiddbgHdlsStateListEntry; +/// HdlsStateListEntryV7, for [7.0.0-8.1.0]. +using ::HiddbgHdlsStateListEntryV7; +/// HdlsStateListEntry, for [9.0.0-11.0.1]. +using ::HiddbgHdlsStateListEntryV9; +/// HdlsStateListV7, for [7.0.0-8.1.0]. This contains a list of all controllers, including non-virtual controllers. +using ::HiddbgHdlsStateListV7; +/// HdlsStateList, for [9.0.0-11.0.1]. +using ::HiddbgHdlsStateListV9; +/// HdlsState, for [7.0.0-8.1.0]. +using ::HiddbgHdlsStateV7; +/// HdlsState, for [9.0.0-11.0.1]. +using ::HiddbgHdlsStateV9; +/// State for overriding \ref HidKeyboardState. +using ::HiddbgKeyboardAutoPilotState; +/// State for overriding \ref HidMouseState. +using ::HiddbgMouseAutoPilotState; +/// HiddbgNpadButton. For the remaining buttons, see \ref HidNpadButton. +using ::HiddbgNpadButton; +/// State for overriding SleepButtonState. +using ::HiddbgSleepButtonAutoPilotState; + +/// Initialize hiddbg. +Result Initialize(void); + +/// Exit hiddbg. +void Exit(void); + +/// Gets the Service object for the actual hiddbg service session. +Service* GetServiceSession(void); + +/** + * @brief SetDebugPadAutoPilotState + * @param[in] state \ref HiddbgDebugPadAutoPilotState + */ +Result SetDebugPadAutoPilotState(const HiddbgDebugPadAutoPilotState *state); + +/** + * @brief UnsetDebugPadAutoPilotState + */ +Result UnsetDebugPadAutoPilotState(void); + +/** + * @brief SetTouchScreenAutoPilotState + * @param[in] states Input array of \ref HiddbgMouseAutoPilotState. + * @param[in] count Total entries in the states array. Max is 16. + */ +Result SetTouchScreenAutoPilotState(const HidTouchState *states, s32 count); + +/** + * @brief UnsetTouchScreenAutoPilotState + */ +Result UnsetTouchScreenAutoPilotState(void); + +/** + * @brief SetMouseAutoPilotState + * @param[in] state \ref HiddbgMouseAutoPilotState + */ +Result SetMouseAutoPilotState(const HiddbgMouseAutoPilotState *state); + +/** + * @brief UnsetMouseAutoPilotState + */ +Result UnsetMouseAutoPilotState(void); + +/** + * @brief SetKeyboardAutoPilotState + * @param[in] state \ref HiddbgKeyboardAutoPilotState + */ +Result SetKeyboardAutoPilotState(const HiddbgKeyboardAutoPilotState *state); + +/** + * @brief UnsetKeyboardAutoPilotState + */ +Result UnsetKeyboardAutoPilotState(void); + +/** + * @brief Deactivates the HomeButton. + */ +Result DeactivateHomeButton(void); + +/** + * @brief SetSleepButtonAutoPilotState + * @param[in] state \ref HiddbgSleepButtonAutoPilotState + */ +Result SetSleepButtonAutoPilotState(const HiddbgSleepButtonAutoPilotState *state); + +/** + * @brief UnsetSleepButtonAutoPilotState + */ +Result UnsetSleepButtonAutoPilotState(void); + +/** + * @brief Writes the input RGB colors to the spi-flash for the specified UniquePad (offset 0x6050 size 0x6). + * @note Only available with [3.0.0+]. + * @param[in] colorBody RGB body color. + * @param[in] colorButtons RGB buttons color. + * @param[in] unique_pad_id \ref HidsysUniquePadId + */ +Result UpdateControllerColor(u32 colorBody, u32 colorButtons, HidsysUniquePadId unique_pad_id); + +/** + * @brief Writes the input RGB colors followed by inval to the spi-flash for the specified UniquePad (offset 0x6050 size 0xD). + * @note Only available with [5.0.0+]. + * @param[in] colorBody RGB body color. + * @param[in] colorButtons RGB buttons color. + * @param[in] colorLeftGrip RGB left grip color. + * @param[in] colorRightGrip RGB right grip color. + * @param[in] inval Input value. + * @param[in] unique_pad_id \ref HidsysUniquePadId + */ +Result UpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip, u32 colorRightGrip, u8 inval, HidsysUniquePadId unique_pad_id); + +/** + * @brief Get the OperationEvent for the specified UniquePad. + * @note The Event must be closed by the user once finished with it. + * @note Only available with [6.0.0+]. + * @param[out] out_event Output Event. + * @param[in] autoclear The autoclear for the Event. + * @param[in] unique_pad_id \ref HidsysUniquePadId +**/ +Result AcquireOperationEventHandle(Event* out_event, bool autoclear, HidsysUniquePadId unique_pad_id); + +/** + * @brief Reads spi-flash for the specified UniquePad. + * @note This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used. + * @note Only available with [6.0.0+]. + * @param[in] offset Offset in spi-flash. + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size. + * @param[in] unique_pad_id \ref HidsysUniquePadId +**/ +Result ReadSerialFlash(u32 offset, void* buffer, size_t size, HidsysUniquePadId unique_pad_id); + +/** + * @brief Writes spi-flash for the specified UniquePad. + * @note This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used. + * @note Only available with [6.0.0+]. + * @param[in] offset Offset in spi-flash. + * @param[in] buffer Input buffer, must be 0x1000-byte aligned. + * @param[in] tmem_size Size of the buffer, must be 0x1000-byte aligned. + * @param[in] size Actual transfer size. + * @param[in] unique_pad_id \ref HidsysUniquePadId +**/ +Result WriteSerialFlash(u32 offset, void* buffer, size_t tmem_size, size_t size, HidsysUniquePadId unique_pad_id); + +/** + * @brief Get the Result for the Operation and handles cleanup, for the specified UniquePad. + * @note Only available with [6.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId +**/ +Result GetOperationResult(HidsysUniquePadId unique_pad_id); + +/** + * @brief Gets the internal DeviceType for the specified controller. + * @note Only available with [6.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Pre-9.0.0 this is an u32, with [9.0.0+] it's an u8. +**/ +Result GetUniquePadDeviceTypeSetInternal(HidsysUniquePadId unique_pad_id, u32 *out); + +/** @name AbstractedPad + * This is for virtual HID controllers. Only use this on pre-7.0.0, Hdls should be used otherwise. + */ +/** + * @brief Gets a list of \ref HiddbgAbstractedPadHandle. + * @note Only available with [5.0.0-8.1.0]. + * @param[out] handles Output array of \ref HiddbgAbstractedPadHandle. + * @param[in] count Max number of entries for the handles array. + * @param[out] total_out Total output entries. + */ +Result GetAbstractedPadHandles(HiddbgAbstractedPadHandle *handles, s32 count, s32 *total_out); + +/** + * @brief Gets the state for the specified \ref HiddbgAbstractedPadHandle. + * @note Only available with [5.0.0-8.1.0]. + * @param[in] handle \ref HiddbgAbstractedPadHandle + * @param[out] state \ref HiddbgAbstractedPadState + */ +Result GetAbstractedPadState(HiddbgAbstractedPadHandle handle, HiddbgAbstractedPadState *state); + +/** + * @brief Similar to \ref hiddbgGetAbstractedPadHandles except this also returns the state for each pad in output array states. + * @note Only available with [5.0.0-8.1.0]. + * @param[out] handles Output array of \ref HiddbgAbstractedPadHandle. + * @param[out] states Output array of \ref HiddbgAbstractedPadState. + * @param[in] count Max number of entries for the handles/states arrays. + * @param[out] total_out Total output entries. + */ +Result GetAbstractedPadsState(HiddbgAbstractedPadHandle *handles, HiddbgAbstractedPadState *states, s32 count, s32 *total_out); + +/** + * @brief Sets AutoPilot state for the specified pad. + * @note Only available with [5.0.0-8.1.0]. + * @param[in] AbstractedVirtualPadId This can be any unique value as long as it's within bounds. For example, 0-7 is usable. + * @param[in] state \ref HiddbgAbstractedPadState + */ +Result SetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId, const HiddbgAbstractedPadState *state); + +/** + * @brief Clears AutoPilot state for the specified pad set by \ref hiddbgSetAutoPilotVirtualPadState. + * @note Only available with [5.0.0-8.1.0]. + * @param[in] AbstractedVirtualPadId Id from \ref hiddbgSetAutoPilotVirtualPadState. + */ +Result UnsetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId); + +/** + * @brief Clears AutoPilot state for all pads set by \ref hiddbgSetAutoPilotVirtualPadState. + */ +Result UnsetAllAutoPilotVirtualPadState(void); + +/** @name Hdls + * This is for virtual HID controllers. + */ +/** + * @brief Initialize Hdls. + * @note Only available with [7.0.0+]. + * @param[out] session_id [13.0.0+] \ref HiddbgHdlsSessionId + * @param[in] buffer An existing buffer to be used as transfer memory. + * @param[in] size Size of the supplied buffer. + */ +Result AttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, size_t size); + +/** + * @brief Exit Hdls, must be called at some point prior to \ref hiddbgExit. + * @note Only available with [7.0.0+]. + * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId + */ +Result ReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id); + +/** + * @brief Checks if the given device is still attached. + * @note Only available with [7.0.0+]. + * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId + * @param[in] handle \ref HiddbgHdlsHandle + * @param[out] out Whether the device is attached. + */ +Result IsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgHdlsHandle handle, bool *out); + +/** + * @brief Gets state for \ref HiddbgHdlsNpadAssignment. + * @note Only available with [7.0.0+]. + * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId + * @param[out] state \ref HiddbgHdlsNpadAssignment + */ +Result DumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgHdlsNpadAssignment *state); + +/** + * @brief Gets state for \ref HiddbgHdlsStateList. + * @note Only available with [7.0.0+]. + * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId + * @param[out] state \ref HiddbgHdlsStateList + */ +Result DumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList *state); + +/** + * @brief Sets state for \ref HiddbgHdlsNpadAssignment. + * @note Only available with [7.0.0+]. + * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId + * @param[in] state \ref HiddbgHdlsNpadAssignment + * @param[in] flag Flag + */ +Result ApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const HiddbgHdlsNpadAssignment *state, bool flag); + +/** + * @brief Sets state for \ref HiddbgHdlsStateList. + * @note The \ref HiddbgHdlsState will be applied for each \ref HiddbgHdlsHandle. If a \ref HiddbgHdlsHandle is not found, code similar to \ref hiddbgAttachHdlsVirtualDevice will run with the \ref HiddbgHdlsDeviceInfo, then it will continue with applying state with the new device. + * @note Only available with [7.0.0+]. + * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId + * @param[in] state \ref HiddbgHdlsStateList + */ +Result ApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdlsStateList *state); + +/** + * @brief Attach a device with the input info. + * @note Only available with [7.0.0+]. + * @param[out] handle \ref HiddbgHdlsHandle + * @param[in] info \ref HiddbgHdlsDeviceInfo + */ +Result AttachHdlsVirtualDevice(HiddbgHdlsHandle *handle, const HiddbgHdlsDeviceInfo *info); + +/** + * @brief Detach the specified device. + * @note Only available with [7.0.0+]. + * @param[in] handle \ref HiddbgHdlsHandle + */ +Result DetachHdlsVirtualDevice(HiddbgHdlsHandle handle); + +/** + * @brief Sets state for the specified device. + * @note Only available with [7.0.0+]. + * @param[in] handle \ref HiddbgHdlsHandle + * @param[in] state \ref HiddbgHdlsState + */ +Result SetHdlsState(HiddbgHdlsHandle handle, const HiddbgHdlsState *state); + +} // namespace hiddbg + +/// @brief C++ wrappers for the `hidsys` API. +/// @details Wraps: switch/services/hidsys.h. +namespace hidsys { + +/// AnalogStickAssignment +using ::HidcfgAnalogStickAssignment; +/// AnalogStickRotation +using ::HidcfgAnalogStickRotation; +/// ButtonConfigEmbedded +using ::HidcfgButtonConfigEmbedded; +/// ButtonConfigFull +using ::HidcfgButtonConfigFull; +/// ButtonConfigLeft +using ::HidcfgButtonConfigLeft; +/// ButtonConfigRight +using ::HidcfgButtonConfigRight; +/// Selects what button to map to. +using ::HidcfgDigitalButtonAssignment; +/// StorageName +using ::HidcfgStorageName; +/// ButtonConfigEmbedded +using ::HidsysButtonConfigEmbedded; +/// ButtonConfigFull +using ::HidsysButtonConfigFull; +/// ButtonConfigLeft +using ::HidsysButtonConfigLeft; +/// ButtonConfigRight +using ::HidsysButtonConfigRight; +/// Structure for \ref hidsysSetNotificationLedPattern. +/// See also: https://switchbrew.org/wiki/HID_services#NotificationLedPattern +/// Only the low 4bits of each used byte in this struct is used. +using ::HidsysNotificationLedPattern; +/// Mini Cycle struct for \ref HidsysNotificationLedPattern. +using ::HidsysNotificationLedPatternCycle; +/// UniquePadId for a controller. +using ::HidsysUniquePadId; +/// UniquePadSerialNumber +using ::HidsysUniquePadSerialNumber; +/// UniquePadType +using ::HidsysUniquePadType; + +/// Initialize hidsys. +Result Initialize(void); + +/// Exit hidsys. +void Exit(void); + +/// Gets the Service object for the actual hidsys service session. +Service* GetServiceSession(void); + +/** + * @brief SendKeyboardLockKeyEvent + * @param[in] events Bitfield of \ref HidKeyboardLockKeyEvent. + */ +Result SendKeyboardLockKeyEvent(u32 events); + +/** + * @brief Gets an Event which is signaled when HidHomeButtonState is updated. + * @note The Event must be closed by the user once finished with it. + * @note This generally shouldn't be used, since AM-sysmodule uses it internally. + * @param[out] out_event Output Event. + * @param[in] Event autoclear. +**/ +Result AcquireHomeButtonEventHandle(Event* out_event, bool autoclear); + +/** + * @brief Activates the HomeButton sharedmem. + * @note This generally shouldn't be used, since AM-sysmodule uses it internally. +**/ +Result ActivateHomeButton(void); + +/** + * @brief Gets an Event which is signaled when HidSleepButtonState is updated. + * @note The Event must be closed by the user once finished with it. + * @note This generally shouldn't be used, since AM-sysmodule uses it internally. + * @param[out] out_event Output Event. + * @param[in] Event autoclear. +**/ +Result AcquireSleepButtonEventHandle(Event* out_event, bool autoclear); + +/** + * @brief Activates the SleepButton sharedmem. + * @note This generally shouldn't be used, since AM-sysmodule uses it internally. +**/ +Result ActivateSleepButton(void); + +/** + * @brief Gets an Event which is signaled when HidCaptureButtonState is updated. + * @note The Event must be closed by the user once finished with it. + * @note This generally shouldn't be used, since AM-sysmodule uses it internally. + * @param[out] out_event Output Event. + * @param[in] Event autoclear. +**/ +Result AcquireCaptureButtonEventHandle(Event* out_event, bool autoclear); + +/** + * @brief Activates the CaptureButton sharedmem. + * @note This generally shouldn't be used, since AM-sysmodule uses it internally. +**/ +Result ActivateCaptureButton(void); + +/** + * @brief Applies npad system common policy. + */ +Result ApplyNpadSystemCommonPolicy(void); + +/** + * @brief Gets the npad id type of the last controller that was active. + * @param[out] out of \ref HidNpadIdType. + */ +Result GetLastActiveNpad(u32 *out); + +/** + * @brief Gets the SupportedNpadStyleSet for the CallerApplet. applet must be initialized in order to use this (uses \ref appletGetAppletResourceUserIdOfCallerApplet). + * @note Only available on [6.0.0+]. + * @param[out] out Bitmask of \ref HidNpadStyleTag. + */ +Result GetSupportedNpadStyleSetOfCallerApplet(u32 *out); + +/** + * @brief Gets the \ref HidNpadInterfaceType for the specified controller. + * @note Only available on [10.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out \ref HidNpadInterfaceType + */ +Result GetNpadInterfaceType(HidNpadIdType id, u8 *out); + +/** + * @brief GetNpadLeftRightInterfaceType + * @note Only available on [10.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out0 \ref HidNpadInterfaceType + * @param[out] out1 \ref HidNpadInterfaceType + */ +Result GetNpadLeftRightInterfaceType(HidNpadIdType id, u8 *out0, u8 *out1); + +/** + * @brief HasBattery + * @note Only available on [10.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out Output flag. + */ +Result HasBattery(HidNpadIdType id, bool *out); + +/** + * @brief HasLeftRightBattery + * @note Only available on [10.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] out0 Output flag. + * @param[out] out1 Output flag. + */ +Result HasLeftRightBattery(HidNpadIdType id, bool *out0, bool *out1); + +/** + * @brief Gets the UniquePadIds for the specified controller. + * @note Only available on [3.0.0+]. + * @param[in] id \ref HidNpadIdType + * @param[out] unique_pad_ids Output array of \ref HidsysUniquePadId. + * @param[in] count Max number of entries for the unique_pad_ids array. + * @param[out] total_out Total output array entries. Optional, can be NULL. + */ +Result GetUniquePadsFromNpad(HidNpadIdType id, HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out); + +/** + * @brief Sets information that your AppletResourceUserId is in focus. + * @note This is automatically used by am-sysmodule, don't use it if your AppletType is other than None. + * @note Using it with uninitialized applet services results in your process being tied to currently focused applet. + */ +Result SetAppletResourceUserId(void); + +/** + * @brief EnableAppletToGetInput + * @param[in] enable Input flag. +**/ +Result EnableAppletToGetInput(bool enable); + +/** + * @brief EnableHandheldHids +**/ +Result EnableHandheldHids(void); + +/** + * @brief DisableHandheldHids +**/ +Result DisableHandheldHids(void); + +/** + * @brief SetJoyConRailEnabled + * @note Only available on [9.0.0+]. + * @param[in] enable Input flag. +**/ +Result SetJoyConRailEnabled(bool enable); + +/** + * @brief IsJoyConRailEnabled + * @note Only available on [9.0.0+]. + * @param[out] out Output flag. +**/ +Result IsJoyConRailEnabled(bool *out); + +/** + * @brief IsHandheldHidsEnabled + * @note Only available on [10.0.0+]. + * @param[out] out Output flag. +**/ +Result IsHandheldHidsEnabled(bool *out); + +/** + * @brief IsJoyConAttachedOnAllRail + * @note Only available on [11.0.0+]. + * @param[out] out Output flag. +**/ +Result IsJoyConAttachedOnAllRail(bool *out); + +/** + * @brief IsInvertedControllerConnectedOnRail + * @note Only available on [19.0.0+]. + * @param[out] out Output flag. +**/ +Result IsInvertedControllerConnectedOnRail(bool *out); + +/** + * @brief AcquireUniquePadConnectionEventHandle + * @param[out] out_event Output Event. + */ +Result AcquireUniquePadConnectionEventHandle(Event *out_event); + +/** + * @brief Gets a list of all UniquePadIds. + * @param[out] unique_pad_ids Output array of \ref HidsysUniquePadId. + * @param[in] count Max number of entries for the unique_pad_ids array. + * @param[out] total_out Total output array entries. Optional, can be NULL. + */ +Result GetUniquePadIds(HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out); + +/** + * @brief AcquireJoyDetachOnBluetoothOffEventHandle + * @param[out] out_event Output Event. + * @param[in] Event autoclear. + */ +Result AcquireJoyDetachOnBluetoothOffEventHandle(Event *out_event, bool autoclear); + +/** + * @brief GetUniquePadBluetoothAddress + * @note Only available on [3.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] address \ref BtdrvAddress + */ +Result GetUniquePadBluetoothAddress(HidsysUniquePadId unique_pad_id, BtdrvAddress *address); + +/** + * @brief DisconnectUniquePad + * @note Only available on [3.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + */ +Result DisconnectUniquePad(HidsysUniquePadId unique_pad_id); + +/** + * @brief GetUniquePadType + * @note Only available on [5.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] pad_type \ref HidsysUniquePadType + */ +Result GetUniquePadType(HidsysUniquePadId unique_pad_id, HidsysUniquePadType *pad_type); + +/** + * @brief GetUniquePadInterface + * @note Only available on [5.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] interface \ref HidNpadInterfaceType + */ +Result GetUniquePadInterface(HidsysUniquePadId unique_pad_id, HidNpadInterfaceType *interface); + +/** + * @brief Gets the \ref HidsysUniquePadSerialNumber. + * @note Only available on [5.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] serial \ref HidsysUniquePadSerialNumber + */ +Result GetUniquePadSerialNumber(HidsysUniquePadId unique_pad_id, HidsysUniquePadSerialNumber *serial); + +/** + * @brief GetUniquePadControllerNumber + * @note Only available on [5.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] number Controller number. + */ +Result GetUniquePadControllerNumber(HidsysUniquePadId unique_pad_id, u64 *number); + +/** + * @brief Sets the HOME-button notification LED pattern, for the specified controller. + * @note Generally this should only be used if \ref hidsysSetNotificationLedPatternWithTimeout is not usable. + * @note Only available on [7.0.0+]. + * @param[in] pattern \ref HidsysNotificationLedPattern + * @param[in] unique_pad_id \ref HidsysUniquePadId + */ +Result SetNotificationLedPattern(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id); + +/** + * @brief Sets the HOME-button notification LED pattern, for the specified controller. The LED will automatically be disabled once the specified timeout occurs. + * @note Only available on [9.0.0+], and with controllers which have the [9.0.0+] firmware installed. + * @param[in] pattern \ref HidsysNotificationLedPattern + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] timeout Timeout in nanoseconds. + */ +Result SetNotificationLedPatternWithTimeout(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id, u64 timeout); + +/** + * @brief IsUsbFullKeyControllerEnabled + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsUsbFullKeyControllerEnabled(bool *out); + +/** + * @brief EnableUsbFullKeyController + * @note Only available on [3.0.0+]. + * @param[in] flag Flag + */ +Result EnableUsbFullKeyController(bool flag); + +/** + * @brief IsUsbConnected + * @note Only available on [3.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Output flag. + */ +Result IsUsbConnected(HidsysUniquePadId unique_pad_id, bool *out); + +/** + * @brief GetTouchScreenDefaultConfiguration + * @note Only available on [9.0.0+]. + * @param[out] touch_screen_configuration \ref HidTouchScreenConfigurationForNx. + */ +Result GetTouchScreenDefaultConfiguration(HidTouchScreenConfigurationForNx *touch_screen_configuration); + +/** + * @brief IsFirmwareUpdateNeededForNotification + * @note Only available on [9.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Output flag. + */ +Result IsFirmwareUpdateNeededForNotification(HidsysUniquePadId unique_pad_id, bool *out); + +/** + * @brief Legacy IsButtonConfigSupported. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysIsButtonConfigSupported instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Output bool flag. + */ +Result LegacyIsButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out); + +/** + * @brief IsButtonConfigSupported + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigSupported instead. + * @param[in] addr \ref BtdrvAddress + * @param[out] out Output bool flag. + */ +Result IsButtonConfigSupported(BtdrvAddress addr, bool *out); + +/** + * @brief IsButtonConfigEmbeddedSupported + * @note Only available on [11.0.0-17.0.1]. + * @param[out] out Output bool flag. + */ +Result IsButtonConfigEmbeddedSupported(bool *out); + +/** + * @brief Legacy DeleteButtonConfig. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysDeleteButtonConfig instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + */ +Result LegacyDeleteButtonConfig(HidsysUniquePadId unique_pad_id); + +/** + * @brief DeleteButtonConfig + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyDeleteButtonConfig instead. + * @param[in] addr \ref BtdrvAddress + */ +Result DeleteButtonConfig(BtdrvAddress addr); + +/** + * @brief DeleteButtonConfigEmbedded + * @note Only available on [11.0.0-17.0.1]. + */ +Result DeleteButtonConfigEmbedded(void); + +/** + * @brief Legacy SetButtonConfigEnabled. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigEnabled instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] flag Input flag. + */ +Result LegacySetButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool flag); + +/** + * @brief SetButtonConfigEnabled + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEnabled instead. + * @param[in] addr \ref BtdrvAddress + * @param[in] flag Input flag. + */ +Result SetButtonConfigEnabled(BtdrvAddress addr, bool flag); + +/** + * @brief SetButtonConfigEmbeddedEnabled + * @note Only available on [11.0.0-17.0.1]. + * @param[in] flag Input flag. + */ +Result SetButtonConfigEmbeddedEnabled(bool flag); + +/** + * @brief Legacy IsButtonConfigEnabled. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysIsButtonConfigEnabled instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Output bool flag. + */ +Result LegacyIsButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool *out); + +/** + * @brief IsButtonConfigEnabled + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigEnabled instead. + * @param[in] addr \ref BtdrvAddress + * @param[in] out Output bool flag. + */ +Result IsButtonConfigEnabled(BtdrvAddress addr, bool *out); + +/** + * @brief IsButtonConfigEmbeddedEnabled + * @note Only available on [11.0.0-17.0.1]. + * @param[out] out Output bool flag. + */ +Result IsButtonConfigEmbeddedEnabled(bool *out); + +/** + * @brief Legacy SetButtonConfigEmbedded. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigEmbedded instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidsysButtonConfigEmbedded + */ +Result LegacySetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigEmbedded *config); + +/** + * @brief SetButtonConfigEmbedded + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEmbedded instead. + * @param[in] config \ref HidsysButtonConfigEmbedded + */ +Result SetButtonConfigEmbedded(const HidsysButtonConfigEmbedded *config); + +/** + * @brief Legacy SetButtonConfigFull. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigFull instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidsysButtonConfigFull + */ +Result LegacySetButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigFull *config); + +/** + * @brief SetButtonConfigFull + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigFull instead. + * @param[in] addr \ref BtdrvAddress + * @param[in] config \ref HidsysButtonConfigFull + */ +Result SetButtonConfigFull(BtdrvAddress addr, const HidsysButtonConfigFull *config); + +/** + * @brief Legacy SetButtonConfigLeft. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigLeft instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidsysButtonConfigLeft + */ +Result LegacySetButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigLeft *config); + +/** + * @brief SetButtonConfigLeft + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigLeft instead. + * @param[in] addr \ref BtdrvAddress + * @param[in] config \ref HidsysButtonConfigLeft + */ +Result SetButtonConfigLeft(BtdrvAddress addr, const HidsysButtonConfigLeft *config); + +/** + * @brief Legacy SetButtonConfigRight. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigRight instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidsysButtonConfigRight + */ +Result LegacySetButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigRight *config); + +/** + * @brief SetButtonConfigRight + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigRight instead. + * @param[in] addr \ref BtdrvAddress + * @param[in] config \ref HidsysButtonConfigRight + */ +Result SetButtonConfigRight(BtdrvAddress addr, const HidsysButtonConfigRight *config); + +/** + * @brief Legacy GetButtonConfigEmbedded. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigEmbedded instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidsysButtonConfigEmbedded + */ +Result LegacyGetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidsysButtonConfigEmbedded *config); + +/** + * @brief GetButtonConfigEmbedded + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigEmbedded instead. + * @param[out] config \ref HidsysButtonConfigEmbedded + */ +Result GetButtonConfigEmbedded(HidsysButtonConfigEmbedded *config); + +/** + * @brief Legacy GetButtonConfigFull. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigFull instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidsysButtonConfigFull + */ +Result LegacyGetButtonConfigFull(HidsysUniquePadId unique_pad_id, HidsysButtonConfigFull *config); + +/** + * @brief GetButtonConfigFull + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigFull instead. + * @param[in] addr \ref BtdrvAddress + * @param[out] config \ref HidsysButtonConfigFull + */ +Result GetButtonConfigFull(BtdrvAddress addr, HidsysButtonConfigFull *config); + +/** + * @brief Legacy GetButtonConfigLeft. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigLeft instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidsysButtonConfigLeft + */ +Result LegacyGetButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidsysButtonConfigLeft *config); + +/** + * @brief GetButtonConfigLeft + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigLeft instead. + * @param[in] addr \ref BtdrvAddress + * @param[out] config \ref HidsysButtonConfigLeft + */ +Result GetButtonConfigLeft(BtdrvAddress addr, HidsysButtonConfigLeft *config); + +/** + * @brief Legacy GetButtonConfigRight. + * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigRight instead. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidsysButtonConfigRight + */ +Result LegacyGetButtonConfigRight(HidsysUniquePadId unique_pad_id, HidsysButtonConfigRight *config); + +/** + * @brief GetButtonConfigRight + * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigRight instead. + * @param[in] addr \ref BtdrvAddress + * @param[out] config \ref HidsysButtonConfigRight + */ +Result GetButtonConfigRight(BtdrvAddress addr, HidsysButtonConfigRight *config); + +/** + * @brief IsCustomButtonConfigSupported + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Output bool flag. + */ +Result IsCustomButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out); + +/** + * @brief IsDefaultButtonConfigEmbedded + * @note Only available on [10.0.0+]. + * @param[in] config \ref HidcfgButtonConfigEmbedded + * @param[out] out Output bool flag. + */ +Result IsDefaultButtonConfigEmbedded(const HidcfgButtonConfigEmbedded *config, bool *out); + +/** + * @brief IsDefaultButtonConfigFull + * @note Only available on [10.0.0+]. + * @param[in] config \ref HidcfgButtonConfigFull + * @param[out] out Output bool flag. + */ +Result IsDefaultButtonConfigFull(const HidcfgButtonConfigFull *config, bool *out); + +/** + * @brief IsDefaultButtonConfigLeft + * @note Only available on [10.0.0+]. + * @param[in] config \ref HidcfgButtonConfigLeft + * @param[out] out Output bool flag. + */ +Result IsDefaultButtonConfigLeft(const HidcfgButtonConfigLeft *config, bool *out); + +/** + * @brief IsDefaultButtonConfigRight + * @note Only available on [10.0.0+]. + * @param[in] config \ref HidcfgButtonConfigRight + * @param[out] out Output bool flag. + */ +Result IsDefaultButtonConfigRight(const HidcfgButtonConfigRight *config, bool *out); + +/** + * @brief IsButtonConfigStorageEmbeddedEmpty + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] out Output bool flag. + */ +Result IsButtonConfigStorageEmbeddedEmpty(s32 index, bool *out); + +/** + * @brief IsButtonConfigStorageFullEmpty + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] out Output bool flag. + */ +Result IsButtonConfigStorageFullEmpty(s32 index, bool *out); + +/** + * @brief IsButtonConfigStorageLeftEmpty + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] out Output bool flag. + */ +Result IsButtonConfigStorageLeftEmpty(s32 index, bool *out); + +/** + * @brief IsButtonConfigStorageRightEmpty + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] out Output bool flag. + */ +Result IsButtonConfigStorageRightEmpty(s32 index, bool *out); + +/** + * @brief GetButtonConfigStorageEmbeddedDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigEmbedded + */ +Result GetButtonConfigStorageEmbeddedDeprecated(s32 index, HidcfgButtonConfigEmbedded *config); + +/** + * @brief GetButtonConfigStorageFullDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigFull + */ +Result GetButtonConfigStorageFullDeprecated(s32 index, HidcfgButtonConfigFull *config); + +/** + * @brief GetButtonConfigStorageLeftDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigLeft + */ +Result GetButtonConfigStorageLeftDeprecated(s32 index, HidcfgButtonConfigLeft *config); + +/** + * @brief GetButtonConfigStorageRightDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigRight + */ +Result GetButtonConfigStorageRightDeprecated(s32 index, HidcfgButtonConfigRight *config); + +/** + * @brief SetButtonConfigStorageEmbeddedDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigEmbedded + */ +Result SetButtonConfigStorageEmbeddedDeprecated(s32 index, const HidcfgButtonConfigEmbedded *config); + +/** + * @brief SetButtonConfigStorageFullDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigFull + */ +Result SetButtonConfigStorageFullDeprecated(s32 index, const HidcfgButtonConfigFull *config); + +/** + * @brief SetButtonConfigStorageLeftDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigLeft + */ +Result SetButtonConfigStorageLeftDeprecated(s32 index, const HidcfgButtonConfigLeft *config); + +/** + * @brief SetButtonConfigStorageRightDeprecated + * @note Only available on [10.0.0-12.1.0]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigRight + */ +Result SetButtonConfigStorageRightDeprecated(s32 index, const HidcfgButtonConfigRight *config); + +/** + * @brief DeleteButtonConfigStorageEmbedded + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + */ +Result DeleteButtonConfigStorageEmbedded(s32 index); + +/** + * @brief DeleteButtonConfigStorageFull + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + */ +Result DeleteButtonConfigStorageFull(s32 index); + +/** + * @brief DeleteButtonConfigStorageLeft + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + */ +Result DeleteButtonConfigStorageLeft(s32 index); + +/** + * @brief DeleteButtonConfigStorageRight + * @note Only available on [10.0.0+]. + * @param[in] index Array index, should be 0-4. + */ +Result DeleteButtonConfigStorageRight(s32 index); + +/** + * @brief IsUsingCustomButtonConfig + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] out Output bool flag. + */ +Result IsUsingCustomButtonConfig(HidsysUniquePadId unique_pad_id, bool *out); + +/** + * @brief IsAnyCustomButtonConfigEnabled + * @note Only available on [10.0.0+]. + * @param[out] out Output bool flag. + */ +Result IsAnyCustomButtonConfigEnabled(bool *out); + +/** + * @brief SetAllCustomButtonConfigEnabled + * @note Only available on [10.0.0+]. + * @param[in] AppletResourceUserId AppletResourceUserId + * @param[in] flag Input bool flag. + */ +Result SetAllCustomButtonConfigEnabled(u64 AppletResourceUserId, bool flag); + +/** + * @brief SetAllDefaultButtonConfig + * @note Only available on [10.0.0+]. + */ +Result SetAllDefaultButtonConfig(void); + +/** + * @brief SetHidButtonConfigEmbedded + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidcfgButtonConfigEmbedded + */ +Result SetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigEmbedded *config); + +/** + * @brief SetHidButtonConfigFull + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidcfgButtonConfigFull + */ +Result SetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigFull *config); + +/** + * @brief SetHidButtonConfigLeft + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidcfgButtonConfigLeft + */ +Result SetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigLeft *config); + +/** + * @brief SetHidButtonConfigRight + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[in] config \ref HidcfgButtonConfigRight + */ +Result SetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigRight *config); + +/** + * @brief GetHidButtonConfigEmbedded + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidcfgButtonConfigEmbedded + */ +Result GetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigEmbedded *config); + +/** + * @brief GetHidButtonConfigFull + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidcfgButtonConfigFull + */ +Result GetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigFull *config); + +/** + * @brief GetHidButtonConfigLeft + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidcfgButtonConfigLeft + */ +Result GetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigLeft *config); + +/** + * @brief GetHidButtonConfigRight + * @note Only available on [10.0.0+]. + * @param[in] unique_pad_id \ref HidsysUniquePadId + * @param[out] config \ref HidcfgButtonConfigRight + */ +Result GetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigRight *config); + +/** + * @brief GetButtonConfigStorageEmbedded + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigEmbedded + * @param[out] name \ref HidcfgStorageName + */ +Result GetButtonConfigStorageEmbedded(s32 index, HidcfgButtonConfigEmbedded *config, HidcfgStorageName *name); + +/** + * @brief GetButtonConfigStorageFull + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigFull + * @param[out] name \ref HidcfgStorageName + */ +Result GetButtonConfigStorageFull(s32 index, HidcfgButtonConfigFull *config, HidcfgStorageName *name); + +/** + * @brief GetButtonConfigStorageLeft + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigLeft + * @param[out] name \ref HidcfgStorageName + */ +Result GetButtonConfigStorageLeft(s32 index, HidcfgButtonConfigLeft *config, HidcfgStorageName *name); + +/** + * @brief GetButtonConfigStorageRight + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[out] config \ref HidcfgButtonConfigRight + * @param[out] name \ref HidcfgStorageName + */ +Result GetButtonConfigStorageRight(s32 index, HidcfgButtonConfigRight *config, HidcfgStorageName *name); + +/** + * @brief SetButtonConfigStorageEmbedded + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigEmbedded + * @param[in] name \ref HidcfgStorageName + */ +Result SetButtonConfigStorageEmbedded(s32 index, const HidcfgButtonConfigEmbedded *config, const HidcfgStorageName *name); + +/** + * @brief SetButtonConfigStorageFull + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigFull + * @param[in] name \ref HidcfgStorageName + */ +Result SetButtonConfigStorageFull(s32 index, const HidcfgButtonConfigFull *config, const HidcfgStorageName *name); + +/** + * @brief SetButtonConfigStorageLeft + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigLeft + * @param[in] name \ref HidcfgStorageName + */ +Result SetButtonConfigStorageLeft(s32 index, const HidcfgButtonConfigLeft *config, const HidcfgStorageName *name); + +/** + * @brief SetButtonConfigStorageRight + * @note Only available on [11.0.0+]. + * @param[in] index Array index, should be 0-4. + * @param[in] config \ref HidcfgButtonConfigRight + * @param[in] name \ref HidcfgStorageName + */ +Result SetButtonConfigStorageRight(s32 index, const HidcfgButtonConfigRight *config, const HidcfgStorageName *name); + +} // namespace hidsys + +/// @brief C++ wrappers for the `hipc` API. +/// @details Wraps: switch/sf/hipc.h. +namespace hipc { + +using ::HipcBufferDescriptor; +using ::HipcBufferMode; +using ::HipcHeader; +using ::HipcMetadata; +using ::HipcParsedRequest; +using ::HipcRecvListEntry; +using ::HipcRequest; +using ::HipcResponse; +using ::HipcSpecialHeader; +using ::HipcStaticDescriptor; + +HipcStaticDescriptor MakeSendStatic(const void* buffer, size_t size, u8 index); + +HipcBufferDescriptor MakeBuffer(const void* buffer, size_t size, HipcBufferMode mode); + +HipcRecvListEntry MakeRecvStatic(void* buffer, size_t size); + +void* GetStaticAddress(const HipcStaticDescriptor* desc); + +size_t GetStaticSize(const HipcStaticDescriptor* desc); + +void* GetBufferAddress(const HipcBufferDescriptor* desc); + +size_t GetBufferSize(const HipcBufferDescriptor* desc); + +HipcRequest CalcRequestLayout(HipcMetadata meta, void* base); + +HipcRequest MakeRequest(void* base, HipcMetadata meta); + +HipcParsedRequest ParseRequest(void* base); + +HipcResponse ParseResponse(void* base); + +} // namespace hipc + +/// @brief C++ wrappers for the `hmac` API. +/// @details Wraps: switch/crypto/hmac.h. +namespace hmac { + +/// Context for HMAC-SHA1 operations. +using ::HmacSha1Context; +/// Context for HMAC-SHA256 operations. +using ::HmacSha256Context; + +/// Initialize a HMAC-SHA256 context. +void Sha256ContextCreate(HmacSha256Context *out, const void *key, size_t key_size); + +/// Updates HMAC-SHA256 context with data to hash +void Sha256ContextUpdate(HmacSha256Context *ctx, const void *src, size_t size); + +/// Gets the context's output mac, finalizes the context. +void Sha256ContextGetMac(HmacSha256Context *ctx, void *dst); + +/// Simple all-in-one HMAC-SHA256 calculator. +void Sha256CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size); + +/// Initialize a HMAC-SHA1 context. +void Sha1ContextCreate(HmacSha1Context *out, const void *key, size_t key_size); + +/// Updates HMAC-SHA1 context with data to hash +void Sha1ContextUpdate(HmacSha1Context *ctx, const void *src, size_t size); + +/// Gets the context's output mac, finalizes the context. +void Sha1ContextGetMac(HmacSha1Context *ctx, void *dst); + +/// Simple all-in-one HMAC-SHA1 calculator. +void Sha1CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size); + +} // namespace hmac + +/// @brief C++ wrappers for the `hosversion` API. +/// @details Wraps: switch/runtime/hosversion.h. +namespace hosversion { + +/// Returns the current HOS version that was previously set with \ref hosversionSet. If version initialization fails during startup (such as in the case set:sys is not available), this function returns zero. +u32 Get(void); + +/// Sets or overrides the current HOS version. This function is normally called automatically by libnx on startup with the version info obtained with \ref setsysGetFirmwareVersion. +void Set(u32 version); + +/// Returns whether the current HOS version is augmented by running the Atmosphère custom firmware. +bool IsAtmosphere(void); + +/// Returns true if the current HOS version is equal to or above the specified major/minor/micro version. +bool AtLeast(u8 major, u8 minor, u8 micro); + +/// Returns true if the current HOS version is earlier than the specified major/minor/micro version. +bool Before(u8 major, u8 minor, u8 micro); + +/// Returns true if the current HOS version is between the two specified major versions, i.e. [major1, major2). +bool Between(u8 major1, u8 major2); + +} // namespace hosversion + +/// @brief C++ wrappers for the `hwopus` API. +/// @details Wraps: switch/services/hwopus.h. +namespace hwopus { + +using ::HwopusDecoder; +/// This structure is the start of opusin for \ref hwopusDecodeInterleaved, with the actual opus packet following this. +/// These fields are big-endian. +using ::HwopusHeader; +/// Used internally. +using ::HwopusMultistreamState; + +Result DecoderInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount); + +void DecoderExit(HwopusDecoder* decoder); + +/// Only available on [3.0.0+]. +/// See libopus multistream docs. +Result DecoderMultistreamInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount, s32 TotalStreamCount, s32 StereoStreamCount, u8 *channel_mapping); + +/// Decodes opus data. +Result DecodeInterleaved(HwopusDecoder* decoder, s32 *DecodedDataSize, s32 *DecodedSampleCount, const void* opusin, size_t opusin_size, s16 *pcmbuf, size_t pcmbuf_size); + +} // namespace hwopus + +/// @brief C++ wrappers for the `i2c` API. +/// @details Wraps: switch/services/i2c.h. +namespace i2c { + +using ::I2cDevice; +using ::I2cSession; +using ::I2cTransactionOption; + +/// Initialize i2c. +Result Initialize(void); + +/// Exit i2c. +void Exit(void); + +/// Gets the Service object for the actual i2c service session. +Service* GetServiceSession(void); + +Result OpenSession(I2cSession *out, I2cDevice dev); + +} // namespace i2c + +/// @brief C++ wrappers for the `i2csession` API. +/// @details Wraps: switch/services/i2c.h. +namespace i2csession { + +using ::I2cDevice; +using ::I2cSession; +using ::I2cTransactionOption; + +Result SendAuto(I2cSession *s, const void *buf, size_t size, I2cTransactionOption option); + +Result ReceiveAuto(I2cSession *s, void *buf, size_t size, I2cTransactionOption option); + +Result ExecuteCommandList(I2cSession *s, void *dst, size_t dst_size, const void *cmd_list, size_t cmd_list_size); + +void Close(I2cSession *s); + +} // namespace i2csession + +/// @brief C++ wrappers for the `idlesys` API. +/// @details Wraps: switch/services/idlesys.h. +namespace idlesys { + +/// Initialize idle:sys. +Result Initialize(void); + +/// Exit idle:sys. +void Exit(void); + +/// Gets the Service for idle:sys. +Service* GetServiceSession(void); + +/// Resets sleep counter. +Result ReportUserIsActive(void); + +} // namespace idlesys + +/// @brief C++ wrappers for the `insr` API. +/// @details Wraps: switch/services/ins.h. +namespace insr { + +/// Initialize ins:r. +Result Initialize(void); + +/// Exit ins:r. +void Exit(void); + +/// Gets the Service object for the actual ins:r service session. +Service* GetServiceSession(void); + +/** + * @brief Retrieves the last system tick the event corresponding to the ID was signaled at. + * @param[in] id Ins request ID (should be 0..4). + * @param[out] tick. + * @return Result code. + * @note The tick is only updated once per second at minimum. + */ +Result GetLastTick(u32 id, u64 *tick); + +/** + * @brief Retrieves the event corresponding to the ID. + * @param[in] id Ins request ID (should be 0..4). + * @param[out] out. + * @return Result code. + * @note The event is only signaled once per second at minimum. + */ +Result GetReadableEvent(u32 id, Event *out); + +} // namespace insr + +/// @brief C++ wrappers for the `inss` API. +/// @details Wraps: switch/services/ins.h. +namespace inss { + +/// Initialize ins:s. +Result Initialize(void); + +/// Exit ins:s. +void Exit(void); + +/// Gets the Service object for the actual ins:s service session. +Service* GetServiceSession(void); + +/** + * @brief Retrieves the event corresponding to the ID. + * @param[in] id Ins send ID (should be 0..11). + * @param[out] out. + * @return Result code. + * @note The returned event cannot be waited on, only signaled. Clearing is handled by the service. + */ +Result GetWritableEvent(u32 id, Event *out); + +} // namespace inss + +/// @brief C++ wrappers for the `irs` API. +/// @details Wraps: switch/services/irs.h. +namespace irs { + +/// AdaptiveClusteringMode +using ::IrsAdaptiveClusteringMode; +/// AdaptiveClusteringProcessorConfig +using ::IrsAdaptiveClusteringProcessorConfig; +/// AdaptiveClusteringTargetDistance +using ::IrsAdaptiveClusteringTargetDistance; +/// AruidFormat +using ::IrsAruidFormat; +/// ClusteringData +using ::IrsClusteringData; +/// ClusteringProcessorConfig +using ::IrsClusteringProcessorConfig; +/// ClusteringProcessorState +using ::IrsClusteringProcessorState; +/// DeviceFormat +using ::IrsDeviceFormat; +/// HandAnalysisConfig +using ::IrsHandAnalysisConfig; +/// HandAnalysisMode +using ::IrsHandAnalysisMode; +/// ImageProcessorStatus +using ::IrsImageProcessorStatus; +/// ImageTransferProcessorConfig +using ::IrsImageTransferProcessorConfig; +/// ImageTransferProcessorExConfig +using ::IrsImageTransferProcessorExConfig; +/// ImageTransferProcessorFormat. IR Sensor image resolution. +using ::IrsImageTransferProcessorFormat; +/// ImageTransferProcessorState +using ::IrsImageTransferProcessorState; +/// IrCameraHandle +using ::IrsIrCameraHandle; +/// IrCameraInternalStatus +using ::IrsIrCameraInternalStatus; +/// IrCameraStatus +using ::IrsIrCameraStatus; +/// IrLedProcessorConfig +using ::IrsIrLedProcessorConfig; +/// IrSensorMode +using ::IrsIrSensorMode; +/// IrsMomentProcessorConfig +using ::IrsMomentProcessorConfig; +/// MomentProcessorState +using ::IrsMomentProcessorState; +/// MomentStatistic +using ::IrsMomentStatistic; +/// PackedClusteringProcessorConfig +using ::IrsPackedClusteringProcessorConfig; +/// PackedFunctionLevel +using ::IrsPackedFunctionLevel; +/// PackedImageTransferProcessorConfig +using ::IrsPackedImageTransferProcessorConfig; +/// PackedImageTransferProcessorExConfig +using ::IrsPackedImageTransferProcessorExConfig; +/// PackedIrLedProcessorConfig +using ::IrsPackedIrLedProcessorConfig; +/// PackedMcuVersion +using ::IrsPackedMcuVersion; +/// PackedMomentProcessorConfig +using ::IrsPackedMomentProcessorConfig; +/// PackedPointingProcessorConfig +using ::IrsPackedPointingProcessorConfig; +/// PackedTeraPluginProcessorConfig +using ::IrsPackedTeraPluginProcessorConfig; +/// PointingProcessorMarkerState +using ::IrsPointingProcessorMarkerState; +/// PointingProcessorState +using ::IrsPointingProcessorState; +/// ProcessorState +using ::IrsProcessorState; +/// Rect +using ::IrsRect; +/// StatusManager +using ::IrsStatusManager; +/// TeraPluginProcessorConfig +using ::IrsTeraPluginProcessorConfig; +/// TeraPluginProcessorState +using ::IrsTeraPluginProcessorState; +/// Internal validation callblack. +using ::IrsValidationCb; + +/// Initialize irs. +Result Initialize(void); + +/// Exit irs. +void Exit(void); + +/// Gets the Service object for the actual irs service session. +Service* GetServiceSession(void); + +/// Gets the address of the SharedMemory (\ref IrsStatusManager). +void* GetSharedmemAddr(void); + +/// Gets the \ref IrsIrCameraHandle for the specified controller. +Result GetIrCameraHandle(IrsIrCameraHandle *handle, HidNpadIdType id); + +/// GetIrCameraStatus +Result GetIrCameraStatus(IrsIrCameraHandle handle, IrsIrCameraStatus *out); + +/// CheckFirmwareUpdateNecessity +/// When successful where the output flag is set, the user should use \ref hidLaShowControllerFirmwareUpdate. +/// Only available on [4.0.0+]. +Result CheckFirmwareUpdateNecessity(IrsIrCameraHandle handle, bool *out); + +/// GetImageProcessorStatus +/// Only available on [4.0.0+]. +Result GetImageProcessorStatus(IrsIrCameraHandle handle, IrsImageProcessorStatus *out); + +/// Stop the current Processor. +/// \ref irsExit calls this with all IrCameraHandles which were not already used with \ref irsStopImageProcessor. +Result StopImageProcessor(IrsIrCameraHandle handle); + +/// Stop the current Processor, async. +/// Only available on [4.0.0+]. +Result StopImageProcessorAsync(IrsIrCameraHandle handle); + +/** + * @brief Run the MomentProcessor. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + */ +Result RunMomentProcessor(IrsIrCameraHandle handle, const IrsMomentProcessorConfig *config); + +/** + * @brief Gets the states for MomentProcessor or IrLedProcessor. + * @note The official GetIrLedProcessorState is essentially the same as this, except it uses hard-coded count=1 with output-array on stack, without returning that data. Hence we don't implement a seperate func for that. + * @param[in] handle \ref IrsIrCameraHandle + * @param[out] states Output array of \ref IrsMomentProcessorState. + * @param[in] count Size of the states array in entries. Must be 1-5. + * @param[out] total_out Total output entries. + */ +Result GetMomentProcessorStates(IrsIrCameraHandle handle, IrsMomentProcessorState *states, s32 count, s32 *total_out); + +/** + * @brief Calculates an \ref IrsMomentStatistic from the specified region in the input \ref IrsMomentProcessorState. + * @param[in] state \ref IrsMomentProcessorState + * @param[in] rect \ref IrsRect, containing the image width and height. + * @param[in] region_x Region x, must be 0-5 (clamped to this range otherwise). region_x = image_x/6. + * @param[in] region_y Region y, must be 0-7 (clamped to this range otherwise). region_y = image_y/8. + * @param[in] region_width Region width. region_x+region_width must be <=6 (clamped to this range otherwise). + * @param[in] region_height Region height. region_y+region_height must be <=8 (clamped to this range otherwise). + */ +IrsMomentStatistic CalculateMomentRegionStatistic(const IrsMomentProcessorState *state, IrsRect rect, s32 region_x, s32 region_y, s32 region_width, s32 region_height); + +/** + * @brief Run the ClusteringProcessor. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + */ +Result RunClusteringProcessor(IrsIrCameraHandle handle, const IrsClusteringProcessorConfig *config); + +/** + * @brief Gets the states for ClusteringProcessor. + * @param[in] handle \ref IrsIrCameraHandle + * @param[out] states Output array of \ref IrsClusteringProcessorState. + * @param[in] count Size of the states array in entries. Must be 1-5. + * @param[out] total_out Total output entries. + */ +Result GetClusteringProcessorStates(IrsIrCameraHandle handle, IrsClusteringProcessorState *states, s32 count, s32 *total_out); + +/** + * @brief Run the ImageTransferProcessor. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + * @param[in] size Work-buffer size, must be 0x1000-byte aligned. + */ +Result RunImageTransferProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorConfig *config, size_t size); + +/** + * @brief Run the ImageTransferExProcessor. + * @note Only available on [4.0.0+]. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + * @param[in] size Work-buffer size, must be 0x1000-byte aligned. + */ +Result RunImageTransferExProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorExConfig *config, size_t size); + +/// GetImageTransferProcessorState +Result GetImageTransferProcessorState(IrsIrCameraHandle handle, void* buffer, size_t size, IrsImageTransferProcessorState *state); + +/** + * @brief Run the PointingProcessor. + * @param[in] handle \ref IrsIrCameraHandle + */ +Result RunPointingProcessor(IrsIrCameraHandle handle); + +/** + * @brief Gets the states for PointingProcessor. + * @param[in] handle \ref IrsIrCameraHandle + * @param[out] states Output array of \ref IrsPointingProcessorMarkerState. + * @param[in] count Size of the states array in entries. Must be 1-6. + * @param[out] total_out Total output entries. + */ +Result GetPointingProcessorMarkerStates(IrsIrCameraHandle handle, IrsPointingProcessorMarkerState *states, s32 count, s32 *total_out); + +/** + * @brief Gets the states for \ref IrsPointingProcessorState. + * @note This uses \ref irsGetPointingProcessorMarkerStates, then converts the output to \ref IrsPointingProcessorState. + * @param[in] handle \ref IrsIrCameraHandle + * @param[out] states Output array of \ref IrsPointingProcessorState. + * @param[in] count Size of the states array in entries. Must be 1-6. + * @param[out] total_out Total output entries. + */ +Result GetPointingProcessorStates(IrsIrCameraHandle handle, IrsPointingProcessorState *states, s32 count, s32 *total_out); + +/** + * @brief Run the TeraPluginProcessor. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + */ +Result RunTeraPluginProcessor(IrsIrCameraHandle handle, const IrsTeraPluginProcessorConfig *config); + +/** + * @brief Gets the states for TeraPluginProcessor, filtered using the input params. + * @param[in] handle \ref IrsIrCameraHandle + * @param[out] states Output array of \ref IrsTeraPluginProcessorState. + * @param[in] count Size of the states array in entries. Must be 1-5. + * @param[in] sampling_number Minimum value for IrsTeraPluginProcessorState::sampling_number. + * @param[in] prefix_data Only used when prefix_bitcount is not 0. The first prefix_bitcount bits from prefix_data must match the first prefix_bitcount bits in IrsTeraPluginProcessorState::plugin_data. + * @param[in] prefix_bitcount Total bits for prefix_data. + * @param[out] total_out Total output entries. + */ +Result GetTeraPluginProcessorStates(IrsIrCameraHandle handle, IrsTeraPluginProcessorState *states, s32 count, s64 sampling_number, u32 prefix_data, u32 prefix_bitcount, s32 *total_out); + +/** + * @brief Run the IrLedProcessor. + * @note Only available on [4.0.0+]. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + */ +Result RunIrLedProcessor(IrsIrCameraHandle handle, const IrsIrLedProcessorConfig *config); + +/** + * @brief Run the AdaptiveClusteringProcessor. + * @note Only available on [5.0.0+]. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + */ +Result RunAdaptiveClusteringProcessor(IrsIrCameraHandle handle, const IrsAdaptiveClusteringProcessorConfig *config); + +/** + * @brief Run HandAnalysis. + * @param[in] handle \ref IrsIrCameraHandle + * @param[in] config Input config. + */ +Result RunHandAnalysis(IrsIrCameraHandle handle, const IrsHandAnalysisConfig *config); + +/** + * Gets the default configuration for MomentProcessor. + */ +void GetMomentProcessorDefaultConfig(IrsMomentProcessorConfig *config); + +/** + * Gets the default configuration for ClusteringProcessor. + */ +void GetClusteringProcessorDefaultConfig(IrsClusteringProcessorConfig *config); + +/** + * Gets the default configuration for ImageTransferProcessor. + * Defaults are exposure 300us, 8x digital gain, the rest is all-zero. Format is ::IrsImageTransferProcessorFormat_320x240. + */ +void GetDefaultImageTransferProcessorConfig(IrsImageTransferProcessorConfig *config); + +/** + * Gets the default configuration for ImageTransferProcessorEx. + * Defaults are exposure 300us, 8x digital gain, the rest is all-zero. OrigFormat/TrimmingFormat are ::IrsImageTransferProcessorFormat_320x240. + */ +void GetDefaultImageTransferProcessorExConfig(IrsImageTransferProcessorExConfig *config); + +/** + * Gets the default configuration for IrLedProcessor. + */ +void GetIrLedProcessorDefaultConfig(IrsIrLedProcessorConfig *config); + +} // namespace irs + +/// @brief C++ wrappers for the `jit` API. +/// @details Wraps: switch/kernel/jit.h. +namespace jit { + +/// JIT buffer object. +using ::Jit; +/// JIT implementation type. +using ::JitType; + +/** + * @brief Creates a JIT buffer. + * @param j JIT buffer. + * @param size Size of the JIT buffer. + * @return Result code. + */ +Result Create(Jit* j, size_t size); + +/** + * @brief Transition a JIT buffer to have writable permission. + * @param j JIT buffer. + * @return Result code. + */ +Result TransitionToWritable(Jit* j); + +/** + * @brief Transition a JIT buffer to have executable permission. + * @param j JIT buffer. + * @return Result code. + */ +Result TransitionToExecutable(Jit* j); + +/** + * @brief Destroys a JIT buffer. + * @param j JIT buffer. + * @return Result code. + */ +Result Close(Jit* j); + +/** + * @brief Gets the address of the writable memory alias of a JIT buffer. + * @param j JIT buffer. + * @return Pointer to alias of the JIT buffer that can be written to. + */ +void* GetRwAddr(Jit* j); + +/** + * @brief Gets the address of the executable memory alias of a JIT buffer. + * @param j JIT buffer. + * @return Pointer to alias of the JIT buffer that can be executed. + */ +void* GetRxAddr(Jit* j); + +} // namespace jit + +/// @brief C++ wrappers for the `lbl` API. +/// @details Wraps: switch/services/lbl.h. +namespace lbl { + +using ::LblBacklightSwitchStatus; + +/// Initialize lbl. +Result Initialize(void); + +/// Exit lbl. +void Exit(void); + +/// Gets the Service object for the actual lbl service session. +Service* GetServiceSession(void); + +Result SaveCurrentSetting(void); + +Result LoadCurrentSetting(void); + +/** + * @note The brightness goes from 0 to 1.0. + */ +Result SetCurrentBrightnessSetting(float brightness); + +Result GetCurrentBrightnessSetting(float *out_value); + +Result ApplyCurrentBrightnessSettingToBacklight(void); + +Result GetBrightnessSettingAppliedToBacklight(float *out_value); + +Result SwitchBacklightOn(u64 fade_time); + +Result SwitchBacklightOff(u64 fade_time); + +Result GetBacklightSwitchStatus(LblBacklightSwitchStatus *out_value); + +Result EnableDimming(void); + +Result DisableDimming(void); + +Result IsDimmingEnabled(bool *out_value); + +Result EnableAutoBrightnessControl(void); + +Result DisableAutoBrightnessControl(void); + +Result IsAutoBrightnessControlEnabled(bool *out_value); + +Result SetAmbientLightSensorValue(float value); + +/** + * @note Used internally by \ref appletGetAmbientLightSensorValue and \ref appletGetCurrentIlluminanceEx. + */ +Result GetAmbientLightSensorValue(bool *over_limit, float *lux); + +/** + * @note Only available on [3.0.0+]. + * @note Used internally by \ref appletIsIlluminanceAvailable. + */ +Result IsAmbientLightSensorAvailable(bool *out_value); + +/** + * @note Only available on [3.0.0+]. + */ +Result SetCurrentBrightnessSettingForVrMode(float brightness); + +/** + * @note Only available on [3.0.0+]. + */ +Result GetCurrentBrightnessSettingForVrMode(float *out_value); + +/** + * @note Only available on [3.0.0+]. + * @note Used internally by \ref appletSetVrModeEnabled. + */ +Result EnableVrMode(void); + +/** + * @note Only available on [3.0.0+]. + * @note Used internally by \ref appletSetVrModeEnabled. + */ +Result DisableVrMode(void); + +/** + * @note Only available on [3.0.0+]. + * @note Used internally by \ref appletIsVrModeEnabled. + */ +Result IsVrModeEnabled(bool *out_value); + +} // namespace lbl + +/// @brief C++ wrappers for the `ldn` API. +/// @details Wraps: switch/services/ldn.h. +namespace ldn { + +/// AcceptPolicy +using ::LdnAcceptPolicy; +/// ActionFrameSettings +using ::LdnActionFrameSettings; +/// AddressEntry +using ::LdnAddressEntry; +/// CommonNetworkInfo +using ::LdnCommonNetworkInfo; +/// DisconnectReason loaded by \ref ldnGetDisconnectReason. +using ::LdnDisconnectReason; +/// IntentId +using ::LdnIntentId; +/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). +using ::LdnIpv4Address; +/// MacAddress +using ::LdnMacAddress; +/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate). +using ::LdnNetworkConfig; +/// NetworkId +using ::LdnNetworkId; +/// NetworkInfo +using ::LdnNetworkInfo; +/// NodeInfo +using ::LdnNodeInfo; +/// NodeLatestUpdate +using ::LdnNodeLatestUpdate; +/// OperationMode +using ::LdnOperationMode; +/// Protocol +using ::LdnProtocol; +/// ScanFilter. \ref ldnScan / \ref ldnScanPrivate will only return the \ref LdnNetworkInfo when validating the \ref LdnNetworkInfo with LdnScanFilter was sucessful, with the fields enabled by \ref LdnScanFilterFlag. +using ::LdnScanFilter; +/// ScanFilterFlag +using ::LdnScanFilterFlag; +/// SecurityConfig +using ::LdnSecurityConfig; +/// SecurityMode. LdnSecurityMode_Product can be used as the default value. The ldn cmds which use an input SecurityMode normally overwrite the SecurityMode. +using ::LdnSecurityMode; +/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated. +using ::LdnSecurityParameter; +using ::LdnServiceType; +/// SessionId +using ::LdnSessionId; +/// Ssid +using ::LdnSsid; +/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState. +using ::LdnState; +/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). +using ::LdnSubnetMask; +/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd. +using ::LdnUserConfig; +/// WirelessControllerRestriction +using ::LdnWirelessControllerRestriction; + +/// Initialize ldn. +/// The priority is only used with ::LdnServiceType_System on [19.0.0+]. To optionally set this, define "s32 __nx_ldn_priority". The priority must be \ref LDN_PRIORITY_SYSTEM (default) or \ref LDN_PRIORITY_USER. +Result Initialize(LdnServiceType service_type); + +/// Exit ldn. +void Exit(void); + +/// Gets the Service object for IUserLocalCommunicationService/ISystemLocalCommunicationService. +Service* GetServiceSession_LocalCommunicationService(void); + +/// Gets the Service object for IClientProcessMonitor, only valid with [18.0.0+]. +Service* GetServiceSession_IClientProcessMonitor(void); + +/** + * @brief GetState + * @param[out] out \ref LdnState + */ +Result GetState(LdnState *out); + +/** + * @brief GetNetworkInfo + * @param[out] out \ref LdnNetworkInfo + */ +Result GetNetworkInfo(LdnNetworkInfo *out); + +/** + * @brief GetIpv4Address + * @param[out] addr \ref LdnIpv4Address + * @param[out] mask \ref LdnSubnetMask + */ +Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask); + +/** + * @brief GetDisconnectReason + * @param[out] out \ref LdnDisconnectReason + */ +Result GetDisconnectReason(LdnDisconnectReason *out); + +/** + * @brief GetSecurityParameter + * @param[out] out \ref LdnSecurityParameter + */ +Result GetSecurityParameter(LdnSecurityParameter *out); + +/** + * @brief GetNetworkConfig + * @param[out] out \ref LdnNetworkConfig + */ +Result GetNetworkConfig(LdnNetworkConfig *out); + +/** + * @brief GetStateChangeEvent + * @note The Event must be closed by the user once finished with it. + * @note This is signaled when the data returned by \ref ldnGetNetworkInfo / \ref ldnGetNetworkInfoLatestUpdate is updated. + * @param[out] out_event Output Event with autoclear=true. + */ +Result GetStateChangeEvent(Event* out_event); + +/** + * @brief GetNetworkInfoAndHistory + * @param[out] network_info \ref LdnNetworkInfo + * @param[out] nodes Output array of \ref LdnNodeLatestUpdate. + * @param[in] count Size of the nodes array in entries, must be 8. + */ +Result GetNetworkInfoAndHistory(LdnNetworkInfo *network_info, LdnNodeLatestUpdate *nodes, s32 count); + +/** + * @brief Scan + * @note \ref LdnState must be ::LdnState_AccessPointCreated, ::LdnState_Station, or ::LdnState_StationConnected. + * @note This is the same as \ref ldnScanPrivate (minus the masking for LdnScanFilter::flags), except this has the same channel-override functionality as \ref ldnCreateNetwork. + * @param[in] channel Channel, value 0 can be used for this. + * @param[in] filter \ref LdnScanFilter + * @param[out] network_info Output array of \ref LdnNetworkInfo. + * @param[in] count Size of the network_info array in entries. Must be at least 1, this is clamped to a maximum of 0x18 internally. + * @param[out] total_out Total output entries. + */ +Result Scan(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out); + +/** + * @brief ScanPrivate + * @note \ref LdnState must be ::LdnState_AccessPointCreated, ::LdnState_Station, or ::LdnState_StationConnected. + * @note See \ref ldnScan. + * @param[in] channel Channel, value 0 can be used for this. + * @param[in] filter \ref LdnScanFilter + * @param[out] network_info Output array of \ref LdnNetworkInfo. + * @param[in] count Size of the network_info array in entries. Must be at least 1, this is clamped to a maximum of 0x18 internally. + * @param[out] total_out Total output entries. + */ +Result ScanPrivate(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out); + +/** + * @brief SetWirelessControllerRestriction + * @note Only available on [5.0.0+]. + * @note \ref LdnState must be ::LdnState_Initialized. + * @param[in] restriction \ref LdnWirelessControllerRestriction + */ +Result SetWirelessControllerRestriction(LdnWirelessControllerRestriction restriction); + +/** + * @brief SetProtocol + * @note This is only usable with [20.0.0+] (with [18.0.0-19-0.1] this is available but not usable). + * @note \ref LdnState must be ::LdnState_Initialized. If a non-default Protocol is wanted, use this after \ref ldnInitialize. + * @note This is used by \ref ldnInitialize with LdnProtocol_NX on [20.0.0+]. + * @param[in] protocol \ref LdnProtocol + */ +Result SetProtocol(LdnProtocol protocol); + +/** + * @brief OpenAccessPoint + * @note \ref LdnState must be ::LdnState_Initialized, this eventually sets the State to ::LdnState_AccessPoint. + */ +Result OpenAccessPoint(void); + +/** + * @brief CloseAccessPoint + * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated, this eventually sets the State to ::LdnState_Initialized. + * @note Used automatically internally by \ref ldnExit if needed. + */ +Result CloseAccessPoint(void); + +/** + * @brief CreateNetwork + * @note \ref LdnState must be ::LdnState_AccessPoint, this eventually sets the State to ::LdnState_AccessPointCreated. + * @param[in] sec_config \ref LdnSecurityConfig + * @param[in] user_config \ref LdnUserConfig + * @param[in] network_config \ref LdnNetworkConfig + */ +Result CreateNetwork(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config); + +/** + * @brief CreateNetworkPrivate + * @note \ref LdnState must be ::LdnState_AccessPoint, this eventually sets the State to ::LdnState_AccessPointCreated. + * @note This is the same as \ref ldnCreateNetwork besides the additional user-specified params, and with this cmd LdnNetworkConfig::channel is not overwritten (unlike \ref ldnCreateNetwork). + * @param[in] sec_config \ref LdnSecurityConfig + * @param[in] sec_param \ref LdnSecurityParameter + * @param[in] user_config \ref LdnUserConfig + * @param[in] network_config \ref LdnNetworkConfig + * @param[in] addrs Input array of \ref LdnAddressEntry. This can be NULL. + * @param[in] count Size of the addrs array in entries. This must be <=8. This can be 0, in which case the network will be non-Private like \ref ldnCreateNetwork. + */ +Result CreateNetworkPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config, const LdnAddressEntry *addrs, s32 count); + +/** + * @brief DestroyNetwork + * @note \ref LdnState must be ::LdnState_AccessPointCreated, this eventually sets the State to ::LdnState_AccessPoint. + */ +Result DestroyNetwork(void); + +/** + * @brief Reject + * @note \ref LdnState must be ::LdnState_AccessPointCreated. + * @param[in] addr \ref LdnIpv4Address + */ +Result Reject(LdnIpv4Address addr); + +/** + * @brief SetAdvertiseData + * @note An empty buffer (buffer=NULL/size=0) can be used to reset the AdvertiseData size in state to zero. + * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. + * @param[in] buffer Input buffer containing arbitrary user data. + * @param[in] size Input buffer size, must be <=0x180. + */ +Result SetAdvertiseData(const void* buffer, size_t size); + +/** + * @brief SetStationAcceptPolicy + * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. + * @param[in] policy \ref LdnAcceptPolicy + */ +Result SetStationAcceptPolicy(LdnAcceptPolicy policy); + +/** + * @brief AddAcceptFilterEntry + * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. + * @note See \ref LdnAcceptPolicy. + * @param[in] addr \ref LdnMacAddress. If you want, you can also pass LdnNodeInfo::mac_addr for this. + */ +Result AddAcceptFilterEntry(LdnMacAddress addr); + +/** + * @brief ClearAcceptFilter + * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. + */ +Result ClearAcceptFilter(void); + +/** + * @brief OpenStation + * @note \ref LdnState must be ::LdnState_Initialized, this eventually sets the State to ::LdnState_Station. + */ +Result OpenStation(void); + +/** + * @brief CloseStation + * @note \ref LdnState must be ::LdnState_Station or ::LdnState_StationConnected, this eventually sets the State to ::LdnState_Initialized. + * @note Used automatically internally by \ref ldnExit if needed. + */ +Result CloseStation(void); + +/** + * @brief Connect + * @note \ref LdnState must be ::LdnState_Station, this eventually sets the State to ::LdnState_StationConnected. + * @note This is identical to \ref ldnConnectPrivate besides the used params, the code overwriting LdnSecurityConfig::type also differs. + * @param[in] sec_config \ref LdnSecurityConfig + * @param[in] user_config \ref LdnUserConfig + * @param[in] version LocalCommunicationVersion, this must be 0x0-0x7FFF. + * @param[in] option ConnectOption bitmask, must be <=0x1. You can use value 0 for example here. + * @param[in] network_info \ref LdnNetworkInfo + */ +Result Connect(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkInfo *network_info); + +/** + * @brief ConnectPrivate + * @note \ref LdnState must be ::LdnState_Station, this eventually sets the State to ::LdnState_StationConnected. + * @note See \ref ldnConnect. + * @param[in] sec_config \ref LdnSecurityConfig + * @param[in] sec_param \ref LdnSecurityParameter + * @param[in] user_config \ref LdnUserConfig + * @param[in] version LocalCommunicationVersion, this must be 0x0-0x7FFF. + * @param[in] option ConnectOption bitmask, must be <=0x1. You can use value 0 for example here. + * @param[in] network_config \ref LdnNetworkConfig + */ +Result ConnectPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkConfig *network_config); + +/** + * @brief Disconnect + * @note \ref LdnState must be ::LdnState_StationConnected, this eventually sets the State to ::LdnState_Station. + */ +Result Disconnect(void); + +/** + * @brief SetOperationMode + * @note With ::LdnServiceType_System this is only available on [4.0.0+]. + * @note With ::LdnServiceType_User this is only available on [19.0.0+]. + * @note \ref LdnState must be ::LdnState_Initialized. + * @param[in] mode \ref LdnOperationMode + */ +Result SetOperationMode(LdnOperationMode mode); + +/** + * @brief EnableActionFrame + * @note Only available on [18.0.0+]. + * @note \ref LdnState must be ::LdnState_Initialized. + * @param[in] settings \ref LdnActionFrameSettings + */ +Result EnableActionFrame(const LdnActionFrameSettings *settings); + +/** + * @brief DisableActionFrame + * @note Only available on [18.0.0+]. + * @note \ref LdnState must be ::LdnState_Initialized. + */ +Result DisableActionFrame(void); + +/** + * @brief SendActionFrame + * @note Only available on [18.0.0+]. + * @note \ref LdnState must be ::LdnState_AccessPointCreated / ::LdnState_Station. + * @param[in] data Data buffer. + * @param[in] size Data buffer size. + * @param[in] destination Destination \ref LdnMacAddress. + * @param[in] bssid Bssid \ref LdnMacAddress. + * @param[in] channel Channel, must be non-zero. + * @param[in] flags MessageFlag bit0 clear = block until the data can be sent, set = return error when the data can't be sent. + */ +Result SendActionFrame(const void* data, size_t size, LdnMacAddress destination, LdnMacAddress bssid, s16 channel, u32 flags); + +/** + * @brief RecvActionFrame + * @note Only available on [18.0.0+]. + * @note \ref ldnEnableActionFrame must be used prior to this. + * @param[out] data Output data buffer. + * @param[in] size Max size of the data buffer. + * @param[out] addr0 First \ref LdnMacAddress. + * @param[out] addr1 Second \ref LdnMacAddress. + * @param[out] channel Channel + * @param[out] out_size Output size. + * @param[out] link_level LinkLevel + * @param[in] flags MessageFlag bit0 clear = block until data is available, set = return error when data is not available. + */ +Result RecvActionFrame(void* data, size_t size, LdnMacAddress *addr0, LdnMacAddress *addr1, s16 *channel, u32 *out_size, s32 *link_level, u32 flags); + +/** + * @brief SetHomeChannel + * @note Only available on [18.0.0+]. + * @note \ref LdnState must be ::LdnState_Station. + * @param[in] channel Channel, must be non-zero. + */ +Result SetHomeChannel(s16 channel); + +/** + * @brief SetTxPower + * @note Only available on [18.0.0+]. + * @note \ref LdnState must be ::LdnState_AccessPoint* / ::LdnState_Station*. + * @param[in] power Power, must be 0x0..0xFF. + */ +Result SetTxPower(s16 power); + +/** + * @brief ResetTxPower + * @note Only available on [18.0.0+]. + * @note \ref LdnState must be ::LdnState_AccessPoint* / ::LdnState_Station*. + */ +Result ResetTxPower(void); + +} // namespace ldn + +/// @brief C++ wrappers for the `ldnm` API. +/// @details Wraps: switch/services/ldn.h. +namespace ldnm { + +/// AcceptPolicy +using ::LdnAcceptPolicy; +/// ActionFrameSettings +using ::LdnActionFrameSettings; +/// AddressEntry +using ::LdnAddressEntry; +/// CommonNetworkInfo +using ::LdnCommonNetworkInfo; +/// DisconnectReason loaded by \ref ldnGetDisconnectReason. +using ::LdnDisconnectReason; +/// IntentId +using ::LdnIntentId; +/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). +using ::LdnIpv4Address; +/// MacAddress +using ::LdnMacAddress; +/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate). +using ::LdnNetworkConfig; +/// NetworkId +using ::LdnNetworkId; +/// NetworkInfo +using ::LdnNetworkInfo; +/// NodeInfo +using ::LdnNodeInfo; +/// NodeLatestUpdate +using ::LdnNodeLatestUpdate; +/// OperationMode +using ::LdnOperationMode; +/// Protocol +using ::LdnProtocol; +/// ScanFilter. \ref ldnScan / \ref ldnScanPrivate will only return the \ref LdnNetworkInfo when validating the \ref LdnNetworkInfo with LdnScanFilter was sucessful, with the fields enabled by \ref LdnScanFilterFlag. +using ::LdnScanFilter; +/// ScanFilterFlag +using ::LdnScanFilterFlag; +/// SecurityConfig +using ::LdnSecurityConfig; +/// SecurityMode. LdnSecurityMode_Product can be used as the default value. The ldn cmds which use an input SecurityMode normally overwrite the SecurityMode. +using ::LdnSecurityMode; +/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated. +using ::LdnSecurityParameter; +using ::LdnServiceType; +/// SessionId +using ::LdnSessionId; +/// Ssid +using ::LdnSsid; +/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState. +using ::LdnState; +/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). +using ::LdnSubnetMask; +/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd. +using ::LdnUserConfig; +/// WirelessControllerRestriction +using ::LdnWirelessControllerRestriction; + +/// Initialize ldn:m. +Result Initialize(void); + +/// Exit ldn:m. +void Exit(void); + +/// Gets the Service object for IMonitorService. +Service* GetServiceSession_MonitorService(void); + +/** + * @brief GetState + * @param[out] out \ref LdnState + */ +Result GetState(LdnState *out); + +/** + * @brief GetNetworkInfo + * @param[out] out \ref LdnNetworkInfo + */ +Result GetNetworkInfo(LdnNetworkInfo *out); + +/** + * @brief GetIpv4Address + * @param[out] addr \ref LdnIpv4Address + * @param[out] mask \ref LdnSubnetMask + */ +Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask); + +/** + * @brief GetSecurityParameter + * @note Not exposed by official sw. + * @param[out] out \ref LdnSecurityParameter + */ +Result GetSecurityParameter(LdnSecurityParameter *out); + +/** + * @brief GetNetworkConfig + * @note Not exposed by official sw. + * @param[out] out \ref LdnNetworkConfig + */ +Result GetNetworkConfig(LdnNetworkConfig *out); + +} // namespace ldnm + +/// @brief C++ wrappers for the `ldr` API. +/// @details Wraps: switch/services/ldr.h, switch/services/ro.h. +namespace ldr { + +using ::LoaderModuleInfo; +using ::LoaderProgramAttributes; +using ::LoaderProgramInfo; +using ::LoaderProgramInfoV1; + +/// Initialize ldr:shel. +Result ShellInitialize(void); + +/// Exit ldr:shel. +void ShellExit(void); + +/// Gets the Service object for the actual ldr:shel service session. +Service* ShellGetServiceSession(void); + +/// Initialize ldr:dmnt. +Result DmntInitialize(void); + +/// Exit ldr:dmnt. +void DmntExit(void); + +/// Gets the Service object for the actual ldr:dmnt service session. +Service* DmntGetServiceSession(void); + +/// Initialize ldr:pm. +Result PmInitialize(void); + +/// Exit ldr:pm. +void PmExit(void); + +/// Gets the Service object for the actual ldr:pm service session. +Service* PmGetServiceSession(void); + +Result ShellSetProgramArguments(u64 program_id, const void *args, size_t args_size); + +Result ShellFlushArguments(void); + +Result DmntSetProgramArguments(u64 program_id, const void *args, size_t args_size); + +Result DmntFlushArguments(void); + +Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out); + +Result PmCreateProcess(u64 pin_id, u32 flags, Handle reslimit_h, const LoaderProgramAttributes *attrs, Handle *out_process_h); + +Result PmGetProgramInfo(const NcmProgramLocation *loc, const LoaderProgramAttributes *attrs, LoaderProgramInfo *out_program_info); + +///< [19.0.0+/Atmosphere] +Result PmGetProgramInfoV1(const NcmProgramLocation *loc, LoaderProgramInfoV1 *out_program_info); + +///< [1.0.0-18.1.0/Non-Atmosphere] +Result PmPinProgram(const NcmProgramLocation *loc, u64 *out_pin_id); + +Result PmUnpinProgram(u64 pin_id); + +Result PmSetEnabledProgramVerification(bool enabled); + +/// Initialize ldr:ro. +Result RoInitialize(void); + +/// Exit ldr:ro. +void RoExit(void); + +/// Gets the Service object for the actual ldr:ro service session. +Service* RoGetServiceSession(void); + +Result RoLoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); + +Result RoUnloadNro(u64 nro_address); + +Result RoLoadNrr(u64 nrr_address, u64 nrr_size); + +Result RoUnloadNrr(u64 nrr_address); + +Result RoLoadNrrEx(u64 nrr_address, u64 nrr_size); + +} // namespace ldr + +/// @brief C++ wrappers for the `levent` API. +/// @details Wraps: switch/kernel/levent.h. +namespace levent { + +/// User-mode light event structure. +using ::LEvent; + +/** + * @brief Initializes a user-mode light event. + * @param[out] le Pointer to \ref LEvent structure. + * @param[in] signaled Whether the event starts off in signaled state. + * @param[in] autoclear Autoclear flag. + */ +void Init(LEvent* le, bool signaled, bool autoclear); + +/** + * @brief Waits on a user-mode light event. + * @param[in] le Pointer to \ref LEvent structure. + * @param[in] timeout_ns Timeout in nanoseconds (pass UINT64_MAX to wait indefinitely). + * @return true if wait succeeded, false if wait timed out. + */ +bool Wait(LEvent* le, u64 timeout_ns); + +/** + * @brief Polls a user-mode light event. + * @param[in] le Pointer to \ref LEvent structure. + * @return true if event is signaled, false otherwise. + */ +bool TryWait(LEvent* le); + +/** + * @brief Signals a user-mode light event. + * @param[in] le Pointer to \ref LEvent structure. + */ +void Signal(LEvent* le); + +/** + * @brief Clears a user-mode light event. + * @param[in] le Pointer to \ref LEvent structure. + */ +void Clear(LEvent* le); + +} // namespace levent + +/// @brief C++ wrappers for the `libapplet` API. +/// @details Wraps: switch/applets/libapplet.h. +namespace libapplet { + +/// CommonArguments +using ::LibAppletArgs; + +/** + * @brief Creates a LibAppletArgs struct. + * @param a LibAppletArgs struct. + * @param version LaVersion for \ref LibAppletArgs. + */ +void ArgsCreate(LibAppletArgs* a, u32 version); + +/** + * @brief Sets the PlayStartupSound field in \ref LibAppletArgs. + * @param a LibAppletArgs struct. + * @param flag Value for \ref LibAppletArgs PlayStartupSound. + */ +void ArgsSetPlayStartupSound(LibAppletArgs* a, bool flag); + +/** + * @brief Creates an AppletStorage with the specified size and writes the buffer contents to that storage at offset 0. + * @param[out] s Storage object. + * @param buffer Input buffer. + * @param size Size to write. + */ +Result CreateWriteStorage(AppletStorage* s, const void* buffer, size_t size); + +/** + * @brief Reads data from offset 0 from the specified storage into the buffer. If the storage-size is smaller than the size param, the storage-size is used instead. + * @param s Storage object. + * @param buffer Output buffer. + * @param size Size to read. + * @param transfer_size Optional output size field for the actual size used for the read, can be NULL. + */ +Result ReadStorage(AppletStorage* s, void* buffer, size_t size, size_t *transfer_size); + +/** + * @brief Sets the tick field in LibAppletArgs, then creates a storage with it which is pushed to the AppletHolder via \ref appletHolderPushInData. + * @param a LibAppletArgs struct. + * @param h AppletHolder object. + */ +Result ArgsPush(LibAppletArgs* a, AppletHolder *h); + +/** + * @brief Uses \ref appletPopInData and reads it to the specified LibAppletArgs. The LibAppletArgs is validated, an error is thrown when invalid. + * @param[out] a LibAppletArgs struct. + */ +Result ArgsPop(LibAppletArgs* a); + +/** + * @brief Creates a storage using the input buffer which is pushed to the AppletHolder via \ref appletHolderPushInData. + * @param h AppletHolder object. + * @param buffer Input data buffer. + * @param size Input data size. + */ +Result PushInData(AppletHolder *h, const void* buffer, size_t size); + +/** + * @brief Pops a storage via \ref appletHolderPopOutData, uses \ref libappletReadStorage, then closes the storage. + * @param h AppletHolder object. + * @param buffer Output buffer. + * @param size Size to read. + * @param transfer_size Optional output size field for the actual size used for the read, can be NULL. + */ +Result PopOutData(AppletHolder *h, void* buffer, size_t size, size_t *transfer_size); + +/** + * @brief Sets whether \ref libappletStart uses \ref appletHolderJump. + * @param flag Flag. Value true should not be used unless running as AppletType_LibraryApplet. + */ +void SetJumpFlag(bool flag); + +/** + * @brief If the flag from \ref libappletSetJumpFlag is set, this just uses \ref appletHolderJump. Otherwise, starts the applet and waits for it to finish, then checks the \ref LibAppletExitReason. + * @note Uses \ref appletHolderStart and \ref appletHolderJoin. + * @param h AppletHolder object. + */ +Result Start(AppletHolder *h); + +/** + * @brief Creates a LibraryApplet with the specified input storage data, uses \ref libappletStart, and reads the output storage reply data via \ref libappletPopOutData. + * @param id \ref AppletId + * @param commonargs \ref LibAppletArgs struct. + * @param arg Input storage data buffer. Optional, can be NULL. + * @param arg_size Size of the arg buffer. + * @param reply Output storage data buffer. Optional, can be NULL. + * @param reply_size Size to read for the reply buffer. + * @param out_reply_size Actual read reply data size, see \ref libappletPopOutData. + */ +Result Launch(AppletId id, LibAppletArgs *commonargs, const void* arg, size_t arg_size, void* reply, size_t reply_size, size_t *out_reply_size); + +/// Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. +/// Returns to the main Home Menu, equivalent to pressing the HOME button. +Result RequestHomeMenu(void); + +/// Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. +/// Equivalent to entering "System Update" under System Settings. When leaving this, it returns to the main Home Menu. +Result RequestJumpToSystemUpdate(void); + +/** + * @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. + * @note Only available on [11.0.0+]. + * @param[in] application_id ApplicationId + * @param[in] uid \ref AccountUid + * @param[in] buffer Input buffer. + * @param[in] size Input buffer size. + * @param[in] sender LaunchApplicationRequestSender + */ +Result RequestToLaunchApplication(u64 application_id, AccountUid uid, const void* buffer, size_t size, u32 sender); + +/** + * @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. + * @note Only available on [11.0.0+]. + * @param[in] uid \ref AccountUid + * @param[in] application_id Optional ApplicationId, can be 0. + */ +Result RequestJumpToStory(AccountUid uid, u64 application_id); + +} // namespace libapplet + +/// @brief C++ wrappers for the `lp2p` API. +/// @details Wraps: switch/services/lp2p.h. +namespace lp2p { + +/// GroupId +using ::Lp2pGroupId; +/// GroupInfo +/// \ref lp2pScan only uses the following fields for the cmd input struct: supported_platform/priority, frequency/channel, and preshared_key_binary_size/preshared_key. +using ::Lp2pGroupInfo; +/// IpConfig. Only contains IPv4 addresses. +using ::Lp2pIpConfig; +/// MacAddress +using ::Lp2pMacAddress; +/// NodeInfo +using ::Lp2pNodeInfo; +/// ScanResult +using ::Lp2pScanResult; +using ::Lp2pServiceType; + +/// Initialize lp2p. +Result Initialize(Lp2pServiceType service_type); + +/// Exit lp2p. +void Exit(void); + +/// Gets the Service object for INetworkService. +Service* GetServiceSession_INetworkService(void); + +/// Gets the Service object for INetworkServiceMonitor. +Service* GetServiceSession_INetworkServiceMonitor(void); + +/** + * @brief Creates a default \ref Lp2pGroupInfo for use with \ref lp2pCreateGroup / \ref lp2pJoin. + * @param info \ref Lp2pGroupInfo + */ +void CreateGroupInfo(Lp2pGroupInfo *info); + +/** + * @brief Creates a default \ref Lp2pGroupInfo for use with \ref lp2pScan. + * @param info \ref Lp2pGroupInfo + */ +void CreateGroupInfoScan(Lp2pGroupInfo *info); + +/** + * @brief Sets Lp2pGroupInfo::service_name. + * @param info \ref Lp2pGroupInfo + * @param[in] name ServiceName / SSID. + */ +void GroupInfoSetServiceName(Lp2pGroupInfo *info, const char *name); + +/** + * @brief Sets Lp2pGroupInfo::flags_count and Lp2pGroupInfo::flags. + * @note The default is count=1 flags[0]=1, which is used by \ref lp2pCreateGroupInfo. [11.0.0+] To use standard WPA2-PSK, you can use flags[0]=0. + * @param info \ref Lp2pGroupInfo + * @param[in] flags Lp2pGroupInfo::flags + * @param[in] count Lp2pGroupInfo::flags_count + */ +void GroupInfoSetFlags(Lp2pGroupInfo *info, s8 *flags, size_t count); + +/** + * @brief Sets Lp2pGroupInfo::member_count_max. + * @param info \ref Lp2pGroupInfo + * @param[in] count MemberCountMax + */ +void GroupInfoSetMemberCountMax(Lp2pGroupInfo *info, size_t count); + +/** + * @brief Sets Lp2pGroupInfo::frequency and Lp2pGroupInfo::channel. + * @param info \ref Lp2pGroupInfo + * @param[in] frequency Lp2pGroupInfo::frequency + * @param[in] channel Lp2pGroupInfo::channel + */ +void GroupInfoSetFrequencyChannel(Lp2pGroupInfo *info, u16 frequency, s16 channel); + +/** + * @brief Sets Lp2pGroupInfo::stealth_enabled. + * @param info \ref Lp2pGroupInfo + * @param[in] flag Lp2pGroupInfo::stealth_enabled + */ +void GroupInfoSetStealthEnabled(Lp2pGroupInfo *info, bool flag); + +/** + * @brief Sets the PresharedKey for the specified \ref Lp2pGroupInfo. + * @note Using this is required before using the \ref Lp2pGroupInfo as input for any cmds, so that Lp2pGroupInfo::preshared_key_binary_size gets initialized. + * @note If standard WPA2-PSK is being used, use \ref lp2pGroupInfoSetPassphrase instead. + * @param info \ref Lp2pGroupInfo + * @param[in] key Data for the PresharedKey. + * @param[in] size Size to copy into the PresharedKey, max is 0x20. + */ +void GroupInfoSetPresharedKey(Lp2pGroupInfo *info, const void* key, size_t size); + +/** + * @brief Sets the passphrase, for when standard WPA2-PSK is being used. + * @note Configure standard WPA2-PSK usage via \ref lp2pGroupInfoSetFlags / Lp2pGroupInfo::security_type. + * @note Only available on [11.0.0+]. + * @param info \ref Lp2pGroupInfo + * @param[in] passphrase Passphrase string, the required length is 0x8-0x3F. + */ +Result GroupInfoSetPassphrase(Lp2pGroupInfo *info, const char *passphrase); + +/** + * @brief Scan + * @param[in] info \ref Lp2pGroupInfo + * @param[out] results Output array of \ref Lp2pScanResult. + * @param[in] count Size of the results array in entries. + * @param[out] total_out Total output entries. + */ +Result Scan(const Lp2pGroupInfo *info, Lp2pScanResult *results, s32 count, s32 *total_out); + +/** + * @brief CreateGroup + * @note The role (\ref lp2pGetRole) must be 0. This eventually sets the role to value 1. + * @param[in] info \ref Lp2pGroupInfo + */ +Result CreateGroup(const Lp2pGroupInfo *info); + +/** + * @brief This destroys the previously created group from \ref lp2pCreateGroup. + * @note If no group was previously created (role from \ref lp2pGetRole is not 1), this just returns 0. + */ +Result DestroyGroup(void); + +/** + * @brief SetAdvertiseData + * @note The role (\ref lp2pGetRole) must be <=1. + * @note An empty buffer (buffer=NULL/size=0) can be used to reset the AdvertiseData size in state to zero. + * @param[out] buffer Input buffer containing arbitrary user data. + * @param[in] size Input buffer size, must be <=0x80. + */ +Result SetAdvertiseData(const void* buffer, size_t size); + +/** + * @brief This sends an Action frame to the specified \ref Lp2pGroupId, with the specified destination \ref Lp2pMacAddress. + * @note The role (\ref lp2pGetRole) must be non-zero. + * @note The error from \ref lp2pGetNetworkInterfaceLastError will be returned if it's set. + * @note [11.0.0+] Lp2pGroupInfo::security_type must be value 2 (default encryption), otherwise an error is returned. + * @param[in] buffer Input buffer containing arbitrary user data. + * @param[in] size Input buffer size, must be <=0x400. + * @param[in] addr \ref Lp2pMacAddress, this can be a broadcast address. This must be non-zero. + * @param[in] group_id \ref Lp2pGroupId + * @param[in] frequency Must be >=1. See Lp2pGroupInfo::frequency. + * @param[in] channel Must be >=1. See Lp2pGroupInfo::channel. + * @param[in] flags Only bit0 is used: clear = block until the data can be sent, set = return error when the data can't be sent. + */ +Result SendToOtherGroup(const void* buffer, size_t size, Lp2pMacAddress addr, Lp2pGroupId group_id, s16 frequency, s16 channel, u32 flags); + +/** + * @brief This receives an Action frame. + * @note The role (\ref lp2pGetRole) must be non-zero. + * @note When data is not available, the error from \ref lp2pGetNetworkInterfaceLastError will be returned if it's set. + * @param[out] buffer Output buffer containing arbitrary user data. + * @param[in] size Output buffer size. + * @param[in] flags Only bit0 is used: clear = block until data is available, set = return error when data is not available. + * @param[in] addr \ref Lp2pMacAddress + * @param[in] unk0 Unknown + * @param[in] unk1 Unknown + * @param[out] out_size This is the original size used for copying to the output buffer, before it's clamped to the output-buffer size. + * @param[out] unk2 Unknown + */ +Result RecvFromOtherGroup(void* buffer, size_t size, u32 flags, Lp2pMacAddress *addr, u16 *unk0, s32 *unk1, u64 *out_size, s32 *unk2); + +/** + * @brief AddAcceptableGroupId + * @param[in] group_id \ref Lp2pGroupId + */ +Result AddAcceptableGroupId(Lp2pGroupId group_id); + +/** + * @brief RemoveAcceptableGroupId + */ +Result RemoveAcceptableGroupId(void); + +/** + * @brief AttachNetworkInterfaceStateChangeEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result AttachNetworkInterfaceStateChangeEvent(Event* out_event); + +/** + * @brief GetNetworkInterfaceLastError + */ +Result GetNetworkInterfaceLastError(void); + +/** + * @brief GetRole + * @param[out] out Output Role. + */ +Result GetRole(u8 *out); + +/** + * @brief GetAdvertiseData + * @note The role from \ref lp2pGetRole must be value 2. + * @param[out] buffer Output buffer data. + * @param[in] size Output buffer size. + * @param[out] transfer_size Size of the data copied into the buffer. + * @param[out] original_size Original size from state. + */ +Result GetAdvertiseData(void* buffer, size_t size, u16 *transfer_size, u16 *original_size); + +/** + * @brief GetAdvertiseData2 + * @note This is identical to \ref lp2pGetAdvertiseData except this doesn't run the role validation. + * @param[out] buffer Output buffer data. + * @param[in] size Output buffer size. + * @param[out] transfer_size Size of the data copied into the buffer. + * @param[out] original_size Original size from state. + */ +Result GetAdvertiseData2(void* buffer, size_t size, u16 *transfer_size, u16 *original_size); + +/** + * @brief GetGroupInfo + * @note The role from \ref lp2pGetRole must be non-zero. + * @param[out] out \ref Lp2pGroupInfo + */ +Result GetGroupInfo(Lp2pGroupInfo *out); + +/** + * @brief This runs the same code as \ref lp2pCreateGroup to generate the \ref Lp2pGroupInfo for the input struct. + * @param[out] out \ref Lp2pGroupInfo + * @param[in] info \ref Lp2pGroupInfo + */ +Result Join(Lp2pGroupInfo *out, const Lp2pGroupInfo *info); + +/** + * @brief GetGroupOwner + * @note The role from \ref lp2pGetRole must be non-zero. + * @param[out] out \ref Lp2pNodeInfo + */ +Result GetGroupOwner(Lp2pNodeInfo *out); + +/** + * @brief GetIpConfig + * @note The role from \ref lp2pGetRole must be non-zero. + * @param[out] out \ref Lp2pIpConfig + */ +Result GetIpConfig(Lp2pIpConfig *out); + +/** + * @brief Leave + * @param[out] out Output value. + */ +Result Leave(u32 *out); + +/** + * @brief AttachJoinEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result AttachJoinEvent(Event* out_event); + +/** + * @brief GetMembers + * @note The role from \ref lp2pGetRole must be value 1. + * @param[out] members Output array of \ref Lp2pNodeInfo. + * @param[in] count Size of the members array in entries. A maximum of 8 entries can be returned. + * @param[out] total_out Total output entries. + */ +Result GetMembers(Lp2pNodeInfo *members, s32 count, s32 *total_out); + +} // namespace lp2p + +/// @brief C++ wrappers for the `lr` API. +/// @details Wraps: switch/services/lr.h. +namespace lr { + +using ::LrLocationResolver; +using ::LrRegisteredLocationResolver; + +/// Initialize lr. +Result Initialize(void); + +/// Exit lr. +void Exit(void); + +/// Gets the Service object for the actual lr service session. +Service* GetServiceSession(void); + +Result OpenLocationResolver(NcmStorageId storage, LrLocationResolver* out); + +Result OpenRegisteredLocationResolver(LrRegisteredLocationResolver* out); + +Result LrResolveProgramPath(LrLocationResolver* lr, u64 tid, char *out); + +Result LrRedirectProgramPath(LrLocationResolver* lr, u64 tid, const char *path); + +Result LrResolveApplicationControlPath(LrLocationResolver* lr, u64 tid, char *out); + +Result LrResolveApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, char *out); + +Result LrResolveDataPath(LrLocationResolver* lr, u64 tid, char *out); + +Result LrRedirectApplicationControlPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path); + +Result LrRedirectApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path); + +Result LrResolveApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, char *out); + +Result LrRedirectApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path); + +Result LrRefresh(LrLocationResolver* lr); + +/// Only available on [5.0.0+]. +Result LrEraseProgramRedirection(LrLocationResolver* lr, u64 tid); + +Result RegLrResolveProgramPath(LrRegisteredLocationResolver* reg, u64 tid, char *out); + +} // namespace lr + +/// @brief C++ wrappers for the `mii` API. +/// @details Wraps: switch/applets/mii_la.h, switch/services/mii.h. +namespace mii { + +/// Mii age. +using ::MiiAge; +using ::MiiCharInfo; +using ::MiiCreateId; +using ::MiiDatabase; +/// Mii face color. +using ::MiiFaceColor; +/// Mii gender. +using ::MiiGender; +/// AppletInput +using ::MiiLaAppletInput; +/// AppletMode +using ::MiiLaAppletMode; +/// AppletOutput +using ::MiiLaAppletOutput; +/// AppletOutputForCharInfoEditing +using ::MiiLaAppletOutputForCharInfoEditing; +using ::MiiNfpStoreDataExtension; +using ::MiiServiceType; +using ::MiiSourceFlag; +using ::MiiSpecialKeyCode; +using ::MiiStoreData; +using ::MiiVer3StoreData; + +/** + * @brief Launches the applet for ShowMiiEdit. + * @param[in] special_key_code \ref MiiSpecialKeyCode + */ +Result LaShowMiiEdit(MiiSpecialKeyCode special_key_code); + +/** + * @brief Launches the applet for AppendMii. + * @param[in] special_key_code \ref MiiSpecialKeyCode + * @param[out] index Output Index. + */ +Result LaAppendMii(MiiSpecialKeyCode special_key_code, s32 *index); + +/** + * @brief Launches the applet for AppendMiiImage. + * @param[in] special_key_code \ref MiiSpecialKeyCode + * @param[in] valid_uuid_array Input array of Uuid. + * @param[in] count Total entries for the valid_uuid_array. Must be 0-8. + * @param[out] index Output Index. + */ +Result LaAppendMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, s32 *index); + +/** + * @brief Launches the applet for UpdateMiiImage. + * @param[in] special_key_code \ref MiiSpecialKeyCode + * @param[in] valid_uuid_array Input array of Uuid. + * @param[in] count Total entries for the valid_uuid_array. Must be 0-8. + * @param[in] used_uuid UsedUuid + * @param[out] index Output Index. + */ +Result LaUpdateMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, Uuid used_uuid, s32 *index); + +/** + * @brief Launches the applet for CreateMii. + * @note This creates a Mii and returns it, without saving it in the database. + * @note Only available on [10.2.0+]. + * @param[in] special_key_code \ref MiiSpecialKeyCode + * @param[out] out_char \ref MiiCharInfo + */ +Result LaCreateMii(MiiSpecialKeyCode special_key_code, MiiCharInfo *out_char); + +/** + * @brief Launches the applet for EditMii. + * @note This edits the specified Mii and returns it, without saving it in the database. + * @note Only available on [10.2.0+]. + * @param[in] special_key_code \ref MiiSpecialKeyCode + * @param[in] in_char \ref MiiCharInfo + * @param[out] out_char \ref MiiCharInfo + */ +Result LaEditMii(MiiSpecialKeyCode special_key_code, const MiiCharInfo *in_char, MiiCharInfo *out_char); + +/// Initialize mii. +Result Initialize(MiiServiceType service_type); + +/// Exit mii. +void Exit(void); + +/// Gets the Service object for the actual mii service session. +Service* GetServiceSession(void); + +/** + * @brief Opens a mii database. + * @param[in] key_code Mii key code filter. + * @param[out] out Database. + */ +Result OpenDatabase(MiiDatabase *out, MiiSpecialKeyCode key_code); + +/** + * @brief Returns whether the mii database is updated. + * @param[in] db Database. + * @param[in] flag Source flag. + * @param[out] out_updated Whether the mii database is updated. + */ +Result DatabaseIsUpdated(MiiDatabase *db, bool *out_updated, MiiSourceFlag flag); + +/** + * @brief Returns whether the mii database is full. + * @param[in] db Database. + * @param[out] out_full Whether the mii database is full. + */ +Result DatabaseIsFull(MiiDatabase *db, bool *out_full); + +/** + * @brief Returns number of miis in the database with the specified source flag. + * @param[in] db Database. + * @param[in] flag Source flag. + * @param[out] out_count Out mii count. + */ +Result DatabaseGetCount(MiiDatabase *db, s32 *out_count, MiiSourceFlag flag); + +/** + * @brief Reads mii charinfo data from the specified source flag. + * @param[in] db Database. + * @param[in] flag Source flag. + * @param[out] out_infos Output mii charinfo array. + * @param[in] count Number of mii chainfos to read. + * @param[out] total_out Number of mii charinfos which were actually read. + */ +Result DatabaseGet1(MiiDatabase *db, MiiSourceFlag flag, MiiCharInfo *out_infos, s32 count, s32 *total_out); + +/** + * @brief Generates a random mii charinfo (doesn't register it in the console database). + * @param[in] db Database. + * @param[in] age Mii's age. + * @param[in] gender Mii's gender. + * @param[in] face_color Mii's face color. + * @param[out] out_info Out mii charinfo data. + */ +Result DatabaseBuildRandom(MiiDatabase *db, MiiAge age, MiiGender gender, MiiFaceColor face_color, MiiCharInfo *out_info); + +/// Closes a mii database. +void DatabaseClose(MiiDatabase *db); + +} // namespace mii + +/// @brief C++ wrappers for the `miiimg` API. +/// @details Wraps: switch/services/miiimg.h. +namespace miiimg { + +/// Image attribute. +using ::MiiimgImageAttribute; +/// Image ID. +using ::MiiimgImageId; + +/// Initialize miiimg. +Result Initialize(void); + +/// Exit miiimg. +void Exit(void); + +/// Gets the Service object for the actual miiimg service session. +Service* GetServiceSession(void); + +/** + * @brief Reloads the image database. + */ +Result Reload(void); + +/** + * @brief Gets the number of mii images in the database. + * @param[out] out_count Mii image count. + */ +Result GetCount(s32 *out_count); + +/** + * @brief Gets whether the image database is empty. + * @param[out] out_empty Whether the database is empty. + */ +Result IsEmpty(bool *out_empty); + +/** + * @brief Gets whether the image database is full. + * @param[out] out_empty Whether the database is full. + */ +Result IsFull(bool *out_full); + +/** + * @brief Gets the image attribute for the specified image index. + * @param[in] index Image index. + * @param[out] out_attr Out image attribute. + */ +Result GetAttribute(s32 index, MiiimgImageAttribute *out_attr); + +/** + * @brief Loads the image data (raw RGBA8) for the specified image ID. + * @note Server doesn't seem to check the image buffer size, but 0x40000 is the optimal size. + * @param[in] id Input image ID. + * @param[out] out_image Out iamge buffer. + * @param[in] out_image_size Out image buffer size. + */ +Result LoadImage(MiiimgImageId id, void* out_image, size_t out_image_size); + +} // namespace miiimg + +/// @brief C++ wrappers for the `mmu` API. +/// @details Wraps: switch/services/mm.h. +namespace mmu { + +using ::MmuModuleId; +using ::MmuRequest; + +Result Initialize(void); + +void Exit(void); + +Service* GetServiceSession(void); + +Result RequestInitialize(MmuRequest *request, MmuModuleId module, u32 unk, bool autoclear); + +///< unk is ignored by official software +Result RequestFinalize(const MmuRequest *request); + +Result RequestGet(const MmuRequest *request, u32 *out_freq_hz); + +Result RequestSetAndWait(const MmuRequest *request, u32 freq_hz, s32 timeout); + +} // namespace mmu + +/// @brief C++ wrappers for the `mutex` API. +/// @details Wraps: switch/kernel/mutex.h. +namespace mutex { + +/// Mutex datatype, defined in newlib. +using ::Mutex; +/// Recursive mutex datatype, defined in newlib. +using ::RMutex; + +/** + * @brief Initializes a mutex. + * @param m Mutex object. + * @note A mutex can also be statically initialized by assigning 0 to it. + */ +void Init(Mutex* m); + +/** + * @brief Locks a mutex. + * @param m Mutex object. + */ +void Lock(Mutex* m); + +/** + * @brief Attempts to lock a mutex without waiting. + * @param m Mutex object. + * @return 1 if the mutex has been acquired successfully, and 0 on contention. + */ +bool TryLock(Mutex* m); + +/** + * @brief Unlocks a mutex. + * @param m Mutex object. + */ +void Unlock(Mutex* m); + +/** + * @brief Gets whether the current thread owns the mutex. + * @param m Mutex object. + * @return 1 if the mutex is locked by the current thread, and 0 otherwise. + */ +bool IsLockedByCurrentThread(const Mutex* m); + +} // namespace mutex + +/// @brief C++ wrappers for the `nacp` API. +/// @details Wraps: switch/nacp.h. +namespace nacp { + +/// ApplicationControlDataCondition +using ::NacpApplicationControlDataCondition; +/// ApplicationJitConfiguration +using ::NacpApplicationJitConfiguration; +/// ApplicationNeighborDetectionGroupConfiguration +using ::NacpApplicationNeighborDetectionGroupConfiguration; +/// Language entry. These strings are UTF-8. +using ::NacpLanguageEntry; +using ::NacpLanguageEntryData; +/// NeighborDetectionClientConfiguration +using ::NacpNeighborDetectionClientConfiguration; +/// ns ApplicationControlProperty +using ::NacpStruct; + +/// Get the NacpLanguageEntry from the input nacp corresponding to the current system language (this may fallback to other languages when needed). Output langentry is NULL if none found / content of entry is empty. +/// If you're using ns you may want to use \ref nsGetApplicationDesiredLanguage instead. +Result GetLanguageEntry(NacpStruct* nacp, NacpLanguageEntry** langentry); + +} // namespace nacp + +/// @brief C++ wrappers for the `ncm` API. +/// @details Wraps: switch/services/ncm.h, switch/services/ncm_types.h. +namespace ncm { + +/// AddOnContentMetaExtendedHeader [15.0.0+] +using ::NcmAddOnContentMetaExtendedHeader; +/// ApplicationContentMetaKey +using ::NcmApplicationContentMetaKey; +/// ApplicationMetaExtendedHeader +using ::NcmApplicationMetaExtendedHeader; +/// ContentId +using ::NcmContentId; +/// ContentInfo +using ::NcmContentInfo; +/// ContentInstallType +using ::NcmContentInstallType; +/// ContentMetaAttribute +using ::NcmContentMetaAttribute; +/// ContentMetaDatabase +using ::NcmContentMetaDatabase; +/// ContentMetaHeader +using ::NcmContentMetaHeader; +/// ContentMetaInfo +using ::NcmContentMetaInfo; +/// ContentMetaKey +using ::NcmContentMetaKey; +/// ContentMetaPlatform +using ::NcmContentMetaPlatform; +/// ContentMetaType +using ::NcmContentMetaType; +/// ContentStorage +using ::NcmContentStorage; +/// ContentType +using ::NcmContentType; +/// DataPatchMetaExtendedHeader +using ::NcmDataPatchMetaExtendedHeader; +/// LegacyAddOnContentMetaExtendedHeader [1.0.0-14.1.2] +using ::NcmLegacyAddOnContentMetaExtendedHeader; +/// PackagedContentInfo +using ::NcmPackagedContentInfo; +/// PatchMetaExtendedHeader +using ::NcmPatchMetaExtendedHeader; +/// PlaceHolderId +using ::NcmPlaceHolderId; +/// ProgramLocation +using ::NcmProgramLocation; +/// RightsId +using ::NcmRightsId; +/// StorageId +using ::NcmStorageId; +/// SystemUpdateMetaExtendedHeader +using ::NcmSystemUpdateMetaExtendedHeader; + +/// Initialize ncm. +Result Initialize(void); + +/// Exit ncm. +void Exit(void); + +/// Gets the Service object for the actual ncm service session. +Service* GetServiceSession(void); + +Result CreateContentStorage(NcmStorageId storage_id); + +Result CreateContentMetaDatabase(NcmStorageId storage_id); + +Result VerifyContentStorage(NcmStorageId storage_id); + +Result VerifyContentMetaDatabase(NcmStorageId storage_id); + +Result OpenContentStorage(NcmContentStorage* out_content_storage, NcmStorageId storage_id); + +Result OpenContentMetaDatabase(NcmContentMetaDatabase* out_content_meta_database, NcmStorageId storage_id); + +Result CloseContentStorageForcibly(NcmStorageId storage_id); + +///< [1.0.0] +Result CloseContentMetaDatabaseForcibly(NcmStorageId storage_id); + +///< [1.0.0] +Result CleanupContentMetaDatabase(NcmStorageId storage_id); + +Result ActivateContentStorage(NcmStorageId storage_id); + +///< [2.0.0+] +Result InactivateContentStorage(NcmStorageId storage_id); + +///< [2.0.0+] +Result ActivateContentMetaDatabase(NcmStorageId storage_id); + +///< [2.0.0+] +Result InactivateContentMetaDatabase(NcmStorageId storage_id); + +///< [2.0.0+] +Result InvalidateRightsIdCache(void); + +///< [9.0.0+] +Result ActivateFsContentStorage(FsContentStorageId fs_storage_id); + +///< [16.0.0+] +void ContentStorageClose(NcmContentStorage* cs); + +Result ContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmPlaceHolderId* out_id); + +Result ContentStorageCreatePlaceHolder(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id, s64 size); + +Result ContentStorageDeletePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id); + +Result ContentStorageHasPlaceHolder(NcmContentStorage* cs, bool* out, const NcmPlaceHolderId* placeholder_id); + +Result ContentStorageWritePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, u64 offset, const void* data, size_t data_size); + +Result ContentStorageRegister(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id); + +Result ContentStorageDelete(NcmContentStorage* cs, const NcmContentId* content_id); + +Result ContentStorageHas(NcmContentStorage* cs, bool* out, const NcmContentId* content_id); + +Result ContentStorageGetPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmContentId* content_id); + +Result ContentStorageGetPlaceHolderPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmPlaceHolderId* placeholder_id); + +Result ContentStorageCleanupAllPlaceHolder(NcmContentStorage* cs); + +Result ContentStorageListPlaceHolder(NcmContentStorage* cs, NcmPlaceHolderId* out_ids, s32 count, s32* out_count); + +Result ContentStorageGetContentCount(NcmContentStorage* cs, s32* out_count); + +Result ContentStorageListContentId(NcmContentStorage* cs, NcmContentId* out_ids, s32 count, s32* out_count, s32 start_offset); + +Result ContentStorageGetSizeFromContentId(NcmContentStorage* cs, s64* out_size, const NcmContentId* content_id); + +Result ContentStorageDisableForcibly(NcmContentStorage* cs); + +Result ContentStorageRevertToPlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, const NcmContentId* old_content_id, const NcmContentId* new_content_id); + +///< [2.0.0+] +Result ContentStorageSetPlaceHolderSize(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, s64 size); + +///< [2.0.0+] +Result ContentStorageReadContentIdFile(NcmContentStorage* cs, void* out_data, size_t out_data_size, const NcmContentId* content_id, s64 offset); + +///< [2.0.0+] +Result ContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, FsContentAttributes attr); + +///< [2.0.0+] +Result ContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmContentId* content_id, FsContentAttributes attr); + +///< [2.0.0+] +Result ContentStorageWriteContentForDebug(NcmContentStorage* cs, const NcmContentId* content_id, s64 offset, const void* data, size_t data_size); + +///< [2.0.0+] +Result ContentStorageGetFreeSpaceSize(NcmContentStorage* cs, s64* out_size); + +///< [2.0.0+] +Result ContentStorageGetTotalSpaceSize(NcmContentStorage* cs, s64* out_size); + +///< [2.0.0+] +Result ContentStorageFlushPlaceHolder(NcmContentStorage* cs); + +///< [3.0.0+] +Result ContentStorageGetSizeFromPlaceHolderId(NcmContentStorage* cs, s64* out_size, const NcmPlaceHolderId* placeholder_id); + +///< [4.0.0+] +Result ContentStorageRepairInvalidFileAttribute(NcmContentStorage* cs); + +///< [4.0.0+] +Result ContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, const NcmContentId* cache_content_id, FsContentAttributes attr); + +///< [8.0.0+] +Result ContentStorageRegisterPath(NcmContentStorage* cs, const NcmContentId* content_id, const char *path); + +///< [13.0.0+] +Result ContentStorageClearRegisteredPath(NcmContentStorage* cs); + +///< [13.0.0+] +Result ContentStorageGetProgramId(NcmContentStorage* cs, u64* out, const NcmContentId* content_id, FsContentAttributes attr); + +///< [17.0.0+] +void ContentMetaDatabaseClose(NcmContentMetaDatabase* db); + +Result ContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, const void* data, u64 data_size); + +Result ContentMetaDatabaseGet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u64* out_size, void* out_data, u64 out_data_size); + +Result ContentMetaDatabaseRemove(NcmContentMetaDatabase* db, const NcmContentMetaKey *key); + +Result ContentMetaDatabaseGetContentIdByType(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type); + +Result ContentMetaDatabaseListContentInfo(NcmContentMetaDatabase* db, s32* out_entries_written, NcmContentInfo* out_info, s32 count, const NcmContentMetaKey* key, s32 start_index); + +Result ContentMetaDatabaseList(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type, u64 id, u64 id_min, u64 id_max, NcmContentInstallType install_type); + +Result ContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, NcmContentMetaKey* out_key, u64 id); + +Result ContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmApplicationContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type); + +Result ContentMetaDatabaseHas(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key); + +Result ContentMetaDatabaseHasAll(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* keys, s32 count); + +Result ContentMetaDatabaseGetSize(NcmContentMetaDatabase* db, u64* out_size, const NcmContentMetaKey* key); + +Result ContentMetaDatabaseGetRequiredSystemVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key); + +Result ContentMetaDatabaseGetPatchContentMetaId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key); + +Result ContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db); + +Result ContentMetaDatabaseLookupOrphanContent(NcmContentMetaDatabase* db, bool* out_orphaned, const NcmContentId* content_ids, s32 count); + +Result ContentMetaDatabaseCommit(NcmContentMetaDatabase* db); + +Result ContentMetaDatabaseHasContent(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key, const NcmContentId* content_id); + +Result ContentMetaDatabaseListContentMetaInfo(NcmContentMetaDatabase* db, s32* out_entries_written, void* out_meta_info, s32 count, const NcmContentMetaKey* key, s32 start_index); + +Result ContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u8* out); + +Result ContentMetaDatabaseGetRequiredApplicationVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key); + +///< [2.0.0+] +Result ContentMetaDatabaseGetContentIdByTypeAndIdOffset(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type, u8 id_offset); + +///< [5.0.0+] +Result ContentMetaDatabaseGetPlatform(NcmContentMetaDatabase* db, u8* out, const NcmContentMetaKey* key); + +/** + * @brief Retrieves the content size from a \ref NcmContentInfo struct. + * @param[in] info Pointer to \ref NcmContentInfo struct. + * @param[out] out Output size. + */ +void ContentInfoSizeToU64(const NcmContentInfo *info, u64 *out); + +/** + * @brief Updates the content size from a \ref NcmContentInfo struct. + * @param[in] size Input size. + * @param[out] out Pointer to \ref NcmContentInfo struct. + */ +void U64ToContentInfoSize(const u64 size, NcmContentInfo *info); + +} // namespace ncm + +/// @brief C++ wrappers for the `news` API. +/// @details Wraps: switch/services/news.h. +namespace news { + +using ::NewsDatabaseService; +using ::NewsDataService; +using ::NewsNewlyArrivedEventHolder; +using ::NewsOverwriteEventHolder; +using ::NewsRecord; +using ::NewsRecordV1; +using ::NewsServiceType; +using ::NewsTopicName; + +Result Initialize(NewsServiceType service_type); + +void Exit(void); + +Service * GetServiceSession(void); + +Result CreateNewlyArrivedEventHolder(NewsNewlyArrivedEventHolder *out); + +Result CreateNewsDataService(NewsDataService *out); + +Result CreateNewsDatabaseService(NewsDatabaseService *out); + +Result CreateOverwriteEventHolder(NewsOverwriteEventHolder *out); + +///< [2.0.0+] +Result PostLocalNews(const void *news, size_t size); + +Result SetPassphrase(u64 program_id, const char *passphrase); + +Result GetSubscriptionStatus(const char *filter, u32 *status); + +Result GetTopicList(u32 channel, u32 *out_count, NewsTopicName *out, u32 max_count); + +///< [3.0.0+] +Result GetSavedataUsage(u64 *current, u64 *total); + +///< [6.0.0+] +Result IsSystemUpdateRequired(bool *out); + +Result GetDatabaseVersion(u32 *version); + +///< [10.0.0+] +Result RequestImmediateReception(const char *filter); + +Result SetSubscriptionStatus(const char *filter, u32 status); + +Result ClearStorage(void); + +Result ClearSubscriptionStatusAll(void); + +Result GetNewsDatabaseDump(void *buffer, u64 size, u64 *out); + +void NewlyArrivedEventHolderClose(NewsNewlyArrivedEventHolder *srv); + +Result NewlyArrivedEventHolderGet(NewsNewlyArrivedEventHolder *srv, Event *out); + +void DataClose(NewsDataService *srv); + +Result DataOpen(NewsDataService *srv, const char *file_name); + +Result DataOpenWithNewsRecordV1(NewsDataService *srv, NewsRecordV1 *record); + +Result DataRead(NewsDataService *srv, u64 *bytes_read, u64 offset, void *out, size_t out_size); + +Result DataGetSize(NewsDataService *srv, u64 *size); + +Result DataOpenWithNewsRecord(NewsDataService *srv, NewsRecord *record); + +///< [6.0.0+] +void DatabaseClose(NewsDatabaseService *srv); + +Result DatabaseGetListV1(NewsDatabaseService *srv, NewsRecordV1 *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset); + +Result DatabaseCount(NewsDatabaseService *srv, const char *filter, u32 *count); + +Result DatabaseGetList(NewsDatabaseService *srv, NewsRecord *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset); + +///< [6.0.0+] +void OverwriteEventHolderClose(NewsOverwriteEventHolder *srv); + +Result OverwriteEventHolderGet(NewsOverwriteEventHolder *srv, Event *out); + +} // namespace news + +/// @brief C++ wrappers for the `nfc` API. +/// @details Wraps: switch/services/nfc.h. +namespace nfc { + +/// Nfc/Nfp DeviceHandle +using ::NfcDeviceHandle; +using ::NfcDeviceState; +using ::NfcMifareCommand; +using ::NfcMifareDeviceState; +using ::NfcMifareReadBlockData; +using ::NfcMifareReadBlockParameter; +using ::NfcMifareWriteBlockParameter; +using ::NfcProtocol; +using ::NfcRequiredMcuVersionData; +using ::NfcSectorKey; +/// NfcServiceType +using ::NfcServiceType; +using ::NfcState; +using ::NfcTagInfo; +using ::NfcTagType; +using ::NfcTagUid; +using ::NfpAdminInfo; +using ::NfpAmiiboFlag; +using ::NfpApplicationAreaVersion; +using ::NfpBreakType; +using ::NfpCommonInfo; +using ::NfpData; +using ::NfpDate; +using ::NfpDeviceState; +using ::NfpDeviceType; +using ::NfpModelInfo; +using ::NfpMountTarget; +using ::NfpRegisterInfo; +using ::NfpRegisterInfoPrivate; +/// NfpServiceType +using ::NfpServiceType; +using ::NfpTagInfo; + +/// Initialize nfc:*. +Result Initialize(NfcServiceType service_type); + +/// Exit nfc:*. +void Exit(void); + +/// Initialize nfc:mf:u. +Result MfInitialize(void); + +/// Exit nfc:mf:u. +void MfExit(void); + +/// Gets the Service object for the actual nfc:* service session. +Service* GetServiceSession(void); + +/// Gets the Service object for the interface from nfc:*. +Service* GetServiceSession_Interface(void); + +/// Gets the Service object for the actual nfc:mf:u service session. +Service* MfGetServiceSession(void); + +/// Gets the Service object for the interface from nfc:mf:u. +Service* MfGetServiceSession_Interface(void); + +/// Only available with [4.0.0+]. +Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count); + +/// Only available with [4.0.0+]. +Result StartDetection(const NfcDeviceHandle *handle, NfcProtocol protocol); + +/// Only available with [4.0.0+]. +Result StopDetection(const NfcDeviceHandle *handle); + +Result MfListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count); + +Result MfStartDetection(const NfcDeviceHandle *handle); + +Result MfStopDetection(const NfcDeviceHandle *handle); + +/// Only available with [4.0.0+]. +Result GetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out); + +Result MfGetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out); + +/// Returned event will have autoclear off. +/// Only available with [4.0.0+]. +Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event); + +/// Returned event will have autoclear off. +/// Only available with [4.0.0+]. +Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event); + +/// Returned event will have autoclear off. +Result MfAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event); + +/// Returned event will have autoclear off. +Result MfAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event); + +/// Only available with [4.0.0+]. +Result GetState(NfcState *out); + +/// Only available with [4.0.0+]. +Result GetDeviceState(const NfcDeviceHandle *handle, NfcDeviceState *out); + +/// Only available with [4.0.0+]. +Result GetNpadId(const NfcDeviceHandle *handle, u32 *out); + +Result MfGetState(NfcState *out); + +Result MfGetDeviceState(const NfcDeviceHandle *handle, NfcMifareDeviceState *out); + +Result MfGetNpadId(const NfcDeviceHandle *handle, u32 *out); + +/// Returned event will have autoclear on. +/// Only available with [4.0.0+]. +Result AttachAvailabilityChangeEvent(Event *out_event); + +/// Returned event will have autoclear on. +Result MfAttachAvailabilityChangeEvent(Event *out_event); + +/// This uses nfc:*. +Result IsNfcEnabled(bool *out); + +/// Only available with [4.0.0+]. +Result ReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count); + +/// Only available with [4.0.0+]. +Result WriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count); + +Result MfReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count); + +Result MfWriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count); + +/// Only available with [4.0.0+]. +Result SendCommandByPassThrough(const NfcDeviceHandle *handle, u64 timeout, const void* cmd_buf, size_t cmd_buf_size, void* reply_buf, size_t reply_buf_size, u64 *out_size); + +/// Only available with [4.0.0+]. +Result KeepPassThroughSession(const NfcDeviceHandle *handle); + +/// Only available with [4.0.0+]. +Result ReleasePassThroughSession(const NfcDeviceHandle *handle); + +} // namespace nfc + +/// @brief C++ wrappers for the `nfp` API. +/// @details Wraps: switch/applets/nfp_la.h, switch/services/nfc.h. +namespace nfp { + +/// Nfc/Nfp DeviceHandle +using ::NfcDeviceHandle; +using ::NfcDeviceState; +using ::NfcMifareCommand; +using ::NfcMifareDeviceState; +using ::NfcMifareReadBlockData; +using ::NfcMifareReadBlockParameter; +using ::NfcMifareWriteBlockParameter; +using ::NfcProtocol; +using ::NfcRequiredMcuVersionData; +using ::NfcSectorKey; +/// NfcServiceType +using ::NfcServiceType; +using ::NfcState; +using ::NfcTagInfo; +using ::NfcTagType; +using ::NfcTagUid; +using ::NfpAdminInfo; +using ::NfpAmiiboFlag; +using ::NfpApplicationAreaVersion; +using ::NfpBreakType; +using ::NfpCommonInfo; +using ::NfpData; +using ::NfpDate; +using ::NfpDeviceState; +using ::NfpDeviceType; +/// AmiiboSettingsStartParam +using ::NfpLaAmiiboSettingsStartParam; +/// ReturnValueForAmiiboSettings +using ::NfpLaReturnValueForAmiiboSettings; +/// StartParamForAmiiboSettings +using ::NfpLaStartParamForAmiiboSettings; +/// Values for NfpLaStartParamForAmiiboSettings::type. +using ::NfpLaStartParamTypeForAmiiboSettings; +using ::NfpModelInfo; +using ::NfpMountTarget; +using ::NfpRegisterInfo; +using ::NfpRegisterInfoPrivate; +/// NfpServiceType +using ::NfpServiceType; +using ::NfpTagInfo; + +/** + * @brief Launches the applet for NicknameAndOwnerSettings. + * @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time. + * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam + * @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo. + * @param[in] in_reg_info \ref NfpRegisterInfo. Optional, can be NULL. If specified, this sets the \ref NfpRegisterInfo which will be used for writing, with an option for the user to change it. + * @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL. + * @param[out] handle \ref NfcDeviceHandle + * @param[out] reg_info_flag Flag indicating whether the data for out_reg_info is set. Optional, can be NULL. + * @param[out] out_reg_info \ref NfpRegisterInfo, see reg_info_flag. Optional, can be NULL. + */ +Result LaStartNicknameAndOwnerSettings(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, const NfpRegisterInfo *in_reg_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle, bool *reg_info_flag, NfpRegisterInfo *out_reg_info); + +/** + * @brief Launches the applet for GameDataEraser. + * @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time. + * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam + * @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo. + * @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL. + * @param[out] handle \ref NfcDeviceHandle + */ +Result LaStartGameDataEraser(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle); + +/** + * @brief Launches the applet for Restorer. + * @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time. + * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam + * @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo. + * @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL. + * @param[out] handle \ref NfcDeviceHandle + */ +Result LaStartRestorer(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle); + +/** + * @brief Launches the applet for Formatter. + * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam + * @param[out] out_tag_info \ref NfpTagInfo + * @param[out] handle \ref NfcDeviceHandle + */ +Result LaStartFormatter(const NfpLaAmiiboSettingsStartParam *in_param, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle); + +/// Initialize nfp:*. +Result Initialize(NfpServiceType service_type); + +/// Exit nfp:*. +void Exit(void); + +/// Gets the Service object for the actual nfp:* service session. +Service* GetServiceSession(void); + +/// Gets the Service object for the interface from nfp:*. +Service* GetServiceSession_Interface(void); + +Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count); + +Result StartDetection(const NfcDeviceHandle *handle); + +Result StopDetection(const NfcDeviceHandle *handle); + +Result Mount(const NfcDeviceHandle *handle, NfpDeviceType device_type, NfpMountTarget mount_target); + +Result Unmount(const NfcDeviceHandle *handle); + +/// Not available with ::NfpServiceType_System. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result OpenApplicationArea(const NfcDeviceHandle *handle, u32 app_id); + +/// Not available with ::NfpServiceType_System. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened. +Result GetApplicationArea(const NfcDeviceHandle *handle, void* buf, size_t buf_size, u32 *out_size); + +/// Not available with ::NfpServiceType_System. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened. +Result SetApplicationArea(const NfcDeviceHandle *handle, const void* buf, size_t buf_size); + +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result Flush(const NfcDeviceHandle *handle); + +Result Restore(const NfcDeviceHandle *handle); + +/// Not available with ::NfpServiceType_System. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result CreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size); + +/// Not available with ::NfpServiceType_System. +/// Only available with [3.0.0+]. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened. +Result RecreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size); + +/// Not available with ::NfpServiceType_System. +Result GetApplicationAreaSize(const NfcDeviceHandle *handle, u32 *out_app_area_size); + +/// Not available with ::NfpServiceType_User. +Result DeleteApplicationArea(const NfcDeviceHandle *handle); + +/// Not available with ::NfpServiceType_User. +Result ExistsApplicationArea(const NfcDeviceHandle *handle, bool *out); + +Result GetTagInfo(const NfcDeviceHandle *handle, NfpTagInfo *out); + +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result GetRegisterInfo(const NfcDeviceHandle *handle, NfpRegisterInfo *out); + +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result GetCommonInfo(const NfcDeviceHandle *handle, NfpCommonInfo *out); + +/// Requires the amiibo to be mounted with ::NfpMountTarget_Rom. +Result GetModelInfo(const NfcDeviceHandle *handle, NfpModelInfo *out); + +/// Not available with ::NfpServiceType_User. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result GetAdminInfo(const NfcDeviceHandle *handle, NfpAdminInfo *out); + +/// Returned event will have autoclear off. +Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event); + +/// Returned event will have autoclear off. +Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event); + +Result GetState(NfcState *out); + +Result GetDeviceState(const NfcDeviceHandle *handle, NfpDeviceState *out); + +Result GetNpadId(const NfcDeviceHandle *handle, u32 *out); + +/// Returned event will have autoclear on. +/// Only available with [3.0.0+]. +Result AttachAvailabilityChangeEvent(Event *out_event); + +/// Not available with ::NfpServiceType_User. +Result Format(const NfcDeviceHandle *handle); + +/// Not available with ::NfpServiceType_User. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result GetRegisterInfoPrivate(const NfcDeviceHandle *handle, NfpRegisterInfoPrivate *out); + +/// Not available with ::NfpServiceType_User. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result SetRegisterInfoPrivate(const NfcDeviceHandle *handle, const NfpRegisterInfoPrivate *register_info_private); + +/// Not available with ::NfpServiceType_User. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result DeleteRegisterInfo(const NfcDeviceHandle *handle); + +/// Only available with ::NfpServiceType_Debug. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result GetAll(const NfcDeviceHandle *handle, NfpData *out); + +/// Only available with ::NfpServiceType_Debug. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result SetAll(const NfcDeviceHandle *handle, const NfpData *nfp_data); + +/// Only available with ::NfpServiceType_Debug. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result FlushDebug(const NfcDeviceHandle *handle); + +/// Only available with ::NfpServiceType_Debug. +/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. +Result BreakTag(const NfcDeviceHandle *handle, NfpBreakType break_type); + +/// Only available with ::NfpServiceType_Debug. +Result ReadBackupData(const NfcDeviceHandle *handle, void* out_buf, size_t buf_size, u32 *out_size); + +/// Only available with ::NfpServiceType_Debug. +Result WriteBackupData(const NfcDeviceHandle *handle, const void* buf, size_t buf_size); + +/// Only available with ::NfpServiceType_Debug. +Result WriteNtf(const NfcDeviceHandle *handle, u32 write_type, const void* buf, size_t buf_size); + +} // namespace nfp + +/// @brief C++ wrappers for the `nifm` API. +/// @details Wraps: switch/applets/nifm_la.h, switch/services/nifm.h. +namespace nifm { + +/// Authentication +using ::NifmAuthentication; +/// ClientId +using ::NifmClientId; +/// DnsSetting +using ::NifmDnsSetting; +/// Encryption +using ::NifmEncryption; +using ::NifmInternetConnectionStatus; +using ::NifmInternetConnectionType; +/// IpAddressSetting +using ::NifmIpAddressSetting; +/// IpSettingData +using ::NifmIpSettingData; +/// IpV4Address +using ::NifmIpV4Address; +/// NetworkProfileBasicInfo. Converted from/to \ref NifmSfNetworkProfileBasicInfo. +using ::NifmNetworkProfileBasicInfo; +/// NetworkProfileData. Converted from/to \ref NifmSfNetworkProfileData. +using ::NifmNetworkProfileData; +using ::NifmNetworkProfileType; +/// ProxySetting +using ::NifmProxySetting; +/// Request +using ::NifmRequest; +using ::NifmRequestState; +using ::NifmServiceType; +/// SfNetworkProfileBasicInfo. Converted from/to \ref NifmNetworkProfileBasicInfo. +using ::NifmSfNetworkProfileBasicInfo; +/// SfNetworkProfileData. Converted to/from \ref NifmNetworkProfileData. +using ::NifmSfNetworkProfileData; +/// SfWirelessSettingData +using ::NifmSfWirelessSettingData; +/// WirelessSettingData +using ::NifmWirelessSettingData; + +/** + * @brief Uses \ref nifmGetResult, then on failure launches the applet. + * @param r \ref NifmRequest + */ +Result LaHandleNetworkRequestResult(NifmRequest* r); + +/// Initialize nifm. This is used automatically by gethostid(). +Result Initialize(NifmServiceType service_type); + +/// Exit nifm. This is used automatically by gethostid(). +void Exit(void); + +/// Gets the Service object for the actual nifm:* service session. +Service* GetServiceSession_StaticService(void); + +/// Gets the Service object for IGeneralService. +Service* GetServiceSession_GeneralService(void); + +/** + * @brief GetClientId + */ +NifmClientId GetClientId(void); + +/** + * @brief CreateRequest + * @param[out] r \ref NifmRequest + * @param[in] autoclear Event autoclear to use for NifmRequest::event1, a default of true can be used for this. + */ +Result CreateRequest(NifmRequest* r, bool autoclear); + +/** + * @brief GetCurrentNetworkProfile + * @param[out] profile \ref NifmNetworkProfileData + */ +Result GetCurrentNetworkProfile(NifmNetworkProfileData *profile); + +/** + * @brief Returns saved network profiles + * @note NifmServiceType User and System have access only to NifmNetworkProfileType_User + * @param[in] type \ref NifmNetworkProfileType + * @param[out] buffer \ref NifmNetworkProfileBasicInfo + * @param[in] max_entries How many \ref NifmNetworkProfileBasicInfo can fit into buffer + * @param[out] total_entries How many \ref NifmNetworkProfileBasicInfo is available + */ +Result EnumerateNetworkProfiles(NifmNetworkProfileType type, NifmNetworkProfileBasicInfo* buffer, s32 max_entries, s32* total_entries); + +/** + * @brief GetNetworkProfile + * @param[in] uuid Uuid + * @param[out] profile \ref NifmNetworkProfileData + */ +Result GetNetworkProfile(Uuid uuid, NifmNetworkProfileData *profile); + +/** + * @brief SetNetworkProfile + * @note Only available with ::NifmServiceType_Admin. + * @param[in] profile \ref NifmNetworkProfileData + * @param[out] uuid Uuid + */ +Result SetNetworkProfile(const NifmNetworkProfileData *profile, Uuid *uuid); + +/** + * @brief GetCurrentIpAddress + * @param[out] out IPv4 address (struct in_addr). + */ +Result GetCurrentIpAddress(u32* out); + +/** + * @brief GetCurrentIpConfigInfo + * @param[out] current_addr Same as \ref nifmGetCurrentIpAddress output. + * @param[out] subnet_mask Subnet Mask (struct in_addr). + * @param[out] gateway Gateway (struct in_addr). + * @param[out] primary_dns_server Primary DNS server IPv4 address (struct in_addr). + * @param[out] secondary_dns_server Secondary DNS server IPv4 address (struct in_addr). + */ +Result GetCurrentIpConfigInfo(u32 *current_addr, u32 *subnet_mask, u32 *gateway, u32 *primary_dns_server, u32 *secondary_dns_server); + +/** + * @note Works only if called from nifm:a or nifm:s. + */ +Result SetWirelessCommunicationEnabled(bool enable); + +Result IsWirelessCommunicationEnabled(bool* out); + +/** + * @note Will fail with 0xd46ed if Internet is neither connecting or connected (airplane mode or no known network in reach). + * @param wifiStrength Strength of the Wi-Fi signal in number of bars from 0 to 3. + */ +Result GetInternetConnectionStatus(NifmInternetConnectionType* connectionType, u32* wifiStrength, NifmInternetConnectionStatus* connectionStatus); + +Result IsEthernetCommunicationEnabled(bool* out); + +/** + * @brief IsAnyInternetRequestAccepted + * @param[in] id \ref NifmClientId + */ +bool IsAnyInternetRequestAccepted(NifmClientId id); + +Result IsAnyForegroundRequestAccepted(bool* out); + +Result PutToSleep(void); + +Result WakeUp(void); + +/** + * @brief SetWowlDelayedWakeTime + * @note Only available with ::NifmServiceType_System or ::NifmServiceType_Admin. + * @note Only available on [9.0.0+]. + * @param[in] val Input value. + */ +Result SetWowlDelayedWakeTime(s32 val); + +/** + * @brief Close a \ref NifmRequest. + * @param r \ref NifmRequest + */ +void RequestClose(NifmRequest* r); + +/** + * @brief GetRequestState + * @param r \ref NifmRequest + * @param[out] out \ref NifmRequestState + */ +Result GetRequestState(NifmRequest* r, NifmRequestState *out); + +/** + * @brief GetResult + * @param r \ref NifmRequest + */ +Result GetResult(NifmRequest* r); + +/** + * @brief Cancel + * @param r \ref NifmRequest + */ +Result RequestCancel(NifmRequest* r); + +/** + * @brief Submit + * @param r \ref NifmRequest + */ +Result RequestSubmit(NifmRequest* r); + +/** + * @brief SubmitAndWait + * @param r \ref NifmRequest + */ +Result RequestSubmitAndWait(NifmRequest* r); + +/** + * @brief GetAppletInfo + * @note This is used by \ref nifmLaHandleNetworkRequestResult. + * @param r \ref NifmRequest + * @param[in] theme_color ThemeColor + * @param[out] buffer Output buffer for storage data. + * @param[in] size Output buffer size. + * @param[out] applet_id \ref AppletId + * @param[out] mode \ref LibAppletMode + * @param[out] out_size Total data size written to the output buffer. + */ +Result RequestGetAppletInfo(NifmRequest* r, u32 theme_color, void* buffer, size_t size, u32 *applet_id, u32 *mode, u32 *out_size); + +/** + * @brief SetKeptInSleep + * @note Only available on [3.0.0+]. + * @note ::NifmRequestState must be ::NifmRequestState_Unknown1. + * @param r \ref NifmRequest + * @param[in] flag Flag + */ +Result RequestSetKeptInSleep(NifmRequest* r, bool flag); + +/** + * @brief RegisterSocketDescriptor. Only 1 socket can be registered at a time with a NifmRequest. Do not use directly, use \ref socketNifmRequestRegisterSocketDescriptor instead. + * @note Only available on [3.0.0+]. + * @note ::NifmRequestState must be ::NifmRequestState_Available. + * @param r \ref NifmRequest + * @param[in] sockfd Socket fd + */ +Result RequestRegisterSocketDescriptor(NifmRequest* r, int sockfd); + +/** + * @brief UnregisterSocketDescriptor. Do not use directly, use \ref socketNifmRequestUnregisterSocketDescriptor instead. + * @note Only available on [3.0.0+]. + * @note ::NifmRequestState must be ::NifmRequestState_Available. + * @param r \ref NifmRequest + * @param[in] sockfd Socket fd, must match the fd previously registered with \ref nifmRequestRegisterSocketDescriptor. + */ +Result RequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd); + +/** + * @brief SetNetworkProfileId + * @param r \ref NifmRequest + * @param[in] uuid Uuid + */ +Result RequestSetNetworkProfileId(NifmRequest* r, Uuid uuid); + +} // namespace nifm + +/// @brief C++ wrappers for the `nim` API. +/// @details Wraps: switch/services/nim.h. +namespace nim { + +/// SystemUpdateTaskId +using ::NimSystemUpdateTaskId; + +/// Initialize nim. +Result Initialize(void); + +/// Exit nim. +void Exit(void); + +/// Gets the Service object for the actual nim service session. +Service* GetServiceSession(void); + +Result ListSystemUpdateTask(s32 *out_count, NimSystemUpdateTaskId *out_task_ids, size_t max_task_ids); + +Result DestroySystemUpdateTask(const NimSystemUpdateTaskId *task_id); + +} // namespace nim + +/// @brief C++ wrappers for the `notif` API. +/// @details Wraps: switch/services/notif.h. +namespace notif { + +/// AlarmSetting +using ::NotifAlarmSetting; +/// Data extracted from NotifWeeklyScheduleAlarmSetting::settings. This uses local-time. +using ::NotifAlarmTime; +/// ServiceType for \ref notifInitialize. +using ::NotifServiceType; +/// WeeklyScheduleAlarmSetting +using ::NotifWeeklyScheduleAlarmSetting; + +/// Initialize notif. Only available on [9.0.0+]. +Result Initialize(NotifServiceType service_type); + +/// Exit notif. +void Exit(void); + +/// Gets the Service object for the actual notif:* service session. +Service* GetServiceSession(void); + +/** + * @brief Creates a \ref NotifAlarmSetting. + * @note This clears the struct, with all schedule settings set the same as \ref notifAlarmSettingDisable. + * @param[out] alarm_setting \ref NotifAlarmSetting + */ +void AlarmSettingCreate(NotifAlarmSetting *alarm_setting); + +/** + * @brief Sets whether the \ref NotifAlarmSetting is muted. + * @note By default (\ref notifAlarmSettingCreate) this is false. + * @param alarm_setting \ref NotifAlarmSetting + * @param[in] flag Whether the alarm is muted (true = Alarm turned off, false = on). + */ +void AlarmSettingSetIsMuted(NotifAlarmSetting *alarm_setting, bool flag); + +/** + * @brief Sets the \ref AccountUid for the \ref NotifAlarmSetting, see NotifAlarmSetting::uid. + * @param alarm_setting \ref NotifAlarmSetting + * @param[in] uid \ref AccountUid. If want to clear the uid after it was previously set, you can use an all-zero uid to reset to the default (\ref notifAlarmSettingCreate). + */ +void AlarmSettingSetUid(NotifAlarmSetting *alarm_setting, AccountUid uid); + +/** + * @brief Gets whether the schedule setting for the specified day_of_week is enabled, for the \ref NotifAlarmSetting. + * @param alarm_setting \ref NotifAlarmSetting + * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). + * @param[out] out Whether the setting is enabled. + */ +Result AlarmSettingIsEnabled(NotifAlarmSetting *alarm_setting, u32 day_of_week, bool *out); + +/** + * @brief Gets the schedule setting for the specified day_of_week, for the \ref NotifAlarmSetting. + * @note Should not be used if the output from \ref notifAlarmSettingIsEnabled is false. + * @param alarm_setting \ref NotifAlarmSetting + * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). + * @param[out] out \ref NotifAlarmTime + */ +Result AlarmSettingGet(NotifAlarmSetting *alarm_setting, u32 day_of_week, NotifAlarmTime *out); + +/** + * @brief Enables the schedule setting for the specified day_of_week, for the \ref NotifAlarmSetting. This uses local-time. + * @param alarm_setting \ref NotifAlarmSetting + * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). + * @param[in] hour Hour. + * @param[in] minute Minute. + */ +Result AlarmSettingEnable(NotifAlarmSetting *alarm_setting, u32 day_of_week, s32 hour, s32 minute); + +/** + * @brief Disables the schedule setting for the specified day_of_week, for the \ref NotifAlarmSetting. + * @note Schedule settings are disabled by default (\ref notifAlarmSettingCreate). + * @param alarm_setting \ref NotifAlarmSetting + * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). + */ +Result AlarmSettingDisable(NotifAlarmSetting *alarm_setting, u32 day_of_week); + +/** + * @brief Registers the specified AlarmSetting. + * @note See \ref NOTIF_MAX_ALARMS for the maximum alarms. + * @note When indicated by the output from \ref hidIsFirmwareUpdateNeededForNotification, this will use \ref hidLaShowControllerFirmwareUpdate. + * @param[out] alarm_setting_id AlarmSettingId + * @param[in] alarm_setting \ref NotifAlarmSetting + * @param[in] buffer Input buffer containing the ApplicationParameter. Optional, can be NULL. + * @param[in] size Input buffer size, must be <=0x400. Optional, can be 0. + */ +Result RegisterAlarmSetting(u16 *alarm_setting_id, const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size); + +/** + * @brief Updates the specified AlarmSetting. + * @param[in] alarm_setting \ref NotifAlarmSetting + * @param[in] buffer Input buffer containing the ApplicationParameter. Optional, can be NULL. + * @param[in] size Input buffer size, must be <=0x400. Optional, can be 0. + */ +Result UpdateAlarmSetting(const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size); + +/** + * @brief Gets a listing of AlarmSettings. + * @param[out] alarm_settings Output \ref NotifAlarmSetting array. + * @param[in] count Total entries in the alarm_settings array. + * @param[out] total_out Total output entries. + */ +Result ListAlarmSettings(NotifAlarmSetting *alarm_settings, s32 count, s32 *total_out); + +/** + * @brief Loads the ApplicationParameter for the specified AlarmSetting. + * @param[in] alarm_setting_id AlarmSettingId + * @param[out] buffer Output buffer containing the ApplicationParameter. + * @param[in] size Output buffer size. + * @param[out] actual_size Actual output size. + */ +Result LoadApplicationParameter(u16 alarm_setting_id, void* buffer, size_t size, u32 *actual_size); + +/** + * @brief Deletes the specified AlarmSetting. + * @param[in] alarm_setting_id AlarmSettingId + */ +Result DeleteAlarmSetting(u16 alarm_setting_id); + +/** + * @brief Gets an Event which is signaled when data is available with \ref notifTryPopNotifiedApplicationParameter. + * @note This is a wrapper for \ref appletGetNotificationStorageChannelEvent, see that for the usage requirements. + * @note Some official apps don't use this. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetNotificationSystemEvent(Event *out_event); + +/** + * @brief Uses \ref appletTryPopFromNotificationStorageChannel then reads the data from there into the output params. + * @note This is a wrapper for \ref appletTryPopFromNotificationStorageChannel, see that for the usage requirements. + * @note The system will only push data for this when launching the Application when the Alarm was triggered, where the system was previously in sleep-mode. + * @note Some official apps don't use this. + * @param[out] buffer Output buffer. + * @param[out] size Output buffer size. + * @param[out] out_size Size of the data which was written into the output buffer. Optional, can be NULL. + */ +Result TryPopNotifiedApplicationParameter(void* buffer, u64 size, u64 *out_size); + +} // namespace notif + +/// @brief C++ wrappers for the `ns` API. +/// @details Wraps: switch/services/ns.h. +namespace ns { + +/// NsApplicationContentMetaStatus +using ::NsApplicationContentMetaStatus; +/// ApplicationControlData +using ::NsApplicationControlData; +/// ApplicationControlSource +using ::NsApplicationControlSource; +/// ApplicationDeliveryInfo +using ::NsApplicationDeliveryInfo; +/// ApplicationOccupiedSize +using ::NsApplicationOccupiedSize; +/// ApplicationRecord +using ::NsApplicationRecord; +/// NsApplicationRightsOnClient +using ::NsApplicationRightsOnClient; +/// ApplicationView +using ::NsApplicationView; +/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. +using ::NsApplicationViewDeprecated; +/// NsApplicationViewWithPromotionInfo +using ::NsApplicationViewWithPromotionInfo; +/// BackgroundNetworkUpdateState +using ::NsBackgroundNetworkUpdateState; +/// DownloadTaskStatus +using ::NsDownloadTaskStatus; +/// EulaDataPath +using ::NsEulaDataPath; +/// LatestSystemUpdate +using ::NsLatestSystemUpdate; +/// LaunchProperties +using ::NsLaunchProperties; +/// ProgressAsyncResult +using ::NsProgressAsyncResult; +/// ProgressForDeleteUserSaveDataAll +using ::NsProgressForDeleteUserSaveDataAll; +/// ProgressMonitorForDeleteUserSaveDataAll +using ::NsProgressMonitorForDeleteUserSaveDataAll; +/// NsPromotionInfo +using ::NsPromotionInfo; +/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsReceiveApplicationProgress; +/// RequestServerStopper +using ::NsRequestServerStopper; +/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsSendApplicationProgress; +/// ShellEvent +using ::NsShellEvent; +/// ShellEventInfo +using ::NsShellEventInfo; +/// SystemDeliveryInfo +using ::NsSystemDeliveryInfo; +/// SystemUpdateControl +using ::NsSystemUpdateControl; +/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. +using ::NsSystemUpdateProgress; + +/// Initialize ns services. Uses ns:am on pre-3.0.0, ns:am2 on [3.0.0+]. +Result Initialize(void); + +/// Exit ns services. +void Exit(void); + +/// Gets the Service object for the actual ns:* service session. Only initialized on [3.0.0+], on pre-3.0.0 see \ref nsGetServiceSession_ApplicationManagerInterface. +Service* GetServiceSession_GetterInterface(void); + +/// Gets the Service object for IApplicationManagerInterface. Only initialized on pre-3.0.0, on [3.0.0+] use \ref nsGetApplicationManagerInterface. +Service* GetServiceSession_ApplicationManagerInterface(void); + +/// Gets the Service object for IDynamicRightsInterface via the cmd for that. +/// Only available on [6.0.0+]. +Result GetDynamicRightsInterface(Service* srv_out); + +/// Gets the Service object for IReadOnlyApplicationControlDataInterface via the cmd for that. +/// Only available on [5.1.0+]. +Result GetReadOnlyApplicationControlDataInterface(Service* srv_out); + +/// Gets the Service object for IReadOnlyApplicationRecordInterface via the cmd for that. +/// Only available on [5.0.0+]. +Result GetReadOnlyApplicationRecordInterface(Service* srv_out); + +/// Gets the Service object for IECommerceInterface via the cmd for that. +/// Only available on [4.0.0+]. +Result GetECommerceInterface(Service* srv_out); + +/// Gets the Service object for IApplicationVersionInterface via the cmd for that. +/// Only available on [4.0.0+]. +Result GetApplicationVersionInterface(Service* srv_out); + +/// Gets the Service object for IFactoryResetInterface via the cmd for that. +/// Only available on [3.0.0+]. +Result GetFactoryResetInterface(Service* srv_out); + +/// Gets the Service object for IAccountProxyInterface via the cmd for that. +/// Only available on [3.0.0+]. +Result GetAccountProxyInterface(Service* srv_out); + +/// Gets the Service object for IApplicationManagerInterface via the cmd for that. +/// Only available on [3.0.0+], on prior sysvers use \ref nsGetServiceSession_ApplicationManagerInterface. +Result GetApplicationManagerInterface(Service* srv_out); + +/// Gets the Service object for IDownloadTaskInterface via the cmd for that. +/// Only available on [3.0.0+]. +Result GetDownloadTaskInterface(Service* srv_out); + +/// Gets the Service object for IContentManagementInterface via the cmd for that. +/// Only available on [3.0.0+]. +Result GetContentManagementInterface(Service* srv_out); + +/// Gets the Service object for IDocumentInterface via the cmd for that. +/// Only available on [3.0.0+]. +Result GetDocumentInterface(Service* srv_out); + +/** + * @brief Gets the \ref NsApplicationControlData for the specified application. + * @note Uses \ref nsGetReadOnlyApplicationControlDataInterface on [5.1.0+], otherwise IApplicationManagerInterface is used. + * @param[in] source Source, official sw uses ::NsApplicationControlSource_Storage. + * @param[in] application_id ApplicationId. + * @param[out] buffer \ref NsApplicationControlData + * @param[in] size Size of the buffer. + * @param[out] actual_size Actual output size. + */ +Result GetApplicationControlData(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u64* actual_size); + +/** + * @brief Gets the \ref NsApplicationControlData for the specified application. + * @note Only available on [19.0.0+]. + * @param[in] source Source, official sw uses ::NsApplicationControlSource_Storage. + * @param[in] application_id ApplicationId. + * @param[out] buffer \ref NsApplicationControlData + * @param[in] size Size of the buffer. + * @param[in] flag1 Default is 0. 1 retrieves 174x174 icon instead of 256x256. 0xFF uses an unknown alternative path. + * @param[in] acd_idx Default is 0. 1 tries to get NsApplicationControlData for Switch 2 Edition. + * @param[out] actual_size Actual output size. + * @param[out] unk Returned with size, always 0. + */ +Result GetApplicationControlData2(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u8 flag1, u8 acd_idx, u64* actual_size, u32* unk); + +/** + * @brief GetApplicationDesiredLanguage. Selects a \ref NacpLanguageEntry to use from the specified \ref NacpStruct. + * @note Uses \ref nsGetReadOnlyApplicationControlDataInterface on [5.1.0+], otherwise IApplicationManagerInterface is used. + * @param[in] nacp \ref NacpStruct + * @param[out] langentry \ref NacpLanguageEntry + */ +Result GetApplicationDesiredLanguage(NacpStruct *nacp, NacpLanguageEntry **langentry); + +/** + * @brief RequestLinkDevice + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [4.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] uid \ref AccountUid + */ +Result RequestLinkDevice(AsyncResult *a, AccountUid uid); + +/** + * @brief RequestSyncRights + * @note Only available on [6.0.0+]. + * @param[out] a \ref AsyncResult + */ +Result RequestSyncRights(AsyncResult *a); + +/** + * @brief RequestUnlinkDevice + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [6.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] uid \ref AccountUid + */ +Result RequestUnlinkDevice(AsyncResult *a, AccountUid uid); + +/** + * @brief ResetToFactorySettings + * @note Uses \ref nsGetFactoryResetInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + */ +Result ResetToFactorySettings(void); + +/** + * @brief ResetToFactorySettingsWithoutUserSaveData + * @note Uses \ref nsGetFactoryResetInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + */ +Result ResetToFactorySettingsWithoutUserSaveData(void); + +/** + * @brief ResetToFactorySettingsForRefurbishment + * @note Uses \ref nsGetFactoryResetInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + */ +Result ResetToFactorySettingsForRefurbishment(void); + +/** + * @brief ResetToFactorySettingsWithPlatformRegion + * @note Only available on [9.1.0+]. + */ +Result ResetToFactorySettingsWithPlatformRegion(void); + +/** + * @brief ResetToFactorySettingsWithPlatformRegionAuthentication + * @note Only available on [9.1.0+]. + */ +Result ResetToFactorySettingsWithPlatformRegionAuthentication(void); + +/** + * @brief Gets an listing of \ref NsApplicationRecord. + * @param[out] records Output array of \ref NsApplicationRecord. + * @param[in] count Size of the records array in entries. + * @param[in] entry_offset Starting entry offset. + * @param[out] out_entrycount Total output entries. + */ +Result ListApplicationRecord(NsApplicationRecord* records, s32 count, s32 entry_offset, s32* out_entrycount); + +/** + * @brief GetApplicationRecordUpdateSystemEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result GetApplicationRecordUpdateSystemEvent(Event* out_event); + +/** + * @brief GetApplicationViewDeprecated + * @note On [3.0.0+] you should generally use \ref nsGetApplicationView instead. + * @param[out] out Output array of \ref NsApplicationViewDeprecated. + * @param[in] application_ids Input array of ApplicationIds. + * @param[in] count Size of the input/output arrays in entries. + */ +Result GetApplicationViewDeprecated(NsApplicationViewDeprecated *views, const u64 *application_ids, s32 count); + +/** + * @brief DeleteApplicationEntity + * @param[in] application_id ApplicationId. + */ +Result DeleteApplicationEntity(u64 application_id); + +/** + * @brief DeleteApplicationCompletely + * @param[in] application_id ApplicationId. + */ +Result DeleteApplicationCompletely(u64 application_id); + +/** + * @brief DeleteRedundantApplicationEntity + */ +Result DeleteRedundantApplicationEntity(void); + +/** + * @brief IsApplicationEntityMovable + * @param[in] application_id ApplicationId. + * @param[in] storage_id \ref NcmStorageId + * @param[out] out Output flag. + */ +Result IsApplicationEntityMovable(u64 application_id, NcmStorageId storage_id, bool *out); + +/** + * @brief MoveApplicationEntity + * @note Only available on [1.0.0-9.2.0]. + * @param[in] application_id ApplicationId. + * @param[in] storage_id \ref NcmStorageId + */ +Result MoveApplicationEntity(u64 application_id, NcmStorageId storage_id); + +/** + * @brief RequestApplicationUpdateInfo + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @param[out] a \ref AsyncValue. The data that can be read from this is u8 ApplicationUpdateInfo. qlaunch just checks whether this is 0. + * @param application_id ApplicationId. + */ +Result RequestApplicationUpdateInfo(AsyncValue *a, u64 application_id); + +/** + * @brief CancelApplicationDownload + * @param[in] application_id ApplicationId. + */ +Result CancelApplicationDownload(u64 application_id); + +/** + * @brief ResumeApplicationDownload + * @param[in] application_id ApplicationId. + */ +Result ResumeApplicationDownload(u64 application_id); + +/** + * @brief CheckApplicationLaunchVersion + * @param[in] application_id ApplicationId. + */ +Result CheckApplicationLaunchVersion(u64 application_id); + +/** + * @brief CalculateApplicationApplyDeltaRequiredSize + * @param[in] application_id ApplicationId. + * @param[out] storage_id Output \ref NcmStorageId. + * @param[out] size Output size. + */ +Result CalculateApplicationDownloadRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size); + +/** + * @brief CleanupSdCard + */ +Result CleanupSdCard(void); + +/** + * @brief GetSdCardMountStatusChangedEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetSdCardMountStatusChangedEvent(Event* out_event); + +/** + * @brief GetGameCardUpdateDetectionEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetGameCardUpdateDetectionEvent(Event* out_event); + +/** + * @brief DisableApplicationAutoDelete + * @param[in] application_id ApplicationId. + */ +Result DisableApplicationAutoDelete(u64 application_id); + +/** + * @brief EnableApplicationAutoDelete + * @param[in] application_id ApplicationId. + */ +Result EnableApplicationAutoDelete(u64 application_id); + +/** + * @brief SetApplicationTerminateResult + * @param[in] application_id ApplicationId. + * @param[in] res Result. + */ +Result SetApplicationTerminateResult(u64 application_id, Result res); + +/** + * @brief ClearApplicationTerminateResult + * @param[in] application_id ApplicationId. + */ +Result ClearApplicationTerminateResult(u64 application_id); + +/** + * @brief GetLastSdCardMountUnexpectedResult + */ +Result GetLastSdCardMountUnexpectedResult(void); + +/** + * @brief Opens a \ref NsRequestServerStopper. + * @note Only available on [2.0.0+]. + * @param[out] r \ref NsRequestServerStopper + */ +Result GetRequestServerStopper(NsRequestServerStopper *r); + +/** + * @brief CancelApplicationApplyDelta + * @note Only available on [3.0.0+]. + * @param[in] application_id ApplicationId. + */ +Result CancelApplicationApplyDelta(u64 application_id); + +/** + * @brief ResumeApplicationApplyDelta + * @note Only available on [3.0.0+]. + * @param[in] application_id ApplicationId. + */ +Result ResumeApplicationApplyDelta(u64 application_id); + +/** + * @brief CalculateApplicationApplyDeltaRequiredSize + * @note Only available on [3.0.0+]. + * @param[in] application_id ApplicationId. + * @param[out] storage_id Output \ref NcmStorageId. + * @param[out] size Output size. + */ +Result CalculateApplicationApplyDeltaRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size); + +/** + * @brief ResumeAll + * @note Only available on [3.0.0+]. + */ +Result ResumeAll(void); + +/** + * @brief Temporarily mounts the specified fs ContentStorage, then uses fs GetTotalSpaceSize/GetFreeSpaceSize with that mounted ContentStorage. + * @note Only available on [3.0.0+]. + * @param[in] storage_id \ref NcmStorageId, must be ::NcmStorageId_BuiltInUser or ::NcmStorageId_SdCard. + * @param[out] total_space_size Output from GetTotalSpaceSize. + * @param[out] free_space_size Output from GetFreeSpaceSize. + */ +Result GetStorageSize(NcmStorageId storage_id, s64 *total_space_size, s64 *free_space_size); + +/** + * @brief RequestUpdateApplication2 + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [4.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] application_id ApplicationId. + */ +Result RequestUpdateApplication2(AsyncResult *a, u64 application_id); + +/** + * @brief DeleteUserSaveDataAll + * @param[in] p \ref NsProgressMonitorForDeleteUserSaveDataAll + * @param[in] uid \ref AccountUid + */ +Result DeleteUserSaveDataAll(NsProgressMonitorForDeleteUserSaveDataAll *p, AccountUid uid); + +/** + * @brief DeleteUserSystemSaveData + * @param[in] uid \ref AccountUid + * @param[in] system_save_data_id SystemSaveDataId + */ +Result DeleteUserSystemSaveData(AccountUid uid, u64 system_save_data_id); + +/** + * @brief DeleteSaveData + * @note Only available on [6.0.0+]. + * @param[in] save_data_space_id \ref FsSaveDataSpaceId + * @param[in] save_data_id SaveDataId + */ +Result DeleteSaveData(FsSaveDataSpaceId save_data_space_id, u64 save_data_id); + +/** + * @brief UnregisterNetworkServiceAccount + * @param[in] uid \ref AccountUid + */ +Result UnregisterNetworkServiceAccount(AccountUid uid); + +/** + * @brief UnregisterNetworkServiceAccountWithUserSaveDataDeletion + * @note Only available on [6.0.0+]. + * @param[in] uid \ref AccountUid + */ +Result UnregisterNetworkServiceAccountWithUserSaveDataDeletion(AccountUid uid); + +/** + * @brief RequestDownloadApplicationControlData + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @param[out] a \ref AsyncResult + * @param[in] application_id ApplicationId. + */ +Result RequestDownloadApplicationControlData(AsyncResult *a, u64 application_id); + +/** + * @brief ListApplicationTitle + * @note The data available with \ref asyncValueGet is a s32 for the offset within the buffer where the output data is located, \ref asyncValueGetSize returns the total byte-size of the data located here. The data located here is the \ref NacpLanguageEntry for each specified ApplicationId. + * @note Only available on [8.0.0+]. + * @param[out] a \ref AsyncValue + * @param[in] source Source, qlaunch uses ::NsApplicationControlSource_Storage. + * @param[in] application_ids Input array of ApplicationIds. + * @param[in] count Size of the application_ids array in entries. + * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. + * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. This must be at least: count*sizeof(\ref NacpLanguageEntry) + count*sizeof(u64) + count*sizeof(\ref NsApplicationControlData). + */ +Result ListApplicationTitle(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size); + +/** + * @brief ListApplicationTitle2. Returns \ref NacpLanguageEntry matching currently set system language for each specified ApplicationId. + * @note The data available with \ref asyncValueGet is a s32 for the offset within the buffer where the output data is located, \ref asyncValueGetSize returns the total byte-size of the data located here. The data located here is the \ref NacpLanguageEntry for each specified ApplicationId. + * @note Only available on [20.0.0+]. + * @note NacpLanguageEntry is decompressed when necessary only on [21.0.0+]. + * @param[out] a \ref AsyncValue + * @param[in] source Source, official sw uses ::NsApplicationControlSource_Storage. + * @param[in] application_ids Input array of ApplicationIds. + * @param[in] count Size of the application_ids array in entries. + * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. + * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. This must be at least: count*sizeof(\ref NacpLanguageEntry) + count*sizeof(u64) + sizeof(\ref NsApplicationControlData). + */ +Result ListApplicationTitle2(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size); + +/** + * @brief ListApplicationIcon + * @note The data available with \ref asyncValueGet is a s32 for the offset within the buffer where the output data is located, \ref asyncValueGetSize returns the total byte-size of the data located here. This data is: an u64 for total entries, an array of u64s for each icon size, then the icon JPEGs for the specified ApplicationIds. + * @note Only available on [8.0.0+]. + * @param[out] a \ref AsyncValue + * @param[in] source Source. + * @param[in] application_ids Input array of ApplicationIds. + * @param[in] count Size of the application_ids array in entries. + * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. + * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. This must be at least: 0x4 + count*sizeof(u64) + count*sizeof(\ref NsApplicationControlData::icon) + count*sizeof(u64) + sizeof(\ref NsApplicationControlData). + */ +Result ListApplicationIcon(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size); + +/** + * @brief RequestCheckGameCardRegistration + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [2.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] application_id ApplicationId. + */ +Result RequestCheckGameCardRegistration(AsyncResult *a, u64 application_id); + +/** + * @brief RequestGameCardRegistrationGoldPoint + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [2.0.0+]. + * @param[out] a \ref AsyncValue. The data that can be read from this is 4-bytes. + * @param[in] uid \ref AccountUid + * @param[in] application_id ApplicationId. + */ +Result RequestGameCardRegistrationGoldPoint(AsyncValue *a, AccountUid uid, u64 application_id); + +/** + * @brief RequestRegisterGameCard + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [2.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] uid \ref AccountUid + * @param[in] application_id ApplicationId. + * @param[in] inval Input value. + */ +Result RequestRegisterGameCard(AsyncResult *a, AccountUid uid, u64 application_id, s32 inval); + +/** + * @brief GetGameCardMountFailureEvent + * @note The Event must be closed by the user once finished with it. + * @note Only available on [3.0.0+]. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetGameCardMountFailureEvent(Event* out_event); + +/** + * @brief IsGameCardInserted + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsGameCardInserted(bool *out); + +/** + * @brief EnsureGameCardAccess + * @note Only available on [3.0.0+]. + */ +Result EnsureGameCardAccess(void); + +/** + * @brief GetLastGameCardMountFailureResult + * @note Only available on [3.0.0+]. + */ +Result GetLastGameCardMountFailureResult(void); + +/** + * @brief ListApplicationIdOnGameCard + * @note Only available on [5.0.0+]. + * @param[out] application_ids Output array of ApplicationIds. + * @param[in] count Size of the application_ids array in entries. + * @param[out] total_out Total output entries. + */ +Result ListApplicationIdOnGameCard(u64 *application_ids, s32 count, s32 *total_out); + +/** + * @brief TouchApplication + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + */ +Result TouchApplication(u64 application_id); + +/** + * @brief IsApplicationUpdateRequested + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + * @param[out] flag Output flag, indicating whether out is valid. + * @param[out] out Output value. + */ +Result IsApplicationUpdateRequested(u64 application_id, bool *flag, u32 *out); + +/** + * @brief WithdrawApplicationUpdateRequest + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + */ +Result WithdrawApplicationUpdateRequest(u64 application_id); + +/** + * @brief RequestVerifyAddOnContentsRights + * @note Only available on [3.0.0-9.2.0]. + * @param[out] a \ref NsProgressAsyncResult + * @param[in] application_id ApplicationId. + */ +Result RequestVerifyAddOnContentsRights(NsProgressAsyncResult *a, u64 application_id); + +/** + * @brief RequestVerifyApplication + * @note On pre-5.0.0 this uses cmd RequestVerifyApplicationDeprecated, otherwise cmd RequestVerifyApplication is used. + * @param[out] a \ref NsProgressAsyncResult. The data available with \ref nsProgressAsyncResultGetProgress is basically the same as \ref NsSystemUpdateProgress. + * @param[in] application_id ApplicationId. + * @param[in] unk Unknown. A default value of 0x7 can be used (which is what qlaunch uses). Only used on [5.0.0+]. + * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. + * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. qlaunch uses size 0x100000. + */ +Result RequestVerifyApplication(NsProgressAsyncResult *a, u64 application_id, u32 unk, void* buffer, size_t size); + +/** + * @brief IsAnyApplicationEntityInstalled + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + * @param[out] out Output flag. + */ +Result IsAnyApplicationEntityInstalled(u64 application_id, bool *out); + +/** + * @brief CleanupUnavailableAddOnContents + * @note Only available on [6.0.0+]. + * @param[in] application_id ApplicationId. + * @param[in] uid \ref AccountUid + */ +Result CleanupUnavailableAddOnContents(u64 application_id, AccountUid uid); + +/** + * @brief EstimateSizeToMove + * @note Only available on [10.0.0+]. + * @param[in] storage_ids Array of u8 \ref NcmStorageId. + * @param[in] count Size of the storage_ids array in entries. + * @param[in] storage_id storage_id \ref NcmStorageId + * @param[in] flags Flags + * @param[in] application_id ApplicationId. + * @param[out] Out Output value. + */ +Result EstimateSizeToMove(u8 *storage_ids, s32 count, NcmStorageId storage_id, u32 flags, u64 application_id, s64 *out); + +/** + * @brief FormatSdCard + * @note Only available on [2.0.0+]. + */ +Result FormatSdCard(void); + +/** + * @brief NeedsSystemUpdateToFormatSdCard + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. + */ +Result NeedsSystemUpdateToFormatSdCard(bool *out); + +/** + * @brief GetLastSdCardFormatUnexpectedResult + * @note Only available on [2.0.0+]. + */ +Result GetLastSdCardFormatUnexpectedResult(void); + +/** + * @brief GetApplicationView + * @note Only available on [3.0.0+], on prior system-versions use \ref nsGetApplicationViewDeprecated instead. + * @param[out] out Output array of \ref NsApplicationView. + * @param[in] application_ids Input array of ApplicationIds. + * @param[in] count Size of the input/output arrays in entries. + */ +Result GetApplicationView(NsApplicationView *views, const u64 *application_ids, s32 count); + +/** + * @brief GetApplicationViewDownloadErrorContext + * @note Only available on [4.0.0+]. + * @param[in] application_id ApplicationId + * @param[out] context \ref ErrorContext + */ +Result GetApplicationViewDownloadErrorContext(u64 application_id, ErrorContext *context); + +/** + * @brief GetApplicationViewWithPromotionInfo + * @note Only available on [8.0.0+]. + * @param[out] out Output array of \ref NsApplicationViewWithPromotionInfo. + * @param[in] application_ids Input array of ApplicationIds. + * @param[in] count Size of the input/output arrays in entries. + */ +Result GetApplicationViewWithPromotionInfo(NsApplicationViewWithPromotionInfo *out, const u64 *application_ids, s32 count); + +/** + * @brief RequestDownloadApplicationPrepurchasedRights + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [4.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] application_id ApplicationId. + */ +Result RequestDownloadApplicationPrepurchasedRights(AsyncResult *a, u64 application_id); + +/** + * @brief Generates a \ref NsSystemDeliveryInfo using the currently installed SystemUpdate meta. + * @note Only available on [4.0.0+]. + * @param[out] info \ref NsSystemDeliveryInfo + */ +Result GetSystemDeliveryInfo(NsSystemDeliveryInfo *info); + +/** + * @brief SelectLatestSystemDeliveryInfo + * @note This selects the \ref NsSystemDeliveryInfo with the latest version from sys_list, using minimum versions determined from app_list/state and base_info, etc. + * @note Only available on [4.0.0+]. + * @param[in] sys_list Input array of \ref NsSystemDeliveryInfo. + * @param[in] sys_count Size of the sys_list array in entries. + * @param[in] base_info \ref NsSystemDeliveryInfo + * @param[in] app_list Input array of \ref NsApplicationDeliveryInfo. This can be NULL. + * @param[in] app_count Size of the app_list array in entries. This can be 0. + * @param[out] index Output index for the selected entry in sys_list, -1 if none found. + */ +Result SelectLatestSystemDeliveryInfo(const NsSystemDeliveryInfo *sys_list, s32 sys_count, const NsSystemDeliveryInfo *base_info, const NsApplicationDeliveryInfo *app_list, s32 app_count, s32 *index); + +/** + * @brief VerifyDeliveryProtocolVersion + * @note Only available on [4.0.0+]. + * @param[in] info \ref NsSystemDeliveryInfo + */ +Result VerifyDeliveryProtocolVersion(const NsSystemDeliveryInfo *info); + +/** + * @brief Generates \ref NsApplicationDeliveryInfo for the specified ApplicationId. + * @note Only available on [4.0.0+]. + * @param[out] info Output array of \ref NsApplicationDeliveryInfo. + * @param[in] count Size of the array in entries. + * @param[in] application_id ApplicationId + * @param[in] attr ApplicationDeliveryAttributeTag bitmask. + * @param[out] total_out Total output entries. + */ +Result GetApplicationDeliveryInfo(NsApplicationDeliveryInfo *info, s32 count, u64 application_id, u32 attr, s32 *total_out); + +/** + * @brief HasAllContentsToDeliver + * @note Only available on [4.0.0+]. + * @param[in] info Input array of \ref NsApplicationDeliveryInfo. + * @param[in] count Size of the array in entries. Must be value 1. + * @param[out] out Output flag. + */ +Result HasAllContentsToDeliver(const NsApplicationDeliveryInfo* info, s32 count, bool *out); + +/** + * @brief Both \ref NsApplicationDeliveryInfo are validated, then the application_version in the first/second \ref NsApplicationDeliveryInfo are compared. + * @note Only available on [4.0.0+]. + * @param[in] info0 First input array of \ref NsApplicationDeliveryInfo. + * @param[in] count0 Size of the info0 array in entries. Must be value 1. + * @param[in] info1 Second input array of \ref NsApplicationDeliveryInfo. + * @param[in] count1 Size of the info1 array in entries. Must be value 1. + * @param[out] out Comparison result: -1 for less than, 0 for equal, and 1 for higher than. + */ +Result CompareApplicationDeliveryInfo(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, s32 *out); + +/** + * @brief CanDeliverApplication + * @note Only available on [4.0.0+]. + * @param[in] info0 First input array of \ref NsApplicationDeliveryInfo. + * @param[in] count0 Size of the info0 array in entries. Must be value <=1, when 0 this will return 0 with out set to 0. + * @param[in] info1 Second input array of \ref NsApplicationDeliveryInfo. + * @param[in] count1 Size of the info1 array in entries. Must be value 1. + * @param[out] out Output flag. + */ +Result CanDeliverApplication(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, bool *out); + +/** + * @brief ListContentMetaKeyToDeliverApplication + * @note Only available on [4.0.0+]. + * @param[out] meta Output array of \ref NcmContentMetaKey. + * @param[in] meta_count Size of the meta array in entries. Must be at least 1, only 1 entry will be returned. + * @param[in] meta_index Meta entry index. An output \ref NcmContentMetaKey will not be returned when this value is larger than 0. + * @param[in] info Input array of \ref NsApplicationDeliveryInfo. + * @param[in] info_count Size of the info array in entries. Must be value 1. + * @param[out] total_out Total output entries. + */ +Result ListContentMetaKeyToDeliverApplication(NcmContentMetaKey *meta, s32 meta_count, s32 meta_index, const NsApplicationDeliveryInfo *info, s32 info_count, s32 *total_out); + +/** + * @brief After validation, this sets the output bool by comparing system-version fields in the \ref NsSystemDeliveryInfo / info-array and with a state field, etc. + * @note Only available on [4.0.0+]. + * @param[in] info Input array of \ref NsApplicationDeliveryInfo. + * @param[in] count Size of the info array in entries. Must be value 1. + * @param[in] sys_info \ref NsSystemDeliveryInfo + * @param[out] out Output flag. + */ +Result NeedsSystemUpdateToDeliverApplication(const NsApplicationDeliveryInfo *info, s32 count, const NsSystemDeliveryInfo *sys_info, bool *out); + +/** + * @brief EstimateRequiredSize + * @note Only available on [4.0.0+]. + * @param[in] meta Input array of \ref NcmContentMetaKey. + * @param[in] count Size of the meta array in entries. When less than 1, this will return 0 with out set to 0. + * @param[out] out Output size. + */ +Result EstimateRequiredSize(const NcmContentMetaKey *meta, s32 count, s64 *out); + +/** + * @brief RequestReceiveApplication + * @note This is the Application version of \ref nssuControlRequestReceiveSystemUpdate, see the notes for that. + * @note Only available on [4.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] addr Server IPv4 address. + * @param[in] port Socket port. qlaunch uses value 55556. + * @param[in] application_id ApplicationId + * @param[in] meta Input array of \ref NcmContentMetaKey. The ::NcmContentMetaType must match ::NcmContentMetaType_Patch. + * @param[in] count Size of the meta array in entries. + * @param[in] storage_id \ref NcmStorageId. qlaunch uses ::NcmStorageId_Any. + */ +Result RequestReceiveApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count, NcmStorageId storage_id); + +/** + * @brief CommitReceiveApplication + * @note Only available on [4.0.0+]. + * @param[in] application_id ApplicationId + */ +Result CommitReceiveApplication(u64 application_id); + +/** + * @brief GetReceiveApplicationProgress + * @note Only available on [4.0.0+]. + * @param[in] application_id ApplicationId + * @param[out] out \ref NsReceiveApplicationProgress + */ +Result GetReceiveApplicationProgress(u64 application_id, NsReceiveApplicationProgress *out); + +/** + * @brief RequestSendApplication + * @note This is the Application version of \ref nssuRequestSendSystemUpdate, see the notes for that. + * @note Only available on [4.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] addr Client IPv4 address. + * @param[in] port Socket port. qlaunch uses value 55556. + * @param[in] application_id ApplicationId + * @param[in] meta Input array of \ref NcmContentMetaKey. The ::NcmContentMetaType must match ::NcmContentMetaType_Patch. + * @param[in] count Size of the meta array in entries. + */ +Result RequestSendApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count); + +/** + * @brief GetSendApplicationProgress + * @note Only available on [4.0.0+]. + * @param[in] application_id ApplicationId + * @param[out] out \ref NsSendApplicationProgress + */ +Result GetSendApplicationProgress(u64 application_id, NsSendApplicationProgress *out); + +/** + * @brief Both \ref NsSystemDeliveryInfo are validated, then the system_update_version in the first/second \ref NsSystemDeliveryInfo are compared. + * @note Only available on [4.0.0+]. + * @param[in] info0 First \ref NsSystemDeliveryInfo. + * @param[in] info1 Second \ref NsSystemDeliveryInfo. + * @param[out] out Comparison result: -1 for less than, 0 for equal, and 1 for higher than. + */ +Result CompareSystemDeliveryInfo(const NsSystemDeliveryInfo *info0, const NsSystemDeliveryInfo *info1, s32 *out); + +/** + * @brief ListNotCommittedContentMeta + * @note Only available on [4.0.0+]. + * @param[out] meta Output array of \ref NcmContentMetaKey. + * @param[in] count Size of the meta array in entries. + * @param[in] application_id ApplicationId + * @param[in] unk Unknown. + * @param[out] total_out Total output entries. + */ +Result ListNotCommittedContentMeta(NcmContentMetaKey *meta, s32 count, u64 application_id, s32 unk, s32 *total_out); + +/** + * @brief This extracts data from the input array for hashing with SHA256, with validation being done when handling each entry. + * @note Only available on [5.0.0+]. + * @param[in] info Input array of \ref NsApplicationDeliveryInfo. + * @param[in] count Size of the array in entries. + * @param[out] out_hash Output 0x20-byte SHA256 hash. + */ +Result GetApplicationDeliveryInfoHash(const NsApplicationDeliveryInfo *info, s32 count, u8 *out_hash); + +/** + * @brief GetApplicationTerminateResult + * @note Only available on [6.0.0+]. + * @param[in] application_id ApplicationId. + * @param[out] res Output Result. + */ +Result GetApplicationTerminateResult(u64 application_id, Result *res); + +/** + * @brief GetApplicationRightsOnClient + * @note Only available on [6.0.0+]. + * @param[out] rights Output array of \ref NsApplicationRightsOnClient. + * @param[in] count Size of the rights array in entries. qlaunch uses value 3 for this. + * @param[in] application_id ApplicationId + * @param[in] uid \ref AccountUid, can optionally be all-zero. + * @param[in] flags Flags. Official sw hard-codes this to value 0x3. + * @param[out] total_out Total output entries. + */ +Result GetApplicationRightsOnClient(NsApplicationRightsOnClient *rights, s32 count, u64 application_id, AccountUid uid, u32 flags, s32 *total_out); + +/** + * @brief RequestNoDownloadRightsErrorResolution + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [9.0.0+]. + * @param[out] a \ref AsyncValue. The data that can be read from this is u8 NoDownloadRightsErrorResolution. + * @param application_id ApplicationId. + */ +Result RequestNoDownloadRightsErrorResolution(AsyncValue *a, u64 application_id); + +/** + * @brief RequestResolveNoDownloadRightsError + * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. + * @note Only available on [9.0.0+]. + * @param[out] a \ref AsyncValue. The data that can be read from this is u8 NoDownloadRightsErrorResolution. + * @param application_id ApplicationId. + */ +Result RequestResolveNoDownloadRightsError(AsyncValue *a, u64 application_id); + +/** + * @brief GetPromotionInfo + * @note Only available on [8.0.0+]. + * @param[out] promotion \ref NsPromotionInfo + * @param application_id ApplicationId. + * @param[in] uid \ref AccountUid + */ +Result GetPromotionInfo(NsPromotionInfo *promotion, u64 application_id, AccountUid uid); + +/** + * @brief ClearTaskStatusList + * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + */ +Result ClearTaskStatusList(void); + +/** + * @brief RequestDownloadTaskList + * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + */ +Result RequestDownloadTaskList(void); + +/** + * @brief RequestEnsureDownloadTask + * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + * @param[out] a \ref AsyncResult + */ +Result RequestEnsureDownloadTask(AsyncResult *a); + +/** + * @brief ListDownloadTaskStatus + * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + * @param[out] tasks Output array of \ref NsDownloadTaskStatus. + * @param[in] count Size of the tasks array in entries. A maximum of 0x100 tasks can be stored in state. + * @param[out] total_out Total output entries. + */ +Result ListDownloadTaskStatus(NsDownloadTaskStatus* tasks, s32 count, s32 *total_out); + +/** + * @brief RequestDownloadTaskListData + * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + * @param[out] a \ref AsyncValue + */ +Result RequestDownloadTaskListData(AsyncValue *a); + +/** + * @brief TryCommitCurrentApplicationDownloadTask + * @note Only available on [4.0.0+]. + */ +Result TryCommitCurrentApplicationDownloadTask(void); + +/** + * @brief EnableAutoCommit + * @note Only available on [4.0.0+]. + */ +Result EnableAutoCommit(void); + +/** + * @brief DisableAutoCommit + * @note Only available on [4.0.0+]. + */ +Result DisableAutoCommit(void); + +/** + * @brief TriggerDynamicCommitEvent + * @note Only available on [4.0.0+]. + */ +Result TriggerDynamicCommitEvent(void); + +/** + * @brief CalculateApplicationOccupiedSize + * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @param[in] application_id ApplicationId. + * @param[out] out \ref NsApplicationOccupiedSize + */ +Result CalculateApplicationOccupiedSize(u64 application_id, NsApplicationOccupiedSize *out); + +/** + * @brief CheckSdCardMountStatus + * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + */ +Result CheckSdCardMountStatus(void); + +/** + * @brief Returns the total storage capacity (used + free) from content manager services. + * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @param[in] storage_id \ref NcmStorageId. Must be ::NcmStorageId_SdCard. + * @param[out] size Pointer to output the total storage size to. + */ +Result GetTotalSpaceSize(NcmStorageId storage_id, s64 *size); + +/** + * @brief Returns the available storage capacity from content manager services. + * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @param[in] storage_id \ref NcmStorageId. Must be ::NcmStorageId_SdCard. + * @param[out] size Pointer to output the free storage size to. + */ +Result GetFreeSpaceSize(NcmStorageId storage_id, s64 *size); + +/** + * @brief CountApplicationContentMeta + * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + * @param[out] out Output count. + */ +Result CountApplicationContentMeta(u64 application_id, s32 *out); + +/** + * @brief Gets an listing of \ref NsApplicationContentMetaStatus. + * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. + * @note Only available on [2.0.0+]. + * @param[in] application_id ApplicationId. + * @param[in] index Starting entry index. + * @param[out] list Output array of \ref NsApplicationContentMetaStatus. + * @param[in] count Size of the list array in entries. + * @param[out] out_entrycount Total output entries. + */ +Result ListApplicationContentMetaStatus(u64 application_id, s32 index, NsApplicationContentMetaStatus* list, s32 count, s32* out_entrycount); + +/** + * @brief IsAnyApplicationRunning + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result IsAnyApplicationRunning(bool *out); + +/** + * @brief Close a \ref NsRequestServerStopper. + * @param r \ref NsRequestServerStopper + */ +void RequestServerStopperClose(NsRequestServerStopper *r); + +/** + * @brief Close a \ref NsProgressMonitorForDeleteUserSaveDataAll. When initialized this will use \ref nsProgressMonitorForDeleteUserSaveDataAllIsFinished, throwing errors on failure / when the operation isn't finished (without closing the object). + * @note Cancelling the operation before it's finished is not supported by \ref NsProgressMonitorForDeleteUserSaveDataAll. + * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll + */ +Result ProgressMonitorForDeleteUserSaveDataAllClose(NsProgressMonitorForDeleteUserSaveDataAll *p); + +/** + * @brief GetSystemEvent + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result ProgressMonitorForDeleteUserSaveDataAllGetSystemEvent(NsProgressMonitorForDeleteUserSaveDataAll *p, Event* out_event); + +/** + * @brief IsFinished + * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll + * @param[out] out Whether the operation finished. + */ +Result ProgressMonitorForDeleteUserSaveDataAllIsFinished(NsProgressMonitorForDeleteUserSaveDataAll *p, bool *out); + +/** + * @brief GetResult + * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll + */ +Result ProgressMonitorForDeleteUserSaveDataAllGetResult(NsProgressMonitorForDeleteUserSaveDataAll *p); + +/** + * @brief GetProgress + * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll + * @param[out] progress Output \ref NsProgressForDeleteUserSaveDataAll. + */ +Result ProgressMonitorForDeleteUserSaveDataAllGetProgress(NsProgressMonitorForDeleteUserSaveDataAll *p, NsProgressForDeleteUserSaveDataAll *progress); + +/** + * @brief Close a \ref NsProgressAsyncResult. + * @note When the object is initialized, this uses \ref nsProgressAsyncResultCancel then \ref nsProgressAsyncResultWait with timeout=UINT64_MAX. + * @param a \ref NsProgressAsyncResult + */ +void ProgressAsyncResultClose(NsProgressAsyncResult *a); + +/** + * @brief Waits for the async operation to finish using the specified timeout. + * @param a \ref NsProgressAsyncResult + * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. + */ +Result ProgressAsyncResultWait(NsProgressAsyncResult *a, u64 timeout); + +/** + * @brief Gets the Result. + * @note Prior to using the cmd, this uses \ref nsProgressAsyncResultWait with timeout=UINT64_MAX. + * @param a \ref NsProgressAsyncResult + */ +Result ProgressAsyncResultGet(NsProgressAsyncResult *a); + +/** + * @brief Cancels the async operation. + * @note Used automatically by \ref nsProgressAsyncResultClose. + * @param a \ref NsProgressAsyncResult + */ +Result ProgressAsyncResultCancel(NsProgressAsyncResult *a); + +/** + * @brief Gets the progress. + * @param a \ref NsProgressAsyncResult + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size. + */ +Result ProgressAsyncResultGetProgress(NsProgressAsyncResult *a, void* buffer, size_t size); + +/** + * @brief GetDetailResult + * @param a \ref NsProgressAsyncResult + */ +Result ProgressAsyncResultGetDetailResult(NsProgressAsyncResult *a); + +/** + * @brief Gets the \ref ErrorContext. + * @note Only available on [4.0.0+]. + * @param a \ref NsProgressAsyncResult + * @param[out] context \ref ErrorContext + */ +Result ProgressAsyncResultGetErrorContext(NsProgressAsyncResult *a, ErrorContext *context); + +} // namespace ns + +/// @brief C++ wrappers for the `nsdev` API. +/// @details Wraps: switch/services/ns.h. +namespace nsdev { + +/// NsApplicationContentMetaStatus +using ::NsApplicationContentMetaStatus; +/// ApplicationControlData +using ::NsApplicationControlData; +/// ApplicationControlSource +using ::NsApplicationControlSource; +/// ApplicationDeliveryInfo +using ::NsApplicationDeliveryInfo; +/// ApplicationOccupiedSize +using ::NsApplicationOccupiedSize; +/// ApplicationRecord +using ::NsApplicationRecord; +/// NsApplicationRightsOnClient +using ::NsApplicationRightsOnClient; +/// ApplicationView +using ::NsApplicationView; +/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. +using ::NsApplicationViewDeprecated; +/// NsApplicationViewWithPromotionInfo +using ::NsApplicationViewWithPromotionInfo; +/// BackgroundNetworkUpdateState +using ::NsBackgroundNetworkUpdateState; +/// DownloadTaskStatus +using ::NsDownloadTaskStatus; +/// EulaDataPath +using ::NsEulaDataPath; +/// LatestSystemUpdate +using ::NsLatestSystemUpdate; +/// LaunchProperties +using ::NsLaunchProperties; +/// ProgressAsyncResult +using ::NsProgressAsyncResult; +/// ProgressForDeleteUserSaveDataAll +using ::NsProgressForDeleteUserSaveDataAll; +/// ProgressMonitorForDeleteUserSaveDataAll +using ::NsProgressMonitorForDeleteUserSaveDataAll; +/// NsPromotionInfo +using ::NsPromotionInfo; +/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsReceiveApplicationProgress; +/// RequestServerStopper +using ::NsRequestServerStopper; +/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsSendApplicationProgress; +/// ShellEvent +using ::NsShellEvent; +/// ShellEventInfo +using ::NsShellEventInfo; +/// SystemDeliveryInfo +using ::NsSystemDeliveryInfo; +/// SystemUpdateControl +using ::NsSystemUpdateControl; +/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. +using ::NsSystemUpdateProgress; + +///< [4.0.0+] +/// Initialize ns:dev. +Result Initialize(void); + +/// Initialize ns:dev. +void Exit(void); + +/// Gets the Service object for ns:dev. +Service* GetServiceSession(void); + +Result LaunchProgram(u64* out_pid, const NsLaunchProperties* properties, u32 flags); + +///< [1.0.0-9.2.0] +Result TerminateProcess(u64 pid); + +Result TerminateProgram(u64 tid); + +///< [1.0.0-9.2.0] +Result GetShellEvent(Event* out_event); + +///< Autoclear for nsdevShellEvent is always true. [1.0.0-9.2.0] +Result GetShellEventInfo(NsShellEventInfo* out); + +///< [1.0.0-9.2.0] +Result TerminateApplication(void); + +Result PrepareLaunchProgramFromHost(NsLaunchProperties* out, const char* path, size_t path_len); + +///< [1.0.0-9.2.0] +Result LaunchApplicationForDevelop(u64* out_pid, u64 application_id, u32 flags); + +///< [1.0.0-9.2.0] +Result LaunchApplicationFromHost(u64* out_pid, const char* path, size_t path_len, u32 flags); + +///< [10.0.0-17.0.1] +Result LaunchApplicationWithStorageIdForDevelop(u64* out_pid, u64 application_id, u32 flags, u8 app_storage_id, u8 patch_storage_id); + +///< [1.0.0-17.0.1] +Result IsSystemMemoryResourceLimitBoosted(bool* out); + +///< [6.0.0-8.1.0] +Result GetRunningApplicationProcessIdForDevelop(u64* out_pid); + +///< [6.0.0+] +Result SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(bool can_be_active); + +} // namespace nsdev + +/// @brief C++ wrappers for the `nssu` API. +/// @details Wraps: switch/services/ns.h. +namespace nssu { + +/// NsApplicationContentMetaStatus +using ::NsApplicationContentMetaStatus; +/// ApplicationControlData +using ::NsApplicationControlData; +/// ApplicationControlSource +using ::NsApplicationControlSource; +/// ApplicationDeliveryInfo +using ::NsApplicationDeliveryInfo; +/// ApplicationOccupiedSize +using ::NsApplicationOccupiedSize; +/// ApplicationRecord +using ::NsApplicationRecord; +/// NsApplicationRightsOnClient +using ::NsApplicationRightsOnClient; +/// ApplicationView +using ::NsApplicationView; +/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. +using ::NsApplicationViewDeprecated; +/// NsApplicationViewWithPromotionInfo +using ::NsApplicationViewWithPromotionInfo; +/// BackgroundNetworkUpdateState +using ::NsBackgroundNetworkUpdateState; +/// DownloadTaskStatus +using ::NsDownloadTaskStatus; +/// EulaDataPath +using ::NsEulaDataPath; +/// LatestSystemUpdate +using ::NsLatestSystemUpdate; +/// LaunchProperties +using ::NsLaunchProperties; +/// ProgressAsyncResult +using ::NsProgressAsyncResult; +/// ProgressForDeleteUserSaveDataAll +using ::NsProgressForDeleteUserSaveDataAll; +/// ProgressMonitorForDeleteUserSaveDataAll +using ::NsProgressMonitorForDeleteUserSaveDataAll; +/// NsPromotionInfo +using ::NsPromotionInfo; +/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsReceiveApplicationProgress; +/// RequestServerStopper +using ::NsRequestServerStopper; +/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsSendApplicationProgress; +/// ShellEvent +using ::NsShellEvent; +/// ShellEventInfo +using ::NsShellEventInfo; +/// SystemDeliveryInfo +using ::NsSystemDeliveryInfo; +/// SystemUpdateControl +using ::NsSystemUpdateControl; +/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. +using ::NsSystemUpdateProgress; + +///< [6.0.0+] +/// Initialize ns:su. +Result Initialize(void); + +/// Exit ns:su. +void Exit(void); + +/// Gets the Service object for ns:su. +Service* GetServiceSession(void); + +/** + * @brief Gets the \ref NsBackgroundNetworkUpdateState. + * @note Internally this uses nim commands ListSystemUpdateTask and GetSystemUpdateTaskInfo to determine the output state. + * @param[out] out \ref NsBackgroundNetworkUpdateState + */ +Result GetBackgroundNetworkUpdateState(NsBackgroundNetworkUpdateState *out); + +/** + * @brief Opens a \ref NsSystemUpdateControl. + * @note Only 1 \ref NsSystemUpdateControl can be open at a time. + * @param[out] c \ref NsSystemUpdateControl + */ +Result OpenSystemUpdateControl(NsSystemUpdateControl *c); + +/** + * @brief Uses nim ListSystemUpdateTask, then uses the task with DestroySystemUpdateTask if it exists. Then this runs ExFat handling, updates state, and sets the same state flag as \ref nssuRequestBackgroundNetworkUpdate. + * @note Only usable when a \ref NsSystemUpdateControl isn't open. + */ +Result NotifyExFatDriverRequired(void); + +/** + * @brief ClearExFatDriverStatusForDebug + */ +Result ClearExFatDriverStatusForDebug(void); + +/** + * @brief RequestBackgroundNetworkUpdate + * @note Only usable when a \ref NsSystemUpdateControl isn't open. + */ +Result RequestBackgroundNetworkUpdate(void); + +/** + * @brief This checks whether a sysupdate is needed with the input \ref NcmContentMetaKey using NCM commands, if not this will just return 0. Otherwise, this will then run code which is identical to \ref nssuRequestBackgroundNetworkUpdate. + * @note Only usable when a \ref NsSystemUpdateControl isn't open. + * @param[in] key \ref NcmContentMetaKey + */ +Result NotifyBackgroundNetworkUpdate(const NcmContentMetaKey *key); + +/** + * @brief NotifyExFatDriverDownloadedForDebug + */ +Result NotifyExFatDriverDownloadedForDebug(void); + +/** + * @brief Gets an Event which can be signaled by \ref nssuNotifySystemUpdateForContentDelivery. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetSystemUpdateNotificationEventForContentDelivery(Event* out_event); + +/** + * @brief Signals the event returned by \ref nssuGetSystemUpdateNotificationEventForContentDelivery. + */ +Result NotifySystemUpdateForContentDelivery(void); + +/** + * @brief This does shutdown preparation. + * @note This is used by am-sysmodule, so generally there's no need to use this. + * @note Only available on [3.0.0+]. + */ +Result PrepareShutdown(void); + +/** + * @brief This uses nim ListSystemUpdateTask, then when a task is returned uses it with DestroySystemUpdateTask. + * @note Only available on [4.0.0+]. + */ +Result DestroySystemUpdateTask(void); + +/** + * @brief RequestSendSystemUpdate + * @note addr/port are little-endian. + * @note Only available on [4.0.0+]. + * @param[out] a \ref AsyncResult + * @param[in] addr Client IPv4 address. + * @param[in] port Socket port. qlaunch uses value 55556. + * @param[in] info \ref NsSystemDeliveryInfo + */ +Result RequestSendSystemUpdate(AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info); + +/** + * @brief GetSendSystemUpdateProgress + * @note Only available on [4.0.0+]. + * @param[out] out \ref NsSystemUpdateProgress + */ +Result GetSendSystemUpdateProgress(NsSystemUpdateProgress *out); + +/** + * @brief Close a \ref NsSystemUpdateControl. + * @param c \ref NsSystemUpdateControl + */ +void ControlClose(NsSystemUpdateControl *c); + +/** + * @brief Gets whether a network sysupdate was downloaded, with install pending. + * @param c \ref NsSystemUpdateControl + * @param[out] out Output flag. + */ +Result ControlHasDownloaded(NsSystemUpdateControl *c, bool* out); + +/** + * @brief RequestCheckLatestUpdate + * @param c \ref NsSystemUpdateControl + * @param[out] a \ref AsyncValue. The data that can be read from this is u8 \ref NsLatestSystemUpdate. + */ +Result ControlRequestCheckLatestUpdate(NsSystemUpdateControl *c, AsyncValue *a); + +/** + * @brief RequestDownloadLatestUpdate + * @param c \ref NsSystemUpdateControl + * @param[out] a \ref AsyncResult + */ +Result ControlRequestDownloadLatestUpdate(NsSystemUpdateControl *c, AsyncResult *a); + +/** + * @brief GetDownloadProgress + * @param c \ref NsSystemUpdateControl + * @param[out] out \ref NsSystemUpdateProgress + */ +Result ControlGetDownloadProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out); + +/** + * @brief ApplyDownloadedUpdate + * @param c \ref NsSystemUpdateControl + */ +Result ControlApplyDownloadedUpdate(NsSystemUpdateControl *c); + +/** + * @brief RequestPrepareCardUpdate + * @param c \ref NsSystemUpdateControl + * @param[out] a \ref AsyncResult + */ +Result ControlRequestPrepareCardUpdate(NsSystemUpdateControl *c, AsyncResult *a); + +/** + * @brief GetPrepareCardUpdateProgress + * @note \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater must have been used at some point prior to using this. + * @param c \ref NsSystemUpdateControl + * @param[out] out \ref NsSystemUpdateProgress + */ +Result ControlGetPrepareCardUpdateProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out); + +/** + * @brief HasPreparedCardUpdate + * @note \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater must have been used at some point prior to using this. + * @param c \ref NsSystemUpdateControl + * @param[out] out Output flag. + */ +Result ControlHasPreparedCardUpdate(NsSystemUpdateControl *c, bool* out); + +/** + * @brief ApplyCardUpdate + * @note \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater must have been used at some point prior to using this. + * @param c \ref NsSystemUpdateControl + */ +Result ControlApplyCardUpdate(NsSystemUpdateControl *c); + +/** + * @brief Gets the filesize for the specified DownloadedEulaData. + * @note This mounts the Eula SystemData, then uses the file ":/". + * @param c \ref NsSystemUpdateControl + * @param[in] path EulaData path. + * @param[out] filesize Output filesize. + */ +Result ControlGetDownloadedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize); + +/** + * @brief Gets the specified DownloadedEulaData. + * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. + * @param c \ref NsSystemUpdateControl + * @param[in] path EulaData path. + * @param[out] buffer Output buffer. + * @param[in] size Size of the output buffer, must be at least the output size from \ref nssuControlGetDownloadedEulaDataSize. + * @param[out] filesize Output filesize. + */ +Result ControlGetDownloadedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize); + +/** + * @brief SetupCardUpdate + * @param c \ref NsSystemUpdateControl + * @param[in] buffer TransferMemory buffer, when NULL this is automatically allocated. + * @param[in] size TransferMemory buffer size, see \ref NSSU_CARDUPDATE_TMEM_SIZE_DEFAULT. + */ +Result ControlSetupCardUpdate(NsSystemUpdateControl *c, void* buffer, size_t size); + +/** + * @brief Gets the filesize for the specified PreparedCardUpdateEulaData. + * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. + * @param c \ref NsSystemUpdateControl + * @param[in] path EulaData path. + * @param[out] filesize Output filesize. + */ +Result ControlGetPreparedCardUpdateEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize); + +/** + * @brief Gets the specified PreparedCardUpdateEulaData. + * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. + * @param c \ref NsSystemUpdateControl + * @param[in] path EulaData path. + * @param[out] buffer Output buffer. + * @param[in] size Size of the output buffer, must be at least the output size from \ref nssuControlGetPreparedCardUpdateEulaDataSize. + * @param[out] filesize Output filesize. + */ +Result ControlGetPreparedCardUpdateEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize); + +/** + * @brief SetupCardUpdateViaSystemUpdater + * @note Same as \ref nssuControlSetupCardUpdate, except this doesn't run the code for fs cmds GetGameCardHandle/GetGameCardUpdatePartitionInfo, and uses fs OpenRegisteredUpdatePartition instead of OpenGameCardFileSystem. + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[in] buffer TransferMemory buffer, when NULL this is automatically allocated. + * @param[in] size TransferMemory buffer size, see \ref NSSU_CARDUPDATE_TMEM_SIZE_DEFAULT. + */ +Result ControlSetupCardUpdateViaSystemUpdater(NsSystemUpdateControl *c, void* buffer, size_t size); + +/** + * @brief HasReceived + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[out] out Output flag. + */ +Result ControlHasReceived(NsSystemUpdateControl *c, bool* out); + +/** + * @brief RequestReceiveSystemUpdate + * @note addr/port are little-endian. + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[out] a \ref AsyncResult + * @param[in] addr Server IPv4 address. + * @param[in] port Socket port. qlaunch uses value 55556. + * @param[in] info \ref NsSystemDeliveryInfo + */ +Result ControlRequestReceiveSystemUpdate(NsSystemUpdateControl *c, AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info); + +/** + * @brief GetReceiveProgress + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[out] out \ref NsSystemUpdateProgress + */ +Result ControlGetReceiveProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out); + +/** + * @brief ApplyReceivedUpdate + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + */ +Result ControlApplyReceivedUpdate(NsSystemUpdateControl *c); + +/** + * @brief Gets the filesize for the specified ReceivedEulaData. + * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[in] path EulaData path. + * @param[out] filesize Output filesize. + */ +Result ControlGetReceivedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize); + +/** + * @brief Gets the specified ReceivedEulaData. + * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[in] path EulaData path. + * @param[out] buffer Output buffer. + * @param[in] size Size of the output buffer, must be at least the output size from \ref nssuControlGetReceivedEulaDataSize. + * @param[out] filesize Output filesize. + */ +Result ControlGetReceivedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize); + +/** + * @brief Does setup for ReceiveSystemUpdate by using the same nim cmds as \ref nssuDestroySystemUpdateTask. + * @note qlaunch uses this before \ref nssuControlRequestReceiveSystemUpdate. + * @note Only available on [4.0.0+]. + * @param c \ref NsSystemUpdateControl + */ +Result ControlSetupToReceiveSystemUpdate(NsSystemUpdateControl *c); + +/** + * @brief RequestCheckLatestUpdateIncludesRebootlessUpdate + * @note Only available on [6.0.0+]. + * @param c \ref NsSystemUpdateControl + * @param[out] a \ref AsyncValue + */ +Result ControlRequestCheckLatestUpdateIncludesRebootlessUpdate(NsSystemUpdateControl *c, AsyncValue *a); + +} // namespace nssu + +/// @brief C++ wrappers for the `nsvm` API. +/// @details Wraps: switch/services/ns.h. +namespace nsvm { + +/// NsApplicationContentMetaStatus +using ::NsApplicationContentMetaStatus; +/// ApplicationControlData +using ::NsApplicationControlData; +/// ApplicationControlSource +using ::NsApplicationControlSource; +/// ApplicationDeliveryInfo +using ::NsApplicationDeliveryInfo; +/// ApplicationOccupiedSize +using ::NsApplicationOccupiedSize; +/// ApplicationRecord +using ::NsApplicationRecord; +/// NsApplicationRightsOnClient +using ::NsApplicationRightsOnClient; +/// ApplicationView +using ::NsApplicationView; +/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. +using ::NsApplicationViewDeprecated; +/// NsApplicationViewWithPromotionInfo +using ::NsApplicationViewWithPromotionInfo; +/// BackgroundNetworkUpdateState +using ::NsBackgroundNetworkUpdateState; +/// DownloadTaskStatus +using ::NsDownloadTaskStatus; +/// EulaDataPath +using ::NsEulaDataPath; +/// LatestSystemUpdate +using ::NsLatestSystemUpdate; +/// LaunchProperties +using ::NsLaunchProperties; +/// ProgressAsyncResult +using ::NsProgressAsyncResult; +/// ProgressForDeleteUserSaveDataAll +using ::NsProgressForDeleteUserSaveDataAll; +/// ProgressMonitorForDeleteUserSaveDataAll +using ::NsProgressMonitorForDeleteUserSaveDataAll; +/// NsPromotionInfo +using ::NsPromotionInfo; +/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsReceiveApplicationProgress; +/// RequestServerStopper +using ::NsRequestServerStopper; +/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. +using ::NsSendApplicationProgress; +/// ShellEvent +using ::NsShellEvent; +/// ShellEventInfo +using ::NsShellEventInfo; +/// SystemDeliveryInfo +using ::NsSystemDeliveryInfo; +/// SystemUpdateControl +using ::NsSystemUpdateControl; +/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. +using ::NsSystemUpdateProgress; + +/// Initialize ns:vm. On pre-3.0.0 this must be used with \ref nsInitialize. +Result Initialize(void); + +/// Exit ns:vm. +void Exit(void); + +/// Gets the Service object for ns:vm. This is only initialized on [3.0.0+]. +Service* GetServiceSession(void); + +Result NeedsUpdateVulnerability(bool *out); + +Result GetSafeSystemVersion(NcmContentMetaKey *out); + +} // namespace nsvm + +/// @brief C++ wrappers for the `nv` API. +/// @details Wraps: switch/nvidia/address_space.h, switch/nvidia/channel.h, switch/nvidia/fence.h, switch/nvidia/gpu.h, switch/nvidia/gpu_channel.h, switch/nvidia/map.h, switch/services/nv.h. +namespace nv { + +using ::NvAddressSpace; +using ::NvChannel; +using ::NvEventId; +using ::NvFence; +using ::NvGpuChannel; +using ::NvMap; +using ::NvMultiFence; +/// NvServiceType, for __nx_nv_service_type. +using ::NvServiceType; + +Result AddressSpaceCreate(NvAddressSpace* a, u32 page_size); + +void AddressSpaceClose(NvAddressSpace* a); + +Result AddressSpaceAlloc(NvAddressSpace* a, bool sparse, u64 size, iova_t* iova_out); + +Result AddressSpaceAllocFixed(NvAddressSpace* a, bool sparse, u64 size, iova_t iova); + +Result AddressSpaceFree(NvAddressSpace* a, iova_t iova, u64 size); + +Result AddressSpaceMap(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t* iova_out); + +Result AddressSpaceMapFixed(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t iova); + +Result AddressSpaceModify(NvAddressSpace* a, iova_t iova, u64 offset, u64 size, NvKind kind); + +Result AddressSpaceUnmap(NvAddressSpace* a, iova_t iova); + +Result ChannelCreate(NvChannel* c, const char* dev); + +void ChannelClose(NvChannel* c); + +Result ChannelSetPriority(NvChannel* c, NvChannelPriority prio); + +Result ChannelSetTimeout(NvChannel* c, u32 timeout); + +Result FenceInit(void); + +void FenceExit(void); + +u32 FenceGetFd(void); + +Result FenceWait(NvFence* f, s32 timeout_us); + +void MultiFenceCreate(NvMultiFence* mf, const NvFence* fence); + +Result MultiFenceWait(NvMultiFence* mf, s32 timeout_us); + +Result GpuInit(void); + +void GpuExit(void); + +const nvioctl_gpu_characteristics* GpuGetCharacteristics(void); + +u32 GpuGetZcullCtxSize(void); + +const nvioctl_zcull_info* GpuGetZcullInfo(void); + +const u32* GpuGetTpcMasks(u32 *num_masks_out); + +Result GpuZbcGetActiveSlotMask(u32 *out_slot, u32 *out_mask); + +Result GpuZbcAddColor(const u32 color_l2[4], const u32 color_ds[4], u32 format); + +Result GpuZbcAddDepth(float depth); + +Result GpuGetTimestamp(u64 *ts); + +Result GpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as, NvChannelPriority prio); + +void GpuChannelClose(NvGpuChannel* c); + +Result GpuChannelZcullBind(NvGpuChannel* c, iova_t iova); + +Result GpuChannelAppendEntry(NvGpuChannel* c, iova_t start, size_t num_cmds, u32 flags, u32 flush_threshold); + +Result GpuChannelKickoff(NvGpuChannel* c); + +Result GpuChannelGetErrorNotification(NvGpuChannel* c, NvNotification* notif); + +Result GpuChannelGetErrorInfo(NvGpuChannel* c, NvError* error); + +u32 GpuChannelGetSyncpointId(NvGpuChannel* c); + +void GpuChannelGetFence(NvGpuChannel* c, NvFence* fence_out); + +void GpuChannelIncrFence(NvGpuChannel* c); + +Result MapInit(void); + +u32 MapGetFd(void); + +void MapExit(void); + +Result MapCreate(NvMap* m, void* cpu_addr, u32 size, u32 align, NvKind kind, bool is_cpu_cacheable); + +Result MapLoadRemote(NvMap* m, u32 id); + +void MapClose(NvMap* m); + +u32 MapGetHandle(NvMap* m); + +u32 MapGetId(NvMap* m); + +u32 MapGetSize(NvMap* m); + +void* MapGetCpuAddr(NvMap* m); + +bool MapIsRemote(NvMap* m); + +NvKind MapGetKind(NvMap* m); + +/// Initialize nvdrv*. +Result Initialize(void); + +/// Exit nvdrv*. +void Exit(void); + +/// Gets the Service object for the actual nvdrv* service session. +Service* GetServiceSession(void); + +Result Open(u32 *fd, const char *devicepath); + +Result Ioctl(u32 fd, u32 request, void* argp); + +Result Ioctl2(u32 fd, u32 request, void* argp, const void* inbuf, size_t inbuf_size); + +///< [3.0.0+] +Result Ioctl3(u32 fd, u32 request, void* argp, void* outbuf, size_t outbuf_size); + +///< [3.0.0+] +Result Close(u32 fd); + +Result QueryEvent(u32 fd, u32 event_id, Event *event_out); + +Result ConvertError(int rc); + +} // namespace nv + +/// @brief C++ wrappers for the `nvioctl` API. +/// @details Wraps: switch/nvidia/ioctl.h. +namespace nvioctl { + +using ::NvAllocSpaceFlags; +using ::NvChannelPriority; +using ::NvClassNumber; +using ::NvError; +using ::nvioctl_clk_rate; +using ::nvioctl_cmdbuf; +using ::nvioctl_command_buffer_map; +using ::nvioctl_fence; +using ::nvioctl_gpfifo_entry; +using ::nvioctl_gpu_characteristics; +using ::nvioctl_gpu_time; +using ::nvioctl_reloc; +using ::nvioctl_reloc_shift; +using ::nvioctl_syncpt_incr; +using ::nvioctl_va_region; +using ::nvioctl_zbc_entry; +using ::nvioctl_zbc_slot_mask; +using ::nvioctl_zcull_info; +using ::NvMapBufferFlags; +using ::NvMapParam; +using ::NvNotification; +using ::NvNotificationType; +using ::NvZcullConfig; + +Result NvhostCtrl_SyncptRead(u32 fd, u32 id, u32* out); + +Result NvhostCtrl_SyncptIncr(u32 fd, u32 id); + +Result NvhostCtrl_SyncptWait(u32 fd, u32 id, u32 threshold, u32 timeout); + +Result NvhostCtrl_EventSignal(u32 fd, u32 event_id); + +Result NvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out); + +Result NvhostCtrl_EventWaitAsync(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id); + +Result NvhostCtrl_EventRegister(u32 fd, u32 event_id); + +Result NvhostCtrl_EventUnregister(u32 fd, u32 event_id); + +Result NvhostCtrlGpu_ZCullGetCtxSize(u32 fd, u32 *out); + +Result NvhostCtrlGpu_ZCullGetInfo(u32 fd, nvioctl_zcull_info *out); + +Result NvhostCtrlGpu_ZbcSetTable(u32 fd, const u32 color_ds[4], const u32 color_l2[4], u32 depth, u32 format, u32 type); + +Result NvhostCtrlGpu_ZbcQueryTable(u32 fd, u32 index, nvioctl_zbc_entry *out); + +Result NvhostCtrlGpu_GetCharacteristics(u32 fd, nvioctl_gpu_characteristics *out); + +Result NvhostCtrlGpu_GetTpcMasks(u32 fd, void *buffer, size_t size); + +Result NvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *out); + +Result NvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out); + +Result NvhostAsGpu_BindChannel(u32 fd, u32 channel_fd); + +Result NvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align_or_offset, u64 *offset); + +Result NvhostAsGpu_FreeSpace(u32 fd, u64 offset, u32 pages, u32 page_size); + +Result NvhostAsGpu_MapBufferEx(u32 fd, u32 flags, u32 kind, u32 nvmap_handle, u32 page_size, u64 buffer_offset, u64 mapping_size, u64 input_offset, u64 *offset); + +Result NvhostAsGpu_UnmapBuffer(u32 fd, u64 offset); + +Result NvhostAsGpu_GetVARegions(u32 fd, nvioctl_va_region regions[2]); + +Result NvhostAsGpu_InitializeEx(u32 fd, u32 flags, u32 big_page_size); + +Result Nvmap_Create(u32 fd, u32 size, u32 *nvmap_handle); + +Result Nvmap_FromId(u32 fd, u32 id, u32 *nvmap_handle); + +Result Nvmap_Alloc(u32 fd, u32 nvmap_handle, u32 heapmask, u32 flags, u32 align, u8 kind, void* addr); + +Result Nvmap_Free(u32 fd, u32 nvmap_handle); + +Result Nvmap_Param(u32 fd, u32 nvmap_handle, NvMapParam param, u32 *result); + +Result Nvmap_GetId(u32 fd, u32 nvmap_handle, u32 *id); + +Result Channel_SetNvmapFd(u32 fd, u32 nvmap_fd); + +Result Channel_SubmitGpfifo(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout); + +Result Channel_KickoffPb(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout); + +Result Channel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out); + +Result Channel_ZCullBind(u32 fd, u64 gpu_va, u32 mode); + +Result Channel_SetErrorNotifier(u32 fd, u32 enable); + +Result Channel_GetErrorInfo(u32 fd, NvError* out); + +Result Channel_GetErrorNotification(u32 fd, NvNotification* out); + +Result Channel_SetPriority(u32 fd, u32 priority); + +Result Channel_SetTimeout(u32 fd, u32 timeout); + +Result Channel_AllocGpfifoEx2(u32 fd, u32 num_entries, u32 flags, u32 unk0, u32 unk1, u32 unk2, u32 unk3, nvioctl_fence *fence_out); + +Result Channel_SetUserData(u32 fd, void* addr); + +Result Channel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdbufs, const nvioctl_reloc *relocs, const nvioctl_reloc_shift *reloc_shifts, u32 num_relocs, const nvioctl_syncpt_incr *syncpt_incrs, u32 num_syncpt_incrs, nvioctl_fence *fences, u32 num_fences); + +Result Channel_GetSyncpt(u32 fd, u32 module_id, u32 *syncpt); + +Result Channel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq); + +Result Channel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq); + +Result Channel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed); + +Result Channel_UnmapCommandBuffer(u32 fd, const nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed); + +Result Channel_SetSubmitTimeout(u32 fd, u32 timeout); + +} // namespace nvioctl + +/// @brief C++ wrappers for the `nwindow` API. +/// @details Wraps: switch/display/native_window.h. +namespace nwindow { + +/// Native window structure. +using ::NWindow; + +/// Checks whether a pointer refers to a valid \ref NWindow object. +bool IsValid(NWindow* nw); + +/** + * @brief Retrieves the default \ref NWindow object. + * @return Pointer to the default \ref NWindow object. + * @note When this function is used/referenced, libnx will initialize VI services + * and create a \ref NWindow object from a \ref ViLayer created on the default \ref ViDisplay; + * all of this happening automatically during application startup (i.e. before main is called). + * If creating the default \ref NWindow fails, libnx will throw a LibnxError_BadGfxInit fatal error. + * Likewise, after main returns (or exit is called) libnx will clean up all resources used by it. + */ +NWindow* GetDefault(void); + +/** + * @brief Creates a \ref NWindow. + * @param[out] nw Output \ref NWindow structure. + * @param[in] binder_session Service object for the Android IGraphicBufferProducer binder session. + * @param[in] binder_id Android IGraphicBufferProducer binder session ID. + * @param[in] producer_controlled_by_app Specifies whether the producer is controlled by the application. + */ +Result Create(NWindow* nw, Service* binder_session, s32 binder_id, bool producer_controlled_by_app); + +/** + * @brief Creates a \ref NWindow operating on a \ref ViLayer. + * @param[out] nw Output \ref NWindow structure. + * @param[in] layer Pointer to \ref ViLayer structure (such as the one returned by \ref viCreateLayer). + */ +Result CreateFromLayer(NWindow* nw, const ViLayer* layer); + +/// Closes a \ref NWindow, freeing all resources associated with it. +void Close(NWindow* nw); + +/** + * @brief Retrieves the dimensions of a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[out] out_width Output variable containing the width of the \ref NWindow. + * @param[out] out_height Output variable containing the height of the \ref NWindow. + * @note After creation, a \ref NWindow reports a default size (usually 1280x720). + * This size can be overriden by calling \ref nwindowSetDimensions. + */ +Result GetDimensions(NWindow* nw, u32* out_width, u32* out_height); + +/** + * @brief Sets the dimensions of a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] width Desired width of the \ref NWindow. + * @param[in] height Desired width of the \ref NWindow. + * @note This function cannot be called when there are buffers registered with the \ref NWindow. + */ +Result SetDimensions(NWindow* nw, u32 width, u32 height); + +/** + * @brief Configures the crop applied to images presented through a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] left X coordinate of the left margin of the crop bounding box. + * @param[in] top Y coordinate of the top margin of the crop bounding box. + * @param[in] right X coordinate of the right margin of the crop bounding box. + * @param[in] bottom Y coordinate of the bottom margin of the crop bounding box. + * @note Passing zero to all parameters disables the crop functionality. This is also the default. + * @note The bounding box defined by the parameters will be adjusted to fit within the dimensions of the \ref NWindow. + * @note \p left must be less or equal than \p right. + * @note \p top must be less or equal than \p bottom. + */ +Result SetCrop(NWindow* nw, s32 left, s32 top, s32 right, s32 bottom); + +/** + * @brief Configures the transformation applied to images presented through a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] transform Android transformation mode (see NATIVE_WINDOW_TRANSFORM_* enum) + * @note The default transformation is 0 (i.e. no transformation applied) + */ +Result SetTransform(NWindow* nw, u32 transform); + +/** + * @brief Configures the swap interval of a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] swap_interval Value specifying the number of display refreshes (VBlanks) that must occur between presenting images. + * @note The default swap interval is 1. + * @note If the \ref NWindow has three or more buffers configured (with \ref nwindowConfigureBuffer), it is possible to pass 0 + * to disable the swap interval feature and present images as fast as allowed by the compositor. Otherwise, the system + * enforces a minimum of 1 as the swap interval. + */ +Result SetSwapInterval(NWindow* nw, u32 swap_interval); + +/// Checks whether the consumer of a \ref NWindow is running behind. +bool IsConsumerRunningBehind(NWindow* nw); + +/** + * @brief Registers a \ref NvGraphicBuffer with a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] slot ID of the slot to configure (starting from 0). + * @param[in] buf Pointer to \ref NvGraphicBuffer structure. + * @note When a buffer is registered, it is added to the internal queue of buffers used for presenting. + * @note All buffers registered with a \ref NWindow must have the same dimensions, format and usage. + * If \ref nwindowSetDimensions has not been previously called, the \ref NWindow will automatically + * adopt the dimensions of the first buffer registered with it. Otherwise, said buffer will need + * to match the dimensions that were previously configured. + */ +Result ConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf); + +/** + * @brief Dequeues a buffer from a \ref NWindow. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[out] out_slot Output variable containing the ID of the slot that has been dequeued. + * @param[out] out_fence Output variable containing a \ref NvMultiFence that will be signalled by + * the compositor when the buffer is ready to be written to. Pass NULL to wait instead + * on this fence before this function returns. + * @note For \p out_fence=NULL to work, \ref nvFenceInit must have been previously called. + */ +Result DequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence); + +/** + * @brief Cancels a buffer previously dequeued with \ref nwindowDequeueBuffer. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] slot ID of the slot to cancel. This must match the output of the previous \ref nwindowDequeueBuffer call. + * @param[in] fence Pointer to the \ref NvMultiFence that will be waited on by the compositor before cancelling the buffer. + * Pass NULL if there is no such fence. + */ +Result CancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence); + +/** + * @brief Queues a buffer previously dequeued with \ref nwindowDequeueBuffer, making it ready for presentation. + * @param[in] nw Pointer to \ref NWindow structure. + * @param[in] slot ID of the slot to queue. This must match the output of the previous \ref nwindowDequeueBuffer call. + * @param[in] fence Pointer to the \ref NvMultiFence that will be waited on by the compositor before queuing/presenting the buffer. + * Pass NULL if there is no such fence. + */ +Result QueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence); + +/// Releases all buffers registered with a \ref NWindow. +Result ReleaseBuffers(NWindow* nw); + +} // namespace nwindow + +/// @brief C++ wrappers for the `nxlink` API. +/// @details Wraps: switch/runtime/nxlink.h. +namespace nxlink { + +using ::in_addr; +/// Address of the host connected through nxlink +using ::__nxlink_host; + +/** + * @brief Connects to the nxlink host, setting up an output stream. + * @param[in] redirStdout Whether to redirect stdout to nxlink output. + * @param[in] redirStderr Whether to redirect stderr to nxlink output. + * @return Socket fd on success, negative number on failure. + * @note The socket should be closed with close() during application cleanup. + */ +int ConnectToHost(bool redirStdout, bool redirStderr); + +/// Same as \ref nxlinkConnectToHost but redirecting both stdout/stderr. +int Stdio(void); + +/// Same as \ref nxlinkConnectToHost but redirecting only stderr. +int StdioForDebug(void); + +} // namespace nxlink + +/// @brief C++ wrappers for the `omm` API. +/// @details Wraps: switch/services/omm.h. +namespace omm { + +///OperationMode +using ::OmmOperationMode; +///OperationModePolicy +using ::OmmOperationModePolicy; + +/// Initialize omm. +Result Initialize(void); + +/// Exit omm. +void Exit(void); + +/// Gets the Service for omm. +Service* GetServiceSession(void); + +/// Returns a DefaultDisplayResolution. Only available on [3.0.0+]. +Result GetDefaultDisplayResolution(s32* width, s32* height); + +/// Returns an OmmOperationMode. +Result GetOperationMode(OmmOperationMode* s); + +/// Takes an OmmOperationModePolicy. Only available on [3.0.0+]. +Result SetOperationModePolicy(OmmOperationModePolicy value); + +} // namespace omm + +/// @brief C++ wrappers for the `ovlnrcv` API. +/// @details Wraps: switch/services/ovln.h. +namespace ovlnrcv { + +/// EnqueuePosition +using ::OvlnEnqueuePosition; +/// OverflowOption +using ::OvlnOverflowOption; +/// QueueAttribute +using ::OvlnQueueAttribute; +/// RawMessage +using ::OvlnRawMessage; +/// Receiver +using ::OvlnReceiver; +/// Sender +using ::OvlnSender; +/// SendOption +using ::OvlnSendOption; +/// SourceName +using ::OvlnSourceName; + +/// Initialize ovln:rcv. +Result Initialize(void); + +/// Exit ovln:rcv. +void Exit(void); + +/// Gets the Service object for the actual ovln:rcv service session. +Service* GetServiceSession(void); + +/** + * @brief OpenReceiver + * @param[out] r \ref OvlnReceiver + */ +Result OpenReceiver(OvlnReceiver *r); + +/** + * @brief CloseReceiver + * @param[in] r \ref OvlnReceiver + */ +void CloseReceiver(OvlnReceiver *r); + +/** + * @brief AddSource + * @param[in] r \ref OvlnReceiver + * @param[in] name \ref OvlnSourceName + */ +Result AddSource(OvlnReceiver *r, const OvlnSourceName *name); + +/** + * @brief RemoveSource + * @param[in] r \ref OvlnReceiver + * @param[in] name \ref OvlnSourceName + */ +Result RemoveSource(OvlnReceiver *r, const OvlnSourceName *name); + +/** + * @brief GetReceiveEventHandle + * @param[in] r \ref OvlnReceiver + * @param[out] out_event Output Event with autoclear=true. + */ +Result GetReceiveEventHandle(OvlnReceiver *r, Event* out_event); + +/** + * @brief Receive + * @param[in] r \ref OvlnReceiver + * @param[out] message \ref OvlnRawMessage + */ +Result Receive(OvlnReceiver *r, OvlnRawMessage *message); + +/** + * @brief ReceiveWithTick + * @param[in] r \ref OvlnReceiver + * @param[out] message \ref OvlnRawMessage + * @param[out] tick System tick. + */ +Result ReceiveWithTick(OvlnReceiver *r, OvlnRawMessage *message, s64 *tick); + +} // namespace ovlnrcv + +/// @brief C++ wrappers for the `ovlnsnd` API. +/// @details Wraps: switch/services/ovln.h. +namespace ovlnsnd { + +/// EnqueuePosition +using ::OvlnEnqueuePosition; +/// OverflowOption +using ::OvlnOverflowOption; +/// QueueAttribute +using ::OvlnQueueAttribute; +/// RawMessage +using ::OvlnRawMessage; +/// Receiver +using ::OvlnReceiver; +/// Sender +using ::OvlnSender; +/// SendOption +using ::OvlnSendOption; +/// SourceName +using ::OvlnSourceName; + +/// Initialize ovln:snd. +Result Initialize(void); + +/// Exit ovln:snd. +void Exit(void); + +/// Gets the Service object for the actual ovln:snd service session. +Service* GetServiceSession(void); + +/** + * @brief OpenSender + * @param[in] s \ref OvlnSender + * @param[in] name \ref OvlnSourceName + * @param[in] attribute \ref OvlnQueueAttribute + */ +Result OpenSender(OvlnSender *s, const OvlnSourceName *name, OvlnQueueAttribute attribute); + +/** + * @brief CloseSender + * @param[in] s \ref OvlnSender + */ +void CloseSender(OvlnSender *s); + +/** + * @brief Send + * @param[in] s \ref OvlnSender + * @param[in] option \ref OvlnSendOption + * @param[in] message \ref OvlnRawMessage + */ +Result Send(OvlnSender *s, OvlnSendOption option, const OvlnRawMessage *message); + +/** + * @brief GetUnreceivedMessageCount + * @param[in] s \ref OvlnSender + * @param[out] count number of unreceived messages. + */ +Result GetUnreceivedMessageCount(OvlnSender *s, u32 *count); + +} // namespace ovlnsnd + +/// @brief C++ wrappers for the `pad` API. +/// @details Wraps: switch/runtime/pad.h. +namespace pad { + +/// Pad button repeater state object. +using ::PadRepeater; +/// Pad state object. +using ::PadState; + +/** + * @brief Configures the input layout supported by the application. + * @param[in] max_players The maximum supported number of players (1 to 8). + * @param[in] style_set Bitfield of supported controller styles (see \ref HidNpadStyleTag). + */ +void ConfigureInput(u32 max_players, u32 style_set); + +/** + * @brief Same as \ref padInitialize, but taking a bitfield of controller IDs directly. + * @param[in] pad Pointer to \ref PadState. + * @param[in] mask Bitfield of controller IDs (each bit's position indicates a different \ref HidNpadIdType value). + */ +void InitializeWithMask(PadState* pad, u64 mask); + +/** + * @brief Same as \ref padInitialize, but including every single controller input source. + * @param[in] pad Pointer to \ref PadState. + * @remark Use this function if you want to accept input from any controller. + */ +void InitializeAny(PadState* pad); + +/** + * @brief Same as \ref padInitialize, but including \ref HidNpadIdType_No1 and \ref HidNpadIdType_Handheld. + * @param[in] pad Pointer to \ref PadState. + * @remark Use this function if you just want to accept input for a single-player application. + */ +void InitializeDefault(PadState* pad); + +/** + * @brief Updates pad state by reading from the controller input sources specified during initialization. + * @param[in] pad Pointer to \ref PadState. + */ +void Update(PadState* pad); + +/** + * @brief Retrieves whether \ref HidNpadIdType_Handheld is an active input source (i.e. it was possible to read from it). + * @param[in] pad Pointer to \ref PadState. + * @return Boolean value. + * @remark \ref padUpdate must have been previously called. + */ +bool IsHandheld(const PadState* pad); + +/** + * @brief Retrieves whether the specified controller is an active input source (i.e. it was possible to read from it). + * @param[in] pad Pointer to \ref PadState. + * @param[in] id ID of the controller input source (see \ref HidNpadIdType) + * @return Boolean value. + * @remark \ref padUpdate must have been previously called. + */ +bool IsNpadActive(const PadState* pad, HidNpadIdType id); + +/** + * @brief Retrieves the set of input styles supported by the selected controller input sources. + * @param[in] pad Pointer to \ref PadState. + * @return Bitfield of \ref HidNpadStyleTag. + * @remark \ref padUpdate must have been previously called. + */ +u32 GetStyleSet(const PadState* pad); + +/** + * @brief Retrieves the set of attributes reported by the system for the selected controller input sources. + * @param[in] pad Pointer to \ref PadState. + * @return Bitfield of \ref HidNpadAttribute. + * @remark \ref padUpdate must have been previously called. + */ +u32 GetAttributes(const PadState* pad); + +/** + * @brief Retrieves whether any of the selected controller input sources is connected. + * @param[in] pad Pointer to \ref PadState. + * @return Boolean value. + * @remark \ref padUpdate must have been previously called. + */ +bool IsConnected(const PadState* pad); + +/** + * @brief Retrieves the current set of pressed buttons across all selected controller input sources. + * @param[in] pad Pointer to \ref PadState. + * @return Bitfield of \ref HidNpadButton. + * @remark \ref padUpdate must have been previously called. + */ +u64 GetButtons(const PadState* pad); + +/** + * @brief Retrieves the set of buttons that are newly pressed. + * @param[in] pad Pointer to \ref PadState. + * @return Bitfield of \ref HidNpadButton. + * @remark \ref padUpdate must have been previously called. + */ +u64 GetButtonsDown(const PadState* pad); + +/** + * @brief Retrieves the set of buttons that are newly released. + * @param[in] pad Pointer to \ref PadState. + * @return Bitfield of \ref HidNpadButton. + * @remark \ref padUpdate must have been previously called. + */ +u64 GetButtonsUp(const PadState* pad); + +/** + * @brief Retrieves the position of an analog stick in a controller. + * @param[in] pad Pointer to \ref PadState. + * @param[in] i ID of the analog stick to read (0=left, 1=right). + * @return \ref HidAnalogStickState. + * @remark \ref padUpdate must have been previously called. + */ +HidAnalogStickState GetStickPos(const PadState* pad, unsigned i); + +/** + * @brief Retrieves the position of an analog trigger in a GameCube controller. + * @param[in] pad Pointer to \ref PadState. + * @param[in] i ID of the analog trigger to read (0=left, 1=right). + * @return Analog trigger position (range is 0 to 0x7fff). + * @remark \ref padUpdate must have been previously called. + * @remark \ref HidNpadStyleTag_NpadGc must have been previously configured as a supported style in \ref padConfigureInput for GC trigger data to be readable. + */ +u32 GetGcTriggerPos(const PadState* pad, unsigned i); + +/** + * @brief Initializes a \ref PadRepeater object with the specified settings. + * @param[in] r Pointer to \ref PadRepeater. + * @param[in] delay Number of input updates between button presses being first detected and them being considered for repeat. + * @param[in] repeat Number of input updates between autogenerated repeat button presses. + */ +void RepeaterInitialize(PadRepeater* r, u16 delay, u16 repeat); + +/** + * @brief Updates pad repeat state. + * @param[in] r Pointer to \ref PadRepeater. + * @param[in] button_mask Bitfield of currently pressed \ref HidNpadButton that will be considered for repeat. + */ +void RepeaterUpdate(PadRepeater* r, u64 button_mask); + +/** + * @brief Retrieves the set of buttons that are being repeated according to the parameters specified in \ref padRepeaterInitialize. + * @param[in] r Pointer to \ref PadRepeater. + * @return Bitfield of \ref HidNpadButton. + * @remark It is suggested to bitwise-OR the return value of this function with that of \ref padGetButtonsDown. + */ +u64 RepeaterGetButtons(const PadRepeater* r); + +} // namespace pad + +/// @brief C++ wrappers for the `parcel` API. +/// @details Wraps: switch/display/parcel.h. +namespace parcel { + +using ::Parcel; +using ::ParcelHeader; + +void Create(Parcel *ctx); + +Result Transact(Binder *session, u32 code, Parcel *in_parcel, Parcel *reply_parcel); + +void* WriteData(Parcel *ctx, const void* data, size_t data_size); + +void* ReadData(Parcel *ctx, void* data, size_t data_size); + +void WriteInt32(Parcel *ctx, s32 val); + +void WriteUInt32(Parcel *ctx, u32 val); + +void WriteString16(Parcel *ctx, const char *str); + +s32 ReadInt32(Parcel *ctx); + +u32 ReadUInt32(Parcel *ctx); + +void WriteInterfaceToken(Parcel *ctx, const char *str); + +void* ReadFlattenedObject(Parcel *ctx, size_t *size); + +void* WriteFlattenedObject(Parcel *ctx, const void* data, size_t size); + +} // namespace parcel + +/// @brief C++ wrappers for the `pctl` API. +/// @details Wraps: switch/services/pctl.h. +namespace pctl { + +using ::PctlRestrictionSettings; + +/// Initialize pctl. +Result Initialize(void); + +/// Exit pctl. +void Exit(void); + +/// Gets the Service object for the actual pctl service session. +Service* GetServiceSession(void); + +/// Gets the Service object for IParentalControlService. +Service* GetServiceSession_Service(void); + +/// Gets whether Parental Controls restrictions are temporarily unlocked. +Result IsRestrictionTemporaryUnlocked(bool *flag); + +/// Confirm whether VrMode is allowed. Only available with [4.0.0+]. +Result ConfirmStereoVisionPermission(void); + +/// Gets whether Parental Controls are enabled. +Result IsRestrictionEnabled(bool *flag); + +/// Gets whether Parental Controls are enabled. +Result GetSafetyLevel(u32 *safety_level); + +/// Returns the current restrictions settings. +Result GetCurrentSettings(PctlRestrictionSettings *settings); + +/// Gets the count of applications that have free communication. +Result GetFreeCommunicationApplicationListCount(u32 *count); + +/// Reset the confirmation done by \ref pctlConfirmStereoVisionPermission. Only available with [5.0.0+]. +Result ResetConfirmedStereoVisionPermission(void); + +/// Gets whether VrMode is allowed. Only available with [5.0.0+]. +Result IsStereoVisionPermitted(bool *flag); + +/// Confirm whether pairing is active. +Result IsPairingActive(bool *flag); + +/// Returns the synchronization event. +Result GetSynchronizationEvent(Event* out_event); + +/// Returns the supension event. +Result GetPlayTimerEventToRequestSuspension(Event* out_event); + +/// Confirm whether play timer alarm is disabled. Only available with [4.0.0+]. +Result IsPlayTimerAlarmDisabled(bool *flag); + +/// Returns the unlinked event. +Result GetUnlinkedEvent(Event* out_event); + +} // namespace pctl + +/// @brief C++ wrappers for the `pctlauth` API. +/// @details Wraps: switch/applets/pctlauth.h. +namespace pctlauth { + +/// Input arg storage for the applet. +using ::PctlAuthArg; +/// Type values for PctlAuthArg::type. +using ::PctlAuthType; + +/** + * @brief Launches the applet. + * @note Should not be used if a PIN is not already registered. See \ref pctlIsRestrictionEnabled. + * @param flag Input flag. false = temporarily disable Parental Controls. true = validate the input PIN. + */ +Result Show(bool flag); + +/** + * @brief Launches the applet. Only available with [4.0.0+]. + * @param arg0 Value for PctlAuthArg.arg0. + * @param arg1 Value for PctlAuthArg.arg1. + * @param arg2 Value for PctlAuthArg.arg2. + */ +Result ShowEx(u8 arg0, u8 arg1, u8 arg2); + +/** + * @brief Just calls: pctlauthShowEx(1, 0, 1). Launches the applet for checking the PIN, used when changing system-settings. + * @note Should not be used if a PIN is not already registered. See \ref pctlIsRestrictionEnabled. + */ +Result ShowForConfiguration(void); + +/** + * @brief Launches the applet for registering the Parental Controls PIN. + */ +Result RegisterPasscode(void); + +/** + * @brief Launches the applet for changing the Parental Controls PIN. + * @note Should not be used if a PIN is not already registered. See \ref pctlIsRestrictionEnabled. + */ +Result ChangePasscode(void); + +} // namespace pctlauth + +/// @brief C++ wrappers for the `pcv` API. +/// @details Wraps: switch/services/pcv.h. +namespace pcv { + +using ::PcvClockRatesListType; +using ::PcvModule; +/// Module id returned by [8.0.0+] pcv services +/// See also: https://switchbrew.org/wiki/PCV_services#Modules +using ::PcvModuleId; + +/// Initialize pcv. +Result Initialize(void); + +/// Exit pcv. +void Exit(void); + +/// Gets the Service object for the actual pcv service session. +Service* GetServiceSession(void); + +Result GetModuleId(PcvModuleId *module_id, PcvModule module); + +/// Only available on [1.0.0-7.0.1]. +Result GetClockRate(PcvModule module, u32 *out_hz); + +/// Only available on [1.0.0-7.0.1]. +Result SetClockRate(PcvModule module, u32 hz); + +/// Only available on [1.0.0-7.0.1]. +Result SetVoltageEnabled(u32 power_domain, bool state); + +/// Only available on [1.0.0-7.0.1]. +Result GetVoltageEnabled(bool *isEnabled, u32 power_domain); + +/// Only available on [1.0.0-7.0.1]. +Result GetPossibleClockRates(PcvModule module, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count); + +} // namespace pcv + +/// @brief C++ wrappers for the `pdm` API. +/// @details Wraps: switch/services/pdm.h. +namespace pdm { + +/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed. +using ::PdmAccountEvent; +/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed. +using ::PdmAccountEventV10; +/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed. +using ::PdmAccountEventV3; +/// AccountPlayEvent. +/// This is the raw entry struct directly read from FS, without any entry filtering. This is separate from \ref PdmPlayEvent. +using ::PdmAccountPlayEvent; +/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1]. +using ::PdmAppletEvent; +/// AppletEventType +using ::PdmAppletEventType; +/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed. +/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00. +/// See \ref pdmPlayTimestampToPosix. +using ::PdmAppletEventV1; +/// ApplicationPlayStatistics +using ::PdmApplicationPlayStatistics; +/// LastPlayTime. +/// This contains data from the last time the application was played. +using ::PdmLastPlayTime; +/// PlayEvent. +/// This is the raw entry struct directly read from FS, without any entry filtering. +using ::PdmPlayEvent; +/// PlayEventType +using ::PdmPlayEventType; +/// PlayLogPolicy +using ::PdmPlayLogPolicy; +/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1]. +using ::PdmPlayStatistics; +/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed. +using ::PdmPlayStatisticsV1; + +/** + * @brief Helper function which converts a Play timestamp from the Pdm*Event structs to POSIX. + * @param[in] timestamp Input timestamp. + */ +u64 PlayTimestampToPosix(u32 timestamp); + +} // namespace pdm + +/// @brief C++ wrappers for the `pdmqry` API. +/// @details Wraps: switch/services/pdm.h. +namespace pdmqry { + +/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed. +using ::PdmAccountEvent; +/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed. +using ::PdmAccountEventV10; +/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed. +using ::PdmAccountEventV3; +/// AccountPlayEvent. +/// This is the raw entry struct directly read from FS, without any entry filtering. This is separate from \ref PdmPlayEvent. +using ::PdmAccountPlayEvent; +/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1]. +using ::PdmAppletEvent; +/// AppletEventType +using ::PdmAppletEventType; +/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed. +/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00. +/// See \ref pdmPlayTimestampToPosix. +using ::PdmAppletEventV1; +/// ApplicationPlayStatistics +using ::PdmApplicationPlayStatistics; +/// LastPlayTime. +/// This contains data from the last time the application was played. +using ::PdmLastPlayTime; +/// PlayEvent. +/// This is the raw entry struct directly read from FS, without any entry filtering. +using ::PdmPlayEvent; +/// PlayEventType +using ::PdmPlayEventType; +/// PlayLogPolicy +using ::PdmPlayLogPolicy; +/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1]. +using ::PdmPlayStatistics; +/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed. +using ::PdmPlayStatisticsV1; + +/// Initialize pdm:qry. +Result Initialize(void); + +/// Exit pdm:qry. +void Exit(void); + +/// Gets the Service object for the actual pdm:qry service session. +Service* GetServiceSession(void); + +/** + * @brief Gets a list of \ref PdmAppletEvent. + * @param[in] entry_index Start entry index. + * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. + * @param[out] events Output \ref PdmAppletEvent array. + * @param[in] count Max entries in the output array. + * @param[out] total_out Total output entries. + */ +Result QueryAppletEvent(s32 entry_index, bool flag, PdmAppletEvent *events, s32 count, s32 *total_out); + +/** + * @brief Gets \ref PdmPlayStatistics for the specified ApplicationId. + * @param[in] application_id ApplicationId + * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. + * @param[out] stats \ref PdmPlayStatistics + */ +Result QueryPlayStatisticsByApplicationId(u64 application_id, bool flag, PdmPlayStatistics *stats); + +/** + * @brief Gets \ref PdmPlayStatistics for the specified ApplicationId and account userId. + * @param[in] application_id ApplicationId + * @param[in] uid \ref AccountUid + * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. + * @param[out] stats \ref PdmPlayStatistics + */ +Result QueryPlayStatisticsByApplicationIdAndUserAccountId(u64 application_id, AccountUid uid, bool flag, PdmPlayStatistics *stats); + +/** + * @brief Gets \ref PdmLastPlayTime for the specified applications. + * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. + * @param[out] playtimes Output \ref PdmLastPlayTime array. + * @param[in] application_ids Input ApplicationIds array. + * @param[in] count Total entries in the input/output arrays. + * @param[out] total_out Total output entries. + */ +Result QueryLastPlayTime(bool flag, PdmLastPlayTime *playtimes, const u64 *application_ids, s32 count, s32 *total_out); + +/** + * @brief Gets a list of \ref PdmPlayEvent. + * @param[in] entry_index Start entry index. + * @param[out] events Output \ref PdmPlayEvent array. + * @param[in] count Max entries in the output array. + * @param[out] total_out Total output entries. + */ +Result QueryPlayEvent(s32 entry_index, PdmPlayEvent *events, s32 count, s32 *total_out); + +/** + * @brief Gets range fields which can then be used with the other pdmqry funcs, except for \ref pdmqryQueryAccountPlayEvent. + * @param[out] total_entries Total entries. + * @param[out] start_entry_index Start entry index. + * @param[out] end_entry_index End entry index. + */ +Result GetAvailablePlayEventRange(s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index); + +/** + * @brief Gets a list of \ref PdmAccountEvent. + * @note Only available with [3.0.0+]. + * @param[in] entry_index Start entry index. + * @param[out] events Output \ref PdmAccountEvent array. + * @param[in] count Max entries in the output array. + * @param[out] total_out Total output entries. + */ +Result QueryAccountEvent(s32 entry_index, PdmAccountEvent *events, s32 count, s32 *total_out); + +/** + * @brief Gets a list of \ref PdmAccountPlayEvent. + * @note Only available with [4.0.0+]. + * @param[in] entry_index Start entry index. + * @param[in] uid \ref AccountUid + * @param[out] events Output \ref PdmAccountPlayEvent array. + * @param[in] count Max entries in the output array. + * @param[out] total_out Total output entries. + */ +Result QueryAccountPlayEvent(s32 entry_index, AccountUid uid, PdmAccountPlayEvent *events, s32 count, s32 *total_out); + +/** + * @brief Gets range fields which can then be used with \ref pdmqryQueryAccountPlayEvent. + * @param[in] uid \ref AccountUid + * @param[out] total_entries Total entries. + * @param[out] start_entry_index Start entry index. + * @param[out] end_entry_index End entry index. + */ +Result GetAvailableAccountPlayEventRange(AccountUid uid, s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index); + +/** + * @brief Gets a list of applications played by the specified user. + * @note Only available with [6.0.0-14.1.2]. + * @param[in] uid \ref AccountUid + * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. + * @param[out] application_ids Output ApplicationIds array. + * @param[in] count Max entries in the output array. + * @param[out] total_out Total output entries. + */ +Result QueryRecentlyPlayedApplication(AccountUid uid, bool flag, u64 *application_ids, s32 count, s32 *total_out); + +/** + * @brief Gets an Event which is signaled when logging a new \ref PdmPlayEvent which would be available via \ref pdmqryQueryAccountEvent, where PdmPlayEvent::event_data::account::type is 0. + * @note Only available with [6.0.0-14.1.2]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=false. + */ +Result GetRecentlyPlayedApplicationUpdateEvent(Event* out_event); + +} // namespace pdmqry + +/// @brief C++ wrappers for the `pgl` API. +/// @details Wraps: switch/services/pgl.h. +namespace pgl { + +using ::PglEventObserver; +/// LaunchFlag +using ::PglLaunchFlag; +using ::PglProgramLaunchProperty; +/// SnapShotDumpType +using ::PglSnapShotDumpType; + +/// Initialize pgl. +Result Initialize(void); + +/// Exit pgl. +void Exit(void); + +/// Gets the Service object for the actual pgl service session. Requires < 12.0.0 +Service* GetServiceSessionCmif(void); + +/// Gets the TipcService object for the actual pgl service session. Requires 12.0.0+ +TipcService* GetServiceSessionTipc(void); + +Result LaunchProgram(u64 *out_pid, const NcmProgramLocation *loc, u32 pm_launch_flags, u8 pgl_launch_flags); + +Result TerminateProcess(u64 pid); + +Result LaunchProgramFromHost(u64 *out_pid, const char *content_path, u32 pm_launch_flags); + +Result GetHostProgramLaunchProperty(PglProgramLaunchProperty *out, const char *content_path); + +Result GetRunningApplicationProcessId(u64 *out_pid); + +Result BoostSystemMemoryResourceLimit(u64 size); + +Result IsRunningProcess(bool *out, u64 pid); + +Result EnableApplicationCrashReport(bool en); + +Result IsApplicationCrashReportEnabled(bool *out); + +Result EnableApplicationAllThreadDumpOnCrash(bool en); + +Result GetProcessId(u64 *out_pid, u64 program_id); + +///< [19.0.0+] +Result TriggerSnapShotDumper(PglSnapShotDumpType dump_type, const char *arg); + +///< [10.0.0-11.0.1] +Result CreateShellEvent(PglEventObserver *out); + +Result EnableApplicationCrashReport2(u64 pid, bool en); + +///< [23.0.0+] +Result EventObserverGetShellEvent(PglEventObserver *observer, Event *out); + +Result EventObserverGetShellEventInfo(PglEventObserver *observer, PmProcessEventInfo *out); + +void EventObserverClose(PglEventObserver *observer); + +} // namespace pgl + +/// @brief C++ wrappers for the `pl` API. +/// @details Wraps: switch/services/pl.h. +namespace pl { + +/// FontData +using ::PlFontData; +using ::PlServiceType; +/// SharedFontType +using ::PlSharedFontType; + +/// Initialize pl. +Result Initialize(PlServiceType service_type); + +/// Exit pl. +void Exit(void); + +/// Gets the Service object for the actual pl service session. +Service* GetServiceSession(void); + +/// Gets the address of the SharedMemory. +void* GetSharedmemAddr(void); + +///< Gets a specific shared-font via \ref PlSharedFontType. +Result GetSharedFontByType(PlFontData* font, PlSharedFontType SharedFontType); + +///< Gets shared font(s). +Result GetSharedFont(u64 LanguageCode, PlFontData* fonts, s32 max_fonts, s32* total_fonts); + +} // namespace pl + +/// @brief C++ wrappers for the `pmbm` API. +/// @details Wraps: switch/services/pm.h. +namespace pmbm { + +/// BootMode +using ::PmBootMode; +/// LaunchFlag +using ::PmLaunchFlag; +/// ProcessEvent +using ::PmProcessEvent; +/// ProcessEventInfo +using ::PmProcessEventInfo; +/// ResourceLimitValues +using ::PmResourceLimitValues; + +/// Initialize pm:bm. +Result Initialize(void); + +/// Exit pm:bm. +void Exit(void); + +/// Gets the Service object for the actual pm:bm service session. +Service* GetServiceSession(void); + +/** + * @brief Gets the \ref PmBootMode. + * @param[out] out \ref PmBootMode + */ +Result GetBootMode(PmBootMode *out); + +/** + * @brief Sets the \ref PmBootMode to ::PmBootMode_Maintenance. + */ +Result SetMaintenanceBoot(void); + +} // namespace pmbm + +/// @brief C++ wrappers for the `pmdmnt` API. +/// @details Wraps: switch/services/pm.h. +namespace pmdmnt { + +/// BootMode +using ::PmBootMode; +/// LaunchFlag +using ::PmLaunchFlag; +/// ProcessEvent +using ::PmProcessEvent; +/// ProcessEventInfo +using ::PmProcessEventInfo; +/// ResourceLimitValues +using ::PmResourceLimitValues; + +/// Initialize pm:dmnt. +Result Initialize(void); + +/// Exit pm:dmnt. +void Exit(void); + +/// Gets the Service object for the actual pm:dmnt service session. +Service* GetServiceSession(void); + +Result GetJitDebugProcessIdList(u32* out_count, u64* out_pids, size_t max_pids); + +Result StartProcess(u64 pid); + +Result GetProcessId(u64* pid_out, u64 program_id); + +Result HookToCreateProcess(Event* out, u64 program_id); + +Result GetApplicationProcessId(u64* pid_out); + +Result HookToCreateApplicationProcess(Event* out); + +Result ClearHook(u32 which); + +Result GetProgramId(u64* program_id_out, u64 pid); + +} // namespace pmdmnt + +/// @brief C++ wrappers for the `pminfo` API. +/// @details Wraps: switch/services/pm.h. +namespace pminfo { + +/// BootMode +using ::PmBootMode; +/// LaunchFlag +using ::PmLaunchFlag; +/// ProcessEvent +using ::PmProcessEvent; +/// ProcessEventInfo +using ::PmProcessEventInfo; +/// ResourceLimitValues +using ::PmResourceLimitValues; + +/// Initialize pm:info. +Result Initialize(void); + +/// Exit pm:info. +void Exit(void); + +/// Gets the Service object for the actual pm:info service session. +Service* GetServiceSession(void); + +Result GetProgramId(u64* program_id_out, u64 pid); + +Result GetAppletCurrentResourceLimitValues(PmResourceLimitValues* out); + +Result GetAppletPeakResourceLimitValues(PmResourceLimitValues* out); + +} // namespace pminfo + +/// @brief C++ wrappers for the `pmshell` API. +/// @details Wraps: switch/services/pm.h. +namespace pmshell { + +/// BootMode +using ::PmBootMode; +/// LaunchFlag +using ::PmLaunchFlag; +/// ProcessEvent +using ::PmProcessEvent; +/// ProcessEventInfo +using ::PmProcessEventInfo; +/// ResourceLimitValues +using ::PmResourceLimitValues; + +/// Initialize pm:shell. +Result Initialize(void); + +/// Exit pm:shell. +void Exit(void); + +/// Gets the Service object for the actual pm:shell service session. +Service* GetServiceSession(void); + +Result LaunchProgram(u32 launch_flags, const NcmProgramLocation *location, u64 *pid); + +Result TerminateProcess(u64 processID); + +Result TerminateProgram(u64 program_id); + +Result GetProcessEventHandle(Event* out); + +Result GetProcessEventInfo(PmProcessEventInfo* out); + +Result CleanupProcess(u64 pid); + +Result ClearJitDebugOccured(u64 pid); + +Result NotifyBootFinished(void); + +Result GetApplicationProcessIdForShell(u64* pid_out); + +Result BoostSystemMemoryResourceLimit(u64 boost_size); + +Result BoostApplicationThreadResourceLimit(void); + +Result BoostSystemThreadResourceLimit(void); + +Result GetProcessId(u64* pid_out, u64 program_id); + +} // namespace pmshell + +/// @brief C++ wrappers for the `psc` API. +/// @details Wraps: switch/services/psc.h. +namespace psc { + +using ::PscPmModule; +using ::PscPmModuleId; +using ::PscPmState; + +Result PmModuleGetRequest(PscPmModule *module, PscPmState *out_state, u32 *out_flags); + +Result PmModuleAcknowledge(PscPmModule *module, PscPmState state); + +Result PmModuleFinalize(PscPmModule *module); + +void PmModuleClose(PscPmModule *module); + +} // namespace psc + +/// @brief C++ wrappers for the `pscm` API. +/// @details Wraps: switch/services/psc.h. +namespace pscm { + +using ::PscPmModule; +using ::PscPmModuleId; +using ::PscPmState; + +/// Initialize psc:m. +Result Initialize(void); + +/// Exit psc:m. +void Exit(void); + +/// Gets the Service object for the actual psc:m service session. +Service* GetServiceSession(void); + +Result GetPmModule(PscPmModule *out, PscPmModuleId module_id, const u32 *dependencies, size_t dependency_count, bool autoclear); + +} // namespace pscm + +/// @brief C++ wrappers for the `psel` API. +/// @details Wraps: switch/applets/psel.h. +namespace psel { + +/// NintendoAccountStartupDialogType +using ::PselNintendoAccountStartupDialogType; +/// playerSelect UI modes. +using ::PselUiMode; +/// Return data sent after execution. +using ::PselUiReturnArg; +/// UI settings for versions starting with 0x10000. +using ::PselUiSettings; +/// Base UI settings for playerSelect. +using ::PselUiSettingsV1; +/// UI message text to display with ::PselUiMode_UserSelector. Invalid values are handled as ::PselUserSelectionPurpose_General. +using ::PselUserSelectionPurpose; +/// UserSelectionSettings +using ::PselUserSelectionSettings; +/// [2.0.0+] UserSelectionSettingsForSystemService +using ::PselUserSelectionSettingsForSystemService; + +/** + * @brief Creates a new UI config for the playerSelect applet with the specified mode. + * @param ui PseluiSettings struct. + * @param mode playerSelect UI mode. + */ +Result UiCreate(PselUiSettings *ui, PselUiMode mode); + +/** + * @brief Adds an user to the user list of the applet. + * @param ui PselUiSettings struct. + * @param[in] user_id user ID. + * @note The users will be treated as invalid users for user selection mode, and as the input user for other modes. + */ +void UiAddUser(PselUiSettings *ui, AccountUid user_id); + +/** + * @brief Sets whether users can be created in the applet. + * @param ui PselUiSettings struct. + * @param flag Flag value. + * @note Only used for ::PselUiMode_SelectUser. + */ +void UiSetAllowUserCreation(PselUiSettings *ui, bool flag); + +/** + * @brief Sets whether users need to be linked to a Nintendo account. + * @param ui PselUiSettings struct. + * @param flag Flag value. + */ +void UiSetNetworkServiceRequired(PselUiSettings *ui, bool flag); + +/** + * @brief Sets whether selection can be skipped with a button. + * @param ui PselUiSettings struct. + * @param flag Flag value. + */ +void UiSetSkipButtonEnabled(PselUiSettings *ui, bool flag); + +/** + * @brief Shows the applet with the specified UI settings. + * @param ui PselUiSettings struct. + * @param out_user Selected user ID. + * @note If user skips (see \ref pselUiSetSkipEnabled) this will return successfully but the output ID will be 0. + */ +Result UiShow(PselUiSettings *ui, AccountUid *out_user); + +/** + * @brief This is the System version of \ref pselShowUserSelector. + * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled. + * @param[out] out_user Returned selected user ID. + * @param[in] settings \ref PselUserSelectionSettings + * @param[in] settings_system [2.0.0+] \ref PselUserSelectionSettingsForSystemService, ignored on prior versions. + */ +Result ShowUserSelectorForSystem(AccountUid *out_user, const PselUserSelectionSettings *settings, const PselUserSelectionSettingsForSystemService *settings_system); + +/** + * @brief This is the Launcher version of \ref pselShowUserSelector. + * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled. + * @param[out] out_user Returned selected user ID. + * @param[in] settings \ref PselUserSelectionSettings + * @param[in] application_id ApplicationId + */ +Result ShowUserSelectorForLauncher(AccountUid *out_user, const PselUserSelectionSettings *settings, u64 application_id); + +/** + * @brief Shows the applet to select a user. + * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled. + * @param[out] out_user Returned selected user ID. + * @param[in] settings \ref PselUserSelectionSettings + */ +Result ShowUserSelector(AccountUid *out_user, const PselUserSelectionSettings *settings); + +/** + * @brief Shows the applet to create a user. + * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. If the output flag is 0, an error will be thrown. + */ +Result ShowUserCreator(void); + +/** + * @brief Shows the applet to change a user's icon. + * @param[in] user Input user ID. + */ +Result ShowUserIconEditor(AccountUid user); + +/** + * @brief Shows the applet to change a user's nickname. + * @param[in] user Input user ID. + */ +Result ShowUserNicknameEditor(AccountUid user); + +/** + * @brief Shows the applet to create a user. Used by the starter applet during system setup. + */ +Result ShowUserCreatorForStarter(void); + +/** + * @brief Shows the applet for Nintendo Account Nnid linking. + * @note Only available on [6.0.0+]. + * @param[in] user Input user ID. + */ +Result ShowNintendoAccountNnidLinker(AccountUid user); + +/** + * @brief Shows the applet for UserQualificationPromoter. + * @note Only available on [13.0.0+]. + * @param[in] user Input user ID. + */ +Result ShowUserQualificationPromoter(AccountUid user); + +} // namespace psel + +/// @brief C++ wrappers for the `psm` API. +/// @details Wraps: switch/services/psm.h. +namespace psm { + +/// BatteryChargeInfoFields [17.0.0+] +using ::PsmBatteryChargeInfoFields; +/// BatteryChargeInfoFieldsOld [1.0.0-16.1.0] +using ::PsmBatteryChargeInfoFieldsOld; +/// BatteryVoltageState +using ::PsmBatteryVoltageState; +/// ChargerType +using ::PsmChargerType; +/// IPsmSession +using ::PsmSession; +/// Vdd50State +using ::PsmVdd50State; + +/// Initialize psm. +Result Initialize(void); + +/// Exit psm. +void Exit(void); + +/// Gets the Service object for the actual psm service session. +Service* GetServiceSession(void); + +/** + * @brief GetBatteryChargePercentage + * @param[out] out Battery charge percentage. + */ +Result GetBatteryChargePercentage(u32 *out); + +/** + * @brief GetChargerType + * @param[out] out \ref PsmChargerType + */ +Result GetChargerType(PsmChargerType *out); + +/** + * @brief EnableBatteryCharging + */ +Result EnableBatteryCharging(void); + +/** + * @brief DisableBatteryCharging + */ +Result DisableBatteryCharging(void); + +/** + * @brief IsBatteryChargingEnabled + * @param[out] out Output flag. + */ +Result IsBatteryChargingEnabled(bool *out); + +/** + * @brief AcquireControllerPowerSupply + */ +Result AcquireControllerPowerSupply(void); + +/** + * @brief ReleaseControllerPowerSupply + */ +Result ReleaseControllerPowerSupply(void); + +/** + * @brief EnableEnoughPowerChargeEmulation + */ +Result EnableEnoughPowerChargeEmulation(void); + +/** + * @brief DisableEnoughPowerChargeEmulation + */ +Result DisableEnoughPowerChargeEmulation(void); + +/** + * @brief EnableFastBatteryCharging + */ +Result EnableFastBatteryCharging(void); + +/** + * @brief DisableFastBatteryCharging + */ +Result DisableFastBatteryCharging(void); + +/** + * @brief GetBatteryVoltageState + * @param[out] out \ref PsmBatteryVoltageState + */ +Result GetBatteryVoltageState(PsmBatteryVoltageState *out); + +/** + * @brief GetRawBatteryChargePercentage + * @param[out] out Raw battery charge percentage. + */ +Result GetRawBatteryChargePercentage(double *out); + +/** + * @brief IsEnoughPowerSupplied + * @param[out] out Output flag. + */ +Result IsEnoughPowerSupplied(bool *out); + +/** + * @brief GetBatteryAgePercentage + * @param[out] out Battery age percentage. + */ +Result GetBatteryAgePercentage(double *out); + +/** + * @brief GetBatteryChargeInfoEvent + * @param[out] out_event Event object. + * @param[in] autoclear Event autoclear. + */ +Result GetBatteryChargeInfoEvent(Event* out_event, bool autoclear); + +/** + * @brief GetBatteryChargeInfoFields + * @param[out] out_fields \ref PsmBatteryChargeInfoFields + */ +Result GetBatteryChargeInfoFields(PsmBatteryChargeInfoFields *out_fields); + +/** + * @brief GetBatteryChargeCalibratedEvent + * @note Only available on [3.0.0+]. + * @param[out] out_event Event object. + * @param[in] autoclear Event autoclear. + */ +Result GetBatteryChargeCalibratedEvent(Event* out_event, bool autoclear); + +/** + * @brief Wrapper func which opens a PsmSession and handles event setup. + * @note Uses the actual BindStateChangeEvent cmd internally. + * @note The event is not signalled on BatteryChargePercentage changes. + * @param[out] s PsmSession object. + * @param[in] ChargerType Passed to SetChargerTypeChangeEventEnabled. + * @param[in] PowerSupply Passed to SetPowerSupplyChangeEventEnabled. + * @param[in] BatteryVoltage Passed to SetBatteryVoltageStateChangeEventEnabled. + */ +Result BindStateChangeEvent(PsmSession* s, bool ChargerType, bool PowerSupply, bool BatteryVoltage); + +/// Wait on the Event setup by \ref psmBindStateChangeEvent. +Result WaitStateChangeEvent(PsmSession* s, u64 timeout); + +/// Cleanup version of \ref psmBindStateChangeEvent. Must be called by the user once the PsmSession is done being used. +Result UnbindStateChangeEvent(PsmSession* s); + +} // namespace psm + +/// @brief C++ wrappers for the `random` API. +/// @details Wraps: switch/kernel/random.h. +namespace random { + +/** + * @brief Fills a buffer with random data. + * @param buf Pointer to the buffer. + * @param len Size of the buffer in bytes. + */ +void Get(void* buf, size_t len); + +/** + * @brief Returns a random 64-bit value. + * @return Random value. + */ +u64 Get64(void); + +} // namespace random + +/// @brief C++ wrappers for the `resolver` API. +/// @details Wraps: switch/runtime/resolver.h. +namespace resolver { + +/// Fetches the last resolver Switch result code of the current thread. +Result GetLastResult(void); + +/// Retrieves a handle used to cancel the next resolver command on the current thread. +u32 GetCancelHandle(void); + +/// Retrieves whether service discovery is enabled for resolver commands on the current thread. +bool GetEnableServiceDiscovery(void); + +/// [5.0.0+] Retrieves whether the DNS cache is used to resolve queries on the current thread (not implemented). +bool GetEnableDnsCache(void); + +/// Enables or disables service discovery for the current thread. +void SetEnableServiceDiscovery(bool enable); + +/// [5.0.0+] Enables or disables the usage of the DNS cache on the current thread (not implemented). +void SetEnableDnsCache(bool enable); + +/// Cancels a previous resolver command (handle obtained with \ref resolverGetCancelHandle prior to calling the command). +Result Cancel(u32 handle); + +/// [5.0.0+] Removes a hostname from the DNS cache (not implemented). +Result RemoveHostnameFromCache(const char* hostname); + +/// [5.0.0+] Removes an IP address from the DNS cache (not implemented). +Result RemoveIpAddressFromCache(u32 ip); + +} // namespace resolver + +/// @brief C++ wrappers for the `ringcon` API. +/// @details Wraps: switch/runtime/ringcon.h. +namespace ringcon { + +/// Ring-Con state object. +using ::RingCon; +/// Whether the output data is valid. +using ::RingConDataValid; +using ::RingConErrorFlag; +/// Ring-Con firmware version. +using ::RingConFwVersion; +/// Ring-Con manufacturer calibration. +using ::RingConManuCal; +/// Polling data extracted from \ref HidbusJoyPollingReceivedData. +using ::RingConPollingData; +/// Ring-Con user calibration. +using ::RingConUserCal; + +/** + * @brief Creates a \ref RingCon object, and handles the various initialization for it. + * @param c \ref RingCon + * @param[in] id \ref HidNpadIdType. A Ring-Con must be attached to this controller. + */ +Result Create(RingCon *c, HidNpadIdType id); + +/** + * @brief Close a \ref RingCon. + * @param c \ref RingCon + */ +void Close(RingCon *c); + +/** + * @brief Gets the error flags field. + * @param c \ref RingCon + */ +u32 GetErrorFlags(RingCon *c); + +/** + * @brief Gets the value of an error flag, set by \ref ringconSetErrorFlag. + * @param c \ref RingCon + * @param[in] flag \ref RingConErrorFlag + */ +bool GetErrorFlag(RingCon *c, RingConErrorFlag flag); + +/** + * @brief Gets the \ref RingConFwVersion previously loaded by \ref ringconCreate. + * @param c \ref RingCon + * @param[out] out \ref RingConFwVersion + */ +RingConFwVersion GetFwVersion(RingCon *c); + +/** + * @brief Gets the Id previously loaded by \ref ringconCreate. + * @param c \ref RingCon + * @param[out] id_l Id low. + * @param[out] id_h Id high. + */ +void GetId(RingCon *c, u64 *id_l, u64 *id_h); + +/** + * @brief Gets the unk_cal previously loaded by \ref ringconCreate with \ref ringconReadUnkCal. Only valid when the output flag from \ref ringconCmdx00020105 is valid. + * @param c \ref RingCon + */ +s16 GetUnkCal(RingCon *c); + +/** + * @brief Gets the total-push-count previously loaded by \ref ringconCreate. + * @param c \ref RingCon + * @param[out] out total_push_count + */ +s32 GetTotalPushCount(RingCon *c); + +/** + * @brief Gets the \ref RingConManuCal previously loaded by \ref ringconCreate. + * @param c \ref RingCon + * @param[out] out \ref RingConManuCal + */ +void GetManuCal(RingCon *c, RingConManuCal *out); + +/** + * @brief Gets the \ref RingConUserCal previously loaded by \ref ringconCreate. + * @note The Ring-Con UserCal doesn't seem to be calibrated normally? + * @param c \ref RingCon + * @param[out] out \ref RingConUserCal + */ +void GetUserCal(RingCon *c, RingConUserCal *out); + +/** + * @brief Updates the \ref RingConUserCal. + * @note The input \ref RingConUserCal is used with \ref ringconWriteUserCal, and the output from \ref ringconReadUserCal is verified with the input \ref RingConUserCal. This does not update the \ref RingConUserCal returned by \ref ringconGetUserCal. + * @note The Ring-Con UserCal doesn't seem to be calibrated normally? + * @param c \ref RingCon + * @param[in] cal \ref RingConUserCal + */ +Result UpdateUserCal(RingCon *c, RingConUserCal cal); + +/** + * @brief Reads the \ref RingConFwVersion. + * @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetFwVersion instead. + * @param c \ref RingCon + * @param[out] out \ref RingConFwVersion + */ +Result ReadFwVersion(RingCon *c, RingConFwVersion *out); + +/** + * @brief Reads the Id. + * @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetId instead. + * @param c \ref RingCon + * @param[out] id_l Id low. + * @param[out] id_h Id high. + */ +Result ReadId(RingCon *c, u64 *id_l, u64 *id_h); + +/** + * @brief Gets the \ref RingConPollingData. Only returns entries which are new since the last time this was called (or if not previously called, all available entries up to count). + * @param c \ref RingCon + * @param[out] out Output array of \ref RingConPollingData. Entry order is newest -> oldest. + * @param[in] count Total size of the out array in entries, max value is 0x9. + * @param[out] total_out Total output entries. + */ +Result GetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32 *total_out); + +/** + * @brief Uses cmd 0x00020105. + * @note Used internally by \ref ringconCreate. + * @param c \ref RingCon + * @param[out] out Output value. + */ +Result Cmdx00020105(RingCon *c, u32 *out); + +/** + * @brief Reads the \ref RingConManuCal. + * @note Used internally by \ref ringconCreate and \ref ringconReadUnkCal. + * @param c \ref RingCon + * @param[out] out \ref RingConManuCal + */ +Result ReadManuCal(RingCon *c, RingConManuCal *out); + +/** + * @brief Gets the unknown value derived from the output of cmd 0x00020504 and \ref ringconReadManuCal. + * @note Used internally by \ref ringconCreate. + * @param c \ref RingCon + * @param[out] out Output value. + */ +Result ReadUnkCal(RingCon *c, s16 *out); + +/** + * @brief Reads the \ref RingConUserCal. + * @note Used internally by \ref ringconCreate and \ref ringconUpdateUserCal. + * @param c \ref RingCon + * @param[out] out \ref RingConUserCal + */ +Result ReadUserCal(RingCon *c, RingConUserCal *out); + +/** + * @brief Reads the rep-count for Multitask Mode. + * @param c \ref RingCon + * @param[out] out Output value. Official sw using this clamps the output to range 0-500. + * @param[out] data_valid \ref RingConDataValid + */ +Result ReadRepCount(RingCon *c, s32 *out, RingConDataValid *data_valid); + +/** + * @brief Reads the total-push-count, for Multitask Mode. + * @note Used internally by \ref ringconCreate. Normally \ref ringconGetTotalPushCount should be used instead. + * @param c \ref RingCon + * @param[out] out Output value. + * @param[out] data_valid \ref RingConDataValid + */ +Result ReadTotalPushCount(RingCon *c, s32 *out, RingConDataValid *data_valid); + +/** + * @brief This resets the value returned by \ref ringconReadRepCount to 0. + * @param c \ref RingCon + */ +Result ResetRepCount(RingCon *c); + +/** + * @brief Writes the \ref RingConUserCal. + * @note Used internally by \ref ringconUpdateUserCal. + * @param c \ref RingCon + * @param[in] cal \ref RingConUserCal + */ +Result WriteUserCal(RingCon *c, RingConUserCal cal); + +} // namespace ringcon + +/// @brief C++ wrappers for the `rmutex` API. +/// @details Wraps: switch/kernel/mutex.h. +namespace rmutex { + +/// Mutex datatype, defined in newlib. +using ::Mutex; +/// Recursive mutex datatype, defined in newlib. +using ::RMutex; + +/** + * @brief Initializes a recursive mutex. + * @param m Recursive mutex object. + * @note A recursive mutex can also be statically initialized by assigning {0,0,0} to it. + */ +void Init(RMutex* m); + +/** + * @brief Locks a recursive mutex. + * @param m Recursive mutex object. + */ +void Lock(RMutex* m); + +/** + * @brief Attempts to lock a recursive mutex without waiting. + * @param m Recursive mutex object. + * @return 1 if the mutex has been acquired successfully, and 0 on contention. + */ +bool TryLock(RMutex* m); + +/** + * @brief Unlocks a recursive mutex. + * @param m Recursive mutex object. + */ +void Unlock(RMutex* m); + +} // namespace rmutex + +/// @brief C++ wrappers for the `ro` API. +/// @details Wraps: switch/services/ro.h. +namespace ro { + +/// Initialize ro:dmnt. Only available with [3.0.0+]. +Result DmntInitialize(void); + +/// Exit ro:dmnt. +void DmntExit(void); + +/// Gets the Service object for the actual ro:dmnt service session. +Service* DmntGetServiceSession(void); + +Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out); + +} // namespace ro + +/// @brief C++ wrappers for the `ro1` API. +/// @details Wraps: switch/services/ro.h. +namespace ro1 { + +/// Initialize ro:1. Only available with [7.0.0+]. +Result Initialize(void); + +/// Exit ro:1. +void Exit(void); + +/// Gets the Service object for the actual ro:1 service session. +Service* GetServiceSession(void); + +Result LoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); + +Result UnloadNro(u64 nro_address); + +Result LoadNrr(u64 nrr_address, u64 nrr_size); + +Result UnloadNrr(u64 nrr_address); + +Result LoadNrrEx(u64 nrr_address, u64 nrr_size); + +} // namespace ro1 + +/// @brief C++ wrappers for the `romfs` API. +/// @details Wraps: switch/runtime/devices/romfs_dev.h. +namespace romfs { + +/// RomFS directory. +using ::romfs_dir; +/// RomFS file. +using ::romfs_file; +/// RomFS header. +using ::romfs_header; + +/** + * @brief Mounts the Application's RomFS. + * @param name Device mount name. + * @remark This function is intended to be used to access one's own RomFS. + * If the application is running as NRO, it mounts the embedded RomFS section inside the NRO. + * If on the other hand it's an NSO, it behaves identically to \ref romfsMountFromCurrentProcess. + */ +Result MountSelf(const char *name); + +/** + * @brief Mounts RomFS from an open file. + * @param file FsFile of the RomFS image. + * @param offset Offset of the RomFS within the file. + * @param name Device mount name. + */ +Result MountFromFile(FsFile file, u64 offset, const char *name); + +/** + * @brief Mounts RomFS from an open storage. + * @param storage FsStorage of the RomFS image. + * @param offset Offset of the RomFS within the storage. + * @param name Device mount name. + */ +Result MountFromStorage(FsStorage storage, u64 offset, const char *name); + +/** + * @brief Mounts RomFS using the current process host program RomFS. + * @param name Device mount name. + */ +Result MountFromCurrentProcess(const char *name); + +/** + * @brief Mounts RomFS of a running program. + * @note Permission needs to be set in the NPDM. + * @param program_id ProgramId to mount. + * @param name Device mount name. + */ +Result MountDataStorageFromProgram(u64 program_id, const char *name); + +/** + * @brief Mounts RomFS from a file path in a mounted fsdev device. + * @param path File path. + * @param offset Offset of the RomFS within the file. + * @param name Device mount name. + */ +Result MountFromFsdev(const char *path, u64 offset, const char *name); + +/** + * @brief Mounts RomFS from SystemData. + * @param dataId SystemDataId to mount. + * @param storageId Storage ID to mount from. + * @param name Device mount name. + */ +Result MountFromDataArchive(u64 dataId, NcmStorageId storageId, const char *name); + +/// Unmounts the RomFS device. +Result Unmount(const char *name); + +/// Wrapper for \ref romfsMountSelf with the default "romfs" device name. +Result Init(void); + +/// Wrapper for \ref romfsUnmount with the default "romfs" device name. +Result Exit(void); + +} // namespace romfs + +/// @brief C++ wrappers for the `rwlock` API. +/// @details Wraps: switch/kernel/rwlock.h. +namespace rwlock { + +/// Read/write lock structure. +using ::RwLock; + +/** + * @brief Initializes the read/write lock. + * @param r Read/write lock object. + */ +void Init(RwLock* r); + +/** + * @brief Locks the read/write lock for reading. + * @param r Read/write lock object. + */ +void ReadLock(RwLock* r); + +/** + * @brief Attempts to lock the read/write lock for reading without waiting. + * @param r Read/write lock object. + * @return 1 if the mutex has been acquired successfully, and 0 on contention. + */ +bool TryReadLock(RwLock* r); + +/** + * @brief Unlocks the read/write lock for reading. + * @param r Read/write lock object. + */ +void ReadUnlock(RwLock* r); + +/** + * @brief Locks the read/write lock for writing. + * @param r Read/write lock object. + */ +void WriteLock(RwLock* r); + +/** + * @brief Attempts to lock the read/write lock for writing without waiting. + * @param r Read/write lock object. + * @return 1 if the mutex has been acquired successfully, and 0 on contention. + */ +bool TryWriteLock(RwLock* r); + +/** + * @brief Unlocks the read/write lock for writing. + * @param r Read/write lock object. + */ +void WriteUnlock(RwLock* r); + +/** + * @brief Checks if the write lock is held by the current thread. + * @param r Read/write lock object. + * @return 1 if the current hold holds the write lock, and 0 if it does not. + */ +bool IsWriteLockHeldByCurrentThread(RwLock* r); + +/** + * @brief Checks if the read/write lock is owned by the current thread. + * @param r Read/write lock object. + * @return 1 if the current hold holds the write lock or if it holds read locks acquired + * while it held the write lock, and 0 if it does not. + */ +bool IsOwnedByCurrentThread(RwLock* r); + +} // namespace rwlock + +/// @brief C++ wrappers for the `semaphore` API. +/// @details Wraps: switch/kernel/semaphore.h. +namespace semaphore { + +/// Semaphore structure. +using ::Semaphore; + +/** + * @brief Initializes a semaphore and its internal counter. + * @param s Semaphore object. + * @param initial_count initial value for internal counter (typically the # of free resources). + */ +void Init(Semaphore *s, u64 initial_count); + +/** + * @brief Increments the Semaphore to allow other threads to continue. + * @param s Semaphore object. + */ +void Signal(Semaphore *s); + +/** + * @brief Decrements Semaphore and waits if 0. + * @param s Semaphore object. + */ +void Wait(Semaphore *s); + +/** + * @brief Attempts to get lock without waiting. + * @param s Semaphore object. + * @return true if no wait and successful lock, false otherwise. + */ +bool TryWait(Semaphore *s); + +} // namespace semaphore + +/// @brief C++ wrappers for the `service` API. +/// @details Wraps: switch/sf/service.h. +namespace service { + +/// Service object structure +using ::Service; +using ::SfBuffer; +using ::SfBufferAttrs; +using ::SfDispatchParams; +using ::SfOutHandleAttr; +using ::SfOutHandleAttrs; + +/** + * @brief Returns whether a service has been initialized. + * @param[in] s Service object. + * @return true if initialized. + */ +bool IsActive(Service* s); + +/** + * @brief Returns whether a service is overriden in the homebrew environment. + * @param[in] s Service object. + * @return true if overriden. + */ +bool IsOverride(Service* s); + +/** + * @brief Returns whether a service is a domain. + * @param[in] s Service object. + * @return true if a domain. + */ +bool IsDomain(Service* s); + +/** + * @brief Returns whether a service is a domain subservice. + * @param[in] s Service object. + * @return true if a domain subservice. + */ +bool IsDomainSubservice(Service* s); + +/** + * @brief For a domain/domain subservice, return the associated object ID. + * @param[in] s Service object, necessarily a domain or domain subservice. + * @return The object ID. + */ +u32 GetObjectId(Service* s); + +/** + * @brief Creates a service object from an IPC session handle. + * @param[out] s Service object. + * @param[in] h IPC session handle. + */ +void Create(Service* s, Handle h); + +/** + * @brief Creates a non-domain subservice object from a parent service. + * @param[out] s Service object. + * @param[in] parent Parent service. + * @param[in] h IPC session handle for this subservice. + */ +void CreateNonDomainSubservice(Service* s, Service* parent, Handle h); + +/** + * @brief Creates a domain subservice object from a parent service. + * @param[out] s Service object. + * @param[in] parent Parent service, necessarily a domain or domain subservice. + * @param[in] object_id Object ID for this subservice. + */ +void CreateDomainSubservice(Service* s, Service* parent, u32 object_id); + +/** + * @brief Closes a service. + * @param[in] s Service object. + */ +void Close(Service* s); + +/** + * @brief Clones a service. + * @param[in] s Service object. + * @param[out] out_s Output service object. + */ +Result Clone(Service* s, Service* out_s); + +/** + * @brief Clones a service with a session manager tag. + * @param[in] s Service object. + * @param[in] tag Session manager tag (unused in current official server code) + * @param[out] out_s Output service object. + */ +Result CloneEx(Service* s, u32 tag, Service* out_s); + +/** + * @brief Converts a regular service to a domain. + * @param[in] s Service object. + * @return Result code. + */ +Result ConvertToDomain(Service* s); + +void RequestFormatProcessBuffer(CmifRequestFormat* fmt, u32 attr); + +void RequestProcessBuffer(CmifRequest* req, const SfBuffer* buf, u32 attr); + +void* MakeRequest(Service* s, u32 request_id, u32 context, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_objects, const Service* const* objects, u32 num_handles, const Handle* handles); + +void ResponseGetHandle(CmifResponse* res, SfOutHandleAttr type, Handle* out); + +Result ParseResponse(Service* s, u32 out_size, void** out_data, u32 num_out_objects, Service* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles); + +Result DispatchImpl(Service* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, SfDispatchParams disp); + +} // namespace service + +/// @brief C++ wrappers for the `sessionmgr` API. +/// @details Wraps: switch/sf/sessionmgr.h. +namespace sessionmgr { + +using ::SessionMgr; + +Result Create(SessionMgr* mgr, Handle root_session, u32 num_sessions); + +void Close(SessionMgr* mgr); + +int AttachClient(SessionMgr* mgr); + +void DetachClient(SessionMgr* mgr, int slot); + +Handle GetClientSession(SessionMgr* mgr, int slot); + +} // namespace sessionmgr + +/// @brief C++ wrappers for the `set` API. +/// @details Wraps: switch/services/set.h. +namespace set { + +using ::ColorSetId; +/// BatteryLot +using ::SetBatteryLot; +using ::SetCalAccelerometerOffset; +using ::SetCalAccelerometerScale; +using ::SetCalAmiiboEcdsaCertificate; +using ::SetCalAmiiboEcqvBlsCertificate; +using ::SetCalAmiiboEcqvBlsKey; +using ::SetCalAmiiboEcqvBlsRootCertificate; +using ::SetCalAmiiboEcqvCertificate; +using ::SetCalAmiiboKey; +using ::SetCalAnalogStickFactoryCalibration; +using ::SetCalAnalogStickModelParameter; +using ::SetCalBdAddress; +using ::SetCalConfigurationId1; +using ::SetCalConsoleSixAxisSensorHorizontalOffset; +using ::SetCalCountryCode; +using ::SetCalEccB233DeviceCertificate; +using ::SetCalEccB233DeviceKey; +using ::SetCalGameCardCertificate; +using ::SetCalGameCardKey; +using ::SetCalGyroscopeOffset; +using ::SetCalGyroscopeScale; +using ::SetCalMacAddress; +using ::SetCalRegionCode; +using ::SetCalRsa2048DeviceCertificate; +using ::SetCalRsa2048DeviceKey; +using ::SetCalSerialNumber; +using ::SetCalSpeakerParameter; +using ::SetCalSslCertificate; +using ::SetCalSslKey; +/// ChineseTraditionalInputMethod +using ::SetChineseTraditionalInputMethod; +/// KeyboardLayout +using ::SetKeyboardLayout; +/// IDs for Language. +using ::SetLanguage; +/// Region codes. +using ::SetRegion; +/// AccessPointSecurityStandard +using ::SetSysAccessPointSecurityStandard; +/// AccessPointSecurityType +using ::SetSysAccessPointSecurityType; +/// AccountNotificationSettings +using ::SetSysAccountNotificationSettings; +/// AccountOnlineStorageSettings +using ::SetSysAccountOnlineStorageSettings; +/// AccountSettings +using ::SetSysAccountSettings; +/// AllowedSslHosts +using ::SetSysAllowedSslHosts; +/// AnalogStickUserCalibration +using ::SetSysAnalogStickUserCalibration; +/// AudioDevice +using ::SetSysAudioDevice; +/// AudioOutputMode +using ::SetSysAudioOutputMode; +/// AudioOutputModeTarget +using ::SetSysAudioOutputModeTarget; +using ::SetSysAudioVolume; +/// AutoSettings +using ::SetSysAutoSettings; +/// BacklightSettings +using ::SetSysBacklightSettings; +/// BacklightSettingsEx +using ::SetSysBacklightSettingsEx; +/// BlePairingSettings +using ::SetSysBlePairingSettings; +/// BlockType +using ::SetSysBlockType; +/// BluetoothDevicesSettings +using ::SetSysBluetoothDevicesSettings; +/// ButtonConfigRegisteredSettings +using ::SetSysButtonConfigRegisteredSettings; +/// ButtonConfigSettings +using ::SetSysButtonConfigSettings; +/// Actually nn::util::Color4u8Type. +using ::SetSysColor4u8Type; +/// ConnectionFlag +using ::SetSysConnectionFlag; +/// ConsoleSixAxisSensorAccelerationBias +using ::SetSysConsoleSixAxisSensorAccelerationBias; +/// ConsoleSixAxisSensorAccelerationGain +using ::SetSysConsoleSixAxisSensorAccelerationGain; +/// ConsoleSixAxisSensorAngularAcceleration +using ::SetSysConsoleSixAxisSensorAngularAcceleration; +/// ConsoleSixAxisSensorAngularVelocityBias +using ::SetSysConsoleSixAxisSensorAngularVelocityBias; +/// ConsoleSixAxisSensorAngularVelocityGain +using ::SetSysConsoleSixAxisSensorAngularVelocityGain; +/// ConsoleSixAxisSensorAngularVelocityTimeBias +using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; +/// ConsoleSleepPlan +using ::SetSysConsoleSleepPlan; +/// ControllerType +using ::SetSysControllerType; +using ::SetSysDataBlock; +/// DataDeletionSettings +using ::SetSysDataDeletionSettings; +/// DeviceNickName +using ::SetSysDeviceNickName; +/// Edid +using ::SetSysEdid; +/// ErrorReportSharePermission +using ::SetSysErrorReportSharePermission; +/// EulaVersion +using ::SetSysEulaVersion; +/// EulaVersionClockType +using ::SetSysEulaVersionClockType; +using ::SetSysExtensionBlock; +/// Structure returned by \ref setsysGetFirmwareVersion. +using ::SetSysFirmwareVersion; +/// Structure returned by \ref setsysGetFirmwareVersionDigest. +using ::SetSysFirmwareVersionDigest; +/// FriendPresenceOverlayPermission +using ::SetSysFriendPresenceOverlayPermission; +/// HandheldSleepPlan +using ::SetSysHandheldSleepPlan; +/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. +using ::SetSysHomeMenuScheme; +/// HostFsMountPoint +using ::SetSysHostFsMountPoint; +/// InitialLaunchSettings +using ::SetSysInitialLaunchSettings; +/// LcdBacklightBrightnessMapping +using ::SetSysLcdBacklightBrightnessMapping; +using ::SetSysModeLine; +/// NetworkSettings +using ::SetSysNetworkSettings; +/// NotificationSettings +using ::SetSysNotificationSettings; +/// NotificationTime +using ::SetSysNotificationTime; +/// NotificationVolume +using ::SetSysNotificationVolume; +/// NxControllerLegacySettings +using ::SetSysNxControllerLegacySettings; +/// NxControllerSettings +using ::SetSysNxControllerSettings; +/// PlatformRegion. Other values not listed here should be handled as "Unknown". +using ::SetSysPlatformRegion; +/// PrimaryAlbumStorage +using ::SetSysPrimaryAlbumStorage; +/// Console Product Models +using ::SetSysProductModel; +/// ProxyFlags +using ::SetSysProxyFlags; +/// PtmCycleCountReliability +using ::SetSysPtmCycleCountReliability; +/// PtmFuelGaugeParameter +using ::SetSysPtmFuelGaugeParameter; +/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. +using ::SetSysRebootlessSystemUpdateVersion; +/// Structure returned by \ref setsysGetSerialNumber. +using ::SetSysSerialNumber; +/// ServiceDiscoveryControlSettings +using ::SetSysServiceDiscoveryControlSettings; +/// SleepSettings +using ::SetSysSleepSettings; +/// ThemeId +using ::SetSysThemeId; +/// ThemeSettings +using ::SetSysThemeSettings; +/// TouchScreenMode, for "Touch-Screen Sensitivity". +using ::SetSysTouchScreenMode; +/// TvSettings +using ::SetSysTvSettings; +/// UserSelectorFlag +using ::SetSysUserSelectorFlag; +/// UserSelectorSettings +using ::SetSysUserSelectorSettings; + +/// Initialize set. +Result Initialize(void); + +/// Exit set. +void Exit(void); + +/// Gets the Service object for the actual set service session. +Service* GetServiceSession(void); + +/// Converts LanguageCode to \ref SetLanguage. +Result MakeLanguage(u64 LanguageCode, SetLanguage *Language); + +/// Converts \ref SetLanguage to LanguageCode. +Result MakeLanguageCode(SetLanguage Language, u64 *LanguageCode); + +/// Gets the current system LanguageCode. +/// Normally this should be used instead of \ref setGetLanguageCode. +/// LanguageCode is a string, see here: https://switchbrew.org/wiki/Settings_services#LanguageCode +Result GetSystemLanguage(u64 *LanguageCode); + +/// Gets the current LanguageCode, \ref setGetSystemLanguage should be used instead normally. +Result GetLanguageCode(u64 *LanguageCode); + +/// Gets available LanguageCodes. +/// On system-version <4.0.0, max_entries is set to the output from \ref setGetAvailableLanguageCodeCount if max_entries is larger than that. +Result GetAvailableLanguageCodes(s32 *total_entries, u64 *LanguageCodes, size_t max_entries); + +/// Gets total available LanguageCodes. +/// Output total is overridden with value 0 if the total is <0. +Result GetAvailableLanguageCodeCount(s32 *total); + +/// Gets the RegionCode. +Result GetRegionCode(SetRegion *out); + +/** + * @brief GetQuestFlag + * @note Only available on [5.0.0+]. + * @param[out] out Output flag. + */ +Result GetQuestFlag(bool *out); + +/** + * @brief Gets the system's nickname. + * @note Only available on [10.1.0+]. + * @param[out] nickname \ref SetSysDeviceNickName + */ +Result GetDeviceNickname(SetSysDeviceNickName *nickname); + +} // namespace set + +/// @brief C++ wrappers for the `setcal` API. +/// @details Wraps: switch/services/set.h. +namespace setcal { + +using ::ColorSetId; +/// BatteryLot +using ::SetBatteryLot; +using ::SetCalAccelerometerOffset; +using ::SetCalAccelerometerScale; +using ::SetCalAmiiboEcdsaCertificate; +using ::SetCalAmiiboEcqvBlsCertificate; +using ::SetCalAmiiboEcqvBlsKey; +using ::SetCalAmiiboEcqvBlsRootCertificate; +using ::SetCalAmiiboEcqvCertificate; +using ::SetCalAmiiboKey; +using ::SetCalAnalogStickFactoryCalibration; +using ::SetCalAnalogStickModelParameter; +using ::SetCalBdAddress; +using ::SetCalConfigurationId1; +using ::SetCalConsoleSixAxisSensorHorizontalOffset; +using ::SetCalCountryCode; +using ::SetCalEccB233DeviceCertificate; +using ::SetCalEccB233DeviceKey; +using ::SetCalGameCardCertificate; +using ::SetCalGameCardKey; +using ::SetCalGyroscopeOffset; +using ::SetCalGyroscopeScale; +using ::SetCalMacAddress; +using ::SetCalRegionCode; +using ::SetCalRsa2048DeviceCertificate; +using ::SetCalRsa2048DeviceKey; +using ::SetCalSerialNumber; +using ::SetCalSpeakerParameter; +using ::SetCalSslCertificate; +using ::SetCalSslKey; +/// ChineseTraditionalInputMethod +using ::SetChineseTraditionalInputMethod; +/// KeyboardLayout +using ::SetKeyboardLayout; +/// IDs for Language. +using ::SetLanguage; +/// Region codes. +using ::SetRegion; +/// AccessPointSecurityStandard +using ::SetSysAccessPointSecurityStandard; +/// AccessPointSecurityType +using ::SetSysAccessPointSecurityType; +/// AccountNotificationSettings +using ::SetSysAccountNotificationSettings; +/// AccountOnlineStorageSettings +using ::SetSysAccountOnlineStorageSettings; +/// AccountSettings +using ::SetSysAccountSettings; +/// AllowedSslHosts +using ::SetSysAllowedSslHosts; +/// AnalogStickUserCalibration +using ::SetSysAnalogStickUserCalibration; +/// AudioDevice +using ::SetSysAudioDevice; +/// AudioOutputMode +using ::SetSysAudioOutputMode; +/// AudioOutputModeTarget +using ::SetSysAudioOutputModeTarget; +using ::SetSysAudioVolume; +/// AutoSettings +using ::SetSysAutoSettings; +/// BacklightSettings +using ::SetSysBacklightSettings; +/// BacklightSettingsEx +using ::SetSysBacklightSettingsEx; +/// BlePairingSettings +using ::SetSysBlePairingSettings; +/// BlockType +using ::SetSysBlockType; +/// BluetoothDevicesSettings +using ::SetSysBluetoothDevicesSettings; +/// ButtonConfigRegisteredSettings +using ::SetSysButtonConfigRegisteredSettings; +/// ButtonConfigSettings +using ::SetSysButtonConfigSettings; +/// Actually nn::util::Color4u8Type. +using ::SetSysColor4u8Type; +/// ConnectionFlag +using ::SetSysConnectionFlag; +/// ConsoleSixAxisSensorAccelerationBias +using ::SetSysConsoleSixAxisSensorAccelerationBias; +/// ConsoleSixAxisSensorAccelerationGain +using ::SetSysConsoleSixAxisSensorAccelerationGain; +/// ConsoleSixAxisSensorAngularAcceleration +using ::SetSysConsoleSixAxisSensorAngularAcceleration; +/// ConsoleSixAxisSensorAngularVelocityBias +using ::SetSysConsoleSixAxisSensorAngularVelocityBias; +/// ConsoleSixAxisSensorAngularVelocityGain +using ::SetSysConsoleSixAxisSensorAngularVelocityGain; +/// ConsoleSixAxisSensorAngularVelocityTimeBias +using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; +/// ConsoleSleepPlan +using ::SetSysConsoleSleepPlan; +/// ControllerType +using ::SetSysControllerType; +using ::SetSysDataBlock; +/// DataDeletionSettings +using ::SetSysDataDeletionSettings; +/// DeviceNickName +using ::SetSysDeviceNickName; +/// Edid +using ::SetSysEdid; +/// ErrorReportSharePermission +using ::SetSysErrorReportSharePermission; +/// EulaVersion +using ::SetSysEulaVersion; +/// EulaVersionClockType +using ::SetSysEulaVersionClockType; +using ::SetSysExtensionBlock; +/// Structure returned by \ref setsysGetFirmwareVersion. +using ::SetSysFirmwareVersion; +/// Structure returned by \ref setsysGetFirmwareVersionDigest. +using ::SetSysFirmwareVersionDigest; +/// FriendPresenceOverlayPermission +using ::SetSysFriendPresenceOverlayPermission; +/// HandheldSleepPlan +using ::SetSysHandheldSleepPlan; +/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. +using ::SetSysHomeMenuScheme; +/// HostFsMountPoint +using ::SetSysHostFsMountPoint; +/// InitialLaunchSettings +using ::SetSysInitialLaunchSettings; +/// LcdBacklightBrightnessMapping +using ::SetSysLcdBacklightBrightnessMapping; +using ::SetSysModeLine; +/// NetworkSettings +using ::SetSysNetworkSettings; +/// NotificationSettings +using ::SetSysNotificationSettings; +/// NotificationTime +using ::SetSysNotificationTime; +/// NotificationVolume +using ::SetSysNotificationVolume; +/// NxControllerLegacySettings +using ::SetSysNxControllerLegacySettings; +/// NxControllerSettings +using ::SetSysNxControllerSettings; +/// PlatformRegion. Other values not listed here should be handled as "Unknown". +using ::SetSysPlatformRegion; +/// PrimaryAlbumStorage +using ::SetSysPrimaryAlbumStorage; +/// Console Product Models +using ::SetSysProductModel; +/// ProxyFlags +using ::SetSysProxyFlags; +/// PtmCycleCountReliability +using ::SetSysPtmCycleCountReliability; +/// PtmFuelGaugeParameter +using ::SetSysPtmFuelGaugeParameter; +/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. +using ::SetSysRebootlessSystemUpdateVersion; +/// Structure returned by \ref setsysGetSerialNumber. +using ::SetSysSerialNumber; +/// ServiceDiscoveryControlSettings +using ::SetSysServiceDiscoveryControlSettings; +/// SleepSettings +using ::SetSysSleepSettings; +/// ThemeId +using ::SetSysThemeId; +/// ThemeSettings +using ::SetSysThemeSettings; +/// TouchScreenMode, for "Touch-Screen Sensitivity". +using ::SetSysTouchScreenMode; +/// TvSettings +using ::SetSysTvSettings; +/// UserSelectorFlag +using ::SetSysUserSelectorFlag; +/// UserSelectorSettings +using ::SetSysUserSelectorSettings; + +/// Initialize setcal. +Result Initialize(void); + +/// Exit setcal. +void Exit(void); + +/// Gets the Service object for the actual setcal service session. +Service* GetServiceSession(void); + +/** + * @brief Gets the \ref SetCalBdAddress. + * @param[out] out \ref SetCalBdAddress + */ +Result GetBdAddress(SetCalBdAddress *out); + +/** + * @brief Gets the \ref SetCalConfigurationId1. + * @param[out] out \ref SetCalConfigurationId1 + */ +Result GetConfigurationId1(SetCalConfigurationId1 *out); + +/** + * @brief Gets the \ref SetCalAccelerometerOffset. + * @param[out] out \ref SetCalAccelerometerOffset + */ +Result GetAccelerometerOffset(SetCalAccelerometerOffset *out); + +/** + * @brief Gets the \ref SetCalAccelerometerScale. + * @param[out] out \ref SetCalAccelerometerScale + */ +Result GetAccelerometerScale(SetCalAccelerometerScale *out); + +/** + * @brief Gets the \ref SetCalGyroscopeOffset. + * @param[out] out \ref SetCalGyroscopeOffset + */ +Result GetGyroscopeOffset(SetCalGyroscopeOffset *out); + +/** + * @brief Gets the \ref SetCalGyroscopeScale. + * @param[out] out \ref SetCalGyroscopeScale + */ +Result GetGyroscopeScale(SetCalGyroscopeScale *out); + +/** + * @brief Gets the \ref SetCalMacAddress. + * @param[out] out \ref SetCalMacAddress + */ +Result GetWirelessLanMacAddress(SetCalMacAddress *out); + +/** + * @brief GetWirelessLanCountryCodeCount + * @param[out] out_count Output count + */ +Result GetWirelessLanCountryCodeCount(s32 *out_count); + +/** + * @brief GetWirelessLanCountryCodes + * @param[out] total_out Total output entries. + * @param[out] codes Output array of \ref SetCalCountryCode. + * @param[in] count Size of the versions array in entries. + */ +Result GetWirelessLanCountryCodes(s32 *total_out, SetCalCountryCode *codes, s32 count); + +/** + * @brief Gets the \ref SetCalSerialNumber. + * @param[out] out \ref SetCalSerialNumber + */ +Result GetSerialNumber(SetCalSerialNumber *out); + +/** + * @brief SetInitialSystemAppletProgramId + * @param[in] program_id input ProgramId. + */ +Result SetInitialSystemAppletProgramId(u64 program_id); + +/** + * @brief SetOverlayDispProgramId + * @param[in] program_id input ProgramId. + */ +Result SetOverlayDispProgramId(u64 program_id); + +/** + * @brief Gets the \ref SetBatteryLot. + * @param[out] out \ref SetBatteryLot + */ +Result GetBatteryLot(SetBatteryLot *out); + +/** + * @brief Gets the \ref SetCalEccB233DeviceCertificate. + * @param[out] out \ref SetCalEccB233DeviceCertificate + */ +Result GetEciDeviceCertificate(SetCalEccB233DeviceCertificate *out); + +/** + * @brief Gets the \ref SetCalRsa2048DeviceCertificate. + * @param[out] out \ref SetCalRsa2048DeviceCertificate + */ +Result GetEticketDeviceCertificate(SetCalRsa2048DeviceCertificate *out); + +/** + * @brief Gets the \ref SetCalSslKey. + * @param[out] out \ref SetCalSslKey + */ +Result GetSslKey(SetCalSslKey *out); + +/** + * @brief Gets the \ref SetCalSslCertificate. + * @param[out] out \ref SetCalSslCertificate + */ +Result GetSslCertificate(SetCalSslCertificate *out); + +/** + * @brief Gets the \ref SetCalGameCardKey. + * @param[out] out \ref SetCalGameCardKey + */ +Result GetGameCardKey(SetCalGameCardKey *out); + +/** + * @brief Gets the \ref SetCalGameCardCertificate. + * @param[out] out \ref SetCalGameCardCertificate + */ +Result GetGameCardCertificate(SetCalGameCardCertificate *out); + +/** + * @brief Gets the \ref SetCalEccB233DeviceKey. + * @param[out] out \ref SetCalEccB233DeviceKey + */ +Result GetEciDeviceKey(SetCalEccB233DeviceKey *out); + +/** + * @brief Gets the \ref SetCalRsa2048DeviceKey. + * @param[out] out \ref SetCalRsa2048DeviceKey + */ +Result GetEticketDeviceKey(SetCalRsa2048DeviceKey *out); + +/** + * @brief Gets the \ref SetCalSpeakerParameter. + * @param[out] out \ref SetCalSpeakerParameter + */ +Result GetSpeakerParameter(SetCalSpeakerParameter *out); + +/** + * @brief GetLcdVendorId + * @note Only available on [4.0.0+]. + * @param[out] out_vendor_id Output LcdVendorId. + */ +Result GetLcdVendorId(u32 *out_vendor_id); + +/** + * @brief Gets the \ref SetCalRsa2048DeviceCertificate. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalRsa2048DeviceCertificate + */ +Result GetEciDeviceCertificate2(SetCalRsa2048DeviceCertificate *out); + +/** + * @brief Gets the \ref SetCalRsa2048DeviceKey. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalRsa2048DeviceKey + */ +Result GetEciDeviceKey2(SetCalRsa2048DeviceKey *out); + +/** + * @brief Gets the \ref SetCalAmiiboKey. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalAmiiboKey + */ +Result GetAmiiboKey(SetCalAmiiboKey *out); + +/** + * @brief Gets the \ref SetCalAmiiboEcqvCertificate. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalAmiiboEcqvCertificate + */ +Result GetAmiiboEcqvCertificate(SetCalAmiiboEcqvCertificate *out); + +/** + * @brief Gets the \ref SetCalAmiiboEcdsaCertificate. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalAmiiboEcdsaCertificate + */ +Result GetAmiiboEcdsaCertificate(SetCalAmiiboEcdsaCertificate *out); + +/** + * @brief Gets the \ref SetCalAmiiboEcqvBlsKey. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalAmiiboEcqvBlsKey + */ +Result GetAmiiboEcqvBlsKey(SetCalAmiiboEcqvBlsKey *out); + +/** + * @brief Gets the \ref SetCalAmiiboEcqvBlsCertificate. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalAmiiboEcqvBlsCertificate + */ +Result GetAmiiboEcqvBlsCertificate(SetCalAmiiboEcqvBlsCertificate *out); + +/** + * @brief Gets the \ref SetCalAmiiboEcqvBlsRootCertificate. + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetCalAmiiboEcqvBlsRootCertificate + */ +Result GetAmiiboEcqvBlsRootCertificate(SetCalAmiiboEcqvBlsRootCertificate *out); + +/** + * @brief GetUsbTypeCPowerSourceCircuitVersion + * @note Only available on [5.0.0+]. + * @param[out] out_version Output UsbTypeCPowerSourceCircuitVersion. + */ +Result GetUsbTypeCPowerSourceCircuitVersion(u8 *out_version); + +/** + * @brief GetAnalogStickModuleTypeL + * @note Only available on [8.1.1+]. + * @param[out] out_version Output AnalogStickModuleType. + */ +Result GetAnalogStickModuleTypeL(u8 *out_type); + +/** + * @brief Gets the \ref SetCalAnalogStickModelParameter. + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetCalAnalogStickModelParameter + */ +Result GetAnalogStickModelParameterL(SetCalAnalogStickModelParameter *out); + +/** + * @brief Gets the \ref SetCalAnalogStickFactoryCalibration. + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetCalAnalogStickFactoryCalibration + */ +Result GetAnalogStickFactoryCalibrationL(SetCalAnalogStickFactoryCalibration *out); + +/** + * @brief GetAnalogStickModuleTypeR + * @note Only available on [8.1.1+]. + * @param[out] out_version Output AnalogStickModuleType. + */ +Result GetAnalogStickModuleTypeR(u8 *out_type); + +/** + * @brief Gets the \ref SetCalAnalogStickModelParameter. + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetCalAnalogStickModelParameter + */ +Result GetAnalogStickModelParameterR(SetCalAnalogStickModelParameter *out); + +/** + * @brief Gets the \ref SetCalAnalogStickFactoryCalibration. + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetCalAnalogStickFactoryCalibration + */ +Result GetAnalogStickFactoryCalibrationR(SetCalAnalogStickFactoryCalibration *out); + +/** + * @brief GetConsoleSixAxisSensorModuleType + * @note Only available on [8.1.1+]. + * @param[out] out_version Output ConsoleSixAxisSensorModuleType. + */ +Result GetConsoleSixAxisSensorModuleType(u8 *out_type); + +/** + * @brief Gets the \ref SetCalConsoleSixAxisSensorHorizontalOffset. + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetCalConsoleSixAxisSensorHorizontalOffset + */ +Result GetConsoleSixAxisSensorHorizontalOffset(SetCalConsoleSixAxisSensorHorizontalOffset *out); + +/** + * @brief GetBatteryVersion + * @note Only available on [6.0.0+]. + * @param[out] out_version Output BatteryVersion. + */ +Result GetBatteryVersion(u8 *out_version); + +/** + * @brief GetDeviceId + * @note Only available on [10.0.0+]. + * @param[out] out_type Output DeviceId. + */ +Result GetDeviceId(u64 *out_device_id); + +/** + * @brief GetConsoleSixAxisSensorMountType + * @note Only available on [10.0.0+]. + * @param[out] out_type Output ConsoleSixAxisSensorMountType. + */ +Result GetConsoleSixAxisSensorMountType(u8 *out_type); + +} // namespace setcal + +/// @brief C++ wrappers for the `setfd` API. +/// @details Wraps: switch/services/set.h. +namespace setfd { + +using ::ColorSetId; +/// BatteryLot +using ::SetBatteryLot; +using ::SetCalAccelerometerOffset; +using ::SetCalAccelerometerScale; +using ::SetCalAmiiboEcdsaCertificate; +using ::SetCalAmiiboEcqvBlsCertificate; +using ::SetCalAmiiboEcqvBlsKey; +using ::SetCalAmiiboEcqvBlsRootCertificate; +using ::SetCalAmiiboEcqvCertificate; +using ::SetCalAmiiboKey; +using ::SetCalAnalogStickFactoryCalibration; +using ::SetCalAnalogStickModelParameter; +using ::SetCalBdAddress; +using ::SetCalConfigurationId1; +using ::SetCalConsoleSixAxisSensorHorizontalOffset; +using ::SetCalCountryCode; +using ::SetCalEccB233DeviceCertificate; +using ::SetCalEccB233DeviceKey; +using ::SetCalGameCardCertificate; +using ::SetCalGameCardKey; +using ::SetCalGyroscopeOffset; +using ::SetCalGyroscopeScale; +using ::SetCalMacAddress; +using ::SetCalRegionCode; +using ::SetCalRsa2048DeviceCertificate; +using ::SetCalRsa2048DeviceKey; +using ::SetCalSerialNumber; +using ::SetCalSpeakerParameter; +using ::SetCalSslCertificate; +using ::SetCalSslKey; +/// ChineseTraditionalInputMethod +using ::SetChineseTraditionalInputMethod; +/// KeyboardLayout +using ::SetKeyboardLayout; +/// IDs for Language. +using ::SetLanguage; +/// Region codes. +using ::SetRegion; +/// AccessPointSecurityStandard +using ::SetSysAccessPointSecurityStandard; +/// AccessPointSecurityType +using ::SetSysAccessPointSecurityType; +/// AccountNotificationSettings +using ::SetSysAccountNotificationSettings; +/// AccountOnlineStorageSettings +using ::SetSysAccountOnlineStorageSettings; +/// AccountSettings +using ::SetSysAccountSettings; +/// AllowedSslHosts +using ::SetSysAllowedSslHosts; +/// AnalogStickUserCalibration +using ::SetSysAnalogStickUserCalibration; +/// AudioDevice +using ::SetSysAudioDevice; +/// AudioOutputMode +using ::SetSysAudioOutputMode; +/// AudioOutputModeTarget +using ::SetSysAudioOutputModeTarget; +using ::SetSysAudioVolume; +/// AutoSettings +using ::SetSysAutoSettings; +/// BacklightSettings +using ::SetSysBacklightSettings; +/// BacklightSettingsEx +using ::SetSysBacklightSettingsEx; +/// BlePairingSettings +using ::SetSysBlePairingSettings; +/// BlockType +using ::SetSysBlockType; +/// BluetoothDevicesSettings +using ::SetSysBluetoothDevicesSettings; +/// ButtonConfigRegisteredSettings +using ::SetSysButtonConfigRegisteredSettings; +/// ButtonConfigSettings +using ::SetSysButtonConfigSettings; +/// Actually nn::util::Color4u8Type. +using ::SetSysColor4u8Type; +/// ConnectionFlag +using ::SetSysConnectionFlag; +/// ConsoleSixAxisSensorAccelerationBias +using ::SetSysConsoleSixAxisSensorAccelerationBias; +/// ConsoleSixAxisSensorAccelerationGain +using ::SetSysConsoleSixAxisSensorAccelerationGain; +/// ConsoleSixAxisSensorAngularAcceleration +using ::SetSysConsoleSixAxisSensorAngularAcceleration; +/// ConsoleSixAxisSensorAngularVelocityBias +using ::SetSysConsoleSixAxisSensorAngularVelocityBias; +/// ConsoleSixAxisSensorAngularVelocityGain +using ::SetSysConsoleSixAxisSensorAngularVelocityGain; +/// ConsoleSixAxisSensorAngularVelocityTimeBias +using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; +/// ConsoleSleepPlan +using ::SetSysConsoleSleepPlan; +/// ControllerType +using ::SetSysControllerType; +using ::SetSysDataBlock; +/// DataDeletionSettings +using ::SetSysDataDeletionSettings; +/// DeviceNickName +using ::SetSysDeviceNickName; +/// Edid +using ::SetSysEdid; +/// ErrorReportSharePermission +using ::SetSysErrorReportSharePermission; +/// EulaVersion +using ::SetSysEulaVersion; +/// EulaVersionClockType +using ::SetSysEulaVersionClockType; +using ::SetSysExtensionBlock; +/// Structure returned by \ref setsysGetFirmwareVersion. +using ::SetSysFirmwareVersion; +/// Structure returned by \ref setsysGetFirmwareVersionDigest. +using ::SetSysFirmwareVersionDigest; +/// FriendPresenceOverlayPermission +using ::SetSysFriendPresenceOverlayPermission; +/// HandheldSleepPlan +using ::SetSysHandheldSleepPlan; +/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. +using ::SetSysHomeMenuScheme; +/// HostFsMountPoint +using ::SetSysHostFsMountPoint; +/// InitialLaunchSettings +using ::SetSysInitialLaunchSettings; +/// LcdBacklightBrightnessMapping +using ::SetSysLcdBacklightBrightnessMapping; +using ::SetSysModeLine; +/// NetworkSettings +using ::SetSysNetworkSettings; +/// NotificationSettings +using ::SetSysNotificationSettings; +/// NotificationTime +using ::SetSysNotificationTime; +/// NotificationVolume +using ::SetSysNotificationVolume; +/// NxControllerLegacySettings +using ::SetSysNxControllerLegacySettings; +/// NxControllerSettings +using ::SetSysNxControllerSettings; +/// PlatformRegion. Other values not listed here should be handled as "Unknown". +using ::SetSysPlatformRegion; +/// PrimaryAlbumStorage +using ::SetSysPrimaryAlbumStorage; +/// Console Product Models +using ::SetSysProductModel; +/// ProxyFlags +using ::SetSysProxyFlags; +/// PtmCycleCountReliability +using ::SetSysPtmCycleCountReliability; +/// PtmFuelGaugeParameter +using ::SetSysPtmFuelGaugeParameter; +/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. +using ::SetSysRebootlessSystemUpdateVersion; +/// Structure returned by \ref setsysGetSerialNumber. +using ::SetSysSerialNumber; +/// ServiceDiscoveryControlSettings +using ::SetSysServiceDiscoveryControlSettings; +/// SleepSettings +using ::SetSysSleepSettings; +/// ThemeId +using ::SetSysThemeId; +/// ThemeSettings +using ::SetSysThemeSettings; +/// TouchScreenMode, for "Touch-Screen Sensitivity". +using ::SetSysTouchScreenMode; +/// TvSettings +using ::SetSysTvSettings; +/// UserSelectorFlag +using ::SetSysUserSelectorFlag; +/// UserSelectorSettings +using ::SetSysUserSelectorSettings; + +/// Initialize setfd. +/// [4.0.0+] Only exposed if in development mode. +Result Initialize(void); + +/// Exit setfd. +void Exit(void); + +/// Gets the Service object for the actual setfd service session. +Service* GetServiceSession(void); + +/** + * @brief Sets the value of a settings item. + * @param name Name string. + * @param item_key Item key string. + * @param value_in Pointer to input value. + * @param value_in_size Size of the value_in buffer. + */ +Result SetSettingsItemValue(const char *name, const char *item_key, const void *value_in, s64 value_in_size); + +/** + * @brief Resets the value of a settings item. + * @param name Name string. + * @param item_key Item key string. + */ +Result ResetSettingsItemValue(const char *name, const char *item_key); + +} // namespace setfd + +/// @brief C++ wrappers for the `setsys` API. +/// @details Wraps: switch/services/set.h. +namespace setsys { + +using ::ColorSetId; +/// BatteryLot +using ::SetBatteryLot; +using ::SetCalAccelerometerOffset; +using ::SetCalAccelerometerScale; +using ::SetCalAmiiboEcdsaCertificate; +using ::SetCalAmiiboEcqvBlsCertificate; +using ::SetCalAmiiboEcqvBlsKey; +using ::SetCalAmiiboEcqvBlsRootCertificate; +using ::SetCalAmiiboEcqvCertificate; +using ::SetCalAmiiboKey; +using ::SetCalAnalogStickFactoryCalibration; +using ::SetCalAnalogStickModelParameter; +using ::SetCalBdAddress; +using ::SetCalConfigurationId1; +using ::SetCalConsoleSixAxisSensorHorizontalOffset; +using ::SetCalCountryCode; +using ::SetCalEccB233DeviceCertificate; +using ::SetCalEccB233DeviceKey; +using ::SetCalGameCardCertificate; +using ::SetCalGameCardKey; +using ::SetCalGyroscopeOffset; +using ::SetCalGyroscopeScale; +using ::SetCalMacAddress; +using ::SetCalRegionCode; +using ::SetCalRsa2048DeviceCertificate; +using ::SetCalRsa2048DeviceKey; +using ::SetCalSerialNumber; +using ::SetCalSpeakerParameter; +using ::SetCalSslCertificate; +using ::SetCalSslKey; +/// IDs for Language. +using ::SetLanguage; +/// Region codes. +using ::SetRegion; +/// AccessPointSecurityStandard +using ::SetSysAccessPointSecurityStandard; +/// AccessPointSecurityType +using ::SetSysAccessPointSecurityType; +/// AccountNotificationSettings +using ::SetSysAccountNotificationSettings; +/// AccountOnlineStorageSettings +using ::SetSysAccountOnlineStorageSettings; +/// AccountSettings +using ::SetSysAccountSettings; +/// AllowedSslHosts +using ::SetSysAllowedSslHosts; +/// AnalogStickUserCalibration +using ::SetSysAnalogStickUserCalibration; +/// AudioDevice +using ::SetSysAudioDevice; +/// AudioOutputMode +using ::SetSysAudioOutputMode; +/// AudioOutputModeTarget +using ::SetSysAudioOutputModeTarget; +using ::SetSysAudioVolume; +/// AutoSettings +using ::SetSysAutoSettings; +/// BacklightSettings +using ::SetSysBacklightSettings; +/// BacklightSettingsEx +using ::SetSysBacklightSettingsEx; +/// BlePairingSettings +using ::SetSysBlePairingSettings; +/// BlockType +using ::SetSysBlockType; +/// BluetoothDevicesSettings +using ::SetSysBluetoothDevicesSettings; +/// ButtonConfigRegisteredSettings +using ::SetSysButtonConfigRegisteredSettings; +/// ButtonConfigSettings +using ::SetSysButtonConfigSettings; +/// Actually nn::util::Color4u8Type. +using ::SetSysColor4u8Type; +/// ConnectionFlag +using ::SetSysConnectionFlag; +/// ConsoleSixAxisSensorAccelerationBias +using ::SetSysConsoleSixAxisSensorAccelerationBias; +/// ConsoleSixAxisSensorAccelerationGain +using ::SetSysConsoleSixAxisSensorAccelerationGain; +/// ConsoleSixAxisSensorAngularAcceleration +using ::SetSysConsoleSixAxisSensorAngularAcceleration; +/// ConsoleSixAxisSensorAngularVelocityBias +using ::SetSysConsoleSixAxisSensorAngularVelocityBias; +/// ConsoleSixAxisSensorAngularVelocityGain +using ::SetSysConsoleSixAxisSensorAngularVelocityGain; +/// ConsoleSixAxisSensorAngularVelocityTimeBias +using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; +/// ConsoleSleepPlan +using ::SetSysConsoleSleepPlan; +/// ControllerType +using ::SetSysControllerType; +using ::SetSysDataBlock; +/// DataDeletionSettings +using ::SetSysDataDeletionSettings; +/// DeviceNickName +using ::SetSysDeviceNickName; +/// Edid +using ::SetSysEdid; +/// ErrorReportSharePermission +using ::SetSysErrorReportSharePermission; +/// EulaVersion +using ::SetSysEulaVersion; +/// EulaVersionClockType +using ::SetSysEulaVersionClockType; +using ::SetSysExtensionBlock; +/// Structure returned by \ref setsysGetFirmwareVersion. +using ::SetSysFirmwareVersion; +/// Structure returned by \ref setsysGetFirmwareVersionDigest. +using ::SetSysFirmwareVersionDigest; +/// FriendPresenceOverlayPermission +using ::SetSysFriendPresenceOverlayPermission; +/// HandheldSleepPlan +using ::SetSysHandheldSleepPlan; +/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. +using ::SetSysHomeMenuScheme; +/// HostFsMountPoint +using ::SetSysHostFsMountPoint; +/// InitialLaunchSettings +using ::SetSysInitialLaunchSettings; +/// LcdBacklightBrightnessMapping +using ::SetSysLcdBacklightBrightnessMapping; +using ::SetSysModeLine; +/// NetworkSettings +using ::SetSysNetworkSettings; +/// NotificationSettings +using ::SetSysNotificationSettings; +/// NotificationTime +using ::SetSysNotificationTime; +/// NotificationVolume +using ::SetSysNotificationVolume; +/// NxControllerLegacySettings +using ::SetSysNxControllerLegacySettings; +/// NxControllerSettings +using ::SetSysNxControllerSettings; +/// PlatformRegion. Other values not listed here should be handled as "Unknown". +using ::SetSysPlatformRegion; +/// PrimaryAlbumStorage +using ::SetSysPrimaryAlbumStorage; +/// Console Product Models +using ::SetSysProductModel; +/// ProxyFlags +using ::SetSysProxyFlags; +/// PtmCycleCountReliability +using ::SetSysPtmCycleCountReliability; +/// PtmFuelGaugeParameter +using ::SetSysPtmFuelGaugeParameter; +/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. +using ::SetSysRebootlessSystemUpdateVersion; +/// Structure returned by \ref setsysGetSerialNumber. +using ::SetSysSerialNumber; +/// ServiceDiscoveryControlSettings +using ::SetSysServiceDiscoveryControlSettings; +/// SleepSettings +using ::SetSysSleepSettings; +/// ThemeId +using ::SetSysThemeId; +/// ThemeSettings +using ::SetSysThemeSettings; +/// TouchScreenMode, for "Touch-Screen Sensitivity". +using ::SetSysTouchScreenMode; +/// TvSettings +using ::SetSysTvSettings; +/// UserSelectorFlag +using ::SetSysUserSelectorFlag; +/// UserSelectorSettings +using ::SetSysUserSelectorSettings; + +/// Initialize setsys. +Result Initialize(void); + +/// Exit setsys. +void Exit(void); + +/// Gets the Service object for the actual setsys service session. +Service* GetServiceSession(void); + +/** + * @brief SetLanguageCode + * @param[in] LanguageCode LanguageCode. + */ +Result SetLanguageCode(u64 LanguageCode); + +/** + * @brief SetNetworkSettings + * @param[in] settings Input array of \ref SetSysNetworkSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetNetworkSettings(const SetSysNetworkSettings *settings, s32 count); + +/** + * @brief GetNetworkSettings + * @param[out] total_out Total output entries. + * @param[out] versions Output array of \ref SetSysNetworkSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetNetworkSettings(s32 *total_out, SetSysNetworkSettings *settings, s32 count); + +/** + * @brief Gets the system firmware version. + * @param[out] out Firmware version to populate. + */ +Result GetFirmwareVersion(SetSysFirmwareVersion *out); + +/** + * @brief GetFirmwareVersionDigest + * @param[out] out \ref SetSysFirmwareVersionDigest + */ +Result GetFirmwareVersionDigest(SetSysFirmwareVersionDigest *out); + +/** + * @brief GetLockScreenFlag + * @param[out] out Output flag. + */ +Result GetLockScreenFlag(bool *out); + +/** + * @brief SetLockScreenFlag + * @param[in] flag Input flag. + */ +Result SetLockScreenFlag(bool flag); + +/** + * @brief GetBacklightSettings + * @param[out] out \ref SetSysBacklightSettings + */ +Result GetBacklightSettings(SetSysBacklightSettings *out); + +/** + * @brief SetBacklightSettings + * @param[in] settings \ref SetSysBacklightSettings + */ +Result SetBacklightSettings(const SetSysBacklightSettings *settings); + +/** + * @brief SetBluetoothDevicesSettings + * @param[in] settings Input array of \ref SetSysBluetoothDevicesSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetBluetoothDevicesSettings(const SetSysBluetoothDevicesSettings *settings, s32 count); + +/** + * @brief GetBluetoothDevicesSettings + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysBluetoothDevicesSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetBluetoothDevicesSettings(s32 *total_out, SetSysBluetoothDevicesSettings *settings, s32 count); + +/** + * @brief GetExternalSteadyClockSourceId + * @param[out] out \ref Uuid + */ +Result GetExternalSteadyClockSourceId(Uuid *out); + +/** + * @brief SetExternalSteadyClockSourceId + * @param[in] uuid \ref Uuid + */ +Result SetExternalSteadyClockSourceId(const Uuid *uuid); + +/** + * @brief GetUserSystemClockContext + * @param[out] out \ref TimeSystemClockContext + */ +Result GetUserSystemClockContext(TimeSystemClockContext *out); + +/** + * @brief SetUserSystemClockContext + * @param[in] context \ref TimeSystemClockContext + */ +Result SetUserSystemClockContext(const TimeSystemClockContext *context); + +/** + * @brief GetAccountSettings + * @param[out] out \ref SetSysAccountSettings + */ +Result GetAccountSettings(SetSysAccountSettings *out); + +/** + * @brief SetAccountSettings + * @param[in] settings \ref SetSysAccountSettings + */ +Result SetAccountSettings(SetSysAccountSettings settings); + +/** + * @brief GetAudioVolume + * @param[in] device \ref SetSysAudioDevice + * @param[out] out \ref SetSysAudioVolume + */ +Result GetAudioVolume(SetSysAudioDevice device, SetSysAudioVolume *out); + +/** + * @brief SetAudioVolume + * @param[in] device \ref SetSysAudioDevice + * @param[in] volume \ref SetSysAudioVolume + */ +Result SetAudioVolume(SetSysAudioDevice device, const SetSysAudioVolume *volume); + +/** + * @brief GetEulaVersions + * @param[out] total_out Total output entries. + * @param[out] versions Output array of \ref SetSysEulaVersion. + * @param[in] count Size of the versions array in entries. + */ +Result GetEulaVersions(s32 *total_out, SetSysEulaVersion *versions, s32 count); + +/** + * @brief SetEulaVersions + * @param[in] versions Input array of \ref SetSysEulaVersion. + * @param[in] count Size of the versions array in entries. + */ +Result SetEulaVersions(const SetSysEulaVersion *versions, s32 count); + +/// Gets the current system theme. +Result GetColorSetId(ColorSetId *out); + +/// Sets the current system theme. +Result SetColorSetId(ColorSetId id); + +/** + * @brief GetConsoleInformationUploadFlag + * @param[out] out Output flag. + */ +Result GetConsoleInformationUploadFlag(bool *out); + +/** + * @brief SetConsoleInformationUploadFlag + * @param[in] flag Input flag. + */ +Result SetConsoleInformationUploadFlag(bool flag); + +/** + * @brief GetAutomaticApplicationDownloadFlag + * @param[out] out Output flag. + */ +Result GetAutomaticApplicationDownloadFlag(bool *out); + +/** + * @brief SetAutomaticApplicationDownloadFlag + * @param[in] flag Input flag. + */ +Result SetAutomaticApplicationDownloadFlag(bool flag); + +/** + * @brief GetNotificationSettings + * @param[out] out \ref SetSysNotificationSettings + */ +Result GetNotificationSettings(SetSysNotificationSettings *out); + +/** + * @brief SetNotificationSettings + * @param[in] settings \ref SetSysNotificationSettings + */ +Result SetNotificationSettings(const SetSysNotificationSettings *settings); + +/** + * @brief GetAccountNotificationSettings + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysAccountNotificationSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetAccountNotificationSettings(s32 *total_out, SetSysAccountNotificationSettings *settings, s32 count); + +/** + * @brief SetAccountNotificationSettings + * @param[in] settings Input array of \ref SetSysAccountNotificationSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetAccountNotificationSettings(const SetSysAccountNotificationSettings *settings, s32 count); + +/** + * @brief GetVibrationMasterVolume + * @param[out] out Output volume. + */ +Result GetVibrationMasterVolume(float *out); + +/** + * @brief SetVibrationMasterVolume + * @param[in] volume Input volume. + */ +Result SetVibrationMasterVolume(float volume); + +/** + * @brief Gets the size of a settings item value. + * @param name Name string. + * @param item_key Item key string. + * @param size_out Pointer to output the size to. + */ +Result GetSettingsItemValueSize(const char *name, const char *item_key, u64 *size_out); + +/** + * @brief Gets the value of a settings item. + * @param name Name string. + * @param item_key Item key string. + * @param value_out Pointer to output the value to. + * @param value_out_size Size of the value_out buffer. + * @param size_out Total size which was copied to value_out. + */ +Result GetSettingsItemValue(const char *name, const char *item_key, void *value_out, size_t value_out_size, u64 *size_out); + +/** + * @brief GetTvSettings + * @param[out] out \ref SetSysTvSettings + */ +Result GetTvSettings(SetSysTvSettings *out); + +/** + * @brief SetTvSettings + * @param[in] settings \ref SetSysTvSettings + */ +Result SetTvSettings(const SetSysTvSettings *settings); + +/** + * @brief GetEdid + * @param[out] out \ref SetSysEdid + */ +Result GetEdid(SetSysEdid *out); + +/** + * @brief SetEdid + * @param[in] edid \ref SetSysEdid + */ +Result SetEdid(const SetSysEdid *edid); + +/** + * @brief GetAudioOutputMode + * @param[in] target \ref SetSysAudioOutputModeTarget + * @param[out] out \ref SetSysAudioOutputMode + */ +Result GetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode *out); + +/** + * @brief SetAudioOutputMode + * @param[in] target \ref SetSysAudioOutputModeTarget + * @param[in] mode \ref SetSysAudioOutputMode + */ +Result SetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode mode); + +/** + * @brief GetSpeakerAutoMuteFlag + * @param[out] out Output flag. + */ +Result GetSpeakerAutoMuteFlag(bool *out); + +/** + * @brief SetSpeakerAutoMuteFlag + * @param[in] flag Input flag. + */ +Result SetSpeakerAutoMuteFlag(bool flag); + +/** + * @brief GetQuestFlag + * @param[out] out Output flag. + */ +Result GetQuestFlag(bool *out); + +/** + * @brief SetQuestFlag + * @param[in] flag Input flag. + */ +Result SetQuestFlag(bool flag); + +/** + * @brief GetDataDeletionSettings + * @param[out] out \ref SetSysDataDeletionSettings + */ +Result GetDataDeletionSettings(SetSysDataDeletionSettings *out); + +/** + * @brief SetDataDeletionSettings + * @param[in] settings \ref SetSysDataDeletionSettings + */ +Result SetDataDeletionSettings(const SetSysDataDeletionSettings *settings); + +/** + * @brief GetInitialSystemAppletProgramId + * @param[out] out output ProgramId. + */ +Result GetInitialSystemAppletProgramId(u64 *out); + +/** + * @brief GetOverlayDispProgramId + * @param[out] out output ProgramId. + */ +Result GetOverlayDispProgramId(u64 *out); + +/** + * @brief GetDeviceTimeZoneLocationName + * @param[out] out \ref TimeLocationName + */ +Result GetDeviceTimeZoneLocationName(TimeLocationName *out); + +/** + * @brief SetDeviceTimeZoneLocationName + * @param[in] name \ref TimeLocationName + */ +Result SetDeviceTimeZoneLocationName(const TimeLocationName *name); + +/** + * @brief GetWirelessCertificationFileSize + * @param[out] out_size Output size. + */ +Result GetWirelessCertificationFileSize(u64 *out_size); + +/** + * @brief GetWirelessCertificationFile + * @param[out] buffer Output buffer. + * @param[in] size Output buffer size. + * @param[out] out_size Output size. + */ +Result GetWirelessCertificationFile(void* buffer, size_t size, u64 *out_size); + +/** + * @brief SetRegionCode + * @param[in] region \ref SetRegion + */ +Result SetRegionCode(SetRegion region); + +/** + * @brief GetNetworkSystemClockContext + * @param[out] out \ref TimeSystemClockContext + */ +Result GetNetworkSystemClockContext(TimeSystemClockContext *out); + +/** + * @brief SetNetworkSystemClockContext + * @param[in] context \ref TimeSystemClockContext + */ +Result SetNetworkSystemClockContext(const TimeSystemClockContext *context); + +/** + * @brief IsUserSystemClockAutomaticCorrectionEnabled + * @param[out] out Output flag. + */ +Result IsUserSystemClockAutomaticCorrectionEnabled(bool *out); + +/** + * @brief SetUserSystemClockAutomaticCorrectionEnabled + * @param[in] flag Input flag. + */ +Result SetUserSystemClockAutomaticCorrectionEnabled(bool flag); + +/** + * @brief GetDebugModeFlag + * @param[out] out Output flag. + */ +Result GetDebugModeFlag(bool *out); + +/** + * @brief GetPrimaryAlbumStorage + * @param[out] out \ref GetPrimaryAlbumStorage + */ +Result GetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage *out); + +/** + * @brief SetPrimaryAlbumStorage + * @param[in] storage \ref SetSysPrimaryAlbumStorage + */ +Result SetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage storage); + +/** + * @brief GetUsb30EnableFlag + * @param[out] out Output flag. + */ +Result GetUsb30EnableFlag(bool *out); + +/** + * @brief SetUsb30EnableFlag + * @param[in] flag Input flag. + */ +Result SetUsb30EnableFlag(bool flag); + +/** + * @brief Gets the \ref SetBatteryLot. + * @param[out] out \ref SetBatteryLot + */ +Result GetBatteryLot(SetBatteryLot *out); + +/** + * @brief Gets the system's serial number. + * @param[out] out \ref SetSysSerialNumber + */ +Result GetSerialNumber(SetSysSerialNumber *out); + +/** + * @brief GetNfcEnableFlag + * @param[out] out Output flag. + */ +Result GetNfcEnableFlag(bool *out); + +/** + * @brief SetNfcEnableFlag + * @param[in] flag Input flag. + */ +Result SetNfcEnableFlag(bool flag); + +/** + * @brief GetSleepSettings + * @param[out] out \ref SetSysSleepSettings + */ +Result GetSleepSettings(SetSysSleepSettings *out); + +/** + * @brief SetSleepSettings + * @param[in] settings \ref SetSysSleepSettings + */ +Result SetSleepSettings(const SetSysSleepSettings *settings); + +/** + * @brief GetWirelessLanEnableFlag + * @param[out] out Output flag. + */ +Result GetWirelessLanEnableFlag(bool *out); + +/** + * @brief SetWirelessLanEnableFlag + * @param[in] flag Input flag. + */ +Result SetWirelessLanEnableFlag(bool flag); + +/** + * @brief GetInitialLaunchSettings + * @param[out] out \ref SetSysInitialLaunchSettings + */ +Result GetInitialLaunchSettings(SetSysInitialLaunchSettings *out); + +/** + * @brief SetInitialLaunchSettings + * @param[in] settings \ref SetSysInitialLaunchSettings + */ +Result SetInitialLaunchSettings(const SetSysInitialLaunchSettings *settings); + +/** + * @brief Gets the system's nickname. + * @note Same as \ref setGetDeviceNickname, which official sw uses instead on [10.1.0+]. + * @param[out] nickname \ref SetSysDeviceNickName + */ +Result GetDeviceNickname(SetSysDeviceNickName *nickname); + +/** + * @brief Sets the system's nickname. + * @param[in] nickname \ref SetSysDeviceNickName + */ +Result SetDeviceNickname(const SetSysDeviceNickName *nickname); + +/** + * @brief GetProductModel + * @param[out] model Output SetSysProductModel. + */ +Result GetProductModel(SetSysProductModel *model); + +/** + * @brief GetLdnChannel + * @param[out] out Output LdnChannel. + */ +Result GetLdnChannel(s32 *out); + +/** + * @brief SetLdnChannel + * @param[in] channel Input LdnChannel. + */ +Result SetLdnChannel(s32 channel); + +/** + * @brief Gets an event that settings will signal on flag change. + * @param out_event Event to bind. Output event will have autoclear=false. + */ +Result AcquireTelemetryDirtyFlagEventHandle(Event *out_event); + +/** + * @brief Gets the settings flags that have changed. + * @param flags_0 Pointer to populate with first 64 flags. + * @param flags_1 Pointer to populate with second 64 flags. + */ +Result GetTelemetryDirtyFlags(u64 *flags_0, u64 *flags_1); + +/** + * @brief GetPtmBatteryLot + * @param[out] out \ref SetBatteryLot + */ +Result GetPtmBatteryLot(SetBatteryLot *out); + +/** + * @brief SetPtmBatteryLot + * @param[in] lot \ref SetBatteryLot + */ +Result SetPtmBatteryLot(const SetBatteryLot *lot); + +/** + * @brief GetPtmFuelGaugeParameter + * @param[out] out \ref SetSysPtmFuelGaugeParameter + */ +Result GetPtmFuelGaugeParameter(SetSysPtmFuelGaugeParameter *out); + +/** + * @brief SetPtmFuelGaugeParameter + * @param[in] parameter \ref SetSysPtmFuelGaugeParameter + */ +Result SetPtmFuelGaugeParameter(const SetSysPtmFuelGaugeParameter *parameter); + +/** + * @brief GetBluetoothEnableFlag + * @param[out] out Output flag. + */ +Result GetBluetoothEnableFlag(bool *out); + +/** + * @brief SetBluetoothEnableFlag + * @param[in] flag Input flag. + */ +Result SetBluetoothEnableFlag(bool flag); + +/** + * @brief GetMiiAuthorId + * @param[out] out Output MiiAuthorId. + */ +Result GetMiiAuthorId(Uuid *out); + +/** + * @brief SetShutdownRtcValue + * @param[in] value Input value. + */ +Result SetShutdownRtcValue(u64 value); + +/** + * @brief GetShutdownRtcValue + * @param[out] out Output value. + */ +Result GetShutdownRtcValue(u64 *out); + +/** + * @brief Gets an event that settings will signal on flag change. + * @param out_event Event to bind. Output event will have autoclear=false. + */ +Result AcquireFatalDirtyFlagEventHandle(Event *out_event); + +/** + * @brief Gets the settings flags that have changed. + * @param flags_0 Pointer to populate with first 64 flags. + * @param flags_1 Pointer to populate with second 64 flags. + */ +Result GetFatalDirtyFlags(u64 *flags_0, u64 *flags_1); + +/** + * @brief GetAutoUpdateEnableFlag + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. + */ +Result GetAutoUpdateEnableFlag(bool *out); + +/** + * @brief SetAutoUpdateEnableFlag + * @note Only available on [2.0.0+]. + * @param[in] flag Input flag. + */ +Result SetAutoUpdateEnableFlag(bool flag); + +/** + * @brief GetNxControllerSettings + * @note On [13.0.0+] \ref setsysGetNxControllerSettingsEx should be used instead. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysNxControllerLegacySettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetNxControllerSettings(s32 *total_out, SetSysNxControllerLegacySettings *settings, s32 count); + +/** + * @brief SetNxControllerSettings + * @note On [13.0.0+] \ref setsysSetNxControllerSettingsEx should be used instead. + * @param[in] settings Input array of \ref SetSysNxControllerLegacySettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetNxControllerSettings(const SetSysNxControllerLegacySettings *settings, s32 count); + +/** + * @brief GetBatteryPercentageFlag + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. + */ +Result GetBatteryPercentageFlag(bool *out); + +/** + * @brief SetBatteryPercentageFlag + * @note Only available on [2.0.0+]. + * @param[in] flag Input flag. + */ +Result SetBatteryPercentageFlag(bool flag); + +/** + * @brief GetExternalRtcResetFlag + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. + */ +Result GetExternalRtcResetFlag(bool *out); + +/** + * @brief SetExternalRtcResetFlag + * @note Only available on [2.0.0+]. + * @param[in] flag Input flag. + */ +Result SetExternalRtcResetFlag(bool flag); + +/** + * @brief GetUsbFullKeyEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result GetUsbFullKeyEnableFlag(bool *out); + +/** + * @brief SetUsbFullKeyEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result SetUsbFullKeyEnableFlag(bool flag); + +/** + * @brief SetExternalSteadyClockInternalOffset + * @note Only available on [3.0.0+]. + * @param[in] offset Input offset. + */ +Result SetExternalSteadyClockInternalOffset(u64 offset); + +/** + * @brief GetExternalSteadyClockInternalOffset + * @note Only available on [3.0.0+]. + * @param[out] out Output offset. + */ +Result GetExternalSteadyClockInternalOffset(u64 *out); + +/** + * @brief GetBacklightSettingsEx + * @note Only available on [3.0.0+]. + * @param[out] out \ref SetSysBacklightSettingsEx + */ +Result GetBacklightSettingsEx(SetSysBacklightSettingsEx *out); + +/** + * @brief SetBacklightSettingsEx + * @note Only available on [3.0.0+]. + * @param[in] settings \ref SetSysBacklightSettingsEx + */ +Result SetBacklightSettingsEx(const SetSysBacklightSettingsEx *settings); + +/** + * @brief GetHeadphoneVolumeWarningCount + * @note Only available on [3.0.0+]. + * @param[out] out Output count. + */ +Result GetHeadphoneVolumeWarningCount(u32 *out); + +/** + * @brief SetHeadphoneVolumeWarningCount + * @note Only available on [3.0.0+]. + * @param[in] count Input count. + */ +Result SetHeadphoneVolumeWarningCount(u32 count); + +/** + * @brief GetBluetoothAfhEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result GetBluetoothAfhEnableFlag(bool *out); + +/** + * @brief SetBluetoothAfhEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result SetBluetoothAfhEnableFlag(bool flag); + +/** + * @brief GetBluetoothBoostEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result GetBluetoothBoostEnableFlag(bool *out); + +/** + * @brief SetBluetoothBoostEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result SetBluetoothBoostEnableFlag(bool flag); + +/** + * @brief GetInRepairProcessEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result GetInRepairProcessEnableFlag(bool *out); + +/** + * @brief SetInRepairProcessEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result SetInRepairProcessEnableFlag(bool flag); + +/** + * @brief GetHeadphoneVolumeUpdateFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result GetHeadphoneVolumeUpdateFlag(bool *out); + +/** + * @brief SetHeadphoneVolumeUpdateFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result SetHeadphoneVolumeUpdateFlag(bool flag); + +/** + * @brief NeedsToUpdateHeadphoneVolume + * @note Only available on [3.0.0-14.1.2]. + * @param[out] a0 Output arg. + * @param[out] a1 Output arg. + * @param[out] a2 Output arg. + * @param[in] flag Input flag. + */ +Result NeedsToUpdateHeadphoneVolume(u8 *a0, u8 *a1, u8 *a2, bool flag); + +/** + * @brief GetPushNotificationActivityModeOnSleep + * @note Only available on [3.0.0+]. + * @param[out] out Output mode. + */ +Result GetPushNotificationActivityModeOnSleep(u32 *out); + +/** + * @brief SetPushNotificationActivityModeOnSleep + * @note Only available on [3.0.0+]. + * @param[in] mode Input mode. + */ +Result SetPushNotificationActivityModeOnSleep(u32 mode); + +/** + * @brief GetServiceDiscoveryControlSettings + * @note Only available on [4.0.0+]. + * @param[out] out \ref ServiceDiscoveryControlSettings + */ +Result GetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings *out); + +/** + * @brief SetServiceDiscoveryControlSettings + * @note Only available on [4.0.0+]. + * @param[in] settings \ref ServiceDiscoveryControlSettings + */ +Result SetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings settings); + +/** + * @brief GetErrorReportSharePermission + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetSysErrorReportSharePermission + */ +Result GetErrorReportSharePermission(SetSysErrorReportSharePermission *out); + +/** + * @brief SetErrorReportSharePermission + * @note Only available on [4.0.0+]. + * @param[in] permission \ref SetSysErrorReportSharePermission + */ +Result SetErrorReportSharePermission(SetSysErrorReportSharePermission permission); + +/** + * @brief GetAppletLaunchFlags + * @note Only available on [4.0.0+]. + * @param[out] out Output AppletLaunchFlags bitmask. + */ +Result GetAppletLaunchFlags(u32 *out); + +/** + * @brief SetAppletLaunchFlags + * @note Only available on [4.0.0+]. + * @param[in] flags Input AppletLaunchFlags bitmask. + */ +Result SetAppletLaunchFlags(u32 flags); + +/** + * @brief GetConsoleSixAxisSensorAccelerationBias + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetSysConsoleSixAxisSensorAccelerationBias + */ +Result GetConsoleSixAxisSensorAccelerationBias(SetSysConsoleSixAxisSensorAccelerationBias *out); + +/** + * @brief SetConsoleSixAxisSensorAccelerationBias + * @note Only available on [4.0.0+]. + * @param[in] bias \ref SetSysConsoleSixAxisSensorAccelerationBias + */ +Result SetConsoleSixAxisSensorAccelerationBias(const SetSysConsoleSixAxisSensorAccelerationBias *bias); + +/** + * @brief GetConsoleSixAxisSensorAngularVelocityBias + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetSysConsoleSixAxisSensorAngularVelocityBias + */ +Result GetConsoleSixAxisSensorAngularVelocityBias(SetSysConsoleSixAxisSensorAngularVelocityBias *out); + +/** + * @brief SetConsoleSixAxisSensorAngularVelocityBias + * @note Only available on [4.0.0+]. + * @param[in] bias \ref SetSysConsoleSixAxisSensorAngularVelocityBias + */ +Result SetConsoleSixAxisSensorAngularVelocityBias(const SetSysConsoleSixAxisSensorAngularVelocityBias *bias); + +/** + * @brief GetConsoleSixAxisSensorAccelerationGain + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetSysConsoleSixAxisSensorAccelerationGain + */ +Result GetConsoleSixAxisSensorAccelerationGain(SetSysConsoleSixAxisSensorAccelerationGain *out); + +/** + * @brief SetConsoleSixAxisSensorAccelerationGain + * @note Only available on [4.0.0+]. + * @param[in] gain \ref SetSysConsoleSixAxisSensorAccelerationGain + */ +Result SetConsoleSixAxisSensorAccelerationGain(const SetSysConsoleSixAxisSensorAccelerationGain *gain); + +/** + * @brief GetConsoleSixAxisSensorAngularVelocityGain + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetSysConsoleSixAxisSensorAngularVelocityGain + */ +Result GetConsoleSixAxisSensorAngularVelocityGain(SetSysConsoleSixAxisSensorAngularVelocityGain *out); + +/** + * @brief SetConsoleSixAxisSensorAngularVelocityGain + * @note Only available on [4.0.0+]. + * @param[in] gain \ref SetSysConsoleSixAxisSensorAngularVelocityGain + */ +Result SetConsoleSixAxisSensorAngularVelocityGain(const SetSysConsoleSixAxisSensorAngularVelocityGain *gain); + +/** + * @brief GetKeyboardLayout + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetKeyboardLayout + */ +Result GetKeyboardLayout(::SetKeyboardLayout *out); + +/** + * @brief SetKeyboardLayout + * @note Only available on [4.0.0+]. + * @param[in] layout \ref SetKeyboardLayout + */ +Result SetKeyboardLayout(::SetKeyboardLayout layout); + +/** + * @brief GetWebInspectorFlag + * @note Only available on [4.0.0+]. + * @param[out] out Output flag. + */ +Result GetWebInspectorFlag(bool *out); + +/** + * @brief GetAllowedSslHosts + * @note Only available on [4.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] out Output array of \ref SetSysAllowedSslHosts. + * @param[in] count Size of the hosts array in entries. + */ +Result GetAllowedSslHosts(s32 *total_out, SetSysAllowedSslHosts *out, s32 count); + +/** + * @brief GetHostFsMountPoint + * @note Only available on [4.0.0+]. + * @param[out] out \ref SetSysHostFsMountPoint + */ +Result GetHostFsMountPoint(SetSysHostFsMountPoint *out); + +/** + * @brief GetRequiresRunRepairTimeReviser + * @note Only available on [5.0.0+]. + * @param[out] out Output flag. + */ +Result GetRequiresRunRepairTimeReviser(bool *out); + +/** + * @brief SetRequiresRunRepairTimeReviser + * @note Only available on [5.0.0+]. + * @param[in] flag Input flag. + */ +Result SetRequiresRunRepairTimeReviser(bool flag); + +/** + * @brief SetBlePairingSettings + * @note Only available on [5.0.0+]. + * @param[in] settings Input array of \ref SetSysBlePairingSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetBlePairingSettings(const SetSysBlePairingSettings *settings, s32 count); + +/** + * @brief GetBlePairingSettings + * @note Only available on [5.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysBlePairingSettings. + * @param[in] count Size of the hosts array in entries. + */ +Result GetBlePairingSettings(s32 *total_out, SetSysBlePairingSettings *settings, s32 count); + +/** + * @brief GetConsoleSixAxisSensorAngularVelocityTimeBias + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetSysConsoleSixAxisSensorAngularVelocityTimeBias + */ +Result GetConsoleSixAxisSensorAngularVelocityTimeBias(SetSysConsoleSixAxisSensorAngularVelocityTimeBias *out); + +/** + * @brief SetConsoleSixAxisSensorAngularVelocityTimeBias + * @note Only available on [5.0.0+]. + * @param[in] bias \ref SetSysConsoleSixAxisSensorAngularVelocityTimeBias + */ +Result SetConsoleSixAxisSensorAngularVelocityTimeBias(const SetSysConsoleSixAxisSensorAngularVelocityTimeBias *bias); + +/** + * @brief GetConsoleSixAxisSensorAngularAcceleration + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetSysConsoleSixAxisSensorAngularAcceleration + */ +Result GetConsoleSixAxisSensorAngularAcceleration(SetSysConsoleSixAxisSensorAngularAcceleration *out); + +/** + * @brief SetConsoleSixAxisSensorAngularAcceleration + * @note Only available on [5.0.0+]. + * @param[in] acceleration \ref SetSysConsoleSixAxisSensorAngularAcceleration + */ +Result SetConsoleSixAxisSensorAngularAcceleration(const SetSysConsoleSixAxisSensorAngularAcceleration *acceleration); + +/** + * @brief GetRebootlessSystemUpdateVersion + * @note Only available on [5.0.0+]. + * @param[out] out \ref SetSysRebootlessSystemUpdateVersion + */ +Result GetRebootlessSystemUpdateVersion(SetSysRebootlessSystemUpdateVersion *out); + +/** + * @brief GetDeviceTimeZoneLocationUpdatedTime + * @note Only available on [5.0.0+]. + * @param[out] out \ref TimeSteadyClockTimePoint + */ +Result GetDeviceTimeZoneLocationUpdatedTime(TimeSteadyClockTimePoint *out); + +/** + * @brief SetDeviceTimeZoneLocationUpdatedTime + * @note Only available on [5.0.0+]. + * @param[in] time_point \ref TimeSteadyClockTimePoint + */ +Result SetDeviceTimeZoneLocationUpdatedTime(const TimeSteadyClockTimePoint *time_point); + +/** + * @brief GetUserSystemClockAutomaticCorrectionUpdatedTime + * @note Only available on [6.0.0+]. + * @param[out] out \ref TimeSteadyClockTimePoint + */ +Result GetUserSystemClockAutomaticCorrectionUpdatedTime(TimeSteadyClockTimePoint *out); + +/** + * @brief SetUserSystemClockAutomaticCorrectionUpdatedTime + * @note Only available on [6.0.0+]. + * @param[in] time_point \ref TimeSteadyClockTimePoint + */ +Result SetUserSystemClockAutomaticCorrectionUpdatedTime(const TimeSteadyClockTimePoint *time_point); + +/** + * @brief GetAccountOnlineStorageSettings + * @note Only available on [6.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysAccountOnlineStorageSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetAccountOnlineStorageSettings(s32 *total_out, SetSysAccountOnlineStorageSettings *settings, s32 count); + +/** + * @brief SetAccountOnlineStorageSettings + * @note Only available on [6.0.0+]. + * @param[in] settings Input array of \ref SetSysAccountOnlineStorageSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetAccountOnlineStorageSettings(const SetSysAccountOnlineStorageSettings *settings, s32 count); + +/** + * @brief GetPctlReadyFlag + * @note Only available on [6.0.0+]. + * @param[out] out Output flag. + */ +Result GetPctlReadyFlag(bool *out); + +/** + * @brief SetPctlReadyFlag + * @note Only available on [6.0.0+]. + * @param[in] flag Input flag. + */ +Result SetPctlReadyFlag(bool flag); + +/** + * @brief GetAnalogStickUserCalibrationL + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetSysAnalogStickUserCalibration + */ +Result GetAnalogStickUserCalibrationL(SetSysAnalogStickUserCalibration *out); + +/** + * @brief SetAnalogStickUserCalibrationL + * @note Only available on [8.1.1+]. + * @param[in] calibration \ref SetSysAnalogStickUserCalibration + */ +Result SetAnalogStickUserCalibrationL(const SetSysAnalogStickUserCalibration *calibration); + +/** + * @brief GetAnalogStickUserCalibrationR + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetSysAnalogStickUserCalibration + */ +Result GetAnalogStickUserCalibrationR(SetSysAnalogStickUserCalibration *out); + +/** + * @brief SetAnalogStickUserCalibrationR + * @note Only available on [8.1.1+]. + * @param[in] calibration \ref SetSysAnalogStickUserCalibration + */ +Result SetAnalogStickUserCalibrationR(const SetSysAnalogStickUserCalibration *calibration); + +/** + * @brief GetPtmBatteryVersion + * @note Only available on [6.0.0+]. + * @param[out] out Output version. + */ +Result GetPtmBatteryVersion(u8 *out); + +/** + * @brief SetPtmBatteryVersion + * @note Only available on [6.0.0+]. + * @param[in] version Input version. + */ +Result SetPtmBatteryVersion(u8 version); + +/** + * @brief GetUsb30HostEnableFlag + * @note Only available on [6.0.0+]. + * @param[out] out Output flag. + */ +Result GetUsb30HostEnableFlag(bool *out); + +/** + * @brief SetUsb30HostEnableFlag + * @note Only available on [6.0.0+]. + * @param[in] flag Input flag. + */ +Result SetUsb30HostEnableFlag(bool flag); + +/** + * @brief GetUsb30DeviceEnableFlag + * @note Only available on [6.0.0+]. + * @param[out] out Output flag. + */ +Result GetUsb30DeviceEnableFlag(bool *out); + +/** + * @brief SetUsb30DeviceEnableFlag + * @note Only available on [6.0.0+]. + * @param[in] flag Input flag. + */ +Result SetUsb30DeviceEnableFlag(bool flag); + +/** + * @brief GetThemeId + * @note Only available on [7.0.0+]. + * @param[in] type Input theme id type. + * @param[out] out \ref SetSysThemeId + */ +Result GetThemeId(s32 type, SetSysThemeId *out); + +/** + * @brief SetThemeId + * @note Only available on [7.0.0+]. + * @param[in] type Input theme id type. + * @param[in] theme_id \ref SetSysThemeId + */ +Result SetThemeId(s32 type, const SetSysThemeId *theme_id); + +/** + * @brief GetChineseTraditionalInputMethod + * @note Only available on [7.0.0+]. + * @param[out] out \ref SetChineseTraditionalInputMethod + */ +Result GetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod *out); + +/** + * @brief SetChineseTraditionalInputMethod + * @note Only available on [7.0.0+]. + * @param[in] method \ref SetChineseTraditionalInputMethod + */ +Result SetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod method); + +/** + * @brief GetPtmCycleCountReliability + * @note Only available on [7.0.0+]. + * @param[out] out \ref SetSysPtmCycleCountReliability + */ +Result GetPtmCycleCountReliability(SetSysPtmCycleCountReliability *out); + +/** + * @brief SetPtmCycleCountReliability + * @note Only available on [7.0.0+]. + * @param[in] reliability \ref SetSysPtmCycleCountReliability + */ +Result SetPtmCycleCountReliability(SetSysPtmCycleCountReliability reliability); + +/** + * @brief Gets the \ref SetSysHomeMenuScheme. + * @note Only available on [8.1.1+]. + * @param[out] out \ref SetSysHomeMenuScheme + */ +Result GetHomeMenuScheme(SetSysHomeMenuScheme *out); + +/** + * @brief GetThemeSettings + * @note Only available on [7.0.0+]. + * @param[out] out \ref SetSysThemeSettings + */ +Result GetThemeSettings(SetSysThemeSettings *out); + +/** + * @brief SetThemeSettings + * @note Only available on [7.0.0+]. + * @param[in] settings \ref SetSysThemeSettings + */ +Result SetThemeSettings(const SetSysThemeSettings *settings); + +/** + * @brief GetThemeKey + * @note Only available on [7.0.0+]. + * @param[out] out \ref FsArchiveMacKey + */ +Result GetThemeKey(FsArchiveMacKey *out); + +/** + * @brief SetThemeKey + * @note Only available on [7.0.0+]. + * @param[in] key \ref FsArchiveMacKey + */ +Result SetThemeKey(const FsArchiveMacKey *key); + +/** + * @brief GetZoomFlag + * @note Only available on [8.0.0+]. + * @param[out] out Output flag. + */ +Result GetZoomFlag(bool *out); + +/** + * @brief SetZoomFlag + * @note Only available on [8.0.0+]. + * @param[in] flag Input flag. + */ +Result SetZoomFlag(bool flag); + +/** + * @brief Returns Terra platform type flag. + * @note On [9.0.0+], this is a wrapper for \ref setsysGetPlatFormRegion() == 2. + * @note Only available on [8.0.0+]. + * @param[out] out Output flag. + */ +Result GetT(bool *out); + +/** + * @brief Sets Terra platform type flag. + * @note On [9.0.0+], this is a wrapper for \ref setsysSetPlatFormRegion(1 + (IsT & 1)). + * @note Only available on [8.0.0+]. + * @param[in] flag Input flag. + */ +Result SetT(bool flag); + +/** + * @brief Gets the \ref SetSysPlatformRegion. + * @note This is used internally by \ref appletGetSettingsPlatformRegion. + * @note Only available on [9.0.0+]. + * @param[out] out \ref SetSysPlatformRegion + */ +Result GetPlatformRegion(SetSysPlatformRegion *out); + +/** + * @brief Sets the \ref SetSysPlatformRegion. + * @note Only available on [9.0.0+]. + * @param[in] region \ref SetSysPlatformRegion + */ +Result SetPlatformRegion(SetSysPlatformRegion region); + +/** + * @brief GetHomeMenuSchemeModel + * @note This will throw an error when loading the "settings_debug!{...}" system-setting which is used with this fails. + * @note Only available on [9.0.0+]. + * @param[out] out HomeMenuSchemeModel. + */ +Result GetHomeMenuSchemeModel(u32 *out); + +/** + * @brief GetMemoryUsageRateFlag + * @note Only available on [9.0.0+]. + * @param[out] out Output flag. + */ +Result GetMemoryUsageRateFlag(bool *out); + +/** + * @brief Gets the \ref SetSysTouchScreenMode. + * @note Only available on [9.0.0+]. + * @param[out] out \ref SetSysTouchScreenMode + */ +Result GetTouchScreenMode(SetSysTouchScreenMode *out); + +/** + * @brief Sets the \ref SetSysTouchScreenMode. + * @note Only available on [9.0.0+]. + * @param[in] mode \ref SetSysTouchScreenMode + */ +Result SetTouchScreenMode(SetSysTouchScreenMode mode); + +/** + * @brief GetButtonConfigSettingsFull + * @note Only available on [10.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetButtonConfigSettingsFull(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief SetButtonConfigSettingsFull + * @note Only available on [10.0.0+]. + * @param[in] settings Input array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetButtonConfigSettingsFull(const SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief GetButtonConfigSettingsEmbedded + * @note Only available on [10.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetButtonConfigSettingsEmbedded(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief SetButtonConfigSettingsEmbedded + * @note Only available on [10.0.0+]. + * @param[in] settings Input array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetButtonConfigSettingsEmbedded(const SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief GetButtonConfigSettingsLeft + * @note Only available on [10.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetButtonConfigSettingsLeft(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief SetButtonConfigSettingsLeft + * @note Only available on [10.0.0+]. + * @param[in] settings Input array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetButtonConfigSettingsLeft(const SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief GetButtonConfigSettingsRight + * @note Only available on [10.0.0+]. + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetButtonConfigSettingsRight(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief SetButtonConfigSettingsRight + * @note Only available on [10.0.0+]. + * @param[in] settings Input array of \ref SetSysButtonConfigSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetButtonConfigSettingsRight(const SetSysButtonConfigSettings *settings, s32 count); + +/** + * @brief GetButtonConfigRegisteredSettingsEmbedded + * @note Only available on [10.0.0+]. + * @param[out] settings \ref SetSysButtonConfigRegisteredSettings + */ +Result GetButtonConfigRegisteredSettingsEmbedded(SetSysButtonConfigRegisteredSettings *settings); + +/** + * @brief SetButtonConfigRegisteredSettingsEmbedded + * @note Only available on [10.0.0+]. + * @param[in] settings \ref SetSysButtonConfigRegisteredSettings + */ +Result SetButtonConfigRegisteredSettingsEmbedded(const SetSysButtonConfigRegisteredSettings *settings); + +/** + * @brief GetButtonConfigRegisteredSettings + * @note Only available on [10.0.0+]. + * @param[out] settings \ref SetSysButtonConfigRegisteredSettings + */ +Result GetButtonConfigRegisteredSettings(s32 *total_out, SetSysButtonConfigRegisteredSettings *settings, s32 count); + +/** + * @brief SetButtonConfigRegisteredSettings + * @note Only available on [10.0.0+]. + * @param[in] settings \ref SetSysButtonConfigRegisteredSettings + */ +Result SetButtonConfigRegisteredSettings(const SetSysButtonConfigRegisteredSettings *settings, s32 count); + +/** + * @brief GetFieldTestingFlag + * @note Only available on [10.1.0+]. + * @param[out] out Output flag. + */ +Result GetFieldTestingFlag(bool *out); + +/** + * @brief SetFieldTestingFlag + * @note Only available on [10.1.0+]. + * @param[in] flag Input flag. + */ +Result SetFieldTestingFlag(bool flag); + +/** + * @brief GetNxControllerSettingsEx + * @param[out] total_out Total output entries. + * @param[out] settings Output array of \ref SetSysNxControllerSettings. + * @param[in] count Size of the settings array in entries. + */ +Result GetNxControllerSettingsEx(s32 *total_out, SetSysNxControllerSettings *settings, s32 count); + +/** + * @brief SetNxControllerSettingsEx + * @param[in] settings Input array of \ref SetSysNxControllerSettings. + * @param[in] count Size of the settings array in entries. + */ +Result SetNxControllerSettingsEx(const SetSysNxControllerSettings *settings, s32 count); + +} // namespace setsys + +/// @brief C++ wrappers for the `sha1` API. +/// @details Wraps: switch/crypto/sha1.h. +namespace sha1 { + +/// Context for SHA1 operations. +using ::Sha1Context; + +/// Initialize a SHA1 context. +void ContextCreate(Sha1Context *out); + +/// Updates SHA1 context with data to hash +void ContextUpdate(Sha1Context *ctx, const void *src, size_t size); + +/// Gets the context's output hash, finalizes the context. +void ContextGetHash(Sha1Context *ctx, void *dst); + +/// Simple all-in-one SHA1 calculator. +void CalculateHash(void *dst, const void *src, size_t size); + +} // namespace sha1 + +/// @brief C++ wrappers for the `sha256` API. +/// @details Wraps: switch/crypto/sha256.h. +namespace sha256 { + +/// Context for SHA256 operations. +using ::Sha256Context; + +/// Initialize a SHA256 context. +void ContextCreate(Sha256Context *out); + +/// Updates SHA256 context with data to hash +void ContextUpdate(Sha256Context *ctx, const void *src, size_t size); + +/// Gets the context's output hash, finalizes the context. +void ContextGetHash(Sha256Context *ctx, void *dst); + +/// Simple all-in-one SHA256 calculator. +void CalculateHash(void *dst, const void *src, size_t size); + +} // namespace sha256 + +/// @brief C++ wrappers for the `shmem` API. +/// @details Wraps: switch/kernel/shmem.h. +namespace shmem { + +/// Shared memory information structure. +using ::SharedMemory; + +/** + * @brief Creates a shared memory object. + * @param s Shared memory information structure which will be filled in. + * @param size Size of the shared memory object to create. + * @param local_perm Permissions with which the shared memory object will be mapped in the local process. + * @param remote_perm Permissions with which the shared memory object will be mapped in the remote process (can be Perm_DontCare). + * @return Result code. + * @warning This is a privileged operation; in normal circumstances applications cannot use this function. + */ +Result Create(SharedMemory* s, size_t size, Permission local_perm, Permission remote_perm); + +/** + * @brief Loads a shared memory object coming from a remote process. + * @param s Shared memory information structure which will be filled in. + * @param handle Handle of the shared memory object. + * @param size Size of the shared memory object that is being loaded. + * @param perm Permissions with which the shared memory object will be mapped in the local process. + */ +void LoadRemote(SharedMemory* s, Handle handle, size_t size, Permission perm); + +/** + * @brief Maps a shared memory object. + * @param s Shared memory information structure. + * @return Result code. + */ +Result Map(SharedMemory* s); + +/** + * @brief Unmaps a shared memory object. + * @param s Shared memory information structure. + * @return Result code. + */ +Result Unmap(SharedMemory* s); + +/** + * @brief Retrieves the mapped address of a shared memory object. + * @param s Shared memory information structure. + * @return Mapped address of the shared memory object. + */ +void* GetAddr(SharedMemory* s); + +/** + * @brief Frees up resources used by a shared memory object, unmapping and closing handles, etc. + * @param s Shared memory information structure. + * @return Result code. + */ +Result Close(SharedMemory* s); + +} // namespace shmem + +/// @brief C++ wrappers for the `sm` API. +/// @details Wraps: switch/services/sm.h, switch/services/smm.h. +namespace sm { + +/// Structure representing a service name (null terminated, remaining characters set to zero). +using ::SmServiceName; + +/// Converts a service name into a 64-bit integer. +u64 ServiceNameToU64(SmServiceName name); + +/// Converts a 64-bit integer into a service name. +SmServiceName ServiceNameFromU64(u64 name); + +/** + * @brief Checks whether two service names are equal. + * @param[in] a First name. + * @param[in] b Second name. + * @return Comparison result. + */ +bool ServiceNamesAreEqual(SmServiceName a, SmServiceName b); + +/** + * @brief Encodes a service name string as a \ref SmServiceName structure. + * @param[in] name Name of the service. + * @return Encoded name. + */ +SmServiceName EncodeName(const char* name); + +/** + * @brief Initializes SM. + * @return Result code. + * @note This function is already called in the default application startup code (before main() is called). + */ +Result Initialize(void); + +/** + * @brief Uninitializes SM. + * @return Result code. + * @note This function is already handled in the default application exit code (after main() returns). + */ +void Exit(void); + +/** + * @brief Requests a service from SM, allowing overrides. + * @param[out] service_out Service structure which will be filled in. + * @param[in] name Name of the service to request. + * @return Result code. + */ +Result GetServiceWrapper(Service* service_out, SmServiceName name); + +/** + * @brief Requests a service from SM, as an IPC session handle directly + * @param[out] handle_out Variable containing IPC session handle. + * @param[in] name Name of the service to request. + * @return Result code. + */ +Result GetServiceOriginal(Handle* handle_out, SmServiceName name); + +/** + * @brief Requests a service from SM. + * @param[out] service_out Service structure which will be filled in. + * @param[in] name Name of the service to request (as a string). + * @return Result code. + */ +Result GetService(Service* service_out, const char* name); + +/** + * @brief Retrieves an overriden service in the homebrew environment. + * @param[in] name Name of the service to request. + * @return IPC session handle. + */ +Handle GetServiceOverride(SmServiceName name); + +/** + * @brief Creates and registers a new service within SM. + * @param[out] handle_out Variable containing IPC port handle. + * @param[in] name Name of the service. + * @param[in] is_light "Is light" + * @param[in] max_sessions Maximum number of concurrent sessions that the service will accept. + * @return Result code. + */ +Result RegisterService(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions); + +/// Same as \ref smRegisterService, but always using cmif serialization. +Result RegisterServiceCmif(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions); + +/// Same as \ref smRegisterService, but always using tipc serialization. +Result RegisterServiceTipc(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions); + +/** + * @brief Unregisters a previously registered service in SM. + * @param[in] name Name of the service. + * @return Result code. + */ +Result UnregisterService(SmServiceName name); + +/// Same as \ref smUnregisterService, but always using cmif serialization. +Result UnregisterServiceCmif(SmServiceName name); + +/// Same as \ref smUnregisterService, but always using tipc serialization. +Result UnregisterServiceTipc(SmServiceName name); + +/** + * @brief Detaches the current SM session. + * @note After this function is called, the rest of the SM API cannot be used. + * @note Only available on [11.0.0-11.0.1], or Atmosphère. + */ +Result DetachClient(void); + +/// Same as \ref smDetachClient, but always using cmif serialization. +Result DetachClientCmif(void); + +/// Same as \ref smDetachClient, but always using tipc serialization. +Result DetachClientTipc(void); + +/** + * @brief Gets the Service session used to communicate with SM. + * @return Pointer to service session used to communicate with SM. + */ +Service * GetServiceSession(void); + +/** + * @brief Gets the TipcService session used to communicate with SM. + * @return Pointer to tipc service session used to communicate with SM. + * @note Only available on [12.0.0+], or Atmosphère. + */ +TipcService * GetServiceSessionTipc(void); + +/** + * @brief Overrides a service with a custom IPC service handle. + * @param[in] name Name of the service. + * @param[in] handle IPC session handle. + */ +void AddOverrideHandle(SmServiceName name, Handle handle); + +/// Initialize sm:m. +Result ManagerInitialize(void); + +/// Exit sm:m. +void ManagerExit(void); + +Result ManagerRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size); + +Result ManagerUnregisterProcess(u64 pid); + +/// Initialize sm:m exclusively for tipc (requires <12.0.0 and non-Atmosphere). +Result ManagerCmifInitialize(void); + +/// Exit sm:m exclusively for tipc (requires <12.0.0 and non-Atmosphere). +void ManagerCmifExit(void); + +/// Gets the Service object for the actual sm:m service session (requires <12.0.0 and non-Atmosphere). +Service* ManagerCmifGetServiceSession(void); + +Result ManagerCmifRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size); + +Result ManagerCmifUnregisterProcess(u64 pid); + +/// Initialize sm:m exclusively for tipc (requires 12.0.0+ or Atmosphere). +Result ManagerTipcInitialize(void); + +/// Exit sm:m exclusively for tipc (requires 12.0.0+ or Atmosphere). +void ManagerTipcExit(void); + +/// Gets the TipcService object for the actual sm:m service session (requires 12.0.0+ or Atmosphere). +TipcService* ManagerTipcGetServiceSession(void); + +Result ManagerTipcRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size); + +Result ManagerTipcUnregisterProcess(u64 pid); + +} // namespace sm + +/// @brief C++ wrappers for the `socket` API. +/// @details Wraps: switch/runtime/devices/socket.h. +namespace socket { + +/// BSD service type used by the socket driver. +using ::BsdServiceType; +#ifdef _SOCKLEN_T_DECLARED +using ::sockaddr; +#endif +/// Configuration structure for socketInitalize +using ::SocketInitConfig; + +/// Fetch the default configuration for the socket driver. +const SocketInitConfig * GetDefaultInitConfig(void); + +/// Initalize the socket driver. +Result Initialize(const SocketInitConfig *config); + +/// Fetch the last bsd:u/s Switch result code (thread-local). +Result GetLastResult(void); + +/// Deinitialize the socket driver. +void Exit(void); + +/// Initalize the socket driver using the default configuration. +Result InitializeDefault(void); + +/// Wrapper for \ref sslConnectionSetSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored. +int SslConnectionSetSocketDescriptor(SslConnection *c, int sockfd); + +/// Wrapper for \ref sslConnectionGetSocketDescriptor. Returns the output sockfd on success and -1 on error. +int SslConnectionGetSocketDescriptor(SslConnection *c); + +#ifdef _SOCKLEN_T_DECLARED +/// Wrapper for \ref sslConnectionSetDtlsSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored. +int SslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen); +#endif + +/// Wrapper for \ref nifmRequestRegisterSocketDescriptor. Returns 0 on success and -1 on error. +int NifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd); + +/// Wrapper for \ref nifmRequestUnregisterSocketDescriptor. Returns 0 on success and -1 on error. +int NifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd); + +} // namespace socket + +/// @brief C++ wrappers for the `spl` API. +/// @details Wraps: switch/services/spl.h. +namespace spl { + +using ::RsaKeyVersion; +using ::SplConfigItem; + +/// Initialize 'spl:'. +Result Initialize(void); + +/// Exit 'spl:'. +void Exit(void); + +/// Gets the Service object for the IGeneralInterface usable with spl*(). +Service* GetServiceSession(void); + +/// Initialize spl:mig. On pre-4.0.0 this just calls \ref splInitialize. +Result CryptoInitialize(void); + +/// Exit spl:mig. On pre-4.0.0 this just calls \ref splExit. +void CryptoExit(void); + +/// Gets the Service object for the IGeneralInterface usable with splCrypto*(). +Service* CryptoGetServiceSession(void); + +/// Initialize spl:ssl. On pre-4.0.0 this just calls \ref splInitialize. +Result SslInitialize(void); + +/// Exit spl:ssl. On pre-4.0.0 this just calls \ref splExit. +void SslExit(void); + +/// Gets the Service object for the IGeneralInterface usable with splSsl*(). +Service* SslGetServiceSession(void); + +/// Initialize spl:es. On pre-4.0.0 this just calls \ref splInitialize. +Result EsInitialize(void); + +/// Exit spl:es. On pre-4.0.0 this just calls \ref splExit. +void EsExit(void); + +/// Gets the Service object for the IGeneralInterface usable with splEs*(). +Service* EsGetServiceSession(void); + +/// Initialize spl:fs. On pre-4.0.0 this just calls \ref splInitialize. +Result FsInitialize(void); + +/// Exit spl:fs. On pre-4.0.0 this just calls \ref splExit. +void FsExit(void); + +/// Gets the Service object for the IGeneralInterface usable with splFs*(). +Service* FsGetServiceSession(void); + +/// Initialize spl:manu. On pre-4.0.0 this just calls \ref splInitialize. +Result ManuInitialize(void); + +/// Exit spl:manu. On pre-4.0.0 this just calls \ref splExit. +void ManuExit(void); + +/// Gets the Service object for the IGeneralInterface usable with splManu*(). +Service* ManuGetServiceSession(void); + +Result GetConfig(SplConfigItem config_item, u64 *out_config); + +Result UserExpMod(const void *input, const void *modulus, const void *exp, size_t exp_size, void *dst); + +Result SetConfig(SplConfigItem config_item, u64 value); + +Result GetRandomBytes(void *out, size_t out_size); + +Result IsDevelopment(bool *out_is_development); + +Result SetBootReason(u32 value); + +Result GetBootReason(u32 *out_value); + +Result CryptoGenerateAesKek(const void *wrapped_kek, u32 key_generation, u32 option, void *out_sealed_kek); + +Result CryptoLoadAesKey(const void *sealed_kek, const void *wrapped_key, u32 keyslot); + +Result CryptoGenerateAesKey(const void *sealed_kek, const void *wrapped_key, void *out_sealed_key); + +Result CryptoDecryptAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key); + +Result CryptoCryptAesCtr(const void *input, void *output, size_t size, u32 keyslot, const void *ctr); + +Result CryptoComputeCmac(const void *input, size_t size, u32 keyslot, void *out_cmac); + +Result CryptoLockAesEngine(u32 *out_keyslot); + +Result CryptoUnlockAesEngine(u32 keyslot); + +Result CryptoGetSecurityEngineEvent(Event *out_event); + +Result RsaDecryptPrivateKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version, void *dst, size_t dst_size); + +Result SslLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size); + +Result SslSecureExpMod(const void *input, const void *modulus, void *dst); + +Result EsLoadRsaOaepKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version); + +Result EsUnwrapRsaOaepWrappedTitlekey(const void *rsa_wrapped_titlekey, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_titlekey); + +Result EsUnwrapAesWrappedTitlekey(const void *aes_wrapped_titlekey, u32 key_generation, void *out_sealed_titlekey); + +Result EsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size); + +Result EsSecureExpMod(const void *input, const void *modulus, void *dst); + +Result EsUnwrapElicenseKey(const void *rsa_wrapped_elicense_key, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_elicense_key); + +Result EsLoadElicenseKey(const void *sealed_elicense_key, u32 keyslot); + +Result FsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version); + +Result FsSecureExpMod(const void *input, const void *modulus, void *dst); + +Result FsGenerateSpecificAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key); + +Result FsLoadTitlekey(const void *sealed_titlekey, u32 keyslot); + +Result FsGetPackage2Hash(void *out_hash); + +Result ManuEncryptRsaKeyForImport(const void *sealed_kek_pre, const void *wrapped_key_pre, const void *sealed_kek_post, const void *wrapped_kek_post, u32 option, const void *wrapped_rsa_key, void *out_wrapped_rsa_key, size_t rsa_key_size); + +} // namespace spl + +/// @brief C++ wrappers for the `spsm` API. +/// @details Wraps: switch/services/spsm.h. +namespace spsm { + +/// Initialize spsm. +Result Initialize(void); + +/// Exit spsm. +void Exit(void); + +/// Gets the Service object for the actual spsm service session. +Service* GetServiceSession(void); + +Result Shutdown(bool reboot); + +Result PutErrorState(void); + +} // namespace spsm + +/// @brief C++ wrappers for the `ssl` API. +/// @details Wraps: switch/services/ssl.h. +namespace ssl { + +/// AlpnProtoState +using ::SslAlpnProtoState; +/// BuiltInCertificateInfo +using ::SslBuiltInCertificateInfo; +/// CaCertificateId +using ::SslCaCertificateId; +/// CertificateFormat +using ::SslCertificateFormat; +/// CipherInfo +using ::SslCipherInfo; +/// SslConnection +using ::SslConnection; +/// SslContext +using ::SslContext; +/// ContextOption +using ::SslContextOption; +/// DebugOptionType +using ::SslDebugOptionType; +/// FlushSessionCacheOptionType +using ::SslFlushSessionCacheOptionType; +/// InternalPki +using ::SslInternalPki; +/// IoMode. The default value at the time of \ref sslContextCreateConnection is ::SslIoMode_Blocking. +/// The socket non-blocking flag is always set regardless of this field, this is only used internally for calculating the timeout used by various cmds. +using ::SslIoMode; +/// KeyAndCertParams +using ::SslKeyAndCertParams; +/// OptionType. The default bool flags value for these at the time of \ref sslContextCreateConnection is cleared. +using ::SslOptionType; +/// PollEvent +using ::SslPollEvent; +/// PrivateOptionType +using ::SslPrivateOptionType; +/// RenegotiationMode +using ::SslRenegotiationMode; +/// SslServerCertDetailEntry +using ::SslServerCertDetailEntry; +/// SslServerCertDetailHeader +using ::SslServerCertDetailHeader; +/// Values for __nx_ssl_service_type, controls which ssl service to initialize. +using ::SslServiceType; +/// SessionCacheMode +using ::SslSessionCacheMode; +/// TrustedCertStatus +using ::SslTrustedCertStatus; +/// VerifyOption. The default bitmask value at the time of \ref sslContextCreateConnection is ::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName. +/// [5.0.0+] \ref sslConnectionSetVerifyOption: (::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName) must be set, unless: ::SslOptionType_SkipDefaultVerify is set, or [9.0.0+] ::SslDebugOptionType_AllowDisableVerifyOption is set. +/// [6.0.0+] \ref sslConnectionSetVerifyOption: Following that, if ::SslVerifyOption_EvPolicyOid is set, then the following options must be set (besides the previously mentioned one): ::SslVerifyOption_PeerCa and ::SslVerifyOption_DateCheck. +using ::SslVerifyOption; +/// SslVersion. This is a bitmask which controls the min/max TLS versions to use, depending on which lowest/highest bits are set (if Auto* isn't set). +using ::SslVersion; + +/// Initialize ssl. A default value of 0x3 can be used for num_sessions. This must be 0x1-0x4. +Result Initialize(u32 num_sessions); + +/// Exit ssl. +void Exit(void); + +/// Gets the Service object for the actual ssl service session. +Service* GetServiceSession(void); + +/** + * @brief CreateContext + * @note The CertStore is used automatically, regardless of what cmds are used. + * @param[out] c \ref SslContext + * @param[in] ssl_version \ref SslVersion + */ +Result CreateContext(SslContext *c, u32 ssl_version); + +/** + * @brief GetContextCount + * @note Not used by official sw. + * @param[out] out Output value. + */ +Result GetContextCount(u32 *out); + +/** + * @brief GetCertificates + * @param[in] buffer Output buffer. The start of this buffer is an array of \ref SslBuiltInCertificateInfo, with the specified count. The cert data (SslBuiltInCertificateInfo::data) is located after this array. + * @param[in] size Output buffer size, this should be the size from \ref sslGetCertificateBufSize. + * @param[in] ca_cert_ids Input array of \ref SslCaCertificateId. + * @param[in] count Size of the ca_cert_ids array in entries. + * @param[out] total_out [3.0.0+] Total output entries. Will always match count on pre-3.0.0. This will differ from count when ::SslCaCertificateId_All is used. + */ +Result GetCertificates(void* buffer, u32 size, u32 *ca_cert_ids, u32 count, u32 *total_out); + +/** + * @brief GetCertificateBufSize + * @param[in] ca_cert_ids Input array of \ref SslCaCertificateId. + * @param[in] count Size of the ca_cert_ids array in entries. + * @param[out] out Output size. + */ +Result GetCertificateBufSize(u32 *ca_cert_ids, u32 count, u32 *out); + +/** + * @brief FlushSessionCache + * @note Only available on [5.0.0+]. + * @param[in] str Input string. Must be NULL with ::SslFlushSessionCacheOptionType_AllHosts. + * @param[in] str_bufsize String buffer size, excluding NUL-terminator. Hence, this should be actual_bufsize-1. This must be 0 with ::SslFlushSessionCacheOptionType_AllHosts. + * @param[in] type \ref SslFlushSessionCacheOptionType + * @param[out] out Output value. + */ +Result FlushSessionCache(const char *str, size_t str_bufsize, SslFlushSessionCacheOptionType type, u32 *out); + +/** + * @brief SetDebugOption + * @note Only available on [6.0.0+]. + * @note The official impl of this doesn't actually use the cmd. + * @param[in] buffer Input buffer, must not be NULL. The u8 from here is copied to state. + * @param[in] size Buffer size, must not be 0. + * @param[in] type \ref SslDebugOptionType + */ +Result SetDebugOption(const void* buffer, size_t size, SslDebugOptionType type); + +/** + * @brief GetDebugOption + * @note Only available on [6.0.0+]. + * @param[out] buffer Output buffer, must not be NULL. An u8 is written here loaded from state. + * @param[in] size Buffer size, must not be 0. + * @param[in] type \ref SslDebugOptionType + */ +Result GetDebugOption(void* buffer, size_t size, SslDebugOptionType type); + +/** + * @brief ClearTls12FallbackFlag + * @note Only available on [14.0.0+]. + */ +Result ClearTls12FallbackFlag(void); + +/** + * @brief SetThreadCoreMask + * @param[in] mask CoreMask + * @note Only available on [15.0.0+] with ::SslServiceType_System. + */ +Result SetThreadCoreMask(u64 mask); + +/** + * @brief GetThreadCoreMask + * @param[out] out Output CoreMask. + * @note Only available on [15.0.0+] with ::SslServiceType_System. + */ +Result GetThreadCoreMask(u64 *out); + +/** + * @brief Closes a Context object. + * @param c \ref SslContext + */ +void ContextClose(SslContext *c); + +/** + * @brief SetOption + * @note Prior to 4.x this is stubbed. + * @param c \ref SslContext + * @param[in] option \ref SslContextOption + * @param[in] value Value to set. With ::SslContextOption_CrlImportDateCheckEnable, this must be 0 or 1. + */ +Result ContextSetOption(SslContext *c, SslContextOption option, s32 value); + +/** + * @brief GetOption + * @note Prior to 4.x this is stubbed. + * @param c \ref SslContext + * @param[in] option \ref SslContextOption + * @param[out] out Output value. + */ +Result ContextGetOption(SslContext *c, SslContextOption option, s32 *out); + +/** + * @brief CreateConnection + * @param c \ref SslContext + * @param[out] conn Output \ref SslConnection. + */ +Result ContextCreateConnection(SslContext *c, SslConnection *conn); + +/** + * @brief GetConnectionCount + * @note Not exposed by official sw. + * @param c \ref SslContext + * @param[out] out Output value. + */ +Result ContextGetConnectionCount(SslContext *c, u32 *out); + +/** + * @brief ImportServerPki + * @note A maximum of 71 ServerPki objects (associated with the output Id) can be imported. + * @param c \ref SslContext + * @param[in] buffer Input buffer containing the cert data, must not be NULL. This can contain multiple certs. The certs can be CAs or server certs (no pubkeys). + * @param[in] size Input buffer size. + * @param[in] format \ref SslCertificateFormat + * @param[out] id Output Id. Optional, can be NULL. + */ +Result ContextImportServerPki(SslContext *c, const void* buffer, u32 size, SslCertificateFormat format, u64 *id); + +/** + * @brief ImportClientPki + * @note An error is thrown internally if this cmd or \ref sslContextRegisterInternalPki was already used previously. + * @param c \ref SslContext + * @param[in] pkcs12 PKCS#12 input buffer, must not be NULL. + * @param[in] pkcs12_size pkcs12 buffer size. + * @param[in] pw ASCII password string buffer, this can only be NULL if pw_size is 0. This will be internally copied to another buffer which was allocated with size=pw_size+1, for NUL-termination. + * @param[in] pw_size Password buffer size, this can only be 0 if pw is NULL. + * @param[out] id Output Id. Optional, can be NULL. + */ +Result ContextImportClientPki(SslContext *c, const void* pkcs12, u32 pkcs12_size, const char *pw, u32 pw_size, u64 *id); + +/** + * @brief Remove the specified *Pki, or on [3.0.0+] Crl. + * @param c \ref SslContext + * @param[in] id Id + */ +Result ContextRemovePki(SslContext *c, u64 id); + +/** + * @brief RegisterInternalPki + * @note An error is thrown internally if this cmd or \ref sslContextImportClientPki was already used previously. + * @param c \ref SslContext + * @param[in] internal_pki \ref SslInternalPki + * @param[out] id Output Id. Optional, can be NULL. + */ +Result ContextRegisterInternalPki(SslContext *c, SslInternalPki internal_pki, u64 *id); + +/** + * @brief AddPolicyOid + * @param c \ref SslContext + * @param[in] str Input string. + * @param[in] str_bufsize String buffer size, excluding NUL-terminator (must not match the string length). Hence, this should be actual_bufsize-1. This must not be >0xff. + */ +Result ContextAddPolicyOid(SslContext *c, const char *str, u32 str_bufsize); + +/** + * @brief ImportCrl + * @note Only available on [3.0.0+]. + * @param c \ref SslContext + * @param[in] buffer Input buffer, must not be NULL. This contains the DER CRL. + * @param[in] size Input buffer size. + * @param[out] id Output Id. Optional, can be NULL. + */ +Result ContextImportCrl(SslContext *c, const void* buffer, u32 size, u64 *id); + +/** + * @brief ImportClientCertKeyPki + * @note Only available on [16.0.0+]. + * @param c \ref SslContext + * @param[in] cert Input cert buffer, + * @param[in] cert_size Size of the cert buffer. + * @param[in] key Input key buffer. + * @param[in] key_size Size of the key buffer. + * @param[in] format \ref SslCertificateFormat for the cert and key. + * @param[out] id Output Id. Optional, can be NULL. + */ +Result ContextImportClientCertKeyPki(SslContext *c, const void* cert, u32 cert_size, const void* key, u32 key_size, SslCertificateFormat format, u64 *id); + +/** + * @brief GeneratePrivateKeyAndCert + * @note Only available on [16.0.0+]. + * @param c \ref SslContext + * @param[out] cert Output cert buffer, + * @param[in] cert_size Size of the cert buffer. + * @param[out] key Output key buffer. + * @param[in] key_size Size of the key buffer. + * @param[in] val Must be value 1. + * @param[in] params \ref SslKeyAndCertParams + * @param[out] out_certsize Actual size of the generated cert data. + * @param[out] out_keysize Actual size of the generated key data. + */ +Result ContextGeneratePrivateKeyAndCert(SslContext *c, void* cert, u32 cert_size, void* key, u32 key_size, u32 val, const SslKeyAndCertParams *params, u32 *out_certsize, u32 *out_keysize); + +/** + * @brief CreateConnectionForSystem + * @note Only available on [15.0.0+] with ::SslServiceType_System. + * @param c \ref SslContext + * @param[out] conn Output \ref SslConnection. + */ +Result ContextCreateConnectionForSystem(SslContext *c, SslConnection *conn); + +/** + * @brief Closes a Connection object. + * @param c \ref SslConnection + */ +void ConnectionClose(SslConnection *c); + +/** + * @brief SetSocketDescriptor. Do not use directly, use \ref socketSslConnectionSetSocketDescriptor instead. + * @note An error is thrown if this was used previously. + * @param c \ref SslConnection + * @param[in] sockfd sockfd + * @param[out] out_sockfd sockfd. Prior to using \ref sslConnectionClose, this must be closed if it's not negative (it will be -1 if ::SslOptionType_DoNotCloseSocket is set). + */ +Result ConnectionSetSocketDescriptor(SslConnection *c, int sockfd, int *out_sockfd); + +/** + * @brief SetHostName + * @param c \ref SslConnection + * @param[in] str Input string. + * @param[in] str_bufsize String buffer size. This must not be >0xff. + */ +Result ConnectionSetHostName(SslConnection *c, const char* str, u32 str_bufsize); + +/** + * @brief SetVerifyOption + * @param c \ref SslConnection + * @param[in] verify_option Input bitmask of \ref SslVerifyOption. + */ +Result ConnectionSetVerifyOption(SslConnection *c, u32 verify_option); + +/** + * @brief SetIoMode + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[in] mode \ref SslIoMode + */ +Result ConnectionSetIoMode(SslConnection *c, SslIoMode mode); + +/** + * @brief GetSocketDescriptor. Do not use directly, use \ref socketSslConnectionGetSocketDescriptor instead. + * @note This gets the input sockfd which was previously saved in state by \ref sslConnectionSetSocketDescriptor. + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] sockfd Output sockfd. + */ +Result ConnectionGetSocketDescriptor(SslConnection *c, int *sockfd); + +/** + * @brief GetHostName + * @param c \ref SslConnection + * @param[out] str Output string buffer. + * @param[in] str_bufsize String buffer size, must be large enough for the entire output string. + * @param[out] out Output string length. + */ +Result ConnectionGetHostName(SslConnection *c, char *str, u32 str_bufsize, u32 *out); + +/** + * @brief GetVerifyOption + * @param c \ref SslConnection + * @param[out] out Output bitmask of \ref SslVerifyOption. + */ +Result ConnectionGetVerifyOption(SslConnection *c, u32 *out); + +/** + * @brief GetIoMode + * @param c \ref SslConnection + * @param[out] out \ref SslIoMode + */ +Result ConnectionGetIoMode(SslConnection *c, SslIoMode *out); + +/** + * @brief DoHandshake + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @note \ref sslConnectionSetHostName must have been used previously with a non-empty string when ::SslVerifyOption_HostName is set. + * @note The DoHandshakeGetServerCert cmd is only used if both server_certbuf/server_certbuf_size are set, otherwise the DoHandshake cmd is used (in which case out_size/total_certs will be left at value 0). + * @note No certs are returned when ::SslVerifyOption_PeerCa is not set. + * @param c \ref SslConnection + * @param[out] out_size Total data size which was written to server_certbuf. Optional, can be NULL. + * @param[out] total_certs Total certs which were written to server_certbuf, can be NULL. + * @param[out] server_certbuf Optional output server cert buffer, can be NULL. Normally this just contains the server cert DER, however with ::SslOptionType_GetServerCertChain set this will contain the full chain (\ref sslConnectionGetServerCertDetail can be used to parse that). With ::SslIoMode_NonBlocking this buffer will be only filled in once - when this cmd returns successfully the buffer will generally be empty. + * @param[in] server_certbuf_size Optional output server cert buffer size, can be 0. + */ +Result ConnectionDoHandshake(SslConnection *c, u32 *out_size, u32 *total_certs, void* server_certbuf, u32 server_certbuf_size); + +/** + * @brief Parses the output server_certbuf from \ref sslConnectionDoHandshake where ::SslOptionType_GetServerCertChain is set. + * @param[in] certbuf server_certbuf from \ref sslConnectionDoHandshake, must not be NULL. + * @param[in] certbuf_size out_size from \ref sslConnectionDoHandshake. + * @param[in] cert_index Cert index, must be within the range of certs stored in certbuf. + * @param[out] cert Ptr for the ouput DER cert, must not be NULL. + * @param[out] cert_size Size for the ouput cert, must not be NULL. + */ +Result ConnectionGetServerCertDetail(const void* certbuf, u32 certbuf_size, u32 cert_index, void** cert, u32 *cert_size); + +/** + * @brief Read + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] buffer Output buffer, must not be NULL. + * @param[in] size Output buffer size, must not be 0. + * @param[out] out_size Actual transferred size. + */ +Result ConnectionRead(SslConnection *c, void* buffer, u32 size, u32 *out_size); + +/** + * @brief Write + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[in] buffer Input buffer, must not be NULL. + * @param[in] size Input buffer size, must not be 0. + * @param[out] out_size Actual transferred size. + */ +Result ConnectionWrite(SslConnection *c, const void* buffer, u32 size, u32 *out_size); + +/** + * @brief Pending + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] out Output value. + */ +Result ConnectionPending(SslConnection *c, s32 *out); + +/** + * @brief Peek + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] buffer Output buffer, must not be NULL. + * @param[in] size Output buffer size, must not be 0. + * @param[out] out_size Output size. + */ +Result ConnectionPeek(SslConnection *c, void* buffer, u32 size, u32 *out_size); + +/** + * @brief Poll + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[in] in_pollevent Input bitmask of \ref SslPollEvent. + * @param[out] out_pollevent Output bitmask of \ref SslPollEvent. + * @param[in] timeout Timeout in milliseconds. + */ +Result ConnectionPoll(SslConnection *c, u32 in_pollevent, u32 *out_pollevent, u32 timeout); + +/** + * @brief GetVerifyCertError + * @note The value in state is cleared after loading it. + * @param c \ref SslConnection + */ +Result ConnectionGetVerifyCertError(SslConnection *c); + +/** + * @brief GetNeededServerCertBufferSize + * @param c \ref SslConnection + * @param[out] out Output value. + */ +Result ConnectionGetNeededServerCertBufferSize(SslConnection *c, u32 *out); + +/** + * @brief SetSessionCacheMode + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[in] mode \ref SslSessionCacheMode + */ +Result ConnectionSetSessionCacheMode(SslConnection *c, SslSessionCacheMode mode); + +/** + * @brief GetSessionCacheMode + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] out \ref SslSessionCacheMode + */ +Result ConnectionGetSessionCacheMode(SslConnection *c, SslSessionCacheMode *out); + +/** + * @brief GetSessionCacheMode + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + */ +Result ConnectionFlushSessionCache(SslConnection *c); + +/** + * @brief SetRenegotiationMode + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[in] mode \ref SslRenegotiationMode + */ +Result ConnectionSetRenegotiationMode(SslConnection *c, SslRenegotiationMode mode); + +/** + * @brief GetRenegotiationMode + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] out \ref SslRenegotiationMode + */ +Result ConnectionGetRenegotiationMode(SslConnection *c, SslRenegotiationMode *out); + +/** + * @brief SetOption + * @param c \ref SslConnection + * @param[in] option \ref SslOptionType + * @param[in] flag Input flag value. + */ +Result ConnectionSetOption(SslConnection *c, SslOptionType option, bool flag); + +/** + * @brief GetOption + * @param c \ref SslConnection + * @param[in] option \ref SslOptionType + * @param[out] out Output flag value. + */ +Result ConnectionGetOption(SslConnection *c, SslOptionType option, bool *out); + +/** + * @brief GetVerifyCertErrors + * @note An error is thrown when the cmd is successful, if the two output u32s match. + * @param[out] out0 First output value, must not be NULL. + * @param[out] out1 Second output value. + * @param[out] errors Output array of Result, must not be NULL. + * @param[in] count Size of the errors array in entries. + */ +Result ConnectionGetVerifyCertErrors(SslConnection *c, u32 *out0, u32 *out1, Result *errors, u32 count); + +/** + * @brief GetCipherInfo + * @note Only available on [4.0.0+]. + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @param c \ref SslConnection + * @param[out] out \ref SslCipherInfo + */ +Result ConnectionGetCipherInfo(SslConnection *c, SslCipherInfo *out); + +/** + * @brief SetNextAlpnProto + * @note Only available on [9.0.0+]. + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @note ::SslOptionType_EnableAlpn should be set at the time of using \ref sslConnectionDoHandshake, otherwise using this cmd will have no affect. + * @param c \ref SslConnection + * @param[in] buffer Input buffer, must not be NULL. This contains an array of {u8 size, {data with the specified size}}, which must be within the buffer-size bounds. + * @param[in] size Input buffer size, must not be 0. Must be at least 0x2. + */ +Result ConnectionSetNextAlpnProto(SslConnection *c, const u8 *buffer, u32 size); + +/** + * @brief GetNextAlpnProto + * @note Only available on [9.0.0+]. + * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. + * @note The output will be all-zero/empty if not available - such as when this was used before \ref sslConnectionDoHandshake. + * @param c \ref SslConnection + * @param[out] state \ref SslAlpnProtoState + * @param[out] out Output string length. + * @param[out] buffer Output string buffer, must not be NULL. + * @param[in] size Output buffer size, must not be 0. + */ +Result ConnectionGetNextAlpnProto(SslConnection *c, SslAlpnProtoState *state, u32 *out, u8 *buffer, u32 size); + +/** + * @brief SetDtlsSocketDescriptor. Do not use directly, use \ref socketSslConnectionSetDtlsSocketDescriptor instead. + * @note Only available on [16.0.0+]. + * @note An error is thrown if this was used previously. + * @param c \ref SslConnection + * @param[in] sockfd sockfd + * @param[in] Input sockaddr. + * @param[in] size Input sockaddr size. + * @param[out] out_sockfd sockfd. Prior to using \ref sslConnectionClose, this must be closed if it's not negative (it will be -1 if ::SslOptionType_DoNotCloseSocket is set). + */ +Result ConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const void* buf, size_t size, int *out_sockfd); + +/** + * @brief GetDtlsHandshakeTimeout + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[out] out Output nanoseconds value. + */ +Result ConnectionGetDtlsHandshakeTimeout(SslConnection *c, u64 *out); + +/** + * @brief SetPrivateOption + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[in] option \ref SslPrivateOptionType + * @param[in] value Input value. + */ +Result ConnectionSetPrivateOption(SslConnection *c, SslPrivateOptionType option, u32 value); + +/** + * @brief SetSrtpCiphers + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[in] ciphers Input array of u16s. Each entry must be value 1-2, otherwise the entry is ignored. + * @param[in] count Total entries in the ciphers array, the maximum is 4. + */ +Result ConnectionSetSrtpCiphers(SslConnection *c, const u16 *ciphers, u32 count); + +/** + * @brief GetSrtpCipher + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[out] out Output value. + */ +Result ConnectionGetSrtpCipher(SslConnection *c, u16 *out); + +/** + * @brief ExportKeyingMaterial + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[out] outbuf Output buffer. + * @param[in] outbuf_size Output buffer size. + * @param[in] label Input label string. + * @param[in] label_size Size of the label buffer excluding NUL-terminator. + * @param[in] context Optional input context buffer, can be NULL. + * @param[in] context_size Size of context, if specified this must be <0xFFFF. + */ +Result ConnectionExportKeyingMaterial(SslConnection *c, u8 *outbuf, u32 outbuf_size, const char *label, u32 label_size, const void* context, u32 context_size); + +/** + * @brief SetIoTimeout + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[in] timeout Input timeout value. + */ +Result ConnectionSetIoTimeout(SslConnection *c, u32 timeout); + +/** + * @brief GetIoTimeout + * @note Only available on [16.0.0+]. + * @param c \ref SslConnection + * @param[out] out Output timeout value. + */ +Result ConnectionGetIoTimeout(SslConnection *c, u32 *out); + +} // namespace ssl + +/// @brief C++ wrappers for the `svc` API. +/// @details Wraps: switch/kernel/svc.h. +namespace svc { + +/// WaitForAddress behaviors. +using ::ArbitrationType; +/// Break point types +using ::BreakPointType; +/// Break reasons +using ::BreakReason; +/// Code memory mapping operations +using ::CodeMapOperation; +/// Address space types for CreateProcessFlags +using ::CreateProcessFlagAddressSpace; +/// Flags for svcCreateProcess and CreateProcess event +using ::CreateProcessFlags; +/// DebugEvent flags +using ::DebugEventFlag; +/// DebugEvent structure +using ::DebugEventInfo; +/// DebugEvent types +using ::DebugEventType; +/// Debug exception types +using ::DebugException; +/// Debug Thread Parameters. +using ::DebugThreadParam; +/// GetInfo IDs. +using ::InfoType; +/// GetInfo InitialProcessIdRange Sub IDs. +using ::InitialProcessIdRangeInfo; +/// Io Pools. +using ::IoPoolType; +/// Context of a scheduled thread. +using ::LastThreadContext; +/// Limitable Resources. +using ::LimitableResource; +/// Memory attribute bitmasks. +using ::MemoryAttribute; +/// Memory information structure. +using ::MemoryInfo; +/// Memory mapping type. +using ::MemoryMapping; +/// Memory regions +using ::MemoryRegion; +/// Memory state bitmasks. +using ::MemoryState; +/// Memory type enumeration (lower 8 bits of \ref MemoryState) +using ::MemoryType; +/// Memory permission bitmasks. +using ::Permission; +/// Physical memory information structure. +using ::PhysicalMemoryInfo; +/// GetSystemInfo PhysicalMemory Sub IDs. +using ::PhysicalMemorySystemInfo; +/// Process Activity. +using ::ProcessActivity; +/// Process exit reasons +using ::ProcessExitReason; +/// Process Information. +using ::ProcessInfoType; +/// Process States. +using ::ProcessState; +/// Secure monitor arguments. +using ::SecmonArgs; +/// SignalToAddress behaviors. +using ::SignalType; +/// GetSystemInfo IDs. +using ::SystemInfoType; +/// Thread Activity. +using ::ThreadActivity; +/// Thread exit reasons +using ::ThreadExitReason; +/// GetInfo Idle/Thread Tick Count Sub IDs. +using ::TickCountInfo; +/// SleepThread yield types. +using ::YieldType; + +/** + * @brief Set the process heap to a given size. It can both extend and shrink the heap. + * @param[out] out_addr Variable to which write the address of the heap (which is randomized and fixed by the kernel) + * @param[in] size Size of the heap, must be a multiple of 0x200000. + * @return Result code. + * @note Syscall number 0x01. + */ +Result SetHeapSize(void** out_addr, u64 size); + +/** + * @brief Set the memory permissions of a (page-aligned) range of memory. + * @param[in] addr Start address of the range. + * @param[in] size Size of the range, in bytes. + * @param[in] perm Permissions (see \ref Permission). + * @return Result code. + * @remark Perm_X is not allowed. Setting write-only is not allowed either (Perm_W). + * This can be used to move back and forth between Perm_None, Perm_R and Perm_Rw. + * @note Syscall number 0x02. + */ +Result SetMemoryPermission(void* addr, u64 size, u32 perm); + +/** + * @brief Set the memory attributes of a (page-aligned) range of memory. + * @param[in] addr Start address of the range. + * @param[in] size Size of the range, in bytes. + * @param[in] val0 State0 + * @param[in] val1 State1 + * @return Result code. + * @remark See
    switchbrew.org Wiki for more details. + * @note Syscall number 0x03. + */ +Result SetMemoryAttribute(void* addr, u64 size, u32 val0, u32 val1); + +/** + * @brief Maps a memory range into a different range. Mainly used for adding guard pages around stack. + * Source range gets reprotected to Perm_None (it can no longer be accessed), and \ref MemAttr_IsBorrowed is set in the source \ref MemoryAttribute. + * @param[in] dst_addr Destination address. + * @param[in] src_addr Source address. + * @param[in] size Size of the range. + * @return Result code. + * @note Syscall number 0x04. + */ +Result MapMemory(void* dst_addr, void* src_addr, u64 size); + +/** + * @brief Unmaps a region that was previously mapped with \ref svcMapMemory. + * @param[in] dst_addr Destination address. + * @param[in] src_addr Source address. + * @param[in] size Size of the range. + * @return Result code. + * @note Syscall number 0x05. + */ +Result UnmapMemory(void* dst_addr, void* src_addr, u64 size); + +/** + * @brief Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address. + * @param[out] meminfo_ptr \ref MemoryInfo structure which will be filled in. + * @param[out] pageinfo Page information which will be filled in. + * @param[in] addr Address to query. + * @return Result code. + * @note Syscall number 0x06. + */ +Result QueryMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, u64 addr); + +/** + * @brief Exits the current process. + * @note Syscall number 0x07. + */ +[[noreturn]] void ExitProcess(void); + +/** + * @brief Creates a thread. + * @return Result code. + * @note Syscall number 0x08. + */ +Result CreateThread(Handle* out, void* entry, void* arg, void* stack_top, int prio, int cpuid); + +/** + * @brief Starts a freshly created thread. + * @return Result code. + * @note Syscall number 0x09. + */ +Result StartThread(Handle handle); + +/** + * @brief Exits the current thread. + * @note Syscall number 0x0A. + */ +[[noreturn]] void ExitThread(void); + +/** + * @brief Sleeps the current thread for the specified amount of time. + * @param[in] nano Number of nanoseconds to sleep, or \ref YieldType for yield. + * @note Syscall number 0x0B. + */ +void SleepThread(s64 nano); + +/** + * @brief Gets a thread's priority. + * @return Result code. + * @note Syscall number 0x0C. + */ +Result GetThreadPriority(s32* priority, Handle handle); + +/** + * @brief Sets a thread's priority. + * @return Result code. + * @note Syscall number 0x0D. + */ +Result SetThreadPriority(Handle handle, u32 priority); + +/** + * @brief Gets a thread's core mask. + * @return Result code. + * @note Syscall number 0x0E. + */ +Result GetThreadCoreMask(s32* preferred_core, u64* affinity_mask, Handle handle); + +/** + * @brief Sets a thread's core mask. + * @return Result code. + * @note Syscall number 0x0F. + */ +Result SetThreadCoreMask(Handle handle, s32 preferred_core, u32 affinity_mask); + +/** + * @brief Gets the current processor's number. + * @return The current processor's number. + * @note Syscall number 0x10. + */ +u32 GetCurrentProcessorNumber(void); + +/** + * @brief Sets an event's signalled status. + * @return Result code. + * @note Syscall number 0x11. + */ +Result SignalEvent(Handle handle); + +/** + * @brief Clears an event's signalled status. + * @return Result code. + * @note Syscall number 0x12. + */ +Result ClearEvent(Handle handle); + +/** + * @brief Maps a block of shared memory. + * @return Result code. + * @note Syscall number 0x13. + */ +Result MapSharedMemory(Handle handle, void* addr, size_t size, u32 perm); + +/** + * @brief Unmaps a block of shared memory. + * @return Result code. + * @note Syscall number 0x14. + */ +Result UnmapSharedMemory(Handle handle, void* addr, size_t size); + +/** + * @brief Creates a block of transfer memory. + * @return Result code. + * @note Syscall number 0x15. + */ +Result CreateTransferMemory(Handle* out, void* addr, size_t size, u32 perm); + +/** + * @brief Closes a handle, decrementing the reference count of the corresponding kernel object. + * This might result in the kernel freeing the object. + * @param handle Handle to close. + * @return Result code. + * @note Syscall number 0x16. + */ +Result CloseHandle(Handle handle); + +/** + * @brief Resets a signal. + * @return Result code. + * @note Syscall number 0x17. + */ +Result ResetSignal(Handle handle); + +/** + * @brief Waits on one or more synchronization objects, optionally with a timeout. + * @return Result code. + * @note Syscall number 0x18. + * @note \p handleCount must not be greater than \ref MAX_WAIT_OBJECTS. This is a Horizon kernel limitation. + * @note This is the raw syscall, which can be cancelled by \ref svcCancelSynchronization or other means. \ref waitHandles or \ref waitMultiHandle should normally be used instead. + */ +Result WaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout); + +/** + * @brief Waits on a single synchronization object, optionally with a timeout. + * @return Result code. + * @note Wrapper for \ref svcWaitSynchronization. + * @note This is the raw syscall, which can be cancelled by \ref svcCancelSynchronization or other means. \ref waitSingleHandle should normally be used instead. + */ +Result WaitSynchronizationSingle(Handle handle, u64 timeout); + +/** + * @brief Waits a \ref svcWaitSynchronization operation being done on a synchronization object in another thread. + * @return Result code. + * @note Syscall number 0x19. + */ +Result CancelSynchronization(Handle thread); + +/** + * @brief Arbitrates a mutex lock operation in userspace. + * @return Result code. + * @note Syscall number 0x1A. + */ +Result ArbitrateLock(u32 wait_tag, u32* tag_location, u32 self_tag); + +/** + * @brief Arbitrates a mutex unlock operation in userspace. + * @return Result code. + * @note Syscall number 0x1B. + */ +Result ArbitrateUnlock(u32* tag_location); + +/** + * @brief Performs a condition variable wait operation in userspace. + * @return Result code. + * @note Syscall number 0x1C. + */ +Result WaitProcessWideKeyAtomic(u32* key, u32* tag_location, u32 self_tag, u64 timeout); + +/** + * @brief Performs a condition variable wake-up operation in userspace. + * @note Syscall number 0x1D. + */ +void SignalProcessWideKey(u32* key, s32 num); + +/** + * @brief Gets the current system tick. + * @return The current system tick. + * @note Syscall number 0x1E. + */ +u64 GetSystemTick(void); + +/** + * @brief Connects to a registered named port. + * @return Result code. + * @note Syscall number 0x1F. + */ +Result ConnectToNamedPort(Handle* session, const char* name); + +/** + * @brief Sends a light IPC synchronization request to a session. + * @return Result code. + * @note Syscall number 0x20. + */ +Result SendSyncRequestLight(Handle session); + +/** + * @brief Sends an IPC synchronization request to a session. + * @return Result code. + * @note Syscall number 0x21. + */ +Result SendSyncRequest(Handle session); + +/** + * @brief Sends an IPC synchronization request to a session from an user allocated buffer. + * @return Result code. + * @remark size must be allocated to 0x1000 bytes. + * @note Syscall number 0x22. + */ +Result SendSyncRequestWithUserBuffer(void* usrBuffer, u64 size, Handle session); + +/** + * @brief Sends an IPC synchronization request to a session from an user allocated buffer (asynchronous version). + * @return Result code. + * @remark size must be allocated to 0x1000 bytes. + * @note Syscall number 0x23. + */ +Result SendAsyncRequestWithUserBuffer(Handle* handle, void* usrBuffer, u64 size, Handle session); + +/** + * @brief Gets the PID associated with a process. + * @return Result code. + * @note Syscall number 0x24. + */ +Result GetProcessId(u64 *processID, Handle handle); + +/** + * @brief Gets the TID associated with a process. + * @return Result code. + * @note Syscall number 0x25. + */ +Result GetThreadId(u64 *threadID, Handle handle); + +/** + * @brief Breaks execution. + * @param[in] breakReason Break reason (see \ref BreakReason). + * @param[in] address Address of the buffer to pass to the debugger. + * @param[in] size Size of the buffer to pass to the debugger. + * @return Result code. + * @note Syscall number 0x26. + */ +Result Break(u32 breakReason, uintptr_t address, uintptr_t size); + +/** + * @brief Outputs debug text, if used during debugging. + * @param[in] str Text to output. + * @param[in] size Size of the text in bytes. + * @return Result code. + * @note Syscall number 0x27. + */ +Result OutputDebugString(const char *str, u64 size); + +/** + * @brief Returns from an exception. + * @param[in] res Result code. + * @note Syscall number 0x28. + */ +[[noreturn]] void ReturnFromException(Result res); + +/** + * @brief Retrieves information about the system, or a certain kernel object. + * @param[out] out Variable to which store the information. + * @param[in] id0 First ID of the property to retrieve. + * @param[in] handle Handle of the object to retrieve information from, or \ref INVALID_HANDLE to retrieve information about the system. + * @param[in] id1 Second ID of the property to retrieve. + * @return Result code. + * @remark The full list of property IDs can be found on the switchbrew.org wiki. + * @note Syscall number 0x29. + */ +Result GetInfo(u64* out, u32 id0, Handle handle, u64 id1); + +/** + * @brief Flushes the entire data cache (by set/way). + * @note Syscall number 0x2A. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + * @warning This syscall is dangerous, and should not be used. + */ +void FlushEntireDataCache(void); + +/** + * @brief Flushes data cache for a virtual address range. + * @param[in] address Address of region to flush. + * @param[in] size Size of region to flush. + * @remark armDCacheFlush should be used instead of this syscall whenever possible. + * @note Syscall number 0x2B. + */ +Result FlushDataCache(void *address, size_t size); + +/** + * @brief Maps new heap memory at the desired address. [3.0.0+] + * @return Result code. + * @note Syscall number 0x2C. + */ +Result MapPhysicalMemory(void *address, u64 size); + +/** + * @brief Undoes the effects of \ref svcMapPhysicalMemory. [3.0.0+] + * @return Result code. + * @note Syscall number 0x2D. + */ +Result UnmapPhysicalMemory(void *address, u64 size); + +/** + * @brief Gets information about a thread that will be scheduled in the future. [5.0.0+] + * @param[out] out_context Output \ref LastThreadContext for the thread that will be scheduled. + * @param[out] out_thread_id Output thread id for the thread that will be scheduled. + * @param[in] debug Debug handle. + * @param[in] ns Nanoseconds in the future to get scheduled thread at. + * @return Result code. + * @note Syscall number 0x2E. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetDebugFutureThreadInfo(LastThreadContext *out_context, u64 *out_thread_id, Handle debug, s64 ns); + +/** + * @brief Gets information about the previously-scheduled thread. + * @param[out] out_context Output \ref LastThreadContext for the previously scheduled thread. + * @param[out] out_tls_address Output tls address for the previously scheduled thread. + * @param[out] out_flags Output flags for the previously scheduled thread. + * @return Result code. + * @note Syscall number 0x2F. + */ +Result GetLastThreadInfo(LastThreadContext *out_context, u64 *out_tls_address, u32 *out_flags); + +/** + * @brief Gets the maximum value a LimitableResource can have, for a Resource Limit handle. + * @return Result code. + * @note Syscall number 0x30. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetResourceLimitLimitValue(s64 *out, Handle reslimit_h, LimitableResource which); + +/** + * @brief Gets the maximum value a LimitableResource can have, for a Resource Limit handle. + * @return Result code. + * @note Syscall number 0x31. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetResourceLimitCurrentValue(s64 *out, Handle reslimit_h, LimitableResource which); + +/** + * @brief Configures the pause/unpause status of a thread. + * @return Result code. + * @note Syscall number 0x32. + */ +Result SetThreadActivity(Handle thread, ThreadActivity paused); + +/** + * @brief Dumps the registers of a thread paused by @ref svcSetThreadActivity (register groups: all). + * @param[out] ctx Output thread context (register dump). + * @param[in] thread Thread handle. + * @return Result code. + * @note Syscall number 0x33. + * @warning Official kernel will not dump x0..x18 if the thread is currently executing a system call, and prior to 6.0.0 doesn't dump TPIDR_EL0. + */ +Result GetThreadContext3(ThreadContext* ctx, Handle thread); + +/** + * @brief Arbitrates an address depending on type and value. [4.0.0+] + * @param[in] address Address to arbitrate. + * @param[in] arb_type \ref ArbitrationType to use. + * @param[in] value Value to arbitrate on. + * @param[in] timeout Maximum time in nanoseconds to wait. + * @return Result code. + * @note Syscall number 0x34. + */ +Result WaitForAddress(void *address, u32 arb_type, s64 value, s64 timeout); + +/** + * @brief Signals (and updates) an address depending on type and value. [4.0.0+] + * @param[in] address Address to arbitrate. + * @param[in] signal_type \ref SignalType to use. + * @param[in] value Value to arbitrate on. + * @param[in] count Number of waiting threads to signal. + * @return Result code. + * @note Syscall number 0x35. + */ +Result SignalToAddress(void *address, u32 signal_type, s32 value, s32 count); + +/** + * @brief Sets thread preemption state (used during abort/panic). [8.0.0+] + * @note Syscall number 0x36. + */ +void SynchronizePreemptionState(void); + +/** + * @brief Gets the peak value a LimitableResource has had, for a Resource Limit handle. [11.0.0+] + * @return Result code. + * @note Syscall number 0x37. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetResourceLimitPeakValue(s64 *out, Handle reslimit_h, LimitableResource which); + +/** + * @brief Creates an IO Pool. [13.0.0+] + * @return Result code. + * @note Syscall number 0x39. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateIoPool(Handle *out_handle, u32 pool_type); + +/** + * @brief Creates an IO Region. [13.0.0+] + * @return Result code. + * @note Syscall number 0x3A. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateIoRegion(Handle *out_handle, Handle io_pool_h, u64 physical_address, u64 size, u32 memory_mapping, u32 perm); + +/** + * @brief Causes the kernel to dump debug information. [1.0.0-3.0.2] + * @param[in] dump_info_type Type of information to dump. + * @param[in] arg0 Argument to the debugging operation. + * @note Syscall number 0x3C. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +void DumpInfo(u32 dump_info_type, u64 arg0); + +/** + * @brief Performs a debugging operation on the kernel. [4.0.0+] + * @param[in] kern_debug_type Type of debugging operation to perform. + * @param[in] arg0 First argument to the debugging operation. + * @param[in] arg1 Second argument to the debugging operation. + * @param[in] arg2 Third argument to the debugging operation. + * @note Syscall number 0x3C. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +void KernelDebug(u32 kern_debug_type, u64 arg0, u64 arg1, u64 arg2); + +/** + * @brief Performs a debugging operation on the kernel. [4.0.0+] + * @param[in] kern_trace_state Type of tracing the kernel should perform. + * @note Syscall number 0x3D. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +void ChangeKernelTraceState(u32 kern_trace_state); + +/** + * @brief Creates an IPC session. + * @return Result code. + * @note Syscall number 0x40. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateSession(Handle *server_handle, Handle *client_handle, u32 unk0, u64 unk1); + +/** + * @brief Accepts an IPC session. + * @return Result code. + * @note Syscall number 0x41. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result AcceptSession(Handle *session_handle, Handle port_handle); + +/** + * @brief Performs light IPC input/output. + * @return Result code. + * @param[in] handle Server or port handle to act on. + * @note Syscall number 0x42. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ReplyAndReceiveLight(Handle handle); + +/** + * @brief Performs IPC input/output. + * @return Result code. + * @note Syscall number 0x43. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); + +/** + * @brief Performs IPC input/output from an user allocated buffer. + * @return Result code. + * @note Syscall number 0x44. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ReplyAndReceiveWithUserBuffer(s32* index, void* usrBuffer, u64 size, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); + +/** + * @brief Creates a system event. + * @return Result code. + * @note Syscall number 0x45. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateEvent(Handle* server_handle, Handle* client_handle); + +/** + * @brief Maps an IO Region. [13.0.0+] + * @return Result code. + * @note Syscall number 0x46. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapIoRegion(Handle io_region_h, void *address, u64 size, u32 perm); + +/** + * @brief Undoes the effects of \ref svcMapIoRegion. [13.0.0+] + * @return Result code. + * @note Syscall number 0x47. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result UnmapIoRegion(Handle io_region_h, void *address, u64 size); + +/** + * @brief Maps unsafe memory (usable for GPU DMA) for a system module at the desired address. [5.0.0+] + * @return Result code. + * @note Syscall number 0x48. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapPhysicalMemoryUnsafe(void *address, u64 size); + +/** + * @brief Undoes the effects of \ref svcMapPhysicalMemoryUnsafe. [5.0.0+] + * @return Result code. + * @note Syscall number 0x49. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result UnmapPhysicalMemoryUnsafe(void *address, u64 size); + +/** + * @brief Sets the system-wide limit for unsafe memory mappable using \ref svcMapPhysicalMemoryUnsafe. [5.0.0+] + * @return Result code. + * @note Syscall number 0x4A. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result SetUnsafeLimit(u64 size); + +/** + * @brief Creates code memory in the caller's address space [4.0.0+]. + * @return Result code. + * @note Syscall number 0x4B. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateCodeMemory(Handle* code_handle, void* src_addr, u64 size); + +/** + * @brief Maps code memory in the caller's address space [4.0.0+]. + * @return Result code. + * @note Syscall number 0x4C. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ControlCodeMemory(Handle code_handle, CodeMapOperation op, void* dst_addr, u64 size, u64 perm); + +/** + * @brief Causes the system to enter deep sleep. + * @note Syscall number 0x4D. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +void SleepSystem(void); + +/** + * @brief Reads/writes a protected MMIO register. + * @return Result code. + * @note Syscall number 0x4E. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ReadWriteRegister(u32* outVal, u64 regAddr, u32 rwMask, u32 inVal); + +/** + * @brief Configures the pause/unpause status of a process. + * @return Result code. + * @note Syscall number 0x4F. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result SetProcessActivity(Handle process, ProcessActivity paused); + +/** + * @brief Creates a block of shared memory. + * @return Result code. + * @note Syscall number 0x50. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateSharedMemory(Handle* out, size_t size, u32 local_perm, u32 other_perm); + +/** + * @brief Maps a block of transfer memory. + * @return Result code. + * @note Syscall number 0x51. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapTransferMemory(Handle tmem_handle, void* addr, size_t size, u32 perm); + +/** + * @brief Unmaps a block of transfer memory. + * @return Result code. + * @note Syscall number 0x52. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result UnmapTransferMemory(Handle tmem_handle, void* addr, size_t size); + +/** + * @brief Creates an event and binds it to a specific hardware interrupt. + * @return Result code. + * @note Syscall number 0x53. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateInterruptEvent(Handle* handle, u64 irqNum, u32 flag); + +/** + * @brief Queries information about a certain virtual address, including its physical address. + * @return Result code. + * @note Syscall number 0x54. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result QueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr); + +/** + * @brief Returns a virtual address mapped to a given IO range. + * @return Result code. + * @note Syscall number 0x55. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + * @warning Only exists on [10.0.0+]. For older versions use \ref svcLegacyQueryIoMapping. + */ +Result QueryMemoryMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size); + +/** + * @brief Returns a virtual address mapped to a given IO range. + * @return Result code. + * @note Syscall number 0x55. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + * @warning Only exists on [1.0.0-9.2.0]. For newer versions use \ref svcQueryMemoryMapping. + */ +Result LegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size); + +/** + * @brief Creates a virtual address space for binding device address spaces. + * @return Result code. + * @note Syscall number 0x56. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateDeviceAddressSpace(Handle *handle, u64 dev_addr, u64 dev_size); + +/** + * @brief Attaches a device address space to a device. + * @return Result code. + * @note Syscall number 0x57. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result AttachDeviceAddressSpace(u64 device, Handle handle); + +/** + * @brief Detaches a device address space from a device. + * @return Result code. + * @note Syscall number 0x58. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result DetachDeviceAddressSpace(u64 device, Handle handle); + +/** + * @brief Maps an attached device address space to an userspace address. + * @return Result code. + * @remark The userspace destination address must have the \ref MemState_MapDeviceAllowed bit set. + * @note Syscall number 0x59. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option); + +/** + * @brief Maps an attached device address space to an userspace address. + * @return Result code. + * @remark The userspace destination address must have the \ref MemState_MapDeviceAlignedAllowed bit set. + * @note Syscall number 0x5A. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option); + +/** + * @brief Maps an attached device address space to an userspace address. [1.0.0-12.1.0] + * @return Result code. + * @remark The userspace destination address must have the \ref MemState_MapDeviceAlignedAllowed bit set. + * @note Syscall number 0x5B. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapDeviceAddressSpace(u64 *out_mapped_size, Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm); + +/** + * @brief Unmaps an attached device address space from an userspace address. + * @return Result code. + * @note Syscall number 0x5C. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result UnmapDeviceAddressSpace(Handle handle, Handle proc_handle, u64 map_addr, u64 map_size, u64 dev_addr); + +/** + * @brief Invalidates data cache for a virtual address range within a process. + * @param[in] address Address of region to invalidate. + * @param[in] size Size of region to invalidate. + * @note Syscall number 0x5D. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result InvalidateProcessDataCache(Handle process, uintptr_t address, size_t size); + +/** + * @brief Stores data cache for a virtual address range within a process. + * @param[in] address Address of region to store. + * @param[in] size Size of region to store. + * @note Syscall number 0x5E. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result StoreProcessDataCache(Handle process, uintptr_t address, size_t size); + +/** + * @brief Flushes data cache for a virtual address range within a process. + * @param[in] address Address of region to flush. + * @param[in] size Size of region to flush. + * @note Syscall number 0x5F. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result FlushProcessDataCache(Handle process, uintptr_t address, size_t size); + +/** + * @brief Debugs an active process. + * @return Result code. + * @note Syscall number 0x60. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result DebugActiveProcess(Handle* debug, u64 processID); + +/** + * @brief Breaks an active debugging session. + * @return Result code. + * @note Syscall number 0x61. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result BreakDebugProcess(Handle debug); + +/** + * @brief Terminates the process of an active debugging session. + * @return Result code. + * @note Syscall number 0x62. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result TerminateDebugProcess(Handle debug); + +/** + * @brief Gets an incoming debug event from a debugging session. + * @return Result code. + * @note Syscall number 0x63. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetDebugEvent(DebugEventInfo* event_out, Handle debug); + +/** + * @brief Continues a debugging session. + * @return Result code. + * @note Syscall number 0x64. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + * @warning Only exists on [3.0.0+]. For older versions use \ref svcLegacyContinueDebugEvent. + */ +Result ContinueDebugEvent(Handle debug, u32 flags, u64* tid_list, u32 num_tids); + +/** + * @brief Continues a debugging session. + * @return Result code. + * @note Syscall number 0x64. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + * @warning Only exists on [1.0.0-2.3.0]. For newer versions use \ref svcContinueDebugEvent. + */ +Result LegacyContinueDebugEvent(Handle debug, u32 flags, u64 threadID); + +/** + * @brief Gets the context (dump the registers) of a thread in a debugging session. + * @return Result code. + * @param[out] ctx Output thread context (register dump). + * @param[in] debug Debug handle. + * @param[in] threadID ID of the thread to dump the context of. + * @param[in] flags Register groups to select, combination of @ref RegisterGroup flags. + * @note Syscall number 0x67. + * @warning Official kernel will not dump any CPU GPR if the thread is currently executing a system call (except @ref svcBreak and @ref svcReturnFromException). + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetDebugThreadContext(ThreadContext* ctx, Handle debug, u64 threadID, u32 flags); + +/** + * @brief Gets the context (dump the registers) of a thread in a debugging session. + * @return Result code. + * @param[in] debug Debug handle. + * @param[in] threadID ID of the thread to set the context of. + * @param[in] ctx Input thread context (register dump). + * @param[in] flags Register groups to select, combination of @ref RegisterGroup flags. + * @note Syscall number 0x68. + * @warning Official kernel will return an error if the thread is currently executing a system call (except @ref svcBreak and @ref svcReturnFromException). + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result SetDebugThreadContext(Handle debug, u64 threadID, const ThreadContext* ctx, u32 flags); + +/** + * @brief Retrieves a list of all running processes. + * @return Result code. + * @note Syscall number 0x65. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetProcessList(s32 *num_out, u64 *pids_out, u32 max_pids); + +/** + * @brief Retrieves a list of all threads for a debug handle (or zero). + * @return Result code. + * @note Syscall number 0x66. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetThreadList(s32 *num_out, u64 *tids_out, u32 max_tids, Handle debug); + +/** + * @brief Queries memory information from a process that is being debugged. + * @return Result code. + * @note Syscall number 0x69. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result QueryDebugProcessMemory(MemoryInfo* meminfo_ptr, u32* pageinfo, Handle debug, u64 addr); + +/** + * @brief Reads memory from a process that is being debugged. + * @return Result code. + * @note Syscall number 0x6A. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ReadDebugProcessMemory(void* buffer, Handle debug, u64 addr, u64 size); + +/** + * @brief Writes to memory in a process that is being debugged. + * @return Result code. + * @note Syscall number 0x6B. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result WriteDebugProcessMemory(Handle debug, const void* buffer, u64 addr, u64 size); + +/** + * @brief Sets one of the hardware breakpoints. + * @return Result code. + * @note Syscall number 0x6C. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result SetHardwareBreakPoint(u32 which, u64 flags, u64 value); + +/** + * @brief Gets parameters from a thread in a debugging session. + * @return Result code. + * @note Syscall number 0x6D. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetDebugThreadParam(u64* out_64, u32* out_32, Handle debug, u64 threadID, DebugThreadParam param); + +/** + * @brief Retrieves privileged information about the system, or a certain kernel object. + * @param[out] out Variable to which store the information. + * @param[in] id0 First ID of the property to retrieve. + * @param[in] handle Handle of the object to retrieve information from, or \ref INVALID_HANDLE to retrieve information about the system. + * @param[in] id1 Second ID of the property to retrieve. + * @return Result code. + * @remark The full list of property IDs can be found on the switchbrew.org wiki. + * @note Syscall number 0x6F. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetSystemInfo(u64* out, u64 id0, Handle handle, u64 id1); + +/** + * @brief Creates a port. + * @return Result code. + * @note Syscall number 0x70. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreatePort(Handle* portServer, Handle *portClient, s32 max_sessions, bool is_light, const char* name); + +/** + * @brief Manages a named port. + * @return Result code. + * @note Syscall number 0x71. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ManageNamedPort(Handle* portServer, const char* name, s32 maxSessions); + +/** + * @brief Manages a named port. + * @return Result code. + * @note Syscall number 0x72. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result ConnectToPort(Handle* session, Handle port); + +/** + * @brief Sets the memory permissions for the specified memory with the supplied process handle. + * @param[in] proc Process handle. + * @param[in] addr Address of the memory. + * @param[in] size Size of the memory. + * @param[in] perm Permissions (see \ref Permission). + * @return Result code. + * @remark This returns an error (0xD801) when \p perm is >0x5, hence -WX and RWX are not allowed. + * @note Syscall number 0x73. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result SetProcessMemoryPermission(Handle proc, u64 addr, u64 size, u32 perm); + +/** + * @brief Maps the src address from the supplied process handle into the current process. + * @param[in] dst Address to which map the memory in the current process. + * @param[in] proc Process handle. + * @param[in] src Source mapping address. + * @param[in] size Size of the memory. + * @return Result code. + * @remark This allows mapping code and rodata with RW- permission. + * @note Syscall number 0x74. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapProcessMemory(void* dst, Handle proc, u64 src, u64 size); + +/** + * @brief Undoes the effects of \ref svcMapProcessMemory. + * @param[in] dst Destination mapping address + * @param[in] proc Process handle. + * @param[in] src Address of the memory in the process. + * @param[in] size Size of the memory. + * @return Result code. + * @remark This allows mapping code and rodata with RW- permission. + * @note Syscall number 0x75. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result UnmapProcessMemory(void* dst, Handle proc, u64 src, u64 size); + +/** + * @brief Equivalent to \ref svcQueryMemory, for another process. + * @param[out] meminfo_ptr \ref MemoryInfo structure which will be filled in. + * @param[out] pageinfo Page information which will be filled in. + * @param[in] proc Process handle. + * @param[in] addr Address to query. + * @return Result code. + * @note Syscall number 0x76. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result QueryProcessMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, Handle proc, u64 addr); + +/** + * @brief Maps normal heap in a certain process as executable code (used when loading NROs). + * @param[in] proc Process handle (cannot be \ref CUR_PROCESS_HANDLE). + * @param[in] dst Destination mapping address. + * @param[in] src Source mapping address. + * @param[in] size Size of the mapping. + * @return Result code. + * @note Syscall number 0x77. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result MapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size); + +/** + * @brief Undoes the effects of \ref svcMapProcessCodeMemory. + * @param[in] proc Process handle (cannot be \ref CUR_PROCESS_HANDLE). + * @param[in] dst Destination mapping address. + * @param[in] src Source mapping address. + * @param[in] size Size of the mapping. + * @return Result code. + * @note Syscall number 0x78. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result UnmapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size); + +/** + * @brief Creates a new process. + * @return Result code. + * @note Syscall number 0x79. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateProcess(Handle* out, const void* proc_info, const u32* caps, u64 cap_num); + +/** + * @brief Starts executing a freshly created process. + * @return Result code. + * @note Syscall number 0x7A. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result StartProcess(Handle proc, s32 main_prio, s32 default_cpu, u32 stack_size); + +/** + * @brief Terminates a running process. + * @return Result code. + * @note Syscall number 0x7B. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result TerminateProcess(Handle proc); + +/** + * @brief Gets a \ref ProcessInfoType for a process. + * @return Result code. + * @note Syscall number 0x7C. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result GetProcessInfo(s64 *out, Handle proc, ProcessInfoType which); + +/** + * @brief Creates a new Resource Limit handle. + * @return Result code. + * @note Syscall number 0x7D. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result CreateResourceLimit(Handle* out); + +/** + * @brief Sets the value for a \ref LimitableResource for a Resource Limit handle. + * @return Result code. + * @note Syscall number 0x7E. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result SetResourceLimitLimitValue(Handle reslimit, LimitableResource which, u64 value); + +/** + * @brief Calls a secure monitor function (TrustZone, EL3). + * @param regs Arguments to pass to the secure monitor. + * @note Syscall number 0x7F. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +void CallSecureMonitor(SecmonArgs* regs); + +/** + * @brief Maps new insecure memory at the desired address. [15.0.0+] + * @return Result code. + * @note Syscall number 0x90. + */ +Result MapInsecurePhysicalMemory(void *address, u64 size); + +/** + * @brief Undoes the effects of \ref svcMapInsecureMemory. [15.0.0+] + * @return Result code. + * @note Syscall number 0x91. + */ +Result UnmapInsecurePhysicalMemory(void *address, u64 size); + +} // namespace svc + +/// @brief C++ wrappers for the `swkbd` API. +/// @details Wraps: switch/applets/swkbd.h. +namespace swkbd { + +using ::SwkbdAppearArg; +/// Base swkbd arg struct. +using ::SwkbdArgCommon; +using ::SwkbdArgV0; +/// Arg struct for version 0x30007+. +using ::SwkbdArgV7; +/// Arg struct for version 0x6000B+. +using ::SwkbdArgVB; +/// Struct data for SwkbdInline Interactive reply storage ChangedString*, at the end following the string. +using ::SwkbdChangedStringArg; +/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString* replies (text changed by the user or by \ref swkbdInlineSetInputText). +/// str is the UTF-8 string for the current text. +using ::SwkbdChangedStringCb; +/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString*V2 replies (text changed by the user or by \ref swkbdInlineSetInputText). +/// str is the UTF-8 string for the current text. +using ::SwkbdChangedStringV2Cb; +using ::SwkbdConfig; +using ::SwkbdCustomizedDictionarySet; +/// Input data for SwkbdInline request SetCustomizeDic. +using ::SwkbdCustomizeDicInfo; +/// Struct data for SwkbdInline Interactive reply storage DecidedEnter*, at the end following the string. +using ::SwkbdDecidedEnterArg; +/// This callback is used by \ref swkbdInlineUpdate when handling DecidedEnter* replies (when the final text was submitted via the button). +/// str is the UTF-8 string for the current text. +using ::SwkbdDecidedEnterCb; +/// User dictionary word. +using ::SwkbdDictWord; +/// InitializeArg for SwkbdInline. +using ::SwkbdInitializeArg; +/// InlineKeyboard +using ::SwkbdInline; +using ::SwkbdInlineCalcArg; +/// Value for \ref SwkbdInitializeArg mode. Controls the LibAppletMode when launching the applet. +using ::SwkbdInlineMode; +/// Struct data for SwkbdInline Interactive reply storage MovedCursor*, at the end following the string. +using ::SwkbdMovedCursorArg; +/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor* replies. +/// str is the UTF-8 string for the current text. +using ::SwkbdMovedCursorCb; +/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor*V2 replies. +/// str is the UTF-8 string for the current text. +using ::SwkbdMovedCursorV2Cb; +/// Struct data for SwkbdInline Interactive reply storage MovedTab*, at the end following the string. +using ::SwkbdMovedTabArg; +/// This callback is used by \ref swkbdInlineUpdate when handling MovedTab* replies. +/// str is the UTF-8 string for the current text. +using ::SwkbdMovedTabCb; +/// Rect +using ::SwkbdRect; +/// SwkbdInline Interactive output storage reply ID. +using ::SwkbdReplyType; +/// SwkbdInline Interactive input storage request ID. +using ::SwkbdRequestCommand; +/// SwkbdInline State +using ::SwkbdState; +/// TextCheck callback set by \ref swkbdConfigSetTextCheckCallback, for validating the input string when the swkbd ok-button is pressed. This buffer contains an UTF-8 string. This callback should validate the input string, then return a \ref SwkbdTextCheckResult indicating success/failure. On failure, this function must write an error message to the tmp_string buffer, which will then be displayed by swkbd. +using ::SwkbdTextCheckCb; +/// Output result returned by \ref SwkbdTextCheckCb. +using ::SwkbdTextCheckResult; +/// Value for SwkbdArgCommon::textDrawType. Only applies when stringLenMax is 1..32, otherwise swkbd will only use SwkbdTextDrawType_Box. +using ::SwkbdTextDrawType; +/// Type of keyboard. +using ::SwkbdType; + +/** + * @brief Creates a SwkbdConfig struct. + * @param c SwkbdConfig struct. + * @param max_dictwords Max \ref SwkbdDictWord entries, 0 for none. + */ +Result Create(SwkbdConfig* c, s32 max_dictwords); + +/** + * @brief Closes a SwkbdConfig struct. + * @param c SwkbdConfig struct. + */ +void Close(SwkbdConfig* c); + +/** + * @brief Clears the args in the SwkbdConfig struct and initializes it with the Default Preset. + * @note Do not use this before \ref swkbdCreate. + * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_QWERTY, swkbdConfigSetInitialCursorPos() with value 1, swkbdConfigSetReturnButtonFlag() with value 1, and swkbdConfigSetBlurBackground() with value 1. Pre-5.0.0: swkbdConfigSetTextDrawType() with \ref SwkbdTextDrawType_Box. + * @param c SwkbdConfig struct. + */ +void ConfigMakePresetDefault(SwkbdConfig* c); + +/** + * @brief Clears the args in the SwkbdConfig struct and initializes it with the Password Preset. + * @note Do not use this before \ref swkbdCreate. + * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_QWERTY, swkbdConfigSetInitialCursorPos() with value 1, swkbdConfigSetPasswordFlag() with value 1, and swkbdConfigSetBlurBackground() with value 1. + * @param c SwkbdConfig struct. + */ +void ConfigMakePresetPassword(SwkbdConfig* c); + +/** + * @brief Clears the args in the SwkbdConfig struct and initializes it with the UserName Preset. + * @note Do not use this before \ref swkbdCreate. + * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal, swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_UserName, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. + * @param c SwkbdConfig struct. + */ +void ConfigMakePresetUserName(SwkbdConfig* c); + +/** + * @brief Clears the args in the SwkbdConfig struct and initializes it with the DownloadCode Preset. + * @note Do not use this before \ref swkbdCreate. + * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal (\ref SwkbdType_QWERTY on [5.0.0+]), swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_DownloadCode, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. [5.0.0+]: swkbdConfigSetStringLenMax() with value 16, swkbdConfigSetStringLenMin() with value 1, and swkbdConfigSetTextDrawType() with SwkbdTextDrawType_DownloadCode. Uses swkbdConfigSetTextGrouping() for [0-2] with: 0x3, 0x7, and 0xb. + * @param c SwkbdConfig struct. + */ +void ConfigMakePresetDownloadCode(SwkbdConfig* c); + +/** + * @brief Sets the Ok button text. The default is "". + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetOkButtonText(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the LeftOptionalSymbolKey, for \ref SwkbdType_NumPad. The default is "". + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetLeftOptionalSymbolKey(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the RightOptionalSymbolKey, for \ref SwkbdType_NumPad. The default is "". + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetRightOptionalSymbolKey(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the Header text. The default is "". + * @note See SwkbdArgCommon::stringLenMax. + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetHeaderText(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the Sub text. The default is "". + * @note See SwkbdArgCommon::stringLenMax. + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetSubText(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the Guide text. The default is "". + * @note The swkbd applet only displays this when the current displayed cursor position is 0. + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetGuideText(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the Initial text. The default is "". + * @param c SwkbdConfig struct. + * @param str UTF-8 input string. + */ +void ConfigSetInitialText(SwkbdConfig* c, const char* str); + +/** + * @brief Sets the user dictionary. + * @param c SwkbdConfig struct. + * @param input Input data. + * @param entries Total entries in the buffer. + */ +void ConfigSetDictionary(SwkbdConfig* c, const SwkbdDictWord *input, s32 entries); + +/** + * @brief Sets the CustomizedDictionaries. + * @note Only available on [6.0.0+]. + * @param c SwkbdConfig struct. + * @param dic Input \ref SwkbdCustomizedDictionarySet + */ +Result ConfigSetCustomizedDictionaries(SwkbdConfig* c, const SwkbdCustomizedDictionarySet *dic); + +/** + * @brief Sets the TextCheck callback. + * @param c SwkbdConfig struct. + * @param cb \ref SwkbdTextCheckCb callback. + */ +void ConfigSetTextCheckCallback(SwkbdConfig* c, SwkbdTextCheckCb cb); + +/** + * @brief Sets SwkbdArgCommon::SwkbdType. + * @param c SwkbdConfig struct. + * @param type \ref SwkbdType + */ +void ConfigSetType(SwkbdConfig* c, SwkbdType type); + +/** + * @brief Sets SwkbdArgCommon::dicFlag. + * @param c SwkbdConfig struct. + * @param flag Flag + */ +void ConfigSetDicFlag(SwkbdConfig* c, u8 flag); + +/** + * @brief Sets SwkbdArgCommon::keySetDisableBitmask. + * @param c SwkbdConfig struct. + * @param keySetDisableBitmask keySetDisableBitmask + */ +void ConfigSetKeySetDisableBitmask(SwkbdConfig* c, u32 keySetDisableBitmask); + +/** + * @brief Sets SwkbdArgCommon::initialCursorPos. + * @param c SwkbdConfig struct. + * @param initialCursorPos initialCursorPos + */ +void ConfigSetInitialCursorPos(SwkbdConfig* c, u32 initialCursorPos); + +/** + * @brief Sets SwkbdArgCommon::stringLenMax. + * @param c SwkbdConfig struct. + * @param stringLenMax stringLenMax + */ +void ConfigSetStringLenMax(SwkbdConfig* c, u32 stringLenMax); + +/** + * @brief Sets SwkbdArgCommon::stringLenMin. + * @param c SwkbdConfig struct. + * @param stringLenMin stringLenMin + */ +void ConfigSetStringLenMin(SwkbdConfig* c, u32 stringLenMin); + +/** + * @brief Sets SwkbdArgCommon::passwordFlag. + * @param c SwkbdConfig struct. + * @param flag Flag + */ +void ConfigSetPasswordFlag(SwkbdConfig* c, u32 flag); + +/** + * @brief Sets SwkbdArgCommon::textDrawType. + * @param c SwkbdConfig struct. + * @param textDrawType \ref SwkbdTextDrawType + */ +void ConfigSetTextDrawType(SwkbdConfig* c, SwkbdTextDrawType textDrawType); + +/** + * @brief Sets SwkbdArgCommon::returnButtonFlag. + * @param c SwkbdConfig struct. + * @param flag Flag + */ +void ConfigSetReturnButtonFlag(SwkbdConfig* c, u16 flag); + +/** + * @brief Sets SwkbdArgCommon::blurBackground. + * @param c SwkbdConfig struct. + * @param blurBackground blurBackground + */ +void ConfigSetBlurBackground(SwkbdConfig* c, u8 blurBackground); + +/** + * @brief Sets SwkbdArgV7::textGrouping. + * @param index Array index. + * @param value Value to write. + */ +void ConfigSetTextGrouping(SwkbdConfig* c, u32 index, u32 value); + +/** + * @brief Sets SwkbdConfig::unkFlag, default is 0. Copied to SwkbdArgVB::unkFlag with [8.0.0+]. + * @param flag Flag + */ +void ConfigSetUnkFlag(SwkbdConfig* c, u8 flag); + +/** + * @brief Sets SwkbdConfig::trigger, default is 0. Copied to SwkbdArgVB::trigger with [8.0.0+]. + * @param trigger Trigger + */ +void ConfigSetTrigger(SwkbdConfig* c, u8 trigger); + +/** + * @brief Launch swkbd with the specified config. This will return once swkbd is finished running. + * @note The string buffer is also used for the buffer passed to the \ref SwkbdTextCheckCb, when it's set. Hence, in that case this buffer should be large enough to handle TextCheck string input/output. The size passed to the callback is the same size passed here, -1. + * @param c SwkbdConfig struct. + * @param out_string UTF-8 Output string buffer. + * @param out_string_size UTF-8 Output string buffer size, including NUL-terminator. + */ +Result Show(SwkbdConfig* c, char* out_string, size_t out_string_size); + +/** + * @brief Creates a SwkbdInline object. Only available on [2.0.0+]. + * @note This is essentially an asynchronous version of the regular swkbd. + * @note This calls \ref swkbdInlineSetUtf8Mode internally with flag=true. + * @param s SwkbdInline object. + */ +Result InlineCreate(SwkbdInline* s); + +/** + * @brief Closes a SwkbdInline object. If the applet is running, this will tell the applet to exit, then wait for the applet to exit + applet exit handling. + * @param s SwkbdInline object. + */ +Result InlineClose(SwkbdInline* s); + +/** + * @brief Does setup for \ref SwkbdInitializeArg and launches the applet with the SwkbdInline object. + * @note The initArg is cleared, and on [5.0.0+] unk_x5 is set to 1. + * @param s SwkbdInline object. + */ +Result InlineLaunch(SwkbdInline* s); + +/** + * @brief Same as \ref swkbdInlineLaunch, except mode and unk_x5 for \ref SwkbdInitializeArg are set to the input params. + * @param s SwkbdInline object. + * @param mode Value for SwkbdInitializeArg::mode. + * @param unk_x5 Value for SwkbdInitializeArg::unk_x5. + */ +Result InlineLaunchForLibraryApplet(SwkbdInline* s, u8 mode, u8 unk_x5); + +/** + * @brief GetWindowSize + * @param[out] width Output width. + * @param[out] height Output height. + */ +void InlineGetWindowSize(s32 *width, s32 *height); + +/** + * @brief GetImageMemoryRequirement + * @note Wrapper for \ref viGetIndirectLayerImageRequiredMemoryInfo. + * @param[out] out_size Output size. + * @param[out] out_alignment Output alignment. + */ +Result InlineGetImageMemoryRequirement(u64 *out_size, u64 *out_alignment); + +/** + * @brief GetImage + * @note Only available with ::SwkbdInlineMode_UserDisplay. + * @note For width/height, see \ref swkbdInlineGetWindowSize. + * @param s SwkbdInline object. + * @param[out] buffer Output RGBA8 image buffer, this must use the alignment from \ref swkbdInlineGetImageMemoryRequirement. + * @param[in] size Output buffer size, this must match the size from \ref swkbdInlineGetImageMemoryRequirement. + * @param[out] data_available Whether data is available. + */ +Result InlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_available); + +/** + * @brief Gets the image max height, relative to the bottom of the screen. + * @param s SwkbdInline object. + */ +s32 InlineGetMaxHeight(SwkbdInline* s); + +/** + * @brief Gets the MiniaturizedHeight, relative to the bottom of the screen. + * @param s SwkbdInline object. + */ +s32 InlineGetMiniaturizedHeight(SwkbdInline* s); + +/** + * @brief GetTouchRectangles. Returns number of valid Rects: 1 for only keytop, 2 for keytop/footer. + * @param s SwkbdInline object. + * @param[out] keytop \ref SwkbdRect for keytop. Optional, can be NULL. + * @param[out] footer \ref SwkbdRect for footer. Optional, can be NULL. + */ +s32 InlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *footer); + +/** + * @brief Gets whether the input x/y are within the output from \ref swkbdInlineGetTouchRectangles. + * @param s SwkbdInline object. + * @param[out] x X + * @param[out] y Y + */ +bool InlineIsUsedTouchPointByKeyboard(SwkbdInline* s, s32 x, s32 y); + +/** + * @brief Handles updating SwkbdInline state, this should be called periodically. + * @note Handles applet exit if needed, and also sends the \ref SwkbdInlineCalcArg to the applet if needed. Hence, this should be called at some point after writing to \ref SwkbdInlineCalcArg. + * @note Handles applet Interactive storage output when needed. + * @param s SwkbdInline object. + * @param out_state Optional output \ref SwkbdState. + */ +Result InlineUpdate(SwkbdInline* s, SwkbdState* out_state); + +/** + * @brief Sets the FinishedInitialize callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @param s SwkbdInline object. + * @param cb Callback + */ +void InlineSetFinishedInitializeCallback(SwkbdInline* s, VoidFn cb); + +/** + * @brief Sets the DecidedCancel callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @param s SwkbdInline object. + * @param cb Callback + */ +void InlineSetDecidedCancelCallback(SwkbdInline* s, VoidFn cb); + +/** + * @brief Sets the ChangedString callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @note This clears the callback set by \ref swkbdInlineSetChangedStringV2Callback. + * @note This should be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. + * @param s SwkbdInline object. + * @param cb \ref SwkbdChangedStringCb Callback + */ +void InlineSetChangedStringCallback(SwkbdInline* s, SwkbdChangedStringCb cb); + +/** + * @brief Sets the ChangedStringV2 callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @note Only available with [8.0.0+]. + * @note This must be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. + * @param s SwkbdInline object. + * @param cb \ref SwkbdChangedStringV2Cb Callback + */ +void InlineSetChangedStringV2Callback(SwkbdInline* s, SwkbdChangedStringV2Cb cb); + +/** + * @brief Sets the MovedCursor callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @note This clears the callback set by \ref swkbdInlineSetMovedCursorV2Callback. + * @note This should be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. + * @param s SwkbdInline object. + * @param cb \ref SwkbdMovedCursorCb Callback + */ +void InlineSetMovedCursorCallback(SwkbdInline* s, SwkbdMovedCursorCb cb); + +/** + * @brief Sets the MovedCursorV2 callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @note Only available with [8.0.0+]. + * @note This must be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. + * @param s SwkbdInline object. + * @param cb \ref SwkbdMovedCursorV2Cb Callback + */ +void InlineSetMovedCursorV2Callback(SwkbdInline* s, SwkbdMovedCursorV2Cb cb); + +/** + * @brief Sets the MovedTab callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @param s SwkbdInline object. + * @param cb \ref SwkbdMovedTabCb Callback + */ +void InlineSetMovedTabCallback(SwkbdInline* s, SwkbdMovedTabCb cb); + +/** + * @brief Sets the DecidedEnter callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @param s SwkbdInline object. + * @param cb \ref SwkbdDecidedEnterCb Callback + */ +void InlineSetDecidedEnterCallback(SwkbdInline* s, SwkbdDecidedEnterCb cb); + +/** + * @brief Sets the ReleasedUserWordInfo callback, used by \ref swkbdInlineUpdate. The default is NULL for none. + * @param s SwkbdInline object. + * @param cb Callback + */ +void InlineSetReleasedUserWordInfoCallback(SwkbdInline* s, VoidFn cb); + +/** + * @brief Appear the kbd and set \ref SwkbdAppearArg. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Wrapper for \ref swkbdInlineAppearEx, with trigger=0. + * @param s SwkbdInline object. + * @param arg Input SwkbdAppearArg. + */ +void InlineAppear(SwkbdInline* s, const SwkbdAppearArg* arg); + +/** + * @brief Appear the kbd and set \ref SwkbdAppearArg. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param arg Input SwkbdAppearArg. + * @param trigger Trigger, default is 0. Requires [6.0.0+], on eariler versions this will always use value 0 internally. + */ +void InlineAppearEx(SwkbdInline* s, const SwkbdAppearArg* arg, u8 trigger); + +/** + * @brief Disappear the kbd. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + */ +void InlineDisappear(SwkbdInline* s); + +/** + * @brief Creates a \ref SwkbdAppearArg which can then be passed to \ref swkbdInlineAppear. arg is initialized with the defaults, with type being set to the input type. + * @param arg Output \ref SwkbdAppearArg. + * @param type \ref SwkbdType type + */ +void InlineMakeAppearArg(SwkbdAppearArg* arg, SwkbdType type); + +/** + * @brief Sets okButtonText for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg. + * @param arg \ref SwkbdAppearArg + * @param str Input UTF-8 string for the Ok button text, this can be empty/NULL to use the default. + */ +void InlineAppearArgSetOkButtonText(SwkbdAppearArg* arg, const char* str); + +/** + * @brief Sets the LeftButtonText, for \ref SwkbdType_NumPad. The default is "". Equivalent to \ref swkbdConfigSetLeftOptionalSymbolKey. + * @param arg \ref SwkbdAppearArg, previously initialized by \ref swkbdInlineMakeAppearArg. + * @param str UTF-8 input string. + */ +void InlineAppearArgSetLeftButtonText(SwkbdAppearArg* arg, const char* str); + +/** + * @brief Sets the RightButtonText, for \ref SwkbdType_NumPad. The default is "". Equivalent to \ref swkbdConfigSetRightOptionalSymbolKey. + * @param arg \ref SwkbdAppearArg, previously initialized by \ref swkbdInlineMakeAppearArg. + * @param str UTF-8 input string. + */ +void InlineAppearArgSetRightButtonText(SwkbdAppearArg* arg, const char* str); + +/** + * @brief Sets the stringLenMax for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg. + * @param arg \ref SwkbdAppearArg + * @param stringLenMax Max string length + */ +void InlineAppearArgSetStringLenMax(SwkbdAppearArg* arg, s32 stringLenMax); + +/** + * @brief Sets the stringLenMin for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg. + * @param arg \ref SwkbdAppearArg + * @param stringLenMin Min string length + */ +void InlineAppearArgSetStringLenMin(SwkbdAppearArg* arg, s32 stringLenMin); + +/** + * @brief Sets the audio volume. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param volume Volume + */ +void InlineSetVolume(SwkbdInline* s, float volume); + +/** + * @brief Sets the current input text string. Overrides the entire user input string if the user previously entered any text. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note This will not affect the cursor position, see \ref swkbdInlineSetCursorPos for that. + * @param s SwkbdInline object. + * @param str UTF-8 input string. + */ +void InlineSetInputText(SwkbdInline* s, const char* str); + +/** + * @brief Sets the cursor character position in the string. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param pos Position + */ +void InlineSetCursorPos(SwkbdInline* s, s32 pos); + +/** + * @brief Sets the UserWordInfo. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this was already used previously. + * @note The specified buffer must not be used after this, until \ref swkbdInlineClose is used. + * @note \ref swkbdInlineUpdate must be called at some point afterwards. + * @note If input==NULL or total_entries==0, this will just call \ref swkbdInlineUnsetUserWordInfo internally. + * @param s SwkbdInline object. + * @param input Input data. + * @param entries Total entries in the buffer. + */ +Result InlineSetUserWordInfo(SwkbdInline* s, const SwkbdDictWord *input, s32 entries); + +/** + * @brief Request UnsetUserWordInfo. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. + * @param s SwkbdInline object. + */ +Result InlineUnsetUserWordInfo(SwkbdInline* s); + +/** + * @brief Sets the utf8Mode. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Automatically used internally by \ref swkbdInlineCreate. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetUtf8Mode(SwkbdInline* s, bool flag); + +/** + * @brief Sets the CustomizeDic. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizedDictionaries was already used previously. + * @note The specified buffer must not be used after this, until \ref swkbdInlineClose is used. However, it will also become available once \ref swkbdInlineUpdate handles SwkbdReplyType_UnsetCustomizeDic internally. + * @param s SwkbdInline object. + * @param buffer 0x1000-byte aligned buffer. + * @param size 0x1000-byte aligned buffer size. + * @param info Input \ref SwkbdCustomizeDicInfo + */ +Result InlineSetCustomizeDic(SwkbdInline* s, void* buffer, size_t size, SwkbdCustomizeDicInfo *info); + +/** + * @brief Request UnsetCustomizeDic. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. + * @param s SwkbdInline object. + */ +void InlineUnsetCustomizeDic(SwkbdInline* s); + +/** + * @brief Sets the CustomizedDictionaries. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizeDic was already used previously. + * @note The specified buffer in dic must not be used after this, until \ref swkbdInlineClose is used. However, it will also become available once \ref swkbdInlineUpdate handles SwkbdReplyType_UnsetCustomizedDictionaries internally. + * @note Only available on [6.0.0+]. + * @param s SwkbdInline object. + * @param dic Input \ref SwkbdCustomizedDictionarySet + */ +Result InlineSetCustomizedDictionaries(SwkbdInline* s, const SwkbdCustomizedDictionarySet *dic); + +/** + * @brief Request UnsetCustomizedDictionaries. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. + * @note Only available on [6.0.0+]. + * @param s SwkbdInline object. + */ +Result InlineUnsetCustomizedDictionaries(SwkbdInline* s); + +/** + * @brief Sets InputModeFadeType. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param type Type + */ +void InlineSetInputModeFadeType(SwkbdInline* s, u8 type); + +/** + * @brief Sets AlphaEnabledInInputMode. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetAlphaEnabledInInputMode(SwkbdInline* s, bool flag); + +/** + * @brief Sets KeytopBgAlpha. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param alpha Alpha, clamped to range 0.0f..1.0f. + */ +void InlineSetKeytopBgAlpha(SwkbdInline* s, float alpha); + +/** + * @brief Sets FooterBgAlpha. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param alpha Alpha, clamped to range 0.0f..1.0f. + */ +void InlineSetFooterBgAlpha(SwkbdInline* s, float alpha); + +/** + * @brief Sets gfx scaling. Configures KeytopScale* and BalloonScale based on the input value. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note The BalloonScale is not updated when \ref SwkbdState is above ::SwkbdState_Initialized. + * @param s SwkbdInline object. + * @param scale Scale + */ +void InlineSetKeytopScale(SwkbdInline* s, float scale); + +/** + * @brief Sets gfx translation for the displayed swkbd image position. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param x X + * @param y Y + */ +void InlineSetKeytopTranslate(SwkbdInline* s, float x, float y); + +/** + * @brief Sets KeytopAsFloating. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetKeytopAsFloating(SwkbdInline* s, bool flag); + +/** + * @brief Sets FooterScalable. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetFooterScalable(SwkbdInline* s, bool flag); + +/** + * @brief Sets whether touch is enabled. The default is enabled. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetTouchFlag(SwkbdInline* s, bool flag); + +/** + * @brief Sets whether Hardware-keyboard is enabled. The default is enabled. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetHardwareKeyboardFlag(SwkbdInline* s, bool flag); + +/** + * @brief Sets whether DirectionalButtonAssign is enabled. The default is disabled. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Only available on [4.0.0+]. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetDirectionalButtonAssignFlag(SwkbdInline* s, bool flag); + +/** + * @brief Sets whether the specified SeGroup (sound effect) is enabled. The default is enabled. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. If called again with a different seGroup, \ref swkbdInlineUpdate must be called prior to calling this again. + * @note Only available on [5.0.0+]. + * @param s SwkbdInline object. + * @param seGroup SeGroup + * @param flag Flag + */ +void InlineSetSeGroup(SwkbdInline* s, u8 seGroup, bool flag); + +/** + * @brief Sets whether the backspace button is enabled. The default is enabled. + * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. + * @note Only available on [5.0.0+]. + * @param s SwkbdInline object. + * @param flag Flag + */ +void InlineSetBackspaceFlag(SwkbdInline* s, bool flag); + +} // namespace swkbd + +/// @brief C++ wrappers for the `tc` API. +/// @details Wraps: switch/services/tc.h. +namespace tc { + +/// Initialize tc. +Result Initialize(void); + +/// Exit tc. +void Exit(void); + +/// Gets the Service for tc. +Service* GetServiceSession(void); + +Result EnableFanControl(void); + +/// @warning Disabling your fan can damage your system. +Result DisableFanControl(void); + +Result IsFanControlEnabled(bool *status); + +/// Only available on [5.0.0+]. +Result GetSkinTemperatureMilliC(s32 *skinTemp); + +} // namespace tc + +/// @brief C++ wrappers for the `thread` API. +/// @details Wraps: switch/arm/thread_context.h, switch/kernel/thread.h. +namespace thread { + +/// Armv8 CPU register. +using ::CpuRegister; +/// Armv8 NEON register. +using ::FpuRegister; +/// Armv8 register group. @ref svcGetThreadContext3 uses @ref RegisterGroup_All. +using ::RegisterGroup; +/// Thread information structure. +using ::Thread; +/// Thread context structure (register dump) +using ::ThreadContext; +/// This is for \ref ThreadExceptionDump error_desc. +using ::ThreadExceptionDesc; +/// Thread exception dump structure. +using ::ThreadExceptionDump; +using ::ThreadExceptionFrameA32; +using ::ThreadExceptionFrameA64; + +/** + * @brief Determines whether a thread context belong to an AArch64 process based on the PSR. + * @param[in] ctx Thread context to which PSTATE/cspr has been dumped to. + * @return true if and only if the thread context belongs to an AArch64 process. + */ +bool ContextIsAArch64(const ThreadContext *ctx); + +/** + * @brief Determines whether a ThreadExceptionDump belongs to an AArch64 process based on the PSTATE. + * @param[in] ctx ThreadExceptionDump. + * @return true if and only if the ThreadExceptionDump belongs to an AArch64 process. + */ +bool ExceptionIsAArch64(const ThreadExceptionDump *ctx); + +/** + * @brief Creates a thread. + * @param t Thread information structure which will be filled in. + * @param entry Entrypoint of the thread. + * @param arg Argument to pass to the entrypoint. + * @param stack_mem Memory to use as backing for stack/tls/reent. Must be page-aligned. NULL argument means to allocate new memory. + * @param stack_sz If stack_mem is NULL, size to use for stack. If stack_mem is non-NULL, size to use for stack + reent + tls (must be page-aligned). + * @param prio Thread priority (0x00~0x3F); 0x2C is the usual priority of the main thread, 0x3B is a special priority on cores 0..2 that enables preemptive multithreading (0x3F on core 3). + * @param cpuid ID of the core on which to create the thread (0~3); or -2 to use the default core for the current process. + * @return Result code. + */ +Result Create(Thread* t, ThreadFunc entry, void* arg, void *stack_mem, size_t stack_sz, int prio, int cpuid); + +/** + * @brief Starts the execution of a thread. + * @param t Thread information structure. + * @return Result code. + */ +Result Start(Thread* t); + +/** + * @brief Exits the current thread immediately. + */ +[[noreturn]] void Exit(void); + +/** + * @brief Waits for a thread to finish executing. + * @param t Thread information structure. + * @return Result code. + */ +Result WaitForExit(Thread* t); + +/** + * @brief Frees up resources associated with a thread. + * @param t Thread information structure. + * @return Result code. + */ +Result Close(Thread* t); + +/** + * @brief Pauses the execution of a thread. + * @param t Thread information structure. + * @return Result code. + */ +Result Pause(Thread* t); + +/** + * @brief Resumes the execution of a thread, after having been paused. + * @param t Thread information structure. + * @return Result code. + */ +Result Resume(Thread* t); + +/** + * @brief Dumps the registers of a thread paused by @ref threadPause (register groups: all). + * @param[out] ctx Output thread context (register dump). + * @param t Thread information structure. + * @return Result code. + * @warning Official kernel will not dump x0..x18 if the thread is currently executing a system call, and prior to 6.0.0 doesn't dump TPIDR_EL0. + */ +Result DumpContext(ThreadContext* ctx, Thread* t); + +/** + * @brief Gets a pointer to the current thread structure. + * @return Thread information structure. + */ +Thread * GetSelf(void); + +/** + * @brief Gets the raw handle to the current thread. + * @return The current thread's handle. + */ +Handle GetCurHandle(void); + +/** + * @brief Allocates a TLS slot. + * @param destructor Function to run automatically when a thread exits. + * @return TLS slot ID on success, or a negative value on failure. + */ +s32 TlsAlloc(void (* destructor)(void*)); + +/** + * @brief Retrieves the value stored in a TLS slot. + * @param slot_id TLS slot ID. + * @return Value. + */ +void* TlsGet(s32 slot_id); + +/** + * @brief Stores the specified value into a TLS slot. + * @param slot_id TLS slot ID. + * @param value Value. + */ +void TlsSet(s32 slot_id, void* value); + +/** + * @brief Frees a TLS slot. + * @param slot_id TLS slot ID. + */ +void TlsFree(s32 slot_id); + +} // namespace thread + +/// @brief C++ wrappers for the `time` API. +/// @details Wraps: switch/services/time.h. +namespace time { + +using ::TimeCalendarAdditionalInfo; +using ::TimeCalendarTime; +using ::TimeLocationName; +/// Values for __nx_time_service_type. +using ::TimeServiceType; +using ::TimeStandardSteadyClockTimePointType; +using ::TimeSteadyClockTimePoint; +using ::TimeSystemClockContext; +/// Time clock type. +using ::TimeType; +using ::TimeZoneRule; + +/// Initialize time. Used automatically during app startup. +Result Initialize(void); + +/// Exit time. Used automatically during app startup. +void Exit(void); + +/// Gets the Service object for the actual time service session. +Service* GetServiceSession(void); + +/// Gets the Service object for ISystemClock with the specified \ref TimeType. This will return NULL when the type is invalid. +Service* GetServiceSession_SystemClock(TimeType type); + +/// Gets the Service object for ISteadyClock. +Service* GetServiceSession_SteadyClock(void); + +/// Gets the Service object for ITimeZoneService. +Service* GetServiceSession_TimeZoneService(void); + +/// [6.0.0+] Gets the address of the SharedMemory. +void* GetSharedmemAddr(void); + +/** + * @brief Gets the timepoint for the standard steady clock. + * @param[out] out Output timepoint (see \ref TimeSteadyClockTimePoint) + * @remark The standard steady clock counts time since the RTC was configured (usually this happens during manufacturing). + * @return Result code. + */ +Result GetStandardSteadyClockTimePoint(TimeSteadyClockTimePoint *out); + +/** + * @brief [3.0.0+] Gets the internal offset for the standard steady clock. + * @param[out] out Output internal offset. + * @return Result code. + */ +Result GetStandardSteadyClockInternalOffset(s64 *out); + +/** + * @brief Gets the time for the specified clock. + * @param[in] type Clock to use. + * @param[out] timestamp POSIX UTC timestamp. + * @return Result code. + */ +Result GetCurrentTime(TimeType type, u64 *timestamp); + +/** + * @brief Sets the time for the specified clock. + * @param[in] type Clock to use. + * @param[in] timestamp POSIX UTC timestamp. + * @return Result code. + */ +Result SetCurrentTime(TimeType type, u64 timestamp); + +Result GetDeviceLocationName(TimeLocationName *name); + +Result SetDeviceLocationName(const TimeLocationName *name); + +Result GetTotalLocationNameCount(s32 *total_location_name_count); + +Result LoadLocationNameList(s32 index, TimeLocationName *location_name_array, s32 location_name_max, s32 *location_name_count); + +Result LoadTimeZoneRule(const TimeLocationName *name, TimeZoneRule *rule); + +Result ToCalendarTime(const TimeZoneRule *rule, u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info); + +Result ToCalendarTimeWithMyRule(u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info); + +Result ToPosixTime(const TimeZoneRule *rule, const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count); + +Result ToPosixTimeWithMyRule(const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count); + +} // namespace time + +/// @brief C++ wrappers for the `tipc` API. +/// @details Wraps: switch/sf/tipc.h. +namespace tipc { + +using ::TipcCommandType; +using ::TipcDispatchParams; +using ::TipcRequestFormat; +/// tipc Service object structure +using ::TipcService; + +/** + * @brief Creates a tipc service object from an IPC session handle. + * @param[out] s TIPC service object. + * @param[in] h IPC session handle. + */ +void Create(TipcService* s, Handle h); + +/** + * @brief Closes a tipc service. + * @param[in] s TIPC service object. + */ +void Close(TipcService* s); + +void RequestInBuffer(HipcRequest* req, const void* buffer, size_t size, HipcBufferMode mode); + +void RequestOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode); + +void RequestInOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode); + +void RequestHandle(HipcRequest* req, Handle handle); + +void RequestFormatProcessBuffer(TipcRequestFormat* fmt, u32 attr); + +void RequestProcessBuffer(HipcRequest* req, const SfBuffer* buf, u32 attr); + +void* MakeRequest(u32 request_id, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_handles, const Handle* handles); + +Handle ResponseGetCopyHandle(HipcResponse* res); + +Handle ResponseGetMoveHandle(HipcResponse* res); + +void ResponseGetHandle(HipcResponse* res, SfOutHandleAttr type, Handle* out); + +Result ParseResponse(u32 out_size, void** out_data, u32 num_out_objects, TipcService* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles); + +Result DispatchImpl(TipcService* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, TipcDispatchParams disp); + +} // namespace tipc + +/// @brief C++ wrappers for the `tmem` API. +/// @details Wraps: switch/kernel/tmem.h. +namespace tmem { + +/// Transfer memory information structure. +using ::TransferMemory; + +/** + * @brief Creates a transfer memory object. + * @param t Transfer memory information structure that will be filled in. + * @param size Size of the transfer memory object to create. + * @param perm Permissions with which to protect the transfer memory in the local process. + * @return Result code. + */ +Result Create(TransferMemory* t, size_t size, Permission perm); + +/** + * @brief Creates a transfer memory object from existing memory. + * @param t Transfer memory information structure that will be filled in. + * @param buf Pointer to a page-aligned buffer. + * @param size Size of the transfer memory object to create. + * @param perm Permissions with which to protect the transfer memory in the local process. + * @return Result code. + */ +Result CreateFromMemory(TransferMemory* t, void* buf, size_t size, Permission perm); + +/** + * @brief Loads a transfer memory object coming from a remote process. + * @param t Transfer memory information structure which will be filled in. + * @param handle Handle of the transfer memory object. + * @param size Size of the transfer memory object that is being loaded. + * @param perm Permissions which the transfer memory is expected to have in the process that owns the memory. + * @warning This is a privileged operation; in normal circumstances applications shouldn't use this function. + */ +void LoadRemote(TransferMemory* t, Handle handle, size_t size, Permission perm); + +/** + * @brief Maps a transfer memory object. + * @param t Transfer memory information structure. + * @return Result code. + * @warning This is a privileged operation; in normal circumstances applications cannot use this function. + */ +Result Map(TransferMemory* t); + +/** + * @brief Unmaps a transfer memory object. + * @param t Transfer memory information structure. + * @return Result code. + * @warning This is a privileged operation; in normal circumstances applications cannot use this function. + */ +Result Unmap(TransferMemory* t); + +/** + * @brief Retrieves the mapped address of a transfer memory object. + * @param t Transfer memory information structure. + * @return Mapped address of the transfer memory object. + */ +void* GetAddr(TransferMemory* t); + +/** + * @brief Closes handle of a transfer memory object. + * @param t Transfer memory information structure. + * @return Result code. + */ +Result CloseHandle(TransferMemory* t); + +/** + * @brief Waits until source backing memory permissions match perm. + * @param t Transfer memory information structure. + * @param perm Permissions which the source backing memory is expected to have before return. + * @return Result code. + */ +Result WaitForPermission(TransferMemory* t, Permission perm); + +/** + * @brief Frees up resources used by a transfer memory object, unmapping and closing handles, etc. + * @param t Transfer memory information structure. + * @return Result code. + */ +Result Close(TransferMemory* t); + +} // namespace tmem + +/// @brief C++ wrappers for the `ts` API. +/// @details Wraps: switch/services/ts.h. +namespace ts { + +using ::TsDeviceCode; +/// Location +using ::TsLocation; +using ::TsSession; + +/// Initialize ts. +Result Initialize(void); + +/// Exit ts. +void Exit(void); + +/// Gets the Service for ts. +Service* GetServiceSession(void); + +/** + * @brief Gets the min/max temperature for the specified \ref TsLocation. + * @param[in] location \ref TsLocation + * @param[out] min_temperature Output minimum temperature in Celsius. + * @param[out] max_temperature Output maximum temperature in Celsius. + */ +Result GetTemperatureRange(TsLocation location, s32 *min_temperature, s32 *max_temperature); + +/** + * @brief Gets the temperature for the specified \ref TsLocation. + * @param[in] location \ref TsLocation + * @param[out] temperature Output temperature in Celsius. + */ +Result GetTemperature(TsLocation location, s32 *temperature); + +/** + * @brief Gets the temperature for the specified \ref TsLocation, in MilliC. [1.0.0-13.2.1] + * @param[in] location \ref TsLocation + * @param[out] temperature Output temperature in MilliC. + */ +Result GetTemperatureMilliC(TsLocation location, s32 *temperature); + +Result OpenSession(TsSession *s, u32 device_code); + +///< [8.0.0+] +Result SessionGetTemperature(TsSession *s, float *temperature); + +///< [10.0.0+] +void SessionClose(TsSession *s); + +} // namespace ts + +/// @brief C++ wrappers for the `uart` API. +/// @details Wraps: switch/services/uart.h. +namespace uart { + +/// FlowControlMode +using ::UartFlowControlMode; +/// UartPort +using ::UartPort; +/// PortEventType +using ::UartPortEventType; +/// UartPortForDev +using ::UartPortForDev; +/// PortSession +using ::UartPortSession; + +/// Initialize uart. +Result Initialize(void); + +/// Exit uart. +void Exit(void); + +/// Gets the Service object for the actual uart service session. +Service* GetServiceSession(void); + +/** + * @brief HasPort + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPort + * @param[out] out Output success flag. + */ +Result HasPort(UartPort port, bool *out); + +/** + * @brief HasPortForDev + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPortForDev + * @param[out] out Output success flag. + */ +Result HasPortForDev(UartPortForDev port, bool *out); + +/** + * @brief IsSupportedBaudRate + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPort + * @param[in] baud_rate BaudRate + * @param[out] out Output success flag. + */ +Result IsSupportedBaudRate(UartPort port, u32 baud_rate, bool *out); + +/** + * @brief IsSupportedBaudRateForDev + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPortForDev + * @param[in] baud_rate BaudRate + * @param[out] out Output success flag. + */ +Result IsSupportedBaudRateForDev(UartPortForDev port, u32 baud_rate, bool *out); + +/** + * @brief IsSupportedFlowControlMode + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPort + * @param[in] flow_control_mode \ref UartFlowControlMode + * @param[out] out Output success flag. + */ +Result IsSupportedFlowControlMode(UartPort port, UartFlowControlMode flow_control_mode, bool *out); + +/** + * @brief IsSupportedFlowControlModeForDev + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPortForDev + * @param[in] flow_control_mode \ref UartFlowControlMode + * @param[out] out Output success flag. + */ +Result IsSupportedFlowControlModeForDev(UartPortForDev port, UartFlowControlMode flow_control_mode, bool *out); + +/** + * @brief Creates an \ref UartPortSession. + * @note Use \ref uartPortSessionOpenPort or \ref uartPortSessionOpenPortForDev before using any other cmds. + * @param[out] s \ref UartPortSession + */ +Result CreatePortSession(UartPortSession *s); + +/** + * @brief IsSupportedPortEvent + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPort + * @param[in] port_event_type \ref UartPortEventType + * @param[out] out Output success flag. + */ +Result IsSupportedPortEvent(UartPort port, UartPortEventType port_event_type, bool *out); + +/** + * @brief IsSupportedPortEventForDev + * @note Only available on [1.0.0-16.1.0]. + * @param[in] port \ref UartPortForDev + * @param[in] port_event_type \ref UartPortEventType + * @param[out] out Output success flag. + */ +Result IsSupportedPortEventForDev(UartPortForDev port, UartPortEventType port_event_type, bool *out); + +/** + * @brief IsSupportedDeviceVariation + * @note Only available on [7.0.0-16.1.0]. + * @param[in] port \ref UartPort + * @param[in] device_variation DeviceVariation + * @param[out] out Output success flag. + */ +Result IsSupportedDeviceVariation(UartPort port, u32 device_variation, bool *out); + +/** + * @brief IsSupportedDeviceVariationForDev + * @note Only available on [7.0.0-16.1.0]. + * @param[in] port \ref UartPortForDev + * @param[in] device_variation DeviceVariation + * @param[out] out Output success flag. + */ +Result IsSupportedDeviceVariationForDev(UartPortForDev port, u32 device_variation, bool *out); + +/** + * @brief Close an \ref UartPortSession. + * @param s \ref UartPortSession + */ +void PortSessionClose(UartPortSession* s); + +/** + * @brief OpenPort + * @note This is not usable when the specified \ref UartPort is already being used. + * @param s \ref UartPortSession + * @param[out] out Output success flag. + * @param[in] port \ref UartPort + * @param[in] baud_rate BaudRate + * @param[in] flow_control_mode \ref UartFlowControlMode + * @param[in] device_variation [7.0.0+] DeviceVariation + * @param[in] is_invert_tx [6.0.0+] IsInvertTx + * @param[in] is_invert_rx [6.0.0+] IsInvertRx + * @param[in] is_invert_rts [6.0.0+] IsInvertRts + * @param[in] is_invert_cts [6.0.0+] IsInvertCts + * @param[in] send_buffer Send buffer, must be 0x1000-byte aligned. + * @param[in] send_buffer_length Send buffer size, must be 0x1000-byte aligned. + * @param[in] receive_buffer Receive buffer, must be 0x1000-byte aligned. + * @param[in] receive_buffer_length Receive buffer size, must be 0x1000-byte aligned. + */ +Result PortSessionOpenPort(UartPortSession* s, bool *out, UartPort port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length); + +/** + * @brief OpenPortForDev + * @note See the notes for \ref uartPortSessionOpenPort. + * @param s \ref UartPortSession + * @param[out] out Output success flag. + * @param[in] port \ref UartPortForDev + * @param[in] baud_rate BaudRate + * @param[in] flow_control_mode \ref UartFlowControlMode + * @param[in] device_variation [7.0.0+] DeviceVariation + * @param[in] is_invert_tx [6.0.0+] IsInvertTx + * @param[in] is_invert_rx [6.0.0+] IsInvertRx + * @param[in] is_invert_rts [6.0.0+] IsInvertRts + * @param[in] is_invert_cts [6.0.0+] IsInvertCts + * @param[in] send_buffer Send buffer, must be 0x1000-byte aligned. + * @param[in] send_buffer_length Send buffer size, must be 0x1000-byte aligned. + * @param[in] receive_buffer Receive buffer, must be 0x1000-byte aligned. + * @param[in] receive_buffer_length Receive buffer size, must be 0x1000-byte aligned. + */ +Result PortSessionOpenPortForDev(UartPortSession* s, bool *out, UartPortForDev port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length); + +/** + * @brief GetWritableLength + * @param s \ref UartPortSession + * @param[out] out Output WritableLength. + */ +Result PortSessionGetWritableLength(UartPortSession* s, u64 *out); + +/** + * @brief Send + * @param s \ref UartPortSession + * @param[in] in_data Input data buffer. + * @param[in] size Input data buffer size. + * @param[out] out Output size. + */ +Result PortSessionSend(UartPortSession* s, const void* in_data, size_t size, u64 *out); + +/** + * @brief GetReadableLength + * @param s \ref UartPortSession + * @param[out] out Output ReadableLength. + */ +Result PortSessionGetReadableLength(UartPortSession* s, u64 *out); + +/** + * @brief Receive + * @param s \ref UartPortSession + * @param[out] out_data Output data buffer. + * @param[in] size Output data buffer size. + * @param[out] out Output size. + */ +Result PortSessionReceive(UartPortSession* s, void* out_data, size_t size, u64 *out); + +/** + * @brief BindPortEvent + * @note The Event must be closed by the user after using \ref uartPortSessionUnbindPortEvent. + * @param s \ref UartPortSession + * @param[in] port_event_type \ref UartPortEventType + * @param[in] threshold Threshold + * @param[out] out Output success flag. + * @param[out] out_event Output Event with autoclear=false. + */ +Result PortSessionBindPortEvent(UartPortSession* s, UartPortEventType port_event_type, s64 threshold, bool *out, Event *out_event); + +/** + * @brief UnbindPortEvent + * @param s \ref UartPortSession + * @param[in] port_event_type \ref UartPortEventType + * @param[out] out Output success flag. + */ +Result PortSessionUnbindPortEvent(UartPortSession* s, UartPortEventType port_event_type, bool *out); + +} // namespace uart + +/// @brief C++ wrappers for the `uevent` API. +/// @details Wraps: switch/kernel/uevent.h. +namespace uevent { + +using ::UEvent; + +/** + * @brief Creates a user-mode event. + * @param[out] e UEvent object. + * @param[in] auto_clear Whether to automatically clear the event. + * @note It is safe to wait on this event with several threads simultaneously. + * @note If more than one thread is listening on it, at least one thread will get the signal. No other guarantees. + */ +void Create(UEvent* e, bool auto_clear); + +/** + * @brief Clears the event signal. + * @param[in] e UEvent object. + */ +void Clear(UEvent* e); + +/** + * @brief Signals the event. + * @param[in] e UEvent object. + */ +void Signal(UEvent* e); + +} // namespace uevent + +/// @brief C++ wrappers for the `usb` API. +/// @details Wraps: switch/runtime/devices/usb_comms.h, switch/services/usbds.h, switch/services/usbhs.h. +namespace usb { + +/// Imported from libusb, with changed names. +using ::usb_class_code; +/// Imported from libusb, with some adjustments. +using ::usb_config_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_control_setup; +/// Imported from libusb, with changed names. +using ::usb_descriptor_type; +/// Imported from libusb, with some adjustments. +using ::usb_device_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_endpoint_descriptor; +/// Imported from libusb, with changed names. +using ::usb_endpoint_direction; +/// Imported from libusb, with some adjustments. +using ::usb_hid_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_interface_association_descriptor; +/// Imported from libusb, with some adjustments. +using ::usb_interface_descriptor; +/// Imported from libusb, with changed names. +using ::usb_iso_sync_type; +/// Imported from libusb, with changed names. +using ::usb_iso_usage_type; +/// Imported from libusb, with changed names. +using ::usb_request_recipient; +/// Imported from libusb, with changed names. +using ::usb_request_type; +/// Imported from libusb, with some adjustments. +using ::usb_ss_endpoint_companion_descriptor; +/// Imported from libusb, with changed names. +using ::usb_standard_request; +/// Imported from libusb, with some adjustments. +using ::usb_string_descriptor; +/// Imported from libusb, with changed names. +using ::usb_transfer_type; +using ::UsbCommsInterfaceInfo; +using ::UsbComplexId; +using ::UsbDeviceSpeed; +using ::UsbDsDeviceInfo; +using ::UsbDsEndpoint; +using ::UsbDsInterface; +using ::UsbDsReportData; +using ::UsbDsReportEntry; +using ::UsbHsClientEpSession; +/// The interface service object. These Events have autoclear=false. +using ::UsbHsClientIfSession; +/// Interface struct. Note that devices have a seperate \ref UsbHsInterface for each interface. +using ::UsbHsInterface; +/// Interface filtering struct. When the associated flag bit is set, the associated descriptor field and struct field are compared, on mismatch the interface is filtered out. +/// [7.0.0+]: The filter struct has to be unique, it can't be used by anything else (including other processes). Hence, Flags has to be non-zero. When initialized with usb:hs:a and VID and/or PID filtering is enabled, the VID/PID will be checked against a blacklist. +using ::UsbHsInterfaceFilter; +using ::UsbHsInterfaceFilterFlags; +/// Descriptors which are not available are set to all-zero. +/// The INPUT/OUTPUT endpoint descriptors were swapped with [8.0.0+], libnx converts this struct to the newer layout when running on pre-8.0.0. +using ::UsbHsInterfaceInfo; +using ::UsbHsRingHeader; +using ::UsbHsXferReport; +/// USB Device States, per USB 2.0 spec +using ::UsbState; + +/// Initializes usbComms with the default number of interfaces (1) +Result CommsInitialize(void); + +/// Initializes usbComms with a specific number of interfaces. +Result CommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos, u16 idVendor, u16 idProduct); + +/// Exits usbComms. +void CommsExit(void); + +/// Sets whether to throw a fatal error in usbComms{Read/Write}* on failure, or just return the transferred size. By default (false) the latter is used. +void CommsSetErrorHandling(bool flag); + +/// Read data with the default interface. +size_t CommsRead(void* buffer, size_t size); + +/// Write data with the default interface. +size_t CommsWrite(const void* buffer, size_t size); + +/// Same as usbCommsRead except with the specified interface. +size_t CommsReadEx(void* buffer, size_t size, u32 interface); + +/// Same as usbCommsWrite except with the specified interface. +size_t CommsWriteEx(const void* buffer, size_t size, u32 interface); + +/// Retrieve event used for read completion with the given interface. +Event * CommsGetReadCompletionEvent(u32 interface); + +/// Start an asynchronous read. The completion event will be signaled when the read completes. +/// The buffer must be page-aligned and no larger than one page. +Result CommsReadAsync(void *buffer, size_t size, u32 *urbId, u32 interface); + +/// Complete an asynchronous read, clearing the completion event, and return the amount of data which was read. +Result CommsGetReadResult(u32 urbId, u32 *transferredSize, u32 interface); + +/// Retrieve event used for write completion with the given interface. +Event * CommsGetWriteCompletionEvent(u32 interface); + +/// Start an asynchronous write. The completion event will be signaled when the write completes. +/// The buffer must be page-aligned and no larger than one page. +Result CommsWriteAsync(void *buffer, size_t size, u32 *urbId, u32 interface); + +/// Complete an asynchronous write, clearing the completion event, and return the amount of data which was written. +Result CommsGetWriteResult(u32 urbId, u32 *transferredSize, u32 interface); + +/// Opens a session with usb:ds. +Result DsInitialize(void); + +/// Closes the usb:ds session. Any interfaces/endpoints which are left open are automatically closed, since otherwise usb-sysmodule won't fully reset usb:ds to defaults. +void DsExit(void); + +/// Gets the Service object for the actual usb:ds service session. +Service* DsGetServiceSession(void); + +/// Helper func. +Result DsWaitReady(u64 timeout); + +/// Helper func. +Result DsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize); + +Event* DsGetStateChangeEvent(void); + +/// Gets the device state. See \ref UsbState. +Result DsGetState(UsbState* out); + +/// Removed in [5.0.0+]. +Result DsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name); + +/// Removed in [5.0.0+]. +Result DsSetVidPidBcd(const UsbDsDeviceInfo* deviceinfo); + +/// Only available on [5.0.0+]. +Result DsRegisterInterface(UsbDsInterface** out); + +/// Only available on [5.0.0+]. +Result DsRegisterInterfaceEx(UsbDsInterface** out, u8 intf_num); + +/// Only available on [5.0.0+]. +Result DsClearDeviceData(void); + +/// Only available on [5.0.0+]. +Result DsAddUsbStringDescriptor(u8* out_index, const char* string); + +/// Only available on [5.0.0+]. +Result DsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs); + +/// Only available on [5.0.0+]. +Result DsDeleteUsbStringDescriptor(u8 index); + +/// Only available on [5.0.0+]. +Result DsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor* descriptor); + +/// Only available on [5.0.0+]. +Result DsSetBinaryObjectStore(const void* bos, size_t bos_size); + +/// Only available on [5.0.0+]. +Result DsEnable(void); + +/// Only available on [5.0.0+]. +Result DsDisable(void); + +/// Only available on [8.0.0+]. +Result DsGetSpeed(UsbDeviceSpeed *out); + +void DsInterface_Close(UsbDsInterface* interface); + +Result DsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size); + +Result DsInterface_EnableInterface(UsbDsInterface* interface); + +Result DsInterface_DisableInterface(UsbDsInterface* interface); + +Result DsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); + +Result DsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); + +Result DsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out); + +Result DsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out); + +Result DsInterface_StallCtrl(UsbDsInterface* interface); + +/// Removed in [5.0.0+]. +Result DsInterface_GetDsEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, struct usb_endpoint_descriptor* descriptor); + +/// Only available on [5.0.0+]. +Result DsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address); + +/// Only available on [5.0.0+]. +Result DsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, const void* buffer, size_t size); + +void DsEndpoint_Close(UsbDsEndpoint* endpoint); + +Result DsEndpoint_Cancel(UsbDsEndpoint* endpoint); + +Result DsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId); + +Result DsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out); + +Result DsEndpoint_Stall(UsbDsEndpoint* endpoint); + +Result DsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt); + +/// Initialize usb:hs. +Result HsInitialize(void); + +/// Exit usb:hs. +void HsExit(void); + +/// Gets the Service object for the actual usb:hs service session. +Service* HsGetServiceSession(void); + +/// Returns the Event loaded during init with autoclear=false. +/// Signaled when a device was removed. +/// When signaled, the user should use \ref usbHsQueryAcquiredInterfaces and cleanup state for all interfaces which are not listed in the output interfaces (none of the IDs match \ref usbHsIfGetID output). +Event* HsGetInterfaceStateChangeEvent(void); + +/** + * @brief Returns an array of all \ref UsbHsInterface. Internally this loads the same interfaces as \ref usbHsQueryAvailableInterfaces, followed by \ref usbHsQueryAcquiredInterfaces. However, ID in \ref UsbHsInterface is set to -1, hence the output from this should not be used with \ref usbHsAcquireUsbIf. + * @param[in] filter \ref UsbHsInterfaceFilter. + * @param[out] interfaces Array of output interfaces. + * @param[in] interfaces_maxsize Max byte-size of the interfaces buffer. + * @param[out] total_entries Total number of output interfaces. + */ +Result HsQueryAllInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries); + +/** + * @brief Returns an array of \ref UsbHsInterface which are available. + * @param[in] filter \ref UsbHsInterfaceFilter. + * @param[out] interfaces Array of output interfaces. + * @param[in] interfaces_maxsize Max byte-size of the interfaces buffer. + * @param[out] total_entries Total number of output interfaces. + */ +Result HsQueryAvailableInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries); + +/** + * @brief Returns an array of \ref UsbHsInterface which were previously acquired. + * @param[out] interfaces Array of output interfaces. + * @param[in] interfaces_maxsize Max byte-size of the interfaces buffer. + * @param[out] total_entries Total number of output interfaces. + */ +Result HsQueryAcquiredInterfaces(UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries); + +/** + * @brief Creates an event which is signaled when an interface is available which passes the filtering checks. + * @param[out] out_event Event object. + * @param[in] autoclear Event autoclear. + * @param[in] index Event index, must be 0..2. + * @param[in] filter \ref UsbHsInterfaceFilter. + */ +Result HsCreateInterfaceAvailableEvent(Event* out_event, bool autoclear, u8 index, const UsbHsInterfaceFilter* filter); + +/** + * @brief Destroys an event setup by \ref usbHsCreateInterfaceAvailableEvent. This *must* be used at some point during cleanup. + * @param[in] event Event object to close. + * @param[in] index Event index, must be 0..2. + */ +Result HsDestroyInterfaceAvailableEvent(Event* event, u8 index); + +/** + * @brief Acquires/opens the specified interface. This returns an error if the interface was already acquired by another process. + * @param[in] s The service object. + * @param[in] interface Interface to use. + */ +Result HsAcquireUsbIf(UsbHsClientIfSession* s, UsbHsInterface *interface); + +/// UsbHsClientIfSession +/// Closes the specified interface session. +void HsIfClose(UsbHsClientIfSession* s); + +/// Returns whether the specified interface session was initialized. +bool HsIfIsActive(UsbHsClientIfSession* s); + +/// Returns the ID which can be used for comparing with the ID in the output interfaces from \ref usbHsQueryAcquiredInterfaces. +s32 HsIfGetID(UsbHsClientIfSession* s); + +/** + * @brief Selects an interface. + * @param[in] s The service object. + * @param[out] inf The output interface info. If NULL, the output is stored within s instead. + * @param[in] id ID + */ +Result HsIfSetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id); + +/** + * @brief Gets an interface. + * @param[in] s The service object. + * @param[out] inf The output interface info. If NULL, the output is stored within s instead. + */ +Result HsIfGetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf); + +/** + * @brief Gets an alternate interface. + * @param[in] s The service object. + * @param[out] inf The output interface info. If NULL, the output is stored within s instead. + * @param[in] id ID + */ +Result HsIfGetAlternateInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id); + +/// On [1.0.0] this is stubbed, just returns 0 with out=0. +Result HsIfGetCurrentFrame(UsbHsClientIfSession* s, u32* out); + +/// Uses a control transfer, this will block until the transfer finishes. The buffer address and size should be aligned to 0x1000-bytes, where wLength is the original size. +Result HsIfCtrlXfer(UsbHsClientIfSession* s, u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, void* buffer, u32* transferredSize); + +/** + * @brief Opens an endpoint. maxUrbCount*maxXferSize must be non-zero. + * @param[in] s The interface object. + * @param[out] ep The endpoint object. + * @param[in] maxUrbCount maxUrbCount, must be <0x11. + * @param[in] maxXferSize Max transfer size for a packet. This can be desc->wMaxPacketSize. Must be <=0xFF0000. + * @param[in] desc Endpoint descriptor. + */ +Result HsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 maxUrbCount, u32 maxXferSize, struct usb_endpoint_descriptor *desc); + +/// Resets the device: has the same affect as unplugging the device and plugging it back in. +Result HsIfResetDevice(UsbHsClientIfSession* s); + +/// UsbHsClientEpSession +/// Closes the specified endpoint session. +void HsEpClose(UsbHsClientEpSession* s); + +/// Gets the Xfer Event which is signaled when PostBufferAsync finishes. This is only valid for [2.0.0+]. If using \ref eventWait with this, then \ref eventClear should be used if the event was signaled (since the autoclear is false). +Event* HsEpGetXferEvent(UsbHsClientEpSession* s); + +/// Gets the buffer size to use with \ref usbHsEpShareReportRing. +u32 HsEpGetReportRingSize(UsbHsClientEpSession* s); + +/** + * @brief Starts an async data transfer with the specified endpoint. The Event from \ref usbHsEpGetXferEvent can be used to determine when the transfer finished. If you don't need async, \ref usbHsEpPostBuffer can be used instead. + * @note Only available on [2.0.0+]. + * @param[in] s The endpoint object. + * @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes. + * @param[in] size The actual data size. + * @param[in] id This is an arbitrary value which will be later returned in \ref UsbHsXferReport. For example a value starting at 0 can be used, then if sending multiple requests at once this value can be incremented each time (with 0 for the first request in this set of requests). + * @param[out] xferId Output xferId. + */ +Result HsEpPostBufferAsync(UsbHsClientEpSession* s, void* buffer, u32 size, u64 id, u32* xferId); + +/** + * @brief Gets an array of \ref UsbHsXferReport for the specified endpoint. This should be used after waiting on the Event from \ref usbHsEpGetXferEvent. + * @note Only available on [2.0.0+]. + * @param[in] s The endpoint object. + * @param[out] reports Output array of \ref UsbHsXferReport. + * @param[in] max_reports Size of the reports array in entries. + * @param[out] count Number of entries written to the array. + */ +Result HsEpGetXferReport(UsbHsClientEpSession* s, UsbHsXferReport* reports, u32 max_reports, u32* count); + +/** + * @brief Uses a data transfer with the specified endpoint, this will block until the transfer finishes. This wraps \ref usbHsEpPostBufferAsync and \ref usbHsEpGetXferReport, and also handles the Event (on pre-2.0.0 this handles using the relevant cmds instead). If async is needed, use \ref usbHsEpPostBufferAsync instead. + * @param[in] s The endpoint object. + * @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes. + * @param[in] size The actual data size. + * @param[out] transferredSize Output transferred size. + */ +Result HsEpPostBuffer(UsbHsClientEpSession* s, void* buffer, u32 size, u32* transferredSize); + +/** + * @brief This uses the same functionality internally as \ref usbHsEpPostBufferAsync except the urbs array and unk1/unk2 are specified by the user instead. + * @note Only available on [2.0.0+]. + * @param[in] s The endpoint object. + * @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes. + * @param[in] urbs Input array of u32s for the size of each urb. + * @param[in] urbCount Total entries in the urbs array. + * @param[in] id Same as \ref usbHsEpPostBufferAsync. + * @param[in] unk1 \ref usbHsEpPostBufferAsync would internally pass value 0 here. + * @param[in] unk2 \ref usbHsEpPostBufferAsync would internally pass value 0 here. + * @param[out] xferId Output xferId. + */ +Result HsEpBatchBufferAsync(UsbHsClientEpSession* s, void* buffer, u32* urbs, u32 urbCount, u64 id, u32 unk1, u32 unk2, u32* xferId); + +/** + * @brief This can be used to map the specified buffer as devicemem, which can then be used with \ref usbHsEpPostBufferAsync / \ref usbHsEpPostBuffer / \ref usbHsEpBatchBufferAsync. If the buffer address passed to those funcs is within this SmmuSpace, the specified buffer must be within the bounds of the SmmuSpace buffer. + * @note Only available on [4.0.0+]. + * @note A buffer from usbHsEpCreateSmmuSpace can't be reused by another endpoint with the aforementioned funcs. + * @note This can only be used once per UsbHsClientEpSession object. + * @param[in] s The endpoint object. + * @param buffer Buffer address, this must be aligned to 0x1000-bytes. + * @param[in] size Buffer size, this must be aligned to 0x1000-bytes. + */ +Result HsEpCreateSmmuSpace(UsbHsClientEpSession* s, void* buffer, u32 size); + +/** + * @brief This creates TransferMemory which is used to read \ref UsbHsXferReport when \ref usbHsEpGetXferReport is used, instead of using the service cmd. + * @note Only available on [4.0.0+]. + * @param buffer Buffer, must be 0x1000-byte aligned. + * @param[in] size Buffer size, \ref usbHsEpGetReportRingSize can be used to calculate this. + */ +Result HsEpShareReportRing(UsbHsClientEpSession* s, void* buffer, size_t size); + +} // namespace usb + +/// @brief C++ wrappers for the `utf` API. +/// @details Wraps: switch/runtime/util/utf.h. +namespace utf { + +/** Convert a UTF-8 sequence into a UTF-32 codepoint + * + * @param[out] out Output codepoint + * @param[in] in Input sequence + * + * @returns number of input code units consumed + * @returns -1 for error + */ +ssize_t DecodeUtf8(uint32_t *out, const uint8_t *in); + +/** Convert a UTF-16 sequence into a UTF-32 codepoint + * + * @param[out] out Output codepoint + * @param[in] in Input sequence + * + * @returns number of input code units consumed + * @returns -1 for error + */ +ssize_t DecodeUtf16(uint32_t *out, const uint16_t *in); + +/** Convert a UTF-32 codepoint into a UTF-8 sequence + * + * @param[out] out Output sequence + * @param[in] in Input codepoint + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out must be able to store 4 code units + */ +ssize_t EncodeUtf8(uint8_t *out, uint32_t in); + +/** Convert a UTF-32 codepoint into a UTF-16 sequence + * + * @param[out] out Output sequence + * @param[in] in Input codepoint + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out must be able to store 2 code units + */ +ssize_t EncodeUtf16(uint16_t *out, uint32_t in); + +/** Convert a UTF-8 sequence into a UTF-16 sequence + * + * Fills the output buffer up to \a len code units. + * Returns the number of code units that the input would produce; + * if it returns greater than \a len, the output has been + * truncated. + * + * @param[out] out Output sequence + * @param[in] in Input sequence (null-terminated) + * @param[in] len Output length + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out is not null-terminated + */ +ssize_t Utf8ToUtf16(uint16_t *out, const uint8_t *in, size_t len); + +/** Convert a UTF-8 sequence into a UTF-32 sequence + * + * Fills the output buffer up to \a len code units. + * Returns the number of code units that the input would produce; + * if it returns greater than \a len, the output has been + * truncated. + * + * @param[out] out Output sequence + * @param[in] in Input sequence (null-terminated) + * @param[in] len Output length + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out is not null-terminated + */ +ssize_t Utf8ToUtf32(uint32_t *out, const uint8_t *in, size_t len); + +/** Convert a UTF-16 sequence into a UTF-8 sequence + * + * Fills the output buffer up to \a len code units. + * Returns the number of code units that the input would produce; + * if it returns greater than \a len, the output has been + * truncated. + * + * @param[out] out Output sequence + * @param[in] in Input sequence (null-terminated) + * @param[in] len Output length + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out is not null-terminated + */ +ssize_t Utf16ToUtf8(uint8_t *out, const uint16_t *in, size_t len); + +/** Convert a UTF-16 sequence into a UTF-32 sequence + * + * Fills the output buffer up to \a len code units. + * Returns the number of code units that the input would produce; + * if it returns greater than \a len, the output has been + * truncated. + * + * @param[out] out Output sequence + * @param[in] in Input sequence (null-terminated) + * @param[in] len Output length + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out is not null-terminated + */ +ssize_t Utf16ToUtf32(uint32_t *out, const uint16_t *in, size_t len); + +/** Convert a UTF-32 sequence into a UTF-8 sequence + * + * Fills the output buffer up to \a len code units. + * Returns the number of code units that the input would produce; + * if it returns greater than \a len, the output has been + * truncated. + * + * @param[out] out Output sequence + * @param[in] in Input sequence (null-terminated) + * @param[in] len Output length + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out is not null-terminated + */ +ssize_t Utf32ToUtf8(uint8_t *out, const uint32_t *in, size_t len); + +/** Convert a UTF-32 sequence into a UTF-16 sequence + * + * @param[out] out Output sequence + * @param[in] in Input sequence (null-terminated) + * @param[in] len Output length + * + * @returns number of output code units produced + * @returns -1 for error + * + * @note \a out is not null-terminated + */ +ssize_t Utf32ToUtf16(uint16_t *out, const uint32_t *in, size_t len); + +} // namespace utf + +/// @brief C++ wrappers for the `utimer` API. +/// @details Wraps: switch/kernel/utimer.h. +namespace utimer { + +/// Valid types for a user-mode timer. +using ::TimerType; +using ::UTimer; + +/** + * @brief Creates a user-mode timer. + * @param[out] t UTimer object. + * @param[in] interval Interval (in nanoseconds). + * @param[in] type Type of timer to create (see \ref TimerType). + * @note The timer is stopped when it is created. Use \ref utimerStart to start it. + * @note It is safe to wait on this timer with several threads simultaneously. + * @note If more than one thread is listening on it, at least one thread will get the signal. No other guarantees. + * @note For a repeating timer: If the timer triggers twice before you wait on it, you will only get one signal. + */ +void Create(UTimer* t, u64 interval, TimerType type); + +/** + * @brief Starts the timer. + * @param[in] t UTimer object. + */ +void Start(UTimer* t); + +/** + * @brief Stops the timer. + * @param[in] t UTimer object. + */ +void Stop(UTimer* t); + +} // namespace utimer + +/// @brief C++ wrappers for the `vi` API. +/// @details Wraps: switch/services/vi.h. +namespace vi { + +/// Used as argument for certain drawing commands. +using ::ViColorRgba4444; +using ::ViColorRgba8888; +using ::ViDisplay; +using ::ViDisplayName; +using ::ViLayer; +/// Used by viCreateLayer when CreateStrayLayer is used internally. +using ::ViLayerFlags; +/// Used as argument to many capture functions. +using ::ViLayerStack; +/// Used with viSetDisplayPowerState. +using ::ViPowerState; +/// Used with viSetLayerScalingMode. +using ::ViScalingMode; +using ::ViServiceType; + +Result Initialize(ViServiceType service_type); + +void Exit(void); + +Service* GetSession_IApplicationDisplayService(void); + +Service* GetSession_IHOSBinderDriverRelay(void); + +Service* GetSession_ISystemDisplayService(void); + +Service* GetSession_IManagerDisplayService(void); + +Service* GetSession_IHOSBinderDriverIndirect(void); + +Result SetContentVisibility(bool v); + +Result OpenDisplay(const char *display_name, ViDisplay *display); + +Result CloseDisplay(ViDisplay *display); + +Result OpenDefaultDisplay(ViDisplay *display); + +Result GetDisplayResolution(ViDisplay *display, s32 *width, s32 *height); + +Result GetDisplayLogicalResolution(ViDisplay *display, s32 *width, s32 *height); + +/// Only available on [3.0.0+]. +Result SetDisplayMagnification(ViDisplay *display, s32 x, s32 y, s32 width, s32 height); + +Result GetDisplayVsyncEvent(ViDisplay *display, Event *event_out); + +Result SetDisplayPowerState(ViDisplay *display, ViPowerState state); + +Result SetDisplayAlpha(ViDisplay *display, float alpha); + +Result GetZOrderCountMin(ViDisplay *display, s32 *z); + +Result GetZOrderCountMax(ViDisplay *display, s32 *z); + +Result CreateLayer(const ViDisplay *display, ViLayer *layer); + +Result CreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id); + +Result SetLayerSize(ViLayer *layer, s32 width, s32 height); + +Result SetLayerZ(ViLayer *layer, s32 z); + +Result SetLayerPosition(ViLayer *layer, float x, float y); + +Result CloseLayer(ViLayer *layer); + +Result DestroyManagedLayer(ViLayer *layer); + +Result SetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode); + +Result GetIndirectLayerImageMap(void* buffer, size_t size, s32 width, s32 height, u64 IndirectLayerConsumerHandle, u64 *out_size, u64 *out_stride); + +Result GetIndirectLayerImageRequiredMemoryInfo(s32 width, s32 height, u64 *out_size, u64 *out_alignment); + +Result ManagerPrepareFatal(void); + +///< [16.0.0+] +Result ManagerShowFatal(void); + +///< [16.0.0+] +Result ManagerDrawFatalRectangle(s32 x, s32 y, s32 end_x, s32 end_y, ViColorRgba4444 color); + +///< [16.0.0+] +Result ManagerDrawFatalText32(s32 *out_advance, s32 x, s32 y, const u32 *utf32_codepoints, size_t num_codepoints, float scale_x, float scale_y, PlSharedFontType font_type, ViColorRgba8888 bg_color, ViColorRgba8888 fg_color, s32 initial_advance); + +} // namespace vi + +/// @brief C++ wrappers for the `virtmem` API. +/// @details Wraps: switch/kernel/virtmem.h. +namespace virtmem { + +/// Address space reservation type (see \ref virtmemAddReservation) +using ::VirtmemReservation; + +/// Locks the virtual memory manager mutex. +void Lock(void); + +/// Unlocks the virtual memory manager mutex. +void Unlock(void); + +/** + * @brief Finds a random slice of free general purpose address space. + * @param size Desired size of the slice (rounded up to page alignment). + * @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment). + * @return Pointer to the slice of address space, or NULL on failure. + * @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock). + */ +void* FindAslr(size_t size, size_t guard_size); + +/** + * @brief Finds a random slice of free stack address space. + * @param size Desired size of the slice (rounded up to page alignment). + * @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment). + * @return Pointer to the slice of address space, or NULL on failure. + * @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock). + */ +void* FindStack(size_t size, size_t guard_size); + +/** + * @brief Finds a random slice of free code memory address space. + * @param size Desired size of the slice (rounded up to page alignment). + * @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment). + * @return Pointer to the slice of address space, or NULL on failure. + * @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock). + */ +void* FindCodeMemory(size_t size, size_t guard_size); + +/** + * @brief Reserves a range of memory address space. + * @param mem Pointer to the address space slice. + * @param size Size of the slice. + * @return Pointer to a reservation object, or NULL on failure. + * @remark This function is intended to be used in lieu of a memory map operation when the memory won't be mapped straight away. + * @note The virtual memory manager mutex must be held during the find-and-reserve process (see \ref virtmemLock and \ref virtmemUnlock). + */ +VirtmemReservation* AddReservation(void* mem, size_t size); + +/** + * @brief Releases a memory address space reservation. + * @param rv Reservation to release. + * @note The virtual memory manager mutex must be held before calling this function (see \ref virtmemLock and \ref virtmemUnlock). + */ +void RemoveReservation(VirtmemReservation* rv); + +} // namespace virtmem + +/// @brief C++ wrappers for the `wait` API. +/// @details Wraps: switch/kernel/wait.h. +namespace wait { + +using ::Waitable; +using ::WaitableMethods; +using ::WaitableNode; +/// Waiter structure, representing any generic waitable synchronization object; both kernel-mode and user-mode. +using ::Waiter; +using ::WaiterType; + +/** + * @brief Waits for an arbitrary number of generic waitable synchronization objects, optionally with a timeout. + * @param[out] idx_out Variable that will received the index of the signalled object. + * @param[in] objects Array containing \ref Waiter structures. + * @param[in] num_objects Number of objects in the array. + * @param[in] timeout Timeout (in nanoseconds). + * @return Result code. + * @note The number of objects must not be greater than \ref MAX_WAIT_OBJECTS. This is a Horizon kernel limitation. + */ +Result Objects(s32* idx_out, const Waiter* objects, s32 num_objects, u64 timeout); + +/** + * @brief Waits for an arbitrary number of kernel synchronization objects, optionally with a timeout. This function replaces \ref svcWaitSynchronization. + * @param[out] idx_out Variable that will received the index of the signalled object. + * @param[in] handles Array containing handles. + * @param[in] num_handles Number of handles in the array. + * @param[in] timeout Timeout (in nanoseconds). + * @return Result code. + * @note The number of objects must not be greater than \ref MAX_WAIT_OBJECTS. This is a Horizon kernel limitation. + */ +Result Handles(s32* idx_out, const Handle* handles, s32 num_handles, u64 timeout); + +/** + * @brief Waits on a single generic waitable synchronization object, optionally with a timeout. + * @param[in] w \ref Waiter structure. + * @param[in] timeout Timeout (in nanoseconds). + */ +Result Single(Waiter w, u64 timeout); + +/** + * @brief Waits for a single kernel synchronization object, optionally with a timeout. + * @param[in] h \ref Handle of the object. + * @param[in] timeout Timeout (in nanoseconds). + */ +Result SingleHandle(Handle h, u64 timeout); + +} // namespace wait + +/// @brief C++ wrappers for the `waiter` API. +/// @details Wraps: switch/kernel/event.h, switch/kernel/thread.h, switch/kernel/uevent.h, switch/kernel/utimer.h, switch/kernel/wait.h. +namespace waiter { + +/// Kernel-mode event structure. +using ::Event; +/// Thread information structure. +using ::Thread; +/// Valid types for a user-mode timer. +using ::TimerType; +using ::UEvent; +using ::UTimer; +using ::Waitable; +using ::WaitableMethods; +using ::WaitableNode; +/// Waiter structure, representing any generic waitable synchronization object; both kernel-mode and user-mode. +using ::Waiter; +using ::WaiterType; + +/// Creates a \ref Waiter for a kernel-mode event. +Waiter ForEvent(Event* t); + +/// Creates a \ref Waiter for a \ref Thread. +Waiter ForThread(Thread* t); + +/// Creates a waiter for a user-mode event. +Waiter ForUEvent(UEvent* e); + +/// Creates a waiter for a user-mode timer. +Waiter ForUTimer(UTimer* t); + +/// Creates a \ref Waiter for a kernel-mode \ref Handle. +Waiter ForHandle(Handle h); + +} // namespace waiter + +/// @brief C++ wrappers for the `web` API. +/// @details Wraps: switch/applets/web.h. +namespace web { + +/// Header struct at offset 0 in the web Arg storage (non-webWifi). +using ::WebArgHeader; +/// Web TLV used in the web Arg storage. +using ::WebArgTLV; +/// Types for \ref WebArgTLV, input storage. +using ::WebArgType; +/// Kind values for \ref webConfigSetBackgroundKind. Controls the background color while displaying the loading screen during applet boot. Only used when \ref WebBootDisplayKind is ::WebBootDisplayKind_Default. If the applet was not launched by an Application, the applet will only use WebBackgroundKind_Default. +using ::WebBackgroundKind; +/// Kind values for \ref webConfigSetBootDisplayKind. Controls the background color while displaying the loading screen during applet boot. Also controls the BackgroundKind when value is non-zero. +using ::WebBootDisplayKind; +/// Entry data for ::WebArgType_BootFooterButton. +using ::WebBootFooterButtonEntry; +/// Config struct for web applets, non-WebWifi. +using ::WebCommonConfig; +/// Common container struct for applets' reply data, from the output storage. +using ::WebCommonReply; +/// Common struct for the applet output storage, for non-TLV-storage. +using ::WebCommonReturnValue; +/// TLV storage, starts with \ref WebArgHeader followed by \ref WebArgTLV entries. +using ::WebCommonTLVStorage; +/// This controls the kind of content to mount with Offline-applet. +using ::WebDocumentKind; +/// ExitReason +using ::WebExitReason; +/// Button values for \ref webConfigSetBootFooterButtonVisible. +using ::WebFooterButtonId; +/// Kind values for \ref webConfigSetFooterFixedKind. Controls UI footer display behaviour. +using ::WebFooterFixedKind; +/// Mode values for \ref webConfigSetLeftStickMode. Controls the initial mode, this can be toggled by the user via the pressing the left-stick button. If the Pointer flag is set to false (\ref webConfigSetPointer), only ::WebLeftStickMode_Cursor will be used and mode toggle by the user is disabled (input value ignored). +using ::WebLeftStickMode; +/// Types for \ref WebArgTLV, output storage. +using ::WebReplyType; +/// WebSession +using ::WebSession; +/// WebSessionBootMode +using ::WebSessionBootMode; +/// SessionMessageHeader +using ::WebSessionMessageHeader; +/// WebSessionReceiveMessageKind +using ::WebSessionReceiveMessageKind; +/// WebSessionSendMessageKind +using ::WebSessionSendMessageKind; +/// StorageHandleQueue +using ::WebSessionStorageHandleQueue; +/// This controls the initial page for ShareApplet, used by \ref webShareCreate. +using ::WebShareStartPage; +/// This indicates the type of web-applet. +using ::WebShimKind; +/// Config for WebWifi. +using ::WebWifiConfig; +/// Struct for the WebWifi applet input storage. +using ::WebWifiPageArg; +/// Struct for the WebWifi applet output storage. +using ::WebWifiReturnValue; + +/** + * @brief Creates the config for WifiWebAuthApplet. This is the captive portal applet. + * @param config WebWifiConfig object. + * @param conntest_url URL used for the connection-test requests. When empty/NULL the applet will test the connection with nifm and throw an error on failure. + * @param initial_url Initial URL navigated to by the applet. + * @param uuid NIFM Network UUID, for nifm cmd SetNetworkProfileId. Value 0 can be used. Only used by the applet when conntest_url is set. + * @param rev Input value for nifm cmd SetRequirementByRevision. Value 0 can be used. Only used by the applet when conntest_url is set. + */ +void WifiCreate(WebWifiConfig* config, const char* conntest_url, const char* initial_url, Uuid uuid, u32 rev); + +/** + * @brief Launches WifiWebAuthApplet with the specified config and waits for it to exit. + * @param config WebWifiConfig object. + * @param out Optional output applet reply data, can be NULL. + */ +Result WifiShow(WebWifiConfig* config, WebWifiReturnValue *out); + +/** + * @brief Creates the config for WebApplet. This applet uses an URL whitelist loaded from the user-process host Application, which is only loaded when running under an Application. + * @note Sets ::WebArgType_UnknownD, and ::WebArgType_Unknown12 on pre-3.0.0, to value 1. + * @param config WebCommonConfig object. + * @param url Initial URL navigated to by the applet. + */ +Result PageCreate(WebCommonConfig* config, const char* url); + +/** + * @brief Creates the config for WebApplet. This is based on \ref webPageCreate, for News. Hence other functions referencing \ref webPageCreate also apply to this. + * @note The domain from the input URL is automatically whitelisted, in addition to any already loaded whitelist. + * @note Sets ::WebArgType_UnknownD to value 1, and sets ::WebArgType_NewsFlag to true. Also uses \ref webConfigSetEcClientCert and \ref webConfigSetShopJump with flag=true. + * @param config WebCommonConfig object. + * @param url Initial URL navigated to by the applet. + */ +Result NewsCreate(WebCommonConfig* config, const char* url); + +/** + * @brief Creates the config for WebApplet. This is based on \ref webPageCreate, for YouTubeVideo. Hence other functions referencing \ref webPageCreate also apply to this. This uses a whitelist which essentially only allows youtube embed/ URLs (without mounting content from the host Application). + * @note This is only available on [5.0.0+]. + * @note Sets ::WebArgType_UnknownD to value 1, and sets ::WebArgType_YouTubeVideoFlag to true. Also uses \ref webConfigSetBootAsMediaPlayer with flag=true. + * @param config WebCommonConfig object. + * @param url Initial URL navigated to by the applet. + */ +Result YouTubeVideoCreate(WebCommonConfig* config, const char* url); + +/** + * @brief Creates the config for Offline-applet. This applet uses data loaded from content. + * @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor and sets ::WebArgType_BootAsMediaPlayerInverted to false. Uses \ref webConfigSetPointer with flag = docKind == ::WebDocumentKind_OfflineHtmlPage. + * @note For docKind ::WebDocumentKind_ApplicationLegalInformation / ::WebDocumentKind_SystemDataPage, uses \ref webConfigSetFooter with flag=true and \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Default. + * @note For docKind ::WebDocumentKind_SystemDataPage, uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_White. + * @note Sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. With docKind ::WebDocumentKind_ApplicationLegalInformation, uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_White. + * @note Sets ::WebArgType_UnknownC to value 1. + * @note With docKind ::WebDocumentKind_ApplicationLegalInformation, uses \ref webConfigSetEcClientCert with flag=true. + * @note With docKind ::WebDocumentKind_OfflineHtmlPage on pre-3.0.0, sets ::WebArgType_Unknown12 to value 1. + * @note Lastly, sets the TLVs as needed for the input params. + * @param config WebCommonConfig object. + * @param docKind \ref WebDocumentKind + * @param id Id to load the content from. With docKind = ::WebDocumentKind_OfflineHtmlPage, id=0 should be used to specify the user-process application (non-zero is ignored with this docKind). + * @param docPath Initial document path in RomFS, without the leading '/'. For ::WebDocumentKind_OfflineHtmlPage, this is relative to "html-document/" in RomFS. For the other docKind values, this is relative to "/" in RomFS. This path must contain ".htdocs/". + */ +Result OfflineCreate(WebCommonConfig* config, WebDocumentKind docKind, u64 id, const char* docPath); + +/** + * @brief Creates the config for ShareApplet. This applet is for social media posting/settings. + * @note If a non-zero uid isn't set with \ref webConfigSetUid prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account. + * @note An error will be displayed if neither \ref webConfigSetAlbumEntry, nor \ref webConfigSetApplicationAlbumEntry, nor \ref webConfigAddAlbumEntryAndMediaData are used prior to using \ref webConfigShow, with ::WebShareStartPage_Default. + * @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetUid with uid=0, \ref webConfigSetDisplayUrlKind with kind=true, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown3. + * @param config WebCommonConfig object. + * @param page \ref WebShareStartPage + */ +Result ShareCreate(WebCommonConfig* config, WebShareStartPage page); + +/** + * @brief Creates the config for LobbyApplet. This applet is for "Nintendo Switch Online Lounge". + * @note Only available on [2.0.0+]. + * @note If a non-zero uid isn't set with \ref webConfigSetUid prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account. + * @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetPointer with flag=false on [3.0.0+], \ref webConfigSetUid with uid=0, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown4, \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Unknown2, and sets ::WebArgType_BootAsMediaPlayerInverted to false. + * @param config WebCommonConfig object. + */ +Result LobbyCreate(WebCommonConfig* config); + +/** + * @brief Sets the CallbackUrl. See also \ref webReplyGetLastUrl. + * @note With Offline-applet for LastUrl handling, it compares the domain with "localhost" instead. + * @note Only available with config created by \ref webPageCreate or with Share-applet. + * @param config WebCommonConfig object. + * @param url URL + */ +Result ConfigSetCallbackUrl(WebCommonConfig* config, const char* url); + +/** + * @brief Sets the CallbackableUrl. + * @note Only available with config created by \ref webPageCreate. + * @param config WebCommonConfig object. + * @param url URL + */ +Result ConfigSetCallbackableUrl(WebCommonConfig* config, const char* url); + +/** + * @brief Sets the whitelist. + * @note Only available with config created by \ref webPageCreate. + * @note If the whitelist isn't formatted properly, the applet will exit briefly after the applet is launched. + * @param config WebCommonConfig object. + * @param whitelist Whitelist string, each line is a regex for each whitelisted URL. + */ +Result ConfigSetWhitelist(WebCommonConfig* config, const char* whitelist); + +/** + * @brief Sets the account uid. Controls which user-specific savedata to mount. + * @note Only available with config created by \ref webPageCreate, \ref webLobbyCreate, or with Share-applet. + * @note Used automatically by \ref webShareCreate and \ref webLobbyCreate with uid=0. + * @param config WebCommonConfig object. + * @param uid \ref AccountUid + */ +Result ConfigSetUid(WebCommonConfig* config, AccountUid uid); + +/** + * @brief Sets the Share CapsAlbumEntry. + * @note Only available with config created by \ref webShareCreate. + * @param config WebCommonConfig object. + * @param entry \ref CapsAlbumEntry + */ +Result ConfigSetAlbumEntry(WebCommonConfig* config, const CapsAlbumEntry *entry); + +/** + * @brief Sets the ScreenShot flag, which controls whether screen-shot capture is allowed. + * @note Only available with config created by \ref webPageCreate. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetScreenShot(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the EcClientCert flag. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate. + * @note Used automatically by \ref webOfflineCreate, depending on the docKind. + * @note Used automatically by \ref webNewsCreate with flag=true. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetEcClientCert(WebCommonConfig* config, bool flag); + +/** + * @brief Sets whether PlayReport is enabled. + * @note Only available with config created by \ref webOfflineCreate. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetPlayReport(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the BootDisplayKind. + * @note Only available with config created by \ref webOfflineCreate, \ref webShareCreate, \ref webPageCreate, or \ref webLobbyCreate.. + * @note Used automatically by \ref webOfflineCreate, depending on the docKind. + * @note Used automatically by \ref webShareCreate with kind=::WebBootDisplayKind_Unknown3. + * @note Used automatically by \ref webLobbyCreate with kind=::WebBootDisplayKind_Unknown4. + * @param config WebCommonConfig object. + * @param kind \ref WebBootDisplayKind + */ +Result ConfigSetBootDisplayKind(WebCommonConfig* config, WebBootDisplayKind kind); + +/** + * @brief Sets the BackgroundKind. + * @note Only available with config created by \ref webOfflineCreate, \ref webPageCreate, or \ref webLobbyCreate. + * @note Used automatically by \ref webOfflineCreate, depending on the docKind. + * @note Used automatically by \ref webLobbyCreate with kind=2. + * @param config WebCommonConfig object. + * @param kind \ref WebBackgroundKind + */ +Result ConfigSetBackgroundKind(WebCommonConfig* config, WebBackgroundKind kind); + +/** + * @brief Sets the whether the UI footer is enabled. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate. + * @note Used automatically by \ref webOfflineCreate, depending on the docKind. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetFooter(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the whether the Pointer is enabled. See also \ref WebLeftStickMode. + * @note Only available with config created by \ref webOfflineCreate, \ref webPageCreate, or \ref webLobbyCreate. + * @note Used automatically by \ref webOfflineCreate. + * @note Used automatically by \ref webLobbyCreate with flag=false on [3.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetPointer(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the LeftStickMode. + * @note Only available with config created by \ref webOfflineCreate, \ref webShareCreate, \ref webPageCreate, or \ref webLobbyCreate. + * @note Used automatically by \ref webOfflineCreate, \ref webShareCreate, and \ref webLobbyCreate with ::WebLeftStickMode_Cursor. + * @param config WebCommonConfig object. + * @param mode Mode, different enums for Web and Offline. + */ +Result ConfigSetLeftStickMode(WebCommonConfig* config, WebLeftStickMode mode); + +/** + * @brief Sets the KeyRepeatFrame. + * @note Only available with config created by \ref webOfflineCreate. + * @param config WebCommonConfig object. + * @param inval0 First input param. + * @param inval1 Second input param. + */ +Result ConfigSetKeyRepeatFrame(WebCommonConfig* config, s32 inval0, s32 inval1); + +/** + * @brief Sets the DisplayUrlKind. + * @note Only available with config created by \ref webShareCreate or \ref webPageCreate. + * @param config WebCommonConfig object. + * @note Used automatically by \ref webShareCreate with kind=true. + * @param kind Kind + */ +Result ConfigSetDisplayUrlKind(WebCommonConfig* config, bool kind); + +/** + * @brief Sets the BootAsMediaPlayer flag. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [2.0.0+]. + * @note With config created by \ref webNewsCreate on [3.0.0+], this also sets ::WebArgType_BootAsMediaPlayerInverted to !flag. + * @param config WebCommonConfig object. + * @param flag Flag. true = BootAsMediaPlayer, false = BootAsWebPage. + */ +Result ConfigSetBootAsMediaPlayer(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the ShopJump flag. + * @note Only available with config created by \ref webPageCreate on [2.0.0+]. + * @note Used automatically by \ref webNewsCreate with flag=true. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetShopJump(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the MediaPlayerUserGestureRestriction flag. + * @note Only available with config created by \ref webPageCreate on [2.0.0-5.1.0]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetMediaPlayerUserGestureRestriction(WebCommonConfig* config, bool flag); + +/** + * @brief Sets whether MediaAutoPlay is enabled. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetMediaAutoPlay(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the LobbyParameter. + * @note Only available with config created by \ref webLobbyCreate. + * @param config WebCommonConfig object. + * @param str String + */ +Result ConfigSetLobbyParameter(WebCommonConfig* config, const char* str); + +/** + * @brief Sets the Share CapsApplicationAlbumEntry. + * @note Only available with config created by \ref webShareCreate on [3.0.0+]. + * @param config WebCommonConfig object. + * @param entry \ref CapsApplicationAlbumEntry, see also capssu.h. + */ +Result ConfigSetApplicationAlbumEntry(WebCommonConfig* config, CapsApplicationAlbumEntry *entry); + +/** + * @brief Sets whether JsExtension is enabled. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [3.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetJsExtension(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the Share AdditionalCommentText. + * @note Only available with config created by \ref webShareCreate on [4.0.0+]. + * @param config WebCommonConfig object. + * @param str String + */ +Result ConfigSetAdditionalCommentText(WebCommonConfig* config, const char* str); + +/** + * @brief Sets the TouchEnabledOnContents flag. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetTouchEnabledOnContents(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the UserAgentAdditionalString. " " followed by this string are appended to the normal User-Agent string. + * @note Only available with config created by \ref webPageCreate on [4.0.0+]. + * @param config WebCommonConfig object. + * @param str String + */ +Result ConfigSetUserAgentAdditionalString(WebCommonConfig* config, const char* str); + +/** + * @brief Sets the Share AdditionalMediaData. + * @note Only available with config created by \ref webShareCreate on [4.0.0+]. + * @param config WebCommonConfig object. + * @param data Input data + * @param size Size of the input data, max size is 0x10. + */ +Result ConfigSetAdditionalMediaData(WebCommonConfig* config, const u8* data, size_t size); + +/** + * @brief Sets the MediaPlayerAutoClose flag. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetMediaPlayerAutoClose(WebCommonConfig* config, bool flag); + +/** + * @brief Sets whether PageCache is enabled. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetPageCache(WebCommonConfig* config, bool flag); + +/** + * @brief Sets whether WebAudio is enabled. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetWebAudio(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the FooterFixedKind. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [5.0.0+]. + * @param config WebCommonConfig object. + * @param kind \ref WebFooterFixedKind + */ +Result ConfigSetFooterFixedKind(WebCommonConfig* config, WebFooterFixedKind kind); + +/** + * @brief Sets the PageFade flag. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [5.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetPageFade(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the Share MediaCreatorApplicationRatingAge. + * @note Only available with config created by \ref webShareCreate on [5.0.0+]. + * @param config WebCommonConfig object. + * @param data 0x20-byte input data + */ +Result ConfigSetMediaCreatorApplicationRatingAge(WebCommonConfig* config, const s8 *data); + +/** + * @brief Sets the BootLoadingIcon flag. + * @note Only available with config created by \ref webOfflineCreate on [5.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetBootLoadingIcon(WebCommonConfig* config, bool flag); + +/** + * @brief Sets the PageScrollIndicator flag. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [5.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetPageScrollIndicator(WebCommonConfig* config, bool flag); + +/** + * @brief Sets whether MediaPlayerSpeedControl is enabled. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetMediaPlayerSpeedControl(WebCommonConfig* config, bool flag); + +/** + * @brief Adds a pair of Share CapsAlbumEntry + optionally AdditionalMediaData. This can be used up to 4 times, for setting multiple pairs. + * @note Only available with config created by \ref webShareCreate on [6.0.0+]. + * @param config WebCommonConfig object. + * @param entry \ref CapsAlbumEntry + * @param data Input data for AdditionalMediaData. Optional, can be NULL. + * @param size Size of the input data, max size is 0x10. Optional, can be 0. + */ +Result ConfigAddAlbumEntryAndMediaData(WebCommonConfig* config, const CapsAlbumEntry *entry, const u8* data, size_t size); + +/** + * @brief Sets whether the specified BootFooterButton is visible. + * @note Only available with config created by \ref webOfflineCreate on [6.0.0+]. + * @param config WebCommonConfig object. + * @param button \ref WebFooterButtonId + * @param visible Visible flag. + */ +Result ConfigSetBootFooterButtonVisible(WebCommonConfig* config, WebFooterButtonId button, bool visible); + +/** + * @brief Sets OverrideWebAudioVolume. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. + * @param config WebCommonConfig object. + * @param value Value + */ +Result ConfigSetOverrideWebAudioVolume(WebCommonConfig* config, float value); + +/** + * @brief Sets OverrideMediaAudioVolume. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. + * @param config WebCommonConfig object. + * @param value Value + */ +Result ConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value); + +/** + * @brief Sets \ref WebSessionBootMode. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+]. + * @param config WebCommonConfig object. + * @param mode \ref WebSessionBootMode + */ +Result ConfigSetBootMode(WebCommonConfig* config, WebSessionBootMode mode); + +/** + * @brief Sets whether MediaPlayerUi is enabled. + * @note Only available with config created by \ref webOfflineCreate on [8.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetMediaPlayerUi(WebCommonConfig* config, bool flag); + +/** + * @brief Sets whether TransferMemory is enabled. + * @note Only available with config created by \ref webPageCreate on [11.0.0+]. + * @param config WebCommonConfig object. + * @param flag Flag + */ +Result ConfigSetTransferMemory(WebCommonConfig* config, bool flag); + +/** + * @brief Launches the {web applet} with the specified config and waits for it to exit. + * @param config WebCommonConfig object. + * @param out Optional output applet reply data, can be NULL. + */ +Result ConfigShow(WebCommonConfig* config, WebCommonReply *out); + +/** + * @brief Request the applet to exit after \ref webConfigShow was used, while the applet is still running. This is for use from another thread. + * @param config WebCommonConfig object. + */ +Result ConfigRequestExit(WebCommonConfig* config); + +/** + * @brief Gets the ExitReason from the specified reply. + * @param reply WebCommonReply object. + * @param exitReason Output \ref WebExitReason + */ +Result ReplyGetExitReason(WebCommonReply *reply, WebExitReason *exitReason); + +/** + * @brief Gets the LastUrl from the specified reply. When the applet loads a page where the beginning of the URL matches the URL from \ref webConfigSetCallbackUrl, the applet will exit and set LastUrl to that URL (exit doesn't occur when \ref webConfigSetCallbackableUrl was used). + * @note This is only available with ::WebExitReason_LastUrl (string is empty otherwise). + * @note If you want to allocate a string buffer on heap, you can call this with outstr=NULL/outstr_maxsize=0 to get the out_size, then call it again with the allocated buffer. + * @param reply WebCommonReply object. + * @param outstr Output string buffer. If NULL, the string is not loaded. + * @param outstr_maxsize Size of the buffer, including NUL-terminator. If outstr is set, this size must be >1. The size used for the actual string-copy is this size-1, to make sure the output is NUL-terminated (the entire buffer is cleared first). + * @param out_size Output string length including NUL-terminator, for the original input string in the reply loaded from a separate size field. + */ +Result ReplyGetLastUrl(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size); + +/** + * @brief Gets the SharePostResult from the specified reply. + * @note Only available with reply data from ShareApplet on [3.0.0+]. + * @param reply WebCommonReply object. + * @param sharePostResult Output sharePostResult + */ +Result ReplyGetSharePostResult(WebCommonReply *reply, u32 *sharePostResult); + +/** + * @brief Gets the PostServiceName from the specified reply. + * @note Only available with reply data from ShareApplet on [3.0.0+]. + * @note If you want to allocate a string buffer on heap, you can call this with outstr=NULL/outstr_maxsize=0 to get the out_size, then call it again with the allocated buffer. + * @param reply WebCommonReply object. + * @param outstr Output string buffer. If NULL, the string is not loaded. + * @param outstr_maxsize Size of the buffer, including NUL-terminator. If outstr is set, this size must be >1. The size used for the actual string-copy is this size-1, to make sure the output is NUL-terminated (the entire buffer is cleared first). + * @param out_size Output string length including NUL-terminator, for the original input string in the reply loaded from a separate size field. + */ +Result ReplyGetPostServiceName(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size); + +/** + * @brief Gets the PostId from the specified reply. + * @note Only available with reply data from ShareApplet on [3.0.0+]. + * @note If you want to allocate a string buffer on heap, you can call this with outstr=NULL/outstr_maxsize=0 to get the out_size, then call it again with the allocated buffer. + * @param reply WebCommonReply object. + * @param outstr Output string buffer. If NULL, the string is not loaded. + * @param outstr_maxsize Size of the buffer, including NUL-terminator. If outstr is set, this size must be >1. The size used for the actual string-copy is this size-1, to make sure the output is NUL-terminated (the entire buffer is cleared first). + * @param out_size Output string length including NUL-terminator, for the original input string in the reply loaded from a separate size field. + */ +Result ReplyGetPostId(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size); + +/** + * @brief Gets the MediaPlayerAutoClosedByCompletion flag from the specified reply. + * @note Only available with reply data from Web on [8.0.0+]. + * @param reply WebCommonReply object. + * @param flag Output flag + */ +Result ReplyGetMediaPlayerAutoClosedByCompletion(WebCommonReply *reply, bool *flag); + +/** + * @brief Creates a \ref WebSession object. + * @param s \ref WebSession + * @param config WebCommonConfig object. + */ +void SessionCreate(WebSession *s, WebCommonConfig* config); + +/** + * @brief Closes a \ref WebSession object. + * @param s \ref WebSession + */ +void SessionClose(WebSession *s); + +/** + * @brief Launches the applet for \ref WebSession. + * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+]. + * @note Do not use \ref webConfigShow when using WebSession. + * @param s \ref WebSession + * @param[out] out_event Output Event with autoclear=false, from \ref appletHolderGetExitEvent. Optional, can be NULL. + */ +Result SessionStart(WebSession *s, Event **out_event); + +/** + * @brief Waits for the applet to exit. + * @note This must be used before \ref webSessionClose, when \ref webSessionStart was used successfully. + * @param s \ref WebSession + * @param out Optional output applet reply data, can be NULL. + */ +Result SessionWaitForExit(WebSession *s, WebCommonReply *out); + +/** + * @brief Request the applet to exit. + * @note Use this instead of \ref webConfigRequestExit, when using WebSession. + * @param s \ref WebSession + */ +Result SessionRequestExit(WebSession *s); + +/** + * @brief Request the applet to Appear, this is only needed with ::WebSessionBootMode_AllForegroundInitiallyHidden. + * @note This should not be used before \ref webSessionStart. + * @param s \ref WebSession + * @param[out] flag Whether the message was sent successfully. + */ +Result SessionAppear(WebSession *s, bool *flag); + +/** + * @brief TrySendContentMessage + * @note This should not be used before \ref webSessionStart. + * @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension. + * @note The JS-side may ignore this if it's sent too soon after the applet launches. + * @param s \ref WebSession + * @param[in] content Input content NUL-terminated string. + * @param[in] size Size of content. + * @param[out] flag Whether the message was sent successfully. + */ +Result SessionTrySendContentMessage(WebSession *s, const char *content, u32 size, bool *flag); + +/** + * @brief TryReceiveContentMessage + * @note This should not be used before \ref webSessionStart. + * @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension. + * @param s \ref WebSession + * @param[out] content Output content string, always NUL-terminated. + * @param[in] size Max size of content. + * @param[out] out_size Original content size, prior to being clamped to the specified size param. + * @param[out] flag Whether the message was received successfully. + */ +Result SessionTryReceiveContentMessage(WebSession *s, char *content, u64 size, u64 *out_size, bool *flag); + +} // namespace web + +/// @brief C++ wrappers for the `wlaninf` API. +/// @details Wraps: switch/services/wlaninf.h. +namespace wlaninf { + +/// WLAN State. +using ::WlanInfState; + +/// [1.0.0-14.1.2] Initialize wlan:inf. +Result Initialize(void); + +/// Exit wlan:inf. +void Exit(void); + +/// Gets the Service object for the actual wlan:inf service session. +Service* GetServiceSession(void); + +/// Gets \ref WlanInfState. +Result GetState(WlanInfState* out); + +/// Value goes from -30 (really good signal) to -90 (barely enough to stay connected) +/// on a logarithmic scale +Result GetRSSI(s32* out); + +} // namespace wlaninf + +} // namespace nx + +} // extern "C++" (linkage guard, do not remove) diff --git a/Source/hoc-clk/common/src/switch.cpp b/Source/hoc-clk/common/src/switch.cpp new file mode 100644 index 00000000..f1884e97 --- /dev/null +++ b/Source/hoc-clk/common/src/switch.cpp @@ -0,0 +1,4804 @@ +/** + * @file switch.hpp + * @brief Libnx C++ bindings (AUTO-GENERATED, do not edit). + * @copyright libnx Authors + */ +#include "switch.hpp" + +namespace nx { + +const char *CppBindingsVersion() { + return "libnx C++ bindings v1.0.0 (libnx feebd026)"; +} + +namespace account { + +Result Initialize(AccountServiceType service_type) { return ::accountInitialize(service_type); } +void Exit(void) { ::accountExit(); } +Service* GetServiceSession(void) { return ::accountGetServiceSession(); } +Result GetUserCount(s32* user_count) { return ::accountGetUserCount(user_count); } +Result ListAllUsers(AccountUid* uids, s32 max_uids, s32 *actual_total) { return ::accountListAllUsers(uids, max_uids, actual_total); } +Result GetLastOpenedUser(AccountUid *uid) { return ::accountGetLastOpenedUser(uid); } +Result GetProfile(AccountProfile* out, AccountUid uid) { return ::accountGetProfile(out, uid); } +Result IsUserRegistrationRequestPermitted(bool *out) { return ::accountIsUserRegistrationRequestPermitted(out); } +Result TrySelectUserWithoutInteraction(AccountUid *uid, bool is_network_service_account_required) { return ::accountTrySelectUserWithoutInteraction(uid, is_network_service_account_required); } +void ProfileClose(AccountProfile* profile) { ::accountProfileClose(profile); } +Result ProfileGet(AccountProfile* profile, AccountUserData* userdata, AccountProfileBase* profilebase) { return ::accountProfileGet(profile, userdata, profilebase); } +Result ProfileGetImageSize(AccountProfile* profile, u32* image_size) { return ::accountProfileGetImageSize(profile, image_size); } +Result ProfileLoadImage(AccountProfile* profile, void* buf, size_t len, u32* image_size) { return ::accountProfileLoadImage(profile, buf, len, image_size); } +Result GetPreselectedUser(AccountUid *uid) { return ::accountGetPreselectedUser(uid); } +bool UidIsValid(const AccountUid *Uid) { return ::accountUidIsValid(Uid); } + +} // namespace account + +namespace aes128 { + +void ContextCreate(Aes128Context *out, const void *key, bool is_encryptor) { ::aes128ContextCreate(out, key, is_encryptor); } +void EncryptBlock(const Aes128Context *ctx, void *dst, const void *src) { ::aes128EncryptBlock(ctx, dst, src); } +void DecryptBlock(const Aes128Context *ctx, void *dst, const void *src) { ::aes128DecryptBlock(ctx, dst, src); } +void CbcContextCreate(Aes128CbcContext *out, const void *key, const void *iv, bool is_encryptor) { ::aes128CbcContextCreate(out, key, iv, is_encryptor); } +void CbcContextResetIv(Aes128CbcContext *ctx, const void *iv) { ::aes128CbcContextResetIv(ctx, iv); } +size_t CbcEncrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes128CbcEncrypt(ctx, dst, src, size); } +size_t CbcDecrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes128CbcDecrypt(ctx, dst, src, size); } +void CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr) { ::aes128CtrContextCreate(out, key, ctr); } +void CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr) { ::aes128CtrContextResetCtr(ctx, ctr); } +void CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t size) { ::aes128CtrCrypt(ctx, dst, src, size); } +void XtsContextCreate(Aes128XtsContext *out, const void *key0, const void *key1, bool is_encryptor) { ::aes128XtsContextCreate(out, key0, key1, is_encryptor); } +void XtsContextResetTweak(Aes128XtsContext *ctx, const void *tweak) { ::aes128XtsContextResetTweak(ctx, tweak); } +void XtsContextResetSector(Aes128XtsContext *ctx, uint64_t sector, bool is_nintendo) { ::aes128XtsContextResetSector(ctx, sector, is_nintendo); } +size_t XtsEncrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes128XtsEncrypt(ctx, dst, src, size); } +size_t XtsDecrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes128XtsDecrypt(ctx, dst, src, size); } + +} // namespace aes128 + +namespace aes192 { + +void ContextCreate(Aes192Context *out, const void *key, bool is_encryptor) { ::aes192ContextCreate(out, key, is_encryptor); } +void EncryptBlock(const Aes192Context *ctx, void *dst, const void *src) { ::aes192EncryptBlock(ctx, dst, src); } +void DecryptBlock(const Aes192Context *ctx, void *dst, const void *src) { ::aes192DecryptBlock(ctx, dst, src); } +void CbcContextCreate(Aes192CbcContext *out, const void *key, const void *iv, bool is_encryptor) { ::aes192CbcContextCreate(out, key, iv, is_encryptor); } +void CbcContextResetIv(Aes192CbcContext *ctx, const void *iv) { ::aes192CbcContextResetIv(ctx, iv); } +size_t CbcEncrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes192CbcEncrypt(ctx, dst, src, size); } +size_t CbcDecrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes192CbcDecrypt(ctx, dst, src, size); } +void CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr) { ::aes192CtrContextCreate(out, key, ctr); } +void CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr) { ::aes192CtrContextResetCtr(ctx, ctr); } +void CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t size) { ::aes192CtrCrypt(ctx, dst, src, size); } +void XtsContextCreate(Aes192XtsContext *out, const void *key0, const void *key1, bool is_encryptor) { ::aes192XtsContextCreate(out, key0, key1, is_encryptor); } +void XtsContextResetTweak(Aes192XtsContext *ctx, const void *tweak) { ::aes192XtsContextResetTweak(ctx, tweak); } +void XtsContextResetSector(Aes192XtsContext *ctx, uint64_t sector, bool is_nintendo) { ::aes192XtsContextResetSector(ctx, sector, is_nintendo); } +size_t XtsEncrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes192XtsEncrypt(ctx, dst, src, size); } +size_t XtsDecrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes192XtsDecrypt(ctx, dst, src, size); } + +} // namespace aes192 + +namespace aes256 { + +void ContextCreate(Aes256Context *out, const void *key, bool is_encryptor) { ::aes256ContextCreate(out, key, is_encryptor); } +void EncryptBlock(const Aes256Context *ctx, void *dst, const void *src) { ::aes256EncryptBlock(ctx, dst, src); } +void DecryptBlock(const Aes256Context *ctx, void *dst, const void *src) { ::aes256DecryptBlock(ctx, dst, src); } +void CbcContextCreate(Aes256CbcContext *out, const void *key, const void *iv, bool is_encryptor) { ::aes256CbcContextCreate(out, key, iv, is_encryptor); } +void CbcContextResetIv(Aes256CbcContext *ctx, const void *iv) { ::aes256CbcContextResetIv(ctx, iv); } +size_t CbcEncrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes256CbcEncrypt(ctx, dst, src, size); } +size_t CbcDecrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes256CbcDecrypt(ctx, dst, src, size); } +void CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr) { ::aes256CtrContextCreate(out, key, ctr); } +void CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr) { ::aes256CtrContextResetCtr(ctx, ctr); } +void CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size) { ::aes256CtrCrypt(ctx, dst, src, size); } +void XtsContextCreate(Aes256XtsContext *out, const void *key0, const void *key1, bool is_encryptor) { ::aes256XtsContextCreate(out, key0, key1, is_encryptor); } +void XtsContextResetTweak(Aes256XtsContext *ctx, const void *tweak) { ::aes256XtsContextResetTweak(ctx, tweak); } +void XtsContextResetSector(Aes256XtsContext *ctx, uint64_t sector, bool is_nintendo) { ::aes256XtsContextResetSector(ctx, sector, is_nintendo); } +size_t XtsEncrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes256XtsEncrypt(ctx, dst, src, size); } +size_t XtsDecrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes256XtsDecrypt(ctx, dst, src, size); } + +} // namespace aes256 + +namespace album { + +Result LaShowAlbumFiles(void) { return ::albumLaShowAlbumFiles(); } +Result LaShowAllAlbumFiles(void) { return ::albumLaShowAllAlbumFiles(); } +Result LaShowAllAlbumFilesForHomeMenu(void) { return ::albumLaShowAllAlbumFilesForHomeMenu(); } + +} // namespace album + +namespace apm { + +Result Initialize(void) { return ::apmInitialize(); } +void Exit(void) { ::apmExit(); } +Service* GetServiceSession(void) { return ::apmGetServiceSession(); } +Service* GetServiceSession_Session(void) { return ::apmGetServiceSession_Session(); } +Result GetPerformanceMode(ApmPerformanceMode* out_performanceMode) { return ::apmGetPerformanceMode(out_performanceMode); } +Result SetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 PerformanceConfiguration) { return ::apmSetPerformanceConfiguration(PerformanceMode, PerformanceConfiguration); } +Result GetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 *PerformanceConfiguration) { return ::apmGetPerformanceConfiguration(PerformanceMode, PerformanceConfiguration); } + +} // namespace apm + +namespace applet { + +Result Initialize(void) { return ::appletInitialize(); } +void Exit(void) { ::appletExit(); } +Service* GetServiceSession_Proxy(void) { return ::appletGetServiceSession_Proxy(); } +Service* GetServiceSession_AppletCommonFunctions(void) { return ::appletGetServiceSession_AppletCommonFunctions(); } +Service* GetServiceSession_Functions(void) { return ::appletGetServiceSession_Functions(); } +Service* GetServiceSession_GlobalStateController(void) { return ::appletGetServiceSession_GlobalStateController(); } +Service* GetServiceSession_ApplicationCreator(void) { return ::appletGetServiceSession_ApplicationCreator(); } +Service* GetServiceSession_LibraryAppletSelfAccessor(void) { return ::appletGetServiceSession_LibraryAppletSelfAccessor(); } +Service* GetServiceSession_ProcessWindingController(void) { return ::appletGetServiceSession_ProcessWindingController(); } +Service* GetServiceSession_LibraryAppletCreator(void) { return ::appletGetServiceSession_LibraryAppletCreator(); } +Service* GetServiceSession_CommonStateGetter(void) { return ::appletGetServiceSession_CommonStateGetter(); } +Service* GetServiceSession_SelfController(void) { return ::appletGetServiceSession_SelfController(); } +Service* GetServiceSession_WindowController(void) { return ::appletGetServiceSession_WindowController(); } +Service* GetServiceSession_AudioController(void) { return ::appletGetServiceSession_AudioController(); } +Service* GetServiceSession_DisplayController(void) { return ::appletGetServiceSession_DisplayController(); } +Service* GetServiceSession_DebugFunctions(void) { return ::appletGetServiceSession_DebugFunctions(); } +u64 GetAppletResourceUserId(void) { return ::appletGetAppletResourceUserId(); } +AppletType GetAppletType(void) { return ::appletGetAppletType(); } +void SetThemeColorType(AppletThemeColorType theme) { ::appletSetThemeColorType(theme); } +AppletThemeColorType GetThemeColorType(void) { return ::appletGetThemeColorType(); } +Result GetCradleStatus(u8 *status) { return ::appletGetCradleStatus(status); } +Result GetBootMode(PmBootMode *mode) { return ::appletGetBootMode(mode); } +Result RequestToAcquireSleepLock(void) { return ::appletRequestToAcquireSleepLock(); } +Result ReleaseSleepLock(void) { return ::appletReleaseSleepLock(); } +Result ReleaseSleepLockTransiently(void) { return ::appletReleaseSleepLockTransiently(); } +Result GetWakeupCount(u64 *out) { return ::appletGetWakeupCount(out); } +Result PushToGeneralChannel(AppletStorage *s) { return ::appletPushToGeneralChannel(s); } +Result GetHomeButtonReaderLockAccessor(AppletLockAccessor *a) { return ::appletGetHomeButtonReaderLockAccessor(a); } +Result GetReaderLockAccessorEx(AppletLockAccessor *a, u32 inval) { return ::appletGetReaderLockAccessorEx(a, inval); } +Result GetWriterLockAccessorEx(AppletLockAccessor *a, u32 inval) { return ::appletGetWriterLockAccessorEx(a, inval); } +Result GetCradleFwVersion(u32 *out0, u32 *out1, u32 *out2, u32 *out3) { return ::appletGetCradleFwVersion(out0, out1, out2, out3); } +Result IsVrModeEnabled(bool *out) { return ::appletIsVrModeEnabled(out); } +Result SetVrModeEnabled(bool flag) { return ::appletSetVrModeEnabled(flag); } +Result SetLcdBacklightOffEnabled(bool flag) { return ::appletSetLcdBacklightOffEnabled(flag); } +Result IsInControllerFirmwareUpdateSection(bool *out) { return ::appletIsInControllerFirmwareUpdateSection(out); } +Result SetVrPositionForDebug(s32 x, s32 y, s32 width, s32 height) { return ::appletSetVrPositionForDebug(x, y, width, height); } +Result GetDefaultDisplayResolution(s32 *width, s32 *height) { return ::appletGetDefaultDisplayResolution(width, height); } +Result GetDefaultDisplayResolutionChangeEvent(Event *out_event) { return ::appletGetDefaultDisplayResolutionChangeEvent(out_event); } +Result GetHdcpAuthenticationState(s32 *state) { return ::appletGetHdcpAuthenticationState(state); } +Result GetHdcpAuthenticationStateChangeEvent(Event *out_event) { return ::appletGetHdcpAuthenticationStateChangeEvent(out_event); } +Result SetTvPowerStateMatchingMode(AppletTvPowerStateMatchingMode mode) { return ::appletSetTvPowerStateMatchingMode(mode); } +Result GetApplicationIdByContentActionName(u64 *application_id, const char *name) { return ::appletGetApplicationIdByContentActionName(application_id, name); } +Result SetCpuBoostMode(ApmCpuBoostMode mode) { return ::appletSetCpuBoostMode(mode); } +Result CancelCpuBoostMode(void) { return ::appletCancelCpuBoostMode(); } +Result GetBuiltInDisplayType(s32 *out) { return ::appletGetBuiltInDisplayType(out); } +Result PerformSystemButtonPressingIfInFocus(AppletSystemButtonType type) { return ::appletPerformSystemButtonPressingIfInFocus(type); } +Result SetPerformanceConfigurationChangedNotification(bool flag) { return ::appletSetPerformanceConfigurationChangedNotification(flag); } +Result GetCurrentPerformanceConfiguration(u32 *PerformanceConfiguration) { return ::appletGetCurrentPerformanceConfiguration(PerformanceConfiguration); } +Result OpenMyGpuErrorHandler(AppletGpuErrorHandler *g) { return ::appletOpenMyGpuErrorHandler(g); } +Result GetOperationModeSystemInfo(u32 *info) { return ::appletGetOperationModeSystemInfo(info); } +Result GetSettingsPlatformRegion(SetSysPlatformRegion *out) { return ::appletGetSettingsPlatformRegion(out); } +Result ActivateMigrationService(void) { return ::appletActivateMigrationService(); } +Result DeactivateMigrationService(void) { return ::appletDeactivateMigrationService(); } +Result DisableSleepTillShutdown(void) { return ::appletDisableSleepTillShutdown(); } +Result SuppressDisablingSleepTemporarily(u64 val) { return ::appletSuppressDisablingSleepTemporarily(val); } +Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(void) { return ::appletSetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(); } +void GpuErrorHandlerClose(AppletGpuErrorHandler *g) { ::appletGpuErrorHandlerClose(g); } +Result GpuErrorHandlerGetManualGpuErrorInfoSize(AppletGpuErrorHandler *g, u64 *out) { return ::appletGpuErrorHandlerGetManualGpuErrorInfoSize(g, out); } +Result GpuErrorHandlerGetManualGpuErrorInfo(AppletGpuErrorHandler *g, void* buffer, size_t size, u64 *out) { return ::appletGpuErrorHandlerGetManualGpuErrorInfo(g, buffer, size, out); } +Result GpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(AppletGpuErrorHandler *g, Event *out_event) { return ::appletGpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(g, out_event); } +Result GpuErrorHandlerFinishManualGpuErrorHandling(AppletGpuErrorHandler *g) { return ::appletGpuErrorHandlerFinishManualGpuErrorHandling(g); } +Result LockExit(void) { return ::appletLockExit(); } +Result UnlockExit(void) { return ::appletUnlockExit(); } +Result EnterFatalSection(void) { return ::appletEnterFatalSection(); } +Result LeaveFatalSection(void) { return ::appletLeaveFatalSection(); } +Result SetScreenShotPermission(AppletScreenShotPermission permission) { return ::appletSetScreenShotPermission(permission); } +Result SetRestartMessageEnabled(bool flag) { return ::appletSetRestartMessageEnabled(flag); } +Result SetScreenShotAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletSetScreenShotAppletIdentityInfo(info); } +Result SetControllerFirmwareUpdateSection(bool flag) { return ::appletSetControllerFirmwareUpdateSection(flag); } +Result SetRequiresCaptureButtonShortPressedMessage(bool flag) { return ::appletSetRequiresCaptureButtonShortPressedMessage(flag); } +Result SetAlbumImageOrientation(AlbumImageOrientation orientation) { return ::appletSetAlbumImageOrientation(orientation); } +Result SetDesirableKeyboardLayout(SetKeyboardLayout layout) { return ::appletSetDesirableKeyboardLayout(layout); } +Result CreateManagedDisplayLayer(u64 *out) { return ::appletCreateManagedDisplayLayer(out); } +Result IsSystemBufferSharingEnabled(void) { return ::appletIsSystemBufferSharingEnabled(); } +Result GetSystemSharedLayerHandle(u64 *SharedBufferHandle, u64 *SharedLayerHandle) { return ::appletGetSystemSharedLayerHandle(SharedBufferHandle, SharedLayerHandle); } +Result GetSystemSharedBufferHandle(u64 *SharedBufferHandle) { return ::appletGetSystemSharedBufferHandle(SharedBufferHandle); } +Result CreateManagedDisplaySeparableLayer(u64 *display_layer, u64 *recording_layer) { return ::appletCreateManagedDisplaySeparableLayer(display_layer, recording_layer); } +Result SetManagedDisplayLayerSeparationMode(u32 mode) { return ::appletSetManagedDisplayLayerSeparationMode(mode); } +Result SetHandlesRequestToDisplay(bool flag) { return ::appletSetHandlesRequestToDisplay(flag); } +Result ApproveToDisplay(void) { return ::appletApproveToDisplay(); } +Result OverrideAutoSleepTimeAndDimmingTime(s32 inval0, s32 inval1, s32 inval2, s32 inval3) { return ::appletOverrideAutoSleepTimeAndDimmingTime(inval0, inval1, inval2, inval3); } +Result SetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension ext) { return ::appletSetIdleTimeDetectionExtension(ext); } +Result GetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension *ext) { return ::appletGetIdleTimeDetectionExtension(ext); } +Result SetInputDetectionSourceSet(u32 val) { return ::appletSetInputDetectionSourceSet(val); } +Result ReportUserIsActive(void) { return ::appletReportUserIsActive(); } +Result GetCurrentIlluminance(float *fLux) { return ::appletGetCurrentIlluminance(fLux); } +Result IsIlluminanceAvailable(bool *out) { return ::appletIsIlluminanceAvailable(out); } +Result SetAutoSleepDisabled(bool flag) { return ::appletSetAutoSleepDisabled(flag); } +Result IsAutoSleepDisabled(bool *out) { return ::appletIsAutoSleepDisabled(out); } +Result GetCurrentIlluminanceEx(bool *bOverLimit, float *fLux) { return ::appletGetCurrentIlluminanceEx(bOverLimit, fLux); } +Result SetInputDetectionPolicy(AppletInputDetectionPolicy policy) { return ::appletSetInputDetectionPolicy(policy); } +Result SetWirelessPriorityMode(AppletWirelessPriorityMode mode) { return ::appletSetWirelessPriorityMode(mode); } +Result GetProgramTotalActiveTime(u64 *activeTime) { return ::appletGetProgramTotalActiveTime(activeTime); } +Result SetAlbumImageTakenNotificationEnabled(bool flag) { return ::appletSetAlbumImageTakenNotificationEnabled(flag); } +Result SetApplicationAlbumUserData(const void* buffer, size_t size) { return ::appletSetApplicationAlbumUserData(buffer, size); } +Result SaveCurrentScreenshot(AlbumReportOption option) { return ::appletSaveCurrentScreenshot(option); } +Result GetAppletResourceUserIdOfCallerApplet(u64 *out) { return ::appletGetAppletResourceUserIdOfCallerApplet(out); } +Result SetAppletWindowVisibility(bool flag) { return ::appletSetAppletWindowVisibility(flag); } +Result SetAppletGpuTimeSlice(s64 val) { return ::appletSetAppletGpuTimeSlice(val); } +Result SetExpectedMasterVolume(float mainAppletVolume, float libraryAppletVolume) { return ::appletSetExpectedMasterVolume(mainAppletVolume, libraryAppletVolume); } +Result GetExpectedMasterVolume(float *mainAppletVolume, float *libraryAppletVolume) { return ::appletGetExpectedMasterVolume(mainAppletVolume, libraryAppletVolume); } +Result ChangeMainAppletMasterVolume(float volume, u64 unk) { return ::appletChangeMainAppletMasterVolume(volume, unk); } +Result SetTransparentVolumeRate(float val) { return ::appletSetTransparentVolumeRate(val); } +Result UpdateLastForegroundCaptureImage(void) { return ::appletUpdateLastForegroundCaptureImage(); } +Result UpdateCallerAppletCaptureImage(void) { return ::appletUpdateCallerAppletCaptureImage(); } +Result GetLastForegroundCaptureImageEx(void* buffer, size_t size, bool *flag) { return ::appletGetLastForegroundCaptureImageEx(buffer, size, flag); } +Result GetLastApplicationCaptureImageEx(void* buffer, size_t size, bool *flag) { return ::appletGetLastApplicationCaptureImageEx(buffer, size, flag); } +Result GetCallerAppletCaptureImageEx(void* buffer, size_t size, bool *flag) { return ::appletGetCallerAppletCaptureImageEx(buffer, size, flag); } +Result TakeScreenShotOfOwnLayer(bool flag, AppletCaptureSharedBuffer captureBuf) { return ::appletTakeScreenShotOfOwnLayer(flag, captureBuf); } +Result CopyBetweenCaptureBuffers(AppletCaptureSharedBuffer dstCaptureBuf, AppletCaptureSharedBuffer srcCaptureBuf) { return ::appletCopyBetweenCaptureBuffers(dstCaptureBuf, srcCaptureBuf); } +Result ClearCaptureBuffer(bool flag, AppletCaptureSharedBuffer captureBuf, u32 color) { return ::appletClearCaptureBuffer(flag, captureBuf, color); } +Result ClearAppletTransitionBuffer(u32 color) { return ::appletClearAppletTransitionBuffer(color); } +Result AcquireLastApplicationCaptureSharedBuffer(bool *flag, s32 *id) { return ::appletAcquireLastApplicationCaptureSharedBuffer(flag, id); } +Result ReleaseLastApplicationCaptureSharedBuffer(void) { return ::appletReleaseLastApplicationCaptureSharedBuffer(); } +Result AcquireLastForegroundCaptureSharedBuffer(bool *flag, s32 *id) { return ::appletAcquireLastForegroundCaptureSharedBuffer(flag, id); } +Result ReleaseLastForegroundCaptureSharedBuffer(void) { return ::appletReleaseLastForegroundCaptureSharedBuffer(); } +Result AcquireCallerAppletCaptureSharedBuffer(bool *flag, s32 *id) { return ::appletAcquireCallerAppletCaptureSharedBuffer(flag, id); } +Result ReleaseCallerAppletCaptureSharedBuffer(void) { return ::appletReleaseCallerAppletCaptureSharedBuffer(); } +Result TakeScreenShotOfOwnLayerEx(bool flag0, bool immediately, AppletCaptureSharedBuffer captureBuf) { return ::appletTakeScreenShotOfOwnLayerEx(flag0, immediately, captureBuf); } +Result PushContext(AppletStorage *s) { return ::appletPushContext(s); } +Result PopContext(AppletStorage *s) { return ::appletPopContext(s); } +void LockAccessorClose(AppletLockAccessor *a) { ::appletLockAccessorClose(a); } +Result LockAccessorTryLock(AppletLockAccessor *a, bool *flag) { return ::appletLockAccessorTryLock(a, flag); } +Result LockAccessorLock(AppletLockAccessor *a) { return ::appletLockAccessorLock(a); } +Result LockAccessorUnlock(AppletLockAccessor *a) { return ::appletLockAccessorUnlock(a); } +Result CreateLibraryApplet(AppletHolder *h, AppletId id, LibAppletMode mode) { return ::appletCreateLibraryApplet(h, id, mode); } +Result CreateLibraryAppletSelf(AppletHolder *h, AppletId id, LibAppletMode mode) { return ::appletCreateLibraryAppletSelf(h, id, mode); } +Result TerminateAllLibraryApplets(void) { return ::appletTerminateAllLibraryApplets(); } +Result AreAnyLibraryAppletsLeft(bool *out) { return ::appletAreAnyLibraryAppletsLeft(out); } +void HolderClose(AppletHolder *h) { ::appletHolderClose(h); } +bool HolderActive(AppletHolder *h) { return ::appletHolderActive(h); } +Result HolderGetIndirectLayerConsumerHandle(AppletHolder *h, u64 *out) { return ::appletHolderGetIndirectLayerConsumerHandle(h, out); } +Result HolderStart(AppletHolder *h) { return ::appletHolderStart(h); } +Result HolderJump(AppletHolder *h) { return ::appletHolderJump(h); } +Result HolderRequestExit(AppletHolder *h) { return ::appletHolderRequestExit(h); } +Result HolderTerminate(AppletHolder *h) { return ::appletHolderTerminate(h); } +Result HolderRequestExitOrTerminate(AppletHolder *h, u64 timeout) { return ::appletHolderRequestExitOrTerminate(h, timeout); } +void HolderJoin(AppletHolder *h) { ::appletHolderJoin(h); } +Event * HolderGetExitEvent(AppletHolder *h) { return ::appletHolderGetExitEvent(h); } +bool HolderCheckFinished(AppletHolder *h) { return ::appletHolderCheckFinished(h); } +LibAppletExitReason HolderGetExitReason(AppletHolder *h) { return ::appletHolderGetExitReason(h); } +Result HolderSetOutOfFocusApplicationSuspendingEnabled(AppletHolder *h, bool flag) { return ::appletHolderSetOutOfFocusApplicationSuspendingEnabled(h, flag); } +Result HolderPresetLibraryAppletGpuTimeSliceZero(AppletHolder *h) { return ::appletHolderPresetLibraryAppletGpuTimeSliceZero(h); } +Result HolderGetPopInteractiveOutDataEvent(AppletHolder *h, Event **out_event) { return ::appletHolderGetPopInteractiveOutDataEvent(h, out_event); } +bool HolderWaitInteractiveOut(AppletHolder *h) { return ::appletHolderWaitInteractiveOut(h); } +Result HolderPushInData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPushInData(h, s); } +Result HolderPopOutData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPopOutData(h, s); } +Result HolderPushExtraStorage(AppletHolder *h, AppletStorage *s) { return ::appletHolderPushExtraStorage(h, s); } +Result HolderPushInteractiveInData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPushInteractiveInData(h, s); } +Result HolderPopInteractiveOutData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPopInteractiveOutData(h, s); } +Result HolderGetLibraryAppletInfo(AppletHolder *h, LibAppletInfo *info) { return ::appletHolderGetLibraryAppletInfo(h, info); } +Result CreateStorage(AppletStorage *s, s64 size) { return ::appletCreateStorage(s, size); } +Result CreateTransferMemoryStorage(AppletStorage *s, void* buffer, s64 size, bool writable) { return ::appletCreateTransferMemoryStorage(s, buffer, size, writable); } +Result CreateHandleStorage(AppletStorage *s, s64 inval, Handle handle) { return ::appletCreateHandleStorage(s, inval, handle); } +Result CreateHandleStorageTmem(AppletStorage *s, void* buffer, s64 size) { return ::appletCreateHandleStorageTmem(s, buffer, size); } +void StorageClose(AppletStorage *s) { ::appletStorageClose(s); } +void StorageCloseTmem(AppletStorage *s) { ::appletStorageCloseTmem(s); } +Result StorageGetSize(AppletStorage *s, s64 *size) { return ::appletStorageGetSize(s, size); } +Result StorageWrite(AppletStorage *s, s64 offset, const void* buffer, size_t size) { return ::appletStorageWrite(s, offset, buffer, size); } +Result StorageRead(AppletStorage *s, s64 offset, void* buffer, size_t size) { return ::appletStorageRead(s, offset, buffer, size); } +Result StorageGetHandle(AppletStorage *s, s64 *out, Handle *handle) { return ::appletStorageGetHandle(s, out, handle); } +Result StorageMap(AppletStorage *s, void** addr, size_t *size) { return ::appletStorageMap(s, addr, size); } +Result PopLaunchParameter(AppletStorage *s, AppletLaunchParameterKind kind) { return ::appletPopLaunchParameter(s, kind); } +Result RequestLaunchApplication(u64 application_id, AppletStorage* s) { return ::appletRequestLaunchApplication(application_id, s); } +Result RequestLaunchApplicationForQuest(u64 application_id, AppletStorage* s, const AppletApplicationAttributeForQuest *attr) { return ::appletRequestLaunchApplicationForQuest(application_id, s, attr); } +Result GetDesiredLanguage(u64 *LanguageCode) { return ::appletGetDesiredLanguage(LanguageCode); } +Result GetDisplayVersion(char *displayVersion) { return ::appletGetDisplayVersion(displayVersion); } +Result BeginBlockingHomeButtonShortAndLongPressed(s64 val) { return ::appletBeginBlockingHomeButtonShortAndLongPressed(val); } +Result EndBlockingHomeButtonShortAndLongPressed(void) { return ::appletEndBlockingHomeButtonShortAndLongPressed(); } +Result BeginBlockingHomeButton(s64 val) { return ::appletBeginBlockingHomeButton(val); } +Result EndBlockingHomeButton(void) { return ::appletEndBlockingHomeButton(); } +void NotifyRunning(bool *out) { ::appletNotifyRunning(out); } +Result GetPseudoDeviceId(Uuid *out) { return ::appletGetPseudoDeviceId(out); } +Result SetMediaPlaybackState(bool state) { return ::appletSetMediaPlaybackState(state); } +Result IsGamePlayRecordingSupported(bool *flag) { return ::appletIsGamePlayRecordingSupported(flag); } +Result SetGamePlayRecordingState(bool state) { return ::appletSetGamePlayRecordingState(state); } +Result InitializeGamePlayRecording(void) { return ::appletInitializeGamePlayRecording(); } +Result RequestFlushGamePlayingMovieForDebug(void) { return ::appletRequestFlushGamePlayingMovieForDebug(); } +Result RequestToShutdown(void) { return ::appletRequestToShutdown(); } +Result RequestToReboot(void) { return ::appletRequestToReboot(); } +Result RequestToSleep(void) { return ::appletRequestToSleep(); } +Result ExitAndRequestToShowThanksMessage(void) { return ::appletExitAndRequestToShowThanksMessage(); } +Result InitializeApplicationCopyrightFrameBuffer(void) { return ::appletInitializeApplicationCopyrightFrameBuffer(); } +Result SetApplicationCopyrightImage(const void* buffer, size_t size, s32 x, s32 y, s32 width, s32 height, AppletWindowOriginMode mode) { return ::appletSetApplicationCopyrightImage(buffer, size, x, y, width, height, mode); } +Result SetApplicationCopyrightVisibility(bool visible) { return ::appletSetApplicationCopyrightVisibility(visible); } +Result QueryApplicationPlayStatistics(PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out) { return ::appletQueryApplicationPlayStatistics(stats, application_ids, count, total_out); } +Result QueryApplicationPlayStatisticsByUid(AccountUid uid, PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out) { return ::appletQueryApplicationPlayStatisticsByUid(uid, stats, application_ids, count, total_out); } +Result ExecuteProgram(s32 programIndex, const void* buffer, size_t size) { return ::appletExecuteProgram(programIndex, buffer, size); } +Result JumpToSubApplicationProgramForDevelopment(u64 application_id, const void* buffer, size_t size) { return ::appletJumpToSubApplicationProgramForDevelopment(application_id, buffer, size); } +Result RestartProgram(const void* buffer, size_t size) { return ::appletRestartProgram(buffer, size); } +Result GetPreviousProgramIndex(s32 *programIndex) { return ::appletGetPreviousProgramIndex(programIndex); } +Result SetDelayTimeToAbortOnGpuError(u64 val) { return ::appletSetDelayTimeToAbortOnGpuError(val); } +Result GetFriendInvitationStorageChannelEvent(Event *out_event) { return ::appletGetFriendInvitationStorageChannelEvent(out_event); } +Result TryPopFromFriendInvitationStorageChannel(AppletStorage *s) { return ::appletTryPopFromFriendInvitationStorageChannel(s); } +Result GetNotificationStorageChannelEvent(Event *out_event) { return ::appletGetNotificationStorageChannelEvent(out_event); } +Result TryPopFromNotificationStorageChannel(AppletStorage *s) { return ::appletTryPopFromNotificationStorageChannel(s); } +Result GetHealthWarningDisappearedSystemEvent(Event *out_event) { return ::appletGetHealthWarningDisappearedSystemEvent(out_event); } +Result SetHdcpAuthenticationActivated(bool flag) { return ::appletSetHdcpAuthenticationActivated(flag); } +Result GetLastApplicationExitReason(s32 *out) { return ::appletGetLastApplicationExitReason(out); } +Result CreateMovieMaker(Service* srv_out, TransferMemory *tmem) { return ::appletCreateMovieMaker(srv_out, tmem); } +Result PrepareForJit(void) { return ::appletPrepareForJit(); } +Result RequestToGetForeground(void) { return ::appletRequestToGetForeground(); } +Result LockForeground(void) { return ::appletLockForeground(); } +Result UnlockForeground(void) { return ::appletUnlockForeground(); } +Result PopFromGeneralChannel(AppletStorage *s) { return ::appletPopFromGeneralChannel(s); } +Result GetPopFromGeneralChannelEvent(Event *out_event) { return ::appletGetPopFromGeneralChannelEvent(out_event); } +Result GetHomeButtonWriterLockAccessor(AppletLockAccessor *a) { return ::appletGetHomeButtonWriterLockAccessor(a); } +Result IsSleepEnabled(bool *out) { return ::appletIsSleepEnabled(out); } +Result PopRequestLaunchApplicationForDebug(AccountUid *uids, s32 count, u64 *application_id, s32 *total_out) { return ::appletPopRequestLaunchApplicationForDebug(uids, count, application_id, total_out); } +Result IsForceTerminateApplicationDisabledForDebug(bool *out) { return ::appletIsForceTerminateApplicationDisabledForDebug(out); } +Result LaunchDevMenu(void) { return ::appletLaunchDevMenu(); } +Result SetLastApplicationExitReason(s32 reason) { return ::appletSetLastApplicationExitReason(reason); } +Result StartSleepSequence(bool flag) { return ::appletStartSleepSequence(flag); } +Result StartShutdownSequence(void) { return ::appletStartShutdownSequence(); } +Result StartRebootSequence(void) { return ::appletStartRebootSequence(); } +Result IsAutoPowerDownRequested(bool *out) { return ::appletIsAutoPowerDownRequested(out); } +Result LoadAndApplyIdlePolicySettings(void) { return ::appletLoadAndApplyIdlePolicySettings(); } +Result NotifyCecSettingsChanged(void) { return ::appletNotifyCecSettingsChanged(); } +Result SetDefaultHomeButtonLongPressTime(s64 val) { return ::appletSetDefaultHomeButtonLongPressTime(val); } +Result UpdateDefaultDisplayResolution(void) { return ::appletUpdateDefaultDisplayResolution(); } +Result ShouldSleepOnBoot(bool *out) { return ::appletShouldSleepOnBoot(out); } +Result GetHdcpAuthenticationFailedEvent(Event *out_event) { return ::appletGetHdcpAuthenticationFailedEvent(out_event); } +Result CreateApplication(AppletApplication *a, u64 application_id) { return ::appletCreateApplication(a, application_id); } +Result PopLaunchRequestedApplication(AppletApplication *a) { return ::appletPopLaunchRequestedApplication(a); } +Result CreateSystemApplication(AppletApplication *a, u64 system_application_id) { return ::appletCreateSystemApplication(a, system_application_id); } +Result PopFloatingApplicationForDevelopment(AppletApplication *a) { return ::appletPopFloatingApplicationForDevelopment(a); } +void ApplicationClose(AppletApplication *a) { ::appletApplicationClose(a); } +bool ApplicationActive(AppletApplication *a) { return ::appletApplicationActive(a); } +Result ApplicationStart(AppletApplication *a) { return ::appletApplicationStart(a); } +Result ApplicationRequestExit(AppletApplication *a) { return ::appletApplicationRequestExit(a); } +Result ApplicationTerminate(AppletApplication *a) { return ::appletApplicationTerminate(a); } +void ApplicationJoin(AppletApplication *a) { ::appletApplicationJoin(a); } +bool ApplicationCheckFinished(AppletApplication *a) { return ::appletApplicationCheckFinished(a); } +AppletApplicationExitReason ApplicationGetExitReason(AppletApplication *a) { return ::appletApplicationGetExitReason(a); } +Result ApplicationRequestForApplicationToGetForeground(AppletApplication *a) { return ::appletApplicationRequestForApplicationToGetForeground(a); } +Result ApplicationTerminateAllLibraryApplets(AppletApplication *a) { return ::appletApplicationTerminateAllLibraryApplets(a); } +Result ApplicationAreAnyLibraryAppletsLeft(AppletApplication *a, bool *out) { return ::appletApplicationAreAnyLibraryAppletsLeft(a, out); } +Result ApplicationRequestExitLibraryAppletOrTerminate(AppletApplication *a, u64 timeout) { return ::appletApplicationRequestExitLibraryAppletOrTerminate(a, timeout); } +Result ApplicationGetApplicationId(AppletApplication *a, u64 *application_id) { return ::appletApplicationGetApplicationId(a, application_id); } +Result ApplicationPushLaunchParameter(AppletApplication *a, AppletLaunchParameterKind kind, AppletStorage* s) { return ::appletApplicationPushLaunchParameter(a, kind, s); } +Result ApplicationGetApplicationControlProperty(AppletApplication *a, NacpStruct *nacp) { return ::appletApplicationGetApplicationControlProperty(a, nacp); } +Result ApplicationGetApplicationLaunchProperty(AppletApplication *a, AppletApplicationLaunchProperty *out) { return ::appletApplicationGetApplicationLaunchProperty(a, out); } +Result ApplicationGetApplicationLaunchRequestInfo(AppletApplication *a, AppletApplicationLaunchRequestInfo *out) { return ::appletApplicationGetApplicationLaunchRequestInfo(a, out); } +Result ApplicationSetUsers(AppletApplication *a, const AccountUid *uids, s32 count, bool flag) { return ::appletApplicationSetUsers(a, uids, count, flag); } +Result ApplicationCheckRightsEnvironmentAvailable(AppletApplication *a, bool *out) { return ::appletApplicationCheckRightsEnvironmentAvailable(a, out); } +Result ApplicationGetNsRightsEnvironmentHandle(AppletApplication *a, u64 *handle) { return ::appletApplicationGetNsRightsEnvironmentHandle(a, handle); } +Result ApplicationGetDesirableUids(AppletApplication *a, AccountUid *uids, s32 count, s32 *total_out) { return ::appletApplicationGetDesirableUids(a, uids, count, total_out); } +Result ApplicationReportApplicationExitTimeout(AppletApplication *a) { return ::appletApplicationReportApplicationExitTimeout(a); } +Result ApplicationSetApplicationAttribute(AppletApplication *a, const AppletApplicationAttribute *attr) { return ::appletApplicationSetApplicationAttribute(a, attr); } +Result ApplicationHasSaveDataAccessPermission(AppletApplication *a, u64 application_id, bool *out) { return ::appletApplicationHasSaveDataAccessPermission(a, application_id, out); } +Result ApplicationPushToFriendInvitationStorageChannel(AppletApplication *a, AccountUid uid, const void* buffer, u64 size) { return ::appletApplicationPushToFriendInvitationStorageChannel(a, uid, buffer, size); } +Result ApplicationPushToNotificationStorageChannel(AppletApplication *a, const void* buffer, u64 size) { return ::appletApplicationPushToNotificationStorageChannel(a, buffer, size); } +Result ApplicationRequestApplicationSoftReset(AppletApplication *a) { return ::appletApplicationRequestApplicationSoftReset(a); } +Result ApplicationRestartApplicationTimer(AppletApplication *a) { return ::appletApplicationRestartApplicationTimer(a); } +Result PopInData(AppletStorage *s) { return ::appletPopInData(s); } +Result PushOutData(AppletStorage *s) { return ::appletPushOutData(s); } +Result PopInteractiveInData(AppletStorage *s) { return ::appletPopInteractiveInData(s); } +Result PushInteractiveOutData(AppletStorage *s) { return ::appletPushInteractiveOutData(s); } +Result GetPopInDataEvent(Event *out_event) { return ::appletGetPopInDataEvent(out_event); } +Result GetPopInteractiveInDataEvent(Event *out_event) { return ::appletGetPopInteractiveInDataEvent(out_event); } +Result GetLibraryAppletInfo(LibAppletInfo *info) { return ::appletGetLibraryAppletInfo(info); } +Result GetMainAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletGetMainAppletIdentityInfo(info); } +Result CanUseApplicationCore(bool *out) { return ::appletCanUseApplicationCore(out); } +Result GetCallerAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletGetCallerAppletIdentityInfo(info); } +Result GetMainAppletApplicationControlProperty(NacpStruct *nacp) { return ::appletGetMainAppletApplicationControlProperty(nacp); } +Result GetMainAppletStorageId(NcmStorageId *storageId) { return ::appletGetMainAppletStorageId(storageId); } +Result GetCallerAppletIdentityInfoStack(AppletIdentityInfo *stack, s32 count, s32 *total_out) { return ::appletGetCallerAppletIdentityInfoStack(stack, count, total_out); } +Result GetNextReturnDestinationAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletGetNextReturnDestinationAppletIdentityInfo(info); } +Result GetDesirableKeyboardLayout(SetKeyboardLayout *layout) { return ::appletGetDesirableKeyboardLayout(layout); } +Result PopExtraStorage(AppletStorage *s) { return ::appletPopExtraStorage(s); } +Result GetPopExtraStorageEvent(Event *out_event) { return ::appletGetPopExtraStorageEvent(out_event); } +Result UnpopInData(AppletStorage *s) { return ::appletUnpopInData(s); } +Result UnpopExtraStorage(AppletStorage *s) { return ::appletUnpopExtraStorage(s); } +Result GetIndirectLayerProducerHandle(u64 *out) { return ::appletGetIndirectLayerProducerHandle(out); } +Result GetMainAppletApplicationDesiredLanguage(u64 *LanguageCode) { return ::appletGetMainAppletApplicationDesiredLanguage(LanguageCode); } +Result GetCurrentApplicationId(u64 *application_id) { return ::appletGetCurrentApplicationId(application_id); } +Result RequestExitToSelf(void) { return ::appletRequestExitToSelf(); } +Result CreateGameMovieTrimmer(Service* srv_out, TransferMemory *tmem) { return ::appletCreateGameMovieTrimmer(srv_out, tmem); } +Result ReserveResourceForMovieOperation(void) { return ::appletReserveResourceForMovieOperation(); } +Result UnreserveResourceForMovieOperation(void) { return ::appletUnreserveResourceForMovieOperation(); } +Result GetMainAppletAvailableUsers(AccountUid *uids, s32 count, bool *flag, s32 *total_out) { return ::appletGetMainAppletAvailableUsers(uids, count, flag, total_out); } +Result SetApplicationMemoryReservation(u64 val) { return ::appletSetApplicationMemoryReservation(val); } +Result ShouldSetGpuTimeSliceManually(bool *out) { return ::appletShouldSetGpuTimeSliceManually(out); } +Result BeginToWatchShortHomeButtonMessage(void) { return ::appletBeginToWatchShortHomeButtonMessage(); } +Result EndToWatchShortHomeButtonMessage(void) { return ::appletEndToWatchShortHomeButtonMessage(); } +Result GetApplicationIdForLogo(u64 *application_id) { return ::appletGetApplicationIdForLogo(application_id); } +Result SetGpuTimeSliceBoost(u64 val) { return ::appletSetGpuTimeSliceBoost(val); } +Result SetAutoSleepTimeAndDimmingTimeEnabled(bool flag) { return ::appletSetAutoSleepTimeAndDimmingTimeEnabled(flag); } +Result TerminateApplicationAndSetReason(Result reason) { return ::appletTerminateApplicationAndSetReason(reason); } +Result SetScreenShotPermissionGlobally(bool flag) { return ::appletSetScreenShotPermissionGlobally(flag); } +Result StartShutdownSequenceForOverlay(void) { return ::appletStartShutdownSequenceForOverlay(); } +Result StartRebootSequenceForOverlay(void) { return ::appletStartRebootSequenceForOverlay(); } +Result SetHealthWarningShowingState(bool flag) { return ::appletSetHealthWarningShowingState(flag); } +Result IsHealthWarningRequired(bool *out) { return ::appletIsHealthWarningRequired(out); } +Result BeginToObserveHidInputForDevelop(void) { return ::appletBeginToObserveHidInputForDevelop(); } +Result ReadThemeStorage(void* buffer, size_t size, u64 offset, u64 *transfer_size) { return ::appletReadThemeStorage(buffer, size, offset, transfer_size); } +Result WriteThemeStorage(const void* buffer, size_t size, u64 offset) { return ::appletWriteThemeStorage(buffer, size, offset); } +Result PushToAppletBoundChannel(AppletStorage *s) { return ::appletPushToAppletBoundChannel(s); } +Result TryPopFromAppletBoundChannel(AppletStorage *s) { return ::appletTryPopFromAppletBoundChannel(s); } +Result GetDisplayLogicalResolution(s32 *width, s32 *height) { return ::appletGetDisplayLogicalResolution(width, height); } +Result SetDisplayMagnification(float x, float y, float width, float height) { return ::appletSetDisplayMagnification(x, y, width, height); } +Result SetHomeButtonDoubleClickEnabled(bool flag) { return ::appletSetHomeButtonDoubleClickEnabled(flag); } +Result GetHomeButtonDoubleClickEnabled(bool *out) { return ::appletGetHomeButtonDoubleClickEnabled(out); } +Result IsHomeButtonShortPressedBlocked(bool *out) { return ::appletIsHomeButtonShortPressedBlocked(out); } +Result IsVrModeCurtainRequired(bool *out) { return ::appletIsVrModeCurtainRequired(out); } +Result SetCpuBoostRequestPriority(s32 priority) { return ::appletSetCpuBoostRequestPriority(priority); } +Result OpenMainApplication(AppletApplication *a) { return ::appletOpenMainApplication(a); } +Result PerformSystemButtonPressing(AppletSystemButtonType type) { return ::appletPerformSystemButtonPressing(type); } +Result InvalidateTransitionLayer(void) { return ::appletInvalidateTransitionLayer(); } +Result RequestLaunchApplicationWithUserAndArgumentForDebug(u64 application_id, const AccountUid *uids, s32 total_uids, bool flag, const void* buffer, size_t size) { return ::appletRequestLaunchApplicationWithUserAndArgumentForDebug(application_id, uids, total_uids, flag, buffer, size); } +Result GetAppletResourceUsageInfo(AppletResourceUsageInfo *info) { return ::appletGetAppletResourceUsageInfo(info); } +Result PushToAppletBoundChannelForDebug(AppletStorage *s, s32 channel) { return ::appletPushToAppletBoundChannelForDebug(s, channel); } +Result TryPopFromAppletBoundChannelForDebug(AppletStorage *s, s32 channel) { return ::appletTryPopFromAppletBoundChannelForDebug(s, channel); } +Result AlarmSettingNotificationEnableAppEventReserve(AppletStorage *s, u64 application_id) { return ::appletAlarmSettingNotificationEnableAppEventReserve(s, application_id); } +Result AlarmSettingNotificationDisableAppEventReserve(void) { return ::appletAlarmSettingNotificationDisableAppEventReserve(); } +Result AlarmSettingNotificationPushAppEventNotify(const void* buffer, u64 size) { return ::appletAlarmSettingNotificationPushAppEventNotify(buffer, size); } +Result FriendInvitationSetApplicationParameter(AppletStorage *s, u64 application_id) { return ::appletFriendInvitationSetApplicationParameter(s, application_id); } +Result FriendInvitationClearApplicationParameter(void) { return ::appletFriendInvitationClearApplicationParameter(); } +Result FriendInvitationPushApplicationParameter(AccountUid uid, const void* buffer, u64 size) { return ::appletFriendInvitationPushApplicationParameter(uid, buffer, size); } +Result CreateGeneralStorageForDebug(u64 id, u64 size) { return ::appletCreateGeneralStorageForDebug(id, size); } +Result ReadGeneralStorageForDebug(void* buffer, size_t size, u64 id, u64 offset, u64 *out_size) { return ::appletReadGeneralStorageForDebug(buffer, size, id, offset, out_size); } +Result WriteGeneralStorageForDebug(const void* buffer, size_t size, u64 id, u64 offset) { return ::appletWriteGeneralStorageForDebug(buffer, size, id, offset); } +Result SetTerminateResult(Result res) { return ::appletSetTerminateResult(res); } +Result GetLaunchStorageInfoForDebug(NcmStorageId *app_storageId, NcmStorageId *update_storageId) { return ::appletGetLaunchStorageInfoForDebug(app_storageId, update_storageId); } +Result GetGpuErrorDetectedSystemEvent(Event *out_event) { return ::appletGetGpuErrorDetectedSystemEvent(out_event); } +Result SetHandlingHomeButtonShortPressedEnabled(bool flag) { return ::appletSetHandlingHomeButtonShortPressedEnabled(flag); } +AppletInfo * GetAppletInfo(void) { return ::appletGetAppletInfo(); } +Event * GetMessageEvent(void) { return ::appletGetMessageEvent(); } +Result GetMessage(u32 *msg) { return ::appletGetMessage(msg); } +bool ProcessMessage(u32 msg) { return ::appletProcessMessage(msg); } +bool MainLoop(void) { return ::appletMainLoop(); } +void Hook(AppletHookCookie* cookie, AppletHookFn callback, void* param) { ::appletHook(cookie, callback, param); } +void Unhook(AppletHookCookie* cookie) { ::appletUnhook(cookie); } +AppletOperationMode GetOperationMode(void) { return ::appletGetOperationMode(); } +ApmPerformanceMode GetPerformanceMode(void) { return ::appletGetPerformanceMode(); } +AppletFocusState GetFocusState(void) { return ::appletGetFocusState(); } +Result SetFocusHandlingMode(AppletFocusHandlingMode mode) { return ::appletSetFocusHandlingMode(mode); } + +} // namespace applet + +namespace arm { + +void DCacheFlush(void* addr, size_t size) { ::armDCacheFlush(addr, size); } +void DCacheClean(void* addr, size_t size) { ::armDCacheClean(addr, size); } +void ICacheInvalidate(void* addr, size_t size) { ::armICacheInvalidate(addr, size); } +void DCacheZero(void* addr, size_t size) { ::armDCacheZero(addr, size); } +u64 GetSystemTick(void) { return ::armGetSystemTick(); } +u64 GetSystemTickFreq(void) { return ::armGetSystemTickFreq(); } +u64 NsToTicks(u64 ns) { return ::armNsToTicks(ns); } +u64 TicksToNs(u64 tick) { return ::armTicksToNs(tick); } +void* GetTls(void) { return ::armGetTls(); } + +} // namespace arm + +namespace async { + +void ValueClose(AsyncValue *a) { ::asyncValueClose(a); } +Result ValueWait(AsyncValue *a, u64 timeout) { return ::asyncValueWait(a, timeout); } +Result ValueGetSize(AsyncValue *a, u64 *size) { return ::asyncValueGetSize(a, size); } +Result ValueGet(AsyncValue *a, void* buffer, size_t size) { return ::asyncValueGet(a, buffer, size); } +Result ValueCancel(AsyncValue *a) { return ::asyncValueCancel(a); } +Result ValueGetErrorContext(AsyncValue *a, ErrorContext *context) { return ::asyncValueGetErrorContext(a, context); } +void ResultClose(AsyncResult *a) { ::asyncResultClose(a); } +Result ResultWait(AsyncResult *a, u64 timeout) { return ::asyncResultWait(a, timeout); } +Result ResultGet(AsyncResult *a) { return ::asyncResultGet(a); } +Result ResultCancel(AsyncResult *a) { return ::asyncResultCancel(a); } +Result ResultGetErrorContext(AsyncResult *a, ErrorContext *context) { return ::asyncResultGetErrorContext(a, context); } + +} // namespace async + +namespace auda { + +Result Initialize(void) { return ::audaInitialize(); } +void Exit(void) { ::audaExit(); } +Service* GetServiceSession(void) { return ::audaGetServiceSession(); } +Result RequestSuspendAudio(u64 pid, u64 delay) { return ::audaRequestSuspendAudio(pid, delay); } +Result RequestResumeAudio(u64 pid, u64 delay) { return ::audaRequestResumeAudio(pid, delay); } +Result GetAudioOutputProcessMasterVolume(u64 pid, float* volume_out) { return ::audaGetAudioOutputProcessMasterVolume(pid, volume_out); } +Result SetAudioOutputProcessMasterVolume(u64 pid, u64 delay, float volume) { return ::audaSetAudioOutputProcessMasterVolume(pid, delay, volume); } +Result GetAudioInputProcessMasterVolume(u64 pid, float* volume_out) { return ::audaGetAudioInputProcessMasterVolume(pid, volume_out); } +Result SetAudioInputProcessMasterVolume(u64 pid, u64 delay, float volume) { return ::audaSetAudioInputProcessMasterVolume(pid, delay, volume); } +Result GetAudioOutputProcessRecordVolume(u64 pid, float* volume_out) { return ::audaGetAudioOutputProcessRecordVolume(pid, volume_out); } +Result SetAudioOutputProcessRecordVolume(u64 pid, u64 delay, float volume) { return ::audaSetAudioOutputProcessRecordVolume(pid, delay, volume); } + +} // namespace auda + +namespace audctl { + +Result Initialize(void) { return ::audctlInitialize(); } +void Exit(void) { ::audctlExit(); } +Service* GetServiceSession(void) { return ::audctlGetServiceSession(); } +Result GetTargetVolume(s32* volume_out, AudioTarget target) { return ::audctlGetTargetVolume(volume_out, target); } +Result SetTargetVolume(AudioTarget target, s32 volume) { return ::audctlSetTargetVolume(target, volume); } +Result GetTargetVolumeMin(s32* volume_out) { return ::audctlGetTargetVolumeMin(volume_out); } +Result GetTargetVolumeMax(s32* volume_out) { return ::audctlGetTargetVolumeMax(volume_out); } +Result IsTargetMute(bool* mute_out, AudioTarget target) { return ::audctlIsTargetMute(mute_out, target); } +Result SetTargetMute(AudioTarget target, bool mute) { return ::audctlSetTargetMute(target, mute); } +Result IsTargetConnected(bool* connected_out, AudioTarget target) { return ::audctlIsTargetConnected(connected_out, target); } +Result SetDefaultTarget(AudioTarget target, u64 fade_in_ns, u64 fade_out_ns) { return ::audctlSetDefaultTarget(target, fade_in_ns, fade_out_ns); } +Result GetDefaultTarget(AudioTarget* target_out) { return ::audctlGetDefaultTarget(target_out); } +Result GetAudioOutputMode(AudioOutputMode* mode_out, AudioTarget target) { return ::audctlGetAudioOutputMode(mode_out, target); } +Result SetAudioOutputMode(AudioTarget target, AudioOutputMode mode) { return ::audctlSetAudioOutputMode(target, mode); } +Result SetForceMutePolicy(AudioForceMutePolicy policy) { return ::audctlSetForceMutePolicy(policy); } +Result GetForceMutePolicy(AudioForceMutePolicy* policy_out) { return ::audctlGetForceMutePolicy(policy_out); } +Result GetOutputModeSetting(AudioOutputMode* mode_out, AudioTarget target) { return ::audctlGetOutputModeSetting(mode_out, target); } +Result SetOutputModeSetting(AudioTarget target, AudioOutputMode mode) { return ::audctlSetOutputModeSetting(target, mode); } +Result SetOutputTarget(AudioTarget target) { return ::audctlSetOutputTarget(target); } +Result SetInputTargetForceEnabled(bool enable) { return ::audctlSetInputTargetForceEnabled(enable); } +Result SetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode mode) { return ::audctlSetHeadphoneOutputLevelMode(mode); } +Result GetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode* mode_out) { return ::audctlGetHeadphoneOutputLevelMode(mode_out); } +Result AcquireAudioVolumeUpdateEventForPlayReport(Event* event_out) { return ::audctlAcquireAudioVolumeUpdateEventForPlayReport(event_out); } +Result AcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_out) { return ::audctlAcquireAudioOutputDeviceUpdateEventForPlayReport(event_out); } +Result GetAudioOutputTargetForPlayReport(AudioTarget* target_out) { return ::audctlGetAudioOutputTargetForPlayReport(target_out); } +Result NotifyHeadphoneVolumeWarningDisplayedEvent(void) { return ::audctlNotifyHeadphoneVolumeWarningDisplayedEvent(); } +Result SetSystemOutputMasterVolume(float volume) { return ::audctlSetSystemOutputMasterVolume(volume); } +Result GetSystemOutputMasterVolume(float* volume_out) { return ::audctlGetSystemOutputMasterVolume(volume_out); } +Result GetActiveOutputTarget(AudioTarget* target) { return ::audctlGetActiveOutputTarget(target); } + +} // namespace audctl + +namespace audd { + +Result Initialize(void) { return ::auddInitialize(); } +void Exit(void) { ::auddExit(); } +Service* GetServiceSession(void) { return ::auddGetServiceSession(); } +Result RequestSuspendAudioForDebug(u64 pid, u64 delay) { return ::auddRequestSuspendAudioForDebug(pid, delay); } +Result RequestResumeAudioForDebug(u64 pid, u64 delay) { return ::auddRequestResumeAudioForDebug(pid, delay); } + +} // namespace audd + +namespace auddev { + +Result Initialize(void) { return ::auddevInitialize(); } +void Exit(void) { ::auddevExit(); } +Service* GetServiceSession(void) { return ::auddevGetServiceSession(); } +Result ListAudioDeviceName(AudioDeviceName *DeviceNames, s32 max_names, s32 *total_names) { return ::auddevListAudioDeviceName(DeviceNames, max_names, total_names); } +Result SetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float volume) { return ::auddevSetAudioDeviceOutputVolume(DeviceName, volume); } +Result GetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float *volume) { return ::auddevGetAudioDeviceOutputVolume(DeviceName, volume); } +Result GetActiveAudioDeviceName(AudioDeviceName *DeviceName) { return ::auddevGetActiveAudioDeviceName(DeviceName); } + +} // namespace auddev + +namespace audin { + +Result Initialize(void) { return ::audinInitialize(); } +void Exit(void) { ::audinExit(); } +Service* GetServiceSession(void) { return ::audinGetServiceSession(); } +Service* GetServiceSession_AudioIn(void) { return ::audinGetServiceSession_AudioIn(); } +Result ListAudioIns(char *DeviceNames, s32 count, u32 *DeviceNamesCount) { return ::audinListAudioIns(DeviceNames, count, DeviceNamesCount); } +Result OpenAudioIn(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioInState *State) { return ::audinOpenAudioIn(DeviceNameIn, DeviceNameOut, SampleRateIn, ChannelCountIn, SampleRateOut, ChannelCountOut, Format, State); } +Result GetAudioInState(AudioInState *State) { return ::audinGetAudioInState(State); } +Result StartAudioIn(void) { return ::audinStartAudioIn(); } +Result StopAudioIn(void) { return ::audinStopAudioIn(); } +Result AppendAudioInBuffer(AudioInBuffer *Buffer) { return ::audinAppendAudioInBuffer(Buffer); } +Result GetReleasedAudioInBuffer(AudioInBuffer **Buffer, u32 *ReleasedBuffersCount) { return ::audinGetReleasedAudioInBuffer(Buffer, ReleasedBuffersCount); } +Result ContainsAudioInBuffer(AudioInBuffer *Buffer, bool *ContainsBuffer) { return ::audinContainsAudioInBuffer(Buffer, ContainsBuffer); } +Result CaptureBuffer(AudioInBuffer *source, AudioInBuffer **released) { return ::audinCaptureBuffer(source, released); } +Result WaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout) { return ::audinWaitCaptureFinish(released, released_count, timeout); } +u32 GetSampleRate(void) { return ::audinGetSampleRate(); } +u32 GetChannelCount(void) { return ::audinGetChannelCount(); } +PcmFormat GetPcmFormat(void) { return ::audinGetPcmFormat(); } +AudioInState GetDeviceState(void) { return ::audinGetDeviceState(); } + +} // namespace audin + +namespace audout { + +Result Initialize(void) { return ::audoutInitialize(); } +void Exit(void) { ::audoutExit(); } +Service* GetServiceSession(void) { return ::audoutGetServiceSession(); } +Service* GetServiceSession_AudioOut(void) { return ::audoutGetServiceSession_AudioOut(); } +Result ListAudioOuts(char *DeviceNames, s32 count, u32 *DeviceNamesCount) { return ::audoutListAudioOuts(DeviceNames, count, DeviceNamesCount); } +Result OpenAudioOut(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioOutState *State) { return ::audoutOpenAudioOut(DeviceNameIn, DeviceNameOut, SampleRateIn, ChannelCountIn, SampleRateOut, ChannelCountOut, Format, State); } +Result GetAudioOutState(AudioOutState *State) { return ::audoutGetAudioOutState(State); } +Result StartAudioOut(void) { return ::audoutStartAudioOut(); } +Result StopAudioOut(void) { return ::audoutStopAudioOut(); } +Result AppendAudioOutBuffer(AudioOutBuffer *Buffer) { return ::audoutAppendAudioOutBuffer(Buffer); } +Result GetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount) { return ::audoutGetReleasedAudioOutBuffer(Buffer, ReleasedBuffersCount); } +Result ContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer) { return ::audoutContainsAudioOutBuffer(Buffer, ContainsBuffer); } +Result GetAudioOutBufferCount(u32 *count) { return ::audoutGetAudioOutBufferCount(count); } +Result GetAudioOutPlayedSampleCount(u64 *count) { return ::audoutGetAudioOutPlayedSampleCount(count); } +Result FlushAudioOutBuffers(bool *flushed) { return ::audoutFlushAudioOutBuffers(flushed); } +Result SetAudioOutVolume(float volume) { return ::audoutSetAudioOutVolume(volume); } +Result GetAudioOutVolume(float *volume) { return ::audoutGetAudioOutVolume(volume); } +Result PlayBuffer(AudioOutBuffer *source, AudioOutBuffer **released) { return ::audoutPlayBuffer(source, released); } +Result WaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout) { return ::audoutWaitPlayFinish(released, released_count, timeout); } +u32 GetSampleRate(void) { return ::audoutGetSampleRate(); } +u32 GetChannelCount(void) { return ::audoutGetChannelCount(); } +PcmFormat GetPcmFormat(void) { return ::audoutGetPcmFormat(); } +AudioOutState GetDeviceState(void) { return ::audoutGetDeviceState(); } + +} // namespace audout + +namespace audouta { + +Result Initialize(void) { return ::audoutaInitialize(); } +void Exit(void) { ::audoutaExit(); } +Service* GetServiceSession(void) { return ::audoutaGetServiceSession(); } +Result RequestSuspend(u64 pid, u64 delay) { return ::audoutaRequestSuspend(pid, delay); } +Result RequestResume(u64 pid, u64 delay) { return ::audoutaRequestResume(pid, delay); } +Result GetProcessMasterVolume(u64 pid, float* volume_out) { return ::audoutaGetProcessMasterVolume(pid, volume_out); } +Result SetProcessMasterVolume(u64 pid, u64 delay, float volume) { return ::audoutaSetProcessMasterVolume(pid, delay, volume); } +Result GetProcessRecordVolume(u64 pid, float* volume_out) { return ::audoutaGetProcessRecordVolume(pid, volume_out); } +Result SetProcessRecordVolume(u64 pid, u64 delay, float volume) { return ::audoutaSetProcessRecordVolume(pid, delay, volume); } + +} // namespace audouta + +namespace audoutd { + +Result Initialize(void) { return ::audoutdInitialize(); } +void Exit(void) { ::audoutdExit(); } +Service* GetServiceSession(void) { return ::audoutdGetServiceSession(); } +Result RequestSuspendForDebug(u64 pid, u64 delay) { return ::audoutdRequestSuspendForDebug(pid, delay); } +Result RequestResumeForDebug(u64 pid, u64 delay) { return ::audoutdRequestResumeForDebug(pid, delay); } + +} // namespace audoutd + +namespace audrec { + +Result Initialize(void) { return ::audrecInitialize(); } +void Exit(void) { ::audrecExit(); } +Service* GetServiceSession(void) { return ::audrecGetServiceSession(); } +Result OpenFinalOutputRecorder(AudrecRecorder* recorder_out, FinalOutputRecorderParameter* param_in, u64 aruid, FinalOutputRecorderParameterInternal* param_out) { return ::audrecOpenFinalOutputRecorder(recorder_out, param_in, aruid, param_out); } +Result RecorderStart(AudrecRecorder* recorder) { return ::audrecRecorderStart(recorder); } +Result RecorderStop(AudrecRecorder* recorder) { return ::audrecRecorderStop(recorder); } +Result RecorderRegisterBufferEvent(AudrecRecorder* recorder, Event* out_event) { return ::audrecRecorderRegisterBufferEvent(recorder, out_event); } +Result RecorderAppendFinalOutputRecorderBuffer(AudrecRecorder* recorder, u64 buffer_client_ptr, FinalOutputRecorderBuffer* param) { return ::audrecRecorderAppendFinalOutputRecorderBuffer(recorder, buffer_client_ptr, param); } +Result RecorderGetReleasedFinalOutputRecorderBuffers(AudrecRecorder* recorder, u64* out_buffers, u64* inout_count, u64* out_released) { return ::audrecRecorderGetReleasedFinalOutputRecorderBuffers(recorder, out_buffers, inout_count, out_released); } +void RecorderClose(AudrecRecorder* recorder) { ::audrecRecorderClose(recorder); } + +} // namespace audrec + +namespace audren { + +u32 GetRevision(void) { return ::audrenGetRevision(); } +int GetMemPoolCount(const AudioRendererConfig* config) { return ::audrenGetMemPoolCount(config); } +size_t GetInputParamSize(const AudioRendererConfig* config) { return ::audrenGetInputParamSize(config); } +size_t GetOutputParamSize(const AudioRendererConfig* config) { return ::audrenGetOutputParamSize(config); } +Result Initialize(const AudioRendererConfig* config) { return ::audrenInitialize(config); } +void Exit(void) { ::audrenExit(); } +Service* GetServiceSession_AudioRenderer(void) { return ::audrenGetServiceSession_AudioRenderer(); } +Event* GetFrameEvent(void) { return ::audrenGetFrameEvent(); } +void WaitFrame(void) { ::audrenWaitFrame(); } +Result GetState(u32* out_state) { return ::audrenGetState(out_state); } +Result RequestUpdateAudioRenderer(const void* in_param_buf, size_t in_param_buf_size, void* out_param_buf, size_t out_param_buf_size, void* perf_buf, size_t perf_buf_size) { return ::audrenRequestUpdateAudioRenderer(in_param_buf, in_param_buf_size, out_param_buf, out_param_buf_size, perf_buf, perf_buf_size); } +Result StartAudioRenderer(void) { return ::audrenStartAudioRenderer(); } +Result StopAudioRenderer(void) { return ::audrenStopAudioRenderer(); } +Result SetAudioRendererRenderingTimeLimit(int percent) { return ::audrenSetAudioRendererRenderingTimeLimit(percent); } + +} // namespace audren + +namespace audrv { + +Result Create(AudioDriver* d, const AudioRendererConfig* config, int num_final_mix_channels) { return ::audrvCreate(d, config, num_final_mix_channels); } +Result Update(AudioDriver* d) { return ::audrvUpdate(d); } +void Close(AudioDriver* d) { ::audrvClose(d); } +int MemPoolAdd(AudioDriver* d, void* buffer, size_t size) { return ::audrvMemPoolAdd(d, buffer, size); } +bool MemPoolRemove(AudioDriver* d, int id) { return ::audrvMemPoolRemove(d, id); } +bool MemPoolAttach(AudioDriver* d, int id) { return ::audrvMemPoolAttach(d, id); } +bool MemPoolDetach(AudioDriver* d, int id) { return ::audrvMemPoolDetach(d, id); } +bool VoiceInit(AudioDriver* d, int id, int num_channels, PcmFormat format, int sample_rate) { return ::audrvVoiceInit(d, id, num_channels, format, sample_rate); } +void VoiceDrop(AudioDriver* d, int id) { ::audrvVoiceDrop(d, id); } +void VoiceStop(AudioDriver* d, int id) { ::audrvVoiceStop(d, id); } +bool VoiceIsPaused(AudioDriver* d, int id) { return ::audrvVoiceIsPaused(d, id); } +bool VoiceIsPlaying(AudioDriver* d, int id) { return ::audrvVoiceIsPlaying(d, id); } +bool VoiceAddWaveBuf(AudioDriver* d, int id, AudioDriverWaveBuf* wavebuf) { return ::audrvVoiceAddWaveBuf(d, id, wavebuf); } +u32 VoiceGetWaveBufSeq(AudioDriver* d, int id) { return ::audrvVoiceGetWaveBufSeq(d, id); } +u32 VoiceGetPlayedSampleCount(AudioDriver* d, int id) { return ::audrvVoiceGetPlayedSampleCount(d, id); } +u32 VoiceGetVoiceDropsCount(AudioDriver* d, int id) { return ::audrvVoiceGetVoiceDropsCount(d, id); } +void VoiceSetBiquadFilter(AudioDriver* d, int id, int biquad_id, float a0, float a1, float a2, float b0, float b1, float b2) { ::audrvVoiceSetBiquadFilter(d, id, biquad_id, a0, a1, a2, b0, b1, b2); } +void VoiceSetExtraParams(AudioDriver* d, int id, const void* params, size_t params_size) { ::audrvVoiceSetExtraParams(d, id, params, params_size); } +void VoiceSetDestinationMix(AudioDriver* d, int id, int mix_id) { ::audrvVoiceSetDestinationMix(d, id, mix_id); } +void VoiceSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id) { ::audrvVoiceSetMixFactor(d, id, factor, src_channel_id, dest_channel_id); } +void VoiceSetVolume(AudioDriver* d, int id, float volume) { ::audrvVoiceSetVolume(d, id, volume); } +void VoiceSetPitch(AudioDriver* d, int id, float pitch) { ::audrvVoiceSetPitch(d, id, pitch); } +void VoiceSetPriority(AudioDriver* d, int id, int priority) { ::audrvVoiceSetPriority(d, id, priority); } +void VoiceClearBiquadFilter(AudioDriver* d, int id, int biquad_id) { ::audrvVoiceClearBiquadFilter(d, id, biquad_id); } +void VoiceSetPaused(AudioDriver* d, int id, bool paused) { ::audrvVoiceSetPaused(d, id, paused); } +void VoiceStart(AudioDriver* d, int id) { ::audrvVoiceStart(d, id); } +int MixAdd(AudioDriver* d, int sample_rate, int num_channels) { return ::audrvMixAdd(d, sample_rate, num_channels); } +void MixRemove(AudioDriver* d, int id) { ::audrvMixRemove(d, id); } +void MixSetDestinationMix(AudioDriver* d, int id, int mix_id) { ::audrvMixSetDestinationMix(d, id, mix_id); } +void MixSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id) { ::audrvMixSetMixFactor(d, id, factor, src_channel_id, dest_channel_id); } +void MixSetVolume(AudioDriver* d, int id, float volume) { ::audrvMixSetVolume(d, id, volume); } +int DeviceSinkAdd(AudioDriver* d, const char* device_name, int num_channels, const u8* channel_ids) { return ::audrvDeviceSinkAdd(d, device_name, num_channels, channel_ids); } +void SinkRemove(AudioDriver* d, int id) { ::audrvSinkRemove(d, id); } + +} // namespace audrv + +namespace avm { + +Result Initialize(void) { return ::avmInitialize(); } +void Exit(void) { ::avmExit(); } +Service * GetServiceSession(void) { return ::avmGetServiceSession(); } +Result GetHighestAvailableVersion(u64 id_1, u64 id_2, u32 *version) { return ::avmGetHighestAvailableVersion(id_1, id_2, version); } +Result GetHighestRequiredVersion(u64 id_1, u64 id_2, u32 *version) { return ::avmGetHighestRequiredVersion(id_1, id_2, version); } +Result GetVersionListEntry(u64 application_id, AvmVersionListEntry *entry) { return ::avmGetVersionListEntry(application_id, entry); } +Result GetVersionListImporter(AvmVersionListImporter *out) { return ::avmGetVersionListImporter(out); } +Result GetLaunchRequiredVersion(u64 application_id, u32 *version) { return ::avmGetLaunchRequiredVersion(application_id, version); } +Result UpgradeLaunchRequiredVersion(u64 application_id, u32 version) { return ::avmUpgradeLaunchRequiredVersion(application_id, version); } +Result PushLaunchVersion(u64 application_id, u32 version) { return ::avmPushLaunchVersion(application_id, version); } +Result ListVersionList(AvmVersionListEntry *buffer, size_t count, u32 *out) { return ::avmListVersionList(buffer, count, out); } +Result ListRequiredVersion(AvmRequiredVersionEntry *buffer, size_t count, u32 *out) { return ::avmListRequiredVersion(buffer, count, out); } +void VersionListImporterClose(AvmVersionListImporter *srv) { ::avmVersionListImporterClose(srv); } +Result VersionListImporterSetTimestamp(AvmVersionListImporter *srv, u64 timestamp) { return ::avmVersionListImporterSetTimestamp(srv, timestamp); } +Result VersionListImporterSetData(AvmVersionListImporter *srv, const AvmVersionListEntry *entries, u32 count) { return ::avmVersionListImporterSetData(srv, entries, count); } +Result VersionListImporterFlush(AvmVersionListImporter *srv) { return ::avmVersionListImporterFlush(srv); } + +} // namespace avm + +namespace barrier { + +void Init(Barrier *b, u64 thread_count) { ::barrierInit(b, thread_count); } +void Wait(Barrier *b) { ::barrierWait(b); } + +} // namespace barrier + +namespace binder { + +void Create(Binder* b, s32 id) { ::binderCreate(b, id); } +void Close(Binder* b) { ::binderClose(b); } +Result InitSession(Binder* b, Service* relay) { return ::binderInitSession(b, relay); } +Result TransactParcel(Binder* b, u32 code, void* parcel_data, size_t parcel_data_size, void* parcel_reply, size_t parcel_reply_size, u32 flags) { return ::binderTransactParcel(b, code, parcel_data, parcel_data_size, parcel_reply, parcel_reply_size, flags); } +Result ConvertErrorCode(s32 code) { return ::binderConvertErrorCode(code); } +Result AdjustRefcount(Binder* b, s32 addval, s32 type) { return ::binderAdjustRefcount(b, addval, type); } +Result GetNativeHandle(Binder* b, u32 unk0, Event *event_out) { return ::binderGetNativeHandle(b, unk0, event_out); } +Result IncreaseWeakRef(Binder* b) { return ::binderIncreaseWeakRef(b); } +Result DecreaseWeakRef(Binder* b) { return ::binderDecreaseWeakRef(b); } +Result IncreaseStrongRef(Binder* b) { return ::binderIncreaseStrongRef(b); } +Result DecreaseStrongRef(Binder* b) { return ::binderDecreaseStrongRef(b); } + +} // namespace binder + +namespace bpc { + +Result Initialize(void) { return ::bpcInitialize(); } +void Exit(void) { ::bpcExit(); } +Service* GetServiceSession(void) { return ::bpcGetServiceSession(); } +Result ShutdownSystem(void) { return ::bpcShutdownSystem(); } +Result RebootSystem(void) { return ::bpcRebootSystem(); } +Result GetSleepButtonState(BpcSleepButtonState *out) { return ::bpcGetSleepButtonState(out); } +Result GetPowerButton(bool* out_is_pushed) { return ::bpcGetPowerButton(out_is_pushed); } + +} // namespace bpc + +namespace bq { + +Result RequestBuffer(Binder *b, s32 bufferIdx, BqGraphicBuffer *buf) { return ::bqRequestBuffer(b, bufferIdx, buf); } +Result DequeueBuffer(Binder *b, bool async, u32 width, u32 height, s32 format, u32 usage, s32 *buf, NvMultiFence *fence) { return ::bqDequeueBuffer(b, async, width, height, format, usage, buf, fence); } +Result DetachBuffer(Binder *b, s32 slot) { return ::bqDetachBuffer(b, slot); } +Result QueueBuffer(Binder *b, s32 buf, const BqBufferInput *input, BqBufferOutput *output) { return ::bqQueueBuffer(b, buf, input, output); } +Result CancelBuffer(Binder *b, s32 buf, const NvMultiFence *fence) { return ::bqCancelBuffer(b, buf, fence); } +Result Query(Binder *b, s32 what, s32* value) { return ::bqQuery(b, what, value); } +Result Connect(Binder *b, s32 api, bool producerControlledByApp, BqBufferOutput *output) { return ::bqConnect(b, api, producerControlledByApp, output); } +Result Disconnect(Binder *b, s32 api) { return ::bqDisconnect(b, api); } +Result SetPreallocatedBuffer(Binder *b, s32 buf, const BqGraphicBuffer *input) { return ::bqSetPreallocatedBuffer(b, buf, input); } + +} // namespace bq + +namespace bt { + +Result Initialize(void) { return ::btInitialize(); } +void Exit(void) { ::btExit(); } +Service* GetServiceSession(void) { return ::btGetServiceSession(); } +Result LeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) { return ::btLeClientReadCharacteristic(connection_handle, is_primary, serv_id, char_id, auth_req); } +Result LeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) { return ::btLeClientReadDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, auth_req); } +Result LeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response) { return ::btLeClientWriteCharacteristic(connection_handle, is_primary, serv_id, char_id, buffer, size, auth_req, with_response); } +Result LeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req) { return ::btLeClientWriteDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, buffer, size, auth_req); } +Result LeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btLeClientRegisterNotification(connection_handle, is_primary, serv_id, char_id); } +Result LeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btLeClientDeregisterNotification(connection_handle, is_primary, serv_id, char_id); } +Result SetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size) { return ::btSetLeResponse(server_if, serv_uuid, char_uuid, buffer, size); } +Result LeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm) { return ::btLeSendIndication(server_if, serv_uuid, char_uuid, buffer, size, noconfirm); } +Result GetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { return ::btGetLeEventInfo(buffer, size, type); } +Result RegisterBleEvent(Event* out_event) { return ::btRegisterBleEvent(out_event); } + +} // namespace bt + +namespace btdev { + +Result Initialize(void) { return ::btdevInitialize(); } +void Exit(void) { ::btdevExit(); } +bool GattAttributeUuidIsSame(const BtdrvGattAttributeUuid *a, const BtdrvGattAttributeUuid *b) { return ::btdevGattAttributeUuidIsSame(a, b); } +Result AcquireBleScanEvent(Event* out_event) { return ::btdevAcquireBleScanEvent(out_event); } +Result GetBleScanParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out) { return ::btdevGetBleScanParameter(parameter_id, out); } +Result GetBleScanParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out) { return ::btdevGetBleScanParameter2(parameter_id, out); } +Result StartBleScanGeneral(BtdrvBleAdvertisePacketParameter param) { return ::btdevStartBleScanGeneral(param); } +Result StopBleScanGeneral(void) { return ::btdevStopBleScanGeneral(); } +Result GetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btdevGetBleScanResult(results, count, total_out); } +Result EnableBleAutoConnection(BtdrvBleAdvertisePacketParameter param) { return ::btdevEnableBleAutoConnection(param); } +Result DisableBleAutoConnection(void) { return ::btdevDisableBleAutoConnection(); } +Result StartBleScanSmartDevice(const BtdrvGattAttributeUuid *uuid) { return ::btdevStartBleScanSmartDevice(uuid); } +Result StopBleScanSmartDevice(void) { return ::btdevStopBleScanSmartDevice(); } +Result AcquireBleConnectionStateChangedEvent(Event* out_event) { return ::btdevAcquireBleConnectionStateChangedEvent(out_event); } +Result ConnectToGattServer(BtdrvAddress addr) { return ::btdevConnectToGattServer(addr); } +Result DisconnectFromGattServer(u32 connection_handle) { return ::btdevDisconnectFromGattServer(connection_handle); } +Result GetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) { return ::btdevGetBleConnectionInfoList(info, count, total_out); } +Result AcquireBleServiceDiscoveryEvent(Event* out_event) { return ::btdevAcquireBleServiceDiscoveryEvent(out_event); } +Result GetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out) { return ::btdevGetGattServices(connection_handle, services, count, total_out); } +Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag) { return ::btdevGetGattService(connection_handle, uuid, service, flag); } +Result AcquireBlePairingEvent(Event* out_event) { return ::btdevAcquireBlePairingEvent(out_event); } +Result PairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btdevPairGattServer(connection_handle, param); } +Result UnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btdevUnpairGattServer(connection_handle, param); } +Result UnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) { return ::btdevUnpairGattServer2(addr, param); } +Result GetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out) { return ::btdevGetPairedGattServerAddress(param, addrs, count, total_out); } +Result AcquireBleMtuConfigEvent(Event* out_event) { return ::btdevAcquireBleMtuConfigEvent(out_event); } +Result ConfigureBleMtu(u32 connection_handle, u16 mtu) { return ::btdevConfigureBleMtu(connection_handle, mtu); } +Result GetBleMtu(u32 connection_handle, u16 *out) { return ::btdevGetBleMtu(connection_handle, out); } +Result AcquireBleGattOperationEvent(Event* out_event) { return ::btdevAcquireBleGattOperationEvent(out_event); } +Result RegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid) { return ::btdevRegisterGattOperationNotification(uuid); } +Result UnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid) { return ::btdevUnregisterGattOperationNotification(uuid); } +Result GetGattOperationResult(BtdrvBleClientGattOperationInfo *out) { return ::btdevGetGattOperationResult(out); } +Result ReadGattCharacteristic(BtdevGattCharacteristic *c) { return ::btdevReadGattCharacteristic(c); } +Result WriteGattCharacteristic(BtdevGattCharacteristic *c) { return ::btdevWriteGattCharacteristic(c); } +Result EnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag) { return ::btdevEnableGattCharacteristicNotification(c, flag); } +Result ReadGattDescriptor(BtdevGattDescriptor *d) { return ::btdevReadGattDescriptor(d); } +Result WriteGattDescriptor(BtdevGattDescriptor *d) { return ::btdevWriteGattDescriptor(d); } +void GattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle) { ::btdevGattAttributeCreate(a, uuid, handle, connection_handle); } +u8 GattAttributeGetType(BtdevGattAttribute *a) { return ::btdevGattAttributeGetType(a); } +void GattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out) { ::btdevGattAttributeGetUuid(a, out); } +u16 GattAttributeGetHandle(BtdevGattAttribute *a) { return ::btdevGattAttributeGetHandle(a); } +u32 GattAttributeGetConnectionHandle(BtdevGattAttribute *a) { return ::btdevGattAttributeGetConnectionHandle(a); } +void GattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service) { ::btdevGattServiceCreate(s, uuid, handle, connection_handle, instance_id, end_group_handle, primary_service); } +u16 GattServiceGetInstanceId(BtdevGattService *s) { return ::btdevGattServiceGetInstanceId(s); } +u16 GattServiceGetEndGroupHandle(BtdevGattService *s) { return ::btdevGattServiceGetEndGroupHandle(s); } +u16 GattServiceIsPrimaryService(BtdevGattService *s) { return ::btdevGattServiceIsPrimaryService(s); } +Result GattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out) { return ::btdevGattServiceGetIncludedServices(s, services, count, total_out); } +Result GattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out) { return ::btdevGattServiceGetCharacteristics(s, characteristics, count, total_out); } +Result GattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag) { return ::btdevGattServiceGetCharacteristic(s, uuid, characteristic, flag); } +void GattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties) { ::btdevGattCharacteristicCreate(c, uuid, handle, connection_handle, instance_id, properties); } +u16 GattCharacteristicGetInstanceId(BtdevGattCharacteristic *c) { return ::btdevGattCharacteristicGetInstanceId(c); } +u8 GattCharacteristicGetProperties(BtdevGattCharacteristic *c) { return ::btdevGattCharacteristicGetProperties(c); } +Result GattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service) { return ::btdevGattCharacteristicGetService(c, service); } +Result GattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out) { return ::btdevGattCharacteristicGetDescriptors(c, descriptors, count, total_out); } +Result GattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag) { return ::btdevGattCharacteristicGetDescriptor(c, uuid, descriptor, flag); } +void GattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size) { ::btdevGattCharacteristicSetValue(c, buffer, size); } +u64 GattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size) { return ::btdevGattCharacteristicGetValue(c, buffer, size); } +void GattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle) { ::btdevGattDescriptorCreate(d, uuid, handle, connection_handle); } +Result GattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service) { return ::btdevGattDescriptorGetService(d, service); } +Result GattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic) { return ::btdevGattDescriptorGetCharacteristic(d, characteristic); } +void GattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size) { ::btdevGattDescriptorSetValue(d, buffer, size); } +u64 GattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size) { return ::btdevGattDescriptorGetValue(d, buffer, size); } + +} // namespace btdev + +namespace btdrv { + +Result Initialize(void) { return ::btdrvInitialize(); } +void Exit(void) { ::btdrvExit(); } +Service* GetServiceSession(void) { return ::btdrvGetServiceSession(); } +Result InitializeBluetooth(Event* out_event) { return ::btdrvInitializeBluetooth(out_event); } +Result EnableBluetooth(void) { return ::btdrvEnableBluetooth(); } +Result DisableBluetooth(void) { return ::btdrvDisableBluetooth(); } +Result FinalizeBluetooth(void) { return ::btdrvFinalizeBluetooth(); } +Result LegacyGetAdapterProperties(BtdrvAdapterPropertyOld *properties) { return ::btdrvLegacyGetAdapterProperties(properties); } +Result GetAdapterProperties(BtdrvAdapterPropertySet *properties) { return ::btdrvGetAdapterProperties(properties); } +Result LegacyGetAdapterProperty(BtdrvBluetoothPropertyType type, void* buffer, size_t size) { return ::btdrvLegacyGetAdapterProperty(type, buffer, size); } +Result GetAdapterProperty(BtdrvAdapterPropertyType type, BtdrvAdapterProperty *property) { return ::btdrvGetAdapterProperty(type, property); } +Result LegacySetAdapterProperty(BtdrvBluetoothPropertyType type, const void* buffer, size_t size) { return ::btdrvLegacySetAdapterProperty(type, buffer, size); } +Result SetAdapterProperty(BtdrvAdapterPropertyType type, const BtdrvAdapterProperty *property) { return ::btdrvSetAdapterProperty(type, property); } +Result LegacyStartInquiry(void) { return ::btdrvLegacyStartInquiry(); } +Result StartInquiry(u32 services, s64 duration) { return ::btdrvStartInquiry(services, duration); } +Result StopInquiry(void) { return ::btdrvStopInquiry(); } +Result CreateBond(BtdrvAddress addr, u32 type) { return ::btdrvCreateBond(addr, type); } +Result RemoveBond(BtdrvAddress addr) { return ::btdrvRemoveBond(addr); } +Result CancelBond(BtdrvAddress addr) { return ::btdrvCancelBond(addr); } +Result LegacyRespondToPinRequest(BtdrvAddress addr, bool flag, const BtdrvBluetoothPinCode *pin_code, u8 length) { return ::btdrvLegacyRespondToPinRequest(addr, flag, pin_code, length); } +Result RespondToPinRequest(BtdrvAddress addr, const BtdrvPinCode *pin_code) { return ::btdrvRespondToPinRequest(addr, pin_code); } +Result RespondToSspRequest(BtdrvAddress addr, u32 variant, bool accept, u32 passkey) { return ::btdrvRespondToSspRequest(addr, variant, accept, passkey); } +Result GetEventInfo(void* buffer, size_t size, BtdrvEventType *type) { return ::btdrvGetEventInfo(buffer, size, type); } +Result InitializeHid(Event* out_event) { return ::btdrvInitializeHid(out_event); } +Result OpenHidConnection(BtdrvAddress addr) { return ::btdrvOpenHidConnection(addr); } +Result CloseHidConnection(BtdrvAddress addr) { return ::btdrvCloseHidConnection(addr); } +Result WriteHidData(BtdrvAddress addr, const BtdrvHidReport *buffer) { return ::btdrvWriteHidData(addr, buffer); } +Result WriteHidData2(BtdrvAddress addr, const void* buffer, size_t size) { return ::btdrvWriteHidData2(addr, buffer, size); } +Result SetHidReport(BtdrvAddress addr, BtdrvBluetoothHhReportType type, const BtdrvHidReport *buffer) { return ::btdrvSetHidReport(addr, type, buffer); } +Result GetHidReport(BtdrvAddress addr, u8 report_id, BtdrvBluetoothHhReportType type) { return ::btdrvGetHidReport(addr, report_id, type); } +Result TriggerConnection(BtdrvAddress addr, u16 timeout) { return ::btdrvTriggerConnection(addr, timeout); } +Result AddPairedDeviceInfo(const SetSysBluetoothDevicesSettings *settings) { return ::btdrvAddPairedDeviceInfo(settings); } +Result GetPairedDeviceInfo(BtdrvAddress addr, SetSysBluetoothDevicesSettings *settings) { return ::btdrvGetPairedDeviceInfo(addr, settings); } +Result FinalizeHid(void) { return ::btdrvFinalizeHid(); } +Result GetHidEventInfo(void* buffer, size_t size, BtdrvHidEventType *type) { return ::btdrvGetHidEventInfo(buffer, size, type); } +Result SetTsi(BtdrvAddress addr, u8 tsi) { return ::btdrvSetTsi(addr, tsi); } +Result EnableBurstMode(BtdrvAddress addr, bool flag) { return ::btdrvEnableBurstMode(addr, flag); } +Result SetZeroRetransmission(BtdrvAddress addr, u8 *report_ids, u8 count) { return ::btdrvSetZeroRetransmission(addr, report_ids, count); } +Result EnableMcMode(bool flag) { return ::btdrvEnableMcMode(flag); } +Result EnableLlrScan(void) { return ::btdrvEnableLlrScan(); } +Result DisableLlrScan(void) { return ::btdrvDisableLlrScan(); } +Result EnableRadio(bool flag) { return ::btdrvEnableRadio(flag); } +Result SetVisibility(bool inquiry_scan, bool page_scan) { return ::btdrvSetVisibility(inquiry_scan, page_scan); } +Result EnableTbfcScan(bool flag) { return ::btdrvEnableTbfcScan(flag); } +Result RegisterHidReportEvent(Event* out_event) { return ::btdrvRegisterHidReportEvent(out_event); } +Result GetHidReportEventInfo(void* buffer, size_t size, BtdrvHidEventType *type) { return ::btdrvGetHidReportEventInfo(buffer, size, type); } +void* GetHidReportEventInfoSharedmemAddr(void) { return ::btdrvGetHidReportEventInfoSharedmemAddr(); } +Result GetLatestPlr(BtdrvPlrList *out) { return ::btdrvGetLatestPlr(out); } +Result GetPendingConnections(void) { return ::btdrvGetPendingConnections(); } +Result GetChannelMap(BtdrvChannelMapList *out) { return ::btdrvGetChannelMap(out); } +Result EnableTxPowerBoostSetting(bool flag) { return ::btdrvEnableTxPowerBoostSetting(flag); } +Result IsTxPowerBoostSettingEnabled(bool *out) { return ::btdrvIsTxPowerBoostSettingEnabled(out); } +Result EnableAfhSetting(bool flag) { return ::btdrvEnableAfhSetting(flag); } +Result IsAfhSettingEnabled(bool *out) { return ::btdrvIsAfhSettingEnabled(out); } +Result InitializeBle(Event* out_event) { return ::btdrvInitializeBle(out_event); } +Result EnableBle(void) { return ::btdrvEnableBle(); } +Result DisableBle(void) { return ::btdrvDisableBle(); } +Result FinalizeBle(void) { return ::btdrvFinalizeBle(); } +Result SetBleVisibility(bool discoverable, bool connectable) { return ::btdrvSetBleVisibility(discoverable, connectable); } +Result SetLeConnectionParameter(const BtdrvLeConnectionParams *param) { return ::btdrvSetLeConnectionParameter(param); } +Result SetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool preference) { return ::btdrvSetBleConnectionParameter(addr, param, preference); } +Result SetLeDefaultConnectionParameter(const BtdrvLeConnectionParams *param) { return ::btdrvSetLeDefaultConnectionParameter(param); } +Result SetBleDefaultConnectionParameter(const BtdrvBleConnectionParameter *param) { return ::btdrvSetBleDefaultConnectionParameter(param); } +Result SetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data) { return ::btdrvSetBleAdvertiseData(data); } +Result SetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval) { return ::btdrvSetBleAdvertiseParameter(addr, min_interval, max_interval); } +Result StartBleScan(void) { return ::btdrvStartBleScan(); } +Result StopBleScan(void) { return ::btdrvStopBleScan(); } +Result AddBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter) { return ::btdrvAddBleScanFilterCondition(filter); } +Result DeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter) { return ::btdrvDeleteBleScanFilterCondition(filter); } +Result DeleteBleScanFilter(u8 index) { return ::btdrvDeleteBleScanFilter(index); } +Result ClearBleScanFilters(void) { return ::btdrvClearBleScanFilters(); } +Result EnableBleScanFilter(bool flag) { return ::btdrvEnableBleScanFilter(flag); } +Result RegisterGattClient(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattClient(uuid); } +Result UnregisterGattClient(u8 client_if) { return ::btdrvUnregisterGattClient(client_if); } +Result UnregisterAllGattClients(void) { return ::btdrvUnregisterAllGattClients(); } +Result ConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId) { return ::btdrvConnectGattServer(client_if, addr, is_direct, AppletResourceUserId); } +Result CancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct) { return ::btdrvCancelConnectGattServer(client_if, addr, is_direct); } +Result DisconnectGattServer(u32 conn_id) { return ::btdrvDisconnectGattServer(conn_id); } +Result GetGattAttribute(BtdrvAddress addr, u32 conn_id) { return ::btdrvGetGattAttribute(addr, conn_id); } +Result GetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid) { return ::btdrvGetGattService(conn_id, uuid); } +Result ConfigureAttMtu(u32 conn_id, u16 mtu) { return ::btdrvConfigureAttMtu(conn_id, mtu); } +Result RegisterGattServer(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattServer(uuid); } +Result UnregisterGattServer(u8 server_if) { return ::btdrvUnregisterGattServer(server_if); } +Result ConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct) { return ::btdrvConnectGattClient(server_if, addr, is_direct); } +Result DisconnectGattClient(u8 conn_id, BtdrvAddress addr) { return ::btdrvDisconnectGattClient(conn_id, addr); } +Result AddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary) { return ::btdrvAddGattService(server_if, uuid, num_handle, is_primary); } +Result EnableGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid) { return ::btdrvEnableGattService(server_if, uuid); } +Result AddGattCharacteristic(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u16 permissions, u8 property) { return ::btdrvAddGattCharacteristic(server_if, serv_uuid, char_uuid, permissions, property); } +Result AddGattDescriptor(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions) { return ::btdrvAddGattDescriptor(server_if, serv_uuid, desc_uuid, permissions); } +Result GetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { return ::btdrvGetBleManagedEventInfo(buffer, size, type); } +Result GetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id) { return ::btdrvGetGattFirstCharacteristic(conn_id, serv_id, is_primary, filter_uuid, out_property, out_char_id); } +Result GetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id) { return ::btdrvGetGattNextCharacteristic(conn_id, serv_id, is_primary, char_id, filter_uuid, out_property, out_char_id); } +Result GetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id) { return ::btdrvGetGattFirstDescriptor(conn_id, serv_id, is_primary, char_id, filter_uuid, out_desc_id); } +Result GetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id) { return ::btdrvGetGattNextDescriptor(conn_id, serv_id, is_primary, char_id, desc_id, filter_uuid, out_desc_id); } +Result RegisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattManagedDataPath(uuid); } +Result UnregisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvUnregisterGattManagedDataPath(uuid); } +Result RegisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattHidDataPath(uuid); } +Result UnregisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvUnregisterGattHidDataPath(uuid); } +Result RegisterGattDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattDataPath(uuid); } +Result UnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvUnregisterGattDataPath(uuid); } +Result ReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) { return ::btdrvReadGattCharacteristic(connection_handle, is_primary, serv_id, char_id, auth_req); } +Result ReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) { return ::btdrvReadGattDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, auth_req); } +Result WriteGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response) { return ::btdrvWriteGattCharacteristic(connection_handle, is_primary, serv_id, char_id, buffer, size, auth_req, with_response); } +Result WriteGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req) { return ::btdrvWriteGattDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, buffer, size, auth_req); } +Result RegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btdrvRegisterGattNotification(connection_handle, is_primary, serv_id, char_id); } +Result UnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btdrvUnregisterGattNotification(connection_handle, is_primary, serv_id, char_id); } +Result GetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { return ::btdrvGetLeHidEventInfo(buffer, size, type); } +Result RegisterBleHidEvent(Event* out_event) { return ::btdrvRegisterBleHidEvent(out_event); } +Result SetBleScanParameter(u16 scan_interval, u16 scan_window) { return ::btdrvSetBleScanParameter(scan_interval, scan_window); } +Result MoveToSecondaryPiconet(BtdrvAddress addr) { return ::btdrvMoveToSecondaryPiconet(addr); } +Result IsBluetoothEnabled(bool *out) { return ::btdrvIsBluetoothEnabled(out); } +Result AcquireAudioEvent(Event* out_event, bool autoclear) { return ::btdrvAcquireAudioEvent(out_event, autoclear); } +Result GetAudioEventInfo(void* buffer, size_t size, BtdrvAudioEventType *type) { return ::btdrvGetAudioEventInfo(buffer, size, type); } +Result OpenAudioConnection(BtdrvAddress addr) { return ::btdrvOpenAudioConnection(addr); } +Result CloseAudioConnection(BtdrvAddress addr) { return ::btdrvCloseAudioConnection(addr); } +Result OpenAudioOut(BtdrvAddress addr, u32 *audio_handle) { return ::btdrvOpenAudioOut(addr, audio_handle); } +Result CloseAudioOut(u32 audio_handle) { return ::btdrvCloseAudioOut(audio_handle); } +Result StartAudioOut(u32 audio_handle, const BtdrvPcmParameter *pcm_param, s64 in_latency, s64 *out_latency, u64 *out1) { return ::btdrvStartAudioOut(audio_handle, pcm_param, in_latency, out_latency, out1); } +Result StopAudioOut(u32 audio_handle) { return ::btdrvStopAudioOut(audio_handle); } +Result GetAudioOutState(u32 audio_handle, BtdrvAudioOutState *out) { return ::btdrvGetAudioOutState(audio_handle, out); } +Result GetAudioOutFeedingCodec(u32 audio_handle, BtdrvAudioCodec *out) { return ::btdrvGetAudioOutFeedingCodec(audio_handle, out); } +Result GetAudioOutFeedingParameter(u32 audio_handle, BtdrvPcmParameter *out) { return ::btdrvGetAudioOutFeedingParameter(audio_handle, out); } +Result AcquireAudioOutStateChangedEvent(u32 audio_handle, Event* out_event, bool autoclear) { return ::btdrvAcquireAudioOutStateChangedEvent(audio_handle, out_event, autoclear); } +Result AcquireAudioOutBufferAvailableEvent(u32 audio_handle, Event* out_event, bool autoclear) { return ::btdrvAcquireAudioOutBufferAvailableEvent(audio_handle, out_event, autoclear); } +Result SendAudioData(u32 audio_handle, const void* buffer, size_t size, u64 *transferred_size) { return ::btdrvSendAudioData(audio_handle, buffer, size, transferred_size); } +Result AcquireAudioControlInputStateChangedEvent(Event* out_event, bool autoclear) { return ::btdrvAcquireAudioControlInputStateChangedEvent(out_event, autoclear); } +Result GetAudioControlInputState(BtdrvAudioControlButtonState *states, s32 count, s32 *total_out) { return ::btdrvGetAudioControlInputState(states, count, total_out); } +Result AcquireAudioConnectionStateChangedEvent(Event* out_event, bool autoclear) { return ::btdrvAcquireAudioConnectionStateChangedEvent(out_event, autoclear); } +Result GetConnectedAudioDevice(BtdrvAddress *addrs, s32 count, s32 *total_out) { return ::btdrvGetConnectedAudioDevice(addrs, count, total_out); } +Result CloseAudioControlInput(BtdrvAddress addr) { return ::btdrvCloseAudioControlInput(addr); } +Result RegisterAudioControlNotification(BtdrvAddress addr, u32 event_type) { return ::btdrvRegisterAudioControlNotification(addr, event_type); } +Result SendAudioControlPassthroughCommand(BtdrvAddress addr, u32 op_id, u32 state_type) { return ::btdrvSendAudioControlPassthroughCommand(addr, op_id, state_type); } +Result SendAudioControlSetAbsoluteVolumeCommand(BtdrvAddress addr, s32 val) { return ::btdrvSendAudioControlSetAbsoluteVolumeCommand(addr, val); } +Result IsManufacturingMode(bool *out) { return ::btdrvIsManufacturingMode(out); } +Result EmulateBluetoothCrash(BtdrvFatalReason reason) { return ::btdrvEmulateBluetoothCrash(reason); } +Result GetBleChannelMap(BtdrvChannelMapList *out) { return ::btdrvGetBleChannelMap(out); } +void* CircularBufferRead(BtdrvCircularBuffer *c) { return ::btdrvCircularBufferRead(c); } +bool CircularBufferFree(BtdrvCircularBuffer *c) { return ::btdrvCircularBufferFree(c); } + +} // namespace btdrv + +namespace btm { + +Result Initialize(void) { return ::btmInitialize(); } +void Exit(void) { ::btmExit(); } +Service* GetServiceSession(void) { return ::btmGetServiceSession(); } +Result GetState(BtmState *out) { return ::btmGetState(out); } +Result GetHostDeviceProperty(BtmHostDeviceProperty *out) { return ::btmGetHostDeviceProperty(out); } +Result AcquireDeviceConditionEvent(Event* out_event) { return ::btmAcquireDeviceConditionEvent(out_event); } +Result LegacyGetDeviceCondition(BtmDeviceConditionList *out) { return ::btmLegacyGetDeviceCondition(out); } +Result GetDeviceCondition(BtmProfile profile, BtmDeviceCondition *out, size_t count, s32 *total_out) { return ::btmGetDeviceCondition(profile, out, count, total_out); } +Result SetBurstMode(BtdrvAddress addr, bool flag) { return ::btmSetBurstMode(addr, flag); } +Result SetSlotMode(const BtmDeviceSlotModeList *list) { return ::btmSetSlotMode(list); } +Result SetBluetoothMode(BtmBluetoothMode mode) { return ::btmSetBluetoothMode(mode); } +Result SetWlanMode(BtmWlanMode mode) { return ::btmSetWlanMode(mode); } +Result AcquireDeviceInfoEvent(Event* out_event) { return ::btmAcquireDeviceInfoEvent(out_event); } +Result LegacyGetDeviceInfo(BtmDeviceInfoList *out) { return ::btmLegacyGetDeviceInfo(out); } +Result GetDeviceInfo(BtmProfile profile, BtmDeviceInfo *out, size_t count, s32 *total_out) { return ::btmGetDeviceInfo(profile, out, count, total_out); } +Result LegacyAddDeviceInfo(const BtmDeviceInfoLegacy *info) { return ::btmLegacyAddDeviceInfo(info); } +Result AddDeviceInfo(const BtmDeviceInfo *info) { return ::btmAddDeviceInfo(info); } +Result RemoveDeviceInfo(BtdrvAddress addr) { return ::btmRemoveDeviceInfo(addr); } +Result IncreaseDeviceInfoOrder(BtdrvAddress addr) { return ::btmIncreaseDeviceInfoOrder(addr); } +Result LlrNotify(BtdrvAddress addr, s32 unk) { return ::btmLlrNotify(addr, unk); } +Result EnableRadio(void) { return ::btmEnableRadio(); } +Result DisableRadio(void) { return ::btmDisableRadio(); } +Result HidDisconnect(BtdrvAddress addr) { return ::btmHidDisconnect(addr); } +Result HidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list) { return ::btmHidSetRetransmissionMode(addr, list); } +Result AcquireAwakeReqEvent(Event* out_event) { return ::btmAcquireAwakeReqEvent(out_event); } +Result AcquireLlrStateEvent(Event* out_event) { return ::btmAcquireLlrStateEvent(out_event); } +Result IsLlrStarted(bool *out) { return ::btmIsLlrStarted(out); } +Result EnableSlotSaving(bool flag) { return ::btmEnableSlotSaving(flag); } +Result ProtectDeviceInfo(BtdrvAddress addr, bool flag) { return ::btmProtectDeviceInfo(addr, flag); } +Result AcquireBleScanEvent(Event* out_event) { return ::btmAcquireBleScanEvent(out_event); } +Result GetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out) { return ::btmGetBleScanParameterGeneral(parameter_id, out); } +Result GetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out) { return ::btmGetBleScanParameterSmartDevice(parameter_id, out); } +Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param) { return ::btmStartBleScanForGeneral(param); } +Result StopBleScanForGeneral(void) { return ::btmStopBleScanForGeneral(); } +Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmGetBleScanResultsForGeneral(results, count, total_out); } +Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param) { return ::btmStartBleScanForPaired(param); } +Result StopBleScanForPaired(void) { return ::btmStopBleScanForPaired(); } +Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid) { return ::btmStartBleScanForSmartDevice(uuid); } +Result StopBleScanForSmartDevice(void) { return ::btmStopBleScanForSmartDevice(); } +Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmGetBleScanResultsForSmartDevice(results, count, total_out); } +Result AcquireBleConnectionEvent(Event* out_event) { return ::btmAcquireBleConnectionEvent(out_event); } +Result BleConnect(BtdrvAddress addr) { return ::btmBleConnect(addr); } +Result BleOverrideConnection(u32 id) { return ::btmBleOverrideConnection(id); } +Result BleDisconnect(u32 connection_handle) { return ::btmBleDisconnect(connection_handle); } +Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) { return ::btmBleGetConnectionState(info, count, total_out); } +Result BleGetGattClientConditionList(BtmGattClientConditionList *list) { return ::btmBleGetGattClientConditionList(list); } +Result AcquireBlePairingEvent(Event* out_event) { return ::btmAcquireBlePairingEvent(out_event); } +Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmBlePairDevice(connection_handle, param); } +Result BleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmBleUnpairDeviceOnBoth(connection_handle, param); } +Result BleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) { return ::btmBleUnPairDevice(addr, param); } +Result BleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out) { return ::btmBleGetPairedAddresses(param, addrs, count, total_out); } +Result AcquireBleServiceDiscoveryEvent(Event* out_event) { return ::btmAcquireBleServiceDiscoveryEvent(out_event); } +Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out) { return ::btmGetGattServices(connection_handle, services, count, total_out); } +Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) { return ::btmGetGattService(connection_handle, uuid, service, flag); } +Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out) { return ::btmGetGattIncludedServices(connection_handle, service_handle, services, count, out); } +Result GetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag) { return ::btmGetBelongingService(connection_handle, attribute_handle, service, flag); } +Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) { return ::btmGetGattCharacteristics(connection_handle, service_handle, characteristics, count, total_out); } +Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) { return ::btmGetGattDescriptors(connection_handle, char_handle, descriptors, count, total_out); } +Result AcquireBleMtuConfigEvent(Event* out_event) { return ::btmAcquireBleMtuConfigEvent(out_event); } +Result ConfigureBleMtu(u32 connection_handle, u16 mtu) { return ::btmConfigureBleMtu(connection_handle, mtu); } +Result GetBleMtu(u32 connection_handle, u16 *out) { return ::btmGetBleMtu(connection_handle, out); } +Result RegisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmRegisterBleGattDataPath(path); } +Result UnregisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmUnregisterBleGattDataPath(path); } +Result RegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk) { return ::btmRegisterAppletResourceUserId(AppletResourceUserId, unk); } +Result UnregisterAppletResourceUserId(u64 AppletResourceUserId) { return ::btmUnregisterAppletResourceUserId(AppletResourceUserId); } +Result SetAppletResourceUserId(u64 AppletResourceUserId) { return ::btmSetAppletResourceUserId(AppletResourceUserId); } +Result GetShortenedDeviceInfo(BtmProfile profile, BtmShortenedDeviceInfo *out, size_t count, s32 *total_out) { return ::btmGetShortenedDeviceInfo(profile, out, count, total_out); } +Result GetShortenedDeviceCondition(BtmProfile profile, BtmShortenedDeviceCondition *out, size_t count, s32 *total_out) { return ::btmGetShortenedDeviceCondition(profile, out, count, total_out); } + +} // namespace btm + +namespace btmsys { + +Result Initialize(void) { return ::btmsysInitialize(); } +void Exit(void) { ::btmsysExit(); } +Result GetServiceSession(Service* srv_out) { return ::btmsysGetServiceSession(srv_out); } +Service* GetServiceSession_IBtmSystemCore(void) { return ::btmsysGetServiceSession_IBtmSystemCore(); } +Result StartGamepadPairing(void) { return ::btmsysStartGamepadPairing(); } +Result CancelGamepadPairing(void) { return ::btmsysCancelGamepadPairing(); } +Result ClearGamepadPairingDatabase(void) { return ::btmsysClearGamepadPairingDatabase(); } +Result GetPairedGamepadCount(u8 *out) { return ::btmsysGetPairedGamepadCount(out); } +Result EnableRadio(void) { return ::btmsysEnableRadio(); } +Result DisableRadio(void) { return ::btmsysDisableRadio(); } +Result GetRadioOnOff(bool *out) { return ::btmsysGetRadioOnOff(out); } +Result AcquireRadioEvent(Event* out_event) { return ::btmsysAcquireRadioEvent(out_event); } +Result AcquireGamepadPairingEvent(Event* out_event) { return ::btmsysAcquireGamepadPairingEvent(out_event); } +Result IsGamepadPairingStarted(bool *out) { return ::btmsysIsGamepadPairingStarted(out); } +Result StartAudioDeviceDiscovery(void) { return ::btmsysStartAudioDeviceDiscovery(); } +Result StopAudioDeviceDiscovery(void) { return ::btmsysStopAudioDeviceDiscovery(); } +Result IsDiscoveryingAudioDevice(bool *out) { return ::btmsysIsDiscoveryingAudioDevice(out); } +Result GetDiscoveredAudioDevice(BtmAudioDevice *out, s32 count, s32 *total_out) { return ::btmsysGetDiscoveredAudioDevice(out, count, total_out); } +Result AcquireAudioDeviceConnectionEvent(Event* out_event) { return ::btmsysAcquireAudioDeviceConnectionEvent(out_event); } +Result ConnectAudioDevice(BtdrvAddress addr) { return ::btmsysConnectAudioDevice(addr); } +Result IsConnectingAudioDevice(bool *out) { return ::btmsysIsConnectingAudioDevice(out); } +Result GetConnectedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out) { return ::btmsysGetConnectedAudioDevices(out, count, total_out); } +Result DisconnectAudioDevice(BtdrvAddress addr) { return ::btmsysDisconnectAudioDevice(addr); } +Result AcquirePairedAudioDeviceInfoChangedEvent(Event* out_event) { return ::btmsysAcquirePairedAudioDeviceInfoChangedEvent(out_event); } +Result GetPairedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out) { return ::btmsysGetPairedAudioDevices(out, count, total_out); } +Result RemoveAudioDevicePairing(BtdrvAddress addr) { return ::btmsysRemoveAudioDevicePairing(addr); } +Result RequestAudioDeviceConnectionRejection(void) { return ::btmsysRequestAudioDeviceConnectionRejection(); } +Result CancelAudioDeviceConnectionRejection(void) { return ::btmsysCancelAudioDeviceConnectionRejection(); } + +} // namespace btmsys + +namespace btmu { + +Result Initialize(void) { return ::btmuInitialize(); } +void Exit(void) { ::btmuExit(); } +Result GetServiceSession(Service* srv_out) { return ::btmuGetServiceSession(srv_out); } +Service* GetServiceSession_IBtmUserCore(void) { return ::btmuGetServiceSession_IBtmUserCore(); } +Result AcquireBleScanEvent(Event* out_event) { return ::btmuAcquireBleScanEvent(out_event); } +Result GetBleScanFilterParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out) { return ::btmuGetBleScanFilterParameter(parameter_id, out); } +Result GetBleScanFilterParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out) { return ::btmuGetBleScanFilterParameter2(parameter_id, out); } +Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param) { return ::btmuStartBleScanForGeneral(param); } +Result StopBleScanForGeneral(void) { return ::btmuStopBleScanForGeneral(); } +Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmuGetBleScanResultsForGeneral(results, count, total_out); } +Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param) { return ::btmuStartBleScanForPaired(param); } +Result StopBleScanForPaired(void) { return ::btmuStopBleScanForPaired(); } +Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid) { return ::btmuStartBleScanForSmartDevice(uuid); } +Result StopBleScanForSmartDevice(void) { return ::btmuStopBleScanForSmartDevice(); } +Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmuGetBleScanResultsForSmartDevice(results, count, total_out); } +Result AcquireBleConnectionEvent(Event* out_event) { return ::btmuAcquireBleConnectionEvent(out_event); } +Result BleConnect(BtdrvAddress addr) { return ::btmuBleConnect(addr); } +Result BleDisconnect(u32 connection_handle) { return ::btmuBleDisconnect(connection_handle); } +Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) { return ::btmuBleGetConnectionState(info, count, total_out); } +Result AcquireBlePairingEvent(Event* out_event) { return ::btmuAcquireBlePairingEvent(out_event); } +Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmuBlePairDevice(connection_handle, param); } +Result BleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmuBleUnPairDevice(connection_handle, param); } +Result BleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) { return ::btmuBleUnPairDevice2(addr, param); } +Result BleGetPairedDevices(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out) { return ::btmuBleGetPairedDevices(param, addrs, count, total_out); } +Result AcquireBleServiceDiscoveryEvent(Event* out_event) { return ::btmuAcquireBleServiceDiscoveryEvent(out_event); } +Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out) { return ::btmuGetGattServices(connection_handle, services, count, total_out); } +Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) { return ::btmuGetGattService(connection_handle, uuid, service, flag); } +Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out) { return ::btmuGetGattIncludedServices(connection_handle, service_handle, services, count, out); } +Result GetBelongingGattService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag) { return ::btmuGetBelongingGattService(connection_handle, attribute_handle, service, flag); } +Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) { return ::btmuGetGattCharacteristics(connection_handle, service_handle, characteristics, count, total_out); } +Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) { return ::btmuGetGattDescriptors(connection_handle, char_handle, descriptors, count, total_out); } +Result AcquireBleMtuConfigEvent(Event* out_event) { return ::btmuAcquireBleMtuConfigEvent(out_event); } +Result ConfigureBleMtu(u32 connection_handle, u16 mtu) { return ::btmuConfigureBleMtu(connection_handle, mtu); } +Result GetBleMtu(u32 connection_handle, u16 *out) { return ::btmuGetBleMtu(connection_handle, out); } +Result RegisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmuRegisterBleGattDataPath(path); } +Result UnregisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmuUnregisterBleGattDataPath(path); } + +} // namespace btmu + +namespace capmtp { + +Result Initialize(void* mem, size_t size, u32 app_count, u32 max_img, u32 max_vid, const char *other_name) { return ::capmtpInitialize(mem, size, app_count, max_img, max_vid, other_name); } +void Exit(void) { ::capmtpExit(); } +Service* GetRootServiceSession(void) { return ::capmtpGetRootServiceSession(); } +Service* GetServiceSession(void) { return ::capmtpGetServiceSession(); } +Result StartCommandHandler(void) { return ::capmtpStartCommandHandler(); } +Result StopCommandHandler(void) { return ::capmtpStopCommandHandler(); } +bool IsRunning(void) { return ::capmtpIsRunning(); } +Event * GetConnectionEvent(void) { return ::capmtpGetConnectionEvent(); } +bool IsConnected(void) { return ::capmtpIsConnected(); } +Event * GetScanErrorEvent(void) { return ::capmtpGetScanErrorEvent(); } +Result GetScanError(void) { return ::capmtpGetScanError(); } + +} // namespace capmtp + +namespace caps { + +u64 GetShimLibraryVersion(void) { return ::capsGetShimLibraryVersion(); } +CapsAlbumFileDateTime GetDefaultStartDateTime(void) { return ::capsGetDefaultStartDateTime(); } +CapsAlbumFileDateTime GetDefaultEndDateTime(void) { return ::capsGetDefaultEndDateTime(); } +void ConvertApplicationAlbumFileEntryToApplicationAlbumEntry(CapsApplicationAlbumEntry *out, CapsApplicationAlbumFileEntry *in) { ::capsConvertApplicationAlbumFileEntryToApplicationAlbumEntry(out, in); } +void ConvertApplicationAlbumEntryToApplicationAlbumFileEntry(CapsApplicationAlbumFileEntry *out, CapsApplicationAlbumEntry *in) { ::capsConvertApplicationAlbumEntryToApplicationAlbumFileEntry(out, in); } +Result LoadAlbumScreenShotThumbnailImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsLoadAlbumScreenShotThumbnailImageEx0(width, height, attr, file_id, opts, image, image_size, workbuf, workbuf_size); } + +} // namespace caps + +namespace capsa { + +Result Initialize(void) { return ::capsaInitialize(); } +void Exit(void) { ::capsaExit(); } +Service* GetServiceSession(void) { return ::capsaGetServiceSession(); } +Service* GetServiceSession_Accessor(void) { return ::capsaGetServiceSession_Accessor(); } +Result GetAlbumFileCount(CapsAlbumStorage storage, u64 *count) { return ::capsaGetAlbumFileCount(storage, count); } +Result GetAlbumFileList(CapsAlbumStorage storage, u64 *out, CapsAlbumEntry *entries, u64 count) { return ::capsaGetAlbumFileList(storage, out, entries, count); } +Result LoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* filebuf, u64 filebuf_size) { return ::capsaLoadAlbumFile(file_id, out_size, filebuf, filebuf_size); } +Result DeleteAlbumFile(const CapsAlbumFileId *file_id) { return ::capsaDeleteAlbumFile(file_id); } +Result StorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage) { return ::capsaStorageCopyAlbumFile(file_id, dst_storage); } +Result IsAlbumMounted(CapsAlbumStorage storage, bool *is_mounted) { return ::capsaIsAlbumMounted(storage, is_mounted); } +Result GetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out) { return ::capsaGetAlbumUsage(storage, out); } +Result GetAlbumFileSize(const CapsAlbumFileId *file_id, u64 *size) { return ::capsaGetAlbumFileSize(file_id, size); } +Result LoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size) { return ::capsaLoadAlbumFileThumbnail(file_id, out_size, image, image_size); } +Result LoadAlbumScreenShotImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImage(width, height, file_id, image, image_size, workbuf, workbuf_size); } +Result LoadAlbumScreenShotThumbnailImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotThumbnailImage(width, height, file_id, image, image_size, workbuf, workbuf_size); } +Result GetAlbumEntryFromApplicationAlbumEntry(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry, u64 application_id) { return ::capsaGetAlbumEntryFromApplicationAlbumEntry(entry, application_entry, application_id); } +Result LoadAlbumScreenShotImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImageEx(width, height, file_id, opts, image, image_size, workbuf, workbuf_size); } +Result LoadAlbumScreenShotThumbnailImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotThumbnailImageEx(width, height, file_id, opts, image, image_size, workbuf, workbuf_size); } +Result LoadAlbumScreenShotImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImageEx0(width, height, attr, file_id, opts, image, image_size, workbuf, workbuf_size); } +Result GetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out) { return ::capsaGetAlbumUsage3(storage, out); } +Result GetAlbumMountResult(CapsAlbumStorage storage) { return ::capsaGetAlbumMountResult(storage); } +Result GetAlbumUsage16(CapsAlbumStorage storage, u8 flags, CapsAlbumUsage16 *out) { return ::capsaGetAlbumUsage16(storage, flags, out); } +Result GetMinMaxAppletId(bool* success, u64* min, u64* max) { return ::capsaGetMinMaxAppletId(success, min, max); } +Result GetAlbumFileCountEx0(CapsAlbumStorage storage, u8 flags, u64 *count) { return ::capsaGetAlbumFileCountEx0(storage, flags, count); } +Result GetAlbumFileListEx0(CapsAlbumStorage storage, u8 flags, u64 *out, CapsAlbumEntry *entries, u64 count) { return ::capsaGetAlbumFileListEx0(storage, flags, out, entries, count); } +Result GetLastOverlayScreenShotThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size) { return ::capsaGetLastOverlayScreenShotThumbnail(file_id, out_size, image, image_size); } +Result GetLastOverlayMovieThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size) { return ::capsaGetLastOverlayMovieThumbnail(file_id, out_size, image, image_size); } +Result GetAutoSavingStorage(CapsAlbumStorage *storage) { return ::capsaGetAutoSavingStorage(storage); } +Result GetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64 *out) { return ::capsaGetRequiredStorageSpaceSizeToCopyAll(dst_storage, src_storage, out); } +Result LoadAlbumScreenShotImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImageEx1(file_id, opts, out, image, image_size, workbuf, workbuf_size); } +Result LoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotThumbnailImageEx1(file_id, opts, out, image, image_size, workbuf, workbuf_size); } +Result ForceAlbumUnmounted(CapsAlbumStorage storage) { return ::capsaForceAlbumUnmounted(storage); } +Result ResetAlbumMountStatus(CapsAlbumStorage storage) { return ::capsaResetAlbumMountStatus(storage); } +Result RefreshAlbumCache(CapsAlbumStorage storage) { return ::capsaRefreshAlbumCache(storage); } +Result GetAlbumCache(CapsAlbumStorage storage, CapsAlbumCache *cache) { return ::capsaGetAlbumCache(storage, cache); } +Result GetAlbumCacheEx(CapsAlbumStorage storage, CapsAlbumFileContents contents, CapsAlbumCache *cache) { return ::capsaGetAlbumCacheEx(storage, contents, cache); } +Result GetAlbumEntryFromApplicationAlbumEntryAruid(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry) { return ::capsaGetAlbumEntryFromApplicationAlbumEntryAruid(entry, application_entry); } +Result OpenAlbumMovieStream(u64 *stream, const CapsAlbumFileId *file_id) { return ::capsaOpenAlbumMovieStream(stream, file_id); } +Result CloseAlbumMovieStream(u64 stream) { return ::capsaCloseAlbumMovieStream(stream); } +Result GetAlbumMovieStreamSize(u64 stream, u64 *size) { return ::capsaGetAlbumMovieStreamSize(stream, size); } +Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capsaReadMovieDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } +Result GetAlbumMovieReadStreamBrokenReason(u64 stream) { return ::capsaGetAlbumMovieReadStreamBrokenReason(stream); } +Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size) { return ::capsaGetAlbumMovieReadStreamImageDataSize(stream, size); } +Result ReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capsaReadImageDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } +Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attr) { return ::capsaReadFileAttributeFromAlbumMovieReadStream(stream, attr); } + +} // namespace capsa + +namespace capsc { + +Result Initialize(void) { return ::capscInitialize(); } +void Exit(void) { ::capscExit(); } +Service* GetServiceSession(void) { return ::capscGetServiceSession(); } +Result NotifyAlbumStorageIsAvailable(CapsAlbumStorage storage) { return ::capscNotifyAlbumStorageIsAvailable(storage); } +Result NotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage) { return ::capscNotifyAlbumStorageIsUnAvailable(storage); } +Result RegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id) { return ::capscRegisterAppletResourceUserId(appletResourceUserId, application_id); } +Result UnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id) { return ::capscUnregisterAppletResourceUserId(appletResourceUserId, application_id); } +Result GetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid) { return ::capscGetApplicationIdFromAruid(application_id, aruid); } +Result CheckApplicationIdRegistered(u64 application_id) { return ::capscCheckApplicationIdRegistered(application_id); } +Result GenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id) { return ::capscGenerateCurrentAlbumFileId(application_id, contents, file_id); } +Result GenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id) { return ::capscGenerateApplicationAlbumEntry(appEntry, entry, application_id); } +Result SaveAlbumScreenShotFile(const CapsAlbumFileId *file_id, const void* buffer, u64 buffer_size) { return ::capscSaveAlbumScreenShotFile(file_id, buffer, buffer_size); } +Result SaveAlbumScreenShotFileEx(const CapsAlbumFileId *file_id, u64 version, u64 makernote_offset, u64 makernote_size, const void* buffer, u64 buffer_size) { return ::capscSaveAlbumScreenShotFileEx(file_id, version, makernote_offset, makernote_size, buffer, buffer_size); } +Result SetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size) { return ::capscSetOverlayScreenShotThumbnailData(file_id, image, image_size); } +Result SetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size) { return ::capscSetOverlayMovieThumbnailData(file_id, image, image_size); } +Result OpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id) { return ::capscOpenAlbumMovieReadStream(stream, file_id); } +Result CloseAlbumMovieStream(u64 stream) { return ::capscCloseAlbumMovieStream(stream); } +Result GetAlbumMovieStreamSize(u64 stream, u64 *size) { return ::capscGetAlbumMovieStreamSize(stream, size); } +Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capscReadMovieDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } +Result GetAlbumMovieReadStreamBrokenReason(u64 stream) { return ::capscGetAlbumMovieReadStreamBrokenReason(stream); } +Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size) { return ::capscGetAlbumMovieReadStreamImageDataSize(stream, size); } +Result ReadImageDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capscReadImageDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } +Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute) { return ::capscReadFileAttributeFromAlbumMovieReadStream(stream, attribute); } +Result OpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id) { return ::capscOpenAlbumMovieWriteStream(stream, file_id); } +Result FinishAlbumMovieWriteStream(u64 stream) { return ::capscFinishAlbumMovieWriteStream(stream); } +Result CommitAlbumMovieWriteStream(u64 stream) { return ::capscCommitAlbumMovieWriteStream(stream); } +Result DiscardAlbumMovieWriteStream(u64 stream) { return ::capscDiscardAlbumMovieWriteStream(stream); } +Result DiscardAlbumMovieWriteStreamNoDelete(u64 stream) { return ::capscDiscardAlbumMovieWriteStreamNoDelete(stream); } +Result CommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry) { return ::capscCommitAlbumMovieWriteStreamEx(stream, entry); } +Result StartAlbumMovieWriteStreamDataSection(u64 stream) { return ::capscStartAlbumMovieWriteStreamDataSection(stream); } +Result EndAlbumMovieWriteStreamDataSection(u64 stream) { return ::capscEndAlbumMovieWriteStreamDataSection(stream); } +Result StartAlbumMovieWriteStreamMetaSection(u64 stream) { return ::capscStartAlbumMovieWriteStreamMetaSection(stream); } +Result EndAlbumMovieWriteStreamMetaSection(u64 stream) { return ::capscEndAlbumMovieWriteStreamMetaSection(stream); } +Result ReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size) { return ::capscReadDataFromAlbumMovieWriteStream(stream, offset, buffer, size, actual_size); } +Result WriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size) { return ::capscWriteDataToAlbumMovieWriteStream(stream, offset, buffer, size); } +Result WriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size) { return ::capscWriteMetaToAlbumMovieWriteStream(stream, offset, buffer, size); } +Result GetAlbumMovieWriteStreamBrokenReason(u64 stream) { return ::capscGetAlbumMovieWriteStreamBrokenReason(stream); } +Result GetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size) { return ::capscGetAlbumMovieWriteStreamDataSize(stream, size); } +Result SetAlbumMovieWriteStreamDataSize(u64 stream, u64 size) { return ::capscSetAlbumMovieWriteStreamDataSize(stream, size); } + +} // namespace capsc + +namespace capsdc { + +Result Initialize(void) { return ::capsdcInitialize(); } +void Exit(void) { ::capsdcExit(); } +Service* GetServiceSession(void) { return ::capsdcGetServiceSession(); } +Result DecodeJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_image, size_t out_image_size) { return ::capsdcDecodeJpeg(width, height, opts, jpeg, jpeg_size, out_image, out_image_size); } +Result ShrinkJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size) { return ::capsdcShrinkJpeg(width, height, opts, jpeg, jpeg_size, out_jpeg, out_jpeg_size, out_result_size); } +Result ShrinkJpegEx(u32 scaled_width, u32 scaled_height, u32 jpeg_quality, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size) { return ::capsdcShrinkJpegEx(scaled_width, scaled_height, jpeg_quality, opts, jpeg, jpeg_size, out_jpeg, out_jpeg_size, out_result_size); } + +} // namespace capsdc + +namespace capssc { + +Result Initialize(void) { return ::capsscInitialize(); } +void Exit(void) { ::capsscExit(); } +Service* GetServiceSession(void) { return ::capsscGetServiceSession(); } +Result CaptureRawImageWithTimeout(void* buf, size_t size, ViLayerStack layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, s64 timeout) { return ::capsscCaptureRawImageWithTimeout(buf, size, layer_stack, width, height, buffer_count, buffer_index, timeout); } +Result OpenRawScreenShotReadStream(u64 *out_size, u64 *out_width, u64 *out_height, ViLayerStack layer_stack, s64 timeout) { return ::capsscOpenRawScreenShotReadStream(out_size, out_width, out_height, layer_stack, timeout); } +Result CloseRawScreenShotReadStream(void) { return ::capsscCloseRawScreenShotReadStream(); } +Result ReadRawScreenShotReadStream(u64 *bytes_read, void* buf, size_t size, u64 offset) { return ::capsscReadRawScreenShotReadStream(bytes_read, buf, size, offset); } +Result CaptureJpegScreenShot(u64* out_jpeg_size, void* jpeg_buf, size_t jpeg_buf_size, ViLayerStack layer_stack, s64 timeout) { return ::capsscCaptureJpegScreenShot(out_jpeg_size, jpeg_buf, jpeg_buf_size, layer_stack, timeout); } + +} // namespace capssc + +namespace capssu { + +Result Initialize(void) { return ::capssuInitialize(); } +void Exit(void) { ::capssuExit(); } +Service* GetServiceSession(void) { return ::capssuGetServiceSession(); } +Result SaveScreenShot(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShot(buffer, size, reportoption, orientation, out); } +Result SaveScreenShotWithUserData(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const void* userdata, size_t userdata_size, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotWithUserData(buffer, size, reportoption, orientation, userdata, userdata_size, out); } +Result SaveScreenShotWithUserIds(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const AccountUid* uids, size_t uid_count, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotWithUserIds(buffer, size, reportoption, orientation, uids, uid_count, out); } +Result SaveScreenShotEx0(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotEx0(buffer, size, attr, reportoption, out); } +Result SaveScreenShotEx1(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationData *appdata, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotEx1(buffer, size, attr, reportoption, appdata, out); } +Result SaveScreenShotEx2(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsUserIdList *list, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotEx2(buffer, size, attr, reportoption, list, out); } + +} // namespace capssu + +namespace capsu { + +Result Initialize(void) { return ::capsuInitialize(); } +void Exit(void) { ::capsuExit(); } +Service* GetServiceSession(void) { return ::capsuGetServiceSession(); } +Service* GetServiceSession_Accessor(void) { return ::capsuGetServiceSession_Accessor(); } +Result GetAlbumFileListDeprecated1(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries) { return ::capsuGetAlbumFileListDeprecated1(entries, count, type, start_datetime, end_datetime, total_entries); } +Result GetAlbumFileListDeprecated2(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries) { return ::capsuGetAlbumFileListDeprecated2(entries, count, type, start_datetime, end_datetime, uid, total_entries); } +Result GetAlbumFileList3(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries) { return ::capsuGetAlbumFileList3(entries, count, type, start_datetime, end_datetime, total_entries); } +Result GetAlbumFileList4(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries) { return ::capsuGetAlbumFileList4(entries, count, type, start_datetime, end_datetime, uid, total_entries); } +Result DeleteAlbumFile(CapsContentType type, const CapsApplicationAlbumFileEntry *entry) { return ::capsuDeleteAlbumFile(type, entry); } +Result GetAlbumFileSize(const CapsApplicationAlbumFileEntry *entry, u64 *size) { return ::capsuGetAlbumFileSize(entry, size); } +Result LoadAlbumScreenShotImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option) { return ::capsuLoadAlbumScreenShotImage(width, height, attr, userdata, userdata_maxsize, userdata_size, image, image_size, workbuf, workbuf_size, entry, option); } +Result LoadAlbumScreenShotThumbnailImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option) { return ::capsuLoadAlbumScreenShotThumbnailImage(width, height, attr, userdata, userdata_maxsize, userdata_size, image, image_size, workbuf, workbuf_size, entry, option); } +Result PrecheckToCreateContents(CapsContentType type, u64 unk) { return ::capsuPrecheckToCreateContents(type, unk); } +Result OpenAlbumMovieStream(u64 *stream, const CapsApplicationAlbumFileEntry *entry) { return ::capsuOpenAlbumMovieStream(stream, entry); } +Result CloseAlbumMovieStream(u64 stream) { return ::capsuCloseAlbumMovieStream(stream); } +Result GetAlbumMovieStreamSize(u64 stream, u64 *size) { return ::capsuGetAlbumMovieStreamSize(stream, size); } +Result ReadAlbumMovieStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capsuReadAlbumMovieStream(stream, offset, buffer, size, actual_size); } +Result GetAlbumMovieStreamBrokenReason(u64 stream) { return ::capsuGetAlbumMovieStreamBrokenReason(stream); } + +} // namespace capsu + +namespace clkrst { + +Result Initialize(void) { return ::clkrstInitialize(); } +void Exit(void) { ::clkrstExit(); } +Service* GetServiceSession(void) { return ::clkrstGetServiceSession(); } +Result OpenSession(ClkrstSession* session_out, PcvModuleId module_id, u32 unk) { return ::clkrstOpenSession(session_out, module_id, unk); } +void CloseSession(ClkrstSession* session) { ::clkrstCloseSession(session); } +Result SetClockRate(ClkrstSession* session, u32 hz) { return ::clkrstSetClockRate(session, hz); } +Result GetClockRate(ClkrstSession* session, u32 *out_hz) { return ::clkrstGetClockRate(session, out_hz); } +// Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz) { return ::clkrstSetMinimumVoltageClockRate(session, hz); } +Result GetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count) { return ::clkrstGetPossibleClockRates(session, rates, max_count, out_type, out_count); } +// Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count) { return ::clkrstGetDvfsTable(session, out_rate_table, in_rate_count, out_voltage_table, in_voltage_count, out_count); } + +} // namespace clkrst + +namespace cmac { + +void Aes128ContextCreate(Aes128CmacContext *out, const void *key) { ::cmacAes128ContextCreate(out, key); } +void Aes128ContextUpdate(Aes128CmacContext *ctx, const void *src, size_t size) { ::cmacAes128ContextUpdate(ctx, src, size); } +void Aes128ContextGetMac(Aes128CmacContext *ctx, void *dst) { ::cmacAes128ContextGetMac(ctx, dst); } +void Aes128CalculateMac(void *dst, const void *key, const void *src, size_t size) { ::cmacAes128CalculateMac(dst, key, src, size); } +void Aes192ContextCreate(Aes192CmacContext *out, const void *key) { ::cmacAes192ContextCreate(out, key); } +void Aes192ContextUpdate(Aes192CmacContext *ctx, const void *src, size_t size) { ::cmacAes192ContextUpdate(ctx, src, size); } +void Aes192ContextGetMac(Aes192CmacContext *ctx, void *dst) { ::cmacAes192ContextGetMac(ctx, dst); } +void Aes192CalculateMac(void *dst, const void *key, const void *src, size_t size) { ::cmacAes192CalculateMac(dst, key, src, size); } +void Aes256ContextCreate(Aes256CmacContext *out, const void *key) { ::cmacAes256ContextCreate(out, key); } +void Aes256ContextUpdate(Aes256CmacContext *ctx, const void *src, size_t size) { ::cmacAes256ContextUpdate(ctx, src, size); } +void Aes256ContextGetMac(Aes256CmacContext *ctx, void *dst) { ::cmacAes256ContextGetMac(ctx, dst); } +void Aes256CalculateMac(void *dst, const void *key, const void *src, size_t size) { ::cmacAes256CalculateMac(dst, key, src, size); } + +} // namespace cmac + +namespace cmif { + +void* GetAlignedDataStart(u32* data_words, void* base) { return ::cmifGetAlignedDataStart(data_words, base); } +CmifRequest MakeRequest(void* base, CmifRequestFormat fmt) { return ::cmifMakeRequest(base, fmt); } +void* MakeControlRequest(void* base, u32 request_id, u32 size) { return ::cmifMakeControlRequest(base, request_id, size); } +void MakeCloseRequest(void* base, u32 object_id) { ::cmifMakeCloseRequest(base, object_id); } +void RequestInBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestInBuffer(req, buffer, size, mode); } +void RequestOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestOutBuffer(req, buffer, size, mode); } +void RequestInOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestInOutBuffer(req, buffer, size, mode); } +void RequestInPointer(CmifRequest* req, const void* buffer, size_t size) { ::cmifRequestInPointer(req, buffer, size); } +void RequestOutFixedPointer(CmifRequest* req, void* buffer, size_t size) { ::cmifRequestOutFixedPointer(req, buffer, size); } +void RequestOutPointer(CmifRequest* req, void* buffer, size_t size) { ::cmifRequestOutPointer(req, buffer, size); } +void RequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestInAutoBuffer(req, buffer, size, mode); } +void RequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestOutAutoBuffer(req, buffer, size, mode); } +void RequestObject(CmifRequest* req, u32 object_id) { ::cmifRequestObject(req, object_id); } +void RequestHandle(CmifRequest* req, Handle handle) { ::cmifRequestHandle(req, handle); } +Result ParseResponse(CmifResponse* res, void* base, bool is_domain, u32 size) { return ::cmifParseResponse(res, base, is_domain, size); } +u32 ResponseGetObject(CmifResponse* res) { return ::cmifResponseGetObject(res); } +Handle ResponseGetCopyHandle(CmifResponse* res) { return ::cmifResponseGetCopyHandle(res); } +Handle ResponseGetMoveHandle(CmifResponse* res) { return ::cmifResponseGetMoveHandle(res); } +Result ConvertCurrentObjectToDomain(Handle h, u32* out_object_id) { return ::cmifConvertCurrentObjectToDomain(h, out_object_id); } +Result CopyFromCurrentDomain(Handle h, u32 object_id, Handle* out_h) { return ::cmifCopyFromCurrentDomain(h, object_id, out_h); } +Result CloneCurrentObject(Handle h, Handle* out_h) { return ::cmifCloneCurrentObject(h, out_h); } +Result QueryPointerBufferSize(Handle h, u16* out_size) { return ::cmifQueryPointerBufferSize(h, out_size); } +Result CloneCurrentObjectEx(Handle h, u32 tag, Handle* out_h) { return ::cmifCloneCurrentObjectEx(h, tag, out_h); } + +} // namespace cmif + +namespace condvar { + +void Init(CondVar* c) { ::condvarInit(c); } +Result WaitTimeout(CondVar* c, Mutex* m, u64 timeout) { return ::condvarWaitTimeout(c, m, timeout); } +Result Wait(CondVar* c, Mutex* m) { return ::condvarWait(c, m); } +Result Wake(CondVar* c, int num) { return ::condvarWake(c, num); } +Result WakeOne(CondVar* c) { return ::condvarWakeOne(c); } +Result WakeAll(CondVar* c) { return ::condvarWakeAll(c); } + +} // namespace condvar + +namespace console { + +void SetFont(PrintConsole* console, ConsoleFont* font) { ::consoleSetFont(console, font); } +void SetWindow(PrintConsole* console, int x, int y, int width, int height) { ::consoleSetWindow(console, x, y, width, height); } +PrintConsole* GetDefault(void) { return ::consoleGetDefault(); } +PrintConsole * Select(PrintConsole* console) { return ::consoleSelect(console); } +PrintConsole* Init(PrintConsole* console) { return ::consoleInit(console); } +void Exit(PrintConsole* console) { ::consoleExit(console); } +void Update(PrintConsole* console) { ::consoleUpdate(console); } +void DebugInit(debugDevice device) { ::consoleDebugInit(device); } +void Clear(void) { ::consoleClear(); } + +} // namespace console + +namespace crc32 { + +u32 CalculateWithSeed(u32 seed, const void *src, size_t size) { return ::crc32CalculateWithSeed(seed, src, size); } +u32 Calculate(const void *src, size_t size) { return ::crc32Calculate(src, size); } + +} // namespace crc32 + +namespace crc32c { + +u32 CalculateWithSeed(u32 seed, const void *src, size_t size) { return ::crc32cCalculateWithSeed(seed, src, size); } +u32 Calculate(const void *src, size_t size) { return ::crc32cCalculate(src, size); } + +} // namespace crc32c + +namespace csrng { + +Result Initialize(void) { return ::csrngInitialize(); } +void Exit(void) { ::csrngExit(); } +Service* GetServiceSession(void) { return ::csrngGetServiceSession(); } +Result GetRandomBytes(void *out, size_t out_size) { return ::csrngGetRandomBytes(out, out_size); } + +} // namespace csrng + +namespace detect { + +bool Debugger(void) { return ::detectDebugger(); } +bool Mesosphere(void) { return ::detectMesosphere(); } + +} // namespace detect + +namespace diag { + +[[noreturn]] void AbortWithResult(Result res) { ::diagAbortWithResult(res); } + +} // namespace diag + +namespace ectxr { + +Result Initialize(void) { return ::ectxrInitialize(); } +void Exit(void) { ::ectxrExit(); } +Service* GetServiceSession(void) { return ::ectxrGetServiceSession(); } +Result PullContext(s32 *out0, u32 *out_total_size, u32 *out_size, void *dst, size_t dst_size, u32 descriptor, Result result) { return ::ectxrPullContext(out0, out_total_size, out_size, dst, dst_size, descriptor, result); } + +} // namespace ectxr + +namespace env { + +void Setup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr) { ::envSetup(ctx, main_thread, saved_lr); } +const char* GetLoaderInfo(void) { return ::envGetLoaderInfo(); } +u64 GetLoaderInfoSize(void) { return ::envGetLoaderInfoSize(); } +Handle GetMainThreadHandle(void) { return ::envGetMainThreadHandle(); } +bool IsNso(void) { return ::envIsNso(); } +bool HasHeapOverride(void) { return ::envHasHeapOverride(); } +void* GetHeapOverrideAddr(void) { return ::envGetHeapOverrideAddr(); } +u64 GetHeapOverrideSize(void) { return ::envGetHeapOverrideSize(); } +bool HasArgv(void) { return ::envHasArgv(); } +void* GetArgv(void) { return ::envGetArgv(); } +bool IsSyscallHinted(unsigned svc) { return ::envIsSyscallHinted(svc); } +Handle GetOwnProcessHandle(void) { return ::envGetOwnProcessHandle(); } +LoaderReturnFn GetExitFuncPtr(void) { return ::envGetExitFuncPtr(); } +void SetExitFuncPtr(LoaderReturnFn addr) { ::envSetExitFuncPtr(addr); } +Result SetNextLoad(const char* path, const char* argv) { return ::envSetNextLoad(path, argv); } +bool HasNextLoad(void) { return ::envHasNextLoad(); } +Result GetLastLoadResult(void) { return ::envGetLastLoadResult(); } +bool HasRandomSeed(void) { return ::envHasRandomSeed(); } +void GetRandomSeed(u64 out[2]) { ::envGetRandomSeed(out); } +AccountUid* GetUserIdStorage(void) { return ::envGetUserIdStorage(); } + +} // namespace env + +namespace error { + +ErrorCode CodeCreate(u32 low, u32 desc) { return ::errorCodeCreate(low, desc); } +ErrorCode CodeCreateResult(Result res) { return ::errorCodeCreateResult(res); } +ErrorCode CodeCreateInvalid(void) { return ::errorCodeCreateInvalid(); } +bool CodeIsValid(ErrorCode errorCode) { return ::errorCodeIsValid(errorCode); } +Result ResultShow(Result res, bool jumpFlag, const ErrorContext* ctx) { return ::errorResultShow(res, jumpFlag, ctx); } +Result CodeShow(ErrorCode errorCode, bool jumpFlag, const ErrorContext* ctx) { return ::errorCodeShow(errorCode, jumpFlag, ctx); } +Result ResultBacktraceCreate(ErrorResultBacktrace* backtrace, s32 count, const Result* entries) { return ::errorResultBacktraceCreate(backtrace, count, entries); } +Result ResultBacktraceShow(Result res, const ErrorResultBacktrace* backtrace) { return ::errorResultBacktraceShow(res, backtrace); } +Result EulaShow(SetRegion RegionCode) { return ::errorEulaShow(RegionCode); } +Result SystemUpdateEulaShow(SetRegion RegionCode, const ErrorEulaData* eula) { return ::errorSystemUpdateEulaShow(RegionCode, eula); } +Result CodeRecordShow(ErrorCode errorCode, u64 timestamp) { return ::errorCodeRecordShow(errorCode, timestamp); } +Result ResultRecordShow(Result res, u64 timestamp) { return ::errorResultRecordShow(res, timestamp); } +Result SystemCreate(ErrorSystemConfig* c, const char* dialog_message, const char* fullscreen_message) { return ::errorSystemCreate(c, dialog_message, fullscreen_message); } +Result SystemShow(ErrorSystemConfig* c) { return ::errorSystemShow(c); } +void SystemSetCode(ErrorSystemConfig* c, ErrorCode errorCode) { ::errorSystemSetCode(c, errorCode); } +void SystemSetResult(ErrorSystemConfig* c, Result res) { ::errorSystemSetResult(c, res); } +void SystemSetLanguageCode(ErrorSystemConfig* c, u64 LanguageCode) { ::errorSystemSetLanguageCode(c, LanguageCode); } +void SystemSetContext(ErrorSystemConfig* c, const ErrorContext* ctx) { ::errorSystemSetContext(c, ctx); } +Result ApplicationCreate(ErrorApplicationConfig* c, const char* dialog_message, const char* fullscreen_message) { return ::errorApplicationCreate(c, dialog_message, fullscreen_message); } +Result ApplicationShow(ErrorApplicationConfig* c) { return ::errorApplicationShow(c); } +void ApplicationSetNumber(ErrorApplicationConfig* c, u32 errorNumber) { ::errorApplicationSetNumber(c, errorNumber); } +void ApplicationSetLanguageCode(ErrorApplicationConfig* c, u64 LanguageCode) { ::errorApplicationSetLanguageCode(c, LanguageCode); } + +} // namespace error + +namespace event { + +Result Create(Event* t, bool autoclear) { return ::eventCreate(t, autoclear); } +void LoadRemote(Event* t, Handle handle, bool autoclear) { ::eventLoadRemote(t, handle, autoclear); } +void Close(Event* t) { ::eventClose(t); } +bool Active(Event* t) { return ::eventActive(t); } +Result Wait(Event* t, u64 timeout) { return ::eventWait(t, timeout); } +Result Fire(Event* t) { return ::eventFire(t); } +Result Clear(Event* t) { return ::eventClear(t); } + +} // namespace event + +namespace fan { + +Result Initialize(void) { return ::fanInitialize(); } +void Exit(void) { ::fanExit(); } +Service* GetServiceSession(void) { return ::fanGetServiceSession(); } +Result OpenController(FanController *out, u32 device_code) { return ::fanOpenController(out, device_code); } +void ControllerClose(FanController *controller) { ::fanControllerClose(controller); } +Result ControllerSetRotationSpeedLevel(FanController *controller, float level) { return ::fanControllerSetRotationSpeedLevel(controller, level); } +Result ControllerGetRotationSpeedLevel(FanController *controller, float *level) { return ::fanControllerGetRotationSpeedLevel(controller, level); } + +} // namespace fan + +namespace fatal { + +[[noreturn]] void Throw(Result err) { ::fatalThrow(err); } +void ThrowWithPolicy(Result err, FatalPolicy type) { ::fatalThrowWithPolicy(err, type); } +void ThrowWithContext(Result err, FatalPolicy type, FatalCpuContext *ctx) { ::fatalThrowWithContext(err, type, ctx); } + +} // namespace fatal + +namespace framebuffer { + +Result Create(Framebuffer* fb, NWindow *win, u32 width, u32 height, u32 format, u32 num_fbs) { return ::framebufferCreate(fb, win, width, height, format, num_fbs); } +Result MakeLinear(Framebuffer* fb) { return ::framebufferMakeLinear(fb); } +void Close(Framebuffer* fb) { ::framebufferClose(fb); } +void* Begin(Framebuffer* fb, u32* out_stride) { return ::framebufferBegin(fb, out_stride); } +void End(Framebuffer* fb) { ::framebufferEnd(fb); } + +} // namespace framebuffer + +namespace friends { + +Result LaShowFriendList(AccountUid uid) { return ::friendsLaShowFriendList(uid); } +Result LaShowUserDetailInfo(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName) { return ::friendsLaShowUserDetailInfo(uid, id, first_inAppScreenName, second_inAppScreenName); } +Result LaStartSendingFriendRequest(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName) { return ::friendsLaStartSendingFriendRequest(uid, id, first_inAppScreenName, second_inAppScreenName); } +Result LaShowMethodsOfSendingFriendRequest(AccountUid uid) { return ::friendsLaShowMethodsOfSendingFriendRequest(uid); } +Result LaStartFacedFriendRequest(AccountUid uid) { return ::friendsLaStartFacedFriendRequest(uid); } +Result LaShowReceivedFriendRequestList(AccountUid uid) { return ::friendsLaShowReceivedFriendRequestList(uid); } +Result LaShowBlockedUserList(AccountUid uid) { return ::friendsLaShowBlockedUserList(uid); } +Result LaShowMyProfile(AccountUid uid) { return ::friendsLaShowMyProfile(uid); } +Result LaShowMyProfileForHomeMenu(AccountUid uid) { return ::friendsLaShowMyProfileForHomeMenu(uid); } +Result LaStartFriendInvitation(AccountUid uid, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size) { return ::friendsLaStartFriendInvitation(uid, id_count, desc, userdata, userdata_size); } +Result LaStartSendingFriendInvitation(AccountUid uid, const AccountNetworkServiceAccountId *id_list, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size) { return ::friendsLaStartSendingFriendInvitation(uid, id_list, id_count, desc, userdata, userdata_size); } +Result LaShowReceivedInvitationDetail(AccountUid uid, FriendsFriendInvitationId invitation_id, FriendsFriendInvitationGroupId invitation_group_id) { return ::friendsLaShowReceivedInvitationDetail(uid, invitation_id, invitation_group_id); } +Result Initialize(FriendsServiceType service_type) { return ::friendsInitialize(service_type); } +void Exit(void) { ::friendsExit(); } +Service* GetServiceSession(void) { return ::friendsGetServiceSession(); } +Service* GetServiceSession_IFriendsService(void) { return ::friendsGetServiceSession_IFriendsService(); } +Result GetUserSetting(AccountUid uid, FriendsUserSetting *user_setting) { return ::friendsGetUserSetting(uid, user_setting); } +Result GetFriendInvitationNotificationEvent(Event *out_event) { return ::friendsGetFriendInvitationNotificationEvent(out_event); } +Result TryPopFriendInvitationNotificationInfo(AccountUid *uid, void* buffer, u64 size, u64 *out_size) { return ::friendsTryPopFriendInvitationNotificationInfo(uid, buffer, size, out_size); } + +} // namespace friends + +namespace fs { + +Result Initialize(void) { return ::fsInitialize(); } +void Exit(void) { ::fsExit(); } +Service* GetServiceSession(void) { return ::fsGetServiceSession(); } +void SetPriority(FsPriority prio) { ::fsSetPriority(prio); } +Result OpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath) { return ::fsOpenFileSystem(out, fsType, contentPath); } +Result OpenDataFileSystemByCurrentProcess(FsFileSystem *out) { return ::fsOpenDataFileSystemByCurrentProcess(out); } +Result OpenFileSystemWithPatch(FsFileSystem* out, u64 id, FsFileSystemType fsType) { return ::fsOpenFileSystemWithPatch(out, id, fsType); } +Result OpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath, FsContentAttributes attr) { return ::fsOpenFileSystemWithId(out, id, fsType, contentPath, attr); } +Result OpenDataFileSystemByProgramId(FsFileSystem *out, u64 program_id) { return ::fsOpenDataFileSystemByProgramId(out, program_id); } +Result OpenBisFileSystem(FsFileSystem* out, FsBisPartitionId partitionId, const char* string) { return ::fsOpenBisFileSystem(out, partitionId, string); } +Result OpenBisStorage(FsStorage* out, FsBisPartitionId partitionId) { return ::fsOpenBisStorage(out, partitionId); } +Result OpenSdCardFileSystem(FsFileSystem* out) { return ::fsOpenSdCardFileSystem(out); } +Result OpenHostFileSystem(FsFileSystem* out, const char *path) { return ::fsOpenHostFileSystem(out, path); } +Result OpenHostFileSystemWithOption(FsFileSystem* out, const char *path, u32 flags) { return ::fsOpenHostFileSystemWithOption(out, path, flags); } +Result DeleteSaveDataFileSystem(u64 application_id) { return ::fsDeleteSaveDataFileSystem(application_id); } +Result CreateSaveDataFileSystem(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info, const FsSaveDataMetaInfo* meta) { return ::fsCreateSaveDataFileSystem(attr, creation_info, meta); } +Result CreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info) { return ::fsCreateSaveDataFileSystemBySystemSaveDataId(attr, creation_info); } +Result DeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID) { return ::fsDeleteSaveDataFileSystemBySaveDataSpaceId(save_data_space_id, saveID); } +Result DeleteSaveDataFileSystemBySaveDataAttribute(FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute* attr) { return ::fsDeleteSaveDataFileSystemBySaveDataAttribute(save_data_space_id, attr); } +Result IsExFatSupported(bool* out) { return ::fsIsExFatSupported(out); } +Result OpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition) { return ::fsOpenGameCardFileSystem(out, handle, partition); } +Result ExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize) { return ::fsExtendSaveDataFileSystem(save_data_space_id, saveID, dataSize, journalSize); } +Result OpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { return ::fsOpenSaveDataFileSystem(out, save_data_space_id, attr); } +Result OpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { return ::fsOpenSaveDataFileSystemBySystemSaveDataId(out, save_data_space_id, attr); } +Result OpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { return ::fsOpenReadOnlySaveDataFileSystem(out, save_data_space_id, attr); } +Result ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID) { return ::fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(buf, len, save_data_space_id, saveID); } +Result ReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID) { return ::fsReadSaveDataFileSystemExtraData(buf, len, saveID); } +Result WriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID) { return ::fsWriteSaveDataFileSystemExtraData(buf, len, save_data_space_id, saveID); } +Result OpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id) { return ::fsOpenSaveDataInfoReader(out, save_data_space_id); } +Result OpenSaveDataInfoReaderWithFilter(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataFilter *save_data_filter) { return ::fsOpenSaveDataInfoReaderWithFilter(out, save_data_space_id, save_data_filter); } +Result OpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id) { return ::fsOpenImageDirectoryFileSystem(out, image_directory_id); } +Result OpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id) { return ::fsOpenContentStorageFileSystem(out, content_storage_id); } +Result OpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id) { return ::fsOpenCustomStorageFileSystem(out, custom_storage_id); } +Result OpenDataStorageByCurrentProcess(FsStorage* out) { return ::fsOpenDataStorageByCurrentProcess(out); } +Result OpenDataStorageByProgramId(FsStorage *out, u64 program_id) { return ::fsOpenDataStorageByProgramId(out, program_id); } +Result OpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId) { return ::fsOpenDataStorageByDataId(out, dataId, storageId); } +Result OpenPatchDataStorageByCurrentProcess(FsStorage* out) { return ::fsOpenPatchDataStorageByCurrentProcess(out); } +Result OpenDataStorageByCurrentProcessForBatchRead(FsStorageForBatchRead* out) { return ::fsOpenDataStorageByCurrentProcessForBatchRead(out); } +Result OpenDataStorageByProgramIdForBatchRead(FsStorageForBatchRead* out, u64 id) { return ::fsOpenDataStorageByProgramIdForBatchRead(out, id); } +Result OpenDataStorageWithProgramIndexForBatchRead(FsStorageForBatchRead* out, u8 program_index) { return ::fsOpenDataStorageWithProgramIndexForBatchRead(out, program_index); } +Result OpenDataStorageByPathForBatchRead(FsStorageForBatchRead* out, const char* contentPath, FsContentAttributes attributes, FsFileSystemType fsType) { return ::fsOpenDataStorageByPathForBatchRead(out, contentPath, attributes, fsType); } +Result OpenDeviceOperator(FsDeviceOperator* out) { return ::fsOpenDeviceOperator(out); } +Result OpenSdCardDetectionEventNotifier(FsEventNotifier* out) { return ::fsOpenSdCardDetectionEventNotifier(out); } +Result IsSignedSystemPartitionOnSdCardValid(bool *out) { return ::fsIsSignedSystemPartitionOnSdCardValid(out); } +Result GetProgramId(u64* out, const char *path, FsContentAttributes attr) { return ::fsGetProgramId(out, path, attr); } +Result GetRightsIdByPath(const char* path, FsRightsId* out_rights_id) { return ::fsGetRightsIdByPath(path, out_rights_id); } +Result GetRightsIdAndKeyGenerationByPath(const char* path, FsContentAttributes attr, u8* out_key_generation, FsRightsId* out_rights_id) { return ::fsGetRightsIdAndKeyGenerationByPath(path, attr, out_key_generation, out_rights_id); } +Result GetContentStorageInfoIndex(s32 *out) { return ::fsGetContentStorageInfoIndex(out); } +Result DisableAutoSaveDataCreation(void) { return ::fsDisableAutoSaveDataCreation(); } +Result SetGlobalAccessLogMode(u32 mode) { return ::fsSetGlobalAccessLogMode(mode); } +Result GetGlobalAccessLogMode(u32* out_mode) { return ::fsGetGlobalAccessLogMode(out_mode); } +Result OutputAccessLogToSdCard(const char *log, size_t size) { return ::fsOutputAccessLogToSdCard(log, size); } +Result GetAndClearErrorInfo(FsFileSystemProxyErrorInfo *out) { return ::fsGetAndClearErrorInfo(out); } +Result GetAndClearMemoryReportInfo(FsMemoryReportInfo* out) { return ::fsGetAndClearMemoryReportInfo(out); } +Result GetProgramIndexForAccessLog(u32 *out_program_index, u32 *out_program_count) { return ::fsGetProgramIndexForAccessLog(out_program_index, out_program_count); } +Result Create_TemporaryStorage(u64 application_id, u64 owner_id, s64 size, u32 flags) { return ::fsCreate_TemporaryStorage(application_id, owner_id, size, flags); } +Result Create_SystemSaveDataWithOwner(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid, u64 owner_id, s64 size, s64 journal_size, u32 flags) { return ::fsCreate_SystemSaveDataWithOwner(save_data_space_id, system_save_data_id, uid, owner_id, size, journal_size, flags); } +Result Create_SystemSaveData(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, s64 size, s64 journal_size, u32 flags) { return ::fsCreate_SystemSaveData(save_data_space_id, system_save_data_id, size, journal_size, flags); } +Result Open_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid) { return ::fsOpen_SaveData(out, application_id, uid); } +Result Open_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid) { return ::fsOpen_SaveDataReadOnly(out, application_id, uid); } +Result Open_BcatSaveData(FsFileSystem* out, u64 application_id) { return ::fsOpen_BcatSaveData(out, application_id); } +Result Open_DeviceSaveData(FsFileSystem* out, u64 application_id) { return ::fsOpen_DeviceSaveData(out, application_id); } +Result Open_TemporaryStorage(FsFileSystem* out) { return ::fsOpen_TemporaryStorage(out); } +Result Open_CacheStorage(FsFileSystem* out, u64 application_id, u16 save_data_index) { return ::fsOpen_CacheStorage(out, application_id, save_data_index); } +Result Open_SystemSaveData(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid) { return ::fsOpen_SystemSaveData(out, save_data_space_id, system_save_data_id, uid); } +Result Open_SystemBcatSaveData(FsFileSystem* out, u64 system_save_data_id) { return ::fsOpen_SystemBcatSaveData(out, system_save_data_id); } +Result FsCreateFile(FsFileSystem* fs, const char* path, s64 size, u32 option) { return ::fsFsCreateFile(fs, path, size, option); } +Result FsDeleteFile(FsFileSystem* fs, const char* path) { return ::fsFsDeleteFile(fs, path); } +Result FsCreateDirectory(FsFileSystem* fs, const char* path) { return ::fsFsCreateDirectory(fs, path); } +Result FsDeleteDirectory(FsFileSystem* fs, const char* path) { return ::fsFsDeleteDirectory(fs, path); } +Result FsDeleteDirectoryRecursively(FsFileSystem* fs, const char* path) { return ::fsFsDeleteDirectoryRecursively(fs, path); } +Result FsRenameFile(FsFileSystem* fs, const char* cur_path, const char* new_path) { return ::fsFsRenameFile(fs, cur_path, new_path); } +Result FsRenameDirectory(FsFileSystem* fs, const char* cur_path, const char* new_path) { return ::fsFsRenameDirectory(fs, cur_path, new_path); } +Result FsGetEntryType(FsFileSystem* fs, const char* path, FsDirEntryType* out) { return ::fsFsGetEntryType(fs, path, out); } +Result FsOpenFile(FsFileSystem* fs, const char* path, u32 mode, FsFile* out) { return ::fsFsOpenFile(fs, path, mode, out); } +Result FsOpenDirectory(FsFileSystem* fs, const char* path, u32 mode, FsDir* out) { return ::fsFsOpenDirectory(fs, path, mode, out); } +Result FsCommit(FsFileSystem* fs) { return ::fsFsCommit(fs); } +Result FsGetFreeSpace(FsFileSystem* fs, const char* path, s64* out) { return ::fsFsGetFreeSpace(fs, path, out); } +Result FsGetTotalSpace(FsFileSystem* fs, const char* path, s64* out) { return ::fsFsGetTotalSpace(fs, path, out); } +Result FsGetFileTimeStampRaw(FsFileSystem* fs, const char* path, FsTimeStampRaw *out) { return ::fsFsGetFileTimeStampRaw(fs, path, out); } +Result FsCleanDirectoryRecursively(FsFileSystem* fs, const char* path) { return ::fsFsCleanDirectoryRecursively(fs, path); } +Result FsQueryEntry(FsFileSystem* fs, void *out, size_t out_size, const void *in, size_t in_size, const char* path, FsFileSystemQueryId query_id) { return ::fsFsQueryEntry(fs, out, out_size, in, in_size, path, query_id); } +Result FsGetFileSystemAttribute(FsFileSystem* fs, FsFileSystemAttribute *out) { return ::fsFsGetFileSystemAttribute(fs, out); } +void FsClose(FsFileSystem* fs) { ::fsFsClose(fs); } +Result FsSetConcatenationFileAttribute(FsFileSystem* fs, const char *path) { return ::fsFsSetConcatenationFileAttribute(fs, path); } +Result FsIsValidSignedSystemPartitionOnSdCard(FsFileSystem* fs, bool *out) { return ::fsFsIsValidSignedSystemPartitionOnSdCard(fs, out); } +Result FileRead(FsFile* f, s64 off, void* buf, u64 read_size, u32 option, u64* bytes_read) { return ::fsFileRead(f, off, buf, read_size, option, bytes_read); } +Result FileWrite(FsFile* f, s64 off, const void* buf, u64 write_size, u32 option) { return ::fsFileWrite(f, off, buf, write_size, option); } +Result FileFlush(FsFile* f) { return ::fsFileFlush(f); } +Result FileSetSize(FsFile* f, s64 sz) { return ::fsFileSetSize(f, sz); } +Result FileGetSize(FsFile* f, s64* out) { return ::fsFileGetSize(f, out); } +Result FileOperateRange(FsFile* f, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out) { return ::fsFileOperateRange(f, op_id, off, len, out); } +void FileClose(FsFile* f) { ::fsFileClose(f); } +Result DirRead(FsDir* d, s64* total_entries, size_t max_entries, FsDirectoryEntry *buf) { return ::fsDirRead(d, total_entries, max_entries, buf); } +Result DirGetEntryCount(FsDir* d, s64* count) { return ::fsDirGetEntryCount(d, count); } +void DirClose(FsDir* d) { ::fsDirClose(d); } +Result StorageRead(FsStorage* s, s64 off, void* buf, u64 read_size) { return ::fsStorageRead(s, off, buf, read_size); } +Result StorageWrite(FsStorage* s, s64 off, const void* buf, u64 write_size) { return ::fsStorageWrite(s, off, buf, write_size); } +Result StorageFlush(FsStorage* s) { return ::fsStorageFlush(s); } +Result StorageSetSize(FsStorage* s, s64 sz) { return ::fsStorageSetSize(s, sz); } +Result StorageGetSize(FsStorage* s, s64* out) { return ::fsStorageGetSize(s, out); } +Result StorageOperateRange(FsStorage* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out) { return ::fsStorageOperateRange(s, op_id, off, len, out); } +void StorageClose(FsStorage* s) { ::fsStorageClose(s); } +Result StorageForBatchReadRead(FsStorageForBatchRead* s, s64 off, void* buf, u64 read_size) { return ::fsStorageForBatchReadRead(s, off, buf, read_size); } +Result StorageForBatchReadWrite(FsStorageForBatchRead* s, s64 off, const void* buf, u64 write_size) { return ::fsStorageForBatchReadWrite(s, off, buf, write_size); } +Result StorageForBatchReadFlush(FsStorageForBatchRead* s) { return ::fsStorageForBatchReadFlush(s); } +Result StorageForBatchReadSetSize(FsStorageForBatchRead* s, s64 sz) { return ::fsStorageForBatchReadSetSize(s, sz); } +Result StorageForBatchReadGetSize(FsStorageForBatchRead* s, s64* out) { return ::fsStorageForBatchReadGetSize(s, out); } +Result StorageForBatchReadOperateRange(FsStorageForBatchRead* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out) { return ::fsStorageForBatchReadOperateRange(s, op_id, off, len, out); } +Result StorageForBatchReadBatchRead(FsStorageForBatchRead* s, void* out0, void* out1, void* out2, void* out3, void* out4, void* out5, void* out6, const void* in) { return ::fsStorageForBatchReadBatchRead(s, out0, out1, out2, out3, out4, out5, out6, in); } +void StorageForBatchReadClose(FsStorageForBatchRead* s) { ::fsStorageForBatchReadClose(s); } +Result SaveDataInfoReaderRead(FsSaveDataInfoReader *s, FsSaveDataInfo* buf, size_t max_entries, s64* total_entries) { return ::fsSaveDataInfoReaderRead(s, buf, max_entries, total_entries); } +void SaveDataInfoReaderClose(FsSaveDataInfoReader *s) { ::fsSaveDataInfoReaderClose(s); } +Result EventNotifierGetEventHandle(FsEventNotifier* e, Event* out, bool autoclear) { return ::fsEventNotifierGetEventHandle(e, out, autoclear); } +void EventNotifierClose(FsEventNotifier* e) { ::fsEventNotifierClose(e); } +Result DeviceOperatorIsSdCardInserted(FsDeviceOperator* d, bool* out) { return ::fsDeviceOperatorIsSdCardInserted(d, out); } +Result DeviceOperatorGetSdCardSpeedMode(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetSdCardSpeedMode(d, out); } +Result DeviceOperatorGetSdCardCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetSdCardCid(d, dst, dst_size, size); } +Result DeviceOperatorGetSdCardUserAreaSize(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetSdCardUserAreaSize(d, out); } +Result DeviceOperatorGetSdCardProtectedAreaSize(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetSdCardProtectedAreaSize(d, out); } +Result DeviceOperatorGetAndClearSdCardErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetAndClearSdCardErrorInfo(d, out, out_log_size, dst, dst_size, size); } +Result DeviceOperatorGetMmcCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetMmcCid(d, dst, dst_size, size); } +Result DeviceOperatorGetMmcSpeedMode(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetMmcSpeedMode(d, out); } +Result DeviceOperatorGetMmcPatrolCount(FsDeviceOperator* d, u32* out) { return ::fsDeviceOperatorGetMmcPatrolCount(d, out); } +Result DeviceOperatorGetAndClearMmcErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetAndClearMmcErrorInfo(d, out, out_log_size, dst, dst_size, size); } +Result DeviceOperatorGetMmcExtendedCsd(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetMmcExtendedCsd(d, dst, dst_size, size); } +Result DeviceOperatorIsGameCardInserted(FsDeviceOperator* d, bool* out) { return ::fsDeviceOperatorIsGameCardInserted(d, out); } +Result DeviceOperatorGetGameCardHandle(FsDeviceOperator* d, FsGameCardHandle* out) { return ::fsDeviceOperatorGetGameCardHandle(d, out); } +Result DeviceOperatorGetGameCardUpdatePartitionInfo(FsDeviceOperator* d, const FsGameCardHandle* handle, FsGameCardUpdatePartitionInfo* out) { return ::fsDeviceOperatorGetGameCardUpdatePartitionInfo(d, handle, out); } +Result DeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCardHandle* handle, u8 *out) { return ::fsDeviceOperatorGetGameCardAttribute(d, handle, out); } +Result DeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64* out_size, s64 size) { return ::fsDeviceOperatorGetGameCardDeviceCertificate(d, handle, dst, dst_size, out_size, size); } +Result DeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetGameCardIdSet(d, dst, dst_size, size); } +Result DeviceOperatorGetGameCardErrorReportInfo(FsDeviceOperator* d, FsGameCardErrorReportInfo* out) { return ::fsDeviceOperatorGetGameCardErrorReportInfo(d, out); } +Result DeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetGameCardDeviceId(d, dst, dst_size, size); } +Result DeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size) { return ::fsDeviceOperatorChallengeCardExistence(d, handle, dst, dst_size, seed, seed_size, value, value_size); } +void DeviceOperatorClose(FsDeviceOperator* d) { ::fsDeviceOperatorClose(d); } + +} // namespace fs + +namespace fsdev { + +FsDirectoryEntry* DirGetEntries(fsdev_dir_t *dir) { return ::fsdevDirGetEntries(dir); } +Result MountSdmc(void) { return ::fsdevMountSdmc(); } +Result MountSaveData(const char *name, u64 application_id, AccountUid uid) { return ::fsdevMountSaveData(name, application_id, uid); } +Result MountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid) { return ::fsdevMountSaveDataReadOnly(name, application_id, uid); } +Result MountBcatSaveData(const char *name, u64 application_id) { return ::fsdevMountBcatSaveData(name, application_id); } +Result MountDeviceSaveData(const char *name, u64 application_id) { return ::fsdevMountDeviceSaveData(name, application_id); } +Result MountTemporaryStorage(const char *name) { return ::fsdevMountTemporaryStorage(name); } +Result MountCacheStorage(const char *name, u64 application_id, u16 save_data_index) { return ::fsdevMountCacheStorage(name, application_id, save_data_index); } +Result MountSystemSaveData(const char *name, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid) { return ::fsdevMountSystemSaveData(name, save_data_space_id, system_save_data_id, uid); } +Result MountSystemBcatSaveData(const char *name, u64 system_save_data_id) { return ::fsdevMountSystemBcatSaveData(name, system_save_data_id); } +int MountDevice(const char *name, FsFileSystem fs) { return ::fsdevMountDevice(name, fs); } +int UnmountDevice(const char *name) { return ::fsdevUnmountDevice(name); } +Result CommitDevice(const char *name) { return ::fsdevCommitDevice(name); } +FsFileSystem* GetDeviceFileSystem(const char *name) { return ::fsdevGetDeviceFileSystem(name); } +int TranslatePath(const char *path, FsFileSystem** device, char *outpath) { return ::fsdevTranslatePath(path, device, outpath); } +Result SetConcatenationFileAttribute(const char *path) { return ::fsdevSetConcatenationFileAttribute(path); } +Result IsValidSignedSystemPartitionOnSdCard(const char *name, bool *out) { return ::fsdevIsValidSignedSystemPartitionOnSdCard(name, out); } +Result CreateFile(const char* path, size_t size, u32 flags) { return ::fsdevCreateFile(path, size, flags); } +Result DeleteDirectoryRecursively(const char *path) { return ::fsdevDeleteDirectoryRecursively(path); } +Result UnmountAll(void) { return ::fsdevUnmountAll(); } +Result GetLastResult(void) { return ::fsdevGetLastResult(); } + +} // namespace fsdev + +namespace fsldr { + +Result Initialize(void) { return ::fsldrInitialize(); } +void Exit(void) { ::fsldrExit(); } +Service* GetServiceSession(void) { return ::fsldrGetServiceSession(); } +Result OpenCodeFileSystem(FsCodeInfo* out_code_info, u64 tid, NcmStorageId storage_id, const char *path, FsContentAttributes attr, FsFileSystem* out) { return ::fsldrOpenCodeFileSystem(out_code_info, tid, storage_id, path, attr, out); } +Result IsArchivedProgram(u64 pid, bool *out) { return ::fsldrIsArchivedProgram(pid, out); } + +} // namespace fsldr + +namespace fspr { + +Result Initialize(void) { return ::fsprInitialize(); } +void Exit(void) { ::fsprExit(); } +Service* GetServiceSession(void) { return ::fsprGetServiceSession(); } +Result RegisterProgram(u64 pid, u64 tid, NcmStorageId sid, const void *fs_access_header, size_t fah_size, const void *fs_access_control, size_t fac_size, u8 fs_access_control_restriction_mode) { return ::fsprRegisterProgram(pid, tid, sid, fs_access_header, fah_size, fs_access_control, fac_size, fs_access_control_restriction_mode); } +Result UnregisterProgram(u64 pid) { return ::fsprUnregisterProgram(pid); } +Result SetCurrentProcess(void) { return ::fsprSetCurrentProcess(); } +Result SetEnabledProgramVerification(bool enabled) { return ::fsprSetEnabledProgramVerification(enabled); } + +} // namespace fspr + +namespace gpio { + +Result Initialize(void) { return ::gpioInitialize(); } +void Exit(void) { ::gpioExit(); } +Service* GetServiceSession(void) { return ::gpioGetServiceSession(); } +Result OpenSession(GpioPadSession *out, GpioPadName name) { return ::gpioOpenSession(out, name); } +Result OpenSession2(GpioPadSession *out, u32 device_code, u32 access_mode) { return ::gpioOpenSession2(out, device_code, access_mode); } +Result IsWakeEventActive(bool *out, GpioPadName name) { return ::gpioIsWakeEventActive(out, name); } +Result IsWakeEventActive2(bool *out, u32 device_code) { return ::gpioIsWakeEventActive2(out, device_code); } +Result PadSetDirection(GpioPadSession *p, GpioDirection dir) { return ::gpioPadSetDirection(p, dir); } +Result PadGetDirection(GpioPadSession *p, GpioDirection *out) { return ::gpioPadGetDirection(p, out); } +Result PadSetInterruptMode(GpioPadSession *p, GpioInterruptMode mode) { return ::gpioPadSetInterruptMode(p, mode); } +Result PadGetInterruptMode(GpioPadSession *p, GpioInterruptMode *out) { return ::gpioPadGetInterruptMode(p, out); } +Result PadSetInterruptEnable(GpioPadSession *p, bool en) { return ::gpioPadSetInterruptEnable(p, en); } +Result PadGetInterruptEnable(GpioPadSession *p, bool *out) { return ::gpioPadGetInterruptEnable(p, out); } +Result PadGetInterruptStatus(GpioPadSession *p, GpioInterruptStatus *out) { return ::gpioPadGetInterruptStatus(p, out); } +Result PadClearInterruptStatus(GpioPadSession *p) { return ::gpioPadClearInterruptStatus(p); } +Result PadSetValue(GpioPadSession *p, GpioValue val) { return ::gpioPadSetValue(p, val); } +Result PadGetValue(GpioPadSession *p, GpioValue *out) { return ::gpioPadGetValue(p, out); } +Result PadBindInterrupt(GpioPadSession *p, Event *out) { return ::gpioPadBindInterrupt(p, out); } +Result PadUnbindInterrupt(GpioPadSession *p) { return ::gpioPadUnbindInterrupt(p); } +Result PadSetDebounceEnabled(GpioPadSession *p, bool en) { return ::gpioPadSetDebounceEnabled(p, en); } +Result PadGetDebounceEnabled(GpioPadSession *p, bool *out) { return ::gpioPadGetDebounceEnabled(p, out); } +Result PadSetDebounceTime(GpioPadSession *p, s32 ms) { return ::gpioPadSetDebounceTime(p, ms); } +Result PadGetDebounceTime(GpioPadSession *p, s32 *out) { return ::gpioPadGetDebounceTime(p, out); } +void PadClose(GpioPadSession *p) { ::gpioPadClose(p); } + +} // namespace gpio + +namespace grc { + +Result TrimGameMovie(GrcGameMovieId *dst_movieid, const GrcGameMovieId *src_movieid, size_t tmem_size, const void* thumbnail, s32 start, s32 end) { return ::grcTrimGameMovie(dst_movieid, src_movieid, tmem_size, thumbnail, start, end); } +void CreateOffscreenRecordingParameter(GrcOffscreenRecordingParameter *param) { ::grcCreateOffscreenRecordingParameter(param); } +Result CreateMovieMaker(GrcMovieMaker *m, size_t size) { return ::grcCreateMovieMaker(m, size); } +void MovieMakerClose(GrcMovieMaker *m) { ::grcMovieMakerClose(m); } +NWindow* MovieMakerGetNWindow(GrcMovieMaker *m) { return ::grcMovieMakerGetNWindow(m); } +Result MovieMakerAbort(GrcMovieMaker *m) { return ::grcMovieMakerAbort(m); } +Result MovieMakerStart(GrcMovieMaker *m, const GrcOffscreenRecordingParameter *param) { return ::grcMovieMakerStart(m, param); } +Result MovieMakerFinish(GrcMovieMaker *m, s32 width, s32 height, const void* userdata, size_t userdata_size, const void* thumbnail, size_t thumbnail_size, CapsApplicationAlbumEntry *entry) { return ::grcMovieMakerFinish(m, width, height, userdata, userdata_size, thumbnail, thumbnail_size, entry); } +Result MovieMakerGetError(GrcMovieMaker *m) { return ::grcMovieMakerGetError(m); } +Result MovieMakerEncodeAudioSample(GrcMovieMaker *m, const void* buffer, size_t size) { return ::grcMovieMakerEncodeAudioSample(m, buffer, size); } + +} // namespace grc + +namespace grcd { + +Result Initialize(void) { return ::grcdInitialize(); } +void Exit(void) { ::grcdExit(); } +Service* GetServiceSession(void) { return ::grcdGetServiceSession(); } +Result Begin(void) { return ::grcdBegin(); } +Result Transfer(GrcStream stream, void* buffer, size_t size, u32 *num_frames, u32 *data_size, u64 *start_timestamp) { return ::grcdTransfer(stream, buffer, size, num_frames, data_size, start_timestamp); } + +} // namespace grcd + +namespace hid { + +void LaCreateControllerSupportArg(HidLaControllerSupportArg *arg) { ::hidLaCreateControllerSupportArg(arg); } +void LaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *arg) { ::hidLaCreateControllerFirmwareUpdateArg(arg); } +void LaCreateControllerKeyRemappingArg(HidLaControllerKeyRemappingArg *arg) { ::hidLaCreateControllerKeyRemappingArg(arg); } +Result LaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidNpadIdType id) { return ::hidLaSetExplainText(arg, str, id); } +Result LaShowControllerSupport(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg) { return ::hidLaShowControllerSupport(result_info, arg); } +Result LaShowControllerStrapGuide(void) { return ::hidLaShowControllerStrapGuide(); } +Result LaShowControllerFirmwareUpdate(const HidLaControllerFirmwareUpdateArg *arg) { return ::hidLaShowControllerFirmwareUpdate(arg); } +Result LaShowControllerSupportForSystem(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg, bool flag) { return ::hidLaShowControllerSupportForSystem(result_info, arg, flag); } +Result LaShowControllerFirmwareUpdateForSystem(const HidLaControllerFirmwareUpdateArg *arg, HidLaControllerSupportCaller caller) { return ::hidLaShowControllerFirmwareUpdateForSystem(arg, caller); } +Result LaShowControllerKeyRemappingForSystem(const HidLaControllerKeyRemappingArg *arg, HidLaControllerSupportCaller caller) { return ::hidLaShowControllerKeyRemappingForSystem(arg, caller); } +Result Initialize(void) { return ::hidInitialize(); } +void Exit(void) { ::hidExit(); } +Service* GetServiceSession(void) { return ::hidGetServiceSession(); } +void* GetSharedmemAddr(void) { return ::hidGetSharedmemAddr(); } +void InitializeTouchScreen(void) { ::hidInitializeTouchScreen(); } +size_t GetTouchScreenStates(HidTouchScreenState *states, size_t count) { return ::hidGetTouchScreenStates(states, count); } +void InitializeMouse(void) { ::hidInitializeMouse(); } +size_t GetMouseStates(HidMouseState *states, size_t count) { return ::hidGetMouseStates(states, count); } +void InitializeKeyboard(void) { ::hidInitializeKeyboard(); } +size_t GetKeyboardStates(HidKeyboardState *states, size_t count) { return ::hidGetKeyboardStates(states, count); } +bool KeyboardStateGetKey(const HidKeyboardState *state, HidKeyboardKey key) { return ::hidKeyboardStateGetKey(state, key); } +size_t GetHomeButtonStates(HidHomeButtonState *states, size_t count) { return ::hidGetHomeButtonStates(states, count); } +size_t GetSleepButtonStates(HidSleepButtonState *states, size_t count) { return ::hidGetSleepButtonStates(states, count); } +size_t GetCaptureButtonStates(HidCaptureButtonState *states, size_t count) { return ::hidGetCaptureButtonStates(states, count); } +void InitializeNpad(void) { ::hidInitializeNpad(); } +u32 GetNpadStyleSet(HidNpadIdType id) { return ::hidGetNpadStyleSet(id); } +HidNpadJoyAssignmentMode GetNpadJoyAssignment(HidNpadIdType id) { return ::hidGetNpadJoyAssignment(id); } +Result GetNpadControllerColorSingle(HidNpadIdType id, HidNpadControllerColor *color) { return ::hidGetNpadControllerColorSingle(id, color); } +Result GetNpadControllerColorSplit(HidNpadIdType id, HidNpadControllerColor *color_left, HidNpadControllerColor *color_right) { return ::hidGetNpadControllerColorSplit(id, color_left, color_right); } +u32 GetNpadDeviceType(HidNpadIdType id) { return ::hidGetNpadDeviceType(id); } +void GetNpadSystemProperties(HidNpadIdType id, HidNpadSystemProperties *out) { ::hidGetNpadSystemProperties(id, out); } +void GetNpadSystemButtonProperties(HidNpadIdType id, HidNpadSystemButtonProperties *out) { ::hidGetNpadSystemButtonProperties(id, out); } +void GetNpadPowerInfoSingle(HidNpadIdType id, HidPowerInfo *info) { ::hidGetNpadPowerInfoSingle(id, info); } +void GetNpadPowerInfoSplit(HidNpadIdType id, HidPowerInfo *info_left, HidPowerInfo *info_right) { ::hidGetNpadPowerInfoSplit(id, info_left, info_right); } +u32 GetAppletFooterUiAttributesSet(HidNpadIdType id) { return ::hidGetAppletFooterUiAttributesSet(id); } +HidAppletFooterUiType GetAppletFooterUiTypes(HidNpadIdType id) { return ::hidGetAppletFooterUiTypes(id); } +HidNpadLagerType GetNpadLagerType(HidNpadIdType id) { return ::hidGetNpadLagerType(id); } +size_t GetNpadStatesFullKey(HidNpadIdType id, HidNpadFullKeyState *states, size_t count) { return ::hidGetNpadStatesFullKey(id, states, count); } +size_t GetNpadStatesHandheld(HidNpadIdType id, HidNpadHandheldState *states, size_t count) { return ::hidGetNpadStatesHandheld(id, states, count); } +size_t GetNpadStatesJoyDual(HidNpadIdType id, HidNpadJoyDualState *states, size_t count) { return ::hidGetNpadStatesJoyDual(id, states, count); } +size_t GetNpadStatesJoyLeft(HidNpadIdType id, HidNpadJoyLeftState *states, size_t count) { return ::hidGetNpadStatesJoyLeft(id, states, count); } +size_t GetNpadStatesJoyRight(HidNpadIdType id, HidNpadJoyRightState *states, size_t count) { return ::hidGetNpadStatesJoyRight(id, states, count); } +size_t GetNpadStatesGc(HidNpadIdType id, HidNpadGcState *states, size_t count) { return ::hidGetNpadStatesGc(id, states, count); } +size_t GetNpadStatesPalma(HidNpadIdType id, HidNpadPalmaState *states, size_t count) { return ::hidGetNpadStatesPalma(id, states, count); } +size_t GetNpadStatesLark(HidNpadIdType id, HidNpadLarkState *states, size_t count) { return ::hidGetNpadStatesLark(id, states, count); } +size_t GetNpadStatesHandheldLark(HidNpadIdType id, HidNpadHandheldLarkState *states, size_t count) { return ::hidGetNpadStatesHandheldLark(id, states, count); } +size_t GetNpadStatesLucia(HidNpadIdType id, HidNpadLuciaState *states, size_t count) { return ::hidGetNpadStatesLucia(id, states, count); } +size_t GetNpadStatesLager(HidNpadIdType id, HidNpadLagerState *states, size_t count) { return ::hidGetNpadStatesLager(id, states, count); } +size_t GetNpadStatesSystemExt(HidNpadIdType id, HidNpadSystemExtState *states, size_t count) { return ::hidGetNpadStatesSystemExt(id, states, count); } +size_t GetNpadStatesSystem(HidNpadIdType id, HidNpadSystemState *states, size_t count) { return ::hidGetNpadStatesSystem(id, states, count); } +size_t GetSixAxisSensorStates(HidSixAxisSensorHandle handle, HidSixAxisSensorState *states, size_t count) { return ::hidGetSixAxisSensorStates(handle, states, count); } +void InitializeGesture(void) { ::hidInitializeGesture(); } +size_t GetGestureStates(HidGestureState *states, size_t count) { return ::hidGetGestureStates(states, count); } +Result SendKeyboardLockKeyEvent(u32 events) { return ::hidSendKeyboardLockKeyEvent(events); } +Result GetSixAxisSensorHandles(HidSixAxisSensorHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style) { return ::hidGetSixAxisSensorHandles(handles, total_handles, id, style); } +Result StartSixAxisSensor(HidSixAxisSensorHandle handle) { return ::hidStartSixAxisSensor(handle); } +Result StopSixAxisSensor(HidSixAxisSensorHandle handle) { return ::hidStopSixAxisSensor(handle); } +Result IsSixAxisSensorFusionEnabled(HidSixAxisSensorHandle handle, bool *out) { return ::hidIsSixAxisSensorFusionEnabled(handle, out); } +Result EnableSixAxisSensorFusion(HidSixAxisSensorHandle handle, bool flag) { return ::hidEnableSixAxisSensorFusion(handle, flag); } +Result SetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float unk0, float unk1) { return ::hidSetSixAxisSensorFusionParameters(handle, unk0, unk1); } +Result GetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float *unk0, float *unk1) { return ::hidGetSixAxisSensorFusionParameters(handle, unk0, unk1); } +Result ResetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle) { return ::hidResetSixAxisSensorFusionParameters(handle); } +Result SetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode mode) { return ::hidSetGyroscopeZeroDriftMode(handle, mode); } +Result GetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode *mode) { return ::hidGetGyroscopeZeroDriftMode(handle, mode); } +Result ResetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle) { return ::hidResetGyroscopeZeroDriftMode(handle); } +Result IsSixAxisSensorAtRest(HidSixAxisSensorHandle handle, bool *out) { return ::hidIsSixAxisSensorAtRest(handle, out); } +Result IsFirmwareUpdateAvailableForSixAxisSensor(HidSixAxisSensorHandle handle, bool *out) { return ::hidIsFirmwareUpdateAvailableForSixAxisSensor(handle, out); } +Result SetSupportedNpadStyleSet(u32 style_set) { return ::hidSetSupportedNpadStyleSet(style_set); } +Result GetSupportedNpadStyleSet(u32 *style_set) { return ::hidGetSupportedNpadStyleSet(style_set); } +Result SetSupportedNpadIdType(const HidNpadIdType *ids, size_t count) { return ::hidSetSupportedNpadIdType(ids, count); } +Result AcquireNpadStyleSetUpdateEventHandle(HidNpadIdType id, Event* out_event, bool autoclear) { return ::hidAcquireNpadStyleSetUpdateEventHandle(id, out_event, autoclear); } +Result DisconnectNpad(HidNpadIdType id) { return ::hidDisconnectNpad(id); } +Result GetPlayerLedPattern(HidNpadIdType id, u8 *out) { return ::hidGetPlayerLedPattern(id, out); } +Result SetNpadJoyHoldType(HidNpadJoyHoldType type) { return ::hidSetNpadJoyHoldType(type); } +Result GetNpadJoyHoldType(HidNpadJoyHoldType *type) { return ::hidGetNpadJoyHoldType(type); } +Result SetNpadJoyAssignmentModeSingleByDefault(HidNpadIdType id) { return ::hidSetNpadJoyAssignmentModeSingleByDefault(id); } +Result SetNpadJoyAssignmentModeSingle(HidNpadIdType id, HidNpadJoyDeviceType type) { return ::hidSetNpadJoyAssignmentModeSingle(id, type); } +Result SetNpadJoyAssignmentModeDual(HidNpadIdType id) { return ::hidSetNpadJoyAssignmentModeDual(id); } +Result MergeSingleJoyAsDualJoy(HidNpadIdType id0, HidNpadIdType id1) { return ::hidMergeSingleJoyAsDualJoy(id0, id1); } +Result StartLrAssignmentMode(void) { return ::hidStartLrAssignmentMode(); } +Result StopLrAssignmentMode(void) { return ::hidStopLrAssignmentMode(); } +Result SetNpadHandheldActivationMode(HidNpadHandheldActivationMode mode) { return ::hidSetNpadHandheldActivationMode(mode); } +Result GetNpadHandheldActivationMode(HidNpadHandheldActivationMode *out) { return ::hidGetNpadHandheldActivationMode(out); } +Result SwapNpadAssignment(HidNpadIdType id0, HidNpadIdType id1) { return ::hidSwapNpadAssignment(id0, id1); } +Result EnableUnintendedHomeButtonInputProtection(HidNpadIdType id, bool flag) { return ::hidEnableUnintendedHomeButtonInputProtection(id, flag); } +Result SetNpadJoyAssignmentModeSingleWithDestination(HidNpadIdType id, HidNpadJoyDeviceType type, bool *flag, HidNpadIdType *dest) { return ::hidSetNpadJoyAssignmentModeSingleWithDestination(id, type, flag, dest); } +Result SetNpadAnalogStickUseCenterClamp(bool flag) { return ::hidSetNpadAnalogStickUseCenterClamp(flag); } +Result SetNpadCaptureButtonAssignment(HidNpadStyleTag style, u64 buttons) { return ::hidSetNpadCaptureButtonAssignment(style, buttons); } +Result ClearNpadCaptureButtonAssignment(void) { return ::hidClearNpadCaptureButtonAssignment(); } +Result InitializeVibrationDevices(HidVibrationDeviceHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style) { return ::hidInitializeVibrationDevices(handles, total_handles, id, style); } +Result GetVibrationDeviceInfo(HidVibrationDeviceHandle handle, HidVibrationDeviceInfo *out) { return ::hidGetVibrationDeviceInfo(handle, out); } +Result SendVibrationValue(HidVibrationDeviceHandle handle, const HidVibrationValue *value) { return ::hidSendVibrationValue(handle, value); } +Result GetActualVibrationValue(HidVibrationDeviceHandle handle, HidVibrationValue *out) { return ::hidGetActualVibrationValue(handle, out); } +Result PermitVibration(bool flag) { return ::hidPermitVibration(flag); } +Result IsVibrationPermitted(bool *flag) { return ::hidIsVibrationPermitted(flag); } +Result SendVibrationValues(const HidVibrationDeviceHandle *handles, const HidVibrationValue *values, s32 count) { return ::hidSendVibrationValues(handles, values, count); } +Result SendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand cmd) { return ::hidSendVibrationGcErmCommand(handle, cmd); } +Result GetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out) { return ::hidGetActualVibrationGcErmCommand(handle, out); } +Result BeginPermitVibrationSession(void) { return ::hidBeginPermitVibrationSession(); } +Result EndPermitVibrationSession(void) { return ::hidEndPermitVibrationSession(); } +Result IsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag) { return ::hidIsVibrationDeviceMounted(handle, flag); } +Result StartSevenSixAxisSensor(void) { return ::hidStartSevenSixAxisSensor(); } +Result StopSevenSixAxisSensor(void) { return ::hidStopSevenSixAxisSensor(); } +Result InitializeSevenSixAxisSensor(void) { return ::hidInitializeSevenSixAxisSensor(); } +Result FinalizeSevenSixAxisSensor(void) { return ::hidFinalizeSevenSixAxisSensor(); } +Result SetSevenSixAxisSensorFusionStrength(float strength) { return ::hidSetSevenSixAxisSensorFusionStrength(strength); } +Result GetSevenSixAxisSensorFusionStrength(float *strength) { return ::hidGetSevenSixAxisSensorFusionStrength(strength); } +Result ResetSevenSixAxisSensorTimestamp(void) { return ::hidResetSevenSixAxisSensorTimestamp(); } +Result GetSevenSixAxisSensorStates(HidSevenSixAxisSensorState *states, size_t count, size_t *total_out) { return ::hidGetSevenSixAxisSensorStates(states, count, total_out); } +Result IsSevenSixAxisSensorAtRest(bool *out) { return ::hidIsSevenSixAxisSensorAtRest(out); } +Result GetSensorFusionError(float *out) { return ::hidGetSensorFusionError(out); } +Result GetGyroBias(UtilFloat3 *out) { return ::hidGetGyroBias(out); } +Result IsUsbFullKeyControllerEnabled(bool *out) { return ::hidIsUsbFullKeyControllerEnabled(out); } +Result EnableUsbFullKeyController(bool flag) { return ::hidEnableUsbFullKeyController(flag); } +Result IsUsbFullKeyControllerConnected(HidNpadIdType id, bool *out) { return ::hidIsUsbFullKeyControllerConnected(id, out); } +Result GetNpadInterfaceType(HidNpadIdType id, u8 *out) { return ::hidGetNpadInterfaceType(id, out); } +Result GetNpadOfHighestBatteryLevel(const HidNpadIdType *ids, size_t count, HidNpadIdType *out) { return ::hidGetNpadOfHighestBatteryLevel(ids, count, out); } +Result GetPalmaConnectionHandle(HidNpadIdType id, HidPalmaConnectionHandle *out) { return ::hidGetPalmaConnectionHandle(id, out); } +Result InitializePalma(HidPalmaConnectionHandle handle) { return ::hidInitializePalma(handle); } +Result AcquirePalmaOperationCompleteEvent(HidPalmaConnectionHandle handle, Event* out_event, bool autoclear) { return ::hidAcquirePalmaOperationCompleteEvent(handle, out_event, autoclear); } +Result GetPalmaOperationInfo(HidPalmaConnectionHandle handle, HidPalmaOperationInfo *out) { return ::hidGetPalmaOperationInfo(handle, out); } +Result PlayPalmaActivity(HidPalmaConnectionHandle handle, u16 val) { return ::hidPlayPalmaActivity(handle, val); } +Result SetPalmaFrModeType(HidPalmaConnectionHandle handle, HidPalmaFrModeType type) { return ::hidSetPalmaFrModeType(handle, type); } +Result ReadPalmaStep(HidPalmaConnectionHandle handle) { return ::hidReadPalmaStep(handle); } +Result EnablePalmaStep(HidPalmaConnectionHandle handle, bool flag) { return ::hidEnablePalmaStep(handle, flag); } +Result ResetPalmaStep(HidPalmaConnectionHandle handle) { return ::hidResetPalmaStep(handle); } +Result ReadPalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size) { return ::hidReadPalmaApplicationSection(handle, inval0, size); } +Result WritePalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size, const HidPalmaApplicationSectionAccessBuffer *buf) { return ::hidWritePalmaApplicationSection(handle, inval0, size, buf); } +Result ReadPalmaUniqueCode(HidPalmaConnectionHandle handle) { return ::hidReadPalmaUniqueCode(handle); } +Result SetPalmaUniqueCodeInvalid(HidPalmaConnectionHandle handle) { return ::hidSetPalmaUniqueCodeInvalid(handle); } +Result WritePalmaActivityEntry(HidPalmaConnectionHandle handle, u16 unk, const HidPalmaActivityEntry *entry) { return ::hidWritePalmaActivityEntry(handle, unk, entry); } +Result WritePalmaRgbLedPatternEntry(HidPalmaConnectionHandle handle, u16 unk, const void* buffer, size_t size) { return ::hidWritePalmaRgbLedPatternEntry(handle, unk, buffer, size); } +Result WritePalmaWaveEntry(HidPalmaConnectionHandle handle, HidPalmaWaveSet wave_set, u16 unk, const void* buffer, size_t tmem_size, size_t size) { return ::hidWritePalmaWaveEntry(handle, wave_set, unk, buffer, tmem_size, size); } +Result SetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle, s32 version) { return ::hidSetPalmaDataBaseIdentificationVersion(handle, version); } +Result GetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle) { return ::hidGetPalmaDataBaseIdentificationVersion(handle); } +Result SuspendPalmaFeature(HidPalmaConnectionHandle handle, u32 features) { return ::hidSuspendPalmaFeature(handle, features); } +Result ReadPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk) { return ::hidReadPalmaPlayLog(handle, unk); } +Result ResetPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk) { return ::hidResetPalmaPlayLog(handle, unk); } +Result SetIsPalmaAllConnectable(bool flag) { return ::hidSetIsPalmaAllConnectable(flag); } +Result SetIsPalmaPairedConnectable(bool flag) { return ::hidSetIsPalmaPairedConnectable(flag); } +Result PairPalma(HidPalmaConnectionHandle handle) { return ::hidPairPalma(handle); } +Result CancelWritePalmaWaveEntry(HidPalmaConnectionHandle handle) { return ::hidCancelWritePalmaWaveEntry(handle); } +Result EnablePalmaBoostMode(bool flag) { return ::hidEnablePalmaBoostMode(flag); } +Result GetPalmaBluetoothAddress(HidPalmaConnectionHandle handle, BtdrvAddress *out) { return ::hidGetPalmaBluetoothAddress(handle, out); } +Result SetDisallowedPalmaConnection(const BtdrvAddress *addrs, s32 count) { return ::hidSetDisallowedPalmaConnection(addrs, count); } +Result SetNpadCommunicationMode(HidNpadCommunicationMode mode) { return ::hidSetNpadCommunicationMode(mode); } +Result GetNpadCommunicationMode(HidNpadCommunicationMode *out) { return ::hidGetNpadCommunicationMode(out); } +Result SetTouchScreenConfiguration(const HidTouchScreenConfigurationForNx *config) { return ::hidSetTouchScreenConfiguration(config); } +Result IsFirmwareUpdateNeededForNotification(bool *out) { return ::hidIsFirmwareUpdateNeededForNotification(out); } + +} // namespace hid + +namespace hidbus { + +Result GetServiceSession(Service* srv_out) { return ::hidbusGetServiceSession(srv_out); } +void* GetSharedmemAddr(void) { return ::hidbusGetSharedmemAddr(); } +Result GetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type) { return ::hidbusGetBusHandle(handle, flag, id, bus_type); } +Result Initialize(HidbusBusHandle handle) { return ::hidbusInitialize(handle); } +Result Finalize(HidbusBusHandle handle) { return ::hidbusFinalize(handle); } +Result EnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id) { return ::hidbusEnableExternalDevice(handle, flag, device_id); } +Result SendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size) { return ::hidbusSendAndReceive(handle, inbuf, inbuf_size, outbuf, outbuf_size, out_size); } +Result EnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode) { return ::hidbusEnableJoyPollingReceiveMode(handle, inbuf, inbuf_size, workbuf, workbuf_size, polling_mode); } +Result DisableJoyPollingReceiveMode(HidbusBusHandle handle) { return ::hidbusDisableJoyPollingReceiveMode(handle); } +Result GetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count) { return ::hidbusGetJoyPollingReceivedData(handle, recv_data, count); } + +} // namespace hidbus + +namespace hiddbg { + +Result Initialize(void) { return ::hiddbgInitialize(); } +void Exit(void) { ::hiddbgExit(); } +Service* GetServiceSession(void) { return ::hiddbgGetServiceSession(); } +Result SetDebugPadAutoPilotState(const HiddbgDebugPadAutoPilotState *state) { return ::hiddbgSetDebugPadAutoPilotState(state); } +Result UnsetDebugPadAutoPilotState(void) { return ::hiddbgUnsetDebugPadAutoPilotState(); } +Result SetTouchScreenAutoPilotState(const HidTouchState *states, s32 count) { return ::hiddbgSetTouchScreenAutoPilotState(states, count); } +Result UnsetTouchScreenAutoPilotState(void) { return ::hiddbgUnsetTouchScreenAutoPilotState(); } +Result SetMouseAutoPilotState(const HiddbgMouseAutoPilotState *state) { return ::hiddbgSetMouseAutoPilotState(state); } +Result UnsetMouseAutoPilotState(void) { return ::hiddbgUnsetMouseAutoPilotState(); } +Result SetKeyboardAutoPilotState(const HiddbgKeyboardAutoPilotState *state) { return ::hiddbgSetKeyboardAutoPilotState(state); } +Result UnsetKeyboardAutoPilotState(void) { return ::hiddbgUnsetKeyboardAutoPilotState(); } +Result DeactivateHomeButton(void) { return ::hiddbgDeactivateHomeButton(); } +Result SetSleepButtonAutoPilotState(const HiddbgSleepButtonAutoPilotState *state) { return ::hiddbgSetSleepButtonAutoPilotState(state); } +Result UnsetSleepButtonAutoPilotState(void) { return ::hiddbgUnsetSleepButtonAutoPilotState(); } +Result UpdateControllerColor(u32 colorBody, u32 colorButtons, HidsysUniquePadId unique_pad_id) { return ::hiddbgUpdateControllerColor(colorBody, colorButtons, unique_pad_id); } +Result UpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip, u32 colorRightGrip, u8 inval, HidsysUniquePadId unique_pad_id) { return ::hiddbgUpdateDesignInfo(colorBody, colorButtons, colorLeftGrip, colorRightGrip, inval, unique_pad_id); } +Result AcquireOperationEventHandle(Event* out_event, bool autoclear, HidsysUniquePadId unique_pad_id) { return ::hiddbgAcquireOperationEventHandle(out_event, autoclear, unique_pad_id); } +Result ReadSerialFlash(u32 offset, void* buffer, size_t size, HidsysUniquePadId unique_pad_id) { return ::hiddbgReadSerialFlash(offset, buffer, size, unique_pad_id); } +Result WriteSerialFlash(u32 offset, void* buffer, size_t tmem_size, size_t size, HidsysUniquePadId unique_pad_id) { return ::hiddbgWriteSerialFlash(offset, buffer, tmem_size, size, unique_pad_id); } +Result GetOperationResult(HidsysUniquePadId unique_pad_id) { return ::hiddbgGetOperationResult(unique_pad_id); } +Result GetUniquePadDeviceTypeSetInternal(HidsysUniquePadId unique_pad_id, u32 *out) { return ::hiddbgGetUniquePadDeviceTypeSetInternal(unique_pad_id, out); } +Result GetAbstractedPadHandles(HiddbgAbstractedPadHandle *handles, s32 count, s32 *total_out) { return ::hiddbgGetAbstractedPadHandles(handles, count, total_out); } +Result GetAbstractedPadState(HiddbgAbstractedPadHandle handle, HiddbgAbstractedPadState *state) { return ::hiddbgGetAbstractedPadState(handle, state); } +Result GetAbstractedPadsState(HiddbgAbstractedPadHandle *handles, HiddbgAbstractedPadState *states, s32 count, s32 *total_out) { return ::hiddbgGetAbstractedPadsState(handles, states, count, total_out); } +Result SetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId, const HiddbgAbstractedPadState *state) { return ::hiddbgSetAutoPilotVirtualPadState(AbstractedVirtualPadId, state); } +Result UnsetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId) { return ::hiddbgUnsetAutoPilotVirtualPadState(AbstractedVirtualPadId); } +Result UnsetAllAutoPilotVirtualPadState(void) { return ::hiddbgUnsetAllAutoPilotVirtualPadState(); } +Result AttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, size_t size) { return ::hiddbgAttachHdlsWorkBuffer(session_id, buffer, size); } +Result ReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id) { return ::hiddbgReleaseHdlsWorkBuffer(session_id); } +Result IsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgHdlsHandle handle, bool *out) { return ::hiddbgIsHdlsVirtualDeviceAttached(session_id, handle, out); } +Result DumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgHdlsNpadAssignment *state) { return ::hiddbgDumpHdlsNpadAssignmentState(session_id, state); } +Result DumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList *state) { return ::hiddbgDumpHdlsStates(session_id, state); } +Result ApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const HiddbgHdlsNpadAssignment *state, bool flag) { return ::hiddbgApplyHdlsNpadAssignmentState(session_id, state, flag); } +Result ApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdlsStateList *state) { return ::hiddbgApplyHdlsStateList(session_id, state); } +Result AttachHdlsVirtualDevice(HiddbgHdlsHandle *handle, const HiddbgHdlsDeviceInfo *info) { return ::hiddbgAttachHdlsVirtualDevice(handle, info); } +Result DetachHdlsVirtualDevice(HiddbgHdlsHandle handle) { return ::hiddbgDetachHdlsVirtualDevice(handle); } +Result SetHdlsState(HiddbgHdlsHandle handle, const HiddbgHdlsState *state) { return ::hiddbgSetHdlsState(handle, state); } + +} // namespace hiddbg + +namespace hidsys { + +Result Initialize(void) { return ::hidsysInitialize(); } +void Exit(void) { ::hidsysExit(); } +Service* GetServiceSession(void) { return ::hidsysGetServiceSession(); } +Result SendKeyboardLockKeyEvent(u32 events) { return ::hidsysSendKeyboardLockKeyEvent(events); } +Result AcquireHomeButtonEventHandle(Event* out_event, bool autoclear) { return ::hidsysAcquireHomeButtonEventHandle(out_event, autoclear); } +Result ActivateHomeButton(void) { return ::hidsysActivateHomeButton(); } +Result AcquireSleepButtonEventHandle(Event* out_event, bool autoclear) { return ::hidsysAcquireSleepButtonEventHandle(out_event, autoclear); } +Result ActivateSleepButton(void) { return ::hidsysActivateSleepButton(); } +Result AcquireCaptureButtonEventHandle(Event* out_event, bool autoclear) { return ::hidsysAcquireCaptureButtonEventHandle(out_event, autoclear); } +Result ActivateCaptureButton(void) { return ::hidsysActivateCaptureButton(); } +Result ApplyNpadSystemCommonPolicy(void) { return ::hidsysApplyNpadSystemCommonPolicy(); } +Result GetLastActiveNpad(u32 *out) { return ::hidsysGetLastActiveNpad(out); } +Result GetSupportedNpadStyleSetOfCallerApplet(u32 *out) { return ::hidsysGetSupportedNpadStyleSetOfCallerApplet(out); } +Result GetNpadInterfaceType(HidNpadIdType id, u8 *out) { return ::hidsysGetNpadInterfaceType(id, out); } +Result GetNpadLeftRightInterfaceType(HidNpadIdType id, u8 *out0, u8 *out1) { return ::hidsysGetNpadLeftRightInterfaceType(id, out0, out1); } +Result HasBattery(HidNpadIdType id, bool *out) { return ::hidsysHasBattery(id, out); } +Result HasLeftRightBattery(HidNpadIdType id, bool *out0, bool *out1) { return ::hidsysHasLeftRightBattery(id, out0, out1); } +Result GetUniquePadsFromNpad(HidNpadIdType id, HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out) { return ::hidsysGetUniquePadsFromNpad(id, unique_pad_ids, count, total_out); } +Result SetAppletResourceUserId(void) { return ::hidsysSetAppletResourceUserId(); } +Result EnableAppletToGetInput(bool enable) { return ::hidsysEnableAppletToGetInput(enable); } +Result EnableHandheldHids(void) { return ::hidsysEnableHandheldHids(); } +Result DisableHandheldHids(void) { return ::hidsysDisableHandheldHids(); } +Result SetJoyConRailEnabled(bool enable) { return ::hidsysSetJoyConRailEnabled(enable); } +Result IsJoyConRailEnabled(bool *out) { return ::hidsysIsJoyConRailEnabled(out); } +Result IsHandheldHidsEnabled(bool *out) { return ::hidsysIsHandheldHidsEnabled(out); } +Result IsJoyConAttachedOnAllRail(bool *out) { return ::hidsysIsJoyConAttachedOnAllRail(out); } +Result IsInvertedControllerConnectedOnRail(bool *out) { return ::hidsysIsInvertedControllerConnectedOnRail(out); } +Result AcquireUniquePadConnectionEventHandle(Event *out_event) { return ::hidsysAcquireUniquePadConnectionEventHandle(out_event); } +Result GetUniquePadIds(HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out) { return ::hidsysGetUniquePadIds(unique_pad_ids, count, total_out); } +Result AcquireJoyDetachOnBluetoothOffEventHandle(Event *out_event, bool autoclear) { return ::hidsysAcquireJoyDetachOnBluetoothOffEventHandle(out_event, autoclear); } +Result GetUniquePadBluetoothAddress(HidsysUniquePadId unique_pad_id, BtdrvAddress *address) { return ::hidsysGetUniquePadBluetoothAddress(unique_pad_id, address); } +Result DisconnectUniquePad(HidsysUniquePadId unique_pad_id) { return ::hidsysDisconnectUniquePad(unique_pad_id); } +Result GetUniquePadType(HidsysUniquePadId unique_pad_id, HidsysUniquePadType *pad_type) { return ::hidsysGetUniquePadType(unique_pad_id, pad_type); } +Result GetUniquePadInterface(HidsysUniquePadId unique_pad_id, HidNpadInterfaceType *interface) { return ::hidsysGetUniquePadInterface(unique_pad_id, interface); } +Result GetUniquePadSerialNumber(HidsysUniquePadId unique_pad_id, HidsysUniquePadSerialNumber *serial) { return ::hidsysGetUniquePadSerialNumber(unique_pad_id, serial); } +Result GetUniquePadControllerNumber(HidsysUniquePadId unique_pad_id, u64 *number) { return ::hidsysGetUniquePadControllerNumber(unique_pad_id, number); } +Result SetNotificationLedPattern(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id) { return ::hidsysSetNotificationLedPattern(pattern, unique_pad_id); } +Result SetNotificationLedPatternWithTimeout(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id, u64 timeout) { return ::hidsysSetNotificationLedPatternWithTimeout(pattern, unique_pad_id, timeout); } +Result IsUsbFullKeyControllerEnabled(bool *out) { return ::hidsysIsUsbFullKeyControllerEnabled(out); } +Result EnableUsbFullKeyController(bool flag) { return ::hidsysEnableUsbFullKeyController(flag); } +Result IsUsbConnected(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsUsbConnected(unique_pad_id, out); } +Result GetTouchScreenDefaultConfiguration(HidTouchScreenConfigurationForNx *touch_screen_configuration) { return ::hidsysGetTouchScreenDefaultConfiguration(touch_screen_configuration); } +Result IsFirmwareUpdateNeededForNotification(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsFirmwareUpdateNeededForNotification(unique_pad_id, out); } +Result LegacyIsButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysLegacyIsButtonConfigSupported(unique_pad_id, out); } +Result IsButtonConfigSupported(BtdrvAddress addr, bool *out) { return ::hidsysIsButtonConfigSupported(addr, out); } +Result IsButtonConfigEmbeddedSupported(bool *out) { return ::hidsysIsButtonConfigEmbeddedSupported(out); } +Result LegacyDeleteButtonConfig(HidsysUniquePadId unique_pad_id) { return ::hidsysLegacyDeleteButtonConfig(unique_pad_id); } +Result DeleteButtonConfig(BtdrvAddress addr) { return ::hidsysDeleteButtonConfig(addr); } +Result DeleteButtonConfigEmbedded(void) { return ::hidsysDeleteButtonConfigEmbedded(); } +Result LegacySetButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool flag) { return ::hidsysLegacySetButtonConfigEnabled(unique_pad_id, flag); } +Result SetButtonConfigEnabled(BtdrvAddress addr, bool flag) { return ::hidsysSetButtonConfigEnabled(addr, flag); } +Result SetButtonConfigEmbeddedEnabled(bool flag) { return ::hidsysSetButtonConfigEmbeddedEnabled(flag); } +Result LegacyIsButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysLegacyIsButtonConfigEnabled(unique_pad_id, out); } +Result IsButtonConfigEnabled(BtdrvAddress addr, bool *out) { return ::hidsysIsButtonConfigEnabled(addr, out); } +Result IsButtonConfigEmbeddedEnabled(bool *out) { return ::hidsysIsButtonConfigEmbeddedEnabled(out); } +Result LegacySetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigEmbedded *config) { return ::hidsysLegacySetButtonConfigEmbedded(unique_pad_id, config); } +Result SetButtonConfigEmbedded(const HidsysButtonConfigEmbedded *config) { return ::hidsysSetButtonConfigEmbedded(config); } +Result LegacySetButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigFull *config) { return ::hidsysLegacySetButtonConfigFull(unique_pad_id, config); } +Result SetButtonConfigFull(BtdrvAddress addr, const HidsysButtonConfigFull *config) { return ::hidsysSetButtonConfigFull(addr, config); } +Result LegacySetButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigLeft *config) { return ::hidsysLegacySetButtonConfigLeft(unique_pad_id, config); } +Result SetButtonConfigLeft(BtdrvAddress addr, const HidsysButtonConfigLeft *config) { return ::hidsysSetButtonConfigLeft(addr, config); } +Result LegacySetButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigRight *config) { return ::hidsysLegacySetButtonConfigRight(unique_pad_id, config); } +Result SetButtonConfigRight(BtdrvAddress addr, const HidsysButtonConfigRight *config) { return ::hidsysSetButtonConfigRight(addr, config); } +Result LegacyGetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidsysButtonConfigEmbedded *config) { return ::hidsysLegacyGetButtonConfigEmbedded(unique_pad_id, config); } +Result GetButtonConfigEmbedded(HidsysButtonConfigEmbedded *config) { return ::hidsysGetButtonConfigEmbedded(config); } +Result LegacyGetButtonConfigFull(HidsysUniquePadId unique_pad_id, HidsysButtonConfigFull *config) { return ::hidsysLegacyGetButtonConfigFull(unique_pad_id, config); } +Result GetButtonConfigFull(BtdrvAddress addr, HidsysButtonConfigFull *config) { return ::hidsysGetButtonConfigFull(addr, config); } +Result LegacyGetButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidsysButtonConfigLeft *config) { return ::hidsysLegacyGetButtonConfigLeft(unique_pad_id, config); } +Result GetButtonConfigLeft(BtdrvAddress addr, HidsysButtonConfigLeft *config) { return ::hidsysGetButtonConfigLeft(addr, config); } +Result LegacyGetButtonConfigRight(HidsysUniquePadId unique_pad_id, HidsysButtonConfigRight *config) { return ::hidsysLegacyGetButtonConfigRight(unique_pad_id, config); } +Result GetButtonConfigRight(BtdrvAddress addr, HidsysButtonConfigRight *config) { return ::hidsysGetButtonConfigRight(addr, config); } +Result IsCustomButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsCustomButtonConfigSupported(unique_pad_id, out); } +Result IsDefaultButtonConfigEmbedded(const HidcfgButtonConfigEmbedded *config, bool *out) { return ::hidsysIsDefaultButtonConfigEmbedded(config, out); } +Result IsDefaultButtonConfigFull(const HidcfgButtonConfigFull *config, bool *out) { return ::hidsysIsDefaultButtonConfigFull(config, out); } +Result IsDefaultButtonConfigLeft(const HidcfgButtonConfigLeft *config, bool *out) { return ::hidsysIsDefaultButtonConfigLeft(config, out); } +Result IsDefaultButtonConfigRight(const HidcfgButtonConfigRight *config, bool *out) { return ::hidsysIsDefaultButtonConfigRight(config, out); } +Result IsButtonConfigStorageEmbeddedEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageEmbeddedEmpty(index, out); } +Result IsButtonConfigStorageFullEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageFullEmpty(index, out); } +Result IsButtonConfigStorageLeftEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageLeftEmpty(index, out); } +Result IsButtonConfigStorageRightEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageRightEmpty(index, out); } +Result GetButtonConfigStorageEmbeddedDeprecated(s32 index, HidcfgButtonConfigEmbedded *config) { return ::hidsysGetButtonConfigStorageEmbeddedDeprecated(index, config); } +Result GetButtonConfigStorageFullDeprecated(s32 index, HidcfgButtonConfigFull *config) { return ::hidsysGetButtonConfigStorageFullDeprecated(index, config); } +Result GetButtonConfigStorageLeftDeprecated(s32 index, HidcfgButtonConfigLeft *config) { return ::hidsysGetButtonConfigStorageLeftDeprecated(index, config); } +Result GetButtonConfigStorageRightDeprecated(s32 index, HidcfgButtonConfigRight *config) { return ::hidsysGetButtonConfigStorageRightDeprecated(index, config); } +Result SetButtonConfigStorageEmbeddedDeprecated(s32 index, const HidcfgButtonConfigEmbedded *config) { return ::hidsysSetButtonConfigStorageEmbeddedDeprecated(index, config); } +Result SetButtonConfigStorageFullDeprecated(s32 index, const HidcfgButtonConfigFull *config) { return ::hidsysSetButtonConfigStorageFullDeprecated(index, config); } +Result SetButtonConfigStorageLeftDeprecated(s32 index, const HidcfgButtonConfigLeft *config) { return ::hidsysSetButtonConfigStorageLeftDeprecated(index, config); } +Result SetButtonConfigStorageRightDeprecated(s32 index, const HidcfgButtonConfigRight *config) { return ::hidsysSetButtonConfigStorageRightDeprecated(index, config); } +Result DeleteButtonConfigStorageEmbedded(s32 index) { return ::hidsysDeleteButtonConfigStorageEmbedded(index); } +Result DeleteButtonConfigStorageFull(s32 index) { return ::hidsysDeleteButtonConfigStorageFull(index); } +Result DeleteButtonConfigStorageLeft(s32 index) { return ::hidsysDeleteButtonConfigStorageLeft(index); } +Result DeleteButtonConfigStorageRight(s32 index) { return ::hidsysDeleteButtonConfigStorageRight(index); } +Result IsUsingCustomButtonConfig(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsUsingCustomButtonConfig(unique_pad_id, out); } +Result IsAnyCustomButtonConfigEnabled(bool *out) { return ::hidsysIsAnyCustomButtonConfigEnabled(out); } +Result SetAllCustomButtonConfigEnabled(u64 AppletResourceUserId, bool flag) { return ::hidsysSetAllCustomButtonConfigEnabled(AppletResourceUserId, flag); } +Result SetAllDefaultButtonConfig(void) { return ::hidsysSetAllDefaultButtonConfig(); } +Result SetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigEmbedded *config) { return ::hidsysSetHidButtonConfigEmbedded(unique_pad_id, config); } +Result SetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigFull *config) { return ::hidsysSetHidButtonConfigFull(unique_pad_id, config); } +Result SetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigLeft *config) { return ::hidsysSetHidButtonConfigLeft(unique_pad_id, config); } +Result SetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigRight *config) { return ::hidsysSetHidButtonConfigRight(unique_pad_id, config); } +Result GetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigEmbedded *config) { return ::hidsysGetHidButtonConfigEmbedded(unique_pad_id, config); } +Result GetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigFull *config) { return ::hidsysGetHidButtonConfigFull(unique_pad_id, config); } +Result GetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigLeft *config) { return ::hidsysGetHidButtonConfigLeft(unique_pad_id, config); } +Result GetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigRight *config) { return ::hidsysGetHidButtonConfigRight(unique_pad_id, config); } +Result GetButtonConfigStorageEmbedded(s32 index, HidcfgButtonConfigEmbedded *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageEmbedded(index, config, name); } +Result GetButtonConfigStorageFull(s32 index, HidcfgButtonConfigFull *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageFull(index, config, name); } +Result GetButtonConfigStorageLeft(s32 index, HidcfgButtonConfigLeft *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageLeft(index, config, name); } +Result GetButtonConfigStorageRight(s32 index, HidcfgButtonConfigRight *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageRight(index, config, name); } +Result SetButtonConfigStorageEmbedded(s32 index, const HidcfgButtonConfigEmbedded *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageEmbedded(index, config, name); } +Result SetButtonConfigStorageFull(s32 index, const HidcfgButtonConfigFull *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageFull(index, config, name); } +Result SetButtonConfigStorageLeft(s32 index, const HidcfgButtonConfigLeft *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageLeft(index, config, name); } +Result SetButtonConfigStorageRight(s32 index, const HidcfgButtonConfigRight *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageRight(index, config, name); } + +} // namespace hidsys + +namespace hipc { + +HipcStaticDescriptor MakeSendStatic(const void* buffer, size_t size, u8 index) { return ::hipcMakeSendStatic(buffer, size, index); } +HipcBufferDescriptor MakeBuffer(const void* buffer, size_t size, HipcBufferMode mode) { return ::hipcMakeBuffer(buffer, size, mode); } +HipcRecvListEntry MakeRecvStatic(void* buffer, size_t size) { return ::hipcMakeRecvStatic(buffer, size); } +void* GetStaticAddress(const HipcStaticDescriptor* desc) { return ::hipcGetStaticAddress(desc); } +size_t GetStaticSize(const HipcStaticDescriptor* desc) { return ::hipcGetStaticSize(desc); } +void* GetBufferAddress(const HipcBufferDescriptor* desc) { return ::hipcGetBufferAddress(desc); } +size_t GetBufferSize(const HipcBufferDescriptor* desc) { return ::hipcGetBufferSize(desc); } +HipcRequest CalcRequestLayout(HipcMetadata meta, void* base) { return ::hipcCalcRequestLayout(meta, base); } +HipcRequest MakeRequest(void* base, HipcMetadata meta) { return ::hipcMakeRequest(base, meta); } +HipcParsedRequest ParseRequest(void* base) { return ::hipcParseRequest(base); } +HipcResponse ParseResponse(void* base) { return ::hipcParseResponse(base); } + +} // namespace hipc + +namespace hmac { + +void Sha256ContextCreate(HmacSha256Context *out, const void *key, size_t key_size) { ::hmacSha256ContextCreate(out, key, key_size); } +void Sha256ContextUpdate(HmacSha256Context *ctx, const void *src, size_t size) { ::hmacSha256ContextUpdate(ctx, src, size); } +void Sha256ContextGetMac(HmacSha256Context *ctx, void *dst) { ::hmacSha256ContextGetMac(ctx, dst); } +void Sha256CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size) { ::hmacSha256CalculateMac(dst, key, key_size, src, size); } +void Sha1ContextCreate(HmacSha1Context *out, const void *key, size_t key_size) { ::hmacSha1ContextCreate(out, key, key_size); } +void Sha1ContextUpdate(HmacSha1Context *ctx, const void *src, size_t size) { ::hmacSha1ContextUpdate(ctx, src, size); } +void Sha1ContextGetMac(HmacSha1Context *ctx, void *dst) { ::hmacSha1ContextGetMac(ctx, dst); } +void Sha1CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size) { ::hmacSha1CalculateMac(dst, key, key_size, src, size); } + +} // namespace hmac + +namespace hosversion { + +u32 Get(void) { return ::hosversionGet(); } +void Set(u32 version) { ::hosversionSet(version); } +bool IsAtmosphere(void) { return ::hosversionIsAtmosphere(); } +bool AtLeast(u8 major, u8 minor, u8 micro) { return ::hosversionAtLeast(major, minor, micro); } +bool Before(u8 major, u8 minor, u8 micro) { return ::hosversionBefore(major, minor, micro); } +bool Between(u8 major1, u8 major2) { return ::hosversionBetween(major1, major2); } + +} // namespace hosversion + +namespace hwopus { + +Result DecoderInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount) { return ::hwopusDecoderInitialize(decoder, SampleRate, ChannelCount); } +void DecoderExit(HwopusDecoder* decoder) { ::hwopusDecoderExit(decoder); } +Result DecoderMultistreamInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount, s32 TotalStreamCount, s32 StereoStreamCount, u8 *channel_mapping) { return ::hwopusDecoderMultistreamInitialize(decoder, SampleRate, ChannelCount, TotalStreamCount, StereoStreamCount, channel_mapping); } +Result DecodeInterleaved(HwopusDecoder* decoder, s32 *DecodedDataSize, s32 *DecodedSampleCount, const void* opusin, size_t opusin_size, s16 *pcmbuf, size_t pcmbuf_size) { return ::hwopusDecodeInterleaved(decoder, DecodedDataSize, DecodedSampleCount, opusin, opusin_size, pcmbuf, pcmbuf_size); } + +} // namespace hwopus + +namespace i2c { + +Result Initialize(void) { return ::i2cInitialize(); } +void Exit(void) { ::i2cExit(); } +Service* GetServiceSession(void) { return ::i2cGetServiceSession(); } +Result OpenSession(I2cSession *out, I2cDevice dev) { return ::i2cOpenSession(out, dev); } + +} // namespace i2c + +namespace i2csession { + +Result SendAuto(I2cSession *s, const void *buf, size_t size, I2cTransactionOption option) { return ::i2csessionSendAuto(s, buf, size, option); } +Result ReceiveAuto(I2cSession *s, void *buf, size_t size, I2cTransactionOption option) { return ::i2csessionReceiveAuto(s, buf, size, option); } +Result ExecuteCommandList(I2cSession *s, void *dst, size_t dst_size, const void *cmd_list, size_t cmd_list_size) { return ::i2csessionExecuteCommandList(s, dst, dst_size, cmd_list, cmd_list_size); } +void Close(I2cSession *s) { ::i2csessionClose(s); } + +} // namespace i2csession + +namespace idlesys { + +Result Initialize(void) { return ::idlesysInitialize(); } +void Exit(void) { ::idlesysExit(); } +Service* GetServiceSession(void) { return ::idlesysGetServiceSession(); } +Result ReportUserIsActive(void) { return ::idlesysReportUserIsActive(); } + +} // namespace idlesys + +namespace insr { + +Result Initialize(void) { return ::insrInitialize(); } +void Exit(void) { ::insrExit(); } +Service* GetServiceSession(void) { return ::insrGetServiceSession(); } +Result GetLastTick(u32 id, u64 *tick) { return ::insrGetLastTick(id, tick); } +Result GetReadableEvent(u32 id, Event *out) { return ::insrGetReadableEvent(id, out); } + +} // namespace insr + +namespace inss { + +Result Initialize(void) { return ::inssInitialize(); } +void Exit(void) { ::inssExit(); } +Service* GetServiceSession(void) { return ::inssGetServiceSession(); } +Result GetWritableEvent(u32 id, Event *out) { return ::inssGetWritableEvent(id, out); } + +} // namespace inss + +namespace irs { + +Result Initialize(void) { return ::irsInitialize(); } +void Exit(void) { ::irsExit(); } +Service* GetServiceSession(void) { return ::irsGetServiceSession(); } +void* GetSharedmemAddr(void) { return ::irsGetSharedmemAddr(); } +Result GetIrCameraHandle(IrsIrCameraHandle *handle, HidNpadIdType id) { return ::irsGetIrCameraHandle(handle, id); } +Result GetIrCameraStatus(IrsIrCameraHandle handle, IrsIrCameraStatus *out) { return ::irsGetIrCameraStatus(handle, out); } +Result CheckFirmwareUpdateNecessity(IrsIrCameraHandle handle, bool *out) { return ::irsCheckFirmwareUpdateNecessity(handle, out); } +Result GetImageProcessorStatus(IrsIrCameraHandle handle, IrsImageProcessorStatus *out) { return ::irsGetImageProcessorStatus(handle, out); } +Result StopImageProcessor(IrsIrCameraHandle handle) { return ::irsStopImageProcessor(handle); } +Result StopImageProcessorAsync(IrsIrCameraHandle handle) { return ::irsStopImageProcessorAsync(handle); } +Result RunMomentProcessor(IrsIrCameraHandle handle, const IrsMomentProcessorConfig *config) { return ::irsRunMomentProcessor(handle, config); } +Result GetMomentProcessorStates(IrsIrCameraHandle handle, IrsMomentProcessorState *states, s32 count, s32 *total_out) { return ::irsGetMomentProcessorStates(handle, states, count, total_out); } +IrsMomentStatistic CalculateMomentRegionStatistic(const IrsMomentProcessorState *state, IrsRect rect, s32 region_x, s32 region_y, s32 region_width, s32 region_height) { return ::irsCalculateMomentRegionStatistic(state, rect, region_x, region_y, region_width, region_height); } +Result RunClusteringProcessor(IrsIrCameraHandle handle, const IrsClusteringProcessorConfig *config) { return ::irsRunClusteringProcessor(handle, config); } +Result GetClusteringProcessorStates(IrsIrCameraHandle handle, IrsClusteringProcessorState *states, s32 count, s32 *total_out) { return ::irsGetClusteringProcessorStates(handle, states, count, total_out); } +Result RunImageTransferProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorConfig *config, size_t size) { return ::irsRunImageTransferProcessor(handle, config, size); } +Result RunImageTransferExProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorExConfig *config, size_t size) { return ::irsRunImageTransferExProcessor(handle, config, size); } +Result GetImageTransferProcessorState(IrsIrCameraHandle handle, void* buffer, size_t size, IrsImageTransferProcessorState *state) { return ::irsGetImageTransferProcessorState(handle, buffer, size, state); } +Result RunPointingProcessor(IrsIrCameraHandle handle) { return ::irsRunPointingProcessor(handle); } +Result GetPointingProcessorMarkerStates(IrsIrCameraHandle handle, IrsPointingProcessorMarkerState *states, s32 count, s32 *total_out) { return ::irsGetPointingProcessorMarkerStates(handle, states, count, total_out); } +Result GetPointingProcessorStates(IrsIrCameraHandle handle, IrsPointingProcessorState *states, s32 count, s32 *total_out) { return ::irsGetPointingProcessorStates(handle, states, count, total_out); } +Result RunTeraPluginProcessor(IrsIrCameraHandle handle, const IrsTeraPluginProcessorConfig *config) { return ::irsRunTeraPluginProcessor(handle, config); } +Result GetTeraPluginProcessorStates(IrsIrCameraHandle handle, IrsTeraPluginProcessorState *states, s32 count, s64 sampling_number, u32 prefix_data, u32 prefix_bitcount, s32 *total_out) { return ::irsGetTeraPluginProcessorStates(handle, states, count, sampling_number, prefix_data, prefix_bitcount, total_out); } +Result RunIrLedProcessor(IrsIrCameraHandle handle, const IrsIrLedProcessorConfig *config) { return ::irsRunIrLedProcessor(handle, config); } +Result RunAdaptiveClusteringProcessor(IrsIrCameraHandle handle, const IrsAdaptiveClusteringProcessorConfig *config) { return ::irsRunAdaptiveClusteringProcessor(handle, config); } +Result RunHandAnalysis(IrsIrCameraHandle handle, const IrsHandAnalysisConfig *config) { return ::irsRunHandAnalysis(handle, config); } +void GetMomentProcessorDefaultConfig(IrsMomentProcessorConfig *config) { ::irsGetMomentProcessorDefaultConfig(config); } +void GetClusteringProcessorDefaultConfig(IrsClusteringProcessorConfig *config) { ::irsGetClusteringProcessorDefaultConfig(config); } +void GetDefaultImageTransferProcessorConfig(IrsImageTransferProcessorConfig *config) { ::irsGetDefaultImageTransferProcessorConfig(config); } +void GetDefaultImageTransferProcessorExConfig(IrsImageTransferProcessorExConfig *config) { ::irsGetDefaultImageTransferProcessorExConfig(config); } +void GetIrLedProcessorDefaultConfig(IrsIrLedProcessorConfig *config) { ::irsGetIrLedProcessorDefaultConfig(config); } + +} // namespace irs + +namespace jit { + +Result Create(Jit* j, size_t size) { return ::jitCreate(j, size); } +Result TransitionToWritable(Jit* j) { return ::jitTransitionToWritable(j); } +Result TransitionToExecutable(Jit* j) { return ::jitTransitionToExecutable(j); } +Result Close(Jit* j) { return ::jitClose(j); } +void* GetRwAddr(Jit* j) { return ::jitGetRwAddr(j); } +void* GetRxAddr(Jit* j) { return ::jitGetRxAddr(j); } + +} // namespace jit + +namespace lbl { + +Result Initialize(void) { return ::lblInitialize(); } +void Exit(void) { ::lblExit(); } +Service* GetServiceSession(void) { return ::lblGetServiceSession(); } +Result SaveCurrentSetting(void) { return ::lblSaveCurrentSetting(); } +Result LoadCurrentSetting(void) { return ::lblLoadCurrentSetting(); } +Result SetCurrentBrightnessSetting(float brightness) { return ::lblSetCurrentBrightnessSetting(brightness); } +Result GetCurrentBrightnessSetting(float *out_value) { return ::lblGetCurrentBrightnessSetting(out_value); } +Result ApplyCurrentBrightnessSettingToBacklight(void) { return ::lblApplyCurrentBrightnessSettingToBacklight(); } +Result GetBrightnessSettingAppliedToBacklight(float *out_value) { return ::lblGetBrightnessSettingAppliedToBacklight(out_value); } +Result SwitchBacklightOn(u64 fade_time) { return ::lblSwitchBacklightOn(fade_time); } +Result SwitchBacklightOff(u64 fade_time) { return ::lblSwitchBacklightOff(fade_time); } +Result GetBacklightSwitchStatus(LblBacklightSwitchStatus *out_value) { return ::lblGetBacklightSwitchStatus(out_value); } +Result EnableDimming(void) { return ::lblEnableDimming(); } +Result DisableDimming(void) { return ::lblDisableDimming(); } +Result IsDimmingEnabled(bool *out_value) { return ::lblIsDimmingEnabled(out_value); } +Result EnableAutoBrightnessControl(void) { return ::lblEnableAutoBrightnessControl(); } +Result DisableAutoBrightnessControl(void) { return ::lblDisableAutoBrightnessControl(); } +Result IsAutoBrightnessControlEnabled(bool *out_value) { return ::lblIsAutoBrightnessControlEnabled(out_value); } +Result SetAmbientLightSensorValue(float value) { return ::lblSetAmbientLightSensorValue(value); } +Result GetAmbientLightSensorValue(bool *over_limit, float *lux) { return ::lblGetAmbientLightSensorValue(over_limit, lux); } +Result IsAmbientLightSensorAvailable(bool *out_value) { return ::lblIsAmbientLightSensorAvailable(out_value); } +Result SetCurrentBrightnessSettingForVrMode(float brightness) { return ::lblSetCurrentBrightnessSettingForVrMode(brightness); } +Result GetCurrentBrightnessSettingForVrMode(float *out_value) { return ::lblGetCurrentBrightnessSettingForVrMode(out_value); } +Result EnableVrMode(void) { return ::lblEnableVrMode(); } +Result DisableVrMode(void) { return ::lblDisableVrMode(); } +Result IsVrModeEnabled(bool *out_value) { return ::lblIsVrModeEnabled(out_value); } + +} // namespace lbl + +namespace ldn { + +Result Initialize(LdnServiceType service_type) { return ::ldnInitialize(service_type); } +void Exit(void) { ::ldnExit(); } +Service* GetServiceSession_LocalCommunicationService(void) { return ::ldnGetServiceSession_LocalCommunicationService(); } +Service* GetServiceSession_IClientProcessMonitor(void) { return ::ldnGetServiceSession_IClientProcessMonitor(); } +Result GetState(LdnState *out) { return ::ldnGetState(out); } +Result GetNetworkInfo(LdnNetworkInfo *out) { return ::ldnGetNetworkInfo(out); } +Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask) { return ::ldnGetIpv4Address(addr, mask); } +Result GetDisconnectReason(LdnDisconnectReason *out) { return ::ldnGetDisconnectReason(out); } +Result GetSecurityParameter(LdnSecurityParameter *out) { return ::ldnGetSecurityParameter(out); } +Result GetNetworkConfig(LdnNetworkConfig *out) { return ::ldnGetNetworkConfig(out); } +Result GetStateChangeEvent(Event* out_event) { return ::ldnGetStateChangeEvent(out_event); } +Result GetNetworkInfoAndHistory(LdnNetworkInfo *network_info, LdnNodeLatestUpdate *nodes, s32 count) { return ::ldnGetNetworkInfoAndHistory(network_info, nodes, count); } +Result Scan(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out) { return ::ldnScan(channel, filter, network_info, count, total_out); } +Result ScanPrivate(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out) { return ::ldnScanPrivate(channel, filter, network_info, count, total_out); } +Result SetWirelessControllerRestriction(LdnWirelessControllerRestriction restriction) { return ::ldnSetWirelessControllerRestriction(restriction); } +Result SetProtocol(LdnProtocol protocol) { return ::ldnSetProtocol(protocol); } +Result OpenAccessPoint(void) { return ::ldnOpenAccessPoint(); } +Result CloseAccessPoint(void) { return ::ldnCloseAccessPoint(); } +Result CreateNetwork(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config) { return ::ldnCreateNetwork(sec_config, user_config, network_config); } +Result CreateNetworkPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config, const LdnAddressEntry *addrs, s32 count) { return ::ldnCreateNetworkPrivate(sec_config, sec_param, user_config, network_config, addrs, count); } +Result DestroyNetwork(void) { return ::ldnDestroyNetwork(); } +Result Reject(LdnIpv4Address addr) { return ::ldnReject(addr); } +Result SetAdvertiseData(const void* buffer, size_t size) { return ::ldnSetAdvertiseData(buffer, size); } +Result SetStationAcceptPolicy(LdnAcceptPolicy policy) { return ::ldnSetStationAcceptPolicy(policy); } +Result AddAcceptFilterEntry(LdnMacAddress addr) { return ::ldnAddAcceptFilterEntry(addr); } +Result ClearAcceptFilter(void) { return ::ldnClearAcceptFilter(); } +Result OpenStation(void) { return ::ldnOpenStation(); } +Result CloseStation(void) { return ::ldnCloseStation(); } +Result Connect(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkInfo *network_info) { return ::ldnConnect(sec_config, user_config, version, option, network_info); } +Result ConnectPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkConfig *network_config) { return ::ldnConnectPrivate(sec_config, sec_param, user_config, version, option, network_config); } +Result Disconnect(void) { return ::ldnDisconnect(); } +Result SetOperationMode(LdnOperationMode mode) { return ::ldnSetOperationMode(mode); } +Result EnableActionFrame(const LdnActionFrameSettings *settings) { return ::ldnEnableActionFrame(settings); } +Result DisableActionFrame(void) { return ::ldnDisableActionFrame(); } +Result SendActionFrame(const void* data, size_t size, LdnMacAddress destination, LdnMacAddress bssid, s16 channel, u32 flags) { return ::ldnSendActionFrame(data, size, destination, bssid, channel, flags); } +Result RecvActionFrame(void* data, size_t size, LdnMacAddress *addr0, LdnMacAddress *addr1, s16 *channel, u32 *out_size, s32 *link_level, u32 flags) { return ::ldnRecvActionFrame(data, size, addr0, addr1, channel, out_size, link_level, flags); } +Result SetHomeChannel(s16 channel) { return ::ldnSetHomeChannel(channel); } +Result SetTxPower(s16 power) { return ::ldnSetTxPower(power); } +Result ResetTxPower(void) { return ::ldnResetTxPower(); } + +} // namespace ldn + +namespace ldnm { + +Result Initialize(void) { return ::ldnmInitialize(); } +void Exit(void) { ::ldnmExit(); } +Service* GetServiceSession_MonitorService(void) { return ::ldnmGetServiceSession_MonitorService(); } +Result GetState(LdnState *out) { return ::ldnmGetState(out); } +Result GetNetworkInfo(LdnNetworkInfo *out) { return ::ldnmGetNetworkInfo(out); } +Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask) { return ::ldnmGetIpv4Address(addr, mask); } +Result GetSecurityParameter(LdnSecurityParameter *out) { return ::ldnmGetSecurityParameter(out); } +Result GetNetworkConfig(LdnNetworkConfig *out) { return ::ldnmGetNetworkConfig(out); } + +} // namespace ldnm + +namespace ldr { + +Result ShellInitialize(void) { return ::ldrShellInitialize(); } +void ShellExit(void) { ::ldrShellExit(); } +Service* ShellGetServiceSession(void) { return ::ldrShellGetServiceSession(); } +Result DmntInitialize(void) { return ::ldrDmntInitialize(); } +void DmntExit(void) { ::ldrDmntExit(); } +Service* DmntGetServiceSession(void) { return ::ldrDmntGetServiceSession(); } +Result PmInitialize(void) { return ::ldrPmInitialize(); } +void PmExit(void) { ::ldrPmExit(); } +Service* PmGetServiceSession(void) { return ::ldrPmGetServiceSession(); } +Result ShellSetProgramArguments(u64 program_id, const void *args, size_t args_size) { return ::ldrShellSetProgramArguments(program_id, args, args_size); } +Result ShellFlushArguments(void) { return ::ldrShellFlushArguments(); } +Result DmntSetProgramArguments(u64 program_id, const void *args, size_t args_size) { return ::ldrDmntSetProgramArguments(program_id, args, args_size); } +Result DmntFlushArguments(void) { return ::ldrDmntFlushArguments(); } +Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out) { return ::ldrDmntGetProcessModuleInfo(pid, out_module_infos, max_out_modules, num_out); } +Result PmCreateProcess(u64 pin_id, u32 flags, Handle reslimit_h, const LoaderProgramAttributes *attrs, Handle *out_process_h) { return ::ldrPmCreateProcess(pin_id, flags, reslimit_h, attrs, out_process_h); } +Result PmGetProgramInfo(const NcmProgramLocation *loc, const LoaderProgramAttributes *attrs, LoaderProgramInfo *out_program_info) { return ::ldrPmGetProgramInfo(loc, attrs, out_program_info); } +Result PmGetProgramInfoV1(const NcmProgramLocation *loc, LoaderProgramInfoV1 *out_program_info) { return ::ldrPmGetProgramInfoV1(loc, out_program_info); } +Result PmPinProgram(const NcmProgramLocation *loc, u64 *out_pin_id) { return ::ldrPmPinProgram(loc, out_pin_id); } +Result PmUnpinProgram(u64 pin_id) { return ::ldrPmUnpinProgram(pin_id); } +Result PmSetEnabledProgramVerification(bool enabled) { return ::ldrPmSetEnabledProgramVerification(enabled); } +Result RoInitialize(void) { return ::ldrRoInitialize(); } +void RoExit(void) { ::ldrRoExit(); } +Service* RoGetServiceSession(void) { return ::ldrRoGetServiceSession(); } +Result RoLoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { return ::ldrRoLoadNro(out_address, nro_address, nro_size, bss_address, bss_size); } +Result RoUnloadNro(u64 nro_address) { return ::ldrRoUnloadNro(nro_address); } +Result RoLoadNrr(u64 nrr_address, u64 nrr_size) { return ::ldrRoLoadNrr(nrr_address, nrr_size); } +Result RoUnloadNrr(u64 nrr_address) { return ::ldrRoUnloadNrr(nrr_address); } +Result RoLoadNrrEx(u64 nrr_address, u64 nrr_size) { return ::ldrRoLoadNrrEx(nrr_address, nrr_size); } + +} // namespace ldr + +namespace levent { + +void Init(LEvent* le, bool signaled, bool autoclear) { ::leventInit(le, signaled, autoclear); } +bool Wait(LEvent* le, u64 timeout_ns) { return ::leventWait(le, timeout_ns); } +bool TryWait(LEvent* le) { return ::leventTryWait(le); } +void Signal(LEvent* le) { ::leventSignal(le); } +void Clear(LEvent* le) { ::leventClear(le); } + +} // namespace levent + +namespace libapplet { + +void ArgsCreate(LibAppletArgs* a, u32 version) { ::libappletArgsCreate(a, version); } +void ArgsSetPlayStartupSound(LibAppletArgs* a, bool flag) { ::libappletArgsSetPlayStartupSound(a, flag); } +Result CreateWriteStorage(AppletStorage* s, const void* buffer, size_t size) { return ::libappletCreateWriteStorage(s, buffer, size); } +Result ReadStorage(AppletStorage* s, void* buffer, size_t size, size_t *transfer_size) { return ::libappletReadStorage(s, buffer, size, transfer_size); } +Result ArgsPush(LibAppletArgs* a, AppletHolder *h) { return ::libappletArgsPush(a, h); } +Result ArgsPop(LibAppletArgs* a) { return ::libappletArgsPop(a); } +Result PushInData(AppletHolder *h, const void* buffer, size_t size) { return ::libappletPushInData(h, buffer, size); } +Result PopOutData(AppletHolder *h, void* buffer, size_t size, size_t *transfer_size) { return ::libappletPopOutData(h, buffer, size, transfer_size); } +void SetJumpFlag(bool flag) { ::libappletSetJumpFlag(flag); } +Result Start(AppletHolder *h) { return ::libappletStart(h); } +Result Launch(AppletId id, LibAppletArgs *commonargs, const void* arg, size_t arg_size, void* reply, size_t reply_size, size_t *out_reply_size) { return ::libappletLaunch(id, commonargs, arg, arg_size, reply, reply_size, out_reply_size); } +Result RequestHomeMenu(void) { return ::libappletRequestHomeMenu(); } +Result RequestJumpToSystemUpdate(void) { return ::libappletRequestJumpToSystemUpdate(); } +Result RequestToLaunchApplication(u64 application_id, AccountUid uid, const void* buffer, size_t size, u32 sender) { return ::libappletRequestToLaunchApplication(application_id, uid, buffer, size, sender); } +Result RequestJumpToStory(AccountUid uid, u64 application_id) { return ::libappletRequestJumpToStory(uid, application_id); } + +} // namespace libapplet + +namespace lp2p { + +Result Initialize(Lp2pServiceType service_type) { return ::lp2pInitialize(service_type); } +void Exit(void) { ::lp2pExit(); } +Service* GetServiceSession_INetworkService(void) { return ::lp2pGetServiceSession_INetworkService(); } +Service* GetServiceSession_INetworkServiceMonitor(void) { return ::lp2pGetServiceSession_INetworkServiceMonitor(); } +void CreateGroupInfo(Lp2pGroupInfo *info) { ::lp2pCreateGroupInfo(info); } +void CreateGroupInfoScan(Lp2pGroupInfo *info) { ::lp2pCreateGroupInfoScan(info); } +void GroupInfoSetServiceName(Lp2pGroupInfo *info, const char *name) { ::lp2pGroupInfoSetServiceName(info, name); } +void GroupInfoSetFlags(Lp2pGroupInfo *info, s8 *flags, size_t count) { ::lp2pGroupInfoSetFlags(info, flags, count); } +void GroupInfoSetMemberCountMax(Lp2pGroupInfo *info, size_t count) { ::lp2pGroupInfoSetMemberCountMax(info, count); } +void GroupInfoSetFrequencyChannel(Lp2pGroupInfo *info, u16 frequency, s16 channel) { ::lp2pGroupInfoSetFrequencyChannel(info, frequency, channel); } +void GroupInfoSetStealthEnabled(Lp2pGroupInfo *info, bool flag) { ::lp2pGroupInfoSetStealthEnabled(info, flag); } +void GroupInfoSetPresharedKey(Lp2pGroupInfo *info, const void* key, size_t size) { ::lp2pGroupInfoSetPresharedKey(info, key, size); } +Result GroupInfoSetPassphrase(Lp2pGroupInfo *info, const char *passphrase) { return ::lp2pGroupInfoSetPassphrase(info, passphrase); } +Result Scan(const Lp2pGroupInfo *info, Lp2pScanResult *results, s32 count, s32 *total_out) { return ::lp2pScan(info, results, count, total_out); } +Result CreateGroup(const Lp2pGroupInfo *info) { return ::lp2pCreateGroup(info); } +Result DestroyGroup(void) { return ::lp2pDestroyGroup(); } +Result SetAdvertiseData(const void* buffer, size_t size) { return ::lp2pSetAdvertiseData(buffer, size); } +Result SendToOtherGroup(const void* buffer, size_t size, Lp2pMacAddress addr, Lp2pGroupId group_id, s16 frequency, s16 channel, u32 flags) { return ::lp2pSendToOtherGroup(buffer, size, addr, group_id, frequency, channel, flags); } +Result RecvFromOtherGroup(void* buffer, size_t size, u32 flags, Lp2pMacAddress *addr, u16 *unk0, s32 *unk1, u64 *out_size, s32 *unk2) { return ::lp2pRecvFromOtherGroup(buffer, size, flags, addr, unk0, unk1, out_size, unk2); } +Result AddAcceptableGroupId(Lp2pGroupId group_id) { return ::lp2pAddAcceptableGroupId(group_id); } +Result RemoveAcceptableGroupId(void) { return ::lp2pRemoveAcceptableGroupId(); } +Result AttachNetworkInterfaceStateChangeEvent(Event* out_event) { return ::lp2pAttachNetworkInterfaceStateChangeEvent(out_event); } +Result GetNetworkInterfaceLastError(void) { return ::lp2pGetNetworkInterfaceLastError(); } +Result GetRole(u8 *out) { return ::lp2pGetRole(out); } +Result GetAdvertiseData(void* buffer, size_t size, u16 *transfer_size, u16 *original_size) { return ::lp2pGetAdvertiseData(buffer, size, transfer_size, original_size); } +Result GetAdvertiseData2(void* buffer, size_t size, u16 *transfer_size, u16 *original_size) { return ::lp2pGetAdvertiseData2(buffer, size, transfer_size, original_size); } +Result GetGroupInfo(Lp2pGroupInfo *out) { return ::lp2pGetGroupInfo(out); } +Result Join(Lp2pGroupInfo *out, const Lp2pGroupInfo *info) { return ::lp2pJoin(out, info); } +Result GetGroupOwner(Lp2pNodeInfo *out) { return ::lp2pGetGroupOwner(out); } +Result GetIpConfig(Lp2pIpConfig *out) { return ::lp2pGetIpConfig(out); } +Result Leave(u32 *out) { return ::lp2pLeave(out); } +Result AttachJoinEvent(Event* out_event) { return ::lp2pAttachJoinEvent(out_event); } +Result GetMembers(Lp2pNodeInfo *members, s32 count, s32 *total_out) { return ::lp2pGetMembers(members, count, total_out); } + +} // namespace lp2p + +namespace lr { + +Result Initialize(void) { return ::lrInitialize(); } +void Exit(void) { ::lrExit(); } +Service* GetServiceSession(void) { return ::lrGetServiceSession(); } +Result OpenLocationResolver(NcmStorageId storage, LrLocationResolver* out) { return ::lrOpenLocationResolver(storage, out); } +Result OpenRegisteredLocationResolver(LrRegisteredLocationResolver* out) { return ::lrOpenRegisteredLocationResolver(out); } +Result LrResolveProgramPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveProgramPath(lr, tid, out); } +Result LrRedirectProgramPath(LrLocationResolver* lr, u64 tid, const char *path) { return ::lrLrRedirectProgramPath(lr, tid, path); } +Result LrResolveApplicationControlPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveApplicationControlPath(lr, tid, out); } +Result LrResolveApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveApplicationHtmlDocumentPath(lr, tid, out); } +Result LrResolveDataPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveDataPath(lr, tid, out); } +Result LrRedirectApplicationControlPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path) { return ::lrLrRedirectApplicationControlPath(lr, tid, tid2, path); } +Result LrRedirectApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path) { return ::lrLrRedirectApplicationHtmlDocumentPath(lr, tid, tid2, path); } +Result LrResolveApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveApplicationLegalInformationPath(lr, tid, out); } +Result LrRedirectApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path) { return ::lrLrRedirectApplicationLegalInformationPath(lr, tid, tid2, path); } +Result LrRefresh(LrLocationResolver* lr) { return ::lrLrRefresh(lr); } +Result LrEraseProgramRedirection(LrLocationResolver* lr, u64 tid) { return ::lrLrEraseProgramRedirection(lr, tid); } +Result RegLrResolveProgramPath(LrRegisteredLocationResolver* reg, u64 tid, char *out) { return ::lrRegLrResolveProgramPath(reg, tid, out); } + +} // namespace lr + +namespace mii { + +Result LaShowMiiEdit(MiiSpecialKeyCode special_key_code) { return ::miiLaShowMiiEdit(special_key_code); } +Result LaAppendMii(MiiSpecialKeyCode special_key_code, s32 *index) { return ::miiLaAppendMii(special_key_code, index); } +Result LaAppendMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, s32 *index) { return ::miiLaAppendMiiImage(special_key_code, valid_uuid_array, count, index); } +Result LaUpdateMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, Uuid used_uuid, s32 *index) { return ::miiLaUpdateMiiImage(special_key_code, valid_uuid_array, count, used_uuid, index); } +Result LaCreateMii(MiiSpecialKeyCode special_key_code, MiiCharInfo *out_char) { return ::miiLaCreateMii(special_key_code, out_char); } +Result LaEditMii(MiiSpecialKeyCode special_key_code, const MiiCharInfo *in_char, MiiCharInfo *out_char) { return ::miiLaEditMii(special_key_code, in_char, out_char); } +Result Initialize(MiiServiceType service_type) { return ::miiInitialize(service_type); } +void Exit(void) { ::miiExit(); } +Service* GetServiceSession(void) { return ::miiGetServiceSession(); } +Result OpenDatabase(MiiDatabase *out, MiiSpecialKeyCode key_code) { return ::miiOpenDatabase(out, key_code); } +Result DatabaseIsUpdated(MiiDatabase *db, bool *out_updated, MiiSourceFlag flag) { return ::miiDatabaseIsUpdated(db, out_updated, flag); } +Result DatabaseIsFull(MiiDatabase *db, bool *out_full) { return ::miiDatabaseIsFull(db, out_full); } +Result DatabaseGetCount(MiiDatabase *db, s32 *out_count, MiiSourceFlag flag) { return ::miiDatabaseGetCount(db, out_count, flag); } +Result DatabaseGet1(MiiDatabase *db, MiiSourceFlag flag, MiiCharInfo *out_infos, s32 count, s32 *total_out) { return ::miiDatabaseGet1(db, flag, out_infos, count, total_out); } +Result DatabaseBuildRandom(MiiDatabase *db, MiiAge age, MiiGender gender, MiiFaceColor face_color, MiiCharInfo *out_info) { return ::miiDatabaseBuildRandom(db, age, gender, face_color, out_info); } +void DatabaseClose(MiiDatabase *db) { ::miiDatabaseClose(db); } + +} // namespace mii + +namespace miiimg { + +Result Initialize(void) { return ::miiimgInitialize(); } +void Exit(void) { ::miiimgExit(); } +Service* GetServiceSession(void) { return ::miiimgGetServiceSession(); } +Result Reload(void) { return ::miiimgReload(); } +Result GetCount(s32 *out_count) { return ::miiimgGetCount(out_count); } +Result IsEmpty(bool *out_empty) { return ::miiimgIsEmpty(out_empty); } +Result IsFull(bool *out_full) { return ::miiimgIsFull(out_full); } +Result GetAttribute(s32 index, MiiimgImageAttribute *out_attr) { return ::miiimgGetAttribute(index, out_attr); } +Result LoadImage(MiiimgImageId id, void* out_image, size_t out_image_size) { return ::miiimgLoadImage(id, out_image, out_image_size); } + +} // namespace miiimg + +namespace mmu { + +Result Initialize(void) { return ::mmuInitialize(); } +void Exit(void) { ::mmuExit(); } +Service* GetServiceSession(void) { return ::mmuGetServiceSession(); } +Result RequestInitialize(MmuRequest *request, MmuModuleId module, u32 unk, bool autoclear) { return ::mmuRequestInitialize(request, module, unk, autoclear); } +Result RequestFinalize(const MmuRequest *request) { return ::mmuRequestFinalize(request); } +Result RequestGet(const MmuRequest *request, u32 *out_freq_hz) { return ::mmuRequestGet(request, out_freq_hz); } +Result RequestSetAndWait(const MmuRequest *request, u32 freq_hz, s32 timeout) { return ::mmuRequestSetAndWait(request, freq_hz, timeout); } + +} // namespace mmu + +namespace mutex { + +void Init(Mutex* m) { ::mutexInit(m); } +void Lock(Mutex* m) { ::mutexLock(m); } +bool TryLock(Mutex* m) { return ::mutexTryLock(m); } +void Unlock(Mutex* m) { ::mutexUnlock(m); } +bool IsLockedByCurrentThread(const Mutex* m) { return ::mutexIsLockedByCurrentThread(m); } + +} // namespace mutex + +namespace nacp { + +Result GetLanguageEntry(NacpStruct* nacp, NacpLanguageEntry** langentry) { return ::nacpGetLanguageEntry(nacp, langentry); } + +} // namespace nacp + +namespace ncm { + +Result Initialize(void) { return ::ncmInitialize(); } +void Exit(void) { ::ncmExit(); } +Service* GetServiceSession(void) { return ::ncmGetServiceSession(); } +Result CreateContentStorage(NcmStorageId storage_id) { return ::ncmCreateContentStorage(storage_id); } +Result CreateContentMetaDatabase(NcmStorageId storage_id) { return ::ncmCreateContentMetaDatabase(storage_id); } +Result VerifyContentStorage(NcmStorageId storage_id) { return ::ncmVerifyContentStorage(storage_id); } +Result VerifyContentMetaDatabase(NcmStorageId storage_id) { return ::ncmVerifyContentMetaDatabase(storage_id); } +Result OpenContentStorage(NcmContentStorage* out_content_storage, NcmStorageId storage_id) { return ::ncmOpenContentStorage(out_content_storage, storage_id); } +Result OpenContentMetaDatabase(NcmContentMetaDatabase* out_content_meta_database, NcmStorageId storage_id) { return ::ncmOpenContentMetaDatabase(out_content_meta_database, storage_id); } +Result CloseContentStorageForcibly(NcmStorageId storage_id) { return ::ncmCloseContentStorageForcibly(storage_id); } +Result CloseContentMetaDatabaseForcibly(NcmStorageId storage_id) { return ::ncmCloseContentMetaDatabaseForcibly(storage_id); } +Result CleanupContentMetaDatabase(NcmStorageId storage_id) { return ::ncmCleanupContentMetaDatabase(storage_id); } +Result ActivateContentStorage(NcmStorageId storage_id) { return ::ncmActivateContentStorage(storage_id); } +Result InactivateContentStorage(NcmStorageId storage_id) { return ::ncmInactivateContentStorage(storage_id); } +Result ActivateContentMetaDatabase(NcmStorageId storage_id) { return ::ncmActivateContentMetaDatabase(storage_id); } +Result InactivateContentMetaDatabase(NcmStorageId storage_id) { return ::ncmInactivateContentMetaDatabase(storage_id); } +Result InvalidateRightsIdCache(void) { return ::ncmInvalidateRightsIdCache(); } +Result ActivateFsContentStorage(FsContentStorageId fs_storage_id) { return ::ncmActivateFsContentStorage(fs_storage_id); } +void ContentStorageClose(NcmContentStorage* cs) { ::ncmContentStorageClose(cs); } +Result ContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmPlaceHolderId* out_id) { return ::ncmContentStorageGeneratePlaceHolderId(cs, out_id); } +Result ContentStorageCreatePlaceHolder(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id, s64 size) { return ::ncmContentStorageCreatePlaceHolder(cs, content_id, placeholder_id, size); } +Result ContentStorageDeletePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageDeletePlaceHolder(cs, placeholder_id); } +Result ContentStorageHasPlaceHolder(NcmContentStorage* cs, bool* out, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageHasPlaceHolder(cs, out, placeholder_id); } +Result ContentStorageWritePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, u64 offset, const void* data, size_t data_size) { return ::ncmContentStorageWritePlaceHolder(cs, placeholder_id, offset, data, data_size); } +Result ContentStorageRegister(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageRegister(cs, content_id, placeholder_id); } +Result ContentStorageDelete(NcmContentStorage* cs, const NcmContentId* content_id) { return ::ncmContentStorageDelete(cs, content_id); } +Result ContentStorageHas(NcmContentStorage* cs, bool* out, const NcmContentId* content_id) { return ::ncmContentStorageHas(cs, out, content_id); } +Result ContentStorageGetPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmContentId* content_id) { return ::ncmContentStorageGetPath(cs, out_path, out_size, content_id); } +Result ContentStorageGetPlaceHolderPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageGetPlaceHolderPath(cs, out_path, out_size, placeholder_id); } +Result ContentStorageCleanupAllPlaceHolder(NcmContentStorage* cs) { return ::ncmContentStorageCleanupAllPlaceHolder(cs); } +Result ContentStorageListPlaceHolder(NcmContentStorage* cs, NcmPlaceHolderId* out_ids, s32 count, s32* out_count) { return ::ncmContentStorageListPlaceHolder(cs, out_ids, count, out_count); } +Result ContentStorageGetContentCount(NcmContentStorage* cs, s32* out_count) { return ::ncmContentStorageGetContentCount(cs, out_count); } +Result ContentStorageListContentId(NcmContentStorage* cs, NcmContentId* out_ids, s32 count, s32* out_count, s32 start_offset) { return ::ncmContentStorageListContentId(cs, out_ids, count, out_count, start_offset); } +Result ContentStorageGetSizeFromContentId(NcmContentStorage* cs, s64* out_size, const NcmContentId* content_id) { return ::ncmContentStorageGetSizeFromContentId(cs, out_size, content_id); } +Result ContentStorageDisableForcibly(NcmContentStorage* cs) { return ::ncmContentStorageDisableForcibly(cs); } +Result ContentStorageRevertToPlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, const NcmContentId* old_content_id, const NcmContentId* new_content_id) { return ::ncmContentStorageRevertToPlaceHolder(cs, placeholder_id, old_content_id, new_content_id); } +Result ContentStorageSetPlaceHolderSize(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, s64 size) { return ::ncmContentStorageSetPlaceHolderSize(cs, placeholder_id, size); } +Result ContentStorageReadContentIdFile(NcmContentStorage* cs, void* out_data, size_t out_data_size, const NcmContentId* content_id, s64 offset) { return ::ncmContentStorageReadContentIdFile(cs, out_data, out_data_size, content_id, offset); } +Result ContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, FsContentAttributes attr) { return ::ncmContentStorageGetRightsIdFromPlaceHolderId(cs, out_rights_id, placeholder_id, attr); } +Result ContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmContentId* content_id, FsContentAttributes attr) { return ::ncmContentStorageGetRightsIdFromContentId(cs, out_rights_id, content_id, attr); } +Result ContentStorageWriteContentForDebug(NcmContentStorage* cs, const NcmContentId* content_id, s64 offset, const void* data, size_t data_size) { return ::ncmContentStorageWriteContentForDebug(cs, content_id, offset, data, data_size); } +Result ContentStorageGetFreeSpaceSize(NcmContentStorage* cs, s64* out_size) { return ::ncmContentStorageGetFreeSpaceSize(cs, out_size); } +Result ContentStorageGetTotalSpaceSize(NcmContentStorage* cs, s64* out_size) { return ::ncmContentStorageGetTotalSpaceSize(cs, out_size); } +Result ContentStorageFlushPlaceHolder(NcmContentStorage* cs) { return ::ncmContentStorageFlushPlaceHolder(cs); } +Result ContentStorageGetSizeFromPlaceHolderId(NcmContentStorage* cs, s64* out_size, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageGetSizeFromPlaceHolderId(cs, out_size, placeholder_id); } +Result ContentStorageRepairInvalidFileAttribute(NcmContentStorage* cs) { return ::ncmContentStorageRepairInvalidFileAttribute(cs); } +Result ContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, const NcmContentId* cache_content_id, FsContentAttributes attr) { return ::ncmContentStorageGetRightsIdFromPlaceHolderIdWithCache(cs, out_rights_id, placeholder_id, cache_content_id, attr); } +Result ContentStorageRegisterPath(NcmContentStorage* cs, const NcmContentId* content_id, const char *path) { return ::ncmContentStorageRegisterPath(cs, content_id, path); } +Result ContentStorageClearRegisteredPath(NcmContentStorage* cs) { return ::ncmContentStorageClearRegisteredPath(cs); } +Result ContentStorageGetProgramId(NcmContentStorage* cs, u64* out, const NcmContentId* content_id, FsContentAttributes attr) { return ::ncmContentStorageGetProgramId(cs, out, content_id, attr); } +void ContentMetaDatabaseClose(NcmContentMetaDatabase* db) { ::ncmContentMetaDatabaseClose(db); } +Result ContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, const void* data, u64 data_size) { return ::ncmContentMetaDatabaseSet(db, key, data, data_size); } +Result ContentMetaDatabaseGet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u64* out_size, void* out_data, u64 out_data_size) { return ::ncmContentMetaDatabaseGet(db, key, out_size, out_data, out_data_size); } +Result ContentMetaDatabaseRemove(NcmContentMetaDatabase* db, const NcmContentMetaKey *key) { return ::ncmContentMetaDatabaseRemove(db, key); } +Result ContentMetaDatabaseGetContentIdByType(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type) { return ::ncmContentMetaDatabaseGetContentIdByType(db, out_content_id, key, type); } +Result ContentMetaDatabaseListContentInfo(NcmContentMetaDatabase* db, s32* out_entries_written, NcmContentInfo* out_info, s32 count, const NcmContentMetaKey* key, s32 start_index) { return ::ncmContentMetaDatabaseListContentInfo(db, out_entries_written, out_info, count, key, start_index); } +Result ContentMetaDatabaseList(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type, u64 id, u64 id_min, u64 id_max, NcmContentInstallType install_type) { return ::ncmContentMetaDatabaseList(db, out_entries_total, out_entries_written, out_keys, count, meta_type, id, id_min, id_max, install_type); } +Result ContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, NcmContentMetaKey* out_key, u64 id) { return ::ncmContentMetaDatabaseGetLatestContentMetaKey(db, out_key, id); } +Result ContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmApplicationContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type) { return ::ncmContentMetaDatabaseListApplication(db, out_entries_total, out_entries_written, out_keys, count, meta_type); } +Result ContentMetaDatabaseHas(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseHas(db, out, key); } +Result ContentMetaDatabaseHasAll(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* keys, s32 count) { return ::ncmContentMetaDatabaseHasAll(db, out, keys, count); } +Result ContentMetaDatabaseGetSize(NcmContentMetaDatabase* db, u64* out_size, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetSize(db, out_size, key); } +Result ContentMetaDatabaseGetRequiredSystemVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetRequiredSystemVersion(db, out_version, key); } +Result ContentMetaDatabaseGetPatchContentMetaId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetPatchContentMetaId(db, out_patch_id, key); } +Result ContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db) { return ::ncmContentMetaDatabaseDisableForcibly(db); } +Result ContentMetaDatabaseLookupOrphanContent(NcmContentMetaDatabase* db, bool* out_orphaned, const NcmContentId* content_ids, s32 count) { return ::ncmContentMetaDatabaseLookupOrphanContent(db, out_orphaned, content_ids, count); } +Result ContentMetaDatabaseCommit(NcmContentMetaDatabase* db) { return ::ncmContentMetaDatabaseCommit(db); } +Result ContentMetaDatabaseHasContent(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key, const NcmContentId* content_id) { return ::ncmContentMetaDatabaseHasContent(db, out, key, content_id); } +Result ContentMetaDatabaseListContentMetaInfo(NcmContentMetaDatabase* db, s32* out_entries_written, void* out_meta_info, s32 count, const NcmContentMetaKey* key, s32 start_index) { return ::ncmContentMetaDatabaseListContentMetaInfo(db, out_entries_written, out_meta_info, count, key, start_index); } +Result ContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u8* out) { return ::ncmContentMetaDatabaseGetAttributes(db, key, out); } +Result ContentMetaDatabaseGetRequiredApplicationVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetRequiredApplicationVersion(db, out_version, key); } +Result ContentMetaDatabaseGetContentIdByTypeAndIdOffset(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type, u8 id_offset) { return ::ncmContentMetaDatabaseGetContentIdByTypeAndIdOffset(db, out_content_id, key, type, id_offset); } +Result ContentMetaDatabaseGetPlatform(NcmContentMetaDatabase* db, u8* out, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetPlatform(db, out, key); } +void ContentInfoSizeToU64(const NcmContentInfo *info, u64 *out) { ::ncmContentInfoSizeToU64(info, out); } +void U64ToContentInfoSize(const u64 size, NcmContentInfo *info) { ::ncmU64ToContentInfoSize(size, info); } + +} // namespace ncm + +namespace news { + +Result Initialize(NewsServiceType service_type) { return ::newsInitialize(service_type); } +void Exit(void) { ::newsExit(); } +Service * GetServiceSession(void) { return ::newsGetServiceSession(); } +Result CreateNewlyArrivedEventHolder(NewsNewlyArrivedEventHolder *out) { return ::newsCreateNewlyArrivedEventHolder(out); } +Result CreateNewsDataService(NewsDataService *out) { return ::newsCreateNewsDataService(out); } +Result CreateNewsDatabaseService(NewsDatabaseService *out) { return ::newsCreateNewsDatabaseService(out); } +Result CreateOverwriteEventHolder(NewsOverwriteEventHolder *out) { return ::newsCreateOverwriteEventHolder(out); } +Result PostLocalNews(const void *news, size_t size) { return ::newsPostLocalNews(news, size); } +Result SetPassphrase(u64 program_id, const char *passphrase) { return ::newsSetPassphrase(program_id, passphrase); } +Result GetSubscriptionStatus(const char *filter, u32 *status) { return ::newsGetSubscriptionStatus(filter, status); } +Result GetTopicList(u32 channel, u32 *out_count, NewsTopicName *out, u32 max_count) { return ::newsGetTopicList(channel, out_count, out, max_count); } +Result GetSavedataUsage(u64 *current, u64 *total) { return ::newsGetSavedataUsage(current, total); } +Result IsSystemUpdateRequired(bool *out) { return ::newsIsSystemUpdateRequired(out); } +Result GetDatabaseVersion(u32 *version) { return ::newsGetDatabaseVersion(version); } +Result RequestImmediateReception(const char *filter) { return ::newsRequestImmediateReception(filter); } +Result SetSubscriptionStatus(const char *filter, u32 status) { return ::newsSetSubscriptionStatus(filter, status); } +Result ClearStorage(void) { return ::newsClearStorage(); } +Result ClearSubscriptionStatusAll(void) { return ::newsClearSubscriptionStatusAll(); } +Result GetNewsDatabaseDump(void *buffer, u64 size, u64 *out) { return ::newsGetNewsDatabaseDump(buffer, size, out); } +void NewlyArrivedEventHolderClose(NewsNewlyArrivedEventHolder *srv) { ::newsNewlyArrivedEventHolderClose(srv); } +Result NewlyArrivedEventHolderGet(NewsNewlyArrivedEventHolder *srv, Event *out) { return ::newsNewlyArrivedEventHolderGet(srv, out); } +void DataClose(NewsDataService *srv) { ::newsDataClose(srv); } +Result DataOpen(NewsDataService *srv, const char *file_name) { return ::newsDataOpen(srv, file_name); } +Result DataOpenWithNewsRecordV1(NewsDataService *srv, NewsRecordV1 *record) { return ::newsDataOpenWithNewsRecordV1(srv, record); } +Result DataRead(NewsDataService *srv, u64 *bytes_read, u64 offset, void *out, size_t out_size) { return ::newsDataRead(srv, bytes_read, offset, out, out_size); } +Result DataGetSize(NewsDataService *srv, u64 *size) { return ::newsDataGetSize(srv, size); } +Result DataOpenWithNewsRecord(NewsDataService *srv, NewsRecord *record) { return ::newsDataOpenWithNewsRecord(srv, record); } +void DatabaseClose(NewsDatabaseService *srv) { ::newsDatabaseClose(srv); } +Result DatabaseGetListV1(NewsDatabaseService *srv, NewsRecordV1 *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset) { return ::newsDatabaseGetListV1(srv, out, max_count, where, order, count, offset); } +Result DatabaseCount(NewsDatabaseService *srv, const char *filter, u32 *count) { return ::newsDatabaseCount(srv, filter, count); } +Result DatabaseGetList(NewsDatabaseService *srv, NewsRecord *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset) { return ::newsDatabaseGetList(srv, out, max_count, where, order, count, offset); } +void OverwriteEventHolderClose(NewsOverwriteEventHolder *srv) { ::newsOverwriteEventHolderClose(srv); } +Result OverwriteEventHolderGet(NewsOverwriteEventHolder *srv, Event *out) { return ::newsOverwriteEventHolderGet(srv, out); } + +} // namespace news + +namespace nfc { + +Result Initialize(NfcServiceType service_type) { return ::nfcInitialize(service_type); } +void Exit(void) { ::nfcExit(); } +Result MfInitialize(void) { return ::nfcMfInitialize(); } +void MfExit(void) { ::nfcMfExit(); } +Service* GetServiceSession(void) { return ::nfcGetServiceSession(); } +Service* GetServiceSession_Interface(void) { return ::nfcGetServiceSession_Interface(); } +Service* MfGetServiceSession(void) { return ::nfcMfGetServiceSession(); } +Service* MfGetServiceSession_Interface(void) { return ::nfcMfGetServiceSession_Interface(); } +Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count) { return ::nfcListDevices(total_out, out, count); } +Result StartDetection(const NfcDeviceHandle *handle, NfcProtocol protocol) { return ::nfcStartDetection(handle, protocol); } +Result StopDetection(const NfcDeviceHandle *handle) { return ::nfcStopDetection(handle); } +Result MfListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count) { return ::nfcMfListDevices(total_out, out, count); } +Result MfStartDetection(const NfcDeviceHandle *handle) { return ::nfcMfStartDetection(handle); } +Result MfStopDetection(const NfcDeviceHandle *handle) { return ::nfcMfStopDetection(handle); } +Result GetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out) { return ::nfcGetTagInfo(handle, out); } +Result MfGetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out) { return ::nfcMfGetTagInfo(handle, out); } +Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcAttachActivateEvent(handle, out_event); } +Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcAttachDeactivateEvent(handle, out_event); } +Result MfAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcMfAttachActivateEvent(handle, out_event); } +Result MfAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcMfAttachDeactivateEvent(handle, out_event); } +Result GetState(NfcState *out) { return ::nfcGetState(out); } +Result GetDeviceState(const NfcDeviceHandle *handle, NfcDeviceState *out) { return ::nfcGetDeviceState(handle, out); } +Result GetNpadId(const NfcDeviceHandle *handle, u32 *out) { return ::nfcGetNpadId(handle, out); } +Result MfGetState(NfcState *out) { return ::nfcMfGetState(out); } +Result MfGetDeviceState(const NfcDeviceHandle *handle, NfcMifareDeviceState *out) { return ::nfcMfGetDeviceState(handle, out); } +Result MfGetNpadId(const NfcDeviceHandle *handle, u32 *out) { return ::nfcMfGetNpadId(handle, out); } +Result AttachAvailabilityChangeEvent(Event *out_event) { return ::nfcAttachAvailabilityChangeEvent(out_event); } +Result MfAttachAvailabilityChangeEvent(Event *out_event) { return ::nfcMfAttachAvailabilityChangeEvent(out_event); } +Result IsNfcEnabled(bool *out) { return ::nfcIsNfcEnabled(out); } +Result ReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count) { return ::nfcReadMifare(handle, out_block_data, read_block_parameter, count); } +Result WriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count) { return ::nfcWriteMifare(handle, write_block_parameter, count); } +Result MfReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count) { return ::nfcMfReadMifare(handle, out_block_data, read_block_parameter, count); } +Result MfWriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count) { return ::nfcMfWriteMifare(handle, write_block_parameter, count); } +Result SendCommandByPassThrough(const NfcDeviceHandle *handle, u64 timeout, const void* cmd_buf, size_t cmd_buf_size, void* reply_buf, size_t reply_buf_size, u64 *out_size) { return ::nfcSendCommandByPassThrough(handle, timeout, cmd_buf, cmd_buf_size, reply_buf, reply_buf_size, out_size); } +Result KeepPassThroughSession(const NfcDeviceHandle *handle) { return ::nfcKeepPassThroughSession(handle); } +Result ReleasePassThroughSession(const NfcDeviceHandle *handle) { return ::nfcReleasePassThroughSession(handle); } + +} // namespace nfc + +namespace nfp { + +Result LaStartNicknameAndOwnerSettings(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, const NfpRegisterInfo *in_reg_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle, bool *reg_info_flag, NfpRegisterInfo *out_reg_info) { return ::nfpLaStartNicknameAndOwnerSettings(in_param, in_tag_info, in_reg_info, out_tag_info, handle, reg_info_flag, out_reg_info); } +Result LaStartGameDataEraser(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle) { return ::nfpLaStartGameDataEraser(in_param, in_tag_info, out_tag_info, handle); } +Result LaStartRestorer(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle) { return ::nfpLaStartRestorer(in_param, in_tag_info, out_tag_info, handle); } +Result LaStartFormatter(const NfpLaAmiiboSettingsStartParam *in_param, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle) { return ::nfpLaStartFormatter(in_param, out_tag_info, handle); } +Result Initialize(NfpServiceType service_type) { return ::nfpInitialize(service_type); } +void Exit(void) { ::nfpExit(); } +Service* GetServiceSession(void) { return ::nfpGetServiceSession(); } +Service* GetServiceSession_Interface(void) { return ::nfpGetServiceSession_Interface(); } +Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count) { return ::nfpListDevices(total_out, out, count); } +Result StartDetection(const NfcDeviceHandle *handle) { return ::nfpStartDetection(handle); } +Result StopDetection(const NfcDeviceHandle *handle) { return ::nfpStopDetection(handle); } +Result Mount(const NfcDeviceHandle *handle, NfpDeviceType device_type, NfpMountTarget mount_target) { return ::nfpMount(handle, device_type, mount_target); } +Result Unmount(const NfcDeviceHandle *handle) { return ::nfpUnmount(handle); } +Result OpenApplicationArea(const NfcDeviceHandle *handle, u32 app_id) { return ::nfpOpenApplicationArea(handle, app_id); } +Result GetApplicationArea(const NfcDeviceHandle *handle, void* buf, size_t buf_size, u32 *out_size) { return ::nfpGetApplicationArea(handle, buf, buf_size, out_size); } +Result SetApplicationArea(const NfcDeviceHandle *handle, const void* buf, size_t buf_size) { return ::nfpSetApplicationArea(handle, buf, buf_size); } +Result Flush(const NfcDeviceHandle *handle) { return ::nfpFlush(handle); } +Result Restore(const NfcDeviceHandle *handle) { return ::nfpRestore(handle); } +Result CreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size) { return ::nfpCreateApplicationArea(handle, app_id, buf, buf_size); } +Result RecreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size) { return ::nfpRecreateApplicationArea(handle, app_id, buf, buf_size); } +Result GetApplicationAreaSize(const NfcDeviceHandle *handle, u32 *out_app_area_size) { return ::nfpGetApplicationAreaSize(handle, out_app_area_size); } +Result DeleteApplicationArea(const NfcDeviceHandle *handle) { return ::nfpDeleteApplicationArea(handle); } +Result ExistsApplicationArea(const NfcDeviceHandle *handle, bool *out) { return ::nfpExistsApplicationArea(handle, out); } +Result GetTagInfo(const NfcDeviceHandle *handle, NfpTagInfo *out) { return ::nfpGetTagInfo(handle, out); } +Result GetRegisterInfo(const NfcDeviceHandle *handle, NfpRegisterInfo *out) { return ::nfpGetRegisterInfo(handle, out); } +Result GetCommonInfo(const NfcDeviceHandle *handle, NfpCommonInfo *out) { return ::nfpGetCommonInfo(handle, out); } +Result GetModelInfo(const NfcDeviceHandle *handle, NfpModelInfo *out) { return ::nfpGetModelInfo(handle, out); } +Result GetAdminInfo(const NfcDeviceHandle *handle, NfpAdminInfo *out) { return ::nfpGetAdminInfo(handle, out); } +Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfpAttachActivateEvent(handle, out_event); } +Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfpAttachDeactivateEvent(handle, out_event); } +Result GetState(NfcState *out) { return ::nfpGetState(out); } +Result GetDeviceState(const NfcDeviceHandle *handle, NfpDeviceState *out) { return ::nfpGetDeviceState(handle, out); } +Result GetNpadId(const NfcDeviceHandle *handle, u32 *out) { return ::nfpGetNpadId(handle, out); } +Result AttachAvailabilityChangeEvent(Event *out_event) { return ::nfpAttachAvailabilityChangeEvent(out_event); } +Result Format(const NfcDeviceHandle *handle) { return ::nfpFormat(handle); } +Result GetRegisterInfoPrivate(const NfcDeviceHandle *handle, NfpRegisterInfoPrivate *out) { return ::nfpGetRegisterInfoPrivate(handle, out); } +Result SetRegisterInfoPrivate(const NfcDeviceHandle *handle, const NfpRegisterInfoPrivate *register_info_private) { return ::nfpSetRegisterInfoPrivate(handle, register_info_private); } +Result DeleteRegisterInfo(const NfcDeviceHandle *handle) { return ::nfpDeleteRegisterInfo(handle); } +Result GetAll(const NfcDeviceHandle *handle, NfpData *out) { return ::nfpGetAll(handle, out); } +Result SetAll(const NfcDeviceHandle *handle, const NfpData *nfp_data) { return ::nfpSetAll(handle, nfp_data); } +Result FlushDebug(const NfcDeviceHandle *handle) { return ::nfpFlushDebug(handle); } +Result BreakTag(const NfcDeviceHandle *handle, NfpBreakType break_type) { return ::nfpBreakTag(handle, break_type); } +Result ReadBackupData(const NfcDeviceHandle *handle, void* out_buf, size_t buf_size, u32 *out_size) { return ::nfpReadBackupData(handle, out_buf, buf_size, out_size); } +Result WriteBackupData(const NfcDeviceHandle *handle, const void* buf, size_t buf_size) { return ::nfpWriteBackupData(handle, buf, buf_size); } +Result WriteNtf(const NfcDeviceHandle *handle, u32 write_type, const void* buf, size_t buf_size) { return ::nfpWriteNtf(handle, write_type, buf, buf_size); } + +} // namespace nfp + +namespace nifm { + +Result LaHandleNetworkRequestResult(NifmRequest* r) { return ::nifmLaHandleNetworkRequestResult(r); } +Result Initialize(NifmServiceType service_type) { return ::nifmInitialize(service_type); } +void Exit(void) { ::nifmExit(); } +Service* GetServiceSession_StaticService(void) { return ::nifmGetServiceSession_StaticService(); } +Service* GetServiceSession_GeneralService(void) { return ::nifmGetServiceSession_GeneralService(); } +NifmClientId GetClientId(void) { return ::nifmGetClientId(); } +Result CreateRequest(NifmRequest* r, bool autoclear) { return ::nifmCreateRequest(r, autoclear); } +Result GetCurrentNetworkProfile(NifmNetworkProfileData *profile) { return ::nifmGetCurrentNetworkProfile(profile); } +Result EnumerateNetworkProfiles(NifmNetworkProfileType type, NifmNetworkProfileBasicInfo* buffer, s32 max_entries, s32* total_entries) { return ::nifmEnumerateNetworkProfiles(type, buffer, max_entries, total_entries); } +Result GetNetworkProfile(Uuid uuid, NifmNetworkProfileData *profile) { return ::nifmGetNetworkProfile(uuid, profile); } +Result SetNetworkProfile(const NifmNetworkProfileData *profile, Uuid *uuid) { return ::nifmSetNetworkProfile(profile, uuid); } +Result GetCurrentIpAddress(u32* out) { return ::nifmGetCurrentIpAddress(out); } +Result GetCurrentIpConfigInfo(u32 *current_addr, u32 *subnet_mask, u32 *gateway, u32 *primary_dns_server, u32 *secondary_dns_server) { return ::nifmGetCurrentIpConfigInfo(current_addr, subnet_mask, gateway, primary_dns_server, secondary_dns_server); } +Result SetWirelessCommunicationEnabled(bool enable) { return ::nifmSetWirelessCommunicationEnabled(enable); } +Result IsWirelessCommunicationEnabled(bool* out) { return ::nifmIsWirelessCommunicationEnabled(out); } +Result GetInternetConnectionStatus(NifmInternetConnectionType* connectionType, u32* wifiStrength, NifmInternetConnectionStatus* connectionStatus) { return ::nifmGetInternetConnectionStatus(connectionType, wifiStrength, connectionStatus); } +Result IsEthernetCommunicationEnabled(bool* out) { return ::nifmIsEthernetCommunicationEnabled(out); } +bool IsAnyInternetRequestAccepted(NifmClientId id) { return ::nifmIsAnyInternetRequestAccepted(id); } +Result IsAnyForegroundRequestAccepted(bool* out) { return ::nifmIsAnyForegroundRequestAccepted(out); } +Result PutToSleep(void) { return ::nifmPutToSleep(); } +Result WakeUp(void) { return ::nifmWakeUp(); } +Result SetWowlDelayedWakeTime(s32 val) { return ::nifmSetWowlDelayedWakeTime(val); } +void RequestClose(NifmRequest* r) { ::nifmRequestClose(r); } +Result GetRequestState(NifmRequest* r, NifmRequestState *out) { return ::nifmGetRequestState(r, out); } +Result GetResult(NifmRequest* r) { return ::nifmGetResult(r); } +Result RequestCancel(NifmRequest* r) { return ::nifmRequestCancel(r); } +Result RequestSubmit(NifmRequest* r) { return ::nifmRequestSubmit(r); } +Result RequestSubmitAndWait(NifmRequest* r) { return ::nifmRequestSubmitAndWait(r); } +Result RequestGetAppletInfo(NifmRequest* r, u32 theme_color, void* buffer, size_t size, u32 *applet_id, u32 *mode, u32 *out_size) { return ::nifmRequestGetAppletInfo(r, theme_color, buffer, size, applet_id, mode, out_size); } +Result RequestSetKeptInSleep(NifmRequest* r, bool flag) { return ::nifmRequestSetKeptInSleep(r, flag); } +Result RequestRegisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::nifmRequestRegisterSocketDescriptor(r, sockfd); } +Result RequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::nifmRequestUnregisterSocketDescriptor(r, sockfd); } +Result RequestSetNetworkProfileId(NifmRequest* r, Uuid uuid) { return ::nifmRequestSetNetworkProfileId(r, uuid); } + +} // namespace nifm + +namespace nim { + +Result Initialize(void) { return ::nimInitialize(); } +void Exit(void) { ::nimExit(); } +Service* GetServiceSession(void) { return ::nimGetServiceSession(); } +Result ListSystemUpdateTask(s32 *out_count, NimSystemUpdateTaskId *out_task_ids, size_t max_task_ids) { return ::nimListSystemUpdateTask(out_count, out_task_ids, max_task_ids); } +Result DestroySystemUpdateTask(const NimSystemUpdateTaskId *task_id) { return ::nimDestroySystemUpdateTask(task_id); } + +} // namespace nim + +namespace notif { + +Result Initialize(NotifServiceType service_type) { return ::notifInitialize(service_type); } +void Exit(void) { ::notifExit(); } +Service* GetServiceSession(void) { return ::notifGetServiceSession(); } +void AlarmSettingCreate(NotifAlarmSetting *alarm_setting) { ::notifAlarmSettingCreate(alarm_setting); } +void AlarmSettingSetIsMuted(NotifAlarmSetting *alarm_setting, bool flag) { ::notifAlarmSettingSetIsMuted(alarm_setting, flag); } +void AlarmSettingSetUid(NotifAlarmSetting *alarm_setting, AccountUid uid) { ::notifAlarmSettingSetUid(alarm_setting, uid); } +Result AlarmSettingIsEnabled(NotifAlarmSetting *alarm_setting, u32 day_of_week, bool *out) { return ::notifAlarmSettingIsEnabled(alarm_setting, day_of_week, out); } +Result AlarmSettingGet(NotifAlarmSetting *alarm_setting, u32 day_of_week, NotifAlarmTime *out) { return ::notifAlarmSettingGet(alarm_setting, day_of_week, out); } +Result AlarmSettingEnable(NotifAlarmSetting *alarm_setting, u32 day_of_week, s32 hour, s32 minute) { return ::notifAlarmSettingEnable(alarm_setting, day_of_week, hour, minute); } +Result AlarmSettingDisable(NotifAlarmSetting *alarm_setting, u32 day_of_week) { return ::notifAlarmSettingDisable(alarm_setting, day_of_week); } +Result RegisterAlarmSetting(u16 *alarm_setting_id, const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size) { return ::notifRegisterAlarmSetting(alarm_setting_id, alarm_setting, buffer, size); } +Result UpdateAlarmSetting(const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size) { return ::notifUpdateAlarmSetting(alarm_setting, buffer, size); } +Result ListAlarmSettings(NotifAlarmSetting *alarm_settings, s32 count, s32 *total_out) { return ::notifListAlarmSettings(alarm_settings, count, total_out); } +Result LoadApplicationParameter(u16 alarm_setting_id, void* buffer, size_t size, u32 *actual_size) { return ::notifLoadApplicationParameter(alarm_setting_id, buffer, size, actual_size); } +Result DeleteAlarmSetting(u16 alarm_setting_id) { return ::notifDeleteAlarmSetting(alarm_setting_id); } +Result GetNotificationSystemEvent(Event *out_event) { return ::notifGetNotificationSystemEvent(out_event); } +Result TryPopNotifiedApplicationParameter(void* buffer, u64 size, u64 *out_size) { return ::notifTryPopNotifiedApplicationParameter(buffer, size, out_size); } + +} // namespace notif + +namespace ns { + +Result Initialize(void) { return ::nsInitialize(); } +void Exit(void) { ::nsExit(); } +Service* GetServiceSession_GetterInterface(void) { return ::nsGetServiceSession_GetterInterface(); } +Service* GetServiceSession_ApplicationManagerInterface(void) { return ::nsGetServiceSession_ApplicationManagerInterface(); } +Result GetDynamicRightsInterface(Service* srv_out) { return ::nsGetDynamicRightsInterface(srv_out); } +Result GetReadOnlyApplicationControlDataInterface(Service* srv_out) { return ::nsGetReadOnlyApplicationControlDataInterface(srv_out); } +Result GetReadOnlyApplicationRecordInterface(Service* srv_out) { return ::nsGetReadOnlyApplicationRecordInterface(srv_out); } +Result GetECommerceInterface(Service* srv_out) { return ::nsGetECommerceInterface(srv_out); } +Result GetApplicationVersionInterface(Service* srv_out) { return ::nsGetApplicationVersionInterface(srv_out); } +Result GetFactoryResetInterface(Service* srv_out) { return ::nsGetFactoryResetInterface(srv_out); } +Result GetAccountProxyInterface(Service* srv_out) { return ::nsGetAccountProxyInterface(srv_out); } +Result GetApplicationManagerInterface(Service* srv_out) { return ::nsGetApplicationManagerInterface(srv_out); } +Result GetDownloadTaskInterface(Service* srv_out) { return ::nsGetDownloadTaskInterface(srv_out); } +Result GetContentManagementInterface(Service* srv_out) { return ::nsGetContentManagementInterface(srv_out); } +Result GetDocumentInterface(Service* srv_out) { return ::nsGetDocumentInterface(srv_out); } +Result GetApplicationControlData(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u64* actual_size) { return ::nsGetApplicationControlData(source, application_id, buffer, size, actual_size); } +Result GetApplicationControlData2(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u8 flag1, u8 acd_idx, u64* actual_size, u32* unk) { return ::nsGetApplicationControlData2(source, application_id, buffer, size, flag1, acd_idx, actual_size, unk); } +Result GetApplicationDesiredLanguage(NacpStruct *nacp, NacpLanguageEntry **langentry) { return ::nsGetApplicationDesiredLanguage(nacp, langentry); } +Result RequestLinkDevice(AsyncResult *a, AccountUid uid) { return ::nsRequestLinkDevice(a, uid); } +Result RequestSyncRights(AsyncResult *a) { return ::nsRequestSyncRights(a); } +Result RequestUnlinkDevice(AsyncResult *a, AccountUid uid) { return ::nsRequestUnlinkDevice(a, uid); } +Result ResetToFactorySettings(void) { return ::nsResetToFactorySettings(); } +Result ResetToFactorySettingsWithoutUserSaveData(void) { return ::nsResetToFactorySettingsWithoutUserSaveData(); } +Result ResetToFactorySettingsForRefurbishment(void) { return ::nsResetToFactorySettingsForRefurbishment(); } +Result ResetToFactorySettingsWithPlatformRegion(void) { return ::nsResetToFactorySettingsWithPlatformRegion(); } +Result ResetToFactorySettingsWithPlatformRegionAuthentication(void) { return ::nsResetToFactorySettingsWithPlatformRegionAuthentication(); } +Result ListApplicationRecord(NsApplicationRecord* records, s32 count, s32 entry_offset, s32* out_entrycount) { return ::nsListApplicationRecord(records, count, entry_offset, out_entrycount); } +Result GetApplicationRecordUpdateSystemEvent(Event* out_event) { return ::nsGetApplicationRecordUpdateSystemEvent(out_event); } +Result GetApplicationViewDeprecated(NsApplicationViewDeprecated *views, const u64 *application_ids, s32 count) { return ::nsGetApplicationViewDeprecated(views, application_ids, count); } +Result DeleteApplicationEntity(u64 application_id) { return ::nsDeleteApplicationEntity(application_id); } +Result DeleteApplicationCompletely(u64 application_id) { return ::nsDeleteApplicationCompletely(application_id); } +Result DeleteRedundantApplicationEntity(void) { return ::nsDeleteRedundantApplicationEntity(); } +Result IsApplicationEntityMovable(u64 application_id, NcmStorageId storage_id, bool *out) { return ::nsIsApplicationEntityMovable(application_id, storage_id, out); } +Result MoveApplicationEntity(u64 application_id, NcmStorageId storage_id) { return ::nsMoveApplicationEntity(application_id, storage_id); } +Result RequestApplicationUpdateInfo(AsyncValue *a, u64 application_id) { return ::nsRequestApplicationUpdateInfo(a, application_id); } +Result CancelApplicationDownload(u64 application_id) { return ::nsCancelApplicationDownload(application_id); } +Result ResumeApplicationDownload(u64 application_id) { return ::nsResumeApplicationDownload(application_id); } +Result CheckApplicationLaunchVersion(u64 application_id) { return ::nsCheckApplicationLaunchVersion(application_id); } +Result CalculateApplicationDownloadRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size) { return ::nsCalculateApplicationDownloadRequiredSize(application_id, storage_id, size); } +Result CleanupSdCard(void) { return ::nsCleanupSdCard(); } +Result GetSdCardMountStatusChangedEvent(Event* out_event) { return ::nsGetSdCardMountStatusChangedEvent(out_event); } +Result GetGameCardUpdateDetectionEvent(Event* out_event) { return ::nsGetGameCardUpdateDetectionEvent(out_event); } +Result DisableApplicationAutoDelete(u64 application_id) { return ::nsDisableApplicationAutoDelete(application_id); } +Result EnableApplicationAutoDelete(u64 application_id) { return ::nsEnableApplicationAutoDelete(application_id); } +Result SetApplicationTerminateResult(u64 application_id, Result res) { return ::nsSetApplicationTerminateResult(application_id, res); } +Result ClearApplicationTerminateResult(u64 application_id) { return ::nsClearApplicationTerminateResult(application_id); } +Result GetLastSdCardMountUnexpectedResult(void) { return ::nsGetLastSdCardMountUnexpectedResult(); } +Result GetRequestServerStopper(NsRequestServerStopper *r) { return ::nsGetRequestServerStopper(r); } +Result CancelApplicationApplyDelta(u64 application_id) { return ::nsCancelApplicationApplyDelta(application_id); } +Result ResumeApplicationApplyDelta(u64 application_id) { return ::nsResumeApplicationApplyDelta(application_id); } +Result CalculateApplicationApplyDeltaRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size) { return ::nsCalculateApplicationApplyDeltaRequiredSize(application_id, storage_id, size); } +Result ResumeAll(void) { return ::nsResumeAll(); } +Result GetStorageSize(NcmStorageId storage_id, s64 *total_space_size, s64 *free_space_size) { return ::nsGetStorageSize(storage_id, total_space_size, free_space_size); } +Result RequestUpdateApplication2(AsyncResult *a, u64 application_id) { return ::nsRequestUpdateApplication2(a, application_id); } +Result DeleteUserSaveDataAll(NsProgressMonitorForDeleteUserSaveDataAll *p, AccountUid uid) { return ::nsDeleteUserSaveDataAll(p, uid); } +Result DeleteUserSystemSaveData(AccountUid uid, u64 system_save_data_id) { return ::nsDeleteUserSystemSaveData(uid, system_save_data_id); } +Result DeleteSaveData(FsSaveDataSpaceId save_data_space_id, u64 save_data_id) { return ::nsDeleteSaveData(save_data_space_id, save_data_id); } +Result UnregisterNetworkServiceAccount(AccountUid uid) { return ::nsUnregisterNetworkServiceAccount(uid); } +Result UnregisterNetworkServiceAccountWithUserSaveDataDeletion(AccountUid uid) { return ::nsUnregisterNetworkServiceAccountWithUserSaveDataDeletion(uid); } +Result RequestDownloadApplicationControlData(AsyncResult *a, u64 application_id) { return ::nsRequestDownloadApplicationControlData(a, application_id); } +Result ListApplicationTitle(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size) { return ::nsListApplicationTitle(a, source, application_ids, count, buffer, size); } +Result ListApplicationTitle2(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size) { return ::nsListApplicationTitle2(a, source, application_ids, count, buffer, size); } +Result ListApplicationIcon(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size) { return ::nsListApplicationIcon(a, source, application_ids, count, buffer, size); } +Result RequestCheckGameCardRegistration(AsyncResult *a, u64 application_id) { return ::nsRequestCheckGameCardRegistration(a, application_id); } +Result RequestGameCardRegistrationGoldPoint(AsyncValue *a, AccountUid uid, u64 application_id) { return ::nsRequestGameCardRegistrationGoldPoint(a, uid, application_id); } +Result RequestRegisterGameCard(AsyncResult *a, AccountUid uid, u64 application_id, s32 inval) { return ::nsRequestRegisterGameCard(a, uid, application_id, inval); } +Result GetGameCardMountFailureEvent(Event* out_event) { return ::nsGetGameCardMountFailureEvent(out_event); } +Result IsGameCardInserted(bool *out) { return ::nsIsGameCardInserted(out); } +Result EnsureGameCardAccess(void) { return ::nsEnsureGameCardAccess(); } +Result GetLastGameCardMountFailureResult(void) { return ::nsGetLastGameCardMountFailureResult(); } +Result ListApplicationIdOnGameCard(u64 *application_ids, s32 count, s32 *total_out) { return ::nsListApplicationIdOnGameCard(application_ids, count, total_out); } +Result TouchApplication(u64 application_id) { return ::nsTouchApplication(application_id); } +Result IsApplicationUpdateRequested(u64 application_id, bool *flag, u32 *out) { return ::nsIsApplicationUpdateRequested(application_id, flag, out); } +Result WithdrawApplicationUpdateRequest(u64 application_id) { return ::nsWithdrawApplicationUpdateRequest(application_id); } +Result RequestVerifyAddOnContentsRights(NsProgressAsyncResult *a, u64 application_id) { return ::nsRequestVerifyAddOnContentsRights(a, application_id); } +Result RequestVerifyApplication(NsProgressAsyncResult *a, u64 application_id, u32 unk, void* buffer, size_t size) { return ::nsRequestVerifyApplication(a, application_id, unk, buffer, size); } +Result IsAnyApplicationEntityInstalled(u64 application_id, bool *out) { return ::nsIsAnyApplicationEntityInstalled(application_id, out); } +Result CleanupUnavailableAddOnContents(u64 application_id, AccountUid uid) { return ::nsCleanupUnavailableAddOnContents(application_id, uid); } +Result EstimateSizeToMove(u8 *storage_ids, s32 count, NcmStorageId storage_id, u32 flags, u64 application_id, s64 *out) { return ::nsEstimateSizeToMove(storage_ids, count, storage_id, flags, application_id, out); } +Result FormatSdCard(void) { return ::nsFormatSdCard(); } +Result NeedsSystemUpdateToFormatSdCard(bool *out) { return ::nsNeedsSystemUpdateToFormatSdCard(out); } +Result GetLastSdCardFormatUnexpectedResult(void) { return ::nsGetLastSdCardFormatUnexpectedResult(); } +Result GetApplicationView(NsApplicationView *views, const u64 *application_ids, s32 count) { return ::nsGetApplicationView(views, application_ids, count); } +Result GetApplicationViewDownloadErrorContext(u64 application_id, ErrorContext *context) { return ::nsGetApplicationViewDownloadErrorContext(application_id, context); } +Result GetApplicationViewWithPromotionInfo(NsApplicationViewWithPromotionInfo *out, const u64 *application_ids, s32 count) { return ::nsGetApplicationViewWithPromotionInfo(out, application_ids, count); } +Result RequestDownloadApplicationPrepurchasedRights(AsyncResult *a, u64 application_id) { return ::nsRequestDownloadApplicationPrepurchasedRights(a, application_id); } +Result GetSystemDeliveryInfo(NsSystemDeliveryInfo *info) { return ::nsGetSystemDeliveryInfo(info); } +Result SelectLatestSystemDeliveryInfo(const NsSystemDeliveryInfo *sys_list, s32 sys_count, const NsSystemDeliveryInfo *base_info, const NsApplicationDeliveryInfo *app_list, s32 app_count, s32 *index) { return ::nsSelectLatestSystemDeliveryInfo(sys_list, sys_count, base_info, app_list, app_count, index); } +Result VerifyDeliveryProtocolVersion(const NsSystemDeliveryInfo *info) { return ::nsVerifyDeliveryProtocolVersion(info); } +Result GetApplicationDeliveryInfo(NsApplicationDeliveryInfo *info, s32 count, u64 application_id, u32 attr, s32 *total_out) { return ::nsGetApplicationDeliveryInfo(info, count, application_id, attr, total_out); } +Result HasAllContentsToDeliver(const NsApplicationDeliveryInfo* info, s32 count, bool *out) { return ::nsHasAllContentsToDeliver(info, count, out); } +Result CompareApplicationDeliveryInfo(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, s32 *out) { return ::nsCompareApplicationDeliveryInfo(info0, count0, info1, count1, out); } +Result CanDeliverApplication(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, bool *out) { return ::nsCanDeliverApplication(info0, count0, info1, count1, out); } +Result ListContentMetaKeyToDeliverApplication(NcmContentMetaKey *meta, s32 meta_count, s32 meta_index, const NsApplicationDeliveryInfo *info, s32 info_count, s32 *total_out) { return ::nsListContentMetaKeyToDeliverApplication(meta, meta_count, meta_index, info, info_count, total_out); } +Result NeedsSystemUpdateToDeliverApplication(const NsApplicationDeliveryInfo *info, s32 count, const NsSystemDeliveryInfo *sys_info, bool *out) { return ::nsNeedsSystemUpdateToDeliverApplication(info, count, sys_info, out); } +Result EstimateRequiredSize(const NcmContentMetaKey *meta, s32 count, s64 *out) { return ::nsEstimateRequiredSize(meta, count, out); } +Result RequestReceiveApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count, NcmStorageId storage_id) { return ::nsRequestReceiveApplication(a, addr, port, application_id, meta, count, storage_id); } +Result CommitReceiveApplication(u64 application_id) { return ::nsCommitReceiveApplication(application_id); } +Result GetReceiveApplicationProgress(u64 application_id, NsReceiveApplicationProgress *out) { return ::nsGetReceiveApplicationProgress(application_id, out); } +Result RequestSendApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count) { return ::nsRequestSendApplication(a, addr, port, application_id, meta, count); } +Result GetSendApplicationProgress(u64 application_id, NsSendApplicationProgress *out) { return ::nsGetSendApplicationProgress(application_id, out); } +Result CompareSystemDeliveryInfo(const NsSystemDeliveryInfo *info0, const NsSystemDeliveryInfo *info1, s32 *out) { return ::nsCompareSystemDeliveryInfo(info0, info1, out); } +Result ListNotCommittedContentMeta(NcmContentMetaKey *meta, s32 count, u64 application_id, s32 unk, s32 *total_out) { return ::nsListNotCommittedContentMeta(meta, count, application_id, unk, total_out); } +Result GetApplicationDeliveryInfoHash(const NsApplicationDeliveryInfo *info, s32 count, u8 *out_hash) { return ::nsGetApplicationDeliveryInfoHash(info, count, out_hash); } +Result GetApplicationTerminateResult(u64 application_id, Result *res) { return ::nsGetApplicationTerminateResult(application_id, res); } +Result GetApplicationRightsOnClient(NsApplicationRightsOnClient *rights, s32 count, u64 application_id, AccountUid uid, u32 flags, s32 *total_out) { return ::nsGetApplicationRightsOnClient(rights, count, application_id, uid, flags, total_out); } +Result RequestNoDownloadRightsErrorResolution(AsyncValue *a, u64 application_id) { return ::nsRequestNoDownloadRightsErrorResolution(a, application_id); } +Result RequestResolveNoDownloadRightsError(AsyncValue *a, u64 application_id) { return ::nsRequestResolveNoDownloadRightsError(a, application_id); } +Result GetPromotionInfo(NsPromotionInfo *promotion, u64 application_id, AccountUid uid) { return ::nsGetPromotionInfo(promotion, application_id, uid); } +Result ClearTaskStatusList(void) { return ::nsClearTaskStatusList(); } +Result RequestDownloadTaskList(void) { return ::nsRequestDownloadTaskList(); } +Result RequestEnsureDownloadTask(AsyncResult *a) { return ::nsRequestEnsureDownloadTask(a); } +Result ListDownloadTaskStatus(NsDownloadTaskStatus* tasks, s32 count, s32 *total_out) { return ::nsListDownloadTaskStatus(tasks, count, total_out); } +Result RequestDownloadTaskListData(AsyncValue *a) { return ::nsRequestDownloadTaskListData(a); } +Result TryCommitCurrentApplicationDownloadTask(void) { return ::nsTryCommitCurrentApplicationDownloadTask(); } +Result EnableAutoCommit(void) { return ::nsEnableAutoCommit(); } +Result DisableAutoCommit(void) { return ::nsDisableAutoCommit(); } +Result TriggerDynamicCommitEvent(void) { return ::nsTriggerDynamicCommitEvent(); } +Result CalculateApplicationOccupiedSize(u64 application_id, NsApplicationOccupiedSize *out) { return ::nsCalculateApplicationOccupiedSize(application_id, out); } +Result CheckSdCardMountStatus(void) { return ::nsCheckSdCardMountStatus(); } +Result GetTotalSpaceSize(NcmStorageId storage_id, s64 *size) { return ::nsGetTotalSpaceSize(storage_id, size); } +Result GetFreeSpaceSize(NcmStorageId storage_id, s64 *size) { return ::nsGetFreeSpaceSize(storage_id, size); } +Result CountApplicationContentMeta(u64 application_id, s32 *out) { return ::nsCountApplicationContentMeta(application_id, out); } +Result ListApplicationContentMetaStatus(u64 application_id, s32 index, NsApplicationContentMetaStatus* list, s32 count, s32* out_entrycount) { return ::nsListApplicationContentMetaStatus(application_id, index, list, count, out_entrycount); } +Result IsAnyApplicationRunning(bool *out) { return ::nsIsAnyApplicationRunning(out); } +void RequestServerStopperClose(NsRequestServerStopper *r) { ::nsRequestServerStopperClose(r); } +Result ProgressMonitorForDeleteUserSaveDataAllClose(NsProgressMonitorForDeleteUserSaveDataAll *p) { return ::nsProgressMonitorForDeleteUserSaveDataAllClose(p); } +Result ProgressMonitorForDeleteUserSaveDataAllGetSystemEvent(NsProgressMonitorForDeleteUserSaveDataAll *p, Event* out_event) { return ::nsProgressMonitorForDeleteUserSaveDataAllGetSystemEvent(p, out_event); } +Result ProgressMonitorForDeleteUserSaveDataAllIsFinished(NsProgressMonitorForDeleteUserSaveDataAll *p, bool *out) { return ::nsProgressMonitorForDeleteUserSaveDataAllIsFinished(p, out); } +Result ProgressMonitorForDeleteUserSaveDataAllGetResult(NsProgressMonitorForDeleteUserSaveDataAll *p) { return ::nsProgressMonitorForDeleteUserSaveDataAllGetResult(p); } +Result ProgressMonitorForDeleteUserSaveDataAllGetProgress(NsProgressMonitorForDeleteUserSaveDataAll *p, NsProgressForDeleteUserSaveDataAll *progress) { return ::nsProgressMonitorForDeleteUserSaveDataAllGetProgress(p, progress); } +void ProgressAsyncResultClose(NsProgressAsyncResult *a) { ::nsProgressAsyncResultClose(a); } +Result ProgressAsyncResultWait(NsProgressAsyncResult *a, u64 timeout) { return ::nsProgressAsyncResultWait(a, timeout); } +Result ProgressAsyncResultGet(NsProgressAsyncResult *a) { return ::nsProgressAsyncResultGet(a); } +Result ProgressAsyncResultCancel(NsProgressAsyncResult *a) { return ::nsProgressAsyncResultCancel(a); } +Result ProgressAsyncResultGetProgress(NsProgressAsyncResult *a, void* buffer, size_t size) { return ::nsProgressAsyncResultGetProgress(a, buffer, size); } +Result ProgressAsyncResultGetDetailResult(NsProgressAsyncResult *a) { return ::nsProgressAsyncResultGetDetailResult(a); } +Result ProgressAsyncResultGetErrorContext(NsProgressAsyncResult *a, ErrorContext *context) { return ::nsProgressAsyncResultGetErrorContext(a, context); } + +} // namespace ns + +namespace nsdev { + +Result Initialize(void) { return ::nsdevInitialize(); } +void Exit(void) { ::nsdevExit(); } +Service* GetServiceSession(void) { return ::nsdevGetServiceSession(); } +Result LaunchProgram(u64* out_pid, const NsLaunchProperties* properties, u32 flags) { return ::nsdevLaunchProgram(out_pid, properties, flags); } +Result TerminateProcess(u64 pid) { return ::nsdevTerminateProcess(pid); } +Result TerminateProgram(u64 tid) { return ::nsdevTerminateProgram(tid); } +Result GetShellEvent(Event* out_event) { return ::nsdevGetShellEvent(out_event); } +Result GetShellEventInfo(NsShellEventInfo* out) { return ::nsdevGetShellEventInfo(out); } +Result TerminateApplication(void) { return ::nsdevTerminateApplication(); } +Result PrepareLaunchProgramFromHost(NsLaunchProperties* out, const char* path, size_t path_len) { return ::nsdevPrepareLaunchProgramFromHost(out, path, path_len); } +Result LaunchApplicationForDevelop(u64* out_pid, u64 application_id, u32 flags) { return ::nsdevLaunchApplicationForDevelop(out_pid, application_id, flags); } +Result LaunchApplicationFromHost(u64* out_pid, const char* path, size_t path_len, u32 flags) { return ::nsdevLaunchApplicationFromHost(out_pid, path, path_len, flags); } +Result LaunchApplicationWithStorageIdForDevelop(u64* out_pid, u64 application_id, u32 flags, u8 app_storage_id, u8 patch_storage_id) { return ::nsdevLaunchApplicationWithStorageIdForDevelop(out_pid, application_id, flags, app_storage_id, patch_storage_id); } +Result IsSystemMemoryResourceLimitBoosted(bool* out) { return ::nsdevIsSystemMemoryResourceLimitBoosted(out); } +Result GetRunningApplicationProcessIdForDevelop(u64* out_pid) { return ::nsdevGetRunningApplicationProcessIdForDevelop(out_pid); } +Result SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(bool can_be_active) { return ::nsdevSetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(can_be_active); } + +} // namespace nsdev + +namespace nssu { + +Result Initialize(void) { return ::nssuInitialize(); } +void Exit(void) { ::nssuExit(); } +Service* GetServiceSession(void) { return ::nssuGetServiceSession(); } +Result GetBackgroundNetworkUpdateState(NsBackgroundNetworkUpdateState *out) { return ::nssuGetBackgroundNetworkUpdateState(out); } +Result OpenSystemUpdateControl(NsSystemUpdateControl *c) { return ::nssuOpenSystemUpdateControl(c); } +Result NotifyExFatDriverRequired(void) { return ::nssuNotifyExFatDriverRequired(); } +Result ClearExFatDriverStatusForDebug(void) { return ::nssuClearExFatDriverStatusForDebug(); } +Result RequestBackgroundNetworkUpdate(void) { return ::nssuRequestBackgroundNetworkUpdate(); } +Result NotifyBackgroundNetworkUpdate(const NcmContentMetaKey *key) { return ::nssuNotifyBackgroundNetworkUpdate(key); } +Result NotifyExFatDriverDownloadedForDebug(void) { return ::nssuNotifyExFatDriverDownloadedForDebug(); } +Result GetSystemUpdateNotificationEventForContentDelivery(Event* out_event) { return ::nssuGetSystemUpdateNotificationEventForContentDelivery(out_event); } +Result NotifySystemUpdateForContentDelivery(void) { return ::nssuNotifySystemUpdateForContentDelivery(); } +Result PrepareShutdown(void) { return ::nssuPrepareShutdown(); } +Result DestroySystemUpdateTask(void) { return ::nssuDestroySystemUpdateTask(); } +Result RequestSendSystemUpdate(AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info) { return ::nssuRequestSendSystemUpdate(a, addr, port, info); } +Result GetSendSystemUpdateProgress(NsSystemUpdateProgress *out) { return ::nssuGetSendSystemUpdateProgress(out); } +void ControlClose(NsSystemUpdateControl *c) { ::nssuControlClose(c); } +Result ControlHasDownloaded(NsSystemUpdateControl *c, bool* out) { return ::nssuControlHasDownloaded(c, out); } +Result ControlRequestCheckLatestUpdate(NsSystemUpdateControl *c, AsyncValue *a) { return ::nssuControlRequestCheckLatestUpdate(c, a); } +Result ControlRequestDownloadLatestUpdate(NsSystemUpdateControl *c, AsyncResult *a) { return ::nssuControlRequestDownloadLatestUpdate(c, a); } +Result ControlGetDownloadProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out) { return ::nssuControlGetDownloadProgress(c, out); } +Result ControlApplyDownloadedUpdate(NsSystemUpdateControl *c) { return ::nssuControlApplyDownloadedUpdate(c); } +Result ControlRequestPrepareCardUpdate(NsSystemUpdateControl *c, AsyncResult *a) { return ::nssuControlRequestPrepareCardUpdate(c, a); } +Result ControlGetPrepareCardUpdateProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out) { return ::nssuControlGetPrepareCardUpdateProgress(c, out); } +Result ControlHasPreparedCardUpdate(NsSystemUpdateControl *c, bool* out) { return ::nssuControlHasPreparedCardUpdate(c, out); } +Result ControlApplyCardUpdate(NsSystemUpdateControl *c) { return ::nssuControlApplyCardUpdate(c); } +Result ControlGetDownloadedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize) { return ::nssuControlGetDownloadedEulaDataSize(c, path, filesize); } +Result ControlGetDownloadedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize) { return ::nssuControlGetDownloadedEulaData(c, path, buffer, size, filesize); } +Result ControlSetupCardUpdate(NsSystemUpdateControl *c, void* buffer, size_t size) { return ::nssuControlSetupCardUpdate(c, buffer, size); } +Result ControlGetPreparedCardUpdateEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize) { return ::nssuControlGetPreparedCardUpdateEulaDataSize(c, path, filesize); } +Result ControlGetPreparedCardUpdateEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize) { return ::nssuControlGetPreparedCardUpdateEulaData(c, path, buffer, size, filesize); } +Result ControlSetupCardUpdateViaSystemUpdater(NsSystemUpdateControl *c, void* buffer, size_t size) { return ::nssuControlSetupCardUpdateViaSystemUpdater(c, buffer, size); } +Result ControlHasReceived(NsSystemUpdateControl *c, bool* out) { return ::nssuControlHasReceived(c, out); } +Result ControlRequestReceiveSystemUpdate(NsSystemUpdateControl *c, AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info) { return ::nssuControlRequestReceiveSystemUpdate(c, a, addr, port, info); } +Result ControlGetReceiveProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out) { return ::nssuControlGetReceiveProgress(c, out); } +Result ControlApplyReceivedUpdate(NsSystemUpdateControl *c) { return ::nssuControlApplyReceivedUpdate(c); } +Result ControlGetReceivedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize) { return ::nssuControlGetReceivedEulaDataSize(c, path, filesize); } +Result ControlGetReceivedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize) { return ::nssuControlGetReceivedEulaData(c, path, buffer, size, filesize); } +Result ControlSetupToReceiveSystemUpdate(NsSystemUpdateControl *c) { return ::nssuControlSetupToReceiveSystemUpdate(c); } +Result ControlRequestCheckLatestUpdateIncludesRebootlessUpdate(NsSystemUpdateControl *c, AsyncValue *a) { return ::nssuControlRequestCheckLatestUpdateIncludesRebootlessUpdate(c, a); } + +} // namespace nssu + +namespace nsvm { + +Result Initialize(void) { return ::nsvmInitialize(); } +void Exit(void) { ::nsvmExit(); } +Service* GetServiceSession(void) { return ::nsvmGetServiceSession(); } +Result NeedsUpdateVulnerability(bool *out) { return ::nsvmNeedsUpdateVulnerability(out); } +Result GetSafeSystemVersion(NcmContentMetaKey *out) { return ::nsvmGetSafeSystemVersion(out); } + +} // namespace nsvm + +namespace nv { + +Result AddressSpaceCreate(NvAddressSpace* a, u32 page_size) { return ::nvAddressSpaceCreate(a, page_size); } +void AddressSpaceClose(NvAddressSpace* a) { ::nvAddressSpaceClose(a); } +Result AddressSpaceAlloc(NvAddressSpace* a, bool sparse, u64 size, iova_t* iova_out) { return ::nvAddressSpaceAlloc(a, sparse, size, iova_out); } +Result AddressSpaceAllocFixed(NvAddressSpace* a, bool sparse, u64 size, iova_t iova) { return ::nvAddressSpaceAllocFixed(a, sparse, size, iova); } +Result AddressSpaceFree(NvAddressSpace* a, iova_t iova, u64 size) { return ::nvAddressSpaceFree(a, iova, size); } +Result AddressSpaceMap(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t* iova_out) { return ::nvAddressSpaceMap(a, nvmap_handle, is_gpu_cacheable, kind, iova_out); } +Result AddressSpaceMapFixed(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t iova) { return ::nvAddressSpaceMapFixed(a, nvmap_handle, is_gpu_cacheable, kind, iova); } +Result AddressSpaceModify(NvAddressSpace* a, iova_t iova, u64 offset, u64 size, NvKind kind) { return ::nvAddressSpaceModify(a, iova, offset, size, kind); } +Result AddressSpaceUnmap(NvAddressSpace* a, iova_t iova) { return ::nvAddressSpaceUnmap(a, iova); } +Result ChannelCreate(NvChannel* c, const char* dev) { return ::nvChannelCreate(c, dev); } +void ChannelClose(NvChannel* c) { ::nvChannelClose(c); } +Result ChannelSetPriority(NvChannel* c, NvChannelPriority prio) { return ::nvChannelSetPriority(c, prio); } +Result ChannelSetTimeout(NvChannel* c, u32 timeout) { return ::nvChannelSetTimeout(c, timeout); } +Result FenceInit(void) { return ::nvFenceInit(); } +void FenceExit(void) { ::nvFenceExit(); } +u32 FenceGetFd(void) { return ::nvFenceGetFd(); } +Result FenceWait(NvFence* f, s32 timeout_us) { return ::nvFenceWait(f, timeout_us); } +void MultiFenceCreate(NvMultiFence* mf, const NvFence* fence) { ::nvMultiFenceCreate(mf, fence); } +Result MultiFenceWait(NvMultiFence* mf, s32 timeout_us) { return ::nvMultiFenceWait(mf, timeout_us); } +Result GpuInit(void) { return ::nvGpuInit(); } +void GpuExit(void) { ::nvGpuExit(); } +const nvioctl_gpu_characteristics* GpuGetCharacteristics(void) { return ::nvGpuGetCharacteristics(); } +u32 GpuGetZcullCtxSize(void) { return ::nvGpuGetZcullCtxSize(); } +const nvioctl_zcull_info* GpuGetZcullInfo(void) { return ::nvGpuGetZcullInfo(); } +const u32* GpuGetTpcMasks(u32 *num_masks_out) { return ::nvGpuGetTpcMasks(num_masks_out); } +Result GpuZbcGetActiveSlotMask(u32 *out_slot, u32 *out_mask) { return ::nvGpuZbcGetActiveSlotMask(out_slot, out_mask); } +Result GpuZbcAddColor(const u32 color_l2[4], const u32 color_ds[4], u32 format) { return ::nvGpuZbcAddColor(color_l2, color_ds, format); } +Result GpuZbcAddDepth(float depth) { return ::nvGpuZbcAddDepth(depth); } +Result GpuGetTimestamp(u64 *ts) { return ::nvGpuGetTimestamp(ts); } +Result GpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as, NvChannelPriority prio) { return ::nvGpuChannelCreate(c, as, prio); } +void GpuChannelClose(NvGpuChannel* c) { ::nvGpuChannelClose(c); } +Result GpuChannelZcullBind(NvGpuChannel* c, iova_t iova) { return ::nvGpuChannelZcullBind(c, iova); } +Result GpuChannelAppendEntry(NvGpuChannel* c, iova_t start, size_t num_cmds, u32 flags, u32 flush_threshold) { return ::nvGpuChannelAppendEntry(c, start, num_cmds, flags, flush_threshold); } +Result GpuChannelKickoff(NvGpuChannel* c) { return ::nvGpuChannelKickoff(c); } +Result GpuChannelGetErrorNotification(NvGpuChannel* c, NvNotification* notif) { return ::nvGpuChannelGetErrorNotification(c, notif); } +Result GpuChannelGetErrorInfo(NvGpuChannel* c, NvError* error) { return ::nvGpuChannelGetErrorInfo(c, error); } +u32 GpuChannelGetSyncpointId(NvGpuChannel* c) { return ::nvGpuChannelGetSyncpointId(c); } +void GpuChannelGetFence(NvGpuChannel* c, NvFence* fence_out) { ::nvGpuChannelGetFence(c, fence_out); } +void GpuChannelIncrFence(NvGpuChannel* c) { ::nvGpuChannelIncrFence(c); } +Result MapInit(void) { return ::nvMapInit(); } +u32 MapGetFd(void) { return ::nvMapGetFd(); } +void MapExit(void) { ::nvMapExit(); } +Result MapCreate(NvMap* m, void* cpu_addr, u32 size, u32 align, NvKind kind, bool is_cpu_cacheable) { return ::nvMapCreate(m, cpu_addr, size, align, kind, is_cpu_cacheable); } +Result MapLoadRemote(NvMap* m, u32 id) { return ::nvMapLoadRemote(m, id); } +void MapClose(NvMap* m) { ::nvMapClose(m); } +u32 MapGetHandle(NvMap* m) { return ::nvMapGetHandle(m); } +u32 MapGetId(NvMap* m) { return ::nvMapGetId(m); } +u32 MapGetSize(NvMap* m) { return ::nvMapGetSize(m); } +void* MapGetCpuAddr(NvMap* m) { return ::nvMapGetCpuAddr(m); } +bool MapIsRemote(NvMap* m) { return ::nvMapIsRemote(m); } +NvKind MapGetKind(NvMap* m) { return ::nvMapGetKind(m); } +Result Initialize(void) { return ::nvInitialize(); } +void Exit(void) { ::nvExit(); } +Service* GetServiceSession(void) { return ::nvGetServiceSession(); } +Result Open(u32 *fd, const char *devicepath) { return ::nvOpen(fd, devicepath); } +Result Ioctl(u32 fd, u32 request, void* argp) { return ::nvIoctl(fd, request, argp); } +Result Ioctl2(u32 fd, u32 request, void* argp, const void* inbuf, size_t inbuf_size) { return ::nvIoctl2(fd, request, argp, inbuf, inbuf_size); } +Result Ioctl3(u32 fd, u32 request, void* argp, void* outbuf, size_t outbuf_size) { return ::nvIoctl3(fd, request, argp, outbuf, outbuf_size); } +Result Close(u32 fd) { return ::nvClose(fd); } +Result QueryEvent(u32 fd, u32 event_id, Event *event_out) { return ::nvQueryEvent(fd, event_id, event_out); } +Result ConvertError(int rc) { return ::nvConvertError(rc); } + +} // namespace nv + +namespace nvioctl { + +Result NvhostCtrl_SyncptRead(u32 fd, u32 id, u32* out) { return ::nvioctlNvhostCtrl_SyncptRead(fd, id, out); } +Result NvhostCtrl_SyncptIncr(u32 fd, u32 id) { return ::nvioctlNvhostCtrl_SyncptIncr(fd, id); } +Result NvhostCtrl_SyncptWait(u32 fd, u32 id, u32 threshold, u32 timeout) { return ::nvioctlNvhostCtrl_SyncptWait(fd, id, threshold, timeout); } +Result NvhostCtrl_EventSignal(u32 fd, u32 event_id) { return ::nvioctlNvhostCtrl_EventSignal(fd, event_id); } +Result NvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out) { return ::nvioctlNvhostCtrl_EventWait(fd, syncpt_id, threshold, timeout, event_id, out); } +Result NvhostCtrl_EventWaitAsync(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id) { return ::nvioctlNvhostCtrl_EventWaitAsync(fd, syncpt_id, threshold, timeout, event_id); } +Result NvhostCtrl_EventRegister(u32 fd, u32 event_id) { return ::nvioctlNvhostCtrl_EventRegister(fd, event_id); } +Result NvhostCtrl_EventUnregister(u32 fd, u32 event_id) { return ::nvioctlNvhostCtrl_EventUnregister(fd, event_id); } +Result NvhostCtrlGpu_ZCullGetCtxSize(u32 fd, u32 *out) { return ::nvioctlNvhostCtrlGpu_ZCullGetCtxSize(fd, out); } +Result NvhostCtrlGpu_ZCullGetInfo(u32 fd, nvioctl_zcull_info *out) { return ::nvioctlNvhostCtrlGpu_ZCullGetInfo(fd, out); } +Result NvhostCtrlGpu_ZbcSetTable(u32 fd, const u32 color_ds[4], const u32 color_l2[4], u32 depth, u32 format, u32 type) { return ::nvioctlNvhostCtrlGpu_ZbcSetTable(fd, color_ds, color_l2, depth, format, type); } +Result NvhostCtrlGpu_ZbcQueryTable(u32 fd, u32 index, nvioctl_zbc_entry *out) { return ::nvioctlNvhostCtrlGpu_ZbcQueryTable(fd, index, out); } +Result NvhostCtrlGpu_GetCharacteristics(u32 fd, nvioctl_gpu_characteristics *out) { return ::nvioctlNvhostCtrlGpu_GetCharacteristics(fd, out); } +Result NvhostCtrlGpu_GetTpcMasks(u32 fd, void *buffer, size_t size) { return ::nvioctlNvhostCtrlGpu_GetTpcMasks(fd, buffer, size); } +Result NvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *out) { return ::nvioctlNvhostCtrlGpu_ZbcGetActiveSlotMask(fd, out); } +Result NvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out) { return ::nvioctlNvhostCtrlGpu_GetGpuTime(fd, out); } +Result NvhostAsGpu_BindChannel(u32 fd, u32 channel_fd) { return ::nvioctlNvhostAsGpu_BindChannel(fd, channel_fd); } +Result NvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align_or_offset, u64 *offset) { return ::nvioctlNvhostAsGpu_AllocSpace(fd, pages, page_size, flags, align_or_offset, offset); } +Result NvhostAsGpu_FreeSpace(u32 fd, u64 offset, u32 pages, u32 page_size) { return ::nvioctlNvhostAsGpu_FreeSpace(fd, offset, pages, page_size); } +Result NvhostAsGpu_MapBufferEx(u32 fd, u32 flags, u32 kind, u32 nvmap_handle, u32 page_size, u64 buffer_offset, u64 mapping_size, u64 input_offset, u64 *offset) { return ::nvioctlNvhostAsGpu_MapBufferEx(fd, flags, kind, nvmap_handle, page_size, buffer_offset, mapping_size, input_offset, offset); } +Result NvhostAsGpu_UnmapBuffer(u32 fd, u64 offset) { return ::nvioctlNvhostAsGpu_UnmapBuffer(fd, offset); } +Result NvhostAsGpu_GetVARegions(u32 fd, nvioctl_va_region regions[2]) { return ::nvioctlNvhostAsGpu_GetVARegions(fd, regions); } +Result NvhostAsGpu_InitializeEx(u32 fd, u32 flags, u32 big_page_size) { return ::nvioctlNvhostAsGpu_InitializeEx(fd, flags, big_page_size); } +Result Nvmap_Create(u32 fd, u32 size, u32 *nvmap_handle) { return ::nvioctlNvmap_Create(fd, size, nvmap_handle); } +Result Nvmap_FromId(u32 fd, u32 id, u32 *nvmap_handle) { return ::nvioctlNvmap_FromId(fd, id, nvmap_handle); } +Result Nvmap_Alloc(u32 fd, u32 nvmap_handle, u32 heapmask, u32 flags, u32 align, u8 kind, void* addr) { return ::nvioctlNvmap_Alloc(fd, nvmap_handle, heapmask, flags, align, kind, addr); } +Result Nvmap_Free(u32 fd, u32 nvmap_handle) { return ::nvioctlNvmap_Free(fd, nvmap_handle); } +Result Nvmap_Param(u32 fd, u32 nvmap_handle, NvMapParam param, u32 *result) { return ::nvioctlNvmap_Param(fd, nvmap_handle, param, result); } +Result Nvmap_GetId(u32 fd, u32 nvmap_handle, u32 *id) { return ::nvioctlNvmap_GetId(fd, nvmap_handle, id); } +Result Channel_SetNvmapFd(u32 fd, u32 nvmap_fd) { return ::nvioctlChannel_SetNvmapFd(fd, nvmap_fd); } +Result Channel_SubmitGpfifo(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout) { return ::nvioctlChannel_SubmitGpfifo(fd, entries, num_entries, flags, fence_inout); } +Result Channel_KickoffPb(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout) { return ::nvioctlChannel_KickoffPb(fd, entries, num_entries, flags, fence_inout); } +Result Channel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out) { return ::nvioctlChannel_AllocObjCtx(fd, class_num, flags, id_out); } +Result Channel_ZCullBind(u32 fd, u64 gpu_va, u32 mode) { return ::nvioctlChannel_ZCullBind(fd, gpu_va, mode); } +Result Channel_SetErrorNotifier(u32 fd, u32 enable) { return ::nvioctlChannel_SetErrorNotifier(fd, enable); } +Result Channel_GetErrorInfo(u32 fd, NvError* out) { return ::nvioctlChannel_GetErrorInfo(fd, out); } +Result Channel_GetErrorNotification(u32 fd, NvNotification* out) { return ::nvioctlChannel_GetErrorNotification(fd, out); } +Result Channel_SetPriority(u32 fd, u32 priority) { return ::nvioctlChannel_SetPriority(fd, priority); } +Result Channel_SetTimeout(u32 fd, u32 timeout) { return ::nvioctlChannel_SetTimeout(fd, timeout); } +Result Channel_AllocGpfifoEx2(u32 fd, u32 num_entries, u32 flags, u32 unk0, u32 unk1, u32 unk2, u32 unk3, nvioctl_fence *fence_out) { return ::nvioctlChannel_AllocGpfifoEx2(fd, num_entries, flags, unk0, unk1, unk2, unk3, fence_out); } +Result Channel_SetUserData(u32 fd, void* addr) { return ::nvioctlChannel_SetUserData(fd, addr); } +Result Channel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdbufs, const nvioctl_reloc *relocs, const nvioctl_reloc_shift *reloc_shifts, u32 num_relocs, const nvioctl_syncpt_incr *syncpt_incrs, u32 num_syncpt_incrs, nvioctl_fence *fences, u32 num_fences) { return ::nvioctlChannel_Submit(fd, cmdbufs, num_cmdbufs, relocs, reloc_shifts, num_relocs, syncpt_incrs, num_syncpt_incrs, fences, num_fences); } +Result Channel_GetSyncpt(u32 fd, u32 module_id, u32 *syncpt) { return ::nvioctlChannel_GetSyncpt(fd, module_id, syncpt); } +Result Channel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq) { return ::nvioctlChannel_GetModuleClockRate(fd, module_id, freq); } +Result Channel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq) { return ::nvioctlChannel_SetModuleClockRate(fd, module_id, freq); } +Result Channel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed) { return ::nvioctlChannel_MapCommandBuffer(fd, maps, num_maps, compressed); } +Result Channel_UnmapCommandBuffer(u32 fd, const nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed) { return ::nvioctlChannel_UnmapCommandBuffer(fd, maps, num_maps, compressed); } +Result Channel_SetSubmitTimeout(u32 fd, u32 timeout) { return ::nvioctlChannel_SetSubmitTimeout(fd, timeout); } + +} // namespace nvioctl + +namespace nwindow { + +bool IsValid(NWindow* nw) { return ::nwindowIsValid(nw); } +NWindow* GetDefault(void) { return ::nwindowGetDefault(); } +Result Create(NWindow* nw, Service* binder_session, s32 binder_id, bool producer_controlled_by_app) { return ::nwindowCreate(nw, binder_session, binder_id, producer_controlled_by_app); } +Result CreateFromLayer(NWindow* nw, const ViLayer* layer) { return ::nwindowCreateFromLayer(nw, layer); } +void Close(NWindow* nw) { ::nwindowClose(nw); } +Result GetDimensions(NWindow* nw, u32* out_width, u32* out_height) { return ::nwindowGetDimensions(nw, out_width, out_height); } +Result SetDimensions(NWindow* nw, u32 width, u32 height) { return ::nwindowSetDimensions(nw, width, height); } +Result SetCrop(NWindow* nw, s32 left, s32 top, s32 right, s32 bottom) { return ::nwindowSetCrop(nw, left, top, right, bottom); } +Result SetTransform(NWindow* nw, u32 transform) { return ::nwindowSetTransform(nw, transform); } +Result SetSwapInterval(NWindow* nw, u32 swap_interval) { return ::nwindowSetSwapInterval(nw, swap_interval); } +bool IsConsumerRunningBehind(NWindow* nw) { return ::nwindowIsConsumerRunningBehind(nw); } +Result ConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf) { return ::nwindowConfigureBuffer(nw, slot, buf); } +Result DequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence) { return ::nwindowDequeueBuffer(nw, out_slot, out_fence); } +Result CancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence) { return ::nwindowCancelBuffer(nw, slot, fence); } +Result QueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence) { return ::nwindowQueueBuffer(nw, slot, fence); } +Result ReleaseBuffers(NWindow* nw) { return ::nwindowReleaseBuffers(nw); } + +} // namespace nwindow + +namespace nxlink { + +int ConnectToHost(bool redirStdout, bool redirStderr) { return ::nxlinkConnectToHost(redirStdout, redirStderr); } +int Stdio(void) { return ::nxlinkStdio(); } +int StdioForDebug(void) { return ::nxlinkStdioForDebug(); } + +} // namespace nxlink + +namespace omm { + +Result Initialize(void) { return ::ommInitialize(); } +void Exit(void) { ::ommExit(); } +Service* GetServiceSession(void) { return ::ommGetServiceSession(); } +Result GetDefaultDisplayResolution(s32* width, s32* height) { return ::ommGetDefaultDisplayResolution(width, height); } +Result GetOperationMode(OmmOperationMode* s) { return ::ommGetOperationMode(s); } +Result SetOperationModePolicy(OmmOperationModePolicy value) { return ::ommSetOperationModePolicy(value); } + +} // namespace omm + +namespace ovlnrcv { + +Result Initialize(void) { return ::ovlnrcvInitialize(); } +void Exit(void) { ::ovlnrcvExit(); } +Service* GetServiceSession(void) { return ::ovlnrcvGetServiceSession(); } +Result OpenReceiver(OvlnReceiver *r) { return ::ovlnrcvOpenReceiver(r); } +void CloseReceiver(OvlnReceiver *r) { ::ovlnrcvCloseReceiver(r); } +Result AddSource(OvlnReceiver *r, const OvlnSourceName *name) { return ::ovlnrcvAddSource(r, name); } +Result RemoveSource(OvlnReceiver *r, const OvlnSourceName *name) { return ::ovlnrcvRemoveSource(r, name); } +Result GetReceiveEventHandle(OvlnReceiver *r, Event* out_event) { return ::ovlnrcvGetReceiveEventHandle(r, out_event); } +Result Receive(OvlnReceiver *r, OvlnRawMessage *message) { return ::ovlnrcvReceive(r, message); } +Result ReceiveWithTick(OvlnReceiver *r, OvlnRawMessage *message, s64 *tick) { return ::ovlnrcvReceiveWithTick(r, message, tick); } + +} // namespace ovlnrcv + +namespace ovlnsnd { + +Result Initialize(void) { return ::ovlnsndInitialize(); } +void Exit(void) { ::ovlnsndExit(); } +Service* GetServiceSession(void) { return ::ovlnsndGetServiceSession(); } +Result OpenSender(OvlnSender *s, const OvlnSourceName *name, OvlnQueueAttribute attribute) { return ::ovlnsndOpenSender(s, name, attribute); } +void CloseSender(OvlnSender *s) { ::ovlnsndCloseSender(s); } +Result Send(OvlnSender *s, OvlnSendOption option, const OvlnRawMessage *message) { return ::ovlnsndSend(s, option, message); } +Result GetUnreceivedMessageCount(OvlnSender *s, u32 *count) { return ::ovlnsndGetUnreceivedMessageCount(s, count); } + +} // namespace ovlnsnd + +namespace pad { + +void ConfigureInput(u32 max_players, u32 style_set) { ::padConfigureInput(max_players, style_set); } +void InitializeWithMask(PadState* pad, u64 mask) { ::padInitializeWithMask(pad, mask); } +void InitializeAny(PadState* pad) { ::padInitializeAny(pad); } +void InitializeDefault(PadState* pad) { ::padInitializeDefault(pad); } +void Update(PadState* pad) { ::padUpdate(pad); } +bool IsHandheld(const PadState* pad) { return ::padIsHandheld(pad); } +bool IsNpadActive(const PadState* pad, HidNpadIdType id) { return ::padIsNpadActive(pad, id); } +u32 GetStyleSet(const PadState* pad) { return ::padGetStyleSet(pad); } +u32 GetAttributes(const PadState* pad) { return ::padGetAttributes(pad); } +bool IsConnected(const PadState* pad) { return ::padIsConnected(pad); } +u64 GetButtons(const PadState* pad) { return ::padGetButtons(pad); } +u64 GetButtonsDown(const PadState* pad) { return ::padGetButtonsDown(pad); } +u64 GetButtonsUp(const PadState* pad) { return ::padGetButtonsUp(pad); } +HidAnalogStickState GetStickPos(const PadState* pad, unsigned i) { return ::padGetStickPos(pad, i); } +u32 GetGcTriggerPos(const PadState* pad, unsigned i) { return ::padGetGcTriggerPos(pad, i); } +void RepeaterInitialize(PadRepeater* r, u16 delay, u16 repeat) { ::padRepeaterInitialize(r, delay, repeat); } +void RepeaterUpdate(PadRepeater* r, u64 button_mask) { ::padRepeaterUpdate(r, button_mask); } +u64 RepeaterGetButtons(const PadRepeater* r) { return ::padRepeaterGetButtons(r); } + +} // namespace pad + +namespace parcel { + +void Create(Parcel *ctx) { ::parcelCreate(ctx); } +Result Transact(Binder *session, u32 code, Parcel *in_parcel, Parcel *reply_parcel) { return ::parcelTransact(session, code, in_parcel, reply_parcel); } +void* WriteData(Parcel *ctx, const void* data, size_t data_size) { return ::parcelWriteData(ctx, data, data_size); } +void* ReadData(Parcel *ctx, void* data, size_t data_size) { return ::parcelReadData(ctx, data, data_size); } +void WriteInt32(Parcel *ctx, s32 val) { ::parcelWriteInt32(ctx, val); } +void WriteUInt32(Parcel *ctx, u32 val) { ::parcelWriteUInt32(ctx, val); } +void WriteString16(Parcel *ctx, const char *str) { ::parcelWriteString16(ctx, str); } +s32 ReadInt32(Parcel *ctx) { return ::parcelReadInt32(ctx); } +u32 ReadUInt32(Parcel *ctx) { return ::parcelReadUInt32(ctx); } +void WriteInterfaceToken(Parcel *ctx, const char *str) { ::parcelWriteInterfaceToken(ctx, str); } +void* ReadFlattenedObject(Parcel *ctx, size_t *size) { return ::parcelReadFlattenedObject(ctx, size); } +void* WriteFlattenedObject(Parcel *ctx, const void* data, size_t size) { return ::parcelWriteFlattenedObject(ctx, data, size); } + +} // namespace parcel + +namespace pctl { + +Result Initialize(void) { return ::pctlInitialize(); } +void Exit(void) { ::pctlExit(); } +Service* GetServiceSession(void) { return ::pctlGetServiceSession(); } +Service* GetServiceSession_Service(void) { return ::pctlGetServiceSession_Service(); } +Result IsRestrictionTemporaryUnlocked(bool *flag) { return ::pctlIsRestrictionTemporaryUnlocked(flag); } +Result ConfirmStereoVisionPermission(void) { return ::pctlConfirmStereoVisionPermission(); } +Result IsRestrictionEnabled(bool *flag) { return ::pctlIsRestrictionEnabled(flag); } +Result GetSafetyLevel(u32 *safety_level) { return ::pctlGetSafetyLevel(safety_level); } +Result GetCurrentSettings(PctlRestrictionSettings *settings) { return ::pctlGetCurrentSettings(settings); } +Result GetFreeCommunicationApplicationListCount(u32 *count) { return ::pctlGetFreeCommunicationApplicationListCount(count); } +Result ResetConfirmedStereoVisionPermission(void) { return ::pctlResetConfirmedStereoVisionPermission(); } +Result IsStereoVisionPermitted(bool *flag) { return ::pctlIsStereoVisionPermitted(flag); } +Result IsPairingActive(bool *flag) { return ::pctlIsPairingActive(flag); } +Result GetSynchronizationEvent(Event* out_event) { return ::pctlGetSynchronizationEvent(out_event); } +Result GetPlayTimerEventToRequestSuspension(Event* out_event) { return ::pctlGetPlayTimerEventToRequestSuspension(out_event); } +Result IsPlayTimerAlarmDisabled(bool *flag) { return ::pctlIsPlayTimerAlarmDisabled(flag); } +Result GetUnlinkedEvent(Event* out_event) { return ::pctlGetUnlinkedEvent(out_event); } + +} // namespace pctl + +namespace pctlauth { + +Result Show(bool flag) { return ::pctlauthShow(flag); } +Result ShowEx(u8 arg0, u8 arg1, u8 arg2) { return ::pctlauthShowEx(arg0, arg1, arg2); } +Result ShowForConfiguration(void) { return ::pctlauthShowForConfiguration(); } +Result RegisterPasscode(void) { return ::pctlauthRegisterPasscode(); } +Result ChangePasscode(void) { return ::pctlauthChangePasscode(); } + +} // namespace pctlauth + +namespace pcv { + +Result Initialize(void) { return ::pcvInitialize(); } +void Exit(void) { ::pcvExit(); } +Service* GetServiceSession(void) { return ::pcvGetServiceSession(); } +Result GetModuleId(PcvModuleId *module_id, PcvModule module) { return ::pcvGetModuleId(module_id, module); } +Result GetClockRate(PcvModule module, u32 *out_hz) { return ::pcvGetClockRate(module, out_hz); } +Result SetClockRate(PcvModule module, u32 hz) { return ::pcvSetClockRate(module, hz); } +Result SetVoltageEnabled(u32 power_domain, bool state) { return ::pcvSetVoltageEnabled(power_domain, state); } +Result GetVoltageEnabled(bool *isEnabled, u32 power_domain) { return ::pcvGetVoltageEnabled(isEnabled, power_domain); } +Result GetPossibleClockRates(PcvModule module, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count) { return ::pcvGetPossibleClockRates(module, rates, max_count, out_type, out_count); } + +} // namespace pcv + +namespace pdm { + +u64 PlayTimestampToPosix(u32 timestamp) { return ::pdmPlayTimestampToPosix(timestamp); } + +} // namespace pdm + +namespace pdmqry { + +Result Initialize(void) { return ::pdmqryInitialize(); } +void Exit(void) { ::pdmqryExit(); } +Service* GetServiceSession(void) { return ::pdmqryGetServiceSession(); } +Result QueryAppletEvent(s32 entry_index, bool flag, PdmAppletEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryAppletEvent(entry_index, flag, events, count, total_out); } +Result QueryPlayStatisticsByApplicationId(u64 application_id, bool flag, PdmPlayStatistics *stats) { return ::pdmqryQueryPlayStatisticsByApplicationId(application_id, flag, stats); } +Result QueryPlayStatisticsByApplicationIdAndUserAccountId(u64 application_id, AccountUid uid, bool flag, PdmPlayStatistics *stats) { return ::pdmqryQueryPlayStatisticsByApplicationIdAndUserAccountId(application_id, uid, flag, stats); } +Result QueryLastPlayTime(bool flag, PdmLastPlayTime *playtimes, const u64 *application_ids, s32 count, s32 *total_out) { return ::pdmqryQueryLastPlayTime(flag, playtimes, application_ids, count, total_out); } +Result QueryPlayEvent(s32 entry_index, PdmPlayEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryPlayEvent(entry_index, events, count, total_out); } +Result GetAvailablePlayEventRange(s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index) { return ::pdmqryGetAvailablePlayEventRange(total_entries, start_entry_index, end_entry_index); } +Result QueryAccountEvent(s32 entry_index, PdmAccountEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryAccountEvent(entry_index, events, count, total_out); } +Result QueryAccountPlayEvent(s32 entry_index, AccountUid uid, PdmAccountPlayEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryAccountPlayEvent(entry_index, uid, events, count, total_out); } +Result GetAvailableAccountPlayEventRange(AccountUid uid, s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index) { return ::pdmqryGetAvailableAccountPlayEventRange(uid, total_entries, start_entry_index, end_entry_index); } +Result QueryRecentlyPlayedApplication(AccountUid uid, bool flag, u64 *application_ids, s32 count, s32 *total_out) { return ::pdmqryQueryRecentlyPlayedApplication(uid, flag, application_ids, count, total_out); } +Result GetRecentlyPlayedApplicationUpdateEvent(Event* out_event) { return ::pdmqryGetRecentlyPlayedApplicationUpdateEvent(out_event); } + +} // namespace pdmqry + +namespace pgl { + +Result Initialize(void) { return ::pglInitialize(); } +void Exit(void) { ::pglExit(); } +Service* GetServiceSessionCmif(void) { return ::pglGetServiceSessionCmif(); } +TipcService* GetServiceSessionTipc(void) { return ::pglGetServiceSessionTipc(); } +Result LaunchProgram(u64 *out_pid, const NcmProgramLocation *loc, u32 pm_launch_flags, u8 pgl_launch_flags) { return ::pglLaunchProgram(out_pid, loc, pm_launch_flags, pgl_launch_flags); } +Result TerminateProcess(u64 pid) { return ::pglTerminateProcess(pid); } +Result LaunchProgramFromHost(u64 *out_pid, const char *content_path, u32 pm_launch_flags) { return ::pglLaunchProgramFromHost(out_pid, content_path, pm_launch_flags); } +Result GetHostProgramLaunchProperty(PglProgramLaunchProperty *out, const char *content_path) { return ::pglGetHostProgramLaunchProperty(out, content_path); } +Result GetRunningApplicationProcessId(u64 *out_pid) { return ::pglGetRunningApplicationProcessId(out_pid); } +Result BoostSystemMemoryResourceLimit(u64 size) { return ::pglBoostSystemMemoryResourceLimit(size); } +Result IsRunningProcess(bool *out, u64 pid) { return ::pglIsRunningProcess(out, pid); } +Result EnableApplicationCrashReport(bool en) { return ::pglEnableApplicationCrashReport(en); } +Result IsApplicationCrashReportEnabled(bool *out) { return ::pglIsApplicationCrashReportEnabled(out); } +Result EnableApplicationAllThreadDumpOnCrash(bool en) { return ::pglEnableApplicationAllThreadDumpOnCrash(en); } +Result GetProcessId(u64 *out_pid, u64 program_id) { return ::pglGetProcessId(out_pid, program_id); } +Result TriggerSnapShotDumper(PglSnapShotDumpType dump_type, const char *arg) { return ::pglTriggerSnapShotDumper(dump_type, arg); } +Result CreateShellEvent(PglEventObserver *out) { return ::pglCreateShellEvent(out); } +Result EnableApplicationCrashReport2(u64 pid, bool en) { return ::pglEnableApplicationCrashReport2(pid, en); } +Result EventObserverGetShellEvent(PglEventObserver *observer, Event *out) { return ::pglEventObserverGetShellEvent(observer, out); } +Result EventObserverGetShellEventInfo(PglEventObserver *observer, PmProcessEventInfo *out) { return ::pglEventObserverGetShellEventInfo(observer, out); } +void EventObserverClose(PglEventObserver *observer) { ::pglEventObserverClose(observer); } + +} // namespace pgl + +namespace pl { + +Result Initialize(PlServiceType service_type) { return ::plInitialize(service_type); } +void Exit(void) { ::plExit(); } +Service* GetServiceSession(void) { return ::plGetServiceSession(); } +void* GetSharedmemAddr(void) { return ::plGetSharedmemAddr(); } +Result GetSharedFontByType(PlFontData* font, PlSharedFontType SharedFontType) { return ::plGetSharedFontByType(font, SharedFontType); } +Result GetSharedFont(u64 LanguageCode, PlFontData* fonts, s32 max_fonts, s32* total_fonts) { return ::plGetSharedFont(LanguageCode, fonts, max_fonts, total_fonts); } + +} // namespace pl + +namespace pmbm { + +Result Initialize(void) { return ::pmbmInitialize(); } +void Exit(void) { ::pmbmExit(); } +Service* GetServiceSession(void) { return ::pmbmGetServiceSession(); } +Result GetBootMode(PmBootMode *out) { return ::pmbmGetBootMode(out); } +Result SetMaintenanceBoot(void) { return ::pmbmSetMaintenanceBoot(); } + +} // namespace pmbm + +namespace pmdmnt { + +Result Initialize(void) { return ::pmdmntInitialize(); } +void Exit(void) { ::pmdmntExit(); } +Service* GetServiceSession(void) { return ::pmdmntGetServiceSession(); } +Result GetJitDebugProcessIdList(u32* out_count, u64* out_pids, size_t max_pids) { return ::pmdmntGetJitDebugProcessIdList(out_count, out_pids, max_pids); } +Result StartProcess(u64 pid) { return ::pmdmntStartProcess(pid); } +Result GetProcessId(u64* pid_out, u64 program_id) { return ::pmdmntGetProcessId(pid_out, program_id); } +Result HookToCreateProcess(Event* out, u64 program_id) { return ::pmdmntHookToCreateProcess(out, program_id); } +Result GetApplicationProcessId(u64* pid_out) { return ::pmdmntGetApplicationProcessId(pid_out); } +Result HookToCreateApplicationProcess(Event* out) { return ::pmdmntHookToCreateApplicationProcess(out); } +Result ClearHook(u32 which) { return ::pmdmntClearHook(which); } +Result GetProgramId(u64* program_id_out, u64 pid) { return ::pmdmntGetProgramId(program_id_out, pid); } + +} // namespace pmdmnt + +namespace pminfo { + +Result Initialize(void) { return ::pminfoInitialize(); } +void Exit(void) { ::pminfoExit(); } +Service* GetServiceSession(void) { return ::pminfoGetServiceSession(); } +Result GetProgramId(u64* program_id_out, u64 pid) { return ::pminfoGetProgramId(program_id_out, pid); } +Result GetAppletCurrentResourceLimitValues(PmResourceLimitValues* out) { return ::pminfoGetAppletCurrentResourceLimitValues(out); } +Result GetAppletPeakResourceLimitValues(PmResourceLimitValues* out) { return ::pminfoGetAppletPeakResourceLimitValues(out); } + +} // namespace pminfo + +namespace pmshell { + +Result Initialize(void) { return ::pmshellInitialize(); } +void Exit(void) { ::pmshellExit(); } +Service* GetServiceSession(void) { return ::pmshellGetServiceSession(); } +Result LaunchProgram(u32 launch_flags, const NcmProgramLocation *location, u64 *pid) { return ::pmshellLaunchProgram(launch_flags, location, pid); } +Result TerminateProcess(u64 processID) { return ::pmshellTerminateProcess(processID); } +Result TerminateProgram(u64 program_id) { return ::pmshellTerminateProgram(program_id); } +Result GetProcessEventHandle(Event* out) { return ::pmshellGetProcessEventHandle(out); } +Result GetProcessEventInfo(PmProcessEventInfo* out) { return ::pmshellGetProcessEventInfo(out); } +Result CleanupProcess(u64 pid) { return ::pmshellCleanupProcess(pid); } +Result ClearJitDebugOccured(u64 pid) { return ::pmshellClearJitDebugOccured(pid); } +Result NotifyBootFinished(void) { return ::pmshellNotifyBootFinished(); } +Result GetApplicationProcessIdForShell(u64* pid_out) { return ::pmshellGetApplicationProcessIdForShell(pid_out); } +Result BoostSystemMemoryResourceLimit(u64 boost_size) { return ::pmshellBoostSystemMemoryResourceLimit(boost_size); } +Result BoostApplicationThreadResourceLimit(void) { return ::pmshellBoostApplicationThreadResourceLimit(); } +Result BoostSystemThreadResourceLimit(void) { return ::pmshellBoostSystemThreadResourceLimit(); } +Result GetProcessId(u64* pid_out, u64 program_id) { return ::pmshellGetProcessId(pid_out, program_id); } + +} // namespace pmshell + +namespace psc { + +Result PmModuleGetRequest(PscPmModule *module, PscPmState *out_state, u32 *out_flags) { return ::pscPmModuleGetRequest(module, out_state, out_flags); } +Result PmModuleAcknowledge(PscPmModule *module, PscPmState state) { return ::pscPmModuleAcknowledge(module, state); } +Result PmModuleFinalize(PscPmModule *module) { return ::pscPmModuleFinalize(module); } +void PmModuleClose(PscPmModule *module) { ::pscPmModuleClose(module); } + +} // namespace psc + +namespace pscm { + +Result Initialize(void) { return ::pscmInitialize(); } +void Exit(void) { ::pscmExit(); } +Service* GetServiceSession(void) { return ::pscmGetServiceSession(); } +Result GetPmModule(PscPmModule *out, PscPmModuleId module_id, const u32 *dependencies, size_t dependency_count, bool autoclear) { return ::pscmGetPmModule(out, module_id, dependencies, dependency_count, autoclear); } + +} // namespace pscm + +namespace psel { + +Result UiCreate(PselUiSettings *ui, PselUiMode mode) { return ::pselUiCreate(ui, mode); } +void UiAddUser(PselUiSettings *ui, AccountUid user_id) { ::pselUiAddUser(ui, user_id); } +void UiSetAllowUserCreation(PselUiSettings *ui, bool flag) { ::pselUiSetAllowUserCreation(ui, flag); } +void UiSetNetworkServiceRequired(PselUiSettings *ui, bool flag) { ::pselUiSetNetworkServiceRequired(ui, flag); } +void UiSetSkipButtonEnabled(PselUiSettings *ui, bool flag) { ::pselUiSetSkipButtonEnabled(ui, flag); } +Result UiShow(PselUiSettings *ui, AccountUid *out_user) { return ::pselUiShow(ui, out_user); } +Result ShowUserSelectorForSystem(AccountUid *out_user, const PselUserSelectionSettings *settings, const PselUserSelectionSettingsForSystemService *settings_system) { return ::pselShowUserSelectorForSystem(out_user, settings, settings_system); } +Result ShowUserSelectorForLauncher(AccountUid *out_user, const PselUserSelectionSettings *settings, u64 application_id) { return ::pselShowUserSelectorForLauncher(out_user, settings, application_id); } +Result ShowUserSelector(AccountUid *out_user, const PselUserSelectionSettings *settings) { return ::pselShowUserSelector(out_user, settings); } +Result ShowUserCreator(void) { return ::pselShowUserCreator(); } +Result ShowUserIconEditor(AccountUid user) { return ::pselShowUserIconEditor(user); } +Result ShowUserNicknameEditor(AccountUid user) { return ::pselShowUserNicknameEditor(user); } +Result ShowUserCreatorForStarter(void) { return ::pselShowUserCreatorForStarter(); } +Result ShowNintendoAccountNnidLinker(AccountUid user) { return ::pselShowNintendoAccountNnidLinker(user); } +Result ShowUserQualificationPromoter(AccountUid user) { return ::pselShowUserQualificationPromoter(user); } + +} // namespace psel + +namespace psm { + +Result Initialize(void) { return ::psmInitialize(); } +void Exit(void) { ::psmExit(); } +Service* GetServiceSession(void) { return ::psmGetServiceSession(); } +Result GetBatteryChargePercentage(u32 *out) { return ::psmGetBatteryChargePercentage(out); } +Result GetChargerType(PsmChargerType *out) { return ::psmGetChargerType(out); } +Result EnableBatteryCharging(void) { return ::psmEnableBatteryCharging(); } +Result DisableBatteryCharging(void) { return ::psmDisableBatteryCharging(); } +Result IsBatteryChargingEnabled(bool *out) { return ::psmIsBatteryChargingEnabled(out); } +Result AcquireControllerPowerSupply(void) { return ::psmAcquireControllerPowerSupply(); } +Result ReleaseControllerPowerSupply(void) { return ::psmReleaseControllerPowerSupply(); } +Result EnableEnoughPowerChargeEmulation(void) { return ::psmEnableEnoughPowerChargeEmulation(); } +Result DisableEnoughPowerChargeEmulation(void) { return ::psmDisableEnoughPowerChargeEmulation(); } +Result EnableFastBatteryCharging(void) { return ::psmEnableFastBatteryCharging(); } +Result DisableFastBatteryCharging(void) { return ::psmDisableFastBatteryCharging(); } +Result GetBatteryVoltageState(PsmBatteryVoltageState *out) { return ::psmGetBatteryVoltageState(out); } +Result GetRawBatteryChargePercentage(double *out) { return ::psmGetRawBatteryChargePercentage(out); } +Result IsEnoughPowerSupplied(bool *out) { return ::psmIsEnoughPowerSupplied(out); } +Result GetBatteryAgePercentage(double *out) { return ::psmGetBatteryAgePercentage(out); } +Result GetBatteryChargeInfoEvent(Event* out_event, bool autoclear) { return ::psmGetBatteryChargeInfoEvent(out_event, autoclear); } +Result GetBatteryChargeInfoFields(PsmBatteryChargeInfoFields *out_fields) { return ::psmGetBatteryChargeInfoFields(out_fields); } +Result GetBatteryChargeCalibratedEvent(Event* out_event, bool autoclear) { return ::psmGetBatteryChargeCalibratedEvent(out_event, autoclear); } +Result BindStateChangeEvent(PsmSession* s, bool ChargerType, bool PowerSupply, bool BatteryVoltage) { return ::psmBindStateChangeEvent(s, ChargerType, PowerSupply, BatteryVoltage); } +Result WaitStateChangeEvent(PsmSession* s, u64 timeout) { return ::psmWaitStateChangeEvent(s, timeout); } +Result UnbindStateChangeEvent(PsmSession* s) { return ::psmUnbindStateChangeEvent(s); } + +} // namespace psm + +namespace random { + +void Get(void* buf, size_t len) { ::randomGet(buf, len); } +u64 Get64(void) { return ::randomGet64(); } + +} // namespace random + +namespace resolver { + +Result GetLastResult(void) { return ::resolverGetLastResult(); } +u32 GetCancelHandle(void) { return ::resolverGetCancelHandle(); } +bool GetEnableServiceDiscovery(void) { return ::resolverGetEnableServiceDiscovery(); } +bool GetEnableDnsCache(void) { return ::resolverGetEnableDnsCache(); } +void SetEnableServiceDiscovery(bool enable) { ::resolverSetEnableServiceDiscovery(enable); } +void SetEnableDnsCache(bool enable) { ::resolverSetEnableDnsCache(enable); } +Result Cancel(u32 handle) { return ::resolverCancel(handle); } +Result RemoveHostnameFromCache(const char* hostname) { return ::resolverRemoveHostnameFromCache(hostname); } +Result RemoveIpAddressFromCache(u32 ip) { return ::resolverRemoveIpAddressFromCache(ip); } + +} // namespace resolver + +namespace ringcon { + +Result Create(RingCon *c, HidNpadIdType id) { return ::ringconCreate(c, id); } +void Close(RingCon *c) { ::ringconClose(c); } +u32 GetErrorFlags(RingCon *c) { return ::ringconGetErrorFlags(c); } +bool GetErrorFlag(RingCon *c, RingConErrorFlag flag) { return ::ringconGetErrorFlag(c, flag); } +RingConFwVersion GetFwVersion(RingCon *c) { return ::ringconGetFwVersion(c); } +void GetId(RingCon *c, u64 *id_l, u64 *id_h) { ::ringconGetId(c, id_l, id_h); } +s16 GetUnkCal(RingCon *c) { return ::ringconGetUnkCal(c); } +s32 GetTotalPushCount(RingCon *c) { return ::ringconGetTotalPushCount(c); } +void GetManuCal(RingCon *c, RingConManuCal *out) { ::ringconGetManuCal(c, out); } +void GetUserCal(RingCon *c, RingConUserCal *out) { ::ringconGetUserCal(c, out); } +Result UpdateUserCal(RingCon *c, RingConUserCal cal) { return ::ringconUpdateUserCal(c, cal); } +Result ReadFwVersion(RingCon *c, RingConFwVersion *out) { return ::ringconReadFwVersion(c, out); } +Result ReadId(RingCon *c, u64 *id_l, u64 *id_h) { return ::ringconReadId(c, id_l, id_h); } +Result GetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32 *total_out) { return ::ringconGetPollingData(c, out, count, total_out); } +Result Cmdx00020105(RingCon *c, u32 *out) { return ::ringconCmdx00020105(c, out); } +Result ReadManuCal(RingCon *c, RingConManuCal *out) { return ::ringconReadManuCal(c, out); } +Result ReadUnkCal(RingCon *c, s16 *out) { return ::ringconReadUnkCal(c, out); } +Result ReadUserCal(RingCon *c, RingConUserCal *out) { return ::ringconReadUserCal(c, out); } +Result ReadRepCount(RingCon *c, s32 *out, RingConDataValid *data_valid) { return ::ringconReadRepCount(c, out, data_valid); } +Result ReadTotalPushCount(RingCon *c, s32 *out, RingConDataValid *data_valid) { return ::ringconReadTotalPushCount(c, out, data_valid); } +Result ResetRepCount(RingCon *c) { return ::ringconResetRepCount(c); } +Result WriteUserCal(RingCon *c, RingConUserCal cal) { return ::ringconWriteUserCal(c, cal); } + +} // namespace ringcon + +namespace rmutex { + +void Init(RMutex* m) { ::rmutexInit(m); } +void Lock(RMutex* m) { ::rmutexLock(m); } +bool TryLock(RMutex* m) { return ::rmutexTryLock(m); } +void Unlock(RMutex* m) { ::rmutexUnlock(m); } + +} // namespace rmutex + +namespace ro { + +Result DmntInitialize(void) { return ::roDmntInitialize(); } +void DmntExit(void) { ::roDmntExit(); } +Service* DmntGetServiceSession(void) { return ::roDmntGetServiceSession(); } +Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out) { return ::roDmntGetProcessModuleInfo(pid, out_module_infos, max_out_modules, num_out); } + +} // namespace ro + +namespace ro1 { + +Result Initialize(void) { return ::ro1Initialize(); } +void Exit(void) { ::ro1Exit(); } +Service* GetServiceSession(void) { return ::ro1GetServiceSession(); } +Result LoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { return ::ro1LoadNro(out_address, nro_address, nro_size, bss_address, bss_size); } +Result UnloadNro(u64 nro_address) { return ::ro1UnloadNro(nro_address); } +Result LoadNrr(u64 nrr_address, u64 nrr_size) { return ::ro1LoadNrr(nrr_address, nrr_size); } +Result UnloadNrr(u64 nrr_address) { return ::ro1UnloadNrr(nrr_address); } +Result LoadNrrEx(u64 nrr_address, u64 nrr_size) { return ::ro1LoadNrrEx(nrr_address, nrr_size); } + +} // namespace ro1 + +namespace romfs { + +Result MountSelf(const char *name) { return ::romfsMountSelf(name); } +Result MountFromFile(FsFile file, u64 offset, const char *name) { return ::romfsMountFromFile(file, offset, name); } +Result MountFromStorage(FsStorage storage, u64 offset, const char *name) { return ::romfsMountFromStorage(storage, offset, name); } +Result MountFromCurrentProcess(const char *name) { return ::romfsMountFromCurrentProcess(name); } +Result MountDataStorageFromProgram(u64 program_id, const char *name) { return ::romfsMountDataStorageFromProgram(program_id, name); } +Result MountFromFsdev(const char *path, u64 offset, const char *name) { return ::romfsMountFromFsdev(path, offset, name); } +Result MountFromDataArchive(u64 dataId, NcmStorageId storageId, const char *name) { return ::romfsMountFromDataArchive(dataId, storageId, name); } +Result Unmount(const char *name) { return ::romfsUnmount(name); } +Result Init(void) { return ::romfsInit(); } +Result Exit(void) { return ::romfsExit(); } + +} // namespace romfs + +namespace rwlock { + +void Init(RwLock* r) { ::rwlockInit(r); } +void ReadLock(RwLock* r) { ::rwlockReadLock(r); } +bool TryReadLock(RwLock* r) { return ::rwlockTryReadLock(r); } +void ReadUnlock(RwLock* r) { ::rwlockReadUnlock(r); } +void WriteLock(RwLock* r) { ::rwlockWriteLock(r); } +bool TryWriteLock(RwLock* r) { return ::rwlockTryWriteLock(r); } +void WriteUnlock(RwLock* r) { ::rwlockWriteUnlock(r); } +bool IsWriteLockHeldByCurrentThread(RwLock* r) { return ::rwlockIsWriteLockHeldByCurrentThread(r); } +bool IsOwnedByCurrentThread(RwLock* r) { return ::rwlockIsOwnedByCurrentThread(r); } + +} // namespace rwlock + +namespace semaphore { + +void Init(Semaphore *s, u64 initial_count) { ::semaphoreInit(s, initial_count); } +void Signal(Semaphore *s) { ::semaphoreSignal(s); } +void Wait(Semaphore *s) { ::semaphoreWait(s); } +bool TryWait(Semaphore *s) { return ::semaphoreTryWait(s); } + +} // namespace semaphore + +namespace service { + +bool IsActive(Service* s) { return ::serviceIsActive(s); } +bool IsOverride(Service* s) { return ::serviceIsOverride(s); } +bool IsDomain(Service* s) { return ::serviceIsDomain(s); } +bool IsDomainSubservice(Service* s) { return ::serviceIsDomainSubservice(s); } +u32 GetObjectId(Service* s) { return ::serviceGetObjectId(s); } +void Create(Service* s, Handle h) { ::serviceCreate(s, h); } +void CreateNonDomainSubservice(Service* s, Service* parent, Handle h) { ::serviceCreateNonDomainSubservice(s, parent, h); } +void CreateDomainSubservice(Service* s, Service* parent, u32 object_id) { ::serviceCreateDomainSubservice(s, parent, object_id); } +void Close(Service* s) { ::serviceClose(s); } +Result Clone(Service* s, Service* out_s) { return ::serviceClone(s, out_s); } +Result CloneEx(Service* s, u32 tag, Service* out_s) { return ::serviceCloneEx(s, tag, out_s); } +Result ConvertToDomain(Service* s) { return ::serviceConvertToDomain(s); } +void RequestFormatProcessBuffer(CmifRequestFormat* fmt, u32 attr) { ::_serviceRequestFormatProcessBuffer(fmt, attr); } +void RequestProcessBuffer(CmifRequest* req, const SfBuffer* buf, u32 attr) { ::_serviceRequestProcessBuffer(req, buf, attr); } +void* MakeRequest(Service* s, u32 request_id, u32 context, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_objects, const Service* const* objects, u32 num_handles, const Handle* handles) { return ::serviceMakeRequest(s, request_id, context, data_size, send_pid, buffer_attrs, buffers, num_objects, objects, num_handles, handles); } +void ResponseGetHandle(CmifResponse* res, SfOutHandleAttr type, Handle* out) { ::_serviceResponseGetHandle(res, type, out); } +Result ParseResponse(Service* s, u32 out_size, void** out_data, u32 num_out_objects, Service* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles) { return ::serviceParseResponse(s, out_size, out_data, num_out_objects, out_objects, out_handle_attrs, out_handles); } +Result DispatchImpl(Service* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, SfDispatchParams disp) { return ::serviceDispatchImpl(s, request_id, in_data, in_data_size, out_data, out_data_size, disp); } + +} // namespace service + +namespace sessionmgr { + +Result Create(SessionMgr* mgr, Handle root_session, u32 num_sessions) { return ::sessionmgrCreate(mgr, root_session, num_sessions); } +void Close(SessionMgr* mgr) { ::sessionmgrClose(mgr); } +int AttachClient(SessionMgr* mgr) { return ::sessionmgrAttachClient(mgr); } +void DetachClient(SessionMgr* mgr, int slot) { ::sessionmgrDetachClient(mgr, slot); } +Handle GetClientSession(SessionMgr* mgr, int slot) { return ::sessionmgrGetClientSession(mgr, slot); } + +} // namespace sessionmgr + +namespace set { + +Result Initialize(void) { return ::setInitialize(); } +void Exit(void) { ::setExit(); } +Service* GetServiceSession(void) { return ::setGetServiceSession(); } +Result MakeLanguage(u64 LanguageCode, SetLanguage *Language) { return ::setMakeLanguage(LanguageCode, Language); } +Result MakeLanguageCode(SetLanguage Language, u64 *LanguageCode) { return ::setMakeLanguageCode(Language, LanguageCode); } +Result GetSystemLanguage(u64 *LanguageCode) { return ::setGetSystemLanguage(LanguageCode); } +Result GetLanguageCode(u64 *LanguageCode) { return ::setGetLanguageCode(LanguageCode); } +Result GetAvailableLanguageCodes(s32 *total_entries, u64 *LanguageCodes, size_t max_entries) { return ::setGetAvailableLanguageCodes(total_entries, LanguageCodes, max_entries); } +Result GetAvailableLanguageCodeCount(s32 *total) { return ::setGetAvailableLanguageCodeCount(total); } +Result GetRegionCode(SetRegion *out) { return ::setGetRegionCode(out); } +Result GetQuestFlag(bool *out) { return ::setGetQuestFlag(out); } +Result GetDeviceNickname(SetSysDeviceNickName *nickname) { return ::setGetDeviceNickname(nickname); } + +} // namespace set + +namespace setcal { + +Result Initialize(void) { return ::setcalInitialize(); } +void Exit(void) { ::setcalExit(); } +Service* GetServiceSession(void) { return ::setcalGetServiceSession(); } +Result GetBdAddress(SetCalBdAddress *out) { return ::setcalGetBdAddress(out); } +Result GetConfigurationId1(SetCalConfigurationId1 *out) { return ::setcalGetConfigurationId1(out); } +Result GetAccelerometerOffset(SetCalAccelerometerOffset *out) { return ::setcalGetAccelerometerOffset(out); } +Result GetAccelerometerScale(SetCalAccelerometerScale *out) { return ::setcalGetAccelerometerScale(out); } +Result GetGyroscopeOffset(SetCalGyroscopeOffset *out) { return ::setcalGetGyroscopeOffset(out); } +Result GetGyroscopeScale(SetCalGyroscopeScale *out) { return ::setcalGetGyroscopeScale(out); } +Result GetWirelessLanMacAddress(SetCalMacAddress *out) { return ::setcalGetWirelessLanMacAddress(out); } +Result GetWirelessLanCountryCodeCount(s32 *out_count) { return ::setcalGetWirelessLanCountryCodeCount(out_count); } +Result GetWirelessLanCountryCodes(s32 *total_out, SetCalCountryCode *codes, s32 count) { return ::setcalGetWirelessLanCountryCodes(total_out, codes, count); } +Result GetSerialNumber(SetCalSerialNumber *out) { return ::setcalGetSerialNumber(out); } +Result SetInitialSystemAppletProgramId(u64 program_id) { return ::setcalSetInitialSystemAppletProgramId(program_id); } +Result SetOverlayDispProgramId(u64 program_id) { return ::setcalSetOverlayDispProgramId(program_id); } +Result GetBatteryLot(SetBatteryLot *out) { return ::setcalGetBatteryLot(out); } +Result GetEciDeviceCertificate(SetCalEccB233DeviceCertificate *out) { return ::setcalGetEciDeviceCertificate(out); } +Result GetEticketDeviceCertificate(SetCalRsa2048DeviceCertificate *out) { return ::setcalGetEticketDeviceCertificate(out); } +Result GetSslKey(SetCalSslKey *out) { return ::setcalGetSslKey(out); } +Result GetSslCertificate(SetCalSslCertificate *out) { return ::setcalGetSslCertificate(out); } +Result GetGameCardKey(SetCalGameCardKey *out) { return ::setcalGetGameCardKey(out); } +Result GetGameCardCertificate(SetCalGameCardCertificate *out) { return ::setcalGetGameCardCertificate(out); } +Result GetEciDeviceKey(SetCalEccB233DeviceKey *out) { return ::setcalGetEciDeviceKey(out); } +Result GetEticketDeviceKey(SetCalRsa2048DeviceKey *out) { return ::setcalGetEticketDeviceKey(out); } +Result GetSpeakerParameter(SetCalSpeakerParameter *out) { return ::setcalGetSpeakerParameter(out); } +Result GetLcdVendorId(u32 *out_vendor_id) { return ::setcalGetLcdVendorId(out_vendor_id); } +Result GetEciDeviceCertificate2(SetCalRsa2048DeviceCertificate *out) { return ::setcalGetEciDeviceCertificate2(out); } +Result GetEciDeviceKey2(SetCalRsa2048DeviceKey *out) { return ::setcalGetEciDeviceKey2(out); } +Result GetAmiiboKey(SetCalAmiiboKey *out) { return ::setcalGetAmiiboKey(out); } +Result GetAmiiboEcqvCertificate(SetCalAmiiboEcqvCertificate *out) { return ::setcalGetAmiiboEcqvCertificate(out); } +Result GetAmiiboEcdsaCertificate(SetCalAmiiboEcdsaCertificate *out) { return ::setcalGetAmiiboEcdsaCertificate(out); } +Result GetAmiiboEcqvBlsKey(SetCalAmiiboEcqvBlsKey *out) { return ::setcalGetAmiiboEcqvBlsKey(out); } +Result GetAmiiboEcqvBlsCertificate(SetCalAmiiboEcqvBlsCertificate *out) { return ::setcalGetAmiiboEcqvBlsCertificate(out); } +Result GetAmiiboEcqvBlsRootCertificate(SetCalAmiiboEcqvBlsRootCertificate *out) { return ::setcalGetAmiiboEcqvBlsRootCertificate(out); } +Result GetUsbTypeCPowerSourceCircuitVersion(u8 *out_version) { return ::setcalGetUsbTypeCPowerSourceCircuitVersion(out_version); } +Result GetAnalogStickModuleTypeL(u8 *out_type) { return ::setcalGetAnalogStickModuleTypeL(out_type); } +Result GetAnalogStickModelParameterL(SetCalAnalogStickModelParameter *out) { return ::setcalGetAnalogStickModelParameterL(out); } +Result GetAnalogStickFactoryCalibrationL(SetCalAnalogStickFactoryCalibration *out) { return ::setcalGetAnalogStickFactoryCalibrationL(out); } +Result GetAnalogStickModuleTypeR(u8 *out_type) { return ::setcalGetAnalogStickModuleTypeR(out_type); } +Result GetAnalogStickModelParameterR(SetCalAnalogStickModelParameter *out) { return ::setcalGetAnalogStickModelParameterR(out); } +Result GetAnalogStickFactoryCalibrationR(SetCalAnalogStickFactoryCalibration *out) { return ::setcalGetAnalogStickFactoryCalibrationR(out); } +Result GetConsoleSixAxisSensorModuleType(u8 *out_type) { return ::setcalGetConsoleSixAxisSensorModuleType(out_type); } +Result GetConsoleSixAxisSensorHorizontalOffset(SetCalConsoleSixAxisSensorHorizontalOffset *out) { return ::setcalGetConsoleSixAxisSensorHorizontalOffset(out); } +Result GetBatteryVersion(u8 *out_version) { return ::setcalGetBatteryVersion(out_version); } +Result GetDeviceId(u64 *out_device_id) { return ::setcalGetDeviceId(out_device_id); } +Result GetConsoleSixAxisSensorMountType(u8 *out_type) { return ::setcalGetConsoleSixAxisSensorMountType(out_type); } + +} // namespace setcal + +namespace setfd { + +Result Initialize(void) { return ::setfdInitialize(); } +void Exit(void) { ::setfdExit(); } +Service* GetServiceSession(void) { return ::setfdGetServiceSession(); } +Result SetSettingsItemValue(const char *name, const char *item_key, const void *value_in, s64 value_in_size) { return ::setfdSetSettingsItemValue(name, item_key, value_in, value_in_size); } +Result ResetSettingsItemValue(const char *name, const char *item_key) { return ::setfdResetSettingsItemValue(name, item_key); } + +} // namespace setfd + +namespace setsys { + +Result Initialize(void) { return ::setsysInitialize(); } +void Exit(void) { ::setsysExit(); } +Service* GetServiceSession(void) { return ::setsysGetServiceSession(); } +Result SetLanguageCode(u64 LanguageCode) { return ::setsysSetLanguageCode(LanguageCode); } +Result SetNetworkSettings(const SetSysNetworkSettings *settings, s32 count) { return ::setsysSetNetworkSettings(settings, count); } +Result GetNetworkSettings(s32 *total_out, SetSysNetworkSettings *settings, s32 count) { return ::setsysGetNetworkSettings(total_out, settings, count); } +Result GetFirmwareVersion(SetSysFirmwareVersion *out) { return ::setsysGetFirmwareVersion(out); } +Result GetFirmwareVersionDigest(SetSysFirmwareVersionDigest *out) { return ::setsysGetFirmwareVersionDigest(out); } +Result GetLockScreenFlag(bool *out) { return ::setsysGetLockScreenFlag(out); } +Result SetLockScreenFlag(bool flag) { return ::setsysSetLockScreenFlag(flag); } +Result GetBacklightSettings(SetSysBacklightSettings *out) { return ::setsysGetBacklightSettings(out); } +Result SetBacklightSettings(const SetSysBacklightSettings *settings) { return ::setsysSetBacklightSettings(settings); } +Result SetBluetoothDevicesSettings(const SetSysBluetoothDevicesSettings *settings, s32 count) { return ::setsysSetBluetoothDevicesSettings(settings, count); } +Result GetBluetoothDevicesSettings(s32 *total_out, SetSysBluetoothDevicesSettings *settings, s32 count) { return ::setsysGetBluetoothDevicesSettings(total_out, settings, count); } +Result GetExternalSteadyClockSourceId(Uuid *out) { return ::setsysGetExternalSteadyClockSourceId(out); } +Result SetExternalSteadyClockSourceId(const Uuid *uuid) { return ::setsysSetExternalSteadyClockSourceId(uuid); } +Result GetUserSystemClockContext(TimeSystemClockContext *out) { return ::setsysGetUserSystemClockContext(out); } +Result SetUserSystemClockContext(const TimeSystemClockContext *context) { return ::setsysSetUserSystemClockContext(context); } +Result GetAccountSettings(SetSysAccountSettings *out) { return ::setsysGetAccountSettings(out); } +Result SetAccountSettings(SetSysAccountSettings settings) { return ::setsysSetAccountSettings(settings); } +Result GetAudioVolume(SetSysAudioDevice device, SetSysAudioVolume *out) { return ::setsysGetAudioVolume(device, out); } +Result SetAudioVolume(SetSysAudioDevice device, const SetSysAudioVolume *volume) { return ::setsysSetAudioVolume(device, volume); } +Result GetEulaVersions(s32 *total_out, SetSysEulaVersion *versions, s32 count) { return ::setsysGetEulaVersions(total_out, versions, count); } +Result SetEulaVersions(const SetSysEulaVersion *versions, s32 count) { return ::setsysSetEulaVersions(versions, count); } +Result GetColorSetId(ColorSetId *out) { return ::setsysGetColorSetId(out); } +Result SetColorSetId(ColorSetId id) { return ::setsysSetColorSetId(id); } +Result GetConsoleInformationUploadFlag(bool *out) { return ::setsysGetConsoleInformationUploadFlag(out); } +Result SetConsoleInformationUploadFlag(bool flag) { return ::setsysSetConsoleInformationUploadFlag(flag); } +Result GetAutomaticApplicationDownloadFlag(bool *out) { return ::setsysGetAutomaticApplicationDownloadFlag(out); } +Result SetAutomaticApplicationDownloadFlag(bool flag) { return ::setsysSetAutomaticApplicationDownloadFlag(flag); } +Result GetNotificationSettings(SetSysNotificationSettings *out) { return ::setsysGetNotificationSettings(out); } +Result SetNotificationSettings(const SetSysNotificationSettings *settings) { return ::setsysSetNotificationSettings(settings); } +Result GetAccountNotificationSettings(s32 *total_out, SetSysAccountNotificationSettings *settings, s32 count) { return ::setsysGetAccountNotificationSettings(total_out, settings, count); } +Result SetAccountNotificationSettings(const SetSysAccountNotificationSettings *settings, s32 count) { return ::setsysSetAccountNotificationSettings(settings, count); } +Result GetVibrationMasterVolume(float *out) { return ::setsysGetVibrationMasterVolume(out); } +Result SetVibrationMasterVolume(float volume) { return ::setsysSetVibrationMasterVolume(volume); } +Result GetSettingsItemValueSize(const char *name, const char *item_key, u64 *size_out) { return ::setsysGetSettingsItemValueSize(name, item_key, size_out); } +Result GetSettingsItemValue(const char *name, const char *item_key, void *value_out, size_t value_out_size, u64 *size_out) { return ::setsysGetSettingsItemValue(name, item_key, value_out, value_out_size, size_out); } +Result GetTvSettings(SetSysTvSettings *out) { return ::setsysGetTvSettings(out); } +Result SetTvSettings(const SetSysTvSettings *settings) { return ::setsysSetTvSettings(settings); } +Result GetEdid(SetSysEdid *out) { return ::setsysGetEdid(out); } +Result SetEdid(const SetSysEdid *edid) { return ::setsysSetEdid(edid); } +Result GetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode *out) { return ::setsysGetAudioOutputMode(target, out); } +Result SetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode mode) { return ::setsysSetAudioOutputMode(target, mode); } +Result GetSpeakerAutoMuteFlag(bool *out) { return ::setsysGetSpeakerAutoMuteFlag(out); } +Result SetSpeakerAutoMuteFlag(bool flag) { return ::setsysSetSpeakerAutoMuteFlag(flag); } +Result GetQuestFlag(bool *out) { return ::setsysGetQuestFlag(out); } +Result SetQuestFlag(bool flag) { return ::setsysSetQuestFlag(flag); } +Result GetDataDeletionSettings(SetSysDataDeletionSettings *out) { return ::setsysGetDataDeletionSettings(out); } +Result SetDataDeletionSettings(const SetSysDataDeletionSettings *settings) { return ::setsysSetDataDeletionSettings(settings); } +Result GetInitialSystemAppletProgramId(u64 *out) { return ::setsysGetInitialSystemAppletProgramId(out); } +Result GetOverlayDispProgramId(u64 *out) { return ::setsysGetOverlayDispProgramId(out); } +Result GetDeviceTimeZoneLocationName(TimeLocationName *out) { return ::setsysGetDeviceTimeZoneLocationName(out); } +Result SetDeviceTimeZoneLocationName(const TimeLocationName *name) { return ::setsysSetDeviceTimeZoneLocationName(name); } +Result GetWirelessCertificationFileSize(u64 *out_size) { return ::setsysGetWirelessCertificationFileSize(out_size); } +Result GetWirelessCertificationFile(void* buffer, size_t size, u64 *out_size) { return ::setsysGetWirelessCertificationFile(buffer, size, out_size); } +Result SetRegionCode(SetRegion region) { return ::setsysSetRegionCode(region); } +Result GetNetworkSystemClockContext(TimeSystemClockContext *out) { return ::setsysGetNetworkSystemClockContext(out); } +Result SetNetworkSystemClockContext(const TimeSystemClockContext *context) { return ::setsysSetNetworkSystemClockContext(context); } +Result IsUserSystemClockAutomaticCorrectionEnabled(bool *out) { return ::setsysIsUserSystemClockAutomaticCorrectionEnabled(out); } +Result SetUserSystemClockAutomaticCorrectionEnabled(bool flag) { return ::setsysSetUserSystemClockAutomaticCorrectionEnabled(flag); } +Result GetDebugModeFlag(bool *out) { return ::setsysGetDebugModeFlag(out); } +Result GetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage *out) { return ::setsysGetPrimaryAlbumStorage(out); } +Result SetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage storage) { return ::setsysSetPrimaryAlbumStorage(storage); } +Result GetUsb30EnableFlag(bool *out) { return ::setsysGetUsb30EnableFlag(out); } +Result SetUsb30EnableFlag(bool flag) { return ::setsysSetUsb30EnableFlag(flag); } +Result GetBatteryLot(SetBatteryLot *out) { return ::setsysGetBatteryLot(out); } +Result GetSerialNumber(SetSysSerialNumber *out) { return ::setsysGetSerialNumber(out); } +Result GetNfcEnableFlag(bool *out) { return ::setsysGetNfcEnableFlag(out); } +Result SetNfcEnableFlag(bool flag) { return ::setsysSetNfcEnableFlag(flag); } +Result GetSleepSettings(SetSysSleepSettings *out) { return ::setsysGetSleepSettings(out); } +Result SetSleepSettings(const SetSysSleepSettings *settings) { return ::setsysSetSleepSettings(settings); } +Result GetWirelessLanEnableFlag(bool *out) { return ::setsysGetWirelessLanEnableFlag(out); } +Result SetWirelessLanEnableFlag(bool flag) { return ::setsysSetWirelessLanEnableFlag(flag); } +Result GetInitialLaunchSettings(SetSysInitialLaunchSettings *out) { return ::setsysGetInitialLaunchSettings(out); } +Result SetInitialLaunchSettings(const SetSysInitialLaunchSettings *settings) { return ::setsysSetInitialLaunchSettings(settings); } +Result GetDeviceNickname(SetSysDeviceNickName *nickname) { return ::setsysGetDeviceNickname(nickname); } +Result SetDeviceNickname(const SetSysDeviceNickName *nickname) { return ::setsysSetDeviceNickname(nickname); } +Result GetProductModel(SetSysProductModel *model) { return ::setsysGetProductModel(model); } +Result GetLdnChannel(s32 *out) { return ::setsysGetLdnChannel(out); } +Result SetLdnChannel(s32 channel) { return ::setsysSetLdnChannel(channel); } +Result AcquireTelemetryDirtyFlagEventHandle(Event *out_event) { return ::setsysAcquireTelemetryDirtyFlagEventHandle(out_event); } +Result GetTelemetryDirtyFlags(u64 *flags_0, u64 *flags_1) { return ::setsysGetTelemetryDirtyFlags(flags_0, flags_1); } +Result GetPtmBatteryLot(SetBatteryLot *out) { return ::setsysGetPtmBatteryLot(out); } +Result SetPtmBatteryLot(const SetBatteryLot *lot) { return ::setsysSetPtmBatteryLot(lot); } +Result GetPtmFuelGaugeParameter(SetSysPtmFuelGaugeParameter *out) { return ::setsysGetPtmFuelGaugeParameter(out); } +Result SetPtmFuelGaugeParameter(const SetSysPtmFuelGaugeParameter *parameter) { return ::setsysSetPtmFuelGaugeParameter(parameter); } +Result GetBluetoothEnableFlag(bool *out) { return ::setsysGetBluetoothEnableFlag(out); } +Result SetBluetoothEnableFlag(bool flag) { return ::setsysSetBluetoothEnableFlag(flag); } +Result GetMiiAuthorId(Uuid *out) { return ::setsysGetMiiAuthorId(out); } +Result SetShutdownRtcValue(u64 value) { return ::setsysSetShutdownRtcValue(value); } +Result GetShutdownRtcValue(u64 *out) { return ::setsysGetShutdownRtcValue(out); } +Result AcquireFatalDirtyFlagEventHandle(Event *out_event) { return ::setsysAcquireFatalDirtyFlagEventHandle(out_event); } +Result GetFatalDirtyFlags(u64 *flags_0, u64 *flags_1) { return ::setsysGetFatalDirtyFlags(flags_0, flags_1); } +Result GetAutoUpdateEnableFlag(bool *out) { return ::setsysGetAutoUpdateEnableFlag(out); } +Result SetAutoUpdateEnableFlag(bool flag) { return ::setsysSetAutoUpdateEnableFlag(flag); } +Result GetNxControllerSettings(s32 *total_out, SetSysNxControllerLegacySettings *settings, s32 count) { return ::setsysGetNxControllerSettings(total_out, settings, count); } +Result SetNxControllerSettings(const SetSysNxControllerLegacySettings *settings, s32 count) { return ::setsysSetNxControllerSettings(settings, count); } +Result GetBatteryPercentageFlag(bool *out) { return ::setsysGetBatteryPercentageFlag(out); } +Result SetBatteryPercentageFlag(bool flag) { return ::setsysSetBatteryPercentageFlag(flag); } +Result GetExternalRtcResetFlag(bool *out) { return ::setsysGetExternalRtcResetFlag(out); } +Result SetExternalRtcResetFlag(bool flag) { return ::setsysSetExternalRtcResetFlag(flag); } +Result GetUsbFullKeyEnableFlag(bool *out) { return ::setsysGetUsbFullKeyEnableFlag(out); } +Result SetUsbFullKeyEnableFlag(bool flag) { return ::setsysSetUsbFullKeyEnableFlag(flag); } +Result SetExternalSteadyClockInternalOffset(u64 offset) { return ::setsysSetExternalSteadyClockInternalOffset(offset); } +Result GetExternalSteadyClockInternalOffset(u64 *out) { return ::setsysGetExternalSteadyClockInternalOffset(out); } +Result GetBacklightSettingsEx(SetSysBacklightSettingsEx *out) { return ::setsysGetBacklightSettingsEx(out); } +Result SetBacklightSettingsEx(const SetSysBacklightSettingsEx *settings) { return ::setsysSetBacklightSettingsEx(settings); } +Result GetHeadphoneVolumeWarningCount(u32 *out) { return ::setsysGetHeadphoneVolumeWarningCount(out); } +Result SetHeadphoneVolumeWarningCount(u32 count) { return ::setsysSetHeadphoneVolumeWarningCount(count); } +Result GetBluetoothAfhEnableFlag(bool *out) { return ::setsysGetBluetoothAfhEnableFlag(out); } +Result SetBluetoothAfhEnableFlag(bool flag) { return ::setsysSetBluetoothAfhEnableFlag(flag); } +Result GetBluetoothBoostEnableFlag(bool *out) { return ::setsysGetBluetoothBoostEnableFlag(out); } +Result SetBluetoothBoostEnableFlag(bool flag) { return ::setsysSetBluetoothBoostEnableFlag(flag); } +Result GetInRepairProcessEnableFlag(bool *out) { return ::setsysGetInRepairProcessEnableFlag(out); } +Result SetInRepairProcessEnableFlag(bool flag) { return ::setsysSetInRepairProcessEnableFlag(flag); } +Result GetHeadphoneVolumeUpdateFlag(bool *out) { return ::setsysGetHeadphoneVolumeUpdateFlag(out); } +Result SetHeadphoneVolumeUpdateFlag(bool flag) { return ::setsysSetHeadphoneVolumeUpdateFlag(flag); } +Result NeedsToUpdateHeadphoneVolume(u8 *a0, u8 *a1, u8 *a2, bool flag) { return ::setsysNeedsToUpdateHeadphoneVolume(a0, a1, a2, flag); } +Result GetPushNotificationActivityModeOnSleep(u32 *out) { return ::setsysGetPushNotificationActivityModeOnSleep(out); } +Result SetPushNotificationActivityModeOnSleep(u32 mode) { return ::setsysSetPushNotificationActivityModeOnSleep(mode); } +Result GetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings *out) { return ::setsysGetServiceDiscoveryControlSettings(out); } +Result SetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings settings) { return ::setsysSetServiceDiscoveryControlSettings(settings); } +Result GetErrorReportSharePermission(SetSysErrorReportSharePermission *out) { return ::setsysGetErrorReportSharePermission(out); } +Result SetErrorReportSharePermission(SetSysErrorReportSharePermission permission) { return ::setsysSetErrorReportSharePermission(permission); } +Result GetAppletLaunchFlags(u32 *out) { return ::setsysGetAppletLaunchFlags(out); } +Result SetAppletLaunchFlags(u32 flags) { return ::setsysSetAppletLaunchFlags(flags); } +Result GetConsoleSixAxisSensorAccelerationBias(SetSysConsoleSixAxisSensorAccelerationBias *out) { return ::setsysGetConsoleSixAxisSensorAccelerationBias(out); } +Result SetConsoleSixAxisSensorAccelerationBias(const SetSysConsoleSixAxisSensorAccelerationBias *bias) { return ::setsysSetConsoleSixAxisSensorAccelerationBias(bias); } +Result GetConsoleSixAxisSensorAngularVelocityBias(SetSysConsoleSixAxisSensorAngularVelocityBias *out) { return ::setsysGetConsoleSixAxisSensorAngularVelocityBias(out); } +Result SetConsoleSixAxisSensorAngularVelocityBias(const SetSysConsoleSixAxisSensorAngularVelocityBias *bias) { return ::setsysSetConsoleSixAxisSensorAngularVelocityBias(bias); } +Result GetConsoleSixAxisSensorAccelerationGain(SetSysConsoleSixAxisSensorAccelerationGain *out) { return ::setsysGetConsoleSixAxisSensorAccelerationGain(out); } +Result SetConsoleSixAxisSensorAccelerationGain(const SetSysConsoleSixAxisSensorAccelerationGain *gain) { return ::setsysSetConsoleSixAxisSensorAccelerationGain(gain); } +Result GetConsoleSixAxisSensorAngularVelocityGain(SetSysConsoleSixAxisSensorAngularVelocityGain *out) { return ::setsysGetConsoleSixAxisSensorAngularVelocityGain(out); } +Result SetConsoleSixAxisSensorAngularVelocityGain(const SetSysConsoleSixAxisSensorAngularVelocityGain *gain) { return ::setsysSetConsoleSixAxisSensorAngularVelocityGain(gain); } +Result GetKeyboardLayout(::SetKeyboardLayout *out) { return ::setsysGetKeyboardLayout(out); } +Result SetKeyboardLayout(::SetKeyboardLayout layout) { return ::setsysSetKeyboardLayout(layout); } +Result GetWebInspectorFlag(bool *out) { return ::setsysGetWebInspectorFlag(out); } +Result GetAllowedSslHosts(s32 *total_out, SetSysAllowedSslHosts *out, s32 count) { return ::setsysGetAllowedSslHosts(total_out, out, count); } +Result GetHostFsMountPoint(SetSysHostFsMountPoint *out) { return ::setsysGetHostFsMountPoint(out); } +Result GetRequiresRunRepairTimeReviser(bool *out) { return ::setsysGetRequiresRunRepairTimeReviser(out); } +Result SetRequiresRunRepairTimeReviser(bool flag) { return ::setsysSetRequiresRunRepairTimeReviser(flag); } +Result SetBlePairingSettings(const SetSysBlePairingSettings *settings, s32 count) { return ::setsysSetBlePairingSettings(settings, count); } +Result GetBlePairingSettings(s32 *total_out, SetSysBlePairingSettings *settings, s32 count) { return ::setsysGetBlePairingSettings(total_out, settings, count); } +Result GetConsoleSixAxisSensorAngularVelocityTimeBias(SetSysConsoleSixAxisSensorAngularVelocityTimeBias *out) { return ::setsysGetConsoleSixAxisSensorAngularVelocityTimeBias(out); } +Result SetConsoleSixAxisSensorAngularVelocityTimeBias(const SetSysConsoleSixAxisSensorAngularVelocityTimeBias *bias) { return ::setsysSetConsoleSixAxisSensorAngularVelocityTimeBias(bias); } +Result GetConsoleSixAxisSensorAngularAcceleration(SetSysConsoleSixAxisSensorAngularAcceleration *out) { return ::setsysGetConsoleSixAxisSensorAngularAcceleration(out); } +Result SetConsoleSixAxisSensorAngularAcceleration(const SetSysConsoleSixAxisSensorAngularAcceleration *acceleration) { return ::setsysSetConsoleSixAxisSensorAngularAcceleration(acceleration); } +Result GetRebootlessSystemUpdateVersion(SetSysRebootlessSystemUpdateVersion *out) { return ::setsysGetRebootlessSystemUpdateVersion(out); } +Result GetDeviceTimeZoneLocationUpdatedTime(TimeSteadyClockTimePoint *out) { return ::setsysGetDeviceTimeZoneLocationUpdatedTime(out); } +Result SetDeviceTimeZoneLocationUpdatedTime(const TimeSteadyClockTimePoint *time_point) { return ::setsysSetDeviceTimeZoneLocationUpdatedTime(time_point); } +Result GetUserSystemClockAutomaticCorrectionUpdatedTime(TimeSteadyClockTimePoint *out) { return ::setsysGetUserSystemClockAutomaticCorrectionUpdatedTime(out); } +Result SetUserSystemClockAutomaticCorrectionUpdatedTime(const TimeSteadyClockTimePoint *time_point) { return ::setsysSetUserSystemClockAutomaticCorrectionUpdatedTime(time_point); } +Result GetAccountOnlineStorageSettings(s32 *total_out, SetSysAccountOnlineStorageSettings *settings, s32 count) { return ::setsysGetAccountOnlineStorageSettings(total_out, settings, count); } +Result SetAccountOnlineStorageSettings(const SetSysAccountOnlineStorageSettings *settings, s32 count) { return ::setsysSetAccountOnlineStorageSettings(settings, count); } +Result GetPctlReadyFlag(bool *out) { return ::setsysGetPctlReadyFlag(out); } +Result SetPctlReadyFlag(bool flag) { return ::setsysSetPctlReadyFlag(flag); } +Result GetAnalogStickUserCalibrationL(SetSysAnalogStickUserCalibration *out) { return ::setsysGetAnalogStickUserCalibrationL(out); } +Result SetAnalogStickUserCalibrationL(const SetSysAnalogStickUserCalibration *calibration) { return ::setsysSetAnalogStickUserCalibrationL(calibration); } +Result GetAnalogStickUserCalibrationR(SetSysAnalogStickUserCalibration *out) { return ::setsysGetAnalogStickUserCalibrationR(out); } +Result SetAnalogStickUserCalibrationR(const SetSysAnalogStickUserCalibration *calibration) { return ::setsysSetAnalogStickUserCalibrationR(calibration); } +Result GetPtmBatteryVersion(u8 *out) { return ::setsysGetPtmBatteryVersion(out); } +Result SetPtmBatteryVersion(u8 version) { return ::setsysSetPtmBatteryVersion(version); } +Result GetUsb30HostEnableFlag(bool *out) { return ::setsysGetUsb30HostEnableFlag(out); } +Result SetUsb30HostEnableFlag(bool flag) { return ::setsysSetUsb30HostEnableFlag(flag); } +Result GetUsb30DeviceEnableFlag(bool *out) { return ::setsysGetUsb30DeviceEnableFlag(out); } +Result SetUsb30DeviceEnableFlag(bool flag) { return ::setsysSetUsb30DeviceEnableFlag(flag); } +Result GetThemeId(s32 type, SetSysThemeId *out) { return ::setsysGetThemeId(type, out); } +Result SetThemeId(s32 type, const SetSysThemeId *theme_id) { return ::setsysSetThemeId(type, theme_id); } +Result GetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod *out) { return ::setsysGetChineseTraditionalInputMethod(out); } +Result SetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod method) { return ::setsysSetChineseTraditionalInputMethod(method); } +Result GetPtmCycleCountReliability(SetSysPtmCycleCountReliability *out) { return ::setsysGetPtmCycleCountReliability(out); } +Result SetPtmCycleCountReliability(SetSysPtmCycleCountReliability reliability) { return ::setsysSetPtmCycleCountReliability(reliability); } +Result GetHomeMenuScheme(SetSysHomeMenuScheme *out) { return ::setsysGetHomeMenuScheme(out); } +Result GetThemeSettings(SetSysThemeSettings *out) { return ::setsysGetThemeSettings(out); } +Result SetThemeSettings(const SetSysThemeSettings *settings) { return ::setsysSetThemeSettings(settings); } +Result GetThemeKey(FsArchiveMacKey *out) { return ::setsysGetThemeKey(out); } +Result SetThemeKey(const FsArchiveMacKey *key) { return ::setsysSetThemeKey(key); } +Result GetZoomFlag(bool *out) { return ::setsysGetZoomFlag(out); } +Result SetZoomFlag(bool flag) { return ::setsysSetZoomFlag(flag); } +Result GetT(bool *out) { return ::setsysGetT(out); } +Result SetT(bool flag) { return ::setsysSetT(flag); } +Result GetPlatformRegion(SetSysPlatformRegion *out) { return ::setsysGetPlatformRegion(out); } +Result SetPlatformRegion(SetSysPlatformRegion region) { return ::setsysSetPlatformRegion(region); } +Result GetHomeMenuSchemeModel(u32 *out) { return ::setsysGetHomeMenuSchemeModel(out); } +Result GetMemoryUsageRateFlag(bool *out) { return ::setsysGetMemoryUsageRateFlag(out); } +Result GetTouchScreenMode(SetSysTouchScreenMode *out) { return ::setsysGetTouchScreenMode(out); } +Result SetTouchScreenMode(SetSysTouchScreenMode mode) { return ::setsysSetTouchScreenMode(mode); } +Result GetButtonConfigSettingsFull(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsFull(total_out, settings, count); } +Result SetButtonConfigSettingsFull(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsFull(settings, count); } +Result GetButtonConfigSettingsEmbedded(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsEmbedded(total_out, settings, count); } +Result SetButtonConfigSettingsEmbedded(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsEmbedded(settings, count); } +Result GetButtonConfigSettingsLeft(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsLeft(total_out, settings, count); } +Result SetButtonConfigSettingsLeft(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsLeft(settings, count); } +Result GetButtonConfigSettingsRight(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsRight(total_out, settings, count); } +Result SetButtonConfigSettingsRight(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsRight(settings, count); } +Result GetButtonConfigRegisteredSettingsEmbedded(SetSysButtonConfigRegisteredSettings *settings) { return ::setsysGetButtonConfigRegisteredSettingsEmbedded(settings); } +Result SetButtonConfigRegisteredSettingsEmbedded(const SetSysButtonConfigRegisteredSettings *settings) { return ::setsysSetButtonConfigRegisteredSettingsEmbedded(settings); } +Result GetButtonConfigRegisteredSettings(s32 *total_out, SetSysButtonConfigRegisteredSettings *settings, s32 count) { return ::setsysGetButtonConfigRegisteredSettings(total_out, settings, count); } +Result SetButtonConfigRegisteredSettings(const SetSysButtonConfigRegisteredSettings *settings, s32 count) { return ::setsysSetButtonConfigRegisteredSettings(settings, count); } +Result GetFieldTestingFlag(bool *out) { return ::setsysGetFieldTestingFlag(out); } +Result SetFieldTestingFlag(bool flag) { return ::setsysSetFieldTestingFlag(flag); } +Result GetNxControllerSettingsEx(s32 *total_out, SetSysNxControllerSettings *settings, s32 count) { return ::setsysGetNxControllerSettingsEx(total_out, settings, count); } +Result SetNxControllerSettingsEx(const SetSysNxControllerSettings *settings, s32 count) { return ::setsysSetNxControllerSettingsEx(settings, count); } + +} // namespace setsys + +namespace sha1 { + +void ContextCreate(Sha1Context *out) { ::sha1ContextCreate(out); } +void ContextUpdate(Sha1Context *ctx, const void *src, size_t size) { ::sha1ContextUpdate(ctx, src, size); } +void ContextGetHash(Sha1Context *ctx, void *dst) { ::sha1ContextGetHash(ctx, dst); } +void CalculateHash(void *dst, const void *src, size_t size) { ::sha1CalculateHash(dst, src, size); } + +} // namespace sha1 + +namespace sha256 { + +void ContextCreate(Sha256Context *out) { ::sha256ContextCreate(out); } +void ContextUpdate(Sha256Context *ctx, const void *src, size_t size) { ::sha256ContextUpdate(ctx, src, size); } +void ContextGetHash(Sha256Context *ctx, void *dst) { ::sha256ContextGetHash(ctx, dst); } +void CalculateHash(void *dst, const void *src, size_t size) { ::sha256CalculateHash(dst, src, size); } + +} // namespace sha256 + +namespace shmem { + +Result Create(SharedMemory* s, size_t size, Permission local_perm, Permission remote_perm) { return ::shmemCreate(s, size, local_perm, remote_perm); } +void LoadRemote(SharedMemory* s, Handle handle, size_t size, Permission perm) { ::shmemLoadRemote(s, handle, size, perm); } +Result Map(SharedMemory* s) { return ::shmemMap(s); } +Result Unmap(SharedMemory* s) { return ::shmemUnmap(s); } +void* GetAddr(SharedMemory* s) { return ::shmemGetAddr(s); } +Result Close(SharedMemory* s) { return ::shmemClose(s); } + +} // namespace shmem + +namespace sm { + +u64 ServiceNameToU64(SmServiceName name) { return ::smServiceNameToU64(name); } +SmServiceName ServiceNameFromU64(u64 name) { return ::smServiceNameFromU64(name); } +bool ServiceNamesAreEqual(SmServiceName a, SmServiceName b) { return ::smServiceNamesAreEqual(a, b); } +SmServiceName EncodeName(const char* name) { return ::smEncodeName(name); } +Result Initialize(void) { return ::smInitialize(); } +void Exit(void) { ::smExit(); } +Result GetServiceWrapper(Service* service_out, SmServiceName name) { return ::smGetServiceWrapper(service_out, name); } +Result GetServiceOriginal(Handle* handle_out, SmServiceName name) { return ::smGetServiceOriginal(handle_out, name); } +Result GetService(Service* service_out, const char* name) { return ::smGetService(service_out, name); } +Handle GetServiceOverride(SmServiceName name) { return ::smGetServiceOverride(name); } +Result RegisterService(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions) { return ::smRegisterService(handle_out, name, is_light, max_sessions); } +Result RegisterServiceCmif(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions) { return ::smRegisterServiceCmif(handle_out, name, is_light, max_sessions); } +Result RegisterServiceTipc(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions) { return ::smRegisterServiceTipc(handle_out, name, is_light, max_sessions); } +Result UnregisterService(SmServiceName name) { return ::smUnregisterService(name); } +Result UnregisterServiceCmif(SmServiceName name) { return ::smUnregisterServiceCmif(name); } +Result UnregisterServiceTipc(SmServiceName name) { return ::smUnregisterServiceTipc(name); } +Result DetachClient(void) { return ::smDetachClient(); } +Result DetachClientCmif(void) { return ::smDetachClientCmif(); } +Result DetachClientTipc(void) { return ::smDetachClientTipc(); } +Service * GetServiceSession(void) { return ::smGetServiceSession(); } +TipcService * GetServiceSessionTipc(void) { return ::smGetServiceSessionTipc(); } +void AddOverrideHandle(SmServiceName name, Handle handle) { ::smAddOverrideHandle(name, handle); } +Result ManagerInitialize(void) { return ::smManagerInitialize(); } +void ManagerExit(void) { ::smManagerExit(); } +Result ManagerRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { return ::smManagerRegisterProcess(pid, acid_sac, acid_sac_size, aci0_sac, aci0_sac_size); } +Result ManagerUnregisterProcess(u64 pid) { return ::smManagerUnregisterProcess(pid); } +Result ManagerCmifInitialize(void) { return ::smManagerCmifInitialize(); } +void ManagerCmifExit(void) { ::smManagerCmifExit(); } +Service* ManagerCmifGetServiceSession(void) { return ::smManagerCmifGetServiceSession(); } +Result ManagerCmifRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { return ::smManagerCmifRegisterProcess(pid, acid_sac, acid_sac_size, aci0_sac, aci0_sac_size); } +Result ManagerCmifUnregisterProcess(u64 pid) { return ::smManagerCmifUnregisterProcess(pid); } +Result ManagerTipcInitialize(void) { return ::smManagerTipcInitialize(); } +void ManagerTipcExit(void) { ::smManagerTipcExit(); } +TipcService* ManagerTipcGetServiceSession(void) { return ::smManagerTipcGetServiceSession(); } +Result ManagerTipcRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { return ::smManagerTipcRegisterProcess(pid, acid_sac, acid_sac_size, aci0_sac, aci0_sac_size); } +Result ManagerTipcUnregisterProcess(u64 pid) { return ::smManagerTipcUnregisterProcess(pid); } + +} // namespace sm + +namespace socket { + +const SocketInitConfig * GetDefaultInitConfig(void) { return ::socketGetDefaultInitConfig(); } +Result Initialize(const SocketInitConfig *config) { return ::socketInitialize(config); } +Result GetLastResult(void) { return ::socketGetLastResult(); } +void Exit(void) { ::socketExit(); } +Result InitializeDefault(void) { return ::socketInitializeDefault(); } +int SslConnectionSetSocketDescriptor(SslConnection *c, int sockfd) { return ::socketSslConnectionSetSocketDescriptor(c, sockfd); } +int SslConnectionGetSocketDescriptor(SslConnection *c) { return ::socketSslConnectionGetSocketDescriptor(c); } +#ifdef _SOCKLEN_T_DECLARED +int SslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen) { return ::socketSslConnectionSetDtlsSocketDescriptor(c, sockfd, addr, addrlen); } +#endif +int NifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::socketNifmRequestRegisterSocketDescriptor(r, sockfd); } +int NifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::socketNifmRequestUnregisterSocketDescriptor(r, sockfd); } + +} // namespace socket + +namespace spl { + +Result Initialize(void) { return ::splInitialize(); } +void Exit(void) { ::splExit(); } +Service* GetServiceSession(void) { return ::splGetServiceSession(); } +Result CryptoInitialize(void) { return ::splCryptoInitialize(); } +void CryptoExit(void) { ::splCryptoExit(); } +Service* CryptoGetServiceSession(void) { return ::splCryptoGetServiceSession(); } +Result SslInitialize(void) { return ::splSslInitialize(); } +void SslExit(void) { ::splSslExit(); } +Service* SslGetServiceSession(void) { return ::splSslGetServiceSession(); } +Result EsInitialize(void) { return ::splEsInitialize(); } +void EsExit(void) { ::splEsExit(); } +Service* EsGetServiceSession(void) { return ::splEsGetServiceSession(); } +Result FsInitialize(void) { return ::splFsInitialize(); } +void FsExit(void) { ::splFsExit(); } +Service* FsGetServiceSession(void) { return ::splFsGetServiceSession(); } +Result ManuInitialize(void) { return ::splManuInitialize(); } +void ManuExit(void) { ::splManuExit(); } +Service* ManuGetServiceSession(void) { return ::splManuGetServiceSession(); } +Result GetConfig(SplConfigItem config_item, u64 *out_config) { return ::splGetConfig(config_item, out_config); } +Result UserExpMod(const void *input, const void *modulus, const void *exp, size_t exp_size, void *dst) { return ::splUserExpMod(input, modulus, exp, exp_size, dst); } +Result SetConfig(SplConfigItem config_item, u64 value) { return ::splSetConfig(config_item, value); } +Result GetRandomBytes(void *out, size_t out_size) { return ::splGetRandomBytes(out, out_size); } +Result IsDevelopment(bool *out_is_development) { return ::splIsDevelopment(out_is_development); } +Result SetBootReason(u32 value) { return ::splSetBootReason(value); } +Result GetBootReason(u32 *out_value) { return ::splGetBootReason(out_value); } +Result CryptoGenerateAesKek(const void *wrapped_kek, u32 key_generation, u32 option, void *out_sealed_kek) { return ::splCryptoGenerateAesKek(wrapped_kek, key_generation, option, out_sealed_kek); } +Result CryptoLoadAesKey(const void *sealed_kek, const void *wrapped_key, u32 keyslot) { return ::splCryptoLoadAesKey(sealed_kek, wrapped_key, keyslot); } +Result CryptoGenerateAesKey(const void *sealed_kek, const void *wrapped_key, void *out_sealed_key) { return ::splCryptoGenerateAesKey(sealed_kek, wrapped_key, out_sealed_key); } +Result CryptoDecryptAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key) { return ::splCryptoDecryptAesKey(wrapped_key, key_generation, option, out_sealed_key); } +Result CryptoCryptAesCtr(const void *input, void *output, size_t size, u32 keyslot, const void *ctr) { return ::splCryptoCryptAesCtr(input, output, size, keyslot, ctr); } +Result CryptoComputeCmac(const void *input, size_t size, u32 keyslot, void *out_cmac) { return ::splCryptoComputeCmac(input, size, keyslot, out_cmac); } +Result CryptoLockAesEngine(u32 *out_keyslot) { return ::splCryptoLockAesEngine(out_keyslot); } +Result CryptoUnlockAesEngine(u32 keyslot) { return ::splCryptoUnlockAesEngine(keyslot); } +Result CryptoGetSecurityEngineEvent(Event *out_event) { return ::splCryptoGetSecurityEngineEvent(out_event); } +Result RsaDecryptPrivateKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version, void *dst, size_t dst_size) { return ::splRsaDecryptPrivateKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size, version, dst, dst_size); } +Result SslLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size) { return ::splSslLoadSecureExpModKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size); } +Result SslSecureExpMod(const void *input, const void *modulus, void *dst) { return ::splSslSecureExpMod(input, modulus, dst); } +Result EsLoadRsaOaepKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version) { return ::splEsLoadRsaOaepKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size, version); } +Result EsUnwrapRsaOaepWrappedTitlekey(const void *rsa_wrapped_titlekey, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_titlekey) { return ::splEsUnwrapRsaOaepWrappedTitlekey(rsa_wrapped_titlekey, modulus, label_hash, label_hash_size, key_generation, out_sealed_titlekey); } +Result EsUnwrapAesWrappedTitlekey(const void *aes_wrapped_titlekey, u32 key_generation, void *out_sealed_titlekey) { return ::splEsUnwrapAesWrappedTitlekey(aes_wrapped_titlekey, key_generation, out_sealed_titlekey); } +Result EsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size) { return ::splEsLoadSecureExpModKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size); } +Result EsSecureExpMod(const void *input, const void *modulus, void *dst) { return ::splEsSecureExpMod(input, modulus, dst); } +Result EsUnwrapElicenseKey(const void *rsa_wrapped_elicense_key, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_elicense_key) { return ::splEsUnwrapElicenseKey(rsa_wrapped_elicense_key, modulus, label_hash, label_hash_size, key_generation, out_sealed_elicense_key); } +Result EsLoadElicenseKey(const void *sealed_elicense_key, u32 keyslot) { return ::splEsLoadElicenseKey(sealed_elicense_key, keyslot); } +Result FsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version) { return ::splFsLoadSecureExpModKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size, version); } +Result FsSecureExpMod(const void *input, const void *modulus, void *dst) { return ::splFsSecureExpMod(input, modulus, dst); } +Result FsGenerateSpecificAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key) { return ::splFsGenerateSpecificAesKey(wrapped_key, key_generation, option, out_sealed_key); } +Result FsLoadTitlekey(const void *sealed_titlekey, u32 keyslot) { return ::splFsLoadTitlekey(sealed_titlekey, keyslot); } +Result FsGetPackage2Hash(void *out_hash) { return ::splFsGetPackage2Hash(out_hash); } +Result ManuEncryptRsaKeyForImport(const void *sealed_kek_pre, const void *wrapped_key_pre, const void *sealed_kek_post, const void *wrapped_kek_post, u32 option, const void *wrapped_rsa_key, void *out_wrapped_rsa_key, size_t rsa_key_size) { return ::splManuEncryptRsaKeyForImport(sealed_kek_pre, wrapped_key_pre, sealed_kek_post, wrapped_kek_post, option, wrapped_rsa_key, out_wrapped_rsa_key, rsa_key_size); } + +} // namespace spl + +namespace spsm { + +Result Initialize(void) { return ::spsmInitialize(); } +void Exit(void) { ::spsmExit(); } +Service* GetServiceSession(void) { return ::spsmGetServiceSession(); } +Result Shutdown(bool reboot) { return ::spsmShutdown(reboot); } +Result PutErrorState(void) { return ::spsmPutErrorState(); } + +} // namespace spsm + +namespace ssl { + +Result Initialize(u32 num_sessions) { return ::sslInitialize(num_sessions); } +void Exit(void) { ::sslExit(); } +Service* GetServiceSession(void) { return ::sslGetServiceSession(); } +Result CreateContext(SslContext *c, u32 ssl_version) { return ::sslCreateContext(c, ssl_version); } +Result GetContextCount(u32 *out) { return ::sslGetContextCount(out); } +Result GetCertificates(void* buffer, u32 size, u32 *ca_cert_ids, u32 count, u32 *total_out) { return ::sslGetCertificates(buffer, size, ca_cert_ids, count, total_out); } +Result GetCertificateBufSize(u32 *ca_cert_ids, u32 count, u32 *out) { return ::sslGetCertificateBufSize(ca_cert_ids, count, out); } +Result FlushSessionCache(const char *str, size_t str_bufsize, SslFlushSessionCacheOptionType type, u32 *out) { return ::sslFlushSessionCache(str, str_bufsize, type, out); } +Result SetDebugOption(const void* buffer, size_t size, SslDebugOptionType type) { return ::sslSetDebugOption(buffer, size, type); } +Result GetDebugOption(void* buffer, size_t size, SslDebugOptionType type) { return ::sslGetDebugOption(buffer, size, type); } +Result ClearTls12FallbackFlag(void) { return ::sslClearTls12FallbackFlag(); } +Result SetThreadCoreMask(u64 mask) { return ::sslSetThreadCoreMask(mask); } +Result GetThreadCoreMask(u64 *out) { return ::sslGetThreadCoreMask(out); } +void ContextClose(SslContext *c) { ::sslContextClose(c); } +Result ContextSetOption(SslContext *c, SslContextOption option, s32 value) { return ::sslContextSetOption(c, option, value); } +Result ContextGetOption(SslContext *c, SslContextOption option, s32 *out) { return ::sslContextGetOption(c, option, out); } +Result ContextCreateConnection(SslContext *c, SslConnection *conn) { return ::sslContextCreateConnection(c, conn); } +Result ContextGetConnectionCount(SslContext *c, u32 *out) { return ::sslContextGetConnectionCount(c, out); } +Result ContextImportServerPki(SslContext *c, const void* buffer, u32 size, SslCertificateFormat format, u64 *id) { return ::sslContextImportServerPki(c, buffer, size, format, id); } +Result ContextImportClientPki(SslContext *c, const void* pkcs12, u32 pkcs12_size, const char *pw, u32 pw_size, u64 *id) { return ::sslContextImportClientPki(c, pkcs12, pkcs12_size, pw, pw_size, id); } +Result ContextRemovePki(SslContext *c, u64 id) { return ::sslContextRemovePki(c, id); } +Result ContextRegisterInternalPki(SslContext *c, SslInternalPki internal_pki, u64 *id) { return ::sslContextRegisterInternalPki(c, internal_pki, id); } +Result ContextAddPolicyOid(SslContext *c, const char *str, u32 str_bufsize) { return ::sslContextAddPolicyOid(c, str, str_bufsize); } +Result ContextImportCrl(SslContext *c, const void* buffer, u32 size, u64 *id) { return ::sslContextImportCrl(c, buffer, size, id); } +Result ContextImportClientCertKeyPki(SslContext *c, const void* cert, u32 cert_size, const void* key, u32 key_size, SslCertificateFormat format, u64 *id) { return ::sslContextImportClientCertKeyPki(c, cert, cert_size, key, key_size, format, id); } +Result ContextGeneratePrivateKeyAndCert(SslContext *c, void* cert, u32 cert_size, void* key, u32 key_size, u32 val, const SslKeyAndCertParams *params, u32 *out_certsize, u32 *out_keysize) { return ::sslContextGeneratePrivateKeyAndCert(c, cert, cert_size, key, key_size, val, params, out_certsize, out_keysize); } +Result ContextCreateConnectionForSystem(SslContext *c, SslConnection *conn) { return ::sslContextCreateConnectionForSystem(c, conn); } +void ConnectionClose(SslConnection *c) { ::sslConnectionClose(c); } +Result ConnectionSetSocketDescriptor(SslConnection *c, int sockfd, int *out_sockfd) { return ::sslConnectionSetSocketDescriptor(c, sockfd, out_sockfd); } +Result ConnectionSetHostName(SslConnection *c, const char* str, u32 str_bufsize) { return ::sslConnectionSetHostName(c, str, str_bufsize); } +Result ConnectionSetVerifyOption(SslConnection *c, u32 verify_option) { return ::sslConnectionSetVerifyOption(c, verify_option); } +Result ConnectionSetIoMode(SslConnection *c, SslIoMode mode) { return ::sslConnectionSetIoMode(c, mode); } +Result ConnectionGetSocketDescriptor(SslConnection *c, int *sockfd) { return ::sslConnectionGetSocketDescriptor(c, sockfd); } +Result ConnectionGetHostName(SslConnection *c, char *str, u32 str_bufsize, u32 *out) { return ::sslConnectionGetHostName(c, str, str_bufsize, out); } +Result ConnectionGetVerifyOption(SslConnection *c, u32 *out) { return ::sslConnectionGetVerifyOption(c, out); } +Result ConnectionGetIoMode(SslConnection *c, SslIoMode *out) { return ::sslConnectionGetIoMode(c, out); } +Result ConnectionDoHandshake(SslConnection *c, u32 *out_size, u32 *total_certs, void* server_certbuf, u32 server_certbuf_size) { return ::sslConnectionDoHandshake(c, out_size, total_certs, server_certbuf, server_certbuf_size); } +Result ConnectionGetServerCertDetail(const void* certbuf, u32 certbuf_size, u32 cert_index, void** cert, u32 *cert_size) { return ::sslConnectionGetServerCertDetail(certbuf, certbuf_size, cert_index, cert, cert_size); } +Result ConnectionRead(SslConnection *c, void* buffer, u32 size, u32 *out_size) { return ::sslConnectionRead(c, buffer, size, out_size); } +Result ConnectionWrite(SslConnection *c, const void* buffer, u32 size, u32 *out_size) { return ::sslConnectionWrite(c, buffer, size, out_size); } +Result ConnectionPending(SslConnection *c, s32 *out) { return ::sslConnectionPending(c, out); } +Result ConnectionPeek(SslConnection *c, void* buffer, u32 size, u32 *out_size) { return ::sslConnectionPeek(c, buffer, size, out_size); } +Result ConnectionPoll(SslConnection *c, u32 in_pollevent, u32 *out_pollevent, u32 timeout) { return ::sslConnectionPoll(c, in_pollevent, out_pollevent, timeout); } +Result ConnectionGetVerifyCertError(SslConnection *c) { return ::sslConnectionGetVerifyCertError(c); } +Result ConnectionGetNeededServerCertBufferSize(SslConnection *c, u32 *out) { return ::sslConnectionGetNeededServerCertBufferSize(c, out); } +Result ConnectionSetSessionCacheMode(SslConnection *c, SslSessionCacheMode mode) { return ::sslConnectionSetSessionCacheMode(c, mode); } +Result ConnectionGetSessionCacheMode(SslConnection *c, SslSessionCacheMode *out) { return ::sslConnectionGetSessionCacheMode(c, out); } +Result ConnectionFlushSessionCache(SslConnection *c) { return ::sslConnectionFlushSessionCache(c); } +Result ConnectionSetRenegotiationMode(SslConnection *c, SslRenegotiationMode mode) { return ::sslConnectionSetRenegotiationMode(c, mode); } +Result ConnectionGetRenegotiationMode(SslConnection *c, SslRenegotiationMode *out) { return ::sslConnectionGetRenegotiationMode(c, out); } +Result ConnectionSetOption(SslConnection *c, SslOptionType option, bool flag) { return ::sslConnectionSetOption(c, option, flag); } +Result ConnectionGetOption(SslConnection *c, SslOptionType option, bool *out) { return ::sslConnectionGetOption(c, option, out); } +Result ConnectionGetVerifyCertErrors(SslConnection *c, u32 *out0, u32 *out1, Result *errors, u32 count) { return ::sslConnectionGetVerifyCertErrors(c, out0, out1, errors, count); } +Result ConnectionGetCipherInfo(SslConnection *c, SslCipherInfo *out) { return ::sslConnectionGetCipherInfo(c, out); } +Result ConnectionSetNextAlpnProto(SslConnection *c, const u8 *buffer, u32 size) { return ::sslConnectionSetNextAlpnProto(c, buffer, size); } +Result ConnectionGetNextAlpnProto(SslConnection *c, SslAlpnProtoState *state, u32 *out, u8 *buffer, u32 size) { return ::sslConnectionGetNextAlpnProto(c, state, out, buffer, size); } +Result ConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const void* buf, size_t size, int *out_sockfd) { return ::sslConnectionSetDtlsSocketDescriptor(c, sockfd, buf, size, out_sockfd); } +Result ConnectionGetDtlsHandshakeTimeout(SslConnection *c, u64 *out) { return ::sslConnectionGetDtlsHandshakeTimeout(c, out); } +Result ConnectionSetPrivateOption(SslConnection *c, SslPrivateOptionType option, u32 value) { return ::sslConnectionSetPrivateOption(c, option, value); } +Result ConnectionSetSrtpCiphers(SslConnection *c, const u16 *ciphers, u32 count) { return ::sslConnectionSetSrtpCiphers(c, ciphers, count); } +Result ConnectionGetSrtpCipher(SslConnection *c, u16 *out) { return ::sslConnectionGetSrtpCipher(c, out); } +Result ConnectionExportKeyingMaterial(SslConnection *c, u8 *outbuf, u32 outbuf_size, const char *label, u32 label_size, const void* context, u32 context_size) { return ::sslConnectionExportKeyingMaterial(c, outbuf, outbuf_size, label, label_size, context, context_size); } +Result ConnectionSetIoTimeout(SslConnection *c, u32 timeout) { return ::sslConnectionSetIoTimeout(c, timeout); } +Result ConnectionGetIoTimeout(SslConnection *c, u32 *out) { return ::sslConnectionGetIoTimeout(c, out); } + +} // namespace ssl + +namespace svc { + +Result SetHeapSize(void** out_addr, u64 size) { return ::svcSetHeapSize(out_addr, size); } +Result SetMemoryPermission(void* addr, u64 size, u32 perm) { return ::svcSetMemoryPermission(addr, size, perm); } +Result SetMemoryAttribute(void* addr, u64 size, u32 val0, u32 val1) { return ::svcSetMemoryAttribute(addr, size, val0, val1); } +Result MapMemory(void* dst_addr, void* src_addr, u64 size) { return ::svcMapMemory(dst_addr, src_addr, size); } +Result UnmapMemory(void* dst_addr, void* src_addr, u64 size) { return ::svcUnmapMemory(dst_addr, src_addr, size); } +Result QueryMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, u64 addr) { return ::svcQueryMemory(meminfo_ptr, pageinfo, addr); } +[[noreturn]] void ExitProcess(void) { ::svcExitProcess(); } +Result CreateThread(Handle* out, void* entry, void* arg, void* stack_top, int prio, int cpuid) { return ::svcCreateThread(out, entry, arg, stack_top, prio, cpuid); } +Result StartThread(Handle handle) { return ::svcStartThread(handle); } +[[noreturn]] void ExitThread(void) { ::svcExitThread(); } +void SleepThread(s64 nano) { ::svcSleepThread(nano); } +Result GetThreadPriority(s32* priority, Handle handle) { return ::svcGetThreadPriority(priority, handle); } +Result SetThreadPriority(Handle handle, u32 priority) { return ::svcSetThreadPriority(handle, priority); } +Result GetThreadCoreMask(s32* preferred_core, u64* affinity_mask, Handle handle) { return ::svcGetThreadCoreMask(preferred_core, affinity_mask, handle); } +Result SetThreadCoreMask(Handle handle, s32 preferred_core, u32 affinity_mask) { return ::svcSetThreadCoreMask(handle, preferred_core, affinity_mask); } +u32 GetCurrentProcessorNumber(void) { return ::svcGetCurrentProcessorNumber(); } +Result SignalEvent(Handle handle) { return ::svcSignalEvent(handle); } +Result ClearEvent(Handle handle) { return ::svcClearEvent(handle); } +Result MapSharedMemory(Handle handle, void* addr, size_t size, u32 perm) { return ::svcMapSharedMemory(handle, addr, size, perm); } +Result UnmapSharedMemory(Handle handle, void* addr, size_t size) { return ::svcUnmapSharedMemory(handle, addr, size); } +Result CreateTransferMemory(Handle* out, void* addr, size_t size, u32 perm) { return ::svcCreateTransferMemory(out, addr, size, perm); } +Result CloseHandle(Handle handle) { return ::svcCloseHandle(handle); } +Result ResetSignal(Handle handle) { return ::svcResetSignal(handle); } +Result WaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout) { return ::svcWaitSynchronization(index, handles, handleCount, timeout); } +Result WaitSynchronizationSingle(Handle handle, u64 timeout) { return ::svcWaitSynchronizationSingle(handle, timeout); } +Result CancelSynchronization(Handle thread) { return ::svcCancelSynchronization(thread); } +Result ArbitrateLock(u32 wait_tag, u32* tag_location, u32 self_tag) { return ::svcArbitrateLock(wait_tag, tag_location, self_tag); } +Result ArbitrateUnlock(u32* tag_location) { return ::svcArbitrateUnlock(tag_location); } +Result WaitProcessWideKeyAtomic(u32* key, u32* tag_location, u32 self_tag, u64 timeout) { return ::svcWaitProcessWideKeyAtomic(key, tag_location, self_tag, timeout); } +void SignalProcessWideKey(u32* key, s32 num) { ::svcSignalProcessWideKey(key, num); } +u64 GetSystemTick(void) { return ::svcGetSystemTick(); } +Result ConnectToNamedPort(Handle* session, const char* name) { return ::svcConnectToNamedPort(session, name); } +Result SendSyncRequestLight(Handle session) { return ::svcSendSyncRequestLight(session); } +Result SendSyncRequest(Handle session) { return ::svcSendSyncRequest(session); } +Result SendSyncRequestWithUserBuffer(void* usrBuffer, u64 size, Handle session) { return ::svcSendSyncRequestWithUserBuffer(usrBuffer, size, session); } +Result SendAsyncRequestWithUserBuffer(Handle* handle, void* usrBuffer, u64 size, Handle session) { return ::svcSendAsyncRequestWithUserBuffer(handle, usrBuffer, size, session); } +Result GetProcessId(u64 *processID, Handle handle) { return ::svcGetProcessId(processID, handle); } +Result GetThreadId(u64 *threadID, Handle handle) { return ::svcGetThreadId(threadID, handle); } +Result Break(u32 breakReason, uintptr_t address, uintptr_t size) { return ::svcBreak(breakReason, address, size); } +Result OutputDebugString(const char *str, u64 size) { return ::svcOutputDebugString(str, size); } +[[noreturn]] void ReturnFromException(Result res) { ::svcReturnFromException(res); } +Result GetInfo(u64* out, u32 id0, Handle handle, u64 id1) { return ::svcGetInfo(out, id0, handle, id1); } +void FlushEntireDataCache(void) { ::svcFlushEntireDataCache(); } +Result FlushDataCache(void *address, size_t size) { return ::svcFlushDataCache(address, size); } +Result MapPhysicalMemory(void *address, u64 size) { return ::svcMapPhysicalMemory(address, size); } +Result UnmapPhysicalMemory(void *address, u64 size) { return ::svcUnmapPhysicalMemory(address, size); } +Result GetDebugFutureThreadInfo(LastThreadContext *out_context, u64 *out_thread_id, Handle debug, s64 ns) { return ::svcGetDebugFutureThreadInfo(out_context, out_thread_id, debug, ns); } +Result GetLastThreadInfo(LastThreadContext *out_context, u64 *out_tls_address, u32 *out_flags) { return ::svcGetLastThreadInfo(out_context, out_tls_address, out_flags); } +Result GetResourceLimitLimitValue(s64 *out, Handle reslimit_h, LimitableResource which) { return ::svcGetResourceLimitLimitValue(out, reslimit_h, which); } +Result GetResourceLimitCurrentValue(s64 *out, Handle reslimit_h, LimitableResource which) { return ::svcGetResourceLimitCurrentValue(out, reslimit_h, which); } +Result SetThreadActivity(Handle thread, ThreadActivity paused) { return ::svcSetThreadActivity(thread, paused); } +Result GetThreadContext3(ThreadContext* ctx, Handle thread) { return ::svcGetThreadContext3(ctx, thread); } +Result WaitForAddress(void *address, u32 arb_type, s64 value, s64 timeout) { return ::svcWaitForAddress(address, arb_type, value, timeout); } +Result SignalToAddress(void *address, u32 signal_type, s32 value, s32 count) { return ::svcSignalToAddress(address, signal_type, value, count); } +void SynchronizePreemptionState(void) { ::svcSynchronizePreemptionState(); } +Result GetResourceLimitPeakValue(s64 *out, Handle reslimit_h, LimitableResource which) { return ::svcGetResourceLimitPeakValue(out, reslimit_h, which); } +Result CreateIoPool(Handle *out_handle, u32 pool_type) { return ::svcCreateIoPool(out_handle, pool_type); } +Result CreateIoRegion(Handle *out_handle, Handle io_pool_h, u64 physical_address, u64 size, u32 memory_mapping, u32 perm) { return ::svcCreateIoRegion(out_handle, io_pool_h, physical_address, size, memory_mapping, perm); } +void DumpInfo(u32 dump_info_type, u64 arg0) { ::svcDumpInfo(dump_info_type, arg0); } +void KernelDebug(u32 kern_debug_type, u64 arg0, u64 arg1, u64 arg2) { ::svcKernelDebug(kern_debug_type, arg0, arg1, arg2); } +void ChangeKernelTraceState(u32 kern_trace_state) { ::svcChangeKernelTraceState(kern_trace_state); } +Result CreateSession(Handle *server_handle, Handle *client_handle, u32 unk0, u64 unk1) { return ::svcCreateSession(server_handle, client_handle, unk0, unk1); } +Result AcceptSession(Handle *session_handle, Handle port_handle) { return ::svcAcceptSession(session_handle, port_handle); } +Result ReplyAndReceiveLight(Handle handle) { return ::svcReplyAndReceiveLight(handle); } +Result ReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout) { return ::svcReplyAndReceive(index, handles, handleCount, replyTarget, timeout); } +Result ReplyAndReceiveWithUserBuffer(s32* index, void* usrBuffer, u64 size, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout) { return ::svcReplyAndReceiveWithUserBuffer(index, usrBuffer, size, handles, handleCount, replyTarget, timeout); } +Result CreateEvent(Handle* server_handle, Handle* client_handle) { return ::svcCreateEvent(server_handle, client_handle); } +Result MapIoRegion(Handle io_region_h, void *address, u64 size, u32 perm) { return ::svcMapIoRegion(io_region_h, address, size, perm); } +Result UnmapIoRegion(Handle io_region_h, void *address, u64 size) { return ::svcUnmapIoRegion(io_region_h, address, size); } +Result MapPhysicalMemoryUnsafe(void *address, u64 size) { return ::svcMapPhysicalMemoryUnsafe(address, size); } +Result UnmapPhysicalMemoryUnsafe(void *address, u64 size) { return ::svcUnmapPhysicalMemoryUnsafe(address, size); } +Result SetUnsafeLimit(u64 size) { return ::svcSetUnsafeLimit(size); } +Result CreateCodeMemory(Handle* code_handle, void* src_addr, u64 size) { return ::svcCreateCodeMemory(code_handle, src_addr, size); } +Result ControlCodeMemory(Handle code_handle, CodeMapOperation op, void* dst_addr, u64 size, u64 perm) { return ::svcControlCodeMemory(code_handle, op, dst_addr, size, perm); } +void SleepSystem(void) { ::svcSleepSystem(); } +Result ReadWriteRegister(u32* outVal, u64 regAddr, u32 rwMask, u32 inVal) { return ::svcReadWriteRegister(outVal, regAddr, rwMask, inVal); } +Result SetProcessActivity(Handle process, ProcessActivity paused) { return ::svcSetProcessActivity(process, paused); } +Result CreateSharedMemory(Handle* out, size_t size, u32 local_perm, u32 other_perm) { return ::svcCreateSharedMemory(out, size, local_perm, other_perm); } +Result MapTransferMemory(Handle tmem_handle, void* addr, size_t size, u32 perm) { return ::svcMapTransferMemory(tmem_handle, addr, size, perm); } +Result UnmapTransferMemory(Handle tmem_handle, void* addr, size_t size) { return ::svcUnmapTransferMemory(tmem_handle, addr, size); } +Result CreateInterruptEvent(Handle* handle, u64 irqNum, u32 flag) { return ::svcCreateInterruptEvent(handle, irqNum, flag); } +Result QueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr) { return ::svcQueryPhysicalAddress(out, virtaddr); } +Result QueryMemoryMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size) { return ::svcQueryMemoryMapping(virtaddr, out_size, physaddr, size); } +Result LegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size) { return ::svcLegacyQueryIoMapping(virtaddr, physaddr, size); } +Result CreateDeviceAddressSpace(Handle *handle, u64 dev_addr, u64 dev_size) { return ::svcCreateDeviceAddressSpace(handle, dev_addr, dev_size); } +Result AttachDeviceAddressSpace(u64 device, Handle handle) { return ::svcAttachDeviceAddressSpace(device, handle); } +Result DetachDeviceAddressSpace(u64 device, Handle handle) { return ::svcDetachDeviceAddressSpace(device, handle); } +Result MapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option) { return ::svcMapDeviceAddressSpaceByForce(handle, proc_handle, map_addr, dev_size, dev_addr, option); } +Result MapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option) { return ::svcMapDeviceAddressSpaceAligned(handle, proc_handle, map_addr, dev_size, dev_addr, option); } +Result MapDeviceAddressSpace(u64 *out_mapped_size, Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm) { return ::svcMapDeviceAddressSpace(out_mapped_size, handle, proc_handle, map_addr, dev_size, dev_addr, perm); } +Result UnmapDeviceAddressSpace(Handle handle, Handle proc_handle, u64 map_addr, u64 map_size, u64 dev_addr) { return ::svcUnmapDeviceAddressSpace(handle, proc_handle, map_addr, map_size, dev_addr); } +Result InvalidateProcessDataCache(Handle process, uintptr_t address, size_t size) { return ::svcInvalidateProcessDataCache(process, address, size); } +Result StoreProcessDataCache(Handle process, uintptr_t address, size_t size) { return ::svcStoreProcessDataCache(process, address, size); } +Result FlushProcessDataCache(Handle process, uintptr_t address, size_t size) { return ::svcFlushProcessDataCache(process, address, size); } +Result DebugActiveProcess(Handle* debug, u64 processID) { return ::svcDebugActiveProcess(debug, processID); } +Result BreakDebugProcess(Handle debug) { return ::svcBreakDebugProcess(debug); } +Result TerminateDebugProcess(Handle debug) { return ::svcTerminateDebugProcess(debug); } +Result GetDebugEvent(DebugEventInfo* event_out, Handle debug) { return ::svcGetDebugEvent(event_out, debug); } +Result ContinueDebugEvent(Handle debug, u32 flags, u64* tid_list, u32 num_tids) { return ::svcContinueDebugEvent(debug, flags, tid_list, num_tids); } +Result LegacyContinueDebugEvent(Handle debug, u32 flags, u64 threadID) { return ::svcLegacyContinueDebugEvent(debug, flags, threadID); } +Result GetDebugThreadContext(ThreadContext* ctx, Handle debug, u64 threadID, u32 flags) { return ::svcGetDebugThreadContext(ctx, debug, threadID, flags); } +Result SetDebugThreadContext(Handle debug, u64 threadID, const ThreadContext* ctx, u32 flags) { return ::svcSetDebugThreadContext(debug, threadID, ctx, flags); } +Result GetProcessList(s32 *num_out, u64 *pids_out, u32 max_pids) { return ::svcGetProcessList(num_out, pids_out, max_pids); } +Result GetThreadList(s32 *num_out, u64 *tids_out, u32 max_tids, Handle debug) { return ::svcGetThreadList(num_out, tids_out, max_tids, debug); } +Result QueryDebugProcessMemory(MemoryInfo* meminfo_ptr, u32* pageinfo, Handle debug, u64 addr) { return ::svcQueryDebugProcessMemory(meminfo_ptr, pageinfo, debug, addr); } +Result ReadDebugProcessMemory(void* buffer, Handle debug, u64 addr, u64 size) { return ::svcReadDebugProcessMemory(buffer, debug, addr, size); } +Result WriteDebugProcessMemory(Handle debug, const void* buffer, u64 addr, u64 size) { return ::svcWriteDebugProcessMemory(debug, buffer, addr, size); } +Result SetHardwareBreakPoint(u32 which, u64 flags, u64 value) { return ::svcSetHardwareBreakPoint(which, flags, value); } +Result GetDebugThreadParam(u64* out_64, u32* out_32, Handle debug, u64 threadID, DebugThreadParam param) { return ::svcGetDebugThreadParam(out_64, out_32, debug, threadID, param); } +Result GetSystemInfo(u64* out, u64 id0, Handle handle, u64 id1) { return ::svcGetSystemInfo(out, id0, handle, id1); } +Result CreatePort(Handle* portServer, Handle *portClient, s32 max_sessions, bool is_light, const char* name) { return ::svcCreatePort(portServer, portClient, max_sessions, is_light, name); } +Result ManageNamedPort(Handle* portServer, const char* name, s32 maxSessions) { return ::svcManageNamedPort(portServer, name, maxSessions); } +Result ConnectToPort(Handle* session, Handle port) { return ::svcConnectToPort(session, port); } +Result SetProcessMemoryPermission(Handle proc, u64 addr, u64 size, u32 perm) { return ::svcSetProcessMemoryPermission(proc, addr, size, perm); } +Result MapProcessMemory(void* dst, Handle proc, u64 src, u64 size) { return ::svcMapProcessMemory(dst, proc, src, size); } +Result UnmapProcessMemory(void* dst, Handle proc, u64 src, u64 size) { return ::svcUnmapProcessMemory(dst, proc, src, size); } +Result QueryProcessMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, Handle proc, u64 addr) { return ::svcQueryProcessMemory(meminfo_ptr, pageinfo, proc, addr); } +Result MapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size) { return ::svcMapProcessCodeMemory(proc, dst, src, size); } +Result UnmapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size) { return ::svcUnmapProcessCodeMemory(proc, dst, src, size); } +Result CreateProcess(Handle* out, const void* proc_info, const u32* caps, u64 cap_num) { return ::svcCreateProcess(out, proc_info, caps, cap_num); } +Result StartProcess(Handle proc, s32 main_prio, s32 default_cpu, u32 stack_size) { return ::svcStartProcess(proc, main_prio, default_cpu, stack_size); } +Result TerminateProcess(Handle proc) { return ::svcTerminateProcess(proc); } +Result GetProcessInfo(s64 *out, Handle proc, ProcessInfoType which) { return ::svcGetProcessInfo(out, proc, which); } +Result CreateResourceLimit(Handle* out) { return ::svcCreateResourceLimit(out); } +Result SetResourceLimitLimitValue(Handle reslimit, LimitableResource which, u64 value) { return ::svcSetResourceLimitLimitValue(reslimit, which, value); } +void CallSecureMonitor(SecmonArgs* regs) { ::svcCallSecureMonitor(regs); } +Result MapInsecurePhysicalMemory(void *address, u64 size) { return ::svcMapInsecurePhysicalMemory(address, size); } +Result UnmapInsecurePhysicalMemory(void *address, u64 size) { return ::svcUnmapInsecurePhysicalMemory(address, size); } + +} // namespace svc + +namespace swkbd { + +Result Create(SwkbdConfig* c, s32 max_dictwords) { return ::swkbdCreate(c, max_dictwords); } +void Close(SwkbdConfig* c) { ::swkbdClose(c); } +void ConfigMakePresetDefault(SwkbdConfig* c) { ::swkbdConfigMakePresetDefault(c); } +void ConfigMakePresetPassword(SwkbdConfig* c) { ::swkbdConfigMakePresetPassword(c); } +void ConfigMakePresetUserName(SwkbdConfig* c) { ::swkbdConfigMakePresetUserName(c); } +void ConfigMakePresetDownloadCode(SwkbdConfig* c) { ::swkbdConfigMakePresetDownloadCode(c); } +void ConfigSetOkButtonText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetOkButtonText(c, str); } +void ConfigSetLeftOptionalSymbolKey(SwkbdConfig* c, const char* str) { ::swkbdConfigSetLeftOptionalSymbolKey(c, str); } +void ConfigSetRightOptionalSymbolKey(SwkbdConfig* c, const char* str) { ::swkbdConfigSetRightOptionalSymbolKey(c, str); } +void ConfigSetHeaderText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetHeaderText(c, str); } +void ConfigSetSubText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetSubText(c, str); } +void ConfigSetGuideText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetGuideText(c, str); } +void ConfigSetInitialText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetInitialText(c, str); } +void ConfigSetDictionary(SwkbdConfig* c, const SwkbdDictWord *input, s32 entries) { ::swkbdConfigSetDictionary(c, input, entries); } +Result ConfigSetCustomizedDictionaries(SwkbdConfig* c, const SwkbdCustomizedDictionarySet *dic) { return ::swkbdConfigSetCustomizedDictionaries(c, dic); } +void ConfigSetTextCheckCallback(SwkbdConfig* c, SwkbdTextCheckCb cb) { ::swkbdConfigSetTextCheckCallback(c, cb); } +void ConfigSetType(SwkbdConfig* c, SwkbdType type) { ::swkbdConfigSetType(c, type); } +void ConfigSetDicFlag(SwkbdConfig* c, u8 flag) { ::swkbdConfigSetDicFlag(c, flag); } +void ConfigSetKeySetDisableBitmask(SwkbdConfig* c, u32 keySetDisableBitmask) { ::swkbdConfigSetKeySetDisableBitmask(c, keySetDisableBitmask); } +void ConfigSetInitialCursorPos(SwkbdConfig* c, u32 initialCursorPos) { ::swkbdConfigSetInitialCursorPos(c, initialCursorPos); } +void ConfigSetStringLenMax(SwkbdConfig* c, u32 stringLenMax) { ::swkbdConfigSetStringLenMax(c, stringLenMax); } +void ConfigSetStringLenMin(SwkbdConfig* c, u32 stringLenMin) { ::swkbdConfigSetStringLenMin(c, stringLenMin); } +void ConfigSetPasswordFlag(SwkbdConfig* c, u32 flag) { ::swkbdConfigSetPasswordFlag(c, flag); } +void ConfigSetTextDrawType(SwkbdConfig* c, SwkbdTextDrawType textDrawType) { ::swkbdConfigSetTextDrawType(c, textDrawType); } +void ConfigSetReturnButtonFlag(SwkbdConfig* c, u16 flag) { ::swkbdConfigSetReturnButtonFlag(c, flag); } +void ConfigSetBlurBackground(SwkbdConfig* c, u8 blurBackground) { ::swkbdConfigSetBlurBackground(c, blurBackground); } +void ConfigSetTextGrouping(SwkbdConfig* c, u32 index, u32 value) { ::swkbdConfigSetTextGrouping(c, index, value); } +void ConfigSetUnkFlag(SwkbdConfig* c, u8 flag) { ::swkbdConfigSetUnkFlag(c, flag); } +void ConfigSetTrigger(SwkbdConfig* c, u8 trigger) { ::swkbdConfigSetTrigger(c, trigger); } +Result Show(SwkbdConfig* c, char* out_string, size_t out_string_size) { return ::swkbdShow(c, out_string, out_string_size); } +Result InlineCreate(SwkbdInline* s) { return ::swkbdInlineCreate(s); } +Result InlineClose(SwkbdInline* s) { return ::swkbdInlineClose(s); } +Result InlineLaunch(SwkbdInline* s) { return ::swkbdInlineLaunch(s); } +Result InlineLaunchForLibraryApplet(SwkbdInline* s, u8 mode, u8 unk_x5) { return ::swkbdInlineLaunchForLibraryApplet(s, mode, unk_x5); } +void InlineGetWindowSize(s32 *width, s32 *height) { ::swkbdInlineGetWindowSize(width, height); } +Result InlineGetImageMemoryRequirement(u64 *out_size, u64 *out_alignment) { return ::swkbdInlineGetImageMemoryRequirement(out_size, out_alignment); } +Result InlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_available) { return ::swkbdInlineGetImage(s, buffer, size, data_available); } +s32 InlineGetMaxHeight(SwkbdInline* s) { return ::swkbdInlineGetMaxHeight(s); } +s32 InlineGetMiniaturizedHeight(SwkbdInline* s) { return ::swkbdInlineGetMiniaturizedHeight(s); } +s32 InlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *footer) { return ::swkbdInlineGetTouchRectangles(s, keytop, footer); } +bool InlineIsUsedTouchPointByKeyboard(SwkbdInline* s, s32 x, s32 y) { return ::swkbdInlineIsUsedTouchPointByKeyboard(s, x, y); } +Result InlineUpdate(SwkbdInline* s, SwkbdState* out_state) { return ::swkbdInlineUpdate(s, out_state); } +void InlineSetFinishedInitializeCallback(SwkbdInline* s, VoidFn cb) { ::swkbdInlineSetFinishedInitializeCallback(s, cb); } +void InlineSetDecidedCancelCallback(SwkbdInline* s, VoidFn cb) { ::swkbdInlineSetDecidedCancelCallback(s, cb); } +void InlineSetChangedStringCallback(SwkbdInline* s, SwkbdChangedStringCb cb) { ::swkbdInlineSetChangedStringCallback(s, cb); } +void InlineSetChangedStringV2Callback(SwkbdInline* s, SwkbdChangedStringV2Cb cb) { ::swkbdInlineSetChangedStringV2Callback(s, cb); } +void InlineSetMovedCursorCallback(SwkbdInline* s, SwkbdMovedCursorCb cb) { ::swkbdInlineSetMovedCursorCallback(s, cb); } +void InlineSetMovedCursorV2Callback(SwkbdInline* s, SwkbdMovedCursorV2Cb cb) { ::swkbdInlineSetMovedCursorV2Callback(s, cb); } +void InlineSetMovedTabCallback(SwkbdInline* s, SwkbdMovedTabCb cb) { ::swkbdInlineSetMovedTabCallback(s, cb); } +void InlineSetDecidedEnterCallback(SwkbdInline* s, SwkbdDecidedEnterCb cb) { ::swkbdInlineSetDecidedEnterCallback(s, cb); } +void InlineSetReleasedUserWordInfoCallback(SwkbdInline* s, VoidFn cb) { ::swkbdInlineSetReleasedUserWordInfoCallback(s, cb); } +void InlineAppear(SwkbdInline* s, const SwkbdAppearArg* arg) { ::swkbdInlineAppear(s, arg); } +void InlineAppearEx(SwkbdInline* s, const SwkbdAppearArg* arg, u8 trigger) { ::swkbdInlineAppearEx(s, arg, trigger); } +void InlineDisappear(SwkbdInline* s) { ::swkbdInlineDisappear(s); } +void InlineMakeAppearArg(SwkbdAppearArg* arg, SwkbdType type) { ::swkbdInlineMakeAppearArg(arg, type); } +void InlineAppearArgSetOkButtonText(SwkbdAppearArg* arg, const char* str) { ::swkbdInlineAppearArgSetOkButtonText(arg, str); } +void InlineAppearArgSetLeftButtonText(SwkbdAppearArg* arg, const char* str) { ::swkbdInlineAppearArgSetLeftButtonText(arg, str); } +void InlineAppearArgSetRightButtonText(SwkbdAppearArg* arg, const char* str) { ::swkbdInlineAppearArgSetRightButtonText(arg, str); } +void InlineAppearArgSetStringLenMax(SwkbdAppearArg* arg, s32 stringLenMax) { ::swkbdInlineAppearArgSetStringLenMax(arg, stringLenMax); } +void InlineAppearArgSetStringLenMin(SwkbdAppearArg* arg, s32 stringLenMin) { ::swkbdInlineAppearArgSetStringLenMin(arg, stringLenMin); } +void InlineSetVolume(SwkbdInline* s, float volume) { ::swkbdInlineSetVolume(s, volume); } +void InlineSetInputText(SwkbdInline* s, const char* str) { ::swkbdInlineSetInputText(s, str); } +void InlineSetCursorPos(SwkbdInline* s, s32 pos) { ::swkbdInlineSetCursorPos(s, pos); } +Result InlineSetUserWordInfo(SwkbdInline* s, const SwkbdDictWord *input, s32 entries) { return ::swkbdInlineSetUserWordInfo(s, input, entries); } +Result InlineUnsetUserWordInfo(SwkbdInline* s) { return ::swkbdInlineUnsetUserWordInfo(s); } +void InlineSetUtf8Mode(SwkbdInline* s, bool flag) { ::swkbdInlineSetUtf8Mode(s, flag); } +Result InlineSetCustomizeDic(SwkbdInline* s, void* buffer, size_t size, SwkbdCustomizeDicInfo *info) { return ::swkbdInlineSetCustomizeDic(s, buffer, size, info); } +void InlineUnsetCustomizeDic(SwkbdInline* s) { ::swkbdInlineUnsetCustomizeDic(s); } +Result InlineSetCustomizedDictionaries(SwkbdInline* s, const SwkbdCustomizedDictionarySet *dic) { return ::swkbdInlineSetCustomizedDictionaries(s, dic); } +Result InlineUnsetCustomizedDictionaries(SwkbdInline* s) { return ::swkbdInlineUnsetCustomizedDictionaries(s); } +void InlineSetInputModeFadeType(SwkbdInline* s, u8 type) { ::swkbdInlineSetInputModeFadeType(s, type); } +void InlineSetAlphaEnabledInInputMode(SwkbdInline* s, bool flag) { ::swkbdInlineSetAlphaEnabledInInputMode(s, flag); } +void InlineSetKeytopBgAlpha(SwkbdInline* s, float alpha) { ::swkbdInlineSetKeytopBgAlpha(s, alpha); } +void InlineSetFooterBgAlpha(SwkbdInline* s, float alpha) { ::swkbdInlineSetFooterBgAlpha(s, alpha); } +void InlineSetKeytopScale(SwkbdInline* s, float scale) { ::swkbdInlineSetKeytopScale(s, scale); } +void InlineSetKeytopTranslate(SwkbdInline* s, float x, float y) { ::swkbdInlineSetKeytopTranslate(s, x, y); } +void InlineSetKeytopAsFloating(SwkbdInline* s, bool flag) { ::swkbdInlineSetKeytopAsFloating(s, flag); } +void InlineSetFooterScalable(SwkbdInline* s, bool flag) { ::swkbdInlineSetFooterScalable(s, flag); } +void InlineSetTouchFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetTouchFlag(s, flag); } +void InlineSetHardwareKeyboardFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetHardwareKeyboardFlag(s, flag); } +void InlineSetDirectionalButtonAssignFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetDirectionalButtonAssignFlag(s, flag); } +void InlineSetSeGroup(SwkbdInline* s, u8 seGroup, bool flag) { ::swkbdInlineSetSeGroup(s, seGroup, flag); } +void InlineSetBackspaceFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetBackspaceFlag(s, flag); } + +} // namespace swkbd + +namespace tc { + +Result Initialize(void) { return ::tcInitialize(); } +void Exit(void) { ::tcExit(); } +Service* GetServiceSession(void) { return ::tcGetServiceSession(); } +Result EnableFanControl(void) { return ::tcEnableFanControl(); } +Result DisableFanControl(void) { return ::tcDisableFanControl(); } +Result IsFanControlEnabled(bool *status) { return ::tcIsFanControlEnabled(status); } +Result GetSkinTemperatureMilliC(s32 *skinTemp) { return ::tcGetSkinTemperatureMilliC(skinTemp); } + +} // namespace tc + +namespace thread { + +bool ContextIsAArch64(const ThreadContext *ctx) { return ::threadContextIsAArch64(ctx); } +bool ExceptionIsAArch64(const ThreadExceptionDump *ctx) { return ::threadExceptionIsAArch64(ctx); } +Result Create(Thread* t, ThreadFunc entry, void* arg, void *stack_mem, size_t stack_sz, int prio, int cpuid) { return ::threadCreate(t, entry, arg, stack_mem, stack_sz, prio, cpuid); } +Result Start(Thread* t) { return ::threadStart(t); } +[[noreturn]] void Exit(void) { ::threadExit(); } +Result WaitForExit(Thread* t) { return ::threadWaitForExit(t); } +Result Close(Thread* t) { return ::threadClose(t); } +Result Pause(Thread* t) { return ::threadPause(t); } +Result Resume(Thread* t) { return ::threadResume(t); } +Result DumpContext(ThreadContext* ctx, Thread* t) { return ::threadDumpContext(ctx, t); } +Thread * GetSelf(void) { return ::threadGetSelf(); } +Handle GetCurHandle(void) { return ::threadGetCurHandle(); } +s32 TlsAlloc(void (* destructor)(void*)) { return ::threadTlsAlloc(destructor); } +void* TlsGet(s32 slot_id) { return ::threadTlsGet(slot_id); } +void TlsSet(s32 slot_id, void* value) { ::threadTlsSet(slot_id, value); } +void TlsFree(s32 slot_id) { ::threadTlsFree(slot_id); } + +} // namespace thread + +namespace time { + +Result Initialize(void) { return ::timeInitialize(); } +void Exit(void) { ::timeExit(); } +Service* GetServiceSession(void) { return ::timeGetServiceSession(); } +Service* GetServiceSession_SystemClock(TimeType type) { return ::timeGetServiceSession_SystemClock(type); } +Service* GetServiceSession_SteadyClock(void) { return ::timeGetServiceSession_SteadyClock(); } +Service* GetServiceSession_TimeZoneService(void) { return ::timeGetServiceSession_TimeZoneService(); } +void* GetSharedmemAddr(void) { return ::timeGetSharedmemAddr(); } +Result GetStandardSteadyClockTimePoint(TimeSteadyClockTimePoint *out) { return ::timeGetStandardSteadyClockTimePoint(out); } +Result GetStandardSteadyClockInternalOffset(s64 *out) { return ::timeGetStandardSteadyClockInternalOffset(out); } +Result GetCurrentTime(TimeType type, u64 *timestamp) { return ::timeGetCurrentTime(type, timestamp); } +Result SetCurrentTime(TimeType type, u64 timestamp) { return ::timeSetCurrentTime(type, timestamp); } +Result GetDeviceLocationName(TimeLocationName *name) { return ::timeGetDeviceLocationName(name); } +Result SetDeviceLocationName(const TimeLocationName *name) { return ::timeSetDeviceLocationName(name); } +Result GetTotalLocationNameCount(s32 *total_location_name_count) { return ::timeGetTotalLocationNameCount(total_location_name_count); } +Result LoadLocationNameList(s32 index, TimeLocationName *location_name_array, s32 location_name_max, s32 *location_name_count) { return ::timeLoadLocationNameList(index, location_name_array, location_name_max, location_name_count); } +Result LoadTimeZoneRule(const TimeLocationName *name, TimeZoneRule *rule) { return ::timeLoadTimeZoneRule(name, rule); } +Result ToCalendarTime(const TimeZoneRule *rule, u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info) { return ::timeToCalendarTime(rule, timestamp, caltime, info); } +Result ToCalendarTimeWithMyRule(u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info) { return ::timeToCalendarTimeWithMyRule(timestamp, caltime, info); } +Result ToPosixTime(const TimeZoneRule *rule, const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count) { return ::timeToPosixTime(rule, caltime, timestamp_list, timestamp_list_count, timestamp_count); } +Result ToPosixTimeWithMyRule(const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count) { return ::timeToPosixTimeWithMyRule(caltime, timestamp_list, timestamp_list_count, timestamp_count); } + +} // namespace time + +namespace tipc { + +void Create(TipcService* s, Handle h) { ::tipcCreate(s, h); } +void Close(TipcService* s) { ::tipcClose(s); } +void RequestInBuffer(HipcRequest* req, const void* buffer, size_t size, HipcBufferMode mode) { ::tipcRequestInBuffer(req, buffer, size, mode); } +void RequestOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::tipcRequestOutBuffer(req, buffer, size, mode); } +void RequestInOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::tipcRequestInOutBuffer(req, buffer, size, mode); } +void RequestHandle(HipcRequest* req, Handle handle) { ::tipcRequestHandle(req, handle); } +void RequestFormatProcessBuffer(TipcRequestFormat* fmt, u32 attr) { ::_tipcRequestFormatProcessBuffer(fmt, attr); } +void RequestProcessBuffer(HipcRequest* req, const SfBuffer* buf, u32 attr) { ::_tipcRequestProcessBuffer(req, buf, attr); } +void* MakeRequest(u32 request_id, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_handles, const Handle* handles) { return ::tipcMakeRequest(request_id, data_size, send_pid, buffer_attrs, buffers, num_handles, handles); } +Handle ResponseGetCopyHandle(HipcResponse* res) { return ::tipcResponseGetCopyHandle(res); } +Handle ResponseGetMoveHandle(HipcResponse* res) { return ::tipcResponseGetMoveHandle(res); } +void ResponseGetHandle(HipcResponse* res, SfOutHandleAttr type, Handle* out) { ::_tipcResponseGetHandle(res, type, out); } +Result ParseResponse(u32 out_size, void** out_data, u32 num_out_objects, TipcService* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles) { return ::tipcParseResponse(out_size, out_data, num_out_objects, out_objects, out_handle_attrs, out_handles); } +Result DispatchImpl(TipcService* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, TipcDispatchParams disp) { return ::tipcDispatchImpl(s, request_id, in_data, in_data_size, out_data, out_data_size, disp); } + +} // namespace tipc + +namespace tmem { + +Result Create(TransferMemory* t, size_t size, Permission perm) { return ::tmemCreate(t, size, perm); } +Result CreateFromMemory(TransferMemory* t, void* buf, size_t size, Permission perm) { return ::tmemCreateFromMemory(t, buf, size, perm); } +void LoadRemote(TransferMemory* t, Handle handle, size_t size, Permission perm) { ::tmemLoadRemote(t, handle, size, perm); } +Result Map(TransferMemory* t) { return ::tmemMap(t); } +Result Unmap(TransferMemory* t) { return ::tmemUnmap(t); } +void* GetAddr(TransferMemory* t) { return ::tmemGetAddr(t); } +Result CloseHandle(TransferMemory* t) { return ::tmemCloseHandle(t); } +Result WaitForPermission(TransferMemory* t, Permission perm) { return ::tmemWaitForPermission(t, perm); } +Result Close(TransferMemory* t) { return ::tmemClose(t); } + +} // namespace tmem + +namespace ts { + +Result Initialize(void) { return ::tsInitialize(); } +void Exit(void) { ::tsExit(); } +Service* GetServiceSession(void) { return ::tsGetServiceSession(); } +Result GetTemperatureRange(TsLocation location, s32 *min_temperature, s32 *max_temperature) { return ::tsGetTemperatureRange(location, min_temperature, max_temperature); } +Result GetTemperature(TsLocation location, s32 *temperature) { return ::tsGetTemperature(location, temperature); } +Result GetTemperatureMilliC(TsLocation location, s32 *temperature) { return ::tsGetTemperatureMilliC(location, temperature); } +Result OpenSession(TsSession *s, u32 device_code) { return ::tsOpenSession(s, device_code); } +Result SessionGetTemperature(TsSession *s, float *temperature) { return ::tsSessionGetTemperature(s, temperature); } +void SessionClose(TsSession *s) { ::tsSessionClose(s); } + +} // namespace ts + +namespace uart { + +Result Initialize(void) { return ::uartInitialize(); } +void Exit(void) { ::uartExit(); } +Service* GetServiceSession(void) { return ::uartGetServiceSession(); } +Result HasPort(UartPort port, bool *out) { return ::uartHasPort(port, out); } +Result HasPortForDev(UartPortForDev port, bool *out) { return ::uartHasPortForDev(port, out); } +Result IsSupportedBaudRate(UartPort port, u32 baud_rate, bool *out) { return ::uartIsSupportedBaudRate(port, baud_rate, out); } +Result IsSupportedBaudRateForDev(UartPortForDev port, u32 baud_rate, bool *out) { return ::uartIsSupportedBaudRateForDev(port, baud_rate, out); } +Result IsSupportedFlowControlMode(UartPort port, UartFlowControlMode flow_control_mode, bool *out) { return ::uartIsSupportedFlowControlMode(port, flow_control_mode, out); } +Result IsSupportedFlowControlModeForDev(UartPortForDev port, UartFlowControlMode flow_control_mode, bool *out) { return ::uartIsSupportedFlowControlModeForDev(port, flow_control_mode, out); } +Result CreatePortSession(UartPortSession *s) { return ::uartCreatePortSession(s); } +Result IsSupportedPortEvent(UartPort port, UartPortEventType port_event_type, bool *out) { return ::uartIsSupportedPortEvent(port, port_event_type, out); } +Result IsSupportedPortEventForDev(UartPortForDev port, UartPortEventType port_event_type, bool *out) { return ::uartIsSupportedPortEventForDev(port, port_event_type, out); } +Result IsSupportedDeviceVariation(UartPort port, u32 device_variation, bool *out) { return ::uartIsSupportedDeviceVariation(port, device_variation, out); } +Result IsSupportedDeviceVariationForDev(UartPortForDev port, u32 device_variation, bool *out) { return ::uartIsSupportedDeviceVariationForDev(port, device_variation, out); } +void PortSessionClose(UartPortSession* s) { ::uartPortSessionClose(s); } +Result PortSessionOpenPort(UartPortSession* s, bool *out, UartPort port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length) { return ::uartPortSessionOpenPort(s, out, port, baud_rate, flow_control_mode, device_variation, is_invert_tx, is_invert_rx, is_invert_rts, is_invert_cts, send_buffer, send_buffer_length, receive_buffer, receive_buffer_length); } +Result PortSessionOpenPortForDev(UartPortSession* s, bool *out, UartPortForDev port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length) { return ::uartPortSessionOpenPortForDev(s, out, port, baud_rate, flow_control_mode, device_variation, is_invert_tx, is_invert_rx, is_invert_rts, is_invert_cts, send_buffer, send_buffer_length, receive_buffer, receive_buffer_length); } +Result PortSessionGetWritableLength(UartPortSession* s, u64 *out) { return ::uartPortSessionGetWritableLength(s, out); } +Result PortSessionSend(UartPortSession* s, const void* in_data, size_t size, u64 *out) { return ::uartPortSessionSend(s, in_data, size, out); } +Result PortSessionGetReadableLength(UartPortSession* s, u64 *out) { return ::uartPortSessionGetReadableLength(s, out); } +Result PortSessionReceive(UartPortSession* s, void* out_data, size_t size, u64 *out) { return ::uartPortSessionReceive(s, out_data, size, out); } +Result PortSessionBindPortEvent(UartPortSession* s, UartPortEventType port_event_type, s64 threshold, bool *out, Event *out_event) { return ::uartPortSessionBindPortEvent(s, port_event_type, threshold, out, out_event); } +Result PortSessionUnbindPortEvent(UartPortSession* s, UartPortEventType port_event_type, bool *out) { return ::uartPortSessionUnbindPortEvent(s, port_event_type, out); } + +} // namespace uart + +namespace uevent { + +void Create(UEvent* e, bool auto_clear) { ::ueventCreate(e, auto_clear); } +void Clear(UEvent* e) { ::ueventClear(e); } +void Signal(UEvent* e) { ::ueventSignal(e); } + +} // namespace uevent + +namespace usb { + +Result CommsInitialize(void) { return ::usbCommsInitialize(); } +Result CommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos, u16 idVendor, u16 idProduct) { return ::usbCommsInitializeEx(num_interfaces, infos, idVendor, idProduct); } +void CommsExit(void) { ::usbCommsExit(); } +void CommsSetErrorHandling(bool flag) { ::usbCommsSetErrorHandling(flag); } +size_t CommsRead(void* buffer, size_t size) { return ::usbCommsRead(buffer, size); } +size_t CommsWrite(const void* buffer, size_t size) { return ::usbCommsWrite(buffer, size); } +size_t CommsReadEx(void* buffer, size_t size, u32 interface) { return ::usbCommsReadEx(buffer, size, interface); } +size_t CommsWriteEx(const void* buffer, size_t size, u32 interface) { return ::usbCommsWriteEx(buffer, size, interface); } +Event * CommsGetReadCompletionEvent(u32 interface) { return ::usbCommsGetReadCompletionEvent(interface); } +Result CommsReadAsync(void *buffer, size_t size, u32 *urbId, u32 interface) { return ::usbCommsReadAsync(buffer, size, urbId, interface); } +Result CommsGetReadResult(u32 urbId, u32 *transferredSize, u32 interface) { return ::usbCommsGetReadResult(urbId, transferredSize, interface); } +Event * CommsGetWriteCompletionEvent(u32 interface) { return ::usbCommsGetWriteCompletionEvent(interface); } +Result CommsWriteAsync(void *buffer, size_t size, u32 *urbId, u32 interface) { return ::usbCommsWriteAsync(buffer, size, urbId, interface); } +Result CommsGetWriteResult(u32 urbId, u32 *transferredSize, u32 interface) { return ::usbCommsGetWriteResult(urbId, transferredSize, interface); } +Result DsInitialize(void) { return ::usbDsInitialize(); } +void DsExit(void) { ::usbDsExit(); } +Service* DsGetServiceSession(void) { return ::usbDsGetServiceSession(); } +Result DsWaitReady(u64 timeout) { return ::usbDsWaitReady(timeout); } +Result DsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize) { return ::usbDsParseReportData(reportdata, urbId, requestedSize, transferredSize); } +Event* DsGetStateChangeEvent(void) { return ::usbDsGetStateChangeEvent(); } +Result DsGetState(UsbState* out) { return ::usbDsGetState(out); } +Result DsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name) { return ::usbDsGetDsInterface(out, descriptor, interface_name); } +Result DsSetVidPidBcd(const UsbDsDeviceInfo* deviceinfo) { return ::usbDsSetVidPidBcd(deviceinfo); } +Result DsRegisterInterface(UsbDsInterface** out) { return ::usbDsRegisterInterface(out); } +Result DsRegisterInterfaceEx(UsbDsInterface** out, u8 intf_num) { return ::usbDsRegisterInterfaceEx(out, intf_num); } +Result DsClearDeviceData(void) { return ::usbDsClearDeviceData(); } +Result DsAddUsbStringDescriptor(u8* out_index, const char* string) { return ::usbDsAddUsbStringDescriptor(out_index, string); } +Result DsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs) { return ::usbDsAddUsbLanguageStringDescriptor(out_index, lang_ids, num_langs); } +Result DsDeleteUsbStringDescriptor(u8 index) { return ::usbDsDeleteUsbStringDescriptor(index); } +Result DsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor* descriptor) { return ::usbDsSetUsbDeviceDescriptor(speed, descriptor); } +Result DsSetBinaryObjectStore(const void* bos, size_t bos_size) { return ::usbDsSetBinaryObjectStore(bos, bos_size); } +Result DsEnable(void) { return ::usbDsEnable(); } +Result DsDisable(void) { return ::usbDsDisable(); } +Result DsGetSpeed(UsbDeviceSpeed *out) { return ::usbDsGetSpeed(out); } +void DsInterface_Close(UsbDsInterface* interface) { ::usbDsInterface_Close(interface); } +Result DsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size) { return ::usbDsInterface_GetSetupPacket(interface, buffer, size); } +Result DsInterface_EnableInterface(UsbDsInterface* interface) { return ::usbDsInterface_EnableInterface(interface); } +Result DsInterface_DisableInterface(UsbDsInterface* interface) { return ::usbDsInterface_DisableInterface(interface); } +Result DsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId) { return ::usbDsInterface_CtrlInPostBufferAsync(interface, buffer, size, urbId); } +Result DsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId) { return ::usbDsInterface_CtrlOutPostBufferAsync(interface, buffer, size, urbId); } +Result DsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out) { return ::usbDsInterface_GetCtrlInReportData(interface, out); } +Result DsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out) { return ::usbDsInterface_GetCtrlOutReportData(interface, out); } +Result DsInterface_StallCtrl(UsbDsInterface* interface) { return ::usbDsInterface_StallCtrl(interface); } +Result DsInterface_GetDsEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, struct usb_endpoint_descriptor* descriptor) { return ::usbDsInterface_GetDsEndpoint(interface, endpoint, descriptor); } +Result DsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address) { return ::usbDsInterface_RegisterEndpoint(interface, endpoint, endpoint_address); } +Result DsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, const void* buffer, size_t size) { return ::usbDsInterface_AppendConfigurationData(interface, speed, buffer, size); } +void DsEndpoint_Close(UsbDsEndpoint* endpoint) { ::usbDsEndpoint_Close(endpoint); } +Result DsEndpoint_Cancel(UsbDsEndpoint* endpoint) { return ::usbDsEndpoint_Cancel(endpoint); } +Result DsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId) { return ::usbDsEndpoint_PostBufferAsync(endpoint, buffer, size, urbId); } +Result DsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out) { return ::usbDsEndpoint_GetReportData(endpoint, out); } +Result DsEndpoint_Stall(UsbDsEndpoint* endpoint) { return ::usbDsEndpoint_Stall(endpoint); } +Result DsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt) { return ::usbDsEndpoint_SetZlt(endpoint, zlt); } +Result HsInitialize(void) { return ::usbHsInitialize(); } +void HsExit(void) { ::usbHsExit(); } +Service* HsGetServiceSession(void) { return ::usbHsGetServiceSession(); } +Event* HsGetInterfaceStateChangeEvent(void) { return ::usbHsGetInterfaceStateChangeEvent(); } +Result HsQueryAllInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries) { return ::usbHsQueryAllInterfaces(filter, interfaces, interfaces_maxsize, total_entries); } +Result HsQueryAvailableInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries) { return ::usbHsQueryAvailableInterfaces(filter, interfaces, interfaces_maxsize, total_entries); } +Result HsQueryAcquiredInterfaces(UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries) { return ::usbHsQueryAcquiredInterfaces(interfaces, interfaces_maxsize, total_entries); } +Result HsCreateInterfaceAvailableEvent(Event* out_event, bool autoclear, u8 index, const UsbHsInterfaceFilter* filter) { return ::usbHsCreateInterfaceAvailableEvent(out_event, autoclear, index, filter); } +Result HsDestroyInterfaceAvailableEvent(Event* event, u8 index) { return ::usbHsDestroyInterfaceAvailableEvent(event, index); } +Result HsAcquireUsbIf(UsbHsClientIfSession* s, UsbHsInterface *interface) { return ::usbHsAcquireUsbIf(s, interface); } +void HsIfClose(UsbHsClientIfSession* s) { ::usbHsIfClose(s); } +bool HsIfIsActive(UsbHsClientIfSession* s) { return ::usbHsIfIsActive(s); } +s32 HsIfGetID(UsbHsClientIfSession* s) { return ::usbHsIfGetID(s); } +Result HsIfSetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id) { return ::usbHsIfSetInterface(s, inf, id); } +Result HsIfGetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf) { return ::usbHsIfGetInterface(s, inf); } +Result HsIfGetAlternateInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id) { return ::usbHsIfGetAlternateInterface(s, inf, id); } +Result HsIfGetCurrentFrame(UsbHsClientIfSession* s, u32* out) { return ::usbHsIfGetCurrentFrame(s, out); } +Result HsIfCtrlXfer(UsbHsClientIfSession* s, u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, void* buffer, u32* transferredSize) { return ::usbHsIfCtrlXfer(s, bmRequestType, bRequest, wValue, wIndex, wLength, buffer, transferredSize); } +Result HsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 maxUrbCount, u32 maxXferSize, struct usb_endpoint_descriptor *desc) { return ::usbHsIfOpenUsbEp(s, ep, maxUrbCount, maxXferSize, desc); } +Result HsIfResetDevice(UsbHsClientIfSession* s) { return ::usbHsIfResetDevice(s); } +void HsEpClose(UsbHsClientEpSession* s) { ::usbHsEpClose(s); } +Event* HsEpGetXferEvent(UsbHsClientEpSession* s) { return ::usbHsEpGetXferEvent(s); } +u32 HsEpGetReportRingSize(UsbHsClientEpSession* s) { return ::usbHsEpGetReportRingSize(s); } +Result HsEpPostBufferAsync(UsbHsClientEpSession* s, void* buffer, u32 size, u64 id, u32* xferId) { return ::usbHsEpPostBufferAsync(s, buffer, size, id, xferId); } +Result HsEpGetXferReport(UsbHsClientEpSession* s, UsbHsXferReport* reports, u32 max_reports, u32* count) { return ::usbHsEpGetXferReport(s, reports, max_reports, count); } +Result HsEpPostBuffer(UsbHsClientEpSession* s, void* buffer, u32 size, u32* transferredSize) { return ::usbHsEpPostBuffer(s, buffer, size, transferredSize); } +Result HsEpBatchBufferAsync(UsbHsClientEpSession* s, void* buffer, u32* urbs, u32 urbCount, u64 id, u32 unk1, u32 unk2, u32* xferId) { return ::usbHsEpBatchBufferAsync(s, buffer, urbs, urbCount, id, unk1, unk2, xferId); } +Result HsEpCreateSmmuSpace(UsbHsClientEpSession* s, void* buffer, u32 size) { return ::usbHsEpCreateSmmuSpace(s, buffer, size); } +Result HsEpShareReportRing(UsbHsClientEpSession* s, void* buffer, size_t size) { return ::usbHsEpShareReportRing(s, buffer, size); } + +} // namespace usb + +namespace utf { + +ssize_t DecodeUtf8(uint32_t *out, const uint8_t *in) { return ::decode_utf8(out, in); } +ssize_t DecodeUtf16(uint32_t *out, const uint16_t *in) { return ::decode_utf16(out, in); } +ssize_t EncodeUtf8(uint8_t *out, uint32_t in) { return ::encode_utf8(out, in); } +ssize_t EncodeUtf16(uint16_t *out, uint32_t in) { return ::encode_utf16(out, in); } +ssize_t Utf8ToUtf16(uint16_t *out, const uint8_t *in, size_t len) { return ::utf8_to_utf16(out, in, len); } +ssize_t Utf8ToUtf32(uint32_t *out, const uint8_t *in, size_t len) { return ::utf8_to_utf32(out, in, len); } +ssize_t Utf16ToUtf8(uint8_t *out, const uint16_t *in, size_t len) { return ::utf16_to_utf8(out, in, len); } +ssize_t Utf16ToUtf32(uint32_t *out, const uint16_t *in, size_t len) { return ::utf16_to_utf32(out, in, len); } +ssize_t Utf32ToUtf8(uint8_t *out, const uint32_t *in, size_t len) { return ::utf32_to_utf8(out, in, len); } +ssize_t Utf32ToUtf16(uint16_t *out, const uint32_t *in, size_t len) { return ::utf32_to_utf16(out, in, len); } + +} // namespace utf + +namespace utimer { + +void Create(UTimer* t, u64 interval, TimerType type) { ::utimerCreate(t, interval, type); } +void Start(UTimer* t) { ::utimerStart(t); } +void Stop(UTimer* t) { ::utimerStop(t); } + +} // namespace utimer + +namespace vi { + +Result Initialize(ViServiceType service_type) { return ::viInitialize(service_type); } +void Exit(void) { ::viExit(); } +Service* GetSession_IApplicationDisplayService(void) { return ::viGetSession_IApplicationDisplayService(); } +Service* GetSession_IHOSBinderDriverRelay(void) { return ::viGetSession_IHOSBinderDriverRelay(); } +Service* GetSession_ISystemDisplayService(void) { return ::viGetSession_ISystemDisplayService(); } +Service* GetSession_IManagerDisplayService(void) { return ::viGetSession_IManagerDisplayService(); } +Service* GetSession_IHOSBinderDriverIndirect(void) { return ::viGetSession_IHOSBinderDriverIndirect(); } +Result SetContentVisibility(bool v) { return ::viSetContentVisibility(v); } +Result OpenDisplay(const char *display_name, ViDisplay *display) { return ::viOpenDisplay(display_name, display); } +Result CloseDisplay(ViDisplay *display) { return ::viCloseDisplay(display); } +Result OpenDefaultDisplay(ViDisplay *display) { return ::viOpenDefaultDisplay(display); } +Result GetDisplayResolution(ViDisplay *display, s32 *width, s32 *height) { return ::viGetDisplayResolution(display, width, height); } +Result GetDisplayLogicalResolution(ViDisplay *display, s32 *width, s32 *height) { return ::viGetDisplayLogicalResolution(display, width, height); } +Result SetDisplayMagnification(ViDisplay *display, s32 x, s32 y, s32 width, s32 height) { return ::viSetDisplayMagnification(display, x, y, width, height); } +Result GetDisplayVsyncEvent(ViDisplay *display, Event *event_out) { return ::viGetDisplayVsyncEvent(display, event_out); } +Result SetDisplayPowerState(ViDisplay *display, ViPowerState state) { return ::viSetDisplayPowerState(display, state); } +Result SetDisplayAlpha(ViDisplay *display, float alpha) { return ::viSetDisplayAlpha(display, alpha); } +Result GetZOrderCountMin(ViDisplay *display, s32 *z) { return ::viGetZOrderCountMin(display, z); } +Result GetZOrderCountMax(ViDisplay *display, s32 *z) { return ::viGetZOrderCountMax(display, z); } +Result CreateLayer(const ViDisplay *display, ViLayer *layer) { return ::viCreateLayer(display, layer); } +Result CreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id) { return ::viCreateManagedLayer(display, layer_flags, aruid, layer_id); } +Result SetLayerSize(ViLayer *layer, s32 width, s32 height) { return ::viSetLayerSize(layer, width, height); } +Result SetLayerZ(ViLayer *layer, s32 z) { return ::viSetLayerZ(layer, z); } +Result SetLayerPosition(ViLayer *layer, float x, float y) { return ::viSetLayerPosition(layer, x, y); } +Result CloseLayer(ViLayer *layer) { return ::viCloseLayer(layer); } +Result DestroyManagedLayer(ViLayer *layer) { return ::viDestroyManagedLayer(layer); } +Result SetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode) { return ::viSetLayerScalingMode(layer, scaling_mode); } +Result GetIndirectLayerImageMap(void* buffer, size_t size, s32 width, s32 height, u64 IndirectLayerConsumerHandle, u64 *out_size, u64 *out_stride) { return ::viGetIndirectLayerImageMap(buffer, size, width, height, IndirectLayerConsumerHandle, out_size, out_stride); } +Result GetIndirectLayerImageRequiredMemoryInfo(s32 width, s32 height, u64 *out_size, u64 *out_alignment) { return ::viGetIndirectLayerImageRequiredMemoryInfo(width, height, out_size, out_alignment); } +Result ManagerPrepareFatal(void) { return ::viManagerPrepareFatal(); } +Result ManagerShowFatal(void) { return ::viManagerShowFatal(); } +Result ManagerDrawFatalRectangle(s32 x, s32 y, s32 end_x, s32 end_y, ViColorRgba4444 color) { return ::viManagerDrawFatalRectangle(x, y, end_x, end_y, color); } +Result ManagerDrawFatalText32(s32 *out_advance, s32 x, s32 y, const u32 *utf32_codepoints, size_t num_codepoints, float scale_x, float scale_y, PlSharedFontType font_type, ViColorRgba8888 bg_color, ViColorRgba8888 fg_color, s32 initial_advance) { return ::viManagerDrawFatalText32(out_advance, x, y, utf32_codepoints, num_codepoints, scale_x, scale_y, font_type, bg_color, fg_color, initial_advance); } + +} // namespace vi + +namespace virtmem { + +void Lock(void) { ::virtmemLock(); } +void Unlock(void) { ::virtmemUnlock(); } +void* FindAslr(size_t size, size_t guard_size) { return ::virtmemFindAslr(size, guard_size); } +void* FindStack(size_t size, size_t guard_size) { return ::virtmemFindStack(size, guard_size); } +void* FindCodeMemory(size_t size, size_t guard_size) { return ::virtmemFindCodeMemory(size, guard_size); } +VirtmemReservation* AddReservation(void* mem, size_t size) { return ::virtmemAddReservation(mem, size); } +void RemoveReservation(VirtmemReservation* rv) { ::virtmemRemoveReservation(rv); } + +} // namespace virtmem + +namespace wait { + +Result Objects(s32* idx_out, const Waiter* objects, s32 num_objects, u64 timeout) { return ::waitObjects(idx_out, objects, num_objects, timeout); } +Result Handles(s32* idx_out, const Handle* handles, s32 num_handles, u64 timeout) { return ::waitHandles(idx_out, handles, num_handles, timeout); } +Result Single(Waiter w, u64 timeout) { return ::waitSingle(w, timeout); } +Result SingleHandle(Handle h, u64 timeout) { return ::waitSingleHandle(h, timeout); } + +} // namespace wait + +namespace waiter { + +Waiter ForEvent(Event* t) { return ::waiterForEvent(t); } +Waiter ForThread(Thread* t) { return ::waiterForThread(t); } +Waiter ForUEvent(UEvent* e) { return ::waiterForUEvent(e); } +Waiter ForUTimer(UTimer* t) { return ::waiterForUTimer(t); } +Waiter ForHandle(Handle h) { return ::waiterForHandle(h); } + +} // namespace waiter + +namespace web { + +void WifiCreate(WebWifiConfig* config, const char* conntest_url, const char* initial_url, Uuid uuid, u32 rev) { ::webWifiCreate(config, conntest_url, initial_url, uuid, rev); } +Result WifiShow(WebWifiConfig* config, WebWifiReturnValue *out) { return ::webWifiShow(config, out); } +Result PageCreate(WebCommonConfig* config, const char* url) { return ::webPageCreate(config, url); } +Result NewsCreate(WebCommonConfig* config, const char* url) { return ::webNewsCreate(config, url); } +Result YouTubeVideoCreate(WebCommonConfig* config, const char* url) { return ::webYouTubeVideoCreate(config, url); } +Result OfflineCreate(WebCommonConfig* config, WebDocumentKind docKind, u64 id, const char* docPath) { return ::webOfflineCreate(config, docKind, id, docPath); } +Result ShareCreate(WebCommonConfig* config, WebShareStartPage page) { return ::webShareCreate(config, page); } +Result LobbyCreate(WebCommonConfig* config) { return ::webLobbyCreate(config); } +Result ConfigSetCallbackUrl(WebCommonConfig* config, const char* url) { return ::webConfigSetCallbackUrl(config, url); } +Result ConfigSetCallbackableUrl(WebCommonConfig* config, const char* url) { return ::webConfigSetCallbackableUrl(config, url); } +Result ConfigSetWhitelist(WebCommonConfig* config, const char* whitelist) { return ::webConfigSetWhitelist(config, whitelist); } +Result ConfigSetUid(WebCommonConfig* config, AccountUid uid) { return ::webConfigSetUid(config, uid); } +Result ConfigSetAlbumEntry(WebCommonConfig* config, const CapsAlbumEntry *entry) { return ::webConfigSetAlbumEntry(config, entry); } +Result ConfigSetScreenShot(WebCommonConfig* config, bool flag) { return ::webConfigSetScreenShot(config, flag); } +Result ConfigSetEcClientCert(WebCommonConfig* config, bool flag) { return ::webConfigSetEcClientCert(config, flag); } +Result ConfigSetPlayReport(WebCommonConfig* config, bool flag) { return ::webConfigSetPlayReport(config, flag); } +Result ConfigSetBootDisplayKind(WebCommonConfig* config, WebBootDisplayKind kind) { return ::webConfigSetBootDisplayKind(config, kind); } +Result ConfigSetBackgroundKind(WebCommonConfig* config, WebBackgroundKind kind) { return ::webConfigSetBackgroundKind(config, kind); } +Result ConfigSetFooter(WebCommonConfig* config, bool flag) { return ::webConfigSetFooter(config, flag); } +Result ConfigSetPointer(WebCommonConfig* config, bool flag) { return ::webConfigSetPointer(config, flag); } +Result ConfigSetLeftStickMode(WebCommonConfig* config, WebLeftStickMode mode) { return ::webConfigSetLeftStickMode(config, mode); } +Result ConfigSetKeyRepeatFrame(WebCommonConfig* config, s32 inval0, s32 inval1) { return ::webConfigSetKeyRepeatFrame(config, inval0, inval1); } +Result ConfigSetDisplayUrlKind(WebCommonConfig* config, bool kind) { return ::webConfigSetDisplayUrlKind(config, kind); } +Result ConfigSetBootAsMediaPlayer(WebCommonConfig* config, bool flag) { return ::webConfigSetBootAsMediaPlayer(config, flag); } +Result ConfigSetShopJump(WebCommonConfig* config, bool flag) { return ::webConfigSetShopJump(config, flag); } +Result ConfigSetMediaPlayerUserGestureRestriction(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerUserGestureRestriction(config, flag); } +Result ConfigSetMediaAutoPlay(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaAutoPlay(config, flag); } +Result ConfigSetLobbyParameter(WebCommonConfig* config, const char* str) { return ::webConfigSetLobbyParameter(config, str); } +Result ConfigSetApplicationAlbumEntry(WebCommonConfig* config, CapsApplicationAlbumEntry *entry) { return ::webConfigSetApplicationAlbumEntry(config, entry); } +Result ConfigSetJsExtension(WebCommonConfig* config, bool flag) { return ::webConfigSetJsExtension(config, flag); } +Result ConfigSetAdditionalCommentText(WebCommonConfig* config, const char* str) { return ::webConfigSetAdditionalCommentText(config, str); } +Result ConfigSetTouchEnabledOnContents(WebCommonConfig* config, bool flag) { return ::webConfigSetTouchEnabledOnContents(config, flag); } +Result ConfigSetUserAgentAdditionalString(WebCommonConfig* config, const char* str) { return ::webConfigSetUserAgentAdditionalString(config, str); } +Result ConfigSetAdditionalMediaData(WebCommonConfig* config, const u8* data, size_t size) { return ::webConfigSetAdditionalMediaData(config, data, size); } +Result ConfigSetMediaPlayerAutoClose(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerAutoClose(config, flag); } +Result ConfigSetPageCache(WebCommonConfig* config, bool flag) { return ::webConfigSetPageCache(config, flag); } +Result ConfigSetWebAudio(WebCommonConfig* config, bool flag) { return ::webConfigSetWebAudio(config, flag); } +Result ConfigSetFooterFixedKind(WebCommonConfig* config, WebFooterFixedKind kind) { return ::webConfigSetFooterFixedKind(config, kind); } +Result ConfigSetPageFade(WebCommonConfig* config, bool flag) { return ::webConfigSetPageFade(config, flag); } +Result ConfigSetMediaCreatorApplicationRatingAge(WebCommonConfig* config, const s8 *data) { return ::webConfigSetMediaCreatorApplicationRatingAge(config, data); } +Result ConfigSetBootLoadingIcon(WebCommonConfig* config, bool flag) { return ::webConfigSetBootLoadingIcon(config, flag); } +Result ConfigSetPageScrollIndicator(WebCommonConfig* config, bool flag) { return ::webConfigSetPageScrollIndicator(config, flag); } +Result ConfigSetMediaPlayerSpeedControl(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerSpeedControl(config, flag); } +Result ConfigAddAlbumEntryAndMediaData(WebCommonConfig* config, const CapsAlbumEntry *entry, const u8* data, size_t size) { return ::webConfigAddAlbumEntryAndMediaData(config, entry, data, size); } +Result ConfigSetBootFooterButtonVisible(WebCommonConfig* config, WebFooterButtonId button, bool visible) { return ::webConfigSetBootFooterButtonVisible(config, button, visible); } +Result ConfigSetOverrideWebAudioVolume(WebCommonConfig* config, float value) { return ::webConfigSetOverrideWebAudioVolume(config, value); } +Result ConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value) { return ::webConfigSetOverrideMediaAudioVolume(config, value); } +Result ConfigSetBootMode(WebCommonConfig* config, WebSessionBootMode mode) { return ::webConfigSetBootMode(config, mode); } +Result ConfigSetMediaPlayerUi(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerUi(config, flag); } +Result ConfigSetTransferMemory(WebCommonConfig* config, bool flag) { return ::webConfigSetTransferMemory(config, flag); } +Result ConfigShow(WebCommonConfig* config, WebCommonReply *out) { return ::webConfigShow(config, out); } +Result ConfigRequestExit(WebCommonConfig* config) { return ::webConfigRequestExit(config); } +Result ReplyGetExitReason(WebCommonReply *reply, WebExitReason *exitReason) { return ::webReplyGetExitReason(reply, exitReason); } +Result ReplyGetLastUrl(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size) { return ::webReplyGetLastUrl(reply, outstr, outstr_maxsize, out_size); } +Result ReplyGetSharePostResult(WebCommonReply *reply, u32 *sharePostResult) { return ::webReplyGetSharePostResult(reply, sharePostResult); } +Result ReplyGetPostServiceName(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size) { return ::webReplyGetPostServiceName(reply, outstr, outstr_maxsize, out_size); } +Result ReplyGetPostId(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size) { return ::webReplyGetPostId(reply, outstr, outstr_maxsize, out_size); } +Result ReplyGetMediaPlayerAutoClosedByCompletion(WebCommonReply *reply, bool *flag) { return ::webReplyGetMediaPlayerAutoClosedByCompletion(reply, flag); } +void SessionCreate(WebSession *s, WebCommonConfig* config) { ::webSessionCreate(s, config); } +void SessionClose(WebSession *s) { ::webSessionClose(s); } +Result SessionStart(WebSession *s, Event **out_event) { return ::webSessionStart(s, out_event); } +Result SessionWaitForExit(WebSession *s, WebCommonReply *out) { return ::webSessionWaitForExit(s, out); } +Result SessionRequestExit(WebSession *s) { return ::webSessionRequestExit(s); } +Result SessionAppear(WebSession *s, bool *flag) { return ::webSessionAppear(s, flag); } +Result SessionTrySendContentMessage(WebSession *s, const char *content, u32 size, bool *flag) { return ::webSessionTrySendContentMessage(s, content, size, flag); } +Result SessionTryReceiveContentMessage(WebSession *s, char *content, u64 size, u64 *out_size, bool *flag) { return ::webSessionTryReceiveContentMessage(s, content, size, out_size, flag); } + +} // namespace web + +namespace wlaninf { + +Result Initialize(void) { return ::wlaninfInitialize(); } +void Exit(void) { ::wlaninfExit(); } +Service* GetServiceSession(void) { return ::wlaninfGetServiceSession(); } +Result GetState(WlanInfState* out) { return ::wlaninfGetState(out); } +Result GetRSSI(s32* out) { return ::wlaninfGetRSSI(out); } + +} // namespace wlaninf + +} // namespace nx + diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index 9b9be7a2..11427b48 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -71,6 +71,8 @@ CFLAGS += -DUI_OVERRIDE_PATH="\"$(UI_OVERRIDE_PATH)\"" CXXFLAGS := $(CFLAGS) -fno-exceptions -std=gnu++23 +switch.o: CXXFLAGS += -fno-lto + ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map),-wrap,__cxa_throw -Wl,-wrap,_Unwind_Resume -Wl,-wrap,__gxx_personality_v0 diff --git a/Source/hoc-clk/overlay/src/ipc.h b/Source/hoc-clk/overlay/src/ipc.h index 7f514aaa..db4a256c 100644 --- a/Source/hoc-clk/overlay/src/ipc.h +++ b/Source/hoc-clk/overlay/src/ipc.h @@ -26,14 +26,14 @@ #pragma once +#include + #if defined(__cplusplus) #include "cpp_util.hpp" extern "C" { #endif -#include - #include #if defined(__cplusplus) diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index 03b7eb07..6999308e 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -22,7 +22,7 @@ CONFIG_DIR := horizon-oc BUILD := build OUTDIR := out RESOURCES := res -SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util +SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util ../common/src DATA := data INCLUDES := ../common/include src/hos src/soc src/i2c src/util src/pwr src/ipc EXEFS_SRC := exefs_src diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 0e8944aa..2af89827 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include "../display/display_refresh_rate.hpp" @@ -42,6 +42,7 @@ #include "board_name.hpp" #include #include +#include namespace board { static u32 currentInjectedHz = 0; @@ -67,18 +68,18 @@ namespace board { PcvModuleId GetPcvModuleId(HocClkModule hocclkModule) { PcvModuleId pcvModuleId; - Result rc = pcvGetModuleId(&pcvModuleId, GetPcvModule(hocclkModule)); + Result rc = nx::pcv::GetModuleId(&pcvModuleId, GetPcvModule(hocclkModule)); ASSERT_RESULT_OK(rc, "pcvGetModuleId"); return pcvModuleId; } void ClkrstSetHz(ClkrstSession &session, u32 hz) { - ASSERT_RESULT_OK(clkrstSetClockRate(&session, hz), "clkrstSetClockRate"); + ASSERT_RESULT_OK(nx::clkrst::SetClockRate(&session, hz), "clkrstSetClockRate"); } void PcvSetHz(PcvModule moduleID, u32 hz) { - ASSERT_RESULT_OK(pcvSetClockRate(moduleID, hz), "pcvSetClockRate"); + ASSERT_RESULT_OK(nx::pcv::SetClockRate(moduleID, hz), "pcvSetClockRate"); } void HandleCpuUv() { @@ -112,22 +113,22 @@ namespace board { if (HOSSVC_HAS_CLKRST) { ClkrstSession session = {}; - rc = clkrstOpenSession(&session, GetPcvModuleId(module), 3); + rc = nx::clkrst::OpenSession(&session, GetPcvModuleId(module), 3); ASSERT_RESULT_OK(rc, "clkrstOpenSession"); ClkrstSetHz(session, pcvHz); /* Voltage bug workaround. */ if (module == HocClkModule_CPU) { - svcSleepThread(300'000); + nx::svc::SleepThread(300'000); ClkrstSetHz(session, pcvHz); } - clkrstCloseSession(&session); + nx::clkrst::CloseSession(&session); } else { PcvSetHz(GetPcvModule(module), pcvHz); if (module == HocClkModule_CPU) { - svcSleepThread(300'000); + nx::svc::SleepThread(300'000); PcvSetHz(GetPcvModule(module), pcvHz); } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index bf814453..f5327e5f 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -33,8 +33,9 @@ #include #include #include -#include +#include #include +#include #include "../hos/apm_ext.h" #include "board.hpp" @@ -74,7 +75,7 @@ namespace board { gpu_load_array[i++ % gpu_samples_average] = temp; gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; } - svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) + nx::svc::SleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) } while (true); } diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp index b2315cf1..fe1bbdfb 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include namespace board { @@ -50,7 +52,7 @@ namespace board { } fanLevel = static_cast(rotationDuty); - svcSleepThread(300'000'000); + nx::svc::SleepThread(300'000'000); } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index 2bdf42ae..896732a0 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -53,7 +53,7 @@ namespace board { u32 gDramMr4Tick = DramMr4PollDivisor; s32 gDramMr4Millis = 30000; /* 4x refresh default */ - s32 PollDramMr4TempMilli() { + [[maybe_unused]] s32 PollDramMr4TempMilli() { u8 mr4 = 0; if (!soc::ReadRamMr4(&mr4)) return 0; /* stock exosphere */ diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 6a1b8639..b4b83867 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -657,7 +657,7 @@ namespace board { constexpr u32 KNOWN_GOOD_WAR_FREQUENCY = 1'785'000'000; u32 hz = board::GetHz(HocClkModule_CPU); board::SetHz(HocClkModule_CPU, KNOWN_GOOD_WAR_FREQUENCY); - svcSleepThread(5'000'000); + nx::svc::SleepThread(5'000'000); board::SetHz(HocClkModule_CPU, hz); } diff --git a/Source/hoc-clk/sysmodule/src/display/aula.cpp b/Source/hoc-clk/sysmodule/src/display/aula.cpp index bb8e4eca..4d5c720b 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.cpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.cpp @@ -19,6 +19,7 @@ #include "aula.hpp" #include "common.hpp" +#include // I *think* HOS changes this in some ways, so look into it more @@ -31,7 +32,7 @@ namespace display { DSI(DSI_TRIGGER) = DSI_TRIGGER_HOST; if (wait) - svcSleepThread(wait * 1000); // usleep-equivalant + nx::svc::SleepThread(wait * 1000); // usleep-equivalant } void SetDisplayColorMode(AulaColorMode mode) { diff --git a/Source/hoc-clk/sysmodule/src/display/common.hpp b/Source/hoc-clk/sysmodule/src/display/common.hpp index b88ac496..a96a773d 100644 --- a/Source/hoc-clk/sysmodule/src/display/common.hpp +++ b/Source/hoc-clk/sysmodule/src/display/common.hpp @@ -15,6 +15,9 @@ * along with this program. If not, see . */ +#pragma once +#include + #ifndef _DI_H_ #define _DI_H_ diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp index 50ea9caa..08e35186 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp @@ -19,8 +19,9 @@ #include #include #include - +#include #include "display_refresh_rate.hpp" +#include namespace display { #define DSI_CLOCK_HZ 234000000llu @@ -142,7 +143,7 @@ namespace display { #define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 dsi[DSI_VIDEO_MODE_CONTROL] = true; - svcSleepThread(20000000); + nx::svc::SleepThread(20000000); dsi[DSI_WR_DATA] = MIPI_DSI_DCS_LONG_WRITE | (5 << 8); dsi[DSI_WR_DATA] = 0x5A5A5AE2; @@ -162,7 +163,7 @@ namespace display { dsi[DSI_TRIGGER] = 0; dsi[DSI_VIDEO_MODE_CONTROL] = false; - svcSleepThread(20000000); + nx::svc::SleepThread(20000000); } void SetDockedState(bool isDocked) { g_config.isDocked = isDocked; @@ -493,11 +494,11 @@ namespace display { if (!g_config.displaySync) { g_wasRetroSuperTurnedOff = false; } else if (g_wasRetroSuperTurnedOff) { - svcSleepThread(2000000000); + nx::svc::SleepThread(2000000000); g_wasRetroSuperTurnedOff = false; } - svcSleepThread(1000000000); + nx::svc::SleepThread(1000000000); uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp0")) { @@ -693,7 +694,7 @@ namespace display { _getDockedHighestRefreshRate(0); g_canChangeRefreshRateDocked = true; } else { - svcSleepThread(1000000000); + nx::svc::SleepThread(1000000000); return false; } } else { diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index 1ffc5c27..2f47e2c6 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -33,6 +33,7 @@ #include #include #include +#include #define FILE_CONFIG_DIR "/config/" CONFIG_DIR #define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv" diff --git a/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp b/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp new file mode 100644 index 00000000..6e653444 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "clkrst_ext.hpp" + +namespace hos::clkrst { + /// @brief Sets the minimum voltage for a session's module to the one required for @param hz. Does not work with cpu module + /// @param session A ClkrstSession pointer + /// @param hz The hz to set the vmin for + /// @return Result code + Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz) { + return serviceDispatchIn(&session->s, 9, hz); + } + + Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count) { + const struct { + s32 rate_count; + s32 voltage_count; + } in = { in_rate_count, in_voltage_count }; + + s32 out = 0; + Result rc = serviceDispatchInOut(&session->s, 11, in, out, + .buffer_attrs = { + SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect, + SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect, + }, + .buffers = { + { out_rate_table, in_rate_count * sizeof(u32) }, + { out_voltage_table, in_voltage_count * sizeof(u32) }, + }, + ); + + if (R_SUCCEEDED(rc) && out_count) { + *out_count = out; + } + + return rc; + } +} // namespace hos::clkrst diff --git a/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp b/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp new file mode 100644 index 00000000..39650641 --- /dev/null +++ b/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp @@ -0,0 +1,24 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include + +namespace hos::clkrst { + Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz); + Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count); +} // namespace hos::clkrst \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index 2398d44b..fc72c455 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -20,6 +20,7 @@ #include "integrations.hpp" #include "process_management.hpp" #include +#include namespace hos { @@ -41,7 +42,7 @@ namespace hos { } if (i == 66) return false; - svcSleepThread(1'000'000); + nx::svc::SleepThread(1'000'000); } for (int i = 0; i < 67; i++) { @@ -49,7 +50,7 @@ namespace hos { svcCloseHandle(saltysd); return true; } - svcSleepThread(1'000'000); + nx::svc::SleepThread(1'000'000); } return false; diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index 7c9e4654..7641e2f0 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -62,7 +62,7 @@ namespace hos { u64 pid = 0; do { rc = pmdmntGetProcessId(&pid, Qlaunch); - svcSleepThread(50 * 1000000ULL); // 50ms + nx::svc::SleepThread(50 * 1000000ULL); // 50ms } while (R_FAILED(rc)); } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index 93222148..e74b1988 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -15,6 +15,7 @@ * */ #include "i2cDrv.h" +#include Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { // ams::fatal::srv::StopSoundTask::StopSound() @@ -133,7 +134,7 @@ u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain) { return 0u; // Wait 1us - svcSleepThread(1E3); + nx::svc::SleepThread(1E3); if (!domain->por_val || val != domain->por_val) break; @@ -149,7 +150,7 @@ u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain) { return 0u; // Wait 1us - svcSleepThread(1E3); + nx::svc::SleepThread(1E3); if (!domain->por_val || val != domain->por_val) break; @@ -172,7 +173,7 @@ Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mv return res; // 5ms Ramp delay - svcSleepThread(5E6); + nx::svc::SleepThread(5E6); u8 new_val; res = I2cRead_OutU8(domain->device, domain->reg, &new_val); if (R_FAILED(res)) diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h index 3f561045..40f9c4d0 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h @@ -6,7 +6,7 @@ #pragma once #include - +#include // To use i2c service, sm and i2c should be intialized via smInitialize() and i2cInitialize(). Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val); diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 2a785506..f717610c 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -28,7 +28,7 @@ #include #include #include - +#include #include "board/board.hpp" #include "file/config.hpp" #include "file/errors.hpp" @@ -156,7 +156,7 @@ int main(int argc, char **argv) { board::Exit(); file::config::Exit(); file::utils::LogLine("Exiting hoc-clk"); - svcSleepThread(1000000ULL); + nx::svc::SleepThread(1000000ULL); file::utils::Exit(); return 0; diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 8c7865e1..230d4190 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -45,7 +45,8 @@ #include "clock_manager.hpp" #include "governor.hpp" #include "../i2c/max77620_wdt.hpp" - +#include "../hos/clkrst_ext.hpp" +#include #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) @@ -868,6 +869,7 @@ namespace mgr { } mgr::StartThreads(); + } void Exit() { @@ -914,6 +916,6 @@ namespace mgr { void WaitForNextTick() { i2c::wdt::Pet(); - svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); + nx::svc::SleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); } } // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 8ab39d21..5677249f 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -140,7 +140,7 @@ namespace mgr { cpuLastHz = 0; gpuDownHoldRemaining = 0; gpuLastHz = 0; - svcSleepThread(pollNs); + nx::svc::SleepThread(pollNs); continue; } @@ -302,14 +302,14 @@ namespace mgr { if (++vrrTick > 50) { vrrTick = 0; board::SetHz(HocClkModule_Display, maxDisplay); - svcSleepThread(50'000'000); + nx::svc::SleepThread(50'000'000); } } } } } - svcSleepThread(pollNs); + nx::svc::SleepThread(pollNs); } } diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.c b/Source/hoc-clk/sysmodule/src/soc/t210.cpp similarity index 98% rename from Source/hoc-clk/sysmodule/src/soc/t210.c rename to Source/hoc-clk/sysmodule/src/soc/t210.cpp index d787976f..4da17e41 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.c +++ b/Source/hoc-clk/sysmodule/src/soc/t210.cpp @@ -17,11 +17,13 @@ * along with this program. If not, see . */ -#include "t210.h" +#include "t210.hpp" +#include +#include #define WAIT_NS 1000000000UL -#define usleep(x) svcSleepThread(1000UL * x) +#define usleep(x) (nx::svc::SleepThread(1000UL * x)) #define GPU_TRIM_SYS_GPCPLL_COEFF 0x4 #define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(g_gpu_base + 0x137000ul + (x))) diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.h b/Source/hoc-clk/sysmodule/src/soc/t210.hpp similarity index 100% rename from Source/hoc-clk/sysmodule/src/soc/t210.h rename to Source/hoc-clk/sysmodule/src/soc/t210.hpp diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index b483e8cf..c1190832 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -505,7 +505,7 @@ namespace tsensor { } /* Wait for HW recalibration */ - svcSleepThread(25'000); + nx::svc::SleepThread(25'000); temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); @@ -528,7 +528,7 @@ namespace tsensor { WriteReg(carVa, CAR_CLK_SOURCE_TSENSOR, CAR_CLK_SOURCE_TSENSOR_VAL); SetBits(carVa, CAR_CLK_OUT_ENB_V, 0x10); - svcSleepThread(2000); + nx::svc::SleepThread(2000); TSensorSharedCalib sharedCal = {}; CalcSharedCal(&tfuse, &sharedCal, fuseVa); From 062b52c6074f33da6da0480a8378f29ea6b82de6 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:28:12 -0400 Subject: [PATCH 166/205] more c++ification --- Source/hoc-clk/sysmodule/src/board/board.cpp | 10 +++--- .../sysmodule/src/board/board_freq.cpp | 6 ++-- .../sysmodule/src/board/board_load.cpp | 3 +- .../sysmodule/src/board/board_misc.cpp | 4 ++- .../sysmodule/src/board/board_volt.cpp | 4 ++- Source/hoc-clk/sysmodule/src/display/aula.cpp | 3 +- .../src/display/display_refresh_rate.cpp | 12 ++++--- .../sysmodule/src/hos/integrations.cpp | 6 ++-- .../sysmodule/src/hos/process_management.cpp | 3 +- Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp | 8 +++-- .../sysmodule/src/i2c/max77620_wdt.cpp | 6 ++-- .../sysmodule/src/i2c/max77620_wdt.hpp | 4 +-- Source/hoc-clk/sysmodule/src/main.cpp | 31 ++++++++++--------- .../sysmodule/src/mgr/clock_manager.cpp | 8 +++-- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 8 +++-- Source/hoc-clk/sysmodule/src/soc/t210.cpp | 4 ++- .../sysmodule/src/tsensor/soctherm.cpp | 5 +-- 17 files changed, 74 insertions(+), 51 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 0a71ed1c..82dc6d27 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -97,8 +97,8 @@ namespace board { rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); if (R_SUCCEEDED(rc)) { if (state == PscPmState_ReadyAwaken) { - i2c::wdt::ResetWdtEnableState(); - i2c::wdt::Pet(); + HocI2c::wdt::ResetWdtEnableState(); + HocI2c::wdt::Pet(); if(board::GetSocType() == HocClkSocType_Mariko && file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { @@ -117,7 +117,7 @@ namespace board { s_isAwake = true; } else if (state == PscPmState_ReadySleep) { - i2c::wdt::Disarm(); + HocI2c::wdt::Disarm(); ResetToStockMem(); ResetToStockCpu(); @@ -127,7 +127,7 @@ namespace board { s_isAwake = false; } else if (state == PscPmState_ReadyShutdown) { - i2c::wdt::Disarm(); + HocI2c::wdt::Disarm(); ResetToStockMem(); ResetToStockCpu(); @@ -326,7 +326,7 @@ namespace board { pscPmModuleClose(&s_pscModule); pscmExit(); - i2c::wdt::Disarm(); + HocI2c::wdt::Disarm(); } HocClkSocType GetSocType() { diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 2af89827..77ebd46b 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -44,6 +44,8 @@ #include #include +using namespace nx; + namespace board { static u32 currentInjectedHz = 0; static u32 gMarikoGm20bCutoff = 1228800000; @@ -119,7 +121,7 @@ namespace board { /* Voltage bug workaround. */ if (module == HocClkModule_CPU) { - nx::svc::SleepThread(300'000); + svc::SleepThread(300'000); ClkrstSetHz(session, pcvHz); } @@ -128,7 +130,7 @@ namespace board { PcvSetHz(GetPcvModule(module), pcvHz); if (module == HocClkModule_CPU) { - nx::svc::SleepThread(300'000); + svc::SleepThread(300'000); PcvSetHz(GetPcvModule(module), pcvHz); } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index f5327e5f..6d693383 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -43,6 +43,7 @@ #include #include +using namespace nx; namespace board { @@ -75,7 +76,7 @@ namespace board { gpu_load_array[i++ % gpu_samples_average] = temp; gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; } - nx::svc::SleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) + svc::SleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) } while (true); } diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp index fe1bbdfb..3e6dd7fc 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp @@ -30,6 +30,8 @@ #include #include +using namespace nx; + namespace board { Thread miscThread; @@ -52,7 +54,7 @@ namespace board { } fanLevel = static_cast(rotationDuty); - nx::svc::SleepThread(300'000'000); + svc::SleepThread(300'000'000); } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index b4b83867..071f4a23 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -31,6 +31,8 @@ #include "board_freq.hpp" #include "board_volt.hpp" +using namespace nx; + namespace board { GpuVoltData voltData = {}; @@ -657,7 +659,7 @@ namespace board { constexpr u32 KNOWN_GOOD_WAR_FREQUENCY = 1'785'000'000; u32 hz = board::GetHz(HocClkModule_CPU); board::SetHz(HocClkModule_CPU, KNOWN_GOOD_WAR_FREQUENCY); - nx::svc::SleepThread(5'000'000); + svc::SleepThread(5'000'000); board::SetHz(HocClkModule_CPU, hz); } diff --git a/Source/hoc-clk/sysmodule/src/display/aula.cpp b/Source/hoc-clk/sysmodule/src/display/aula.cpp index 4d5c720b..dd0447df 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.cpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.cpp @@ -21,6 +21,7 @@ #include "common.hpp" #include +using namespace nx; // I *think* HOS changes this in some ways, so look into it more namespace display { @@ -32,7 +33,7 @@ namespace display { DSI(DSI_TRIGGER) = DSI_TRIGGER_HOST; if (wait) - nx::svc::SleepThread(wait * 1000); // usleep-equivalant + svc::SleepThread(wait * 1000); // usleep-equivalant } void SetDisplayColorMode(AulaColorMode mode) { diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp index 08e35186..eb68ddfe 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp @@ -23,6 +23,8 @@ #include "display_refresh_rate.hpp" #include +using namespace nx; + namespace display { #define DSI_CLOCK_HZ 234000000llu #define NVDISP_GET_MODE2 0x803C021B @@ -143,7 +145,7 @@ namespace display { #define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 dsi[DSI_VIDEO_MODE_CONTROL] = true; - nx::svc::SleepThread(20000000); + svc::SleepThread(20000000); dsi[DSI_WR_DATA] = MIPI_DSI_DCS_LONG_WRITE | (5 << 8); dsi[DSI_WR_DATA] = 0x5A5A5AE2; @@ -163,7 +165,7 @@ namespace display { dsi[DSI_TRIGGER] = 0; dsi[DSI_VIDEO_MODE_CONTROL] = false; - nx::svc::SleepThread(20000000); + svc::SleepThread(20000000); } void SetDockedState(bool isDocked) { g_config.isDocked = isDocked; @@ -494,11 +496,11 @@ namespace display { if (!g_config.displaySync) { g_wasRetroSuperTurnedOff = false; } else if (g_wasRetroSuperTurnedOff) { - nx::svc::SleepThread(2000000000); + svc::SleepThread(2000000000); g_wasRetroSuperTurnedOff = false; } - nx::svc::SleepThread(1000000000); + svc::SleepThread(1000000000); uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp0")) { @@ -694,7 +696,7 @@ namespace display { _getDockedHighestRefreshRate(0); g_canChangeRefreshRateDocked = true; } else { - nx::svc::SleepThread(1000000000); + svc::SleepThread(1000000000); return false; } } else { diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index fc72c455..41290dc8 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -22,6 +22,8 @@ #include #include +using namespace nx; + namespace hos { namespace { @@ -42,7 +44,7 @@ namespace hos { } if (i == 66) return false; - nx::svc::SleepThread(1'000'000); + svc::SleepThread(1'000'000); } for (int i = 0; i < 67; i++) { @@ -50,7 +52,7 @@ namespace hos { svcCloseHandle(saltysd); return true; } - nx::svc::SleepThread(1'000'000); + svc::SleepThread(1'000'000); } return false; diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index 7641e2f0..00dd2822 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -30,6 +30,7 @@ #include "../file/file_utils.hpp" #include "process_management.hpp" +using namespace nx; namespace hos { @@ -62,7 +63,7 @@ namespace hos { u64 pid = 0; do { rc = pmdmntGetProcessId(&pid, Qlaunch); - nx::svc::SleepThread(50 * 1000000ULL); // 50ms + svc::SleepThread(50 * 1000000ULL); // 50ms } while (R_FAILED(rc)); } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index e74b1988..31616197 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -17,6 +17,8 @@ #include "i2cDrv.h" #include +using namespace nx; + Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { // ams::fatal::srv::StopSoundTask::StopSound() // I2C Bus Communication Reference: https://www.ti.com/lit/an/slva704/slva704.pdf @@ -134,7 +136,7 @@ u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain) { return 0u; // Wait 1us - nx::svc::SleepThread(1E3); + svc::SleepThread(1E3); if (!domain->por_val || val != domain->por_val) break; @@ -150,7 +152,7 @@ u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain) { return 0u; // Wait 1us - nx::svc::SleepThread(1E3); + svc::SleepThread(1E3); if (!domain->por_val || val != domain->por_val) break; @@ -173,7 +175,7 @@ Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mv return res; // 5ms Ramp delay - nx::svc::SleepThread(5E6); + svc::SleepThread(5E6); u8 new_val; res = I2cRead_OutU8(domain->device, domain->reg, &new_val); if (R_FAILED(res)) diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp index 22937f8b..92521b89 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -47,7 +47,7 @@ /* Is this a watchdog or a watchcat, that is the question */ -namespace i2c::wdt { +namespace HocI2c::wdt { static bool isWdtEnabled = false; @@ -128,7 +128,7 @@ namespace i2c::wdt { const bool watchdogEnabled = file::config::GetConfigValue(HocClkConfigValue_Watchdog); if (watchdogEnabled) { - Arm(i2c::wdt::MAX77620_WDT_2S); + Arm(HocI2c::wdt::MAX77620_WDT_2S); Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); ASSERT_RESULT_OK(rc, "update_bits"); } else { @@ -136,4 +136,4 @@ namespace i2c::wdt { } } -} // namespace i2c::wdt +} // namespace HocI2c::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp index 005ef6e0..8ae9c0d7 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp @@ -22,7 +22,7 @@ #include "i2cDrv.h" #include "../file/errors.hpp" -namespace i2c::wdt { +namespace HocI2c::wdt { typedef enum { MAX77620_WDT_2S = 0, /* ~2 seconds */ @@ -38,4 +38,4 @@ namespace i2c::wdt { void ResetWdtEnableState(); bool IsWdtEnabled(); -} // namespace i2c::wdt +} // namespace HocI2c::wdt diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index f717610c..2efc031d 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -41,6 +41,7 @@ #define INNER_HEAP_SIZE 0x40000 extern "C" { +using namespace nx; void virtmemSetup(void); extern std::uint32_t __start__; @@ -86,43 +87,43 @@ void __libnx_initheap(void) { } void __appInit(void) { - if (R_FAILED(smInitialize())) { + if (R_FAILED(sm::Initialize())) { fatalThrow(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); } - Result rc = setsysInitialize(); + Result rc = setsys::Initialize(); if (R_SUCCEEDED(rc)) { SetSysFirmwareVersion fw; - rc = setsysGetFirmwareVersion(&fw); + rc = setsys::GetFirmwareVersion(&fw); if (R_SUCCEEDED(rc)) - hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); - setsysExit(); + hosversion::Set(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); + setsys::Exit(); } - + // rc = fanInitialize(); // if (R_FAILED(rc)) // diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); - rc = i2cInitialize(); + rc = i2c::Initialize(); if (R_FAILED(rc)) - diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); + diag::AbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); } void __appExit(void) { // CloseFanControllerThread(); // fanExit(); - i2cExit(); - setsysExit(); - fsdevUnmountAll(); - fsExit(); - smExit(); + i2c::Exit(); + setsys::Exit(); + fsdev::UnmountAll(); + fs::Exit(); + sm::Exit(); } } int main(int argc, char **argv) { Result rc = file::utils::Initialize(); if (R_FAILED(rc)) { - fatalThrow(rc); + fatal::Throw(rc); return 1; } file::config::Initialize(); @@ -156,7 +157,7 @@ int main(int argc, char **argv) { board::Exit(); file::config::Exit(); file::utils::LogLine("Exiting hoc-clk"); - nx::svc::SleepThread(1000000ULL); + svc::SleepThread(1000000ULL); file::utils::Exit(); return 0; diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 230d4190..14f0bfb6 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -48,6 +48,8 @@ #include "../hos/clkrst_ext.hpp" #include +using namespace nx; + #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) namespace mgr { @@ -810,7 +812,7 @@ namespace mgr { else gContext.resolutionHeight = 0; // N/A - gContext.isWdtEnabled = i2c::wdt::IsWdtEnabled(); + gContext.isWdtEnabled = HocI2c::wdt::IsWdtEnabled(); return hasChanged; } @@ -915,7 +917,7 @@ namespace mgr { } void WaitForNextTick() { - i2c::wdt::Pet(); - nx::svc::SleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); + HocI2c::wdt::Pet(); + svc::SleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); } } // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 5677249f..05cf88e5 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -19,6 +19,8 @@ #include "governor.hpp" #include +using namespace nx; + namespace mgr { #define DOWN_HOLD_TICKS_DEFAULT 10 // 50 ms at 5ms poll – how long to hold while ramping down @@ -140,7 +142,7 @@ namespace mgr { cpuLastHz = 0; gpuDownHoldRemaining = 0; gpuLastHz = 0; - nx::svc::SleepThread(pollNs); + svc::SleepThread(pollNs); continue; } @@ -302,14 +304,14 @@ namespace mgr { if (++vrrTick > 50) { vrrTick = 0; board::SetHz(HocClkModule_Display, maxDisplay); - nx::svc::SleepThread(50'000'000); + svc::SleepThread(50'000'000); } } } } } - nx::svc::SleepThread(pollNs); + svc::SleepThread(pollNs); } } diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.cpp b/Source/hoc-clk/sysmodule/src/soc/t210.cpp index 4da17e41..f664fda9 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/t210.cpp @@ -21,9 +21,11 @@ #include #include +using namespace nx; + #define WAIT_NS 1000000000UL -#define usleep(x) (nx::svc::SleepThread(1000UL * x)) +#define usleep(x) (svc::SleepThread(1000UL * x)) #define GPU_TRIM_SYS_GPCPLL_COEFF 0x4 #define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(g_gpu_base + 0x137000ul + (x))) diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index c1190832..5339135b 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -30,6 +30,7 @@ #include "soctherm.hpp" #include "tsensor_common.hpp" +using namespace nx; namespace tsensor { @@ -505,7 +506,7 @@ namespace tsensor { } /* Wait for HW recalibration */ - nx::svc::SleepThread(25'000); + svc::SleepThread(25'000); temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); @@ -528,7 +529,7 @@ namespace tsensor { WriteReg(carVa, CAR_CLK_SOURCE_TSENSOR, CAR_CLK_SOURCE_TSENSOR_VAL); SetBits(carVa, CAR_CLK_OUT_ENB_V, 0x10); - nx::svc::SleepThread(2000); + svc::SleepThread(2000); TSensorSharedCalib sharedCal = {}; CalcSharedCal(&tfuse, &sharedCal, fuseVa); From fa9f911620d2453f0d4f41367c0a7c4fa8423fa3 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:35:07 -0400 Subject: [PATCH 167/205] more C++-ification --- Source/hoc-clk/sysmodule/src/board/board.cpp | 2 +- .../sysmodule/src/board/board_freq.cpp | 2 +- .../sysmodule/src/board/board_freq.hpp | 2 +- .../sysmodule/src/board/board_load.cpp | 2 +- .../sysmodule/src/board/board_profile.cpp | 2 +- .../sysmodule/src/board/board_sensor.cpp | 2 +- Source/hoc-clk/sysmodule/src/file/config.cpp | 2 +- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 2 +- .../src/ipc/{ipc_server.c => ipc_server.cpp} | 36 ++++++++++--------- .../src/ipc/{ipc_server.h => ipc_server.hpp} | 1 + .../hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 2 +- .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 7 ++-- Source/hoc-clk/sysmodule/src/soc/t210.cpp | 4 +-- 13 files changed, 36 insertions(+), 30 deletions(-) rename Source/hoc-clk/sysmodule/src/ipc/{ipc_server.c => ipc_server.cpp} (81%) rename Source/hoc-clk/sysmodule/src/ipc/{ipc_server.h => ipc_server.hpp} (99%) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 82dc6d27..54530d7f 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -46,7 +46,7 @@ #include "board_load.hpp" #include "board_misc.hpp" #include "board_volt.hpp" -#include +#include #include #include "../mapping/mem_map.hpp" #include "../soc/dram_mrr.hpp" diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 77ebd46b..780d67fb 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -40,7 +40,7 @@ #include "../soc/pllmb.hpp" #include "board.hpp" #include "board_name.hpp" -#include +#include #include #include diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp index b0a91b6f..0b21a9c6 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp @@ -33,7 +33,7 @@ #include "../file/errors.hpp" #include "../hos/apm_ext.h" -#include +#include #include diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index 6d693383..bf7a2dec 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -40,7 +40,7 @@ #include "../hos/apm_ext.h" #include "board.hpp" #include "board_misc.hpp" -#include +#include #include using namespace nx; diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp index eadeba8a..38818877 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp @@ -32,7 +32,7 @@ #include "../hos/apm_ext.h" #include "board.hpp" -#include +#include #include namespace board { diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index 896732a0..fe9f44a3 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -41,7 +41,7 @@ #include "../tsensor/bq24193.hpp" #include "../tsensor/soctherm.hpp" #include "board.hpp" -#include +#include #include diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index 92eb9053..a10861f6 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -44,7 +44,7 @@ #include "errors.hpp" #include "file_utils.hpp" #include -#include +#include #include #include #include diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 9d049d7b..3beab7ca 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -30,7 +30,7 @@ #include "../hos/apm_ext.h" #include "file_utils.hpp" -#include +#include #include extern "C" void __libnx_init_time(void); diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.cpp similarity index 81% rename from Source/hoc-clk/sysmodule/src/ipc/ipc_server.c rename to Source/hoc-clk/sysmodule/src/ipc/ipc_server.cpp index 340d9b18..25f03881 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.cpp @@ -26,18 +26,20 @@ #include -#include "ipc_server.h" +#include "ipc_server.hpp" + +using namespace nx; Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions) { if (max_sessions < 1 || max_sessions > (MAX_WAIT_OBJECTS - 1)) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } - server->srvName = smEncodeName(name); + server->srvName = sm::EncodeName(name); server->max = max_sessions + 1; server->count = 0; - Result rc = smRegisterService(&server->handles[0], server->srvName, false, max_sessions); + Result rc = sm::RegisterService(&server->handles[0], server->srvName, false, max_sessions); if (R_SUCCEEDED(rc)) { server->count = 1; } @@ -46,10 +48,10 @@ Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions) { Result ipcServerExit(IpcServer *server) { for (u32 i = 0; i < server->count; i++) { - svcCloseHandle(server->handles[i]); + svc::CloseHandle(server->handles[i]); } server->count = 0; - return smUnregisterService(server->srvName); + return sm::UnregisterService(server->srvName); } static Result _ipcServerAddSession(IpcServer *server, Handle session) { @@ -67,7 +69,7 @@ static Result _ipcServerDeleteSession(IpcServer *server, u32 index) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } - svcCloseHandle(server->handles[index]); + svc::CloseHandle(server->handles[index]); for (u32 j = index; j < (server->count - 1); j++) { server->handles[j] = server->handles[j + 1]; @@ -77,15 +79,15 @@ static Result _ipcServerDeleteSession(IpcServer *server, u32 index) { } static Result _ipcServerParseRequest(IpcServerRequest *r) { - u8 *base = armGetTls(); + u8 *base = (u8*)armGetTls(); - r->hipc = hipcParseRequest(base); + r->hipc = hipc::ParseRequest(base); r->data.cmdId = 0; r->data.size = 0; r->data.ptr = NULL; if (r->hipc.meta.type == CmifCommandType_Request) { - IpcServerRawHeader *header = cmifGetAlignedDataStart(r->hipc.data.data_words, base); + IpcServerRawHeader *header = (IpcServerRawHeader*)cmif::GetAlignedDataStart(r->hipc.data.data_words, base); size_t dataSize = r->hipc.meta.num_data_words * 4; if (!header || dataSize < sizeof(IpcServerRawHeader) || header->magic != CMIF_IN_HEADER_MAGIC) { @@ -103,11 +105,11 @@ static Result _ipcServerParseRequest(IpcServerRequest *r) { } static void _ipcServerPrepareResponse(Result rc, void *data, size_t dataSize) { - u8 *base = armGetTls(); + u8 *base = (u8*)arm::GetTls(); HipcRequest hipc = - hipcMakeRequestInline(base, .type = CmifCommandType_Request, .num_data_words = (sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, ); + hipcMakeRequestInline(base, .type = CmifCommandType_Request, .num_data_words = (u32)(sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, ); - IpcServerRawHeader *rawHeader = cmifGetAlignedDataStart(hipc.data_words, base); + IpcServerRawHeader *rawHeader = (IpcServerRawHeader*)cmif::GetAlignedDataStart(hipc.data_words, base); rawHeader->magic = CMIF_OUT_HEADER_MAGIC; rawHeader->result = rc; @@ -118,9 +120,9 @@ static void _ipcServerPrepareResponse(Result rc, void *data, size_t dataSize) { static Result _ipcServerProcessNewSession(IpcServer *server) { Handle session; - Result rc = svcAcceptSession(&session, server->handles[0]); + Result rc = svc::AcceptSession(&session, server->handles[0]); if (R_SUCCEEDED(rc) && R_FAILED(rc = _ipcServerAddSession(server, session))) { - svcCloseHandle(session); + svc::CloseHandle(session); } return rc; } @@ -132,7 +134,7 @@ static Result _ipcServerProcessSession(IpcServer *server, IpcServerRequestHandle u8 data[IPC_SERVER_EXT_RESPONSE_MAX_DATA_SIZE]; bool close = false; - Result rc = svcReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 1, 0, UINT64_MAX); + Result rc = svc::ReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 1, 0, UINT64_MAX); if (R_SUCCEEDED(rc)) { rc = _ipcServerParseRequest(&r); } @@ -166,9 +168,9 @@ static Result _ipcServerProcessSession(IpcServer *server, IpcServerRequestHandle Result ipcServerProcess(IpcServer *server, IpcServerRequestHandler handler, void *userdata) { s32 handleIndex = -1; - Result rc = svcWaitSynchronization(&handleIndex, server->handles, server->count, UINT64_MAX); + Result rc = svc::WaitSynchronization(&handleIndex, server->handles, server->count, UINT64_MAX); - if (R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= server->count)) { + if (R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= (s32)server->count)) { rc = MAKERESULT(Module_Libnx, LibnxError_NotFound); } diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.hpp similarity index 99% rename from Source/hoc-clk/sysmodule/src/ipc/ipc_server.h rename to Source/hoc-clk/sysmodule/src/ipc/ipc_server.hpp index 7b5a24c8..1357eb14 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.hpp @@ -31,6 +31,7 @@ extern "C" { #endif #include +#include #define IPC_SERVER_EXT_RESPONSE_MAX_DATA_SIZE (0x100 - 0x10 - sizeof(IpcServerRawHeader)) diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index 81247151..8295ea24 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -37,7 +37,7 @@ #include "../hos/apm_ext.h" #include "../mgr/clock_manager.hpp" #include "ipc_service.hpp" -#include +#include #include namespace ipcService { diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index 0f807665..b303c040 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -16,15 +16,18 @@ */ #include +#include #include "../file/file_utils.hpp" +using namespace nx; + Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size) { if (hosversionAtLeast(10, 0, 0)) { u64 out_size; - return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); + return svc::QueryMemoryMapping(virtaddr, &out_size, physaddr, size); } else { - return svcLegacyQueryIoMapping(virtaddr, physaddr, size); + return svc::LegacyQueryIoMapping(virtaddr, physaddr, size); } } diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.cpp b/Source/hoc-clk/sysmodule/src/soc/t210.cpp index f664fda9..20be3485 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/t210.cpp @@ -177,9 +177,9 @@ static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) { static inline Result _svcQueryMemoryMappingFallback(u64 *virtaddr, u64 physaddr, u64 size) { if (hosversionAtLeast(10, 0, 0)) { u64 out_size; - return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); + return svc::QueryMemoryMapping(virtaddr, &out_size, physaddr, size); } else { - return svcLegacyQueryIoMapping(virtaddr, physaddr, size); + return svc::LegacyQueryIoMapping(virtaddr, physaddr, size); } } From fb07924a3da045d3d4fc0e2833037d8703e18398 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:36:13 -0400 Subject: [PATCH 168/205] c++ify ipc server --- Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index 8295ea24..4d6f9ca9 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "../file/config.hpp" @@ -39,6 +40,9 @@ #include "ipc_service.hpp" #include #include + +using namespace nx; + namespace ipcService { namespace { @@ -270,7 +274,7 @@ namespace ipcService { void Initialize() { std::int32_t priority; - Result rc = svcGetThreadPriority(&priority, CUR_THREAD_HANDLE); + Result rc = svc::GetThreadPriority(&priority, CUR_THREAD_HANDLE); ASSERT_RESULT_OK(rc, "svcGetThreadPriority"); rc = ipcServerInit(&gServer, HOCCLK_IPC_SERVICE_NAME, 42); ASSERT_RESULT_OK(rc, "ipcServerInit"); @@ -281,7 +285,7 @@ namespace ipcService { void Exit() { SetRunning(false); - Result rc = threadClose(&gThread); + Result rc = thread::Close(&gThread); ASSERT_RESULT_OK(rc, "threadClose"); rc = ipcServerExit(&gServer); ASSERT_RESULT_OK(rc, "ipcServerExit"); @@ -296,11 +300,11 @@ namespace ipcService { gRunning = running; if (running) { - Result rc = threadStart(&gThread); + Result rc = thread::Start(&gThread); ASSERT_RESULT_OK(rc, "threadStart"); } else { - svcCancelSynchronization(gThread.handle); - threadWaitForExit(&gThread); + svc::CancelSynchronization(gThread.handle); + thread::WaitForExit(&gThread); } } From 7d6f296fa09454b2d46ce46be9c712a5ce626652 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:43:36 -0400 Subject: [PATCH 169/205] c++ify more stuff --- Source/hoc-clk/sysmodule/src/board/board.cpp | 6 ++--- .../sysmodule/src/board/board_freq.cpp | 6 ++--- .../sysmodule/src/board/board_freq.hpp | 6 ++--- .../sysmodule/src/board/board_load.cpp | 6 ++--- .../sysmodule/src/board/board_profile.cpp | 6 ++--- .../sysmodule/src/board/board_sensor.cpp | 6 ++--- Source/hoc-clk/sysmodule/src/file/config.cpp | 6 ++--- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 6 ++--- .../sysmodule/src/i2c/{i2c.c => i2c.cpp} | 7 +++-- .../sysmodule/src/i2c/{i2c.h => i2c.hpp} | 10 +------ Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp | 26 +++++++++---------- .../src/i2c/{max17050.c => max17050.cpp} | 4 +-- .../src/i2c/{max17050.h => max17050.hpp} | 0 .../src/i2c/{tmp451.c => tmp451.cpp} | 21 ++++++++------- .../src/i2c/{tmp451.h => tmp451.hpp} | 12 ++------- .../hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 6 ++--- .../sysmodule/src/mgr/clock_manager.cpp | 2 +- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 6 ++--- .../hoc-clk/sysmodule/src/tsensor/bq24193.hpp | 2 +- 19 files changed, 67 insertions(+), 77 deletions(-) rename Source/hoc-clk/sysmodule/src/i2c/{i2c.c => i2c.cpp} (90%) rename Source/hoc-clk/sysmodule/src/i2c/{i2c.h => i2c.hpp} (93%) rename Source/hoc-clk/sysmodule/src/i2c/{max17050.c => max17050.cpp} (98%) rename Source/hoc-clk/sysmodule/src/i2c/{max17050.h => max17050.hpp} (100%) rename Source/hoc-clk/sysmodule/src/i2c/{tmp451.c => tmp451.cpp} (83%) rename Source/hoc-clk/sysmodule/src/i2c/{tmp451.h => tmp451.hpp} (93%) diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 54530d7f..1d691252 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -26,13 +26,13 @@ #include #include -#include -#include +#include +#include #include #include #include #include -#include +#include #include "../display/display_refresh_rate.hpp" #include "../file/file_utils.hpp" diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 780d67fb..5ed302ce 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -25,11 +25,11 @@ */ #include -#include -#include +#include +#include #include #include -#include +#include #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp index 0b21a9c6..eaa3d0c7 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp @@ -26,10 +26,10 @@ #pragma once #include -#include -#include +#include +#include #include -#include +#include #include "../file/errors.hpp" #include "../hos/apm_ext.h" diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index bf7a2dec..13f5c9a3 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -27,14 +27,14 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include #include -#include +#include #include #include "../hos/apm_ext.h" diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp index 38818877..8f9ef7a3 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp @@ -25,10 +25,10 @@ */ #include -#include -#include +#include +#include #include -#include +#include #include "../hos/apm_ext.h" #include "board.hpp" diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index fe9f44a3..c3f0c4e7 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -27,11 +27,11 @@ #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include "../file/config.hpp" #include "../hos/apm_ext.h" diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index a10861f6..9e504d8a 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -29,13 +29,13 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include -#include +#include #include #include "../board/board.hpp" diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 3beab7ca..754b26e2 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -24,9 +24,9 @@ * -------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "../hos/apm_ext.h" #include "file_utils.hpp" diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.c b/Source/hoc-clk/sysmodule/src/i2c/i2c.cpp similarity index 90% rename from Source/hoc-clk/sysmodule/src/i2c/i2c.c rename to Source/hoc-clk/sysmodule/src/i2c/i2c.cpp index cfdeb177..42564897 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.c +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.cpp @@ -24,7 +24,10 @@ * -------------------------------------------------------------------------- */ -#include "i2c.h" +#include "i2c.hpp" +#include + +using namespace nx; #define I2C_CMD_SND 0 #define I2C_CMD_RCV 1 @@ -34,5 +37,5 @@ Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size) { I2C_CMD_RCV | (I2cTransactionOption_All << 6), out_size }; - return i2csessionExecuteCommandList(s, out, out_size, cmdlist, sizeof(cmdlist)); + return i2csession::ExecuteCommandList(s, out, out_size, cmdlist, sizeof(cmdlist)); } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.h b/Source/hoc-clk/sysmodule/src/i2c/i2c.hpp similarity index 93% rename from Source/hoc-clk/sysmodule/src/i2c/i2c.h rename to Source/hoc-clk/sysmodule/src/i2c/i2c.hpp index 91a099de..75a41f0f 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.hpp @@ -25,15 +25,7 @@ */ #pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include +#include Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size); -#ifdef __cplusplus -} -#endif diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index 31616197..9843d7b8 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -28,14 +28,14 @@ Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { } __attribute__((packed)) cmd; I2cSession _session; - Result res = i2cOpenSession(&_session, dev); + Result res = i2c::OpenSession(&_session, dev); if (res) return res; cmd.reg = reg; cmd.val = val; - res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); - i2csessionClose(&_session); + res = i2csession::SendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + i2csession::Close(&_session); return res; } @@ -48,19 +48,19 @@ Result I2cRead_OutU8(I2cDevice dev, u8 reg, u8 *out) { } __attribute__((packed)) rec; I2cSession _session; - Result res = i2cOpenSession(&_session, dev); + Result res = i2c::OpenSession(&_session, dev); if (res) return res; cmd.reg = reg; - res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + res = i2csession::SendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); if (res) { - i2csessionClose(&_session); + i2csession::Close(&_session); return res; } - res = i2csessionReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); - i2csessionClose(&_session); + res = i2csession::ReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); + i2csession::Close(&_session); if (res) { return res; } @@ -78,19 +78,19 @@ Result I2cRead_OutU16(I2cDevice dev, u8 reg, u16 *out) { } __attribute__((packed)) rec; I2cSession _session; - Result res = i2cOpenSession(&_session, dev); + Result res = i2c::OpenSession(&_session, dev); if (res) return res; cmd.reg = reg; - res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + res = i2csession::SendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); if (res) { - i2csessionClose(&_session); + i2csession::Close(&_session); return res; } - res = i2csessionReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); - i2csessionClose(&_session); + res = i2csession::ReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); + i2csession::Close(&_session); if (res) { return res; } diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.c b/Source/hoc-clk/sysmodule/src/i2c/max17050.cpp similarity index 98% rename from Source/hoc-clk/sysmodule/src/i2c/max17050.c rename to Source/hoc-clk/sysmodule/src/i2c/max17050.cpp index 8f82c14c..df89c3fa 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max17050.c +++ b/Source/hoc-clk/sysmodule/src/i2c/max17050.cpp @@ -22,8 +22,8 @@ * */ -#include "i2c.h" -#include "max17050.h" +#include "i2c.hpp" +#include "max17050.hpp" #define MAX17050_WAIT_NS 1000000000UL diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.h b/Source/hoc-clk/sysmodule/src/i2c/max17050.hpp similarity index 100% rename from Source/hoc-clk/sysmodule/src/i2c/max17050.h rename to Source/hoc-clk/sysmodule/src/i2c/max17050.hpp diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.c b/Source/hoc-clk/sysmodule/src/i2c/tmp451.cpp similarity index 83% rename from Source/hoc-clk/sysmodule/src/i2c/tmp451.c rename to Source/hoc-clk/sysmodule/src/i2c/tmp451.cpp index e82383b4..ab0bb546 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.c +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.cpp @@ -17,8 +17,11 @@ * along with this program. If not, see . */ -#include "i2c.h" -#include "tmp451.h" +#include "i2c.hpp" +#include "tmp451.hpp" +#include + +using namespace nx; #define TMP451_WAIT_NS 1000000000UL @@ -50,14 +53,14 @@ static Result _tmp451_get_temp(u8 reg, u8 dec_reg, s32 *out) { } static void _tmp451_update() { - u64 ticks = armGetSystemTick(); - if (armTicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) { + u64 ticks = arm::GetSystemTick(); + if (arm::TicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) { return; } g_update_ticks = ticks; - if (!serviceIsActive(&g_i2c_session.s)) { + if (!service::IsActive(&g_i2c_session.s)) { return; } @@ -66,18 +69,18 @@ static void _tmp451_update() { } Result tmp451Initialize(void) { - Result rc = i2cInitialize(); + Result rc = i2c::Initialize(); if (R_SUCCEEDED(rc)) { - rc = i2cOpenSession(&g_i2c_session, I2cDevice_Tmp451); + rc = i2c::OpenSession(&g_i2c_session, I2cDevice_Tmp451); } return rc; } void tmp451Exit(void) { - i2csessionClose(&g_i2c_session); - i2cExit(); + i2csession::Close(&g_i2c_session); + i2c::Exit(); } s32 tmp451TempPcb(void) { diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.h b/Source/hoc-clk/sysmodule/src/i2c/tmp451.hpp similarity index 93% rename from Source/hoc-clk/sysmodule/src/i2c/tmp451.h rename to Source/hoc-clk/sysmodule/src/i2c/tmp451.hpp index 7872b59e..e61d3329 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.h +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.hpp @@ -26,17 +26,9 @@ #pragma once -#ifdef __cplusplus -extern "C" { -#endif - -#include - +#include +using namespace nx; Result tmp451Initialize(void); void tmp451Exit(void); s32 tmp451TempPcb(void); s32 tmp451TempSoc(void); - -#ifdef __cplusplus -} -#endif diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index 4d6f9ca9..feffcf81 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -25,11 +25,11 @@ */ #include -#include -#include +#include +#include #include #include -#include +#include #include "../file/config.hpp" #include "../file/errors.hpp" diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 14f0bfb6..d6942317 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "../board/board.hpp" #include "../display/aula.hpp" diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 05cf88e5..cb0900a1 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -316,11 +316,11 @@ namespace mgr { } void StartThreads() { - threadCreate(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); - threadStart(&governorTHREAD); + thread::Create(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); + thread::Start(&governorTHREAD); } void ExitThreads() { - threadClose(&governorTHREAD); + thread::Close(&governorTHREAD); } } // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp index 23b41fa7..c1520e1a 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp @@ -17,7 +17,7 @@ * */ -#include +#include #include "../board/board.hpp" #include "../i2c/i2cDrv.h" From 4b9c4dfaf0acdaf1cc0cced9db7a8598fea29b77 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:44:31 -0400 Subject: [PATCH 170/205] Update file_utils.cpp --- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 754b26e2..212e4033 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -108,7 +108,7 @@ namespace file::utils { // Debug UART log if (g_uart_enabled) { - svcOutputDebugString(buff, len); + svc::OutputDebugString(buff, len); } if (g_log_enabled) { @@ -188,27 +188,27 @@ namespace file::utils { void InitializeAsync() { Thread initThread = { 0 }; - threadCreate(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0); - threadStart(&initThread); + thread::Create(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0); + thread::Start(&initThread); } Result Initialize() { Result rc = 0; if (R_SUCCEEDED(rc)) { - rc = timeInitialize(); + rc = time::Initialize(); } __libnx_init_time(); - timeExit(); + time::Exit(); SetBootTime(); if (R_SUCCEEDED(rc)) { - rc = fsInitialize(); + rc = fs::Initialize(); } if (R_SUCCEEDED(rc)) { - rc = fsdevMountSdmc(); + rc = fsdev::MountSdmc(); } if (R_SUCCEEDED(rc)) { @@ -230,8 +230,8 @@ namespace file::utils { g_log_enabled = false; g_uart_enabled = false; - fsdevUnmountAll(); - fsExit(); + fsdev::UnmountAll(); + fs::Exit(); } } // namespace file::utils From 4efe27ca9177380805dd9962028c18c8ac3b40b0 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:45:25 -0400 Subject: [PATCH 171/205] Update integrations.cpp --- .../hoc-clk/sysmodule/src/hos/integrations.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index 41290dc8..af329f46 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -38,8 +38,8 @@ namespace hos { Handle saltysd; for (int i = 0; i < 67; i++) { - if (R_SUCCEEDED(svcConnectToNamedPort(&saltysd, "InjectServ"))) { - svcCloseHandle(saltysd); + if (R_SUCCEEDED(svc::ConnectToNamedPort(&saltysd, "InjectServ"))) { + svc::CloseHandle(saltysd); break; } if (i == 66) @@ -48,8 +48,8 @@ namespace hos { } for (int i = 0; i < 67; i++) { - if (R_SUCCEEDED(svcConnectToNamedPort(&saltysd, "InjectServ"))) { - svcCloseHandle(saltysd); + if (R_SUCCEEDED(svc::ConnectToNamedPort(&saltysd, "InjectServ"))) { + svc::CloseHandle(saltysd); return true; } svc::SleepThread(1'000'000); @@ -74,8 +74,8 @@ namespace hos { return; SaltySD_GetSharedMemoryHandle(&gRemoteSharedMemory); SaltySD_Term(); - shmemLoadRemote(&gSharedMemory, gRemoteSharedMemory, 0x1000, Perm_Rw); - if (!shmemMap(&gSharedMemory)) + shmem::LoadRemote(&gSharedMemory, gRemoteSharedMemory, 0x1000, Perm_Rw); + if (!shmem::Map(&gSharedMemory)) gSharedMemoryUsed = true; } @@ -111,7 +111,7 @@ namespace hos { } if (!gNxFps) { - uintptr_t base = (uintptr_t)shmemGetAddr(&gSharedMemory); + uintptr_t base = (uintptr_t)shmem::GetAddr(&gSharedMemory); SearchSharedMemoryBlock(base); } @@ -133,7 +133,7 @@ namespace hos { } if (!gNxFps) { - uintptr_t base = (uintptr_t)shmemGetAddr(&gSharedMemory); + uintptr_t base = (uintptr_t)shmem::GetAddr(&gSharedMemory); SearchSharedMemoryBlock(base); } From 127c6f947badf68cfde50e50fe61df33559f665f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:46:31 -0400 Subject: [PATCH 172/205] Update process_management.cpp --- .../sysmodule/src/hos/process_management.cpp | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index 00dd2822..f2008427 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -43,18 +43,18 @@ namespace hos { void InitializeProcessManagement() { Result rc = 0; - rc = pmdmntInitialize(); + rc = pmdmnt::Initialize(); ASSERT_RESULT_OK(rc, "pmdmntInitialize"); - rc = pminfoInitialize(); + rc = pminfo::Initialize(); ASSERT_RESULT_OK(rc, "pminfoInitialize"); - rc = pdmqryInitialize(); + rc = pdmqry::Initialize(); ASSERT_RESULT_OK(rc, "pdmqryInitialize"); - Service *pdmqrySrv = pdmqryGetServiceSession(); - serviceClone(pdmqrySrv, &pdmqryClone); - serviceClose(pdmqrySrv); + Service *pdmqrySrv = pdmqry::GetServiceSession(); + service::Clone(pdmqrySrv, &pdmqryClone); + service::Close(pdmqrySrv); memcpy(pdmqrySrv, &pdmqryClone, sizeof(Service)); } @@ -62,7 +62,7 @@ namespace hos { Result rc = 0; u64 pid = 0; do { - rc = pmdmntGetProcessId(&pid, Qlaunch); + rc = pmdmnt::GetProcessId(&pid, Qlaunch); svc::SleepThread(50 * 1000000ULL); // 50ms } while (R_FAILED(rc)); } @@ -77,14 +77,14 @@ namespace hos { u64 TIDnow; u64 PIDnow; - Result rc = pmdmntGetApplicationProcessId(&PIDnow); + Result rc = pmdmnt::GetApplicationProcessId(&PIDnow); if (R_FAILED(rc)) return rc; - rc = pmdmntGetProgramId(&TIDnow, PIDnow); + rc = pmdmnt::GetProgramId(&TIDnow, PIDnow); if (R_FAILED(rc)) return rc; - rc = pdmqryGetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index); + rc = pdmqry::GetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index); if (R_FAILED(rc)) return rc; if (total_entries == last_total_entries) { @@ -98,7 +98,7 @@ namespace hos { s32 start_entry = end_entry_index - 15; if (start_entry < 0) start_entry = 0; - rc = pdmqryQueryPlayEvent(start_entry, events, sizeof(events) / sizeof(events[0]), &out); + rc = pdmqry::QueryPlayEvent(start_entry, events, sizeof(events) / sizeof(events[0]), &out); if (R_FAILED(rc)) return rc; if (out == 0) @@ -140,7 +140,7 @@ namespace hos { Result rc = 0; u64 pid = 0; u64 tid = 0; - rc = pmdmntGetApplicationProcessId(&pid); + rc = pmdmnt::GetApplicationProcessId(&pid); if (rc == IsQlaunch) { return Qlaunch; @@ -148,7 +148,7 @@ namespace hos { ASSERT_RESULT_OK(rc, "pmdmntGetApplicationProcessId"); - rc = pminfoGetProgramId(&tid, pid); + rc = pminfo::GetProgramId(&tid, pid); if (rc == IsQlaunch) { return Qlaunch; @@ -160,9 +160,9 @@ namespace hos { } void ExitProcessManagement() { - pmdmntExit(); - pminfoExit(); - pdmqryExit(); + pmdmnt::Exit(); + pminfo::Exit(); + pdmqry::Exit(); } } // namespace hos From fb46ac4199621b51026fb30459cd01b3a62d1410 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Mon, 5 Oct 2026 19:48:36 -0400 Subject: [PATCH 173/205] Update display_refresh_rate.cpp --- .../src/display/display_refresh_rate.cpp | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp index eb68ddfe..ee6510b0 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp @@ -241,9 +241,9 @@ namespace display { uint32_t fd = fd_in; if (!fd) - nvOpen(&fd, "/dev/nvdisp-disp1"); + nv::Open(&fd, "/dev/nvdisp-disp1"); NvdcModeDB2 db2 = { 0 }; - int rc = nvIoctl(fd, NVDISP_GET_MODE_DB2, &db2); + int rc = nv::Ioctl(fd, NVDISP_GET_MODE_DB2, &db2); if (rc == 0) { for (size_t i = 0; i < db2.num_modes; i++) { @@ -266,7 +266,7 @@ namespace display { highestRefreshRate = g_dockedRefreshRates[numRates - 1]; NvdcMode2 display_b = { 0 }; - rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); + rc = nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b); struct dpaux_read_0x100 { uint32_t cmd; @@ -284,7 +284,7 @@ namespace display { } set; } dpaux = { 6, 0x100, 0x10 }; - rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); if (rc == 0) { g_dockedLinkRate = dpaux.set.link_rate; // if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && ) @@ -292,7 +292,7 @@ namespace display { } if (!fd_in) - nvClose(fd); + nv::Close(fd); g_dockedHighestRefreshRate = highestRefreshRate; } @@ -320,8 +320,8 @@ namespace display { } DPCD; } dpaux = { 6, 0, 0x10 }; - int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); - nvClose(fd); + int rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + nv::Close(fd); if (rc != 0x75c) return false; @@ -382,19 +382,19 @@ namespace display { return false; uint32_t fd = 0; - if (nvOpen(&fd, "/dev/nvdisp-disp1")) { + if (nv::Open(&fd, "/dev/nvdisp-disp1")) { return false; } NvdcMode2 display_b = { 0 }; - int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); + int rc = nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { - nvClose(fd); + nv::Close(fd); return false; } if (!display_b.pclkKHz) { - nvClose(fd); + nv::Close(fd); return false; } @@ -457,7 +457,7 @@ namespace display { } if (refreshRateNow == g_dockedRefreshRates[itr]) { - nvClose(fd); + nv::Close(fd); return true; } @@ -479,13 +479,13 @@ namespace display { display_b.bitsPerPixel = 24; } - rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b); + rc = nv::Ioctl(fd, NVDISP_VALIDATE_MODE2, &display_b); if (rc == 0) { - rc = nvIoctl(fd, NVDISP_SET_MODE2, &display_b); + rc = nv::Ioctl(fd, NVDISP_SET_MODE2, &display_b); } } - nvClose(fd); + nv::Close(fd); return true; } @@ -503,24 +503,24 @@ namespace display { svc::SleepThread(1000000000); uint32_t fd = 0; - if (nvOpen(&fd, "/dev/nvdisp-disp0")) { + if (nv::Open(&fd, "/dev/nvdisp-disp0")) { return false; } NvdcMode2 display_b = { 0 }; - int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); + int rc = nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { - nvClose(fd); + nv::Close(fd); return false; } if (!display_b.pclkKHz) { - nvClose(fd); + nv::Close(fd); return false; } if ((display_b.vActive == 1280 && display_b.hActive == 720) == false) { - nvClose(fd); + nv::Close(fd); return false; } @@ -566,14 +566,14 @@ namespace display { display_b.vBackPorch = g_handheldTimingsRETRO[itr].vBackPorch; display_b.pclkKHz = g_handheldTimingsRETRO[itr].pixelClock_kHz; - rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b); + rc = nv::Ioctl(fd, NVDISP_VALIDATE_MODE2, &display_b); if (rc == 0) { for (size_t i = 0; i < 5; i++) { - nvIoctl(fd, NVDISP_SET_MODE2, &display_b); + nv::Ioctl(fd, NVDISP_SET_MODE2, &display_b); } } - nvClose(fd); + nv::Close(fd); return true; } @@ -606,8 +606,8 @@ namespace display { } DPCD; } dpaux = { 6, 0, 0x10 }; - int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); - nvClose(fd); + int rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + nv::Close(fd); if (rc != 0) { if (!g_config.isRetroSUPER) { @@ -640,15 +640,15 @@ namespace display { value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4; if (value != 0 && value != 80) { - if (!nvOpen(&fd, "/dev/nvdisp-disp0")) { + if (!nv::Open(&fd, "/dev/nvdisp-disp0")) { NvdcMode2 display_b = { 0 }; - if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { + if (nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; uint64_t pixelClock = display_b.pclkKHz * 1000 + 999; value = (u32)(pixelClock / (h_total * v_total)); } - nvClose(fd); + nv::Close(fd); } else { return false; } @@ -672,7 +672,7 @@ namespace display { if (!g_canChangeRefreshRateDocked) { uint32_t fd = 0; - if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { + if (!nv::Open(&fd, "/dev/nvdisp-disp1")) { struct dpaux_read_0x100 { uint32_t cmd; uint32_t addr; @@ -689,8 +689,8 @@ namespace display { } set; } dpaux = { 6, 0x100, 0x10 }; - int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); - nvClose(fd); + int rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + nv::Close(fd); if (rc == 0) { _getDockedHighestRefreshRate(0); @@ -708,11 +708,11 @@ namespace display { return true; } uint32_t fd = 0; - if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { + if (!nv::Open(&fd, "/dev/nvdisp-disp1")) { NvdcMode2 display_b = { 0 }; - if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { + if (nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { if (!display_b.pclkKHz) { - nvClose(fd); + nv::Close(fd); return false; } @@ -728,7 +728,7 @@ namespace display { } else { value = 60; } - nvClose(fd); + nv::Close(fd); } else { value = 60; } From 5f973f60b2fad2d39c39c39682d6747d7445fdf1 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 10:42:15 +0200 Subject: [PATCH 174/205] Revert C++ libnx bindings and call-site conversion --- Source/hoc-clk/common/include/switch.hpp | 28929 ---------------- Source/hoc-clk/common/src/switch.cpp | 4804 --- Source/hoc-clk/overlay/Makefile | 2 - Source/hoc-clk/overlay/src/ipc.h | 4 +- Source/hoc-clk/sysmodule/Makefile | 2 +- Source/hoc-clk/sysmodule/src/board/board.cpp | 18 +- .../sysmodule/src/board/board_freq.cpp | 27 +- .../sysmodule/src/board/board_freq.hpp | 8 +- .../sysmodule/src/board/board_load.cpp | 14 +- .../sysmodule/src/board/board_misc.cpp | 6 +- .../sysmodule/src/board/board_profile.cpp | 8 +- .../sysmodule/src/board/board_sensor.cpp | 10 +- .../sysmodule/src/board/board_volt.cpp | 4 +- Source/hoc-clk/sysmodule/src/display/aula.cpp | 4 +- .../hoc-clk/sysmodule/src/display/common.hpp | 3 - .../src/display/display_refresh_rate.cpp | 85 +- Source/hoc-clk/sysmodule/src/file/config.cpp | 8 +- .../hoc-clk/sysmodule/src/file/file_utils.cpp | 26 +- .../hoc-clk/sysmodule/src/file/file_utils.hpp | 1 - .../hoc-clk/sysmodule/src/hos/clkrst_ext.cpp | 53 - .../hoc-clk/sysmodule/src/hos/clkrst_ext.hpp | 24 - .../sysmodule/src/hos/integrations.cpp | 23 +- .../sysmodule/src/hos/process_management.cpp | 35 +- .../sysmodule/src/i2c/{i2c.cpp => i2c.c} | 7 +- .../sysmodule/src/i2c/{i2c.hpp => i2c.h} | 10 +- Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp | 35 +- Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h | 2 +- .../src/i2c/{max17050.cpp => max17050.c} | 4 +- .../src/i2c/{max17050.hpp => max17050.h} | 0 .../sysmodule/src/i2c/max77620_wdt.cpp | 6 +- .../sysmodule/src/i2c/max77620_wdt.hpp | 4 +- .../src/i2c/{tmp451.cpp => tmp451.c} | 21 +- .../src/i2c/{tmp451.hpp => tmp451.h} | 12 +- .../src/ipc/{ipc_server.cpp => ipc_server.c} | 36 +- .../src/ipc/{ipc_server.hpp => ipc_server.h} | 1 - .../hoc-clk/sysmodule/src/ipc/ipc_service.cpp | 22 +- Source/hoc-clk/sysmodule/src/main.cpp | 33 +- .../hoc-clk/sysmodule/src/mapping/mem_map.cpp | 7 +- .../sysmodule/src/mgr/clock_manager.cpp | 12 +- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 14 +- .../sysmodule/src/soc/{t210.cpp => t210.c} | 12 +- .../sysmodule/src/soc/{t210.hpp => t210.h} | 0 .../hoc-clk/sysmodule/src/tsensor/bq24193.hpp | 2 +- .../sysmodule/src/tsensor/soctherm.cpp | 5 +- 44 files changed, 246 insertions(+), 34097 deletions(-) delete mode 100644 Source/hoc-clk/common/include/switch.hpp delete mode 100644 Source/hoc-clk/common/src/switch.cpp delete mode 100644 Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp delete mode 100644 Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp rename Source/hoc-clk/sysmodule/src/i2c/{i2c.cpp => i2c.c} (90%) rename Source/hoc-clk/sysmodule/src/i2c/{i2c.hpp => i2c.h} (93%) rename Source/hoc-clk/sysmodule/src/i2c/{max17050.cpp => max17050.c} (98%) rename Source/hoc-clk/sysmodule/src/i2c/{max17050.hpp => max17050.h} (100%) rename Source/hoc-clk/sysmodule/src/i2c/{tmp451.cpp => tmp451.c} (83%) rename Source/hoc-clk/sysmodule/src/i2c/{tmp451.hpp => tmp451.h} (93%) rename Source/hoc-clk/sysmodule/src/ipc/{ipc_server.cpp => ipc_server.c} (81%) rename Source/hoc-clk/sysmodule/src/ipc/{ipc_server.hpp => ipc_server.h} (99%) rename Source/hoc-clk/sysmodule/src/soc/{t210.cpp => t210.c} (96%) rename Source/hoc-clk/sysmodule/src/soc/{t210.hpp => t210.h} (100%) diff --git a/Source/hoc-clk/common/include/switch.hpp b/Source/hoc-clk/common/include/switch.hpp deleted file mode 100644 index b39225be..00000000 --- a/Source/hoc-clk/common/include/switch.hpp +++ /dev/null @@ -1,28929 +0,0 @@ -/** - * @file switch.hpp - * @brief Libnx C++ bindings (AUTO-GENERATED, do not edit). - * @copyright libnx Authors - */ -#pragma once - -#ifndef __cplusplus -#error "libnx C++ bindings require a C++ compiler." -#endif - -#include - -extern "C++" { -/// @brief Root namespace of the libnx C++ bindings. -namespace nx { - -/// @brief Version string of the generated C++ bindings. -/// @return Generator description (see switch.cpp). -const char *CppBindingsVersion(); - -/// NetworkServiceAccountId -using ::AccountNetworkServiceAccountId; -/// Profile -using ::AccountProfile; -/// ProfileBase -using ::AccountProfileBase; -using ::AccountServiceType; -/// Account UserId. -using ::AccountUid; -/// UserData -using ::AccountUserData; -/// Context for AES-128 CBC. -using ::Aes128CbcContext; -/// Context for AES-128 CMAC. -using ::Aes128CmacContext; -/// Context for AES-128 operations. -using ::Aes128Context; -/// Context for AES-128 CTR. -using ::Aes128CtrContext; -/// Context for AES-128 XTS. -using ::Aes128XtsContext; -/// Context for AES-192 CBC. -using ::Aes192CbcContext; -/// Context for AES-192 CMAC. -using ::Aes192CmacContext; -/// Context for AES-192 operations. -using ::Aes192Context; -/// Context for AES-192 CTR. -using ::Aes192CtrContext; -/// Context for AES-192 XTS. -using ::Aes192XtsContext; -/// Context for AES-256 CBC. -using ::Aes256CbcContext; -/// Context for AES-256 CMAC. -using ::Aes256CmacContext; -/// Context for AES-256 operations. -using ::Aes256Context; -/// Context for AES-256 CTR. -using ::Aes256CtrContext; -/// Context for AES-256 XTS. -using ::Aes256XtsContext; -/// ImageOrientation -using ::AlbumImageOrientation; -/// Arg type values pushed for the applet input storage, stored as an u8. -using ::AlbumLaArg; -/// AlbumReportOption -using ::AlbumReportOption; -/// CpuBoostMode. With \ref appletSetCpuBoostMode, only values 0/1 are available. This allows using higher clock rates. -using ::ApmCpuBoostMode; -/// PerformanceMode -using ::ApmPerformanceMode; -/// IApplicationAccessor container. -using ::AppletApplication; -/// ApplicationAttribute -using ::AppletApplicationAttribute; -/// Attributes for launching applications for Quest. -using ::AppletApplicationAttributeForQuest; -/// AppletApplicationExitReason -using ::AppletApplicationExitReason; -/// ApplicationLaunchProperty -using ::AppletApplicationLaunchProperty; -/// ApplicationLaunchRequestInfo -using ::AppletApplicationLaunchRequestInfo; -/// Used by \ref appletInitialize with __nx_applet_AppletAttribute for cmd OpenLibraryAppletProxy (AppletType_LibraryApplet), on [3.0.0+]. The default for this struct is all-zero. -using ::AppletAttribute; -/// CaptureSharedBuffer for the IDisplayController commands. -using ::AppletCaptureSharedBuffer; -/// FocusHandlingMode -using ::AppletFocusHandlingMode; -/// FocusState -using ::AppletFocusState; -/// GpuErrorHandler -using ::AppletGpuErrorHandler; -/// LibraryApplet state. -using ::AppletHolder; -/// applet hook cookie. -using ::AppletHookCookie; -/// applet hook function. -using ::AppletHookFn; -/// applet hook types. -using ::AppletHookType; -/// AppletId -using ::AppletId; -/// IdentityInfo -using ::AppletIdentityInfo; -/// Extension values for \ref appletSetIdleTimeDetectionExtension / \ref appletGetIdleTimeDetectionExtension, for extending user inactivity detection. -using ::AppletIdleTimeDetectionExtension; -/// Cached info for the current LibraryApplet, from \ref appletGetAppletInfo. -using ::AppletInfo; -/// Input policy values for \ref appletSetInputDetectionPolicy. -using ::AppletInputDetectionPolicy; -/// LaunchParameterKind -using ::AppletLaunchParameterKind; -/// LockAccessor -using ::AppletLockAccessor; -/// AppletMessage, for \ref appletGetMessage. See also \ref AppletHookType. -using ::AppletMessage; -/// OperationMode -using ::AppletOperationMode; -/// AppletProcessLaunchReason, from GetLaunchReason. -using ::AppletProcessLaunchReason; -/// ProgramSpecifyKind for the ExecuteProgram cmd. Controls the type of the u64 passed to the ExecuteProgram cmd. -using ::AppletProgramSpecifyKind; -/// AppletResourceUsageInfo, from \ref appletGetAppletResourceUsageInfo. -using ::AppletResourceUsageInfo; -/// Permission values for \ref appletSetScreenShotPermission. -using ::AppletScreenShotPermission; -/// applet IStorage -using ::AppletStorage; -/// Type values for \ref appletPerformSystemButtonPressingIfInFocus. -using ::AppletSystemButtonType; -/// ThemeColorType -using ::AppletThemeColorType; -/// Mode values for \ref appletSetTvPowerStateMatchingMode. -using ::AppletTvPowerStateMatchingMode; -/// AppletType -using ::AppletType; -/// WindowOriginMode -using ::AppletWindowOriginMode; -/// Input mode values for \ref appletSetWirelessPriorityMode. -using ::AppletWirelessPriorityMode; -/// WaitForAddress behaviors. -using ::ArbitrationType; -/// AsyncResult -using ::AsyncResult; -/// AsyncValue -using ::AsyncValue; -/// AudioDeviceName -using ::AudioDeviceName; -using ::AudioDriver; -using ::AudioDriverEtc; -using ::AudioDriverWaveBuf; -using ::AudioDriverWaveBufState; -using ::AudioForceMutePolicy; -using ::AudioHeadphoneOutputLevelMode; -/// Audio input buffer format -using ::AudioInBuffer; -using ::AudioInState; -/// Audio output buffer format -using ::AudioOutBuffer; -using ::AudioOutputMode; -using ::AudioOutState; -using ::AudioRendererAdpcmContext; -using ::AudioRendererAdpcmParameters; -using ::AudioRendererBehaviorInfoIn; -using ::AudioRendererBehaviorInfoOut; -using ::AudioRendererBiquadFilter; -using ::AudioRendererChannelInfoIn; -using ::AudioRendererCircularBufferSinkInfoIn; -using ::AudioRendererConfig; -using ::AudioRendererDeviceSinkInfoIn; -using ::AudioRendererDownMixParameters; -using ::AudioRendererMemPoolInfoIn; -using ::AudioRendererMemPoolInfoOut; -using ::AudioRendererMemPoolState; -using ::AudioRendererMixInfoIn; -using ::AudioRendererOutputRate; -using ::AudioRendererPerformanceBufferInfoIn; -using ::AudioRendererPerformanceBufferInfoOut; -using ::AudioRendererSinkInfoIn; -using ::AudioRendererSinkInfoOut; -using ::AudioRendererSinkType; -using ::AudioRendererUpdateDataHeader; -using ::AudioRendererVoiceInfoIn; -using ::AudioRendererVoiceInfoOut; -using ::AudioRendererVoicePlayState; -using ::AudioRendererWaveBuf; -using ::AudioTarget; -using ::AudrecRecorder; -using ::AvmRequiredVersionEntry; -using ::AvmVersionListEntry; -using ::AvmVersionListImporter; -/// Barrier structure. -using ::Barrier; -using ::Binder; -using ::BpcSleepButtonState; -using ::BqBufferInput; -using ::BqBufferOutput; -using ::BqGraphicBuffer; -using ::BqRect; -/// Break point types -using ::BreakPointType; -/// Break reasons -using ::BreakReason; -/// BSD service type used by the socket driver. -using ::BsdServiceType; -/// GattAttribute -using ::BtdevGattAttribute; -/// GattCharacteristic -using ::BtdevGattCharacteristic; -/// GattDescriptor -using ::BtdevGattDescriptor; -/// GattService -using ::BtdevGattService; -/// AdapterProperty [12.0.0+] -using ::BtdrvAdapterProperty; -/// AdapterProperty [1.0.0-11.0.1] -using ::BtdrvAdapterPropertyOld; -/// AdapterPropertySet [12.0.0+] -using ::BtdrvAdapterPropertySet; -/// AdapterPropertyType [12.0.0+] -using ::BtdrvAdapterPropertyType; -/// Address -using ::BtdrvAddress; -/// AdType -using ::BtdrvAdType; -/// AppearanceCategoryType -using ::BtdrvAppearanceCategoryType; -/// AppearanceType -using ::BtdrvAppearanceType; -/// AudioCodec -using ::BtdrvAudioCodec; -/// AudioControlButtonState -using ::BtdrvAudioControlButtonState; -/// Data for \ref btdrvGetAudioEventInfo. The data stored here depends on the \ref BtdrvAudioEventType. -using ::BtdrvAudioEventInfo; -/// AudioEventType -using ::BtdrvAudioEventType; -/// AudioOutState -using ::BtdrvAudioOutState; -/// BtdrvBleAdBit -using ::BtdrvBleAdBit; -/// BtdrvBleAdFlag -using ::BtdrvBleAdFlag; -/// BleAdvertiseFilter -using ::BtdrvBleAdvertiseFilter; -/// BleAdvertisement -using ::BtdrvBleAdvertisement; -/// BtdrvBleAdvertisePacketData -using ::BtdrvBleAdvertisePacketData; -/// BleAdvertisePacketParameter -using ::BtdrvBleAdvertisePacketParameter; -/// BleClientGattOperationInfo -using ::BtdrvBleClientGattOperationInfo; -/// BleConnectionInfo -using ::BtdrvBleConnectionInfo; -/// BleConnectionParameter [9.0.0+] -using ::BtdrvBleConnectionParameter; -/// Data for \ref btdrvGetBleManagedEventInfo and \ref btdrvGetLeHidEventInfo. The data stored here depends on the \ref BtdrvBleEventType. -using ::BtdrvBleEventInfo; -/// BleEventType -using ::BtdrvBleEventType; -/// BleScanResult -using ::BtdrvBleScanResult; -/// BluetoothHhReportType -/// Bit0-1 directly control the HID bluetooth transaction report-type value. -/// Bit2-3: these directly control the Parameter Reserved field for SetReport, for GetReport these control the Parameter Reserved and Size bits. -using ::BtdrvBluetoothHhReportType; -/// BluetoothPinCode [1.0.0-11.0.1] -using ::BtdrvBluetoothPinCode; -/// BluetoothPropertyType [1.0.0-11.0.1] -using ::BtdrvBluetoothPropertyType; -/// ChannelMapList -using ::BtdrvChannelMapList; -/// CircularBuffer -using ::BtdrvCircularBuffer; -/// ClassOfDevice -using ::BtdrvClassOfDevice; -/// ConnectionEventType -using ::BtdrvConnectionEventType; -/// Data for \ref btdrvGetEventInfo. The data stored here depends on the \ref BtdrvEventType. -using ::BtdrvEventInfo; -/// EventType -using ::BtdrvEventType; -/// ExtEventType [1.0.0-11.0.1] -using ::BtdrvExtEventType; -/// This determines the u16 data to write into a CircularBuffer. -using ::BtdrvFatalReason; -/// GattAttribute -using ::BtdrvGattAttribute; -/// GattAttributePermission -using ::BtdrvGattAttributePermission; -/// GattAttributeType -using ::BtdrvGattAttributeType; -/// GattAttributeUuid -using ::BtdrvGattAttributeUuid; -/// GattAuthReqType -using ::BtdrvGattAuthReqType; -/// GattCharacteristicProperty -using ::BtdrvGattCharacteristicProperty; -/// GattCharacteristicUuidType -using ::BtdrvGattCharacteristicUuidType; -/// GattDescriptorUuidType -using ::BtdrvGattDescriptorUuidType; -/// GattId -using ::BtdrvGattId; -/// GattServiceUuidType -using ::BtdrvGattServiceUuidType; -/// HidConnectionStatus [12.0.0+] -using ::BtdrvHidConnectionStatus; -/// HidData [1.0.0-8.1.1] -using ::BtdrvHidData; -/// Data for \ref btdrvGetHidEventInfo. The data stored here depends on the \ref BtdrvHidEventType. -using ::BtdrvHidEventInfo; -/// HidEventType -using ::BtdrvHidEventType; -/// HidReport [9.0.0+]. -using ::BtdrvHidReport; -/// Data for \ref btdrvGetHidReportEventInfo. The data stored here depends on the \ref BtdrvHidEventType. -using ::BtdrvHidReportEventInfo; -/// The raw sharedmem data for HidReportEventInfo. -using ::BtdrvHidReportEventInfoBufferData; -/// BtdrvInquiryStatus -using ::BtdrvInquiryStatus; -/// LeConnectionParams [5.0.0-8.1.1] -using ::BtdrvLeConnectionParams; -/// LeEventInfo -using ::BtdrvLeEventInfo; -/// PcmParameter -using ::BtdrvPcmParameter; -/// BtdrvPinCode [12.0.0+] -using ::BtdrvPinCode; -/// PlrList -using ::BtdrvPlrList; -/// PlrStatistics -using ::BtdrvPlrStatistics; -/// AudioDevice -using ::BtmAudioDevice; -/// AudioDeviceCondition [13.0.0+] -using ::BtmAudioDeviceCondition; -/// AudioDeviceInfo [13.0.0+] -using ::BtmAudioDeviceInfo; -/// BdName -using ::BtmBdName; -/// BleDataPath -using ::BtmBleDataPath; -/// BluetoothMode -using ::BtmBluetoothMode; -/// ClassOfDevice -using ::BtmClassOfDevice; -/// DeviceCondition [13.0.0+] -using ::BtmDeviceCondition; -/// DeviceCondition [1.0.0-12.1.0] -using ::BtmDeviceConditionLegacy; -/// DeviceConditionList [1.0.0-12.1.0] -using ::BtmDeviceConditionList; -/// DeviceConditionList [1.0.0-5.0.2] -using ::BtmDeviceConditionListV100; -/// DeviceConditionList [5.1.0-7.0.1] -using ::BtmDeviceConditionListV510; -/// DeviceConditionList [8.0.0-8.1.1] -using ::BtmDeviceConditionListV800; -/// DeviceConditionList [9.0.0-12.1.0] -using ::BtmDeviceConditionListV900; -/// DeviceInfo [13.0.0+] -using ::BtmDeviceInfo; -/// DeviceInfo [1.0.0-12.1.0] -using ::BtmDeviceInfoLegacy; -/// DeviceInfoList -using ::BtmDeviceInfoList; -/// DeviceProperty -using ::BtmDeviceProperty; -/// DevicePropertyList -using ::BtmDevicePropertyList; -/// DeviceSlotMode -using ::BtmDeviceSlotMode; -/// DeviceSlotModeList -using ::BtmDeviceSlotModeList; -/// GattCharacteristic -using ::BtmGattCharacteristic; -/// GattClientConditionList -using ::BtmGattClientConditionList; -/// GattDescriptor -using ::BtmGattDescriptor; -/// GattService -using ::BtmGattService; -/// HidDeviceCondition -using ::BtmHidDeviceCondition; -/// HidDeviceInfo -using ::BtmHidDeviceInfo; -/// HostDeviceProperty -using ::BtmHostDeviceProperty; -/// LinkKey -using ::BtmLinkKey; -/// Profile -using ::BtmProfile; -/// ShortenedDeviceCondition [14.0.0+] -using ::BtmShortenedDeviceCondition; -/// ShortenedDeviceInfo [13.0.0+] -using ::BtmShortenedDeviceInfo; -/// SlotMode -using ::BtmSlotMode; -using ::BtmSniffMode; -/// BtmState -using ::BtmState; -/// TsiMode -using ::BtmTsiMode; -/// WlanMode -using ::BtmWlanMode; -/// ZeroRetransmissionList -using ::BtmZeroRetransmissionList; -/// AlbumCache -using ::CapsAlbumCache; -using ::CapsAlbumContentsUsage; -using ::CapsAlbumContentsUsageFlag; -/// AlbumEntry -using ::CapsAlbumEntry; -/// AlbumFileContents -using ::CapsAlbumFileContents; -/// AlbumFileContentsFlag -using ::CapsAlbumFileContentsFlag; -/// AlbumFileDateTime. This corresponds to each field in the Album entry filename, prior to the "-": "YYYYMMDDHHMMSSII". -using ::CapsAlbumFileDateTime; -/// AlbumEntryId -using ::CapsAlbumFileId; -using ::CapsAlbumStorage; -using ::CapsAlbumUsage16; -using ::CapsAlbumUsage2; -using ::CapsAlbumUsage3; -/// ApplicationAlbumEntry -using ::CapsApplicationAlbumEntry; -/// ApplicationAlbumFileEntry -using ::CapsApplicationAlbumFileEntry; -/// ApplicationData -using ::CapsApplicationData; -using ::CapsApplicationId; -/// ContentType -using ::CapsContentType; -/// LoadAlbumScreenShotImageOutput -using ::CapsLoadAlbumScreenShotImageOutput; -/// LoadAlbumScreenShotImageOutputForApplication -using ::CapsLoadAlbumScreenShotImageOutputForApplication; -/// ScreenShotAttribute -using ::CapsScreenShotAttribute; -/// ScreenShotAttributeForApplication. Only unk_x0 is used by official sw. -using ::CapsScreenShotAttributeForApplication; -/// ScreenShotDecodeOption -using ::CapsScreenShotDecodeOption; -/// ScreenShotDecoderFlag -using ::CapsScreenShotDecoderFlag; -/// UserIdList -using ::CapsUserIdList; -using ::ClkrstSession; -using ::CmifCommandType; -using ::CmifDomainInHeader; -using ::CmifDomainOutHeader; -using ::CmifDomainRequestType; -using ::CmifInHeader; -using ::CmifOutHeader; -using ::CmifRequest; -using ::CmifRequestFormat; -using ::CmifResponse; -/// Code memory mapping operations -using ::CodeMapOperation; -using ::ColorSetId; -/// Condition variable. -using ::CondVar; -/// Structure representing an entry in the homebrew environment configuration. -using ::ConfigEntry; -/// A font struct for the console. -using ::ConsoleFont; -/// Renderer interface for the console. -using ::ConsoleRenderer; -/// Armv8 CPU register. -using ::CpuRegister; -/// Address space types for CreateProcessFlags -using ::CreateProcessFlagAddressSpace; -/// Flags for svcCreateProcess and CreateProcess event -using ::CreateProcessFlags; -/// Console debug devices supported by libnx. -using ::debugDevice; -/// DebugEvent flags -using ::DebugEventFlag; -/// DebugEvent structure -using ::DebugEventInfo; -/// DebugEvent types -using ::DebugEventType; -/// Debug exception types -using ::DebugException; -/// Debug Thread Parameters. -using ::DebugThreadParam; -/// ApplicationErrorArg -using ::ErrorApplicationArg; -/// Error application config. -using ::ErrorApplicationConfig; -/// Stores error-codes which are displayed as XXXX-XXXX, low for the former and desc for the latter. -using ::ErrorCode; -/// Common error arg data. -using ::ErrorCommonArg; -/// Common header for the start of the arg storage. -using ::ErrorCommonHeader; -/// Error context. -using ::ErrorContext; -/// Error type for ErrorContext.type -using ::ErrorContextType; -/// Error arg data for EULA. -using ::ErrorEulaArg; -/// Additional input storage data for \ref errorSystemUpdateEulaShow. -using ::ErrorEulaData; -/// Error arg data for certain errors with module PCTL. -using ::ErrorPctlArg; -/// Error arg data for Record. -using ::ErrorRecordArg; -/// ResultBacktrace -using ::ErrorResultBacktrace; -/// SystemErrorArg -using ::ErrorSystemArg; -/// Error system config. -using ::ErrorSystemConfig; -/// Error type for ErrorCommonHeader.type. -using ::ErrorType; -/// Kernel-mode event structure. -using ::Event; -using ::FanController; -/// Struct for fatal Cpu context, 32-bit. -using ::FatalAarch32Context; -/// Struct for fatal Cpu context, 64-bit. -using ::FatalAarch64Context; -using ::FatalCpuContext; -/// Type of thrown fatal error. -using ::FatalPolicy; -/// FatFatError -using ::FatFatError; -/// FatFatReportInfo1 -using ::FatFatReportInfo1; -/// FatFatReportInfo2 -using ::FatFatReportInfo2; -/// FatFatSafeInfo -using ::FatFatSafeInfo; -using ::FinalOutputRecorderBuffer; -using ::FinalOutputRecorderParameter; -using ::FinalOutputRecorderParameterInternal; -/// Armv8 NEON register. -using ::FpuRegister; -/// Framebuffer structure. -using ::Framebuffer; -/// FriendInvitationGameModeDescription -using ::FriendsFriendInvitationGameModeDescription; -/// FriendInvitationGroupId -using ::FriendsFriendInvitationGroupId; -/// FriendInvitationId -using ::FriendsFriendInvitationId; -/// InAppScreenName -using ::FriendsInAppScreenName; -/// Arg struct pushed for the applet input storage, for [9.0.0+]. -using ::FriendsLaArg; -/// Common data for the arg struct, for the pre-9.0.0 types. -/// This is only set for ::FriendsLaArgType_ShowUserDetailInfo/::FriendsLaArgType_StartSendingFriendRequest, for everything else this is cleared. -using ::FriendsLaArgCommonData; -/// Header for the arg struct. -using ::FriendsLaArgHeader; -/// Arg type values used with \ref FriendsLaArg. -using ::FriendsLaArgType; -/// Arg struct pushed for the applet input storage, for pre-9.0.0. -using ::FriendsLaArgV1; -using ::FriendsServiceType; -/// FriendsUserSetting -using ::FriendsUserSetting; -/// This is nn::fssystem::ArchiveMacKey. Used by \ref setsysGetThemeKey and \ref setsysSetThemeKey. Does not appear to be in use elsewhere. -using ::FsArchiveMacKey; -/// BisPartitionId -using ::FsBisPartitionId; -using ::FsCodeInfo; -/// FsContentAttributes -using ::FsContentAttributes; -using ::FsContentStorageId; -/// For use with fsFsCreateFile. -using ::FsCreateOption; -using ::FsCustomStorageId; -/// Open directory struct -using ::fsdev_dir_t; -using ::FsDeviceOperator; -using ::FsDir; -/// Directory entry. -using ::FsDirectoryEntry; -/// Returned by fsFsGetEntryType. -using ::FsDirEntryType; -/// For use with fsFsOpenDirectory. -using ::FsDirOpenMode; -using ::FsEventNotifier; -using ::FsFile; -using ::FsFileSystem; -/// FileSystemAttribute -using ::FsFileSystemAttribute; -/// FsFileSystemProxyErrorInfo -using ::FsFileSystemProxyErrorInfo; -/// FileSystemQueryId -using ::FsFileSystemQueryId; -/// FileSystemType -using ::FsFileSystemType; -using ::FsGameCardAttribute; -/// FsGameCardErrorReportInfo -using ::FsGameCardErrorReportInfo; -using ::FsGameCardHandle; -using ::FsGameCardPartition; -using ::FsGameCardUpdatePartitionInfo; -/// ImageDirectoryId -using ::FsImageDirectoryId; -/// FsMemoryReportInfo -using ::FsMemoryReportInfo; -/// For use with fsOpenHostFileSystemWithOption -using ::FsMountHostOption; -/// For use with fsFsOpenFile. -using ::FsOpenMode; -using ::FsOperationId; -/// FsPriority -using ::FsPriority; -using ::FsRangeInfo; -/// For use with fsFileRead. -using ::FsReadOption; -using ::FsRightsId; -/// SaveDataAttribute -using ::FsSaveDataAttribute; -/// SaveDataCreationInfo -using ::FsSaveDataCreationInfo; -/// SaveDataExtraData -using ::FsSaveDataExtraData; -/// SaveDataFilter -using ::FsSaveDataFilter; -/// SaveDataFlags -using ::FsSaveDataFlags; -/// SaveDataInfo -using ::FsSaveDataInfo; -using ::FsSaveDataInfoReader; -/// SaveDataMetaInfo -using ::FsSaveDataMetaInfo; -/// SaveDataMetaType -using ::FsSaveDataMetaType; -/// SaveDataRank -using ::FsSaveDataRank; -/// SaveDataSpaceId -using ::FsSaveDataSpaceId; -/// SaveDataType -using ::FsSaveDataType; -using ::FsStorage; -/// FsStorageErrorInfo -using ::FsStorageErrorInfo; -using ::FsStorageForBatchRead; -using ::FsTimeStampRaw; -/// For use with fsFileWrite. -using ::FsWriteOption; -using ::GpioDirection; -using ::GpioInterruptMode; -using ::GpioInterruptStatus; -using ::GpioPadName; -using ::GpioPadSession; -using ::GpioValue; -/// GameMovieId -using ::GrcGameMovieId; -/// GameMovieTrimmer -using ::GrcGameMovieTrimmer; -/// IMovieMaker -using ::GrcMovieMaker; -/// OffscreenRecordingParameter -using ::GrcOffscreenRecordingParameter; -/// Stream type values for \ref grcdTransfer. -using ::GrcStream; -///< 128-bit volatile signed integer. -using ::Handle; -/// HidAnalogStickCalibrationStateImpl -using ::HidAnalogStickCalibrationStateImpl; -/// HidAnalogStickCalibrationStateImplAtomicStorage -using ::HidAnalogStickCalibrationStateImplAtomicStorage; -/// HidAnalogStickCalibrationStateImplLifo -using ::HidAnalogStickCalibrationStateImplLifo; -/// HidAnalogStickState -using ::HidAnalogStickState; -/// AppletFooterUiType (system) -using ::HidAppletFooterUiType; -/// HidBasicXpadLifo -using ::HidBasicXpadLifo; -/// HidBasicXpadSharedMemoryEntry -using ::HidBasicXpadSharedMemoryEntry; -/// HidBasicXpadSharedMemoryFormat -using ::HidBasicXpadSharedMemoryFormat; -/// HidBasicXpadState -using ::HidBasicXpadState; -/// HidBasicXpadStateAtomicStorage -using ::HidBasicXpadStateAtomicStorage; -/// BusHandle -using ::HidbusBusHandle; -/// BusType -using ::HidbusBusType; -/// HidbusDataAccessorHeader -using ::HidbusDataAccessorHeader; -/// HidbusJoyButtonOnlyPollingDataAccessor -using ::HidbusJoyButtonOnlyPollingDataAccessor; -/// HidbusJoyButtonOnlyPollingDataAccessorEntry -using ::HidbusJoyButtonOnlyPollingDataAccessorEntry; -/// HidbusJoyButtonOnlyPollingDataAccessorEntryData -using ::HidbusJoyButtonOnlyPollingDataAccessorEntryData; -/// HidbusJoyDisableSixAxisPollingDataAccessor -using ::HidbusJoyDisableSixAxisPollingDataAccessor; -/// HidbusJoyDisableSixAxisPollingDataAccessorEntry -using ::HidbusJoyDisableSixAxisPollingDataAccessorEntry; -/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData -using ::HidbusJoyDisableSixAxisPollingDataAccessorEntryData; -/// HidbusJoyEnableSixAxisPollingDataAccessor -using ::HidbusJoyEnableSixAxisPollingDataAccessor; -/// HidbusJoyEnableSixAxisPollingDataAccessorEntry -using ::HidbusJoyEnableSixAxisPollingDataAccessorEntry; -/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData -using ::HidbusJoyEnableSixAxisPollingDataAccessorEntryData; -/// JoyPollingMode -using ::HidbusJoyPollingMode; -/// JoyPollingReceivedData -using ::HidbusJoyPollingReceivedData; -/// StatusManager -using ::HidbusStatusManager; -/// HidbusStatusManagerEntry -using ::HidbusStatusManagerEntry; -/// Common data for HidbusStatusManagerEntry*. -using ::HidbusStatusManagerEntryCommon; -/// HidbusStatusManagerEntry on 5.x. -using ::HidbusStatusManagerEntryV5; -/// StatusManager on 5.x. -using ::HidbusStatusManagerV5; -/// HidCaptureButtonLifo -using ::HidCaptureButtonLifo; -/// HidCaptureButtonSharedMemoryFormat -using ::HidCaptureButtonSharedMemoryFormat; -/// HidCaptureButtonState -using ::HidCaptureButtonState; -/// HidCaptureButtonStateAtomicStorage -using ::HidCaptureButtonStateAtomicStorage; -/// AnalogStickAssignment -using ::HidcfgAnalogStickAssignment; -/// AnalogStickRotation -using ::HidcfgAnalogStickRotation; -/// ButtonConfigEmbedded -using ::HidcfgButtonConfigEmbedded; -/// ButtonConfigFull -using ::HidcfgButtonConfigFull; -/// ButtonConfigLeft -using ::HidcfgButtonConfigLeft; -/// ButtonConfigRight -using ::HidcfgButtonConfigRight; -/// Selects what button to map to. -using ::HidcfgDigitalButtonAssignment; -/// StorageName -using ::HidcfgStorageName; -/// HidColorAttribute -using ::HidColorAttribute; -/// HidCommonLifoHeader -using ::HidCommonLifoHeader; -/// HidConsoleSixAxisSensor -using ::HidConsoleSixAxisSensor; -/// AbstractedPadHandle -using ::HiddbgAbstractedPadHandle; -/// AbstractedPadState -using ::HiddbgAbstractedPadState; -/// State for overriding \ref HidDebugPadState. -using ::HiddbgDebugPadAutoPilotState; -/// HdlsAttribute -using ::HiddbgHdlsAttribute; -/// HdlsDeviceInfo, for [9.0.0+]. Converted to/from \ref HiddbgHdlsDeviceInfoV7 on prior sysvers. -using ::HiddbgHdlsDeviceInfo; -/// HdlsDeviceInfo, for [7.0.0-8.1.0]. -using ::HiddbgHdlsDeviceInfoV7; -/// HdlsHandle -using ::HiddbgHdlsHandle; -/// HdlsNpadAssignment. Same controllers as \ref HiddbgHdlsStateList, with different entry data. -using ::HiddbgHdlsNpadAssignment; -/// HdlsNpadAssignmentEntry -using ::HiddbgHdlsNpadAssignmentEntry; -/// HdlsSessionId, returned by \ref hiddbgAttachHdlsWorkBuffer. -using ::HiddbgHdlsSessionId; -/// HdlsState, for [12.0.0+]. -using ::HiddbgHdlsState; -/// HdlsStateList, for [12.0.0+]. -/// This contains a list of all controllers, including non-virtual controllers. -using ::HiddbgHdlsStateList; -/// HdlsStateListEntry, for [12.0.0+]. -using ::HiddbgHdlsStateListEntry; -/// HdlsStateListEntryV7, for [7.0.0-8.1.0]. -using ::HiddbgHdlsStateListEntryV7; -/// HdlsStateListEntry, for [9.0.0-11.0.1]. -using ::HiddbgHdlsStateListEntryV9; -/// HdlsStateListV7, for [7.0.0-8.1.0]. This contains a list of all controllers, including non-virtual controllers. -using ::HiddbgHdlsStateListV7; -/// HdlsStateList, for [9.0.0-11.0.1]. -using ::HiddbgHdlsStateListV9; -/// HdlsState, for [7.0.0-8.1.0]. -using ::HiddbgHdlsStateV7; -/// HdlsState, for [9.0.0-11.0.1]. -using ::HiddbgHdlsStateV9; -/// State for overriding \ref HidKeyboardState. -using ::HiddbgKeyboardAutoPilotState; -/// State for overriding \ref HidMouseState. -using ::HiddbgMouseAutoPilotState; -/// HiddbgNpadButton. For the remaining buttons, see \ref HidNpadButton. -using ::HiddbgNpadButton; -/// State for overriding SleepButtonState. -using ::HiddbgSleepButtonAutoPilotState; -/// HidDebugPadAttribute -using ::HidDebugPadAttribute; -/// HidDebugPadButton -using ::HidDebugPadButton; -/// HidDebugPadLifo -using ::HidDebugPadLifo; -/// HidDebugPadSharedMemoryFormat -using ::HidDebugPadSharedMemoryFormat; -/// HidDebugPadState -using ::HidDebugPadState; -/// HidDebugPadStateAtomicStorage -using ::HidDebugPadStateAtomicStorage; -/// Internal DeviceType for [9.0.0+]. Converted to/from the pre-9.0.0 version of this by the hiddbg funcs. -using ::HidDeviceType; -/// DeviceType (system) -using ::HidDeviceTypeBits; -/// HidDigitizerLifo -using ::HidDigitizerLifo; -/// HidDigitizerSharedMemoryFormat -using ::HidDigitizerSharedMemoryFormat; -/// HidDigitizerState -using ::HidDigitizerState; -/// HidDigitizerStateAtomicStorage -using ::HidDigitizerStateAtomicStorage; -/// HidDirectionState -using ::HidDirectionState; -/// HidGestureAttribute -using ::HidGestureAttribute; -/// HidGestureDirection -using ::HidGestureDirection; -/// HidGestureDummyStateAtomicStorage -using ::HidGestureDummyStateAtomicStorage; -/// HidGestureLifo -using ::HidGestureLifo; -/// HidGesturePoint -using ::HidGesturePoint; -/// HidGestureSharedMemoryFormat -using ::HidGestureSharedMemoryFormat; -/// HidGestureState -using ::HidGestureState; -/// HidGestureType -using ::HidGestureType; -/// GyroscopeZeroDriftMode -using ::HidGyroscopeZeroDriftMode; -/// HidHomeButtonLifo -using ::HidHomeButtonLifo; -/// HidHomeButtonSharedMemoryFormat -using ::HidHomeButtonSharedMemoryFormat; -/// HidHomeButtonState -using ::HidHomeButtonState; -/// HidHomeButtonStateAtomicStorage -using ::HidHomeButtonStateAtomicStorage; -/// HidInputDetectorLifo -using ::HidInputDetectorLifo; -/// HidInputDetectorSharedMemoryEntry -using ::HidInputDetectorSharedMemoryEntry; -/// HidInputDetectorSharedMemoryFormat -using ::HidInputDetectorSharedMemoryFormat; -/// HidInputDetectorState -using ::HidInputDetectorState; -/// HidInputDetectorStateAtomicStorage -using ::HidInputDetectorStateAtomicStorage; -/// HidKeyboardKey -using ::HidKeyboardKey; -/// HidKeyboardLifo -using ::HidKeyboardLifo; -/// KeyboardLockKeyEvent -using ::HidKeyboardLockKeyEvent; -/// HidKeyboardModifier -using ::HidKeyboardModifier; -/// HidKeyboardSharedMemoryFormat -using ::HidKeyboardSharedMemoryFormat; -/// HidKeyboardState -using ::HidKeyboardState; -/// HidKeyboardStateAtomicStorage -using ::HidKeyboardStateAtomicStorage; -/// ControllerFirmwareUpdateArg -using ::HidLaControllerFirmwareUpdateArg; -/// ControllerKeyRemappingArg -using ::HidLaControllerKeyRemappingArg; -/// ControllerSupportArg for [8.0.0+], converted to \ref HidLaControllerSupportArgV3 on pre-8.0.0. -using ::HidLaControllerSupportArg; -/// Identification color used by HidLaControllerSupportArg*. When HidLaControllerSupportArgHeader::enable_identification_color is set this controls the color of the UI player box outline. -using ::HidLaControllerSupportArgColor; -/// Common header used by HidLaControllerSupportArg*. -/// max_supported_players is 4 on pre-8.0.0, 8 on [8.0.0+]. player_count_min and player_count_max are overriden with value 4 when larger than value 4, during conversion handling for \ref HidLaControllerSupportArg on pre-8.0.0. -using ::HidLaControllerSupportArgHeader; -/// ControllerSupportArgPrivate -using ::HidLaControllerSupportArgPrivate; -/// ControllerSupportArg for [1.0.0+]. -using ::HidLaControllerSupportArgV3; -/// ControllerSupportCaller -using ::HidLaControllerSupportCaller; -/// Mode values for HidLaControllerSupportArgPrivate::mode. -using ::HidLaControllerSupportMode; -/// ControllerSupportResultInfo. First 8-bytes from the applet output storage. -using ::HidLaControllerSupportResultInfo; -/// Struct for the applet output storage. -using ::HidLaControllerSupportResultInfoInternal; -/// HidMouseAttribute -using ::HidMouseAttribute; -/// HidMouseButton -using ::HidMouseButton; -/// HidMouseLifo -using ::HidMouseLifo; -/// HidMouseSharedMemoryFormat -using ::HidMouseSharedMemoryFormat; -/// HidMouseState -using ::HidMouseState; -/// HidMouseStateAtomicStorage -using ::HidMouseStateAtomicStorage; -/// HidNfcXcdDeviceHandleState -using ::HidNfcXcdDeviceHandleState; -/// HidNfcXcdDeviceHandleStateImpl -using ::HidNfcXcdDeviceHandleStateImpl; -/// HidNfcXcdDeviceHandleStateImplAtomicStorage -using ::HidNfcXcdDeviceHandleStateImplAtomicStorage; -/// HidNpadAttribute -using ::HidNpadAttribute; -/// HidNpadButton -using ::HidNpadButton; -/// HidNpadCommonLifo -using ::HidNpadCommonLifo; -/// HidNpadCommonState -using ::HidNpadCommonState; -///< State for ::HidNpadStyleTag_NpadSystem. Analog-sticks state are always zero. Only the following button bits are available: HidNpadButton_A, HidNpadButton_B, HidNpadButton_X, HidNpadButton_Y, HidNpadButton_Left, HidNpadButton_Up, HidNpadButton_Right, HidNpadButton_Down, HidNpadButton_L, HidNpadButton_R. -/// HidNpadCommonStateAtomicStorage -using ::HidNpadCommonStateAtomicStorage; -/// NpadCommunicationMode -using ::HidNpadCommunicationMode; -/// Npad colors. -/// Color fields are zero when not set. -using ::HidNpadControllerColor; -/// HidNpadFullKeyColorState -using ::HidNpadFullKeyColorState; -using ::HidNpadFullKeyState; -///< State for ::HidNpadStyleTag_NpadJoyRight. -/// State for ::HidNpadStyleTag_NpadGc. Loaded from the same lifo as \ref HidNpadFullKeyState, with the additional trigger_l/trigger_r loaded from elsewhere. -using ::HidNpadGcState; -/// HidNpadGcTriggerLifo -using ::HidNpadGcTriggerLifo; -/// HidNpadGcTriggerState -using ::HidNpadGcTriggerState; -/// HidNpadGcTriggerStateAtomicStorage -using ::HidNpadGcTriggerStateAtomicStorage; -/// This controls how many Joy-Cons must be attached for handheld-mode to be activated. -using ::HidNpadHandheldActivationMode; -/// State for ::HidNpadStyleTag_NpadHandheldLark. The base state is loaded from the same lifo as \ref HidNpadHandheldState. -using ::HidNpadHandheldLarkState; -///< State for ::HidNpadStyleTag_NpadFullKey. -using ::HidNpadHandheldState; -/// HID controller IDs -using ::HidNpadIdType; -/// NpadInterfaceType (system) -using ::HidNpadInterfaceType; -/// HidNpadInternalState -using ::HidNpadInternalState; -/// NpadJoyAssignmentMode -using ::HidNpadJoyAssignmentMode; -/// HidNpadJoyColorState -using ::HidNpadJoyColorState; -/// NpadJoyDeviceType -using ::HidNpadJoyDeviceType; -///< State for ::HidNpadStyleTag_NpadHandheld. -using ::HidNpadJoyDualState; -/// NpadJoyHoldType -using ::HidNpadJoyHoldType; -///< State for ::HidNpadStyleTag_NpadJoyDual. -using ::HidNpadJoyLeftState; -///< State for ::HidNpadStyleTag_NpadJoyLeft. -using ::HidNpadJoyRightState; -using ::HidNpadLagerState; -/// NpadLagerType -using ::HidNpadLagerType; -///< State for ::HidNpadStyleTag_NpadPalma. -/// State for ::HidNpadStyleTag_NpadLark. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. -using ::HidNpadLarkState; -/// NpadLarkType -using ::HidNpadLarkType; -/// State for ::HidNpadStyleTag_NpadLucia. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. -using ::HidNpadLuciaState; -/// NpadLuciaType -using ::HidNpadLuciaType; -using ::HidNpadPalmaState; -/// HidNpadSharedMemoryEntry -using ::HidNpadSharedMemoryEntry; -/// HidNpadSharedMemoryFormat -using ::HidNpadSharedMemoryFormat; -/// HidNpadSixAxisSensorLifo -using ::HidNpadSixAxisSensorLifo; -/// HID controller styles -using ::HidNpadStyleTag; -/// NpadSystemButtonProperties -using ::HidNpadSystemButtonProperties; -///< State for ::HidNpadStyleTag_NpadLager. Analog-sticks state are always zero. -using ::HidNpadSystemExtState; -/// NpadSystemProperties -using ::HidNpadSystemProperties; -///< State for ::HidNpadStyleTag_NpadSystemExt. -using ::HidNpadSystemState; -/// PalmaActivityEntry -using ::HidPalmaActivityEntry; -/// PalmaApplicationSectionAccessBuffer -using ::HidPalmaApplicationSectionAccessBuffer; -/// PalmaConnectionHandle -using ::HidPalmaConnectionHandle; -/// PalmaFeature -using ::HidPalmaFeature; -/// PalmaFrModeType -using ::HidPalmaFrModeType; -/// PalmaOperationInfo -using ::HidPalmaOperationInfo; -/// PalmaOperationType -using ::HidPalmaOperationType; -/// PalmaWaveSet -using ::HidPalmaWaveSet; -/// HidPowerInfo (system) -using ::HidPowerInfo; -/// HidSevenSixAxisSensorState -using ::HidSevenSixAxisSensorState; -/// HidSevenSixAxisSensorStateEntry -using ::HidSevenSixAxisSensorStateEntry; -/// HidSevenSixAxisSensorStates -using ::HidSevenSixAxisSensorStates; -/// HidSharedMemory -using ::HidSharedMemory; -/// HidSixAxisSensorAttribute -using ::HidSixAxisSensorAttribute; -/// HidSixAxisSensorHandle -using ::HidSixAxisSensorHandle; -/// HidSixAxisSensorState -using ::HidSixAxisSensorState; -/// HidSixAxisSensorStateAtomicStorage -using ::HidSixAxisSensorStateAtomicStorage; -/// HidSixAxisSensorUserCalibrationState -using ::HidSixAxisSensorUserCalibrationState; -/// HidSixAxisSensorUserCalibrationStateAtomicStorage -using ::HidSixAxisSensorUserCalibrationStateAtomicStorage; -/// HidSixAxisSensorUserCalibrationStateLifo -using ::HidSixAxisSensorUserCalibrationStateLifo; -/// HidSleepButtonLifo -using ::HidSleepButtonLifo; -/// HidSleepButtonSharedMemoryFormat -using ::HidSleepButtonSharedMemoryFormat; -/// HidSleepButtonState -using ::HidSleepButtonState; -/// HidSleepButtonStateAtomicStorage -using ::HidSleepButtonStateAtomicStorage; -/// ButtonConfigEmbedded -using ::HidsysButtonConfigEmbedded; -/// ButtonConfigFull -using ::HidsysButtonConfigFull; -/// ButtonConfigLeft -using ::HidsysButtonConfigLeft; -/// ButtonConfigRight -using ::HidsysButtonConfigRight; -/// Structure for \ref hidsysSetNotificationLedPattern. -/// See also: https://switchbrew.org/wiki/HID_services#NotificationLedPattern -/// Only the low 4bits of each used byte in this struct is used. -using ::HidsysNotificationLedPattern; -/// Mini Cycle struct for \ref HidsysNotificationLedPattern. -using ::HidsysNotificationLedPatternCycle; -/// UniquePadId for a controller. -using ::HidsysUniquePadId; -/// UniquePadSerialNumber -using ::HidsysUniquePadSerialNumber; -/// UniquePadType -using ::HidsysUniquePadType; -/// HidTouchAttribute -using ::HidTouchAttribute; -/// HidTouchScreenConfigurationForNx -using ::HidTouchScreenConfigurationForNx; -/// HidTouchScreenLifo -using ::HidTouchScreenLifo; -/// HidTouchScreenModeForNx -using ::HidTouchScreenModeForNx; -/// HidTouchScreenSharedMemoryFormat -using ::HidTouchScreenSharedMemoryFormat; -/// HidTouchScreenState -using ::HidTouchScreenState; -/// HidTouchScreenStateAtomicStorage -using ::HidTouchScreenStateAtomicStorage; -/// HidTouchState -using ::HidTouchState; -/// HidUniquePadConfig -using ::HidUniquePadConfig; -/// HidUniquePadConfigAtomicStorage -using ::HidUniquePadConfigAtomicStorage; -/// HidUniquePadConfigLifo -using ::HidUniquePadConfigLifo; -/// HidUniquePadConfigMutex -using ::HidUniquePadConfigMutex; -/// HidUniquePadLifo -using ::HidUniquePadLifo; -/// HidUniquePadSharedMemoryEntry -using ::HidUniquePadSharedMemoryEntry; -/// HidUniquePadSharedMemoryFormat -using ::HidUniquePadSharedMemoryFormat; -/// HidVector -using ::HidVector; -/// HidVibrationDeviceHandle -using ::HidVibrationDeviceHandle; -/// HidVibrationDeviceInfo -using ::HidVibrationDeviceInfo; -/// VibrationDevicePosition -using ::HidVibrationDevicePosition; -/// Type values for HidVibrationDeviceInfo::type. -using ::HidVibrationDeviceType; -/// VibrationGcErmCommand -using ::HidVibrationGcErmCommand; -/// HidVibrationValue -using ::HidVibrationValue; -using ::HipcBufferDescriptor; -using ::HipcBufferMode; -using ::HipcHeader; -using ::HipcMetadata; -using ::HipcParsedRequest; -using ::HipcRecvListEntry; -using ::HipcRequest; -using ::HipcResponse; -using ::HipcSpecialHeader; -using ::HipcStaticDescriptor; -/// Context for HMAC-SHA1 operations. -using ::HmacSha1Context; -/// Context for HMAC-SHA256 operations. -using ::HmacSha256Context; -using ::HwopusDecoder; -/// This structure is the start of opusin for \ref hwopusDecodeInterleaved, with the actual opus packet following this. -/// These fields are big-endian. -using ::HwopusHeader; -/// Used internally. -using ::HwopusMultistreamState; -using ::I2cDevice; -using ::I2cSession; -using ::I2cTransactionOption; -using ::in_addr; -/// GetInfo IDs. -using ::InfoType; -/// GetInfo InitialProcessIdRange Sub IDs. -using ::InitialProcessIdRangeInfo; -/// Io Pools. -using ::IoPoolType; -using ::iova_t; -/// AdaptiveClusteringMode -using ::IrsAdaptiveClusteringMode; -/// AdaptiveClusteringProcessorConfig -using ::IrsAdaptiveClusteringProcessorConfig; -/// AdaptiveClusteringTargetDistance -using ::IrsAdaptiveClusteringTargetDistance; -/// AruidFormat -using ::IrsAruidFormat; -/// ClusteringData -using ::IrsClusteringData; -/// ClusteringProcessorConfig -using ::IrsClusteringProcessorConfig; -/// ClusteringProcessorState -using ::IrsClusteringProcessorState; -/// DeviceFormat -using ::IrsDeviceFormat; -/// HandAnalysisConfig -using ::IrsHandAnalysisConfig; -/// HandAnalysisMode -using ::IrsHandAnalysisMode; -/// ImageProcessorStatus -using ::IrsImageProcessorStatus; -/// ImageTransferProcessorConfig -using ::IrsImageTransferProcessorConfig; -/// ImageTransferProcessorExConfig -using ::IrsImageTransferProcessorExConfig; -/// ImageTransferProcessorFormat. IR Sensor image resolution. -using ::IrsImageTransferProcessorFormat; -/// ImageTransferProcessorState -using ::IrsImageTransferProcessorState; -/// IrCameraHandle -using ::IrsIrCameraHandle; -/// IrCameraInternalStatus -using ::IrsIrCameraInternalStatus; -/// IrCameraStatus -using ::IrsIrCameraStatus; -/// IrLedProcessorConfig -using ::IrsIrLedProcessorConfig; -/// IrSensorMode -using ::IrsIrSensorMode; -/// IrsMomentProcessorConfig -using ::IrsMomentProcessorConfig; -/// MomentProcessorState -using ::IrsMomentProcessorState; -/// MomentStatistic -using ::IrsMomentStatistic; -/// PackedClusteringProcessorConfig -using ::IrsPackedClusteringProcessorConfig; -/// PackedFunctionLevel -using ::IrsPackedFunctionLevel; -/// PackedImageTransferProcessorConfig -using ::IrsPackedImageTransferProcessorConfig; -/// PackedImageTransferProcessorExConfig -using ::IrsPackedImageTransferProcessorExConfig; -/// PackedIrLedProcessorConfig -using ::IrsPackedIrLedProcessorConfig; -/// PackedMcuVersion -using ::IrsPackedMcuVersion; -/// PackedMomentProcessorConfig -using ::IrsPackedMomentProcessorConfig; -/// PackedPointingProcessorConfig -using ::IrsPackedPointingProcessorConfig; -/// PackedTeraPluginProcessorConfig -using ::IrsPackedTeraPluginProcessorConfig; -/// PointingProcessorMarkerState -using ::IrsPointingProcessorMarkerState; -/// PointingProcessorState -using ::IrsPointingProcessorState; -/// ProcessorState -using ::IrsProcessorState; -/// Rect -using ::IrsRect; -/// StatusManager -using ::IrsStatusManager; -/// TeraPluginProcessorConfig -using ::IrsTeraPluginProcessorConfig; -/// TeraPluginProcessorState -using ::IrsTeraPluginProcessorState; -/// Internal validation callblack. -using ::IrsValidationCb; -/// JIT buffer object. -using ::Jit; -/// JIT implementation type. -using ::JitType; -/// Context of a scheduled thread. -using ::LastThreadContext; -using ::LblBacklightSwitchStatus; -/// AcceptPolicy -using ::LdnAcceptPolicy; -/// ActionFrameSettings -using ::LdnActionFrameSettings; -/// AddressEntry -using ::LdnAddressEntry; -/// CommonNetworkInfo -using ::LdnCommonNetworkInfo; -/// DisconnectReason loaded by \ref ldnGetDisconnectReason. -using ::LdnDisconnectReason; -/// IntentId -using ::LdnIntentId; -/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). -using ::LdnIpv4Address; -/// MacAddress -using ::LdnMacAddress; -/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate). -using ::LdnNetworkConfig; -/// NetworkId -using ::LdnNetworkId; -/// NetworkInfo -using ::LdnNetworkInfo; -/// NodeInfo -using ::LdnNodeInfo; -/// NodeLatestUpdate -using ::LdnNodeLatestUpdate; -/// OperationMode -using ::LdnOperationMode; -/// Protocol -using ::LdnProtocol; -/// ScanFilter. \ref ldnScan / \ref ldnScanPrivate will only return the \ref LdnNetworkInfo when validating the \ref LdnNetworkInfo with LdnScanFilter was sucessful, with the fields enabled by \ref LdnScanFilterFlag. -using ::LdnScanFilter; -/// ScanFilterFlag -using ::LdnScanFilterFlag; -/// SecurityConfig -using ::LdnSecurityConfig; -/// SecurityMode. LdnSecurityMode_Product can be used as the default value. The ldn cmds which use an input SecurityMode normally overwrite the SecurityMode. -using ::LdnSecurityMode; -/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated. -using ::LdnSecurityParameter; -using ::LdnServiceType; -/// SessionId -using ::LdnSessionId; -/// Ssid -using ::LdnSsid; -/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState. -using ::LdnState; -/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). -using ::LdnSubnetMask; -/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd. -using ::LdnUserConfig; -/// WirelessControllerRestriction -using ::LdnWirelessControllerRestriction; -/// User-mode light event structure. -using ::LEvent; -/// CommonArguments -using ::LibAppletArgs; -/// LibraryAppletExitReason -using ::LibAppletExitReason; -/// LibraryAppletInfo -using ::LibAppletInfo; -/// LibraryAppletMode -using ::LibAppletMode; -/// Limitable Resources. -using ::LimitableResource; -using ::LoaderModuleInfo; -using ::LoaderProgramAttributes; -using ::LoaderProgramInfo; -using ::LoaderProgramInfoV1; -/// Loader return function. -using ::LoaderReturnFn; -/// GroupId -using ::Lp2pGroupId; -/// GroupInfo -/// \ref lp2pScan only uses the following fields for the cmd input struct: supported_platform/priority, frequency/channel, and preshared_key_binary_size/preshared_key. -using ::Lp2pGroupInfo; -/// IpConfig. Only contains IPv4 addresses. -using ::Lp2pIpConfig; -/// MacAddress -using ::Lp2pMacAddress; -/// NodeInfo -using ::Lp2pNodeInfo; -/// ScanResult -using ::Lp2pScanResult; -using ::Lp2pServiceType; -using ::LrLocationResolver; -using ::LrRegisteredLocationResolver; -/// Memory attribute bitmasks. -using ::MemoryAttribute; -/// Memory information structure. -using ::MemoryInfo; -/// Memory mapping type. -using ::MemoryMapping; -/// Memory regions -using ::MemoryRegion; -/// Memory state bitmasks. -using ::MemoryState; -/// Memory type enumeration (lower 8 bits of \ref MemoryState) -using ::MemoryType; -/// Mii age. -using ::MiiAge; -using ::MiiCharInfo; -using ::MiiCreateId; -using ::MiiDatabase; -/// Mii face color. -using ::MiiFaceColor; -/// Mii gender. -using ::MiiGender; -/// Image attribute. -using ::MiiimgImageAttribute; -/// Image ID. -using ::MiiimgImageId; -/// AppletInput -using ::MiiLaAppletInput; -/// AppletMode -using ::MiiLaAppletMode; -/// AppletOutput -using ::MiiLaAppletOutput; -/// AppletOutputForCharInfoEditing -using ::MiiLaAppletOutputForCharInfoEditing; -using ::MiiNfpStoreDataExtension; -using ::MiiServiceType; -using ::MiiSourceFlag; -using ::MiiSpecialKeyCode; -using ::MiiStoreData; -using ::MiiVer3StoreData; -using ::MmuModuleId; -using ::MmuRequest; -/// Mutex datatype, defined in newlib. -using ::Mutex; -/// ApplicationControlDataCondition -using ::NacpApplicationControlDataCondition; -/// ApplicationJitConfiguration -using ::NacpApplicationJitConfiguration; -/// ApplicationNeighborDetectionGroupConfiguration -using ::NacpApplicationNeighborDetectionGroupConfiguration; -/// Language entry. These strings are UTF-8. -using ::NacpLanguageEntry; -using ::NacpLanguageEntryData; -/// NeighborDetectionClientConfiguration -using ::NacpNeighborDetectionClientConfiguration; -/// ns ApplicationControlProperty -using ::NacpStruct; -using ::NativeHandle; -/// AddOnContentMetaExtendedHeader [15.0.0+] -using ::NcmAddOnContentMetaExtendedHeader; -/// ApplicationContentMetaKey -using ::NcmApplicationContentMetaKey; -/// ApplicationMetaExtendedHeader -using ::NcmApplicationMetaExtendedHeader; -/// ContentId -using ::NcmContentId; -/// ContentInfo -using ::NcmContentInfo; -/// ContentInstallType -using ::NcmContentInstallType; -/// ContentMetaAttribute -using ::NcmContentMetaAttribute; -/// ContentMetaDatabase -using ::NcmContentMetaDatabase; -/// ContentMetaHeader -using ::NcmContentMetaHeader; -/// ContentMetaInfo -using ::NcmContentMetaInfo; -/// ContentMetaKey -using ::NcmContentMetaKey; -/// ContentMetaPlatform -using ::NcmContentMetaPlatform; -/// ContentMetaType -using ::NcmContentMetaType; -/// ContentStorage -using ::NcmContentStorage; -/// ContentType -using ::NcmContentType; -/// DataPatchMetaExtendedHeader -using ::NcmDataPatchMetaExtendedHeader; -/// LegacyAddOnContentMetaExtendedHeader [1.0.0-14.1.2] -using ::NcmLegacyAddOnContentMetaExtendedHeader; -/// PackagedContentInfo -using ::NcmPackagedContentInfo; -/// PatchMetaExtendedHeader -using ::NcmPatchMetaExtendedHeader; -/// PlaceHolderId -using ::NcmPlaceHolderId; -/// ProgramLocation -using ::NcmProgramLocation; -/// RightsId -using ::NcmRightsId; -/// StorageId -using ::NcmStorageId; -/// SystemUpdateMetaExtendedHeader -using ::NcmSystemUpdateMetaExtendedHeader; -using ::NewsDatabaseService; -using ::NewsDataService; -using ::NewsNewlyArrivedEventHolder; -using ::NewsOverwriteEventHolder; -using ::NewsRecord; -using ::NewsRecordV1; -using ::NewsServiceType; -using ::NewsTopicName; -/// Nfc/Nfp DeviceHandle -using ::NfcDeviceHandle; -using ::NfcDeviceState; -using ::NfcMifareCommand; -using ::NfcMifareDeviceState; -using ::NfcMifareReadBlockData; -using ::NfcMifareReadBlockParameter; -using ::NfcMifareWriteBlockParameter; -using ::NfcProtocol; -using ::NfcRequiredMcuVersionData; -using ::NfcSectorKey; -/// NfcServiceType -using ::NfcServiceType; -using ::NfcState; -using ::NfcTagInfo; -using ::NfcTagType; -using ::NfcTagUid; -using ::NfpAdminInfo; -using ::NfpAmiiboFlag; -using ::NfpApplicationAreaVersion; -using ::NfpBreakType; -using ::NfpCommonInfo; -using ::NfpData; -using ::NfpDate; -using ::NfpDeviceState; -using ::NfpDeviceType; -/// AmiiboSettingsStartParam -using ::NfpLaAmiiboSettingsStartParam; -/// ReturnValueForAmiiboSettings -using ::NfpLaReturnValueForAmiiboSettings; -/// StartParamForAmiiboSettings -using ::NfpLaStartParamForAmiiboSettings; -/// Values for NfpLaStartParamForAmiiboSettings::type. -using ::NfpLaStartParamTypeForAmiiboSettings; -using ::NfpModelInfo; -using ::NfpMountTarget; -using ::NfpRegisterInfo; -using ::NfpRegisterInfoPrivate; -/// NfpServiceType -using ::NfpServiceType; -using ::NfpTagInfo; -/// Authentication -using ::NifmAuthentication; -/// ClientId -using ::NifmClientId; -/// DnsSetting -using ::NifmDnsSetting; -/// Encryption -using ::NifmEncryption; -using ::NifmInternetConnectionStatus; -using ::NifmInternetConnectionType; -/// IpAddressSetting -using ::NifmIpAddressSetting; -/// IpSettingData -using ::NifmIpSettingData; -/// IpV4Address -using ::NifmIpV4Address; -/// NetworkProfileBasicInfo. Converted from/to \ref NifmSfNetworkProfileBasicInfo. -using ::NifmNetworkProfileBasicInfo; -/// NetworkProfileData. Converted from/to \ref NifmSfNetworkProfileData. -using ::NifmNetworkProfileData; -using ::NifmNetworkProfileType; -/// ProxySetting -using ::NifmProxySetting; -/// Request -using ::NifmRequest; -using ::NifmRequestState; -using ::NifmServiceType; -/// SfNetworkProfileBasicInfo. Converted from/to \ref NifmNetworkProfileBasicInfo. -using ::NifmSfNetworkProfileBasicInfo; -/// SfNetworkProfileData. Converted to/from \ref NifmNetworkProfileData. -using ::NifmSfNetworkProfileData; -/// SfWirelessSettingData -using ::NifmSfWirelessSettingData; -/// WirelessSettingData -using ::NifmWirelessSettingData; -/// SystemUpdateTaskId -using ::NimSystemUpdateTaskId; -/// AlarmSetting -using ::NotifAlarmSetting; -/// Data extracted from NotifWeeklyScheduleAlarmSetting::settings. This uses local-time. -using ::NotifAlarmTime; -/// ServiceType for \ref notifInitialize. -using ::NotifServiceType; -/// WeeklyScheduleAlarmSetting -using ::NotifWeeklyScheduleAlarmSetting; -/// Custom asset header. -using ::NroAssetHeader; -/// Custom asset section. -using ::NroAssetSection; -/// This follows NroStart, the actual nro-header. -using ::NroHeader; -/// Entry for each segment in the codebin. -using ::NroSegment; -/// Offset 0x0 in the NRO. -using ::NroStart; -/// NsApplicationContentMetaStatus -using ::NsApplicationContentMetaStatus; -/// ApplicationControlData -using ::NsApplicationControlData; -/// ApplicationControlSource -using ::NsApplicationControlSource; -/// ApplicationDeliveryInfo -using ::NsApplicationDeliveryInfo; -/// ApplicationOccupiedSize -using ::NsApplicationOccupiedSize; -/// ApplicationRecord -using ::NsApplicationRecord; -/// NsApplicationRightsOnClient -using ::NsApplicationRightsOnClient; -/// ApplicationView -using ::NsApplicationView; -/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. -using ::NsApplicationViewDeprecated; -/// NsApplicationViewWithPromotionInfo -using ::NsApplicationViewWithPromotionInfo; -/// BackgroundNetworkUpdateState -using ::NsBackgroundNetworkUpdateState; -/// DownloadTaskStatus -using ::NsDownloadTaskStatus; -/// EulaDataPath -using ::NsEulaDataPath; -/// LatestSystemUpdate -using ::NsLatestSystemUpdate; -/// LaunchProperties -using ::NsLaunchProperties; -/// ProgressAsyncResult -using ::NsProgressAsyncResult; -/// ProgressForDeleteUserSaveDataAll -using ::NsProgressForDeleteUserSaveDataAll; -/// ProgressMonitorForDeleteUserSaveDataAll -using ::NsProgressMonitorForDeleteUserSaveDataAll; -/// NsPromotionInfo -using ::NsPromotionInfo; -/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsReceiveApplicationProgress; -/// RequestServerStopper -using ::NsRequestServerStopper; -/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsSendApplicationProgress; -/// ShellEvent -using ::NsShellEvent; -/// ShellEventInfo -using ::NsShellEventInfo; -/// SystemDeliveryInfo -using ::NsSystemDeliveryInfo; -/// SystemUpdateControl -using ::NsSystemUpdateControl; -/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. -using ::NsSystemUpdateProgress; -using ::NvAddressSpace; -using ::NvAllocSpaceFlags; -using ::NvChannel; -using ::NvChannelPriority; -using ::NvClassNumber; -using ::NvColorFormat; -using ::NvDisplayScanFormat; -using ::NvError; -using ::NvEventId; -using ::NvFence; -using ::NvGpuChannel; -using ::NvGraphicBuffer; -using ::nvioctl_clk_rate; -using ::nvioctl_cmdbuf; -using ::nvioctl_command_buffer_map; -using ::nvioctl_fence; -using ::nvioctl_gpfifo_entry; -using ::nvioctl_gpu_characteristics; -using ::nvioctl_gpu_time; -using ::nvioctl_reloc; -using ::nvioctl_reloc_shift; -using ::nvioctl_syncpt_incr; -using ::nvioctl_va_region; -using ::nvioctl_zbc_entry; -using ::nvioctl_zbc_slot_mask; -using ::nvioctl_zcull_info; -using ::NvKind; -using ::NvLayout; -using ::NvMap; -using ::NvMapBufferFlags; -using ::NvMapParam; -using ::NvMultiFence; -using ::NvNotification; -using ::NvNotificationType; -/// NvServiceType, for __nx_nv_service_type. -using ::NvServiceType; -using ::NvSurface; -using ::NvZcullConfig; -/// Native window structure. -using ::NWindow; -///OperationMode -using ::OmmOperationMode; -///OperationModePolicy -using ::OmmOperationModePolicy; -/// EnqueuePosition -using ::OvlnEnqueuePosition; -/// OverflowOption -using ::OvlnOverflowOption; -/// QueueAttribute -using ::OvlnQueueAttribute; -/// RawMessage -using ::OvlnRawMessage; -/// Receiver -using ::OvlnReceiver; -/// Sender -using ::OvlnSender; -/// SendOption -using ::OvlnSendOption; -/// SourceName -using ::OvlnSourceName; -/// Pad button repeater state object. -using ::PadRepeater; -/// Pad state object. -using ::PadState; -using ::Parcel; -using ::ParcelHeader; -/// PcmFormat -using ::PcmFormat; -/// Input arg storage for the applet. -using ::PctlAuthArg; -/// Type values for PctlAuthArg::type. -using ::PctlAuthType; -using ::PctlRestrictionSettings; -using ::PcvClockRatesListType; -using ::PcvModule; -/// Module id returned by [8.0.0+] pcv services -/// See also: https://switchbrew.org/wiki/PCV_services#Modules -using ::PcvModuleId; -/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed. -using ::PdmAccountEvent; -/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed. -using ::PdmAccountEventV10; -/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed. -using ::PdmAccountEventV3; -/// AccountPlayEvent. -/// This is the raw entry struct directly read from FS, without any entry filtering. This is separate from \ref PdmPlayEvent. -using ::PdmAccountPlayEvent; -/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1]. -using ::PdmAppletEvent; -/// AppletEventType -using ::PdmAppletEventType; -/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed. -/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00. -/// See \ref pdmPlayTimestampToPosix. -using ::PdmAppletEventV1; -/// ApplicationPlayStatistics -using ::PdmApplicationPlayStatistics; -/// LastPlayTime. -/// This contains data from the last time the application was played. -using ::PdmLastPlayTime; -/// PlayEvent. -/// This is the raw entry struct directly read from FS, without any entry filtering. -using ::PdmPlayEvent; -/// PlayEventType -using ::PdmPlayEventType; -/// PlayLogPolicy -using ::PdmPlayLogPolicy; -/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1]. -using ::PdmPlayStatistics; -/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed. -using ::PdmPlayStatisticsV1; -/// Memory permission bitmasks. -using ::Permission; -using ::PglEventObserver; -/// LaunchFlag -using ::PglLaunchFlag; -using ::PglProgramLaunchProperty; -/// SnapShotDumpType -using ::PglSnapShotDumpType; -/// Physical memory information structure. -using ::PhysicalMemoryInfo; -/// GetSystemInfo PhysicalMemory Sub IDs. -using ::PhysicalMemorySystemInfo; -/// FontData -using ::PlFontData; -using ::PlServiceType; -/// SharedFontType -using ::PlSharedFontType; -/// BootMode -using ::PmBootMode; -/// LaunchFlag -using ::PmLaunchFlag; -/// ProcessEvent -using ::PmProcessEvent; -/// ProcessEventInfo -using ::PmProcessEventInfo; -/// ResourceLimitValues -using ::PmResourceLimitValues; -using ::PrintConsole; -/// Process Activity. -using ::ProcessActivity; -/// Process exit reasons -using ::ProcessExitReason; -/// Process Information. -using ::ProcessInfoType; -/// Process States. -using ::ProcessState; -using ::PscPmModule; -using ::PscPmModuleId; -using ::PscPmState; -/// NintendoAccountStartupDialogType -using ::PselNintendoAccountStartupDialogType; -/// playerSelect UI modes. -using ::PselUiMode; -/// Return data sent after execution. -using ::PselUiReturnArg; -/// UI settings for versions starting with 0x10000. -using ::PselUiSettings; -/// Base UI settings for playerSelect. -using ::PselUiSettingsV1; -/// UI message text to display with ::PselUiMode_UserSelector. Invalid values are handled as ::PselUserSelectionPurpose_General. -using ::PselUserSelectionPurpose; -/// UserSelectionSettings -using ::PselUserSelectionSettings; -/// [2.0.0+] UserSelectionSettingsForSystemService -using ::PselUserSelectionSettingsForSystemService; -/// BatteryChargeInfoFields [17.0.0+] -using ::PsmBatteryChargeInfoFields; -/// BatteryChargeInfoFieldsOld [1.0.0-16.1.0] -using ::PsmBatteryChargeInfoFieldsOld; -/// BatteryVoltageState -using ::PsmBatteryVoltageState; -/// ChargerType -using ::PsmChargerType; -/// IPsmSession -using ::PsmSession; -/// Vdd50State -using ::PsmVdd50State; -/// Armv8 register group. @ref svcGetThreadContext3 uses @ref RegisterGroup_All. -using ::RegisterGroup; -///< Kernel object handle. -using ::Result; -/// Ring-Con state object. -using ::RingCon; -/// Whether the output data is valid. -using ::RingConDataValid; -using ::RingConErrorFlag; -/// Ring-Con firmware version. -using ::RingConFwVersion; -/// Ring-Con manufacturer calibration. -using ::RingConManuCal; -/// Polling data extracted from \ref HidbusJoyPollingReceivedData. -using ::RingConPollingData; -/// Ring-Con user calibration. -using ::RingConUserCal; -/// Recursive mutex datatype, defined in newlib. -using ::RMutex; -/// RomFS directory. -using ::romfs_dir; -/// RomFS file. -using ::romfs_file; -/// RomFS header. -using ::romfs_header; -using ::RsaKeyVersion; -/// Read/write lock structure. -using ::RwLock; -///< 64-bit signed integer. -using ::s128; -///< 8-bit signed integer. -using ::s16; -///< 16-bit signed integer. -using ::s32; -///< 32-bit signed integer. -using ::s64; -///< 128-bit unsigned integer. -using ::s8; -/// Secure monitor arguments. -using ::SecmonArgs; -/// Semaphore structure. -using ::Semaphore; -/// Service object structure -using ::Service; -using ::SessionMgr; -/// BatteryLot -using ::SetBatteryLot; -using ::SetCalAccelerometerOffset; -using ::SetCalAccelerometerScale; -using ::SetCalAmiiboEcdsaCertificate; -using ::SetCalAmiiboEcqvBlsCertificate; -using ::SetCalAmiiboEcqvBlsKey; -using ::SetCalAmiiboEcqvBlsRootCertificate; -using ::SetCalAmiiboEcqvCertificate; -using ::SetCalAmiiboKey; -using ::SetCalAnalogStickFactoryCalibration; -using ::SetCalAnalogStickModelParameter; -using ::SetCalBdAddress; -using ::SetCalConfigurationId1; -using ::SetCalConsoleSixAxisSensorHorizontalOffset; -using ::SetCalCountryCode; -using ::SetCalEccB233DeviceCertificate; -using ::SetCalEccB233DeviceKey; -using ::SetCalGameCardCertificate; -using ::SetCalGameCardKey; -using ::SetCalGyroscopeOffset; -using ::SetCalGyroscopeScale; -using ::SetCalMacAddress; -using ::SetCalRegionCode; -using ::SetCalRsa2048DeviceCertificate; -using ::SetCalRsa2048DeviceKey; -using ::SetCalSerialNumber; -using ::SetCalSpeakerParameter; -using ::SetCalSslCertificate; -using ::SetCalSslKey; -/// ChineseTraditionalInputMethod -using ::SetChineseTraditionalInputMethod; -/// KeyboardLayout -using ::SetKeyboardLayout; -/// IDs for Language. -using ::SetLanguage; -/// Region codes. -using ::SetRegion; -/// AccessPointSecurityStandard -using ::SetSysAccessPointSecurityStandard; -/// AccessPointSecurityType -using ::SetSysAccessPointSecurityType; -/// AccountNotificationSettings -using ::SetSysAccountNotificationSettings; -/// AccountOnlineStorageSettings -using ::SetSysAccountOnlineStorageSettings; -/// AccountSettings -using ::SetSysAccountSettings; -/// AllowedSslHosts -using ::SetSysAllowedSslHosts; -/// AnalogStickUserCalibration -using ::SetSysAnalogStickUserCalibration; -/// AudioDevice -using ::SetSysAudioDevice; -/// AudioOutputMode -using ::SetSysAudioOutputMode; -/// AudioOutputModeTarget -using ::SetSysAudioOutputModeTarget; -using ::SetSysAudioVolume; -/// AutoSettings -using ::SetSysAutoSettings; -/// BacklightSettings -using ::SetSysBacklightSettings; -/// BacklightSettingsEx -using ::SetSysBacklightSettingsEx; -/// BlePairingSettings -using ::SetSysBlePairingSettings; -/// BlockType -using ::SetSysBlockType; -/// BluetoothDevicesSettings -using ::SetSysBluetoothDevicesSettings; -/// ButtonConfigRegisteredSettings -using ::SetSysButtonConfigRegisteredSettings; -/// ButtonConfigSettings -using ::SetSysButtonConfigSettings; -/// Actually nn::util::Color4u8Type. -using ::SetSysColor4u8Type; -/// ConnectionFlag -using ::SetSysConnectionFlag; -/// ConsoleSixAxisSensorAccelerationBias -using ::SetSysConsoleSixAxisSensorAccelerationBias; -/// ConsoleSixAxisSensorAccelerationGain -using ::SetSysConsoleSixAxisSensorAccelerationGain; -/// ConsoleSixAxisSensorAngularAcceleration -using ::SetSysConsoleSixAxisSensorAngularAcceleration; -/// ConsoleSixAxisSensorAngularVelocityBias -using ::SetSysConsoleSixAxisSensorAngularVelocityBias; -/// ConsoleSixAxisSensorAngularVelocityGain -using ::SetSysConsoleSixAxisSensorAngularVelocityGain; -/// ConsoleSixAxisSensorAngularVelocityTimeBias -using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; -/// ConsoleSleepPlan -using ::SetSysConsoleSleepPlan; -/// ControllerType -using ::SetSysControllerType; -using ::SetSysDataBlock; -/// DataDeletionSettings -using ::SetSysDataDeletionSettings; -/// DeviceNickName -using ::SetSysDeviceNickName; -/// Edid -using ::SetSysEdid; -/// ErrorReportSharePermission -using ::SetSysErrorReportSharePermission; -/// EulaVersion -using ::SetSysEulaVersion; -/// EulaVersionClockType -using ::SetSysEulaVersionClockType; -using ::SetSysExtensionBlock; -/// Structure returned by \ref setsysGetFirmwareVersion. -using ::SetSysFirmwareVersion; -/// Structure returned by \ref setsysGetFirmwareVersionDigest. -using ::SetSysFirmwareVersionDigest; -/// FriendPresenceOverlayPermission -using ::SetSysFriendPresenceOverlayPermission; -/// HandheldSleepPlan -using ::SetSysHandheldSleepPlan; -/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. -using ::SetSysHomeMenuScheme; -/// HostFsMountPoint -using ::SetSysHostFsMountPoint; -/// InitialLaunchSettings -using ::SetSysInitialLaunchSettings; -/// LcdBacklightBrightnessMapping -using ::SetSysLcdBacklightBrightnessMapping; -using ::SetSysModeLine; -/// NetworkSettings -using ::SetSysNetworkSettings; -/// NotificationSettings -using ::SetSysNotificationSettings; -/// NotificationTime -using ::SetSysNotificationTime; -/// NotificationVolume -using ::SetSysNotificationVolume; -/// NxControllerLegacySettings -using ::SetSysNxControllerLegacySettings; -/// NxControllerSettings -using ::SetSysNxControllerSettings; -/// PlatformRegion. Other values not listed here should be handled as "Unknown". -using ::SetSysPlatformRegion; -/// PrimaryAlbumStorage -using ::SetSysPrimaryAlbumStorage; -/// Console Product Models -using ::SetSysProductModel; -/// ProxyFlags -using ::SetSysProxyFlags; -/// PtmCycleCountReliability -using ::SetSysPtmCycleCountReliability; -/// PtmFuelGaugeParameter -using ::SetSysPtmFuelGaugeParameter; -/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. -using ::SetSysRebootlessSystemUpdateVersion; -/// Structure returned by \ref setsysGetSerialNumber. -using ::SetSysSerialNumber; -/// ServiceDiscoveryControlSettings -using ::SetSysServiceDiscoveryControlSettings; -/// SleepSettings -using ::SetSysSleepSettings; -/// ThemeId -using ::SetSysThemeId; -/// ThemeSettings -using ::SetSysThemeSettings; -/// TouchScreenMode, for "Touch-Screen Sensitivity". -using ::SetSysTouchScreenMode; -/// TvSettings -using ::SetSysTvSettings; -/// UserSelectorFlag -using ::SetSysUserSelectorFlag; -/// UserSelectorSettings -using ::SetSysUserSelectorSettings; -using ::SfBuffer; -using ::SfBufferAttrs; -using ::SfDispatchParams; -using ::SfOutHandleAttr; -using ::SfOutHandleAttrs; -/// Context for SHA1 operations. -using ::Sha1Context; -/// Context for SHA256 operations. -using ::Sha256Context; -/// Shared memory information structure. -using ::SharedMemory; -/// SignalToAddress behaviors. -using ::SignalType; -/// Structure representing a service name (null terminated, remaining characters set to zero). -using ::SmServiceName; -#ifdef _SOCKLEN_T_DECLARED -using ::sockaddr; -#endif -/// Configuration structure for socketInitalize -using ::SocketInitConfig; -using ::SplConfigItem; -/// AlpnProtoState -using ::SslAlpnProtoState; -/// BuiltInCertificateInfo -using ::SslBuiltInCertificateInfo; -/// CaCertificateId -using ::SslCaCertificateId; -/// CertificateFormat -using ::SslCertificateFormat; -/// CipherInfo -using ::SslCipherInfo; -/// SslConnection -using ::SslConnection; -/// SslContext -using ::SslContext; -/// ContextOption -using ::SslContextOption; -/// DebugOptionType -using ::SslDebugOptionType; -/// FlushSessionCacheOptionType -using ::SslFlushSessionCacheOptionType; -/// InternalPki -using ::SslInternalPki; -/// IoMode. The default value at the time of \ref sslContextCreateConnection is ::SslIoMode_Blocking. -/// The socket non-blocking flag is always set regardless of this field, this is only used internally for calculating the timeout used by various cmds. -using ::SslIoMode; -/// KeyAndCertParams -using ::SslKeyAndCertParams; -/// OptionType. The default bool flags value for these at the time of \ref sslContextCreateConnection is cleared. -using ::SslOptionType; -/// PollEvent -using ::SslPollEvent; -/// PrivateOptionType -using ::SslPrivateOptionType; -/// RenegotiationMode -using ::SslRenegotiationMode; -/// SslServerCertDetailEntry -using ::SslServerCertDetailEntry; -/// SslServerCertDetailHeader -using ::SslServerCertDetailHeader; -/// Values for __nx_ssl_service_type, controls which ssl service to initialize. -using ::SslServiceType; -/// SessionCacheMode -using ::SslSessionCacheMode; -/// TrustedCertStatus -using ::SslTrustedCertStatus; -/// VerifyOption. The default bitmask value at the time of \ref sslContextCreateConnection is ::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName. -/// [5.0.0+] \ref sslConnectionSetVerifyOption: (::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName) must be set, unless: ::SslOptionType_SkipDefaultVerify is set, or [9.0.0+] ::SslDebugOptionType_AllowDisableVerifyOption is set. -/// [6.0.0+] \ref sslConnectionSetVerifyOption: Following that, if ::SslVerifyOption_EvPolicyOid is set, then the following options must be set (besides the previously mentioned one): ::SslVerifyOption_PeerCa and ::SslVerifyOption_DateCheck. -using ::SslVerifyOption; -/// SslVersion. This is a bitmask which controls the min/max TLS versions to use, depending on which lowest/highest bits are set (if Auto* isn't set). -using ::SslVersion; -using ::SwkbdAppearArg; -/// Base swkbd arg struct. -using ::SwkbdArgCommon; -using ::SwkbdArgV0; -/// Arg struct for version 0x30007+. -using ::SwkbdArgV7; -/// Arg struct for version 0x6000B+. -using ::SwkbdArgVB; -/// Struct data for SwkbdInline Interactive reply storage ChangedString*, at the end following the string. -using ::SwkbdChangedStringArg; -/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString* replies (text changed by the user or by \ref swkbdInlineSetInputText). -/// str is the UTF-8 string for the current text. -using ::SwkbdChangedStringCb; -/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString*V2 replies (text changed by the user or by \ref swkbdInlineSetInputText). -/// str is the UTF-8 string for the current text. -using ::SwkbdChangedStringV2Cb; -using ::SwkbdConfig; -using ::SwkbdCustomizedDictionarySet; -/// Input data for SwkbdInline request SetCustomizeDic. -using ::SwkbdCustomizeDicInfo; -/// Struct data for SwkbdInline Interactive reply storage DecidedEnter*, at the end following the string. -using ::SwkbdDecidedEnterArg; -/// This callback is used by \ref swkbdInlineUpdate when handling DecidedEnter* replies (when the final text was submitted via the button). -/// str is the UTF-8 string for the current text. -using ::SwkbdDecidedEnterCb; -/// User dictionary word. -using ::SwkbdDictWord; -/// InitializeArg for SwkbdInline. -using ::SwkbdInitializeArg; -/// InlineKeyboard -using ::SwkbdInline; -using ::SwkbdInlineCalcArg; -/// Value for \ref SwkbdInitializeArg mode. Controls the LibAppletMode when launching the applet. -using ::SwkbdInlineMode; -/// Struct data for SwkbdInline Interactive reply storage MovedCursor*, at the end following the string. -using ::SwkbdMovedCursorArg; -/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor* replies. -/// str is the UTF-8 string for the current text. -using ::SwkbdMovedCursorCb; -/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor*V2 replies. -/// str is the UTF-8 string for the current text. -using ::SwkbdMovedCursorV2Cb; -/// Struct data for SwkbdInline Interactive reply storage MovedTab*, at the end following the string. -using ::SwkbdMovedTabArg; -/// This callback is used by \ref swkbdInlineUpdate when handling MovedTab* replies. -/// str is the UTF-8 string for the current text. -using ::SwkbdMovedTabCb; -/// Rect -using ::SwkbdRect; -/// SwkbdInline Interactive output storage reply ID. -using ::SwkbdReplyType; -/// SwkbdInline Interactive input storage request ID. -using ::SwkbdRequestCommand; -/// SwkbdInline State -using ::SwkbdState; -/// TextCheck callback set by \ref swkbdConfigSetTextCheckCallback, for validating the input string when the swkbd ok-button is pressed. This buffer contains an UTF-8 string. This callback should validate the input string, then return a \ref SwkbdTextCheckResult indicating success/failure. On failure, this function must write an error message to the tmp_string buffer, which will then be displayed by swkbd. -using ::SwkbdTextCheckCb; -/// Output result returned by \ref SwkbdTextCheckCb. -using ::SwkbdTextCheckResult; -/// Value for SwkbdArgCommon::textDrawType. Only applies when stringLenMax is 1..32, otherwise swkbd will only use SwkbdTextDrawType_Box. -using ::SwkbdTextDrawType; -/// Type of keyboard. -using ::SwkbdType; -/// GetSystemInfo IDs. -using ::SystemInfoType; -/// Thread information structure. -using ::Thread; -/// Thread Activity. -using ::ThreadActivity; -/// Thread context structure (register dump) -using ::ThreadContext; -/// This is for \ref ThreadExceptionDump error_desc. -using ::ThreadExceptionDesc; -/// Thread exception dump structure. -using ::ThreadExceptionDump; -using ::ThreadExceptionFrameA32; -using ::ThreadExceptionFrameA64; -/// Thread exit reasons -using ::ThreadExitReason; -///< Function error code result type. -using ::ThreadFunc; -/// GetInfo Idle/Thread Tick Count Sub IDs. -using ::TickCountInfo; -using ::TimeCalendarAdditionalInfo; -using ::TimeCalendarTime; -using ::TimeLocationName; -/// Valid types for a user-mode timer. -using ::TimerType; -/// Values for __nx_time_service_type. -using ::TimeServiceType; -using ::TimeStandardSteadyClockTimePointType; -using ::TimeSteadyClockTimePoint; -using ::TimeSystemClockContext; -/// Time clock type. -using ::TimeType; -using ::TimeZoneRule; -using ::TipcCommandType; -using ::TipcDispatchParams; -using ::TipcRequestFormat; -/// tipc Service object structure -using ::TipcService; -/// Transfer memory information structure. -using ::TransferMemory; -using ::TsDeviceCode; -/// Location -using ::TsLocation; -using ::TsSession; -///< 64-bit unsigned integer. -using ::u128; -///< 8-bit unsigned integer. -using ::u16; -///< 16-bit unsigned integer. -using ::u32; -///< 32-bit unsigned integer. -using ::u64; -using ::u8; -/// FlowControlMode -using ::UartFlowControlMode; -/// UartPort -using ::UartPort; -/// PortEventType -using ::UartPortEventType; -/// UartPortForDev -using ::UartPortForDev; -/// PortSession -using ::UartPortSession; -using ::UEvent; -/// Imported from libusb, with changed names. -using ::usb_class_code; -/// Imported from libusb, with some adjustments. -using ::usb_config_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_control_setup; -/// Imported from libusb, with changed names. -using ::usb_descriptor_type; -/// Imported from libusb, with some adjustments. -using ::usb_device_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_endpoint_descriptor; -/// Imported from libusb, with changed names. -using ::usb_endpoint_direction; -/// Imported from libusb, with some adjustments. -using ::usb_hid_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_interface_association_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_interface_descriptor; -/// Imported from libusb, with changed names. -using ::usb_iso_sync_type; -/// Imported from libusb, with changed names. -using ::usb_iso_usage_type; -/// Imported from libusb, with changed names. -using ::usb_request_recipient; -/// Imported from libusb, with changed names. -using ::usb_request_type; -/// Imported from libusb, with some adjustments. -using ::usb_ss_endpoint_companion_descriptor; -/// Imported from libusb, with changed names. -using ::usb_standard_request; -/// Imported from libusb, with some adjustments. -using ::usb_string_descriptor; -/// Imported from libusb, with changed names. -using ::usb_transfer_type; -using ::UsbCommsInterfaceInfo; -using ::UsbComplexId; -using ::UsbDeviceSpeed; -using ::UsbDsDeviceInfo; -using ::UsbDsEndpoint; -using ::UsbDsInterface; -using ::UsbDsReportData; -using ::UsbDsReportEntry; -using ::UsbHsClientEpSession; -/// The interface service object. These Events have autoclear=false. -using ::UsbHsClientIfSession; -/// Interface struct. Note that devices have a seperate \ref UsbHsInterface for each interface. -using ::UsbHsInterface; -/// Interface filtering struct. When the associated flag bit is set, the associated descriptor field and struct field are compared, on mismatch the interface is filtered out. -/// [7.0.0+]: The filter struct has to be unique, it can't be used by anything else (including other processes). Hence, Flags has to be non-zero. When initialized with usb:hs:a and VID and/or PID filtering is enabled, the VID/PID will be checked against a blacklist. -using ::UsbHsInterfaceFilter; -using ::UsbHsInterfaceFilterFlags; -/// Descriptors which are not available are set to all-zero. -/// The INPUT/OUTPUT endpoint descriptors were swapped with [8.0.0+], libnx converts this struct to the newer layout when running on pre-8.0.0. -using ::UsbHsInterfaceInfo; -using ::UsbHsRingHeader; -using ::UsbHsXferReport; -/// USB Device States, per USB 2.0 spec -using ::UsbState; -///< Unique identifier. -using ::UtilFloat3; -using ::UTimer; -///< Function without arguments nor return value. -using ::Uuid; -/// Used as argument for certain drawing commands. -using ::ViColorRgba4444; -using ::ViColorRgba8888; -using ::ViDisplay; -using ::ViDisplayName; -using ::ViLayer; -/// Used by viCreateLayer when CreateStrayLayer is used internally. -using ::ViLayerFlags; -/// Used as argument to many capture functions. -using ::ViLayerStack; -/// Used with viSetDisplayPowerState. -using ::ViPowerState; -/// Address space reservation type (see \ref virtmemAddReservation) -using ::VirtmemReservation; -/// Used with viSetLayerScalingMode. -using ::ViScalingMode; -using ::ViServiceType; -///< Thread entrypoint function. -using ::VoidFn; -///< 64-bit volatile signed integer. -using ::vs128; -///< 8-bit volatile signed integer. -using ::vs16; -///< 16-bit volatile signed integer. -using ::vs32; -///< 32-bit volatile signed integer. -using ::vs64; -///< 128-bit volatile unsigned integer. -using ::vs8; -///< 64-bit volatile unsigned integer. -using ::vu128; -///< 8-bit volatile unsigned integer. -using ::vu16; -///< 16-bit volatile unsigned integer. -using ::vu32; -///< 32-bit volatile unsigned integer. -using ::vu64; -///< 128-bit unsigned integer. -using ::vu8; -using ::Waitable; -using ::WaitableMethods; -using ::WaitableNode; -/// Waiter structure, representing any generic waitable synchronization object; both kernel-mode and user-mode. -using ::Waiter; -using ::WaiterType; -/// Header struct at offset 0 in the web Arg storage (non-webWifi). -using ::WebArgHeader; -/// Web TLV used in the web Arg storage. -using ::WebArgTLV; -/// Types for \ref WebArgTLV, input storage. -using ::WebArgType; -/// Kind values for \ref webConfigSetBackgroundKind. Controls the background color while displaying the loading screen during applet boot. Only used when \ref WebBootDisplayKind is ::WebBootDisplayKind_Default. If the applet was not launched by an Application, the applet will only use WebBackgroundKind_Default. -using ::WebBackgroundKind; -/// Kind values for \ref webConfigSetBootDisplayKind. Controls the background color while displaying the loading screen during applet boot. Also controls the BackgroundKind when value is non-zero. -using ::WebBootDisplayKind; -/// Entry data for ::WebArgType_BootFooterButton. -using ::WebBootFooterButtonEntry; -/// Config struct for web applets, non-WebWifi. -using ::WebCommonConfig; -/// Common container struct for applets' reply data, from the output storage. -using ::WebCommonReply; -/// Common struct for the applet output storage, for non-TLV-storage. -using ::WebCommonReturnValue; -/// TLV storage, starts with \ref WebArgHeader followed by \ref WebArgTLV entries. -using ::WebCommonTLVStorage; -/// This controls the kind of content to mount with Offline-applet. -using ::WebDocumentKind; -/// ExitReason -using ::WebExitReason; -/// Button values for \ref webConfigSetBootFooterButtonVisible. -using ::WebFooterButtonId; -/// Kind values for \ref webConfigSetFooterFixedKind. Controls UI footer display behaviour. -using ::WebFooterFixedKind; -/// Mode values for \ref webConfigSetLeftStickMode. Controls the initial mode, this can be toggled by the user via the pressing the left-stick button. If the Pointer flag is set to false (\ref webConfigSetPointer), only ::WebLeftStickMode_Cursor will be used and mode toggle by the user is disabled (input value ignored). -using ::WebLeftStickMode; -/// Types for \ref WebArgTLV, output storage. -using ::WebReplyType; -/// WebSession -using ::WebSession; -/// WebSessionBootMode -using ::WebSessionBootMode; -/// SessionMessageHeader -using ::WebSessionMessageHeader; -/// WebSessionReceiveMessageKind -using ::WebSessionReceiveMessageKind; -/// WebSessionSendMessageKind -using ::WebSessionSendMessageKind; -/// StorageHandleQueue -using ::WebSessionStorageHandleQueue; -/// This controls the initial page for ShareApplet, used by \ref webShareCreate. -using ::WebShareStartPage; -/// This indicates the type of web-applet. -using ::WebShimKind; -/// Config for WebWifi. -using ::WebWifiConfig; -/// Struct for the WebWifi applet input storage. -using ::WebWifiPageArg; -/// Struct for the WebWifi applet output storage. -using ::WebWifiReturnValue; -/// WLAN State. -using ::WlanInfState; -/// XcdDeviceHandle -using ::XcdDeviceHandle; -/// XcdInterfaceType -using ::XcdInterfaceType; -/// SleepThread yield types. -using ::YieldType; - -/// Address of the host connected through nxlink -using ::__nxlink_host; - -/// @brief C++ wrappers for the `account` API. -/// @details Wraps: switch/services/acc.h. -namespace account { - -/// NetworkServiceAccountId -using ::AccountNetworkServiceAccountId; -/// Profile -using ::AccountProfile; -/// ProfileBase -using ::AccountProfileBase; -using ::AccountServiceType; -/// Account UserId. -using ::AccountUid; -/// UserData -using ::AccountUserData; - -/// Initialize account. -Result Initialize(AccountServiceType service_type); - -/// Exit account. -void Exit(void); - -/// Gets the Service object for the actual account service session. -Service* GetServiceSession(void); - -/// Get the total number of user profiles. -Result GetUserCount(s32* user_count); - -/** - * @brief Get a list of all userIds. The returned list will never be larger than ACC_USER_LIST_SIZE. - * @param uids Pointer to array of userIds. - * @param max_uids Maximum number of userIds to return. - * @param actual_total The actual total number of userIds found. - */ -Result ListAllUsers(AccountUid* uids, s32 max_uids, s32 *actual_total); - -/// Get the userId for the last opened user. -Result GetLastOpenedUser(AccountUid *uid); - -/// Get an AccountProfile for the specified userId. -Result GetProfile(AccountProfile* out, AccountUid uid); - -/// IsUserRegistrationRequestPermitted -Result IsUserRegistrationRequestPermitted(bool *out); - -/// TrySelectUserWithoutInteraction -Result TrySelectUserWithoutInteraction(AccountUid *uid, bool is_network_service_account_required); - -/// Close the AccountProfile. -void ProfileClose(AccountProfile* profile); - -/// Get \ref AccountUserData and \ref AccountProfileBase for the specified profile, userdata is optional (can be NULL). -Result ProfileGet(AccountProfile* profile, AccountUserData* userdata, AccountProfileBase* profilebase); - -/// Get the icon image size. -Result ProfileGetImageSize(AccountProfile* profile, u32* image_size); - -/// Load the JPEG profile icon, valid for both Miis and character icons. The output image_size is the same as the one from \ref accountProfileGetImageSize. -Result ProfileLoadImage(AccountProfile* profile, void* buf, size_t len, u32* image_size); - -/// Gets the userId which was selected by the profile-selector applet (if any), prior to launching the currently running Application. -/// This gets the cached PreselectedUser loaded during accountInitialize, when PreselectedUser is available. -Result GetPreselectedUser(AccountUid *uid); - -/** - * @brief Checks whether the specified \ref AccountUid is valid/set (non-zero). - * @param[in] Uid \ref AccountUid - */ -bool UidIsValid(const AccountUid *Uid); - -} // namespace account - -/// @brief C++ wrappers for the `aes128` API. -/// @details Wraps: switch/crypto/aes.h, switch/crypto/aes_cbc.h, switch/crypto/aes_ctr.h, switch/crypto/aes_xts.h. -namespace aes128 { - -/// Context for AES-128 CBC. -using ::Aes128CbcContext; -/// Context for AES-128 operations. -using ::Aes128Context; -/// Context for AES-128 CTR. -using ::Aes128CtrContext; -/// Context for AES-128 XTS. -using ::Aes128XtsContext; -/// Context for AES-192 CBC. -using ::Aes192CbcContext; -/// Context for AES-192 operations. -using ::Aes192Context; -/// Context for AES-192 CTR. -using ::Aes192CtrContext; -/// Context for AES-192 XTS. -using ::Aes192XtsContext; -/// Context for AES-256 CBC. -using ::Aes256CbcContext; -/// Context for AES-256 operations. -using ::Aes256Context; -/// Context for AES-256 CTR. -using ::Aes256CtrContext; -/// Context for AES-256 XTS. -using ::Aes256XtsContext; - -/// Initialize a 128-bit AES context. -void ContextCreate(Aes128Context *out, const void *key, bool is_encryptor); - -/// Encrypt using an AES context (Requires is_encryptor when initializing) -void EncryptBlock(const Aes128Context *ctx, void *dst, const void *src); - -/// Decrypt using an AES context (Requires !is_encryptor when initializing) -void DecryptBlock(const Aes128Context *ctx, void *dst, const void *src); - -/// 128-bit CBC API. -void CbcContextCreate(Aes128CbcContext *out, const void *key, const void *iv, bool is_encryptor); - -void CbcContextResetIv(Aes128CbcContext *ctx, const void *iv); - -size_t CbcEncrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size); - -size_t CbcDecrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size); - -/// 128-bit CTR API. -void CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr); - -void CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr); - -void CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t size); - -/// 128-bit XTS API. -void XtsContextCreate(Aes128XtsContext *out, const void *key0, const void *key1, bool is_encryptor); - -void XtsContextResetTweak(Aes128XtsContext *ctx, const void *tweak); - -void XtsContextResetSector(Aes128XtsContext *ctx, uint64_t sector, bool is_nintendo); - -size_t XtsEncrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size); - -size_t XtsDecrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size); - -} // namespace aes128 - -/// @brief C++ wrappers for the `aes192` API. -/// @details Wraps: switch/crypto/aes.h, switch/crypto/aes_cbc.h, switch/crypto/aes_ctr.h, switch/crypto/aes_xts.h. -namespace aes192 { - -/// Context for AES-128 CBC. -using ::Aes128CbcContext; -/// Context for AES-128 operations. -using ::Aes128Context; -/// Context for AES-128 CTR. -using ::Aes128CtrContext; -/// Context for AES-128 XTS. -using ::Aes128XtsContext; -/// Context for AES-192 CBC. -using ::Aes192CbcContext; -/// Context for AES-192 operations. -using ::Aes192Context; -/// Context for AES-192 CTR. -using ::Aes192CtrContext; -/// Context for AES-192 XTS. -using ::Aes192XtsContext; -/// Context for AES-256 CBC. -using ::Aes256CbcContext; -/// Context for AES-256 operations. -using ::Aes256Context; -/// Context for AES-256 CTR. -using ::Aes256CtrContext; -/// Context for AES-256 XTS. -using ::Aes256XtsContext; - -/// Initialize a 192-bit AES context. -void ContextCreate(Aes192Context *out, const void *key, bool is_encryptor); - -/// Encrypt using an AES context (Requires is_encryptor when initializing) -void EncryptBlock(const Aes192Context *ctx, void *dst, const void *src); - -/// Decrypt using an AES context (Requires !is_encryptor when initializing) -void DecryptBlock(const Aes192Context *ctx, void *dst, const void *src); - -/// 192-bit CBC API. -void CbcContextCreate(Aes192CbcContext *out, const void *key, const void *iv, bool is_encryptor); - -void CbcContextResetIv(Aes192CbcContext *ctx, const void *iv); - -size_t CbcEncrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size); - -size_t CbcDecrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size); - -/// 192-bit CTR API. -void CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr); - -void CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr); - -void CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t size); - -/// 192-bit XTS API. -void XtsContextCreate(Aes192XtsContext *out, const void *key0, const void *key1, bool is_encryptor); - -void XtsContextResetTweak(Aes192XtsContext *ctx, const void *tweak); - -void XtsContextResetSector(Aes192XtsContext *ctx, uint64_t sector, bool is_nintendo); - -size_t XtsEncrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size); - -size_t XtsDecrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size); - -} // namespace aes192 - -/// @brief C++ wrappers for the `aes256` API. -/// @details Wraps: switch/crypto/aes.h, switch/crypto/aes_cbc.h, switch/crypto/aes_ctr.h, switch/crypto/aes_xts.h. -namespace aes256 { - -/// Context for AES-128 CBC. -using ::Aes128CbcContext; -/// Context for AES-128 operations. -using ::Aes128Context; -/// Context for AES-128 CTR. -using ::Aes128CtrContext; -/// Context for AES-128 XTS. -using ::Aes128XtsContext; -/// Context for AES-192 CBC. -using ::Aes192CbcContext; -/// Context for AES-192 operations. -using ::Aes192Context; -/// Context for AES-192 CTR. -using ::Aes192CtrContext; -/// Context for AES-192 XTS. -using ::Aes192XtsContext; -/// Context for AES-256 CBC. -using ::Aes256CbcContext; -/// Context for AES-256 operations. -using ::Aes256Context; -/// Context for AES-256 CTR. -using ::Aes256CtrContext; -/// Context for AES-256 XTS. -using ::Aes256XtsContext; - -/// Initialize a 256-bit AES context. -void ContextCreate(Aes256Context *out, const void *key, bool is_encryptor); - -/// Encrypt using an AES context (Requires is_encryptor when initializing) -void EncryptBlock(const Aes256Context *ctx, void *dst, const void *src); - -/// Decrypt using an AES context (Requires !is_encryptor when initializing) -void DecryptBlock(const Aes256Context *ctx, void *dst, const void *src); - -/// 256-bit CBC API. -void CbcContextCreate(Aes256CbcContext *out, const void *key, const void *iv, bool is_encryptor); - -void CbcContextResetIv(Aes256CbcContext *ctx, const void *iv); - -size_t CbcEncrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size); - -size_t CbcDecrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size); - -/// 256-bit CTR API. -void CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr); - -void CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr); - -void CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size); - -/// 256-bit XTS API. -void XtsContextCreate(Aes256XtsContext *out, const void *key0, const void *key1, bool is_encryptor); - -void XtsContextResetTweak(Aes256XtsContext *ctx, const void *tweak); - -void XtsContextResetSector(Aes256XtsContext *ctx, uint64_t sector, bool is_nintendo); - -size_t XtsEncrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size); - -size_t XtsDecrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size); - -} // namespace aes256 - -/// @brief C++ wrappers for the `album` API. -/// @details Wraps: switch/applets/album_la.h. -namespace album { - -/// Arg type values pushed for the applet input storage, stored as an u8. -using ::AlbumLaArg; - -/** - * @brief Launches the applet with ::AlbumLaArg_ShowAlbumFiles and playStartupSound=false. - */ -Result LaShowAlbumFiles(void); - -/** - * @brief Launches the applet with ::AlbumLaArg_ShowAllAlbumFiles and playStartupSound=false. - */ -Result LaShowAllAlbumFiles(void); - -/** - * @brief Launches the applet with ::AlbumLaArg_ShowAllAlbumFilesForHomeMenu and playStartupSound=true. - */ -Result LaShowAllAlbumFilesForHomeMenu(void); - -} // namespace album - -/// @brief C++ wrappers for the `apm` API. -/// @details Wraps: switch/services/apm.h. -namespace apm { - -/// CpuBoostMode. With \ref appletSetCpuBoostMode, only values 0/1 are available. This allows using higher clock rates. -using ::ApmCpuBoostMode; -/// PerformanceMode -using ::ApmPerformanceMode; - -/// Initialize apm. Used automatically by \ref appletInitialize with AppletType_Application. -Result Initialize(void); - -/// Exit apm. Used automatically by \ref appletExit with AppletType_Application. -void Exit(void); - -/// Gets the Service object for the actual apm service session. -Service* GetServiceSession(void); - -/// Gets the Service object for ISession. -Service* GetServiceSession_Session(void); - -/** - * @brief Gets the current ApmPerformanceMode. - * @param[out] out_performanceMode ApmPerformanceMode - */ -Result GetPerformanceMode(ApmPerformanceMode* out_performanceMode); - -/** - * @brief Sets the PerformanceConfiguration for the specified PerformanceMode. - * @param[in] PerformanceMode \ref ApmPerformanceMode - * @param[in] PerformanceConfiguration PerformanceConfiguration - */ -Result SetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 PerformanceConfiguration); - -/** - * @brief Gets the PerformanceConfiguration for the specified PerformanceMode. - * @param[in] PerformanceMode \ref ApmPerformanceMode - * @param[out] PerformanceConfiguration PerformanceConfiguration - */ -Result GetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 *PerformanceConfiguration); - -} // namespace apm - -/// @brief C++ wrappers for the `applet` API. -/// @details Wraps: switch/services/applet.h. -namespace applet { - -/// IApplicationAccessor container. -using ::AppletApplication; -/// ApplicationAttribute -using ::AppletApplicationAttribute; -/// Attributes for launching applications for Quest. -using ::AppletApplicationAttributeForQuest; -/// AppletApplicationExitReason -using ::AppletApplicationExitReason; -/// ApplicationLaunchProperty -using ::AppletApplicationLaunchProperty; -/// ApplicationLaunchRequestInfo -using ::AppletApplicationLaunchRequestInfo; -/// Used by \ref appletInitialize with __nx_applet_AppletAttribute for cmd OpenLibraryAppletProxy (AppletType_LibraryApplet), on [3.0.0+]. The default for this struct is all-zero. -using ::AppletAttribute; -/// CaptureSharedBuffer for the IDisplayController commands. -using ::AppletCaptureSharedBuffer; -/// FocusHandlingMode -using ::AppletFocusHandlingMode; -/// FocusState -using ::AppletFocusState; -/// GpuErrorHandler -using ::AppletGpuErrorHandler; -/// LibraryApplet state. -using ::AppletHolder; -/// applet hook cookie. -using ::AppletHookCookie; -/// applet hook function. -using ::AppletHookFn; -/// applet hook types. -using ::AppletHookType; -/// AppletId -using ::AppletId; -/// IdentityInfo -using ::AppletIdentityInfo; -/// Extension values for \ref appletSetIdleTimeDetectionExtension / \ref appletGetIdleTimeDetectionExtension, for extending user inactivity detection. -using ::AppletIdleTimeDetectionExtension; -/// Cached info for the current LibraryApplet, from \ref appletGetAppletInfo. -using ::AppletInfo; -/// Input policy values for \ref appletSetInputDetectionPolicy. -using ::AppletInputDetectionPolicy; -/// LaunchParameterKind -using ::AppletLaunchParameterKind; -/// LockAccessor -using ::AppletLockAccessor; -/// AppletMessage, for \ref appletGetMessage. See also \ref AppletHookType. -using ::AppletMessage; -/// OperationMode -using ::AppletOperationMode; -/// AppletProcessLaunchReason, from GetLaunchReason. -using ::AppletProcessLaunchReason; -/// ProgramSpecifyKind for the ExecuteProgram cmd. Controls the type of the u64 passed to the ExecuteProgram cmd. -using ::AppletProgramSpecifyKind; -/// AppletResourceUsageInfo, from \ref appletGetAppletResourceUsageInfo. -using ::AppletResourceUsageInfo; -/// Permission values for \ref appletSetScreenShotPermission. -using ::AppletScreenShotPermission; -/// applet IStorage -using ::AppletStorage; -/// Type values for \ref appletPerformSystemButtonPressingIfInFocus. -using ::AppletSystemButtonType; -/// ThemeColorType -using ::AppletThemeColorType; -/// Mode values for \ref appletSetTvPowerStateMatchingMode. -using ::AppletTvPowerStateMatchingMode; -/// AppletType -using ::AppletType; -/// WindowOriginMode -using ::AppletWindowOriginMode; -/// Input mode values for \ref appletSetWirelessPriorityMode. -using ::AppletWirelessPriorityMode; -/// LibraryAppletExitReason -using ::LibAppletExitReason; -/// LibraryAppletInfo -using ::LibAppletInfo; -/// LibraryAppletMode -using ::LibAppletMode; - -/// Initialize applet, called automatically during app startup. -Result Initialize(void); - -/// Exit applet, called automatically during app exit. -void Exit(void); - -/// Gets the Service object for the actual "appletOE"/"appletAE" service session. -Service* GetServiceSession_Proxy(void); - -/// Gets the Service object for IAppletCommonFunctions. Only initialized with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+]. -Service* GetServiceSession_AppletCommonFunctions(void); - -/// Gets the Service object for I*Functions, specific to each AppletType (IApplicationFunctions for AppletType_*Application). Not initialized with AppletType_LibraryApplet pre-15.0.0. On [15.0.0+] with AppletType_LibraryApplet this returns the object for IHomeMenuFunctions. -Service* GetServiceSession_Functions(void); - -/// Gets the Service object for IGlobalStateController. Only initialized with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. -Service* GetServiceSession_GlobalStateController(void); - -/// Gets the Service object for IApplicationCreator. Only initialized with AppletType_SystemApplet. -Service* GetServiceSession_ApplicationCreator(void); - -/// Gets the Service object for ILibraryAppletSelfAccessor. Only initialized with AppletType_LibraryApplet. -Service* GetServiceSession_LibraryAppletSelfAccessor(void); - -/// Gets the Service object for IProcessWindingController. Only initialized with AppletType_LibraryApplet. -Service* GetServiceSession_ProcessWindingController(void); - -/// Gets the Service object for ILibraryAppletCreator. -Service* GetServiceSession_LibraryAppletCreator(void); - -/// Gets the Service object for ICommonStateGetter. -Service* GetServiceSession_CommonStateGetter(void); - -/// Gets the Service object for ISelfController. -Service* GetServiceSession_SelfController(void); - -/// Gets the Service object for IWindowController. -Service* GetServiceSession_WindowController(void); - -/// Gets the Service object for IAudioController. -Service* GetServiceSession_AudioController(void); - -/// Gets the Service object for IDisplayController. -Service* GetServiceSession_DisplayController(void); - -/// Gets the Service object for IDebugFunctions. -Service* GetServiceSession_DebugFunctions(void); - -/// Get the cached AppletResourceUserId. -u64 GetAppletResourceUserId(void); - -/// Get the \ref AppletType. -AppletType GetAppletType(void); - -/// Sets the state field for \ref AppletThemeColorType. -void SetThemeColorType(AppletThemeColorType theme); - -/// Gets the state field for \ref AppletThemeColorType. Used internally by \ref libappletArgsCreate. -AppletThemeColorType GetThemeColorType(void); - -/** - * @brief Gets the CradleStatus. - * @param[out] status Output Dock status. - */ -Result GetCradleStatus(u8 *status); - -/** - * @brief Gets the BootMode which originated from \ref pmbmGetBootMode. - * @param[out] mode \ref PmBootMode - */ -Result GetBootMode(PmBootMode *mode); - -/** - * @brief Request to AcquireSleepLock. - * @note On success, this then uses cmd GetAcquiredSleepLockEvent and waits on that event. - */ -Result RequestToAcquireSleepLock(void); - -/** - * @brief Release the SleepLock. - */ -Result ReleaseSleepLock(void); - -/** - * @brief Release the SleepLock transiently. - * @note On success, this then uses cmd GetAcquiredSleepLockEvent and waits on that event. - */ -Result ReleaseSleepLockTransiently(void); - -/** - * @brief GetWakeupCount - * @note Only available with [11.0.0+]. - * @param[out] out Output value. - */ -Result GetWakeupCount(u64 *out); - -/** - * @brief Pushes a storage to the general channel. Used for sending requests to SystemApplet. - * @note This is not usable under an Application, however it is usable under a LibraryApplet. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result PushToGeneralChannel(AppletStorage *s); - -/** - * @brief Gets a \ref AppletLockAccessor for HomeButtonReader. - * @note Similar to using \ref appletGetReaderLockAccessorEx with inval=0. - * @param a LockAccessor object. - */ -Result GetHomeButtonReaderLockAccessor(AppletLockAccessor *a); - -/** - * @brief Gets a Reader \ref AppletLockAccessor. - * @note Only available with [2.0.0+]. - * @param a LockAccessor object. - * @param[in] inval Input value, must be 0-3. 0 = HomeButton. - */ -Result GetReaderLockAccessorEx(AppletLockAccessor *a, u32 inval); - -/** - * @brief Gets a Writer \ref AppletLockAccessor. - * @note Only available with [7.0.0+]. On older sysvers, this is only available with AppletType_SystemApplet on [2.0.0+]. - * @param a LockAccessor object. - * @param[in] inval Input value, must be 0-3. 0 = HomeButton. - */ -Result GetWriterLockAccessorEx(AppletLockAccessor *a, u32 inval); - -/** - * @brief Gets the Dock firmware version. - * @note Only available with [2.0.0+]. - * @param[out] out0 First output value. - * @param[out] out1 Second output value. - * @param[out] out2 Third output value. - * @param[out] out3 Fourth output value. - */ -Result GetCradleFwVersion(u32 *out0, u32 *out1, u32 *out2, u32 *out3); - -/** - * @brief Gets whether VrMode is enabled. - * @note Only available with [3.0.0+]. - * @param out Output flag - */ -Result IsVrModeEnabled(bool *out); - -/** - * @brief Sets whether VrMode is enabled. - * @note This is only fully usable system-side with [6.0.0+]. - * @note For checking Parental Controls, see \ref pctlIsStereoVisionPermitted. - * @note On pre-7.0.0 this uses cmd SetVrModeEnabled internally, while on [7.0.0+] this uses cmds BeginVrModeEx/EndVrModeEx. - * @param flag Flag - */ -Result SetVrModeEnabled(bool flag); - -/** - * @brief Sets whether the LCD screen backlight is turned off. - * @note Only available with [4.0.0+]. - * @param[in] flag Flag - */ -Result SetLcdBacklightOffEnabled(bool flag); - -/** - * @brief Gets the ControllerFirmwareUpdateSection flag. - * @note Only available with [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsInControllerFirmwareUpdateSection(bool *out); - -/** - * @brief SetVrPositionForDebug - * @note The cached value loaded from \ref setsysGetDebugModeFlag must be 1, otherwise an error is returned. - * @note Only available with [11.0.0+]. - * @param[in] x X, must not be negative. x+width must be <=1280. - * @param[in] y Y, must not be negative. y+height must be <=720. - * @param[in] width Width, must be 1-1280. - * @param[in] height Height, must be 1-720. - */ -Result SetVrPositionForDebug(s32 x, s32 y, s32 width, s32 height); - -/** - * @brief Gets the DefaultDisplayResolution. - * @note Only available with [3.0.0+]. - * @param[out] width Output width. - * @param[out] height Output height. - */ -Result GetDefaultDisplayResolution(s32 *width, s32 *height); - -/** - * @brief Gets an Event which is signaled when the output from \ref appletGetDefaultDisplayResolution changes. - * @note Only available with [3.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result GetDefaultDisplayResolutionChangeEvent(Event *out_event); - -/** - * @brief Gets the HdcpAuthenticationState. - * @note Only available with [4.0.0+]. - * @param[out] state Output state. - */ -Result GetHdcpAuthenticationState(s32 *state); - -/** - * @brief Gets an Event which is signaled when the output from \ref appletGetHdcpAuthenticationState changes. - * @note Only available with [4.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result GetHdcpAuthenticationStateChangeEvent(Event *out_event); - -/** - * @brief Sets the \ref AppletTvPowerStateMatchingMode. - * @note Only available with [5.0.0+]. - * @param[in] mode \ref AppletTvPowerStateMatchingMode - */ -Result SetTvPowerStateMatchingMode(AppletTvPowerStateMatchingMode mode); - -/** - * @brief Gets the ApplicationId for the specified ContentActionName string. - * @note Only available when the current applet is an AppletType_SystemApplication on [5.1.0+]. - * @param[out] application_id ApplicationId. - * @param[in] name ContentActionName string. - */ -Result GetApplicationIdByContentActionName(u64 *application_id, const char *name); - -/** - * @brief Sets the \ref ApmCpuBoostMode. - * @note Only available with [7.0.0+] (not fully usable system-side with 6.x). - * @param mode \ref ApmCpuBoostMode. - */ -Result SetCpuBoostMode(ApmCpuBoostMode mode); - -/** - * @brief CancelCpuBoostMode - * @note Only available with [10.0.0+]. - */ -Result CancelCpuBoostMode(void); - -/** - * @brief GetBuiltInDisplayType - * @note Only available with [11.0.0+]. - * @param[out] out Output value. - */ -Result GetBuiltInDisplayType(s32 *out); - -/** - * @brief Perform SystemButtonPressing with the specified \ref AppletSystemButtonType. Internally this cmd checks a state field, verifies that the type is allowed, then runs the same func as \ref appletPerformSystemButtonPressing internally. - * @note Only available with [6.0.0+]. - * @param[in] type \ref AppletSystemButtonType - */ -Result PerformSystemButtonPressingIfInFocus(AppletSystemButtonType type); - -/** - * @brief Sets whether PerformanceConfigurationChangedNotification is enabled. - * @note Only available with [7.0.0+]. - * @param[in] flag Whether to enable the notification. - */ -Result SetPerformanceConfigurationChangedNotification(bool flag); - -/** - * @brief Gets the current PerformanceConfiguration. - * @note Only available with [7.0.0+]. - * @param PerformanceConfiguration Output PerformanceConfiguration. - */ -Result GetCurrentPerformanceConfiguration(u32 *PerformanceConfiguration); - -/** - * @brief Opens an \ref AppletGpuErrorHandler. - * @note The cached value loaded from \ref setsysGetDebugModeFlag must be 1, otherwise an error is returned. - * @note Only available with [11.0.0+]. - * @param[out] g \ref AppletGpuErrorHandler - */ -Result OpenMyGpuErrorHandler(AppletGpuErrorHandler *g); - -/** - * @brief Gets the OperationModeSystemInfo. - * @note Only available with [7.0.0+]. - * @param[out] info Output info. - */ -Result GetOperationModeSystemInfo(u32 *info); - -/** - * @brief This uses \ref setsysGetPlatformRegion internally. - * @note Only available with [9.0.0+]. - * @param[out] out \ref SetSysPlatformRegion - */ -Result GetSettingsPlatformRegion(SetSysPlatformRegion *out); - -/** - * @brief ActivateMigrationService - * @note Only available with [10.0.0+]. - */ -Result ActivateMigrationService(void); - -/** - * @brief DeactivateMigrationService - * @note Only available with [10.0.0+]. - */ -Result DeactivateMigrationService(void); - -/** - * @brief DisableSleepTillShutdown - * @note Only available with [11.0.0+]. - */ -Result DisableSleepTillShutdown(void); - -/** - * @brief SuppressDisablingSleepTemporarily - * @param[in] val Nanoseconds value. - * @note Only available with [11.0.0+]. - */ -Result SuppressDisablingSleepTemporarily(u64 val); - -/** - * @brief SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled - * @note Only available with [11.0.0+]. - */ -Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(void); - -/** - * @brief Close an \ref AppletGpuErrorHandler. - * @param g \ref AppletGpuErrorHandler - */ -void GpuErrorHandlerClose(AppletGpuErrorHandler *g); - -/** - * @brief Gets the size of the info available with \ref appletGpuErrorHandlerGetManualGpuErrorInfo. - * @param g \ref AppletGpuErrorHandler - * @param[out] out Output size. - */ -Result GpuErrorHandlerGetManualGpuErrorInfoSize(AppletGpuErrorHandler *g, u64 *out); - -/** - * @brief GetManualGpuErrorInfo - * @param g \ref AppletGpuErrorHandler - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size, must be >= the output size from \ref appletGpuErrorHandlerGetManualGpuErrorInfoSize. - * @param[out] out Output value. - */ -Result GpuErrorHandlerGetManualGpuErrorInfo(AppletGpuErrorHandler *g, void* buffer, size_t size, u64 *out); - -/** - * @brief GetManualGpuErrorDetectionSystemEvent - * @param g \ref AppletGpuErrorHandler - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(AppletGpuErrorHandler *g, Event *out_event); - -/** - * @brief FinishManualGpuErrorHandling - * @param g \ref AppletGpuErrorHandler - */ -Result GpuErrorHandlerFinishManualGpuErrorHandling(AppletGpuErrorHandler *g); - -/** - * @brief Delay exiting until \ref appletUnlockExit is called, with a 15 second timeout once exit is requested. - * @note When exit is requested \ref appletMainLoop will return false, hence any main-loop using appletMainLoop will exit. This allows the app to handle cleanup post-main-loop instead of being force-terminated. - * @note If the above timeout occurs after exit was requested where \ref appletUnlockExit was not called, the process will be forced-terminated. - * @note \ref appletUnlockExit must be used before main() returns. - */ -Result LockExit(void); - -/// Unlocks exiting, see \ref appletLockExit. -Result UnlockExit(void); - -/** - * @brief Enter FatalSection. - */ -Result EnterFatalSection(void); - -/** - * @brief Leave FatalSection. - */ -Result LeaveFatalSection(void); - -/** - * @brief Controls whether screenshot-capture is allowed. - * @param permission \ref AppletScreenShotPermission - */ -Result SetScreenShotPermission(AppletScreenShotPermission permission); - -/** - * @brief Sets whether ::AppletMessage_Resume is enabled. - * @param[in] flag Whether to enable the notification. - */ -Result SetRestartMessageEnabled(bool flag); - -/** - * @brief Sets the \ref AppletIdentityInfo for screenshots. - * @param[in] info \ref AppletIdentityInfo - */ -Result SetScreenShotAppletIdentityInfo(AppletIdentityInfo *info); - -/** - * @brief Sets ControllerFirmwareUpdateSection. - * @note Only available with [3.0.0+]. - * @note This throws error 0x40280 when the internal state flag already matches the input value. - * @param[in] flag Flag - */ -Result SetControllerFirmwareUpdateSection(bool flag); - -/** - * @brief Sets whether ::AppletMessage_CaptureButtonShortPressed is enabled. - * @note Only available with [3.0.0+]. - * @note When enabled with a non-Overlay applet, Overlay applet will not be notified of capture button short-presses for screenshots. - * @param[in] flag Whether to enable the notification. - */ -Result SetRequiresCaptureButtonShortPressedMessage(bool flag); - -/** - * @brief Sets the Album screenshot ImageOrientation. - * @note Only available with [3.0.0+]. - * @param[in] orientation \ref AlbumImageOrientation - */ -Result SetAlbumImageOrientation(AlbumImageOrientation orientation); - -/** - * @brief Sets the DesirableKeyboardLayout. - * @note Only available with [4.0.0+]. - * @param[in] layout Input \ref SetKeyboardLayout. - */ -Result SetDesirableKeyboardLayout(SetKeyboardLayout layout); - -Result CreateManagedDisplayLayer(u64 *out); - -/** - * @brief Checks whether SystemBufferSharing is enabled, throwing an error otherwise. - * @note Only available with [4.0.0+]. Not usable with AppletType_*Application. - */ -Result IsSystemBufferSharingEnabled(void); - -/** - * @brief Gets the System SharedBufferHandle and SharedLayerHandle. - * @note Only available with [4.0.0+]. Not usable with AppletType_*Application. - * @param[out] SharedBufferHandle Output System SharedBufferHandle. - * @param[out] SharedLayerHandle Output System SharedLayerHandle. - */ -Result GetSystemSharedLayerHandle(u64 *SharedBufferHandle, u64 *SharedLayerHandle); - -/** - * @brief Same as \ref appletGetSystemSharedLayerHandle except this just gets the SharedBufferHandle. - * @note Only available with [5.0.0+]. Not usable with AppletType_*Application. - * @param[out] SharedBufferHandle Output System SharedBufferHandle. - */ -Result GetSystemSharedBufferHandle(u64 *SharedBufferHandle); - -/** - * @brief CreateManagedDisplaySeparableLayer - * @note Only available with [10.0.0+]. - * @param[out] display_layer Output display_layer. - * @param[out] recording_layer Output recording_layer. - */ -Result CreateManagedDisplaySeparableLayer(u64 *display_layer, u64 *recording_layer); - -/** - * @brief SetManagedDisplayLayerSeparationMode - * @note Only available with [10.0.0+]. - * @param[in] mode Mode. Must be 0-1. - */ -Result SetManagedDisplayLayerSeparationMode(u32 mode); - -/** - * @brief Sets whether ::AppletMessage_RequestToDisplay is enabled. - * @note Sets an internal state flag. When the input flag is 0, this will in additional run the same code as \ref appletApproveToDisplay. - * @param[in] flag Flag - */ -Result SetHandlesRequestToDisplay(bool flag); - -/** - * @brief Approve the display requested by ::AppletMessage_RequestToDisplay, see also \ref appletSetHandlesRequestToDisplay. - */ -Result ApproveToDisplay(void); - -/** - * @brief OverrideAutoSleepTimeAndDimmingTime - * @param[in] inval0 Unknown input value. - * @param[in] inval1 Unknown input value. - * @param[in] inval2 Unknown input value. - * @param[in] inval3 Unknown input value. - */ -Result OverrideAutoSleepTimeAndDimmingTime(s32 inval0, s32 inval1, s32 inval2, s32 inval3); - -/** - * @brief Sets the IdleTimeDetectionExtension. - * @param[in] ext \ref AppletIdleTimeDetectionExtension Must be 0-2: 0 = disabled, 1 = Extended, and 2 = ExtendedUnsafe. - */ -Result SetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension ext); - -/** - * @brief Gets the value set by \ref appletSetIdleTimeDetectionExtension. - * @param[out] ext \ref AppletIdleTimeDetectionExtension - */ -Result GetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension *ext); - -/** - * @brief Sets the InputDetectionSourceSet. - * @param[in] val Input value. - */ -Result SetInputDetectionSourceSet(u32 val); - -/** - * @brief Reports that the user is active, for idle detection (screen dimming / auto-sleep). This is equivalent to when the user uses HID input. - * @note Only available with [2.0.0+]. - */ -Result ReportUserIsActive(void); - -/** - * @brief Gets the current Illuminance from the light sensor. - * @note Only available with [3.0.0+]. - * @param fLux Output fLux - */ -Result GetCurrentIlluminance(float *fLux); - -/** - * @brief Gets whether Illuminance is available. - * @note Only available with [3.0.0+]. - * @param out Output flag - */ -Result IsIlluminanceAvailable(bool *out); - -/** - * @brief Sets AutoSleepDisabled. - * @note Only available with [5.0.0+]. - * @param[in] flag Flag - */ -Result SetAutoSleepDisabled(bool flag); - -/** - * @brief Gets AutoSleepDisabled. - * @note Only available with [5.0.0+]. - * @param[out] out Output flag - */ -Result IsAutoSleepDisabled(bool *out); - -/** - * @brief Gets the current Illuminance from the light sensor. Same as \ref appletGetCurrentIlluminance except for the additional param. - * @note Only available with [5.0.0+]. - * @param bOverLimit Output bOverLimit - * @param fLux Output fLux - */ -Result GetCurrentIlluminanceEx(bool *bOverLimit, float *fLux); - -/** - * @brief Sets the \ref AppletInputDetectionPolicy. - * @note Only available with [9.0.0+]. - * @param[in] policy \ref AppletInputDetectionPolicy - */ -Result SetInputDetectionPolicy(AppletInputDetectionPolicy policy); - -/** - * @brief Sets the WirelessPriorityMode. - * @note Only available with [4.0.0+]. - * @param[in] mode \ref AppletWirelessPriorityMode - */ -Result SetWirelessPriorityMode(AppletWirelessPriorityMode mode); - -/** - * @brief Gets the total time in nanoseconds that the current process was actively running (not suspended), relative to when \ref appletInitialize was last used. - * @note Only available with [6.0.0+]. - * @param[out] activeTime Output nanoseconds value. - */ -Result GetProgramTotalActiveTime(u64 *activeTime); - -/** - * @brief Sets whether ::AppletMessage_AlbumScreenShotTaken is enabled. - * @note Only available with [7.0.0+]. - * @param[in] flag Whether to enable the notification. - */ -Result SetAlbumImageTakenNotificationEnabled(bool flag); - -/** - * @brief Sets the Application AlbumUserData. - * @note Only available with [8.0.0+]. - * @param[in] buffer Buffer containing arbitrary UserData. - * @param[in] size Buffer size, must be <=0x400. - */ -Result SetApplicationAlbumUserData(const void* buffer, size_t size); - -/** - * @brief SaveCurrentScreenshot - * @note Only available with [11.0.0+]. - * @param[in] option \ref AlbumReportOption - */ -Result SaveCurrentScreenshot(AlbumReportOption option); - -/** - * @brief Gets the AppletResourceUserId of the CallerApplet. - * @note Only available with [6.0.0+]. - * @param[out] out AppletResourceUserId - */ -Result GetAppletResourceUserIdOfCallerApplet(u64 *out); - -/** - * @brief Sets the current applet WindowVisibility. - * @note Only available with [7.0.0+]. - * @param[in] flag Flag - */ -Result SetAppletWindowVisibility(bool flag); - -/** - * @brief Sets the AppletGpuTimeSlice. - * @note Only available with [7.0.0+]. - * @param[in] val Input value, must not be negative. - */ -Result SetAppletGpuTimeSlice(s64 val); - -/** - * @brief Sets the ExpectedMasterVolume for MainApplet and LibraryApplet. - * @note Used by some official apps before/after launching LibraryApplets. Prior to changing the volume, the official app uses \ref appletGetExpectedMasterVolume, with the output being used to restore the volume after LibraryApplet handling. - * @param[in] mainAppletVolume MainApplet ExpectedMasterVolume. - * @param[in] libraryAppletVolume LibraryApplet ExpectedMasterVolume. - */ -Result SetExpectedMasterVolume(float mainAppletVolume, float libraryAppletVolume); - -/** - * @brief Gets the ExpectedMasterVolume for MainApplet and LibraryApplet. - * @note See also \ref appletSetExpectedMasterVolume. - * @param[out] mainAppletVolume MainApplet ExpectedMasterVolume. Optional, can be NULL. Used with cmd GetMainAppletExpectedMasterVolume when not NULL. - * @param[out] libraryAppletVolume LibraryApplet ExpectedMasterVolume. Optional, can be NULL. Used with cmd GetLibraryAppletExpectedMasterVolume when not NULL. - */ -Result GetExpectedMasterVolume(float *mainAppletVolume, float *libraryAppletVolume); - -/** - * @brief Change the MainApplet MasterVolume. - * @param[in] volume MainApplet MasterVolume. - * @param[in] unk Unknown. - */ -Result ChangeMainAppletMasterVolume(float volume, u64 unk); - -/** - * @brief Sets the TransparentVolumeRate. - * @param[in] val Input value. - */ -Result SetTransparentVolumeRate(float val); - -/** - * @brief Update the LastForeground CaptureImage. - */ -Result UpdateLastForegroundCaptureImage(void); - -/** - * @brief Update the CallerApplet CaptureImage. - */ -Result UpdateCallerAppletCaptureImage(void); - -/** - * @brief Gets the LastForeground CaptureImage. - * @param[out] buffer Output buffer containing the 1280x720 RGBA8 image. - * @param[out] size Buffer size, must match 0x384000. - * @param[out] flag Output flag. - */ -Result GetLastForegroundCaptureImageEx(void* buffer, size_t size, bool *flag); - -/** - * @brief Gets the LastApplication CaptureImage. - * @param[out] buffer Output buffer containing the 1280x720 RGBA8 image. - * @param[out] size Buffer size, must match 0x384000. - * @param[out] flag Output flag. - */ -Result GetLastApplicationCaptureImageEx(void* buffer, size_t size, bool *flag); - -/** - * @brief Gets the CallerApplet CaptureImage. - * @param[out] buffer Output buffer containing the 1280x720 RGBA8 image. - * @param[out] size Buffer size, must match 0x384000. - * @param[out] flag Output flag. - */ -Result GetCallerAppletCaptureImageEx(void* buffer, size_t size, bool *flag); - -/** - * @brief Takes a screenshot of the current applet Layer into the specified CaptureSharedBuffer. - * @note Only available with [2.0.0+]. - * @param[in] flag Flag. - * @param[in] captureBuf \ref AppletCaptureSharedBuffer - */ -Result TakeScreenShotOfOwnLayer(bool flag, AppletCaptureSharedBuffer captureBuf); - -/** - * @brief Copies image data from a CaptureSharedBuffer to another CaptureSharedBuffer. - * @note Only available with [5.0.0+]. - * @param[in] dstCaptureBuf Destination \ref AppletCaptureSharedBuffer. - * @param[in] srcCaptureBuf Source \ref AppletCaptureSharedBuffer. - */ -Result CopyBetweenCaptureBuffers(AppletCaptureSharedBuffer dstCaptureBuf, AppletCaptureSharedBuffer srcCaptureBuf); - -/** - * @brief Clear the input CaptureSharedBuffer with the specified color. - * @note Only available with [3.0.0+]. - * @param[in] flag Flag. - * @param[in] captureBuf \ref AppletCaptureSharedBuffer - * @param[in] color RGBA8 color. - */ -Result ClearCaptureBuffer(bool flag, AppletCaptureSharedBuffer captureBuf, u32 color); - -/** - * @brief Clear the AppletTransitionBuffer with the specified color. - * @note Only available with [3.0.0+]. - * @param[in] color RGBA8 color. - */ -Result ClearAppletTransitionBuffer(u32 color); - -/** - * @brief Acquire the LastApplication CaptureSharedBuffer. - * @note Only available with [4.0.0+]. - * @param[out] flag Output flag. - * @param[out] id Output ID. - */ -Result AcquireLastApplicationCaptureSharedBuffer(bool *flag, s32 *id); - -/** - * @brief Release the LastApplication CaptureSharedBuffer. - * @note Only available with [4.0.0+]. - */ -Result ReleaseLastApplicationCaptureSharedBuffer(void); - -/** - * @brief Acquire the LastForeground CaptureSharedBuffer. - * @note Only available with [4.0.0+]. - * @param[out] flag Output flag. - * @param[out] id Output ID. - */ -Result AcquireLastForegroundCaptureSharedBuffer(bool *flag, s32 *id); - -/** - * @brief Release the LastForeground CaptureSharedBuffer. - * @note Only available with [4.0.0+]. - */ -Result ReleaseLastForegroundCaptureSharedBuffer(void); - -/** - * @brief Acquire the CallerApplet CaptureSharedBuffer. - * @note Only available with [4.0.0+]. - * @param[out] flag Output flag. - * @param[out] id Output ID. - */ -Result AcquireCallerAppletCaptureSharedBuffer(bool *flag, s32 *id); - -/** - * @brief Release the CallerApplet CaptureSharedBuffer. - * @note Only available with [4.0.0+]. - */ -Result ReleaseCallerAppletCaptureSharedBuffer(void); - -/** - * @brief Takes a screenshot of the current applet Layer into the specified CaptureSharedBuffer. Same as \ref appletTakeScreenShotOfOwnLayer except for the additional immediately param. - * @note Only available with [6.0.0+]. - * @param[in] flag0 Flag0. - * @param[in] immediately Whether the screenshot should be taken immediately. - * @param[in] captureBuf \ref AppletCaptureSharedBuffer - */ -Result TakeScreenShotOfOwnLayerEx(bool flag0, bool immediately, AppletCaptureSharedBuffer captureBuf); - -/** - * @brief Pushes a storage to the ContextStack. Normally this should only be used when AppletInfo::caller_flag is true. - * @note Only available with AppletType_LibraryApplet. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result PushContext(AppletStorage *s); - -/** - * @brief Pops a storage from the ContextStack. Normally this should only be used when AppletInfo::caller_flag is true. - * @note Only available with AppletType_LibraryApplet. - * @param[out] s Storage object. - */ -Result PopContext(AppletStorage *s); - -/** - * @brief Closes a LockAccessor. - * @param a LockAccessor object. - */ -void LockAccessorClose(AppletLockAccessor *a); - -/** - * @brief TryLock a LockAccessor. - * @param a LockAccessor object. - * @param[out] flag Whether locking was successful, when false this indicates that this func should be called again. - */ -Result LockAccessorTryLock(AppletLockAccessor *a, bool *flag); - -/** - * @brief Lock a LockAccessor. - * @note Similar to \ref appletLockAccessorTryLock, except this uses timeout UINT64_MAX with the eventWait call, and this uses TryLock repeatedly until the output flag value is true. - * @param a LockAccessor object. - */ -Result LockAccessorLock(AppletLockAccessor *a); - -/** - * @brief Unlock a LockAccessor. - * @param a LockAccessor object. - */ -Result LockAccessorUnlock(AppletLockAccessor *a); - -/** - * @brief Creates a LibraryApplet. - * @param h AppletHolder object. - * @param id See \ref AppletId. - * @param mode See \ref LibAppletMode. - */ -Result CreateLibraryApplet(AppletHolder *h, AppletId id, LibAppletMode mode); - -/** - * @brief Creates a LibraryApplet. This is for when a LibraryApplet creates itself. - * @note Identical to \ref appletCreateLibraryApplet except this sets the creating_self flag to true. - * @param h AppletHolder object. - * @param id See \ref AppletId. - * @param mode See \ref LibAppletMode. - */ -Result CreateLibraryAppletSelf(AppletHolder *h, AppletId id, LibAppletMode mode); - -/** - * @brief TerminateAllLibraryApplets which were created by the current applet. - * @note Normally LibraryApplet cleanup should be handled via \ref AppletHolder. - */ -Result TerminateAllLibraryApplets(void); - -/** - * @brief AreAnyLibraryAppletsLeft which were created by the current applet. - * @param[out] out Output flag. - */ -Result AreAnyLibraryAppletsLeft(bool *out); - -/// Closes an AppletHolder object. -void HolderClose(AppletHolder *h); - -/// Returns whether the AppletHolder object was initialized. -bool HolderActive(AppletHolder *h); - -/** - * @brief Gets the IndirectLayerConsumerHandle loaded during \ref appletCreateLibraryApplet, on [2.0.0+]. - * @note Only available when \ref LibAppletMode is ::LibAppletMode_BackgroundIndirect. - * @param h AppletHolder object. - * @param out Output IndirectLayerConsumerHandle. - */ -Result HolderGetIndirectLayerConsumerHandle(AppletHolder *h, u64 *out); - -/** - * @brief Starts the LibraryApplet. - * @param h AppletHolder object. - */ -Result HolderStart(AppletHolder *h); - -/** - * @brief Jumps to the LibraryApplet, with the current-LibraryApplet being terminated. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_LibraryApplet. - * @param h AppletHolder object. - */ -Result HolderJump(AppletHolder *h); - -/** - * @brief Requests the LibraryApplet to exit. The command is only used if \ref appletHolderCheckFinished returns false. - * @param h AppletHolder object. - */ -Result HolderRequestExit(AppletHolder *h); - -/** - * @brief Terminate the LibraryApplet. - * @param h AppletHolder object. - */ -Result HolderTerminate(AppletHolder *h); - -/** - * @brief Uses cmds GetAppletStateChangedEvent and RequestExit, then waits for the LibraryApplet to exit with the specified timeout. If a timeout occurs, the Terminate cmd is used. - * @param h AppletHolder object. - * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. - */ -Result HolderRequestExitOrTerminate(AppletHolder *h, u64 timeout); - -/** - * @brief Waits for the LibraryApplet to exit. - * @param h AppletHolder object. - */ -void HolderJoin(AppletHolder *h); - -/** - * @brief Gets the LibraryApplet StateChangedEvent. - * @param h AppletHolder object. - */ -Event * HolderGetExitEvent(AppletHolder *h); - -/** - * @brief Waits on the LibraryApplet StateChangedEvent with timeout=0, and returns whether it was successful. - * @param h AppletHolder object. - */ -bool HolderCheckFinished(AppletHolder *h); - -/** - * @brief Gets the \ref LibAppletExitReason set by \ref appletHolderJoin. - * @param h AppletHolder object. - */ -LibAppletExitReason HolderGetExitReason(AppletHolder *h); - -/** - * @brief Sets OutOfFocusApplicationSuspendingEnabled. - * @note Only available with AppletType_*Application. - * @param h AppletHolder object. - * @param[in] flag Flag - */ -Result HolderSetOutOfFocusApplicationSuspendingEnabled(AppletHolder *h, bool flag); - -/** - * @brief PresetLibraryAppletGpuTimeSliceZero - * @note Only available with [10.0.0+]. - * @param h AppletHolder object. - */ -Result HolderPresetLibraryAppletGpuTimeSliceZero(AppletHolder *h); - -/** - * @brief Gets the PopInteractiveOutDataEvent. - * @param h AppletHolder object. - * @param[out] out_event Output Event. - */ -Result HolderGetPopInteractiveOutDataEvent(AppletHolder *h, Event **out_event); - -/** - * @brief Waits for the PopInteractiveOutDataEvent and StateChangedEvent. - * @return false for error / when StateChangedEvent was signaled, and true when PopInteractiveOutDataEvent was signaled. The latter is signaled when a new storage is available with \ref appletHolderPopInteractiveOutData where previously no storage was available (this willl not clear the event), this event is automatically cleared by the system once the last storage is popped. - * @param h AppletHolder object. - */ -bool HolderWaitInteractiveOut(AppletHolder *h); - -/** - * @brief Pushes a storage for LibraryApplet input. - * @note This uses \ref appletStorageClose automatically. - * @param h AppletHolder object. - * @param[in] s Storage object. - */ -Result HolderPushInData(AppletHolder *h, AppletStorage *s); - -/** - * @brief Pops a storage from LibraryApplet output. - * @param h AppletHolder object. - * @param[out] s Storage object. - */ -Result HolderPopOutData(AppletHolder *h, AppletStorage *s); - -/** - * @brief Pushes a storage for LibraryApplet Extra storage input. - * @note This uses \ref appletStorageClose automatically. - * @param h AppletHolder object. - * @param[in] s Storage object. - */ -Result HolderPushExtraStorage(AppletHolder *h, AppletStorage *s); - -/** - * @brief Pushes a storage for LibraryApplet Interactive input. - * @note This uses \ref appletStorageClose automatically. - * @param h AppletHolder object. - * @param[in] s Storage object. - */ -Result HolderPushInteractiveInData(AppletHolder *h, AppletStorage *s); - -/** - * @brief Pops a storage from LibraryApplet Interactive output. - * @param h AppletHolder object. - * @param[out] s Storage object. - */ -Result HolderPopInteractiveOutData(AppletHolder *h, AppletStorage *s); - -/** - * @brief Gets the \ref LibAppletInfo for the specified LibraryApplet. - * @param h AppletHolder object. - * @param[out] info \ref LibAppletInfo - */ -Result HolderGetLibraryAppletInfo(AppletHolder *h, LibAppletInfo *info); - -/** - * @brief Creates a storage. - * @param s Storage object. - * @param size Size of storage. - */ -Result CreateStorage(AppletStorage *s, s64 size); - -/** - * @brief Creates a TransferMemory storage. - * @param s Storage object. - * @param buffer TransferMemory buffer, will be automatically allocated if NULL. - * @param size Size of storage. - * @param writable Controls whether writing to the storage is allowed with \ref appletStorageWrite. - */ -Result CreateTransferMemoryStorage(AppletStorage *s, void* buffer, s64 size, bool writable); - -/** - * @brief Creates a HandleStorage. - * @note Only available on [2.0.0+]. - * @param s Storage object. - * @param inval Arbitrary input value. - * @param handle Arbitrary input handle. - */ -Result CreateHandleStorage(AppletStorage *s, s64 inval, Handle handle); - -/** - * @brief Creates a HandleStorage using TransferMemory. Wrapper for \ref appletCreateHandleStorage. - * @param s Storage object. - * @param buffer TransferMemory buffer, will be automatically allocated if NULL. - * @param size Size of storage. - */ -Result CreateHandleStorageTmem(AppletStorage *s, void* buffer, s64 size); - -/// Closes the storage object. TransferMemory closing is seperate, see \ref appletStorageCloseTmem. -/// Other applet functions which push an input storage will automatically call this. -void StorageClose(AppletStorage *s); - -/// Closes the TransferMemory in the storage object. For TransferMemory storage created by the current process, this must be called after the LibraryApplet finishes using it (if sent to one). -void StorageCloseTmem(AppletStorage *s); - -/// Gets the size of the storage. This is not usable with HandleStorage, use \ref appletStorageGetHandle or \ref appletStorageMap instead for that. -Result StorageGetSize(AppletStorage *s, s64 *size); - -/** - * @brief Writes to a storage. offset(+size) must be within the actual storage size. - * @note This is not usable with HandleStorage. - * @param s Storage object. - * @param offset Offset in storage. - * @param buffer Input data. - * @param size Data size. - */ -Result StorageWrite(AppletStorage *s, s64 offset, const void* buffer, size_t size); - -/** - * @brief Reads from a storage. offset(+size) must be within the actual storage size. - * @note This is not usable with HandleStorage. - * @param s Storage object. - * @param offset Offset in storage. - * @param buffer Input data. - * @param size Data size. - */ -Result StorageRead(AppletStorage *s, s64 offset, void* buffer, size_t size); - -/** - * @brief Gets data for a HandleStorage originally from \ref appletCreateHandleStorage input. - * @note Only available on [2.0.0+]. - * @param s Storage object. - * @param out Output value. - * @param handle Output handle. - */ -Result StorageGetHandle(AppletStorage *s, s64 *out, Handle *handle); - -/** - * @brief Maps TransferMemory for a HandleStorage. Wrapper for \ref appletCreateHandleStorage. - * @note The TransferMemory can be unmapped with \ref appletStorageCloseTmem. - * @note Do not use this if the AppletStorage already contains initialized TransferMemory state. - * @param s Storage object. - * @param addr Output mapped address (optional). - * @param size Output size (optional). - */ -Result StorageMap(AppletStorage *s, void** addr, size_t *size); - -/** - * @brief Pops a LaunchParameter AppletStorage, the storage will be removed from sysmodule state during this. - * @param[out] s Output storage. - * @param kind See \ref AppletLaunchParameterKind. - * @note Only available with AppletType_*Application. - * @note See also acc.h \ref accountGetPreselectedUser (wrapper for appletPopLaunchParameter etc). - */ -Result PopLaunchParameter(AppletStorage *s, AppletLaunchParameterKind kind); - -/** - * @brief Requests to launch the specified application. - * @note Only available with AppletType_*Application, or AppletType_LibraryApplet on [5.0.0+]. - * @param[in] application_id ApplicationId. Value 0 can be used to relaunch the current application. - * @param[in] s Optional AppletStorage object, can be NULL. This is automatically closed. When NULL on pre-4.0.0 (or with AppletType_LibraryApplet), this will internally create a tmp storage with size 0 for use with the cmd. This is the storage available to the launched application via \ref appletPopLaunchParameter with ::AppletLaunchParameterKind_UserChannel. - */ -Result RequestLaunchApplication(u64 application_id, AppletStorage* s); - -/** - * @brief Requests to launch the specified application, for kiosk systems. - * @note Only available with AppletType_*Application on [3.0.0+]. - * @note Identical to \ref appletRequestLaunchApplication, except this allows the user to specify the attribute fields instead of the defaults being used. - * @param[in] application_id ApplicationId - * @param[in] s Optional AppletStorage object, can be NULL. This is automatically closed. When NULL on pre-4.0.0, this will internally create a tmp storage with size 0 for use with the cmd. This is the storage available to the launched application via \ref appletPopLaunchParameter with ::AppletLaunchParameterKind_UserChannel. - * @param[in] attr Kiosk application attributes. - */ -Result RequestLaunchApplicationForQuest(u64 application_id, AppletStorage* s, const AppletApplicationAttributeForQuest *attr); - -/** - * @brief Gets the DesiredLanguage for the current host application control.nacp. - * @note Only available with AppletType_*Application. - * @param[out] LanguageCode Output LanguageCode, see set.h. - */ -Result GetDesiredLanguage(u64 *LanguageCode); - -/** - * @brief Gets the DisplayVersion for the current host application control.nacp. - * @note Only available with AppletType_*Application. - * @param[out] displayVersion Output DisplayVersion string, must be at least 0x10-bytes. This is always NUL-terminated. - */ -Result GetDisplayVersion(char *displayVersion); - -/** - * @brief Blocks the usage of the home button, for short (Home Menu) and long (Overlay) presses. - * @note Only available with AppletType_*Application. - * @param val Unknown. Official sw only uses hard-coded value 0 for this. - */ -Result BeginBlockingHomeButtonShortAndLongPressed(s64 val); - -/** - * @brief Ends the blocking started by \ref appletBeginBlockingHomeButtonShortAndLongPressed. - * @note Only available with AppletType_*Application. - */ -Result EndBlockingHomeButtonShortAndLongPressed(void); - -/** - * @brief Blocks the usage of the home button, for short presses (Home Menu). - * @note Only available with AppletType_*Application. - * @param val Unknown nanoseconds. Value 0 can be used. - */ -Result BeginBlockingHomeButton(s64 val); - -/** - * @brief Ends the blocking started by \ref appletBeginBlockingHomeButton. - * @note Only available with AppletType_*Application. - */ -Result EndBlockingHomeButton(void); - -/** - * @brief Notify that the app is now running, for the Application logo screen. This throws a fatal-error on failure. - * @note This will just return when applet-type isn't AppletType_Application, or when this was already used previously. Used automatically by \ref appletInitialize when __nx_applet_auto_notifyrunning is set to true (the default value). - */ -void NotifyRunning(bool *out); - -/** - * @brief Gets the PseudoDeviceId. This is derived from the output of a ns command, and from data in the host application control.nacp. - * @note Only available with AppletType_*Application on [2.0.0+]. - * @param[out] out Output PseudoDeviceId. - */ -Result GetPseudoDeviceId(Uuid *out); - -/// Set media playback state. -/// If state is set to true, screen dimming and auto sleep is disabled. -/// For *Application, this uses cmd SetMediaPlaybackStateForApplication, otherwise cmd SetMediaPlaybackState is used. -Result SetMediaPlaybackState(bool state); - -/// Gets whether video recording is supported. -/// See also \ref appletInitializeGamePlayRecording. -Result IsGamePlayRecordingSupported(bool *flag); - -/// Disable/enable video recording. Only available after \ref appletInitializeGamePlayRecording was used. -/// See also \ref appletInitializeGamePlayRecording. -Result SetGamePlayRecordingState(bool state); - -/// Initializes video recording. This allocates a 0x6000000-byte buffer for the TransferMemory, cleanup is handled automatically during app exit in \ref appletExit. -/// Only available with AppletType_Application on [3.0.0+], hence errors from this can be ignored. -/// Video recording is only fully available system-side with [4.0.0+]. -/// Only usable when running under an application which supports video recording. Using this is only needed when the host application control.nacp has VideoCaptureMode set to Enabled, with Automatic appletInitializeGamePlayRecording is not needed. -Result InitializeGamePlayRecording(void); - -/** - * @brief Requests to save the video recording, as if the Capture-button was held. - * @note Only available with AppletType_*Application on [4.0.0+]. - */ -Result RequestFlushGamePlayingMovieForDebug(void); - -/** - * @brief Requests a system shutdown. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_*Application on [3.0.0+]. - */ -Result RequestToShutdown(void); - -/** - * @brief Requests a system reboot. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_*Application on [3.0.0+]. - */ -Result RequestToReboot(void); - -/** - * @brief RequestToSleep - * @note Only available with AppletType_*Application on [10.0.0+]. - */ -Result RequestToSleep(void); - -/** - * @brief Exit the application and return to the kiosk demo menu. This terminates the current process. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_*Application on [4.0.0+], on kiosk systems (QuestFlag set). - */ -Result ExitAndRequestToShowThanksMessage(void); - -/** - * @brief Initializes the ApplicationCopyrightFrameBuffer, with dimensions 1280x720 + the tmem for it. This is used as an overlay for screenshots. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @note Cleanup for this is handled automatically during app exit in \ref appletExit. - */ -Result InitializeApplicationCopyrightFrameBuffer(void); - -/** - * @brief Sets the RGBA8 image for use with \ref appletInitializeApplicationCopyrightFrameBuffer. Overrides the current image, if this was already used previously. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @note The specified coordinates and width/height must be within the bounds of the framebuffer setup by \ref appletInitializeApplicationCopyrightFrameBuffer. - * @param[in] buffer Input image buffer. - * @param[in] size Input image buffer size. - * @param[in] x X coordinate. Must not be negative. - * @param[in] y Y coordinate. Must not be negative. - * @param[in] width Image width. Must be >=1. - * @param[in] height Image height. Must be >=1. - * @param[in] mode \ref AppletWindowOriginMode - */ -Result SetApplicationCopyrightImage(const void* buffer, size_t size, s32 x, s32 y, s32 width, s32 height, AppletWindowOriginMode mode); - -/** - * @brief Sets the visibility for the image set by \ref appletSetApplicationCopyrightImage, in screenshots. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @param[in] visible Whether the image is visible. The default is true. - */ -Result SetApplicationCopyrightVisibility(bool visible); - -/** - * @brief Gets ApplicationPlayStatistics. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @note The input ApplicationIds must be allowed via control.nacp with the current host application. The minimum allowed ApplicationId is the ApplicationId for the current application. - * @param stats Output \ref PdmApplicationPlayStatistics array. - * @param application_ids Input ApplicationIds array. - * @param count Total entries in the input/output arrays. - * @param total_out Total output entries. - */ -Result QueryApplicationPlayStatistics(PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out); - -/** - * @brief Same as \ref appletQueryApplicationPlayStatistics except this gets playstats specific to the input userId. - * @note Only available with AppletType_*Application on [6.0.0+]. - * @param[in] uid \ref AccountUid - * @param[out] stats Output \ref PdmApplicationPlayStatistics array. - * @param[in] application_ids Input ApplicationIds array. - * @param[in] count Total entries in the input/output arrays. - * @param[out] total_out Total output entries. - */ -Result QueryApplicationPlayStatisticsByUid(AccountUid uid, PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out); - -/** - * @brief Launches Application {current_ApplicationId}+programIndex. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @note Creates the storage if needed. Uses cmd ClearUserChannel. Uses cmd UnpopToUserChannel when the storage was created. Lastly cmd ExecuteProgramCmd is used. - * @param[in] programIndex ProgramIndex, must be 0x0-0xFF. 0 is the same as the current application. ProgramIndex values where the application is not installed should not be used. - * @param[in] buffer Optional buffer containing the storage data which will be used for ::AppletLaunchParameterKind_UserChannel with the launched Application, can be NULL. - * @param[in] size Size of the above buffer, 0 to not use the storage. Must be <=0x1000. - */ -Result ExecuteProgram(s32 programIndex, const void* buffer, size_t size); - -/** - * @brief Launches the specified ApplicationId. - * @note Only available with AppletType_*Application on [5.0.0+], with DebugMode enabled. - * @note Creates the storage if needed. Uses cmd ClearUserChannel. Uses cmd UnpopToUserChannel when the storage was created. Lastly cmd ExecuteProgramCmd is used. - * @param[in] application_id ApplicationId. - * @param[in] buffer Optional buffer containing the storage data which will be used for ::AppletLaunchParameterKind_UserChannel with the launched Application, can be NULL. - * @param[in] size Size of the above buffer, 0 to not use the storage. Must be <=0x1000. - */ -Result JumpToSubApplicationProgramForDevelopment(u64 application_id, const void* buffer, size_t size); - -/** - * @brief Relaunches the current Application. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @note Creates the storage if needed. Uses cmd ClearUserChannel. Uses cmd UnpopToUserChannel when the storage was created. Lastly cmd ExecuteProgramCmd is used. - * @param[in] buffer Optional buffer containing the storage data which will be used for ::AppletLaunchParameterKind_UserChannel with the launched Application, can be NULL. - * @param[in] size Size of the above buffer, 0 to not use the storage. Must be <=0x1000. - */ -Result RestartProgram(const void* buffer, size_t size); - -/** - * @brief Gets the ProgramIndex of the program which launched this program. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @param[out] programIndex ProgramIndex, -1 when there was no previous program. - */ -Result GetPreviousProgramIndex(s32 *programIndex); - -/** - * @brief SetDelayTimeToAbortOnGpuError - * @note Only available with AppletType_*Application on [11.0.0+]. - * @param[in] val Input nanoseconds value. - */ -Result SetDelayTimeToAbortOnGpuError(u64 val); - -/** - * @brief Gets an Event which is signaled when a new storage is available with \ref appletTryPopFromFriendInvitationStorageChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. - * @note This is used by \ref friendsGetFriendInvitationNotificationEvent. - * @note Only available with AppletType_*Application on [9.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetFriendInvitationStorageChannelEvent(Event *out_event); - -/** - * @brief Pops a storage from the FriendInvitation StorageChannel. - * @note This is used by \ref friendsTryPopFriendInvitationNotificationInfo. - * @note Only available with AppletType_*Application on [9.0.0+]. - * @param[out] s Storage object. - */ -Result TryPopFromFriendInvitationStorageChannel(AppletStorage *s); - -/** - * @brief Gets an Event which is signaled when a new storage is available with \ref appletTryPopFromNotificationStorageChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. - * @note This is used by \ref notifGetNotificationSystemEvent. - * @note Only available with AppletType_*Application on [9.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetNotificationStorageChannelEvent(Event *out_event); - -/** - * @brief Pops a storage from the Notification StorageChannel. - * @note This is used by \ref notifTryPopNotifiedApplicationParameter. - * @note Only available with AppletType_*Application on [9.0.0+]. - * @param[out] s Storage object. - */ -Result TryPopFromNotificationStorageChannel(AppletStorage *s); - -/** - * @brief GetHealthWarningDisappearedSystemEvent - * @note Only available with AppletType_*Application on [9.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetHealthWarningDisappearedSystemEvent(Event *out_event); - -/** - * @brief SetHdcpAuthenticationActivated - * @note Only available with AppletType_*Application on [9.0.0+]. - * @param[in] flag Whether HdcpAuthentication is activated. - */ -Result SetHdcpAuthenticationActivated(bool flag); - -/** - * @brief GetLastApplicationExitReason - * @note Only available with AppletType_*Application on [11.0.0+]. - * @param[out] out Output value. - */ -Result GetLastApplicationExitReason(s32 *out); - -/** - * @brief CreateMovieMaker. Do not use this directly, use \ref grcCreateMovieMaker instead. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @param[out] srv_out Output Service for applet IMovieMaker. - * @param[in] tmem TransferMemory - */ -Result CreateMovieMaker(Service* srv_out, TransferMemory *tmem); - -/** - * @brief Launches the jit-sysmodule when it was not previously launched by this cmd. Returns 0 when it was previously launched. - * @note Only available with AppletType_*Application on [5.0.0+]. - * @note Requires the jit-sysmodule to actually be installed. - */ -Result PrepareForJit(void); - -/** - * @brief RequestToGetForeground - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. - */ -Result RequestToGetForeground(void); - -/** - * @brief LockForeground - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. - */ -Result LockForeground(void); - -/** - * @brief UnlockForeground - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. - */ -Result UnlockForeground(void); - -/** - * @brief Pops a storage from the general channel. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. - * @param[out] s Storage object. - */ -Result PopFromGeneralChannel(AppletStorage *s); - -/** - * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopFromGeneralChannel where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetPopFromGeneralChannelEvent(Event *out_event); - -/** - * @brief Gets a \ref AppletLockAccessor for HomeButtonWriter. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet. - * @note Similar to using \ref appletGetWriterLockAccessorEx with inval=0. - * @param a LockAccessor object. - */ -Result GetHomeButtonWriterLockAccessor(AppletLockAccessor *a); - -/** - * @brief IsSleepEnabled - * @note Only available with AppletType_SystemApplet on [11.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. - * @param[out] out Output flag. - */ -Result IsSleepEnabled(bool *out); - -/** - * @brief PopRequestLaunchApplicationForDebug - * @note Only available with AppletType_SystemApplet on [6.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. - * @param[out] uids Output array of \ref AccountUid. - * @param[in] count Size of the uids array in entries, must be at least the size stored in state. - * @param[out] application_id Output ApplicationId. - * @param[out] total_out Total output userID entries. - */ -Result PopRequestLaunchApplicationForDebug(AccountUid *uids, s32 count, u64 *application_id, s32 *total_out); - -/** - * @brief IsForceTerminateApplicationDisabledForDebug - * @note Only available with AppletType_SystemApplet on [9.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. - * @param[out] out Output flag. 0 when DebugMode is not enabled, otherwise this is loaded from a system-setting. - */ -Result IsForceTerminateApplicationDisabledForDebug(bool *out); - -/** - * @brief Launches DevMenu and the dev Overlay-applet. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_SystemApplet on [8.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. - * @note This verifies that DebugMode is enabled, then uses a ns cmd. That cmd then loads the system-settings for these two ProgramIds (which normally only exist on devunits), and verifies that these programs are installed + launches them. - */ -Result LaunchDevMenu(void); - -/** - * @brief SetLastApplicationExitReason - * @note Only available with AppletType_SystemApplet on [11.0.0+], or on [15.0.0+] with AppletType_LibraryApplet. - * @param[in] reason Reason - */ -Result SetLastApplicationExitReason(s32 reason); - -/** - * @brief Start the sequence for entering sleep-mode. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - * @param[in] flag Flag, official sw uses hard-coded value = true. - */ -Result StartSleepSequence(bool flag); - -/** - * @brief Start the system-shutdown sequence. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - */ -Result StartShutdownSequence(void); - -/** - * @brief Start the system-reboot sequence. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - */ -Result StartRebootSequence(void); - -/** - * @brief IsAutoPowerDownRequested. Uses an idle:sys cmd internally. - * @note Only available with AppletType_SystemApplet on [7.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - * @param[out] out Output flag. - */ -Result IsAutoPowerDownRequested(bool *out); - -/** - * @brief LoadAndApplyIdlePolicySettings. Uses an idle:sys cmd internally. - * @note Only available with AppletType_SystemApplet, or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - */ -Result LoadAndApplyIdlePolicySettings(void); - -/** - * @brief NotifyCecSettingsChanged. Uses an omm cmd internally. - * @note Only available with AppletType_SystemApplet on [2.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - */ -Result NotifyCecSettingsChanged(void); - -/** - * @brief Sets the DefaultHomeButtonLongPressTime. - * @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - * @param[in] val Input value. - */ -Result SetDefaultHomeButtonLongPressTime(s64 val); - -/** - * @brief UpdateDefaultDisplayResolution. Uses an omm cmd internally. - * @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - */ -Result UpdateDefaultDisplayResolution(void); - -/** - * @brief ShouldSleepOnBoot. Uses an omm cmd internally. - * @note Only available with AppletType_SystemApplet on [3.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - * @param[out] out Output flag. - */ -Result ShouldSleepOnBoot(bool *out); - -/** - * @brief Gets an Event which is signaled for HdcpAuthenticationFailed. - * @note Only available with AppletType_SystemApplet on [4.0.0+], or on [15.0.0+] with AppletType_LibraryApplet/AppletType_OverlayApplet. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetHdcpAuthenticationFailedEvent(Event *out_event); - -/** - * @brief Creates an Application. - * @note Only available with AppletType_SystemApplet. - * @param[out] a \ref AppletApplication - * @param[in] application_id ApplicationId. - */ -Result CreateApplication(AppletApplication *a, u64 application_id); - -/** - * @brief Pops a \ref AppletApplication for a requested Application launch. - * @note Only available with AppletType_SystemApplet. - * @param[out] a \ref AppletApplication - */ -Result PopLaunchRequestedApplication(AppletApplication *a); - -/** - * @brief Creates a SystemApplication. - * @note Only available with AppletType_SystemApplet. - * @param[out] a \ref AppletApplication - * @param[in] system_application_id SystemApplicationId. - */ -Result CreateSystemApplication(AppletApplication *a, u64 system_application_id); - -/** - * @brief PopFloatingApplicationForDevelopment. - * @note Only available with AppletType_SystemApplet. Should not be used if no FloatingApplication is available. - * @param[out] a \ref AppletApplication - */ -Result PopFloatingApplicationForDevelopment(AppletApplication *a); - -/** - * @brief Close an \ref AppletApplication. - * @param a \ref AppletApplication - */ -void ApplicationClose(AppletApplication *a); - -/** - * @brief Returns whether the AppletApplication object was initialized. - * @param a \ref AppletApplication - */ -bool ApplicationActive(AppletApplication *a); - -/** - * @brief Starts the Application. - * @param a \ref AppletApplication - */ -Result ApplicationStart(AppletApplication *a); - -/** - * @brief Requests the Application to exit. - * @param a \ref AppletApplication - */ -Result ApplicationRequestExit(AppletApplication *a); - -/** - * @brief Terminate the Application. - * @param a \ref AppletApplication - */ -Result ApplicationTerminate(AppletApplication *a); - -/** - * @brief Waits for the Application to exit. - * @param a \ref AppletApplication - */ -void ApplicationJoin(AppletApplication *a); - -/** - * @brief Waits on the Application StateChangedEvent with timeout=0, and returns whether it was successful. - * @param a \ref AppletApplication - */ -bool ApplicationCheckFinished(AppletApplication *a); - -/** - * @brief Gets the \ref AppletApplicationExitReason set by \ref appletApplicationJoin. - * @param a \ref AppletApplication - */ -AppletApplicationExitReason ApplicationGetExitReason(AppletApplication *a); - -/** - * @brief RequestForApplicationToGetForeground. - * @param a \ref AppletApplication - */ -Result ApplicationRequestForApplicationToGetForeground(AppletApplication *a); - -/** - * @brief TerminateAllLibraryApplets which were created by the Application. - */ -Result ApplicationTerminateAllLibraryApplets(AppletApplication *a); - -/** - * @brief AreAnyLibraryAppletsLeft which were created by the Application. - * @param a \ref AppletApplication - * @param[out] out Output flag. - */ -Result ApplicationAreAnyLibraryAppletsLeft(AppletApplication *a, bool *out); - -/** - * @brief Calls the same func as \ref appletHolderRequestExitOrTerminate with the output IAppletAccessor from the GetCurrentLibraryApplet cmd. - * @param a \ref AppletApplication - * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. - */ -Result ApplicationRequestExitLibraryAppletOrTerminate(AppletApplication *a, u64 timeout); - -/** - * @brief Gets the ApplicationId for the Application. - * @param a \ref AppletApplication - * @param[out] application_id Output ApplicationId. - */ -Result ApplicationGetApplicationId(AppletApplication *a, u64 *application_id); - -/** - * @brief Pushes a LaunchParameter AppletStorage to the Application. - * @note This uses \ref appletStorageClose automatically. - * @param a \ref AppletApplication - * @param[in] kind \ref AppletLaunchParameterKind - * @param[in] s Input storage. - */ -Result ApplicationPushLaunchParameter(AppletApplication *a, AppletLaunchParameterKind kind, AppletStorage* s); - -/** - * @brief Gets the \ref NacpStruct for the Application. - * @note Not usable when the \ref AppletApplication is for an AppletType_SystemApplication. - * @param a \ref AppletApplication - * @param[out] nacp \ref NacpStruct - */ -Result ApplicationGetApplicationControlProperty(AppletApplication *a, NacpStruct *nacp); - -/** - * @brief Gets the \ref AppletApplicationLaunchProperty for the Application. - * @note Only available on [2.0.0+]. Not usable when the \ref AppletApplication is for an AppletType_SystemApplication. - * @param a \ref AppletApplication - * @param[out] out \ref AppletApplicationLaunchProperty - */ -Result ApplicationGetApplicationLaunchProperty(AppletApplication *a, AppletApplicationLaunchProperty *out); - -/** - * @brief Gets the \ref AppletApplicationLaunchRequestInfo for the Application. - * @note Only available on [6.0.0+]. - * @param a \ref AppletApplication - * @param[out] out \ref AppletApplicationLaunchRequestInfo - */ -Result ApplicationGetApplicationLaunchRequestInfo(AppletApplication *a, AppletApplicationLaunchRequestInfo *out); - -/** - * @brief SetUsers for the Application. - * @note Only available on [6.0.0+]. - * @param a \ref AppletApplication - * @param[in] uids Input array of \ref AccountUid. - * @param[in] count Size of the uids array in entries, must be <=ACC_USER_LIST_SIZE. - * @param[in] flag When this flag is true, this just clears the users_available state flag to 0 and returns. - */ -Result ApplicationSetUsers(AppletApplication *a, const AccountUid *uids, s32 count, bool flag); - -/** - * @brief CheckRightsEnvironmentAvailable. - * @note Only available on [6.0.0+]. - * @param a \ref AppletApplication - * @param[out] out Output flag. - */ -Result ApplicationCheckRightsEnvironmentAvailable(AppletApplication *a, bool *out); - -/** - * @brief GetNsRightsEnvironmentHandle. - * @note Only available on [6.0.0+]. - * @param a \ref AppletApplication - * @param[out] handle Output NsRightsEnvironmentHandle. - */ -Result ApplicationGetNsRightsEnvironmentHandle(AppletApplication *a, u64 *handle); - -/** - * @brief Gets an array of userIds for the Application DesirableUids. - * @note Only available on [6.0.0+]. - * @note qlaunch only uses 1 userId with this. - * @param a \ref AppletApplication - * @param[out] uids Output array of \ref AccountUid. - * @param[in] count Size of the uids array in entries, must be at least the size stored in state. - * @param[out] total_out Total output entries. - */ -Result ApplicationGetDesirableUids(AppletApplication *a, AccountUid *uids, s32 count, s32 *total_out); - -/** - * @brief ReportApplicationExitTimeout. - * @note Only available on [6.0.0+]. - * @param a \ref AppletApplication - */ -Result ApplicationReportApplicationExitTimeout(AppletApplication *a); - -/** - * @brief Sets the \ref AppletApplicationAttribute for the Application. - * @note Only available on [8.0.0+]. - * @param a \ref AppletApplication - * @param[in] attr \ref AppletApplicationAttribute - */ -Result ApplicationSetApplicationAttribute(AppletApplication *a, const AppletApplicationAttribute *attr); - -/** - * @brief Gets whether the savedata specified by the input ApplicationId is accessible. - * @note Only available on [8.0.0+]. - * @param a \ref AppletApplication - * @param[in] application_id ApplicationId for the savedata. - * @param[out] out Output flag. - */ -Result ApplicationHasSaveDataAccessPermission(AppletApplication *a, u64 application_id, bool *out); - -/** - * @brief Creates a storage using the specified input then pushes it to the FriendInvitation StorageChannel. - * @note The system will clear the StorageChannel before pushing the storage. - * @note Only available on [9.0.0+]. - * @param a \ref AppletApplication - * @param[in] uid \ref AccountUid - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - */ -Result ApplicationPushToFriendInvitationStorageChannel(AppletApplication *a, AccountUid uid, const void* buffer, u64 size); - -/** - * @brief Creates a storage using the specified input then pushes it to the Notification StorageChannel. - * @note The system will clear the StorageChannel before pushing the storage. - * @note Only available on [9.0.0+]. - * @param a \ref AppletApplication - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - */ -Result ApplicationPushToNotificationStorageChannel(AppletApplication *a, const void* buffer, u64 size); - -/** - * @brief RequestApplicationSoftReset - * @note Only available on [10.0.0+]. - * @param a \ref AppletApplication - */ -Result ApplicationRequestApplicationSoftReset(AppletApplication *a); - -/** - * @brief RestartApplicationTimer - * @note Only available on [10.0.0+]. - * @param a \ref AppletApplication - */ -Result ApplicationRestartApplicationTimer(AppletApplication *a); - -/** - * @brief Pops a storage from current-LibraryApplet input. - * @note Only available with AppletType_LibraryApplet. - * @param[out] s Storage object. - */ -Result PopInData(AppletStorage *s); - -/** - * @brief Pushes a storage for current-LibraryApplet output. - * @note Only available with AppletType_LibraryApplet. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result PushOutData(AppletStorage *s); - -/** - * @brief Pops a storage from current-LibraryApplet Interactive input. - * @note Only available with AppletType_LibraryApplet. - * @param[out] s Storage object. - */ -Result PopInteractiveInData(AppletStorage *s); - -/** - * @brief Pushes a storage for current-LibraryApplet Interactive output. - * @note Only available with AppletType_LibraryApplet. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result PushInteractiveOutData(AppletStorage *s); - -/** - * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopInData where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. - * @note Only available with AppletType_LibraryApplet. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetPopInDataEvent(Event *out_event); - -/** - * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopInteractiveInData where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. - * @note Only available with AppletType_LibraryApplet. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetPopInteractiveInDataEvent(Event *out_event); - -/** - * @brief Gets the \ref LibAppletInfo for the current LibraryApplet. - * @note Only available with AppletType_LibraryApplet. - * @param[out] info \ref LibAppletInfo - */ -Result GetLibraryAppletInfo(LibAppletInfo *info); - -/** - * @brief Gets the \ref AppletIdentityInfo for the MainApplet. - * @note Only available with AppletType_LibraryApplet. - * @param[out] info \ref AppletIdentityInfo - */ -Result GetMainAppletIdentityInfo(AppletIdentityInfo *info); - -/** - * @brief CanUseApplicationCore - * @note Only available with AppletType_LibraryApplet. - * @param[out] out Output flag. - */ -Result CanUseApplicationCore(bool *out); - -/** - * @brief Gets the \ref AppletIdentityInfo for the CallerApplet. - * @note Only available with AppletType_LibraryApplet. - * @param[out] info \ref AppletIdentityInfo - */ -Result GetCallerAppletIdentityInfo(AppletIdentityInfo *info); - -/** - * @brief Gets the \ref NacpStruct for the MainApplet. - * @note Only available with AppletType_LibraryApplet on [2.0.0+]. - * @param[out] nacp \ref NacpStruct - */ -Result GetMainAppletApplicationControlProperty(NacpStruct *nacp); - -/** - * @brief Gets the NcmStorageId for the MainApplet. - * @note Only available with AppletType_LibraryApplet on [2.0.0+]. - * @param[out] storageId \ref NcmStorageId - */ -Result GetMainAppletStorageId(NcmStorageId *storageId); - -/** - * @brief Gets an array of \ref AppletIdentityInfo for the CallerStack. - * @note Only available with AppletType_LibraryApplet on [3.0.0+]. - * @param[out] stack Output array of \ref AppletIdentityInfo. - * @param[in] count Size of the stack array. - * @param[out] total_out Total output entries. - */ -Result GetCallerAppletIdentityInfoStack(AppletIdentityInfo *stack, s32 count, s32 *total_out); - -/** - * @brief Gets the \ref AppletIdentityInfo for the NextReturnDestinationApplet. - * @note Only available with AppletType_LibraryApplet on [4.0.0+]. - * @param[out] info \ref AppletIdentityInfo - */ -Result GetNextReturnDestinationAppletIdentityInfo(AppletIdentityInfo *info); - -/** - * @brief Gets the DesirableKeyboardLayout previously set by \ref appletSetDesirableKeyboardLayout. An error is returned when it's not set. - * @note Only available with AppletType_LibraryApplet on [4.0.0+]. - * @param[out] layout Output \ref SetKeyboardLayout. - */ -Result GetDesirableKeyboardLayout(SetKeyboardLayout *layout); - -/** - * @brief Pops a storage from current-LibraryApplet Extra input. - * @note Only available with AppletType_LibraryApplet. - * @param[out] s Storage object. - */ -Result PopExtraStorage(AppletStorage *s); - -/** - * @brief Gets an Event which is signaled when a new storage is available with \ref appletPopExtraStorage where previously no storage was available, this event is automatically cleared by the system once the last storage is popped. - * @note Only available with AppletType_LibraryApplet. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetPopExtraStorageEvent(Event *out_event); - -/** - * @brief Unpop a storage for current-LibraryApplet input. - * @note Only available with AppletType_LibraryApplet. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result UnpopInData(AppletStorage *s); - -/** - * @brief Unpop a storage for current-LibraryApplet Extra input. - * @note Only available with AppletType_LibraryApplet. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result UnpopExtraStorage(AppletStorage *s); - -/** - * @brief Gets the IndirectLayerProducerHandle. - * @note Only available with AppletType_LibraryApplet on [2.0.0+]. - * @param[out] out Output IndirectLayerProducerHandle. - */ -Result GetIndirectLayerProducerHandle(u64 *out); - -/** - * @brief Gets the DesiredLanguage for the MainApplet. - * @note Only available with AppletType_LibraryApplet on [4.0.0+]. - * @param[out] LanguageCode Output LanguageCode, see set.h. - */ -Result GetMainAppletApplicationDesiredLanguage(u64 *LanguageCode); - -/** - * @brief Gets the ApplicationId for the currently running Application. - * @note Only available with AppletType_LibraryApplet on [8.0.0+]. - * @param[out] application_id Output ApplicationId, 0 when no Application is running. - */ -Result GetCurrentApplicationId(u64 *application_id); - -/** - * @brief Exits the current applet. Same as \ref appletHolderRequestExit except this is for the current applet. - * @note Only available with AppletType_LibraryApplet on [6.0.0+]. - */ -Result RequestExitToSelf(void); - -/** - * @brief CreateGameMovieTrimmer. Do not use this directly, use \ref grcTrimGameMovie instead. - * @note Only available with AppletType_LibraryApplet on [4.0.0+]. - * @note See also \ref appletReserveResourceForMovieOperation and \ref appletUnreserveResourceForMovieOperation. - * @param[out] srv_out Output Service for grc IGameMovieTrimmer. - * @param[in] tmem TransferMemory - */ -Result CreateGameMovieTrimmer(Service* srv_out, TransferMemory *tmem); - -/** - * @brief ReserveResourceForMovieOperation. Must be used at some point prior to \ref appletCreateGameMovieTrimmer. - * @note Only available with AppletType_LibraryApplet on [5.0.0+]. - */ -Result ReserveResourceForMovieOperation(void); - -/** - * @brief UnreserveResourceForMovieOperation. Must be used at some point after all finished with GameMovieTrimmer usage (\ref appletCreateGameMovieTrimmer). - * @note Only available with AppletType_LibraryApplet on [5.0.0+]. - */ -Result UnreserveResourceForMovieOperation(void); - -/** - * @brief Gets an array of userIds for the MainApplet AvailableUsers. - * @note Only available with AppletType_LibraryApplet on [6.0.0+]. - * @param[out] uids Output array of \ref AccountUid. - * @param[in] count Size of the uids array in entries, must be at least ACC_USER_LIST_SIZE. - * @param[out] flag When true, this indicates that no users are available. - * @param[out] total_out Total output entries. This is -1 when flag is true. - */ -Result GetMainAppletAvailableUsers(AccountUid *uids, s32 count, bool *flag, s32 *total_out); - -/** - * @brief SetApplicationMemoryReservation - * @note Only available with AppletType_LibraryApplet on [10.0.0+]. - * @note An Application must be currently running. - * @param[in] val Input value. - */ -Result SetApplicationMemoryReservation(u64 val); - -/** - * @brief ShouldSetGpuTimeSliceManually - * @note Only available with AppletType_LibraryApplet on [10.0.0+]. - * @param[out] out Output flag. - */ -Result ShouldSetGpuTimeSliceManually(bool *out); - -/** - * @brief Stops forwarding the input to the foreground app. - * @note Only available with AppletType_OverlayApplet. - * @note You have to call this to receive inputs through the hid service when running as the overlay applet. - */ -Result BeginToWatchShortHomeButtonMessage(void); - -/** - * @brief Forwards input to the foreground app. - * @note Only available with AppletType_OverlayApplet. - * @note After calling this the overlay applet won't receive any input until \ref appletBeginToWatchShortHomeButtonMessage is called again. - */ -Result EndToWatchShortHomeButtonMessage(void); - -/** - * @brief Gets the ApplicationId for displaying the logo screen during application launch. - * @note Only available with AppletType_OverlayApplet. - * @param[out] application_id Output ApplicationId, 0 when no application is running. - */ -Result GetApplicationIdForLogo(u64 *application_id); - -/** - * @brief Sets the GpuTimeSliceBoost. - * @note Only available with AppletType_OverlayApplet. - * @param[in] val Input value. - */ -Result SetGpuTimeSliceBoost(u64 val); - -/** - * @brief Sets AutoSleepTimeAndDimmingTimeEnabled. - * @note Only available with AppletType_OverlayApplet on [2.0.0+]. - * @param[in] flag Flag - */ -Result SetAutoSleepTimeAndDimmingTimeEnabled(bool flag); - -/** - * @brief TerminateApplicationAndSetReason - * @note Only available with AppletType_OverlayApplet on [2.0.0+]. - * @param[in] reason Result reason. - */ -Result TerminateApplicationAndSetReason(Result reason); - -/** - * @brief Sets ScreenShotPermissionGlobally. - * @note Only available with AppletType_OverlayApplet on [3.0.0+]. - * @param[in] flag Flag - */ -Result SetScreenShotPermissionGlobally(bool flag); - -/** - * @brief Start the system-shutdown sequence. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_OverlayApplet on [6.0.0+]. - */ -Result StartShutdownSequenceForOverlay(void); - -/** - * @brief Start the system-reboot sequence. This will enter an infinite-sleep-loop on success. - * @note Only available with AppletType_OverlayApplet on [6.0.0+]. - */ -Result StartRebootSequenceForOverlay(void); - -/** - * @brief SetHealthWarningShowingState - * @note Only available with AppletType_OverlayApplet on [9.0.0+]. - * @param[in] flag Flag - */ -Result SetHealthWarningShowingState(bool flag); - -/** - * @brief IsHealthWarningRequired - * @note Only available with AppletType_OverlayApplet on [10.0.0+]. - * @param[out] out Output flag. - */ -Result IsHealthWarningRequired(bool *out); - -/** - * @brief Enables HID input for the OverlayApplet, without disabling input for the foreground applet. Generally \ref appletBeginToWatchShortHomeButtonMessage / appletEndToWatchShortHomeButtonMessage should be used instead. - * @note Only available with AppletType_OverlayApplet on [5.0.0+]. - */ -Result BeginToObserveHidInputForDevelop(void); - -/** - * @brief Reads the ThemeStorage for the current applet. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+]. - * @note offset(+size) must be <=0x400. - * @param[out] buffer Output buffer data. - * @param[in] size Size to read. - * @param[in] offset Offset within the ThemeStorage. - * @param[out] transfer_size Actual read size. - */ -Result ReadThemeStorage(void* buffer, size_t size, u64 offset, u64 *transfer_size); - -/** - * @brief Writes the ThemeStorage for the current applet. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [7.0.0+]. - * @note offset(+size) must be <=0x400. - * @param[in] buffer Input buffer data. - * @param[in] size Size to write. - * @param[in] offset Offset within the ThemeStorage. - */ -Result WriteThemeStorage(const void* buffer, size_t size, u64 offset); - -/** - * @brief This is similar to \ref appletPushToAppletBoundChannelForDebug (no DebugMode check), except the used channel is loaded from elsewhere and must be in the range 31-32. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [9.0.0+]. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - */ -Result PushToAppletBoundChannel(AppletStorage *s); - -/** - * @brief This is similar to \ref appletTryPopFromAppletBoundChannelForDebug (no DebugMode check), except the used channel is loaded from elsewhere and must be in the range 31-32. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [9.0.0+]. - * @param[out] s Storage object. - */ -Result TryPopFromAppletBoundChannel(AppletStorage *s); - -/** - * @brief Gets the DisplayLogicalResolution. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. - * @param[out] width Output width. - * @param[out] height Output height. - */ -Result GetDisplayLogicalResolution(s32 *width, s32 *height); - -/** - * @brief Sets the DisplayMagnification. This is essentially layer image crop, for everything non-Overlay. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. - * @note x and width are multiplied with the same width value returned by \ref appletGetDisplayLogicalResolution, so these should be in the range 0.0f-1.0f. Likewise for y and height, except these are multipled with the height value. - * @param[in] x X position. - * @param[in] y Y position. - * @param[in] width Width. - * @param[in] height Height. - */ -Result SetDisplayMagnification(float x, float y, float width, float height); - -/** - * @brief Sets whether HomeButtonDoubleClick is enabled. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. - * @param[in] flag Flag - */ -Result SetHomeButtonDoubleClickEnabled(bool flag); - -/** - * @brief Gets whether HomeButtonDoubleClick is enabled. - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [8.0.0+]. - * @param[out] out Output flag. - */ -Result GetHomeButtonDoubleClickEnabled(bool *out); - -/** - * @brief IsHomeButtonShortPressedBlocked - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [10.0.0+]. - * @param[out] out Output flag. - */ -Result IsHomeButtonShortPressedBlocked(bool *out); - -/** - * @brief IsVrModeCurtainRequired - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [11.0.0+]. - * @param[out] out Output flag. - */ -Result IsVrModeCurtainRequired(bool *out); - -/** - * @brief SetCpuBoostRequestPriority - * @note Only available with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [11.0.0+]. - * @param[in] priority Priority - */ -Result SetCpuBoostRequestPriority(s32 priority); - -/** - * @brief Open an \ref AppletApplication for the currently running Application. - * @note Should not be used when no Application is running. - * @note Only available on [1.0.0-9.2.0]. - * @param[out] a \ref AppletApplication - */ -Result OpenMainApplication(AppletApplication *a); - -/** - * @brief Perform SystemButtonPressing with the specified \ref AppletSystemButtonType. - * @param[in] type \ref AppletSystemButtonType - */ -Result PerformSystemButtonPressing(AppletSystemButtonType type); - -/** - * @brief InvalidateTransitionLayer. - */ -Result InvalidateTransitionLayer(void); - -/** - * @brief Requests to launch the specified Application, with the specified users. - * @note Only available on [6.0.0+]. - * @param[in] application_id ApplicationId. - * @param[in] uids Input array of \ref AccountUid. - * @param[in] total_uids Total input uids, must be <=ACC_USER_LIST_SIZE. - * @param[in] flag Whether to use the specified buffer to create a storage which will be pushed for ::AppletLaunchParameterKind_UserChannel. - * @param[in] buffer Buffer containing the above storage data. - * @param[in] size Size of the storage buffer. - */ -Result RequestLaunchApplicationWithUserAndArgumentForDebug(u64 application_id, const AccountUid *uids, s32 total_uids, bool flag, const void* buffer, size_t size); - -/** - * @brief Gets the \ref AppletResourceUsageInfo. - * @note Only available on [6.0.0+]. - * @param[out] info \ref AppletResourceUsageInfo - */ -Result GetAppletResourceUsageInfo(AppletResourceUsageInfo *info); - -/** - * @brief The channel must match the value already stored in state when the state value is non-zero, otherwise an error is returned. When the state value is 0, the channel is written into state. Then the input storage is pushed to the StorageChannel. - * @note Only available on [9.0.0+]. DebugMode must be enabled. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - * @param[in] channel Channel. - */ -Result PushToAppletBoundChannelForDebug(AppletStorage *s, s32 channel); - -/** - * @brief The channel must not be 0 and must match the value previously saved by \ref appletPushToAppletBoundChannelForDebug, otherwise errors are returned. Then the output storage is popped from the StorageChannel. - * @note Only available on [9.0.0+]. DebugMode must be enabled. - * @param[out] s Storage object. - * @param[in] channel Channel. - */ -Result TryPopFromAppletBoundChannelForDebug(AppletStorage *s, s32 channel); - -/** - * @brief Clears a StorageChannel, pushes the input storage there, and writes the ApplicationId into state. - * @note Only available on [9.0.0+]. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - * @param[in] application_id ApplicationId - */ -Result AlarmSettingNotificationEnableAppEventReserve(AppletStorage *s, u64 application_id); - -/** - * @brief Clears the StorageChannel/saved-ApplicationId used by \ref appletAlarmSettingNotificationEnableAppEventReserve. - * @note Only available on [9.0.0+]. - */ -Result AlarmSettingNotificationDisableAppEventReserve(void); - -/** - * @brief Same as \ref appletApplicationPushToNotificationStorageChannel except this uses the MainApplication. - * @note Only available on [9.0.0+]. - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - */ -Result AlarmSettingNotificationPushAppEventNotify(const void* buffer, u64 size); - -/** - * @brief Clears a StorageChannel, pushes the input storage there, and writes the ApplicationId into state. - * @note Only available on [9.0.0+]. - * @note This uses \ref appletStorageClose automatically. - * @param[in] s Storage object. - * @param[in] application_id ApplicationId - */ -Result FriendInvitationSetApplicationParameter(AppletStorage *s, u64 application_id); - -/** - * @brief Clears the StorageChannel/saved-ApplicationId used by \ref appletFriendInvitationSetApplicationParameter. - * @note Only available on [9.0.0+]. - */ -Result FriendInvitationClearApplicationParameter(void); - -/** - * @brief Same as \ref appletApplicationPushToFriendInvitationStorageChannel except this uses the MainApplication. - * @note Only available on [9.0.0+]. - * @param[in] uid \ref AccountUid - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - */ -Result FriendInvitationPushApplicationParameter(AccountUid uid, const void* buffer, u64 size); - -/** - * @brief Creates a GeneralStorage with the specified Id and size. - * @note Only available on [18.0.0+]. - * @param[in] id Id value, high-byte must be 0. - * @param[in] size Storage size. - */ -Result CreateGeneralStorageForDebug(u64 id, u64 size); - -/** - * @brief Reads data from the buffer previously allocated by \ref appletCreateGeneralStorageForDebug. - * @note Only available on [18.0.0+]. - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size. - * @param[in] id Id value which was previously used with \ref appletCreateGeneralStorageForDebug, high-byte must be 0. - * @param[in] offset Offset in the storage. - * @param[out] out_size Output size. - */ -Result ReadGeneralStorageForDebug(void* buffer, size_t size, u64 id, u64 offset, u64 *out_size); - -/** - * @brief Writes data to the buffer previously allocated by \ref appletCreateGeneralStorageForDebug. - * @note Only available on [18.0.0+]. - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - * @param[in] id Id value which was previously used with \ref appletCreateGeneralStorageForDebug, high-byte must be 0. - * @param[in] offset Offset in the storage. - */ -Result WriteGeneralStorageForDebug(const void* buffer, size_t size, u64 id, u64 offset); - -/** - * @brief SetTerminateResult - * @note Only available with AppletType_*Application. Or with AppletType_SystemApplet, AppletType_LibraryApplet, or AppletType_OverlayApplet, on [9.0.0+]. - * @param[in] res Result - */ -Result SetTerminateResult(Result res); - -/** - * @brief Gets the LaunchStorageInfo. - * @note Only available with AppletType_*Application on [2.0.0+], or with AppletType_LibraryApplet on [9.0.0+]. - * @param[out] app_storageId Same as AppletApplicationLaunchProperty::app_storageId. - * @param[out] update_storageId Same as AppletApplicationLaunchProperty::update_storageId. - */ -Result GetLaunchStorageInfoForDebug(NcmStorageId *app_storageId, NcmStorageId *update_storageId); - -/** - * @brief Gets an Event which is signaled for GpuErrorDetected. - * @note Only available with AppletType_*Application on [8.0.0+], or with AppletType_LibraryApplet on [9.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @note Official sw waits on this Event from a seperate thread, triggering an abort when it's signaled. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetGpuErrorDetectedSystemEvent(Event *out_event); - -/** - * @brief Sets HandlingHomeButtonShortPressedEnabled. - * @note Only available with AppletType_OverlayApplet on [8.0.0+]. Or with non-AppletType_OverlayApplet on [9.1.0+]. - * @param[in] flag Flag - */ -Result SetHandlingHomeButtonShortPressedEnabled(bool flag); - -/** - * @brief Gets the cached \ref AppletInfo loaded during \ref appletInitialize. This will return NULL when the info is not initialized, due to not running as AppletType_LibraryApplet, or when any of the used cmds fail. - * @note Only available with AppletType_LibraryApplet. - */ -AppletInfo * GetAppletInfo(void); - -/** - * @brief Gets the event associated with notification messages. - */ -Event * GetMessageEvent(void); - -/** - * @brief Gets a notification message, see \ref AppletMessage. - */ -Result GetMessage(u32 *msg); - -/** - * @brief Processes the current applet status using the specified msg. - * @param msg Notification message, normally from \ref appletGetMessage. - * @return Whether the application should continue running. - */ -bool ProcessMessage(u32 msg); - -/** - * @brief Processes the current applet status. Generally used within a main loop. - * @note Uses \ref appletGetMessage and \ref appletProcessMessage internally. - * @return Whether the application should continue running. - */ -bool MainLoop(void); - -/** - * @brief Sets up an applet status hook. - * @param cookie Hook cookie to use. - * @param callback Function to call when applet's status changes. - * @param param User-defined parameter to pass to the callback. - */ -void Hook(AppletHookCookie* cookie, AppletHookFn callback, void* param); - -/** - * @brief Removes an applet status hook. - * @param cookie Hook cookie to remove. - */ -void Unhook(AppletHookCookie* cookie); - -/// These return state which is updated by appletMainLoop() when notifications are received. -AppletOperationMode GetOperationMode(void); - -ApmPerformanceMode GetPerformanceMode(void); - -AppletFocusState GetFocusState(void); - -/** - * @brief Sets the current \ref AppletFocusHandlingMode. - * @note Should only be called with AppletType_Application. - */ -Result SetFocusHandlingMode(AppletFocusHandlingMode mode); - -} // namespace applet - -/// @brief C++ wrappers for the `arm` API. -/// @details Wraps: switch/arm/cache.h, switch/arm/counter.h, switch/arm/tls.h. -namespace arm { - -/** - * @brief Performs a data cache flush on the specified buffer. - * @param addr Address of the buffer. - * @param size Size of the buffer, in bytes. - * @remarks Cache flush is defined as Clean + Invalidate. - * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). - */ -void DCacheFlush(void* addr, size_t size); - -/** - * @brief Performs a data cache clean on the specified buffer. - * @param addr Address of the buffer. - * @param size Size of the buffer, in bytes. - * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). - */ -void DCacheClean(void* addr, size_t size); - -/** - * @brief Performs an instruction cache invalidation clean on the specified buffer. - * @param addr Address of the buffer. - * @param size Size of the buffer, in bytes. - * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). - */ -void ICacheInvalidate(void* addr, size_t size); - -/** - * @brief Performs a data cache zeroing operation on the specified buffer. - * @param addr Address of the buffer. - * @param size Size of the buffer, in bytes. - * @note The start and end addresses of the buffer are forcibly rounded to cache line boundaries (read from CTR_EL0 system register). - */ -void DCacheZero(void* addr, size_t size); - -/** - * @brief Gets the current system tick. - * @return The current system tick. - */ -u64 GetSystemTick(void); - -/** - * @brief Gets the system counter-timer frequency - * @return The system counter-timer frequency, in Hz. - */ -u64 GetSystemTickFreq(void); - -/** - * @brief Converts from nanoseconds to CPU ticks unit. - * @param ns Time in nanoseconds. - * @return Time in CPU ticks. - */ -u64 NsToTicks(u64 ns); - -/** - * @brief Converts from CPU ticks unit to nanoseconds. - * @param tick Time in ticks. - * @return Time in nanoseconds. - */ -u64 TicksToNs(u64 tick); - -/** - * @brief Gets the thread local storage buffer. - * @return The thread local storage buffer. - */ -void* GetTls(void); - -} // namespace arm - -/// @brief C++ wrappers for the `async` API. -/// @details Wraps: switch/services/async.h. -namespace async { - -/// AsyncResult -using ::AsyncResult; -/// AsyncValue -using ::AsyncValue; - -/** - * @brief Close a \ref AsyncValue. - * @note When the object is initialized, this uses \ref asyncValueCancel then \ref asyncValueWait with timeout=UINT64_MAX. - * @param a \ref AsyncValue - */ -void ValueClose(AsyncValue *a); - -/** - * @brief Waits for the async operation to finish using the specified timeout. - * @param a \ref AsyncValue - * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. - */ -Result ValueWait(AsyncValue *a, u64 timeout); - -/** - * @brief Gets the value size. - * @param a \ref AsyncValue - * @param[out] size Output size. - */ -Result ValueGetSize(AsyncValue *a, u64 *size); - -/** - * @brief Gets the value. - * @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX. - * @param a \ref AsyncValue - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size. - */ -Result ValueGet(AsyncValue *a, void* buffer, size_t size); - -/** - * @brief Cancels the async operation. - * @note Used automatically by \ref asyncValueClose. - * @param a \ref AsyncValue - */ -Result ValueCancel(AsyncValue *a); - -/** - * @brief Gets the \ref ErrorContext. - * @note Only available on [4.0.0+]. - * @param a \ref AsyncValue - * @param[out] context \ref ErrorContext - */ -Result ValueGetErrorContext(AsyncValue *a, ErrorContext *context); - -/** - * @brief Close a \ref AsyncResult. - * @note When the object is initialized, this uses \ref asyncResultCancel then \ref asyncResultWait with timeout=UINT64_MAX. - * @param a \ref AsyncResult - */ -void ResultClose(AsyncResult *a); - -/** - * @brief Waits for the async operation to finish using the specified timeout. - * @param a \ref AsyncResult - * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. - */ -Result ResultWait(AsyncResult *a, u64 timeout); - -/** - * @brief Gets the Result. - * @note Prior to using the cmd, this uses \ref asyncResultWait with timeout=UINT64_MAX. - * @param a \ref AsyncResult - */ -Result ResultGet(AsyncResult *a); - -/** - * @brief Cancels the async operation. - * @note Used automatically by \ref asyncResultClose. - * @param a \ref AsyncResult - */ -Result ResultCancel(AsyncResult *a); - -/** - * @brief Gets the \ref ErrorContext. - * @note Only available on [4.0.0+]. - * @param a \ref AsyncResult - * @param[out] context \ref ErrorContext - */ -Result ResultGetErrorContext(AsyncResult *a, ErrorContext *context); - -} // namespace async - -/// @brief C++ wrappers for the `auda` API. -/// @details Wraps: switch/services/aud.h. -namespace auda { - -/// Initialize aud:a. Only available on [11.0.0+]. -Result Initialize(void); - -/// Exit aud:a. -void Exit(void); - -/// Gets the Service for aud:a. -Service* GetServiceSession(void); - -Result RequestSuspendAudio(u64 pid, u64 delay); - -Result RequestResumeAudio(u64 pid, u64 delay); - -Result GetAudioOutputProcessMasterVolume(u64 pid, float* volume_out); - -Result SetAudioOutputProcessMasterVolume(u64 pid, u64 delay, float volume); - -Result GetAudioInputProcessMasterVolume(u64 pid, float* volume_out); - -Result SetAudioInputProcessMasterVolume(u64 pid, u64 delay, float volume); - -Result GetAudioOutputProcessRecordVolume(u64 pid, float* volume_out); - -Result SetAudioOutputProcessRecordVolume(u64 pid, u64 delay, float volume); - -} // namespace auda - -/// @brief C++ wrappers for the `audctl` API. -/// @details Wraps: switch/services/audctl.h. -namespace audctl { - -using ::AudioForceMutePolicy; -using ::AudioHeadphoneOutputLevelMode; -using ::AudioOutputMode; -using ::AudioTarget; - -Result Initialize(void); - -void Exit(void); - -Service* GetServiceSession(void); - -Result GetTargetVolume(s32* volume_out, AudioTarget target); - -Result SetTargetVolume(AudioTarget target, s32 volume); - -Result GetTargetVolumeMin(s32* volume_out); - -Result GetTargetVolumeMax(s32* volume_out); - -Result IsTargetMute(bool* mute_out, AudioTarget target); - -Result SetTargetMute(AudioTarget target, bool mute); - -Result IsTargetConnected(bool* connected_out, AudioTarget target); - -///< [1.0.0-17.0.1] -Result SetDefaultTarget(AudioTarget target, u64 fade_in_ns, u64 fade_out_ns); - -Result GetDefaultTarget(AudioTarget* target_out); - -Result GetAudioOutputMode(AudioOutputMode* mode_out, AudioTarget target); - -Result SetAudioOutputMode(AudioTarget target, AudioOutputMode mode); - -Result SetForceMutePolicy(AudioForceMutePolicy policy); - -///< [1.0.0-13.2.1] -Result GetForceMutePolicy(AudioForceMutePolicy* policy_out); - -///< [1.0.0-13.2.1] -Result GetOutputModeSetting(AudioOutputMode* mode_out, AudioTarget target); - -Result SetOutputModeSetting(AudioTarget target, AudioOutputMode mode); - -Result SetOutputTarget(AudioTarget target); - -Result SetInputTargetForceEnabled(bool enable); - -Result SetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode mode); - -///< [3.0.0+] -Result GetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode* mode_out); - -///< [3.0.0+] -Result AcquireAudioVolumeUpdateEventForPlayReport(Event* event_out); - -///< [3.0.0-13.2.1] -Result AcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_out); - -///< [3.0.0-13.2.1] -Result GetAudioOutputTargetForPlayReport(AudioTarget* target_out); - -///< [3.0.0+] -Result NotifyHeadphoneVolumeWarningDisplayedEvent(void); - -///< [3.0.0+] -Result SetSystemOutputMasterVolume(float volume); - -///< [4.0.0+] -Result GetSystemOutputMasterVolume(float* volume_out); - -///< [4.0.0+] -Result GetActiveOutputTarget(AudioTarget* target); - -} // namespace audctl - -/// @brief C++ wrappers for the `audd` API. -/// @details Wraps: switch/services/aud.h. -namespace audd { - -/// Initialize aud:d. Only available on [11.0.0+]. -Result Initialize(void); - -/// Exit aud:d. -void Exit(void); - -/// Gets the Service for aud:d. -Service* GetServiceSession(void); - -Result RequestSuspendAudioForDebug(u64 pid, u64 delay); - -Result RequestResumeAudioForDebug(u64 pid, u64 delay); - -} // namespace audd - -/// @brief C++ wrappers for the `auddev` API. -/// @details Wraps: switch/services/auddev.h. -namespace auddev { - -/// Initialize IAudioDevice. -Result Initialize(void); - -/// Exit IAudioDevice. -void Exit(void); - -/// Gets the Service object for IAudioDevice. -Service* GetServiceSession(void); - -Result ListAudioDeviceName(AudioDeviceName *DeviceNames, s32 max_names, s32 *total_names); - -Result SetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float volume); - -Result GetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float *volume); - -Result GetActiveAudioDeviceName(AudioDeviceName *DeviceName); - -} // namespace auddev - -/// @brief C++ wrappers for the `audin` API. -/// @details Wraps: switch/services/audin.h. -namespace audin { - -/// Audio input buffer format -using ::AudioInBuffer; -using ::AudioInState; - -/// Initialize audin. -Result Initialize(void); - -/// Exit audin. -void Exit(void); - -/// Gets the Service object for the actual audin service session. -Service* GetServiceSession(void); - -/// Gets the Service object for IAudioIn. -Service* GetServiceSession_AudioIn(void); - -Result ListAudioIns(char *DeviceNames, s32 count, u32 *DeviceNamesCount); - -Result OpenAudioIn(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioInState *State); - -Result GetAudioInState(AudioInState *State); - -Result StartAudioIn(void); - -Result StopAudioIn(void); - -/// Submits an \ref AudioInBuffer for capturing. -Result AppendAudioInBuffer(AudioInBuffer *Buffer); - -Result GetReleasedAudioInBuffer(AudioInBuffer **Buffer, u32 *ReleasedBuffersCount); - -Result ContainsAudioInBuffer(AudioInBuffer *Buffer, bool *ContainsBuffer); - -/** - * @brief Submits an audio sample data buffer for capturing and waits for it to finish capturing. - * @brief Uses \ref audinAppendAudioInBuffer and \ref audinWaitCaptureFinish internally. - * @param source AudioInBuffer containing the buffer to hold the captured sample data. - * @param released AudioInBuffer to receive the captured buffer after being released. - */ -Result CaptureBuffer(AudioInBuffer *source, AudioInBuffer **released); - -/** - * @brief Waits for audio capture to finish. - * @param released AudioInBuffer to receive the first captured buffer after being released. - * @param released_count Pointer to receive the number of captured buffers. - * @param timeout Timeout value, use UINT64_MAX to wait until all finished. - */ -Result WaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout); - -/// These return the state associated with the currently active audio input device. -u32 GetSampleRate(void); - -///< Supported sample rate (48000Hz). -u32 GetChannelCount(void); - -///< Supported channel count (2 channels). -PcmFormat GetPcmFormat(void); - -///< Supported PCM format (Int16). -AudioInState GetDeviceState(void); - -} // namespace audin - -/// @brief C++ wrappers for the `audout` API. -/// @details Wraps: switch/services/audout.h. -namespace audout { - -/// Audio output buffer format -using ::AudioOutBuffer; -using ::AudioOutState; - -/// Initialize audout. -Result Initialize(void); - -/// Exit audout. -void Exit(void); - -/// Gets the Service object for the actual audout service session. -Service* GetServiceSession(void); - -/// Gets the Service object for IAudioOut. -Service* GetServiceSession_AudioOut(void); - -Result ListAudioOuts(char *DeviceNames, s32 count, u32 *DeviceNamesCount); - -Result OpenAudioOut(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioOutState *State); - -Result GetAudioOutState(AudioOutState *State); - -Result StartAudioOut(void); - -Result StopAudioOut(void); - -/// Submits an \ref AudioOutBuffer for playing. -Result AppendAudioOutBuffer(AudioOutBuffer *Buffer); - -Result GetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount); - -Result ContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer); - -/// Only available with [4.0.0+]. -Result GetAudioOutBufferCount(u32 *count); - -/// Only available with [4.0.0+]. -Result GetAudioOutPlayedSampleCount(u64 *count); - -/// Only available with [4.0.0+]. -Result FlushAudioOutBuffers(bool *flushed); - -/// Only available with [6.0.0+]. -Result SetAudioOutVolume(float volume); - -/// Only available with [6.0.0+]. -Result GetAudioOutVolume(float *volume); - -/** - * @brief Submits an audio sample data buffer for playing and waits for it to finish playing. - * @brief Uses \ref audoutAppendAudioOutBuffer and \ref audoutWaitPlayFinish internally. - * @param source AudioOutBuffer containing the source sample data to be played. - * @param released AudioOutBuffer to receive the played buffer after being released. - */ -Result PlayBuffer(AudioOutBuffer *source, AudioOutBuffer **released); - -/** - * @brief Waits for audio playback to finish. - * @param released AudioOutBuffer to receive the first played buffer after being released. - * @param released_count Pointer to receive the number of played buffers. - * @param timeout Timeout value, use UINT64_MAX to wait until all finished. - */ -Result WaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout); - -/// These return the state associated with the currently active audio output device. -u32 GetSampleRate(void); - -///< Supported sample rate (48000Hz). -u32 GetChannelCount(void); - -///< Supported channel count (2 channels). -PcmFormat GetPcmFormat(void); - -///< Supported PCM format (Int16). -AudioOutState GetDeviceState(void); - -} // namespace audout - -/// @brief C++ wrappers for the `audouta` API. -/// @details Wraps: switch/services/audout.h. -namespace audouta { - -/// Audio output buffer format -using ::AudioOutBuffer; -using ::AudioOutState; - -/// Initialize audout:a. Removed in [11.0.0]. -Result Initialize(void); - -/// Exit audout:a. -void Exit(void); - -/// Gets the Service for audout:a. -Service* GetServiceSession(void); - -///< Initial device state (stopped). -Result RequestSuspend(u64 pid, u64 delay); - -Result RequestResume(u64 pid, u64 delay); - -Result GetProcessMasterVolume(u64 pid, float* volume_out); - -Result SetProcessMasterVolume(u64 pid, u64 delay, float volume); - -Result GetProcessRecordVolume(u64 pid, float* volume_out); - -Result SetProcessRecordVolume(u64 pid, u64 delay, float volume); - -} // namespace audouta - -/// @brief C++ wrappers for the `audoutd` API. -/// @details Wraps: switch/services/audout.h. -namespace audoutd { - -/// Audio output buffer format -using ::AudioOutBuffer; -using ::AudioOutState; - -/// Initialize audout:d. Removed in [11.0.0]. -Result Initialize(void); - -/// Exit audout:d. -void Exit(void); - -/// Gets the Service for audout:d. -Service* GetServiceSession(void); - -Result RequestSuspendForDebug(u64 pid, u64 delay); - -Result RequestResumeForDebug(u64 pid, u64 delay); - -} // namespace audoutd - -/// @brief C++ wrappers for the `audrec` API. -/// @details Wraps: switch/services/audrec.h. -namespace audrec { - -using ::AudrecRecorder; -using ::FinalOutputRecorderBuffer; -using ::FinalOutputRecorderParameter; -using ::FinalOutputRecorderParameterInternal; - -Result Initialize(void); - -void Exit(void); - -Service* GetServiceSession(void); - -Result OpenFinalOutputRecorder(AudrecRecorder* recorder_out, FinalOutputRecorderParameter* param_in, u64 aruid, FinalOutputRecorderParameterInternal* param_out); - -Result RecorderStart(AudrecRecorder* recorder); - -Result RecorderStop(AudrecRecorder* recorder); - -Result RecorderRegisterBufferEvent(AudrecRecorder* recorder, Event* out_event); - -Result RecorderAppendFinalOutputRecorderBuffer(AudrecRecorder* recorder, u64 buffer_client_ptr, FinalOutputRecorderBuffer* param); - -Result RecorderGetReleasedFinalOutputRecorderBuffers(AudrecRecorder* recorder, u64* out_buffers, u64* inout_count, u64* out_released); - -void RecorderClose(AudrecRecorder* recorder); - -} // namespace audrec - -/// @brief C++ wrappers for the `audren` API. -/// @details Wraps: switch/services/audren.h. -namespace audren { - -using ::AudioRendererAdpcmContext; -using ::AudioRendererAdpcmParameters; -using ::AudioRendererBehaviorInfoIn; -using ::AudioRendererBehaviorInfoOut; -using ::AudioRendererBiquadFilter; -using ::AudioRendererChannelInfoIn; -using ::AudioRendererCircularBufferSinkInfoIn; -using ::AudioRendererConfig; -using ::AudioRendererDeviceSinkInfoIn; -using ::AudioRendererDownMixParameters; -using ::AudioRendererMemPoolInfoIn; -using ::AudioRendererMemPoolInfoOut; -using ::AudioRendererMemPoolState; -using ::AudioRendererMixInfoIn; -using ::AudioRendererOutputRate; -using ::AudioRendererPerformanceBufferInfoIn; -using ::AudioRendererPerformanceBufferInfoOut; -using ::AudioRendererSinkInfoIn; -using ::AudioRendererSinkInfoOut; -using ::AudioRendererSinkType; -using ::AudioRendererUpdateDataHeader; -using ::AudioRendererVoiceInfoIn; -using ::AudioRendererVoiceInfoOut; -using ::AudioRendererVoicePlayState; -using ::AudioRendererWaveBuf; - -u32 GetRevision(void); - -int GetMemPoolCount(const AudioRendererConfig* config); - -size_t GetInputParamSize(const AudioRendererConfig* config); - -size_t GetOutputParamSize(const AudioRendererConfig* config); - -/// Initialize audren. -Result Initialize(const AudioRendererConfig* config); - -/// Exit audren. -void Exit(void); - -/// Gets the Service object for IAudioRenderer. -Service* GetServiceSession_AudioRenderer(void); - -/// Returns event that is signalled on new frame (autoclear=true). -Event* GetFrameEvent(void); - -void WaitFrame(void); - -Result GetState(u32* out_state); - -Result RequestUpdateAudioRenderer(const void* in_param_buf, size_t in_param_buf_size, void* out_param_buf, size_t out_param_buf_size, void* perf_buf, size_t perf_buf_size); - -Result StartAudioRenderer(void); - -Result StopAudioRenderer(void); - -Result SetAudioRendererRenderingTimeLimit(int percent); - -} // namespace audren - -/// @brief C++ wrappers for the `audrv` API. -/// @details Wraps: switch/audio/driver.h. -namespace audrv { - -using ::AudioDriver; -using ::AudioDriverEtc; -using ::AudioDriverWaveBuf; -using ::AudioDriverWaveBufState; - -Result Create(AudioDriver* d, const AudioRendererConfig* config, int num_final_mix_channels); - -Result Update(AudioDriver* d); - -void Close(AudioDriver* d); - -int MemPoolAdd(AudioDriver* d, void* buffer, size_t size); - -bool MemPoolRemove(AudioDriver* d, int id); - -bool MemPoolAttach(AudioDriver* d, int id); - -bool MemPoolDetach(AudioDriver* d, int id); - -bool VoiceInit(AudioDriver* d, int id, int num_channels, PcmFormat format, int sample_rate); - -void VoiceDrop(AudioDriver* d, int id); - -void VoiceStop(AudioDriver* d, int id); - -bool VoiceIsPaused(AudioDriver* d, int id); - -bool VoiceIsPlaying(AudioDriver* d, int id); - -bool VoiceAddWaveBuf(AudioDriver* d, int id, AudioDriverWaveBuf* wavebuf); - -u32 VoiceGetWaveBufSeq(AudioDriver* d, int id); - -u32 VoiceGetPlayedSampleCount(AudioDriver* d, int id); - -u32 VoiceGetVoiceDropsCount(AudioDriver* d, int id); - -void VoiceSetBiquadFilter(AudioDriver* d, int id, int biquad_id, float a0, float a1, float a2, float b0, float b1, float b2); - -void VoiceSetExtraParams(AudioDriver* d, int id, const void* params, size_t params_size); - -void VoiceSetDestinationMix(AudioDriver* d, int id, int mix_id); - -void VoiceSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id); - -void VoiceSetVolume(AudioDriver* d, int id, float volume); - -void VoiceSetPitch(AudioDriver* d, int id, float pitch); - -void VoiceSetPriority(AudioDriver* d, int id, int priority); - -void VoiceClearBiquadFilter(AudioDriver* d, int id, int biquad_id); - -void VoiceSetPaused(AudioDriver* d, int id, bool paused); - -void VoiceStart(AudioDriver* d, int id); - -int MixAdd(AudioDriver* d, int sample_rate, int num_channels); - -void MixRemove(AudioDriver* d, int id); - -void MixSetDestinationMix(AudioDriver* d, int id, int mix_id); - -void MixSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id); - -void MixSetVolume(AudioDriver* d, int id, float volume); - -int DeviceSinkAdd(AudioDriver* d, const char* device_name, int num_channels, const u8* channel_ids); - -void SinkRemove(AudioDriver* d, int id); - -} // namespace audrv - -/// @brief C++ wrappers for the `avm` API. -/// @details Wraps: switch/services/avm.h. -namespace avm { - -using ::AvmRequiredVersionEntry; -using ::AvmVersionListEntry; -using ::AvmVersionListImporter; - -Result Initialize(void); - -void Exit(void); - -Service * GetServiceSession(void); - -Result GetHighestAvailableVersion(u64 id_1, u64 id_2, u32 *version); - -Result GetHighestRequiredVersion(u64 id_1, u64 id_2, u32 *version); - -Result GetVersionListEntry(u64 application_id, AvmVersionListEntry *entry); - -Result GetVersionListImporter(AvmVersionListImporter *out); - -Result GetLaunchRequiredVersion(u64 application_id, u32 *version); - -Result UpgradeLaunchRequiredVersion(u64 application_id, u32 version); - -Result PushLaunchVersion(u64 application_id, u32 version); - -Result ListVersionList(AvmVersionListEntry *buffer, size_t count, u32 *out); - -Result ListRequiredVersion(AvmRequiredVersionEntry *buffer, size_t count, u32 *out); - -void VersionListImporterClose(AvmVersionListImporter *srv); - -Result VersionListImporterSetTimestamp(AvmVersionListImporter *srv, u64 timestamp); - -Result VersionListImporterSetData(AvmVersionListImporter *srv, const AvmVersionListEntry *entries, u32 count); - -Result VersionListImporterFlush(AvmVersionListImporter *srv); - -} // namespace avm - -/// @brief C++ wrappers for the `barrier` API. -/// @details Wraps: switch/kernel/barrier.h. -namespace barrier { - -/// Barrier structure. -using ::Barrier; - -/** - * @brief Initializes a barrier and the number of threads to wait on. - * @param b Barrier object. - * @param thread_count Initial value for the number of threads the barrier must wait for. - */ -void Init(Barrier *b, u64 thread_count); - -/** - * @brief Forces threads to wait until all threads have called barrierWait. - * @param b Barrier object. - */ -void Wait(Barrier *b); - -} // namespace barrier - -/// @brief C++ wrappers for the `binder` API. -/// @details Wraps: switch/display/binder.h. -namespace binder { - -using ::Binder; - -void Create(Binder* b, s32 id); - -void Close(Binder* b); - -Result InitSession(Binder* b, Service* relay); - -Result TransactParcel(Binder* b, u32 code, void* parcel_data, size_t parcel_data_size, void* parcel_reply, size_t parcel_reply_size, u32 flags); - -Result ConvertErrorCode(s32 code); - -Result AdjustRefcount(Binder* b, s32 addval, s32 type); - -Result GetNativeHandle(Binder* b, u32 unk0, Event *event_out); - -Result IncreaseWeakRef(Binder* b); - -Result DecreaseWeakRef(Binder* b); - -Result IncreaseStrongRef(Binder* b); - -Result DecreaseStrongRef(Binder* b); - -} // namespace binder - -/// @brief C++ wrappers for the `bpc` API. -/// @details Wraps: switch/services/bpc.h. -namespace bpc { - -using ::BpcSleepButtonState; - -/// Initialize bpc. -Result Initialize(void); - -/// Exit bpc. -void Exit(void); - -/// Gets the Service object for the actual bpc service session. -Service* GetServiceSession(void); - -Result ShutdownSystem(void); - -Result RebootSystem(void); - -Result GetSleepButtonState(BpcSleepButtonState *out); - -///< [2.0.0-13.2.1] -Result GetPowerButton(bool* out_is_pushed); - -} // namespace bpc - -/// @brief C++ wrappers for the `bq` API. -/// @details Wraps: switch/display/buffer_producer.h. -namespace bq { - -using ::BqBufferInput; -using ::BqBufferOutput; -using ::BqGraphicBuffer; -using ::BqRect; - -Result RequestBuffer(Binder *b, s32 bufferIdx, BqGraphicBuffer *buf); - -Result DequeueBuffer(Binder *b, bool async, u32 width, u32 height, s32 format, u32 usage, s32 *buf, NvMultiFence *fence); - -Result DetachBuffer(Binder *b, s32 slot); - -Result QueueBuffer(Binder *b, s32 buf, const BqBufferInput *input, BqBufferOutput *output); - -Result CancelBuffer(Binder *b, s32 buf, const NvMultiFence *fence); - -Result Query(Binder *b, s32 what, s32* value); - -Result Connect(Binder *b, s32 api, bool producerControlledByApp, BqBufferOutput *output); - -Result Disconnect(Binder *b, s32 api); - -Result SetPreallocatedBuffer(Binder *b, s32 buf, const BqGraphicBuffer *input); - -} // namespace bq - -/// @brief C++ wrappers for the `bt` API. -/// @details Wraps: switch/services/bt.h. -namespace bt { - -/// Initialize bt. Only available on [5.0.0+]. -Result Initialize(void); - -/// Exit bt. -void Exit(void); - -/// Gets the Service object for the actual bt service session. -Service* GetServiceSession(void); - -/** - * @brief LeClientReadCharacteristic - * @note This is essentially the same as \ref btdrvReadGattCharacteristic. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] auth_req \ref BtdrvGattAuthReqType - */ -Result LeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req); - -/** - * @brief LeClientReadDescriptor - * @note This is essentially the same as \ref btdrvReadGattDescriptor. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId - * @param[in] auth_req \ref BtdrvGattAuthReqType - */ -Result LeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req); - -/** - * @brief LeClientWriteCharacteristic - * @note This is essentially the same as \ref btdrvWriteGattCharacteristic. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, must be <=0x258. - * @param[in] auth_req \ref BtdrvGattAuthReqType - * @param[in] with_response Whether to use Write-With-Response write type or not - */ -Result LeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response); - -/** - * @brief LeClientWriteDescriptor - * @note This is essentially the same as \ref btdrvWriteGattDescriptor. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, must be <=0x258. - * @param[in] auth_req \ref BtdrvGattAuthReqType - */ -Result LeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req); - -/** - * @brief LeClientRegisterNotification - * @note This is essentially the same as \ref btdrvRegisterGattNotification. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - */ -Result LeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); - -/** - * @brief LeClientDeregisterNotification - * @note This is essentially the same as \ref btdrvUnregisterGattNotification. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - */ -Result LeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); - -/** - * @brief SetLeResponse - * @param[in] server_if Server interface ID - * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid - * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, must be <=0x258. - */ -Result SetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size); - -/** - * @brief LeSendIndication - * @param[in] server_if Server interface ID - * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid - * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, clamped to max size 0x258. - * @param[in] noconfirm Whether no confirmation is required (notification) or not (indication) - */ -Result LeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm); - -/** - * @brief GetLeEventInfo - * @note This is identical to \ref btdrvGetLeHidEventInfo except different state is used. - * @note The state used by this is reset after writing the data to output. - * @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo. - * @param[in] size Output buffer size. - * @param[out] type Output BtdrvBleEventType. - */ -Result GetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); - -/** - * @brief RegisterBleEvent - * @note This is identical to \ref btdrvRegisterBleHidEvent except different state is used. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result RegisterBleEvent(Event* out_event); - -} // namespace bt - -/// @brief C++ wrappers for the `btdev` API. -/// @details Wraps: switch/runtime/btdev.h. -namespace btdev { - -/// GattAttribute -using ::BtdevGattAttribute; -/// GattCharacteristic -using ::BtdevGattCharacteristic; -/// GattDescriptor -using ::BtdevGattDescriptor; -/// GattService -using ::BtdevGattService; - -/// Initialize bt/btmu. -Result Initialize(void); - -/// Exit bt/btmu. -void Exit(void); - -/// Compares two \ref BtdrvGattAttributeUuid, returning whether these match. -bool GattAttributeUuidIsSame(const BtdrvGattAttributeUuid *a, const BtdrvGattAttributeUuid *b); - -/// Wrapper for \ref btmuAcquireBleScanEvent. -Result AcquireBleScanEvent(Event* out_event); - -/// Wrapper for \ref btmuGetBleScanFilterParameter. -Result GetBleScanParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out); - -/// Wrapper for \ref btmuGetBleScanFilterParameter2. -Result GetBleScanParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out); - -/// Wrapper for \ref btdevStartBleScanGeneral. -Result StartBleScanGeneral(BtdrvBleAdvertisePacketParameter param); - -/// Wrapper for \ref btmuStopBleScanForGeneral. -Result StopBleScanGeneral(void); - -/** - * @brief Wrapper for \ref btmuGetBleScanResultsForGeneral and \ref btmuGetBleScanResultsForSmartDevice. - * @param[out] results Output array of \ref BtdrvBleScanResult. - * @param[in] count Size of the results array in entries. - * @param[out] total_out Total output entries. - */ -Result GetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out); - -/// Wrapper for \ref btmuStartBleScanForPaired. -Result EnableBleAutoConnection(BtdrvBleAdvertisePacketParameter param); - -/// Wrapper for \ref btmuStopBleScanForPaired. -Result DisableBleAutoConnection(void); - -/// Wrapper for \ref btmuStartBleScanForSmartDevice. -Result StartBleScanSmartDevice(const BtdrvGattAttributeUuid *uuid); - -/// Wrapper for \ref btmuStopBleScanForSmartDevice. -Result StopBleScanSmartDevice(void); - -/// Wrapper for \ref btmuAcquireBleConnectionEvent. -Result AcquireBleConnectionStateChangedEvent(Event* out_event); - -/// Wrapper for \ref btmuBleConnect. -Result ConnectToGattServer(BtdrvAddress addr); - -/// Wrapper for \ref btmuBleDisconnect. -Result DisconnectFromGattServer(u32 connection_handle); - -/// Wrapper for \ref btmuBleGetConnectionState. -Result GetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out); - -/// Wrapper for \ref btmuAcquireBleServiceDiscoveryEvent. -Result AcquireBleServiceDiscoveryEvent(Event* out_event); - -/** - * @brief Wrapper for \ref btmuGetGattServices. - * @param[in] connection_handle ConnectionHandle - * @param[out] services Output array of \ref BtdevGattService. - * @param[in] count Size of the services array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out); - -/** - * @brief Wrapper for \ref btmuGetGattService. - * @param[in] connection_handle ConnectionHandle - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] service \ref BtdevGattService - * @param[out] flag Whether a \ref BtdevGattService was returned. - */ -Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag); - -/// Wrapper for \ref btmuAcquireBlePairingEvent. -Result AcquireBlePairingEvent(Event* out_event); - -/// Wrapper for \ref btmuBlePairDevice. -Result PairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); - -/// Wrapper for \ref btmuBleUnPairDevice. -Result UnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); - -/// Wrapper for \ref btmuBleUnPairDevice2. -Result UnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param); - -/// Wrapper for \ref btmuBleGetPairedDevices. -Result GetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out); - -/// Wrapper for \ref btmuAcquireBleMtuConfigEvent. -Result AcquireBleMtuConfigEvent(Event* out_event); - -/** - * @brief Wrapper for \ref btmuConfigureBleMtu. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] mtu MTU, must be 0x18-0x200. - */ -Result ConfigureBleMtu(u32 connection_handle, u16 mtu); - -/// Wrapper for \ref btmuGetBleMtu. -Result GetBleMtu(u32 connection_handle, u16 *out); - -/// Wrapper for \ref btRegisterBleEvent. -Result AcquireBleGattOperationEvent(Event* out_event); - -/** - * @brief Wrapper for \ref btmuRegisterBleGattDataPath. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result RegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief Wrapper for \ref btmuUnregisterBleGattDataPath. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result UnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief Wrapper for \ref btGetLeEventInfo. - * @param[out] out \ref BtdrvBleClientGattOperationInfo - */ -Result GetGattOperationResult(BtdrvBleClientGattOperationInfo *out); - -/** - * @brief Wrapper for \ref btLeClientReadCharacteristic. - * @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this. - * @param c \ref BtdevGattCharacteristic - */ -Result ReadGattCharacteristic(BtdevGattCharacteristic *c); - -/** - * @brief Wrapper for \ref btLeClientWriteCharacteristic. - * @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this. - * @note This uses the Value from \ref btdevGattCharacteristicSetValue. - * @param c \ref BtdevGattCharacteristic - */ -Result WriteGattCharacteristic(BtdevGattCharacteristic *c); - -/** - * @brief Wrapper for \ref btLeClientRegisterNotification / \ref btLeClientDeregisterNotification. - * @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this. - * @param c \ref BtdevGattCharacteristic - * @param[in] flag Whether to enable/disable, controls which func to call. - */ -Result EnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag); - -/** - * @brief Wrapper for \ref btLeClientReadDescriptor. - * @param d \ref BtdevGattDescriptor - */ -Result ReadGattDescriptor(BtdevGattDescriptor *d); - -/** - * @brief Wrapper for \ref btLeClientWriteDescriptor. - * @note This uses the Value from \ref btdevGattDescriptorSetValue. - * @param d \ref BtdevGattDescriptor - */ -Result WriteGattDescriptor(BtdevGattDescriptor *d); - -/** - * @brief Creates a \ref BtdevGattAttribute object. This is intended for internal use. - * @param a \ref BtdevGattAttribute - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[in] handle Handle - * @param[in] connection_handle ConnectionHandle - */ -void GattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle); - -/** - * @brief Gets the Type. - * @param a \ref BtdevGattAttribute - */ -u8 GattAttributeGetType(BtdevGattAttribute *a); - -/** - * @brief Gets the Uuid. - * @param a \ref BtdevGattAttribute - * @param[out] out \ref BtdrvGattAttributeUuid - */ -void GattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out); - -/** - * @brief Gets the Handle. - * @param a \ref BtdevGattAttribute - */ -u16 GattAttributeGetHandle(BtdevGattAttribute *a); - -/** - * @brief Gets the ConnectionHandle. - * @param a \ref BtdevGattAttribute - */ -u32 GattAttributeGetConnectionHandle(BtdevGattAttribute *a); - -/** - * @brief Creates a \ref BtdevGattService object. This is intended for internal use. - * @param s \ref BtdevGattService - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[in] handle Handle - * @param[in] connection_handle ConnectionHandle - * @param[in] instance_id InstanceId - * @param[in] end_group_handle EndGroupHandle - * @param[in] primary_service PrimaryService - */ -void GattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service); - -/** - * @brief Gets the InstanceId. - * @param s \ref BtdevGattService - */ -u16 GattServiceGetInstanceId(BtdevGattService *s); - -/** - * @brief Gets the EndGroupHandle. - * @param s \ref BtdevGattService - */ -u16 GattServiceGetEndGroupHandle(BtdevGattService *s); - -/** - * @brief Gets whether this is the PrimaryService. - * @param s \ref BtdevGattService - */ -u16 GattServiceIsPrimaryService(BtdevGattService *s); - -/** - * @brief Wrapper for \ref btmuGetGattIncludedServices. - * @param s \ref BtdevGattService - * @param[out] services Output array of \ref BtdevGattService. - * @param[in] count Size of the services array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out); - -/** - * @brief Wrapper for \ref btmuGetGattCharacteristics. - * @param s \ref BtdevGattService - * @param[out] characteristics Output array of \ref BtdevGattCharacteristic. - * @param[in] count Size of the characteristics array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out); - -/** - * @brief Same as \ref btdevGattServiceGetCharacteristics except this only returns the \ref BtdevGattCharacteristic which contains a matching \ref BtdrvGattAttributeUuid. - * @param s \ref BtdevGattService - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] characteristic \ref BtdevGattCharacteristic - * @param[out] flag Whether a \ref BtdevGattService was returned. - */ -Result GattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag); - -/** - * @brief Creates a \ref BtdevGattCharacteristic object. This is intended for internal use. - * @param c \ref BtdevGattCharacteristic - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[in] handle Handle - * @param[in] connection_handle ConnectionHandle - * @param[in] instance_id InstanceId - * @param[in] properties Properties - */ -void GattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties); - -/** - * @brief Gets the InstanceId. - * @param c \ref BtdevGattCharacteristic - */ -u16 GattCharacteristicGetInstanceId(BtdevGattCharacteristic *c); - -/** - * @brief Gets the Properties. - * @param c \ref BtdevGattCharacteristic - */ -u8 GattCharacteristicGetProperties(BtdevGattCharacteristic *c); - -/** - * @brief Wrapper for \ref btmuGetBelongingGattService. - * @note Gets the \ref BtdevGattService which belongs to this object. - * @param c \ref BtdevGattCharacteristic. - * @param[out] service \ref BtdevGattService - */ -Result GattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service); - -/** - * @brief Wrapper for \ref btmuGetGattDescriptors. - * @note Gets the descriptors which belongs to this object. - * @param c \ref BtdevGattCharacteristic - * @param[out] descriptors Output array of \ref BtdevGattDescriptor. - * @param[in] count Size of the descriptors array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out); - -/** - * @brief Same as \ref btdevGattCharacteristicGetDescriptors except this only returns a \ref BtdevGattDescriptor which contains a matching \ref BtdrvGattAttributeUuid. - * @param c \ref BtdevGattCharacteristic - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] descriptor \ref BtdevGattDescriptor - * @param[out] flag Whether a \ref BtdevGattDescriptor was returned. - */ -Result GattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag); - -/** - * @brief Sets the Value in the object. - * @note See also \ref btdevWriteGattCharacteristic. - * @param c \ref BtdevGattCharacteristic - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, max is 0x200. - */ -void GattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size); - -/** - * @brief Gets the Value in the object, returns the copied value size. - * @param c \ref BtdevGattCharacteristic - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size, max is 0x200. - */ -u64 GattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size); - -/** - * @brief Creates a \ref BtdevGattDescriptor object. This is intended for internal use. - * @param d \ref BtdevGattDescriptor - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[in] handle Handle - * @param[in] connection_handle ConnectionHandle - */ -void GattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle); - -/** - * @brief Wrapper for \ref btmuGetBelongingGattService. - * @note Gets the \ref BtdevGattService which belongs to this object. - * @param d \ref BtdevGattDescriptor - * @param[out] service \ref BtdevGattService - */ -Result GattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service); - -/** - * @brief Wrapper for \ref btmuGetGattCharacteristics. - * @note Gets the \ref BtdevGattCharacteristic which belongs to this object. - * @param d \ref BtdevGattDescriptor - * @param[out] characteristic \ref BtdevGattCharacteristic - */ -Result GattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic); - -/** - * @brief Sets the Value in the object. - * @note See also \ref btdevWriteGattDescriptor. - * @param d \ref BtdevGattDescriptor - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, max is 0x200. - */ -void GattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size); - -/** - * @brief Gets the Value in the object, returns the copied value size. - * @param d \ref BtdevGattDescriptor - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size, max is 0x200. - */ -u64 GattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size); - -} // namespace btdev - -/// @brief C++ wrappers for the `btdrv` API. -/// @details Wraps: switch/services/btdrv.h. -namespace btdrv { - -/// Data for \ref btdrvGetAudioEventInfo. The data stored here depends on the \ref BtdrvAudioEventType. -using ::BtdrvAudioEventInfo; -/// Data for \ref btdrvGetBleManagedEventInfo and \ref btdrvGetLeHidEventInfo. The data stored here depends on the \ref BtdrvBleEventType. -using ::BtdrvBleEventInfo; -/// CircularBuffer -using ::BtdrvCircularBuffer; -/// Data for \ref btdrvGetEventInfo. The data stored here depends on the \ref BtdrvEventType. -using ::BtdrvEventInfo; -/// Data for \ref btdrvGetHidEventInfo. The data stored here depends on the \ref BtdrvHidEventType. -using ::BtdrvHidEventInfo; -/// Data for \ref btdrvGetHidReportEventInfo. The data stored here depends on the \ref BtdrvHidEventType. -using ::BtdrvHidReportEventInfo; -/// The raw sharedmem data for HidReportEventInfo. -using ::BtdrvHidReportEventInfoBufferData; - -/// Initialize btdrv. -Result Initialize(void); - -/// Exit btdrv. -void Exit(void); - -/// Gets the Service object for the actual btdrv service session. -Service* GetServiceSession(void); - -/** - * @brief InitializeBluetooth - * @note This is used by btm-sysmodule, this should not be used by other processes. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result InitializeBluetooth(Event* out_event); - -/** - * @brief EnableBluetooth - * @note This is used by btm-sysmodule. - */ -Result EnableBluetooth(void); - -/** - * @brief DisableBluetooth - * @note This is used by btm-sysmodule. - */ -Result DisableBluetooth(void); - -/** - * @brief FinalizeBluetooth - * @note This is not used by btm-sysmodule, this should not be used by other processes. - */ -Result FinalizeBluetooth(void); - -/** - * @brief GetAdapterProperties [1.0.0-11.0.1] - * @param[out] properties \ref BtdrvAdapterPropertyOld - */ -Result LegacyGetAdapterProperties(BtdrvAdapterPropertyOld *properties); - -/** - * @brief GetAdapterProperties [12.0.0+] - * @param[out] properties \ref BtdrvAdapterPropertySet - */ -Result GetAdapterProperties(BtdrvAdapterPropertySet *properties); - -/** - * @brief GetAdapterProperty [1.0.0-11.0.1] - * @param[in] type \ref BtdrvBluetoothPropertyType - * @param[out] buffer Output buffer, see \ref BtdrvBluetoothPropertyType for the contents. - * @param[in] size Output buffer size. - */ -Result LegacyGetAdapterProperty(BtdrvBluetoothPropertyType type, void* buffer, size_t size); - -/** - * @brief GetAdapterProperty [12.0.0+] - * @param[in] type \ref BtdrvAdapterPropertyType - * @param[in] property \ref BtdrvAdapterProperty - */ -Result GetAdapterProperty(BtdrvAdapterPropertyType type, BtdrvAdapterProperty *property); - -/** - * @brief SetAdapterProperty [1.0.0-11.0.1] - * @param[in] type \ref BtdrvBluetoothPropertyType - * @param[in] buffer Input buffer, see \ref BtdrvBluetoothPropertyType for the contents. - * @param[in] size Input buffer size. - */ -Result LegacySetAdapterProperty(BtdrvBluetoothPropertyType type, const void* buffer, size_t size); - -/** - * @brief SetAdapterProperty [12.0.0+] - * @param[in] type \ref BtdrvAdapterPropertyType - * @param[in] property \ref BtdrvAdapterProperty - */ -Result SetAdapterProperty(BtdrvAdapterPropertyType type, const BtdrvAdapterProperty *property); - -/** - * @brief StartInquiry [1.0.0-11.0.1]. This starts Inquiry, the output data will be available via \ref btdrvGetEventInfo. Inquiry will automatically stop in 10.24 seconds. - * @note This is used by btm-sysmodule. - */ -Result LegacyStartInquiry(void); - -/** - * @brief StartInquiry [12.0.0+]. This starts Inquiry, the output data will be available via \ref btdrvGetEventInfo. - * @param[in] services Bitfield of allowed services. When -1 the original defaults from pre-12.0.0 are used. - * @param[in] duration Inquiry duration in nanoseconds. - * @note This is used by btm-sysmodule. - */ -Result StartInquiry(u32 services, s64 duration); - -/** - * @brief This stops Inquiry which was started by \ref btdrvStartInquiry, if it's still active. - * @note This is used by btm-sysmodule. - */ -Result StopInquiry(void); - -/** - * @brief CreateBond - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[in] type TransportType - */ -Result CreateBond(BtdrvAddress addr, u32 type); - -/** - * @brief RemoveBond - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - */ -Result RemoveBond(BtdrvAddress addr); - -/** - * @brief CancelBond - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - */ -Result CancelBond(BtdrvAddress addr); - -/** - * @brief RespondToPinRequest [1.0.0-11.0.1] - * @note The official sysmodule only uses the input \ref BtdrvAddress. - * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag - * @param[in] pin_code \ref BtdrvBluetoothPinCode - * @param[in] length Length of pin_code - */ -Result LegacyRespondToPinRequest(BtdrvAddress addr, bool flag, const BtdrvBluetoothPinCode *pin_code, u8 length); - -/** - * @brief RespondToPinRequest [12.0.0+] - * @param[in] addr \ref BtdrvAddress - * @param[in] pin_code \ref BtdrvPinCode - */ -Result RespondToPinRequest(BtdrvAddress addr, const BtdrvPinCode *pin_code); - -/** - * @brief RespondToSspRequest - * @note The official sysmodule only uses the input \ref BtdrvAddress and the flag. - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[in] variant BluetoothSspVariant - * @param[in] accept Whether the request is accepted. - * @param[in] passkey Passkey. - */ -Result RespondToSspRequest(BtdrvAddress addr, u32 variant, bool accept, u32 passkey); - -/** - * @brief GetEventInfo - * @note This is used by btm-sysmodule. - * @param[out] buffer Output buffer, see \ref BtdrvEventInfo. - * @param[in] size Output buffer size. - * @param[out] type Output BtdrvEventType. - */ -Result GetEventInfo(void* buffer, size_t size, BtdrvEventType *type); - -/** - * @brief InitializeHid - * @note This is used by btm-sysmodule, this should not be used by other processes. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result InitializeHid(Event* out_event); - -/** - * @brief OpenHidConnection - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - */ -Result OpenHidConnection(BtdrvAddress addr); - -/** - * @brief CloseHidConnection - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - */ -Result CloseHidConnection(BtdrvAddress addr); - -/** - * @brief This sends a HID DATA transaction packet with report-type Output. - * @param[in] addr \ref BtdrvAddress - * @param[in] buffer Input \ref BtdrvHidReport, on pre-9.0.0 this is \ref BtdrvHidData. - */ -Result WriteHidData(BtdrvAddress addr, const BtdrvHidReport *buffer); - -/** - * @brief WriteHidData2 - * @param[in] addr \ref BtdrvAddress - * @param[in] buffer Input buffer, same as the buffer for \ref btdrvWriteHidData. - * @param[in] size Input buffer size. - */ -Result WriteHidData2(BtdrvAddress addr, const void* buffer, size_t size); - -/** - * @brief This sends a HID SET_REPORT transaction packet. - * @param[in] addr \ref BtdrvAddress - * @param[in] type \ref BtdrvBluetoothHhReportType - * @param[in] buffer Input \ref BtdrvHidReport, on pre-9.0.0 this is \ref BtdrvHidData. - */ -Result SetHidReport(BtdrvAddress addr, BtdrvBluetoothHhReportType type, const BtdrvHidReport *buffer); - -/** - * @brief This sends a HID GET_REPORT transaction packet. - * @param[in] addr \ref BtdrvAddress - * @param[in] report_id This is sent in the packet for the Report Id, when non-zero. - * @param[in] type \ref BtdrvBluetoothHhReportType - */ -Result GetHidReport(BtdrvAddress addr, u8 report_id, BtdrvBluetoothHhReportType type); - -/** - * @brief TriggerConnection - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[in] timeout [9.0.0+] Host trigger timeout - */ -Result TriggerConnection(BtdrvAddress addr, u16 timeout); - -/** - * @brief AddPairedDeviceInfo - * @note This is used by btm-sysmodule. - * @param[in] settings \ref SetSysBluetoothDevicesSettings - */ -Result AddPairedDeviceInfo(const SetSysBluetoothDevicesSettings *settings); - -/** - * @brief GetPairedDeviceInfo - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[out] settings \ref SetSysBluetoothDevicesSettings - */ -Result GetPairedDeviceInfo(BtdrvAddress addr, SetSysBluetoothDevicesSettings *settings); - -/** - * @brief FinalizeHid - * @note This is not used by btm-sysmodule, this should not be used by other processes. - */ -Result FinalizeHid(void); - -/** - * @brief GetHidEventInfo - * @note This is used by btm-sysmodule. - * @param[out] buffer Output buffer, see \ref BtdrvHidEventInfo. - * @param[in] size Output buffer size. - * @param[out] type \ref BtdrvHidEventType, always ::BtdrvHidEventType_Connection or ::BtdrvHidEventType_Ext. - */ -Result GetHidEventInfo(void* buffer, size_t size, BtdrvHidEventType *type); - -/** - * @brief SetTsi - * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[in] tsi Tsi: non-value-0xFF to Set, value 0xFF to Exit. See also \ref BtmTsiMode. - */ -Result SetTsi(BtdrvAddress addr, u8 tsi); - -/** - * @brief EnableBurstMode - * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag: true = Set, false = Exit. - */ -Result EnableBurstMode(BtdrvAddress addr, bool flag); - -/** - * @brief SetZeroRetransmission - * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). - * @note This is used by btm-sysmodule. - * @param[in] addr \ref BtdrvAddress - * @param[in] report_ids Input buffer containing an array of u8s. - * @param[in] count Total u8s in the input buffer. This can be 0, the max is 5. - */ -Result SetZeroRetransmission(BtdrvAddress addr, u8 *report_ids, u8 count); - -/** - * @brief EnableMcMode - * @note This is used by btm-sysmodule. - * @param[in] flag Flag - */ -Result EnableMcMode(bool flag); - -/** - * @brief EnableLlrScan - * @note This is used by btm-sysmodule. - */ -Result EnableLlrScan(void); - -/** - * @brief DisableLlrScan - * @note This is used by btm-sysmodule. - */ -Result DisableLlrScan(void); - -/** - * @brief EnableRadio - * @note This is used by btm-sysmodule. - * @param[in] flag Flag - */ -Result EnableRadio(bool flag); - -/** - * @brief SetVisibility - * @note This is used by btm-sysmodule. - * @param[in] inquiry_scan Controls Inquiry Scan, whether the device can be discovered during Inquiry. - * @param[in] page_scan Controls Page Scan, whether the device accepts connections. - */ -Result SetVisibility(bool inquiry_scan, bool page_scan); - -/** - * @brief EnableTbfcScan - * @note Only available on [4.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] flag Flag - */ -Result EnableTbfcScan(bool flag); - -/** - * @brief RegisterHidReportEvent - * @note This also does sharedmem init/handling if needed, on [7.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. This is signaled when data is available with \ref btdrvGetHidReportEventInfo. - */ -Result RegisterHidReportEvent(Event* out_event); - -/** - * @brief GetHidReportEventInfo - * @note \ref btdrvRegisterHidReportEvent must be used before this, on [7.0.0+]. - * @note This is used by hid-sysmodule. When used by other processes, hid/user-process will conflict. No events will be received by that user-process, or it will be corrupted, etc. - * @note [7.0.0+] When data isn't available, the type is set to ::BtdrvHidEventType_Data, with the buffer cleared to all-zero. - * @param[out] buffer Output buffer, see \ref BtdrvHidReportEventInfo. - * @param[in] size Output buffer size. - * @param[out] type \ref BtdrvHidEventType - */ -Result GetHidReportEventInfo(void* buffer, size_t size, BtdrvHidEventType *type); - -/// Gets the SharedMemory addr for HidReportEventInfo (\ref BtdrvCircularBuffer), only valid when \ref btdrvRegisterHidReportEvent was previously used, on [7.0.0+]. -void* GetHidReportEventInfoSharedmemAddr(void); - -/** - * @brief GetLatestPlr - * @param[out] out Output \ref BtdrvPlrList, on pre-9.0.0 this is \ref BtdrvPlrStatistics. - */ -Result GetLatestPlr(BtdrvPlrList *out); - -/** - * @brief GetPendingConnections - * @note The output data will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). - * @note This is used by btm-sysmodule. - * @note Only available on [3.0.0+]. - */ -Result GetPendingConnections(void); - -/** - * @brief GetChannelMap - * @note Only available on [3.0.0+]. - * @param[out] out \ref BtdrvChannelMapList - */ -Result GetChannelMap(BtdrvChannelMapList *out); - -/** - * @brief EnableTxPowerBoostSetting - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result EnableTxPowerBoostSetting(bool flag); - -/** - * @brief IsTxPowerBoostSettingEnabled - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsTxPowerBoostSettingEnabled(bool *out); - -/** - * @brief EnableAfhSetting - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result EnableAfhSetting(bool flag); - -/** - * @brief IsAfhSettingEnabled - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsAfhSettingEnabled(bool *out); - -/** - * @brief InitializeBle - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result InitializeBle(Event* out_event); - -/** - * @brief EnableBle - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - */ -Result EnableBle(void); - -/** - * @brief DisableBle - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - */ -Result DisableBle(void); - -/** - * @brief FinalizeBle - * @note Only available on [5.0.0+]. - */ -Result FinalizeBle(void); - -/** - * @brief SetBleVisibility - * @note Only available on [5.0.0+]. - * @param[in] discoverable Whether the BLE device is discoverable. - * @param[in] connectable Whether the BLE device is connectable. - */ -Result SetBleVisibility(bool discoverable, bool connectable); - -/** - * @brief SetLeConnectionParameter - * @note Only available on [5.0.0-8.1.1]. This is the older version of \ref btdrvSetBleConnectionParameter. - * @param[in] param \ref BtdrvLeConnectionParams - */ -Result SetLeConnectionParameter(const BtdrvLeConnectionParams *param); - -/** - * @brief SetBleConnectionParameter - * @note Only available on [9.0.0+]. This is the newer version of \ref btdrvSetLeConnectionParameter. - * @param[in] addr \ref BtdrvAddress - * @param[in] param \ref BtdrvBleConnectionParameter - * @param[in] preference Unused - */ -Result SetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool preference); - -/** - * @brief SetLeDefaultConnectionParameter - * @note Only available on [5.0.0-8.1.1]. This is the older version of \ref btdrvSetBleDefaultConnectionParameter. - * @param[in] param \ref BtdrvLeConnectionParams - */ -Result SetLeDefaultConnectionParameter(const BtdrvLeConnectionParams *param); - -/** - * @brief SetBleDefaultConnectionParameter - * @note Only available on [9.0.0+]. This is the newer version of \ref btdrvSetLeDefaultConnectionParameter. - * @param[in] param \ref BtdrvBleConnectionParameter - */ -Result SetBleDefaultConnectionParameter(const BtdrvBleConnectionParameter *param); - -/** - * @brief SetBleAdvertiseData - * @note Only available on [5.0.0+]. - * @param[in] data \ref BtdrvBleAdvertisePacketData - */ -Result SetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data); - -/** - * @brief SetBleAdvertiseParameter - * @note Only available on [5.0.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[in] min_interval Minimum advertisement interval - * @param[in] max_interval Maximum advertisement interval - */ -Result SetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval); - -/** - * @brief StartBleScan - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - */ -Result StartBleScan(void); - -/** - * @brief StopBleScan - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - */ -Result StopBleScan(void); - -/** - * @brief AddBleScanFilterCondition - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] filter \ref BtdrvBleAdvertiseFilter - */ -Result AddBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter); - -/** - * @brief DeleteBleScanFilterCondition - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] filter \ref BtdrvBleAdvertiseFilter - */ -Result DeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter); - -/** - * @brief DeleteBleScanFilter - * @note Only available on [5.0.0+]. - * @param[in] index Filter index - */ -Result DeleteBleScanFilter(u8 index); - -/** - * @brief ClearBleScanFilters - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - */ -Result ClearBleScanFilters(void); - -/** - * @brief EnableBleScanFilter - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] flag Flag - */ -Result EnableBleScanFilter(bool flag); - -/** - * @brief RegisterGattClient - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result RegisterGattClient(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief UnregisterGattClient - * @note Only available on [5.0.0+]. - * @param[in] client_if Client interface ID - */ -Result UnregisterGattClient(u8 client_if); - -/** - * @brief UnregisterAllGattClients - * @note Only available on [5.0.0+]. - */ -Result UnregisterAllGattClients(void); - -/** - * @brief ConnectGattServer - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] client_if Client interface ID - * @param[in] addr \ref BtdrvAddress - * @param[in] is_direct Whether a direct connection or a background auto connection - * @param[in] AppletResourceUserId AppletResourceUserId - */ -Result ConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId); - -/** - * @brief CancelConnectGattServer - * @note Only available on [5.1.0+]. - * @note This is used by btm-sysmodule. - * @param[in] client_if Client interface ID - * @param[in] addr \ref BtdrvAddress - * @param[in] is_direct Whether a direct connection or a background auto connection - */ -Result CancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct); - -/** - * @brief DisconnectGattServer - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] conn_id Connection ID - */ -Result DisconnectGattServer(u32 conn_id); - -/** - * @brief GetGattAttribute - * @note Only available on [5.0.0+]. - * @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0. - * @param[in] conn_id Connection ID - */ -Result GetGattAttribute(BtdrvAddress addr, u32 conn_id); - -/** - * @brief GetGattService - * @note Only available on [5.0.0+]. - * @param[in] conn_id Connection ID - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result GetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid); - -/** - * @brief ConfigureAttMtu - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] conn_id Connection ID - * @param[in] mtu MTU - */ -Result ConfigureAttMtu(u32 conn_id, u16 mtu); - -/** - * @brief RegisterGattServer - * @note Only available on [5.0.0+]. - * @note Event data generated by this call contains uninitialized junk instead of the server_if value received internally. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result RegisterGattServer(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief UnregisterGattServer - * @note Only available on [5.0.0+]. - * @param[in] server_if Server interface ID - */ -Result UnregisterGattServer(u8 server_if); - -/** - * @brief ConnectGattClient - * @note Only available on [5.0.0+]. - * @param[in] server_if Server interface ID - * @param[in] addr \ref BtdrvAddress - * @param[in] is_direct Whether a direct connection or a background auto connection - */ -Result ConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct); - -/** - * @brief DisconnectGattClient - * @note Only available on [5.0.0+]. - * @param[in] conn_id Connection ID - * @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0. - */ -Result DisconnectGattClient(u8 conn_id, BtdrvAddress addr); - -/** - * @brief AddGattService - * @note Only available on [5.0.0+]. - * @note Broken behaviour due to internal bugs. - * @param[in] server_if Server interface ID - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[in] num_handle Number of handles - * @param[in] is_primary Is a primary service or not - */ -Result AddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary); - -/** - * @brief EnableGattService - * @note Only available on [5.0.0+]. - * @note Broken behaviour due to internal bugs. - * @param[in] server_if Server interface ID - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result EnableGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid); - -/** - * @brief AddGattCharacteristic - * @note Only available on [5.0.0+]. - * @note Broken behaviour due to internal bugs. - * @param[in] server_if Server interface ID - * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid - * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid - * @param[in] permissions \ref BtdrvGattAttributePermission - * @param[in] property \ref BtdrvGattCharacteristicProperty - */ -Result AddGattCharacteristic(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u16 permissions, u8 property); - -/** - * @brief AddGattDescriptor - * @note Only available on [5.0.0+]. - * @note Broken behaviour due to internal bugs. - * @param[in] server_if Server interface ID - * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid - * @param[in] desc_uuid Descriptor UUID \ref BtdrvGattAttributeUuid - * @param[in] permissions \ref BtdrvGattAttributePermission - */ -Result AddGattDescriptor(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions); - -/** - * @brief GetBleManagedEventInfo - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo. - * @param[in] size Output buffer size. - * @param[out] type Output BtdrvBleEventType. - */ -Result GetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); - -/** - * @brief GetGattFirstCharacteristic - * @note Only available on [5.0.0+]. - * @param[in] conn_id Connection ID - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] is_primary Is a primary service or not - * @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid - * @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty - * @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId - */ -Result GetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id); - -/** - * @brief GetGattNextCharacteristic - * @note Only available on [5.0.0+]. - * @param[in] conn_id Connection ID - * @param[in] serv_id Service ID \ref BtdrvGattId - * @param[in] is_primary Is a primary service or not - * @param[in] char_id Previous characteristic GATT ID \ref BtdrvGattId - * @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid - * @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty - * @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId - */ -Result GetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id); - -/** - * @brief GetGattFirstDescriptor - * @note Only available on [5.0.0+]. - * @param[in] conn_id Connection ID - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] is_primary Is a primary service or not - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid - * @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId - */ -Result GetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id); - -/** - * @brief GetGattNextDescriptor - * @note Only available on [5.0.0+]. - * @param[in] conn_id Connection ID - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] is_primary Is a primary service or not - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] desc_id Previous descriptor GATT ID \ref BtdrvGattId - * @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid - * @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId - */ -Result GetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id); - -/** - * @brief RegisterGattManagedDataPath - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result RegisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief UnregisterGattManagedDataPath - * @note Only available on [5.0.0+]. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result UnregisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief RegisterGattHidDataPath - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result RegisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief UnregisterGattHidDataPath - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result UnregisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief RegisterGattDataPath - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result RegisterGattDataPath(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief UnregisterGattDataPath - * @note Only available on [5.0.0+]. - * @note This is used by btm-sysmodule. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result UnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief ReadGattCharacteristic - * @note Only available on [5.0.0+]. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] auth_req \ref BtdrvGattAuthReqType - */ -Result ReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req); - -/** - * @brief ReadGattDescriptor - * @note Only available on [5.0.0+]. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId - * @param[in] auth_req \ref BtdrvGattAuthReqType - */ -Result ReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req); - -/** - * @brief WriteGattCharacteristic - * @note Only available on [5.0.0+]. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, must be <=0x258. - * @param[in] auth_req \ref BtdrvGattAuthReqType - * @param[in] with_response Whether to use Write-With-Response write type or not - */ -Result WriteGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response); - -/** - * @brief WriteGattDescriptor - * @note Only available on [5.0.0+]. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size, must be <=0x258. - * @param[in] auth_req \ref BtdrvGattAuthReqType - */ -Result WriteGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req); - -/** - * @brief RegisterGattNotification - * @note Only available on [5.0.0+]. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - */ -Result RegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); - -/** - * @brief UnregisterGattNotification - * @note Only available on [5.0.0+]. - * @param[in] connection_handle ConnectionHandle - * @param[in] is_primary Is a primary service or not - * @param[in] serv_id Service GATT ID \ref BtdrvGattId - * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId - */ -Result UnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); - -/** - * @brief GetLeHidEventInfo - * @note Only available on [5.0.0+]. - * @note The state used by this is reset after writing the data to output. - * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo. - * @param[in] size Output buffer size. - * @param[out] type \ref BtdrvBleEventType. - */ -Result GetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); - -/** - * @brief RegisterBleHidEvent - * @note Only available on [5.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result RegisterBleHidEvent(Event* out_event); - -/** - * @brief SetBleScanParameter - * @note Only available on [5.1.0+]. - * @note This is used by btm-sysmodule. - * @param[in] scan_interval Scan interval - * @param[in] scan_window Scan window - */ -Result SetBleScanParameter(u16 scan_interval, u16 scan_window); - -/** - * @brief MoveToSecondaryPiconet - * @note The response will be available via \ref btdrvGetHidEventInfo ([12.0.0+] \ref btdrvGetEventInfo). - * @note Only available on [10.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result MoveToSecondaryPiconet(BtdrvAddress addr); - -/** - * @brief IsBluetoothEnabled - * @note Only available on [12.0.0+]. - * @param[out] out Output flag. - */ -Result IsBluetoothEnabled(bool *out); - -/** - * @brief AcquireAudioEvent - * @note Only available on [12.0.0+]. - * @param[out] out_event Output Event. - * @param[in] autoclear Event autoclear. - */ -Result AcquireAudioEvent(Event* out_event, bool autoclear); - -/** - * @brief GetAudioEventInfo - * @note Only available on [12.0.0+]. - * @param[out] buffer Output buffer, see \ref BtdrvAudioEventInfo. - * @param[in] size Output buffer size. - * @param[out] type \ref BtdrvAudioEventType. - */ -Result GetAudioEventInfo(void* buffer, size_t size, BtdrvAudioEventType *type); - -/** - * @brief OpenAudioConnection - * @note Only available on [12.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result OpenAudioConnection(BtdrvAddress addr); - -/** - * @brief CloseAudioConnection - * @note Only available on [12.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result CloseAudioConnection(BtdrvAddress addr); - -/** - * @brief OpenAudioOut - * @note Only available on [12.0.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[out] audio_handle Audio handle. - */ -Result OpenAudioOut(BtdrvAddress addr, u32 *audio_handle); - -/** - * @brief CloseAudioOut - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - */ -Result CloseAudioOut(u32 audio_handle); - -/** - * @brief StartAudioOut - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[in] pcm_param \ref BtdrvPcmParameter - * @param[in] in_latency Input latency in nanoseconds. - * @param[out] out_latency Output latency in nanoseconds. - * @param[out] out1 Unknown output. - */ -Result StartAudioOut(u32 audio_handle, const BtdrvPcmParameter *pcm_param, s64 in_latency, s64 *out_latency, u64 *out1); - -/** - * @brief StopAudioOut - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - */ -Result StopAudioOut(u32 audio_handle); - -/** - * @brief GetAudioOutState - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[out] out \ref BtdrvAudioOutState - */ -Result GetAudioOutState(u32 audio_handle, BtdrvAudioOutState *out); - -/** - * @brief GetAudioOutFeedingCodec - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[out] out \ref BtdrvAudioCodec - */ -Result GetAudioOutFeedingCodec(u32 audio_handle, BtdrvAudioCodec *out); - -/** - * @brief GetAudioOutFeedingParameter - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[out] out \ref BtdrvPcmParameter - */ -Result GetAudioOutFeedingParameter(u32 audio_handle, BtdrvPcmParameter *out); - -/** - * @brief AcquireAudioOutStateChangedEvent - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[out] out_event Output Event. - * @param[in] autoclear Event autoclear. - */ -Result AcquireAudioOutStateChangedEvent(u32 audio_handle, Event* out_event, bool autoclear); - -/** - * @brief AcquireAudioOutBufferAvailableEvent - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[out] out_event Output Event. - * @param[in] autoclear Event autoclear. - */ -Result AcquireAudioOutBufferAvailableEvent(u32 audio_handle, Event* out_event, bool autoclear); - -/** - * @brief SendAudioData - * @note Only available on [12.0.0+]. - * @param[in] audio_handle Audio handle from \ref btdrvOpenAudioOut. - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - * @param[out] Output transferred size. This is always either 0 (error occured) or the buffer size. - */ -Result SendAudioData(u32 audio_handle, const void* buffer, size_t size, u64 *transferred_size); - -/** - * @brief AcquireAudioControlInputStateChangedEvent - * @note Only available on [12.0.0+]. - * @param[out] out_event Output Event. - * @param[in] autoclear Event autoclear. - */ -Result AcquireAudioControlInputStateChangedEvent(Event* out_event, bool autoclear); - -/** - * @brief GetAudioControlInputState - * @note Only available on [12.0.0+]. - * @param[out] states Output array of \ref BtdrvAudioControlButtonState. - * @param[in] count Size of the states array in entries, the maximum is 0xF. - * @param[out] total_out Total output entries. - */ -Result GetAudioControlInputState(BtdrvAudioControlButtonState *states, s32 count, s32 *total_out); - -/** - * @brief AcquireAudioConnectionStateChangedEvent - * @note Only available on [12.0.0-13.2.1]. - * @param[out] out_event Output Event. - * @param[in] autoclear Event autoclear. - */ -Result AcquireAudioConnectionStateChangedEvent(Event* out_event, bool autoclear); - -/** - * @brief GetConnectedAudioDevice - * @note Only available on [12.0.0-13.2.1]. - * @param[out] addrs Output array of \ref BtdrvAddress. - * @param[in] count Size of the addrs array in entries, the maximum is 0x8. - * @param[out] total_out Total output entries. - */ -Result GetConnectedAudioDevice(BtdrvAddress *addrs, s32 count, s32 *total_out); - -/** - * @brief CloseAudioControlInput - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result CloseAudioControlInput(BtdrvAddress addr); - -/** - * @brief RegisterAudioControlNotification - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[in] event_type AvrcEventType - */ -Result RegisterAudioControlNotification(BtdrvAddress addr, u32 event_type); - -/** - * @brief SendAudioControlPassthroughCommand - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[in] op_id AvrcOperationId - * @param[in] state_type AvrcStateType - */ -Result SendAudioControlPassthroughCommand(BtdrvAddress addr, u32 op_id, u32 state_type); - -/** - * @brief SendAudioControlSetAbsoluteVolumeCommand - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[in] val Input value - */ -Result SendAudioControlSetAbsoluteVolumeCommand(BtdrvAddress addr, s32 val); - -/** - * @brief IsManufacturingMode - * @note Only available on [5.0.0+]. - * @param[out] out Output flag. - */ -Result IsManufacturingMode(bool *out); - -/** - * @brief EmulateBluetoothCrash - * @note Only available on [7.0.0+]. - * @param[in] reason \ref BtdrvFatalReason - */ -Result EmulateBluetoothCrash(BtdrvFatalReason reason); - -/** - * @brief GetBleChannelMap - * @note Only available on [9.0.0+]. - * @param[out] out \ref BtdrvChannelMapList - */ -Result GetBleChannelMap(BtdrvChannelMapList *out); - -/** - * @brief Read - * @note Used by \ref btdrvGetHidReportEventInfo on [7.0.0+]. - * @param c \ref BtdrvCircularBuffer - */ -void* CircularBufferRead(BtdrvCircularBuffer *c); - -/** - * @brief Free - * @note Used by \ref btdrvGetHidReportEventInfo on [7.0.0+]. - * @param c \ref BtdrvCircularBuffer - */ -bool CircularBufferFree(BtdrvCircularBuffer *c); - -} // namespace btdrv - -/// @brief C++ wrappers for the `btm` API. -/// @details Wraps: switch/services/btm.h. -namespace btm { - -/// Initialize btm. -Result Initialize(void); - -/// Exit btm. -void Exit(void); - -/// Gets the Service object for the actual btm service session. -Service* GetServiceSession(void); - -/** - * @brief GetState - * @param[out] out \ref BtmState - */ -Result GetState(BtmState *out); - -/** - * @brief GetHostDeviceProperty - * @param[out] out \ref BtmHostDeviceProperty - */ -Result GetHostDeviceProperty(BtmHostDeviceProperty *out); - -/** - * @brief AcquireDeviceConditionEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireDeviceConditionEvent(Event* out_event); - -/** - * @brief GetDeviceCondition [1.0.0-12.1.0] - * @param[out] out \ref BtmDeviceConditionList - */ -Result LegacyGetDeviceCondition(BtmDeviceConditionList *out); - -/** - * @brief GetDeviceCondition [13.0.0+] - * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. - * @param[out] out \ref BtmDeviceCondition - * @param[in] count Size of the out array in entries. - * @param[out] total_out Total output entries. - */ -Result GetDeviceCondition(BtmProfile profile, BtmDeviceCondition *out, size_t count, s32 *total_out); - -/** - * @brief SetBurstMode - * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag - */ -Result SetBurstMode(BtdrvAddress addr, bool flag); - -/** - * @brief SetSlotMode - * @param[in] list \ref BtmDeviceSlotModeList - */ -Result SetSlotMode(const BtmDeviceSlotModeList *list); - -/** - * @brief SetBluetoothMode - * @note Only available on pre-9.0.0. - * @param[in] mode \ref BtmBluetoothMode - */ -Result SetBluetoothMode(BtmBluetoothMode mode); - -/** - * @brief SetWlanMode - * @param[in] mode \ref BtmWlanMode - */ -Result SetWlanMode(BtmWlanMode mode); - -/** - * @brief AcquireDeviceInfoEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireDeviceInfoEvent(Event* out_event); - -/** - * @brief GetDeviceInfo [1.0.0-12.1.0] - * @param[out] out \ref BtmDeviceInfoList - */ -Result LegacyGetDeviceInfo(BtmDeviceInfoList *out); - -/** - * @brief GetDeviceInfo [13.0.0+] - * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. - * @param[out] out \ref BtmDeviceInfo - * @param[in] count Size of the out array in entries. - * @param[out] total_out Total output entries. - */ -Result GetDeviceInfo(BtmProfile profile, BtmDeviceInfo *out, size_t count, s32 *total_out); - -/** - * @brief AddDeviceInfo [1.0.0-12.1.0] - * @param[in] info \ref BtmDeviceInfo - */ -Result LegacyAddDeviceInfo(const BtmDeviceInfoLegacy *info); - -/** - * @brief AddDeviceInfo [13.0.0+] - * @param[in] info \ref BtmDeviceInfo - */ -Result AddDeviceInfo(const BtmDeviceInfo *info); - -/** - * @brief RemoveDeviceInfo - * @param[in] addr \ref BtdrvAddress - */ -Result RemoveDeviceInfo(BtdrvAddress addr); - -/** - * @brief IncreaseDeviceInfoOrder - * @param[in] addr \ref BtdrvAddress - */ -Result IncreaseDeviceInfoOrder(BtdrvAddress addr); - -/** - * @brief LlrNotify - * @param[in] addr \ref BtdrvAddress - * @param[in] unk [9.0.0+] Unknown - */ -Result LlrNotify(BtdrvAddress addr, s32 unk); - -/** - * @brief EnableRadio - */ -Result EnableRadio(void); - -/** - * @brief DisableRadio - */ -Result DisableRadio(void); - -/** - * @brief HidDisconnect - * @param[in] addr \ref BtdrvAddress - */ -Result HidDisconnect(BtdrvAddress addr); - -/** - * @brief HidSetRetransmissionMode - * @param[in] addr \ref BtdrvAddress - * @param[in] list \ref BtmZeroRetransmissionList - */ -Result HidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list); - -/** - * @brief AcquireAwakeReqEvent - * @note Only available on [2.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireAwakeReqEvent(Event* out_event); - -/** - * @brief AcquireLlrStateEvent - * @note Only available on [4.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireLlrStateEvent(Event* out_event); - -/** - * @brief IsLlrStarted - * @note Only available on [4.0.0+]. - * @param[out] out Output flag. - */ -Result IsLlrStarted(bool *out); - -/** - * @brief EnableSlotSaving - * @note Only available on [4.0.0+]. - * @param[in] flag Flag - */ -Result EnableSlotSaving(bool flag); - -/** - * @brief ProtectDeviceInfo - * @note Only available on [5.0.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag - */ -Result ProtectDeviceInfo(BtdrvAddress addr, bool flag); - -/** - * @brief AcquireBleScanEvent - * @note Only available on [5.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleScanEvent(Event* out_event); - -/** - * @brief GetBleScanParameterGeneral - * @note Only available on [5.1.0+]. - * @param[in] parameter_id Must be value 0x1 or 0xFFFF. - * @param[out] out \ref BtdrvBleAdvertisePacketParameter - */ -Result GetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out); - -/** - * @brief GetBleScanParameterSmartDevice - * @note Only available on [5.1.0+]. - * @param[in] parameter_id Must be value 0x2. - * @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0. - */ -Result GetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out); - -/** - * @brief StartBleScanForGeneral - * @note Only available on [5.1.0+]. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param); - -/** - * @brief StopBleScanForGeneral - * @note Only available on [5.1.0+]. - */ -Result StopBleScanForGeneral(void); - -/** - * @brief GetBleScanResultsForGeneral - * @note Only available on [5.1.0+]. - * @param[out] results Output array of \ref BtdrvBleScanResult. - * @param[in] count Size of the results array in entries. The max is 10. - * @param[out] total_out Total output entries. - */ -Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out); - -/** - * @brief StartBleScanForPaired - * @note Only available on [5.1.0+]. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param); - -/** - * @brief StopBleScanForPaired - * @note Only available on [5.1.0+]. - */ -Result StopBleScanForPaired(void); - -/** - * @brief StartBleScanForSmartDevice - * @note Only available on [5.1.0+]. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief StopBleScanForSmartDevice - * @note Only available on [5.1.0+]. - */ -Result StopBleScanForSmartDevice(void); - -/** - * @brief GetBleScanResultsForSmartDevice - * @note Only available on [5.1.0+]. - * @param[out] results Output array of \ref BtdrvBleScanResult. - * @param[in] count Size of the results array in entries. The max is 10. - * @param[out] total_out Total output entries. - */ -Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out); - -/** - * @brief AcquireBleConnectionEvent - * @note Only available on [5.1.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleConnectionEvent(Event* out_event); - -/** - * @brief BleConnect - * @note Only available on [5.0.0+]. - * @note The \ref BtdrvAddress must not be already connected. A maximum of 4 devices can be connected. - * @param[in] addr \ref BtdrvAddress - */ -Result BleConnect(BtdrvAddress addr); - -/** - * @brief BleOverrideConnection - * @note Only available on [5.1.0+]. - * @param[in] id Same as \ref btmBleDisconnect. - */ -Result BleOverrideConnection(u32 id); - -/** - * @brief BleDisconnect - * @note Only available on [5.0.0+]. - * @param[in] connection_handle This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid. - */ -Result BleDisconnect(u32 connection_handle); - -/** - * @brief BleGetConnectionState - * @note Only available on [5.0.0+]. - * @param[out] info Output array of \ref BtdrvBleConnectionInfo. - * @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4. - * @param[out] total_out Total output entries. - */ -Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out); - -/** - * @brief BleGetGattClientConditionList - * @note Only available on [5.0.0+]. - * @param[out] list \ref BtmGattClientConditionList - */ -Result BleGetGattClientConditionList(BtmGattClientConditionList *list); - -/** - * @brief AcquireBlePairingEvent - * @note Only available on [5.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBlePairingEvent(Event* out_event); - -/** - * @brief BlePairDevice - * @note Only available on [5.1.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); - -/** - * @brief BleUnpairDeviceOnBoth - * @note Only available on [5.1.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result BleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); - -/** - * @brief BleUnPairDevice - * @note Only available on [5.1.0+]. - * @param[in] addr \ref BtdrvAddress - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result BleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param); - -/** - * @brief BleGetPairedAddresses - * @note Only available on [5.1.0+]. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - * @param[out] addrs Output array of \ref BtdrvAddress. - * @param[in] count Size of the addrs array in entries. - * @param[out] total_out Total output entries. The max is 10. - */ -Result BleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out); - -/** - * @brief AcquireBleServiceDiscoveryEvent - * @note Only available on [5.1.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleServiceDiscoveryEvent(Event* out_event); - -/** - * @brief GetGattServices - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[out] services Output array of \ref BtmGattService. - * @param[in] count Size of the services array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out); - -/** - * @brief Same as \ref btmGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid. - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] service \ref BtmGattService - * @param[out] flag Whether a \ref BtmGattService was returned. - */ -Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag); - -/** - * @brief Same as \ref btmGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields. - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] service_handle ServiceHandle - * @param[out] services \ref BtmGattService - * @param[in] count Size of the services array in entries. The max is 100. - * @param[out] out Output value. - */ -Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out); - -/** - * @brief This is similar to \ref btmGetGattIncludedServices except this only returns 1 \ref BtmGattService. - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] attribute_handle AttributeHandle - * @param[out] service \ref BtmGattService - * @param[out] flag Whether a \ref BtmGattService was returned. - */ -Result GetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag); - -/** - * @brief GetGattCharacteristics - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return. - * @param[out] characteristics \ref BtmGattCharacteristic - * @param[in] count Size of the characteristics array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out); - -/** - * @brief GetGattDescriptors - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return. - * @param[out] descriptors \ref BtmGattDescriptor - * @param[in] count Size of the descriptors array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out); - -/** - * @brief AcquireBleMtuConfigEvent - * @note Only available on [5.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleMtuConfigEvent(Event* out_event); - -/** - * @brief ConfigureBleMtu - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[in] mtu MTU - */ -Result ConfigureBleMtu(u32 connection_handle, u16 mtu); - -/** - * @brief GetBleMtu - * @note Only available on [5.0.0+]. - * @param[in] connection_handle Same as \ref btmBleDisconnect. - * @param[out] out Output MTU. - */ -Result GetBleMtu(u32 connection_handle, u16 *out); - -/** - * @brief RegisterBleGattDataPath - * @note Only available on [5.0.0+]. - * @param[in] path \ref BtmBleDataPath - */ -Result RegisterBleGattDataPath(const BtmBleDataPath *path); - -/** - * @brief UnregisterBleGattDataPath - * @note Only available on [5.0.0+]. - * @param[in] path \ref BtmBleDataPath - */ -Result UnregisterBleGattDataPath(const BtmBleDataPath *path); - -/** - * @brief RegisterAppletResourceUserId - * @note Only available on [5.0.0+]. - * @param[in] AppletResourceUserId AppletResourceUserId - * @param[in] unk Unknown - */ -Result RegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk); - -/** - * @brief UnregisterAppletResourceUserId - * @note Only available on [5.0.0+]. - * @param[in] AppletResourceUserId AppletResourceUserId - */ -Result UnregisterAppletResourceUserId(u64 AppletResourceUserId); - -/** - * @brief SetAppletResourceUserId - * @note Only available on [5.0.0+]. - * @param[in] AppletResourceUserId AppletResourceUserId - */ -Result SetAppletResourceUserId(u64 AppletResourceUserId); - -/** - * @brief GetShortenedDeviceInfo - * @note Only available on [13.0.0+]. - * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. - * @param[out] out \ref BtmShortenedDeviceInfo - * @param[in] count Size of the out array in entries. - * @param[out] total_out Total output entries. - */ -Result GetShortenedDeviceInfo(BtmProfile profile, BtmShortenedDeviceInfo *out, size_t count, s32 *total_out); - -/** - * @brief GetShortenedDeviceCondition - * @note Only available on [14.0.0+]. - * @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile. - * @param[out] out \ref BtmShortenedDeviceCondition - * @param[in] count Size of the out array in entries. - * @param[out] total_out Total output entries. - */ -Result GetShortenedDeviceCondition(BtmProfile profile, BtmShortenedDeviceCondition *out, size_t count, s32 *total_out); - -} // namespace btm - -/// @brief C++ wrappers for the `btmsys` API. -/// @details Wraps: switch/services/btmsys.h. -namespace btmsys { - -/// Initialize btm:sys. -Result Initialize(void); - -/// Exit btm:sys. -void Exit(void); - -/// Gets the Service object for the actual btm:sys service session. This object must be closed by the user once finished using cmds with this. -Result GetServiceSession(Service* srv_out); - -/// Gets the Service object for IBtmSystemCore. -Service* GetServiceSession_IBtmSystemCore(void); - -/** - * @brief StartGamepadPairing - */ -Result StartGamepadPairing(void); - -/** - * @brief CancelGamepadPairing - */ -Result CancelGamepadPairing(void); - -/** - * @brief ClearGamepadPairingDatabase - */ -Result ClearGamepadPairingDatabase(void); - -/** - * @brief GetPairedGamepadCount - * @param[out] out Output count. - */ -Result GetPairedGamepadCount(u8 *out); - -/** - * @brief EnableRadio - */ -Result EnableRadio(void); - -/** - * @brief DisableRadio - */ -Result DisableRadio(void); - -/** - * @brief GetRadioOnOff - * @param[out] out Output flag. - */ -Result GetRadioOnOff(bool *out); - -/** - * @brief AcquireRadioEvent - * @note Only available on [3.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireRadioEvent(Event* out_event); - -/** - * @brief AcquireGamepadPairingEvent - * @note Only available on [3.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireGamepadPairingEvent(Event* out_event); - -/** - * @brief IsGamepadPairingStarted - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsGamepadPairingStarted(bool *out); - -/** - * @brief StartAudioDeviceDiscovery - * @note Only available on [13.0.0+]. - */ -Result StartAudioDeviceDiscovery(void); - -/** - * @brief StopAudioDeviceDiscovery - * @note Only available on [13.0.0+]. - */ -Result StopAudioDeviceDiscovery(void); - -/** - * @brief IsDiscoveryingAudioDevice - * @note Only available on [13.0.0+]. - * @param[out] out Output flag. - */ -Result IsDiscoveryingAudioDevice(bool *out); - -/** - * @brief GetDiscoveredAudioDevice - * @note Only available on [13.0.0+]. - * @param[out] out Output array of \ref BtmAudioDevice. - * @param[in] count Size of the out array in entries. The max is 15. - * @param[out] total_out Total output entries. - */ -Result GetDiscoveredAudioDevice(BtmAudioDevice *out, s32 count, s32 *total_out); - -/** - * @brief AcquireAudioDeviceConnectionEvent - * @note Only available on [13.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireAudioDeviceConnectionEvent(Event* out_event); - -/** - * @brief ConnectAudioDevice - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result ConnectAudioDevice(BtdrvAddress addr); - -/** - * @brief IsConnectingAudioDevice - * @note Only available on [13.0.0+]. - * @param[out] out Output flag. - */ -Result IsConnectingAudioDevice(bool *out); - -/** - * @brief GetConnectedAudioDevices - * @note Only available on [13.0.0+]. - * @param[out] out Output array of \ref BtmAudioDevice. - * @param[in] count Size of the out array in entries. The max is 8. - * @param[out] total_out Total output entries. - */ -Result GetConnectedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out); - -/** - * @brief DisconnectAudioDevice - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result DisconnectAudioDevice(BtdrvAddress addr); - -/** - * @brief AcquirePairedAudioDeviceInfoChangedEvent - * @note Only available on [13.0.0+]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquirePairedAudioDeviceInfoChangedEvent(Event* out_event); - -/** - * @brief GetPairedAudioDevices - * @note Only available on [13.0.0+]. - * @param[out] out Output array of \ref BtmAudioDevice. - * @param[in] count Size of the out array in entries. The max is 10. - * @param[out] total_out Total output entries. - */ -Result GetPairedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out); - -/** - * @brief RemoveAudioDevicePairing - * @note Only available on [13.0.0+]. - * @param[in] addr \ref BtdrvAddress - */ -Result RemoveAudioDevicePairing(BtdrvAddress addr); - -/** - * @brief RequestAudioDeviceConnectionRejection - * @note Only available on [13.0.0+]. - */ -Result RequestAudioDeviceConnectionRejection(void); - -/** - * @brief CancelAudioDeviceConnectionRejection - * @note Only available on [13.0.0+]. - */ -Result CancelAudioDeviceConnectionRejection(void); - -} // namespace btmsys - -/// @brief C++ wrappers for the `btmu` API. -/// @details Wraps: switch/services/btmu.h. -namespace btmu { - -/// Initialize btm:u. -Result Initialize(void); - -/// Exit btm:u. -void Exit(void); - -/// Gets the Service object for the actual btm:u service session. This object must be closed by the user once finished using cmds with this. -Result GetServiceSession(Service* srv_out); - -/// Gets the Service object for IBtmUserCore. -Service* GetServiceSession_IBtmUserCore(void); - -/** - * @brief AcquireBleScanEvent - * @note This is similar to \ref btmAcquireBleScanEvent. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleScanEvent(Event* out_event); - -/** - * @brief GetBleScanFilterParameter - * @note This is the same as \ref btmGetBleScanParameterGeneral. - * @param[in] parameter_id Must be value 0x1 or 0xFFFF. - * @param[out] out \ref BtdrvBleAdvertisePacketParameter - */ -Result GetBleScanFilterParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out); - -/** - * @brief GetBleScanFilterParameter2 - * @note This is the same as \ref btmGetBleScanParameterSmartDevice. - * @param[in] parameter_id Must be value 0x2. - * @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0. - */ -Result GetBleScanFilterParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out); - -/** - * @brief StartBleScanForGeneral - * @note This is similar to \ref btmStartBleScanForGeneral. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param); - -/** - * @brief StopBleScanForGeneral - * @note This is similar to \ref btmStopBleScanForGeneral. - */ -Result StopBleScanForGeneral(void); - -/** - * @brief GetBleScanResultsForGeneral - * @note This is similar to \ref btmGetBleScanResultsForGeneral. - * @param[out] results Output array of \ref BtdrvBleScanResult. - * @param[in] count Size of the results array in entries. The max is 10. - * @param[out] total_out Total output entries. - */ -Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out); - -/** - * @brief StartBleScanForPaired - * @note This is similar to \ref btmStartBleScanForPaired. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param); - -/** - * @brief StopBleScanForPaired - * @note This is similar to \ref btmStopBleScanForPaired. - */ -Result StopBleScanForPaired(void); - -/** - * @brief StartBleScanForSmartDevice - * @note This is similar to \ref btmStartBleScanForSmartDevice. - * @param[in] uuid \ref BtdrvGattAttributeUuid - */ -Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid); - -/** - * @brief StopBleScanForSmartDevice - * @note This is similar to \ref btmStopBleScanForSmartDevice. - */ -Result StopBleScanForSmartDevice(void); - -/** - * @brief GetBleScanResultsForSmartDevice - * @note This is similar to \ref btmGetBleScanResultsForSmartDevice. - * @param[out] results Output array of \ref BtdrvBleScanResult. - * @param[in] count Size of the results array in entries. The max is 10. - * @param[out] total_out Total output entries. - */ -Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out); - -/** - * @brief AcquireBleConnectionEvent - * @note This is similar to \ref btmAcquireBleConnectionEvent. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleConnectionEvent(Event* out_event); - -/** - * @brief BleConnect - * @note This is similar to \ref btmBleConnect. - * @param[in] addr \ref BtdrvAddress - */ -Result BleConnect(BtdrvAddress addr); - -/** - * @brief BleDisconnect - * @note This is similar to \ref btmBleDisconnect. - * @param[in] connection_handle This must match a BtdrvBleConnectionInfo::connection_handle from \ref btmuBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid. - */ -Result BleDisconnect(u32 connection_handle); - -/** - * @brief BleGetConnectionState - * @note This is similar to \ref btmBleGetConnectionState. - * @param[out] info Output array of \ref BtdrvBleConnectionInfo. - * @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4. - * @param[out] total_out Total output entries. - */ -Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out); - -/** - * @brief AcquireBlePairingEvent - * @note This is similar to \ref btmAcquireBlePairingEvent. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBlePairingEvent(Event* out_event); - -/** - * @brief BlePairDevice - * @note This is similar to \ref btmBlePairDevice. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); - -/** - * @brief BleUnPairDevice - * @note This is similar to \ref btmBleUnpairDeviceOnBoth. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result BleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param); - -/** - * @brief BleUnPairDevice2 - * @note This is similar to \ref btmBleUnPairDevice. - * @param[in] addr \ref BtdrvAddress - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - */ -Result BleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param); - -/** - * @brief BleGetPairedDevices - * @note This is similar to \ref btmBleGetPairedAddresses. - * @param[in] param \ref BtdrvBleAdvertisePacketParameter - * @param[out] addrs Output array of \ref BtdrvAddress. - * @param[in] count Size of the addrs array in entries. - * @param[out] total_out Total output entries. The max is 10. - */ -Result BleGetPairedDevices(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out); - -/** - * @brief AcquireBleServiceDiscoveryEvent - * @note This is similar to \ref btmAcquireBleServiceDiscoveryEvent. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleServiceDiscoveryEvent(Event* out_event); - -/** - * @brief GetGattServices - * @note This is similar to \ref btmGetGattServices. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[out] services Output array of \ref BtmGattService. - * @param[in] count Size of the services array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out); - -/** - * @brief Same as \ref btmuGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid. - * @note This is similar to \ref btmGetGattService. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] service \ref BtmGattService - * @param[out] flag Whether a \ref BtmGattService was returned. - */ -Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag); - -/** - * @brief Same as \ref btmuGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields. - * @note This is similar to \ref btmGetGattIncludedServices. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] service_handle ServiceHandle - * @param[out] services \ref BtmGattService - * @param[in] count Size of the services array in entries. The max is 100. - * @param[out] out Output value. - */ -Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out); - -/** - * @brief This is similar to \ref btmuGetGattIncludedServices except this only returns 1 \ref BtmGattService. - * @note This is similar to \ref btmGetBelongingService. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] attribute_handle AttributeHandle - * @param[out] service \ref BtmGattService - * @param[out] flag Whether a \ref BtmGattService was returned. - */ -Result GetBelongingGattService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag); - -/** - * @brief GetGattCharacteristics - * @note This is similar to \ref btmGetGattCharacteristics. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return. - * @param[out] characteristics \ref BtmGattCharacteristic - * @param[in] count Size of the characteristics array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out); - -/** - * @brief GetGattDescriptors - * @note This is similar to \ref btmGetGattDescriptors. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return. - * @param[out] descriptors \ref BtmGattDescriptor - * @param[in] count Size of the descriptors array in entries. The max is 100. - * @param[out] total_out Total output entries. - */ -Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out); - -/** - * @brief AcquireBleMtuConfigEvent - * @note This is similar to \ref btmAcquireBleMtuConfigEvent. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result AcquireBleMtuConfigEvent(Event* out_event); - -/** - * @brief ConfigureBleMtu - * @note This is similar to \ref btmConfigureBleMtu. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[in] mtu MTU - */ -Result ConfigureBleMtu(u32 connection_handle, u16 mtu); - -/** - * @brief GetBleMtu - * @note This is similar to \ref btmGetBleMtu. - * @param[in] connection_handle Same as \ref btmuBleDisconnect. - * @param[out] out Output MTU. - */ -Result GetBleMtu(u32 connection_handle, u16 *out); - -/** - * @brief RegisterBleGattDataPath - * @note This is similar to \ref btmRegisterBleGattDataPath. - * @param[in] path \ref BtmBleDataPath - */ -Result RegisterBleGattDataPath(const BtmBleDataPath *path); - -/** - * @brief UnregisterBleGattDataPath - * @note This is similar to \ref btmUnregisterBleGattDataPath. - * @param[in] path \ref BtmBleDataPath - */ -Result UnregisterBleGattDataPath(const BtmBleDataPath *path); - -} // namespace btmu - -/// @brief C++ wrappers for the `capmtp` API. -/// @details Wraps: switch/services/capmtp.h. -namespace capmtp { - -Result Initialize(void* mem, size_t size, u32 app_count, u32 max_img, u32 max_vid, const char *other_name); - -void Exit(void); - -Service* GetRootServiceSession(void); - -Service* GetServiceSession(void); - -Result StartCommandHandler(void); - -Result StopCommandHandler(void); - -bool IsRunning(void); - -Event * GetConnectionEvent(void); - -bool IsConnected(void); - -Event * GetScanErrorEvent(void); - -Result GetScanError(void); - -} // namespace capmtp - -/// @brief C++ wrappers for the `caps` API. -/// @details Wraps: switch/services/caps.h, switch/services/capsa.h. -namespace caps { - -/// ImageOrientation -using ::AlbumImageOrientation; -/// AlbumReportOption -using ::AlbumReportOption; -/// AlbumCache -using ::CapsAlbumCache; -using ::CapsAlbumContentsUsage; -using ::CapsAlbumContentsUsageFlag; -/// AlbumEntry -using ::CapsAlbumEntry; -/// AlbumFileContents -using ::CapsAlbumFileContents; -/// AlbumFileContentsFlag -using ::CapsAlbumFileContentsFlag; -/// AlbumFileDateTime. This corresponds to each field in the Album entry filename, prior to the "-": "YYYYMMDDHHMMSSII". -using ::CapsAlbumFileDateTime; -/// AlbumEntryId -using ::CapsAlbumFileId; -using ::CapsAlbumStorage; -using ::CapsAlbumUsage16; -using ::CapsAlbumUsage2; -using ::CapsAlbumUsage3; -/// ApplicationAlbumEntry -using ::CapsApplicationAlbumEntry; -/// ApplicationAlbumFileEntry -using ::CapsApplicationAlbumFileEntry; -/// ApplicationData -using ::CapsApplicationData; -/// ContentType -using ::CapsContentType; -/// LoadAlbumScreenShotImageOutput -using ::CapsLoadAlbumScreenShotImageOutput; -/// LoadAlbumScreenShotImageOutputForApplication -using ::CapsLoadAlbumScreenShotImageOutputForApplication; -/// ScreenShotAttribute -using ::CapsScreenShotAttribute; -/// ScreenShotAttributeForApplication. Only unk_x0 is used by official sw. -using ::CapsScreenShotAttributeForApplication; -/// ScreenShotDecodeOption -using ::CapsScreenShotDecodeOption; -/// ScreenShotDecoderFlag -using ::CapsScreenShotDecoderFlag; -/// UserIdList -using ::CapsUserIdList; - -/// Gets the ShimLibraryVersion. -u64 GetShimLibraryVersion(void); - -/// Gets the default start_datetime. -CapsAlbumFileDateTime GetDefaultStartDateTime(void); - -/// Gets the default end_datetime. -CapsAlbumFileDateTime GetDefaultEndDateTime(void); - -/// Convert a \ref CapsApplicationAlbumFileEntry to \ref CapsApplicationAlbumEntry. -void ConvertApplicationAlbumFileEntryToApplicationAlbumEntry(CapsApplicationAlbumEntry *out, CapsApplicationAlbumFileEntry *in); - -/// Convert a \ref CapsApplicationAlbumEntry to \ref CapsApplicationAlbumFileEntry. Should only be used on [7.0.0+]. -void ConvertApplicationAlbumEntryToApplicationAlbumFileEntry(CapsApplicationAlbumFileEntry *out, CapsApplicationAlbumEntry *in); - -/** - * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. - * @note Only available on [3.0.0+]. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[out] attr \ref CapsScreenShotAttribute - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] opts \ref CapsScreenShotDecodeOption - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotThumbnailImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -} // namespace caps - -/// @brief C++ wrappers for the `capsa` API. -/// @details Wraps: switch/services/capsa.h. -namespace capsa { - -/// Initialize caps:a. -Result Initialize(void); - -/// Exit caps:a. -void Exit(void); - -/// Gets the Service for caps:a. -Service* GetServiceSession(void); - -/// Gets the Service for IAlbumAccessorSession, only initialized after \ref capsaOpenAlbumMovieStream was used (unaffected by using \ref capsaCloseAlbumMovieStream). -Service* GetServiceSession_Accessor(void); - -/** - * @brief Gets the amount of files at a AlbumStorage. - * @param[in] storage \ref CapsAlbumStorage - * @param[out] count Amount of files. - */ -Result GetAlbumFileCount(CapsAlbumStorage storage, u64 *count); - -/** - * @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage matches the input one. - * @param[in] storage \ref CapsAlbumStorage - * @param[out] out Total output entries. - * @param[out] entries Output array of \ref CapsAlbumEntry. - * @param[in] count Reserved entry count. - */ -Result GetAlbumFileList(CapsAlbumStorage storage, u64 *out, CapsAlbumEntry *entries, u64 count); - -/** - * @brief Loads a file into the specified buffer. - * @param[in] file_id \ref CapsAlbumFileId - * @param[out] out_size Size of the AlbumFile. - * @param[out] filebuf File output buffer. - * @param[in] filebuf_size Size of the filebuf. - */ -Result LoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* filebuf, u64 filebuf_size); - -/** - * @brief Deletes an AlbumFile corresponding to the specified \ref CapsAlbumFileId. - * @param[in] file_id \ref CapsAlbumFileId - */ -Result DeleteAlbumFile(const CapsAlbumFileId *file_id); - -/** - * @brief Copies an AlbumFile to the specified \ref CapsAlbumStorage. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] dst_storage \ref CapsAlbumStorage - */ -Result StorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage); - -/** - * @brief Gets the mount status of the specified \ref CapsAlbumStorage. - * @param[in] storage \ref CapsAlbumStorage - * @param[out] is_mounted Boolean over whether the storage is mounted or not. - */ -Result IsAlbumMounted(CapsAlbumStorage storage, bool *is_mounted); - -/** - * @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage. - * @param[in] storage \ref CapsAlbumStorage - * @param[out] out \ref CapsAlbumUsage2 - */ -Result GetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out); - -/** - * @brief Gets the size for the specified AlbumFile. - * @param[in] file_id \ref CapsAlbumFileId - * @param[out] size Size of the file. - */ -Result GetAlbumFileSize(const CapsAlbumFileId *file_id, u64 *size); - -/** - * @brief Load the Thumbnail for the specified AlbumFile. - * @note Will always be 320x180. - * @param[in] file_id \ref CapsAlbumFileId - * @param[out] out_size Size of the Thumbnail. - * @param[out] image JPEG image output buffer. - * @param[in] image_size Image buffer size. - */ -Result LoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size); - -/** - * @brief Load the ScreenShotImage for the specified AlbumFile. - * @note Only available on [2.0.0+]. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[in] file_id \ref CapsAlbumFileId - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. - * @note Only available on [2.0.0+]. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[in] file_id \ref CapsAlbumFileId - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotThumbnailImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an ApplicationId. - * @note Only available on [2.0.0+]. - * @param[out] entry \ref CapsAlbumEntry - * @param[in] application_entry \ref CapsApplicationAlbumEntry - * @param[in] application_id ApplicationId - */ -Result GetAlbumEntryFromApplicationAlbumEntry(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry, u64 application_id); - -/** - * @brief Load the ScreenShotImage for the specified AlbumFile. - * @note Only available on [3.0.0+]. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] opts \ref CapsScreenShotDecodeOption - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. - * @note Only available on [3.0.0+]. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] opts \ref CapsScreenShotDecodeOption - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotThumbnailImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Load the ScreenShotImage for the specified AlbumFile. - * @note Only available on [3.0.0+]. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[out] attr \ref CapsScreenShotAttribute - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] opts \ref CapsScreenShotDecodeOption - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage. - * @note Only available on [4.0.0+]. - * @param[in] storage \ref CapsAlbumStorage - * @param[out] out \ref CapsAlbumUsage3 - */ -Result GetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out); - -/** - * @brief Returns the result for a AlbumStorage mount. - * @note Only available on [4.0.0+]. - * @param[in] storage \ref CapsAlbumStorage - */ -Result GetAlbumMountResult(CapsAlbumStorage storage); - -/** - * @brief Returns the AlbumUsage for a specified \ref CapsAlbumStorage. - * @note Only available on [4.0.0+]. - * @param[in] storage \ref CapsAlbumStorage - * @param[in] flags \ref CapsAlbumFileContentsFlag - * @param[out] out \ref CapsAlbumUsage16 - */ -Result GetAlbumUsage16(CapsAlbumStorage storage, u8 flags, CapsAlbumUsage16 *out); - -/** - * @brief Returns the start and end of the Applet Id range. - * @note Only available on [6.0.0+]. - * @param[out] success Returns bool over whether the call was handled or not. - * @param[out] min Mimimum applet id. Always 0x0100000000001000 - * @param[out] max Maximum applet id. Always 0x0100000000001FFF - */ -Result GetMinMaxAppletId(bool* success, u64* min, u64* max); - -/** - * @brief Gets the amount of files of the specified type at a AlbumStorage. - * @note Only available on [5.0.0+]. - * @param[in] storage \ref CapsAlbumStorage - * @param[in] flags \ref CapsAlbumFileContentsFlag - * @param[out] count Amount of files. - */ -Result GetAlbumFileCountEx0(CapsAlbumStorage storage, u8 flags, u64 *count); - -/** - * @brief Gets a listing of \ref CapsAlbumEntry, where the AlbumFile's storage and type matches the input one. - * @note Only available on [5.0.0+]. - * @param[in] storage \ref CapsAlbumStorage - * @param[in] flags \ref CapsAlbumFileContentsFlag - * @param[out] out Total output entries. - * @param[out] entries Output array of \ref CapsAlbumEntry. - * @param[in] count Reserved entry count. - */ -Result GetAlbumFileListEx0(CapsAlbumStorage storage, u8 flags, u64 *out, CapsAlbumEntry *entries, u64 count); - -/** - * @brief Returns the image from the last shown ScreenShot Overlay. - * @param[out] file_id \ref CapsAlbumFileId - * @param[out] out_size Size of the thumbnail image. Always 0x5100. - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54. - */ -Result GetLastOverlayScreenShotThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size); - -/** - * @brief Returns the image from the last shown Movie Overlay. - * @note Only available on [4.0.0+]. - * @param[out] file_id \ref CapsAlbumFileId - * @param[out] out_size Size of the thumbnail image. Always 0x5100. - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 96×54. - */ -Result GetLastOverlayMovieThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size); - -/** - * @brief Gets the currently set autosaving storage. - * @note Wrapper around setsysGetPrimaryAlbumStorage but defaults to NAND if SD isn't available. - * @param[out] storage \ref CapsAlbumStorage - */ -Result GetAutoSavingStorage(CapsAlbumStorage *storage); - -/** - * @brief Gets required size to copy all files from one Storage to another. - * @param[in] dst_storage \ref CapsAlbumStorage - * @param[in] src_storage \ref CapsAlbumStorage - * @param[out] out Required storage space size. - */ -Result GetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64 *out); - -/** - * @brief Load the ScreenShotImage for the specified AlbumFile. - * @note Only available on [4.0.0+]. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] opts \ref CapsScreenShotDecodeOption - * @param[out] out \ref CapsLoadAlbumScreenShotImageOutput - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. - * @note Only available on [4.0.0+]. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] opts \ref CapsScreenShotDecodeOption - * @param[out] out \ref CapsLoadAlbumScreenShotImageOutput - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - */ -Result LoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size); - -/** - * @brief Unmounts the specified AlbumStorage. - * @param[in] storage \ref CapsAlbumStorage - */ -Result ForceAlbumUnmounted(CapsAlbumStorage storage); - -/** - * @brief Resets mount status for the specified AlbumStorage. - * @note Mounts the Storage if available. - * @param[in] storage \ref CapsAlbumStorage - */ -Result ResetAlbumMountStatus(CapsAlbumStorage storage); - -/** - * @brief Refreshs Album Cache for the specified AlbumStorage. - * @param[in] storage \ref CapsAlbumStorage - */ -Result RefreshAlbumCache(CapsAlbumStorage storage); - -/** - * @brief Gets the AlbumCache of the specified AlbumStorage. - * @note Stubbed on [4.0.0+]. - * @note use \ref capsaGetAlbumCacheEx instead. - * @param[in] storage \ref CapsAlbumStorage - * @param[out] cache \ref CapsAlbumCache - */ -Result GetAlbumCache(CapsAlbumStorage storage, CapsAlbumCache *cache); - -/** - * @brief Gets the AlbumCache for the specified type of the specified AlbumStorage. - * @param[in] storage \ref CapsAlbumStorage - * @param[in] contents \ref CapsAlbumFileContents - * @param[out] cache \ref CapsAlbumCache - */ -Result GetAlbumCacheEx(CapsAlbumStorage storage, CapsAlbumFileContents contents, CapsAlbumCache *cache); - -/** - * @brief Load an \ref CapsAlbumEntry from a \ref CapsApplicationAlbumEntry and an AppletResourceUserId. - * @note Only available on [2.0.0+]. - * @param[out] entry \ref CapsAlbumEntry - * @param[in] application_entry \ref CapsApplicationAlbumEntry - */ -Result GetAlbumEntryFromApplicationAlbumEntryAruid(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry); - -/** - * @brief Opens an AlbumMovieStream. - * @note This opens IAlbumAccessorSession if not previously opened, it's closed during \ref capsaExit. - * @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId. - * @note Only available on [4.0.0+]. - * @param[out] stream Stream handle. - * @param[in] entry \ref CapsAlbumFileId - */ -Result OpenAlbumMovieStream(u64 *stream, const CapsAlbumFileId *file_id); - -/** - * @brief Closes an AlbumMovieStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result CloseAlbumMovieStream(u64 stream); - -/** - * @brief Gets the data size of an AlbumMovieStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] size Size of the actual MP4, without the JPEG at the end. - */ -Result GetAlbumMovieStreamSize(u64 stream, u64 *size); - -/** - * @brief Reads data from an AlbumMovieStream. - * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. - * @note When offset(+size) goes beyond the size from \ref capsaGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[out] Output data buffer. - * @param[in] size Data buffer size. - * @param[out] actual_size Actual read size. - */ -Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size); - -/** - * @brief Gets the BrokenReason for an AlbumMovieStream. - * @note Official sw doesn't use this. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result GetAlbumMovieReadStreamBrokenReason(u64 stream); - -/** - * @brief Gets the data size of an Image taken from an AlbumMovieStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] size Expected size of an Image. - */ -Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size); - -/** - * @brief Reads data of an Image taken from an AlbumMovieStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[out] Output data buffer. - * @param[in] size Data buffer size. - * @param[out] actual_size Actual read size. - */ -Result ReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size); - -/** - * @brief Gets the file attribute of an AlbumMovieStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] attr \ref CapsScreenShotAttribute - */ -Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attr); - -} // namespace capsa - -/// @brief C++ wrappers for the `capsc` API. -/// @details Wraps: switch/services/capsc.h. -namespace capsc { - -using ::CapsApplicationId; - -/// Initialize caps:c -Result Initialize(void); - -/// Exit caps:c. -void Exit(void); - -/// Gets the Service for caps:c. -Service* GetServiceSession(void); - -/** - * @brief Notify the service that a storage is now available. - * @note This will result in capsrv mounting the image directory on that storage medium. - * @param[in] storage \ref CapsAlbumStorage - */ -Result NotifyAlbumStorageIsAvailable(CapsAlbumStorage storage); - -/** - * @brief Notify the service that a storage is now unavailable. - * @note This will result in capsrv unmounting the image directory on that storage medium. - * @param[in] storage \ref CapsAlbumStorage - */ -Result NotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage); - -/** - * @brief Register an applet for later usage. - * @note Called at application launch by the system. - * @note Will generate a random AES-256 key for this application for use on Shim-Version 0. - * @note Only available on [2.0.0+]. - * @param[in] appletResourceUserId AppletResourceUserId. - * @param[in] application_id ApplicationId. - */ -Result RegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id); - -/** - * @brief Unregister an applet. - * @note Called at application exit by the system. - * @note Only available on [2.0.0+]. - * @param[in] appletResourceUserId AppletResourceUserId. - * @param[in] application_id ApplicationId. - */ -Result UnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id); - -/** - * @brief Get an ApplicationId that corresponds to an AppletResourceUserId. - * @note Returns value set by \ref capscRegisterAppletResourceUserId. - * @note Only available on [2.0.0+]. - * @param[out] application_id ApplicationId. - * @param[in] appletResourceUserId AppletResourceUserId. - */ -Result GetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid); - -/** - * @brief Checks whether an ApplicationId is registered. - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - */ -Result CheckApplicationIdRegistered(u64 application_id); - -/** - * @brief Generate an AlbumFileId based on parameters and current time. - * @param[in] application_id ApplicationId. - * @note Only available on [2.0.0+]. - * @param[in] contents \ref CapsAlbumFileContents - * @param[out] file_id \ref CapsAlbumFileId - */ -Result GenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id); - -/** - * @brief Generate an ApplicationAlbumEntry based on parameters. - * @note Output will be different between Shim Version 0 and 1. - * @note Only available on [2.0.0+]. - * @param[out] appEntry \ref CapsApplicationAlbumEntry - * @param[in] entry \ref CapsAlbumEntry - * @param[in] application_id ApplicationId. - */ -Result GenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id); - -/** - * @brief Save a jpeg image. - * @note Only available on [2.0.0-3.0.2]. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] buffer JPEG image buffer. - * @param[in] buffer_size Size of the JPEG image. - */ -Result SaveAlbumScreenShotFile(const CapsAlbumFileId *file_id, const void* buffer, u64 buffer_size); - -/** - * @brief Save a jpeg image. - * @note Only available on [4.0.0+]. - * @note Version 3 as of [9.1.0]. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] version Revision number. - * @param[in] makernote_offset Offset to makernote in JPEG buffer. - * @param[in] makernote_size Size of the makernote in JPEG buffer. - * @param[in] buffer JPEG image buffer. - * @param[in] buffer_size Size of the JPEG image. - */ -Result SaveAlbumScreenShotFileEx(const CapsAlbumFileId *file_id, u64 version, u64 makernote_offset, u64 makernote_size, const void* buffer, u64 buffer_size); - -/** - * @brief Sets thumbnail data for the last taken screenshot. - * @note 96×54 Image will get saved. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] image RGBA8 image buffer. - * @param[in] image_size size of the RGBA8 image buffer. - */ -Result SetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size); - -/** - * @brief Sets thumbnail data for the last recorded movie. - * @note Only availabe on [4.0.0+]. - * @note 96×54 Image will get saved. - * @param[in] file_id \ref CapsAlbumFileId - * @param[in] image RGBA8 image buffer. - * @param[in] image_size size of the RGBA8 image buffer. - */ -Result SetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size); - -/** - * @brief Opens an AlbumMovieReadStream. - * @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capscExit. - * @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsAlbumFileId. - * @note Only available on [4.0.0+]. - * @param[out] stream Stream handle. - * @param[in] entry \ref CapsAlbumFileId - */ -Result OpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id); - -/** - * @brief Closes an AlbumMovieReadStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result CloseAlbumMovieStream(u64 stream); - -/** - * @brief Gets the data size of an AlbumMovieReadStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] size Size of the actual MP4, without the JPEG at the end. - */ -Result GetAlbumMovieStreamSize(u64 stream, u64 *size); - -/** - * @brief Reads data from an AlbumMovieReadStream. - * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. - * @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[out] Output data buffer. - * @param[in] size Data buffer size. - * @param[out] actual_size Actual read size. - */ -Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size); - -/** - * @brief Gets the BrokenReason for an AlbumMovieReadStream. - * @note Official sw doesn't use this. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result GetAlbumMovieReadStreamBrokenReason(u64 stream); - -/** - * @brief Gets the data size of an Image taken from an AlbumMovieReadStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] size Expected size of an Image. - */ -Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size); - -/** - * @brief Reads data of an Image taken from an AlbumMovieReadStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[out] buffer Output data buffer. - * @param[in] size Data buffer size. - * @param[out] actual_size Actual read size. - */ -Result ReadImageDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size); - -/** - * @brief Gets the file attribute of an AlbumMovieReadStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] attr \ref CapsScreenShotAttribute - */ -Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute); - -/** - * @brief Opens an AlbumMovieWriteStream. - * @note This opens IAlbumControlSession if not previously opened, it's closed during \ref capsaExit. - * @note Up to 2 streams can be open at the same time. - * @note Only available on [4.0.0+]. - * @param[out] stream Stream handle. - * @param[in] entry \ref CapsAlbumFileId - */ -Result OpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id); - -/** - * @brief Finish write to AlbumMovieWriteStream. - * @note Copies file from save to destination storage and deletes the temporary file. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result FinishAlbumMovieWriteStream(u64 stream); - -/** - * @brief Closes a finished AlbumMovieWriteStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result CommitAlbumMovieWriteStream(u64 stream); - -/** - * @brief Closes an AlbumMovieWriteStream in any state. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result DiscardAlbumMovieWriteStream(u64 stream); - -/** - * @brief Closes an AlbumMovieWriteStream in any state without deleting the temporary file. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result DiscardAlbumMovieWriteStreamNoDelete(u64 stream); - -/** - * @brief Closes a finished AlbumMovieWriteStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] entry \ref CapsAlbumEntry - */ -Result CommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry); - -/** - * @brief Start AlbumMovieWriteStream data section. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result StartAlbumMovieWriteStreamDataSection(u64 stream); - -/** - * @brief End AlbumMovieWriteStream data section. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result EndAlbumMovieWriteStreamDataSection(u64 stream); - -/** - * @brief Start AlbumMovieWriteStream meta section. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result StartAlbumMovieWriteStreamMetaSection(u64 stream); - -/** - * @brief End AlbumMovieWriteStream meta section. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result EndAlbumMovieWriteStreamMetaSection(u64 stream); - -/** - * @brief Reads data from an AlbumMovieWriteStream. - * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. - * @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[out] buffer Output data buffer. - * @param[in] size Data buffer size. - * @param[out] actual_size Actual read size. - */ -Result ReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size); - -/** - * @brief Write data to an AlbumMovieWriteStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[in] buffer Input data buffer. - * @param[in] size Data buffer size. - */ -Result WriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size); - -/** - * @brief Write meta data to an AlbumMovieWriteStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[in] buffer Input data buffer. - * @param[in] size Data buffer size. - */ -Result WriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size); - -/** - * @brief Gets the BrokenReason for an AlbumMovieWriteStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - */ -Result GetAlbumMovieWriteStreamBrokenReason(u64 stream); - -/** - * @brief Gets the data size of an AlbumMovieWriteStream. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] size Size of the data section. - */ -Result GetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size); - -/** - * @brief Sets the data size of an AlbumMovieWriteStream. - * @note Must not be bigger than 2GiB. - * @note Only available on [4.0.0+]. - * @param[in] stream Stream handle. - * @param[out] size Size of the data section. - */ -Result SetAlbumMovieWriteStreamDataSize(u64 stream, u64 size); - -} // namespace capsc - -/// @brief C++ wrappers for the `capsdc` API. -/// @details Wraps: switch/services/capsdc.h. -namespace capsdc { - -/// Initialize caps:dc -Result Initialize(void); - -/// Exit caps:dc. -void Exit(void); - -/// Gets the Service for caps:dc. -Service* GetServiceSession(void); - -/** - * @brief Decodes a jpeg buffer into RGBX. - * @param[in] width Image width. - * @param[in] height Image height. - * @param[in] opts \ref CapsScreenShotDecodeOption. - * @param[in] jpeg Jpeg image input buffer. - * @param[in] jpeg_size Input image buffer size. - * @param[out] out_image RGBA8 image output buffer. - * @param[in] out_image_size Output image buffer size, should be at least large enough for RGBA8 width x height. - */ -Result DecodeJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_image, size_t out_image_size); - -/** - * @brief Shrinks a jpeg's dimensions by 2. - * @note Tries to compress with jpeg quality in this order: 98, 95, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0. - * @note Only available on [17.0.0+]. - * @param[in] width Input image width. - * @param[in] height Input image width. - * @param[in] opts \ref CapsScreenShotDecodeOption. - * @param[in] jpeg Jpeg image input buffer. - * @param[in] jpeg_size Input image buffer size. - * @param[out] out_jpeg Jpeg image output buffer - * @param[in] out_jpeg_size Output image buffer size. - * @param[out] out_result_size size of the resulting JPEG. - */ -Result ShrinkJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size); - -/** - * @brief Shrinks a jpeg. - * @note Fails if the scaled size is larger than the original or the output buffer isn't large enough. - * @note Only available on [19.0.0+]. - * @param[in] scaled_width Wanted image width. - * @param[in] scaled_height Wanted image width. - * @param[in] jpeg_quality has to be in range 0-100. - * @param[in] opts \ref CapsScreenShotDecodeOption. - * @param[in] jpeg Jpeg image input buffer. - * @param[in] jpeg_size Input image buffer size. - * @param[out] out_jpeg Jpeg image output buffer - * @param[in] out_jpeg_size Output image buffer size. - * @param[out] out_result_size size of the resulting jpeg. - */ -Result ShrinkJpegEx(u32 scaled_width, u32 scaled_height, u32 jpeg_quality, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size); - -} // namespace capsdc - -/// @brief C++ wrappers for the `capssc` API. -/// @details Wraps: switch/services/capssc.h. -namespace capssc { - -/// Initialize caps:sc. Only available on [2.0.0+]. -Result Initialize(void); - -/// Exit caps:sc. -void Exit(void); - -/// Gets the Service for caps:sc. -Service* GetServiceSession(void); - -/** - * @brief This takes a screenshot, with the screenshot being written into the output buffer. - * @note Not available with [5.0.0+] (stubbed). - * @note buffer_index and buffer_count correspond to buffers with size 0x384000(1280*720*4). These must not be negative. - * @param buf Output buffer containing the RGBA8 image. - * @param size Size of buf, should be 0x384000(1280*720*4) * buffer_count. - * @param layer_stack \ref ViLayerStack - * @param width Image width, must be 1280. - * @param height Image height, must be 720. - * @param buffer_count Total number of output image buffers. - * @param buffer_index Starting image buffer index. Must be < buffer_count. - * @param timeout Timeout in nanoseconds. A default value of 100000000 can be used. - */ -Result CaptureRawImageWithTimeout(void* buf, size_t size, ViLayerStack layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, s64 timeout); - -/** - * @brief This takes a raw screenshot, with the screenshot being held until \ref capsscCloseRawScreenShotReadStream is called. - * @note Only available on [3.0.0+]. Requires debug mode. - * @param out_size Pointer to write the size of the captured raw image to. Always 0x384000(1280*720*4). - * @param out_width Pointer to write the width of the captured raw image to. Always 1280. - * @param out_height Pointer to write the height of the captured raw image to. Always 720. - * @param layer_stack \ref ViLayerStack - * @param timeout Timeout in nanoseconds. - */ -Result OpenRawScreenShotReadStream(u64 *out_size, u64 *out_width, u64 *out_height, ViLayerStack layer_stack, s64 timeout); - -/** - * @brief Discards a stream opened by \ref capsscOpenRawScreenShotReadStream. - * @note Only available on [3.0.0+]. Requires debug mode. - */ -Result CloseRawScreenShotReadStream(void); - -/** - * @brief Reads from a stream opened by \ref capsscOpenRawScreenShotReadStream. - * @note Only available on [3.0.0+]. Requires debug mode. - * @param bytes_read Pointer to write the amounts of bytes written to buffer. - * @param buf Output buffer containing the RGBA8 image. - * @param size Size of buf. - * @param offset Offset in image where read should start. - */ -Result ReadRawScreenShotReadStream(u64 *bytes_read, void* buf, size_t size, u64 offset); - -/** - * @brief This takes a screenshot, with the screenshot being written as jpeg into the output buffer. - * @note Only available on [9.0.0+]. Requires debug mode before [10.0.0]. - * @param out_jpeg_size Pointer to write the size of the captured jpeg to. - * @param jpeg_buf Output buffer containing the JPEG image. - * @param jpeg_buf_size Size of jpeg_buf, official software uses 0x80000. - * @param layer_stack \ref ViLayerStack - * @param timeout Timeout in nanoseconds. - */ -Result CaptureJpegScreenShot(u64* out_jpeg_size, void* jpeg_buf, size_t jpeg_buf_size, ViLayerStack layer_stack, s64 timeout); - -} // namespace capssc - -/// @brief C++ wrappers for the `capssu` API. -/// @details Wraps: switch/services/capssu.h. -namespace capssu { - -/// Initialize caps:su. Only available on [4.0.0+]. -Result Initialize(void); - -/// Exit caps:su. -void Exit(void); - -/// Gets the Service for caps:su. -Service* GetServiceSession(void); - -/** - * @brief This is a wrapper for \ref capssuSaveScreenShotEx0. - * @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1. - * @param[in] buffer RGBA8 1280x720 image buffer. - * @param[in] size Size of the buffer. - * @param[in] reportoption \ref AlbumReportOption - * @param[in] orientation \ref AlbumImageOrientation - * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. - */ -Result SaveScreenShot(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, CapsApplicationAlbumEntry *out); - -/** - * @brief Similar to \ref capssuSaveScreenShot, except this is a wrapper for \ref capssuSaveScreenShotEx1. - * @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1. - * @note Only available on [8.0.0+]. - * @param[in] buffer RGBA8 1280x720 image data buffer. - * @param[in] size Size of the buffer. - * @param[in] reportoption \ref AlbumReportOption - * @param[in] orientation \ref AlbumImageOrientation - * @param[in] userdata Input UserData buffer. If NULL, the \ref CapsApplicationData will be empty. - * @param[in] userdata_size Input UserData size, must be within bounds for CapsApplicationData::userdata. If 0, the \ref CapsApplicationData will be empty. - * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. - */ -Result SaveScreenShotWithUserData(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const void* userdata, size_t userdata_size, CapsApplicationAlbumEntry *out); - -/** - * @brief Similar to \ref capssuSaveScreenShot, except this is a wrapper for \ref capssuSaveScreenShotEx2. - * @note This uses an all-zero \ref CapsScreenShotAttribute with orientation = input orientation, and unk_xc = 1. - * @note Only available on [6.0.0+]. - * @param[in] buffer RGBA8 1280x720 image data buffer. - * @param[in] size Size of the buffer. - * @param[in] reportoption \ref AlbumReportOption - * @param[in] orientation \ref AlbumImageOrientation - * @param[in] uids Input array of \ref AccountUid. If NULL, the \ref CapsUserIdList will be empty. - * @param[in] uid_count Size of the uids array in entries, must be within bounds for CapsUserIdList::uids. If 0, the \ref CapsUserIdList will be empty. - * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. - */ -Result SaveScreenShotWithUserIds(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const AccountUid* uids, size_t uid_count, CapsApplicationAlbumEntry *out); - -/** - * @brief Saves an Album screenshot using the specified gfx data in the buffer, with the specified \ref CapsScreenShotAttribute. - * @param[in] buffer RGBA8 1280x720 image data buffer. - * @param[in] size Size of the buffer, must be at least 0x384000. - * @param[in] attr \ref CapsScreenShotAttribute - * @param[in] reportoption \ref AlbumReportOption - * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. - */ -Result SaveScreenShotEx0(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationAlbumEntry *out); - -/** - * @brief Same as \ref capssuSaveScreenShotEx0, except this allows specifying the \ref CapsApplicationData. - * @note Only available on [8.0.0+]. - * @param[in] buffer RGBA8 1280x720 image data buffer. - * @param[in] size Size of the buffer, must be at least 0x384000. - * @param[in] attr \ref CapsScreenShotAttribute - * @param[in] reportoption \ref AlbumReportOption - * @param[in] appdata \ref CapsApplicationData - * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. - */ -Result SaveScreenShotEx1(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationData *appdata, CapsApplicationAlbumEntry *out); - -/** - * @brief Same as \ref capssuSaveScreenShotEx0, except this allows specifying the \ref CapsUserIdList. - * @note Only available on [6.0.0+]. - * @param[in] buffer RGBA8 1280x720 image data buffer. - * @param[in] size Size of the buffer, must be at least 0x384000. - * @param[in] attr \ref CapsScreenShotAttribute - * @param[in] reportoption \ref AlbumReportOption - * @param[in] list \ref CapsUserIdList - * @param[out] out \ref CapsApplicationAlbumEntry. Optional, can be NULL. - */ -Result SaveScreenShotEx2(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsUserIdList *list, CapsApplicationAlbumEntry *out); - -} // namespace capssu - -/// @brief C++ wrappers for the `capsu` API. -/// @details Wraps: switch/services/capsu.h. -namespace capsu { - -/// Initialize caps:u. Only available on [5.0.0+]. -Result Initialize(void); - -/// Exit caps:u. -void Exit(void); - -/// Gets the Service for caps:u. -Service* GetServiceSession(void); - -/// Gets the Service for IAlbumAccessorApplicationSession, only initialized after \ref capsuOpenAlbumMovieStream was used (unaffected by using \ref capsuCloseAlbumMovieStream). -Service* GetServiceSession_Accessor(void); - -/** - * @brief Gets a listing of \ref CapsApplicationAlbumFileEntry. - * @note On [6.0.0+] this uses GetAlbumFileList1AafeAruidDeprecated, otherwise this uses GetAlbumFileList0AafeAruidDeprecated. - * @note This is an old version of \ref capsuGetAlbumFileList3. - * @param[out] entries Output array of \ref CapsApplicationAlbumFileEntry. - * @param[in] count Max size of the output array in entries. - * @param[in] type \ref CapsContentType - * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[out] total_entries Total output entries. - */ -Result GetAlbumFileListDeprecated1(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries); - -/** - * @brief Gets a listing of \ref CapsApplicationAlbumFileEntry, where the AlbumFile has an UserId which matches the input one. See also \ref capssuSaveScreenShotWithUserIds. - * @note Only available on [6.0.0+]. - * @note This is an old version of \ref capsuGetAlbumFileList4. - * @param[out] entries Output array of \ref CapsApplicationAlbumFileEntry. - * @param[in] count Max size of the output array in entries. - * @param[in] type \ref CapsContentType - * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[in] uid \ref AccountUid - * @param[out] total_entries Total output entries. - */ -Result GetAlbumFileListDeprecated2(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries); - -/** - * @brief Gets a listing of \ref CapsApplicationAlbumEntry. - * @note Only available on [7.0.0+], on prior sysvers use \ref capsuGetAlbumFileListDeprecated1 instead. - * @param[out] entries Output array of \ref CapsApplicationAlbumEntry. - * @param[in] count Max size of the output array in entries. - * @param[in] type \ref CapsContentType - * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[out] total_entries Total output entries. - */ -Result GetAlbumFileList3(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries); - -/** - * @brief Gets a listing of \ref CapsApplicationAlbumEntry, where the AlbumFile has an UserId which matches the input one. See also \ref capssuSaveScreenShotWithUserIds. - * @note Only available on [7.0.0+], on prior sysvers use \ref capsuGetAlbumFileListDeprecated2 instead. - * @param[out] entries Output array of \ref CapsApplicationAlbumEntry. - * @param[in] count Max size of the output array in entries. - * @param[in] type \ref CapsContentType - * @param[in] start_datetime Start \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[in] end_datetime End \ref CapsAlbumFileDateTime, when NULL the default is used. - * @param[in] uid \ref AccountUid - * @param[out] total_entries Total output entries. - */ -Result GetAlbumFileList4(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries); - -/** - * @brief Deletes the specified AlbumFile. - * @param[in] type \ref CapsContentType, must match ::CapsContentType_ExtraMovie. - * @param[in] entry \ref CapsApplicationAlbumFileEntry - */ -Result DeleteAlbumFile(CapsContentType type, const CapsApplicationAlbumFileEntry *entry); - -/** - * @brief Gets the filesize for the entire specified AlbumFile. - * @param[in] entry \ref CapsApplicationAlbumFileEntry - * @param[out] size Output filesize. - */ -Result GetAlbumFileSize(const CapsApplicationAlbumFileEntry *entry, u64 *size); - -/** - * @brief Load the ScreenShotImage for the specified AlbumFile. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[out] attr \ref CapsScreenShotAttributeForApplication - * @param[out] userdata Output buffer containing the UserData. Optional, can be NULL. This buffer is cleared to 0 using userdata_maxsize, prior to doing the memcpy. - * @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0. - * @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed. - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 1280x720. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - * @param[in] entry \ref CapsApplicationAlbumFileEntry - * @param[in] option \ref CapsScreenShotDecodeOption - */ -Result LoadAlbumScreenShotImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option); - -/** - * @brief Load the ScreenShotThumbnailImage for the specified AlbumFile. - * @param[out] width Output image width. Optional, can be NULL. - * @param[out] height Output image height. Optional, can be NULL. - * @param[out] attr \ref CapsScreenShotAttributeForApplication - * @param[out] userdata Output buffer containing the UserData. Optional, can be NULL. This buffer is cleared to 0 using userdata_maxsize, prior to doing the memcpy. - * @param[in] userdata_maxsize Max size of the userdata buffer. Optional, can be 0. - * @param[out] userdata_size Userdata size field, clamped to max size sizeof(CapsApplicationData::userdata) when needed. - * @param[out] image RGBA8 image output buffer. - * @param[in] image_size Image buffer size, should be at least large enough for RGBA8 320x180. - * @param[out] workbuf Work buffer, cleared to 0 by the cmd before it returns. - * @param[in] workbuf_size Work buffer size, must be at least the size of the JPEG within the AlbumFile. - * @param[in] entry \ref CapsApplicationAlbumFileEntry - * @param[in] option \ref CapsScreenShotDecodeOption - */ -Result LoadAlbumScreenShotThumbnailImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option); - -/** - * @brief PrecheckToCreateContents. Official sw only uses this with ::CapsContentType_ExtraMovie. - * @param[in] type \ref CapsContentType - * @param[in] unk Unknown. - */ -Result PrecheckToCreateContents(CapsContentType type, u64 unk); - -/** - * @brief Opens an AlbumMovieStream. - * @note This opens IAlbumAccessorApplicationSession if not previously opened, it's closed during \ref capsuExit. - * @note Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same \ref CapsApplicationAlbumFileEntry. - * @param[out] stream Stream handle. - * @param[in] entry \ref CapsApplicationAlbumFileEntry - */ -Result OpenAlbumMovieStream(u64 *stream, const CapsApplicationAlbumFileEntry *entry); - -/** - * @brief Closes an AlbumMovieStream. - * @param[in] stream Stream handle. - */ -Result CloseAlbumMovieStream(u64 stream); - -/** - * @brief Gets the data size of an AlbumMovieStream. - * @param[in] stream Stream handle. - * @param[out] size Size of the actual MP4, without the JPEG at the end. - */ -Result GetAlbumMovieStreamSize(u64 stream, u64 *size); - -/** - * @brief Reads data from an AlbumMovieStream. - * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. - * @note When offset(+size) goes beyond the size from \ref capsuGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. - * @param[in] stream Stream handle. - * @param[in] offset Offset. - * @param[out] Output data buffer. - * @param[in] size Data buffer size. - * @param[out] actual_size Actual read size. - */ -Result ReadAlbumMovieStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size); - -/** - * @brief Gets the BrokenReason for an AlbumMovieStream. - * @note Official sw doesn't use this. - * @param[in] stream Stream handle. - */ -Result GetAlbumMovieStreamBrokenReason(u64 stream); - -} // namespace capsu - -/// @brief C++ wrappers for the `clkrst` API. -/// @details Wraps: switch/services/clkrst.h. -namespace clkrst { - -using ::ClkrstSession; - -/// Initialize clkrst. Only available on [8.0.0+]. -Result Initialize(void); - -/// Exit clkrst. -void Exit(void); - -/// Gets the Service object for the actual clkrst service session. -Service* GetServiceSession(void); - -/// Opens a ClkrstSession for the requested PcvModuleId, unk is set to 3 in official sysmodules. -Result OpenSession(ClkrstSession* session_out, PcvModuleId module_id, u32 unk); - -void CloseSession(ClkrstSession* session); - -Result SetClockRate(ClkrstSession* session, u32 hz); - -Result GetClockRate(ClkrstSession* session, u32 *out_hz); - -// Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz); - -Result GetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count); - -// Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count); - -} // namespace clkrst - -/// @brief C++ wrappers for the `cmac` API. -/// @details Wraps: switch/crypto/cmac.h. -namespace cmac { - -/// Context for AES-128 CMAC. -using ::Aes128CmacContext; -/// Context for AES-192 CMAC. -using ::Aes192CmacContext; -/// Context for AES-256 CMAC. -using ::Aes256CmacContext; - -/// Initialize an AES-128-CMAC context. -void Aes128ContextCreate(Aes128CmacContext *out, const void *key); - -/// Updates AES-128-CMAC context with data to hash -void Aes128ContextUpdate(Aes128CmacContext *ctx, const void *src, size_t size); - -/// Gets the context's output mac, finalizes the context. -void Aes128ContextGetMac(Aes128CmacContext *ctx, void *dst); - -/// Simple all-in-one AES-128-CMAC calculator. -void Aes128CalculateMac(void *dst, const void *key, const void *src, size_t size); - -/// Initialize an AES-192-CMAC context. -void Aes192ContextCreate(Aes192CmacContext *out, const void *key); - -/// Updates AES-192-CMAC context with data to hash -void Aes192ContextUpdate(Aes192CmacContext *ctx, const void *src, size_t size); - -/// Gets the context's output mac, finalizes the context. -void Aes192ContextGetMac(Aes192CmacContext *ctx, void *dst); - -/// Simple all-in-one AES-192-CMAC calculator. -void Aes192CalculateMac(void *dst, const void *key, const void *src, size_t size); - -/// Initialize an AES-256-CMAC context. -void Aes256ContextCreate(Aes256CmacContext *out, const void *key); - -/// Updates AES-256-CMAC context with data to hash -void Aes256ContextUpdate(Aes256CmacContext *ctx, const void *src, size_t size); - -/// Gets the context's output mac, finalizes the context. -void Aes256ContextGetMac(Aes256CmacContext *ctx, void *dst); - -/// Simple all-in-one AES-256-CMAC calculator. -void Aes256CalculateMac(void *dst, const void *key, const void *src, size_t size); - -} // namespace cmac - -/// @brief C++ wrappers for the `cmif` API. -/// @details Wraps: switch/sf/cmif.h. -namespace cmif { - -using ::CmifCommandType; -using ::CmifDomainInHeader; -using ::CmifDomainOutHeader; -using ::CmifDomainRequestType; -using ::CmifInHeader; -using ::CmifOutHeader; -using ::CmifRequest; -using ::CmifRequestFormat; -using ::CmifResponse; - -void* GetAlignedDataStart(u32* data_words, void* base); - -CmifRequest MakeRequest(void* base, CmifRequestFormat fmt); - -void* MakeControlRequest(void* base, u32 request_id, u32 size); - -void MakeCloseRequest(void* base, u32 object_id); - -void RequestInBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode); - -void RequestOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode); - -void RequestInOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode); - -void RequestInPointer(CmifRequest* req, const void* buffer, size_t size); - -void RequestOutFixedPointer(CmifRequest* req, void* buffer, size_t size); - -void RequestOutPointer(CmifRequest* req, void* buffer, size_t size); - -void RequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode); - -void RequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode); - -void RequestObject(CmifRequest* req, u32 object_id); - -void RequestHandle(CmifRequest* req, Handle handle); - -Result ParseResponse(CmifResponse* res, void* base, bool is_domain, u32 size); - -u32 ResponseGetObject(CmifResponse* res); - -Handle ResponseGetCopyHandle(CmifResponse* res); - -Handle ResponseGetMoveHandle(CmifResponse* res); - -Result ConvertCurrentObjectToDomain(Handle h, u32* out_object_id); - -Result CopyFromCurrentDomain(Handle h, u32 object_id, Handle* out_h); - -Result CloneCurrentObject(Handle h, Handle* out_h); - -Result QueryPointerBufferSize(Handle h, u16* out_size); - -Result CloneCurrentObjectEx(Handle h, u32 tag, Handle* out_h); - -} // namespace cmif - -/// @brief C++ wrappers for the `condvar` API. -/// @details Wraps: switch/kernel/condvar.h. -namespace condvar { - -/// Condition variable. -using ::CondVar; - -/** - * @brief Initializes a condition variable. - * @param[in] c Condition variable object. - */ -void Init(CondVar* c); - -/** - * @brief Waits on a condition variable with a timeout. - * @param[in] c Condition variable object. - * @param[in] m Mutex object to use inside the condition variable. - * @param[in] timeout Timeout in nanoseconds. - * @return Result code (0xEA01 on timeout). - * @remark On function return, the underlying mutex is acquired. - */ -Result WaitTimeout(CondVar* c, Mutex* m, u64 timeout); - -/** - * @brief Waits on a condition variable. - * @param[in] c Condition variable object. - * @param[in] m Mutex object to use inside the condition variable. - * @return Result code. - * @remark On function return, the underlying mutex is acquired. - */ -Result Wait(CondVar* c, Mutex* m); - -/** - * @brief Wakes up up to the specified number of threads waiting on a condition variable. - * @param[in] c Condition variable object. - * @param[in] num Maximum number of threads to wake up (or -1 to wake them all up). - * @return Result code. - */ -Result Wake(CondVar* c, int num); - -/** - * @brief Wakes up a single thread waiting on a condition variable. - * @param[in] c Condition variable object. - * @return Result code. - */ -Result WakeOne(CondVar* c); - -/** - * @brief Wakes up all thread waiting on a condition variable. - * @param[in] c Condition variable object. - * @return Result code. - */ -Result WakeAll(CondVar* c); - -} // namespace condvar - -/// @brief C++ wrappers for the `console` API. -/// @details Wraps: switch/runtime/devices/console.h. -namespace console { - -/// A font struct for the console. -using ::ConsoleFont; -/// Renderer interface for the console. -using ::ConsoleRenderer; -/// Console debug devices supported by libnx. -using ::debugDevice; -using ::PrintConsole; - -/** - * @brief Loads the font into the console. - * @param console Pointer to the console to update, if NULL it will update the current console. - * @param font The font to load. - */ -void SetFont(PrintConsole* console, ConsoleFont* font); - -/** - * @brief Sets the print window. - * @param console Console to set, if NULL it will set the current console window. - * @param x X location of the window. - * @param y Y location of the window. - * @param width Width of the window. - * @param height Height of the window. - */ -void SetWindow(PrintConsole* console, int x, int y, int width, int height); - -/** - * @brief Gets a pointer to the console with the default values. - * This should only be used when using a single console or without changing the console that is returned, otherwise use consoleInit(). - * @return A pointer to the console with the default values. - */ -PrintConsole* GetDefault(void); - -/** - * @brief Make the specified console the render target. - * @param console A pointer to the console struct (must have been initialized with consoleInit(PrintConsole* console)). - * @return A pointer to the previous console. - */ -PrintConsole * Select(PrintConsole* console); - -/** - * @brief Initialise the console. - * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). - * @return A pointer to the current console. - */ -PrintConsole* Init(PrintConsole* console); - -/** - * @brief Deinitialise the console. - * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). - */ -void Exit(PrintConsole* console); - -/** - * @brief Updates the console, submitting a new frame to the display. - * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). - * @remark This function should be called periodically. Failure to call this function will result in lack of screen updating. - */ -void Update(PrintConsole* console); - -/** - * @brief Initializes debug console output on stderr to the specified device. - * @param device The debug device (or devices) to output debug print statements to. - */ -void DebugInit(debugDevice device); - -/// Clears the screan by using printf("\x1b[2J"); -void Clear(void); - -} // namespace console - -/// @brief C++ wrappers for the `crc32` API. -/// @details Wraps: switch/crypto/crc.h. -namespace crc32 { - -/// Calculate a CRC32 over data using a seed. -/// Can be used to calculate a CRC32 in chunks using an initial seed of zero for the first chunk. -u32 CalculateWithSeed(u32 seed, const void *src, size_t size); - -/// Calculate a CRC32 over data. -u32 Calculate(const void *src, size_t size); - -} // namespace crc32 - -/// @brief C++ wrappers for the `crc32c` API. -/// @details Wraps: switch/crypto/crc.h. -namespace crc32c { - -/// Calculate a CRC32C over data using a seed. -/// Can be used to calculate a CRC32C in chunks using an initial seed of zero for the first chunk. -u32 CalculateWithSeed(u32 seed, const void *src, size_t size); - -/// Calculate a CRC32C over data. -u32 Calculate(const void *src, size_t size); - -} // namespace crc32c - -/// @brief C++ wrappers for the `csrng` API. -/// @details Wraps: switch/services/csrng.h. -namespace csrng { - -/// Initialize csrng. -Result Initialize(void); - -/// Exit csrng. -void Exit(void); - -/// Gets the Service object for the actual csrng service session. -Service* GetServiceSession(void); - -Result GetRandomBytes(void *out, size_t out_size); - -} // namespace csrng - -/// @brief C++ wrappers for the `detect` API. -/// @details Wraps: switch/kernel/detect.h. -namespace detect { - -/// Returns true if the process has a debugger attached. -bool Debugger(void); - -/// Returns true if the underlying kernel is Mesosphère. -bool Mesosphere(void); - -} // namespace detect - -/// @brief C++ wrappers for the `diag` API. -/// @details Wraps: switch/runtime/diag.h. -namespace diag { - -/** - * @brief Aborts program execution with a result code. - * @param[in] res Result code. - */ -[[noreturn]] void AbortWithResult(Result res); - -} // namespace diag - -/// @brief C++ wrappers for the `ectxr` API. -/// @details Wraps: switch/services/ectx.h. -namespace ectxr { - -/// Initialize ectx:r. -Result Initialize(void); - -/// Exit ectx:r. -void Exit(void); - -/// Gets the Service object for the actual ectx:r service session. -Service* GetServiceSession(void); - -/** - * @brief Retrieves the error context associated with an error descriptor and result. - * @param[out] out0 Output value. - * @param[out] out_total_size Total error context size. - * @param[out] out_size Error context size. - * @param[out] dst Buffer for output error context. - * @param[in] dst_size Buffer size for output error context. - * @param[in] descriptor Error descriptor. - * @param[in] result Error result. - * @return Result code. - */ -Result PullContext(s32 *out0, u32 *out_total_size, u32 *out_size, void *dst, size_t dst_size, u32 descriptor, Result result); - -} // namespace ectxr - -/// @brief C++ wrappers for the `env` API. -/// @details Wraps: switch/runtime/env.h. -namespace env { - -/// Structure representing an entry in the homebrew environment configuration. -using ::ConfigEntry; -/// Loader return function. -using ::LoaderReturnFn; - -/** - * @brief Parses the homebrew loader environment block (internally called). - * @param ctx Reserved. - * @param main_thread Reserved. - * @param saved_lr Reserved. - */ -void Setup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr); - -/// Returns information text about the loader, if present. -const char* GetLoaderInfo(void); - -/// Returns the size of the loader information text. -u64 GetLoaderInfoSize(void); - -/// Retrieves the handle to the main thread. -Handle GetMainThreadHandle(void); - -/// Returns true if the application is running as NSO, otherwise NRO. -bool IsNso(void); - -/// Returns true if the environment has a heap override. -bool HasHeapOverride(void); - -/// Returns the address of the overriden heap. -void* GetHeapOverrideAddr(void); - -/// Returns the size of the overriden heap. -u64 GetHeapOverrideSize(void); - -/// Returns true if the environment has an argv array. -bool HasArgv(void); - -/// Returns the pointer to the argv array. -void* GetArgv(void); - -/** - * @brief Returns whether a syscall is hinted to be available. - * @param svc Syscall number to test. - * @returns true if the syscall is available. - */ -bool IsSyscallHinted(unsigned svc); - -/// Returns the handle to the running homebrew process. -Handle GetOwnProcessHandle(void); - -/// Returns the loader's return function, to be called on program exit. -LoaderReturnFn GetExitFuncPtr(void); - -/// Sets the return function to be called on program exit. -void SetExitFuncPtr(LoaderReturnFn addr); - -/** - * @brief Configures the next homebrew application to load. - * @param path Path to the next homebrew application to load (.nro). - * @param argv Argument string to pass. - */ -Result SetNextLoad(const char* path, const char* argv); - -/// Returns true if the environment supports envSetNextLoad. -bool HasNextLoad(void); - -/// Returns the Result from the last NRO. -Result GetLastLoadResult(void); - -/// Returns true if the environment provides a random seed. -bool HasRandomSeed(void); - -/** - * @brief Retrieves the random seed provided by the environment. - * @param out Pointer to a u64[2] buffer which will contain the random seed on return. - */ -void GetRandomSeed(u64 out[2]); - -/// Returns a pointer to the user id storage area (if present). -AccountUid* GetUserIdStorage(void); - -} // namespace env - -/// @brief C++ wrappers for the `error` API. -/// @details Wraps: switch/applets/error.h. -namespace error { - -/// ApplicationErrorArg -using ::ErrorApplicationArg; -/// Error application config. -using ::ErrorApplicationConfig; -/// Stores error-codes which are displayed as XXXX-XXXX, low for the former and desc for the latter. -using ::ErrorCode; -/// Common error arg data. -using ::ErrorCommonArg; -/// Common header for the start of the arg storage. -using ::ErrorCommonHeader; -/// Error context. -using ::ErrorContext; -/// Error type for ErrorContext.type -using ::ErrorContextType; -/// Error arg data for EULA. -using ::ErrorEulaArg; -/// Additional input storage data for \ref errorSystemUpdateEulaShow. -using ::ErrorEulaData; -/// Error arg data for certain errors with module PCTL. -using ::ErrorPctlArg; -/// Error arg data for Record. -using ::ErrorRecordArg; -/// ResultBacktrace -using ::ErrorResultBacktrace; -/// SystemErrorArg -using ::ErrorSystemArg; -/// Error system config. -using ::ErrorSystemConfig; -/// Error type for ErrorCommonHeader.type. -using ::ErrorType; - -/** - * @brief Creates an \ref ErrorCode. - * @param low The module portion of the error, normally this should be set to module + 2000. - * @param desc The error description. - */ -ErrorCode CodeCreate(u32 low, u32 desc); - -/** - * @brief Creates an \ref ErrorCode with the input Result. Wrapper for \ref errorCodeCreate. - * @param res Input Result. - */ -ErrorCode CodeCreateResult(Result res); - -/** - * @brief Creates an invalid \ref ErrorCode. - */ -ErrorCode CodeCreateInvalid(void); - -/** - * @brief Checks whether the input ErrorCode is valid. - * @param errorCode \ref ErrorCode - */ -bool CodeIsValid(ErrorCode errorCode); - -/** - * @brief Launches the applet for displaying the specified Result. - * @param res Result - * @param jumpFlag Jump flag, normally this is true. - * @param ctx Optional \ref ErrorContext, can be NULL. Unused when jumpFlag=false. Ignored on pre-4.0.0, since it's only available for [4.0.0+]. - * @note Sets the following fields: jumpFlag and contextFlag2. Uses ::ErrorType_Normal normally. - * @note For module=PCTL errors with desc 100-119 this sets uses ::ErrorType_Pctl, in which case the applet will display the following special dialog: "This software is restricted by Parental Controls". - * @note If the input Result is 0xC8A2, the applet will display a special dialog regarding the current application requiring a software update, with buttons "Later" and "Restart". - * @note [3.0.0+] If the input Result is 0xCAA2, the applet will display a special dialog related to DLC version. - * @warning This applet creates an error report that is logged in the system, when not handling the above special dialogs. Proceed at your own risk! - */ -Result ResultShow(Result res, bool jumpFlag, const ErrorContext* ctx); - -/** - * @brief Launches the applet for displaying the specified ErrorCode. - * @param errorCode \ref ErrorCode - * @param jumpFlag Jump flag, normally this is true. - * @param ctx Optional \ref ErrorContext, can be NULL. Unused when jumpFlag=false. Ignored on pre-4.0.0, since it's only available for [4.0.0+]. - * @note Sets the following fields: jumpFlag and contextFlag2. resultFlag=1. Uses ::ErrorType_Normal. - * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! - */ -Result CodeShow(ErrorCode errorCode, bool jumpFlag, const ErrorContext* ctx); - -/** - * @brief Creates an ErrorResultBacktrace struct. - * @param backtrace \ref ErrorResultBacktrace struct. - * @param count Total number of entries. - * @param entries Input array of Result. - */ -Result ResultBacktraceCreate(ErrorResultBacktrace* backtrace, s32 count, const Result* entries); - -/** - * @brief Launches the applet for \ref ErrorResultBacktrace. - * @param backtrace ErrorResultBacktrace struct. - * @param res Result - * @note Sets the following fields: jumpFlag=1, contextFlag=1, and uses ::ErrorType_Normal. - * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! - */ -Result ResultBacktraceShow(Result res, const ErrorResultBacktrace* backtrace); - -/** - * @brief Launches the applet for displaying the EULA. - * @param RegionCode \ref SetRegion - * @note Sets the following fields: jumpFlag=1, regionCode, and uses ::ErrorType_Eula. - */ -Result EulaShow(SetRegion RegionCode); - -/** - * @brief Launches the applet for displaying the system-update EULA. - * @param RegionCode \ref SetRegion - * @param eula EULA data. Address must be 0x1000-byte aligned. - * @note Sets the following fields: jumpFlag=1, regionCode, and uses ::ErrorType_SystemUpdateEula. - */ -Result SystemUpdateEulaShow(SetRegion RegionCode, const ErrorEulaData* eula); - -/** - * @brief Launches the applet for displaying an error full-screen, using the specified ErrorCode and timestamp. - * @param errorCode \ref ErrorCode - * @param timestamp POSIX timestamp. - * @note Sets the following fields: jumpFlag=1, errorCode, timestamp, and uses ::ErrorType_Record. - * @note The applet does not log an error report for this. error*RecordShow is used by qlaunch for displaying previously logged error reports. - */ -Result CodeRecordShow(ErrorCode errorCode, u64 timestamp); - -/** - * @brief Launches the applet for displaying an error full-screen, using the specified Result and timestamp. - * @param res Result - * @param timestamp POSIX timestamp. - * @note Wrapper for \ref errorCodeRecordShow, see \ref errorCodeRecordShow notes. - */ -Result ResultRecordShow(Result res, u64 timestamp); - -/** - * @brief Creates an ErrorSystemConfig struct. - * @param c ErrorSystemConfig struct. - * @param dialog_message UTF-8 dialog message. - * @param fullscreen_message UTF-8 fullscreen message, displayed when the user clicks on "Details". Optional, can be NULL (which disables displaying Details). - * @note Sets the following fields: {strings}, and uses ::ErrorType_System. The rest are cleared. - * @note On pre-5.0.0 this will initialize languageCode by using: setInitialize(), setMakeLanguageCode(SetLanguage_ENUS, ...), and setExit(). This is needed since an empty languageCode wasn't supported until [5.0.0+] (which would also use SetLanguage_ENUS). - * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! - */ -Result SystemCreate(ErrorSystemConfig* c, const char* dialog_message, const char* fullscreen_message); - -/** - * @brief Launches the applet with the specified config. - * @param c ErrorSystemConfig struct. - */ -Result SystemShow(ErrorSystemConfig* c); - -/** - * @brief Sets the error code. - * @param c ErrorSystemConfig struct. - * @param errorCode \ref ErrorCode - */ -void SystemSetCode(ErrorSystemConfig* c, ErrorCode errorCode); - -/** - * @brief Sets the error code, using the input Result. Wrapper for \ref errorSystemSetCode. - * @param c ErrorSystemConfig struct. - * @param res The Result to set. - */ -void SystemSetResult(ErrorSystemConfig* c, Result res); - -/** - * @brief Sets the LanguageCode. - * @param c ErrorSystemConfig struct. - * @param LanguageCode LanguageCode, see set.h. - */ -void SystemSetLanguageCode(ErrorSystemConfig* c, u64 LanguageCode); - -/** - * @brief Sets the ErrorContext. - * @note Only available on [4.0.0+], on older versions this will return without setting the context. - * @param c ErrorSystemConfig struct. - * @param ctx ErrorContext, NULL to clear it. - */ -void SystemSetContext(ErrorSystemConfig* c, const ErrorContext* ctx); - -/** - * @brief Creates an ErrorApplicationConfig struct. - * @param c ErrorApplicationConfig struct. - * @param dialog_message UTF-8 dialog message. - * @param fullscreen_message UTF-8 fullscreen message, displayed when the user clicks on "Details". Optional, can be NULL (which disables displaying Details). - * @note Sets the following fields: jumpFlag=1, {strings}, and uses ::ErrorType_Application. The rest are cleared. - * @note On pre-5.0.0 this will initialize languageCode by using: setInitialize(), setMakeLanguageCode(SetLanguage_ENUS, ...), and setExit(). This is needed since an empty languageCode wasn't supported until [5.0.0+] (which would also use SetLanguage_ENUS). - * @note With [10.0.0+] this must only be used when running under an Application, since otherwise the applet will trigger a fatalerr. - * @warning This applet creates an error report that is logged in the system. Proceed at your own risk! - */ -Result ApplicationCreate(ErrorApplicationConfig* c, const char* dialog_message, const char* fullscreen_message); - -/** - * @brief Launches the applet with the specified config. - * @param c ErrorApplicationConfig struct. - */ -Result ApplicationShow(ErrorApplicationConfig* c); - -/** - * @brief Sets the error code number. - * @param c ErrorApplicationConfig struct. - * @param errorNumber Error code number. Raw decimal error number which is displayed in the dialog. - */ -void ApplicationSetNumber(ErrorApplicationConfig* c, u32 errorNumber); - -/** - * @brief Sets the LanguageCode. - * @param c ErrorApplicationConfig struct. - * @param LanguageCode LanguageCode, see set.h. - */ -void ApplicationSetLanguageCode(ErrorApplicationConfig* c, u64 LanguageCode); - -} // namespace error - -/// @brief C++ wrappers for the `event` API. -/// @details Wraps: switch/kernel/event.h. -namespace event { - -/// Kernel-mode event structure. -using ::Event; - -/** - * @brief Creates a kernel-mode event. - * @param[out] t Pointer to \ref Event structure. - * @param[in] autoclear Autoclear flag. - * @return Result code. - * @warning This is a privileged operation; in normal circumstances applications shouldn't use this function. - */ -Result Create(Event* t, bool autoclear); - -/** - * @brief Loads a kernel-mode event obtained from IPC. - * @param[out] t Pointer to \ref Event structure. - * @param[in] handle Read-only event handle. - * @param[in] autoclear Autoclear flag. - */ -void LoadRemote(Event* t, Handle handle, bool autoclear); - -/** - * @brief Closes a kernel-mode event. - * @param[in] t Pointer to \ref Event structure. - */ -void Close(Event* t); - -/** - * @brief Returns whether an \ref Event is initialized. - * @param[in] t Pointer to \ref Event structure. - * @return Initialization status. - */ -bool Active(Event* t); - -/** - * @brief Waits on a kernel-mode event. - * @param[in] t Pointer to \ref Event structure. - * @param[in] timeout Timeout in nanoseconds (pass UINT64_MAX to wait indefinitely). - * @return Result code. - */ -Result Wait(Event* t, u64 timeout); - -/** - * @brief Signals a kernel-mode event. - * @param[in] t Pointer to \ref Event structure. - * @return Result code. - * @note This function only works for events initialized with \ref eventCreate, it doesn't work with events initialized with \ref eventLoadRemote. - * @warning This is a privileged operation; in normal circumstances applications shouldn't use this function. - */ -Result Fire(Event* t); - -/** - * @brief Clears a kernel-mode event. - * @param[in] t Pointer to \ref Event structure. - * @return Result code. - * @note This function shouldn't be used on autoclear events. - */ -Result Clear(Event* t); - -} // namespace event - -/// @brief C++ wrappers for the `fan` API. -/// @details Wraps: switch/services/fan.h. -namespace fan { - -using ::FanController; - -/// Initialize fan. -Result Initialize(void); - -/// Exit fan. -void Exit(void); - -/// Gets the Service object for the actual fan service session. -Service* GetServiceSession(void); - -/// Opens IController session. -Result OpenController(FanController *out, u32 device_code); - -/// Close IController session. -void ControllerClose(FanController *controller); - -/// @warning Disabling your fan can damage your system. -Result ControllerSetRotationSpeedLevel(FanController *controller, float level); - -Result ControllerGetRotationSpeedLevel(FanController *controller, float *level); - -} // namespace fan - -/// @brief C++ wrappers for the `fatal` API. -/// @details Wraps: switch/services/fatal.h. -namespace fatal { - -/// Struct for fatal Cpu context, 32-bit. -using ::FatalAarch32Context; -/// Struct for fatal Cpu context, 64-bit. -using ::FatalAarch64Context; -using ::FatalCpuContext; -/// Type of thrown fatal error. -using ::FatalPolicy; - -/** - * @brief Triggers a system fatal error. - * @param[in] err Result code to throw. - * @note This function does not return. - * @note This uses \ref fatalThrowWithPolicy with \ref FatalPolicy_ErrorScreen internally. - */ -[[noreturn]] void Throw(Result err); - -/** - * @brief Triggers a system fatal error with a custom \ref FatalPolicy. - * @param[in] err Result code to throw. - * @param[in] type Type of fatal error to throw. - * @note This function may not return, depending on \ref FatalPolicy. - */ -void ThrowWithPolicy(Result err, FatalPolicy type); - -/** - * @brief Triggers a system fatal error with a custom \ref FatalPolicy and \ref FatalCpuContext. - * @param[in] err Result code to throw. - * @param[in] type Type of fatal error to throw. - * @param[in] ctx Cpu context for fatal error to throw. - * @note This function may not return, depending on \ref FatalPolicy. - */ -void ThrowWithContext(Result err, FatalPolicy type, FatalCpuContext *ctx); - -} // namespace fatal - -/// @brief C++ wrappers for the `framebuffer` API. -/// @details Wraps: switch/display/framebuffer.h. -namespace framebuffer { - -/// Framebuffer structure. -using ::Framebuffer; - -/** - * @brief Creates a \ref Framebuffer object. - * @param[out] fb Output \ref Framebuffer structure. - * @param[in] win Pointer to the \ref NWindow to which the \ref Framebuffer will be registered. - * @param[in] width Desired width of the framebuffer (usually 1280). - * @param[in] height Desired height of the framebuffer (usually 720). - * @param[in] format Desired pixel format (see PIXEL_FORMAT_* enum). - * @param[in] num_fbs Number of buffers to create. Pass 1 for single-buffering, 2 for double-buffering or 3 for triple-buffering. - * @note Framebuffer images are stored in Tegra block linear format with 16Bx2 sector ordering, read TRM chapter 20.1 for more details. - * In order to use regular linear layout, consider calling \ref framebufferMakeLinear after the \ref Framebuffer object is created. - * @note Presently, only the following pixel formats are supported: - * \ref PIXEL_FORMAT_RGBA_8888 - * \ref PIXEL_FORMAT_RGBX_8888 - * \ref PIXEL_FORMAT_RGB_565 - * \ref PIXEL_FORMAT_BGRA_8888 - * \ref PIXEL_FORMAT_RGBA_4444 - */ -Result Create(Framebuffer* fb, NWindow *win, u32 width, u32 height, u32 format, u32 num_fbs); - -/// Enables linear framebuffer mode in a \ref Framebuffer, allocating a shadow buffer in the process. -Result MakeLinear(Framebuffer* fb); - -/// Closes a \ref Framebuffer object, freeing all resources associated with it. -void Close(Framebuffer* fb); - -/** - * @brief Begins rendering a frame in a \ref Framebuffer. - * @param[in] fb Pointer to \ref Framebuffer structure. - * @param[out] out_stride Output variable containing the distance in bytes between rows of pixels in memory. - * @return Pointer to buffer to which new graphics data should be written to. - * @note When this function is called, a buffer will be dequeued from the corresponding \ref NWindow. - * @note This function will return pointers to different buffers, depending on the number of buffers it was initialized with. - * @note If \ref framebufferMakeLinear was used, this function will instead return a pointer to the shadow linear buffer. - * In this case, the offset of a pixel is \p y * \p out_stride + \p x * \p bytes_per_pixel. - * @note Each call to \ref framebufferBegin must be paired with a \ref framebufferEnd call. - */ -void* Begin(Framebuffer* fb, u32* out_stride); - -/** - * @brief Finishes rendering a frame in a \ref Framebuffer. - * @param[in] fb Pointer to \ref Framebuffer structure. - * @note When this function is called, the written image data will be flushed and queued (presented) in the corresponding \ref NWindow. - * @note If \ref framebufferMakeLinear was used, this function will copy the image from the shadow linear buffer to the actual framebuffer, - * converting it in the process to the layout expected by the compositor. - * @note Each call to \ref framebufferBegin must be paired with a \ref framebufferEnd call. - */ -void End(Framebuffer* fb); - -} // namespace framebuffer - -/// @brief C++ wrappers for the `friends` API. -/// @details Wraps: switch/applets/friends_la.h, switch/services/friends.h. -namespace friends { - -/// FriendInvitationGameModeDescription -using ::FriendsFriendInvitationGameModeDescription; -/// FriendInvitationGroupId -using ::FriendsFriendInvitationGroupId; -/// FriendInvitationId -using ::FriendsFriendInvitationId; -/// InAppScreenName -using ::FriendsInAppScreenName; -/// Arg struct pushed for the applet input storage, for [9.0.0+]. -using ::FriendsLaArg; -/// Common data for the arg struct, for the pre-9.0.0 types. -/// This is only set for ::FriendsLaArgType_ShowUserDetailInfo/::FriendsLaArgType_StartSendingFriendRequest, for everything else this is cleared. -using ::FriendsLaArgCommonData; -/// Header for the arg struct. -using ::FriendsLaArgHeader; -/// Arg type values used with \ref FriendsLaArg. -using ::FriendsLaArgType; -/// Arg struct pushed for the applet input storage, for pre-9.0.0. -using ::FriendsLaArgV1; -using ::FriendsServiceType; -/// FriendsUserSetting -using ::FriendsUserSetting; - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowFriendList, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - */ -Result LaShowFriendList(AccountUid uid); - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowUserDetailInfo, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - * @param[in] id \ref AccountNetworkServiceAccountId for the user to show UserDetailInfo for. - * @param[in] first_inAppScreenName First \ref FriendsInAppScreenName. - * @param[in] second_inAppScreenName Second \ref FriendsInAppScreenName. - */ -Result LaShowUserDetailInfo(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName); - -/** - * @brief Launches the applet with ::FriendsLaArgType_StartSendingFriendRequest, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage. - * @param[in] uid \ref AccountUid - * @param[in] id \ref AccountNetworkServiceAccountId to send the friend request to. - * @param[in] first_inAppScreenName First \ref FriendsInAppScreenName. - * @param[in] second_inAppScreenName Second \ref FriendsInAppScreenName. - */ -Result LaStartSendingFriendRequest(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName); - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowMethodsOfSendingFriendRequest, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - */ -Result LaShowMethodsOfSendingFriendRequest(AccountUid uid); - -/** - * @brief Launches the applet with ::FriendsLaArgType_StartFacedFriendRequest, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - */ -Result LaStartFacedFriendRequest(AccountUid uid); - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowReceivedFriendRequestList, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - */ -Result LaShowReceivedFriendRequestList(AccountUid uid); - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowBlockedUserList, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - */ -Result LaShowBlockedUserList(AccountUid uid); - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowMyProfile, the specified input, and playStartupSound=false. - * @param[in] uid \ref AccountUid - */ -Result LaShowMyProfile(AccountUid uid); - -/** - * @brief Same as \ref friendsLaShowMyProfile except with playStartupSound=true. - * @param[in] uid \ref AccountUid - */ -Result LaShowMyProfileForHomeMenu(AccountUid uid); - -/** - * @brief Launches the applet with ::FriendsLaArgType_StartFriendInvitation, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage. - * @note Only available on [9.0.0+]. - * @param[in] uid \ref AccountUid - * @param[in] id_count \ref AccountNetworkServiceAccountId count, must be 1-15. Number of friends to invite. - * @param[in] desc \ref FriendsFriendInvitationGameModeDescription - * @param[in] userdata Arbitrary user-data. Can be NULL. - * @param[in] userdata_size User-data size, must be <=0x400. Can be 0 if userdata is NULL. - */ -Result LaStartFriendInvitation(AccountUid uid, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size); - -/** - * @brief Launches the applet with ::FriendsLaArgType_StartSendingFriendInvitation, the specified input, and playStartupSound=false. On success, this will load the output Result from the output storage. - * @note Only available on [9.0.0+]. - * @param[in] uid \ref AccountUid - * @param[in] id_list \ref AccountNetworkServiceAccountId list. - * @param[in] id_count Size of the id_list array in entries, must be 1-15. Number of friends to invite. - * @param[in] desc \ref FriendsFriendInvitationGameModeDescription - * @param[in] userdata Arbitrary user-data. Can be NULL. - * @param[in] userdata_size User-data size, must be <=0x400. Can be 0 if userdata is NULL. - */ -Result LaStartSendingFriendInvitation(AccountUid uid, const AccountNetworkServiceAccountId *id_list, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size); - -/** - * @brief Launches the applet with ::FriendsLaArgType_ShowReceivedInvitationDetail, the specified input, and playStartupSound=false. - * @note Only available on [9.0.0+]. - * @param[in] uid \ref AccountUid - * @param[in] invitation_id \ref FriendsFriendInvitationId - * @param[in] invitation_group_id \ref FriendsFriendInvitationGroupId - */ -Result LaShowReceivedInvitationDetail(AccountUid uid, FriendsFriendInvitationId invitation_id, FriendsFriendInvitationGroupId invitation_group_id); - -/// Initialize friends -Result Initialize(FriendsServiceType service_type); - -/// Exit friends -void Exit(void); - -/// Gets the Service object for the friends service session. -Service* GetServiceSession(void); - -/// Gets the Service object for the actual IFriendsService service session. -Service* GetServiceSession_IFriendsService(void); - -/** - * @brief Gets the \ref FriendsUserSetting details - * @param[in] uid \ref User AccountUid. - * @param[out] user_setting \ref FriendsUserSetting - */ -Result GetUserSetting(AccountUid uid, FriendsUserSetting *user_setting); - -/** - * @brief Gets an Event which is signaled when data is available with \ref friendsTryPopFriendInvitationNotificationInfo. - * @note This is a wrapper for \ref appletGetFriendInvitationStorageChannelEvent, see that for the usage requirements. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetFriendInvitationNotificationEvent(Event *out_event); - -/** - * @brief Uses \ref appletTryPopFromFriendInvitationStorageChannel then reads the data from there into the output params. - * @note This is a wrapper for \ref appletTryPopFromFriendInvitationStorageChannel, see that for the usage requirements. - * @param[out] uid \ref AccountUid. Optional, can be NULL. - * @param[out] buffer Output buffer. - * @param[out] size Output buffer size. - * @param[out] out_size Size of the data which was written into the output buffer. Optional, can be NULL. - */ -Result TryPopFriendInvitationNotificationInfo(AccountUid *uid, void* buffer, u64 size, u64 *out_size); - -} // namespace friends - -/// @brief C++ wrappers for the `fs` API. -/// @details Wraps: switch/services/fs.h. -namespace fs { - -/// FatFatError -using ::FatFatError; -/// FatFatReportInfo1 -using ::FatFatReportInfo1; -/// FatFatReportInfo2 -using ::FatFatReportInfo2; -/// FatFatSafeInfo -using ::FatFatSafeInfo; -/// This is nn::fssystem::ArchiveMacKey. Used by \ref setsysGetThemeKey and \ref setsysSetThemeKey. Does not appear to be in use elsewhere. -using ::FsArchiveMacKey; -/// BisPartitionId -using ::FsBisPartitionId; -/// FsContentAttributes -using ::FsContentAttributes; -using ::FsContentStorageId; -/// For use with fsFsCreateFile. -using ::FsCreateOption; -using ::FsCustomStorageId; -using ::FsDeviceOperator; -using ::FsDir; -/// Directory entry. -using ::FsDirectoryEntry; -/// Returned by fsFsGetEntryType. -using ::FsDirEntryType; -/// For use with fsFsOpenDirectory. -using ::FsDirOpenMode; -using ::FsEventNotifier; -using ::FsFile; -using ::FsFileSystem; -/// FileSystemAttribute -using ::FsFileSystemAttribute; -/// FsFileSystemProxyErrorInfo -using ::FsFileSystemProxyErrorInfo; -/// FileSystemQueryId -using ::FsFileSystemQueryId; -/// FileSystemType -using ::FsFileSystemType; -using ::FsGameCardAttribute; -/// FsGameCardErrorReportInfo -using ::FsGameCardErrorReportInfo; -using ::FsGameCardHandle; -using ::FsGameCardPartition; -using ::FsGameCardUpdatePartitionInfo; -/// ImageDirectoryId -using ::FsImageDirectoryId; -/// FsMemoryReportInfo -using ::FsMemoryReportInfo; -/// For use with fsOpenHostFileSystemWithOption -using ::FsMountHostOption; -/// For use with fsFsOpenFile. -using ::FsOpenMode; -using ::FsOperationId; -/// FsPriority -using ::FsPriority; -using ::FsRangeInfo; -/// For use with fsFileRead. -using ::FsReadOption; -using ::FsRightsId; -/// SaveDataAttribute -using ::FsSaveDataAttribute; -/// SaveDataCreationInfo -using ::FsSaveDataCreationInfo; -/// SaveDataExtraData -using ::FsSaveDataExtraData; -/// SaveDataFilter -using ::FsSaveDataFilter; -/// SaveDataFlags -using ::FsSaveDataFlags; -/// SaveDataInfo -using ::FsSaveDataInfo; -using ::FsSaveDataInfoReader; -/// SaveDataMetaInfo -using ::FsSaveDataMetaInfo; -/// SaveDataMetaType -using ::FsSaveDataMetaType; -/// SaveDataRank -using ::FsSaveDataRank; -/// SaveDataSpaceId -using ::FsSaveDataSpaceId; -/// SaveDataType -using ::FsSaveDataType; -using ::FsStorage; -/// FsStorageErrorInfo -using ::FsStorageErrorInfo; -using ::FsStorageForBatchRead; -using ::FsTimeStampRaw; -/// For use with fsFileWrite. -using ::FsWriteOption; - -/// Initialize fsp-srv. Used automatically during app startup. -Result Initialize(void); - -/// Exit fsp-srv. Used automatically during app exit. -void Exit(void); - -/// Gets the Service object for the actual fsp-srv service session. -Service* GetServiceSession(void); - -/// [5.0.0+] Configures the \ref FsPriority of all filesystem commands issued within the current thread. -void SetPriority(FsPriority prio); - -/// Mount requested filesystem type from content file -Result OpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); - -///< same as calling fsOpenFileSystemWithId with 0 as id -Result OpenDataFileSystemByCurrentProcess(FsFileSystem *out); - -Result OpenFileSystemWithPatch(FsFileSystem* out, u64 id, FsFileSystemType fsType); - -///< [2.0.0+], like OpenFileSystemWithId but without content path. -Result OpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath, FsContentAttributes attr); - -///< works on all firmwares, id is ignored on [1.0.0], attr is ignored before [16.0.0] -Result OpenDataFileSystemByProgramId(FsFileSystem *out, u64 program_id); - -///< [3.0.0+] -Result OpenBisFileSystem(FsFileSystem* out, FsBisPartitionId partitionId, const char* string); - -Result OpenBisStorage(FsStorage* out, FsBisPartitionId partitionId); - -/// Do not call this directly, see fs_dev.h. -Result OpenSdCardFileSystem(FsFileSystem* out); - -Result OpenHostFileSystem(FsFileSystem* out, const char *path); - -Result OpenHostFileSystemWithOption(FsFileSystem* out, const char *path, u32 flags); - -///< [9.0.0+] -Result DeleteSaveDataFileSystem(u64 application_id); - -Result CreateSaveDataFileSystem(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info, const FsSaveDataMetaInfo* meta); - -Result CreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info); - -Result DeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); - -///< [2.0.0+] -Result DeleteSaveDataFileSystemBySaveDataAttribute(FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute* attr); - -///< [4.0.0+] -Result IsExFatSupported(bool* out); - -Result OpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition); - -Result ExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); - -///< [3.0.0+] -Result OpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); - -Result OpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); - -Result OpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); - -///< [2.0.0+]. -Result ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID); - -Result ReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID); - -Result WriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID); - -Result OpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id); - -Result OpenSaveDataInfoReaderWithFilter(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataFilter *save_data_filter); - -///< [6.0.0+] -Result OpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id); - -Result OpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id); - -Result OpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); - -///< [7.0.0+] -Result OpenDataStorageByCurrentProcess(FsStorage* out); - -Result OpenDataStorageByProgramId(FsStorage *out, u64 program_id); - -///< [3.0.0+] -Result OpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId); - -Result OpenPatchDataStorageByCurrentProcess(FsStorage* out); - -Result OpenDataStorageByCurrentProcessForBatchRead(FsStorageForBatchRead* out); - -///< [23.0.0+] -Result OpenDataStorageByProgramIdForBatchRead(FsStorageForBatchRead* out, u64 id); - -///< [23.0.0+] -Result OpenDataStorageWithProgramIndexForBatchRead(FsStorageForBatchRead* out, u8 program_index); - -///< [23.0.0+] -Result OpenDataStorageByPathForBatchRead(FsStorageForBatchRead* out, const char* contentPath, FsContentAttributes attributes, FsFileSystemType fsType); - -///< [23.0.0+] -Result OpenDeviceOperator(FsDeviceOperator* out); - -Result OpenSdCardDetectionEventNotifier(FsEventNotifier* out); - -Result IsSignedSystemPartitionOnSdCardValid(bool *out); - -Result GetProgramId(u64* out, const char *path, FsContentAttributes attr); - -///< [17.0.0+] -/// Retrieves the rights id corresponding to the content path. Only available on [2.0.0-15.0.1]. -Result GetRightsIdByPath(const char* path, FsRightsId* out_rights_id); - -/// Retrieves the rights id and key generation corresponding to the content path. Only available on [3.0.0+], attr is ignored before [16.0.0]. -Result GetRightsIdAndKeyGenerationByPath(const char* path, FsContentAttributes attr, u8* out_key_generation, FsRightsId* out_rights_id); - -Result GetContentStorageInfoIndex(s32 *out); - -///< [19.0.0+] -Result DisableAutoSaveDataCreation(void); - -///< [1.0.0-21.2.0] -Result SetGlobalAccessLogMode(u32 mode); - -Result GetGlobalAccessLogMode(u32* out_mode); - -Result OutputAccessLogToSdCard(const char *log, size_t size); - -Result GetAndClearErrorInfo(FsFileSystemProxyErrorInfo *out); - -///< [2.0.0+] -Result GetAndClearMemoryReportInfo(FsMemoryReportInfo* out); - -///< [4.0.0+] -/// Only available on [7.0.0+]. -Result GetProgramIndexForAccessLog(u32 *out_program_index, u32 *out_program_count); - -Result Create_TemporaryStorage(u64 application_id, u64 owner_id, s64 size, u32 flags); - -Result Create_SystemSaveDataWithOwner(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid, u64 owner_id, s64 size, s64 journal_size, u32 flags); - -Result Create_SystemSaveData(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, s64 size, s64 journal_size, u32 flags); - -/// Wrapper for fsOpenSaveDataFileSystem. -/// See \ref FsSaveDataAttribute for application_id and uid. -Result Open_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid); - -/// Wrapper for fsOpenReadOnlySaveDataFileSystem. -/// Only available on [2.0.0+]. -/// See \ref FsSaveDataAttribute for application_id and uid. -Result Open_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid); - -/// Wrapper for fsOpenSaveDataFileSystem, for opening BcatSaveData. -Result Open_BcatSaveData(FsFileSystem* out, u64 application_id); - -/// Wrapper for fsOpenSaveDataFileSystem, for opening DeviceSaveData. -/// See \ref FsSaveDataAttribute for application_id. -Result Open_DeviceSaveData(FsFileSystem* out, u64 application_id); - -/// Wrapper for fsOpenSaveDataFileSystem, for opening TemporaryStorage. -/// Only available on [3.0.0+]. -Result Open_TemporaryStorage(FsFileSystem* out); - -/// Wrapper for fsOpenSaveDataFileSystem, for opening CacheStorage. -/// Only available on [3.0.0+]. -/// See \ref FsSaveDataAttribute for application_id. -Result Open_CacheStorage(FsFileSystem* out, u64 application_id, u16 save_data_index); - -/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemSaveData. -/// WARNING: You can brick when writing to SystemSaveData, if the data is corrupted etc. -Result Open_SystemSaveData(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid); - -/// Wrapper for fsOpenSaveDataFileSystemBySystemSaveDataId, for opening SystemBcatSaveData. -/// Only available on [4.0.0+]. -Result Open_SystemBcatSaveData(FsFileSystem* out, u64 system_save_data_id); - -Result FsCreateFile(FsFileSystem* fs, const char* path, s64 size, u32 option); - -Result FsDeleteFile(FsFileSystem* fs, const char* path); - -Result FsCreateDirectory(FsFileSystem* fs, const char* path); - -Result FsDeleteDirectory(FsFileSystem* fs, const char* path); - -Result FsDeleteDirectoryRecursively(FsFileSystem* fs, const char* path); - -Result FsRenameFile(FsFileSystem* fs, const char* cur_path, const char* new_path); - -Result FsRenameDirectory(FsFileSystem* fs, const char* cur_path, const char* new_path); - -Result FsGetEntryType(FsFileSystem* fs, const char* path, FsDirEntryType* out); - -Result FsOpenFile(FsFileSystem* fs, const char* path, u32 mode, FsFile* out); - -Result FsOpenDirectory(FsFileSystem* fs, const char* path, u32 mode, FsDir* out); - -Result FsCommit(FsFileSystem* fs); - -Result FsGetFreeSpace(FsFileSystem* fs, const char* path, s64* out); - -Result FsGetTotalSpace(FsFileSystem* fs, const char* path, s64* out); - -Result FsGetFileTimeStampRaw(FsFileSystem* fs, const char* path, FsTimeStampRaw *out); - -///< [3.0.0+] -Result FsCleanDirectoryRecursively(FsFileSystem* fs, const char* path); - -///< [3.0.0+] -Result FsQueryEntry(FsFileSystem* fs, void *out, size_t out_size, const void *in, size_t in_size, const char* path, FsFileSystemQueryId query_id); - -///< [4.0.0+] -Result FsGetFileSystemAttribute(FsFileSystem* fs, FsFileSystemAttribute *out); - -///< [15.0.0+] -void FsClose(FsFileSystem* fs); - -/// Uses \ref fsFsQueryEntry to set the archive bit on the specified absolute directory path. -/// This will cause HOS to treat the directory as if it were a file containing the directory's concatenated contents. -Result FsSetConcatenationFileAttribute(FsFileSystem* fs, const char *path); - -/// Wrapper for fsFsQueryEntry with FsFileSystemQueryId_IsValidSignedSystemPartitionOnSdCard. -/// Only available on [8.0.0+]. -Result FsIsValidSignedSystemPartitionOnSdCard(FsFileSystem* fs, bool *out); - -Result FileRead(FsFile* f, s64 off, void* buf, u64 read_size, u32 option, u64* bytes_read); - -Result FileWrite(FsFile* f, s64 off, const void* buf, u64 write_size, u32 option); - -Result FileFlush(FsFile* f); - -Result FileSetSize(FsFile* f, s64 sz); - -Result FileGetSize(FsFile* f, s64* out); - -Result FileOperateRange(FsFile* f, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); - -///< [4.0.0+] -void FileClose(FsFile* f); - -Result DirRead(FsDir* d, s64* total_entries, size_t max_entries, FsDirectoryEntry *buf); - -Result DirGetEntryCount(FsDir* d, s64* count); - -void DirClose(FsDir* d); - -Result StorageRead(FsStorage* s, s64 off, void* buf, u64 read_size); - -Result StorageWrite(FsStorage* s, s64 off, const void* buf, u64 write_size); - -Result StorageFlush(FsStorage* s); - -Result StorageSetSize(FsStorage* s, s64 sz); - -Result StorageGetSize(FsStorage* s, s64* out); - -Result StorageOperateRange(FsStorage* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); - -///< [4.0.0+] -void StorageClose(FsStorage* s); - -Result StorageForBatchReadRead(FsStorageForBatchRead* s, s64 off, void* buf, u64 read_size); - -Result StorageForBatchReadWrite(FsStorageForBatchRead* s, s64 off, const void* buf, u64 write_size); - -Result StorageForBatchReadFlush(FsStorageForBatchRead* s); - -Result StorageForBatchReadSetSize(FsStorageForBatchRead* s, s64 sz); - -Result StorageForBatchReadGetSize(FsStorageForBatchRead* s, s64* out); - -Result StorageForBatchReadOperateRange(FsStorageForBatchRead* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out); - -Result StorageForBatchReadBatchRead(FsStorageForBatchRead* s, void* out0, void* out1, void* out2, void* out3, void* out4, void* out5, void* out6, const void* in); - -void StorageForBatchReadClose(FsStorageForBatchRead* s); - -/// Read FsSaveDataInfo data into the buf array. -Result SaveDataInfoReaderRead(FsSaveDataInfoReader *s, FsSaveDataInfo* buf, size_t max_entries, s64* total_entries); - -void SaveDataInfoReaderClose(FsSaveDataInfoReader *s); - -Result EventNotifierGetEventHandle(FsEventNotifier* e, Event* out, bool autoclear); - -void EventNotifierClose(FsEventNotifier* e); - -Result DeviceOperatorIsSdCardInserted(FsDeviceOperator* d, bool* out); - -Result DeviceOperatorGetSdCardSpeedMode(FsDeviceOperator* d, s64* out); - -Result DeviceOperatorGetSdCardCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); - -Result DeviceOperatorGetSdCardUserAreaSize(FsDeviceOperator* d, s64* out); - -Result DeviceOperatorGetSdCardProtectedAreaSize(FsDeviceOperator* d, s64* out); - -Result DeviceOperatorGetAndClearSdCardErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size); - -Result DeviceOperatorGetMmcCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); - -Result DeviceOperatorGetMmcSpeedMode(FsDeviceOperator* d, s64* out); - -Result DeviceOperatorGetMmcPatrolCount(FsDeviceOperator* d, u32* out); - -Result DeviceOperatorGetAndClearMmcErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size); - -Result DeviceOperatorGetMmcExtendedCsd(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); - -Result DeviceOperatorIsGameCardInserted(FsDeviceOperator* d, bool* out); - -Result DeviceOperatorGetGameCardHandle(FsDeviceOperator* d, FsGameCardHandle* out); - -Result DeviceOperatorGetGameCardUpdatePartitionInfo(FsDeviceOperator* d, const FsGameCardHandle* handle, FsGameCardUpdatePartitionInfo* out); - -Result DeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCardHandle* handle, u8 *out); - -Result DeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64* out_size, s64 size); - -Result DeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); - -Result DeviceOperatorGetGameCardErrorReportInfo(FsDeviceOperator* d, FsGameCardErrorReportInfo* out); - -Result DeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); - -Result DeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size); - -void DeviceOperatorClose(FsDeviceOperator* d); - -} // namespace fs - -/// @brief C++ wrappers for the `fsdev` API. -/// @details Wraps: switch/runtime/devices/fs_dev.h. -namespace fsdev { - -/// Open directory struct -using ::fsdev_dir_t; - -/// Retrieves a pointer to temporary stage for reading entries -FsDirectoryEntry* DirGetEntries(fsdev_dir_t *dir); - -/// Initializes and mounts the sdmc device if accessible. -Result MountSdmc(void); - -/// Mounts the specified SaveData. -Result MountSaveData(const char *name, u64 application_id, AccountUid uid); - -/// Mounts the specified SaveData as ReadOnly. -/// Only available on [2.0.0+]. -Result MountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid); - -/// Mounts the specified BcatSaveData. -Result MountBcatSaveData(const char *name, u64 application_id); - -/// Mounts the specified DeviceSaveData. -Result MountDeviceSaveData(const char *name, u64 application_id); - -/// Mounts the TemporaryStorage for the current process. -/// Only available on [3.0.0+]. -Result MountTemporaryStorage(const char *name); - -/// Mounts the specified CacheStorage. -/// Only available on [3.0.0+]. -Result MountCacheStorage(const char *name, u64 application_id, u16 save_data_index); - -/// Mounts the specified SystemSaveData. -Result MountSystemSaveData(const char *name, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid); - -/// Mounts the specified SystemBcatSaveData. -/// Only available on [4.0.0+]. -Result MountSystemBcatSaveData(const char *name, u64 system_save_data_id); - -/// Mounts the input fs with the specified device name. fsdev will handle closing the fs when required, including when fsdevMountDevice() fails. -/// Returns -1 when any errors occur. -/// Input device name string shouldn't exceed 31 characters, and shouldn't have a trailing colon. -int MountDevice(const char *name, FsFileSystem fs); - -/// Unmounts the specified device. -int UnmountDevice(const char *name); - -/// Uses fsFsCommit() with the specified device. This must be used after any savedata-write operations(not just file-write). This should be used after each file-close where file-writing was done. -/// This is not used automatically at device unmount. -Result CommitDevice(const char *name); - -/// Returns the FsFileSystem for the specified device. Returns NULL when the specified device isn't found. -FsFileSystem* GetDeviceFileSystem(const char *name); - -/// Writes the FS-path to outpath (which has buffer size FS_MAX_PATH), for the input path (as used in stdio). The FsFileSystem is also written to device when not NULL. -int TranslatePath(const char *path, FsFileSystem** device, char *outpath); - -/// This calls fsFsSetConcatenationFileAttribute on the filesystem specified by the input path (as used in stdio). -Result SetConcatenationFileAttribute(const char *path); - -Result IsValidSignedSystemPartitionOnSdCard(const char *name, bool *out); - -/// This calls fsFsCreateFile on the filesystem specified by the input path (as used in stdio). -Result CreateFile(const char* path, size_t size, u32 flags); - -/// Recursively deletes the directory specified by the input path (as used in stdio). -Result DeleteDirectoryRecursively(const char *path); - -/// Unmounts all devices and cleans up any resources used by the FS driver. -Result UnmountAll(void); - -/// Retrieves the last native result code generated during a failed fsdev operation. -Result GetLastResult(void); - -} // namespace fsdev - -/// @brief C++ wrappers for the `fsldr` API. -/// @details Wraps: switch/services/fsldr.h. -namespace fsldr { - -using ::FsCodeInfo; - -/// Initialize fsp-ldr. -Result Initialize(void); - -/// Exit fsp-ldr. -void Exit(void); - -/// Gets the Service object for the actual fsp-ldr service session. -Service* GetServiceSession(void); - -Result OpenCodeFileSystem(FsCodeInfo* out_code_info, u64 tid, NcmStorageId storage_id, const char *path, FsContentAttributes attr, FsFileSystem* out); - -Result IsArchivedProgram(u64 pid, bool *out); - -} // namespace fsldr - -/// @brief C++ wrappers for the `fspr` API. -/// @details Wraps: switch/services/fspr.h. -namespace fspr { - -/// Initialize fsp-pr. -Result Initialize(void); - -/// Exit fsp-pr. -void Exit(void); - -/// Gets the Service object for the actual fsp-pr service session. -Service* GetServiceSession(void); - -Result RegisterProgram(u64 pid, u64 tid, NcmStorageId sid, const void *fs_access_header, size_t fah_size, const void *fs_access_control, size_t fac_size, u8 fs_access_control_restriction_mode); - -Result UnregisterProgram(u64 pid); - -Result SetCurrentProcess(void); - -Result SetEnabledProgramVerification(bool enabled); - -} // namespace fspr - -/// @brief C++ wrappers for the `gpio` API. -/// @details Wraps: switch/services/gpio.h. -namespace gpio { - -using ::GpioDirection; -using ::GpioInterruptMode; -using ::GpioInterruptStatus; -using ::GpioPadName; -using ::GpioPadSession; -using ::GpioValue; - -/// Initialize gpio. -Result Initialize(void); - -/// Exit gpio. -void Exit(void); - -/// Gets the Service object for the actual gpio service session. -Service* GetServiceSession(void); - -Result OpenSession(GpioPadSession *out, GpioPadName name); - -Result OpenSession2(GpioPadSession *out, u32 device_code, u32 access_mode); - -Result IsWakeEventActive(bool *out, GpioPadName name); - -Result IsWakeEventActive2(bool *out, u32 device_code); - -Result PadSetDirection(GpioPadSession *p, GpioDirection dir); - -Result PadGetDirection(GpioPadSession *p, GpioDirection *out); - -Result PadSetInterruptMode(GpioPadSession *p, GpioInterruptMode mode); - -Result PadGetInterruptMode(GpioPadSession *p, GpioInterruptMode *out); - -Result PadSetInterruptEnable(GpioPadSession *p, bool en); - -Result PadGetInterruptEnable(GpioPadSession *p, bool *out); - -Result PadGetInterruptStatus(GpioPadSession *p, GpioInterruptStatus *out); - -///< [1.0.0-16.1.0] -Result PadClearInterruptStatus(GpioPadSession *p); - -///< [1.0.0-16.1.0] -Result PadSetValue(GpioPadSession *p, GpioValue val); - -Result PadGetValue(GpioPadSession *p, GpioValue *out); - -Result PadBindInterrupt(GpioPadSession *p, Event *out); - -Result PadUnbindInterrupt(GpioPadSession *p); - -Result PadSetDebounceEnabled(GpioPadSession *p, bool en); - -Result PadGetDebounceEnabled(GpioPadSession *p, bool *out); - -Result PadSetDebounceTime(GpioPadSession *p, s32 ms); - -Result PadGetDebounceTime(GpioPadSession *p, s32 *out); - -void PadClose(GpioPadSession *p); - -} // namespace gpio - -/// @brief C++ wrappers for the `grc` API. -/// @details Wraps: switch/services/grc.h. -namespace grc { - -/// GameMovieId -using ::GrcGameMovieId; -/// GameMovieTrimmer -using ::GrcGameMovieTrimmer; -/// IMovieMaker -using ::GrcMovieMaker; -/// OffscreenRecordingParameter -using ::GrcOffscreenRecordingParameter; -/// Stream type values for \ref grcdTransfer. -using ::GrcStream; - -/** - * @brief Creates a \ref GrcGameMovieTrimmer using \ref appletCreateGameMovieTrimmer, uses the cmds from it to trim the specified video, then closes it. - * @note See \ref appletCreateGameMovieTrimmer for the requirements for using this. - * @note This will block until video trimming finishes. - * @param[out] dst_movieid \ref GrcGameMovieId for the output video. - * @param[in] src_movieid \ref GrcGameMovieId for the input video. - * @param[in] tmem_size TransferMemory size. Official sw uses size 0x2000000. - * @param[in] thumbnail Optional, can be NULL. RGBA8 1280x720 thumbnail image data. - * @param[in] start Start timestamp in 0.5s units. - * @param[in] end End timestamp in 0.5s units. - */ -Result TrimGameMovie(GrcGameMovieId *dst_movieid, const GrcGameMovieId *src_movieid, size_t tmem_size, const void* thumbnail, s32 start, s32 end); - -/** - * @brief Creates a \ref GrcOffscreenRecordingParameter with the default values, see \ref GrcOffscreenRecordingParameter for the default values. - * @param[out] param \ref GrcOffscreenRecordingParameter - */ -void CreateOffscreenRecordingParameter(GrcOffscreenRecordingParameter *param); - -/** - * @brief Creates a \ref GrcMovieMaker using \ref appletCreateMovieMaker, and does the required initialization. - * @note See \ref appletCreateMovieMaker for the requirements for using this. - * @param[out] m \ref GrcMovieMaker - * @param[in] size TransferMemory WorkMemory size. See \ref GRC_MOVIEMAKER_WORKMEMORY_SIZE_DEFAULT. - */ -Result CreateMovieMaker(GrcMovieMaker *m, size_t size); - -/** - * @brief Closes a \ref GrcMovieMaker. - * @note This also uses \ref grcMovieMakerAbort. - * @param m \ref GrcMovieMaker - */ -void MovieMakerClose(GrcMovieMaker *m); - -/** - * @brief Gets the \ref NWindow for the specified MovieMaker. - * @param m \ref GrcMovieMaker - */ -NWindow* MovieMakerGetNWindow(GrcMovieMaker *m); - -/** - * @brief Aborts recording with the specified MovieMaker. - * @note This is used automatically by \ref grcMovieMakerClose. - * @note This will throw an error if \ref grcMovieMakerStart was not used previously, with the flag used for this being cleared afterwards on success. - * @param m \ref GrcMovieMaker - */ -Result MovieMakerAbort(GrcMovieMaker *m); - -/** - * @brief Starts recording with the specified MovieMaker and \ref GrcOffscreenRecordingParameter. - * @param m \ref GrcMovieMaker - * @param[in] param \ref GrcOffscreenRecordingParameter - */ -Result MovieMakerStart(GrcMovieMaker *m, const GrcOffscreenRecordingParameter *param); - -/** - * @brief Finishes recording with the specified MovieMaker. - * @note This automatically uses \ref grcMovieMakerAbort on error. - * @note The recorded video will not be accessible via the Album-applet since it's stored separately from other Album data. - * @param m \ref GrcMovieMaker - * @param width Width for the thumbnail, must be 1280. - * @param height Height for the thumbnail, must be 720. - * @param[in] userdata UserData input buffer for the JPEG thumbnail. Optional, can be NULL. - * @param[in] userdata_size Size of the UserData input buffer. Optional, can be 0. Must be <=0x400. - * @param[in] thumbnail RGBA8 image buffer containing the thumbnail. Optional, can be NULL. - * @param[in] thumbnail_size Size of the thumbnail buffer. Optional, can be 0. - * @param[out] entry Output \ref CapsApplicationAlbumEntry for the recorded video. Optional, can be NULL. Only available on [7.0.0+], if this is not NULL on pre-7.0.0 an error is thrown. - */ -Result MovieMakerFinish(GrcMovieMaker *m, s32 width, s32 height, const void* userdata, size_t userdata_size, const void* thumbnail, size_t thumbnail_size, CapsApplicationAlbumEntry *entry); - -/** - * @brief Gets the recording error with the specified MovieMaker. - * @param m \ref GrcMovieMaker - */ -Result MovieMakerGetError(GrcMovieMaker *m); - -/** - * @brief Encodes audio sample data with the specified MovieMaker. - * @note This waits on the event and uses the cmd repeatedly until the entire input buffer is handled. - * @note If you don't use this the recorded video will be missing audio. - * @param m \ref GrcMovieMaker - * @param[in] buffer Audio buffer. - * @param[in] size Size of the buffer. - */ -Result MovieMakerEncodeAudioSample(GrcMovieMaker *m, const void* buffer, size_t size); - -} // namespace grc - -/// @brief C++ wrappers for the `grcd` API. -/// @details Wraps: switch/services/grc.h. -namespace grcd { - -/// GameMovieId -using ::GrcGameMovieId; -/// GameMovieTrimmer -using ::GrcGameMovieTrimmer; -/// IMovieMaker -using ::GrcMovieMaker; -/// OffscreenRecordingParameter -using ::GrcOffscreenRecordingParameter; -/// Stream type values for \ref grcdTransfer. -using ::GrcStream; - -/// Initialize grc:d. -Result Initialize(void); - -/// Exit grc:d. -void Exit(void); - -/// Gets the Service for grc:d. -Service* GetServiceSession(void); - -/// Begins streaming. This must not be called more than once, even from a different service session: otherwise the sysmodule will assert. -Result Begin(void); - -/** - * @brief Retrieves stream data from the continuous recorder in use (from the video recording of the currently running application). - * @note This will block until data is available. This will hang if there is no application running which has video capture enabled. - * @param[in] stream \ref GrcStream - * @param[out] buffer Output buffer. - * @param[in] size Max size of the output buffer. - * @param[out] num_frames num_frames - * @param[out] data_size Actual output data size. - * @param[out] start_timestamp Start timestamp. - */ -Result Transfer(GrcStream stream, void* buffer, size_t size, u32 *num_frames, u32 *data_size, u64 *start_timestamp); - -} // namespace grcd - -/// @brief C++ wrappers for the `hid` API. -/// @details Wraps: switch/applets/hid_la.h, switch/services/hid.h. -namespace hid { - -/// HidAnalogStickCalibrationStateImpl -using ::HidAnalogStickCalibrationStateImpl; -/// HidAnalogStickCalibrationStateImplAtomicStorage -using ::HidAnalogStickCalibrationStateImplAtomicStorage; -/// HidAnalogStickCalibrationStateImplLifo -using ::HidAnalogStickCalibrationStateImplLifo; -/// HidAnalogStickState -using ::HidAnalogStickState; -/// AppletFooterUiType (system) -using ::HidAppletFooterUiType; -/// HidBasicXpadLifo -using ::HidBasicXpadLifo; -/// HidBasicXpadSharedMemoryEntry -using ::HidBasicXpadSharedMemoryEntry; -/// HidBasicXpadSharedMemoryFormat -using ::HidBasicXpadSharedMemoryFormat; -/// HidBasicXpadState -using ::HidBasicXpadState; -/// HidBasicXpadStateAtomicStorage -using ::HidBasicXpadStateAtomicStorage; -/// HidCaptureButtonLifo -using ::HidCaptureButtonLifo; -/// HidCaptureButtonSharedMemoryFormat -using ::HidCaptureButtonSharedMemoryFormat; -/// HidCaptureButtonState -using ::HidCaptureButtonState; -/// HidCaptureButtonStateAtomicStorage -using ::HidCaptureButtonStateAtomicStorage; -/// HidColorAttribute -using ::HidColorAttribute; -/// HidCommonLifoHeader -using ::HidCommonLifoHeader; -/// HidConsoleSixAxisSensor -using ::HidConsoleSixAxisSensor; -/// HidDebugPadAttribute -using ::HidDebugPadAttribute; -/// HidDebugPadButton -using ::HidDebugPadButton; -/// HidDebugPadLifo -using ::HidDebugPadLifo; -/// HidDebugPadSharedMemoryFormat -using ::HidDebugPadSharedMemoryFormat; -/// HidDebugPadState -using ::HidDebugPadState; -/// HidDebugPadStateAtomicStorage -using ::HidDebugPadStateAtomicStorage; -/// Internal DeviceType for [9.0.0+]. Converted to/from the pre-9.0.0 version of this by the hiddbg funcs. -using ::HidDeviceType; -/// DeviceType (system) -using ::HidDeviceTypeBits; -/// HidDigitizerLifo -using ::HidDigitizerLifo; -/// HidDigitizerSharedMemoryFormat -using ::HidDigitizerSharedMemoryFormat; -/// HidDigitizerState -using ::HidDigitizerState; -/// HidDigitizerStateAtomicStorage -using ::HidDigitizerStateAtomicStorage; -/// HidDirectionState -using ::HidDirectionState; -/// HidGestureAttribute -using ::HidGestureAttribute; -/// HidGestureDirection -using ::HidGestureDirection; -/// HidGestureDummyStateAtomicStorage -using ::HidGestureDummyStateAtomicStorage; -/// HidGestureLifo -using ::HidGestureLifo; -/// HidGesturePoint -using ::HidGesturePoint; -/// HidGestureSharedMemoryFormat -using ::HidGestureSharedMemoryFormat; -/// HidGestureState -using ::HidGestureState; -/// HidGestureType -using ::HidGestureType; -/// GyroscopeZeroDriftMode -using ::HidGyroscopeZeroDriftMode; -/// HidHomeButtonLifo -using ::HidHomeButtonLifo; -/// HidHomeButtonSharedMemoryFormat -using ::HidHomeButtonSharedMemoryFormat; -/// HidHomeButtonState -using ::HidHomeButtonState; -/// HidHomeButtonStateAtomicStorage -using ::HidHomeButtonStateAtomicStorage; -/// HidInputDetectorLifo -using ::HidInputDetectorLifo; -/// HidInputDetectorSharedMemoryEntry -using ::HidInputDetectorSharedMemoryEntry; -/// HidInputDetectorSharedMemoryFormat -using ::HidInputDetectorSharedMemoryFormat; -/// HidInputDetectorState -using ::HidInputDetectorState; -/// HidInputDetectorStateAtomicStorage -using ::HidInputDetectorStateAtomicStorage; -/// HidKeyboardKey -using ::HidKeyboardKey; -/// HidKeyboardLifo -using ::HidKeyboardLifo; -/// KeyboardLockKeyEvent -using ::HidKeyboardLockKeyEvent; -/// HidKeyboardModifier -using ::HidKeyboardModifier; -/// HidKeyboardSharedMemoryFormat -using ::HidKeyboardSharedMemoryFormat; -/// HidKeyboardState -using ::HidKeyboardState; -/// HidKeyboardStateAtomicStorage -using ::HidKeyboardStateAtomicStorage; -/// ControllerFirmwareUpdateArg -using ::HidLaControllerFirmwareUpdateArg; -/// ControllerKeyRemappingArg -using ::HidLaControllerKeyRemappingArg; -/// ControllerSupportArg for [8.0.0+], converted to \ref HidLaControllerSupportArgV3 on pre-8.0.0. -using ::HidLaControllerSupportArg; -/// Identification color used by HidLaControllerSupportArg*. When HidLaControllerSupportArgHeader::enable_identification_color is set this controls the color of the UI player box outline. -using ::HidLaControllerSupportArgColor; -/// Common header used by HidLaControllerSupportArg*. -/// max_supported_players is 4 on pre-8.0.0, 8 on [8.0.0+]. player_count_min and player_count_max are overriden with value 4 when larger than value 4, during conversion handling for \ref HidLaControllerSupportArg on pre-8.0.0. -using ::HidLaControllerSupportArgHeader; -/// ControllerSupportArgPrivate -using ::HidLaControllerSupportArgPrivate; -/// ControllerSupportArg for [1.0.0+]. -using ::HidLaControllerSupportArgV3; -/// ControllerSupportCaller -using ::HidLaControllerSupportCaller; -/// Mode values for HidLaControllerSupportArgPrivate::mode. -using ::HidLaControllerSupportMode; -/// ControllerSupportResultInfo. First 8-bytes from the applet output storage. -using ::HidLaControllerSupportResultInfo; -/// Struct for the applet output storage. -using ::HidLaControllerSupportResultInfoInternal; -/// HidMouseAttribute -using ::HidMouseAttribute; -/// HidMouseButton -using ::HidMouseButton; -/// HidMouseLifo -using ::HidMouseLifo; -/// HidMouseSharedMemoryFormat -using ::HidMouseSharedMemoryFormat; -/// HidMouseState -using ::HidMouseState; -/// HidMouseStateAtomicStorage -using ::HidMouseStateAtomicStorage; -/// HidNfcXcdDeviceHandleState -using ::HidNfcXcdDeviceHandleState; -/// HidNfcXcdDeviceHandleStateImpl -using ::HidNfcXcdDeviceHandleStateImpl; -/// HidNfcXcdDeviceHandleStateImplAtomicStorage -using ::HidNfcXcdDeviceHandleStateImplAtomicStorage; -/// HidNpadAttribute -using ::HidNpadAttribute; -/// HidNpadButton -using ::HidNpadButton; -/// HidNpadCommonLifo -using ::HidNpadCommonLifo; -/// HidNpadCommonState -using ::HidNpadCommonState; -///< State for ::HidNpadStyleTag_NpadSystem. Analog-sticks state are always zero. Only the following button bits are available: HidNpadButton_A, HidNpadButton_B, HidNpadButton_X, HidNpadButton_Y, HidNpadButton_Left, HidNpadButton_Up, HidNpadButton_Right, HidNpadButton_Down, HidNpadButton_L, HidNpadButton_R. -/// HidNpadCommonStateAtomicStorage -using ::HidNpadCommonStateAtomicStorage; -/// NpadCommunicationMode -using ::HidNpadCommunicationMode; -/// Npad colors. -/// Color fields are zero when not set. -using ::HidNpadControllerColor; -/// HidNpadFullKeyColorState -using ::HidNpadFullKeyColorState; -using ::HidNpadFullKeyState; -///< State for ::HidNpadStyleTag_NpadJoyRight. -/// State for ::HidNpadStyleTag_NpadGc. Loaded from the same lifo as \ref HidNpadFullKeyState, with the additional trigger_l/trigger_r loaded from elsewhere. -using ::HidNpadGcState; -/// HidNpadGcTriggerLifo -using ::HidNpadGcTriggerLifo; -/// HidNpadGcTriggerState -using ::HidNpadGcTriggerState; -/// HidNpadGcTriggerStateAtomicStorage -using ::HidNpadGcTriggerStateAtomicStorage; -/// This controls how many Joy-Cons must be attached for handheld-mode to be activated. -using ::HidNpadHandheldActivationMode; -/// State for ::HidNpadStyleTag_NpadHandheldLark. The base state is loaded from the same lifo as \ref HidNpadHandheldState. -using ::HidNpadHandheldLarkState; -///< State for ::HidNpadStyleTag_NpadFullKey. -using ::HidNpadHandheldState; -/// HID controller IDs -using ::HidNpadIdType; -/// NpadInterfaceType (system) -using ::HidNpadInterfaceType; -/// HidNpadInternalState -using ::HidNpadInternalState; -/// NpadJoyAssignmentMode -using ::HidNpadJoyAssignmentMode; -/// HidNpadJoyColorState -using ::HidNpadJoyColorState; -/// NpadJoyDeviceType -using ::HidNpadJoyDeviceType; -///< State for ::HidNpadStyleTag_NpadHandheld. -using ::HidNpadJoyDualState; -/// NpadJoyHoldType -using ::HidNpadJoyHoldType; -///< State for ::HidNpadStyleTag_NpadJoyDual. -using ::HidNpadJoyLeftState; -///< State for ::HidNpadStyleTag_NpadJoyLeft. -using ::HidNpadJoyRightState; -using ::HidNpadLagerState; -/// NpadLagerType -using ::HidNpadLagerType; -///< State for ::HidNpadStyleTag_NpadPalma. -/// State for ::HidNpadStyleTag_NpadLark. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. -using ::HidNpadLarkState; -/// NpadLarkType -using ::HidNpadLarkType; -/// State for ::HidNpadStyleTag_NpadLucia. The base state is loaded from the same lifo as \ref HidNpadFullKeyState. -using ::HidNpadLuciaState; -/// NpadLuciaType -using ::HidNpadLuciaType; -using ::HidNpadPalmaState; -/// HidNpadSharedMemoryEntry -using ::HidNpadSharedMemoryEntry; -/// HidNpadSharedMemoryFormat -using ::HidNpadSharedMemoryFormat; -/// HidNpadSixAxisSensorLifo -using ::HidNpadSixAxisSensorLifo; -/// HID controller styles -using ::HidNpadStyleTag; -/// NpadSystemButtonProperties -using ::HidNpadSystemButtonProperties; -///< State for ::HidNpadStyleTag_NpadLager. Analog-sticks state are always zero. -using ::HidNpadSystemExtState; -/// NpadSystemProperties -using ::HidNpadSystemProperties; -///< State for ::HidNpadStyleTag_NpadSystemExt. -using ::HidNpadSystemState; -/// PalmaActivityEntry -using ::HidPalmaActivityEntry; -/// PalmaApplicationSectionAccessBuffer -using ::HidPalmaApplicationSectionAccessBuffer; -/// PalmaConnectionHandle -using ::HidPalmaConnectionHandle; -/// PalmaFeature -using ::HidPalmaFeature; -/// PalmaFrModeType -using ::HidPalmaFrModeType; -/// PalmaOperationInfo -using ::HidPalmaOperationInfo; -/// PalmaOperationType -using ::HidPalmaOperationType; -/// PalmaWaveSet -using ::HidPalmaWaveSet; -/// HidPowerInfo (system) -using ::HidPowerInfo; -/// HidSevenSixAxisSensorState -using ::HidSevenSixAxisSensorState; -/// HidSevenSixAxisSensorStateEntry -using ::HidSevenSixAxisSensorStateEntry; -/// HidSevenSixAxisSensorStates -using ::HidSevenSixAxisSensorStates; -/// HidSharedMemory -using ::HidSharedMemory; -/// HidSixAxisSensorAttribute -using ::HidSixAxisSensorAttribute; -/// HidSixAxisSensorHandle -using ::HidSixAxisSensorHandle; -/// HidSixAxisSensorState -using ::HidSixAxisSensorState; -/// HidSixAxisSensorStateAtomicStorage -using ::HidSixAxisSensorStateAtomicStorage; -/// HidSixAxisSensorUserCalibrationState -using ::HidSixAxisSensorUserCalibrationState; -/// HidSixAxisSensorUserCalibrationStateAtomicStorage -using ::HidSixAxisSensorUserCalibrationStateAtomicStorage; -/// HidSixAxisSensorUserCalibrationStateLifo -using ::HidSixAxisSensorUserCalibrationStateLifo; -/// HidSleepButtonLifo -using ::HidSleepButtonLifo; -/// HidSleepButtonSharedMemoryFormat -using ::HidSleepButtonSharedMemoryFormat; -/// HidSleepButtonState -using ::HidSleepButtonState; -/// HidSleepButtonStateAtomicStorage -using ::HidSleepButtonStateAtomicStorage; -/// HidTouchAttribute -using ::HidTouchAttribute; -/// HidTouchScreenConfigurationForNx -using ::HidTouchScreenConfigurationForNx; -/// HidTouchScreenLifo -using ::HidTouchScreenLifo; -/// HidTouchScreenModeForNx -using ::HidTouchScreenModeForNx; -/// HidTouchScreenSharedMemoryFormat -using ::HidTouchScreenSharedMemoryFormat; -/// HidTouchScreenState -using ::HidTouchScreenState; -/// HidTouchScreenStateAtomicStorage -using ::HidTouchScreenStateAtomicStorage; -/// HidTouchState -using ::HidTouchState; -/// HidUniquePadConfig -using ::HidUniquePadConfig; -/// HidUniquePadConfigAtomicStorage -using ::HidUniquePadConfigAtomicStorage; -/// HidUniquePadConfigLifo -using ::HidUniquePadConfigLifo; -/// HidUniquePadConfigMutex -using ::HidUniquePadConfigMutex; -/// HidUniquePadLifo -using ::HidUniquePadLifo; -/// HidUniquePadSharedMemoryEntry -using ::HidUniquePadSharedMemoryEntry; -/// HidUniquePadSharedMemoryFormat -using ::HidUniquePadSharedMemoryFormat; -/// HidVector -using ::HidVector; -/// HidVibrationDeviceHandle -using ::HidVibrationDeviceHandle; -/// HidVibrationDeviceInfo -using ::HidVibrationDeviceInfo; -/// VibrationDevicePosition -using ::HidVibrationDevicePosition; -/// Type values for HidVibrationDeviceInfo::type. -using ::HidVibrationDeviceType; -/// VibrationGcErmCommand -using ::HidVibrationGcErmCommand; -/// HidVibrationValue -using ::HidVibrationValue; -/// XcdDeviceHandle -using ::XcdDeviceHandle; -/// XcdInterfaceType -using ::XcdInterfaceType; - -/** - * @brief Initializes a \ref HidLaControllerSupportArg with the defaults. - * @note This clears the arg, then does: HidLaControllerSupportArgHeader::player_count_min = 0, HidLaControllerSupportArgHeader::player_count_max = 4, HidLaControllerSupportArgHeader::enable_take_over_connection = 1, HidLaControllerSupportArgHeader::enable_left_justify = 1, and HidLaControllerSupportArgHeader::enable_permit_joy_dual = 1. - * @note If preferred, you can also memset \ref HidLaControllerSupportArg manually and initialize it yourself. - * @param[out] arg \ref HidLaControllerSupportArg - */ -void LaCreateControllerSupportArg(HidLaControllerSupportArg *arg); - -/** - * @brief Initializes a \ref HidLaControllerFirmwareUpdateArg with the defaults. - * @note This just uses memset() with the arg. - * @param[out] arg \ref HidLaControllerFirmwareUpdateArg - */ -void LaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *arg); - -/** - * @brief Initializes a \ref HidLaControllerKeyRemappingArg with the defaults. - * @note This just uses memset() with the arg. - * @param[out] arg \ref HidLaControllerKeyRemappingArg - */ -void LaCreateControllerKeyRemappingArg(HidLaControllerKeyRemappingArg *arg); - -/** - * @brief Sets the ExplainText for the specified player and \ref HidLaControllerSupportArg. - * @note This string is displayed in the UI box for the player. - * @note HidLaControllerSupportArg::enable_explain_text must be set, otherwise this ExplainText is ignored. - * @param arg \ref HidLaControllerSupportArg - * @param[in] str Input ExplainText UTF-8 string, max length is 0x80 excluding NUL-terminator. - + @oaram[in] id Player controller, must be <8. - */ -Result LaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidNpadIdType id); - -/** - * @brief Launches the applet for ControllerSupport. - * @note This seems to only display the applet UI when doing so is actually needed? This doesn't apply to \ref hidLaShowControllerSupportForSystem. - * @param[out] result_info \ref HidLaControllerSupportResultInfo. Optional, can be NULL. - * @param[in] arg \ref HidLaControllerSupportArg - */ -Result LaShowControllerSupport(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg); - -/** - * @brief Launches the applet for ControllerStrapGuide. - * @note Only available on [3.0.0+]. - */ -Result LaShowControllerStrapGuide(void); - -/** - * @brief Launches the applet for ControllerFirmwareUpdate. - * @note Only available on [3.0.0+]. - * @param[in] arg \ref HidLaControllerFirmwareUpdateArg - */ -Result LaShowControllerFirmwareUpdate(const HidLaControllerFirmwareUpdateArg *arg); - -/** - * @brief This is the system version of \ref hidLaShowControllerSupport. - * @param[out] result_info \ref HidLaControllerSupportResultInfo. Optional, can be NULL. - * @param[in] arg \ref HidLaControllerSupportArg - * @param[in] flag Input flag. When true, the applet displays the menu as if launched by qlaunch. - */ -Result LaShowControllerSupportForSystem(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg, bool flag); - -/** - * @brief This is the system version of \ref hidLaShowControllerFirmwareUpdate. - * @note Only available on [3.0.0+]. - * @param[in] arg \ref HidLaControllerFirmwareUpdateArg - * @param[in] caller \ref HidLaControllerSupportCaller - */ -Result LaShowControllerFirmwareUpdateForSystem(const HidLaControllerFirmwareUpdateArg *arg, HidLaControllerSupportCaller caller); - -/** - * @brief Launches the applet for ControllerKeyRemappingForSystem. - * @note Only available on [11.0.0+]. - * @param[in] arg \ref HidLaControllerKeyRemappingArg - * @param[in] caller \ref HidLaControllerSupportCaller - */ -Result LaShowControllerKeyRemappingForSystem(const HidLaControllerKeyRemappingArg *arg, HidLaControllerSupportCaller caller); - -/// Initialize hid. Called automatically during app startup. -Result Initialize(void); - -/// Exit hid. Called automatically during app exit. -void Exit(void); - -/// Gets the Service object for the actual hid service session. -Service* GetServiceSession(void); - -/// Gets the address of the SharedMemory. -void* GetSharedmemAddr(void); - -/// Initialize TouchScreen. Must be called when TouchScreen is being used. Used automatically by \ref hidScanInput when required. -void InitializeTouchScreen(void); - -/** - * @brief Gets \ref HidTouchScreenState. - * @param[out] states Output array of \ref HidTouchScreenState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetTouchScreenStates(HidTouchScreenState *states, size_t count); - -/// Initialize Mouse. Must be called when Mouse is being used. Used automatically by \ref hidScanInput when required. -void InitializeMouse(void); - -/** - * @brief Gets \ref HidMouseState. - * @param[out] states Output array of \ref HidMouseState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetMouseStates(HidMouseState *states, size_t count); - -/// Initialize Keyboard. Must be called when Keyboard is being used. Used automatically by \ref hidScanInput when required. -void InitializeKeyboard(void); - -/** - * @brief Gets \ref HidKeyboardState. - * @param[out] states Output array of \ref HidKeyboardState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetKeyboardStates(HidKeyboardState *states, size_t count); - -/** - * @brief Gets the state of a key in a \ref HidKeyboardState. - * @param[in] state \ref HidKeyboardState. - * @param[in] key \ref HidKeyboardKey. - * @return true if the key is pressed, false if not. - */ -bool KeyboardStateGetKey(const HidKeyboardState *state, HidKeyboardKey key); - -/** - * @brief Gets \ref HidHomeButtonState. - * @note Home button shmem must be activated with \ref hidsysActivateHomeButton - * @param[out] states Output array of \ref HidHomeButtonState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetHomeButtonStates(HidHomeButtonState *states, size_t count); - -/** - * @brief Gets \ref HidSleepButtonState. - * @note Sleep button shmem must be activated with \ref hidsysActivateSleepButton - * @param[out] states Output array of \ref HidSleepButtonState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetSleepButtonStates(HidSleepButtonState *states, size_t count); - -/** - * @brief Gets \ref HidCaptureButtonState. - * @note Capture button shmem must be activated with \ref hidsysActivateCaptureButton - * @param[out] states Output array of \ref HidCaptureButtonState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetCaptureButtonStates(HidCaptureButtonState *states, size_t count); - -/// Initialize Npad. Must be called when Npad is being used. Used automatically by \ref hidScanInput when required. -void InitializeNpad(void); - -/** - * @brief Gets the StyleSet for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @return Bitfield of \ref HidNpadStyleTag. - */ -u32 GetNpadStyleSet(HidNpadIdType id); - -/** - * @brief Gets the \ref HidNpadJoyAssignmentMode for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @return \ref HidNpadJoyAssignmentMode - */ -HidNpadJoyAssignmentMode GetNpadJoyAssignment(HidNpadIdType id); - -/** - * @brief Gets the main \ref HidNpadControllerColor for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @param[out] color \ref HidNpadControllerColor - */ -Result GetNpadControllerColorSingle(HidNpadIdType id, HidNpadControllerColor *color); - -/** - * @brief Gets the left/right \ref HidNpadControllerColor for the specified Npad (Joy-Con pair in dual mode). - * @param[in] id \ref HidNpadIdType - * @param[out] color_left \ref HidNpadControllerColor - * @param[out] color_right \ref HidNpadControllerColor - */ -Result GetNpadControllerColorSplit(HidNpadIdType id, HidNpadControllerColor *color_left, HidNpadControllerColor *color_right); - -/** - * @brief Gets the DeviceType for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @return Bitfield of \ref HidDeviceTypeBits. - */ -u32 GetNpadDeviceType(HidNpadIdType id); - -/** - * @brief Gets the \ref HidNpadSystemProperties for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @param[out] out \ref HidNpadSystemProperties - */ -void GetNpadSystemProperties(HidNpadIdType id, HidNpadSystemProperties *out); - -/** - * @brief Gets the \ref HidNpadSystemButtonProperties for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @param[out] out \ref HidNpadSystemButtonProperties - */ -void GetNpadSystemButtonProperties(HidNpadIdType id, HidNpadSystemButtonProperties *out); - -/** - * @brief Gets the main \ref HidPowerInfo for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @param[out] info \ref HidPowerInfo - */ -void GetNpadPowerInfoSingle(HidNpadIdType id, HidPowerInfo *info); - -/** - * @brief Gets the left/right \ref HidPowerInfo for the specified Npad (Joy-Con pair in dual mode). - * @param[in] id \ref HidNpadIdType - * @param[out] info_left \ref HidPowerInfo - * @param[out] info_right \ref HidPowerInfo - */ -void GetNpadPowerInfoSplit(HidNpadIdType id, HidPowerInfo *info_left, HidPowerInfo *info_right); - -/** - * @brief Gets the AppletFooterUiAttributesSet for the specified Npad. - * @note Only available on [9.0.0+]. - * @param[in] id \ref HidNpadIdType - * @return Bitfield of AppletFooterUiAttribute (system). - */ -u32 GetAppletFooterUiAttributesSet(HidNpadIdType id); - -/** - * @brief Gets \ref HidAppletFooterUiType for the specified Npad. - * @note Only available on [9.0.0+]. - * @param[in] id \ref HidNpadIdType - * @return \ref HidAppletFooterUiType - */ -HidAppletFooterUiType GetAppletFooterUiTypes(HidNpadIdType id); - -/** - * @brief Gets \ref HidNpadLagerType for the specified Npad. - * @param[in] id \ref HidNpadIdType - * @return \ref HidNpadLagerType - */ -HidNpadLagerType GetNpadLagerType(HidNpadIdType id); - -/** - * @brief Gets \ref HidNpadFullKeyState. - * @param[out] states Output array of \ref HidNpadFullKeyState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesFullKey(HidNpadIdType id, HidNpadFullKeyState *states, size_t count); - -/** - * @brief Gets \ref HidNpadHandheldState. - * @param[out] states Output array of \ref HidNpadHandheldState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesHandheld(HidNpadIdType id, HidNpadHandheldState *states, size_t count); - -/** - * @brief Gets \ref HidNpadJoyDualState. - * @param[out] states Output array of \ref HidNpadJoyDualState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesJoyDual(HidNpadIdType id, HidNpadJoyDualState *states, size_t count); - -/** - * @brief Gets \ref HidNpadJoyLeftState. - * @param[out] states Output array of \ref HidNpadJoyLeftState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesJoyLeft(HidNpadIdType id, HidNpadJoyLeftState *states, size_t count); - -/** - * @brief Gets \ref HidNpadJoyRightState. - * @param[out] states Output array of \ref HidNpadJoyRightState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesJoyRight(HidNpadIdType id, HidNpadJoyRightState *states, size_t count); - -/** - * @brief Gets \ref HidNpadGcState. - * @param[out] states Output array of \ref HidNpadGcState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesGc(HidNpadIdType id, HidNpadGcState *states, size_t count); - -/** - * @brief Gets \ref HidNpadPalmaState. - * @param[out] states Output array of \ref HidNpadPalmaState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesPalma(HidNpadIdType id, HidNpadPalmaState *states, size_t count); - -/** - * @brief Gets \ref HidNpadLarkState. - * @param[out] states Output array of \ref HidNpadLarkState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesLark(HidNpadIdType id, HidNpadLarkState *states, size_t count); - -/** - * @brief Gets \ref HidNpadHandheldLarkState. - * @param[out] states Output array of \ref HidNpadHandheldLarkState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesHandheldLark(HidNpadIdType id, HidNpadHandheldLarkState *states, size_t count); - -/** - * @brief Gets \ref HidNpadLuciaState. - * @param[out] states Output array of \ref HidNpadLuciaState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesLucia(HidNpadIdType id, HidNpadLuciaState *states, size_t count); - -/** - * @brief Gets \ref HidNpadLagerState. - * @param[out] states Output array of \ref HidNpadLagerState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesLager(HidNpadIdType id, HidNpadLagerState *states, size_t count); - -/** - * @brief Gets \ref HidNpadSystemExtState. - * @param[out] states Output array of \ref HidNpadSystemExtState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesSystemExt(HidNpadIdType id, HidNpadSystemExtState *states, size_t count); - -/** - * @brief Gets \ref HidNpadSystemState. - * @param[out] states Output array of \ref HidNpadSystemState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetNpadStatesSystem(HidNpadIdType id, HidNpadSystemState *states, size_t count); - -/** - * @brief Gets \ref HidSixAxisSensorState for the specified handle. - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[out] states Output array of \ref HidSixAxisSensorState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetSixAxisSensorStates(HidSixAxisSensorHandle handle, HidSixAxisSensorState *states, size_t count); - -/// Initialize Gesture. Must be called when Gesture is being used. -void InitializeGesture(void); - -/** - * @brief Gets \ref HidGestureState. - * @param[out] states Output array of \ref HidGestureState. - * @param[in] count Size of the states array in entries. - * @return Total output entries. - */ -size_t GetGestureStates(HidGestureState *states, size_t count); - -/** - * @brief SendKeyboardLockKeyEvent - * @note Same as \ref hidsysSendKeyboardLockKeyEvent. - * @note Only available on [6.0.0+]. - * @param[in] events Bitfield of \ref HidKeyboardLockKeyEvent. - */ -Result SendKeyboardLockKeyEvent(u32 events); - -/** - * @brief Gets SixAxisSensorHandles. - * @note Only ::HidNpadStyleTag_NpadJoyDual supports total_handles==2. - * @param[out] handles Output array of \ref HidSixAxisSensorHandle. - * @param[in] total_handles Total handles for the handles array. Must be 1 or 2, if 2 handles aren't supported by the specified style an error is thrown. - * @param[in] id \ref HidNpadIdType - * @param[in] style \ref HidNpadStyleTag - */ -Result GetSixAxisSensorHandles(HidSixAxisSensorHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style); - -/** - * @brief Starts the SixAxisSensor for the specified handle. - * @param[in] handle \ref HidSixAxisSensorHandle - */ -Result StartSixAxisSensor(HidSixAxisSensorHandle handle); - -/** - * @brief Stops the SixAxisSensor for the specified handle. - * @param[in] handle \ref HidSixAxisSensorHandle - */ -Result StopSixAxisSensor(HidSixAxisSensorHandle handle); - -/** - * @brief IsSixAxisSensorFusionEnabled - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[out] out Output flag. - */ -Result IsSixAxisSensorFusionEnabled(HidSixAxisSensorHandle handle, bool *out); - -/** - * @brief EnableSixAxisSensorFusion - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[in] flag Flag - */ -Result EnableSixAxisSensorFusion(HidSixAxisSensorHandle handle, bool flag); - -/** - * @brief SetSixAxisSensorFusionParameters - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[in] unk0 Must be 0.0f-1.0f. - * @param[in] unk1 Unknown - */ -Result SetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float unk0, float unk1); - -/** - * @brief GetSixAxisSensorFusionParameters - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[out] unk0 Unknown - * @param[out] unk1 Unknown - */ -Result GetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float *unk0, float *unk1); - -/** - * @brief ResetSixAxisSensorFusionParameters - * @param[in] handle \ref HidSixAxisSensorHandle - */ -Result ResetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle); - -/** - * @brief Sets the ::HidGyroscopeZeroDriftMode for the specified SixAxisSensorHandle. - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[in] mode \ref HidGyroscopeZeroDriftMode - */ -Result SetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode mode); - -/** - * @brief Gets the ::HidGyroscopeZeroDriftMode for the specified SixAxisSensorHandle. - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[out] mode \ref HidGyroscopeZeroDriftMode - */ -Result GetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode *mode); - -/** - * @brief Resets the ::HidGyroscopeZeroDriftMode for the specified SixAxisSensorHandle to ::HidGyroscopeZeroDriftMode_Standard. - * @param[in] handle \ref HidSixAxisSensorHandle - */ -Result ResetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle); - -/** - * @brief IsSixAxisSensorAtRest - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[out] out Output flag. - */ -Result IsSixAxisSensorAtRest(HidSixAxisSensorHandle handle, bool *out); - -/** - * @brief IsFirmwareUpdateAvailableForSixAxisSensor - * @note Only available on [6.0.0+]. - * @param[in] handle \ref HidSixAxisSensorHandle - * @param[out] out Output flag. - */ -Result IsFirmwareUpdateAvailableForSixAxisSensor(HidSixAxisSensorHandle handle, bool *out); - -/** - * @brief Sets which controller styles are supported. - * @note This is automatically called with the needed styles in \ref hidScanInput when required. - * @param[in] style_set Bitfield of \ref HidNpadStyleTag. - */ -Result SetSupportedNpadStyleSet(u32 style_set); - -/** - * @brief Gets which controller styles are supported. - * @param[out] style_set Bitfield of \ref HidNpadStyleTag. - */ -Result GetSupportedNpadStyleSet(u32 *style_set); - -/** - * @brief Sets which \ref HidNpadIdType are supported. - * @note This is automatically called with HidNpadIdType_No{1-8} and HidNpadIdType_Handheld when required in \ref hidScanInput. - * @param[in] ids Input array of \ref HidNpadIdType. - * @param[in] count Total entries in the ids array. Must be <=10. - */ -Result SetSupportedNpadIdType(const HidNpadIdType *ids, size_t count); - -/** - * @brief Gets an Event which is signaled when the \ref hidGetNpadStyleSet output is updated for the specified controller. - * @note The Event must be closed by the user once finished with it. - * @param[in] id \ref HidNpadIdType - * @param[out] out_event Output Event. - * @param[in] autoclear The autoclear for the Event. -**/ -Result AcquireNpadStyleSetUpdateEventHandle(HidNpadIdType id, Event* out_event, bool autoclear); - -/** - * @brief DisconnectNpad - * @param[in] id \ref HidNpadIdType - */ -Result DisconnectNpad(HidNpadIdType id); - -/** - * @brief GetPlayerLedPattern - * @param[in] id \ref HidNpadIdType - * @param[out] out Output value. - */ -Result GetPlayerLedPattern(HidNpadIdType id, u8 *out); - -/** - * @brief Sets the \ref HidNpadJoyHoldType. - * @note Used automatically by \ref hidScanInput when required. - * @param[in] type \ref HidNpadJoyHoldType - */ -Result SetNpadJoyHoldType(HidNpadJoyHoldType type); - -/** - * @brief Gets the \ref HidNpadJoyHoldType. - * @param[out] type \ref HidNpadJoyHoldType - */ -Result GetNpadJoyHoldType(HidNpadJoyHoldType *type); - -/** - * @brief This is the same as \ref hidSetNpadJoyAssignmentModeSingle, except ::HidNpadJoyDeviceType_Left is used for the type. - * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. - */ -Result SetNpadJoyAssignmentModeSingleByDefault(HidNpadIdType id); - -/** - * @brief This is the same as \ref hidSetNpadJoyAssignmentModeSingleWithDestination, except without the output params. - * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. - * @param[in] type \ref HidNpadJoyDeviceType - */ -Result SetNpadJoyAssignmentModeSingle(HidNpadIdType id, HidNpadJoyDeviceType type); - -/** - * @brief Use this if you want to use a pair of joy-cons as a single HidNpadIdType_No*. When used, both joy-cons in a pair should be used with this (HidNpadIdType_No1 and HidNpadIdType_No2 for example). - * @note Used automatically by \ref hidScanInput when required. - * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. - */ -Result SetNpadJoyAssignmentModeDual(HidNpadIdType id); - -/** - * @brief Merge two single joy-cons into a dual-mode controller. Use this after \ref hidSetNpadJoyAssignmentModeDual, when \ref hidSetNpadJoyAssignmentModeSingleByDefault was previously used (this includes using this manually at application exit). - * @brief To be successful, id0/id1 must correspond to controllers supporting styles HidNpadStyleTag_NpadJoyLeft/Right, or HidNpadStyleTag_NpadJoyRight/Left. - * @brief If successful, the id of the resulting dual controller is set to id0. - * @param[in] id0 \ref HidNpadIdType - * @param[in] id1 \ref HidNpadIdType - */ -Result MergeSingleJoyAsDualJoy(HidNpadIdType id0, HidNpadIdType id1); - -/** - * @brief StartLrAssignmentMode - */ -Result StartLrAssignmentMode(void); - -/** - * @brief StopLrAssignmentMode - */ -Result StopLrAssignmentMode(void); - -/** - * @brief Sets the \ref HidNpadHandheldActivationMode. - * @param[in] mode \ref HidNpadHandheldActivationMode - */ -Result SetNpadHandheldActivationMode(HidNpadHandheldActivationMode mode); - -/** - * @brief Gets the \ref HidNpadHandheldActivationMode. - * @param[out] out \ref HidNpadHandheldActivationMode - */ -Result GetNpadHandheldActivationMode(HidNpadHandheldActivationMode *out); - -/** - * @brief SwapNpadAssignment - * @param[in] id0 \ref HidNpadIdType - * @param[in] id1 \ref HidNpadIdType - */ -Result SwapNpadAssignment(HidNpadIdType id0, HidNpadIdType id1); - -/** - * @brief EnableUnintendedHomeButtonInputProtection - * @note To get the state of this, use \ref hidGetNpadSystemButtonProperties to access HidNpadSystemButtonProperties::is_unintended_home_button_input_protection_enabled. - * @param[in] id \ref HidNpadIdType - * @param[in] flag Whether UnintendedHomeButtonInputProtection is enabled. - */ -Result EnableUnintendedHomeButtonInputProtection(HidNpadIdType id, bool flag); - -/** - * @brief Use this if you want to use a single joy-con as a dedicated HidNpadIdType_No*. When used, both joy-cons in a pair should be used with this (HidNpadIdType_No1 and HidNpadIdType_No2 for example). - * @note Only available on [5.0.0+]. - * @param[in] id \ref HidNpadIdType, must be HidNpadIdType_No*. - * @param[in] type \ref HidNpadJoyDeviceType - * @param[out] flag Whether the dest output is set. - * @param[out] dest \ref HidNpadIdType - */ -Result SetNpadJoyAssignmentModeSingleWithDestination(HidNpadIdType id, HidNpadJoyDeviceType type, bool *flag, HidNpadIdType *dest); - -/** - * @brief SetNpadAnalogStickUseCenterClamp - * @note Only available on [6.1.0+]. - * @param[in] flag Flag - */ -Result SetNpadAnalogStickUseCenterClamp(bool flag); - -/** - * @brief Assigns the button(s) which trigger the CaptureButton. - * @note Only available on [8.0.0+]. - * @param[in] style \ref HidNpadStyleTag, exactly 1 bit must be set. - * @param[in] buttons Bitfield of \ref HidNpadButton, multiple bits can be set. - */ -Result SetNpadCaptureButtonAssignment(HidNpadStyleTag style, u64 buttons); - -/** - * @brief ClearNpadCaptureButtonAssignment - * @note Only available on [8.0.0+]. - */ -Result ClearNpadCaptureButtonAssignment(void); - -/** - * @brief Gets and initializes vibration handles. - * @note Only the following styles support total_handles 2: ::HidNpadStyleTag_NpadFullKey, ::HidNpadStyleTag_NpadHandheld, ::HidNpadStyleTag_NpadJoyDual, ::HidNpadStyleTag_NpadHandheldLark, ::HidNpadStyleTag_NpadSystem, ::HidNpadStyleTag_NpadSystemExt. - * @param[out] handles Output array of \ref HidVibrationDeviceHandle. - * @param[in] total_handles Total handles for the handles array. Must be 1 or 2, if 2 handles aren't supported by the specified style an error is thrown. - * @param[in] id \ref HidNpadIdType - * @param[in] style \ref HidNpadStyleTag - */ -Result InitializeVibrationDevices(HidVibrationDeviceHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style); - -/** - * @brief Gets \ref HidVibrationDeviceInfo for the specified device. - * @param[in] handle \ref HidVibrationDeviceHandle - * @param[out] out \ref HidVibrationDeviceInfo - */ -Result GetVibrationDeviceInfo(HidVibrationDeviceHandle handle, HidVibrationDeviceInfo *out); - -/** - * @brief Sends the \ref HidVibrationDeviceHandle to the specified device. - * @note With ::HidVibrationDeviceType_GcErm, use \ref hidSendVibrationGcErmCommand instead. - * @param[in] handle \ref HidVibrationDeviceHandle - * @param[in] value \ref HidVibrationValue - */ -Result SendVibrationValue(HidVibrationDeviceHandle handle, const HidVibrationValue *value); - -/** - * @brief Gets the current \ref HidVibrationValue for the specified device. - * @note With ::HidVibrationDeviceType_GcErm, use \ref hidGetActualVibrationGcErmCommand instead. - * @param[in] handle \ref HidVibrationDeviceHandle - * @param[out] out \ref HidVibrationValue - */ -Result GetActualVibrationValue(HidVibrationDeviceHandle handle, HidVibrationValue *out); - -/** - * @brief Sets whether vibration is allowed, this also affects the config displayed by System Settings. - * @param[in] flag Flag - */ -Result PermitVibration(bool flag); - -/** - * @brief Gets whether vibration is allowed. - * @param[out] flag Flag - */ -Result IsVibrationPermitted(bool *flag); - -/** - * @brief Send vibration values[index] to handles[index]. - * @note With ::HidVibrationDeviceType_GcErm, use \ref hidSendVibrationGcErmCommand instead. - * @param[in] handles Input array of \ref HidVibrationDeviceHandle. - * @param[in] values Input array of \ref HidVibrationValue. - * @param[in] count Total entries in the handles/values arrays. - */ -Result SendVibrationValues(const HidVibrationDeviceHandle *handles, const HidVibrationValue *values, s32 count); - -/** - * @brief Send \ref HidVibrationGcErmCommand to the specified device, for ::HidVibrationDeviceType_GcErm. - * @note Only available on [4.0.0+]. - * @param[in] handle \ref HidVibrationDeviceHandle - * @param[in] cmd \ref HidVibrationGcErmCommand - */ -Result SendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand cmd); - -/** - * @brief Get \ref HidVibrationGcErmCommand for the specified device, for ::HidVibrationDeviceType_GcErm. - * @note Only available on [4.0.0+]. - * @param[in] handle \ref HidVibrationDeviceHandle - * @param[out] out \ref HidVibrationGcErmCommand - */ -Result GetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out); - -/** - * @brief Begins a forced-permitted vibration session. - * @note Only available on [4.0.0+]. - */ -Result BeginPermitVibrationSession(void); - -/** - * @brief Ends the session started by \ref hidBeginPermitVibrationSession. - * @note Only available on [4.0.0+]. - */ -Result EndPermitVibrationSession(void); - -/** - * @brief Gets whether vibration is available with the specified device. - * @note Only available on [7.0.0+]. - * @param[in] handle \ref HidVibrationDeviceHandle - * @param[out] flag Flag - */ -Result IsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag); - -/** - * @brief Starts the SevenSixAxisSensor. - * @note Only available on [5.0.0+]. - */ -Result StartSevenSixAxisSensor(void); - -/** - * @brief Stops the SevenSixAxisSensor. - * @note Only available on [5.0.0+]. - */ -Result StopSevenSixAxisSensor(void); - -/** - * @brief Initializes the SevenSixAxisSensor. - * @note Only available on [5.0.0+]. - */ -Result InitializeSevenSixAxisSensor(void); - -/** - * @brief Finalizes the SevenSixAxisSensor. - * @note This must be called before \ref hidExit. - * @note Only available on [5.0.0+]. - */ -Result FinalizeSevenSixAxisSensor(void); - -/** - * @brief Sets the SevenSixAxisSensor FusionStrength. - * @note Only available on [5.0.0+]. - * @param[in] strength Strength - */ -Result SetSevenSixAxisSensorFusionStrength(float strength); - -/** - * @brief Gets the SevenSixAxisSensor FusionStrength. - * @note Only available on [5.0.0+]. - * @param[out] strength Strength - */ -Result GetSevenSixAxisSensorFusionStrength(float *strength); - -/** - * @brief Resets the timestamp for the SevenSixAxisSensor. - * @note Only available on [6.0.0+]. - */ -Result ResetSevenSixAxisSensorTimestamp(void); - -/** - * @brief GetSevenSixAxisSensorStates - * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. - * @param[out] states Output array of \ref HidSevenSixAxisSensorState. - * @param[in] count Size of the states array in entries. - * @param[out] total_out Total output entries. - */ -Result GetSevenSixAxisSensorStates(HidSevenSixAxisSensorState *states, size_t count, size_t *total_out); - -/** - * @brief IsSevenSixAxisSensorAtRest - * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. - * @param[out] out Output flag. - */ -Result IsSevenSixAxisSensorAtRest(bool *out); - -/** - * @brief GetSensorFusionError - * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. - * @param[out] out Output data. - */ -Result GetSensorFusionError(float *out); - -/** - * @brief GetGyroBias - * @note Only available when \ref hidInitializeSevenSixAxisSensor was previously used. - * @param[out] out \ref UtilFloat3 - */ -Result GetGyroBias(UtilFloat3 *out); - -/** - * @brief IsUsbFullKeyControllerEnabled - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsUsbFullKeyControllerEnabled(bool *out); - -/** - * @brief EnableUsbFullKeyController - * @note Only available on [3.0.0+]. - * @param[in] flag Flag - */ -Result EnableUsbFullKeyController(bool flag); - -/** - * @brief IsUsbFullKeyControllerConnected - * @note Only available on [3.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out Output flag. - */ -Result IsUsbFullKeyControllerConnected(HidNpadIdType id, bool *out); - -/** - * @brief Gets the \ref HidNpadInterfaceType for the specified controller. - * @note When available, \ref hidsysGetNpadInterfaceType should be used instead. - * @note Only available on [4.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out \ref HidNpadInterfaceType - */ -Result GetNpadInterfaceType(HidNpadIdType id, u8 *out); - -/** - * @brief GetNpadOfHighestBatteryLevel - * @note Only available on [10.0.0+]. - * @param[in] ids Input array of \ref HidNpadIdType, ::HidNpadIdType_Handheld is ignored. - * @param[in] count Total entries in the ids array. - * @param[out] out \ref HidNpadIdType - */ -Result GetNpadOfHighestBatteryLevel(const HidNpadIdType *ids, size_t count, HidNpadIdType *out); - -/** - * @brief GetPalmaConnectionHandle - * @note Only available on [5.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out \ref HidPalmaConnectionHandle - */ -Result GetPalmaConnectionHandle(HidNpadIdType id, HidPalmaConnectionHandle *out); - -/** - * @brief InitializePalma - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result InitializePalma(HidPalmaConnectionHandle handle); - -/** - * @brief Gets an Event which is signaled when data is available with \ref hidGetPalmaOperationInfo. - * @note The Event must be closed by the user once finished with it. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[out] out_event Output Event. - * @param[in] autoclear The autoclear for the Event. -**/ -Result AcquirePalmaOperationCompleteEvent(HidPalmaConnectionHandle handle, Event* out_event, bool autoclear); - -/** - * @brief Gets \ref HidPalmaOperationInfo for a completed operation. - * @note This must be used at some point following using any of the other Palma cmds which trigger an Operation, once the Event from \ref hidAcquirePalmaOperationCompleteEvent is signaled. Up to 4 Operations can be queued at once, the other cmds will throw an error once there's too many operations. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[out] out \ref HidPalmaOperationInfo - */ -Result GetPalmaOperationInfo(HidPalmaConnectionHandle handle, HidPalmaOperationInfo *out); - -/** - * @brief PlayPalmaActivity - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] val Input value. - */ -Result PlayPalmaActivity(HidPalmaConnectionHandle handle, u16 val); - -/** - * @brief SetPalmaFrModeType - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] type \ref HidPalmaFrModeType - */ -Result SetPalmaFrModeType(HidPalmaConnectionHandle handle, HidPalmaFrModeType type); - -/** - * @brief ReadPalmaStep - * @note See \ref hidGetPalmaOperationInfo. - * @note \ref hidEnablePalmaStep should be used before this. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result ReadPalmaStep(HidPalmaConnectionHandle handle); - -/** - * @brief EnablePalmaStep - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] flag Flag - */ -Result EnablePalmaStep(HidPalmaConnectionHandle handle, bool flag); - -/** - * @brief ResetPalmaStep - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result ResetPalmaStep(HidPalmaConnectionHandle handle); - -/** - * @brief ReadPalmaApplicationSection - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] inval0 First input value. - * @param[in] size This must be within the size of \ref HidPalmaApplicationSectionAccessBuffer. - */ -Result ReadPalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size); - -/** - * @brief WritePalmaApplicationSection - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] inval0 First input value. - * @param[in] size Size of the data in \ref HidPalmaApplicationSectionAccessBuffer. - * @param[in] buf \ref HidPalmaApplicationSectionAccessBuffer - */ -Result WritePalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size, const HidPalmaApplicationSectionAccessBuffer *buf); - -/** - * @brief ReadPalmaUniqueCode - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result ReadPalmaUniqueCode(HidPalmaConnectionHandle handle); - -/** - * @brief SetPalmaUniqueCodeInvalid - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result SetPalmaUniqueCodeInvalid(HidPalmaConnectionHandle handle); - -/** - * @brief WritePalmaActivityEntry - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] unk Unknown - * @param[in] entry \ref HidPalmaActivityEntry - */ -Result WritePalmaActivityEntry(HidPalmaConnectionHandle handle, u16 unk, const HidPalmaActivityEntry *entry); - -/** - * @brief WritePalmaRgbLedPatternEntry - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] unk Unknown - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - */ -Result WritePalmaRgbLedPatternEntry(HidPalmaConnectionHandle handle, u16 unk, const void* buffer, size_t size); - -/** - * @brief WritePalmaWaveEntry - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] wave_set \ref HidPalmaWaveSet - * @param[in] unk Unknown - * @param[in] buffer TransferMemory buffer, must be 0x1000-byte aligned. - * @param[in] tmem_size TransferMemory buffer size, must be 0x1000-byte aligned. - * @param[in] size Actual size of the data in the buffer. - */ -Result WritePalmaWaveEntry(HidPalmaConnectionHandle handle, HidPalmaWaveSet wave_set, u16 unk, const void* buffer, size_t tmem_size, size_t size); - -/** - * @brief SetPalmaDataBaseIdentificationVersion - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] version Version - */ -Result SetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle, s32 version); - -/** - * @brief GetPalmaDataBaseIdentificationVersion - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result GetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle); - -/** - * @brief SuspendPalmaFeature - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] features Bitfield of \ref HidPalmaFeature. - */ -Result SuspendPalmaFeature(HidPalmaConnectionHandle handle, u32 features); - -/** - * @brief ReadPalmaPlayLog - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.1.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] unk Unknown - */ -Result ReadPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk); - -/** - * @brief ResetPalmaPlayLog - * @note See \ref hidGetPalmaOperationInfo. - * @note Only available on [5.1.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[in] unk Unknown - */ -Result ResetPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk); - -/** - * @brief Sets whether any Palma can connect. - * @note Only available on [5.1.0+]. - * @param[in] flag Flag - */ -Result SetIsPalmaAllConnectable(bool flag); - -/** - * @brief Sets whether paired Palma can connect. - * @note Only available on [5.1.0+]. - * @param[in] flag Flag - */ -Result SetIsPalmaPairedConnectable(bool flag); - -/** - * @brief PairPalma - * @note Only available on [5.1.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result PairPalma(HidPalmaConnectionHandle handle); - -/** - * @brief CancelWritePalmaWaveEntry - * @note Only available on [7.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - */ -Result CancelWritePalmaWaveEntry(HidPalmaConnectionHandle handle); - -/** - * @brief EnablePalmaBoostMode - * @note Only available on [5.1.0+]. Uses cmd EnablePalmaBoostMode on [8.0.0+], otherwise cmd SetPalmaBoostMode is used. - * @param[in] flag Flag - */ -Result EnablePalmaBoostMode(bool flag); - -/** - * @brief GetPalmaBluetoothAddress - * @note Only available on [8.0.0+]. - * @param[in] handle \ref HidPalmaConnectionHandle - * @param[out] out \ref BtdrvAddress - */ -Result GetPalmaBluetoothAddress(HidPalmaConnectionHandle handle, BtdrvAddress *out); - -/** - * @brief SetDisallowedPalmaConnection - * @note Only available on [8.0.0+]. - * @param[in] addrs Input array of \ref BtdrvAddress. - * @param[in] count Total entries in the addrs array. - */ -Result SetDisallowedPalmaConnection(const BtdrvAddress *addrs, s32 count); - -/** - * @brief SetNpadCommunicationMode - * @note [2.0.0+] Stubbed, just returns 0. - * @param[in] mode \ref HidNpadCommunicationMode - */ -Result SetNpadCommunicationMode(HidNpadCommunicationMode mode); - -/** - * @brief GetNpadCommunicationMode - * @note [2.0.0+] Stubbed, always returns output mode ::HidNpadCommunicationMode_Default. - * @param[out] out \ref HidNpadCommunicationMode - */ -Result GetNpadCommunicationMode(HidNpadCommunicationMode *out); - -/** - * @brief SetTouchScreenConfiguration - * @note Only available on [9.0.0+]. - * @param[in] config \ref HidTouchScreenConfigurationForNx - */ -Result SetTouchScreenConfiguration(const HidTouchScreenConfigurationForNx *config); - -/** - * @brief IsFirmwareUpdateNeededForNotification - * @note Only available on [9.0.0+]. - * @param[out] out Output flag. - */ -Result IsFirmwareUpdateNeededForNotification(bool *out); - -} // namespace hid - -/// @brief C++ wrappers for the `hidbus` API. -/// @details Wraps: switch/services/hidbus.h. -namespace hidbus { - -/// BusHandle -using ::HidbusBusHandle; -/// BusType -using ::HidbusBusType; -/// HidbusDataAccessorHeader -using ::HidbusDataAccessorHeader; -/// HidbusJoyButtonOnlyPollingDataAccessor -using ::HidbusJoyButtonOnlyPollingDataAccessor; -/// HidbusJoyButtonOnlyPollingDataAccessorEntry -using ::HidbusJoyButtonOnlyPollingDataAccessorEntry; -/// HidbusJoyButtonOnlyPollingDataAccessorEntryData -using ::HidbusJoyButtonOnlyPollingDataAccessorEntryData; -/// HidbusJoyDisableSixAxisPollingDataAccessor -using ::HidbusJoyDisableSixAxisPollingDataAccessor; -/// HidbusJoyDisableSixAxisPollingDataAccessorEntry -using ::HidbusJoyDisableSixAxisPollingDataAccessorEntry; -/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData -using ::HidbusJoyDisableSixAxisPollingDataAccessorEntryData; -/// HidbusJoyEnableSixAxisPollingDataAccessor -using ::HidbusJoyEnableSixAxisPollingDataAccessor; -/// HidbusJoyEnableSixAxisPollingDataAccessorEntry -using ::HidbusJoyEnableSixAxisPollingDataAccessorEntry; -/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData -using ::HidbusJoyEnableSixAxisPollingDataAccessorEntryData; -/// JoyPollingMode -using ::HidbusJoyPollingMode; -/// JoyPollingReceivedData -using ::HidbusJoyPollingReceivedData; -/// StatusManager -using ::HidbusStatusManager; -/// HidbusStatusManagerEntry -using ::HidbusStatusManagerEntry; -/// Common data for HidbusStatusManagerEntry*. -using ::HidbusStatusManagerEntryCommon; -/// HidbusStatusManagerEntry on 5.x. -using ::HidbusStatusManagerEntryV5; -/// StatusManager on 5.x. -using ::HidbusStatusManagerV5; - -/// Gets the Service object for the actual hidbus service session. This object must be closed by the user once finished using cmds with this. -Result GetServiceSession(Service* srv_out); - -/// Gets the SharedMemory addr (\ref HidbusStatusManagerV5 on 5.x, otherwise \ref HidbusStatusManager). Only valid when at least one BusHandle is currently initialized (\ref hidbusInitialize). -void* GetSharedmemAddr(void); - -/** - * @brief GetBusHandle - * @param[out] handle \ref HidbusBusHandle - * @param[out] flag Output flag indicating whether the handle is valid. - * @param[in] id \ref HidNpadIdType - * @param[in] bus_type \ref HidbusBusType - */ -Result GetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type); - -/** - * @brief Initialize - * @param[in] handle \ref HidbusBusHandle - */ -Result Initialize(HidbusBusHandle handle); - -/** - * @brief Finalize - * @param[in] handle \ref HidbusBusHandle - */ -Result Finalize(HidbusBusHandle handle); - -/** - * @brief EnableExternalDevice - * @note This uses \ref hidLaShowControllerFirmwareUpdate if needed. - * @param[in] handle \ref HidbusBusHandle - * @param[in] flag Whether to enable the device (true = enable, false = disable). When false, this will internally use \ref hidbusDisableJoyPollingReceiveMode if needed. - * @param[in] device_id ExternalDeviceId which must match the connected device. Only used when flag is set. - */ -Result EnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id); - -/** - * @brief SendAndReceive - * @param[in] handle \ref HidbusBusHandle - * @param[in] inbuf Input buffer, containing the command data. - * @param[in] inbuf_size Input buffer size, must be <0x26. - * @param[out] outbuf Output buffer, containing the command reply data. - * @param[in] outbuf_size Output buffer max size. - * @param[out] out_size Actual output size. - */ -Result SendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size); - -/** - * @brief EnableJoyPollingReceiveMode - * @param[in] handle \ref HidbusBusHandle - * @param[in] inbuf Input buffer, containing the command data. - * @param[in] inbuf_size Input buffer size, must be <0x26. - * @param[out] workbuf TransferMemory buffer, must be 0x1000-byte aligned. This buffer must not be written to until after \ref hidbusDisableJoyPollingReceiveMode is used. - * @param[in] workbuf_size TransferMemory buffer size, must be 0x1000-byte aligned. - * @param[in] polling_mode \ref HidbusJoyPollingMode - */ -Result EnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode); - -/** - * @brief DisableJoyPollingReceiveMode - * @note This can also be used via \ref hidbusEnableExternalDevice with flag=false. - * @param[in] handle \ref HidbusBusHandle - */ -Result DisableJoyPollingReceiveMode(HidbusBusHandle handle); - -/** - * @brief GetJoyPollingReceivedData - * @param[in] handle \ref HidbusBusHandle - * @param[out] recv_data Output array of \ref HidbusJoyPollingReceivedData. - * @param[in] count Total entries for the recv_data array. The maximum is 0xa. Official apps use range 0x1-0x9. - */ -Result GetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count); - -} // namespace hidbus - -/// @brief C++ wrappers for the `hiddbg` API. -/// @details Wraps: switch/services/hiddbg.h. -namespace hiddbg { - -/// AbstractedPadHandle -using ::HiddbgAbstractedPadHandle; -/// AbstractedPadState -using ::HiddbgAbstractedPadState; -/// State for overriding \ref HidDebugPadState. -using ::HiddbgDebugPadAutoPilotState; -/// HdlsAttribute -using ::HiddbgHdlsAttribute; -/// HdlsDeviceInfo, for [9.0.0+]. Converted to/from \ref HiddbgHdlsDeviceInfoV7 on prior sysvers. -using ::HiddbgHdlsDeviceInfo; -/// HdlsDeviceInfo, for [7.0.0-8.1.0]. -using ::HiddbgHdlsDeviceInfoV7; -/// HdlsHandle -using ::HiddbgHdlsHandle; -/// HdlsNpadAssignment. Same controllers as \ref HiddbgHdlsStateList, with different entry data. -using ::HiddbgHdlsNpadAssignment; -/// HdlsNpadAssignmentEntry -using ::HiddbgHdlsNpadAssignmentEntry; -/// HdlsSessionId, returned by \ref hiddbgAttachHdlsWorkBuffer. -using ::HiddbgHdlsSessionId; -/// HdlsState, for [12.0.0+]. -using ::HiddbgHdlsState; -/// HdlsStateList, for [12.0.0+]. -/// This contains a list of all controllers, including non-virtual controllers. -using ::HiddbgHdlsStateList; -/// HdlsStateListEntry, for [12.0.0+]. -using ::HiddbgHdlsStateListEntry; -/// HdlsStateListEntryV7, for [7.0.0-8.1.0]. -using ::HiddbgHdlsStateListEntryV7; -/// HdlsStateListEntry, for [9.0.0-11.0.1]. -using ::HiddbgHdlsStateListEntryV9; -/// HdlsStateListV7, for [7.0.0-8.1.0]. This contains a list of all controllers, including non-virtual controllers. -using ::HiddbgHdlsStateListV7; -/// HdlsStateList, for [9.0.0-11.0.1]. -using ::HiddbgHdlsStateListV9; -/// HdlsState, for [7.0.0-8.1.0]. -using ::HiddbgHdlsStateV7; -/// HdlsState, for [9.0.0-11.0.1]. -using ::HiddbgHdlsStateV9; -/// State for overriding \ref HidKeyboardState. -using ::HiddbgKeyboardAutoPilotState; -/// State for overriding \ref HidMouseState. -using ::HiddbgMouseAutoPilotState; -/// HiddbgNpadButton. For the remaining buttons, see \ref HidNpadButton. -using ::HiddbgNpadButton; -/// State for overriding SleepButtonState. -using ::HiddbgSleepButtonAutoPilotState; - -/// Initialize hiddbg. -Result Initialize(void); - -/// Exit hiddbg. -void Exit(void); - -/// Gets the Service object for the actual hiddbg service session. -Service* GetServiceSession(void); - -/** - * @brief SetDebugPadAutoPilotState - * @param[in] state \ref HiddbgDebugPadAutoPilotState - */ -Result SetDebugPadAutoPilotState(const HiddbgDebugPadAutoPilotState *state); - -/** - * @brief UnsetDebugPadAutoPilotState - */ -Result UnsetDebugPadAutoPilotState(void); - -/** - * @brief SetTouchScreenAutoPilotState - * @param[in] states Input array of \ref HiddbgMouseAutoPilotState. - * @param[in] count Total entries in the states array. Max is 16. - */ -Result SetTouchScreenAutoPilotState(const HidTouchState *states, s32 count); - -/** - * @brief UnsetTouchScreenAutoPilotState - */ -Result UnsetTouchScreenAutoPilotState(void); - -/** - * @brief SetMouseAutoPilotState - * @param[in] state \ref HiddbgMouseAutoPilotState - */ -Result SetMouseAutoPilotState(const HiddbgMouseAutoPilotState *state); - -/** - * @brief UnsetMouseAutoPilotState - */ -Result UnsetMouseAutoPilotState(void); - -/** - * @brief SetKeyboardAutoPilotState - * @param[in] state \ref HiddbgKeyboardAutoPilotState - */ -Result SetKeyboardAutoPilotState(const HiddbgKeyboardAutoPilotState *state); - -/** - * @brief UnsetKeyboardAutoPilotState - */ -Result UnsetKeyboardAutoPilotState(void); - -/** - * @brief Deactivates the HomeButton. - */ -Result DeactivateHomeButton(void); - -/** - * @brief SetSleepButtonAutoPilotState - * @param[in] state \ref HiddbgSleepButtonAutoPilotState - */ -Result SetSleepButtonAutoPilotState(const HiddbgSleepButtonAutoPilotState *state); - -/** - * @brief UnsetSleepButtonAutoPilotState - */ -Result UnsetSleepButtonAutoPilotState(void); - -/** - * @brief Writes the input RGB colors to the spi-flash for the specified UniquePad (offset 0x6050 size 0x6). - * @note Only available with [3.0.0+]. - * @param[in] colorBody RGB body color. - * @param[in] colorButtons RGB buttons color. - * @param[in] unique_pad_id \ref HidsysUniquePadId - */ -Result UpdateControllerColor(u32 colorBody, u32 colorButtons, HidsysUniquePadId unique_pad_id); - -/** - * @brief Writes the input RGB colors followed by inval to the spi-flash for the specified UniquePad (offset 0x6050 size 0xD). - * @note Only available with [5.0.0+]. - * @param[in] colorBody RGB body color. - * @param[in] colorButtons RGB buttons color. - * @param[in] colorLeftGrip RGB left grip color. - * @param[in] colorRightGrip RGB right grip color. - * @param[in] inval Input value. - * @param[in] unique_pad_id \ref HidsysUniquePadId - */ -Result UpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip, u32 colorRightGrip, u8 inval, HidsysUniquePadId unique_pad_id); - -/** - * @brief Get the OperationEvent for the specified UniquePad. - * @note The Event must be closed by the user once finished with it. - * @note Only available with [6.0.0+]. - * @param[out] out_event Output Event. - * @param[in] autoclear The autoclear for the Event. - * @param[in] unique_pad_id \ref HidsysUniquePadId -**/ -Result AcquireOperationEventHandle(Event* out_event, bool autoclear, HidsysUniquePadId unique_pad_id); - -/** - * @brief Reads spi-flash for the specified UniquePad. - * @note This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used. - * @note Only available with [6.0.0+]. - * @param[in] offset Offset in spi-flash. - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size. - * @param[in] unique_pad_id \ref HidsysUniquePadId -**/ -Result ReadSerialFlash(u32 offset, void* buffer, size_t size, HidsysUniquePadId unique_pad_id); - -/** - * @brief Writes spi-flash for the specified UniquePad. - * @note This also uses \ref hiddbgAcquireOperationEventHandle to wait for the operation to finish, then \ref hiddbgGetOperationResult is used. - * @note Only available with [6.0.0+]. - * @param[in] offset Offset in spi-flash. - * @param[in] buffer Input buffer, must be 0x1000-byte aligned. - * @param[in] tmem_size Size of the buffer, must be 0x1000-byte aligned. - * @param[in] size Actual transfer size. - * @param[in] unique_pad_id \ref HidsysUniquePadId -**/ -Result WriteSerialFlash(u32 offset, void* buffer, size_t tmem_size, size_t size, HidsysUniquePadId unique_pad_id); - -/** - * @brief Get the Result for the Operation and handles cleanup, for the specified UniquePad. - * @note Only available with [6.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId -**/ -Result GetOperationResult(HidsysUniquePadId unique_pad_id); - -/** - * @brief Gets the internal DeviceType for the specified controller. - * @note Only available with [6.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Pre-9.0.0 this is an u32, with [9.0.0+] it's an u8. -**/ -Result GetUniquePadDeviceTypeSetInternal(HidsysUniquePadId unique_pad_id, u32 *out); - -/** @name AbstractedPad - * This is for virtual HID controllers. Only use this on pre-7.0.0, Hdls should be used otherwise. - */ -/** - * @brief Gets a list of \ref HiddbgAbstractedPadHandle. - * @note Only available with [5.0.0-8.1.0]. - * @param[out] handles Output array of \ref HiddbgAbstractedPadHandle. - * @param[in] count Max number of entries for the handles array. - * @param[out] total_out Total output entries. - */ -Result GetAbstractedPadHandles(HiddbgAbstractedPadHandle *handles, s32 count, s32 *total_out); - -/** - * @brief Gets the state for the specified \ref HiddbgAbstractedPadHandle. - * @note Only available with [5.0.0-8.1.0]. - * @param[in] handle \ref HiddbgAbstractedPadHandle - * @param[out] state \ref HiddbgAbstractedPadState - */ -Result GetAbstractedPadState(HiddbgAbstractedPadHandle handle, HiddbgAbstractedPadState *state); - -/** - * @brief Similar to \ref hiddbgGetAbstractedPadHandles except this also returns the state for each pad in output array states. - * @note Only available with [5.0.0-8.1.0]. - * @param[out] handles Output array of \ref HiddbgAbstractedPadHandle. - * @param[out] states Output array of \ref HiddbgAbstractedPadState. - * @param[in] count Max number of entries for the handles/states arrays. - * @param[out] total_out Total output entries. - */ -Result GetAbstractedPadsState(HiddbgAbstractedPadHandle *handles, HiddbgAbstractedPadState *states, s32 count, s32 *total_out); - -/** - * @brief Sets AutoPilot state for the specified pad. - * @note Only available with [5.0.0-8.1.0]. - * @param[in] AbstractedVirtualPadId This can be any unique value as long as it's within bounds. For example, 0-7 is usable. - * @param[in] state \ref HiddbgAbstractedPadState - */ -Result SetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId, const HiddbgAbstractedPadState *state); - -/** - * @brief Clears AutoPilot state for the specified pad set by \ref hiddbgSetAutoPilotVirtualPadState. - * @note Only available with [5.0.0-8.1.0]. - * @param[in] AbstractedVirtualPadId Id from \ref hiddbgSetAutoPilotVirtualPadState. - */ -Result UnsetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId); - -/** - * @brief Clears AutoPilot state for all pads set by \ref hiddbgSetAutoPilotVirtualPadState. - */ -Result UnsetAllAutoPilotVirtualPadState(void); - -/** @name Hdls - * This is for virtual HID controllers. - */ -/** - * @brief Initialize Hdls. - * @note Only available with [7.0.0+]. - * @param[out] session_id [13.0.0+] \ref HiddbgHdlsSessionId - * @param[in] buffer An existing buffer to be used as transfer memory. - * @param[in] size Size of the supplied buffer. - */ -Result AttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, size_t size); - -/** - * @brief Exit Hdls, must be called at some point prior to \ref hiddbgExit. - * @note Only available with [7.0.0+]. - * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId - */ -Result ReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id); - -/** - * @brief Checks if the given device is still attached. - * @note Only available with [7.0.0+]. - * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId - * @param[in] handle \ref HiddbgHdlsHandle - * @param[out] out Whether the device is attached. - */ -Result IsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgHdlsHandle handle, bool *out); - -/** - * @brief Gets state for \ref HiddbgHdlsNpadAssignment. - * @note Only available with [7.0.0+]. - * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId - * @param[out] state \ref HiddbgHdlsNpadAssignment - */ -Result DumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgHdlsNpadAssignment *state); - -/** - * @brief Gets state for \ref HiddbgHdlsStateList. - * @note Only available with [7.0.0+]. - * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId - * @param[out] state \ref HiddbgHdlsStateList - */ -Result DumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList *state); - -/** - * @brief Sets state for \ref HiddbgHdlsNpadAssignment. - * @note Only available with [7.0.0+]. - * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId - * @param[in] state \ref HiddbgHdlsNpadAssignment - * @param[in] flag Flag - */ -Result ApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const HiddbgHdlsNpadAssignment *state, bool flag); - -/** - * @brief Sets state for \ref HiddbgHdlsStateList. - * @note The \ref HiddbgHdlsState will be applied for each \ref HiddbgHdlsHandle. If a \ref HiddbgHdlsHandle is not found, code similar to \ref hiddbgAttachHdlsVirtualDevice will run with the \ref HiddbgHdlsDeviceInfo, then it will continue with applying state with the new device. - * @note Only available with [7.0.0+]. - * @param[in] session_id [13.0.0+] \ref HiddbgHdlsSessionId - * @param[in] state \ref HiddbgHdlsStateList - */ -Result ApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdlsStateList *state); - -/** - * @brief Attach a device with the input info. - * @note Only available with [7.0.0+]. - * @param[out] handle \ref HiddbgHdlsHandle - * @param[in] info \ref HiddbgHdlsDeviceInfo - */ -Result AttachHdlsVirtualDevice(HiddbgHdlsHandle *handle, const HiddbgHdlsDeviceInfo *info); - -/** - * @brief Detach the specified device. - * @note Only available with [7.0.0+]. - * @param[in] handle \ref HiddbgHdlsHandle - */ -Result DetachHdlsVirtualDevice(HiddbgHdlsHandle handle); - -/** - * @brief Sets state for the specified device. - * @note Only available with [7.0.0+]. - * @param[in] handle \ref HiddbgHdlsHandle - * @param[in] state \ref HiddbgHdlsState - */ -Result SetHdlsState(HiddbgHdlsHandle handle, const HiddbgHdlsState *state); - -} // namespace hiddbg - -/// @brief C++ wrappers for the `hidsys` API. -/// @details Wraps: switch/services/hidsys.h. -namespace hidsys { - -/// AnalogStickAssignment -using ::HidcfgAnalogStickAssignment; -/// AnalogStickRotation -using ::HidcfgAnalogStickRotation; -/// ButtonConfigEmbedded -using ::HidcfgButtonConfigEmbedded; -/// ButtonConfigFull -using ::HidcfgButtonConfigFull; -/// ButtonConfigLeft -using ::HidcfgButtonConfigLeft; -/// ButtonConfigRight -using ::HidcfgButtonConfigRight; -/// Selects what button to map to. -using ::HidcfgDigitalButtonAssignment; -/// StorageName -using ::HidcfgStorageName; -/// ButtonConfigEmbedded -using ::HidsysButtonConfigEmbedded; -/// ButtonConfigFull -using ::HidsysButtonConfigFull; -/// ButtonConfigLeft -using ::HidsysButtonConfigLeft; -/// ButtonConfigRight -using ::HidsysButtonConfigRight; -/// Structure for \ref hidsysSetNotificationLedPattern. -/// See also: https://switchbrew.org/wiki/HID_services#NotificationLedPattern -/// Only the low 4bits of each used byte in this struct is used. -using ::HidsysNotificationLedPattern; -/// Mini Cycle struct for \ref HidsysNotificationLedPattern. -using ::HidsysNotificationLedPatternCycle; -/// UniquePadId for a controller. -using ::HidsysUniquePadId; -/// UniquePadSerialNumber -using ::HidsysUniquePadSerialNumber; -/// UniquePadType -using ::HidsysUniquePadType; - -/// Initialize hidsys. -Result Initialize(void); - -/// Exit hidsys. -void Exit(void); - -/// Gets the Service object for the actual hidsys service session. -Service* GetServiceSession(void); - -/** - * @brief SendKeyboardLockKeyEvent - * @param[in] events Bitfield of \ref HidKeyboardLockKeyEvent. - */ -Result SendKeyboardLockKeyEvent(u32 events); - -/** - * @brief Gets an Event which is signaled when HidHomeButtonState is updated. - * @note The Event must be closed by the user once finished with it. - * @note This generally shouldn't be used, since AM-sysmodule uses it internally. - * @param[out] out_event Output Event. - * @param[in] Event autoclear. -**/ -Result AcquireHomeButtonEventHandle(Event* out_event, bool autoclear); - -/** - * @brief Activates the HomeButton sharedmem. - * @note This generally shouldn't be used, since AM-sysmodule uses it internally. -**/ -Result ActivateHomeButton(void); - -/** - * @brief Gets an Event which is signaled when HidSleepButtonState is updated. - * @note The Event must be closed by the user once finished with it. - * @note This generally shouldn't be used, since AM-sysmodule uses it internally. - * @param[out] out_event Output Event. - * @param[in] Event autoclear. -**/ -Result AcquireSleepButtonEventHandle(Event* out_event, bool autoclear); - -/** - * @brief Activates the SleepButton sharedmem. - * @note This generally shouldn't be used, since AM-sysmodule uses it internally. -**/ -Result ActivateSleepButton(void); - -/** - * @brief Gets an Event which is signaled when HidCaptureButtonState is updated. - * @note The Event must be closed by the user once finished with it. - * @note This generally shouldn't be used, since AM-sysmodule uses it internally. - * @param[out] out_event Output Event. - * @param[in] Event autoclear. -**/ -Result AcquireCaptureButtonEventHandle(Event* out_event, bool autoclear); - -/** - * @brief Activates the CaptureButton sharedmem. - * @note This generally shouldn't be used, since AM-sysmodule uses it internally. -**/ -Result ActivateCaptureButton(void); - -/** - * @brief Applies npad system common policy. - */ -Result ApplyNpadSystemCommonPolicy(void); - -/** - * @brief Gets the npad id type of the last controller that was active. - * @param[out] out of \ref HidNpadIdType. - */ -Result GetLastActiveNpad(u32 *out); - -/** - * @brief Gets the SupportedNpadStyleSet for the CallerApplet. applet must be initialized in order to use this (uses \ref appletGetAppletResourceUserIdOfCallerApplet). - * @note Only available on [6.0.0+]. - * @param[out] out Bitmask of \ref HidNpadStyleTag. - */ -Result GetSupportedNpadStyleSetOfCallerApplet(u32 *out); - -/** - * @brief Gets the \ref HidNpadInterfaceType for the specified controller. - * @note Only available on [10.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out \ref HidNpadInterfaceType - */ -Result GetNpadInterfaceType(HidNpadIdType id, u8 *out); - -/** - * @brief GetNpadLeftRightInterfaceType - * @note Only available on [10.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out0 \ref HidNpadInterfaceType - * @param[out] out1 \ref HidNpadInterfaceType - */ -Result GetNpadLeftRightInterfaceType(HidNpadIdType id, u8 *out0, u8 *out1); - -/** - * @brief HasBattery - * @note Only available on [10.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out Output flag. - */ -Result HasBattery(HidNpadIdType id, bool *out); - -/** - * @brief HasLeftRightBattery - * @note Only available on [10.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] out0 Output flag. - * @param[out] out1 Output flag. - */ -Result HasLeftRightBattery(HidNpadIdType id, bool *out0, bool *out1); - -/** - * @brief Gets the UniquePadIds for the specified controller. - * @note Only available on [3.0.0+]. - * @param[in] id \ref HidNpadIdType - * @param[out] unique_pad_ids Output array of \ref HidsysUniquePadId. - * @param[in] count Max number of entries for the unique_pad_ids array. - * @param[out] total_out Total output array entries. Optional, can be NULL. - */ -Result GetUniquePadsFromNpad(HidNpadIdType id, HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out); - -/** - * @brief Sets information that your AppletResourceUserId is in focus. - * @note This is automatically used by am-sysmodule, don't use it if your AppletType is other than None. - * @note Using it with uninitialized applet services results in your process being tied to currently focused applet. - */ -Result SetAppletResourceUserId(void); - -/** - * @brief EnableAppletToGetInput - * @param[in] enable Input flag. -**/ -Result EnableAppletToGetInput(bool enable); - -/** - * @brief EnableHandheldHids -**/ -Result EnableHandheldHids(void); - -/** - * @brief DisableHandheldHids -**/ -Result DisableHandheldHids(void); - -/** - * @brief SetJoyConRailEnabled - * @note Only available on [9.0.0+]. - * @param[in] enable Input flag. -**/ -Result SetJoyConRailEnabled(bool enable); - -/** - * @brief IsJoyConRailEnabled - * @note Only available on [9.0.0+]. - * @param[out] out Output flag. -**/ -Result IsJoyConRailEnabled(bool *out); - -/** - * @brief IsHandheldHidsEnabled - * @note Only available on [10.0.0+]. - * @param[out] out Output flag. -**/ -Result IsHandheldHidsEnabled(bool *out); - -/** - * @brief IsJoyConAttachedOnAllRail - * @note Only available on [11.0.0+]. - * @param[out] out Output flag. -**/ -Result IsJoyConAttachedOnAllRail(bool *out); - -/** - * @brief IsInvertedControllerConnectedOnRail - * @note Only available on [19.0.0+]. - * @param[out] out Output flag. -**/ -Result IsInvertedControllerConnectedOnRail(bool *out); - -/** - * @brief AcquireUniquePadConnectionEventHandle - * @param[out] out_event Output Event. - */ -Result AcquireUniquePadConnectionEventHandle(Event *out_event); - -/** - * @brief Gets a list of all UniquePadIds. - * @param[out] unique_pad_ids Output array of \ref HidsysUniquePadId. - * @param[in] count Max number of entries for the unique_pad_ids array. - * @param[out] total_out Total output array entries. Optional, can be NULL. - */ -Result GetUniquePadIds(HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out); - -/** - * @brief AcquireJoyDetachOnBluetoothOffEventHandle - * @param[out] out_event Output Event. - * @param[in] Event autoclear. - */ -Result AcquireJoyDetachOnBluetoothOffEventHandle(Event *out_event, bool autoclear); - -/** - * @brief GetUniquePadBluetoothAddress - * @note Only available on [3.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] address \ref BtdrvAddress - */ -Result GetUniquePadBluetoothAddress(HidsysUniquePadId unique_pad_id, BtdrvAddress *address); - -/** - * @brief DisconnectUniquePad - * @note Only available on [3.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - */ -Result DisconnectUniquePad(HidsysUniquePadId unique_pad_id); - -/** - * @brief GetUniquePadType - * @note Only available on [5.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] pad_type \ref HidsysUniquePadType - */ -Result GetUniquePadType(HidsysUniquePadId unique_pad_id, HidsysUniquePadType *pad_type); - -/** - * @brief GetUniquePadInterface - * @note Only available on [5.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] interface \ref HidNpadInterfaceType - */ -Result GetUniquePadInterface(HidsysUniquePadId unique_pad_id, HidNpadInterfaceType *interface); - -/** - * @brief Gets the \ref HidsysUniquePadSerialNumber. - * @note Only available on [5.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] serial \ref HidsysUniquePadSerialNumber - */ -Result GetUniquePadSerialNumber(HidsysUniquePadId unique_pad_id, HidsysUniquePadSerialNumber *serial); - -/** - * @brief GetUniquePadControllerNumber - * @note Only available on [5.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] number Controller number. - */ -Result GetUniquePadControllerNumber(HidsysUniquePadId unique_pad_id, u64 *number); - -/** - * @brief Sets the HOME-button notification LED pattern, for the specified controller. - * @note Generally this should only be used if \ref hidsysSetNotificationLedPatternWithTimeout is not usable. - * @note Only available on [7.0.0+]. - * @param[in] pattern \ref HidsysNotificationLedPattern - * @param[in] unique_pad_id \ref HidsysUniquePadId - */ -Result SetNotificationLedPattern(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id); - -/** - * @brief Sets the HOME-button notification LED pattern, for the specified controller. The LED will automatically be disabled once the specified timeout occurs. - * @note Only available on [9.0.0+], and with controllers which have the [9.0.0+] firmware installed. - * @param[in] pattern \ref HidsysNotificationLedPattern - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] timeout Timeout in nanoseconds. - */ -Result SetNotificationLedPatternWithTimeout(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id, u64 timeout); - -/** - * @brief IsUsbFullKeyControllerEnabled - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsUsbFullKeyControllerEnabled(bool *out); - -/** - * @brief EnableUsbFullKeyController - * @note Only available on [3.0.0+]. - * @param[in] flag Flag - */ -Result EnableUsbFullKeyController(bool flag); - -/** - * @brief IsUsbConnected - * @note Only available on [3.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Output flag. - */ -Result IsUsbConnected(HidsysUniquePadId unique_pad_id, bool *out); - -/** - * @brief GetTouchScreenDefaultConfiguration - * @note Only available on [9.0.0+]. - * @param[out] touch_screen_configuration \ref HidTouchScreenConfigurationForNx. - */ -Result GetTouchScreenDefaultConfiguration(HidTouchScreenConfigurationForNx *touch_screen_configuration); - -/** - * @brief IsFirmwareUpdateNeededForNotification - * @note Only available on [9.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Output flag. - */ -Result IsFirmwareUpdateNeededForNotification(HidsysUniquePadId unique_pad_id, bool *out); - -/** - * @brief Legacy IsButtonConfigSupported. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysIsButtonConfigSupported instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Output bool flag. - */ -Result LegacyIsButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out); - -/** - * @brief IsButtonConfigSupported - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigSupported instead. - * @param[in] addr \ref BtdrvAddress - * @param[out] out Output bool flag. - */ -Result IsButtonConfigSupported(BtdrvAddress addr, bool *out); - -/** - * @brief IsButtonConfigEmbeddedSupported - * @note Only available on [11.0.0-17.0.1]. - * @param[out] out Output bool flag. - */ -Result IsButtonConfigEmbeddedSupported(bool *out); - -/** - * @brief Legacy DeleteButtonConfig. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysDeleteButtonConfig instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - */ -Result LegacyDeleteButtonConfig(HidsysUniquePadId unique_pad_id); - -/** - * @brief DeleteButtonConfig - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyDeleteButtonConfig instead. - * @param[in] addr \ref BtdrvAddress - */ -Result DeleteButtonConfig(BtdrvAddress addr); - -/** - * @brief DeleteButtonConfigEmbedded - * @note Only available on [11.0.0-17.0.1]. - */ -Result DeleteButtonConfigEmbedded(void); - -/** - * @brief Legacy SetButtonConfigEnabled. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigEnabled instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] flag Input flag. - */ -Result LegacySetButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool flag); - -/** - * @brief SetButtonConfigEnabled - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEnabled instead. - * @param[in] addr \ref BtdrvAddress - * @param[in] flag Input flag. - */ -Result SetButtonConfigEnabled(BtdrvAddress addr, bool flag); - -/** - * @brief SetButtonConfigEmbeddedEnabled - * @note Only available on [11.0.0-17.0.1]. - * @param[in] flag Input flag. - */ -Result SetButtonConfigEmbeddedEnabled(bool flag); - -/** - * @brief Legacy IsButtonConfigEnabled. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysIsButtonConfigEnabled instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Output bool flag. - */ -Result LegacyIsButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool *out); - -/** - * @brief IsButtonConfigEnabled - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyIsButtonConfigEnabled instead. - * @param[in] addr \ref BtdrvAddress - * @param[in] out Output bool flag. - */ -Result IsButtonConfigEnabled(BtdrvAddress addr, bool *out); - -/** - * @brief IsButtonConfigEmbeddedEnabled - * @note Only available on [11.0.0-17.0.1]. - * @param[out] out Output bool flag. - */ -Result IsButtonConfigEmbeddedEnabled(bool *out); - -/** - * @brief Legacy SetButtonConfigEmbedded. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigEmbedded instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidsysButtonConfigEmbedded - */ -Result LegacySetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigEmbedded *config); - -/** - * @brief SetButtonConfigEmbedded - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigEmbedded instead. - * @param[in] config \ref HidsysButtonConfigEmbedded - */ -Result SetButtonConfigEmbedded(const HidsysButtonConfigEmbedded *config); - -/** - * @brief Legacy SetButtonConfigFull. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigFull instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidsysButtonConfigFull - */ -Result LegacySetButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigFull *config); - -/** - * @brief SetButtonConfigFull - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigFull instead. - * @param[in] addr \ref BtdrvAddress - * @param[in] config \ref HidsysButtonConfigFull - */ -Result SetButtonConfigFull(BtdrvAddress addr, const HidsysButtonConfigFull *config); - -/** - * @brief Legacy SetButtonConfigLeft. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigLeft instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidsysButtonConfigLeft - */ -Result LegacySetButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigLeft *config); - -/** - * @brief SetButtonConfigLeft - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigLeft instead. - * @param[in] addr \ref BtdrvAddress - * @param[in] config \ref HidsysButtonConfigLeft - */ -Result SetButtonConfigLeft(BtdrvAddress addr, const HidsysButtonConfigLeft *config); - -/** - * @brief Legacy SetButtonConfigRight. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysSetButtonConfigRight instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidsysButtonConfigRight - */ -Result LegacySetButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigRight *config); - -/** - * @brief SetButtonConfigRight - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacySetButtonConfigRight instead. - * @param[in] addr \ref BtdrvAddress - * @param[in] config \ref HidsysButtonConfigRight - */ -Result SetButtonConfigRight(BtdrvAddress addr, const HidsysButtonConfigRight *config); - -/** - * @brief Legacy GetButtonConfigEmbedded. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigEmbedded instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidsysButtonConfigEmbedded - */ -Result LegacyGetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidsysButtonConfigEmbedded *config); - -/** - * @brief GetButtonConfigEmbedded - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigEmbedded instead. - * @param[out] config \ref HidsysButtonConfigEmbedded - */ -Result GetButtonConfigEmbedded(HidsysButtonConfigEmbedded *config); - -/** - * @brief Legacy GetButtonConfigFull. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigFull instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidsysButtonConfigFull - */ -Result LegacyGetButtonConfigFull(HidsysUniquePadId unique_pad_id, HidsysButtonConfigFull *config); - -/** - * @brief GetButtonConfigFull - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigFull instead. - * @param[in] addr \ref BtdrvAddress - * @param[out] config \ref HidsysButtonConfigFull - */ -Result GetButtonConfigFull(BtdrvAddress addr, HidsysButtonConfigFull *config); - -/** - * @brief Legacy GetButtonConfigLeft. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigLeft instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidsysButtonConfigLeft - */ -Result LegacyGetButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidsysButtonConfigLeft *config); - -/** - * @brief GetButtonConfigLeft - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigLeft instead. - * @param[in] addr \ref BtdrvAddress - * @param[out] config \ref HidsysButtonConfigLeft - */ -Result GetButtonConfigLeft(BtdrvAddress addr, HidsysButtonConfigLeft *config); - -/** - * @brief Legacy GetButtonConfigRight. - * @note Only available on [10.0.0-10.2.0]. On [11.0.0-17.0.1], use \ref hidsysGetButtonConfigRight instead. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidsysButtonConfigRight - */ -Result LegacyGetButtonConfigRight(HidsysUniquePadId unique_pad_id, HidsysButtonConfigRight *config); - -/** - * @brief GetButtonConfigRight - * @note Only available on [11.0.0-17.0.1]. On [10.0.0-10.2.0], use \ref hidsysLegacyGetButtonConfigRight instead. - * @param[in] addr \ref BtdrvAddress - * @param[out] config \ref HidsysButtonConfigRight - */ -Result GetButtonConfigRight(BtdrvAddress addr, HidsysButtonConfigRight *config); - -/** - * @brief IsCustomButtonConfigSupported - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Output bool flag. - */ -Result IsCustomButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out); - -/** - * @brief IsDefaultButtonConfigEmbedded - * @note Only available on [10.0.0+]. - * @param[in] config \ref HidcfgButtonConfigEmbedded - * @param[out] out Output bool flag. - */ -Result IsDefaultButtonConfigEmbedded(const HidcfgButtonConfigEmbedded *config, bool *out); - -/** - * @brief IsDefaultButtonConfigFull - * @note Only available on [10.0.0+]. - * @param[in] config \ref HidcfgButtonConfigFull - * @param[out] out Output bool flag. - */ -Result IsDefaultButtonConfigFull(const HidcfgButtonConfigFull *config, bool *out); - -/** - * @brief IsDefaultButtonConfigLeft - * @note Only available on [10.0.0+]. - * @param[in] config \ref HidcfgButtonConfigLeft - * @param[out] out Output bool flag. - */ -Result IsDefaultButtonConfigLeft(const HidcfgButtonConfigLeft *config, bool *out); - -/** - * @brief IsDefaultButtonConfigRight - * @note Only available on [10.0.0+]. - * @param[in] config \ref HidcfgButtonConfigRight - * @param[out] out Output bool flag. - */ -Result IsDefaultButtonConfigRight(const HidcfgButtonConfigRight *config, bool *out); - -/** - * @brief IsButtonConfigStorageEmbeddedEmpty - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] out Output bool flag. - */ -Result IsButtonConfigStorageEmbeddedEmpty(s32 index, bool *out); - -/** - * @brief IsButtonConfigStorageFullEmpty - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] out Output bool flag. - */ -Result IsButtonConfigStorageFullEmpty(s32 index, bool *out); - -/** - * @brief IsButtonConfigStorageLeftEmpty - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] out Output bool flag. - */ -Result IsButtonConfigStorageLeftEmpty(s32 index, bool *out); - -/** - * @brief IsButtonConfigStorageRightEmpty - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] out Output bool flag. - */ -Result IsButtonConfigStorageRightEmpty(s32 index, bool *out); - -/** - * @brief GetButtonConfigStorageEmbeddedDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigEmbedded - */ -Result GetButtonConfigStorageEmbeddedDeprecated(s32 index, HidcfgButtonConfigEmbedded *config); - -/** - * @brief GetButtonConfigStorageFullDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigFull - */ -Result GetButtonConfigStorageFullDeprecated(s32 index, HidcfgButtonConfigFull *config); - -/** - * @brief GetButtonConfigStorageLeftDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigLeft - */ -Result GetButtonConfigStorageLeftDeprecated(s32 index, HidcfgButtonConfigLeft *config); - -/** - * @brief GetButtonConfigStorageRightDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigRight - */ -Result GetButtonConfigStorageRightDeprecated(s32 index, HidcfgButtonConfigRight *config); - -/** - * @brief SetButtonConfigStorageEmbeddedDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigEmbedded - */ -Result SetButtonConfigStorageEmbeddedDeprecated(s32 index, const HidcfgButtonConfigEmbedded *config); - -/** - * @brief SetButtonConfigStorageFullDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigFull - */ -Result SetButtonConfigStorageFullDeprecated(s32 index, const HidcfgButtonConfigFull *config); - -/** - * @brief SetButtonConfigStorageLeftDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigLeft - */ -Result SetButtonConfigStorageLeftDeprecated(s32 index, const HidcfgButtonConfigLeft *config); - -/** - * @brief SetButtonConfigStorageRightDeprecated - * @note Only available on [10.0.0-12.1.0]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigRight - */ -Result SetButtonConfigStorageRightDeprecated(s32 index, const HidcfgButtonConfigRight *config); - -/** - * @brief DeleteButtonConfigStorageEmbedded - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - */ -Result DeleteButtonConfigStorageEmbedded(s32 index); - -/** - * @brief DeleteButtonConfigStorageFull - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - */ -Result DeleteButtonConfigStorageFull(s32 index); - -/** - * @brief DeleteButtonConfigStorageLeft - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - */ -Result DeleteButtonConfigStorageLeft(s32 index); - -/** - * @brief DeleteButtonConfigStorageRight - * @note Only available on [10.0.0+]. - * @param[in] index Array index, should be 0-4. - */ -Result DeleteButtonConfigStorageRight(s32 index); - -/** - * @brief IsUsingCustomButtonConfig - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] out Output bool flag. - */ -Result IsUsingCustomButtonConfig(HidsysUniquePadId unique_pad_id, bool *out); - -/** - * @brief IsAnyCustomButtonConfigEnabled - * @note Only available on [10.0.0+]. - * @param[out] out Output bool flag. - */ -Result IsAnyCustomButtonConfigEnabled(bool *out); - -/** - * @brief SetAllCustomButtonConfigEnabled - * @note Only available on [10.0.0+]. - * @param[in] AppletResourceUserId AppletResourceUserId - * @param[in] flag Input bool flag. - */ -Result SetAllCustomButtonConfigEnabled(u64 AppletResourceUserId, bool flag); - -/** - * @brief SetAllDefaultButtonConfig - * @note Only available on [10.0.0+]. - */ -Result SetAllDefaultButtonConfig(void); - -/** - * @brief SetHidButtonConfigEmbedded - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidcfgButtonConfigEmbedded - */ -Result SetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigEmbedded *config); - -/** - * @brief SetHidButtonConfigFull - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidcfgButtonConfigFull - */ -Result SetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigFull *config); - -/** - * @brief SetHidButtonConfigLeft - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidcfgButtonConfigLeft - */ -Result SetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigLeft *config); - -/** - * @brief SetHidButtonConfigRight - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[in] config \ref HidcfgButtonConfigRight - */ -Result SetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigRight *config); - -/** - * @brief GetHidButtonConfigEmbedded - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidcfgButtonConfigEmbedded - */ -Result GetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigEmbedded *config); - -/** - * @brief GetHidButtonConfigFull - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidcfgButtonConfigFull - */ -Result GetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigFull *config); - -/** - * @brief GetHidButtonConfigLeft - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidcfgButtonConfigLeft - */ -Result GetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigLeft *config); - -/** - * @brief GetHidButtonConfigRight - * @note Only available on [10.0.0+]. - * @param[in] unique_pad_id \ref HidsysUniquePadId - * @param[out] config \ref HidcfgButtonConfigRight - */ -Result GetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigRight *config); - -/** - * @brief GetButtonConfigStorageEmbedded - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigEmbedded - * @param[out] name \ref HidcfgStorageName - */ -Result GetButtonConfigStorageEmbedded(s32 index, HidcfgButtonConfigEmbedded *config, HidcfgStorageName *name); - -/** - * @brief GetButtonConfigStorageFull - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigFull - * @param[out] name \ref HidcfgStorageName - */ -Result GetButtonConfigStorageFull(s32 index, HidcfgButtonConfigFull *config, HidcfgStorageName *name); - -/** - * @brief GetButtonConfigStorageLeft - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigLeft - * @param[out] name \ref HidcfgStorageName - */ -Result GetButtonConfigStorageLeft(s32 index, HidcfgButtonConfigLeft *config, HidcfgStorageName *name); - -/** - * @brief GetButtonConfigStorageRight - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[out] config \ref HidcfgButtonConfigRight - * @param[out] name \ref HidcfgStorageName - */ -Result GetButtonConfigStorageRight(s32 index, HidcfgButtonConfigRight *config, HidcfgStorageName *name); - -/** - * @brief SetButtonConfigStorageEmbedded - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigEmbedded - * @param[in] name \ref HidcfgStorageName - */ -Result SetButtonConfigStorageEmbedded(s32 index, const HidcfgButtonConfigEmbedded *config, const HidcfgStorageName *name); - -/** - * @brief SetButtonConfigStorageFull - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigFull - * @param[in] name \ref HidcfgStorageName - */ -Result SetButtonConfigStorageFull(s32 index, const HidcfgButtonConfigFull *config, const HidcfgStorageName *name); - -/** - * @brief SetButtonConfigStorageLeft - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigLeft - * @param[in] name \ref HidcfgStorageName - */ -Result SetButtonConfigStorageLeft(s32 index, const HidcfgButtonConfigLeft *config, const HidcfgStorageName *name); - -/** - * @brief SetButtonConfigStorageRight - * @note Only available on [11.0.0+]. - * @param[in] index Array index, should be 0-4. - * @param[in] config \ref HidcfgButtonConfigRight - * @param[in] name \ref HidcfgStorageName - */ -Result SetButtonConfigStorageRight(s32 index, const HidcfgButtonConfigRight *config, const HidcfgStorageName *name); - -} // namespace hidsys - -/// @brief C++ wrappers for the `hipc` API. -/// @details Wraps: switch/sf/hipc.h. -namespace hipc { - -using ::HipcBufferDescriptor; -using ::HipcBufferMode; -using ::HipcHeader; -using ::HipcMetadata; -using ::HipcParsedRequest; -using ::HipcRecvListEntry; -using ::HipcRequest; -using ::HipcResponse; -using ::HipcSpecialHeader; -using ::HipcStaticDescriptor; - -HipcStaticDescriptor MakeSendStatic(const void* buffer, size_t size, u8 index); - -HipcBufferDescriptor MakeBuffer(const void* buffer, size_t size, HipcBufferMode mode); - -HipcRecvListEntry MakeRecvStatic(void* buffer, size_t size); - -void* GetStaticAddress(const HipcStaticDescriptor* desc); - -size_t GetStaticSize(const HipcStaticDescriptor* desc); - -void* GetBufferAddress(const HipcBufferDescriptor* desc); - -size_t GetBufferSize(const HipcBufferDescriptor* desc); - -HipcRequest CalcRequestLayout(HipcMetadata meta, void* base); - -HipcRequest MakeRequest(void* base, HipcMetadata meta); - -HipcParsedRequest ParseRequest(void* base); - -HipcResponse ParseResponse(void* base); - -} // namespace hipc - -/// @brief C++ wrappers for the `hmac` API. -/// @details Wraps: switch/crypto/hmac.h. -namespace hmac { - -/// Context for HMAC-SHA1 operations. -using ::HmacSha1Context; -/// Context for HMAC-SHA256 operations. -using ::HmacSha256Context; - -/// Initialize a HMAC-SHA256 context. -void Sha256ContextCreate(HmacSha256Context *out, const void *key, size_t key_size); - -/// Updates HMAC-SHA256 context with data to hash -void Sha256ContextUpdate(HmacSha256Context *ctx, const void *src, size_t size); - -/// Gets the context's output mac, finalizes the context. -void Sha256ContextGetMac(HmacSha256Context *ctx, void *dst); - -/// Simple all-in-one HMAC-SHA256 calculator. -void Sha256CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size); - -/// Initialize a HMAC-SHA1 context. -void Sha1ContextCreate(HmacSha1Context *out, const void *key, size_t key_size); - -/// Updates HMAC-SHA1 context with data to hash -void Sha1ContextUpdate(HmacSha1Context *ctx, const void *src, size_t size); - -/// Gets the context's output mac, finalizes the context. -void Sha1ContextGetMac(HmacSha1Context *ctx, void *dst); - -/// Simple all-in-one HMAC-SHA1 calculator. -void Sha1CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size); - -} // namespace hmac - -/// @brief C++ wrappers for the `hosversion` API. -/// @details Wraps: switch/runtime/hosversion.h. -namespace hosversion { - -/// Returns the current HOS version that was previously set with \ref hosversionSet. If version initialization fails during startup (such as in the case set:sys is not available), this function returns zero. -u32 Get(void); - -/// Sets or overrides the current HOS version. This function is normally called automatically by libnx on startup with the version info obtained with \ref setsysGetFirmwareVersion. -void Set(u32 version); - -/// Returns whether the current HOS version is augmented by running the Atmosphère custom firmware. -bool IsAtmosphere(void); - -/// Returns true if the current HOS version is equal to or above the specified major/minor/micro version. -bool AtLeast(u8 major, u8 minor, u8 micro); - -/// Returns true if the current HOS version is earlier than the specified major/minor/micro version. -bool Before(u8 major, u8 minor, u8 micro); - -/// Returns true if the current HOS version is between the two specified major versions, i.e. [major1, major2). -bool Between(u8 major1, u8 major2); - -} // namespace hosversion - -/// @brief C++ wrappers for the `hwopus` API. -/// @details Wraps: switch/services/hwopus.h. -namespace hwopus { - -using ::HwopusDecoder; -/// This structure is the start of opusin for \ref hwopusDecodeInterleaved, with the actual opus packet following this. -/// These fields are big-endian. -using ::HwopusHeader; -/// Used internally. -using ::HwopusMultistreamState; - -Result DecoderInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount); - -void DecoderExit(HwopusDecoder* decoder); - -/// Only available on [3.0.0+]. -/// See libopus multistream docs. -Result DecoderMultistreamInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount, s32 TotalStreamCount, s32 StereoStreamCount, u8 *channel_mapping); - -/// Decodes opus data. -Result DecodeInterleaved(HwopusDecoder* decoder, s32 *DecodedDataSize, s32 *DecodedSampleCount, const void* opusin, size_t opusin_size, s16 *pcmbuf, size_t pcmbuf_size); - -} // namespace hwopus - -/// @brief C++ wrappers for the `i2c` API. -/// @details Wraps: switch/services/i2c.h. -namespace i2c { - -using ::I2cDevice; -using ::I2cSession; -using ::I2cTransactionOption; - -/// Initialize i2c. -Result Initialize(void); - -/// Exit i2c. -void Exit(void); - -/// Gets the Service object for the actual i2c service session. -Service* GetServiceSession(void); - -Result OpenSession(I2cSession *out, I2cDevice dev); - -} // namespace i2c - -/// @brief C++ wrappers for the `i2csession` API. -/// @details Wraps: switch/services/i2c.h. -namespace i2csession { - -using ::I2cDevice; -using ::I2cSession; -using ::I2cTransactionOption; - -Result SendAuto(I2cSession *s, const void *buf, size_t size, I2cTransactionOption option); - -Result ReceiveAuto(I2cSession *s, void *buf, size_t size, I2cTransactionOption option); - -Result ExecuteCommandList(I2cSession *s, void *dst, size_t dst_size, const void *cmd_list, size_t cmd_list_size); - -void Close(I2cSession *s); - -} // namespace i2csession - -/// @brief C++ wrappers for the `idlesys` API. -/// @details Wraps: switch/services/idlesys.h. -namespace idlesys { - -/// Initialize idle:sys. -Result Initialize(void); - -/// Exit idle:sys. -void Exit(void); - -/// Gets the Service for idle:sys. -Service* GetServiceSession(void); - -/// Resets sleep counter. -Result ReportUserIsActive(void); - -} // namespace idlesys - -/// @brief C++ wrappers for the `insr` API. -/// @details Wraps: switch/services/ins.h. -namespace insr { - -/// Initialize ins:r. -Result Initialize(void); - -/// Exit ins:r. -void Exit(void); - -/// Gets the Service object for the actual ins:r service session. -Service* GetServiceSession(void); - -/** - * @brief Retrieves the last system tick the event corresponding to the ID was signaled at. - * @param[in] id Ins request ID (should be 0..4). - * @param[out] tick. - * @return Result code. - * @note The tick is only updated once per second at minimum. - */ -Result GetLastTick(u32 id, u64 *tick); - -/** - * @brief Retrieves the event corresponding to the ID. - * @param[in] id Ins request ID (should be 0..4). - * @param[out] out. - * @return Result code. - * @note The event is only signaled once per second at minimum. - */ -Result GetReadableEvent(u32 id, Event *out); - -} // namespace insr - -/// @brief C++ wrappers for the `inss` API. -/// @details Wraps: switch/services/ins.h. -namespace inss { - -/// Initialize ins:s. -Result Initialize(void); - -/// Exit ins:s. -void Exit(void); - -/// Gets the Service object for the actual ins:s service session. -Service* GetServiceSession(void); - -/** - * @brief Retrieves the event corresponding to the ID. - * @param[in] id Ins send ID (should be 0..11). - * @param[out] out. - * @return Result code. - * @note The returned event cannot be waited on, only signaled. Clearing is handled by the service. - */ -Result GetWritableEvent(u32 id, Event *out); - -} // namespace inss - -/// @brief C++ wrappers for the `irs` API. -/// @details Wraps: switch/services/irs.h. -namespace irs { - -/// AdaptiveClusteringMode -using ::IrsAdaptiveClusteringMode; -/// AdaptiveClusteringProcessorConfig -using ::IrsAdaptiveClusteringProcessorConfig; -/// AdaptiveClusteringTargetDistance -using ::IrsAdaptiveClusteringTargetDistance; -/// AruidFormat -using ::IrsAruidFormat; -/// ClusteringData -using ::IrsClusteringData; -/// ClusteringProcessorConfig -using ::IrsClusteringProcessorConfig; -/// ClusteringProcessorState -using ::IrsClusteringProcessorState; -/// DeviceFormat -using ::IrsDeviceFormat; -/// HandAnalysisConfig -using ::IrsHandAnalysisConfig; -/// HandAnalysisMode -using ::IrsHandAnalysisMode; -/// ImageProcessorStatus -using ::IrsImageProcessorStatus; -/// ImageTransferProcessorConfig -using ::IrsImageTransferProcessorConfig; -/// ImageTransferProcessorExConfig -using ::IrsImageTransferProcessorExConfig; -/// ImageTransferProcessorFormat. IR Sensor image resolution. -using ::IrsImageTransferProcessorFormat; -/// ImageTransferProcessorState -using ::IrsImageTransferProcessorState; -/// IrCameraHandle -using ::IrsIrCameraHandle; -/// IrCameraInternalStatus -using ::IrsIrCameraInternalStatus; -/// IrCameraStatus -using ::IrsIrCameraStatus; -/// IrLedProcessorConfig -using ::IrsIrLedProcessorConfig; -/// IrSensorMode -using ::IrsIrSensorMode; -/// IrsMomentProcessorConfig -using ::IrsMomentProcessorConfig; -/// MomentProcessorState -using ::IrsMomentProcessorState; -/// MomentStatistic -using ::IrsMomentStatistic; -/// PackedClusteringProcessorConfig -using ::IrsPackedClusteringProcessorConfig; -/// PackedFunctionLevel -using ::IrsPackedFunctionLevel; -/// PackedImageTransferProcessorConfig -using ::IrsPackedImageTransferProcessorConfig; -/// PackedImageTransferProcessorExConfig -using ::IrsPackedImageTransferProcessorExConfig; -/// PackedIrLedProcessorConfig -using ::IrsPackedIrLedProcessorConfig; -/// PackedMcuVersion -using ::IrsPackedMcuVersion; -/// PackedMomentProcessorConfig -using ::IrsPackedMomentProcessorConfig; -/// PackedPointingProcessorConfig -using ::IrsPackedPointingProcessorConfig; -/// PackedTeraPluginProcessorConfig -using ::IrsPackedTeraPluginProcessorConfig; -/// PointingProcessorMarkerState -using ::IrsPointingProcessorMarkerState; -/// PointingProcessorState -using ::IrsPointingProcessorState; -/// ProcessorState -using ::IrsProcessorState; -/// Rect -using ::IrsRect; -/// StatusManager -using ::IrsStatusManager; -/// TeraPluginProcessorConfig -using ::IrsTeraPluginProcessorConfig; -/// TeraPluginProcessorState -using ::IrsTeraPluginProcessorState; -/// Internal validation callblack. -using ::IrsValidationCb; - -/// Initialize irs. -Result Initialize(void); - -/// Exit irs. -void Exit(void); - -/// Gets the Service object for the actual irs service session. -Service* GetServiceSession(void); - -/// Gets the address of the SharedMemory (\ref IrsStatusManager). -void* GetSharedmemAddr(void); - -/// Gets the \ref IrsIrCameraHandle for the specified controller. -Result GetIrCameraHandle(IrsIrCameraHandle *handle, HidNpadIdType id); - -/// GetIrCameraStatus -Result GetIrCameraStatus(IrsIrCameraHandle handle, IrsIrCameraStatus *out); - -/// CheckFirmwareUpdateNecessity -/// When successful where the output flag is set, the user should use \ref hidLaShowControllerFirmwareUpdate. -/// Only available on [4.0.0+]. -Result CheckFirmwareUpdateNecessity(IrsIrCameraHandle handle, bool *out); - -/// GetImageProcessorStatus -/// Only available on [4.0.0+]. -Result GetImageProcessorStatus(IrsIrCameraHandle handle, IrsImageProcessorStatus *out); - -/// Stop the current Processor. -/// \ref irsExit calls this with all IrCameraHandles which were not already used with \ref irsStopImageProcessor. -Result StopImageProcessor(IrsIrCameraHandle handle); - -/// Stop the current Processor, async. -/// Only available on [4.0.0+]. -Result StopImageProcessorAsync(IrsIrCameraHandle handle); - -/** - * @brief Run the MomentProcessor. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - */ -Result RunMomentProcessor(IrsIrCameraHandle handle, const IrsMomentProcessorConfig *config); - -/** - * @brief Gets the states for MomentProcessor or IrLedProcessor. - * @note The official GetIrLedProcessorState is essentially the same as this, except it uses hard-coded count=1 with output-array on stack, without returning that data. Hence we don't implement a seperate func for that. - * @param[in] handle \ref IrsIrCameraHandle - * @param[out] states Output array of \ref IrsMomentProcessorState. - * @param[in] count Size of the states array in entries. Must be 1-5. - * @param[out] total_out Total output entries. - */ -Result GetMomentProcessorStates(IrsIrCameraHandle handle, IrsMomentProcessorState *states, s32 count, s32 *total_out); - -/** - * @brief Calculates an \ref IrsMomentStatistic from the specified region in the input \ref IrsMomentProcessorState. - * @param[in] state \ref IrsMomentProcessorState - * @param[in] rect \ref IrsRect, containing the image width and height. - * @param[in] region_x Region x, must be 0-5 (clamped to this range otherwise). region_x = image_x/6. - * @param[in] region_y Region y, must be 0-7 (clamped to this range otherwise). region_y = image_y/8. - * @param[in] region_width Region width. region_x+region_width must be <=6 (clamped to this range otherwise). - * @param[in] region_height Region height. region_y+region_height must be <=8 (clamped to this range otherwise). - */ -IrsMomentStatistic CalculateMomentRegionStatistic(const IrsMomentProcessorState *state, IrsRect rect, s32 region_x, s32 region_y, s32 region_width, s32 region_height); - -/** - * @brief Run the ClusteringProcessor. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - */ -Result RunClusteringProcessor(IrsIrCameraHandle handle, const IrsClusteringProcessorConfig *config); - -/** - * @brief Gets the states for ClusteringProcessor. - * @param[in] handle \ref IrsIrCameraHandle - * @param[out] states Output array of \ref IrsClusteringProcessorState. - * @param[in] count Size of the states array in entries. Must be 1-5. - * @param[out] total_out Total output entries. - */ -Result GetClusteringProcessorStates(IrsIrCameraHandle handle, IrsClusteringProcessorState *states, s32 count, s32 *total_out); - -/** - * @brief Run the ImageTransferProcessor. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - * @param[in] size Work-buffer size, must be 0x1000-byte aligned. - */ -Result RunImageTransferProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorConfig *config, size_t size); - -/** - * @brief Run the ImageTransferExProcessor. - * @note Only available on [4.0.0+]. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - * @param[in] size Work-buffer size, must be 0x1000-byte aligned. - */ -Result RunImageTransferExProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorExConfig *config, size_t size); - -/// GetImageTransferProcessorState -Result GetImageTransferProcessorState(IrsIrCameraHandle handle, void* buffer, size_t size, IrsImageTransferProcessorState *state); - -/** - * @brief Run the PointingProcessor. - * @param[in] handle \ref IrsIrCameraHandle - */ -Result RunPointingProcessor(IrsIrCameraHandle handle); - -/** - * @brief Gets the states for PointingProcessor. - * @param[in] handle \ref IrsIrCameraHandle - * @param[out] states Output array of \ref IrsPointingProcessorMarkerState. - * @param[in] count Size of the states array in entries. Must be 1-6. - * @param[out] total_out Total output entries. - */ -Result GetPointingProcessorMarkerStates(IrsIrCameraHandle handle, IrsPointingProcessorMarkerState *states, s32 count, s32 *total_out); - -/** - * @brief Gets the states for \ref IrsPointingProcessorState. - * @note This uses \ref irsGetPointingProcessorMarkerStates, then converts the output to \ref IrsPointingProcessorState. - * @param[in] handle \ref IrsIrCameraHandle - * @param[out] states Output array of \ref IrsPointingProcessorState. - * @param[in] count Size of the states array in entries. Must be 1-6. - * @param[out] total_out Total output entries. - */ -Result GetPointingProcessorStates(IrsIrCameraHandle handle, IrsPointingProcessorState *states, s32 count, s32 *total_out); - -/** - * @brief Run the TeraPluginProcessor. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - */ -Result RunTeraPluginProcessor(IrsIrCameraHandle handle, const IrsTeraPluginProcessorConfig *config); - -/** - * @brief Gets the states for TeraPluginProcessor, filtered using the input params. - * @param[in] handle \ref IrsIrCameraHandle - * @param[out] states Output array of \ref IrsTeraPluginProcessorState. - * @param[in] count Size of the states array in entries. Must be 1-5. - * @param[in] sampling_number Minimum value for IrsTeraPluginProcessorState::sampling_number. - * @param[in] prefix_data Only used when prefix_bitcount is not 0. The first prefix_bitcount bits from prefix_data must match the first prefix_bitcount bits in IrsTeraPluginProcessorState::plugin_data. - * @param[in] prefix_bitcount Total bits for prefix_data. - * @param[out] total_out Total output entries. - */ -Result GetTeraPluginProcessorStates(IrsIrCameraHandle handle, IrsTeraPluginProcessorState *states, s32 count, s64 sampling_number, u32 prefix_data, u32 prefix_bitcount, s32 *total_out); - -/** - * @brief Run the IrLedProcessor. - * @note Only available on [4.0.0+]. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - */ -Result RunIrLedProcessor(IrsIrCameraHandle handle, const IrsIrLedProcessorConfig *config); - -/** - * @brief Run the AdaptiveClusteringProcessor. - * @note Only available on [5.0.0+]. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - */ -Result RunAdaptiveClusteringProcessor(IrsIrCameraHandle handle, const IrsAdaptiveClusteringProcessorConfig *config); - -/** - * @brief Run HandAnalysis. - * @param[in] handle \ref IrsIrCameraHandle - * @param[in] config Input config. - */ -Result RunHandAnalysis(IrsIrCameraHandle handle, const IrsHandAnalysisConfig *config); - -/** - * Gets the default configuration for MomentProcessor. - */ -void GetMomentProcessorDefaultConfig(IrsMomentProcessorConfig *config); - -/** - * Gets the default configuration for ClusteringProcessor. - */ -void GetClusteringProcessorDefaultConfig(IrsClusteringProcessorConfig *config); - -/** - * Gets the default configuration for ImageTransferProcessor. - * Defaults are exposure 300us, 8x digital gain, the rest is all-zero. Format is ::IrsImageTransferProcessorFormat_320x240. - */ -void GetDefaultImageTransferProcessorConfig(IrsImageTransferProcessorConfig *config); - -/** - * Gets the default configuration for ImageTransferProcessorEx. - * Defaults are exposure 300us, 8x digital gain, the rest is all-zero. OrigFormat/TrimmingFormat are ::IrsImageTransferProcessorFormat_320x240. - */ -void GetDefaultImageTransferProcessorExConfig(IrsImageTransferProcessorExConfig *config); - -/** - * Gets the default configuration for IrLedProcessor. - */ -void GetIrLedProcessorDefaultConfig(IrsIrLedProcessorConfig *config); - -} // namespace irs - -/// @brief C++ wrappers for the `jit` API. -/// @details Wraps: switch/kernel/jit.h. -namespace jit { - -/// JIT buffer object. -using ::Jit; -/// JIT implementation type. -using ::JitType; - -/** - * @brief Creates a JIT buffer. - * @param j JIT buffer. - * @param size Size of the JIT buffer. - * @return Result code. - */ -Result Create(Jit* j, size_t size); - -/** - * @brief Transition a JIT buffer to have writable permission. - * @param j JIT buffer. - * @return Result code. - */ -Result TransitionToWritable(Jit* j); - -/** - * @brief Transition a JIT buffer to have executable permission. - * @param j JIT buffer. - * @return Result code. - */ -Result TransitionToExecutable(Jit* j); - -/** - * @brief Destroys a JIT buffer. - * @param j JIT buffer. - * @return Result code. - */ -Result Close(Jit* j); - -/** - * @brief Gets the address of the writable memory alias of a JIT buffer. - * @param j JIT buffer. - * @return Pointer to alias of the JIT buffer that can be written to. - */ -void* GetRwAddr(Jit* j); - -/** - * @brief Gets the address of the executable memory alias of a JIT buffer. - * @param j JIT buffer. - * @return Pointer to alias of the JIT buffer that can be executed. - */ -void* GetRxAddr(Jit* j); - -} // namespace jit - -/// @brief C++ wrappers for the `lbl` API. -/// @details Wraps: switch/services/lbl.h. -namespace lbl { - -using ::LblBacklightSwitchStatus; - -/// Initialize lbl. -Result Initialize(void); - -/// Exit lbl. -void Exit(void); - -/// Gets the Service object for the actual lbl service session. -Service* GetServiceSession(void); - -Result SaveCurrentSetting(void); - -Result LoadCurrentSetting(void); - -/** - * @note The brightness goes from 0 to 1.0. - */ -Result SetCurrentBrightnessSetting(float brightness); - -Result GetCurrentBrightnessSetting(float *out_value); - -Result ApplyCurrentBrightnessSettingToBacklight(void); - -Result GetBrightnessSettingAppliedToBacklight(float *out_value); - -Result SwitchBacklightOn(u64 fade_time); - -Result SwitchBacklightOff(u64 fade_time); - -Result GetBacklightSwitchStatus(LblBacklightSwitchStatus *out_value); - -Result EnableDimming(void); - -Result DisableDimming(void); - -Result IsDimmingEnabled(bool *out_value); - -Result EnableAutoBrightnessControl(void); - -Result DisableAutoBrightnessControl(void); - -Result IsAutoBrightnessControlEnabled(bool *out_value); - -Result SetAmbientLightSensorValue(float value); - -/** - * @note Used internally by \ref appletGetAmbientLightSensorValue and \ref appletGetCurrentIlluminanceEx. - */ -Result GetAmbientLightSensorValue(bool *over_limit, float *lux); - -/** - * @note Only available on [3.0.0+]. - * @note Used internally by \ref appletIsIlluminanceAvailable. - */ -Result IsAmbientLightSensorAvailable(bool *out_value); - -/** - * @note Only available on [3.0.0+]. - */ -Result SetCurrentBrightnessSettingForVrMode(float brightness); - -/** - * @note Only available on [3.0.0+]. - */ -Result GetCurrentBrightnessSettingForVrMode(float *out_value); - -/** - * @note Only available on [3.0.0+]. - * @note Used internally by \ref appletSetVrModeEnabled. - */ -Result EnableVrMode(void); - -/** - * @note Only available on [3.0.0+]. - * @note Used internally by \ref appletSetVrModeEnabled. - */ -Result DisableVrMode(void); - -/** - * @note Only available on [3.0.0+]. - * @note Used internally by \ref appletIsVrModeEnabled. - */ -Result IsVrModeEnabled(bool *out_value); - -} // namespace lbl - -/// @brief C++ wrappers for the `ldn` API. -/// @details Wraps: switch/services/ldn.h. -namespace ldn { - -/// AcceptPolicy -using ::LdnAcceptPolicy; -/// ActionFrameSettings -using ::LdnActionFrameSettings; -/// AddressEntry -using ::LdnAddressEntry; -/// CommonNetworkInfo -using ::LdnCommonNetworkInfo; -/// DisconnectReason loaded by \ref ldnGetDisconnectReason. -using ::LdnDisconnectReason; -/// IntentId -using ::LdnIntentId; -/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). -using ::LdnIpv4Address; -/// MacAddress -using ::LdnMacAddress; -/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate). -using ::LdnNetworkConfig; -/// NetworkId -using ::LdnNetworkId; -/// NetworkInfo -using ::LdnNetworkInfo; -/// NodeInfo -using ::LdnNodeInfo; -/// NodeLatestUpdate -using ::LdnNodeLatestUpdate; -/// OperationMode -using ::LdnOperationMode; -/// Protocol -using ::LdnProtocol; -/// ScanFilter. \ref ldnScan / \ref ldnScanPrivate will only return the \ref LdnNetworkInfo when validating the \ref LdnNetworkInfo with LdnScanFilter was sucessful, with the fields enabled by \ref LdnScanFilterFlag. -using ::LdnScanFilter; -/// ScanFilterFlag -using ::LdnScanFilterFlag; -/// SecurityConfig -using ::LdnSecurityConfig; -/// SecurityMode. LdnSecurityMode_Product can be used as the default value. The ldn cmds which use an input SecurityMode normally overwrite the SecurityMode. -using ::LdnSecurityMode; -/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated. -using ::LdnSecurityParameter; -using ::LdnServiceType; -/// SessionId -using ::LdnSessionId; -/// Ssid -using ::LdnSsid; -/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState. -using ::LdnState; -/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). -using ::LdnSubnetMask; -/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd. -using ::LdnUserConfig; -/// WirelessControllerRestriction -using ::LdnWirelessControllerRestriction; - -/// Initialize ldn. -/// The priority is only used with ::LdnServiceType_System on [19.0.0+]. To optionally set this, define "s32 __nx_ldn_priority". The priority must be \ref LDN_PRIORITY_SYSTEM (default) or \ref LDN_PRIORITY_USER. -Result Initialize(LdnServiceType service_type); - -/// Exit ldn. -void Exit(void); - -/// Gets the Service object for IUserLocalCommunicationService/ISystemLocalCommunicationService. -Service* GetServiceSession_LocalCommunicationService(void); - -/// Gets the Service object for IClientProcessMonitor, only valid with [18.0.0+]. -Service* GetServiceSession_IClientProcessMonitor(void); - -/** - * @brief GetState - * @param[out] out \ref LdnState - */ -Result GetState(LdnState *out); - -/** - * @brief GetNetworkInfo - * @param[out] out \ref LdnNetworkInfo - */ -Result GetNetworkInfo(LdnNetworkInfo *out); - -/** - * @brief GetIpv4Address - * @param[out] addr \ref LdnIpv4Address - * @param[out] mask \ref LdnSubnetMask - */ -Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask); - -/** - * @brief GetDisconnectReason - * @param[out] out \ref LdnDisconnectReason - */ -Result GetDisconnectReason(LdnDisconnectReason *out); - -/** - * @brief GetSecurityParameter - * @param[out] out \ref LdnSecurityParameter - */ -Result GetSecurityParameter(LdnSecurityParameter *out); - -/** - * @brief GetNetworkConfig - * @param[out] out \ref LdnNetworkConfig - */ -Result GetNetworkConfig(LdnNetworkConfig *out); - -/** - * @brief GetStateChangeEvent - * @note The Event must be closed by the user once finished with it. - * @note This is signaled when the data returned by \ref ldnGetNetworkInfo / \ref ldnGetNetworkInfoLatestUpdate is updated. - * @param[out] out_event Output Event with autoclear=true. - */ -Result GetStateChangeEvent(Event* out_event); - -/** - * @brief GetNetworkInfoAndHistory - * @param[out] network_info \ref LdnNetworkInfo - * @param[out] nodes Output array of \ref LdnNodeLatestUpdate. - * @param[in] count Size of the nodes array in entries, must be 8. - */ -Result GetNetworkInfoAndHistory(LdnNetworkInfo *network_info, LdnNodeLatestUpdate *nodes, s32 count); - -/** - * @brief Scan - * @note \ref LdnState must be ::LdnState_AccessPointCreated, ::LdnState_Station, or ::LdnState_StationConnected. - * @note This is the same as \ref ldnScanPrivate (minus the masking for LdnScanFilter::flags), except this has the same channel-override functionality as \ref ldnCreateNetwork. - * @param[in] channel Channel, value 0 can be used for this. - * @param[in] filter \ref LdnScanFilter - * @param[out] network_info Output array of \ref LdnNetworkInfo. - * @param[in] count Size of the network_info array in entries. Must be at least 1, this is clamped to a maximum of 0x18 internally. - * @param[out] total_out Total output entries. - */ -Result Scan(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out); - -/** - * @brief ScanPrivate - * @note \ref LdnState must be ::LdnState_AccessPointCreated, ::LdnState_Station, or ::LdnState_StationConnected. - * @note See \ref ldnScan. - * @param[in] channel Channel, value 0 can be used for this. - * @param[in] filter \ref LdnScanFilter - * @param[out] network_info Output array of \ref LdnNetworkInfo. - * @param[in] count Size of the network_info array in entries. Must be at least 1, this is clamped to a maximum of 0x18 internally. - * @param[out] total_out Total output entries. - */ -Result ScanPrivate(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out); - -/** - * @brief SetWirelessControllerRestriction - * @note Only available on [5.0.0+]. - * @note \ref LdnState must be ::LdnState_Initialized. - * @param[in] restriction \ref LdnWirelessControllerRestriction - */ -Result SetWirelessControllerRestriction(LdnWirelessControllerRestriction restriction); - -/** - * @brief SetProtocol - * @note This is only usable with [20.0.0+] (with [18.0.0-19-0.1] this is available but not usable). - * @note \ref LdnState must be ::LdnState_Initialized. If a non-default Protocol is wanted, use this after \ref ldnInitialize. - * @note This is used by \ref ldnInitialize with LdnProtocol_NX on [20.0.0+]. - * @param[in] protocol \ref LdnProtocol - */ -Result SetProtocol(LdnProtocol protocol); - -/** - * @brief OpenAccessPoint - * @note \ref LdnState must be ::LdnState_Initialized, this eventually sets the State to ::LdnState_AccessPoint. - */ -Result OpenAccessPoint(void); - -/** - * @brief CloseAccessPoint - * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated, this eventually sets the State to ::LdnState_Initialized. - * @note Used automatically internally by \ref ldnExit if needed. - */ -Result CloseAccessPoint(void); - -/** - * @brief CreateNetwork - * @note \ref LdnState must be ::LdnState_AccessPoint, this eventually sets the State to ::LdnState_AccessPointCreated. - * @param[in] sec_config \ref LdnSecurityConfig - * @param[in] user_config \ref LdnUserConfig - * @param[in] network_config \ref LdnNetworkConfig - */ -Result CreateNetwork(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config); - -/** - * @brief CreateNetworkPrivate - * @note \ref LdnState must be ::LdnState_AccessPoint, this eventually sets the State to ::LdnState_AccessPointCreated. - * @note This is the same as \ref ldnCreateNetwork besides the additional user-specified params, and with this cmd LdnNetworkConfig::channel is not overwritten (unlike \ref ldnCreateNetwork). - * @param[in] sec_config \ref LdnSecurityConfig - * @param[in] sec_param \ref LdnSecurityParameter - * @param[in] user_config \ref LdnUserConfig - * @param[in] network_config \ref LdnNetworkConfig - * @param[in] addrs Input array of \ref LdnAddressEntry. This can be NULL. - * @param[in] count Size of the addrs array in entries. This must be <=8. This can be 0, in which case the network will be non-Private like \ref ldnCreateNetwork. - */ -Result CreateNetworkPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config, const LdnAddressEntry *addrs, s32 count); - -/** - * @brief DestroyNetwork - * @note \ref LdnState must be ::LdnState_AccessPointCreated, this eventually sets the State to ::LdnState_AccessPoint. - */ -Result DestroyNetwork(void); - -/** - * @brief Reject - * @note \ref LdnState must be ::LdnState_AccessPointCreated. - * @param[in] addr \ref LdnIpv4Address - */ -Result Reject(LdnIpv4Address addr); - -/** - * @brief SetAdvertiseData - * @note An empty buffer (buffer=NULL/size=0) can be used to reset the AdvertiseData size in state to zero. - * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. - * @param[in] buffer Input buffer containing arbitrary user data. - * @param[in] size Input buffer size, must be <=0x180. - */ -Result SetAdvertiseData(const void* buffer, size_t size); - -/** - * @brief SetStationAcceptPolicy - * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. - * @param[in] policy \ref LdnAcceptPolicy - */ -Result SetStationAcceptPolicy(LdnAcceptPolicy policy); - -/** - * @brief AddAcceptFilterEntry - * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. - * @note See \ref LdnAcceptPolicy. - * @param[in] addr \ref LdnMacAddress. If you want, you can also pass LdnNodeInfo::mac_addr for this. - */ -Result AddAcceptFilterEntry(LdnMacAddress addr); - -/** - * @brief ClearAcceptFilter - * @note \ref LdnState must be ::LdnState_AccessPoint or ::LdnState_AccessPointCreated. - */ -Result ClearAcceptFilter(void); - -/** - * @brief OpenStation - * @note \ref LdnState must be ::LdnState_Initialized, this eventually sets the State to ::LdnState_Station. - */ -Result OpenStation(void); - -/** - * @brief CloseStation - * @note \ref LdnState must be ::LdnState_Station or ::LdnState_StationConnected, this eventually sets the State to ::LdnState_Initialized. - * @note Used automatically internally by \ref ldnExit if needed. - */ -Result CloseStation(void); - -/** - * @brief Connect - * @note \ref LdnState must be ::LdnState_Station, this eventually sets the State to ::LdnState_StationConnected. - * @note This is identical to \ref ldnConnectPrivate besides the used params, the code overwriting LdnSecurityConfig::type also differs. - * @param[in] sec_config \ref LdnSecurityConfig - * @param[in] user_config \ref LdnUserConfig - * @param[in] version LocalCommunicationVersion, this must be 0x0-0x7FFF. - * @param[in] option ConnectOption bitmask, must be <=0x1. You can use value 0 for example here. - * @param[in] network_info \ref LdnNetworkInfo - */ -Result Connect(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkInfo *network_info); - -/** - * @brief ConnectPrivate - * @note \ref LdnState must be ::LdnState_Station, this eventually sets the State to ::LdnState_StationConnected. - * @note See \ref ldnConnect. - * @param[in] sec_config \ref LdnSecurityConfig - * @param[in] sec_param \ref LdnSecurityParameter - * @param[in] user_config \ref LdnUserConfig - * @param[in] version LocalCommunicationVersion, this must be 0x0-0x7FFF. - * @param[in] option ConnectOption bitmask, must be <=0x1. You can use value 0 for example here. - * @param[in] network_config \ref LdnNetworkConfig - */ -Result ConnectPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkConfig *network_config); - -/** - * @brief Disconnect - * @note \ref LdnState must be ::LdnState_StationConnected, this eventually sets the State to ::LdnState_Station. - */ -Result Disconnect(void); - -/** - * @brief SetOperationMode - * @note With ::LdnServiceType_System this is only available on [4.0.0+]. - * @note With ::LdnServiceType_User this is only available on [19.0.0+]. - * @note \ref LdnState must be ::LdnState_Initialized. - * @param[in] mode \ref LdnOperationMode - */ -Result SetOperationMode(LdnOperationMode mode); - -/** - * @brief EnableActionFrame - * @note Only available on [18.0.0+]. - * @note \ref LdnState must be ::LdnState_Initialized. - * @param[in] settings \ref LdnActionFrameSettings - */ -Result EnableActionFrame(const LdnActionFrameSettings *settings); - -/** - * @brief DisableActionFrame - * @note Only available on [18.0.0+]. - * @note \ref LdnState must be ::LdnState_Initialized. - */ -Result DisableActionFrame(void); - -/** - * @brief SendActionFrame - * @note Only available on [18.0.0+]. - * @note \ref LdnState must be ::LdnState_AccessPointCreated / ::LdnState_Station. - * @param[in] data Data buffer. - * @param[in] size Data buffer size. - * @param[in] destination Destination \ref LdnMacAddress. - * @param[in] bssid Bssid \ref LdnMacAddress. - * @param[in] channel Channel, must be non-zero. - * @param[in] flags MessageFlag bit0 clear = block until the data can be sent, set = return error when the data can't be sent. - */ -Result SendActionFrame(const void* data, size_t size, LdnMacAddress destination, LdnMacAddress bssid, s16 channel, u32 flags); - -/** - * @brief RecvActionFrame - * @note Only available on [18.0.0+]. - * @note \ref ldnEnableActionFrame must be used prior to this. - * @param[out] data Output data buffer. - * @param[in] size Max size of the data buffer. - * @param[out] addr0 First \ref LdnMacAddress. - * @param[out] addr1 Second \ref LdnMacAddress. - * @param[out] channel Channel - * @param[out] out_size Output size. - * @param[out] link_level LinkLevel - * @param[in] flags MessageFlag bit0 clear = block until data is available, set = return error when data is not available. - */ -Result RecvActionFrame(void* data, size_t size, LdnMacAddress *addr0, LdnMacAddress *addr1, s16 *channel, u32 *out_size, s32 *link_level, u32 flags); - -/** - * @brief SetHomeChannel - * @note Only available on [18.0.0+]. - * @note \ref LdnState must be ::LdnState_Station. - * @param[in] channel Channel, must be non-zero. - */ -Result SetHomeChannel(s16 channel); - -/** - * @brief SetTxPower - * @note Only available on [18.0.0+]. - * @note \ref LdnState must be ::LdnState_AccessPoint* / ::LdnState_Station*. - * @param[in] power Power, must be 0x0..0xFF. - */ -Result SetTxPower(s16 power); - -/** - * @brief ResetTxPower - * @note Only available on [18.0.0+]. - * @note \ref LdnState must be ::LdnState_AccessPoint* / ::LdnState_Station*. - */ -Result ResetTxPower(void); - -} // namespace ldn - -/// @brief C++ wrappers for the `ldnm` API. -/// @details Wraps: switch/services/ldn.h. -namespace ldnm { - -/// AcceptPolicy -using ::LdnAcceptPolicy; -/// ActionFrameSettings -using ::LdnActionFrameSettings; -/// AddressEntry -using ::LdnAddressEntry; -/// CommonNetworkInfo -using ::LdnCommonNetworkInfo; -/// DisconnectReason loaded by \ref ldnGetDisconnectReason. -using ::LdnDisconnectReason; -/// IntentId -using ::LdnIntentId; -/// Ipv4Address. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). -using ::LdnIpv4Address; -/// MacAddress -using ::LdnMacAddress; -/// NetworkConfig. The input struct is copied to a tmp struct, which is then used with the cmd (\ref ldnCreateNetwork, \ref ldnCreateNetworkPrivate, \ref ldnConnectPrivate). -using ::LdnNetworkConfig; -/// NetworkId -using ::LdnNetworkId; -/// NetworkInfo -using ::LdnNetworkInfo; -/// NodeInfo -using ::LdnNodeInfo; -/// NodeLatestUpdate -using ::LdnNodeLatestUpdate; -/// OperationMode -using ::LdnOperationMode; -/// Protocol -using ::LdnProtocol; -/// ScanFilter. \ref ldnScan / \ref ldnScanPrivate will only return the \ref LdnNetworkInfo when validating the \ref LdnNetworkInfo with LdnScanFilter was sucessful, with the fields enabled by \ref LdnScanFilterFlag. -using ::LdnScanFilter; -/// ScanFilterFlag -using ::LdnScanFilterFlag; -/// SecurityConfig -using ::LdnSecurityConfig; -/// SecurityMode. LdnSecurityMode_Product can be used as the default value. The ldn cmds which use an input SecurityMode normally overwrite the SecurityMode. -using ::LdnSecurityMode; -/// SecurityParameter. The struct used by \ref ldnCreateNetwork internally is randomly-generated. -using ::LdnSecurityParameter; -using ::LdnServiceType; -/// SessionId -using ::LdnSessionId; -/// Ssid -using ::LdnSsid; -/// State loaded by \ref ldnmGetStateForMonitor / \ref ldnGetState. -using ::LdnState; -/// SubnetMask. This is essentially the same as struct in_addr - hence this can be used with standard sockets (byteswap required). -using ::LdnSubnetMask; -/// UserConfig. The input struct is copied to a tmp struct, which is then used with the cmd. -using ::LdnUserConfig; -/// WirelessControllerRestriction -using ::LdnWirelessControllerRestriction; - -/// Initialize ldn:m. -Result Initialize(void); - -/// Exit ldn:m. -void Exit(void); - -/// Gets the Service object for IMonitorService. -Service* GetServiceSession_MonitorService(void); - -/** - * @brief GetState - * @param[out] out \ref LdnState - */ -Result GetState(LdnState *out); - -/** - * @brief GetNetworkInfo - * @param[out] out \ref LdnNetworkInfo - */ -Result GetNetworkInfo(LdnNetworkInfo *out); - -/** - * @brief GetIpv4Address - * @param[out] addr \ref LdnIpv4Address - * @param[out] mask \ref LdnSubnetMask - */ -Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask); - -/** - * @brief GetSecurityParameter - * @note Not exposed by official sw. - * @param[out] out \ref LdnSecurityParameter - */ -Result GetSecurityParameter(LdnSecurityParameter *out); - -/** - * @brief GetNetworkConfig - * @note Not exposed by official sw. - * @param[out] out \ref LdnNetworkConfig - */ -Result GetNetworkConfig(LdnNetworkConfig *out); - -} // namespace ldnm - -/// @brief C++ wrappers for the `ldr` API. -/// @details Wraps: switch/services/ldr.h, switch/services/ro.h. -namespace ldr { - -using ::LoaderModuleInfo; -using ::LoaderProgramAttributes; -using ::LoaderProgramInfo; -using ::LoaderProgramInfoV1; - -/// Initialize ldr:shel. -Result ShellInitialize(void); - -/// Exit ldr:shel. -void ShellExit(void); - -/// Gets the Service object for the actual ldr:shel service session. -Service* ShellGetServiceSession(void); - -/// Initialize ldr:dmnt. -Result DmntInitialize(void); - -/// Exit ldr:dmnt. -void DmntExit(void); - -/// Gets the Service object for the actual ldr:dmnt service session. -Service* DmntGetServiceSession(void); - -/// Initialize ldr:pm. -Result PmInitialize(void); - -/// Exit ldr:pm. -void PmExit(void); - -/// Gets the Service object for the actual ldr:pm service session. -Service* PmGetServiceSession(void); - -Result ShellSetProgramArguments(u64 program_id, const void *args, size_t args_size); - -Result ShellFlushArguments(void); - -Result DmntSetProgramArguments(u64 program_id, const void *args, size_t args_size); - -Result DmntFlushArguments(void); - -Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out); - -Result PmCreateProcess(u64 pin_id, u32 flags, Handle reslimit_h, const LoaderProgramAttributes *attrs, Handle *out_process_h); - -Result PmGetProgramInfo(const NcmProgramLocation *loc, const LoaderProgramAttributes *attrs, LoaderProgramInfo *out_program_info); - -///< [19.0.0+/Atmosphere] -Result PmGetProgramInfoV1(const NcmProgramLocation *loc, LoaderProgramInfoV1 *out_program_info); - -///< [1.0.0-18.1.0/Non-Atmosphere] -Result PmPinProgram(const NcmProgramLocation *loc, u64 *out_pin_id); - -Result PmUnpinProgram(u64 pin_id); - -Result PmSetEnabledProgramVerification(bool enabled); - -/// Initialize ldr:ro. -Result RoInitialize(void); - -/// Exit ldr:ro. -void RoExit(void); - -/// Gets the Service object for the actual ldr:ro service session. -Service* RoGetServiceSession(void); - -Result RoLoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); - -Result RoUnloadNro(u64 nro_address); - -Result RoLoadNrr(u64 nrr_address, u64 nrr_size); - -Result RoUnloadNrr(u64 nrr_address); - -Result RoLoadNrrEx(u64 nrr_address, u64 nrr_size); - -} // namespace ldr - -/// @brief C++ wrappers for the `levent` API. -/// @details Wraps: switch/kernel/levent.h. -namespace levent { - -/// User-mode light event structure. -using ::LEvent; - -/** - * @brief Initializes a user-mode light event. - * @param[out] le Pointer to \ref LEvent structure. - * @param[in] signaled Whether the event starts off in signaled state. - * @param[in] autoclear Autoclear flag. - */ -void Init(LEvent* le, bool signaled, bool autoclear); - -/** - * @brief Waits on a user-mode light event. - * @param[in] le Pointer to \ref LEvent structure. - * @param[in] timeout_ns Timeout in nanoseconds (pass UINT64_MAX to wait indefinitely). - * @return true if wait succeeded, false if wait timed out. - */ -bool Wait(LEvent* le, u64 timeout_ns); - -/** - * @brief Polls a user-mode light event. - * @param[in] le Pointer to \ref LEvent structure. - * @return true if event is signaled, false otherwise. - */ -bool TryWait(LEvent* le); - -/** - * @brief Signals a user-mode light event. - * @param[in] le Pointer to \ref LEvent structure. - */ -void Signal(LEvent* le); - -/** - * @brief Clears a user-mode light event. - * @param[in] le Pointer to \ref LEvent structure. - */ -void Clear(LEvent* le); - -} // namespace levent - -/// @brief C++ wrappers for the `libapplet` API. -/// @details Wraps: switch/applets/libapplet.h. -namespace libapplet { - -/// CommonArguments -using ::LibAppletArgs; - -/** - * @brief Creates a LibAppletArgs struct. - * @param a LibAppletArgs struct. - * @param version LaVersion for \ref LibAppletArgs. - */ -void ArgsCreate(LibAppletArgs* a, u32 version); - -/** - * @brief Sets the PlayStartupSound field in \ref LibAppletArgs. - * @param a LibAppletArgs struct. - * @param flag Value for \ref LibAppletArgs PlayStartupSound. - */ -void ArgsSetPlayStartupSound(LibAppletArgs* a, bool flag); - -/** - * @brief Creates an AppletStorage with the specified size and writes the buffer contents to that storage at offset 0. - * @param[out] s Storage object. - * @param buffer Input buffer. - * @param size Size to write. - */ -Result CreateWriteStorage(AppletStorage* s, const void* buffer, size_t size); - -/** - * @brief Reads data from offset 0 from the specified storage into the buffer. If the storage-size is smaller than the size param, the storage-size is used instead. - * @param s Storage object. - * @param buffer Output buffer. - * @param size Size to read. - * @param transfer_size Optional output size field for the actual size used for the read, can be NULL. - */ -Result ReadStorage(AppletStorage* s, void* buffer, size_t size, size_t *transfer_size); - -/** - * @brief Sets the tick field in LibAppletArgs, then creates a storage with it which is pushed to the AppletHolder via \ref appletHolderPushInData. - * @param a LibAppletArgs struct. - * @param h AppletHolder object. - */ -Result ArgsPush(LibAppletArgs* a, AppletHolder *h); - -/** - * @brief Uses \ref appletPopInData and reads it to the specified LibAppletArgs. The LibAppletArgs is validated, an error is thrown when invalid. - * @param[out] a LibAppletArgs struct. - */ -Result ArgsPop(LibAppletArgs* a); - -/** - * @brief Creates a storage using the input buffer which is pushed to the AppletHolder via \ref appletHolderPushInData. - * @param h AppletHolder object. - * @param buffer Input data buffer. - * @param size Input data size. - */ -Result PushInData(AppletHolder *h, const void* buffer, size_t size); - -/** - * @brief Pops a storage via \ref appletHolderPopOutData, uses \ref libappletReadStorage, then closes the storage. - * @param h AppletHolder object. - * @param buffer Output buffer. - * @param size Size to read. - * @param transfer_size Optional output size field for the actual size used for the read, can be NULL. - */ -Result PopOutData(AppletHolder *h, void* buffer, size_t size, size_t *transfer_size); - -/** - * @brief Sets whether \ref libappletStart uses \ref appletHolderJump. - * @param flag Flag. Value true should not be used unless running as AppletType_LibraryApplet. - */ -void SetJumpFlag(bool flag); - -/** - * @brief If the flag from \ref libappletSetJumpFlag is set, this just uses \ref appletHolderJump. Otherwise, starts the applet and waits for it to finish, then checks the \ref LibAppletExitReason. - * @note Uses \ref appletHolderStart and \ref appletHolderJoin. - * @param h AppletHolder object. - */ -Result Start(AppletHolder *h); - -/** - * @brief Creates a LibraryApplet with the specified input storage data, uses \ref libappletStart, and reads the output storage reply data via \ref libappletPopOutData. - * @param id \ref AppletId - * @param commonargs \ref LibAppletArgs struct. - * @param arg Input storage data buffer. Optional, can be NULL. - * @param arg_size Size of the arg buffer. - * @param reply Output storage data buffer. Optional, can be NULL. - * @param reply_size Size to read for the reply buffer. - * @param out_reply_size Actual read reply data size, see \ref libappletPopOutData. - */ -Result Launch(AppletId id, LibAppletArgs *commonargs, const void* arg, size_t arg_size, void* reply, size_t reply_size, size_t *out_reply_size); - -/// Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. -/// Returns to the main Home Menu, equivalent to pressing the HOME button. -Result RequestHomeMenu(void); - -/// Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. -/// Equivalent to entering "System Update" under System Settings. When leaving this, it returns to the main Home Menu. -Result RequestJumpToSystemUpdate(void); - -/** - * @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. - * @note Only available on [11.0.0+]. - * @param[in] application_id ApplicationId - * @param[in] uid \ref AccountUid - * @param[in] buffer Input buffer. - * @param[in] size Input buffer size. - * @param[in] sender LaunchApplicationRequestSender - */ -Result RequestToLaunchApplication(u64 application_id, AccountUid uid, const void* buffer, size_t size, u32 sender); - -/** - * @brief Wrapper for \ref appletPushToGeneralChannel, see appletPushToGeneralChannel regarding the requirements for using this. - * @note Only available on [11.0.0+]. - * @param[in] uid \ref AccountUid - * @param[in] application_id Optional ApplicationId, can be 0. - */ -Result RequestJumpToStory(AccountUid uid, u64 application_id); - -} // namespace libapplet - -/// @brief C++ wrappers for the `lp2p` API. -/// @details Wraps: switch/services/lp2p.h. -namespace lp2p { - -/// GroupId -using ::Lp2pGroupId; -/// GroupInfo -/// \ref lp2pScan only uses the following fields for the cmd input struct: supported_platform/priority, frequency/channel, and preshared_key_binary_size/preshared_key. -using ::Lp2pGroupInfo; -/// IpConfig. Only contains IPv4 addresses. -using ::Lp2pIpConfig; -/// MacAddress -using ::Lp2pMacAddress; -/// NodeInfo -using ::Lp2pNodeInfo; -/// ScanResult -using ::Lp2pScanResult; -using ::Lp2pServiceType; - -/// Initialize lp2p. -Result Initialize(Lp2pServiceType service_type); - -/// Exit lp2p. -void Exit(void); - -/// Gets the Service object for INetworkService. -Service* GetServiceSession_INetworkService(void); - -/// Gets the Service object for INetworkServiceMonitor. -Service* GetServiceSession_INetworkServiceMonitor(void); - -/** - * @brief Creates a default \ref Lp2pGroupInfo for use with \ref lp2pCreateGroup / \ref lp2pJoin. - * @param info \ref Lp2pGroupInfo - */ -void CreateGroupInfo(Lp2pGroupInfo *info); - -/** - * @brief Creates a default \ref Lp2pGroupInfo for use with \ref lp2pScan. - * @param info \ref Lp2pGroupInfo - */ -void CreateGroupInfoScan(Lp2pGroupInfo *info); - -/** - * @brief Sets Lp2pGroupInfo::service_name. - * @param info \ref Lp2pGroupInfo - * @param[in] name ServiceName / SSID. - */ -void GroupInfoSetServiceName(Lp2pGroupInfo *info, const char *name); - -/** - * @brief Sets Lp2pGroupInfo::flags_count and Lp2pGroupInfo::flags. - * @note The default is count=1 flags[0]=1, which is used by \ref lp2pCreateGroupInfo. [11.0.0+] To use standard WPA2-PSK, you can use flags[0]=0. - * @param info \ref Lp2pGroupInfo - * @param[in] flags Lp2pGroupInfo::flags - * @param[in] count Lp2pGroupInfo::flags_count - */ -void GroupInfoSetFlags(Lp2pGroupInfo *info, s8 *flags, size_t count); - -/** - * @brief Sets Lp2pGroupInfo::member_count_max. - * @param info \ref Lp2pGroupInfo - * @param[in] count MemberCountMax - */ -void GroupInfoSetMemberCountMax(Lp2pGroupInfo *info, size_t count); - -/** - * @brief Sets Lp2pGroupInfo::frequency and Lp2pGroupInfo::channel. - * @param info \ref Lp2pGroupInfo - * @param[in] frequency Lp2pGroupInfo::frequency - * @param[in] channel Lp2pGroupInfo::channel - */ -void GroupInfoSetFrequencyChannel(Lp2pGroupInfo *info, u16 frequency, s16 channel); - -/** - * @brief Sets Lp2pGroupInfo::stealth_enabled. - * @param info \ref Lp2pGroupInfo - * @param[in] flag Lp2pGroupInfo::stealth_enabled - */ -void GroupInfoSetStealthEnabled(Lp2pGroupInfo *info, bool flag); - -/** - * @brief Sets the PresharedKey for the specified \ref Lp2pGroupInfo. - * @note Using this is required before using the \ref Lp2pGroupInfo as input for any cmds, so that Lp2pGroupInfo::preshared_key_binary_size gets initialized. - * @note If standard WPA2-PSK is being used, use \ref lp2pGroupInfoSetPassphrase instead. - * @param info \ref Lp2pGroupInfo - * @param[in] key Data for the PresharedKey. - * @param[in] size Size to copy into the PresharedKey, max is 0x20. - */ -void GroupInfoSetPresharedKey(Lp2pGroupInfo *info, const void* key, size_t size); - -/** - * @brief Sets the passphrase, for when standard WPA2-PSK is being used. - * @note Configure standard WPA2-PSK usage via \ref lp2pGroupInfoSetFlags / Lp2pGroupInfo::security_type. - * @note Only available on [11.0.0+]. - * @param info \ref Lp2pGroupInfo - * @param[in] passphrase Passphrase string, the required length is 0x8-0x3F. - */ -Result GroupInfoSetPassphrase(Lp2pGroupInfo *info, const char *passphrase); - -/** - * @brief Scan - * @param[in] info \ref Lp2pGroupInfo - * @param[out] results Output array of \ref Lp2pScanResult. - * @param[in] count Size of the results array in entries. - * @param[out] total_out Total output entries. - */ -Result Scan(const Lp2pGroupInfo *info, Lp2pScanResult *results, s32 count, s32 *total_out); - -/** - * @brief CreateGroup - * @note The role (\ref lp2pGetRole) must be 0. This eventually sets the role to value 1. - * @param[in] info \ref Lp2pGroupInfo - */ -Result CreateGroup(const Lp2pGroupInfo *info); - -/** - * @brief This destroys the previously created group from \ref lp2pCreateGroup. - * @note If no group was previously created (role from \ref lp2pGetRole is not 1), this just returns 0. - */ -Result DestroyGroup(void); - -/** - * @brief SetAdvertiseData - * @note The role (\ref lp2pGetRole) must be <=1. - * @note An empty buffer (buffer=NULL/size=0) can be used to reset the AdvertiseData size in state to zero. - * @param[out] buffer Input buffer containing arbitrary user data. - * @param[in] size Input buffer size, must be <=0x80. - */ -Result SetAdvertiseData(const void* buffer, size_t size); - -/** - * @brief This sends an Action frame to the specified \ref Lp2pGroupId, with the specified destination \ref Lp2pMacAddress. - * @note The role (\ref lp2pGetRole) must be non-zero. - * @note The error from \ref lp2pGetNetworkInterfaceLastError will be returned if it's set. - * @note [11.0.0+] Lp2pGroupInfo::security_type must be value 2 (default encryption), otherwise an error is returned. - * @param[in] buffer Input buffer containing arbitrary user data. - * @param[in] size Input buffer size, must be <=0x400. - * @param[in] addr \ref Lp2pMacAddress, this can be a broadcast address. This must be non-zero. - * @param[in] group_id \ref Lp2pGroupId - * @param[in] frequency Must be >=1. See Lp2pGroupInfo::frequency. - * @param[in] channel Must be >=1. See Lp2pGroupInfo::channel. - * @param[in] flags Only bit0 is used: clear = block until the data can be sent, set = return error when the data can't be sent. - */ -Result SendToOtherGroup(const void* buffer, size_t size, Lp2pMacAddress addr, Lp2pGroupId group_id, s16 frequency, s16 channel, u32 flags); - -/** - * @brief This receives an Action frame. - * @note The role (\ref lp2pGetRole) must be non-zero. - * @note When data is not available, the error from \ref lp2pGetNetworkInterfaceLastError will be returned if it's set. - * @param[out] buffer Output buffer containing arbitrary user data. - * @param[in] size Output buffer size. - * @param[in] flags Only bit0 is used: clear = block until data is available, set = return error when data is not available. - * @param[in] addr \ref Lp2pMacAddress - * @param[in] unk0 Unknown - * @param[in] unk1 Unknown - * @param[out] out_size This is the original size used for copying to the output buffer, before it's clamped to the output-buffer size. - * @param[out] unk2 Unknown - */ -Result RecvFromOtherGroup(void* buffer, size_t size, u32 flags, Lp2pMacAddress *addr, u16 *unk0, s32 *unk1, u64 *out_size, s32 *unk2); - -/** - * @brief AddAcceptableGroupId - * @param[in] group_id \ref Lp2pGroupId - */ -Result AddAcceptableGroupId(Lp2pGroupId group_id); - -/** - * @brief RemoveAcceptableGroupId - */ -Result RemoveAcceptableGroupId(void); - -/** - * @brief AttachNetworkInterfaceStateChangeEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result AttachNetworkInterfaceStateChangeEvent(Event* out_event); - -/** - * @brief GetNetworkInterfaceLastError - */ -Result GetNetworkInterfaceLastError(void); - -/** - * @brief GetRole - * @param[out] out Output Role. - */ -Result GetRole(u8 *out); - -/** - * @brief GetAdvertiseData - * @note The role from \ref lp2pGetRole must be value 2. - * @param[out] buffer Output buffer data. - * @param[in] size Output buffer size. - * @param[out] transfer_size Size of the data copied into the buffer. - * @param[out] original_size Original size from state. - */ -Result GetAdvertiseData(void* buffer, size_t size, u16 *transfer_size, u16 *original_size); - -/** - * @brief GetAdvertiseData2 - * @note This is identical to \ref lp2pGetAdvertiseData except this doesn't run the role validation. - * @param[out] buffer Output buffer data. - * @param[in] size Output buffer size. - * @param[out] transfer_size Size of the data copied into the buffer. - * @param[out] original_size Original size from state. - */ -Result GetAdvertiseData2(void* buffer, size_t size, u16 *transfer_size, u16 *original_size); - -/** - * @brief GetGroupInfo - * @note The role from \ref lp2pGetRole must be non-zero. - * @param[out] out \ref Lp2pGroupInfo - */ -Result GetGroupInfo(Lp2pGroupInfo *out); - -/** - * @brief This runs the same code as \ref lp2pCreateGroup to generate the \ref Lp2pGroupInfo for the input struct. - * @param[out] out \ref Lp2pGroupInfo - * @param[in] info \ref Lp2pGroupInfo - */ -Result Join(Lp2pGroupInfo *out, const Lp2pGroupInfo *info); - -/** - * @brief GetGroupOwner - * @note The role from \ref lp2pGetRole must be non-zero. - * @param[out] out \ref Lp2pNodeInfo - */ -Result GetGroupOwner(Lp2pNodeInfo *out); - -/** - * @brief GetIpConfig - * @note The role from \ref lp2pGetRole must be non-zero. - * @param[out] out \ref Lp2pIpConfig - */ -Result GetIpConfig(Lp2pIpConfig *out); - -/** - * @brief Leave - * @param[out] out Output value. - */ -Result Leave(u32 *out); - -/** - * @brief AttachJoinEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result AttachJoinEvent(Event* out_event); - -/** - * @brief GetMembers - * @note The role from \ref lp2pGetRole must be value 1. - * @param[out] members Output array of \ref Lp2pNodeInfo. - * @param[in] count Size of the members array in entries. A maximum of 8 entries can be returned. - * @param[out] total_out Total output entries. - */ -Result GetMembers(Lp2pNodeInfo *members, s32 count, s32 *total_out); - -} // namespace lp2p - -/// @brief C++ wrappers for the `lr` API. -/// @details Wraps: switch/services/lr.h. -namespace lr { - -using ::LrLocationResolver; -using ::LrRegisteredLocationResolver; - -/// Initialize lr. -Result Initialize(void); - -/// Exit lr. -void Exit(void); - -/// Gets the Service object for the actual lr service session. -Service* GetServiceSession(void); - -Result OpenLocationResolver(NcmStorageId storage, LrLocationResolver* out); - -Result OpenRegisteredLocationResolver(LrRegisteredLocationResolver* out); - -Result LrResolveProgramPath(LrLocationResolver* lr, u64 tid, char *out); - -Result LrRedirectProgramPath(LrLocationResolver* lr, u64 tid, const char *path); - -Result LrResolveApplicationControlPath(LrLocationResolver* lr, u64 tid, char *out); - -Result LrResolveApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, char *out); - -Result LrResolveDataPath(LrLocationResolver* lr, u64 tid, char *out); - -Result LrRedirectApplicationControlPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path); - -Result LrRedirectApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path); - -Result LrResolveApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, char *out); - -Result LrRedirectApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path); - -Result LrRefresh(LrLocationResolver* lr); - -/// Only available on [5.0.0+]. -Result LrEraseProgramRedirection(LrLocationResolver* lr, u64 tid); - -Result RegLrResolveProgramPath(LrRegisteredLocationResolver* reg, u64 tid, char *out); - -} // namespace lr - -/// @brief C++ wrappers for the `mii` API. -/// @details Wraps: switch/applets/mii_la.h, switch/services/mii.h. -namespace mii { - -/// Mii age. -using ::MiiAge; -using ::MiiCharInfo; -using ::MiiCreateId; -using ::MiiDatabase; -/// Mii face color. -using ::MiiFaceColor; -/// Mii gender. -using ::MiiGender; -/// AppletInput -using ::MiiLaAppletInput; -/// AppletMode -using ::MiiLaAppletMode; -/// AppletOutput -using ::MiiLaAppletOutput; -/// AppletOutputForCharInfoEditing -using ::MiiLaAppletOutputForCharInfoEditing; -using ::MiiNfpStoreDataExtension; -using ::MiiServiceType; -using ::MiiSourceFlag; -using ::MiiSpecialKeyCode; -using ::MiiStoreData; -using ::MiiVer3StoreData; - -/** - * @brief Launches the applet for ShowMiiEdit. - * @param[in] special_key_code \ref MiiSpecialKeyCode - */ -Result LaShowMiiEdit(MiiSpecialKeyCode special_key_code); - -/** - * @brief Launches the applet for AppendMii. - * @param[in] special_key_code \ref MiiSpecialKeyCode - * @param[out] index Output Index. - */ -Result LaAppendMii(MiiSpecialKeyCode special_key_code, s32 *index); - -/** - * @brief Launches the applet for AppendMiiImage. - * @param[in] special_key_code \ref MiiSpecialKeyCode - * @param[in] valid_uuid_array Input array of Uuid. - * @param[in] count Total entries for the valid_uuid_array. Must be 0-8. - * @param[out] index Output Index. - */ -Result LaAppendMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, s32 *index); - -/** - * @brief Launches the applet for UpdateMiiImage. - * @param[in] special_key_code \ref MiiSpecialKeyCode - * @param[in] valid_uuid_array Input array of Uuid. - * @param[in] count Total entries for the valid_uuid_array. Must be 0-8. - * @param[in] used_uuid UsedUuid - * @param[out] index Output Index. - */ -Result LaUpdateMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, Uuid used_uuid, s32 *index); - -/** - * @brief Launches the applet for CreateMii. - * @note This creates a Mii and returns it, without saving it in the database. - * @note Only available on [10.2.0+]. - * @param[in] special_key_code \ref MiiSpecialKeyCode - * @param[out] out_char \ref MiiCharInfo - */ -Result LaCreateMii(MiiSpecialKeyCode special_key_code, MiiCharInfo *out_char); - -/** - * @brief Launches the applet for EditMii. - * @note This edits the specified Mii and returns it, without saving it in the database. - * @note Only available on [10.2.0+]. - * @param[in] special_key_code \ref MiiSpecialKeyCode - * @param[in] in_char \ref MiiCharInfo - * @param[out] out_char \ref MiiCharInfo - */ -Result LaEditMii(MiiSpecialKeyCode special_key_code, const MiiCharInfo *in_char, MiiCharInfo *out_char); - -/// Initialize mii. -Result Initialize(MiiServiceType service_type); - -/// Exit mii. -void Exit(void); - -/// Gets the Service object for the actual mii service session. -Service* GetServiceSession(void); - -/** - * @brief Opens a mii database. - * @param[in] key_code Mii key code filter. - * @param[out] out Database. - */ -Result OpenDatabase(MiiDatabase *out, MiiSpecialKeyCode key_code); - -/** - * @brief Returns whether the mii database is updated. - * @param[in] db Database. - * @param[in] flag Source flag. - * @param[out] out_updated Whether the mii database is updated. - */ -Result DatabaseIsUpdated(MiiDatabase *db, bool *out_updated, MiiSourceFlag flag); - -/** - * @brief Returns whether the mii database is full. - * @param[in] db Database. - * @param[out] out_full Whether the mii database is full. - */ -Result DatabaseIsFull(MiiDatabase *db, bool *out_full); - -/** - * @brief Returns number of miis in the database with the specified source flag. - * @param[in] db Database. - * @param[in] flag Source flag. - * @param[out] out_count Out mii count. - */ -Result DatabaseGetCount(MiiDatabase *db, s32 *out_count, MiiSourceFlag flag); - -/** - * @brief Reads mii charinfo data from the specified source flag. - * @param[in] db Database. - * @param[in] flag Source flag. - * @param[out] out_infos Output mii charinfo array. - * @param[in] count Number of mii chainfos to read. - * @param[out] total_out Number of mii charinfos which were actually read. - */ -Result DatabaseGet1(MiiDatabase *db, MiiSourceFlag flag, MiiCharInfo *out_infos, s32 count, s32 *total_out); - -/** - * @brief Generates a random mii charinfo (doesn't register it in the console database). - * @param[in] db Database. - * @param[in] age Mii's age. - * @param[in] gender Mii's gender. - * @param[in] face_color Mii's face color. - * @param[out] out_info Out mii charinfo data. - */ -Result DatabaseBuildRandom(MiiDatabase *db, MiiAge age, MiiGender gender, MiiFaceColor face_color, MiiCharInfo *out_info); - -/// Closes a mii database. -void DatabaseClose(MiiDatabase *db); - -} // namespace mii - -/// @brief C++ wrappers for the `miiimg` API. -/// @details Wraps: switch/services/miiimg.h. -namespace miiimg { - -/// Image attribute. -using ::MiiimgImageAttribute; -/// Image ID. -using ::MiiimgImageId; - -/// Initialize miiimg. -Result Initialize(void); - -/// Exit miiimg. -void Exit(void); - -/// Gets the Service object for the actual miiimg service session. -Service* GetServiceSession(void); - -/** - * @brief Reloads the image database. - */ -Result Reload(void); - -/** - * @brief Gets the number of mii images in the database. - * @param[out] out_count Mii image count. - */ -Result GetCount(s32 *out_count); - -/** - * @brief Gets whether the image database is empty. - * @param[out] out_empty Whether the database is empty. - */ -Result IsEmpty(bool *out_empty); - -/** - * @brief Gets whether the image database is full. - * @param[out] out_empty Whether the database is full. - */ -Result IsFull(bool *out_full); - -/** - * @brief Gets the image attribute for the specified image index. - * @param[in] index Image index. - * @param[out] out_attr Out image attribute. - */ -Result GetAttribute(s32 index, MiiimgImageAttribute *out_attr); - -/** - * @brief Loads the image data (raw RGBA8) for the specified image ID. - * @note Server doesn't seem to check the image buffer size, but 0x40000 is the optimal size. - * @param[in] id Input image ID. - * @param[out] out_image Out iamge buffer. - * @param[in] out_image_size Out image buffer size. - */ -Result LoadImage(MiiimgImageId id, void* out_image, size_t out_image_size); - -} // namespace miiimg - -/// @brief C++ wrappers for the `mmu` API. -/// @details Wraps: switch/services/mm.h. -namespace mmu { - -using ::MmuModuleId; -using ::MmuRequest; - -Result Initialize(void); - -void Exit(void); - -Service* GetServiceSession(void); - -Result RequestInitialize(MmuRequest *request, MmuModuleId module, u32 unk, bool autoclear); - -///< unk is ignored by official software -Result RequestFinalize(const MmuRequest *request); - -Result RequestGet(const MmuRequest *request, u32 *out_freq_hz); - -Result RequestSetAndWait(const MmuRequest *request, u32 freq_hz, s32 timeout); - -} // namespace mmu - -/// @brief C++ wrappers for the `mutex` API. -/// @details Wraps: switch/kernel/mutex.h. -namespace mutex { - -/// Mutex datatype, defined in newlib. -using ::Mutex; -/// Recursive mutex datatype, defined in newlib. -using ::RMutex; - -/** - * @brief Initializes a mutex. - * @param m Mutex object. - * @note A mutex can also be statically initialized by assigning 0 to it. - */ -void Init(Mutex* m); - -/** - * @brief Locks a mutex. - * @param m Mutex object. - */ -void Lock(Mutex* m); - -/** - * @brief Attempts to lock a mutex without waiting. - * @param m Mutex object. - * @return 1 if the mutex has been acquired successfully, and 0 on contention. - */ -bool TryLock(Mutex* m); - -/** - * @brief Unlocks a mutex. - * @param m Mutex object. - */ -void Unlock(Mutex* m); - -/** - * @brief Gets whether the current thread owns the mutex. - * @param m Mutex object. - * @return 1 if the mutex is locked by the current thread, and 0 otherwise. - */ -bool IsLockedByCurrentThread(const Mutex* m); - -} // namespace mutex - -/// @brief C++ wrappers for the `nacp` API. -/// @details Wraps: switch/nacp.h. -namespace nacp { - -/// ApplicationControlDataCondition -using ::NacpApplicationControlDataCondition; -/// ApplicationJitConfiguration -using ::NacpApplicationJitConfiguration; -/// ApplicationNeighborDetectionGroupConfiguration -using ::NacpApplicationNeighborDetectionGroupConfiguration; -/// Language entry. These strings are UTF-8. -using ::NacpLanguageEntry; -using ::NacpLanguageEntryData; -/// NeighborDetectionClientConfiguration -using ::NacpNeighborDetectionClientConfiguration; -/// ns ApplicationControlProperty -using ::NacpStruct; - -/// Get the NacpLanguageEntry from the input nacp corresponding to the current system language (this may fallback to other languages when needed). Output langentry is NULL if none found / content of entry is empty. -/// If you're using ns you may want to use \ref nsGetApplicationDesiredLanguage instead. -Result GetLanguageEntry(NacpStruct* nacp, NacpLanguageEntry** langentry); - -} // namespace nacp - -/// @brief C++ wrappers for the `ncm` API. -/// @details Wraps: switch/services/ncm.h, switch/services/ncm_types.h. -namespace ncm { - -/// AddOnContentMetaExtendedHeader [15.0.0+] -using ::NcmAddOnContentMetaExtendedHeader; -/// ApplicationContentMetaKey -using ::NcmApplicationContentMetaKey; -/// ApplicationMetaExtendedHeader -using ::NcmApplicationMetaExtendedHeader; -/// ContentId -using ::NcmContentId; -/// ContentInfo -using ::NcmContentInfo; -/// ContentInstallType -using ::NcmContentInstallType; -/// ContentMetaAttribute -using ::NcmContentMetaAttribute; -/// ContentMetaDatabase -using ::NcmContentMetaDatabase; -/// ContentMetaHeader -using ::NcmContentMetaHeader; -/// ContentMetaInfo -using ::NcmContentMetaInfo; -/// ContentMetaKey -using ::NcmContentMetaKey; -/// ContentMetaPlatform -using ::NcmContentMetaPlatform; -/// ContentMetaType -using ::NcmContentMetaType; -/// ContentStorage -using ::NcmContentStorage; -/// ContentType -using ::NcmContentType; -/// DataPatchMetaExtendedHeader -using ::NcmDataPatchMetaExtendedHeader; -/// LegacyAddOnContentMetaExtendedHeader [1.0.0-14.1.2] -using ::NcmLegacyAddOnContentMetaExtendedHeader; -/// PackagedContentInfo -using ::NcmPackagedContentInfo; -/// PatchMetaExtendedHeader -using ::NcmPatchMetaExtendedHeader; -/// PlaceHolderId -using ::NcmPlaceHolderId; -/// ProgramLocation -using ::NcmProgramLocation; -/// RightsId -using ::NcmRightsId; -/// StorageId -using ::NcmStorageId; -/// SystemUpdateMetaExtendedHeader -using ::NcmSystemUpdateMetaExtendedHeader; - -/// Initialize ncm. -Result Initialize(void); - -/// Exit ncm. -void Exit(void); - -/// Gets the Service object for the actual ncm service session. -Service* GetServiceSession(void); - -Result CreateContentStorage(NcmStorageId storage_id); - -Result CreateContentMetaDatabase(NcmStorageId storage_id); - -Result VerifyContentStorage(NcmStorageId storage_id); - -Result VerifyContentMetaDatabase(NcmStorageId storage_id); - -Result OpenContentStorage(NcmContentStorage* out_content_storage, NcmStorageId storage_id); - -Result OpenContentMetaDatabase(NcmContentMetaDatabase* out_content_meta_database, NcmStorageId storage_id); - -Result CloseContentStorageForcibly(NcmStorageId storage_id); - -///< [1.0.0] -Result CloseContentMetaDatabaseForcibly(NcmStorageId storage_id); - -///< [1.0.0] -Result CleanupContentMetaDatabase(NcmStorageId storage_id); - -Result ActivateContentStorage(NcmStorageId storage_id); - -///< [2.0.0+] -Result InactivateContentStorage(NcmStorageId storage_id); - -///< [2.0.0+] -Result ActivateContentMetaDatabase(NcmStorageId storage_id); - -///< [2.0.0+] -Result InactivateContentMetaDatabase(NcmStorageId storage_id); - -///< [2.0.0+] -Result InvalidateRightsIdCache(void); - -///< [9.0.0+] -Result ActivateFsContentStorage(FsContentStorageId fs_storage_id); - -///< [16.0.0+] -void ContentStorageClose(NcmContentStorage* cs); - -Result ContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmPlaceHolderId* out_id); - -Result ContentStorageCreatePlaceHolder(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id, s64 size); - -Result ContentStorageDeletePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id); - -Result ContentStorageHasPlaceHolder(NcmContentStorage* cs, bool* out, const NcmPlaceHolderId* placeholder_id); - -Result ContentStorageWritePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, u64 offset, const void* data, size_t data_size); - -Result ContentStorageRegister(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id); - -Result ContentStorageDelete(NcmContentStorage* cs, const NcmContentId* content_id); - -Result ContentStorageHas(NcmContentStorage* cs, bool* out, const NcmContentId* content_id); - -Result ContentStorageGetPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmContentId* content_id); - -Result ContentStorageGetPlaceHolderPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmPlaceHolderId* placeholder_id); - -Result ContentStorageCleanupAllPlaceHolder(NcmContentStorage* cs); - -Result ContentStorageListPlaceHolder(NcmContentStorage* cs, NcmPlaceHolderId* out_ids, s32 count, s32* out_count); - -Result ContentStorageGetContentCount(NcmContentStorage* cs, s32* out_count); - -Result ContentStorageListContentId(NcmContentStorage* cs, NcmContentId* out_ids, s32 count, s32* out_count, s32 start_offset); - -Result ContentStorageGetSizeFromContentId(NcmContentStorage* cs, s64* out_size, const NcmContentId* content_id); - -Result ContentStorageDisableForcibly(NcmContentStorage* cs); - -Result ContentStorageRevertToPlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, const NcmContentId* old_content_id, const NcmContentId* new_content_id); - -///< [2.0.0+] -Result ContentStorageSetPlaceHolderSize(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, s64 size); - -///< [2.0.0+] -Result ContentStorageReadContentIdFile(NcmContentStorage* cs, void* out_data, size_t out_data_size, const NcmContentId* content_id, s64 offset); - -///< [2.0.0+] -Result ContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, FsContentAttributes attr); - -///< [2.0.0+] -Result ContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmContentId* content_id, FsContentAttributes attr); - -///< [2.0.0+] -Result ContentStorageWriteContentForDebug(NcmContentStorage* cs, const NcmContentId* content_id, s64 offset, const void* data, size_t data_size); - -///< [2.0.0+] -Result ContentStorageGetFreeSpaceSize(NcmContentStorage* cs, s64* out_size); - -///< [2.0.0+] -Result ContentStorageGetTotalSpaceSize(NcmContentStorage* cs, s64* out_size); - -///< [2.0.0+] -Result ContentStorageFlushPlaceHolder(NcmContentStorage* cs); - -///< [3.0.0+] -Result ContentStorageGetSizeFromPlaceHolderId(NcmContentStorage* cs, s64* out_size, const NcmPlaceHolderId* placeholder_id); - -///< [4.0.0+] -Result ContentStorageRepairInvalidFileAttribute(NcmContentStorage* cs); - -///< [4.0.0+] -Result ContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, const NcmContentId* cache_content_id, FsContentAttributes attr); - -///< [8.0.0+] -Result ContentStorageRegisterPath(NcmContentStorage* cs, const NcmContentId* content_id, const char *path); - -///< [13.0.0+] -Result ContentStorageClearRegisteredPath(NcmContentStorage* cs); - -///< [13.0.0+] -Result ContentStorageGetProgramId(NcmContentStorage* cs, u64* out, const NcmContentId* content_id, FsContentAttributes attr); - -///< [17.0.0+] -void ContentMetaDatabaseClose(NcmContentMetaDatabase* db); - -Result ContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, const void* data, u64 data_size); - -Result ContentMetaDatabaseGet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u64* out_size, void* out_data, u64 out_data_size); - -Result ContentMetaDatabaseRemove(NcmContentMetaDatabase* db, const NcmContentMetaKey *key); - -Result ContentMetaDatabaseGetContentIdByType(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type); - -Result ContentMetaDatabaseListContentInfo(NcmContentMetaDatabase* db, s32* out_entries_written, NcmContentInfo* out_info, s32 count, const NcmContentMetaKey* key, s32 start_index); - -Result ContentMetaDatabaseList(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type, u64 id, u64 id_min, u64 id_max, NcmContentInstallType install_type); - -Result ContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, NcmContentMetaKey* out_key, u64 id); - -Result ContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmApplicationContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type); - -Result ContentMetaDatabaseHas(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key); - -Result ContentMetaDatabaseHasAll(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* keys, s32 count); - -Result ContentMetaDatabaseGetSize(NcmContentMetaDatabase* db, u64* out_size, const NcmContentMetaKey* key); - -Result ContentMetaDatabaseGetRequiredSystemVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key); - -Result ContentMetaDatabaseGetPatchContentMetaId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key); - -Result ContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db); - -Result ContentMetaDatabaseLookupOrphanContent(NcmContentMetaDatabase* db, bool* out_orphaned, const NcmContentId* content_ids, s32 count); - -Result ContentMetaDatabaseCommit(NcmContentMetaDatabase* db); - -Result ContentMetaDatabaseHasContent(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key, const NcmContentId* content_id); - -Result ContentMetaDatabaseListContentMetaInfo(NcmContentMetaDatabase* db, s32* out_entries_written, void* out_meta_info, s32 count, const NcmContentMetaKey* key, s32 start_index); - -Result ContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u8* out); - -Result ContentMetaDatabaseGetRequiredApplicationVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key); - -///< [2.0.0+] -Result ContentMetaDatabaseGetContentIdByTypeAndIdOffset(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type, u8 id_offset); - -///< [5.0.0+] -Result ContentMetaDatabaseGetPlatform(NcmContentMetaDatabase* db, u8* out, const NcmContentMetaKey* key); - -/** - * @brief Retrieves the content size from a \ref NcmContentInfo struct. - * @param[in] info Pointer to \ref NcmContentInfo struct. - * @param[out] out Output size. - */ -void ContentInfoSizeToU64(const NcmContentInfo *info, u64 *out); - -/** - * @brief Updates the content size from a \ref NcmContentInfo struct. - * @param[in] size Input size. - * @param[out] out Pointer to \ref NcmContentInfo struct. - */ -void U64ToContentInfoSize(const u64 size, NcmContentInfo *info); - -} // namespace ncm - -/// @brief C++ wrappers for the `news` API. -/// @details Wraps: switch/services/news.h. -namespace news { - -using ::NewsDatabaseService; -using ::NewsDataService; -using ::NewsNewlyArrivedEventHolder; -using ::NewsOverwriteEventHolder; -using ::NewsRecord; -using ::NewsRecordV1; -using ::NewsServiceType; -using ::NewsTopicName; - -Result Initialize(NewsServiceType service_type); - -void Exit(void); - -Service * GetServiceSession(void); - -Result CreateNewlyArrivedEventHolder(NewsNewlyArrivedEventHolder *out); - -Result CreateNewsDataService(NewsDataService *out); - -Result CreateNewsDatabaseService(NewsDatabaseService *out); - -Result CreateOverwriteEventHolder(NewsOverwriteEventHolder *out); - -///< [2.0.0+] -Result PostLocalNews(const void *news, size_t size); - -Result SetPassphrase(u64 program_id, const char *passphrase); - -Result GetSubscriptionStatus(const char *filter, u32 *status); - -Result GetTopicList(u32 channel, u32 *out_count, NewsTopicName *out, u32 max_count); - -///< [3.0.0+] -Result GetSavedataUsage(u64 *current, u64 *total); - -///< [6.0.0+] -Result IsSystemUpdateRequired(bool *out); - -Result GetDatabaseVersion(u32 *version); - -///< [10.0.0+] -Result RequestImmediateReception(const char *filter); - -Result SetSubscriptionStatus(const char *filter, u32 status); - -Result ClearStorage(void); - -Result ClearSubscriptionStatusAll(void); - -Result GetNewsDatabaseDump(void *buffer, u64 size, u64 *out); - -void NewlyArrivedEventHolderClose(NewsNewlyArrivedEventHolder *srv); - -Result NewlyArrivedEventHolderGet(NewsNewlyArrivedEventHolder *srv, Event *out); - -void DataClose(NewsDataService *srv); - -Result DataOpen(NewsDataService *srv, const char *file_name); - -Result DataOpenWithNewsRecordV1(NewsDataService *srv, NewsRecordV1 *record); - -Result DataRead(NewsDataService *srv, u64 *bytes_read, u64 offset, void *out, size_t out_size); - -Result DataGetSize(NewsDataService *srv, u64 *size); - -Result DataOpenWithNewsRecord(NewsDataService *srv, NewsRecord *record); - -///< [6.0.0+] -void DatabaseClose(NewsDatabaseService *srv); - -Result DatabaseGetListV1(NewsDatabaseService *srv, NewsRecordV1 *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset); - -Result DatabaseCount(NewsDatabaseService *srv, const char *filter, u32 *count); - -Result DatabaseGetList(NewsDatabaseService *srv, NewsRecord *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset); - -///< [6.0.0+] -void OverwriteEventHolderClose(NewsOverwriteEventHolder *srv); - -Result OverwriteEventHolderGet(NewsOverwriteEventHolder *srv, Event *out); - -} // namespace news - -/// @brief C++ wrappers for the `nfc` API. -/// @details Wraps: switch/services/nfc.h. -namespace nfc { - -/// Nfc/Nfp DeviceHandle -using ::NfcDeviceHandle; -using ::NfcDeviceState; -using ::NfcMifareCommand; -using ::NfcMifareDeviceState; -using ::NfcMifareReadBlockData; -using ::NfcMifareReadBlockParameter; -using ::NfcMifareWriteBlockParameter; -using ::NfcProtocol; -using ::NfcRequiredMcuVersionData; -using ::NfcSectorKey; -/// NfcServiceType -using ::NfcServiceType; -using ::NfcState; -using ::NfcTagInfo; -using ::NfcTagType; -using ::NfcTagUid; -using ::NfpAdminInfo; -using ::NfpAmiiboFlag; -using ::NfpApplicationAreaVersion; -using ::NfpBreakType; -using ::NfpCommonInfo; -using ::NfpData; -using ::NfpDate; -using ::NfpDeviceState; -using ::NfpDeviceType; -using ::NfpModelInfo; -using ::NfpMountTarget; -using ::NfpRegisterInfo; -using ::NfpRegisterInfoPrivate; -/// NfpServiceType -using ::NfpServiceType; -using ::NfpTagInfo; - -/// Initialize nfc:*. -Result Initialize(NfcServiceType service_type); - -/// Exit nfc:*. -void Exit(void); - -/// Initialize nfc:mf:u. -Result MfInitialize(void); - -/// Exit nfc:mf:u. -void MfExit(void); - -/// Gets the Service object for the actual nfc:* service session. -Service* GetServiceSession(void); - -/// Gets the Service object for the interface from nfc:*. -Service* GetServiceSession_Interface(void); - -/// Gets the Service object for the actual nfc:mf:u service session. -Service* MfGetServiceSession(void); - -/// Gets the Service object for the interface from nfc:mf:u. -Service* MfGetServiceSession_Interface(void); - -/// Only available with [4.0.0+]. -Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count); - -/// Only available with [4.0.0+]. -Result StartDetection(const NfcDeviceHandle *handle, NfcProtocol protocol); - -/// Only available with [4.0.0+]. -Result StopDetection(const NfcDeviceHandle *handle); - -Result MfListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count); - -Result MfStartDetection(const NfcDeviceHandle *handle); - -Result MfStopDetection(const NfcDeviceHandle *handle); - -/// Only available with [4.0.0+]. -Result GetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out); - -Result MfGetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out); - -/// Returned event will have autoclear off. -/// Only available with [4.0.0+]. -Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event); - -/// Returned event will have autoclear off. -/// Only available with [4.0.0+]. -Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event); - -/// Returned event will have autoclear off. -Result MfAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event); - -/// Returned event will have autoclear off. -Result MfAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event); - -/// Only available with [4.0.0+]. -Result GetState(NfcState *out); - -/// Only available with [4.0.0+]. -Result GetDeviceState(const NfcDeviceHandle *handle, NfcDeviceState *out); - -/// Only available with [4.0.0+]. -Result GetNpadId(const NfcDeviceHandle *handle, u32 *out); - -Result MfGetState(NfcState *out); - -Result MfGetDeviceState(const NfcDeviceHandle *handle, NfcMifareDeviceState *out); - -Result MfGetNpadId(const NfcDeviceHandle *handle, u32 *out); - -/// Returned event will have autoclear on. -/// Only available with [4.0.0+]. -Result AttachAvailabilityChangeEvent(Event *out_event); - -/// Returned event will have autoclear on. -Result MfAttachAvailabilityChangeEvent(Event *out_event); - -/// This uses nfc:*. -Result IsNfcEnabled(bool *out); - -/// Only available with [4.0.0+]. -Result ReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count); - -/// Only available with [4.0.0+]. -Result WriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count); - -Result MfReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count); - -Result MfWriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count); - -/// Only available with [4.0.0+]. -Result SendCommandByPassThrough(const NfcDeviceHandle *handle, u64 timeout, const void* cmd_buf, size_t cmd_buf_size, void* reply_buf, size_t reply_buf_size, u64 *out_size); - -/// Only available with [4.0.0+]. -Result KeepPassThroughSession(const NfcDeviceHandle *handle); - -/// Only available with [4.0.0+]. -Result ReleasePassThroughSession(const NfcDeviceHandle *handle); - -} // namespace nfc - -/// @brief C++ wrappers for the `nfp` API. -/// @details Wraps: switch/applets/nfp_la.h, switch/services/nfc.h. -namespace nfp { - -/// Nfc/Nfp DeviceHandle -using ::NfcDeviceHandle; -using ::NfcDeviceState; -using ::NfcMifareCommand; -using ::NfcMifareDeviceState; -using ::NfcMifareReadBlockData; -using ::NfcMifareReadBlockParameter; -using ::NfcMifareWriteBlockParameter; -using ::NfcProtocol; -using ::NfcRequiredMcuVersionData; -using ::NfcSectorKey; -/// NfcServiceType -using ::NfcServiceType; -using ::NfcState; -using ::NfcTagInfo; -using ::NfcTagType; -using ::NfcTagUid; -using ::NfpAdminInfo; -using ::NfpAmiiboFlag; -using ::NfpApplicationAreaVersion; -using ::NfpBreakType; -using ::NfpCommonInfo; -using ::NfpData; -using ::NfpDate; -using ::NfpDeviceState; -using ::NfpDeviceType; -/// AmiiboSettingsStartParam -using ::NfpLaAmiiboSettingsStartParam; -/// ReturnValueForAmiiboSettings -using ::NfpLaReturnValueForAmiiboSettings; -/// StartParamForAmiiboSettings -using ::NfpLaStartParamForAmiiboSettings; -/// Values for NfpLaStartParamForAmiiboSettings::type. -using ::NfpLaStartParamTypeForAmiiboSettings; -using ::NfpModelInfo; -using ::NfpMountTarget; -using ::NfpRegisterInfo; -using ::NfpRegisterInfoPrivate; -/// NfpServiceType -using ::NfpServiceType; -using ::NfpTagInfo; - -/** - * @brief Launches the applet for NicknameAndOwnerSettings. - * @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time. - * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam - * @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo. - * @param[in] in_reg_info \ref NfpRegisterInfo. Optional, can be NULL. If specified, this sets the \ref NfpRegisterInfo which will be used for writing, with an option for the user to change it. - * @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL. - * @param[out] handle \ref NfcDeviceHandle - * @param[out] reg_info_flag Flag indicating whether the data for out_reg_info is set. Optional, can be NULL. - * @param[out] out_reg_info \ref NfpRegisterInfo, see reg_info_flag. Optional, can be NULL. - */ -Result LaStartNicknameAndOwnerSettings(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, const NfpRegisterInfo *in_reg_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle, bool *reg_info_flag, NfpRegisterInfo *out_reg_info); - -/** - * @brief Launches the applet for GameDataEraser. - * @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time. - * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam - * @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo. - * @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL. - * @param[out] handle \ref NfcDeviceHandle - */ -Result LaStartGameDataEraser(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle); - -/** - * @brief Launches the applet for Restorer. - * @note Official sw does not expose functionality for using input/output \ref NfpTagInfo at the same time. - * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam - * @param[in] in_tag_info \ref NfpTagInfo. Optional, can be NULL. If specified, this must match the scanned amiibo. - * @param[out] out_tag_info \ref NfpTagInfo. Optional, can be NULL. - * @param[out] handle \ref NfcDeviceHandle - */ -Result LaStartRestorer(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle); - -/** - * @brief Launches the applet for Formatter. - * @param[in] in_param \ref NfpLaAmiiboSettingsStartParam - * @param[out] out_tag_info \ref NfpTagInfo - * @param[out] handle \ref NfcDeviceHandle - */ -Result LaStartFormatter(const NfpLaAmiiboSettingsStartParam *in_param, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle); - -/// Initialize nfp:*. -Result Initialize(NfpServiceType service_type); - -/// Exit nfp:*. -void Exit(void); - -/// Gets the Service object for the actual nfp:* service session. -Service* GetServiceSession(void); - -/// Gets the Service object for the interface from nfp:*. -Service* GetServiceSession_Interface(void); - -Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count); - -Result StartDetection(const NfcDeviceHandle *handle); - -Result StopDetection(const NfcDeviceHandle *handle); - -Result Mount(const NfcDeviceHandle *handle, NfpDeviceType device_type, NfpMountTarget mount_target); - -Result Unmount(const NfcDeviceHandle *handle); - -/// Not available with ::NfpServiceType_System. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result OpenApplicationArea(const NfcDeviceHandle *handle, u32 app_id); - -/// Not available with ::NfpServiceType_System. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened. -Result GetApplicationArea(const NfcDeviceHandle *handle, void* buf, size_t buf_size, u32 *out_size); - -/// Not available with ::NfpServiceType_System. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened. -Result SetApplicationArea(const NfcDeviceHandle *handle, const void* buf, size_t buf_size); - -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result Flush(const NfcDeviceHandle *handle); - -Result Restore(const NfcDeviceHandle *handle); - -/// Not available with ::NfpServiceType_System. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result CreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size); - -/// Not available with ::NfpServiceType_System. -/// Only available with [3.0.0+]. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram, and the application area to be opened. -Result RecreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size); - -/// Not available with ::NfpServiceType_System. -Result GetApplicationAreaSize(const NfcDeviceHandle *handle, u32 *out_app_area_size); - -/// Not available with ::NfpServiceType_User. -Result DeleteApplicationArea(const NfcDeviceHandle *handle); - -/// Not available with ::NfpServiceType_User. -Result ExistsApplicationArea(const NfcDeviceHandle *handle, bool *out); - -Result GetTagInfo(const NfcDeviceHandle *handle, NfpTagInfo *out); - -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result GetRegisterInfo(const NfcDeviceHandle *handle, NfpRegisterInfo *out); - -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result GetCommonInfo(const NfcDeviceHandle *handle, NfpCommonInfo *out); - -/// Requires the amiibo to be mounted with ::NfpMountTarget_Rom. -Result GetModelInfo(const NfcDeviceHandle *handle, NfpModelInfo *out); - -/// Not available with ::NfpServiceType_User. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result GetAdminInfo(const NfcDeviceHandle *handle, NfpAdminInfo *out); - -/// Returned event will have autoclear off. -Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event); - -/// Returned event will have autoclear off. -Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event); - -Result GetState(NfcState *out); - -Result GetDeviceState(const NfcDeviceHandle *handle, NfpDeviceState *out); - -Result GetNpadId(const NfcDeviceHandle *handle, u32 *out); - -/// Returned event will have autoclear on. -/// Only available with [3.0.0+]. -Result AttachAvailabilityChangeEvent(Event *out_event); - -/// Not available with ::NfpServiceType_User. -Result Format(const NfcDeviceHandle *handle); - -/// Not available with ::NfpServiceType_User. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result GetRegisterInfoPrivate(const NfcDeviceHandle *handle, NfpRegisterInfoPrivate *out); - -/// Not available with ::NfpServiceType_User. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result SetRegisterInfoPrivate(const NfcDeviceHandle *handle, const NfpRegisterInfoPrivate *register_info_private); - -/// Not available with ::NfpServiceType_User. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result DeleteRegisterInfo(const NfcDeviceHandle *handle); - -/// Only available with ::NfpServiceType_Debug. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result GetAll(const NfcDeviceHandle *handle, NfpData *out); - -/// Only available with ::NfpServiceType_Debug. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result SetAll(const NfcDeviceHandle *handle, const NfpData *nfp_data); - -/// Only available with ::NfpServiceType_Debug. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result FlushDebug(const NfcDeviceHandle *handle); - -/// Only available with ::NfpServiceType_Debug. -/// Requires the amiibo to be mounted with ::NfpMountTarget_Ram. -Result BreakTag(const NfcDeviceHandle *handle, NfpBreakType break_type); - -/// Only available with ::NfpServiceType_Debug. -Result ReadBackupData(const NfcDeviceHandle *handle, void* out_buf, size_t buf_size, u32 *out_size); - -/// Only available with ::NfpServiceType_Debug. -Result WriteBackupData(const NfcDeviceHandle *handle, const void* buf, size_t buf_size); - -/// Only available with ::NfpServiceType_Debug. -Result WriteNtf(const NfcDeviceHandle *handle, u32 write_type, const void* buf, size_t buf_size); - -} // namespace nfp - -/// @brief C++ wrappers for the `nifm` API. -/// @details Wraps: switch/applets/nifm_la.h, switch/services/nifm.h. -namespace nifm { - -/// Authentication -using ::NifmAuthentication; -/// ClientId -using ::NifmClientId; -/// DnsSetting -using ::NifmDnsSetting; -/// Encryption -using ::NifmEncryption; -using ::NifmInternetConnectionStatus; -using ::NifmInternetConnectionType; -/// IpAddressSetting -using ::NifmIpAddressSetting; -/// IpSettingData -using ::NifmIpSettingData; -/// IpV4Address -using ::NifmIpV4Address; -/// NetworkProfileBasicInfo. Converted from/to \ref NifmSfNetworkProfileBasicInfo. -using ::NifmNetworkProfileBasicInfo; -/// NetworkProfileData. Converted from/to \ref NifmSfNetworkProfileData. -using ::NifmNetworkProfileData; -using ::NifmNetworkProfileType; -/// ProxySetting -using ::NifmProxySetting; -/// Request -using ::NifmRequest; -using ::NifmRequestState; -using ::NifmServiceType; -/// SfNetworkProfileBasicInfo. Converted from/to \ref NifmNetworkProfileBasicInfo. -using ::NifmSfNetworkProfileBasicInfo; -/// SfNetworkProfileData. Converted to/from \ref NifmNetworkProfileData. -using ::NifmSfNetworkProfileData; -/// SfWirelessSettingData -using ::NifmSfWirelessSettingData; -/// WirelessSettingData -using ::NifmWirelessSettingData; - -/** - * @brief Uses \ref nifmGetResult, then on failure launches the applet. - * @param r \ref NifmRequest - */ -Result LaHandleNetworkRequestResult(NifmRequest* r); - -/// Initialize nifm. This is used automatically by gethostid(). -Result Initialize(NifmServiceType service_type); - -/// Exit nifm. This is used automatically by gethostid(). -void Exit(void); - -/// Gets the Service object for the actual nifm:* service session. -Service* GetServiceSession_StaticService(void); - -/// Gets the Service object for IGeneralService. -Service* GetServiceSession_GeneralService(void); - -/** - * @brief GetClientId - */ -NifmClientId GetClientId(void); - -/** - * @brief CreateRequest - * @param[out] r \ref NifmRequest - * @param[in] autoclear Event autoclear to use for NifmRequest::event1, a default of true can be used for this. - */ -Result CreateRequest(NifmRequest* r, bool autoclear); - -/** - * @brief GetCurrentNetworkProfile - * @param[out] profile \ref NifmNetworkProfileData - */ -Result GetCurrentNetworkProfile(NifmNetworkProfileData *profile); - -/** - * @brief Returns saved network profiles - * @note NifmServiceType User and System have access only to NifmNetworkProfileType_User - * @param[in] type \ref NifmNetworkProfileType - * @param[out] buffer \ref NifmNetworkProfileBasicInfo - * @param[in] max_entries How many \ref NifmNetworkProfileBasicInfo can fit into buffer - * @param[out] total_entries How many \ref NifmNetworkProfileBasicInfo is available - */ -Result EnumerateNetworkProfiles(NifmNetworkProfileType type, NifmNetworkProfileBasicInfo* buffer, s32 max_entries, s32* total_entries); - -/** - * @brief GetNetworkProfile - * @param[in] uuid Uuid - * @param[out] profile \ref NifmNetworkProfileData - */ -Result GetNetworkProfile(Uuid uuid, NifmNetworkProfileData *profile); - -/** - * @brief SetNetworkProfile - * @note Only available with ::NifmServiceType_Admin. - * @param[in] profile \ref NifmNetworkProfileData - * @param[out] uuid Uuid - */ -Result SetNetworkProfile(const NifmNetworkProfileData *profile, Uuid *uuid); - -/** - * @brief GetCurrentIpAddress - * @param[out] out IPv4 address (struct in_addr). - */ -Result GetCurrentIpAddress(u32* out); - -/** - * @brief GetCurrentIpConfigInfo - * @param[out] current_addr Same as \ref nifmGetCurrentIpAddress output. - * @param[out] subnet_mask Subnet Mask (struct in_addr). - * @param[out] gateway Gateway (struct in_addr). - * @param[out] primary_dns_server Primary DNS server IPv4 address (struct in_addr). - * @param[out] secondary_dns_server Secondary DNS server IPv4 address (struct in_addr). - */ -Result GetCurrentIpConfigInfo(u32 *current_addr, u32 *subnet_mask, u32 *gateway, u32 *primary_dns_server, u32 *secondary_dns_server); - -/** - * @note Works only if called from nifm:a or nifm:s. - */ -Result SetWirelessCommunicationEnabled(bool enable); - -Result IsWirelessCommunicationEnabled(bool* out); - -/** - * @note Will fail with 0xd46ed if Internet is neither connecting or connected (airplane mode or no known network in reach). - * @param wifiStrength Strength of the Wi-Fi signal in number of bars from 0 to 3. - */ -Result GetInternetConnectionStatus(NifmInternetConnectionType* connectionType, u32* wifiStrength, NifmInternetConnectionStatus* connectionStatus); - -Result IsEthernetCommunicationEnabled(bool* out); - -/** - * @brief IsAnyInternetRequestAccepted - * @param[in] id \ref NifmClientId - */ -bool IsAnyInternetRequestAccepted(NifmClientId id); - -Result IsAnyForegroundRequestAccepted(bool* out); - -Result PutToSleep(void); - -Result WakeUp(void); - -/** - * @brief SetWowlDelayedWakeTime - * @note Only available with ::NifmServiceType_System or ::NifmServiceType_Admin. - * @note Only available on [9.0.0+]. - * @param[in] val Input value. - */ -Result SetWowlDelayedWakeTime(s32 val); - -/** - * @brief Close a \ref NifmRequest. - * @param r \ref NifmRequest - */ -void RequestClose(NifmRequest* r); - -/** - * @brief GetRequestState - * @param r \ref NifmRequest - * @param[out] out \ref NifmRequestState - */ -Result GetRequestState(NifmRequest* r, NifmRequestState *out); - -/** - * @brief GetResult - * @param r \ref NifmRequest - */ -Result GetResult(NifmRequest* r); - -/** - * @brief Cancel - * @param r \ref NifmRequest - */ -Result RequestCancel(NifmRequest* r); - -/** - * @brief Submit - * @param r \ref NifmRequest - */ -Result RequestSubmit(NifmRequest* r); - -/** - * @brief SubmitAndWait - * @param r \ref NifmRequest - */ -Result RequestSubmitAndWait(NifmRequest* r); - -/** - * @brief GetAppletInfo - * @note This is used by \ref nifmLaHandleNetworkRequestResult. - * @param r \ref NifmRequest - * @param[in] theme_color ThemeColor - * @param[out] buffer Output buffer for storage data. - * @param[in] size Output buffer size. - * @param[out] applet_id \ref AppletId - * @param[out] mode \ref LibAppletMode - * @param[out] out_size Total data size written to the output buffer. - */ -Result RequestGetAppletInfo(NifmRequest* r, u32 theme_color, void* buffer, size_t size, u32 *applet_id, u32 *mode, u32 *out_size); - -/** - * @brief SetKeptInSleep - * @note Only available on [3.0.0+]. - * @note ::NifmRequestState must be ::NifmRequestState_Unknown1. - * @param r \ref NifmRequest - * @param[in] flag Flag - */ -Result RequestSetKeptInSleep(NifmRequest* r, bool flag); - -/** - * @brief RegisterSocketDescriptor. Only 1 socket can be registered at a time with a NifmRequest. Do not use directly, use \ref socketNifmRequestRegisterSocketDescriptor instead. - * @note Only available on [3.0.0+]. - * @note ::NifmRequestState must be ::NifmRequestState_Available. - * @param r \ref NifmRequest - * @param[in] sockfd Socket fd - */ -Result RequestRegisterSocketDescriptor(NifmRequest* r, int sockfd); - -/** - * @brief UnregisterSocketDescriptor. Do not use directly, use \ref socketNifmRequestUnregisterSocketDescriptor instead. - * @note Only available on [3.0.0+]. - * @note ::NifmRequestState must be ::NifmRequestState_Available. - * @param r \ref NifmRequest - * @param[in] sockfd Socket fd, must match the fd previously registered with \ref nifmRequestRegisterSocketDescriptor. - */ -Result RequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd); - -/** - * @brief SetNetworkProfileId - * @param r \ref NifmRequest - * @param[in] uuid Uuid - */ -Result RequestSetNetworkProfileId(NifmRequest* r, Uuid uuid); - -} // namespace nifm - -/// @brief C++ wrappers for the `nim` API. -/// @details Wraps: switch/services/nim.h. -namespace nim { - -/// SystemUpdateTaskId -using ::NimSystemUpdateTaskId; - -/// Initialize nim. -Result Initialize(void); - -/// Exit nim. -void Exit(void); - -/// Gets the Service object for the actual nim service session. -Service* GetServiceSession(void); - -Result ListSystemUpdateTask(s32 *out_count, NimSystemUpdateTaskId *out_task_ids, size_t max_task_ids); - -Result DestroySystemUpdateTask(const NimSystemUpdateTaskId *task_id); - -} // namespace nim - -/// @brief C++ wrappers for the `notif` API. -/// @details Wraps: switch/services/notif.h. -namespace notif { - -/// AlarmSetting -using ::NotifAlarmSetting; -/// Data extracted from NotifWeeklyScheduleAlarmSetting::settings. This uses local-time. -using ::NotifAlarmTime; -/// ServiceType for \ref notifInitialize. -using ::NotifServiceType; -/// WeeklyScheduleAlarmSetting -using ::NotifWeeklyScheduleAlarmSetting; - -/// Initialize notif. Only available on [9.0.0+]. -Result Initialize(NotifServiceType service_type); - -/// Exit notif. -void Exit(void); - -/// Gets the Service object for the actual notif:* service session. -Service* GetServiceSession(void); - -/** - * @brief Creates a \ref NotifAlarmSetting. - * @note This clears the struct, with all schedule settings set the same as \ref notifAlarmSettingDisable. - * @param[out] alarm_setting \ref NotifAlarmSetting - */ -void AlarmSettingCreate(NotifAlarmSetting *alarm_setting); - -/** - * @brief Sets whether the \ref NotifAlarmSetting is muted. - * @note By default (\ref notifAlarmSettingCreate) this is false. - * @param alarm_setting \ref NotifAlarmSetting - * @param[in] flag Whether the alarm is muted (true = Alarm turned off, false = on). - */ -void AlarmSettingSetIsMuted(NotifAlarmSetting *alarm_setting, bool flag); - -/** - * @brief Sets the \ref AccountUid for the \ref NotifAlarmSetting, see NotifAlarmSetting::uid. - * @param alarm_setting \ref NotifAlarmSetting - * @param[in] uid \ref AccountUid. If want to clear the uid after it was previously set, you can use an all-zero uid to reset to the default (\ref notifAlarmSettingCreate). - */ -void AlarmSettingSetUid(NotifAlarmSetting *alarm_setting, AccountUid uid); - -/** - * @brief Gets whether the schedule setting for the specified day_of_week is enabled, for the \ref NotifAlarmSetting. - * @param alarm_setting \ref NotifAlarmSetting - * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). - * @param[out] out Whether the setting is enabled. - */ -Result AlarmSettingIsEnabled(NotifAlarmSetting *alarm_setting, u32 day_of_week, bool *out); - -/** - * @brief Gets the schedule setting for the specified day_of_week, for the \ref NotifAlarmSetting. - * @note Should not be used if the output from \ref notifAlarmSettingIsEnabled is false. - * @param alarm_setting \ref NotifAlarmSetting - * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). - * @param[out] out \ref NotifAlarmTime - */ -Result AlarmSettingGet(NotifAlarmSetting *alarm_setting, u32 day_of_week, NotifAlarmTime *out); - -/** - * @brief Enables the schedule setting for the specified day_of_week, for the \ref NotifAlarmSetting. This uses local-time. - * @param alarm_setting \ref NotifAlarmSetting - * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). - * @param[in] hour Hour. - * @param[in] minute Minute. - */ -Result AlarmSettingEnable(NotifAlarmSetting *alarm_setting, u32 day_of_week, s32 hour, s32 minute); - -/** - * @brief Disables the schedule setting for the specified day_of_week, for the \ref NotifAlarmSetting. - * @note Schedule settings are disabled by default (\ref notifAlarmSettingCreate). - * @param alarm_setting \ref NotifAlarmSetting - * @param[in] day_of_week Day-of-week, must be 0-6 (Sun-Sat). - */ -Result AlarmSettingDisable(NotifAlarmSetting *alarm_setting, u32 day_of_week); - -/** - * @brief Registers the specified AlarmSetting. - * @note See \ref NOTIF_MAX_ALARMS for the maximum alarms. - * @note When indicated by the output from \ref hidIsFirmwareUpdateNeededForNotification, this will use \ref hidLaShowControllerFirmwareUpdate. - * @param[out] alarm_setting_id AlarmSettingId - * @param[in] alarm_setting \ref NotifAlarmSetting - * @param[in] buffer Input buffer containing the ApplicationParameter. Optional, can be NULL. - * @param[in] size Input buffer size, must be <=0x400. Optional, can be 0. - */ -Result RegisterAlarmSetting(u16 *alarm_setting_id, const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size); - -/** - * @brief Updates the specified AlarmSetting. - * @param[in] alarm_setting \ref NotifAlarmSetting - * @param[in] buffer Input buffer containing the ApplicationParameter. Optional, can be NULL. - * @param[in] size Input buffer size, must be <=0x400. Optional, can be 0. - */ -Result UpdateAlarmSetting(const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size); - -/** - * @brief Gets a listing of AlarmSettings. - * @param[out] alarm_settings Output \ref NotifAlarmSetting array. - * @param[in] count Total entries in the alarm_settings array. - * @param[out] total_out Total output entries. - */ -Result ListAlarmSettings(NotifAlarmSetting *alarm_settings, s32 count, s32 *total_out); - -/** - * @brief Loads the ApplicationParameter for the specified AlarmSetting. - * @param[in] alarm_setting_id AlarmSettingId - * @param[out] buffer Output buffer containing the ApplicationParameter. - * @param[in] size Output buffer size. - * @param[out] actual_size Actual output size. - */ -Result LoadApplicationParameter(u16 alarm_setting_id, void* buffer, size_t size, u32 *actual_size); - -/** - * @brief Deletes the specified AlarmSetting. - * @param[in] alarm_setting_id AlarmSettingId - */ -Result DeleteAlarmSetting(u16 alarm_setting_id); - -/** - * @brief Gets an Event which is signaled when data is available with \ref notifTryPopNotifiedApplicationParameter. - * @note This is a wrapper for \ref appletGetNotificationStorageChannelEvent, see that for the usage requirements. - * @note Some official apps don't use this. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetNotificationSystemEvent(Event *out_event); - -/** - * @brief Uses \ref appletTryPopFromNotificationStorageChannel then reads the data from there into the output params. - * @note This is a wrapper for \ref appletTryPopFromNotificationStorageChannel, see that for the usage requirements. - * @note The system will only push data for this when launching the Application when the Alarm was triggered, where the system was previously in sleep-mode. - * @note Some official apps don't use this. - * @param[out] buffer Output buffer. - * @param[out] size Output buffer size. - * @param[out] out_size Size of the data which was written into the output buffer. Optional, can be NULL. - */ -Result TryPopNotifiedApplicationParameter(void* buffer, u64 size, u64 *out_size); - -} // namespace notif - -/// @brief C++ wrappers for the `ns` API. -/// @details Wraps: switch/services/ns.h. -namespace ns { - -/// NsApplicationContentMetaStatus -using ::NsApplicationContentMetaStatus; -/// ApplicationControlData -using ::NsApplicationControlData; -/// ApplicationControlSource -using ::NsApplicationControlSource; -/// ApplicationDeliveryInfo -using ::NsApplicationDeliveryInfo; -/// ApplicationOccupiedSize -using ::NsApplicationOccupiedSize; -/// ApplicationRecord -using ::NsApplicationRecord; -/// NsApplicationRightsOnClient -using ::NsApplicationRightsOnClient; -/// ApplicationView -using ::NsApplicationView; -/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. -using ::NsApplicationViewDeprecated; -/// NsApplicationViewWithPromotionInfo -using ::NsApplicationViewWithPromotionInfo; -/// BackgroundNetworkUpdateState -using ::NsBackgroundNetworkUpdateState; -/// DownloadTaskStatus -using ::NsDownloadTaskStatus; -/// EulaDataPath -using ::NsEulaDataPath; -/// LatestSystemUpdate -using ::NsLatestSystemUpdate; -/// LaunchProperties -using ::NsLaunchProperties; -/// ProgressAsyncResult -using ::NsProgressAsyncResult; -/// ProgressForDeleteUserSaveDataAll -using ::NsProgressForDeleteUserSaveDataAll; -/// ProgressMonitorForDeleteUserSaveDataAll -using ::NsProgressMonitorForDeleteUserSaveDataAll; -/// NsPromotionInfo -using ::NsPromotionInfo; -/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsReceiveApplicationProgress; -/// RequestServerStopper -using ::NsRequestServerStopper; -/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsSendApplicationProgress; -/// ShellEvent -using ::NsShellEvent; -/// ShellEventInfo -using ::NsShellEventInfo; -/// SystemDeliveryInfo -using ::NsSystemDeliveryInfo; -/// SystemUpdateControl -using ::NsSystemUpdateControl; -/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. -using ::NsSystemUpdateProgress; - -/// Initialize ns services. Uses ns:am on pre-3.0.0, ns:am2 on [3.0.0+]. -Result Initialize(void); - -/// Exit ns services. -void Exit(void); - -/// Gets the Service object for the actual ns:* service session. Only initialized on [3.0.0+], on pre-3.0.0 see \ref nsGetServiceSession_ApplicationManagerInterface. -Service* GetServiceSession_GetterInterface(void); - -/// Gets the Service object for IApplicationManagerInterface. Only initialized on pre-3.0.0, on [3.0.0+] use \ref nsGetApplicationManagerInterface. -Service* GetServiceSession_ApplicationManagerInterface(void); - -/// Gets the Service object for IDynamicRightsInterface via the cmd for that. -/// Only available on [6.0.0+]. -Result GetDynamicRightsInterface(Service* srv_out); - -/// Gets the Service object for IReadOnlyApplicationControlDataInterface via the cmd for that. -/// Only available on [5.1.0+]. -Result GetReadOnlyApplicationControlDataInterface(Service* srv_out); - -/// Gets the Service object for IReadOnlyApplicationRecordInterface via the cmd for that. -/// Only available on [5.0.0+]. -Result GetReadOnlyApplicationRecordInterface(Service* srv_out); - -/// Gets the Service object for IECommerceInterface via the cmd for that. -/// Only available on [4.0.0+]. -Result GetECommerceInterface(Service* srv_out); - -/// Gets the Service object for IApplicationVersionInterface via the cmd for that. -/// Only available on [4.0.0+]. -Result GetApplicationVersionInterface(Service* srv_out); - -/// Gets the Service object for IFactoryResetInterface via the cmd for that. -/// Only available on [3.0.0+]. -Result GetFactoryResetInterface(Service* srv_out); - -/// Gets the Service object for IAccountProxyInterface via the cmd for that. -/// Only available on [3.0.0+]. -Result GetAccountProxyInterface(Service* srv_out); - -/// Gets the Service object for IApplicationManagerInterface via the cmd for that. -/// Only available on [3.0.0+], on prior sysvers use \ref nsGetServiceSession_ApplicationManagerInterface. -Result GetApplicationManagerInterface(Service* srv_out); - -/// Gets the Service object for IDownloadTaskInterface via the cmd for that. -/// Only available on [3.0.0+]. -Result GetDownloadTaskInterface(Service* srv_out); - -/// Gets the Service object for IContentManagementInterface via the cmd for that. -/// Only available on [3.0.0+]. -Result GetContentManagementInterface(Service* srv_out); - -/// Gets the Service object for IDocumentInterface via the cmd for that. -/// Only available on [3.0.0+]. -Result GetDocumentInterface(Service* srv_out); - -/** - * @brief Gets the \ref NsApplicationControlData for the specified application. - * @note Uses \ref nsGetReadOnlyApplicationControlDataInterface on [5.1.0+], otherwise IApplicationManagerInterface is used. - * @param[in] source Source, official sw uses ::NsApplicationControlSource_Storage. - * @param[in] application_id ApplicationId. - * @param[out] buffer \ref NsApplicationControlData - * @param[in] size Size of the buffer. - * @param[out] actual_size Actual output size. - */ -Result GetApplicationControlData(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u64* actual_size); - -/** - * @brief Gets the \ref NsApplicationControlData for the specified application. - * @note Only available on [19.0.0+]. - * @param[in] source Source, official sw uses ::NsApplicationControlSource_Storage. - * @param[in] application_id ApplicationId. - * @param[out] buffer \ref NsApplicationControlData - * @param[in] size Size of the buffer. - * @param[in] flag1 Default is 0. 1 retrieves 174x174 icon instead of 256x256. 0xFF uses an unknown alternative path. - * @param[in] acd_idx Default is 0. 1 tries to get NsApplicationControlData for Switch 2 Edition. - * @param[out] actual_size Actual output size. - * @param[out] unk Returned with size, always 0. - */ -Result GetApplicationControlData2(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u8 flag1, u8 acd_idx, u64* actual_size, u32* unk); - -/** - * @brief GetApplicationDesiredLanguage. Selects a \ref NacpLanguageEntry to use from the specified \ref NacpStruct. - * @note Uses \ref nsGetReadOnlyApplicationControlDataInterface on [5.1.0+], otherwise IApplicationManagerInterface is used. - * @param[in] nacp \ref NacpStruct - * @param[out] langentry \ref NacpLanguageEntry - */ -Result GetApplicationDesiredLanguage(NacpStruct *nacp, NacpLanguageEntry **langentry); - -/** - * @brief RequestLinkDevice - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [4.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] uid \ref AccountUid - */ -Result RequestLinkDevice(AsyncResult *a, AccountUid uid); - -/** - * @brief RequestSyncRights - * @note Only available on [6.0.0+]. - * @param[out] a \ref AsyncResult - */ -Result RequestSyncRights(AsyncResult *a); - -/** - * @brief RequestUnlinkDevice - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [6.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] uid \ref AccountUid - */ -Result RequestUnlinkDevice(AsyncResult *a, AccountUid uid); - -/** - * @brief ResetToFactorySettings - * @note Uses \ref nsGetFactoryResetInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - */ -Result ResetToFactorySettings(void); - -/** - * @brief ResetToFactorySettingsWithoutUserSaveData - * @note Uses \ref nsGetFactoryResetInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - */ -Result ResetToFactorySettingsWithoutUserSaveData(void); - -/** - * @brief ResetToFactorySettingsForRefurbishment - * @note Uses \ref nsGetFactoryResetInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - */ -Result ResetToFactorySettingsForRefurbishment(void); - -/** - * @brief ResetToFactorySettingsWithPlatformRegion - * @note Only available on [9.1.0+]. - */ -Result ResetToFactorySettingsWithPlatformRegion(void); - -/** - * @brief ResetToFactorySettingsWithPlatformRegionAuthentication - * @note Only available on [9.1.0+]. - */ -Result ResetToFactorySettingsWithPlatformRegionAuthentication(void); - -/** - * @brief Gets an listing of \ref NsApplicationRecord. - * @param[out] records Output array of \ref NsApplicationRecord. - * @param[in] count Size of the records array in entries. - * @param[in] entry_offset Starting entry offset. - * @param[out] out_entrycount Total output entries. - */ -Result ListApplicationRecord(NsApplicationRecord* records, s32 count, s32 entry_offset, s32* out_entrycount); - -/** - * @brief GetApplicationRecordUpdateSystemEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=true. - */ -Result GetApplicationRecordUpdateSystemEvent(Event* out_event); - -/** - * @brief GetApplicationViewDeprecated - * @note On [3.0.0+] you should generally use \ref nsGetApplicationView instead. - * @param[out] out Output array of \ref NsApplicationViewDeprecated. - * @param[in] application_ids Input array of ApplicationIds. - * @param[in] count Size of the input/output arrays in entries. - */ -Result GetApplicationViewDeprecated(NsApplicationViewDeprecated *views, const u64 *application_ids, s32 count); - -/** - * @brief DeleteApplicationEntity - * @param[in] application_id ApplicationId. - */ -Result DeleteApplicationEntity(u64 application_id); - -/** - * @brief DeleteApplicationCompletely - * @param[in] application_id ApplicationId. - */ -Result DeleteApplicationCompletely(u64 application_id); - -/** - * @brief DeleteRedundantApplicationEntity - */ -Result DeleteRedundantApplicationEntity(void); - -/** - * @brief IsApplicationEntityMovable - * @param[in] application_id ApplicationId. - * @param[in] storage_id \ref NcmStorageId - * @param[out] out Output flag. - */ -Result IsApplicationEntityMovable(u64 application_id, NcmStorageId storage_id, bool *out); - -/** - * @brief MoveApplicationEntity - * @note Only available on [1.0.0-9.2.0]. - * @param[in] application_id ApplicationId. - * @param[in] storage_id \ref NcmStorageId - */ -Result MoveApplicationEntity(u64 application_id, NcmStorageId storage_id); - -/** - * @brief RequestApplicationUpdateInfo - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @param[out] a \ref AsyncValue. The data that can be read from this is u8 ApplicationUpdateInfo. qlaunch just checks whether this is 0. - * @param application_id ApplicationId. - */ -Result RequestApplicationUpdateInfo(AsyncValue *a, u64 application_id); - -/** - * @brief CancelApplicationDownload - * @param[in] application_id ApplicationId. - */ -Result CancelApplicationDownload(u64 application_id); - -/** - * @brief ResumeApplicationDownload - * @param[in] application_id ApplicationId. - */ -Result ResumeApplicationDownload(u64 application_id); - -/** - * @brief CheckApplicationLaunchVersion - * @param[in] application_id ApplicationId. - */ -Result CheckApplicationLaunchVersion(u64 application_id); - -/** - * @brief CalculateApplicationApplyDeltaRequiredSize - * @param[in] application_id ApplicationId. - * @param[out] storage_id Output \ref NcmStorageId. - * @param[out] size Output size. - */ -Result CalculateApplicationDownloadRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size); - -/** - * @brief CleanupSdCard - */ -Result CleanupSdCard(void); - -/** - * @brief GetSdCardMountStatusChangedEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetSdCardMountStatusChangedEvent(Event* out_event); - -/** - * @brief GetGameCardUpdateDetectionEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetGameCardUpdateDetectionEvent(Event* out_event); - -/** - * @brief DisableApplicationAutoDelete - * @param[in] application_id ApplicationId. - */ -Result DisableApplicationAutoDelete(u64 application_id); - -/** - * @brief EnableApplicationAutoDelete - * @param[in] application_id ApplicationId. - */ -Result EnableApplicationAutoDelete(u64 application_id); - -/** - * @brief SetApplicationTerminateResult - * @param[in] application_id ApplicationId. - * @param[in] res Result. - */ -Result SetApplicationTerminateResult(u64 application_id, Result res); - -/** - * @brief ClearApplicationTerminateResult - * @param[in] application_id ApplicationId. - */ -Result ClearApplicationTerminateResult(u64 application_id); - -/** - * @brief GetLastSdCardMountUnexpectedResult - */ -Result GetLastSdCardMountUnexpectedResult(void); - -/** - * @brief Opens a \ref NsRequestServerStopper. - * @note Only available on [2.0.0+]. - * @param[out] r \ref NsRequestServerStopper - */ -Result GetRequestServerStopper(NsRequestServerStopper *r); - -/** - * @brief CancelApplicationApplyDelta - * @note Only available on [3.0.0+]. - * @param[in] application_id ApplicationId. - */ -Result CancelApplicationApplyDelta(u64 application_id); - -/** - * @brief ResumeApplicationApplyDelta - * @note Only available on [3.0.0+]. - * @param[in] application_id ApplicationId. - */ -Result ResumeApplicationApplyDelta(u64 application_id); - -/** - * @brief CalculateApplicationApplyDeltaRequiredSize - * @note Only available on [3.0.0+]. - * @param[in] application_id ApplicationId. - * @param[out] storage_id Output \ref NcmStorageId. - * @param[out] size Output size. - */ -Result CalculateApplicationApplyDeltaRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size); - -/** - * @brief ResumeAll - * @note Only available on [3.0.0+]. - */ -Result ResumeAll(void); - -/** - * @brief Temporarily mounts the specified fs ContentStorage, then uses fs GetTotalSpaceSize/GetFreeSpaceSize with that mounted ContentStorage. - * @note Only available on [3.0.0+]. - * @param[in] storage_id \ref NcmStorageId, must be ::NcmStorageId_BuiltInUser or ::NcmStorageId_SdCard. - * @param[out] total_space_size Output from GetTotalSpaceSize. - * @param[out] free_space_size Output from GetFreeSpaceSize. - */ -Result GetStorageSize(NcmStorageId storage_id, s64 *total_space_size, s64 *free_space_size); - -/** - * @brief RequestUpdateApplication2 - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [4.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] application_id ApplicationId. - */ -Result RequestUpdateApplication2(AsyncResult *a, u64 application_id); - -/** - * @brief DeleteUserSaveDataAll - * @param[in] p \ref NsProgressMonitorForDeleteUserSaveDataAll - * @param[in] uid \ref AccountUid - */ -Result DeleteUserSaveDataAll(NsProgressMonitorForDeleteUserSaveDataAll *p, AccountUid uid); - -/** - * @brief DeleteUserSystemSaveData - * @param[in] uid \ref AccountUid - * @param[in] system_save_data_id SystemSaveDataId - */ -Result DeleteUserSystemSaveData(AccountUid uid, u64 system_save_data_id); - -/** - * @brief DeleteSaveData - * @note Only available on [6.0.0+]. - * @param[in] save_data_space_id \ref FsSaveDataSpaceId - * @param[in] save_data_id SaveDataId - */ -Result DeleteSaveData(FsSaveDataSpaceId save_data_space_id, u64 save_data_id); - -/** - * @brief UnregisterNetworkServiceAccount - * @param[in] uid \ref AccountUid - */ -Result UnregisterNetworkServiceAccount(AccountUid uid); - -/** - * @brief UnregisterNetworkServiceAccountWithUserSaveDataDeletion - * @note Only available on [6.0.0+]. - * @param[in] uid \ref AccountUid - */ -Result UnregisterNetworkServiceAccountWithUserSaveDataDeletion(AccountUid uid); - -/** - * @brief RequestDownloadApplicationControlData - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @param[out] a \ref AsyncResult - * @param[in] application_id ApplicationId. - */ -Result RequestDownloadApplicationControlData(AsyncResult *a, u64 application_id); - -/** - * @brief ListApplicationTitle - * @note The data available with \ref asyncValueGet is a s32 for the offset within the buffer where the output data is located, \ref asyncValueGetSize returns the total byte-size of the data located here. The data located here is the \ref NacpLanguageEntry for each specified ApplicationId. - * @note Only available on [8.0.0+]. - * @param[out] a \ref AsyncValue - * @param[in] source Source, qlaunch uses ::NsApplicationControlSource_Storage. - * @param[in] application_ids Input array of ApplicationIds. - * @param[in] count Size of the application_ids array in entries. - * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. - * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. This must be at least: count*sizeof(\ref NacpLanguageEntry) + count*sizeof(u64) + count*sizeof(\ref NsApplicationControlData). - */ -Result ListApplicationTitle(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size); - -/** - * @brief ListApplicationTitle2. Returns \ref NacpLanguageEntry matching currently set system language for each specified ApplicationId. - * @note The data available with \ref asyncValueGet is a s32 for the offset within the buffer where the output data is located, \ref asyncValueGetSize returns the total byte-size of the data located here. The data located here is the \ref NacpLanguageEntry for each specified ApplicationId. - * @note Only available on [20.0.0+]. - * @note NacpLanguageEntry is decompressed when necessary only on [21.0.0+]. - * @param[out] a \ref AsyncValue - * @param[in] source Source, official sw uses ::NsApplicationControlSource_Storage. - * @param[in] application_ids Input array of ApplicationIds. - * @param[in] count Size of the application_ids array in entries. - * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. - * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. This must be at least: count*sizeof(\ref NacpLanguageEntry) + count*sizeof(u64) + sizeof(\ref NsApplicationControlData). - */ -Result ListApplicationTitle2(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size); - -/** - * @brief ListApplicationIcon - * @note The data available with \ref asyncValueGet is a s32 for the offset within the buffer where the output data is located, \ref asyncValueGetSize returns the total byte-size of the data located here. This data is: an u64 for total entries, an array of u64s for each icon size, then the icon JPEGs for the specified ApplicationIds. - * @note Only available on [8.0.0+]. - * @param[out] a \ref AsyncValue - * @param[in] source Source. - * @param[in] application_ids Input array of ApplicationIds. - * @param[in] count Size of the application_ids array in entries. - * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. - * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. This must be at least: 0x4 + count*sizeof(u64) + count*sizeof(\ref NsApplicationControlData::icon) + count*sizeof(u64) + sizeof(\ref NsApplicationControlData). - */ -Result ListApplicationIcon(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size); - -/** - * @brief RequestCheckGameCardRegistration - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [2.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] application_id ApplicationId. - */ -Result RequestCheckGameCardRegistration(AsyncResult *a, u64 application_id); - -/** - * @brief RequestGameCardRegistrationGoldPoint - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [2.0.0+]. - * @param[out] a \ref AsyncValue. The data that can be read from this is 4-bytes. - * @param[in] uid \ref AccountUid - * @param[in] application_id ApplicationId. - */ -Result RequestGameCardRegistrationGoldPoint(AsyncValue *a, AccountUid uid, u64 application_id); - -/** - * @brief RequestRegisterGameCard - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [2.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] uid \ref AccountUid - * @param[in] application_id ApplicationId. - * @param[in] inval Input value. - */ -Result RequestRegisterGameCard(AsyncResult *a, AccountUid uid, u64 application_id, s32 inval); - -/** - * @brief GetGameCardMountFailureEvent - * @note The Event must be closed by the user once finished with it. - * @note Only available on [3.0.0+]. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetGameCardMountFailureEvent(Event* out_event); - -/** - * @brief IsGameCardInserted - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsGameCardInserted(bool *out); - -/** - * @brief EnsureGameCardAccess - * @note Only available on [3.0.0+]. - */ -Result EnsureGameCardAccess(void); - -/** - * @brief GetLastGameCardMountFailureResult - * @note Only available on [3.0.0+]. - */ -Result GetLastGameCardMountFailureResult(void); - -/** - * @brief ListApplicationIdOnGameCard - * @note Only available on [5.0.0+]. - * @param[out] application_ids Output array of ApplicationIds. - * @param[in] count Size of the application_ids array in entries. - * @param[out] total_out Total output entries. - */ -Result ListApplicationIdOnGameCard(u64 *application_ids, s32 count, s32 *total_out); - -/** - * @brief TouchApplication - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - */ -Result TouchApplication(u64 application_id); - -/** - * @brief IsApplicationUpdateRequested - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - * @param[out] flag Output flag, indicating whether out is valid. - * @param[out] out Output value. - */ -Result IsApplicationUpdateRequested(u64 application_id, bool *flag, u32 *out); - -/** - * @brief WithdrawApplicationUpdateRequest - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - */ -Result WithdrawApplicationUpdateRequest(u64 application_id); - -/** - * @brief RequestVerifyAddOnContentsRights - * @note Only available on [3.0.0-9.2.0]. - * @param[out] a \ref NsProgressAsyncResult - * @param[in] application_id ApplicationId. - */ -Result RequestVerifyAddOnContentsRights(NsProgressAsyncResult *a, u64 application_id); - -/** - * @brief RequestVerifyApplication - * @note On pre-5.0.0 this uses cmd RequestVerifyApplicationDeprecated, otherwise cmd RequestVerifyApplication is used. - * @param[out] a \ref NsProgressAsyncResult. The data available with \ref nsProgressAsyncResultGetProgress is basically the same as \ref NsSystemUpdateProgress. - * @param[in] application_id ApplicationId. - * @param[in] unk Unknown. A default value of 0x7 can be used (which is what qlaunch uses). Only used on [5.0.0+]. - * @param buffer 0x1000-byte aligned buffer for TransferMemory. This buffer must not be accessed until the async operation finishes. - * @param[in] size 0x1000-byte aligned buffer size for TransferMemory. qlaunch uses size 0x100000. - */ -Result RequestVerifyApplication(NsProgressAsyncResult *a, u64 application_id, u32 unk, void* buffer, size_t size); - -/** - * @brief IsAnyApplicationEntityInstalled - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - * @param[out] out Output flag. - */ -Result IsAnyApplicationEntityInstalled(u64 application_id, bool *out); - -/** - * @brief CleanupUnavailableAddOnContents - * @note Only available on [6.0.0+]. - * @param[in] application_id ApplicationId. - * @param[in] uid \ref AccountUid - */ -Result CleanupUnavailableAddOnContents(u64 application_id, AccountUid uid); - -/** - * @brief EstimateSizeToMove - * @note Only available on [10.0.0+]. - * @param[in] storage_ids Array of u8 \ref NcmStorageId. - * @param[in] count Size of the storage_ids array in entries. - * @param[in] storage_id storage_id \ref NcmStorageId - * @param[in] flags Flags - * @param[in] application_id ApplicationId. - * @param[out] Out Output value. - */ -Result EstimateSizeToMove(u8 *storage_ids, s32 count, NcmStorageId storage_id, u32 flags, u64 application_id, s64 *out); - -/** - * @brief FormatSdCard - * @note Only available on [2.0.0+]. - */ -Result FormatSdCard(void); - -/** - * @brief NeedsSystemUpdateToFormatSdCard - * @note Only available on [2.0.0+]. - * @param[out] out Output flag. - */ -Result NeedsSystemUpdateToFormatSdCard(bool *out); - -/** - * @brief GetLastSdCardFormatUnexpectedResult - * @note Only available on [2.0.0+]. - */ -Result GetLastSdCardFormatUnexpectedResult(void); - -/** - * @brief GetApplicationView - * @note Only available on [3.0.0+], on prior system-versions use \ref nsGetApplicationViewDeprecated instead. - * @param[out] out Output array of \ref NsApplicationView. - * @param[in] application_ids Input array of ApplicationIds. - * @param[in] count Size of the input/output arrays in entries. - */ -Result GetApplicationView(NsApplicationView *views, const u64 *application_ids, s32 count); - -/** - * @brief GetApplicationViewDownloadErrorContext - * @note Only available on [4.0.0+]. - * @param[in] application_id ApplicationId - * @param[out] context \ref ErrorContext - */ -Result GetApplicationViewDownloadErrorContext(u64 application_id, ErrorContext *context); - -/** - * @brief GetApplicationViewWithPromotionInfo - * @note Only available on [8.0.0+]. - * @param[out] out Output array of \ref NsApplicationViewWithPromotionInfo. - * @param[in] application_ids Input array of ApplicationIds. - * @param[in] count Size of the input/output arrays in entries. - */ -Result GetApplicationViewWithPromotionInfo(NsApplicationViewWithPromotionInfo *out, const u64 *application_ids, s32 count); - -/** - * @brief RequestDownloadApplicationPrepurchasedRights - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [4.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] application_id ApplicationId. - */ -Result RequestDownloadApplicationPrepurchasedRights(AsyncResult *a, u64 application_id); - -/** - * @brief Generates a \ref NsSystemDeliveryInfo using the currently installed SystemUpdate meta. - * @note Only available on [4.0.0+]. - * @param[out] info \ref NsSystemDeliveryInfo - */ -Result GetSystemDeliveryInfo(NsSystemDeliveryInfo *info); - -/** - * @brief SelectLatestSystemDeliveryInfo - * @note This selects the \ref NsSystemDeliveryInfo with the latest version from sys_list, using minimum versions determined from app_list/state and base_info, etc. - * @note Only available on [4.0.0+]. - * @param[in] sys_list Input array of \ref NsSystemDeliveryInfo. - * @param[in] sys_count Size of the sys_list array in entries. - * @param[in] base_info \ref NsSystemDeliveryInfo - * @param[in] app_list Input array of \ref NsApplicationDeliveryInfo. This can be NULL. - * @param[in] app_count Size of the app_list array in entries. This can be 0. - * @param[out] index Output index for the selected entry in sys_list, -1 if none found. - */ -Result SelectLatestSystemDeliveryInfo(const NsSystemDeliveryInfo *sys_list, s32 sys_count, const NsSystemDeliveryInfo *base_info, const NsApplicationDeliveryInfo *app_list, s32 app_count, s32 *index); - -/** - * @brief VerifyDeliveryProtocolVersion - * @note Only available on [4.0.0+]. - * @param[in] info \ref NsSystemDeliveryInfo - */ -Result VerifyDeliveryProtocolVersion(const NsSystemDeliveryInfo *info); - -/** - * @brief Generates \ref NsApplicationDeliveryInfo for the specified ApplicationId. - * @note Only available on [4.0.0+]. - * @param[out] info Output array of \ref NsApplicationDeliveryInfo. - * @param[in] count Size of the array in entries. - * @param[in] application_id ApplicationId - * @param[in] attr ApplicationDeliveryAttributeTag bitmask. - * @param[out] total_out Total output entries. - */ -Result GetApplicationDeliveryInfo(NsApplicationDeliveryInfo *info, s32 count, u64 application_id, u32 attr, s32 *total_out); - -/** - * @brief HasAllContentsToDeliver - * @note Only available on [4.0.0+]. - * @param[in] info Input array of \ref NsApplicationDeliveryInfo. - * @param[in] count Size of the array in entries. Must be value 1. - * @param[out] out Output flag. - */ -Result HasAllContentsToDeliver(const NsApplicationDeliveryInfo* info, s32 count, bool *out); - -/** - * @brief Both \ref NsApplicationDeliveryInfo are validated, then the application_version in the first/second \ref NsApplicationDeliveryInfo are compared. - * @note Only available on [4.0.0+]. - * @param[in] info0 First input array of \ref NsApplicationDeliveryInfo. - * @param[in] count0 Size of the info0 array in entries. Must be value 1. - * @param[in] info1 Second input array of \ref NsApplicationDeliveryInfo. - * @param[in] count1 Size of the info1 array in entries. Must be value 1. - * @param[out] out Comparison result: -1 for less than, 0 for equal, and 1 for higher than. - */ -Result CompareApplicationDeliveryInfo(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, s32 *out); - -/** - * @brief CanDeliverApplication - * @note Only available on [4.0.0+]. - * @param[in] info0 First input array of \ref NsApplicationDeliveryInfo. - * @param[in] count0 Size of the info0 array in entries. Must be value <=1, when 0 this will return 0 with out set to 0. - * @param[in] info1 Second input array of \ref NsApplicationDeliveryInfo. - * @param[in] count1 Size of the info1 array in entries. Must be value 1. - * @param[out] out Output flag. - */ -Result CanDeliverApplication(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, bool *out); - -/** - * @brief ListContentMetaKeyToDeliverApplication - * @note Only available on [4.0.0+]. - * @param[out] meta Output array of \ref NcmContentMetaKey. - * @param[in] meta_count Size of the meta array in entries. Must be at least 1, only 1 entry will be returned. - * @param[in] meta_index Meta entry index. An output \ref NcmContentMetaKey will not be returned when this value is larger than 0. - * @param[in] info Input array of \ref NsApplicationDeliveryInfo. - * @param[in] info_count Size of the info array in entries. Must be value 1. - * @param[out] total_out Total output entries. - */ -Result ListContentMetaKeyToDeliverApplication(NcmContentMetaKey *meta, s32 meta_count, s32 meta_index, const NsApplicationDeliveryInfo *info, s32 info_count, s32 *total_out); - -/** - * @brief After validation, this sets the output bool by comparing system-version fields in the \ref NsSystemDeliveryInfo / info-array and with a state field, etc. - * @note Only available on [4.0.0+]. - * @param[in] info Input array of \ref NsApplicationDeliveryInfo. - * @param[in] count Size of the info array in entries. Must be value 1. - * @param[in] sys_info \ref NsSystemDeliveryInfo - * @param[out] out Output flag. - */ -Result NeedsSystemUpdateToDeliverApplication(const NsApplicationDeliveryInfo *info, s32 count, const NsSystemDeliveryInfo *sys_info, bool *out); - -/** - * @brief EstimateRequiredSize - * @note Only available on [4.0.0+]. - * @param[in] meta Input array of \ref NcmContentMetaKey. - * @param[in] count Size of the meta array in entries. When less than 1, this will return 0 with out set to 0. - * @param[out] out Output size. - */ -Result EstimateRequiredSize(const NcmContentMetaKey *meta, s32 count, s64 *out); - -/** - * @brief RequestReceiveApplication - * @note This is the Application version of \ref nssuControlRequestReceiveSystemUpdate, see the notes for that. - * @note Only available on [4.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] addr Server IPv4 address. - * @param[in] port Socket port. qlaunch uses value 55556. - * @param[in] application_id ApplicationId - * @param[in] meta Input array of \ref NcmContentMetaKey. The ::NcmContentMetaType must match ::NcmContentMetaType_Patch. - * @param[in] count Size of the meta array in entries. - * @param[in] storage_id \ref NcmStorageId. qlaunch uses ::NcmStorageId_Any. - */ -Result RequestReceiveApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count, NcmStorageId storage_id); - -/** - * @brief CommitReceiveApplication - * @note Only available on [4.0.0+]. - * @param[in] application_id ApplicationId - */ -Result CommitReceiveApplication(u64 application_id); - -/** - * @brief GetReceiveApplicationProgress - * @note Only available on [4.0.0+]. - * @param[in] application_id ApplicationId - * @param[out] out \ref NsReceiveApplicationProgress - */ -Result GetReceiveApplicationProgress(u64 application_id, NsReceiveApplicationProgress *out); - -/** - * @brief RequestSendApplication - * @note This is the Application version of \ref nssuRequestSendSystemUpdate, see the notes for that. - * @note Only available on [4.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] addr Client IPv4 address. - * @param[in] port Socket port. qlaunch uses value 55556. - * @param[in] application_id ApplicationId - * @param[in] meta Input array of \ref NcmContentMetaKey. The ::NcmContentMetaType must match ::NcmContentMetaType_Patch. - * @param[in] count Size of the meta array in entries. - */ -Result RequestSendApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count); - -/** - * @brief GetSendApplicationProgress - * @note Only available on [4.0.0+]. - * @param[in] application_id ApplicationId - * @param[out] out \ref NsSendApplicationProgress - */ -Result GetSendApplicationProgress(u64 application_id, NsSendApplicationProgress *out); - -/** - * @brief Both \ref NsSystemDeliveryInfo are validated, then the system_update_version in the first/second \ref NsSystemDeliveryInfo are compared. - * @note Only available on [4.0.0+]. - * @param[in] info0 First \ref NsSystemDeliveryInfo. - * @param[in] info1 Second \ref NsSystemDeliveryInfo. - * @param[out] out Comparison result: -1 for less than, 0 for equal, and 1 for higher than. - */ -Result CompareSystemDeliveryInfo(const NsSystemDeliveryInfo *info0, const NsSystemDeliveryInfo *info1, s32 *out); - -/** - * @brief ListNotCommittedContentMeta - * @note Only available on [4.0.0+]. - * @param[out] meta Output array of \ref NcmContentMetaKey. - * @param[in] count Size of the meta array in entries. - * @param[in] application_id ApplicationId - * @param[in] unk Unknown. - * @param[out] total_out Total output entries. - */ -Result ListNotCommittedContentMeta(NcmContentMetaKey *meta, s32 count, u64 application_id, s32 unk, s32 *total_out); - -/** - * @brief This extracts data from the input array for hashing with SHA256, with validation being done when handling each entry. - * @note Only available on [5.0.0+]. - * @param[in] info Input array of \ref NsApplicationDeliveryInfo. - * @param[in] count Size of the array in entries. - * @param[out] out_hash Output 0x20-byte SHA256 hash. - */ -Result GetApplicationDeliveryInfoHash(const NsApplicationDeliveryInfo *info, s32 count, u8 *out_hash); - -/** - * @brief GetApplicationTerminateResult - * @note Only available on [6.0.0+]. - * @param[in] application_id ApplicationId. - * @param[out] res Output Result. - */ -Result GetApplicationTerminateResult(u64 application_id, Result *res); - -/** - * @brief GetApplicationRightsOnClient - * @note Only available on [6.0.0+]. - * @param[out] rights Output array of \ref NsApplicationRightsOnClient. - * @param[in] count Size of the rights array in entries. qlaunch uses value 3 for this. - * @param[in] application_id ApplicationId - * @param[in] uid \ref AccountUid, can optionally be all-zero. - * @param[in] flags Flags. Official sw hard-codes this to value 0x3. - * @param[out] total_out Total output entries. - */ -Result GetApplicationRightsOnClient(NsApplicationRightsOnClient *rights, s32 count, u64 application_id, AccountUid uid, u32 flags, s32 *total_out); - -/** - * @brief RequestNoDownloadRightsErrorResolution - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [9.0.0+]. - * @param[out] a \ref AsyncValue. The data that can be read from this is u8 NoDownloadRightsErrorResolution. - * @param application_id ApplicationId. - */ -Result RequestNoDownloadRightsErrorResolution(AsyncValue *a, u64 application_id); - -/** - * @brief RequestResolveNoDownloadRightsError - * @note \ref nifmInitialize must be used prior to this. Before using the cmd, this calls \ref nifmIsAnyInternetRequestAccepted with the output from \ref nifmGetClientId, an error is returned when that returns false. - * @note Only available on [9.0.0+]. - * @param[out] a \ref AsyncValue. The data that can be read from this is u8 NoDownloadRightsErrorResolution. - * @param application_id ApplicationId. - */ -Result RequestResolveNoDownloadRightsError(AsyncValue *a, u64 application_id); - -/** - * @brief GetPromotionInfo - * @note Only available on [8.0.0+]. - * @param[out] promotion \ref NsPromotionInfo - * @param application_id ApplicationId. - * @param[in] uid \ref AccountUid - */ -Result GetPromotionInfo(NsPromotionInfo *promotion, u64 application_id, AccountUid uid); - -/** - * @brief ClearTaskStatusList - * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - */ -Result ClearTaskStatusList(void); - -/** - * @brief RequestDownloadTaskList - * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - */ -Result RequestDownloadTaskList(void); - -/** - * @brief RequestEnsureDownloadTask - * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - * @param[out] a \ref AsyncResult - */ -Result RequestEnsureDownloadTask(AsyncResult *a); - -/** - * @brief ListDownloadTaskStatus - * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - * @param[out] tasks Output array of \ref NsDownloadTaskStatus. - * @param[in] count Size of the tasks array in entries. A maximum of 0x100 tasks can be stored in state. - * @param[out] total_out Total output entries. - */ -Result ListDownloadTaskStatus(NsDownloadTaskStatus* tasks, s32 count, s32 *total_out); - -/** - * @brief RequestDownloadTaskListData - * @note Uses \ref nsGetDownloadTaskInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - * @param[out] a \ref AsyncValue - */ -Result RequestDownloadTaskListData(AsyncValue *a); - -/** - * @brief TryCommitCurrentApplicationDownloadTask - * @note Only available on [4.0.0+]. - */ -Result TryCommitCurrentApplicationDownloadTask(void); - -/** - * @brief EnableAutoCommit - * @note Only available on [4.0.0+]. - */ -Result EnableAutoCommit(void); - -/** - * @brief DisableAutoCommit - * @note Only available on [4.0.0+]. - */ -Result DisableAutoCommit(void); - -/** - * @brief TriggerDynamicCommitEvent - * @note Only available on [4.0.0+]. - */ -Result TriggerDynamicCommitEvent(void); - -/** - * @brief CalculateApplicationOccupiedSize - * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @param[in] application_id ApplicationId. - * @param[out] out \ref NsApplicationOccupiedSize - */ -Result CalculateApplicationOccupiedSize(u64 application_id, NsApplicationOccupiedSize *out); - -/** - * @brief CheckSdCardMountStatus - * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - */ -Result CheckSdCardMountStatus(void); - -/** - * @brief Returns the total storage capacity (used + free) from content manager services. - * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @param[in] storage_id \ref NcmStorageId. Must be ::NcmStorageId_SdCard. - * @param[out] size Pointer to output the total storage size to. - */ -Result GetTotalSpaceSize(NcmStorageId storage_id, s64 *size); - -/** - * @brief Returns the available storage capacity from content manager services. - * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @param[in] storage_id \ref NcmStorageId. Must be ::NcmStorageId_SdCard. - * @param[out] size Pointer to output the free storage size to. - */ -Result GetFreeSpaceSize(NcmStorageId storage_id, s64 *size); - -/** - * @brief CountApplicationContentMeta - * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - * @param[out] out Output count. - */ -Result CountApplicationContentMeta(u64 application_id, s32 *out); - -/** - * @brief Gets an listing of \ref NsApplicationContentMetaStatus. - * @note Uses \ref nsGetContentManagementInterface on [3.0.0+], otherwise IApplicationManagerInterface is used. - * @note Only available on [2.0.0+]. - * @param[in] application_id ApplicationId. - * @param[in] index Starting entry index. - * @param[out] list Output array of \ref NsApplicationContentMetaStatus. - * @param[in] count Size of the list array in entries. - * @param[out] out_entrycount Total output entries. - */ -Result ListApplicationContentMetaStatus(u64 application_id, s32 index, NsApplicationContentMetaStatus* list, s32 count, s32* out_entrycount); - -/** - * @brief IsAnyApplicationRunning - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result IsAnyApplicationRunning(bool *out); - -/** - * @brief Close a \ref NsRequestServerStopper. - * @param r \ref NsRequestServerStopper - */ -void RequestServerStopperClose(NsRequestServerStopper *r); - -/** - * @brief Close a \ref NsProgressMonitorForDeleteUserSaveDataAll. When initialized this will use \ref nsProgressMonitorForDeleteUserSaveDataAllIsFinished, throwing errors on failure / when the operation isn't finished (without closing the object). - * @note Cancelling the operation before it's finished is not supported by \ref NsProgressMonitorForDeleteUserSaveDataAll. - * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll - */ -Result ProgressMonitorForDeleteUserSaveDataAllClose(NsProgressMonitorForDeleteUserSaveDataAll *p); - -/** - * @brief GetSystemEvent - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result ProgressMonitorForDeleteUserSaveDataAllGetSystemEvent(NsProgressMonitorForDeleteUserSaveDataAll *p, Event* out_event); - -/** - * @brief IsFinished - * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll - * @param[out] out Whether the operation finished. - */ -Result ProgressMonitorForDeleteUserSaveDataAllIsFinished(NsProgressMonitorForDeleteUserSaveDataAll *p, bool *out); - -/** - * @brief GetResult - * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll - */ -Result ProgressMonitorForDeleteUserSaveDataAllGetResult(NsProgressMonitorForDeleteUserSaveDataAll *p); - -/** - * @brief GetProgress - * @param p \ref NsProgressMonitorForDeleteUserSaveDataAll - * @param[out] progress Output \ref NsProgressForDeleteUserSaveDataAll. - */ -Result ProgressMonitorForDeleteUserSaveDataAllGetProgress(NsProgressMonitorForDeleteUserSaveDataAll *p, NsProgressForDeleteUserSaveDataAll *progress); - -/** - * @brief Close a \ref NsProgressAsyncResult. - * @note When the object is initialized, this uses \ref nsProgressAsyncResultCancel then \ref nsProgressAsyncResultWait with timeout=UINT64_MAX. - * @param a \ref NsProgressAsyncResult - */ -void ProgressAsyncResultClose(NsProgressAsyncResult *a); - -/** - * @brief Waits for the async operation to finish using the specified timeout. - * @param a \ref NsProgressAsyncResult - * @param[in] timeout Timeout in nanoseconds. UINT64_MAX for no timeout. - */ -Result ProgressAsyncResultWait(NsProgressAsyncResult *a, u64 timeout); - -/** - * @brief Gets the Result. - * @note Prior to using the cmd, this uses \ref nsProgressAsyncResultWait with timeout=UINT64_MAX. - * @param a \ref NsProgressAsyncResult - */ -Result ProgressAsyncResultGet(NsProgressAsyncResult *a); - -/** - * @brief Cancels the async operation. - * @note Used automatically by \ref nsProgressAsyncResultClose. - * @param a \ref NsProgressAsyncResult - */ -Result ProgressAsyncResultCancel(NsProgressAsyncResult *a); - -/** - * @brief Gets the progress. - * @param a \ref NsProgressAsyncResult - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size. - */ -Result ProgressAsyncResultGetProgress(NsProgressAsyncResult *a, void* buffer, size_t size); - -/** - * @brief GetDetailResult - * @param a \ref NsProgressAsyncResult - */ -Result ProgressAsyncResultGetDetailResult(NsProgressAsyncResult *a); - -/** - * @brief Gets the \ref ErrorContext. - * @note Only available on [4.0.0+]. - * @param a \ref NsProgressAsyncResult - * @param[out] context \ref ErrorContext - */ -Result ProgressAsyncResultGetErrorContext(NsProgressAsyncResult *a, ErrorContext *context); - -} // namespace ns - -/// @brief C++ wrappers for the `nsdev` API. -/// @details Wraps: switch/services/ns.h. -namespace nsdev { - -/// NsApplicationContentMetaStatus -using ::NsApplicationContentMetaStatus; -/// ApplicationControlData -using ::NsApplicationControlData; -/// ApplicationControlSource -using ::NsApplicationControlSource; -/// ApplicationDeliveryInfo -using ::NsApplicationDeliveryInfo; -/// ApplicationOccupiedSize -using ::NsApplicationOccupiedSize; -/// ApplicationRecord -using ::NsApplicationRecord; -/// NsApplicationRightsOnClient -using ::NsApplicationRightsOnClient; -/// ApplicationView -using ::NsApplicationView; -/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. -using ::NsApplicationViewDeprecated; -/// NsApplicationViewWithPromotionInfo -using ::NsApplicationViewWithPromotionInfo; -/// BackgroundNetworkUpdateState -using ::NsBackgroundNetworkUpdateState; -/// DownloadTaskStatus -using ::NsDownloadTaskStatus; -/// EulaDataPath -using ::NsEulaDataPath; -/// LatestSystemUpdate -using ::NsLatestSystemUpdate; -/// LaunchProperties -using ::NsLaunchProperties; -/// ProgressAsyncResult -using ::NsProgressAsyncResult; -/// ProgressForDeleteUserSaveDataAll -using ::NsProgressForDeleteUserSaveDataAll; -/// ProgressMonitorForDeleteUserSaveDataAll -using ::NsProgressMonitorForDeleteUserSaveDataAll; -/// NsPromotionInfo -using ::NsPromotionInfo; -/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsReceiveApplicationProgress; -/// RequestServerStopper -using ::NsRequestServerStopper; -/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsSendApplicationProgress; -/// ShellEvent -using ::NsShellEvent; -/// ShellEventInfo -using ::NsShellEventInfo; -/// SystemDeliveryInfo -using ::NsSystemDeliveryInfo; -/// SystemUpdateControl -using ::NsSystemUpdateControl; -/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. -using ::NsSystemUpdateProgress; - -///< [4.0.0+] -/// Initialize ns:dev. -Result Initialize(void); - -/// Initialize ns:dev. -void Exit(void); - -/// Gets the Service object for ns:dev. -Service* GetServiceSession(void); - -Result LaunchProgram(u64* out_pid, const NsLaunchProperties* properties, u32 flags); - -///< [1.0.0-9.2.0] -Result TerminateProcess(u64 pid); - -Result TerminateProgram(u64 tid); - -///< [1.0.0-9.2.0] -Result GetShellEvent(Event* out_event); - -///< Autoclear for nsdevShellEvent is always true. [1.0.0-9.2.0] -Result GetShellEventInfo(NsShellEventInfo* out); - -///< [1.0.0-9.2.0] -Result TerminateApplication(void); - -Result PrepareLaunchProgramFromHost(NsLaunchProperties* out, const char* path, size_t path_len); - -///< [1.0.0-9.2.0] -Result LaunchApplicationForDevelop(u64* out_pid, u64 application_id, u32 flags); - -///< [1.0.0-9.2.0] -Result LaunchApplicationFromHost(u64* out_pid, const char* path, size_t path_len, u32 flags); - -///< [10.0.0-17.0.1] -Result LaunchApplicationWithStorageIdForDevelop(u64* out_pid, u64 application_id, u32 flags, u8 app_storage_id, u8 patch_storage_id); - -///< [1.0.0-17.0.1] -Result IsSystemMemoryResourceLimitBoosted(bool* out); - -///< [6.0.0-8.1.0] -Result GetRunningApplicationProcessIdForDevelop(u64* out_pid); - -///< [6.0.0+] -Result SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(bool can_be_active); - -} // namespace nsdev - -/// @brief C++ wrappers for the `nssu` API. -/// @details Wraps: switch/services/ns.h. -namespace nssu { - -/// NsApplicationContentMetaStatus -using ::NsApplicationContentMetaStatus; -/// ApplicationControlData -using ::NsApplicationControlData; -/// ApplicationControlSource -using ::NsApplicationControlSource; -/// ApplicationDeliveryInfo -using ::NsApplicationDeliveryInfo; -/// ApplicationOccupiedSize -using ::NsApplicationOccupiedSize; -/// ApplicationRecord -using ::NsApplicationRecord; -/// NsApplicationRightsOnClient -using ::NsApplicationRightsOnClient; -/// ApplicationView -using ::NsApplicationView; -/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. -using ::NsApplicationViewDeprecated; -/// NsApplicationViewWithPromotionInfo -using ::NsApplicationViewWithPromotionInfo; -/// BackgroundNetworkUpdateState -using ::NsBackgroundNetworkUpdateState; -/// DownloadTaskStatus -using ::NsDownloadTaskStatus; -/// EulaDataPath -using ::NsEulaDataPath; -/// LatestSystemUpdate -using ::NsLatestSystemUpdate; -/// LaunchProperties -using ::NsLaunchProperties; -/// ProgressAsyncResult -using ::NsProgressAsyncResult; -/// ProgressForDeleteUserSaveDataAll -using ::NsProgressForDeleteUserSaveDataAll; -/// ProgressMonitorForDeleteUserSaveDataAll -using ::NsProgressMonitorForDeleteUserSaveDataAll; -/// NsPromotionInfo -using ::NsPromotionInfo; -/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsReceiveApplicationProgress; -/// RequestServerStopper -using ::NsRequestServerStopper; -/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsSendApplicationProgress; -/// ShellEvent -using ::NsShellEvent; -/// ShellEventInfo -using ::NsShellEventInfo; -/// SystemDeliveryInfo -using ::NsSystemDeliveryInfo; -/// SystemUpdateControl -using ::NsSystemUpdateControl; -/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. -using ::NsSystemUpdateProgress; - -///< [6.0.0+] -/// Initialize ns:su. -Result Initialize(void); - -/// Exit ns:su. -void Exit(void); - -/// Gets the Service object for ns:su. -Service* GetServiceSession(void); - -/** - * @brief Gets the \ref NsBackgroundNetworkUpdateState. - * @note Internally this uses nim commands ListSystemUpdateTask and GetSystemUpdateTaskInfo to determine the output state. - * @param[out] out \ref NsBackgroundNetworkUpdateState - */ -Result GetBackgroundNetworkUpdateState(NsBackgroundNetworkUpdateState *out); - -/** - * @brief Opens a \ref NsSystemUpdateControl. - * @note Only 1 \ref NsSystemUpdateControl can be open at a time. - * @param[out] c \ref NsSystemUpdateControl - */ -Result OpenSystemUpdateControl(NsSystemUpdateControl *c); - -/** - * @brief Uses nim ListSystemUpdateTask, then uses the task with DestroySystemUpdateTask if it exists. Then this runs ExFat handling, updates state, and sets the same state flag as \ref nssuRequestBackgroundNetworkUpdate. - * @note Only usable when a \ref NsSystemUpdateControl isn't open. - */ -Result NotifyExFatDriverRequired(void); - -/** - * @brief ClearExFatDriverStatusForDebug - */ -Result ClearExFatDriverStatusForDebug(void); - -/** - * @brief RequestBackgroundNetworkUpdate - * @note Only usable when a \ref NsSystemUpdateControl isn't open. - */ -Result RequestBackgroundNetworkUpdate(void); - -/** - * @brief This checks whether a sysupdate is needed with the input \ref NcmContentMetaKey using NCM commands, if not this will just return 0. Otherwise, this will then run code which is identical to \ref nssuRequestBackgroundNetworkUpdate. - * @note Only usable when a \ref NsSystemUpdateControl isn't open. - * @param[in] key \ref NcmContentMetaKey - */ -Result NotifyBackgroundNetworkUpdate(const NcmContentMetaKey *key); - -/** - * @brief NotifyExFatDriverDownloadedForDebug - */ -Result NotifyExFatDriverDownloadedForDebug(void); - -/** - * @brief Gets an Event which can be signaled by \ref nssuNotifySystemUpdateForContentDelivery. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetSystemUpdateNotificationEventForContentDelivery(Event* out_event); - -/** - * @brief Signals the event returned by \ref nssuGetSystemUpdateNotificationEventForContentDelivery. - */ -Result NotifySystemUpdateForContentDelivery(void); - -/** - * @brief This does shutdown preparation. - * @note This is used by am-sysmodule, so generally there's no need to use this. - * @note Only available on [3.0.0+]. - */ -Result PrepareShutdown(void); - -/** - * @brief This uses nim ListSystemUpdateTask, then when a task is returned uses it with DestroySystemUpdateTask. - * @note Only available on [4.0.0+]. - */ -Result DestroySystemUpdateTask(void); - -/** - * @brief RequestSendSystemUpdate - * @note addr/port are little-endian. - * @note Only available on [4.0.0+]. - * @param[out] a \ref AsyncResult - * @param[in] addr Client IPv4 address. - * @param[in] port Socket port. qlaunch uses value 55556. - * @param[in] info \ref NsSystemDeliveryInfo - */ -Result RequestSendSystemUpdate(AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info); - -/** - * @brief GetSendSystemUpdateProgress - * @note Only available on [4.0.0+]. - * @param[out] out \ref NsSystemUpdateProgress - */ -Result GetSendSystemUpdateProgress(NsSystemUpdateProgress *out); - -/** - * @brief Close a \ref NsSystemUpdateControl. - * @param c \ref NsSystemUpdateControl - */ -void ControlClose(NsSystemUpdateControl *c); - -/** - * @brief Gets whether a network sysupdate was downloaded, with install pending. - * @param c \ref NsSystemUpdateControl - * @param[out] out Output flag. - */ -Result ControlHasDownloaded(NsSystemUpdateControl *c, bool* out); - -/** - * @brief RequestCheckLatestUpdate - * @param c \ref NsSystemUpdateControl - * @param[out] a \ref AsyncValue. The data that can be read from this is u8 \ref NsLatestSystemUpdate. - */ -Result ControlRequestCheckLatestUpdate(NsSystemUpdateControl *c, AsyncValue *a); - -/** - * @brief RequestDownloadLatestUpdate - * @param c \ref NsSystemUpdateControl - * @param[out] a \ref AsyncResult - */ -Result ControlRequestDownloadLatestUpdate(NsSystemUpdateControl *c, AsyncResult *a); - -/** - * @brief GetDownloadProgress - * @param c \ref NsSystemUpdateControl - * @param[out] out \ref NsSystemUpdateProgress - */ -Result ControlGetDownloadProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out); - -/** - * @brief ApplyDownloadedUpdate - * @param c \ref NsSystemUpdateControl - */ -Result ControlApplyDownloadedUpdate(NsSystemUpdateControl *c); - -/** - * @brief RequestPrepareCardUpdate - * @param c \ref NsSystemUpdateControl - * @param[out] a \ref AsyncResult - */ -Result ControlRequestPrepareCardUpdate(NsSystemUpdateControl *c, AsyncResult *a); - -/** - * @brief GetPrepareCardUpdateProgress - * @note \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater must have been used at some point prior to using this. - * @param c \ref NsSystemUpdateControl - * @param[out] out \ref NsSystemUpdateProgress - */ -Result ControlGetPrepareCardUpdateProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out); - -/** - * @brief HasPreparedCardUpdate - * @note \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater must have been used at some point prior to using this. - * @param c \ref NsSystemUpdateControl - * @param[out] out Output flag. - */ -Result ControlHasPreparedCardUpdate(NsSystemUpdateControl *c, bool* out); - -/** - * @brief ApplyCardUpdate - * @note \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater must have been used at some point prior to using this. - * @param c \ref NsSystemUpdateControl - */ -Result ControlApplyCardUpdate(NsSystemUpdateControl *c); - -/** - * @brief Gets the filesize for the specified DownloadedEulaData. - * @note This mounts the Eula SystemData, then uses the file ":/". - * @param c \ref NsSystemUpdateControl - * @param[in] path EulaData path. - * @param[out] filesize Output filesize. - */ -Result ControlGetDownloadedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize); - -/** - * @brief Gets the specified DownloadedEulaData. - * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. - * @param c \ref NsSystemUpdateControl - * @param[in] path EulaData path. - * @param[out] buffer Output buffer. - * @param[in] size Size of the output buffer, must be at least the output size from \ref nssuControlGetDownloadedEulaDataSize. - * @param[out] filesize Output filesize. - */ -Result ControlGetDownloadedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize); - -/** - * @brief SetupCardUpdate - * @param c \ref NsSystemUpdateControl - * @param[in] buffer TransferMemory buffer, when NULL this is automatically allocated. - * @param[in] size TransferMemory buffer size, see \ref NSSU_CARDUPDATE_TMEM_SIZE_DEFAULT. - */ -Result ControlSetupCardUpdate(NsSystemUpdateControl *c, void* buffer, size_t size); - -/** - * @brief Gets the filesize for the specified PreparedCardUpdateEulaData. - * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. - * @param c \ref NsSystemUpdateControl - * @param[in] path EulaData path. - * @param[out] filesize Output filesize. - */ -Result ControlGetPreparedCardUpdateEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize); - -/** - * @brief Gets the specified PreparedCardUpdateEulaData. - * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. - * @param c \ref NsSystemUpdateControl - * @param[in] path EulaData path. - * @param[out] buffer Output buffer. - * @param[in] size Size of the output buffer, must be at least the output size from \ref nssuControlGetPreparedCardUpdateEulaDataSize. - * @param[out] filesize Output filesize. - */ -Result ControlGetPreparedCardUpdateEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize); - -/** - * @brief SetupCardUpdateViaSystemUpdater - * @note Same as \ref nssuControlSetupCardUpdate, except this doesn't run the code for fs cmds GetGameCardHandle/GetGameCardUpdatePartitionInfo, and uses fs OpenRegisteredUpdatePartition instead of OpenGameCardFileSystem. - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[in] buffer TransferMemory buffer, when NULL this is automatically allocated. - * @param[in] size TransferMemory buffer size, see \ref NSSU_CARDUPDATE_TMEM_SIZE_DEFAULT. - */ -Result ControlSetupCardUpdateViaSystemUpdater(NsSystemUpdateControl *c, void* buffer, size_t size); - -/** - * @brief HasReceived - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[out] out Output flag. - */ -Result ControlHasReceived(NsSystemUpdateControl *c, bool* out); - -/** - * @brief RequestReceiveSystemUpdate - * @note addr/port are little-endian. - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[out] a \ref AsyncResult - * @param[in] addr Server IPv4 address. - * @param[in] port Socket port. qlaunch uses value 55556. - * @param[in] info \ref NsSystemDeliveryInfo - */ -Result ControlRequestReceiveSystemUpdate(NsSystemUpdateControl *c, AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info); - -/** - * @brief GetReceiveProgress - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[out] out \ref NsSystemUpdateProgress - */ -Result ControlGetReceiveProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out); - -/** - * @brief ApplyReceivedUpdate - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - */ -Result ControlApplyReceivedUpdate(NsSystemUpdateControl *c); - -/** - * @brief Gets the filesize for the specified ReceivedEulaData. - * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[in] path EulaData path. - * @param[out] filesize Output filesize. - */ -Result ControlGetReceivedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize); - -/** - * @brief Gets the specified ReceivedEulaData. - * @note See the note for \ref nssuControlGetDownloadedEulaDataSize. - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[in] path EulaData path. - * @param[out] buffer Output buffer. - * @param[in] size Size of the output buffer, must be at least the output size from \ref nssuControlGetReceivedEulaDataSize. - * @param[out] filesize Output filesize. - */ -Result ControlGetReceivedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize); - -/** - * @brief Does setup for ReceiveSystemUpdate by using the same nim cmds as \ref nssuDestroySystemUpdateTask. - * @note qlaunch uses this before \ref nssuControlRequestReceiveSystemUpdate. - * @note Only available on [4.0.0+]. - * @param c \ref NsSystemUpdateControl - */ -Result ControlSetupToReceiveSystemUpdate(NsSystemUpdateControl *c); - -/** - * @brief RequestCheckLatestUpdateIncludesRebootlessUpdate - * @note Only available on [6.0.0+]. - * @param c \ref NsSystemUpdateControl - * @param[out] a \ref AsyncValue - */ -Result ControlRequestCheckLatestUpdateIncludesRebootlessUpdate(NsSystemUpdateControl *c, AsyncValue *a); - -} // namespace nssu - -/// @brief C++ wrappers for the `nsvm` API. -/// @details Wraps: switch/services/ns.h. -namespace nsvm { - -/// NsApplicationContentMetaStatus -using ::NsApplicationContentMetaStatus; -/// ApplicationControlData -using ::NsApplicationControlData; -/// ApplicationControlSource -using ::NsApplicationControlSource; -/// ApplicationDeliveryInfo -using ::NsApplicationDeliveryInfo; -/// ApplicationOccupiedSize -using ::NsApplicationOccupiedSize; -/// ApplicationRecord -using ::NsApplicationRecord; -/// NsApplicationRightsOnClient -using ::NsApplicationRightsOnClient; -/// ApplicationView -using ::NsApplicationView; -/// ApplicationViewDeprecated. The below comments are for the \ref NsApplicationView to NsApplicationViewDeprecated conversion done by \ref nsGetApplicationViewDeprecated on newer system-versions. -using ::NsApplicationViewDeprecated; -/// NsApplicationViewWithPromotionInfo -using ::NsApplicationViewWithPromotionInfo; -/// BackgroundNetworkUpdateState -using ::NsBackgroundNetworkUpdateState; -/// DownloadTaskStatus -using ::NsDownloadTaskStatus; -/// EulaDataPath -using ::NsEulaDataPath; -/// LatestSystemUpdate -using ::NsLatestSystemUpdate; -/// LaunchProperties -using ::NsLaunchProperties; -/// ProgressAsyncResult -using ::NsProgressAsyncResult; -/// ProgressForDeleteUserSaveDataAll -using ::NsProgressForDeleteUserSaveDataAll; -/// ProgressMonitorForDeleteUserSaveDataAll -using ::NsProgressMonitorForDeleteUserSaveDataAll; -/// NsPromotionInfo -using ::NsPromotionInfo; -/// ReceiveApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsReceiveApplicationProgress; -/// RequestServerStopper -using ::NsRequestServerStopper; -/// SendApplicationProgress. Same as \ref NsSystemUpdateProgress, except cmds which return this will return actual errors on failure, instead of returning 0 with a cleared struct. -using ::NsSendApplicationProgress; -/// ShellEvent -using ::NsShellEvent; -/// ShellEventInfo -using ::NsShellEventInfo; -/// SystemDeliveryInfo -using ::NsSystemDeliveryInfo; -/// SystemUpdateControl -using ::NsSystemUpdateControl; -/// SystemUpdateProgress. Commands which have this as output will return 0 with the output cleared, when no task is available. -using ::NsSystemUpdateProgress; - -/// Initialize ns:vm. On pre-3.0.0 this must be used with \ref nsInitialize. -Result Initialize(void); - -/// Exit ns:vm. -void Exit(void); - -/// Gets the Service object for ns:vm. This is only initialized on [3.0.0+]. -Service* GetServiceSession(void); - -Result NeedsUpdateVulnerability(bool *out); - -Result GetSafeSystemVersion(NcmContentMetaKey *out); - -} // namespace nsvm - -/// @brief C++ wrappers for the `nv` API. -/// @details Wraps: switch/nvidia/address_space.h, switch/nvidia/channel.h, switch/nvidia/fence.h, switch/nvidia/gpu.h, switch/nvidia/gpu_channel.h, switch/nvidia/map.h, switch/services/nv.h. -namespace nv { - -using ::NvAddressSpace; -using ::NvChannel; -using ::NvEventId; -using ::NvFence; -using ::NvGpuChannel; -using ::NvMap; -using ::NvMultiFence; -/// NvServiceType, for __nx_nv_service_type. -using ::NvServiceType; - -Result AddressSpaceCreate(NvAddressSpace* a, u32 page_size); - -void AddressSpaceClose(NvAddressSpace* a); - -Result AddressSpaceAlloc(NvAddressSpace* a, bool sparse, u64 size, iova_t* iova_out); - -Result AddressSpaceAllocFixed(NvAddressSpace* a, bool sparse, u64 size, iova_t iova); - -Result AddressSpaceFree(NvAddressSpace* a, iova_t iova, u64 size); - -Result AddressSpaceMap(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t* iova_out); - -Result AddressSpaceMapFixed(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t iova); - -Result AddressSpaceModify(NvAddressSpace* a, iova_t iova, u64 offset, u64 size, NvKind kind); - -Result AddressSpaceUnmap(NvAddressSpace* a, iova_t iova); - -Result ChannelCreate(NvChannel* c, const char* dev); - -void ChannelClose(NvChannel* c); - -Result ChannelSetPriority(NvChannel* c, NvChannelPriority prio); - -Result ChannelSetTimeout(NvChannel* c, u32 timeout); - -Result FenceInit(void); - -void FenceExit(void); - -u32 FenceGetFd(void); - -Result FenceWait(NvFence* f, s32 timeout_us); - -void MultiFenceCreate(NvMultiFence* mf, const NvFence* fence); - -Result MultiFenceWait(NvMultiFence* mf, s32 timeout_us); - -Result GpuInit(void); - -void GpuExit(void); - -const nvioctl_gpu_characteristics* GpuGetCharacteristics(void); - -u32 GpuGetZcullCtxSize(void); - -const nvioctl_zcull_info* GpuGetZcullInfo(void); - -const u32* GpuGetTpcMasks(u32 *num_masks_out); - -Result GpuZbcGetActiveSlotMask(u32 *out_slot, u32 *out_mask); - -Result GpuZbcAddColor(const u32 color_l2[4], const u32 color_ds[4], u32 format); - -Result GpuZbcAddDepth(float depth); - -Result GpuGetTimestamp(u64 *ts); - -Result GpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as, NvChannelPriority prio); - -void GpuChannelClose(NvGpuChannel* c); - -Result GpuChannelZcullBind(NvGpuChannel* c, iova_t iova); - -Result GpuChannelAppendEntry(NvGpuChannel* c, iova_t start, size_t num_cmds, u32 flags, u32 flush_threshold); - -Result GpuChannelKickoff(NvGpuChannel* c); - -Result GpuChannelGetErrorNotification(NvGpuChannel* c, NvNotification* notif); - -Result GpuChannelGetErrorInfo(NvGpuChannel* c, NvError* error); - -u32 GpuChannelGetSyncpointId(NvGpuChannel* c); - -void GpuChannelGetFence(NvGpuChannel* c, NvFence* fence_out); - -void GpuChannelIncrFence(NvGpuChannel* c); - -Result MapInit(void); - -u32 MapGetFd(void); - -void MapExit(void); - -Result MapCreate(NvMap* m, void* cpu_addr, u32 size, u32 align, NvKind kind, bool is_cpu_cacheable); - -Result MapLoadRemote(NvMap* m, u32 id); - -void MapClose(NvMap* m); - -u32 MapGetHandle(NvMap* m); - -u32 MapGetId(NvMap* m); - -u32 MapGetSize(NvMap* m); - -void* MapGetCpuAddr(NvMap* m); - -bool MapIsRemote(NvMap* m); - -NvKind MapGetKind(NvMap* m); - -/// Initialize nvdrv*. -Result Initialize(void); - -/// Exit nvdrv*. -void Exit(void); - -/// Gets the Service object for the actual nvdrv* service session. -Service* GetServiceSession(void); - -Result Open(u32 *fd, const char *devicepath); - -Result Ioctl(u32 fd, u32 request, void* argp); - -Result Ioctl2(u32 fd, u32 request, void* argp, const void* inbuf, size_t inbuf_size); - -///< [3.0.0+] -Result Ioctl3(u32 fd, u32 request, void* argp, void* outbuf, size_t outbuf_size); - -///< [3.0.0+] -Result Close(u32 fd); - -Result QueryEvent(u32 fd, u32 event_id, Event *event_out); - -Result ConvertError(int rc); - -} // namespace nv - -/// @brief C++ wrappers for the `nvioctl` API. -/// @details Wraps: switch/nvidia/ioctl.h. -namespace nvioctl { - -using ::NvAllocSpaceFlags; -using ::NvChannelPriority; -using ::NvClassNumber; -using ::NvError; -using ::nvioctl_clk_rate; -using ::nvioctl_cmdbuf; -using ::nvioctl_command_buffer_map; -using ::nvioctl_fence; -using ::nvioctl_gpfifo_entry; -using ::nvioctl_gpu_characteristics; -using ::nvioctl_gpu_time; -using ::nvioctl_reloc; -using ::nvioctl_reloc_shift; -using ::nvioctl_syncpt_incr; -using ::nvioctl_va_region; -using ::nvioctl_zbc_entry; -using ::nvioctl_zbc_slot_mask; -using ::nvioctl_zcull_info; -using ::NvMapBufferFlags; -using ::NvMapParam; -using ::NvNotification; -using ::NvNotificationType; -using ::NvZcullConfig; - -Result NvhostCtrl_SyncptRead(u32 fd, u32 id, u32* out); - -Result NvhostCtrl_SyncptIncr(u32 fd, u32 id); - -Result NvhostCtrl_SyncptWait(u32 fd, u32 id, u32 threshold, u32 timeout); - -Result NvhostCtrl_EventSignal(u32 fd, u32 event_id); - -Result NvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out); - -Result NvhostCtrl_EventWaitAsync(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id); - -Result NvhostCtrl_EventRegister(u32 fd, u32 event_id); - -Result NvhostCtrl_EventUnregister(u32 fd, u32 event_id); - -Result NvhostCtrlGpu_ZCullGetCtxSize(u32 fd, u32 *out); - -Result NvhostCtrlGpu_ZCullGetInfo(u32 fd, nvioctl_zcull_info *out); - -Result NvhostCtrlGpu_ZbcSetTable(u32 fd, const u32 color_ds[4], const u32 color_l2[4], u32 depth, u32 format, u32 type); - -Result NvhostCtrlGpu_ZbcQueryTable(u32 fd, u32 index, nvioctl_zbc_entry *out); - -Result NvhostCtrlGpu_GetCharacteristics(u32 fd, nvioctl_gpu_characteristics *out); - -Result NvhostCtrlGpu_GetTpcMasks(u32 fd, void *buffer, size_t size); - -Result NvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *out); - -Result NvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out); - -Result NvhostAsGpu_BindChannel(u32 fd, u32 channel_fd); - -Result NvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align_or_offset, u64 *offset); - -Result NvhostAsGpu_FreeSpace(u32 fd, u64 offset, u32 pages, u32 page_size); - -Result NvhostAsGpu_MapBufferEx(u32 fd, u32 flags, u32 kind, u32 nvmap_handle, u32 page_size, u64 buffer_offset, u64 mapping_size, u64 input_offset, u64 *offset); - -Result NvhostAsGpu_UnmapBuffer(u32 fd, u64 offset); - -Result NvhostAsGpu_GetVARegions(u32 fd, nvioctl_va_region regions[2]); - -Result NvhostAsGpu_InitializeEx(u32 fd, u32 flags, u32 big_page_size); - -Result Nvmap_Create(u32 fd, u32 size, u32 *nvmap_handle); - -Result Nvmap_FromId(u32 fd, u32 id, u32 *nvmap_handle); - -Result Nvmap_Alloc(u32 fd, u32 nvmap_handle, u32 heapmask, u32 flags, u32 align, u8 kind, void* addr); - -Result Nvmap_Free(u32 fd, u32 nvmap_handle); - -Result Nvmap_Param(u32 fd, u32 nvmap_handle, NvMapParam param, u32 *result); - -Result Nvmap_GetId(u32 fd, u32 nvmap_handle, u32 *id); - -Result Channel_SetNvmapFd(u32 fd, u32 nvmap_fd); - -Result Channel_SubmitGpfifo(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout); - -Result Channel_KickoffPb(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout); - -Result Channel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out); - -Result Channel_ZCullBind(u32 fd, u64 gpu_va, u32 mode); - -Result Channel_SetErrorNotifier(u32 fd, u32 enable); - -Result Channel_GetErrorInfo(u32 fd, NvError* out); - -Result Channel_GetErrorNotification(u32 fd, NvNotification* out); - -Result Channel_SetPriority(u32 fd, u32 priority); - -Result Channel_SetTimeout(u32 fd, u32 timeout); - -Result Channel_AllocGpfifoEx2(u32 fd, u32 num_entries, u32 flags, u32 unk0, u32 unk1, u32 unk2, u32 unk3, nvioctl_fence *fence_out); - -Result Channel_SetUserData(u32 fd, void* addr); - -Result Channel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdbufs, const nvioctl_reloc *relocs, const nvioctl_reloc_shift *reloc_shifts, u32 num_relocs, const nvioctl_syncpt_incr *syncpt_incrs, u32 num_syncpt_incrs, nvioctl_fence *fences, u32 num_fences); - -Result Channel_GetSyncpt(u32 fd, u32 module_id, u32 *syncpt); - -Result Channel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq); - -Result Channel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq); - -Result Channel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed); - -Result Channel_UnmapCommandBuffer(u32 fd, const nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed); - -Result Channel_SetSubmitTimeout(u32 fd, u32 timeout); - -} // namespace nvioctl - -/// @brief C++ wrappers for the `nwindow` API. -/// @details Wraps: switch/display/native_window.h. -namespace nwindow { - -/// Native window structure. -using ::NWindow; - -/// Checks whether a pointer refers to a valid \ref NWindow object. -bool IsValid(NWindow* nw); - -/** - * @brief Retrieves the default \ref NWindow object. - * @return Pointer to the default \ref NWindow object. - * @note When this function is used/referenced, libnx will initialize VI services - * and create a \ref NWindow object from a \ref ViLayer created on the default \ref ViDisplay; - * all of this happening automatically during application startup (i.e. before main is called). - * If creating the default \ref NWindow fails, libnx will throw a LibnxError_BadGfxInit fatal error. - * Likewise, after main returns (or exit is called) libnx will clean up all resources used by it. - */ -NWindow* GetDefault(void); - -/** - * @brief Creates a \ref NWindow. - * @param[out] nw Output \ref NWindow structure. - * @param[in] binder_session Service object for the Android IGraphicBufferProducer binder session. - * @param[in] binder_id Android IGraphicBufferProducer binder session ID. - * @param[in] producer_controlled_by_app Specifies whether the producer is controlled by the application. - */ -Result Create(NWindow* nw, Service* binder_session, s32 binder_id, bool producer_controlled_by_app); - -/** - * @brief Creates a \ref NWindow operating on a \ref ViLayer. - * @param[out] nw Output \ref NWindow structure. - * @param[in] layer Pointer to \ref ViLayer structure (such as the one returned by \ref viCreateLayer). - */ -Result CreateFromLayer(NWindow* nw, const ViLayer* layer); - -/// Closes a \ref NWindow, freeing all resources associated with it. -void Close(NWindow* nw); - -/** - * @brief Retrieves the dimensions of a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[out] out_width Output variable containing the width of the \ref NWindow. - * @param[out] out_height Output variable containing the height of the \ref NWindow. - * @note After creation, a \ref NWindow reports a default size (usually 1280x720). - * This size can be overriden by calling \ref nwindowSetDimensions. - */ -Result GetDimensions(NWindow* nw, u32* out_width, u32* out_height); - -/** - * @brief Sets the dimensions of a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] width Desired width of the \ref NWindow. - * @param[in] height Desired width of the \ref NWindow. - * @note This function cannot be called when there are buffers registered with the \ref NWindow. - */ -Result SetDimensions(NWindow* nw, u32 width, u32 height); - -/** - * @brief Configures the crop applied to images presented through a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] left X coordinate of the left margin of the crop bounding box. - * @param[in] top Y coordinate of the top margin of the crop bounding box. - * @param[in] right X coordinate of the right margin of the crop bounding box. - * @param[in] bottom Y coordinate of the bottom margin of the crop bounding box. - * @note Passing zero to all parameters disables the crop functionality. This is also the default. - * @note The bounding box defined by the parameters will be adjusted to fit within the dimensions of the \ref NWindow. - * @note \p left must be less or equal than \p right. - * @note \p top must be less or equal than \p bottom. - */ -Result SetCrop(NWindow* nw, s32 left, s32 top, s32 right, s32 bottom); - -/** - * @brief Configures the transformation applied to images presented through a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] transform Android transformation mode (see NATIVE_WINDOW_TRANSFORM_* enum) - * @note The default transformation is 0 (i.e. no transformation applied) - */ -Result SetTransform(NWindow* nw, u32 transform); - -/** - * @brief Configures the swap interval of a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] swap_interval Value specifying the number of display refreshes (VBlanks) that must occur between presenting images. - * @note The default swap interval is 1. - * @note If the \ref NWindow has three or more buffers configured (with \ref nwindowConfigureBuffer), it is possible to pass 0 - * to disable the swap interval feature and present images as fast as allowed by the compositor. Otherwise, the system - * enforces a minimum of 1 as the swap interval. - */ -Result SetSwapInterval(NWindow* nw, u32 swap_interval); - -/// Checks whether the consumer of a \ref NWindow is running behind. -bool IsConsumerRunningBehind(NWindow* nw); - -/** - * @brief Registers a \ref NvGraphicBuffer with a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] slot ID of the slot to configure (starting from 0). - * @param[in] buf Pointer to \ref NvGraphicBuffer structure. - * @note When a buffer is registered, it is added to the internal queue of buffers used for presenting. - * @note All buffers registered with a \ref NWindow must have the same dimensions, format and usage. - * If \ref nwindowSetDimensions has not been previously called, the \ref NWindow will automatically - * adopt the dimensions of the first buffer registered with it. Otherwise, said buffer will need - * to match the dimensions that were previously configured. - */ -Result ConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf); - -/** - * @brief Dequeues a buffer from a \ref NWindow. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[out] out_slot Output variable containing the ID of the slot that has been dequeued. - * @param[out] out_fence Output variable containing a \ref NvMultiFence that will be signalled by - * the compositor when the buffer is ready to be written to. Pass NULL to wait instead - * on this fence before this function returns. - * @note For \p out_fence=NULL to work, \ref nvFenceInit must have been previously called. - */ -Result DequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence); - -/** - * @brief Cancels a buffer previously dequeued with \ref nwindowDequeueBuffer. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] slot ID of the slot to cancel. This must match the output of the previous \ref nwindowDequeueBuffer call. - * @param[in] fence Pointer to the \ref NvMultiFence that will be waited on by the compositor before cancelling the buffer. - * Pass NULL if there is no such fence. - */ -Result CancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence); - -/** - * @brief Queues a buffer previously dequeued with \ref nwindowDequeueBuffer, making it ready for presentation. - * @param[in] nw Pointer to \ref NWindow structure. - * @param[in] slot ID of the slot to queue. This must match the output of the previous \ref nwindowDequeueBuffer call. - * @param[in] fence Pointer to the \ref NvMultiFence that will be waited on by the compositor before queuing/presenting the buffer. - * Pass NULL if there is no such fence. - */ -Result QueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence); - -/// Releases all buffers registered with a \ref NWindow. -Result ReleaseBuffers(NWindow* nw); - -} // namespace nwindow - -/// @brief C++ wrappers for the `nxlink` API. -/// @details Wraps: switch/runtime/nxlink.h. -namespace nxlink { - -using ::in_addr; -/// Address of the host connected through nxlink -using ::__nxlink_host; - -/** - * @brief Connects to the nxlink host, setting up an output stream. - * @param[in] redirStdout Whether to redirect stdout to nxlink output. - * @param[in] redirStderr Whether to redirect stderr to nxlink output. - * @return Socket fd on success, negative number on failure. - * @note The socket should be closed with close() during application cleanup. - */ -int ConnectToHost(bool redirStdout, bool redirStderr); - -/// Same as \ref nxlinkConnectToHost but redirecting both stdout/stderr. -int Stdio(void); - -/// Same as \ref nxlinkConnectToHost but redirecting only stderr. -int StdioForDebug(void); - -} // namespace nxlink - -/// @brief C++ wrappers for the `omm` API. -/// @details Wraps: switch/services/omm.h. -namespace omm { - -///OperationMode -using ::OmmOperationMode; -///OperationModePolicy -using ::OmmOperationModePolicy; - -/// Initialize omm. -Result Initialize(void); - -/// Exit omm. -void Exit(void); - -/// Gets the Service for omm. -Service* GetServiceSession(void); - -/// Returns a DefaultDisplayResolution. Only available on [3.0.0+]. -Result GetDefaultDisplayResolution(s32* width, s32* height); - -/// Returns an OmmOperationMode. -Result GetOperationMode(OmmOperationMode* s); - -/// Takes an OmmOperationModePolicy. Only available on [3.0.0+]. -Result SetOperationModePolicy(OmmOperationModePolicy value); - -} // namespace omm - -/// @brief C++ wrappers for the `ovlnrcv` API. -/// @details Wraps: switch/services/ovln.h. -namespace ovlnrcv { - -/// EnqueuePosition -using ::OvlnEnqueuePosition; -/// OverflowOption -using ::OvlnOverflowOption; -/// QueueAttribute -using ::OvlnQueueAttribute; -/// RawMessage -using ::OvlnRawMessage; -/// Receiver -using ::OvlnReceiver; -/// Sender -using ::OvlnSender; -/// SendOption -using ::OvlnSendOption; -/// SourceName -using ::OvlnSourceName; - -/// Initialize ovln:rcv. -Result Initialize(void); - -/// Exit ovln:rcv. -void Exit(void); - -/// Gets the Service object for the actual ovln:rcv service session. -Service* GetServiceSession(void); - -/** - * @brief OpenReceiver - * @param[out] r \ref OvlnReceiver - */ -Result OpenReceiver(OvlnReceiver *r); - -/** - * @brief CloseReceiver - * @param[in] r \ref OvlnReceiver - */ -void CloseReceiver(OvlnReceiver *r); - -/** - * @brief AddSource - * @param[in] r \ref OvlnReceiver - * @param[in] name \ref OvlnSourceName - */ -Result AddSource(OvlnReceiver *r, const OvlnSourceName *name); - -/** - * @brief RemoveSource - * @param[in] r \ref OvlnReceiver - * @param[in] name \ref OvlnSourceName - */ -Result RemoveSource(OvlnReceiver *r, const OvlnSourceName *name); - -/** - * @brief GetReceiveEventHandle - * @param[in] r \ref OvlnReceiver - * @param[out] out_event Output Event with autoclear=true. - */ -Result GetReceiveEventHandle(OvlnReceiver *r, Event* out_event); - -/** - * @brief Receive - * @param[in] r \ref OvlnReceiver - * @param[out] message \ref OvlnRawMessage - */ -Result Receive(OvlnReceiver *r, OvlnRawMessage *message); - -/** - * @brief ReceiveWithTick - * @param[in] r \ref OvlnReceiver - * @param[out] message \ref OvlnRawMessage - * @param[out] tick System tick. - */ -Result ReceiveWithTick(OvlnReceiver *r, OvlnRawMessage *message, s64 *tick); - -} // namespace ovlnrcv - -/// @brief C++ wrappers for the `ovlnsnd` API. -/// @details Wraps: switch/services/ovln.h. -namespace ovlnsnd { - -/// EnqueuePosition -using ::OvlnEnqueuePosition; -/// OverflowOption -using ::OvlnOverflowOption; -/// QueueAttribute -using ::OvlnQueueAttribute; -/// RawMessage -using ::OvlnRawMessage; -/// Receiver -using ::OvlnReceiver; -/// Sender -using ::OvlnSender; -/// SendOption -using ::OvlnSendOption; -/// SourceName -using ::OvlnSourceName; - -/// Initialize ovln:snd. -Result Initialize(void); - -/// Exit ovln:snd. -void Exit(void); - -/// Gets the Service object for the actual ovln:snd service session. -Service* GetServiceSession(void); - -/** - * @brief OpenSender - * @param[in] s \ref OvlnSender - * @param[in] name \ref OvlnSourceName - * @param[in] attribute \ref OvlnQueueAttribute - */ -Result OpenSender(OvlnSender *s, const OvlnSourceName *name, OvlnQueueAttribute attribute); - -/** - * @brief CloseSender - * @param[in] s \ref OvlnSender - */ -void CloseSender(OvlnSender *s); - -/** - * @brief Send - * @param[in] s \ref OvlnSender - * @param[in] option \ref OvlnSendOption - * @param[in] message \ref OvlnRawMessage - */ -Result Send(OvlnSender *s, OvlnSendOption option, const OvlnRawMessage *message); - -/** - * @brief GetUnreceivedMessageCount - * @param[in] s \ref OvlnSender - * @param[out] count number of unreceived messages. - */ -Result GetUnreceivedMessageCount(OvlnSender *s, u32 *count); - -} // namespace ovlnsnd - -/// @brief C++ wrappers for the `pad` API. -/// @details Wraps: switch/runtime/pad.h. -namespace pad { - -/// Pad button repeater state object. -using ::PadRepeater; -/// Pad state object. -using ::PadState; - -/** - * @brief Configures the input layout supported by the application. - * @param[in] max_players The maximum supported number of players (1 to 8). - * @param[in] style_set Bitfield of supported controller styles (see \ref HidNpadStyleTag). - */ -void ConfigureInput(u32 max_players, u32 style_set); - -/** - * @brief Same as \ref padInitialize, but taking a bitfield of controller IDs directly. - * @param[in] pad Pointer to \ref PadState. - * @param[in] mask Bitfield of controller IDs (each bit's position indicates a different \ref HidNpadIdType value). - */ -void InitializeWithMask(PadState* pad, u64 mask); - -/** - * @brief Same as \ref padInitialize, but including every single controller input source. - * @param[in] pad Pointer to \ref PadState. - * @remark Use this function if you want to accept input from any controller. - */ -void InitializeAny(PadState* pad); - -/** - * @brief Same as \ref padInitialize, but including \ref HidNpadIdType_No1 and \ref HidNpadIdType_Handheld. - * @param[in] pad Pointer to \ref PadState. - * @remark Use this function if you just want to accept input for a single-player application. - */ -void InitializeDefault(PadState* pad); - -/** - * @brief Updates pad state by reading from the controller input sources specified during initialization. - * @param[in] pad Pointer to \ref PadState. - */ -void Update(PadState* pad); - -/** - * @brief Retrieves whether \ref HidNpadIdType_Handheld is an active input source (i.e. it was possible to read from it). - * @param[in] pad Pointer to \ref PadState. - * @return Boolean value. - * @remark \ref padUpdate must have been previously called. - */ -bool IsHandheld(const PadState* pad); - -/** - * @brief Retrieves whether the specified controller is an active input source (i.e. it was possible to read from it). - * @param[in] pad Pointer to \ref PadState. - * @param[in] id ID of the controller input source (see \ref HidNpadIdType) - * @return Boolean value. - * @remark \ref padUpdate must have been previously called. - */ -bool IsNpadActive(const PadState* pad, HidNpadIdType id); - -/** - * @brief Retrieves the set of input styles supported by the selected controller input sources. - * @param[in] pad Pointer to \ref PadState. - * @return Bitfield of \ref HidNpadStyleTag. - * @remark \ref padUpdate must have been previously called. - */ -u32 GetStyleSet(const PadState* pad); - -/** - * @brief Retrieves the set of attributes reported by the system for the selected controller input sources. - * @param[in] pad Pointer to \ref PadState. - * @return Bitfield of \ref HidNpadAttribute. - * @remark \ref padUpdate must have been previously called. - */ -u32 GetAttributes(const PadState* pad); - -/** - * @brief Retrieves whether any of the selected controller input sources is connected. - * @param[in] pad Pointer to \ref PadState. - * @return Boolean value. - * @remark \ref padUpdate must have been previously called. - */ -bool IsConnected(const PadState* pad); - -/** - * @brief Retrieves the current set of pressed buttons across all selected controller input sources. - * @param[in] pad Pointer to \ref PadState. - * @return Bitfield of \ref HidNpadButton. - * @remark \ref padUpdate must have been previously called. - */ -u64 GetButtons(const PadState* pad); - -/** - * @brief Retrieves the set of buttons that are newly pressed. - * @param[in] pad Pointer to \ref PadState. - * @return Bitfield of \ref HidNpadButton. - * @remark \ref padUpdate must have been previously called. - */ -u64 GetButtonsDown(const PadState* pad); - -/** - * @brief Retrieves the set of buttons that are newly released. - * @param[in] pad Pointer to \ref PadState. - * @return Bitfield of \ref HidNpadButton. - * @remark \ref padUpdate must have been previously called. - */ -u64 GetButtonsUp(const PadState* pad); - -/** - * @brief Retrieves the position of an analog stick in a controller. - * @param[in] pad Pointer to \ref PadState. - * @param[in] i ID of the analog stick to read (0=left, 1=right). - * @return \ref HidAnalogStickState. - * @remark \ref padUpdate must have been previously called. - */ -HidAnalogStickState GetStickPos(const PadState* pad, unsigned i); - -/** - * @brief Retrieves the position of an analog trigger in a GameCube controller. - * @param[in] pad Pointer to \ref PadState. - * @param[in] i ID of the analog trigger to read (0=left, 1=right). - * @return Analog trigger position (range is 0 to 0x7fff). - * @remark \ref padUpdate must have been previously called. - * @remark \ref HidNpadStyleTag_NpadGc must have been previously configured as a supported style in \ref padConfigureInput for GC trigger data to be readable. - */ -u32 GetGcTriggerPos(const PadState* pad, unsigned i); - -/** - * @brief Initializes a \ref PadRepeater object with the specified settings. - * @param[in] r Pointer to \ref PadRepeater. - * @param[in] delay Number of input updates between button presses being first detected and them being considered for repeat. - * @param[in] repeat Number of input updates between autogenerated repeat button presses. - */ -void RepeaterInitialize(PadRepeater* r, u16 delay, u16 repeat); - -/** - * @brief Updates pad repeat state. - * @param[in] r Pointer to \ref PadRepeater. - * @param[in] button_mask Bitfield of currently pressed \ref HidNpadButton that will be considered for repeat. - */ -void RepeaterUpdate(PadRepeater* r, u64 button_mask); - -/** - * @brief Retrieves the set of buttons that are being repeated according to the parameters specified in \ref padRepeaterInitialize. - * @param[in] r Pointer to \ref PadRepeater. - * @return Bitfield of \ref HidNpadButton. - * @remark It is suggested to bitwise-OR the return value of this function with that of \ref padGetButtonsDown. - */ -u64 RepeaterGetButtons(const PadRepeater* r); - -} // namespace pad - -/// @brief C++ wrappers for the `parcel` API. -/// @details Wraps: switch/display/parcel.h. -namespace parcel { - -using ::Parcel; -using ::ParcelHeader; - -void Create(Parcel *ctx); - -Result Transact(Binder *session, u32 code, Parcel *in_parcel, Parcel *reply_parcel); - -void* WriteData(Parcel *ctx, const void* data, size_t data_size); - -void* ReadData(Parcel *ctx, void* data, size_t data_size); - -void WriteInt32(Parcel *ctx, s32 val); - -void WriteUInt32(Parcel *ctx, u32 val); - -void WriteString16(Parcel *ctx, const char *str); - -s32 ReadInt32(Parcel *ctx); - -u32 ReadUInt32(Parcel *ctx); - -void WriteInterfaceToken(Parcel *ctx, const char *str); - -void* ReadFlattenedObject(Parcel *ctx, size_t *size); - -void* WriteFlattenedObject(Parcel *ctx, const void* data, size_t size); - -} // namespace parcel - -/// @brief C++ wrappers for the `pctl` API. -/// @details Wraps: switch/services/pctl.h. -namespace pctl { - -using ::PctlRestrictionSettings; - -/// Initialize pctl. -Result Initialize(void); - -/// Exit pctl. -void Exit(void); - -/// Gets the Service object for the actual pctl service session. -Service* GetServiceSession(void); - -/// Gets the Service object for IParentalControlService. -Service* GetServiceSession_Service(void); - -/// Gets whether Parental Controls restrictions are temporarily unlocked. -Result IsRestrictionTemporaryUnlocked(bool *flag); - -/// Confirm whether VrMode is allowed. Only available with [4.0.0+]. -Result ConfirmStereoVisionPermission(void); - -/// Gets whether Parental Controls are enabled. -Result IsRestrictionEnabled(bool *flag); - -/// Gets whether Parental Controls are enabled. -Result GetSafetyLevel(u32 *safety_level); - -/// Returns the current restrictions settings. -Result GetCurrentSettings(PctlRestrictionSettings *settings); - -/// Gets the count of applications that have free communication. -Result GetFreeCommunicationApplicationListCount(u32 *count); - -/// Reset the confirmation done by \ref pctlConfirmStereoVisionPermission. Only available with [5.0.0+]. -Result ResetConfirmedStereoVisionPermission(void); - -/// Gets whether VrMode is allowed. Only available with [5.0.0+]. -Result IsStereoVisionPermitted(bool *flag); - -/// Confirm whether pairing is active. -Result IsPairingActive(bool *flag); - -/// Returns the synchronization event. -Result GetSynchronizationEvent(Event* out_event); - -/// Returns the supension event. -Result GetPlayTimerEventToRequestSuspension(Event* out_event); - -/// Confirm whether play timer alarm is disabled. Only available with [4.0.0+]. -Result IsPlayTimerAlarmDisabled(bool *flag); - -/// Returns the unlinked event. -Result GetUnlinkedEvent(Event* out_event); - -} // namespace pctl - -/// @brief C++ wrappers for the `pctlauth` API. -/// @details Wraps: switch/applets/pctlauth.h. -namespace pctlauth { - -/// Input arg storage for the applet. -using ::PctlAuthArg; -/// Type values for PctlAuthArg::type. -using ::PctlAuthType; - -/** - * @brief Launches the applet. - * @note Should not be used if a PIN is not already registered. See \ref pctlIsRestrictionEnabled. - * @param flag Input flag. false = temporarily disable Parental Controls. true = validate the input PIN. - */ -Result Show(bool flag); - -/** - * @brief Launches the applet. Only available with [4.0.0+]. - * @param arg0 Value for PctlAuthArg.arg0. - * @param arg1 Value for PctlAuthArg.arg1. - * @param arg2 Value for PctlAuthArg.arg2. - */ -Result ShowEx(u8 arg0, u8 arg1, u8 arg2); - -/** - * @brief Just calls: pctlauthShowEx(1, 0, 1). Launches the applet for checking the PIN, used when changing system-settings. - * @note Should not be used if a PIN is not already registered. See \ref pctlIsRestrictionEnabled. - */ -Result ShowForConfiguration(void); - -/** - * @brief Launches the applet for registering the Parental Controls PIN. - */ -Result RegisterPasscode(void); - -/** - * @brief Launches the applet for changing the Parental Controls PIN. - * @note Should not be used if a PIN is not already registered. See \ref pctlIsRestrictionEnabled. - */ -Result ChangePasscode(void); - -} // namespace pctlauth - -/// @brief C++ wrappers for the `pcv` API. -/// @details Wraps: switch/services/pcv.h. -namespace pcv { - -using ::PcvClockRatesListType; -using ::PcvModule; -/// Module id returned by [8.0.0+] pcv services -/// See also: https://switchbrew.org/wiki/PCV_services#Modules -using ::PcvModuleId; - -/// Initialize pcv. -Result Initialize(void); - -/// Exit pcv. -void Exit(void); - -/// Gets the Service object for the actual pcv service session. -Service* GetServiceSession(void); - -Result GetModuleId(PcvModuleId *module_id, PcvModule module); - -/// Only available on [1.0.0-7.0.1]. -Result GetClockRate(PcvModule module, u32 *out_hz); - -/// Only available on [1.0.0-7.0.1]. -Result SetClockRate(PcvModule module, u32 hz); - -/// Only available on [1.0.0-7.0.1]. -Result SetVoltageEnabled(u32 power_domain, bool state); - -/// Only available on [1.0.0-7.0.1]. -Result GetVoltageEnabled(bool *isEnabled, u32 power_domain); - -/// Only available on [1.0.0-7.0.1]. -Result GetPossibleClockRates(PcvModule module, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count); - -} // namespace pcv - -/// @brief C++ wrappers for the `pdm` API. -/// @details Wraps: switch/services/pdm.h. -namespace pdm { - -/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed. -using ::PdmAccountEvent; -/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed. -using ::PdmAccountEventV10; -/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed. -using ::PdmAccountEventV3; -/// AccountPlayEvent. -/// This is the raw entry struct directly read from FS, without any entry filtering. This is separate from \ref PdmPlayEvent. -using ::PdmAccountPlayEvent; -/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1]. -using ::PdmAppletEvent; -/// AppletEventType -using ::PdmAppletEventType; -/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed. -/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00. -/// See \ref pdmPlayTimestampToPosix. -using ::PdmAppletEventV1; -/// ApplicationPlayStatistics -using ::PdmApplicationPlayStatistics; -/// LastPlayTime. -/// This contains data from the last time the application was played. -using ::PdmLastPlayTime; -/// PlayEvent. -/// This is the raw entry struct directly read from FS, without any entry filtering. -using ::PdmPlayEvent; -/// PlayEventType -using ::PdmPlayEventType; -/// PlayLogPolicy -using ::PdmPlayLogPolicy; -/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1]. -using ::PdmPlayStatistics; -/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed. -using ::PdmPlayStatisticsV1; - -/** - * @brief Helper function which converts a Play timestamp from the Pdm*Event structs to POSIX. - * @param[in] timestamp Input timestamp. - */ -u64 PlayTimestampToPosix(u32 timestamp); - -} // namespace pdm - -/// @brief C++ wrappers for the `pdmqry` API. -/// @details Wraps: switch/services/pdm.h. -namespace pdmqry { - -/// AccountEvent. AccountEvent for [16.0.0+], converted from the older structs when needed. -using ::PdmAccountEvent; -/// AccountEventV10. AccountEvent for [10.0.0-15.0.1], converted to \ref PdmAccountEvent when needed. -using ::PdmAccountEventV10; -/// AccountEventV3. AccountEvent for [3.0.0-9.2.0], converted to \ref PdmAccountEvent when needed. -using ::PdmAccountEventV3; -/// AccountPlayEvent. -/// This is the raw entry struct directly read from FS, without any entry filtering. This is separate from \ref PdmPlayEvent. -using ::PdmAccountPlayEvent; -/// AppletEvent. AppletEvent for [16.0.0+], converted from \ref PdmAppletEventV1 on [1.0.0-15.0.1]. -using ::PdmAppletEvent; -/// AppletEventType -using ::PdmAppletEventType; -/// AppletEventV1. AppletEvent for [1.0.0-15.0.1], converted to \ref PdmAppletEvent when needed. -/// Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00:00. -/// See \ref pdmPlayTimestampToPosix. -using ::PdmAppletEventV1; -/// ApplicationPlayStatistics -using ::PdmApplicationPlayStatistics; -/// LastPlayTime. -/// This contains data from the last time the application was played. -using ::PdmLastPlayTime; -/// PlayEvent. -/// This is the raw entry struct directly read from FS, without any entry filtering. -using ::PdmPlayEvent; -/// PlayEventType -using ::PdmPlayEventType; -/// PlayLogPolicy -using ::PdmPlayLogPolicy; -/// PlayStatistics. PlayStatistics for [16.0.0+], converted from \ref PdmPlayStatisticsV1 on [1.0.0-15.0.1]. -using ::PdmPlayStatistics; -/// PlayStatisticsV1. PlayStatistics for [1.0.0-15.0.1], converted to \ref PdmPlayStatistics when needed. -using ::PdmPlayStatisticsV1; - -/// Initialize pdm:qry. -Result Initialize(void); - -/// Exit pdm:qry. -void Exit(void); - -/// Gets the Service object for the actual pdm:qry service session. -Service* GetServiceSession(void); - -/** - * @brief Gets a list of \ref PdmAppletEvent. - * @param[in] entry_index Start entry index. - * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. - * @param[out] events Output \ref PdmAppletEvent array. - * @param[in] count Max entries in the output array. - * @param[out] total_out Total output entries. - */ -Result QueryAppletEvent(s32 entry_index, bool flag, PdmAppletEvent *events, s32 count, s32 *total_out); - -/** - * @brief Gets \ref PdmPlayStatistics for the specified ApplicationId. - * @param[in] application_id ApplicationId - * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. - * @param[out] stats \ref PdmPlayStatistics - */ -Result QueryPlayStatisticsByApplicationId(u64 application_id, bool flag, PdmPlayStatistics *stats); - -/** - * @brief Gets \ref PdmPlayStatistics for the specified ApplicationId and account userId. - * @param[in] application_id ApplicationId - * @param[in] uid \ref AccountUid - * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. - * @param[out] stats \ref PdmPlayStatistics - */ -Result QueryPlayStatisticsByApplicationIdAndUserAccountId(u64 application_id, AccountUid uid, bool flag, PdmPlayStatistics *stats); - -/** - * @brief Gets \ref PdmLastPlayTime for the specified applications. - * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. - * @param[out] playtimes Output \ref PdmLastPlayTime array. - * @param[in] application_ids Input ApplicationIds array. - * @param[in] count Total entries in the input/output arrays. - * @param[out] total_out Total output entries. - */ -Result QueryLastPlayTime(bool flag, PdmLastPlayTime *playtimes, const u64 *application_ids, s32 count, s32 *total_out); - -/** - * @brief Gets a list of \ref PdmPlayEvent. - * @param[in] entry_index Start entry index. - * @param[out] events Output \ref PdmPlayEvent array. - * @param[in] count Max entries in the output array. - * @param[out] total_out Total output entries. - */ -Result QueryPlayEvent(s32 entry_index, PdmPlayEvent *events, s32 count, s32 *total_out); - -/** - * @brief Gets range fields which can then be used with the other pdmqry funcs, except for \ref pdmqryQueryAccountPlayEvent. - * @param[out] total_entries Total entries. - * @param[out] start_entry_index Start entry index. - * @param[out] end_entry_index End entry index. - */ -Result GetAvailablePlayEventRange(s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index); - -/** - * @brief Gets a list of \ref PdmAccountEvent. - * @note Only available with [3.0.0+]. - * @param[in] entry_index Start entry index. - * @param[out] events Output \ref PdmAccountEvent array. - * @param[in] count Max entries in the output array. - * @param[out] total_out Total output entries. - */ -Result QueryAccountEvent(s32 entry_index, PdmAccountEvent *events, s32 count, s32 *total_out); - -/** - * @brief Gets a list of \ref PdmAccountPlayEvent. - * @note Only available with [4.0.0+]. - * @param[in] entry_index Start entry index. - * @param[in] uid \ref AccountUid - * @param[out] events Output \ref PdmAccountPlayEvent array. - * @param[in] count Max entries in the output array. - * @param[out] total_out Total output entries. - */ -Result QueryAccountPlayEvent(s32 entry_index, AccountUid uid, PdmAccountPlayEvent *events, s32 count, s32 *total_out); - -/** - * @brief Gets range fields which can then be used with \ref pdmqryQueryAccountPlayEvent. - * @param[in] uid \ref AccountUid - * @param[out] total_entries Total entries. - * @param[out] start_entry_index Start entry index. - * @param[out] end_entry_index End entry index. - */ -Result GetAvailableAccountPlayEventRange(AccountUid uid, s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index); - -/** - * @brief Gets a list of applications played by the specified user. - * @note Only available with [6.0.0-14.1.2]. - * @param[in] uid \ref AccountUid - * @param[in] flag [10.0.0+] Whether to additionally allow using entries with ::PdmPlayLogPolicy_Unknown3. - * @param[out] application_ids Output ApplicationIds array. - * @param[in] count Max entries in the output array. - * @param[out] total_out Total output entries. - */ -Result QueryRecentlyPlayedApplication(AccountUid uid, bool flag, u64 *application_ids, s32 count, s32 *total_out); - -/** - * @brief Gets an Event which is signaled when logging a new \ref PdmPlayEvent which would be available via \ref pdmqryQueryAccountEvent, where PdmPlayEvent::event_data::account::type is 0. - * @note Only available with [6.0.0-14.1.2]. - * @note The Event must be closed by the user once finished with it. - * @param[out] out_event Output Event with autoclear=false. - */ -Result GetRecentlyPlayedApplicationUpdateEvent(Event* out_event); - -} // namespace pdmqry - -/// @brief C++ wrappers for the `pgl` API. -/// @details Wraps: switch/services/pgl.h. -namespace pgl { - -using ::PglEventObserver; -/// LaunchFlag -using ::PglLaunchFlag; -using ::PglProgramLaunchProperty; -/// SnapShotDumpType -using ::PglSnapShotDumpType; - -/// Initialize pgl. -Result Initialize(void); - -/// Exit pgl. -void Exit(void); - -/// Gets the Service object for the actual pgl service session. Requires < 12.0.0 -Service* GetServiceSessionCmif(void); - -/// Gets the TipcService object for the actual pgl service session. Requires 12.0.0+ -TipcService* GetServiceSessionTipc(void); - -Result LaunchProgram(u64 *out_pid, const NcmProgramLocation *loc, u32 pm_launch_flags, u8 pgl_launch_flags); - -Result TerminateProcess(u64 pid); - -Result LaunchProgramFromHost(u64 *out_pid, const char *content_path, u32 pm_launch_flags); - -Result GetHostProgramLaunchProperty(PglProgramLaunchProperty *out, const char *content_path); - -Result GetRunningApplicationProcessId(u64 *out_pid); - -Result BoostSystemMemoryResourceLimit(u64 size); - -Result IsRunningProcess(bool *out, u64 pid); - -Result EnableApplicationCrashReport(bool en); - -Result IsApplicationCrashReportEnabled(bool *out); - -Result EnableApplicationAllThreadDumpOnCrash(bool en); - -Result GetProcessId(u64 *out_pid, u64 program_id); - -///< [19.0.0+] -Result TriggerSnapShotDumper(PglSnapShotDumpType dump_type, const char *arg); - -///< [10.0.0-11.0.1] -Result CreateShellEvent(PglEventObserver *out); - -Result EnableApplicationCrashReport2(u64 pid, bool en); - -///< [23.0.0+] -Result EventObserverGetShellEvent(PglEventObserver *observer, Event *out); - -Result EventObserverGetShellEventInfo(PglEventObserver *observer, PmProcessEventInfo *out); - -void EventObserverClose(PglEventObserver *observer); - -} // namespace pgl - -/// @brief C++ wrappers for the `pl` API. -/// @details Wraps: switch/services/pl.h. -namespace pl { - -/// FontData -using ::PlFontData; -using ::PlServiceType; -/// SharedFontType -using ::PlSharedFontType; - -/// Initialize pl. -Result Initialize(PlServiceType service_type); - -/// Exit pl. -void Exit(void); - -/// Gets the Service object for the actual pl service session. -Service* GetServiceSession(void); - -/// Gets the address of the SharedMemory. -void* GetSharedmemAddr(void); - -///< Gets a specific shared-font via \ref PlSharedFontType. -Result GetSharedFontByType(PlFontData* font, PlSharedFontType SharedFontType); - -///< Gets shared font(s). -Result GetSharedFont(u64 LanguageCode, PlFontData* fonts, s32 max_fonts, s32* total_fonts); - -} // namespace pl - -/// @brief C++ wrappers for the `pmbm` API. -/// @details Wraps: switch/services/pm.h. -namespace pmbm { - -/// BootMode -using ::PmBootMode; -/// LaunchFlag -using ::PmLaunchFlag; -/// ProcessEvent -using ::PmProcessEvent; -/// ProcessEventInfo -using ::PmProcessEventInfo; -/// ResourceLimitValues -using ::PmResourceLimitValues; - -/// Initialize pm:bm. -Result Initialize(void); - -/// Exit pm:bm. -void Exit(void); - -/// Gets the Service object for the actual pm:bm service session. -Service* GetServiceSession(void); - -/** - * @brief Gets the \ref PmBootMode. - * @param[out] out \ref PmBootMode - */ -Result GetBootMode(PmBootMode *out); - -/** - * @brief Sets the \ref PmBootMode to ::PmBootMode_Maintenance. - */ -Result SetMaintenanceBoot(void); - -} // namespace pmbm - -/// @brief C++ wrappers for the `pmdmnt` API. -/// @details Wraps: switch/services/pm.h. -namespace pmdmnt { - -/// BootMode -using ::PmBootMode; -/// LaunchFlag -using ::PmLaunchFlag; -/// ProcessEvent -using ::PmProcessEvent; -/// ProcessEventInfo -using ::PmProcessEventInfo; -/// ResourceLimitValues -using ::PmResourceLimitValues; - -/// Initialize pm:dmnt. -Result Initialize(void); - -/// Exit pm:dmnt. -void Exit(void); - -/// Gets the Service object for the actual pm:dmnt service session. -Service* GetServiceSession(void); - -Result GetJitDebugProcessIdList(u32* out_count, u64* out_pids, size_t max_pids); - -Result StartProcess(u64 pid); - -Result GetProcessId(u64* pid_out, u64 program_id); - -Result HookToCreateProcess(Event* out, u64 program_id); - -Result GetApplicationProcessId(u64* pid_out); - -Result HookToCreateApplicationProcess(Event* out); - -Result ClearHook(u32 which); - -Result GetProgramId(u64* program_id_out, u64 pid); - -} // namespace pmdmnt - -/// @brief C++ wrappers for the `pminfo` API. -/// @details Wraps: switch/services/pm.h. -namespace pminfo { - -/// BootMode -using ::PmBootMode; -/// LaunchFlag -using ::PmLaunchFlag; -/// ProcessEvent -using ::PmProcessEvent; -/// ProcessEventInfo -using ::PmProcessEventInfo; -/// ResourceLimitValues -using ::PmResourceLimitValues; - -/// Initialize pm:info. -Result Initialize(void); - -/// Exit pm:info. -void Exit(void); - -/// Gets the Service object for the actual pm:info service session. -Service* GetServiceSession(void); - -Result GetProgramId(u64* program_id_out, u64 pid); - -Result GetAppletCurrentResourceLimitValues(PmResourceLimitValues* out); - -Result GetAppletPeakResourceLimitValues(PmResourceLimitValues* out); - -} // namespace pminfo - -/// @brief C++ wrappers for the `pmshell` API. -/// @details Wraps: switch/services/pm.h. -namespace pmshell { - -/// BootMode -using ::PmBootMode; -/// LaunchFlag -using ::PmLaunchFlag; -/// ProcessEvent -using ::PmProcessEvent; -/// ProcessEventInfo -using ::PmProcessEventInfo; -/// ResourceLimitValues -using ::PmResourceLimitValues; - -/// Initialize pm:shell. -Result Initialize(void); - -/// Exit pm:shell. -void Exit(void); - -/// Gets the Service object for the actual pm:shell service session. -Service* GetServiceSession(void); - -Result LaunchProgram(u32 launch_flags, const NcmProgramLocation *location, u64 *pid); - -Result TerminateProcess(u64 processID); - -Result TerminateProgram(u64 program_id); - -Result GetProcessEventHandle(Event* out); - -Result GetProcessEventInfo(PmProcessEventInfo* out); - -Result CleanupProcess(u64 pid); - -Result ClearJitDebugOccured(u64 pid); - -Result NotifyBootFinished(void); - -Result GetApplicationProcessIdForShell(u64* pid_out); - -Result BoostSystemMemoryResourceLimit(u64 boost_size); - -Result BoostApplicationThreadResourceLimit(void); - -Result BoostSystemThreadResourceLimit(void); - -Result GetProcessId(u64* pid_out, u64 program_id); - -} // namespace pmshell - -/// @brief C++ wrappers for the `psc` API. -/// @details Wraps: switch/services/psc.h. -namespace psc { - -using ::PscPmModule; -using ::PscPmModuleId; -using ::PscPmState; - -Result PmModuleGetRequest(PscPmModule *module, PscPmState *out_state, u32 *out_flags); - -Result PmModuleAcknowledge(PscPmModule *module, PscPmState state); - -Result PmModuleFinalize(PscPmModule *module); - -void PmModuleClose(PscPmModule *module); - -} // namespace psc - -/// @brief C++ wrappers for the `pscm` API. -/// @details Wraps: switch/services/psc.h. -namespace pscm { - -using ::PscPmModule; -using ::PscPmModuleId; -using ::PscPmState; - -/// Initialize psc:m. -Result Initialize(void); - -/// Exit psc:m. -void Exit(void); - -/// Gets the Service object for the actual psc:m service session. -Service* GetServiceSession(void); - -Result GetPmModule(PscPmModule *out, PscPmModuleId module_id, const u32 *dependencies, size_t dependency_count, bool autoclear); - -} // namespace pscm - -/// @brief C++ wrappers for the `psel` API. -/// @details Wraps: switch/applets/psel.h. -namespace psel { - -/// NintendoAccountStartupDialogType -using ::PselNintendoAccountStartupDialogType; -/// playerSelect UI modes. -using ::PselUiMode; -/// Return data sent after execution. -using ::PselUiReturnArg; -/// UI settings for versions starting with 0x10000. -using ::PselUiSettings; -/// Base UI settings for playerSelect. -using ::PselUiSettingsV1; -/// UI message text to display with ::PselUiMode_UserSelector. Invalid values are handled as ::PselUserSelectionPurpose_General. -using ::PselUserSelectionPurpose; -/// UserSelectionSettings -using ::PselUserSelectionSettings; -/// [2.0.0+] UserSelectionSettingsForSystemService -using ::PselUserSelectionSettingsForSystemService; - -/** - * @brief Creates a new UI config for the playerSelect applet with the specified mode. - * @param ui PseluiSettings struct. - * @param mode playerSelect UI mode. - */ -Result UiCreate(PselUiSettings *ui, PselUiMode mode); - -/** - * @brief Adds an user to the user list of the applet. - * @param ui PselUiSettings struct. - * @param[in] user_id user ID. - * @note The users will be treated as invalid users for user selection mode, and as the input user for other modes. - */ -void UiAddUser(PselUiSettings *ui, AccountUid user_id); - -/** - * @brief Sets whether users can be created in the applet. - * @param ui PselUiSettings struct. - * @param flag Flag value. - * @note Only used for ::PselUiMode_SelectUser. - */ -void UiSetAllowUserCreation(PselUiSettings *ui, bool flag); - -/** - * @brief Sets whether users need to be linked to a Nintendo account. - * @param ui PselUiSettings struct. - * @param flag Flag value. - */ -void UiSetNetworkServiceRequired(PselUiSettings *ui, bool flag); - -/** - * @brief Sets whether selection can be skipped with a button. - * @param ui PselUiSettings struct. - * @param flag Flag value. - */ -void UiSetSkipButtonEnabled(PselUiSettings *ui, bool flag); - -/** - * @brief Shows the applet with the specified UI settings. - * @param ui PselUiSettings struct. - * @param out_user Selected user ID. - * @note If user skips (see \ref pselUiSetSkipEnabled) this will return successfully but the output ID will be 0. - */ -Result UiShow(PselUiSettings *ui, AccountUid *out_user); - -/** - * @brief This is the System version of \ref pselShowUserSelector. - * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled. - * @param[out] out_user Returned selected user ID. - * @param[in] settings \ref PselUserSelectionSettings - * @param[in] settings_system [2.0.0+] \ref PselUserSelectionSettingsForSystemService, ignored on prior versions. - */ -Result ShowUserSelectorForSystem(AccountUid *out_user, const PselUserSelectionSettings *settings, const PselUserSelectionSettingsForSystemService *settings_system); - -/** - * @brief This is the Launcher version of \ref pselShowUserSelector. - * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled. - * @param[out] out_user Returned selected user ID. - * @param[in] settings \ref PselUserSelectionSettings - * @param[in] application_id ApplicationId - */ -Result ShowUserSelectorForLauncher(AccountUid *out_user, const PselUserSelectionSettings *settings, u64 application_id); - -/** - * @brief Shows the applet to select a user. - * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. See also the docs for PselUserSelectionSettings::is_skip_enabled. - * @param[out] out_user Returned selected user ID. - * @param[in] settings \ref PselUserSelectionSettings - */ -Result ShowUserSelector(AccountUid *out_user, const PselUserSelectionSettings *settings); - -/** - * @brief Shows the applet to create a user. - * @note This uses \ref accountIsUserRegistrationRequestPermitted, hence \ref accountInitialize must be used prior to this. If the output flag is 0, an error will be thrown. - */ -Result ShowUserCreator(void); - -/** - * @brief Shows the applet to change a user's icon. - * @param[in] user Input user ID. - */ -Result ShowUserIconEditor(AccountUid user); - -/** - * @brief Shows the applet to change a user's nickname. - * @param[in] user Input user ID. - */ -Result ShowUserNicknameEditor(AccountUid user); - -/** - * @brief Shows the applet to create a user. Used by the starter applet during system setup. - */ -Result ShowUserCreatorForStarter(void); - -/** - * @brief Shows the applet for Nintendo Account Nnid linking. - * @note Only available on [6.0.0+]. - * @param[in] user Input user ID. - */ -Result ShowNintendoAccountNnidLinker(AccountUid user); - -/** - * @brief Shows the applet for UserQualificationPromoter. - * @note Only available on [13.0.0+]. - * @param[in] user Input user ID. - */ -Result ShowUserQualificationPromoter(AccountUid user); - -} // namespace psel - -/// @brief C++ wrappers for the `psm` API. -/// @details Wraps: switch/services/psm.h. -namespace psm { - -/// BatteryChargeInfoFields [17.0.0+] -using ::PsmBatteryChargeInfoFields; -/// BatteryChargeInfoFieldsOld [1.0.0-16.1.0] -using ::PsmBatteryChargeInfoFieldsOld; -/// BatteryVoltageState -using ::PsmBatteryVoltageState; -/// ChargerType -using ::PsmChargerType; -/// IPsmSession -using ::PsmSession; -/// Vdd50State -using ::PsmVdd50State; - -/// Initialize psm. -Result Initialize(void); - -/// Exit psm. -void Exit(void); - -/// Gets the Service object for the actual psm service session. -Service* GetServiceSession(void); - -/** - * @brief GetBatteryChargePercentage - * @param[out] out Battery charge percentage. - */ -Result GetBatteryChargePercentage(u32 *out); - -/** - * @brief GetChargerType - * @param[out] out \ref PsmChargerType - */ -Result GetChargerType(PsmChargerType *out); - -/** - * @brief EnableBatteryCharging - */ -Result EnableBatteryCharging(void); - -/** - * @brief DisableBatteryCharging - */ -Result DisableBatteryCharging(void); - -/** - * @brief IsBatteryChargingEnabled - * @param[out] out Output flag. - */ -Result IsBatteryChargingEnabled(bool *out); - -/** - * @brief AcquireControllerPowerSupply - */ -Result AcquireControllerPowerSupply(void); - -/** - * @brief ReleaseControllerPowerSupply - */ -Result ReleaseControllerPowerSupply(void); - -/** - * @brief EnableEnoughPowerChargeEmulation - */ -Result EnableEnoughPowerChargeEmulation(void); - -/** - * @brief DisableEnoughPowerChargeEmulation - */ -Result DisableEnoughPowerChargeEmulation(void); - -/** - * @brief EnableFastBatteryCharging - */ -Result EnableFastBatteryCharging(void); - -/** - * @brief DisableFastBatteryCharging - */ -Result DisableFastBatteryCharging(void); - -/** - * @brief GetBatteryVoltageState - * @param[out] out \ref PsmBatteryVoltageState - */ -Result GetBatteryVoltageState(PsmBatteryVoltageState *out); - -/** - * @brief GetRawBatteryChargePercentage - * @param[out] out Raw battery charge percentage. - */ -Result GetRawBatteryChargePercentage(double *out); - -/** - * @brief IsEnoughPowerSupplied - * @param[out] out Output flag. - */ -Result IsEnoughPowerSupplied(bool *out); - -/** - * @brief GetBatteryAgePercentage - * @param[out] out Battery age percentage. - */ -Result GetBatteryAgePercentage(double *out); - -/** - * @brief GetBatteryChargeInfoEvent - * @param[out] out_event Event object. - * @param[in] autoclear Event autoclear. - */ -Result GetBatteryChargeInfoEvent(Event* out_event, bool autoclear); - -/** - * @brief GetBatteryChargeInfoFields - * @param[out] out_fields \ref PsmBatteryChargeInfoFields - */ -Result GetBatteryChargeInfoFields(PsmBatteryChargeInfoFields *out_fields); - -/** - * @brief GetBatteryChargeCalibratedEvent - * @note Only available on [3.0.0+]. - * @param[out] out_event Event object. - * @param[in] autoclear Event autoclear. - */ -Result GetBatteryChargeCalibratedEvent(Event* out_event, bool autoclear); - -/** - * @brief Wrapper func which opens a PsmSession and handles event setup. - * @note Uses the actual BindStateChangeEvent cmd internally. - * @note The event is not signalled on BatteryChargePercentage changes. - * @param[out] s PsmSession object. - * @param[in] ChargerType Passed to SetChargerTypeChangeEventEnabled. - * @param[in] PowerSupply Passed to SetPowerSupplyChangeEventEnabled. - * @param[in] BatteryVoltage Passed to SetBatteryVoltageStateChangeEventEnabled. - */ -Result BindStateChangeEvent(PsmSession* s, bool ChargerType, bool PowerSupply, bool BatteryVoltage); - -/// Wait on the Event setup by \ref psmBindStateChangeEvent. -Result WaitStateChangeEvent(PsmSession* s, u64 timeout); - -/// Cleanup version of \ref psmBindStateChangeEvent. Must be called by the user once the PsmSession is done being used. -Result UnbindStateChangeEvent(PsmSession* s); - -} // namespace psm - -/// @brief C++ wrappers for the `random` API. -/// @details Wraps: switch/kernel/random.h. -namespace random { - -/** - * @brief Fills a buffer with random data. - * @param buf Pointer to the buffer. - * @param len Size of the buffer in bytes. - */ -void Get(void* buf, size_t len); - -/** - * @brief Returns a random 64-bit value. - * @return Random value. - */ -u64 Get64(void); - -} // namespace random - -/// @brief C++ wrappers for the `resolver` API. -/// @details Wraps: switch/runtime/resolver.h. -namespace resolver { - -/// Fetches the last resolver Switch result code of the current thread. -Result GetLastResult(void); - -/// Retrieves a handle used to cancel the next resolver command on the current thread. -u32 GetCancelHandle(void); - -/// Retrieves whether service discovery is enabled for resolver commands on the current thread. -bool GetEnableServiceDiscovery(void); - -/// [5.0.0+] Retrieves whether the DNS cache is used to resolve queries on the current thread (not implemented). -bool GetEnableDnsCache(void); - -/// Enables or disables service discovery for the current thread. -void SetEnableServiceDiscovery(bool enable); - -/// [5.0.0+] Enables or disables the usage of the DNS cache on the current thread (not implemented). -void SetEnableDnsCache(bool enable); - -/// Cancels a previous resolver command (handle obtained with \ref resolverGetCancelHandle prior to calling the command). -Result Cancel(u32 handle); - -/// [5.0.0+] Removes a hostname from the DNS cache (not implemented). -Result RemoveHostnameFromCache(const char* hostname); - -/// [5.0.0+] Removes an IP address from the DNS cache (not implemented). -Result RemoveIpAddressFromCache(u32 ip); - -} // namespace resolver - -/// @brief C++ wrappers for the `ringcon` API. -/// @details Wraps: switch/runtime/ringcon.h. -namespace ringcon { - -/// Ring-Con state object. -using ::RingCon; -/// Whether the output data is valid. -using ::RingConDataValid; -using ::RingConErrorFlag; -/// Ring-Con firmware version. -using ::RingConFwVersion; -/// Ring-Con manufacturer calibration. -using ::RingConManuCal; -/// Polling data extracted from \ref HidbusJoyPollingReceivedData. -using ::RingConPollingData; -/// Ring-Con user calibration. -using ::RingConUserCal; - -/** - * @brief Creates a \ref RingCon object, and handles the various initialization for it. - * @param c \ref RingCon - * @param[in] id \ref HidNpadIdType. A Ring-Con must be attached to this controller. - */ -Result Create(RingCon *c, HidNpadIdType id); - -/** - * @brief Close a \ref RingCon. - * @param c \ref RingCon - */ -void Close(RingCon *c); - -/** - * @brief Gets the error flags field. - * @param c \ref RingCon - */ -u32 GetErrorFlags(RingCon *c); - -/** - * @brief Gets the value of an error flag, set by \ref ringconSetErrorFlag. - * @param c \ref RingCon - * @param[in] flag \ref RingConErrorFlag - */ -bool GetErrorFlag(RingCon *c, RingConErrorFlag flag); - -/** - * @brief Gets the \ref RingConFwVersion previously loaded by \ref ringconCreate. - * @param c \ref RingCon - * @param[out] out \ref RingConFwVersion - */ -RingConFwVersion GetFwVersion(RingCon *c); - -/** - * @brief Gets the Id previously loaded by \ref ringconCreate. - * @param c \ref RingCon - * @param[out] id_l Id low. - * @param[out] id_h Id high. - */ -void GetId(RingCon *c, u64 *id_l, u64 *id_h); - -/** - * @brief Gets the unk_cal previously loaded by \ref ringconCreate with \ref ringconReadUnkCal. Only valid when the output flag from \ref ringconCmdx00020105 is valid. - * @param c \ref RingCon - */ -s16 GetUnkCal(RingCon *c); - -/** - * @brief Gets the total-push-count previously loaded by \ref ringconCreate. - * @param c \ref RingCon - * @param[out] out total_push_count - */ -s32 GetTotalPushCount(RingCon *c); - -/** - * @brief Gets the \ref RingConManuCal previously loaded by \ref ringconCreate. - * @param c \ref RingCon - * @param[out] out \ref RingConManuCal - */ -void GetManuCal(RingCon *c, RingConManuCal *out); - -/** - * @brief Gets the \ref RingConUserCal previously loaded by \ref ringconCreate. - * @note The Ring-Con UserCal doesn't seem to be calibrated normally? - * @param c \ref RingCon - * @param[out] out \ref RingConUserCal - */ -void GetUserCal(RingCon *c, RingConUserCal *out); - -/** - * @brief Updates the \ref RingConUserCal. - * @note The input \ref RingConUserCal is used with \ref ringconWriteUserCal, and the output from \ref ringconReadUserCal is verified with the input \ref RingConUserCal. This does not update the \ref RingConUserCal returned by \ref ringconGetUserCal. - * @note The Ring-Con UserCal doesn't seem to be calibrated normally? - * @param c \ref RingCon - * @param[in] cal \ref RingConUserCal - */ -Result UpdateUserCal(RingCon *c, RingConUserCal cal); - -/** - * @brief Reads the \ref RingConFwVersion. - * @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetFwVersion instead. - * @param c \ref RingCon - * @param[out] out \ref RingConFwVersion - */ -Result ReadFwVersion(RingCon *c, RingConFwVersion *out); - -/** - * @brief Reads the Id. - * @note This is used internally by \ref ringconCreate. Normally you should use \ref ringconGetId instead. - * @param c \ref RingCon - * @param[out] id_l Id low. - * @param[out] id_h Id high. - */ -Result ReadId(RingCon *c, u64 *id_l, u64 *id_h); - -/** - * @brief Gets the \ref RingConPollingData. Only returns entries which are new since the last time this was called (or if not previously called, all available entries up to count). - * @param c \ref RingCon - * @param[out] out Output array of \ref RingConPollingData. Entry order is newest -> oldest. - * @param[in] count Total size of the out array in entries, max value is 0x9. - * @param[out] total_out Total output entries. - */ -Result GetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32 *total_out); - -/** - * @brief Uses cmd 0x00020105. - * @note Used internally by \ref ringconCreate. - * @param c \ref RingCon - * @param[out] out Output value. - */ -Result Cmdx00020105(RingCon *c, u32 *out); - -/** - * @brief Reads the \ref RingConManuCal. - * @note Used internally by \ref ringconCreate and \ref ringconReadUnkCal. - * @param c \ref RingCon - * @param[out] out \ref RingConManuCal - */ -Result ReadManuCal(RingCon *c, RingConManuCal *out); - -/** - * @brief Gets the unknown value derived from the output of cmd 0x00020504 and \ref ringconReadManuCal. - * @note Used internally by \ref ringconCreate. - * @param c \ref RingCon - * @param[out] out Output value. - */ -Result ReadUnkCal(RingCon *c, s16 *out); - -/** - * @brief Reads the \ref RingConUserCal. - * @note Used internally by \ref ringconCreate and \ref ringconUpdateUserCal. - * @param c \ref RingCon - * @param[out] out \ref RingConUserCal - */ -Result ReadUserCal(RingCon *c, RingConUserCal *out); - -/** - * @brief Reads the rep-count for Multitask Mode. - * @param c \ref RingCon - * @param[out] out Output value. Official sw using this clamps the output to range 0-500. - * @param[out] data_valid \ref RingConDataValid - */ -Result ReadRepCount(RingCon *c, s32 *out, RingConDataValid *data_valid); - -/** - * @brief Reads the total-push-count, for Multitask Mode. - * @note Used internally by \ref ringconCreate. Normally \ref ringconGetTotalPushCount should be used instead. - * @param c \ref RingCon - * @param[out] out Output value. - * @param[out] data_valid \ref RingConDataValid - */ -Result ReadTotalPushCount(RingCon *c, s32 *out, RingConDataValid *data_valid); - -/** - * @brief This resets the value returned by \ref ringconReadRepCount to 0. - * @param c \ref RingCon - */ -Result ResetRepCount(RingCon *c); - -/** - * @brief Writes the \ref RingConUserCal. - * @note Used internally by \ref ringconUpdateUserCal. - * @param c \ref RingCon - * @param[in] cal \ref RingConUserCal - */ -Result WriteUserCal(RingCon *c, RingConUserCal cal); - -} // namespace ringcon - -/// @brief C++ wrappers for the `rmutex` API. -/// @details Wraps: switch/kernel/mutex.h. -namespace rmutex { - -/// Mutex datatype, defined in newlib. -using ::Mutex; -/// Recursive mutex datatype, defined in newlib. -using ::RMutex; - -/** - * @brief Initializes a recursive mutex. - * @param m Recursive mutex object. - * @note A recursive mutex can also be statically initialized by assigning {0,0,0} to it. - */ -void Init(RMutex* m); - -/** - * @brief Locks a recursive mutex. - * @param m Recursive mutex object. - */ -void Lock(RMutex* m); - -/** - * @brief Attempts to lock a recursive mutex without waiting. - * @param m Recursive mutex object. - * @return 1 if the mutex has been acquired successfully, and 0 on contention. - */ -bool TryLock(RMutex* m); - -/** - * @brief Unlocks a recursive mutex. - * @param m Recursive mutex object. - */ -void Unlock(RMutex* m); - -} // namespace rmutex - -/// @brief C++ wrappers for the `ro` API. -/// @details Wraps: switch/services/ro.h. -namespace ro { - -/// Initialize ro:dmnt. Only available with [3.0.0+]. -Result DmntInitialize(void); - -/// Exit ro:dmnt. -void DmntExit(void); - -/// Gets the Service object for the actual ro:dmnt service session. -Service* DmntGetServiceSession(void); - -Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out); - -} // namespace ro - -/// @brief C++ wrappers for the `ro1` API. -/// @details Wraps: switch/services/ro.h. -namespace ro1 { - -/// Initialize ro:1. Only available with [7.0.0+]. -Result Initialize(void); - -/// Exit ro:1. -void Exit(void); - -/// Gets the Service object for the actual ro:1 service session. -Service* GetServiceSession(void); - -Result LoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); - -Result UnloadNro(u64 nro_address); - -Result LoadNrr(u64 nrr_address, u64 nrr_size); - -Result UnloadNrr(u64 nrr_address); - -Result LoadNrrEx(u64 nrr_address, u64 nrr_size); - -} // namespace ro1 - -/// @brief C++ wrappers for the `romfs` API. -/// @details Wraps: switch/runtime/devices/romfs_dev.h. -namespace romfs { - -/// RomFS directory. -using ::romfs_dir; -/// RomFS file. -using ::romfs_file; -/// RomFS header. -using ::romfs_header; - -/** - * @brief Mounts the Application's RomFS. - * @param name Device mount name. - * @remark This function is intended to be used to access one's own RomFS. - * If the application is running as NRO, it mounts the embedded RomFS section inside the NRO. - * If on the other hand it's an NSO, it behaves identically to \ref romfsMountFromCurrentProcess. - */ -Result MountSelf(const char *name); - -/** - * @brief Mounts RomFS from an open file. - * @param file FsFile of the RomFS image. - * @param offset Offset of the RomFS within the file. - * @param name Device mount name. - */ -Result MountFromFile(FsFile file, u64 offset, const char *name); - -/** - * @brief Mounts RomFS from an open storage. - * @param storage FsStorage of the RomFS image. - * @param offset Offset of the RomFS within the storage. - * @param name Device mount name. - */ -Result MountFromStorage(FsStorage storage, u64 offset, const char *name); - -/** - * @brief Mounts RomFS using the current process host program RomFS. - * @param name Device mount name. - */ -Result MountFromCurrentProcess(const char *name); - -/** - * @brief Mounts RomFS of a running program. - * @note Permission needs to be set in the NPDM. - * @param program_id ProgramId to mount. - * @param name Device mount name. - */ -Result MountDataStorageFromProgram(u64 program_id, const char *name); - -/** - * @brief Mounts RomFS from a file path in a mounted fsdev device. - * @param path File path. - * @param offset Offset of the RomFS within the file. - * @param name Device mount name. - */ -Result MountFromFsdev(const char *path, u64 offset, const char *name); - -/** - * @brief Mounts RomFS from SystemData. - * @param dataId SystemDataId to mount. - * @param storageId Storage ID to mount from. - * @param name Device mount name. - */ -Result MountFromDataArchive(u64 dataId, NcmStorageId storageId, const char *name); - -/// Unmounts the RomFS device. -Result Unmount(const char *name); - -/// Wrapper for \ref romfsMountSelf with the default "romfs" device name. -Result Init(void); - -/// Wrapper for \ref romfsUnmount with the default "romfs" device name. -Result Exit(void); - -} // namespace romfs - -/// @brief C++ wrappers for the `rwlock` API. -/// @details Wraps: switch/kernel/rwlock.h. -namespace rwlock { - -/// Read/write lock structure. -using ::RwLock; - -/** - * @brief Initializes the read/write lock. - * @param r Read/write lock object. - */ -void Init(RwLock* r); - -/** - * @brief Locks the read/write lock for reading. - * @param r Read/write lock object. - */ -void ReadLock(RwLock* r); - -/** - * @brief Attempts to lock the read/write lock for reading without waiting. - * @param r Read/write lock object. - * @return 1 if the mutex has been acquired successfully, and 0 on contention. - */ -bool TryReadLock(RwLock* r); - -/** - * @brief Unlocks the read/write lock for reading. - * @param r Read/write lock object. - */ -void ReadUnlock(RwLock* r); - -/** - * @brief Locks the read/write lock for writing. - * @param r Read/write lock object. - */ -void WriteLock(RwLock* r); - -/** - * @brief Attempts to lock the read/write lock for writing without waiting. - * @param r Read/write lock object. - * @return 1 if the mutex has been acquired successfully, and 0 on contention. - */ -bool TryWriteLock(RwLock* r); - -/** - * @brief Unlocks the read/write lock for writing. - * @param r Read/write lock object. - */ -void WriteUnlock(RwLock* r); - -/** - * @brief Checks if the write lock is held by the current thread. - * @param r Read/write lock object. - * @return 1 if the current hold holds the write lock, and 0 if it does not. - */ -bool IsWriteLockHeldByCurrentThread(RwLock* r); - -/** - * @brief Checks if the read/write lock is owned by the current thread. - * @param r Read/write lock object. - * @return 1 if the current hold holds the write lock or if it holds read locks acquired - * while it held the write lock, and 0 if it does not. - */ -bool IsOwnedByCurrentThread(RwLock* r); - -} // namespace rwlock - -/// @brief C++ wrappers for the `semaphore` API. -/// @details Wraps: switch/kernel/semaphore.h. -namespace semaphore { - -/// Semaphore structure. -using ::Semaphore; - -/** - * @brief Initializes a semaphore and its internal counter. - * @param s Semaphore object. - * @param initial_count initial value for internal counter (typically the # of free resources). - */ -void Init(Semaphore *s, u64 initial_count); - -/** - * @brief Increments the Semaphore to allow other threads to continue. - * @param s Semaphore object. - */ -void Signal(Semaphore *s); - -/** - * @brief Decrements Semaphore and waits if 0. - * @param s Semaphore object. - */ -void Wait(Semaphore *s); - -/** - * @brief Attempts to get lock without waiting. - * @param s Semaphore object. - * @return true if no wait and successful lock, false otherwise. - */ -bool TryWait(Semaphore *s); - -} // namespace semaphore - -/// @brief C++ wrappers for the `service` API. -/// @details Wraps: switch/sf/service.h. -namespace service { - -/// Service object structure -using ::Service; -using ::SfBuffer; -using ::SfBufferAttrs; -using ::SfDispatchParams; -using ::SfOutHandleAttr; -using ::SfOutHandleAttrs; - -/** - * @brief Returns whether a service has been initialized. - * @param[in] s Service object. - * @return true if initialized. - */ -bool IsActive(Service* s); - -/** - * @brief Returns whether a service is overriden in the homebrew environment. - * @param[in] s Service object. - * @return true if overriden. - */ -bool IsOverride(Service* s); - -/** - * @brief Returns whether a service is a domain. - * @param[in] s Service object. - * @return true if a domain. - */ -bool IsDomain(Service* s); - -/** - * @brief Returns whether a service is a domain subservice. - * @param[in] s Service object. - * @return true if a domain subservice. - */ -bool IsDomainSubservice(Service* s); - -/** - * @brief For a domain/domain subservice, return the associated object ID. - * @param[in] s Service object, necessarily a domain or domain subservice. - * @return The object ID. - */ -u32 GetObjectId(Service* s); - -/** - * @brief Creates a service object from an IPC session handle. - * @param[out] s Service object. - * @param[in] h IPC session handle. - */ -void Create(Service* s, Handle h); - -/** - * @brief Creates a non-domain subservice object from a parent service. - * @param[out] s Service object. - * @param[in] parent Parent service. - * @param[in] h IPC session handle for this subservice. - */ -void CreateNonDomainSubservice(Service* s, Service* parent, Handle h); - -/** - * @brief Creates a domain subservice object from a parent service. - * @param[out] s Service object. - * @param[in] parent Parent service, necessarily a domain or domain subservice. - * @param[in] object_id Object ID for this subservice. - */ -void CreateDomainSubservice(Service* s, Service* parent, u32 object_id); - -/** - * @brief Closes a service. - * @param[in] s Service object. - */ -void Close(Service* s); - -/** - * @brief Clones a service. - * @param[in] s Service object. - * @param[out] out_s Output service object. - */ -Result Clone(Service* s, Service* out_s); - -/** - * @brief Clones a service with a session manager tag. - * @param[in] s Service object. - * @param[in] tag Session manager tag (unused in current official server code) - * @param[out] out_s Output service object. - */ -Result CloneEx(Service* s, u32 tag, Service* out_s); - -/** - * @brief Converts a regular service to a domain. - * @param[in] s Service object. - * @return Result code. - */ -Result ConvertToDomain(Service* s); - -void RequestFormatProcessBuffer(CmifRequestFormat* fmt, u32 attr); - -void RequestProcessBuffer(CmifRequest* req, const SfBuffer* buf, u32 attr); - -void* MakeRequest(Service* s, u32 request_id, u32 context, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_objects, const Service* const* objects, u32 num_handles, const Handle* handles); - -void ResponseGetHandle(CmifResponse* res, SfOutHandleAttr type, Handle* out); - -Result ParseResponse(Service* s, u32 out_size, void** out_data, u32 num_out_objects, Service* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles); - -Result DispatchImpl(Service* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, SfDispatchParams disp); - -} // namespace service - -/// @brief C++ wrappers for the `sessionmgr` API. -/// @details Wraps: switch/sf/sessionmgr.h. -namespace sessionmgr { - -using ::SessionMgr; - -Result Create(SessionMgr* mgr, Handle root_session, u32 num_sessions); - -void Close(SessionMgr* mgr); - -int AttachClient(SessionMgr* mgr); - -void DetachClient(SessionMgr* mgr, int slot); - -Handle GetClientSession(SessionMgr* mgr, int slot); - -} // namespace sessionmgr - -/// @brief C++ wrappers for the `set` API. -/// @details Wraps: switch/services/set.h. -namespace set { - -using ::ColorSetId; -/// BatteryLot -using ::SetBatteryLot; -using ::SetCalAccelerometerOffset; -using ::SetCalAccelerometerScale; -using ::SetCalAmiiboEcdsaCertificate; -using ::SetCalAmiiboEcqvBlsCertificate; -using ::SetCalAmiiboEcqvBlsKey; -using ::SetCalAmiiboEcqvBlsRootCertificate; -using ::SetCalAmiiboEcqvCertificate; -using ::SetCalAmiiboKey; -using ::SetCalAnalogStickFactoryCalibration; -using ::SetCalAnalogStickModelParameter; -using ::SetCalBdAddress; -using ::SetCalConfigurationId1; -using ::SetCalConsoleSixAxisSensorHorizontalOffset; -using ::SetCalCountryCode; -using ::SetCalEccB233DeviceCertificate; -using ::SetCalEccB233DeviceKey; -using ::SetCalGameCardCertificate; -using ::SetCalGameCardKey; -using ::SetCalGyroscopeOffset; -using ::SetCalGyroscopeScale; -using ::SetCalMacAddress; -using ::SetCalRegionCode; -using ::SetCalRsa2048DeviceCertificate; -using ::SetCalRsa2048DeviceKey; -using ::SetCalSerialNumber; -using ::SetCalSpeakerParameter; -using ::SetCalSslCertificate; -using ::SetCalSslKey; -/// ChineseTraditionalInputMethod -using ::SetChineseTraditionalInputMethod; -/// KeyboardLayout -using ::SetKeyboardLayout; -/// IDs for Language. -using ::SetLanguage; -/// Region codes. -using ::SetRegion; -/// AccessPointSecurityStandard -using ::SetSysAccessPointSecurityStandard; -/// AccessPointSecurityType -using ::SetSysAccessPointSecurityType; -/// AccountNotificationSettings -using ::SetSysAccountNotificationSettings; -/// AccountOnlineStorageSettings -using ::SetSysAccountOnlineStorageSettings; -/// AccountSettings -using ::SetSysAccountSettings; -/// AllowedSslHosts -using ::SetSysAllowedSslHosts; -/// AnalogStickUserCalibration -using ::SetSysAnalogStickUserCalibration; -/// AudioDevice -using ::SetSysAudioDevice; -/// AudioOutputMode -using ::SetSysAudioOutputMode; -/// AudioOutputModeTarget -using ::SetSysAudioOutputModeTarget; -using ::SetSysAudioVolume; -/// AutoSettings -using ::SetSysAutoSettings; -/// BacklightSettings -using ::SetSysBacklightSettings; -/// BacklightSettingsEx -using ::SetSysBacklightSettingsEx; -/// BlePairingSettings -using ::SetSysBlePairingSettings; -/// BlockType -using ::SetSysBlockType; -/// BluetoothDevicesSettings -using ::SetSysBluetoothDevicesSettings; -/// ButtonConfigRegisteredSettings -using ::SetSysButtonConfigRegisteredSettings; -/// ButtonConfigSettings -using ::SetSysButtonConfigSettings; -/// Actually nn::util::Color4u8Type. -using ::SetSysColor4u8Type; -/// ConnectionFlag -using ::SetSysConnectionFlag; -/// ConsoleSixAxisSensorAccelerationBias -using ::SetSysConsoleSixAxisSensorAccelerationBias; -/// ConsoleSixAxisSensorAccelerationGain -using ::SetSysConsoleSixAxisSensorAccelerationGain; -/// ConsoleSixAxisSensorAngularAcceleration -using ::SetSysConsoleSixAxisSensorAngularAcceleration; -/// ConsoleSixAxisSensorAngularVelocityBias -using ::SetSysConsoleSixAxisSensorAngularVelocityBias; -/// ConsoleSixAxisSensorAngularVelocityGain -using ::SetSysConsoleSixAxisSensorAngularVelocityGain; -/// ConsoleSixAxisSensorAngularVelocityTimeBias -using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; -/// ConsoleSleepPlan -using ::SetSysConsoleSleepPlan; -/// ControllerType -using ::SetSysControllerType; -using ::SetSysDataBlock; -/// DataDeletionSettings -using ::SetSysDataDeletionSettings; -/// DeviceNickName -using ::SetSysDeviceNickName; -/// Edid -using ::SetSysEdid; -/// ErrorReportSharePermission -using ::SetSysErrorReportSharePermission; -/// EulaVersion -using ::SetSysEulaVersion; -/// EulaVersionClockType -using ::SetSysEulaVersionClockType; -using ::SetSysExtensionBlock; -/// Structure returned by \ref setsysGetFirmwareVersion. -using ::SetSysFirmwareVersion; -/// Structure returned by \ref setsysGetFirmwareVersionDigest. -using ::SetSysFirmwareVersionDigest; -/// FriendPresenceOverlayPermission -using ::SetSysFriendPresenceOverlayPermission; -/// HandheldSleepPlan -using ::SetSysHandheldSleepPlan; -/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. -using ::SetSysHomeMenuScheme; -/// HostFsMountPoint -using ::SetSysHostFsMountPoint; -/// InitialLaunchSettings -using ::SetSysInitialLaunchSettings; -/// LcdBacklightBrightnessMapping -using ::SetSysLcdBacklightBrightnessMapping; -using ::SetSysModeLine; -/// NetworkSettings -using ::SetSysNetworkSettings; -/// NotificationSettings -using ::SetSysNotificationSettings; -/// NotificationTime -using ::SetSysNotificationTime; -/// NotificationVolume -using ::SetSysNotificationVolume; -/// NxControllerLegacySettings -using ::SetSysNxControllerLegacySettings; -/// NxControllerSettings -using ::SetSysNxControllerSettings; -/// PlatformRegion. Other values not listed here should be handled as "Unknown". -using ::SetSysPlatformRegion; -/// PrimaryAlbumStorage -using ::SetSysPrimaryAlbumStorage; -/// Console Product Models -using ::SetSysProductModel; -/// ProxyFlags -using ::SetSysProxyFlags; -/// PtmCycleCountReliability -using ::SetSysPtmCycleCountReliability; -/// PtmFuelGaugeParameter -using ::SetSysPtmFuelGaugeParameter; -/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. -using ::SetSysRebootlessSystemUpdateVersion; -/// Structure returned by \ref setsysGetSerialNumber. -using ::SetSysSerialNumber; -/// ServiceDiscoveryControlSettings -using ::SetSysServiceDiscoveryControlSettings; -/// SleepSettings -using ::SetSysSleepSettings; -/// ThemeId -using ::SetSysThemeId; -/// ThemeSettings -using ::SetSysThemeSettings; -/// TouchScreenMode, for "Touch-Screen Sensitivity". -using ::SetSysTouchScreenMode; -/// TvSettings -using ::SetSysTvSettings; -/// UserSelectorFlag -using ::SetSysUserSelectorFlag; -/// UserSelectorSettings -using ::SetSysUserSelectorSettings; - -/// Initialize set. -Result Initialize(void); - -/// Exit set. -void Exit(void); - -/// Gets the Service object for the actual set service session. -Service* GetServiceSession(void); - -/// Converts LanguageCode to \ref SetLanguage. -Result MakeLanguage(u64 LanguageCode, SetLanguage *Language); - -/// Converts \ref SetLanguage to LanguageCode. -Result MakeLanguageCode(SetLanguage Language, u64 *LanguageCode); - -/// Gets the current system LanguageCode. -/// Normally this should be used instead of \ref setGetLanguageCode. -/// LanguageCode is a string, see here: https://switchbrew.org/wiki/Settings_services#LanguageCode -Result GetSystemLanguage(u64 *LanguageCode); - -/// Gets the current LanguageCode, \ref setGetSystemLanguage should be used instead normally. -Result GetLanguageCode(u64 *LanguageCode); - -/// Gets available LanguageCodes. -/// On system-version <4.0.0, max_entries is set to the output from \ref setGetAvailableLanguageCodeCount if max_entries is larger than that. -Result GetAvailableLanguageCodes(s32 *total_entries, u64 *LanguageCodes, size_t max_entries); - -/// Gets total available LanguageCodes. -/// Output total is overridden with value 0 if the total is <0. -Result GetAvailableLanguageCodeCount(s32 *total); - -/// Gets the RegionCode. -Result GetRegionCode(SetRegion *out); - -/** - * @brief GetQuestFlag - * @note Only available on [5.0.0+]. - * @param[out] out Output flag. - */ -Result GetQuestFlag(bool *out); - -/** - * @brief Gets the system's nickname. - * @note Only available on [10.1.0+]. - * @param[out] nickname \ref SetSysDeviceNickName - */ -Result GetDeviceNickname(SetSysDeviceNickName *nickname); - -} // namespace set - -/// @brief C++ wrappers for the `setcal` API. -/// @details Wraps: switch/services/set.h. -namespace setcal { - -using ::ColorSetId; -/// BatteryLot -using ::SetBatteryLot; -using ::SetCalAccelerometerOffset; -using ::SetCalAccelerometerScale; -using ::SetCalAmiiboEcdsaCertificate; -using ::SetCalAmiiboEcqvBlsCertificate; -using ::SetCalAmiiboEcqvBlsKey; -using ::SetCalAmiiboEcqvBlsRootCertificate; -using ::SetCalAmiiboEcqvCertificate; -using ::SetCalAmiiboKey; -using ::SetCalAnalogStickFactoryCalibration; -using ::SetCalAnalogStickModelParameter; -using ::SetCalBdAddress; -using ::SetCalConfigurationId1; -using ::SetCalConsoleSixAxisSensorHorizontalOffset; -using ::SetCalCountryCode; -using ::SetCalEccB233DeviceCertificate; -using ::SetCalEccB233DeviceKey; -using ::SetCalGameCardCertificate; -using ::SetCalGameCardKey; -using ::SetCalGyroscopeOffset; -using ::SetCalGyroscopeScale; -using ::SetCalMacAddress; -using ::SetCalRegionCode; -using ::SetCalRsa2048DeviceCertificate; -using ::SetCalRsa2048DeviceKey; -using ::SetCalSerialNumber; -using ::SetCalSpeakerParameter; -using ::SetCalSslCertificate; -using ::SetCalSslKey; -/// ChineseTraditionalInputMethod -using ::SetChineseTraditionalInputMethod; -/// KeyboardLayout -using ::SetKeyboardLayout; -/// IDs for Language. -using ::SetLanguage; -/// Region codes. -using ::SetRegion; -/// AccessPointSecurityStandard -using ::SetSysAccessPointSecurityStandard; -/// AccessPointSecurityType -using ::SetSysAccessPointSecurityType; -/// AccountNotificationSettings -using ::SetSysAccountNotificationSettings; -/// AccountOnlineStorageSettings -using ::SetSysAccountOnlineStorageSettings; -/// AccountSettings -using ::SetSysAccountSettings; -/// AllowedSslHosts -using ::SetSysAllowedSslHosts; -/// AnalogStickUserCalibration -using ::SetSysAnalogStickUserCalibration; -/// AudioDevice -using ::SetSysAudioDevice; -/// AudioOutputMode -using ::SetSysAudioOutputMode; -/// AudioOutputModeTarget -using ::SetSysAudioOutputModeTarget; -using ::SetSysAudioVolume; -/// AutoSettings -using ::SetSysAutoSettings; -/// BacklightSettings -using ::SetSysBacklightSettings; -/// BacklightSettingsEx -using ::SetSysBacklightSettingsEx; -/// BlePairingSettings -using ::SetSysBlePairingSettings; -/// BlockType -using ::SetSysBlockType; -/// BluetoothDevicesSettings -using ::SetSysBluetoothDevicesSettings; -/// ButtonConfigRegisteredSettings -using ::SetSysButtonConfigRegisteredSettings; -/// ButtonConfigSettings -using ::SetSysButtonConfigSettings; -/// Actually nn::util::Color4u8Type. -using ::SetSysColor4u8Type; -/// ConnectionFlag -using ::SetSysConnectionFlag; -/// ConsoleSixAxisSensorAccelerationBias -using ::SetSysConsoleSixAxisSensorAccelerationBias; -/// ConsoleSixAxisSensorAccelerationGain -using ::SetSysConsoleSixAxisSensorAccelerationGain; -/// ConsoleSixAxisSensorAngularAcceleration -using ::SetSysConsoleSixAxisSensorAngularAcceleration; -/// ConsoleSixAxisSensorAngularVelocityBias -using ::SetSysConsoleSixAxisSensorAngularVelocityBias; -/// ConsoleSixAxisSensorAngularVelocityGain -using ::SetSysConsoleSixAxisSensorAngularVelocityGain; -/// ConsoleSixAxisSensorAngularVelocityTimeBias -using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; -/// ConsoleSleepPlan -using ::SetSysConsoleSleepPlan; -/// ControllerType -using ::SetSysControllerType; -using ::SetSysDataBlock; -/// DataDeletionSettings -using ::SetSysDataDeletionSettings; -/// DeviceNickName -using ::SetSysDeviceNickName; -/// Edid -using ::SetSysEdid; -/// ErrorReportSharePermission -using ::SetSysErrorReportSharePermission; -/// EulaVersion -using ::SetSysEulaVersion; -/// EulaVersionClockType -using ::SetSysEulaVersionClockType; -using ::SetSysExtensionBlock; -/// Structure returned by \ref setsysGetFirmwareVersion. -using ::SetSysFirmwareVersion; -/// Structure returned by \ref setsysGetFirmwareVersionDigest. -using ::SetSysFirmwareVersionDigest; -/// FriendPresenceOverlayPermission -using ::SetSysFriendPresenceOverlayPermission; -/// HandheldSleepPlan -using ::SetSysHandheldSleepPlan; -/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. -using ::SetSysHomeMenuScheme; -/// HostFsMountPoint -using ::SetSysHostFsMountPoint; -/// InitialLaunchSettings -using ::SetSysInitialLaunchSettings; -/// LcdBacklightBrightnessMapping -using ::SetSysLcdBacklightBrightnessMapping; -using ::SetSysModeLine; -/// NetworkSettings -using ::SetSysNetworkSettings; -/// NotificationSettings -using ::SetSysNotificationSettings; -/// NotificationTime -using ::SetSysNotificationTime; -/// NotificationVolume -using ::SetSysNotificationVolume; -/// NxControllerLegacySettings -using ::SetSysNxControllerLegacySettings; -/// NxControllerSettings -using ::SetSysNxControllerSettings; -/// PlatformRegion. Other values not listed here should be handled as "Unknown". -using ::SetSysPlatformRegion; -/// PrimaryAlbumStorage -using ::SetSysPrimaryAlbumStorage; -/// Console Product Models -using ::SetSysProductModel; -/// ProxyFlags -using ::SetSysProxyFlags; -/// PtmCycleCountReliability -using ::SetSysPtmCycleCountReliability; -/// PtmFuelGaugeParameter -using ::SetSysPtmFuelGaugeParameter; -/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. -using ::SetSysRebootlessSystemUpdateVersion; -/// Structure returned by \ref setsysGetSerialNumber. -using ::SetSysSerialNumber; -/// ServiceDiscoveryControlSettings -using ::SetSysServiceDiscoveryControlSettings; -/// SleepSettings -using ::SetSysSleepSettings; -/// ThemeId -using ::SetSysThemeId; -/// ThemeSettings -using ::SetSysThemeSettings; -/// TouchScreenMode, for "Touch-Screen Sensitivity". -using ::SetSysTouchScreenMode; -/// TvSettings -using ::SetSysTvSettings; -/// UserSelectorFlag -using ::SetSysUserSelectorFlag; -/// UserSelectorSettings -using ::SetSysUserSelectorSettings; - -/// Initialize setcal. -Result Initialize(void); - -/// Exit setcal. -void Exit(void); - -/// Gets the Service object for the actual setcal service session. -Service* GetServiceSession(void); - -/** - * @brief Gets the \ref SetCalBdAddress. - * @param[out] out \ref SetCalBdAddress - */ -Result GetBdAddress(SetCalBdAddress *out); - -/** - * @brief Gets the \ref SetCalConfigurationId1. - * @param[out] out \ref SetCalConfigurationId1 - */ -Result GetConfigurationId1(SetCalConfigurationId1 *out); - -/** - * @brief Gets the \ref SetCalAccelerometerOffset. - * @param[out] out \ref SetCalAccelerometerOffset - */ -Result GetAccelerometerOffset(SetCalAccelerometerOffset *out); - -/** - * @brief Gets the \ref SetCalAccelerometerScale. - * @param[out] out \ref SetCalAccelerometerScale - */ -Result GetAccelerometerScale(SetCalAccelerometerScale *out); - -/** - * @brief Gets the \ref SetCalGyroscopeOffset. - * @param[out] out \ref SetCalGyroscopeOffset - */ -Result GetGyroscopeOffset(SetCalGyroscopeOffset *out); - -/** - * @brief Gets the \ref SetCalGyroscopeScale. - * @param[out] out \ref SetCalGyroscopeScale - */ -Result GetGyroscopeScale(SetCalGyroscopeScale *out); - -/** - * @brief Gets the \ref SetCalMacAddress. - * @param[out] out \ref SetCalMacAddress - */ -Result GetWirelessLanMacAddress(SetCalMacAddress *out); - -/** - * @brief GetWirelessLanCountryCodeCount - * @param[out] out_count Output count - */ -Result GetWirelessLanCountryCodeCount(s32 *out_count); - -/** - * @brief GetWirelessLanCountryCodes - * @param[out] total_out Total output entries. - * @param[out] codes Output array of \ref SetCalCountryCode. - * @param[in] count Size of the versions array in entries. - */ -Result GetWirelessLanCountryCodes(s32 *total_out, SetCalCountryCode *codes, s32 count); - -/** - * @brief Gets the \ref SetCalSerialNumber. - * @param[out] out \ref SetCalSerialNumber - */ -Result GetSerialNumber(SetCalSerialNumber *out); - -/** - * @brief SetInitialSystemAppletProgramId - * @param[in] program_id input ProgramId. - */ -Result SetInitialSystemAppletProgramId(u64 program_id); - -/** - * @brief SetOverlayDispProgramId - * @param[in] program_id input ProgramId. - */ -Result SetOverlayDispProgramId(u64 program_id); - -/** - * @brief Gets the \ref SetBatteryLot. - * @param[out] out \ref SetBatteryLot - */ -Result GetBatteryLot(SetBatteryLot *out); - -/** - * @brief Gets the \ref SetCalEccB233DeviceCertificate. - * @param[out] out \ref SetCalEccB233DeviceCertificate - */ -Result GetEciDeviceCertificate(SetCalEccB233DeviceCertificate *out); - -/** - * @brief Gets the \ref SetCalRsa2048DeviceCertificate. - * @param[out] out \ref SetCalRsa2048DeviceCertificate - */ -Result GetEticketDeviceCertificate(SetCalRsa2048DeviceCertificate *out); - -/** - * @brief Gets the \ref SetCalSslKey. - * @param[out] out \ref SetCalSslKey - */ -Result GetSslKey(SetCalSslKey *out); - -/** - * @brief Gets the \ref SetCalSslCertificate. - * @param[out] out \ref SetCalSslCertificate - */ -Result GetSslCertificate(SetCalSslCertificate *out); - -/** - * @brief Gets the \ref SetCalGameCardKey. - * @param[out] out \ref SetCalGameCardKey - */ -Result GetGameCardKey(SetCalGameCardKey *out); - -/** - * @brief Gets the \ref SetCalGameCardCertificate. - * @param[out] out \ref SetCalGameCardCertificate - */ -Result GetGameCardCertificate(SetCalGameCardCertificate *out); - -/** - * @brief Gets the \ref SetCalEccB233DeviceKey. - * @param[out] out \ref SetCalEccB233DeviceKey - */ -Result GetEciDeviceKey(SetCalEccB233DeviceKey *out); - -/** - * @brief Gets the \ref SetCalRsa2048DeviceKey. - * @param[out] out \ref SetCalRsa2048DeviceKey - */ -Result GetEticketDeviceKey(SetCalRsa2048DeviceKey *out); - -/** - * @brief Gets the \ref SetCalSpeakerParameter. - * @param[out] out \ref SetCalSpeakerParameter - */ -Result GetSpeakerParameter(SetCalSpeakerParameter *out); - -/** - * @brief GetLcdVendorId - * @note Only available on [4.0.0+]. - * @param[out] out_vendor_id Output LcdVendorId. - */ -Result GetLcdVendorId(u32 *out_vendor_id); - -/** - * @brief Gets the \ref SetCalRsa2048DeviceCertificate. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalRsa2048DeviceCertificate - */ -Result GetEciDeviceCertificate2(SetCalRsa2048DeviceCertificate *out); - -/** - * @brief Gets the \ref SetCalRsa2048DeviceKey. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalRsa2048DeviceKey - */ -Result GetEciDeviceKey2(SetCalRsa2048DeviceKey *out); - -/** - * @brief Gets the \ref SetCalAmiiboKey. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalAmiiboKey - */ -Result GetAmiiboKey(SetCalAmiiboKey *out); - -/** - * @brief Gets the \ref SetCalAmiiboEcqvCertificate. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalAmiiboEcqvCertificate - */ -Result GetAmiiboEcqvCertificate(SetCalAmiiboEcqvCertificate *out); - -/** - * @brief Gets the \ref SetCalAmiiboEcdsaCertificate. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalAmiiboEcdsaCertificate - */ -Result GetAmiiboEcdsaCertificate(SetCalAmiiboEcdsaCertificate *out); - -/** - * @brief Gets the \ref SetCalAmiiboEcqvBlsKey. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalAmiiboEcqvBlsKey - */ -Result GetAmiiboEcqvBlsKey(SetCalAmiiboEcqvBlsKey *out); - -/** - * @brief Gets the \ref SetCalAmiiboEcqvBlsCertificate. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalAmiiboEcqvBlsCertificate - */ -Result GetAmiiboEcqvBlsCertificate(SetCalAmiiboEcqvBlsCertificate *out); - -/** - * @brief Gets the \ref SetCalAmiiboEcqvBlsRootCertificate. - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetCalAmiiboEcqvBlsRootCertificate - */ -Result GetAmiiboEcqvBlsRootCertificate(SetCalAmiiboEcqvBlsRootCertificate *out); - -/** - * @brief GetUsbTypeCPowerSourceCircuitVersion - * @note Only available on [5.0.0+]. - * @param[out] out_version Output UsbTypeCPowerSourceCircuitVersion. - */ -Result GetUsbTypeCPowerSourceCircuitVersion(u8 *out_version); - -/** - * @brief GetAnalogStickModuleTypeL - * @note Only available on [8.1.1+]. - * @param[out] out_version Output AnalogStickModuleType. - */ -Result GetAnalogStickModuleTypeL(u8 *out_type); - -/** - * @brief Gets the \ref SetCalAnalogStickModelParameter. - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetCalAnalogStickModelParameter - */ -Result GetAnalogStickModelParameterL(SetCalAnalogStickModelParameter *out); - -/** - * @brief Gets the \ref SetCalAnalogStickFactoryCalibration. - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetCalAnalogStickFactoryCalibration - */ -Result GetAnalogStickFactoryCalibrationL(SetCalAnalogStickFactoryCalibration *out); - -/** - * @brief GetAnalogStickModuleTypeR - * @note Only available on [8.1.1+]. - * @param[out] out_version Output AnalogStickModuleType. - */ -Result GetAnalogStickModuleTypeR(u8 *out_type); - -/** - * @brief Gets the \ref SetCalAnalogStickModelParameter. - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetCalAnalogStickModelParameter - */ -Result GetAnalogStickModelParameterR(SetCalAnalogStickModelParameter *out); - -/** - * @brief Gets the \ref SetCalAnalogStickFactoryCalibration. - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetCalAnalogStickFactoryCalibration - */ -Result GetAnalogStickFactoryCalibrationR(SetCalAnalogStickFactoryCalibration *out); - -/** - * @brief GetConsoleSixAxisSensorModuleType - * @note Only available on [8.1.1+]. - * @param[out] out_version Output ConsoleSixAxisSensorModuleType. - */ -Result GetConsoleSixAxisSensorModuleType(u8 *out_type); - -/** - * @brief Gets the \ref SetCalConsoleSixAxisSensorHorizontalOffset. - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetCalConsoleSixAxisSensorHorizontalOffset - */ -Result GetConsoleSixAxisSensorHorizontalOffset(SetCalConsoleSixAxisSensorHorizontalOffset *out); - -/** - * @brief GetBatteryVersion - * @note Only available on [6.0.0+]. - * @param[out] out_version Output BatteryVersion. - */ -Result GetBatteryVersion(u8 *out_version); - -/** - * @brief GetDeviceId - * @note Only available on [10.0.0+]. - * @param[out] out_type Output DeviceId. - */ -Result GetDeviceId(u64 *out_device_id); - -/** - * @brief GetConsoleSixAxisSensorMountType - * @note Only available on [10.0.0+]. - * @param[out] out_type Output ConsoleSixAxisSensorMountType. - */ -Result GetConsoleSixAxisSensorMountType(u8 *out_type); - -} // namespace setcal - -/// @brief C++ wrappers for the `setfd` API. -/// @details Wraps: switch/services/set.h. -namespace setfd { - -using ::ColorSetId; -/// BatteryLot -using ::SetBatteryLot; -using ::SetCalAccelerometerOffset; -using ::SetCalAccelerometerScale; -using ::SetCalAmiiboEcdsaCertificate; -using ::SetCalAmiiboEcqvBlsCertificate; -using ::SetCalAmiiboEcqvBlsKey; -using ::SetCalAmiiboEcqvBlsRootCertificate; -using ::SetCalAmiiboEcqvCertificate; -using ::SetCalAmiiboKey; -using ::SetCalAnalogStickFactoryCalibration; -using ::SetCalAnalogStickModelParameter; -using ::SetCalBdAddress; -using ::SetCalConfigurationId1; -using ::SetCalConsoleSixAxisSensorHorizontalOffset; -using ::SetCalCountryCode; -using ::SetCalEccB233DeviceCertificate; -using ::SetCalEccB233DeviceKey; -using ::SetCalGameCardCertificate; -using ::SetCalGameCardKey; -using ::SetCalGyroscopeOffset; -using ::SetCalGyroscopeScale; -using ::SetCalMacAddress; -using ::SetCalRegionCode; -using ::SetCalRsa2048DeviceCertificate; -using ::SetCalRsa2048DeviceKey; -using ::SetCalSerialNumber; -using ::SetCalSpeakerParameter; -using ::SetCalSslCertificate; -using ::SetCalSslKey; -/// ChineseTraditionalInputMethod -using ::SetChineseTraditionalInputMethod; -/// KeyboardLayout -using ::SetKeyboardLayout; -/// IDs for Language. -using ::SetLanguage; -/// Region codes. -using ::SetRegion; -/// AccessPointSecurityStandard -using ::SetSysAccessPointSecurityStandard; -/// AccessPointSecurityType -using ::SetSysAccessPointSecurityType; -/// AccountNotificationSettings -using ::SetSysAccountNotificationSettings; -/// AccountOnlineStorageSettings -using ::SetSysAccountOnlineStorageSettings; -/// AccountSettings -using ::SetSysAccountSettings; -/// AllowedSslHosts -using ::SetSysAllowedSslHosts; -/// AnalogStickUserCalibration -using ::SetSysAnalogStickUserCalibration; -/// AudioDevice -using ::SetSysAudioDevice; -/// AudioOutputMode -using ::SetSysAudioOutputMode; -/// AudioOutputModeTarget -using ::SetSysAudioOutputModeTarget; -using ::SetSysAudioVolume; -/// AutoSettings -using ::SetSysAutoSettings; -/// BacklightSettings -using ::SetSysBacklightSettings; -/// BacklightSettingsEx -using ::SetSysBacklightSettingsEx; -/// BlePairingSettings -using ::SetSysBlePairingSettings; -/// BlockType -using ::SetSysBlockType; -/// BluetoothDevicesSettings -using ::SetSysBluetoothDevicesSettings; -/// ButtonConfigRegisteredSettings -using ::SetSysButtonConfigRegisteredSettings; -/// ButtonConfigSettings -using ::SetSysButtonConfigSettings; -/// Actually nn::util::Color4u8Type. -using ::SetSysColor4u8Type; -/// ConnectionFlag -using ::SetSysConnectionFlag; -/// ConsoleSixAxisSensorAccelerationBias -using ::SetSysConsoleSixAxisSensorAccelerationBias; -/// ConsoleSixAxisSensorAccelerationGain -using ::SetSysConsoleSixAxisSensorAccelerationGain; -/// ConsoleSixAxisSensorAngularAcceleration -using ::SetSysConsoleSixAxisSensorAngularAcceleration; -/// ConsoleSixAxisSensorAngularVelocityBias -using ::SetSysConsoleSixAxisSensorAngularVelocityBias; -/// ConsoleSixAxisSensorAngularVelocityGain -using ::SetSysConsoleSixAxisSensorAngularVelocityGain; -/// ConsoleSixAxisSensorAngularVelocityTimeBias -using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; -/// ConsoleSleepPlan -using ::SetSysConsoleSleepPlan; -/// ControllerType -using ::SetSysControllerType; -using ::SetSysDataBlock; -/// DataDeletionSettings -using ::SetSysDataDeletionSettings; -/// DeviceNickName -using ::SetSysDeviceNickName; -/// Edid -using ::SetSysEdid; -/// ErrorReportSharePermission -using ::SetSysErrorReportSharePermission; -/// EulaVersion -using ::SetSysEulaVersion; -/// EulaVersionClockType -using ::SetSysEulaVersionClockType; -using ::SetSysExtensionBlock; -/// Structure returned by \ref setsysGetFirmwareVersion. -using ::SetSysFirmwareVersion; -/// Structure returned by \ref setsysGetFirmwareVersionDigest. -using ::SetSysFirmwareVersionDigest; -/// FriendPresenceOverlayPermission -using ::SetSysFriendPresenceOverlayPermission; -/// HandheldSleepPlan -using ::SetSysHandheldSleepPlan; -/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. -using ::SetSysHomeMenuScheme; -/// HostFsMountPoint -using ::SetSysHostFsMountPoint; -/// InitialLaunchSettings -using ::SetSysInitialLaunchSettings; -/// LcdBacklightBrightnessMapping -using ::SetSysLcdBacklightBrightnessMapping; -using ::SetSysModeLine; -/// NetworkSettings -using ::SetSysNetworkSettings; -/// NotificationSettings -using ::SetSysNotificationSettings; -/// NotificationTime -using ::SetSysNotificationTime; -/// NotificationVolume -using ::SetSysNotificationVolume; -/// NxControllerLegacySettings -using ::SetSysNxControllerLegacySettings; -/// NxControllerSettings -using ::SetSysNxControllerSettings; -/// PlatformRegion. Other values not listed here should be handled as "Unknown". -using ::SetSysPlatformRegion; -/// PrimaryAlbumStorage -using ::SetSysPrimaryAlbumStorage; -/// Console Product Models -using ::SetSysProductModel; -/// ProxyFlags -using ::SetSysProxyFlags; -/// PtmCycleCountReliability -using ::SetSysPtmCycleCountReliability; -/// PtmFuelGaugeParameter -using ::SetSysPtmFuelGaugeParameter; -/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. -using ::SetSysRebootlessSystemUpdateVersion; -/// Structure returned by \ref setsysGetSerialNumber. -using ::SetSysSerialNumber; -/// ServiceDiscoveryControlSettings -using ::SetSysServiceDiscoveryControlSettings; -/// SleepSettings -using ::SetSysSleepSettings; -/// ThemeId -using ::SetSysThemeId; -/// ThemeSettings -using ::SetSysThemeSettings; -/// TouchScreenMode, for "Touch-Screen Sensitivity". -using ::SetSysTouchScreenMode; -/// TvSettings -using ::SetSysTvSettings; -/// UserSelectorFlag -using ::SetSysUserSelectorFlag; -/// UserSelectorSettings -using ::SetSysUserSelectorSettings; - -/// Initialize setfd. -/// [4.0.0+] Only exposed if in development mode. -Result Initialize(void); - -/// Exit setfd. -void Exit(void); - -/// Gets the Service object for the actual setfd service session. -Service* GetServiceSession(void); - -/** - * @brief Sets the value of a settings item. - * @param name Name string. - * @param item_key Item key string. - * @param value_in Pointer to input value. - * @param value_in_size Size of the value_in buffer. - */ -Result SetSettingsItemValue(const char *name, const char *item_key, const void *value_in, s64 value_in_size); - -/** - * @brief Resets the value of a settings item. - * @param name Name string. - * @param item_key Item key string. - */ -Result ResetSettingsItemValue(const char *name, const char *item_key); - -} // namespace setfd - -/// @brief C++ wrappers for the `setsys` API. -/// @details Wraps: switch/services/set.h. -namespace setsys { - -using ::ColorSetId; -/// BatteryLot -using ::SetBatteryLot; -using ::SetCalAccelerometerOffset; -using ::SetCalAccelerometerScale; -using ::SetCalAmiiboEcdsaCertificate; -using ::SetCalAmiiboEcqvBlsCertificate; -using ::SetCalAmiiboEcqvBlsKey; -using ::SetCalAmiiboEcqvBlsRootCertificate; -using ::SetCalAmiiboEcqvCertificate; -using ::SetCalAmiiboKey; -using ::SetCalAnalogStickFactoryCalibration; -using ::SetCalAnalogStickModelParameter; -using ::SetCalBdAddress; -using ::SetCalConfigurationId1; -using ::SetCalConsoleSixAxisSensorHorizontalOffset; -using ::SetCalCountryCode; -using ::SetCalEccB233DeviceCertificate; -using ::SetCalEccB233DeviceKey; -using ::SetCalGameCardCertificate; -using ::SetCalGameCardKey; -using ::SetCalGyroscopeOffset; -using ::SetCalGyroscopeScale; -using ::SetCalMacAddress; -using ::SetCalRegionCode; -using ::SetCalRsa2048DeviceCertificate; -using ::SetCalRsa2048DeviceKey; -using ::SetCalSerialNumber; -using ::SetCalSpeakerParameter; -using ::SetCalSslCertificate; -using ::SetCalSslKey; -/// IDs for Language. -using ::SetLanguage; -/// Region codes. -using ::SetRegion; -/// AccessPointSecurityStandard -using ::SetSysAccessPointSecurityStandard; -/// AccessPointSecurityType -using ::SetSysAccessPointSecurityType; -/// AccountNotificationSettings -using ::SetSysAccountNotificationSettings; -/// AccountOnlineStorageSettings -using ::SetSysAccountOnlineStorageSettings; -/// AccountSettings -using ::SetSysAccountSettings; -/// AllowedSslHosts -using ::SetSysAllowedSslHosts; -/// AnalogStickUserCalibration -using ::SetSysAnalogStickUserCalibration; -/// AudioDevice -using ::SetSysAudioDevice; -/// AudioOutputMode -using ::SetSysAudioOutputMode; -/// AudioOutputModeTarget -using ::SetSysAudioOutputModeTarget; -using ::SetSysAudioVolume; -/// AutoSettings -using ::SetSysAutoSettings; -/// BacklightSettings -using ::SetSysBacklightSettings; -/// BacklightSettingsEx -using ::SetSysBacklightSettingsEx; -/// BlePairingSettings -using ::SetSysBlePairingSettings; -/// BlockType -using ::SetSysBlockType; -/// BluetoothDevicesSettings -using ::SetSysBluetoothDevicesSettings; -/// ButtonConfigRegisteredSettings -using ::SetSysButtonConfigRegisteredSettings; -/// ButtonConfigSettings -using ::SetSysButtonConfigSettings; -/// Actually nn::util::Color4u8Type. -using ::SetSysColor4u8Type; -/// ConnectionFlag -using ::SetSysConnectionFlag; -/// ConsoleSixAxisSensorAccelerationBias -using ::SetSysConsoleSixAxisSensorAccelerationBias; -/// ConsoleSixAxisSensorAccelerationGain -using ::SetSysConsoleSixAxisSensorAccelerationGain; -/// ConsoleSixAxisSensorAngularAcceleration -using ::SetSysConsoleSixAxisSensorAngularAcceleration; -/// ConsoleSixAxisSensorAngularVelocityBias -using ::SetSysConsoleSixAxisSensorAngularVelocityBias; -/// ConsoleSixAxisSensorAngularVelocityGain -using ::SetSysConsoleSixAxisSensorAngularVelocityGain; -/// ConsoleSixAxisSensorAngularVelocityTimeBias -using ::SetSysConsoleSixAxisSensorAngularVelocityTimeBias; -/// ConsoleSleepPlan -using ::SetSysConsoleSleepPlan; -/// ControllerType -using ::SetSysControllerType; -using ::SetSysDataBlock; -/// DataDeletionSettings -using ::SetSysDataDeletionSettings; -/// DeviceNickName -using ::SetSysDeviceNickName; -/// Edid -using ::SetSysEdid; -/// ErrorReportSharePermission -using ::SetSysErrorReportSharePermission; -/// EulaVersion -using ::SetSysEulaVersion; -/// EulaVersionClockType -using ::SetSysEulaVersionClockType; -using ::SetSysExtensionBlock; -/// Structure returned by \ref setsysGetFirmwareVersion. -using ::SetSysFirmwareVersion; -/// Structure returned by \ref setsysGetFirmwareVersionDigest. -using ::SetSysFirmwareVersionDigest; -/// FriendPresenceOverlayPermission -using ::SetSysFriendPresenceOverlayPermission; -/// HandheldSleepPlan -using ::SetSysHandheldSleepPlan; -/// Output from \ref setsysGetHomeMenuScheme. This contains RGBA8 colors which correspond with the physical shell of the system. -using ::SetSysHomeMenuScheme; -/// HostFsMountPoint -using ::SetSysHostFsMountPoint; -/// InitialLaunchSettings -using ::SetSysInitialLaunchSettings; -/// LcdBacklightBrightnessMapping -using ::SetSysLcdBacklightBrightnessMapping; -using ::SetSysModeLine; -/// NetworkSettings -using ::SetSysNetworkSettings; -/// NotificationSettings -using ::SetSysNotificationSettings; -/// NotificationTime -using ::SetSysNotificationTime; -/// NotificationVolume -using ::SetSysNotificationVolume; -/// NxControllerLegacySettings -using ::SetSysNxControllerLegacySettings; -/// NxControllerSettings -using ::SetSysNxControllerSettings; -/// PlatformRegion. Other values not listed here should be handled as "Unknown". -using ::SetSysPlatformRegion; -/// PrimaryAlbumStorage -using ::SetSysPrimaryAlbumStorage; -/// Console Product Models -using ::SetSysProductModel; -/// ProxyFlags -using ::SetSysProxyFlags; -/// PtmCycleCountReliability -using ::SetSysPtmCycleCountReliability; -/// PtmFuelGaugeParameter -using ::SetSysPtmFuelGaugeParameter; -/// RebootlessSystemUpdateVersion. This is the content of the RebootlessSystemUpdateVersion SystemData, in the "/version" file. -using ::SetSysRebootlessSystemUpdateVersion; -/// Structure returned by \ref setsysGetSerialNumber. -using ::SetSysSerialNumber; -/// ServiceDiscoveryControlSettings -using ::SetSysServiceDiscoveryControlSettings; -/// SleepSettings -using ::SetSysSleepSettings; -/// ThemeId -using ::SetSysThemeId; -/// ThemeSettings -using ::SetSysThemeSettings; -/// TouchScreenMode, for "Touch-Screen Sensitivity". -using ::SetSysTouchScreenMode; -/// TvSettings -using ::SetSysTvSettings; -/// UserSelectorFlag -using ::SetSysUserSelectorFlag; -/// UserSelectorSettings -using ::SetSysUserSelectorSettings; - -/// Initialize setsys. -Result Initialize(void); - -/// Exit setsys. -void Exit(void); - -/// Gets the Service object for the actual setsys service session. -Service* GetServiceSession(void); - -/** - * @brief SetLanguageCode - * @param[in] LanguageCode LanguageCode. - */ -Result SetLanguageCode(u64 LanguageCode); - -/** - * @brief SetNetworkSettings - * @param[in] settings Input array of \ref SetSysNetworkSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetNetworkSettings(const SetSysNetworkSettings *settings, s32 count); - -/** - * @brief GetNetworkSettings - * @param[out] total_out Total output entries. - * @param[out] versions Output array of \ref SetSysNetworkSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetNetworkSettings(s32 *total_out, SetSysNetworkSettings *settings, s32 count); - -/** - * @brief Gets the system firmware version. - * @param[out] out Firmware version to populate. - */ -Result GetFirmwareVersion(SetSysFirmwareVersion *out); - -/** - * @brief GetFirmwareVersionDigest - * @param[out] out \ref SetSysFirmwareVersionDigest - */ -Result GetFirmwareVersionDigest(SetSysFirmwareVersionDigest *out); - -/** - * @brief GetLockScreenFlag - * @param[out] out Output flag. - */ -Result GetLockScreenFlag(bool *out); - -/** - * @brief SetLockScreenFlag - * @param[in] flag Input flag. - */ -Result SetLockScreenFlag(bool flag); - -/** - * @brief GetBacklightSettings - * @param[out] out \ref SetSysBacklightSettings - */ -Result GetBacklightSettings(SetSysBacklightSettings *out); - -/** - * @brief SetBacklightSettings - * @param[in] settings \ref SetSysBacklightSettings - */ -Result SetBacklightSettings(const SetSysBacklightSettings *settings); - -/** - * @brief SetBluetoothDevicesSettings - * @param[in] settings Input array of \ref SetSysBluetoothDevicesSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetBluetoothDevicesSettings(const SetSysBluetoothDevicesSettings *settings, s32 count); - -/** - * @brief GetBluetoothDevicesSettings - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysBluetoothDevicesSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetBluetoothDevicesSettings(s32 *total_out, SetSysBluetoothDevicesSettings *settings, s32 count); - -/** - * @brief GetExternalSteadyClockSourceId - * @param[out] out \ref Uuid - */ -Result GetExternalSteadyClockSourceId(Uuid *out); - -/** - * @brief SetExternalSteadyClockSourceId - * @param[in] uuid \ref Uuid - */ -Result SetExternalSteadyClockSourceId(const Uuid *uuid); - -/** - * @brief GetUserSystemClockContext - * @param[out] out \ref TimeSystemClockContext - */ -Result GetUserSystemClockContext(TimeSystemClockContext *out); - -/** - * @brief SetUserSystemClockContext - * @param[in] context \ref TimeSystemClockContext - */ -Result SetUserSystemClockContext(const TimeSystemClockContext *context); - -/** - * @brief GetAccountSettings - * @param[out] out \ref SetSysAccountSettings - */ -Result GetAccountSettings(SetSysAccountSettings *out); - -/** - * @brief SetAccountSettings - * @param[in] settings \ref SetSysAccountSettings - */ -Result SetAccountSettings(SetSysAccountSettings settings); - -/** - * @brief GetAudioVolume - * @param[in] device \ref SetSysAudioDevice - * @param[out] out \ref SetSysAudioVolume - */ -Result GetAudioVolume(SetSysAudioDevice device, SetSysAudioVolume *out); - -/** - * @brief SetAudioVolume - * @param[in] device \ref SetSysAudioDevice - * @param[in] volume \ref SetSysAudioVolume - */ -Result SetAudioVolume(SetSysAudioDevice device, const SetSysAudioVolume *volume); - -/** - * @brief GetEulaVersions - * @param[out] total_out Total output entries. - * @param[out] versions Output array of \ref SetSysEulaVersion. - * @param[in] count Size of the versions array in entries. - */ -Result GetEulaVersions(s32 *total_out, SetSysEulaVersion *versions, s32 count); - -/** - * @brief SetEulaVersions - * @param[in] versions Input array of \ref SetSysEulaVersion. - * @param[in] count Size of the versions array in entries. - */ -Result SetEulaVersions(const SetSysEulaVersion *versions, s32 count); - -/// Gets the current system theme. -Result GetColorSetId(ColorSetId *out); - -/// Sets the current system theme. -Result SetColorSetId(ColorSetId id); - -/** - * @brief GetConsoleInformationUploadFlag - * @param[out] out Output flag. - */ -Result GetConsoleInformationUploadFlag(bool *out); - -/** - * @brief SetConsoleInformationUploadFlag - * @param[in] flag Input flag. - */ -Result SetConsoleInformationUploadFlag(bool flag); - -/** - * @brief GetAutomaticApplicationDownloadFlag - * @param[out] out Output flag. - */ -Result GetAutomaticApplicationDownloadFlag(bool *out); - -/** - * @brief SetAutomaticApplicationDownloadFlag - * @param[in] flag Input flag. - */ -Result SetAutomaticApplicationDownloadFlag(bool flag); - -/** - * @brief GetNotificationSettings - * @param[out] out \ref SetSysNotificationSettings - */ -Result GetNotificationSettings(SetSysNotificationSettings *out); - -/** - * @brief SetNotificationSettings - * @param[in] settings \ref SetSysNotificationSettings - */ -Result SetNotificationSettings(const SetSysNotificationSettings *settings); - -/** - * @brief GetAccountNotificationSettings - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysAccountNotificationSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetAccountNotificationSettings(s32 *total_out, SetSysAccountNotificationSettings *settings, s32 count); - -/** - * @brief SetAccountNotificationSettings - * @param[in] settings Input array of \ref SetSysAccountNotificationSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetAccountNotificationSettings(const SetSysAccountNotificationSettings *settings, s32 count); - -/** - * @brief GetVibrationMasterVolume - * @param[out] out Output volume. - */ -Result GetVibrationMasterVolume(float *out); - -/** - * @brief SetVibrationMasterVolume - * @param[in] volume Input volume. - */ -Result SetVibrationMasterVolume(float volume); - -/** - * @brief Gets the size of a settings item value. - * @param name Name string. - * @param item_key Item key string. - * @param size_out Pointer to output the size to. - */ -Result GetSettingsItemValueSize(const char *name, const char *item_key, u64 *size_out); - -/** - * @brief Gets the value of a settings item. - * @param name Name string. - * @param item_key Item key string. - * @param value_out Pointer to output the value to. - * @param value_out_size Size of the value_out buffer. - * @param size_out Total size which was copied to value_out. - */ -Result GetSettingsItemValue(const char *name, const char *item_key, void *value_out, size_t value_out_size, u64 *size_out); - -/** - * @brief GetTvSettings - * @param[out] out \ref SetSysTvSettings - */ -Result GetTvSettings(SetSysTvSettings *out); - -/** - * @brief SetTvSettings - * @param[in] settings \ref SetSysTvSettings - */ -Result SetTvSettings(const SetSysTvSettings *settings); - -/** - * @brief GetEdid - * @param[out] out \ref SetSysEdid - */ -Result GetEdid(SetSysEdid *out); - -/** - * @brief SetEdid - * @param[in] edid \ref SetSysEdid - */ -Result SetEdid(const SetSysEdid *edid); - -/** - * @brief GetAudioOutputMode - * @param[in] target \ref SetSysAudioOutputModeTarget - * @param[out] out \ref SetSysAudioOutputMode - */ -Result GetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode *out); - -/** - * @brief SetAudioOutputMode - * @param[in] target \ref SetSysAudioOutputModeTarget - * @param[in] mode \ref SetSysAudioOutputMode - */ -Result SetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode mode); - -/** - * @brief GetSpeakerAutoMuteFlag - * @param[out] out Output flag. - */ -Result GetSpeakerAutoMuteFlag(bool *out); - -/** - * @brief SetSpeakerAutoMuteFlag - * @param[in] flag Input flag. - */ -Result SetSpeakerAutoMuteFlag(bool flag); - -/** - * @brief GetQuestFlag - * @param[out] out Output flag. - */ -Result GetQuestFlag(bool *out); - -/** - * @brief SetQuestFlag - * @param[in] flag Input flag. - */ -Result SetQuestFlag(bool flag); - -/** - * @brief GetDataDeletionSettings - * @param[out] out \ref SetSysDataDeletionSettings - */ -Result GetDataDeletionSettings(SetSysDataDeletionSettings *out); - -/** - * @brief SetDataDeletionSettings - * @param[in] settings \ref SetSysDataDeletionSettings - */ -Result SetDataDeletionSettings(const SetSysDataDeletionSettings *settings); - -/** - * @brief GetInitialSystemAppletProgramId - * @param[out] out output ProgramId. - */ -Result GetInitialSystemAppletProgramId(u64 *out); - -/** - * @brief GetOverlayDispProgramId - * @param[out] out output ProgramId. - */ -Result GetOverlayDispProgramId(u64 *out); - -/** - * @brief GetDeviceTimeZoneLocationName - * @param[out] out \ref TimeLocationName - */ -Result GetDeviceTimeZoneLocationName(TimeLocationName *out); - -/** - * @brief SetDeviceTimeZoneLocationName - * @param[in] name \ref TimeLocationName - */ -Result SetDeviceTimeZoneLocationName(const TimeLocationName *name); - -/** - * @brief GetWirelessCertificationFileSize - * @param[out] out_size Output size. - */ -Result GetWirelessCertificationFileSize(u64 *out_size); - -/** - * @brief GetWirelessCertificationFile - * @param[out] buffer Output buffer. - * @param[in] size Output buffer size. - * @param[out] out_size Output size. - */ -Result GetWirelessCertificationFile(void* buffer, size_t size, u64 *out_size); - -/** - * @brief SetRegionCode - * @param[in] region \ref SetRegion - */ -Result SetRegionCode(SetRegion region); - -/** - * @brief GetNetworkSystemClockContext - * @param[out] out \ref TimeSystemClockContext - */ -Result GetNetworkSystemClockContext(TimeSystemClockContext *out); - -/** - * @brief SetNetworkSystemClockContext - * @param[in] context \ref TimeSystemClockContext - */ -Result SetNetworkSystemClockContext(const TimeSystemClockContext *context); - -/** - * @brief IsUserSystemClockAutomaticCorrectionEnabled - * @param[out] out Output flag. - */ -Result IsUserSystemClockAutomaticCorrectionEnabled(bool *out); - -/** - * @brief SetUserSystemClockAutomaticCorrectionEnabled - * @param[in] flag Input flag. - */ -Result SetUserSystemClockAutomaticCorrectionEnabled(bool flag); - -/** - * @brief GetDebugModeFlag - * @param[out] out Output flag. - */ -Result GetDebugModeFlag(bool *out); - -/** - * @brief GetPrimaryAlbumStorage - * @param[out] out \ref GetPrimaryAlbumStorage - */ -Result GetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage *out); - -/** - * @brief SetPrimaryAlbumStorage - * @param[in] storage \ref SetSysPrimaryAlbumStorage - */ -Result SetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage storage); - -/** - * @brief GetUsb30EnableFlag - * @param[out] out Output flag. - */ -Result GetUsb30EnableFlag(bool *out); - -/** - * @brief SetUsb30EnableFlag - * @param[in] flag Input flag. - */ -Result SetUsb30EnableFlag(bool flag); - -/** - * @brief Gets the \ref SetBatteryLot. - * @param[out] out \ref SetBatteryLot - */ -Result GetBatteryLot(SetBatteryLot *out); - -/** - * @brief Gets the system's serial number. - * @param[out] out \ref SetSysSerialNumber - */ -Result GetSerialNumber(SetSysSerialNumber *out); - -/** - * @brief GetNfcEnableFlag - * @param[out] out Output flag. - */ -Result GetNfcEnableFlag(bool *out); - -/** - * @brief SetNfcEnableFlag - * @param[in] flag Input flag. - */ -Result SetNfcEnableFlag(bool flag); - -/** - * @brief GetSleepSettings - * @param[out] out \ref SetSysSleepSettings - */ -Result GetSleepSettings(SetSysSleepSettings *out); - -/** - * @brief SetSleepSettings - * @param[in] settings \ref SetSysSleepSettings - */ -Result SetSleepSettings(const SetSysSleepSettings *settings); - -/** - * @brief GetWirelessLanEnableFlag - * @param[out] out Output flag. - */ -Result GetWirelessLanEnableFlag(bool *out); - -/** - * @brief SetWirelessLanEnableFlag - * @param[in] flag Input flag. - */ -Result SetWirelessLanEnableFlag(bool flag); - -/** - * @brief GetInitialLaunchSettings - * @param[out] out \ref SetSysInitialLaunchSettings - */ -Result GetInitialLaunchSettings(SetSysInitialLaunchSettings *out); - -/** - * @brief SetInitialLaunchSettings - * @param[in] settings \ref SetSysInitialLaunchSettings - */ -Result SetInitialLaunchSettings(const SetSysInitialLaunchSettings *settings); - -/** - * @brief Gets the system's nickname. - * @note Same as \ref setGetDeviceNickname, which official sw uses instead on [10.1.0+]. - * @param[out] nickname \ref SetSysDeviceNickName - */ -Result GetDeviceNickname(SetSysDeviceNickName *nickname); - -/** - * @brief Sets the system's nickname. - * @param[in] nickname \ref SetSysDeviceNickName - */ -Result SetDeviceNickname(const SetSysDeviceNickName *nickname); - -/** - * @brief GetProductModel - * @param[out] model Output SetSysProductModel. - */ -Result GetProductModel(SetSysProductModel *model); - -/** - * @brief GetLdnChannel - * @param[out] out Output LdnChannel. - */ -Result GetLdnChannel(s32 *out); - -/** - * @brief SetLdnChannel - * @param[in] channel Input LdnChannel. - */ -Result SetLdnChannel(s32 channel); - -/** - * @brief Gets an event that settings will signal on flag change. - * @param out_event Event to bind. Output event will have autoclear=false. - */ -Result AcquireTelemetryDirtyFlagEventHandle(Event *out_event); - -/** - * @brief Gets the settings flags that have changed. - * @param flags_0 Pointer to populate with first 64 flags. - * @param flags_1 Pointer to populate with second 64 flags. - */ -Result GetTelemetryDirtyFlags(u64 *flags_0, u64 *flags_1); - -/** - * @brief GetPtmBatteryLot - * @param[out] out \ref SetBatteryLot - */ -Result GetPtmBatteryLot(SetBatteryLot *out); - -/** - * @brief SetPtmBatteryLot - * @param[in] lot \ref SetBatteryLot - */ -Result SetPtmBatteryLot(const SetBatteryLot *lot); - -/** - * @brief GetPtmFuelGaugeParameter - * @param[out] out \ref SetSysPtmFuelGaugeParameter - */ -Result GetPtmFuelGaugeParameter(SetSysPtmFuelGaugeParameter *out); - -/** - * @brief SetPtmFuelGaugeParameter - * @param[in] parameter \ref SetSysPtmFuelGaugeParameter - */ -Result SetPtmFuelGaugeParameter(const SetSysPtmFuelGaugeParameter *parameter); - -/** - * @brief GetBluetoothEnableFlag - * @param[out] out Output flag. - */ -Result GetBluetoothEnableFlag(bool *out); - -/** - * @brief SetBluetoothEnableFlag - * @param[in] flag Input flag. - */ -Result SetBluetoothEnableFlag(bool flag); - -/** - * @brief GetMiiAuthorId - * @param[out] out Output MiiAuthorId. - */ -Result GetMiiAuthorId(Uuid *out); - -/** - * @brief SetShutdownRtcValue - * @param[in] value Input value. - */ -Result SetShutdownRtcValue(u64 value); - -/** - * @brief GetShutdownRtcValue - * @param[out] out Output value. - */ -Result GetShutdownRtcValue(u64 *out); - -/** - * @brief Gets an event that settings will signal on flag change. - * @param out_event Event to bind. Output event will have autoclear=false. - */ -Result AcquireFatalDirtyFlagEventHandle(Event *out_event); - -/** - * @brief Gets the settings flags that have changed. - * @param flags_0 Pointer to populate with first 64 flags. - * @param flags_1 Pointer to populate with second 64 flags. - */ -Result GetFatalDirtyFlags(u64 *flags_0, u64 *flags_1); - -/** - * @brief GetAutoUpdateEnableFlag - * @note Only available on [2.0.0+]. - * @param[out] out Output flag. - */ -Result GetAutoUpdateEnableFlag(bool *out); - -/** - * @brief SetAutoUpdateEnableFlag - * @note Only available on [2.0.0+]. - * @param[in] flag Input flag. - */ -Result SetAutoUpdateEnableFlag(bool flag); - -/** - * @brief GetNxControllerSettings - * @note On [13.0.0+] \ref setsysGetNxControllerSettingsEx should be used instead. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysNxControllerLegacySettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetNxControllerSettings(s32 *total_out, SetSysNxControllerLegacySettings *settings, s32 count); - -/** - * @brief SetNxControllerSettings - * @note On [13.0.0+] \ref setsysSetNxControllerSettingsEx should be used instead. - * @param[in] settings Input array of \ref SetSysNxControllerLegacySettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetNxControllerSettings(const SetSysNxControllerLegacySettings *settings, s32 count); - -/** - * @brief GetBatteryPercentageFlag - * @note Only available on [2.0.0+]. - * @param[out] out Output flag. - */ -Result GetBatteryPercentageFlag(bool *out); - -/** - * @brief SetBatteryPercentageFlag - * @note Only available on [2.0.0+]. - * @param[in] flag Input flag. - */ -Result SetBatteryPercentageFlag(bool flag); - -/** - * @brief GetExternalRtcResetFlag - * @note Only available on [2.0.0+]. - * @param[out] out Output flag. - */ -Result GetExternalRtcResetFlag(bool *out); - -/** - * @brief SetExternalRtcResetFlag - * @note Only available on [2.0.0+]. - * @param[in] flag Input flag. - */ -Result SetExternalRtcResetFlag(bool flag); - -/** - * @brief GetUsbFullKeyEnableFlag - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result GetUsbFullKeyEnableFlag(bool *out); - -/** - * @brief SetUsbFullKeyEnableFlag - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result SetUsbFullKeyEnableFlag(bool flag); - -/** - * @brief SetExternalSteadyClockInternalOffset - * @note Only available on [3.0.0+]. - * @param[in] offset Input offset. - */ -Result SetExternalSteadyClockInternalOffset(u64 offset); - -/** - * @brief GetExternalSteadyClockInternalOffset - * @note Only available on [3.0.0+]. - * @param[out] out Output offset. - */ -Result GetExternalSteadyClockInternalOffset(u64 *out); - -/** - * @brief GetBacklightSettingsEx - * @note Only available on [3.0.0+]. - * @param[out] out \ref SetSysBacklightSettingsEx - */ -Result GetBacklightSettingsEx(SetSysBacklightSettingsEx *out); - -/** - * @brief SetBacklightSettingsEx - * @note Only available on [3.0.0+]. - * @param[in] settings \ref SetSysBacklightSettingsEx - */ -Result SetBacklightSettingsEx(const SetSysBacklightSettingsEx *settings); - -/** - * @brief GetHeadphoneVolumeWarningCount - * @note Only available on [3.0.0+]. - * @param[out] out Output count. - */ -Result GetHeadphoneVolumeWarningCount(u32 *out); - -/** - * @brief SetHeadphoneVolumeWarningCount - * @note Only available on [3.0.0+]. - * @param[in] count Input count. - */ -Result SetHeadphoneVolumeWarningCount(u32 count); - -/** - * @brief GetBluetoothAfhEnableFlag - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result GetBluetoothAfhEnableFlag(bool *out); - -/** - * @brief SetBluetoothAfhEnableFlag - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result SetBluetoothAfhEnableFlag(bool flag); - -/** - * @brief GetBluetoothBoostEnableFlag - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result GetBluetoothBoostEnableFlag(bool *out); - -/** - * @brief SetBluetoothBoostEnableFlag - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result SetBluetoothBoostEnableFlag(bool flag); - -/** - * @brief GetInRepairProcessEnableFlag - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result GetInRepairProcessEnableFlag(bool *out); - -/** - * @brief SetInRepairProcessEnableFlag - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result SetInRepairProcessEnableFlag(bool flag); - -/** - * @brief GetHeadphoneVolumeUpdateFlag - * @note Only available on [3.0.0+]. - * @param[out] out Output flag. - */ -Result GetHeadphoneVolumeUpdateFlag(bool *out); - -/** - * @brief SetHeadphoneVolumeUpdateFlag - * @note Only available on [3.0.0+]. - * @param[in] flag Input flag. - */ -Result SetHeadphoneVolumeUpdateFlag(bool flag); - -/** - * @brief NeedsToUpdateHeadphoneVolume - * @note Only available on [3.0.0-14.1.2]. - * @param[out] a0 Output arg. - * @param[out] a1 Output arg. - * @param[out] a2 Output arg. - * @param[in] flag Input flag. - */ -Result NeedsToUpdateHeadphoneVolume(u8 *a0, u8 *a1, u8 *a2, bool flag); - -/** - * @brief GetPushNotificationActivityModeOnSleep - * @note Only available on [3.0.0+]. - * @param[out] out Output mode. - */ -Result GetPushNotificationActivityModeOnSleep(u32 *out); - -/** - * @brief SetPushNotificationActivityModeOnSleep - * @note Only available on [3.0.0+]. - * @param[in] mode Input mode. - */ -Result SetPushNotificationActivityModeOnSleep(u32 mode); - -/** - * @brief GetServiceDiscoveryControlSettings - * @note Only available on [4.0.0+]. - * @param[out] out \ref ServiceDiscoveryControlSettings - */ -Result GetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings *out); - -/** - * @brief SetServiceDiscoveryControlSettings - * @note Only available on [4.0.0+]. - * @param[in] settings \ref ServiceDiscoveryControlSettings - */ -Result SetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings settings); - -/** - * @brief GetErrorReportSharePermission - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetSysErrorReportSharePermission - */ -Result GetErrorReportSharePermission(SetSysErrorReportSharePermission *out); - -/** - * @brief SetErrorReportSharePermission - * @note Only available on [4.0.0+]. - * @param[in] permission \ref SetSysErrorReportSharePermission - */ -Result SetErrorReportSharePermission(SetSysErrorReportSharePermission permission); - -/** - * @brief GetAppletLaunchFlags - * @note Only available on [4.0.0+]. - * @param[out] out Output AppletLaunchFlags bitmask. - */ -Result GetAppletLaunchFlags(u32 *out); - -/** - * @brief SetAppletLaunchFlags - * @note Only available on [4.0.0+]. - * @param[in] flags Input AppletLaunchFlags bitmask. - */ -Result SetAppletLaunchFlags(u32 flags); - -/** - * @brief GetConsoleSixAxisSensorAccelerationBias - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetSysConsoleSixAxisSensorAccelerationBias - */ -Result GetConsoleSixAxisSensorAccelerationBias(SetSysConsoleSixAxisSensorAccelerationBias *out); - -/** - * @brief SetConsoleSixAxisSensorAccelerationBias - * @note Only available on [4.0.0+]. - * @param[in] bias \ref SetSysConsoleSixAxisSensorAccelerationBias - */ -Result SetConsoleSixAxisSensorAccelerationBias(const SetSysConsoleSixAxisSensorAccelerationBias *bias); - -/** - * @brief GetConsoleSixAxisSensorAngularVelocityBias - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetSysConsoleSixAxisSensorAngularVelocityBias - */ -Result GetConsoleSixAxisSensorAngularVelocityBias(SetSysConsoleSixAxisSensorAngularVelocityBias *out); - -/** - * @brief SetConsoleSixAxisSensorAngularVelocityBias - * @note Only available on [4.0.0+]. - * @param[in] bias \ref SetSysConsoleSixAxisSensorAngularVelocityBias - */ -Result SetConsoleSixAxisSensorAngularVelocityBias(const SetSysConsoleSixAxisSensorAngularVelocityBias *bias); - -/** - * @brief GetConsoleSixAxisSensorAccelerationGain - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetSysConsoleSixAxisSensorAccelerationGain - */ -Result GetConsoleSixAxisSensorAccelerationGain(SetSysConsoleSixAxisSensorAccelerationGain *out); - -/** - * @brief SetConsoleSixAxisSensorAccelerationGain - * @note Only available on [4.0.0+]. - * @param[in] gain \ref SetSysConsoleSixAxisSensorAccelerationGain - */ -Result SetConsoleSixAxisSensorAccelerationGain(const SetSysConsoleSixAxisSensorAccelerationGain *gain); - -/** - * @brief GetConsoleSixAxisSensorAngularVelocityGain - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetSysConsoleSixAxisSensorAngularVelocityGain - */ -Result GetConsoleSixAxisSensorAngularVelocityGain(SetSysConsoleSixAxisSensorAngularVelocityGain *out); - -/** - * @brief SetConsoleSixAxisSensorAngularVelocityGain - * @note Only available on [4.0.0+]. - * @param[in] gain \ref SetSysConsoleSixAxisSensorAngularVelocityGain - */ -Result SetConsoleSixAxisSensorAngularVelocityGain(const SetSysConsoleSixAxisSensorAngularVelocityGain *gain); - -/** - * @brief GetKeyboardLayout - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetKeyboardLayout - */ -Result GetKeyboardLayout(::SetKeyboardLayout *out); - -/** - * @brief SetKeyboardLayout - * @note Only available on [4.0.0+]. - * @param[in] layout \ref SetKeyboardLayout - */ -Result SetKeyboardLayout(::SetKeyboardLayout layout); - -/** - * @brief GetWebInspectorFlag - * @note Only available on [4.0.0+]. - * @param[out] out Output flag. - */ -Result GetWebInspectorFlag(bool *out); - -/** - * @brief GetAllowedSslHosts - * @note Only available on [4.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] out Output array of \ref SetSysAllowedSslHosts. - * @param[in] count Size of the hosts array in entries. - */ -Result GetAllowedSslHosts(s32 *total_out, SetSysAllowedSslHosts *out, s32 count); - -/** - * @brief GetHostFsMountPoint - * @note Only available on [4.0.0+]. - * @param[out] out \ref SetSysHostFsMountPoint - */ -Result GetHostFsMountPoint(SetSysHostFsMountPoint *out); - -/** - * @brief GetRequiresRunRepairTimeReviser - * @note Only available on [5.0.0+]. - * @param[out] out Output flag. - */ -Result GetRequiresRunRepairTimeReviser(bool *out); - -/** - * @brief SetRequiresRunRepairTimeReviser - * @note Only available on [5.0.0+]. - * @param[in] flag Input flag. - */ -Result SetRequiresRunRepairTimeReviser(bool flag); - -/** - * @brief SetBlePairingSettings - * @note Only available on [5.0.0+]. - * @param[in] settings Input array of \ref SetSysBlePairingSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetBlePairingSettings(const SetSysBlePairingSettings *settings, s32 count); - -/** - * @brief GetBlePairingSettings - * @note Only available on [5.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysBlePairingSettings. - * @param[in] count Size of the hosts array in entries. - */ -Result GetBlePairingSettings(s32 *total_out, SetSysBlePairingSettings *settings, s32 count); - -/** - * @brief GetConsoleSixAxisSensorAngularVelocityTimeBias - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetSysConsoleSixAxisSensorAngularVelocityTimeBias - */ -Result GetConsoleSixAxisSensorAngularVelocityTimeBias(SetSysConsoleSixAxisSensorAngularVelocityTimeBias *out); - -/** - * @brief SetConsoleSixAxisSensorAngularVelocityTimeBias - * @note Only available on [5.0.0+]. - * @param[in] bias \ref SetSysConsoleSixAxisSensorAngularVelocityTimeBias - */ -Result SetConsoleSixAxisSensorAngularVelocityTimeBias(const SetSysConsoleSixAxisSensorAngularVelocityTimeBias *bias); - -/** - * @brief GetConsoleSixAxisSensorAngularAcceleration - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetSysConsoleSixAxisSensorAngularAcceleration - */ -Result GetConsoleSixAxisSensorAngularAcceleration(SetSysConsoleSixAxisSensorAngularAcceleration *out); - -/** - * @brief SetConsoleSixAxisSensorAngularAcceleration - * @note Only available on [5.0.0+]. - * @param[in] acceleration \ref SetSysConsoleSixAxisSensorAngularAcceleration - */ -Result SetConsoleSixAxisSensorAngularAcceleration(const SetSysConsoleSixAxisSensorAngularAcceleration *acceleration); - -/** - * @brief GetRebootlessSystemUpdateVersion - * @note Only available on [5.0.0+]. - * @param[out] out \ref SetSysRebootlessSystemUpdateVersion - */ -Result GetRebootlessSystemUpdateVersion(SetSysRebootlessSystemUpdateVersion *out); - -/** - * @brief GetDeviceTimeZoneLocationUpdatedTime - * @note Only available on [5.0.0+]. - * @param[out] out \ref TimeSteadyClockTimePoint - */ -Result GetDeviceTimeZoneLocationUpdatedTime(TimeSteadyClockTimePoint *out); - -/** - * @brief SetDeviceTimeZoneLocationUpdatedTime - * @note Only available on [5.0.0+]. - * @param[in] time_point \ref TimeSteadyClockTimePoint - */ -Result SetDeviceTimeZoneLocationUpdatedTime(const TimeSteadyClockTimePoint *time_point); - -/** - * @brief GetUserSystemClockAutomaticCorrectionUpdatedTime - * @note Only available on [6.0.0+]. - * @param[out] out \ref TimeSteadyClockTimePoint - */ -Result GetUserSystemClockAutomaticCorrectionUpdatedTime(TimeSteadyClockTimePoint *out); - -/** - * @brief SetUserSystemClockAutomaticCorrectionUpdatedTime - * @note Only available on [6.0.0+]. - * @param[in] time_point \ref TimeSteadyClockTimePoint - */ -Result SetUserSystemClockAutomaticCorrectionUpdatedTime(const TimeSteadyClockTimePoint *time_point); - -/** - * @brief GetAccountOnlineStorageSettings - * @note Only available on [6.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysAccountOnlineStorageSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetAccountOnlineStorageSettings(s32 *total_out, SetSysAccountOnlineStorageSettings *settings, s32 count); - -/** - * @brief SetAccountOnlineStorageSettings - * @note Only available on [6.0.0+]. - * @param[in] settings Input array of \ref SetSysAccountOnlineStorageSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetAccountOnlineStorageSettings(const SetSysAccountOnlineStorageSettings *settings, s32 count); - -/** - * @brief GetPctlReadyFlag - * @note Only available on [6.0.0+]. - * @param[out] out Output flag. - */ -Result GetPctlReadyFlag(bool *out); - -/** - * @brief SetPctlReadyFlag - * @note Only available on [6.0.0+]. - * @param[in] flag Input flag. - */ -Result SetPctlReadyFlag(bool flag); - -/** - * @brief GetAnalogStickUserCalibrationL - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetSysAnalogStickUserCalibration - */ -Result GetAnalogStickUserCalibrationL(SetSysAnalogStickUserCalibration *out); - -/** - * @brief SetAnalogStickUserCalibrationL - * @note Only available on [8.1.1+]. - * @param[in] calibration \ref SetSysAnalogStickUserCalibration - */ -Result SetAnalogStickUserCalibrationL(const SetSysAnalogStickUserCalibration *calibration); - -/** - * @brief GetAnalogStickUserCalibrationR - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetSysAnalogStickUserCalibration - */ -Result GetAnalogStickUserCalibrationR(SetSysAnalogStickUserCalibration *out); - -/** - * @brief SetAnalogStickUserCalibrationR - * @note Only available on [8.1.1+]. - * @param[in] calibration \ref SetSysAnalogStickUserCalibration - */ -Result SetAnalogStickUserCalibrationR(const SetSysAnalogStickUserCalibration *calibration); - -/** - * @brief GetPtmBatteryVersion - * @note Only available on [6.0.0+]. - * @param[out] out Output version. - */ -Result GetPtmBatteryVersion(u8 *out); - -/** - * @brief SetPtmBatteryVersion - * @note Only available on [6.0.0+]. - * @param[in] version Input version. - */ -Result SetPtmBatteryVersion(u8 version); - -/** - * @brief GetUsb30HostEnableFlag - * @note Only available on [6.0.0+]. - * @param[out] out Output flag. - */ -Result GetUsb30HostEnableFlag(bool *out); - -/** - * @brief SetUsb30HostEnableFlag - * @note Only available on [6.0.0+]. - * @param[in] flag Input flag. - */ -Result SetUsb30HostEnableFlag(bool flag); - -/** - * @brief GetUsb30DeviceEnableFlag - * @note Only available on [6.0.0+]. - * @param[out] out Output flag. - */ -Result GetUsb30DeviceEnableFlag(bool *out); - -/** - * @brief SetUsb30DeviceEnableFlag - * @note Only available on [6.0.0+]. - * @param[in] flag Input flag. - */ -Result SetUsb30DeviceEnableFlag(bool flag); - -/** - * @brief GetThemeId - * @note Only available on [7.0.0+]. - * @param[in] type Input theme id type. - * @param[out] out \ref SetSysThemeId - */ -Result GetThemeId(s32 type, SetSysThemeId *out); - -/** - * @brief SetThemeId - * @note Only available on [7.0.0+]. - * @param[in] type Input theme id type. - * @param[in] theme_id \ref SetSysThemeId - */ -Result SetThemeId(s32 type, const SetSysThemeId *theme_id); - -/** - * @brief GetChineseTraditionalInputMethod - * @note Only available on [7.0.0+]. - * @param[out] out \ref SetChineseTraditionalInputMethod - */ -Result GetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod *out); - -/** - * @brief SetChineseTraditionalInputMethod - * @note Only available on [7.0.0+]. - * @param[in] method \ref SetChineseTraditionalInputMethod - */ -Result SetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod method); - -/** - * @brief GetPtmCycleCountReliability - * @note Only available on [7.0.0+]. - * @param[out] out \ref SetSysPtmCycleCountReliability - */ -Result GetPtmCycleCountReliability(SetSysPtmCycleCountReliability *out); - -/** - * @brief SetPtmCycleCountReliability - * @note Only available on [7.0.0+]. - * @param[in] reliability \ref SetSysPtmCycleCountReliability - */ -Result SetPtmCycleCountReliability(SetSysPtmCycleCountReliability reliability); - -/** - * @brief Gets the \ref SetSysHomeMenuScheme. - * @note Only available on [8.1.1+]. - * @param[out] out \ref SetSysHomeMenuScheme - */ -Result GetHomeMenuScheme(SetSysHomeMenuScheme *out); - -/** - * @brief GetThemeSettings - * @note Only available on [7.0.0+]. - * @param[out] out \ref SetSysThemeSettings - */ -Result GetThemeSettings(SetSysThemeSettings *out); - -/** - * @brief SetThemeSettings - * @note Only available on [7.0.0+]. - * @param[in] settings \ref SetSysThemeSettings - */ -Result SetThemeSettings(const SetSysThemeSettings *settings); - -/** - * @brief GetThemeKey - * @note Only available on [7.0.0+]. - * @param[out] out \ref FsArchiveMacKey - */ -Result GetThemeKey(FsArchiveMacKey *out); - -/** - * @brief SetThemeKey - * @note Only available on [7.0.0+]. - * @param[in] key \ref FsArchiveMacKey - */ -Result SetThemeKey(const FsArchiveMacKey *key); - -/** - * @brief GetZoomFlag - * @note Only available on [8.0.0+]. - * @param[out] out Output flag. - */ -Result GetZoomFlag(bool *out); - -/** - * @brief SetZoomFlag - * @note Only available on [8.0.0+]. - * @param[in] flag Input flag. - */ -Result SetZoomFlag(bool flag); - -/** - * @brief Returns Terra platform type flag. - * @note On [9.0.0+], this is a wrapper for \ref setsysGetPlatFormRegion() == 2. - * @note Only available on [8.0.0+]. - * @param[out] out Output flag. - */ -Result GetT(bool *out); - -/** - * @brief Sets Terra platform type flag. - * @note On [9.0.0+], this is a wrapper for \ref setsysSetPlatFormRegion(1 + (IsT & 1)). - * @note Only available on [8.0.0+]. - * @param[in] flag Input flag. - */ -Result SetT(bool flag); - -/** - * @brief Gets the \ref SetSysPlatformRegion. - * @note This is used internally by \ref appletGetSettingsPlatformRegion. - * @note Only available on [9.0.0+]. - * @param[out] out \ref SetSysPlatformRegion - */ -Result GetPlatformRegion(SetSysPlatformRegion *out); - -/** - * @brief Sets the \ref SetSysPlatformRegion. - * @note Only available on [9.0.0+]. - * @param[in] region \ref SetSysPlatformRegion - */ -Result SetPlatformRegion(SetSysPlatformRegion region); - -/** - * @brief GetHomeMenuSchemeModel - * @note This will throw an error when loading the "settings_debug!{...}" system-setting which is used with this fails. - * @note Only available on [9.0.0+]. - * @param[out] out HomeMenuSchemeModel. - */ -Result GetHomeMenuSchemeModel(u32 *out); - -/** - * @brief GetMemoryUsageRateFlag - * @note Only available on [9.0.0+]. - * @param[out] out Output flag. - */ -Result GetMemoryUsageRateFlag(bool *out); - -/** - * @brief Gets the \ref SetSysTouchScreenMode. - * @note Only available on [9.0.0+]. - * @param[out] out \ref SetSysTouchScreenMode - */ -Result GetTouchScreenMode(SetSysTouchScreenMode *out); - -/** - * @brief Sets the \ref SetSysTouchScreenMode. - * @note Only available on [9.0.0+]. - * @param[in] mode \ref SetSysTouchScreenMode - */ -Result SetTouchScreenMode(SetSysTouchScreenMode mode); - -/** - * @brief GetButtonConfigSettingsFull - * @note Only available on [10.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetButtonConfigSettingsFull(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief SetButtonConfigSettingsFull - * @note Only available on [10.0.0+]. - * @param[in] settings Input array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetButtonConfigSettingsFull(const SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief GetButtonConfigSettingsEmbedded - * @note Only available on [10.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetButtonConfigSettingsEmbedded(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief SetButtonConfigSettingsEmbedded - * @note Only available on [10.0.0+]. - * @param[in] settings Input array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetButtonConfigSettingsEmbedded(const SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief GetButtonConfigSettingsLeft - * @note Only available on [10.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetButtonConfigSettingsLeft(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief SetButtonConfigSettingsLeft - * @note Only available on [10.0.0+]. - * @param[in] settings Input array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetButtonConfigSettingsLeft(const SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief GetButtonConfigSettingsRight - * @note Only available on [10.0.0+]. - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetButtonConfigSettingsRight(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief SetButtonConfigSettingsRight - * @note Only available on [10.0.0+]. - * @param[in] settings Input array of \ref SetSysButtonConfigSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetButtonConfigSettingsRight(const SetSysButtonConfigSettings *settings, s32 count); - -/** - * @brief GetButtonConfigRegisteredSettingsEmbedded - * @note Only available on [10.0.0+]. - * @param[out] settings \ref SetSysButtonConfigRegisteredSettings - */ -Result GetButtonConfigRegisteredSettingsEmbedded(SetSysButtonConfigRegisteredSettings *settings); - -/** - * @brief SetButtonConfigRegisteredSettingsEmbedded - * @note Only available on [10.0.0+]. - * @param[in] settings \ref SetSysButtonConfigRegisteredSettings - */ -Result SetButtonConfigRegisteredSettingsEmbedded(const SetSysButtonConfigRegisteredSettings *settings); - -/** - * @brief GetButtonConfigRegisteredSettings - * @note Only available on [10.0.0+]. - * @param[out] settings \ref SetSysButtonConfigRegisteredSettings - */ -Result GetButtonConfigRegisteredSettings(s32 *total_out, SetSysButtonConfigRegisteredSettings *settings, s32 count); - -/** - * @brief SetButtonConfigRegisteredSettings - * @note Only available on [10.0.0+]. - * @param[in] settings \ref SetSysButtonConfigRegisteredSettings - */ -Result SetButtonConfigRegisteredSettings(const SetSysButtonConfigRegisteredSettings *settings, s32 count); - -/** - * @brief GetFieldTestingFlag - * @note Only available on [10.1.0+]. - * @param[out] out Output flag. - */ -Result GetFieldTestingFlag(bool *out); - -/** - * @brief SetFieldTestingFlag - * @note Only available on [10.1.0+]. - * @param[in] flag Input flag. - */ -Result SetFieldTestingFlag(bool flag); - -/** - * @brief GetNxControllerSettingsEx - * @param[out] total_out Total output entries. - * @param[out] settings Output array of \ref SetSysNxControllerSettings. - * @param[in] count Size of the settings array in entries. - */ -Result GetNxControllerSettingsEx(s32 *total_out, SetSysNxControllerSettings *settings, s32 count); - -/** - * @brief SetNxControllerSettingsEx - * @param[in] settings Input array of \ref SetSysNxControllerSettings. - * @param[in] count Size of the settings array in entries. - */ -Result SetNxControllerSettingsEx(const SetSysNxControllerSettings *settings, s32 count); - -} // namespace setsys - -/// @brief C++ wrappers for the `sha1` API. -/// @details Wraps: switch/crypto/sha1.h. -namespace sha1 { - -/// Context for SHA1 operations. -using ::Sha1Context; - -/// Initialize a SHA1 context. -void ContextCreate(Sha1Context *out); - -/// Updates SHA1 context with data to hash -void ContextUpdate(Sha1Context *ctx, const void *src, size_t size); - -/// Gets the context's output hash, finalizes the context. -void ContextGetHash(Sha1Context *ctx, void *dst); - -/// Simple all-in-one SHA1 calculator. -void CalculateHash(void *dst, const void *src, size_t size); - -} // namespace sha1 - -/// @brief C++ wrappers for the `sha256` API. -/// @details Wraps: switch/crypto/sha256.h. -namespace sha256 { - -/// Context for SHA256 operations. -using ::Sha256Context; - -/// Initialize a SHA256 context. -void ContextCreate(Sha256Context *out); - -/// Updates SHA256 context with data to hash -void ContextUpdate(Sha256Context *ctx, const void *src, size_t size); - -/// Gets the context's output hash, finalizes the context. -void ContextGetHash(Sha256Context *ctx, void *dst); - -/// Simple all-in-one SHA256 calculator. -void CalculateHash(void *dst, const void *src, size_t size); - -} // namespace sha256 - -/// @brief C++ wrappers for the `shmem` API. -/// @details Wraps: switch/kernel/shmem.h. -namespace shmem { - -/// Shared memory information structure. -using ::SharedMemory; - -/** - * @brief Creates a shared memory object. - * @param s Shared memory information structure which will be filled in. - * @param size Size of the shared memory object to create. - * @param local_perm Permissions with which the shared memory object will be mapped in the local process. - * @param remote_perm Permissions with which the shared memory object will be mapped in the remote process (can be Perm_DontCare). - * @return Result code. - * @warning This is a privileged operation; in normal circumstances applications cannot use this function. - */ -Result Create(SharedMemory* s, size_t size, Permission local_perm, Permission remote_perm); - -/** - * @brief Loads a shared memory object coming from a remote process. - * @param s Shared memory information structure which will be filled in. - * @param handle Handle of the shared memory object. - * @param size Size of the shared memory object that is being loaded. - * @param perm Permissions with which the shared memory object will be mapped in the local process. - */ -void LoadRemote(SharedMemory* s, Handle handle, size_t size, Permission perm); - -/** - * @brief Maps a shared memory object. - * @param s Shared memory information structure. - * @return Result code. - */ -Result Map(SharedMemory* s); - -/** - * @brief Unmaps a shared memory object. - * @param s Shared memory information structure. - * @return Result code. - */ -Result Unmap(SharedMemory* s); - -/** - * @brief Retrieves the mapped address of a shared memory object. - * @param s Shared memory information structure. - * @return Mapped address of the shared memory object. - */ -void* GetAddr(SharedMemory* s); - -/** - * @brief Frees up resources used by a shared memory object, unmapping and closing handles, etc. - * @param s Shared memory information structure. - * @return Result code. - */ -Result Close(SharedMemory* s); - -} // namespace shmem - -/// @brief C++ wrappers for the `sm` API. -/// @details Wraps: switch/services/sm.h, switch/services/smm.h. -namespace sm { - -/// Structure representing a service name (null terminated, remaining characters set to zero). -using ::SmServiceName; - -/// Converts a service name into a 64-bit integer. -u64 ServiceNameToU64(SmServiceName name); - -/// Converts a 64-bit integer into a service name. -SmServiceName ServiceNameFromU64(u64 name); - -/** - * @brief Checks whether two service names are equal. - * @param[in] a First name. - * @param[in] b Second name. - * @return Comparison result. - */ -bool ServiceNamesAreEqual(SmServiceName a, SmServiceName b); - -/** - * @brief Encodes a service name string as a \ref SmServiceName structure. - * @param[in] name Name of the service. - * @return Encoded name. - */ -SmServiceName EncodeName(const char* name); - -/** - * @brief Initializes SM. - * @return Result code. - * @note This function is already called in the default application startup code (before main() is called). - */ -Result Initialize(void); - -/** - * @brief Uninitializes SM. - * @return Result code. - * @note This function is already handled in the default application exit code (after main() returns). - */ -void Exit(void); - -/** - * @brief Requests a service from SM, allowing overrides. - * @param[out] service_out Service structure which will be filled in. - * @param[in] name Name of the service to request. - * @return Result code. - */ -Result GetServiceWrapper(Service* service_out, SmServiceName name); - -/** - * @brief Requests a service from SM, as an IPC session handle directly - * @param[out] handle_out Variable containing IPC session handle. - * @param[in] name Name of the service to request. - * @return Result code. - */ -Result GetServiceOriginal(Handle* handle_out, SmServiceName name); - -/** - * @brief Requests a service from SM. - * @param[out] service_out Service structure which will be filled in. - * @param[in] name Name of the service to request (as a string). - * @return Result code. - */ -Result GetService(Service* service_out, const char* name); - -/** - * @brief Retrieves an overriden service in the homebrew environment. - * @param[in] name Name of the service to request. - * @return IPC session handle. - */ -Handle GetServiceOverride(SmServiceName name); - -/** - * @brief Creates and registers a new service within SM. - * @param[out] handle_out Variable containing IPC port handle. - * @param[in] name Name of the service. - * @param[in] is_light "Is light" - * @param[in] max_sessions Maximum number of concurrent sessions that the service will accept. - * @return Result code. - */ -Result RegisterService(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions); - -/// Same as \ref smRegisterService, but always using cmif serialization. -Result RegisterServiceCmif(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions); - -/// Same as \ref smRegisterService, but always using tipc serialization. -Result RegisterServiceTipc(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions); - -/** - * @brief Unregisters a previously registered service in SM. - * @param[in] name Name of the service. - * @return Result code. - */ -Result UnregisterService(SmServiceName name); - -/// Same as \ref smUnregisterService, but always using cmif serialization. -Result UnregisterServiceCmif(SmServiceName name); - -/// Same as \ref smUnregisterService, but always using tipc serialization. -Result UnregisterServiceTipc(SmServiceName name); - -/** - * @brief Detaches the current SM session. - * @note After this function is called, the rest of the SM API cannot be used. - * @note Only available on [11.0.0-11.0.1], or Atmosphère. - */ -Result DetachClient(void); - -/// Same as \ref smDetachClient, but always using cmif serialization. -Result DetachClientCmif(void); - -/// Same as \ref smDetachClient, but always using tipc serialization. -Result DetachClientTipc(void); - -/** - * @brief Gets the Service session used to communicate with SM. - * @return Pointer to service session used to communicate with SM. - */ -Service * GetServiceSession(void); - -/** - * @brief Gets the TipcService session used to communicate with SM. - * @return Pointer to tipc service session used to communicate with SM. - * @note Only available on [12.0.0+], or Atmosphère. - */ -TipcService * GetServiceSessionTipc(void); - -/** - * @brief Overrides a service with a custom IPC service handle. - * @param[in] name Name of the service. - * @param[in] handle IPC session handle. - */ -void AddOverrideHandle(SmServiceName name, Handle handle); - -/// Initialize sm:m. -Result ManagerInitialize(void); - -/// Exit sm:m. -void ManagerExit(void); - -Result ManagerRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size); - -Result ManagerUnregisterProcess(u64 pid); - -/// Initialize sm:m exclusively for tipc (requires <12.0.0 and non-Atmosphere). -Result ManagerCmifInitialize(void); - -/// Exit sm:m exclusively for tipc (requires <12.0.0 and non-Atmosphere). -void ManagerCmifExit(void); - -/// Gets the Service object for the actual sm:m service session (requires <12.0.0 and non-Atmosphere). -Service* ManagerCmifGetServiceSession(void); - -Result ManagerCmifRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size); - -Result ManagerCmifUnregisterProcess(u64 pid); - -/// Initialize sm:m exclusively for tipc (requires 12.0.0+ or Atmosphere). -Result ManagerTipcInitialize(void); - -/// Exit sm:m exclusively for tipc (requires 12.0.0+ or Atmosphere). -void ManagerTipcExit(void); - -/// Gets the TipcService object for the actual sm:m service session (requires 12.0.0+ or Atmosphere). -TipcService* ManagerTipcGetServiceSession(void); - -Result ManagerTipcRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size); - -Result ManagerTipcUnregisterProcess(u64 pid); - -} // namespace sm - -/// @brief C++ wrappers for the `socket` API. -/// @details Wraps: switch/runtime/devices/socket.h. -namespace socket { - -/// BSD service type used by the socket driver. -using ::BsdServiceType; -#ifdef _SOCKLEN_T_DECLARED -using ::sockaddr; -#endif -/// Configuration structure for socketInitalize -using ::SocketInitConfig; - -/// Fetch the default configuration for the socket driver. -const SocketInitConfig * GetDefaultInitConfig(void); - -/// Initalize the socket driver. -Result Initialize(const SocketInitConfig *config); - -/// Fetch the last bsd:u/s Switch result code (thread-local). -Result GetLastResult(void); - -/// Deinitialize the socket driver. -void Exit(void); - -/// Initalize the socket driver using the default configuration. -Result InitializeDefault(void); - -/// Wrapper for \ref sslConnectionSetSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored. -int SslConnectionSetSocketDescriptor(SslConnection *c, int sockfd); - -/// Wrapper for \ref sslConnectionGetSocketDescriptor. Returns the output sockfd on success and -1 on error. -int SslConnectionGetSocketDescriptor(SslConnection *c); - -#ifdef _SOCKLEN_T_DECLARED -/// Wrapper for \ref sslConnectionSetDtlsSocketDescriptor. Returns the output sockfd on success and -1 on error. errno==ENOENT indicates that no sockfd was returned, this error must be ignored. -int SslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen); -#endif - -/// Wrapper for \ref nifmRequestRegisterSocketDescriptor. Returns 0 on success and -1 on error. -int NifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd); - -/// Wrapper for \ref nifmRequestUnregisterSocketDescriptor. Returns 0 on success and -1 on error. -int NifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd); - -} // namespace socket - -/// @brief C++ wrappers for the `spl` API. -/// @details Wraps: switch/services/spl.h. -namespace spl { - -using ::RsaKeyVersion; -using ::SplConfigItem; - -/// Initialize 'spl:'. -Result Initialize(void); - -/// Exit 'spl:'. -void Exit(void); - -/// Gets the Service object for the IGeneralInterface usable with spl*(). -Service* GetServiceSession(void); - -/// Initialize spl:mig. On pre-4.0.0 this just calls \ref splInitialize. -Result CryptoInitialize(void); - -/// Exit spl:mig. On pre-4.0.0 this just calls \ref splExit. -void CryptoExit(void); - -/// Gets the Service object for the IGeneralInterface usable with splCrypto*(). -Service* CryptoGetServiceSession(void); - -/// Initialize spl:ssl. On pre-4.0.0 this just calls \ref splInitialize. -Result SslInitialize(void); - -/// Exit spl:ssl. On pre-4.0.0 this just calls \ref splExit. -void SslExit(void); - -/// Gets the Service object for the IGeneralInterface usable with splSsl*(). -Service* SslGetServiceSession(void); - -/// Initialize spl:es. On pre-4.0.0 this just calls \ref splInitialize. -Result EsInitialize(void); - -/// Exit spl:es. On pre-4.0.0 this just calls \ref splExit. -void EsExit(void); - -/// Gets the Service object for the IGeneralInterface usable with splEs*(). -Service* EsGetServiceSession(void); - -/// Initialize spl:fs. On pre-4.0.0 this just calls \ref splInitialize. -Result FsInitialize(void); - -/// Exit spl:fs. On pre-4.0.0 this just calls \ref splExit. -void FsExit(void); - -/// Gets the Service object for the IGeneralInterface usable with splFs*(). -Service* FsGetServiceSession(void); - -/// Initialize spl:manu. On pre-4.0.0 this just calls \ref splInitialize. -Result ManuInitialize(void); - -/// Exit spl:manu. On pre-4.0.0 this just calls \ref splExit. -void ManuExit(void); - -/// Gets the Service object for the IGeneralInterface usable with splManu*(). -Service* ManuGetServiceSession(void); - -Result GetConfig(SplConfigItem config_item, u64 *out_config); - -Result UserExpMod(const void *input, const void *modulus, const void *exp, size_t exp_size, void *dst); - -Result SetConfig(SplConfigItem config_item, u64 value); - -Result GetRandomBytes(void *out, size_t out_size); - -Result IsDevelopment(bool *out_is_development); - -Result SetBootReason(u32 value); - -Result GetBootReason(u32 *out_value); - -Result CryptoGenerateAesKek(const void *wrapped_kek, u32 key_generation, u32 option, void *out_sealed_kek); - -Result CryptoLoadAesKey(const void *sealed_kek, const void *wrapped_key, u32 keyslot); - -Result CryptoGenerateAesKey(const void *sealed_kek, const void *wrapped_key, void *out_sealed_key); - -Result CryptoDecryptAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key); - -Result CryptoCryptAesCtr(const void *input, void *output, size_t size, u32 keyslot, const void *ctr); - -Result CryptoComputeCmac(const void *input, size_t size, u32 keyslot, void *out_cmac); - -Result CryptoLockAesEngine(u32 *out_keyslot); - -Result CryptoUnlockAesEngine(u32 keyslot); - -Result CryptoGetSecurityEngineEvent(Event *out_event); - -Result RsaDecryptPrivateKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version, void *dst, size_t dst_size); - -Result SslLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size); - -Result SslSecureExpMod(const void *input, const void *modulus, void *dst); - -Result EsLoadRsaOaepKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version); - -Result EsUnwrapRsaOaepWrappedTitlekey(const void *rsa_wrapped_titlekey, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_titlekey); - -Result EsUnwrapAesWrappedTitlekey(const void *aes_wrapped_titlekey, u32 key_generation, void *out_sealed_titlekey); - -Result EsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size); - -Result EsSecureExpMod(const void *input, const void *modulus, void *dst); - -Result EsUnwrapElicenseKey(const void *rsa_wrapped_elicense_key, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_elicense_key); - -Result EsLoadElicenseKey(const void *sealed_elicense_key, u32 keyslot); - -Result FsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version); - -Result FsSecureExpMod(const void *input, const void *modulus, void *dst); - -Result FsGenerateSpecificAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key); - -Result FsLoadTitlekey(const void *sealed_titlekey, u32 keyslot); - -Result FsGetPackage2Hash(void *out_hash); - -Result ManuEncryptRsaKeyForImport(const void *sealed_kek_pre, const void *wrapped_key_pre, const void *sealed_kek_post, const void *wrapped_kek_post, u32 option, const void *wrapped_rsa_key, void *out_wrapped_rsa_key, size_t rsa_key_size); - -} // namespace spl - -/// @brief C++ wrappers for the `spsm` API. -/// @details Wraps: switch/services/spsm.h. -namespace spsm { - -/// Initialize spsm. -Result Initialize(void); - -/// Exit spsm. -void Exit(void); - -/// Gets the Service object for the actual spsm service session. -Service* GetServiceSession(void); - -Result Shutdown(bool reboot); - -Result PutErrorState(void); - -} // namespace spsm - -/// @brief C++ wrappers for the `ssl` API. -/// @details Wraps: switch/services/ssl.h. -namespace ssl { - -/// AlpnProtoState -using ::SslAlpnProtoState; -/// BuiltInCertificateInfo -using ::SslBuiltInCertificateInfo; -/// CaCertificateId -using ::SslCaCertificateId; -/// CertificateFormat -using ::SslCertificateFormat; -/// CipherInfo -using ::SslCipherInfo; -/// SslConnection -using ::SslConnection; -/// SslContext -using ::SslContext; -/// ContextOption -using ::SslContextOption; -/// DebugOptionType -using ::SslDebugOptionType; -/// FlushSessionCacheOptionType -using ::SslFlushSessionCacheOptionType; -/// InternalPki -using ::SslInternalPki; -/// IoMode. The default value at the time of \ref sslContextCreateConnection is ::SslIoMode_Blocking. -/// The socket non-blocking flag is always set regardless of this field, this is only used internally for calculating the timeout used by various cmds. -using ::SslIoMode; -/// KeyAndCertParams -using ::SslKeyAndCertParams; -/// OptionType. The default bool flags value for these at the time of \ref sslContextCreateConnection is cleared. -using ::SslOptionType; -/// PollEvent -using ::SslPollEvent; -/// PrivateOptionType -using ::SslPrivateOptionType; -/// RenegotiationMode -using ::SslRenegotiationMode; -/// SslServerCertDetailEntry -using ::SslServerCertDetailEntry; -/// SslServerCertDetailHeader -using ::SslServerCertDetailHeader; -/// Values for __nx_ssl_service_type, controls which ssl service to initialize. -using ::SslServiceType; -/// SessionCacheMode -using ::SslSessionCacheMode; -/// TrustedCertStatus -using ::SslTrustedCertStatus; -/// VerifyOption. The default bitmask value at the time of \ref sslContextCreateConnection is ::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName. -/// [5.0.0+] \ref sslConnectionSetVerifyOption: (::SslVerifyOption_PeerCa | ::SslVerifyOption_HostName) must be set, unless: ::SslOptionType_SkipDefaultVerify is set, or [9.0.0+] ::SslDebugOptionType_AllowDisableVerifyOption is set. -/// [6.0.0+] \ref sslConnectionSetVerifyOption: Following that, if ::SslVerifyOption_EvPolicyOid is set, then the following options must be set (besides the previously mentioned one): ::SslVerifyOption_PeerCa and ::SslVerifyOption_DateCheck. -using ::SslVerifyOption; -/// SslVersion. This is a bitmask which controls the min/max TLS versions to use, depending on which lowest/highest bits are set (if Auto* isn't set). -using ::SslVersion; - -/// Initialize ssl. A default value of 0x3 can be used for num_sessions. This must be 0x1-0x4. -Result Initialize(u32 num_sessions); - -/// Exit ssl. -void Exit(void); - -/// Gets the Service object for the actual ssl service session. -Service* GetServiceSession(void); - -/** - * @brief CreateContext - * @note The CertStore is used automatically, regardless of what cmds are used. - * @param[out] c \ref SslContext - * @param[in] ssl_version \ref SslVersion - */ -Result CreateContext(SslContext *c, u32 ssl_version); - -/** - * @brief GetContextCount - * @note Not used by official sw. - * @param[out] out Output value. - */ -Result GetContextCount(u32 *out); - -/** - * @brief GetCertificates - * @param[in] buffer Output buffer. The start of this buffer is an array of \ref SslBuiltInCertificateInfo, with the specified count. The cert data (SslBuiltInCertificateInfo::data) is located after this array. - * @param[in] size Output buffer size, this should be the size from \ref sslGetCertificateBufSize. - * @param[in] ca_cert_ids Input array of \ref SslCaCertificateId. - * @param[in] count Size of the ca_cert_ids array in entries. - * @param[out] total_out [3.0.0+] Total output entries. Will always match count on pre-3.0.0. This will differ from count when ::SslCaCertificateId_All is used. - */ -Result GetCertificates(void* buffer, u32 size, u32 *ca_cert_ids, u32 count, u32 *total_out); - -/** - * @brief GetCertificateBufSize - * @param[in] ca_cert_ids Input array of \ref SslCaCertificateId. - * @param[in] count Size of the ca_cert_ids array in entries. - * @param[out] out Output size. - */ -Result GetCertificateBufSize(u32 *ca_cert_ids, u32 count, u32 *out); - -/** - * @brief FlushSessionCache - * @note Only available on [5.0.0+]. - * @param[in] str Input string. Must be NULL with ::SslFlushSessionCacheOptionType_AllHosts. - * @param[in] str_bufsize String buffer size, excluding NUL-terminator. Hence, this should be actual_bufsize-1. This must be 0 with ::SslFlushSessionCacheOptionType_AllHosts. - * @param[in] type \ref SslFlushSessionCacheOptionType - * @param[out] out Output value. - */ -Result FlushSessionCache(const char *str, size_t str_bufsize, SslFlushSessionCacheOptionType type, u32 *out); - -/** - * @brief SetDebugOption - * @note Only available on [6.0.0+]. - * @note The official impl of this doesn't actually use the cmd. - * @param[in] buffer Input buffer, must not be NULL. The u8 from here is copied to state. - * @param[in] size Buffer size, must not be 0. - * @param[in] type \ref SslDebugOptionType - */ -Result SetDebugOption(const void* buffer, size_t size, SslDebugOptionType type); - -/** - * @brief GetDebugOption - * @note Only available on [6.0.0+]. - * @param[out] buffer Output buffer, must not be NULL. An u8 is written here loaded from state. - * @param[in] size Buffer size, must not be 0. - * @param[in] type \ref SslDebugOptionType - */ -Result GetDebugOption(void* buffer, size_t size, SslDebugOptionType type); - -/** - * @brief ClearTls12FallbackFlag - * @note Only available on [14.0.0+]. - */ -Result ClearTls12FallbackFlag(void); - -/** - * @brief SetThreadCoreMask - * @param[in] mask CoreMask - * @note Only available on [15.0.0+] with ::SslServiceType_System. - */ -Result SetThreadCoreMask(u64 mask); - -/** - * @brief GetThreadCoreMask - * @param[out] out Output CoreMask. - * @note Only available on [15.0.0+] with ::SslServiceType_System. - */ -Result GetThreadCoreMask(u64 *out); - -/** - * @brief Closes a Context object. - * @param c \ref SslContext - */ -void ContextClose(SslContext *c); - -/** - * @brief SetOption - * @note Prior to 4.x this is stubbed. - * @param c \ref SslContext - * @param[in] option \ref SslContextOption - * @param[in] value Value to set. With ::SslContextOption_CrlImportDateCheckEnable, this must be 0 or 1. - */ -Result ContextSetOption(SslContext *c, SslContextOption option, s32 value); - -/** - * @brief GetOption - * @note Prior to 4.x this is stubbed. - * @param c \ref SslContext - * @param[in] option \ref SslContextOption - * @param[out] out Output value. - */ -Result ContextGetOption(SslContext *c, SslContextOption option, s32 *out); - -/** - * @brief CreateConnection - * @param c \ref SslContext - * @param[out] conn Output \ref SslConnection. - */ -Result ContextCreateConnection(SslContext *c, SslConnection *conn); - -/** - * @brief GetConnectionCount - * @note Not exposed by official sw. - * @param c \ref SslContext - * @param[out] out Output value. - */ -Result ContextGetConnectionCount(SslContext *c, u32 *out); - -/** - * @brief ImportServerPki - * @note A maximum of 71 ServerPki objects (associated with the output Id) can be imported. - * @param c \ref SslContext - * @param[in] buffer Input buffer containing the cert data, must not be NULL. This can contain multiple certs. The certs can be CAs or server certs (no pubkeys). - * @param[in] size Input buffer size. - * @param[in] format \ref SslCertificateFormat - * @param[out] id Output Id. Optional, can be NULL. - */ -Result ContextImportServerPki(SslContext *c, const void* buffer, u32 size, SslCertificateFormat format, u64 *id); - -/** - * @brief ImportClientPki - * @note An error is thrown internally if this cmd or \ref sslContextRegisterInternalPki was already used previously. - * @param c \ref SslContext - * @param[in] pkcs12 PKCS#12 input buffer, must not be NULL. - * @param[in] pkcs12_size pkcs12 buffer size. - * @param[in] pw ASCII password string buffer, this can only be NULL if pw_size is 0. This will be internally copied to another buffer which was allocated with size=pw_size+1, for NUL-termination. - * @param[in] pw_size Password buffer size, this can only be 0 if pw is NULL. - * @param[out] id Output Id. Optional, can be NULL. - */ -Result ContextImportClientPki(SslContext *c, const void* pkcs12, u32 pkcs12_size, const char *pw, u32 pw_size, u64 *id); - -/** - * @brief Remove the specified *Pki, or on [3.0.0+] Crl. - * @param c \ref SslContext - * @param[in] id Id - */ -Result ContextRemovePki(SslContext *c, u64 id); - -/** - * @brief RegisterInternalPki - * @note An error is thrown internally if this cmd or \ref sslContextImportClientPki was already used previously. - * @param c \ref SslContext - * @param[in] internal_pki \ref SslInternalPki - * @param[out] id Output Id. Optional, can be NULL. - */ -Result ContextRegisterInternalPki(SslContext *c, SslInternalPki internal_pki, u64 *id); - -/** - * @brief AddPolicyOid - * @param c \ref SslContext - * @param[in] str Input string. - * @param[in] str_bufsize String buffer size, excluding NUL-terminator (must not match the string length). Hence, this should be actual_bufsize-1. This must not be >0xff. - */ -Result ContextAddPolicyOid(SslContext *c, const char *str, u32 str_bufsize); - -/** - * @brief ImportCrl - * @note Only available on [3.0.0+]. - * @param c \ref SslContext - * @param[in] buffer Input buffer, must not be NULL. This contains the DER CRL. - * @param[in] size Input buffer size. - * @param[out] id Output Id. Optional, can be NULL. - */ -Result ContextImportCrl(SslContext *c, const void* buffer, u32 size, u64 *id); - -/** - * @brief ImportClientCertKeyPki - * @note Only available on [16.0.0+]. - * @param c \ref SslContext - * @param[in] cert Input cert buffer, - * @param[in] cert_size Size of the cert buffer. - * @param[in] key Input key buffer. - * @param[in] key_size Size of the key buffer. - * @param[in] format \ref SslCertificateFormat for the cert and key. - * @param[out] id Output Id. Optional, can be NULL. - */ -Result ContextImportClientCertKeyPki(SslContext *c, const void* cert, u32 cert_size, const void* key, u32 key_size, SslCertificateFormat format, u64 *id); - -/** - * @brief GeneratePrivateKeyAndCert - * @note Only available on [16.0.0+]. - * @param c \ref SslContext - * @param[out] cert Output cert buffer, - * @param[in] cert_size Size of the cert buffer. - * @param[out] key Output key buffer. - * @param[in] key_size Size of the key buffer. - * @param[in] val Must be value 1. - * @param[in] params \ref SslKeyAndCertParams - * @param[out] out_certsize Actual size of the generated cert data. - * @param[out] out_keysize Actual size of the generated key data. - */ -Result ContextGeneratePrivateKeyAndCert(SslContext *c, void* cert, u32 cert_size, void* key, u32 key_size, u32 val, const SslKeyAndCertParams *params, u32 *out_certsize, u32 *out_keysize); - -/** - * @brief CreateConnectionForSystem - * @note Only available on [15.0.0+] with ::SslServiceType_System. - * @param c \ref SslContext - * @param[out] conn Output \ref SslConnection. - */ -Result ContextCreateConnectionForSystem(SslContext *c, SslConnection *conn); - -/** - * @brief Closes a Connection object. - * @param c \ref SslConnection - */ -void ConnectionClose(SslConnection *c); - -/** - * @brief SetSocketDescriptor. Do not use directly, use \ref socketSslConnectionSetSocketDescriptor instead. - * @note An error is thrown if this was used previously. - * @param c \ref SslConnection - * @param[in] sockfd sockfd - * @param[out] out_sockfd sockfd. Prior to using \ref sslConnectionClose, this must be closed if it's not negative (it will be -1 if ::SslOptionType_DoNotCloseSocket is set). - */ -Result ConnectionSetSocketDescriptor(SslConnection *c, int sockfd, int *out_sockfd); - -/** - * @brief SetHostName - * @param c \ref SslConnection - * @param[in] str Input string. - * @param[in] str_bufsize String buffer size. This must not be >0xff. - */ -Result ConnectionSetHostName(SslConnection *c, const char* str, u32 str_bufsize); - -/** - * @brief SetVerifyOption - * @param c \ref SslConnection - * @param[in] verify_option Input bitmask of \ref SslVerifyOption. - */ -Result ConnectionSetVerifyOption(SslConnection *c, u32 verify_option); - -/** - * @brief SetIoMode - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[in] mode \ref SslIoMode - */ -Result ConnectionSetIoMode(SslConnection *c, SslIoMode mode); - -/** - * @brief GetSocketDescriptor. Do not use directly, use \ref socketSslConnectionGetSocketDescriptor instead. - * @note This gets the input sockfd which was previously saved in state by \ref sslConnectionSetSocketDescriptor. - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] sockfd Output sockfd. - */ -Result ConnectionGetSocketDescriptor(SslConnection *c, int *sockfd); - -/** - * @brief GetHostName - * @param c \ref SslConnection - * @param[out] str Output string buffer. - * @param[in] str_bufsize String buffer size, must be large enough for the entire output string. - * @param[out] out Output string length. - */ -Result ConnectionGetHostName(SslConnection *c, char *str, u32 str_bufsize, u32 *out); - -/** - * @brief GetVerifyOption - * @param c \ref SslConnection - * @param[out] out Output bitmask of \ref SslVerifyOption. - */ -Result ConnectionGetVerifyOption(SslConnection *c, u32 *out); - -/** - * @brief GetIoMode - * @param c \ref SslConnection - * @param[out] out \ref SslIoMode - */ -Result ConnectionGetIoMode(SslConnection *c, SslIoMode *out); - -/** - * @brief DoHandshake - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @note \ref sslConnectionSetHostName must have been used previously with a non-empty string when ::SslVerifyOption_HostName is set. - * @note The DoHandshakeGetServerCert cmd is only used if both server_certbuf/server_certbuf_size are set, otherwise the DoHandshake cmd is used (in which case out_size/total_certs will be left at value 0). - * @note No certs are returned when ::SslVerifyOption_PeerCa is not set. - * @param c \ref SslConnection - * @param[out] out_size Total data size which was written to server_certbuf. Optional, can be NULL. - * @param[out] total_certs Total certs which were written to server_certbuf, can be NULL. - * @param[out] server_certbuf Optional output server cert buffer, can be NULL. Normally this just contains the server cert DER, however with ::SslOptionType_GetServerCertChain set this will contain the full chain (\ref sslConnectionGetServerCertDetail can be used to parse that). With ::SslIoMode_NonBlocking this buffer will be only filled in once - when this cmd returns successfully the buffer will generally be empty. - * @param[in] server_certbuf_size Optional output server cert buffer size, can be 0. - */ -Result ConnectionDoHandshake(SslConnection *c, u32 *out_size, u32 *total_certs, void* server_certbuf, u32 server_certbuf_size); - -/** - * @brief Parses the output server_certbuf from \ref sslConnectionDoHandshake where ::SslOptionType_GetServerCertChain is set. - * @param[in] certbuf server_certbuf from \ref sslConnectionDoHandshake, must not be NULL. - * @param[in] certbuf_size out_size from \ref sslConnectionDoHandshake. - * @param[in] cert_index Cert index, must be within the range of certs stored in certbuf. - * @param[out] cert Ptr for the ouput DER cert, must not be NULL. - * @param[out] cert_size Size for the ouput cert, must not be NULL. - */ -Result ConnectionGetServerCertDetail(const void* certbuf, u32 certbuf_size, u32 cert_index, void** cert, u32 *cert_size); - -/** - * @brief Read - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] buffer Output buffer, must not be NULL. - * @param[in] size Output buffer size, must not be 0. - * @param[out] out_size Actual transferred size. - */ -Result ConnectionRead(SslConnection *c, void* buffer, u32 size, u32 *out_size); - -/** - * @brief Write - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[in] buffer Input buffer, must not be NULL. - * @param[in] size Input buffer size, must not be 0. - * @param[out] out_size Actual transferred size. - */ -Result ConnectionWrite(SslConnection *c, const void* buffer, u32 size, u32 *out_size); - -/** - * @brief Pending - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] out Output value. - */ -Result ConnectionPending(SslConnection *c, s32 *out); - -/** - * @brief Peek - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] buffer Output buffer, must not be NULL. - * @param[in] size Output buffer size, must not be 0. - * @param[out] out_size Output size. - */ -Result ConnectionPeek(SslConnection *c, void* buffer, u32 size, u32 *out_size); - -/** - * @brief Poll - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[in] in_pollevent Input bitmask of \ref SslPollEvent. - * @param[out] out_pollevent Output bitmask of \ref SslPollEvent. - * @param[in] timeout Timeout in milliseconds. - */ -Result ConnectionPoll(SslConnection *c, u32 in_pollevent, u32 *out_pollevent, u32 timeout); - -/** - * @brief GetVerifyCertError - * @note The value in state is cleared after loading it. - * @param c \ref SslConnection - */ -Result ConnectionGetVerifyCertError(SslConnection *c); - -/** - * @brief GetNeededServerCertBufferSize - * @param c \ref SslConnection - * @param[out] out Output value. - */ -Result ConnectionGetNeededServerCertBufferSize(SslConnection *c, u32 *out); - -/** - * @brief SetSessionCacheMode - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[in] mode \ref SslSessionCacheMode - */ -Result ConnectionSetSessionCacheMode(SslConnection *c, SslSessionCacheMode mode); - -/** - * @brief GetSessionCacheMode - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] out \ref SslSessionCacheMode - */ -Result ConnectionGetSessionCacheMode(SslConnection *c, SslSessionCacheMode *out); - -/** - * @brief GetSessionCacheMode - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - */ -Result ConnectionFlushSessionCache(SslConnection *c); - -/** - * @brief SetRenegotiationMode - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[in] mode \ref SslRenegotiationMode - */ -Result ConnectionSetRenegotiationMode(SslConnection *c, SslRenegotiationMode mode); - -/** - * @brief GetRenegotiationMode - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] out \ref SslRenegotiationMode - */ -Result ConnectionGetRenegotiationMode(SslConnection *c, SslRenegotiationMode *out); - -/** - * @brief SetOption - * @param c \ref SslConnection - * @param[in] option \ref SslOptionType - * @param[in] flag Input flag value. - */ -Result ConnectionSetOption(SslConnection *c, SslOptionType option, bool flag); - -/** - * @brief GetOption - * @param c \ref SslConnection - * @param[in] option \ref SslOptionType - * @param[out] out Output flag value. - */ -Result ConnectionGetOption(SslConnection *c, SslOptionType option, bool *out); - -/** - * @brief GetVerifyCertErrors - * @note An error is thrown when the cmd is successful, if the two output u32s match. - * @param[out] out0 First output value, must not be NULL. - * @param[out] out1 Second output value. - * @param[out] errors Output array of Result, must not be NULL. - * @param[in] count Size of the errors array in entries. - */ -Result ConnectionGetVerifyCertErrors(SslConnection *c, u32 *out0, u32 *out1, Result *errors, u32 count); - -/** - * @brief GetCipherInfo - * @note Only available on [4.0.0+]. - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @param c \ref SslConnection - * @param[out] out \ref SslCipherInfo - */ -Result ConnectionGetCipherInfo(SslConnection *c, SslCipherInfo *out); - -/** - * @brief SetNextAlpnProto - * @note Only available on [9.0.0+]. - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @note ::SslOptionType_EnableAlpn should be set at the time of using \ref sslConnectionDoHandshake, otherwise using this cmd will have no affect. - * @param c \ref SslConnection - * @param[in] buffer Input buffer, must not be NULL. This contains an array of {u8 size, {data with the specified size}}, which must be within the buffer-size bounds. - * @param[in] size Input buffer size, must not be 0. Must be at least 0x2. - */ -Result ConnectionSetNextAlpnProto(SslConnection *c, const u8 *buffer, u32 size); - -/** - * @brief GetNextAlpnProto - * @note Only available on [9.0.0+]. - * @note \ref sslConnectionSetSocketDescriptor must have been used prior to this successfully. - * @note The output will be all-zero/empty if not available - such as when this was used before \ref sslConnectionDoHandshake. - * @param c \ref SslConnection - * @param[out] state \ref SslAlpnProtoState - * @param[out] out Output string length. - * @param[out] buffer Output string buffer, must not be NULL. - * @param[in] size Output buffer size, must not be 0. - */ -Result ConnectionGetNextAlpnProto(SslConnection *c, SslAlpnProtoState *state, u32 *out, u8 *buffer, u32 size); - -/** - * @brief SetDtlsSocketDescriptor. Do not use directly, use \ref socketSslConnectionSetDtlsSocketDescriptor instead. - * @note Only available on [16.0.0+]. - * @note An error is thrown if this was used previously. - * @param c \ref SslConnection - * @param[in] sockfd sockfd - * @param[in] Input sockaddr. - * @param[in] size Input sockaddr size. - * @param[out] out_sockfd sockfd. Prior to using \ref sslConnectionClose, this must be closed if it's not negative (it will be -1 if ::SslOptionType_DoNotCloseSocket is set). - */ -Result ConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const void* buf, size_t size, int *out_sockfd); - -/** - * @brief GetDtlsHandshakeTimeout - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[out] out Output nanoseconds value. - */ -Result ConnectionGetDtlsHandshakeTimeout(SslConnection *c, u64 *out); - -/** - * @brief SetPrivateOption - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[in] option \ref SslPrivateOptionType - * @param[in] value Input value. - */ -Result ConnectionSetPrivateOption(SslConnection *c, SslPrivateOptionType option, u32 value); - -/** - * @brief SetSrtpCiphers - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[in] ciphers Input array of u16s. Each entry must be value 1-2, otherwise the entry is ignored. - * @param[in] count Total entries in the ciphers array, the maximum is 4. - */ -Result ConnectionSetSrtpCiphers(SslConnection *c, const u16 *ciphers, u32 count); - -/** - * @brief GetSrtpCipher - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[out] out Output value. - */ -Result ConnectionGetSrtpCipher(SslConnection *c, u16 *out); - -/** - * @brief ExportKeyingMaterial - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[out] outbuf Output buffer. - * @param[in] outbuf_size Output buffer size. - * @param[in] label Input label string. - * @param[in] label_size Size of the label buffer excluding NUL-terminator. - * @param[in] context Optional input context buffer, can be NULL. - * @param[in] context_size Size of context, if specified this must be <0xFFFF. - */ -Result ConnectionExportKeyingMaterial(SslConnection *c, u8 *outbuf, u32 outbuf_size, const char *label, u32 label_size, const void* context, u32 context_size); - -/** - * @brief SetIoTimeout - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[in] timeout Input timeout value. - */ -Result ConnectionSetIoTimeout(SslConnection *c, u32 timeout); - -/** - * @brief GetIoTimeout - * @note Only available on [16.0.0+]. - * @param c \ref SslConnection - * @param[out] out Output timeout value. - */ -Result ConnectionGetIoTimeout(SslConnection *c, u32 *out); - -} // namespace ssl - -/// @brief C++ wrappers for the `svc` API. -/// @details Wraps: switch/kernel/svc.h. -namespace svc { - -/// WaitForAddress behaviors. -using ::ArbitrationType; -/// Break point types -using ::BreakPointType; -/// Break reasons -using ::BreakReason; -/// Code memory mapping operations -using ::CodeMapOperation; -/// Address space types for CreateProcessFlags -using ::CreateProcessFlagAddressSpace; -/// Flags for svcCreateProcess and CreateProcess event -using ::CreateProcessFlags; -/// DebugEvent flags -using ::DebugEventFlag; -/// DebugEvent structure -using ::DebugEventInfo; -/// DebugEvent types -using ::DebugEventType; -/// Debug exception types -using ::DebugException; -/// Debug Thread Parameters. -using ::DebugThreadParam; -/// GetInfo IDs. -using ::InfoType; -/// GetInfo InitialProcessIdRange Sub IDs. -using ::InitialProcessIdRangeInfo; -/// Io Pools. -using ::IoPoolType; -/// Context of a scheduled thread. -using ::LastThreadContext; -/// Limitable Resources. -using ::LimitableResource; -/// Memory attribute bitmasks. -using ::MemoryAttribute; -/// Memory information structure. -using ::MemoryInfo; -/// Memory mapping type. -using ::MemoryMapping; -/// Memory regions -using ::MemoryRegion; -/// Memory state bitmasks. -using ::MemoryState; -/// Memory type enumeration (lower 8 bits of \ref MemoryState) -using ::MemoryType; -/// Memory permission bitmasks. -using ::Permission; -/// Physical memory information structure. -using ::PhysicalMemoryInfo; -/// GetSystemInfo PhysicalMemory Sub IDs. -using ::PhysicalMemorySystemInfo; -/// Process Activity. -using ::ProcessActivity; -/// Process exit reasons -using ::ProcessExitReason; -/// Process Information. -using ::ProcessInfoType; -/// Process States. -using ::ProcessState; -/// Secure monitor arguments. -using ::SecmonArgs; -/// SignalToAddress behaviors. -using ::SignalType; -/// GetSystemInfo IDs. -using ::SystemInfoType; -/// Thread Activity. -using ::ThreadActivity; -/// Thread exit reasons -using ::ThreadExitReason; -/// GetInfo Idle/Thread Tick Count Sub IDs. -using ::TickCountInfo; -/// SleepThread yield types. -using ::YieldType; - -/** - * @brief Set the process heap to a given size. It can both extend and shrink the heap. - * @param[out] out_addr Variable to which write the address of the heap (which is randomized and fixed by the kernel) - * @param[in] size Size of the heap, must be a multiple of 0x200000. - * @return Result code. - * @note Syscall number 0x01. - */ -Result SetHeapSize(void** out_addr, u64 size); - -/** - * @brief Set the memory permissions of a (page-aligned) range of memory. - * @param[in] addr Start address of the range. - * @param[in] size Size of the range, in bytes. - * @param[in] perm Permissions (see \ref Permission). - * @return Result code. - * @remark Perm_X is not allowed. Setting write-only is not allowed either (Perm_W). - * This can be used to move back and forth between Perm_None, Perm_R and Perm_Rw. - * @note Syscall number 0x02. - */ -Result SetMemoryPermission(void* addr, u64 size, u32 perm); - -/** - * @brief Set the memory attributes of a (page-aligned) range of memory. - * @param[in] addr Start address of the range. - * @param[in] size Size of the range, in bytes. - * @param[in] val0 State0 - * @param[in] val1 State1 - * @return Result code. - * @remark See switchbrew.org Wiki for more details. - * @note Syscall number 0x03. - */ -Result SetMemoryAttribute(void* addr, u64 size, u32 val0, u32 val1); - -/** - * @brief Maps a memory range into a different range. Mainly used for adding guard pages around stack. - * Source range gets reprotected to Perm_None (it can no longer be accessed), and \ref MemAttr_IsBorrowed is set in the source \ref MemoryAttribute. - * @param[in] dst_addr Destination address. - * @param[in] src_addr Source address. - * @param[in] size Size of the range. - * @return Result code. - * @note Syscall number 0x04. - */ -Result MapMemory(void* dst_addr, void* src_addr, u64 size); - -/** - * @brief Unmaps a region that was previously mapped with \ref svcMapMemory. - * @param[in] dst_addr Destination address. - * @param[in] src_addr Source address. - * @param[in] size Size of the range. - * @return Result code. - * @note Syscall number 0x05. - */ -Result UnmapMemory(void* dst_addr, void* src_addr, u64 size); - -/** - * @brief Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address. - * @param[out] meminfo_ptr \ref MemoryInfo structure which will be filled in. - * @param[out] pageinfo Page information which will be filled in. - * @param[in] addr Address to query. - * @return Result code. - * @note Syscall number 0x06. - */ -Result QueryMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, u64 addr); - -/** - * @brief Exits the current process. - * @note Syscall number 0x07. - */ -[[noreturn]] void ExitProcess(void); - -/** - * @brief Creates a thread. - * @return Result code. - * @note Syscall number 0x08. - */ -Result CreateThread(Handle* out, void* entry, void* arg, void* stack_top, int prio, int cpuid); - -/** - * @brief Starts a freshly created thread. - * @return Result code. - * @note Syscall number 0x09. - */ -Result StartThread(Handle handle); - -/** - * @brief Exits the current thread. - * @note Syscall number 0x0A. - */ -[[noreturn]] void ExitThread(void); - -/** - * @brief Sleeps the current thread for the specified amount of time. - * @param[in] nano Number of nanoseconds to sleep, or \ref YieldType for yield. - * @note Syscall number 0x0B. - */ -void SleepThread(s64 nano); - -/** - * @brief Gets a thread's priority. - * @return Result code. - * @note Syscall number 0x0C. - */ -Result GetThreadPriority(s32* priority, Handle handle); - -/** - * @brief Sets a thread's priority. - * @return Result code. - * @note Syscall number 0x0D. - */ -Result SetThreadPriority(Handle handle, u32 priority); - -/** - * @brief Gets a thread's core mask. - * @return Result code. - * @note Syscall number 0x0E. - */ -Result GetThreadCoreMask(s32* preferred_core, u64* affinity_mask, Handle handle); - -/** - * @brief Sets a thread's core mask. - * @return Result code. - * @note Syscall number 0x0F. - */ -Result SetThreadCoreMask(Handle handle, s32 preferred_core, u32 affinity_mask); - -/** - * @brief Gets the current processor's number. - * @return The current processor's number. - * @note Syscall number 0x10. - */ -u32 GetCurrentProcessorNumber(void); - -/** - * @brief Sets an event's signalled status. - * @return Result code. - * @note Syscall number 0x11. - */ -Result SignalEvent(Handle handle); - -/** - * @brief Clears an event's signalled status. - * @return Result code. - * @note Syscall number 0x12. - */ -Result ClearEvent(Handle handle); - -/** - * @brief Maps a block of shared memory. - * @return Result code. - * @note Syscall number 0x13. - */ -Result MapSharedMemory(Handle handle, void* addr, size_t size, u32 perm); - -/** - * @brief Unmaps a block of shared memory. - * @return Result code. - * @note Syscall number 0x14. - */ -Result UnmapSharedMemory(Handle handle, void* addr, size_t size); - -/** - * @brief Creates a block of transfer memory. - * @return Result code. - * @note Syscall number 0x15. - */ -Result CreateTransferMemory(Handle* out, void* addr, size_t size, u32 perm); - -/** - * @brief Closes a handle, decrementing the reference count of the corresponding kernel object. - * This might result in the kernel freeing the object. - * @param handle Handle to close. - * @return Result code. - * @note Syscall number 0x16. - */ -Result CloseHandle(Handle handle); - -/** - * @brief Resets a signal. - * @return Result code. - * @note Syscall number 0x17. - */ -Result ResetSignal(Handle handle); - -/** - * @brief Waits on one or more synchronization objects, optionally with a timeout. - * @return Result code. - * @note Syscall number 0x18. - * @note \p handleCount must not be greater than \ref MAX_WAIT_OBJECTS. This is a Horizon kernel limitation. - * @note This is the raw syscall, which can be cancelled by \ref svcCancelSynchronization or other means. \ref waitHandles or \ref waitMultiHandle should normally be used instead. - */ -Result WaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout); - -/** - * @brief Waits on a single synchronization object, optionally with a timeout. - * @return Result code. - * @note Wrapper for \ref svcWaitSynchronization. - * @note This is the raw syscall, which can be cancelled by \ref svcCancelSynchronization or other means. \ref waitSingleHandle should normally be used instead. - */ -Result WaitSynchronizationSingle(Handle handle, u64 timeout); - -/** - * @brief Waits a \ref svcWaitSynchronization operation being done on a synchronization object in another thread. - * @return Result code. - * @note Syscall number 0x19. - */ -Result CancelSynchronization(Handle thread); - -/** - * @brief Arbitrates a mutex lock operation in userspace. - * @return Result code. - * @note Syscall number 0x1A. - */ -Result ArbitrateLock(u32 wait_tag, u32* tag_location, u32 self_tag); - -/** - * @brief Arbitrates a mutex unlock operation in userspace. - * @return Result code. - * @note Syscall number 0x1B. - */ -Result ArbitrateUnlock(u32* tag_location); - -/** - * @brief Performs a condition variable wait operation in userspace. - * @return Result code. - * @note Syscall number 0x1C. - */ -Result WaitProcessWideKeyAtomic(u32* key, u32* tag_location, u32 self_tag, u64 timeout); - -/** - * @brief Performs a condition variable wake-up operation in userspace. - * @note Syscall number 0x1D. - */ -void SignalProcessWideKey(u32* key, s32 num); - -/** - * @brief Gets the current system tick. - * @return The current system tick. - * @note Syscall number 0x1E. - */ -u64 GetSystemTick(void); - -/** - * @brief Connects to a registered named port. - * @return Result code. - * @note Syscall number 0x1F. - */ -Result ConnectToNamedPort(Handle* session, const char* name); - -/** - * @brief Sends a light IPC synchronization request to a session. - * @return Result code. - * @note Syscall number 0x20. - */ -Result SendSyncRequestLight(Handle session); - -/** - * @brief Sends an IPC synchronization request to a session. - * @return Result code. - * @note Syscall number 0x21. - */ -Result SendSyncRequest(Handle session); - -/** - * @brief Sends an IPC synchronization request to a session from an user allocated buffer. - * @return Result code. - * @remark size must be allocated to 0x1000 bytes. - * @note Syscall number 0x22. - */ -Result SendSyncRequestWithUserBuffer(void* usrBuffer, u64 size, Handle session); - -/** - * @brief Sends an IPC synchronization request to a session from an user allocated buffer (asynchronous version). - * @return Result code. - * @remark size must be allocated to 0x1000 bytes. - * @note Syscall number 0x23. - */ -Result SendAsyncRequestWithUserBuffer(Handle* handle, void* usrBuffer, u64 size, Handle session); - -/** - * @brief Gets the PID associated with a process. - * @return Result code. - * @note Syscall number 0x24. - */ -Result GetProcessId(u64 *processID, Handle handle); - -/** - * @brief Gets the TID associated with a process. - * @return Result code. - * @note Syscall number 0x25. - */ -Result GetThreadId(u64 *threadID, Handle handle); - -/** - * @brief Breaks execution. - * @param[in] breakReason Break reason (see \ref BreakReason). - * @param[in] address Address of the buffer to pass to the debugger. - * @param[in] size Size of the buffer to pass to the debugger. - * @return Result code. - * @note Syscall number 0x26. - */ -Result Break(u32 breakReason, uintptr_t address, uintptr_t size); - -/** - * @brief Outputs debug text, if used during debugging. - * @param[in] str Text to output. - * @param[in] size Size of the text in bytes. - * @return Result code. - * @note Syscall number 0x27. - */ -Result OutputDebugString(const char *str, u64 size); - -/** - * @brief Returns from an exception. - * @param[in] res Result code. - * @note Syscall number 0x28. - */ -[[noreturn]] void ReturnFromException(Result res); - -/** - * @brief Retrieves information about the system, or a certain kernel object. - * @param[out] out Variable to which store the information. - * @param[in] id0 First ID of the property to retrieve. - * @param[in] handle Handle of the object to retrieve information from, or \ref INVALID_HANDLE to retrieve information about the system. - * @param[in] id1 Second ID of the property to retrieve. - * @return Result code. - * @remark The full list of property IDs can be found on the switchbrew.org wiki. - * @note Syscall number 0x29. - */ -Result GetInfo(u64* out, u32 id0, Handle handle, u64 id1); - -/** - * @brief Flushes the entire data cache (by set/way). - * @note Syscall number 0x2A. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - * @warning This syscall is dangerous, and should not be used. - */ -void FlushEntireDataCache(void); - -/** - * @brief Flushes data cache for a virtual address range. - * @param[in] address Address of region to flush. - * @param[in] size Size of region to flush. - * @remark armDCacheFlush should be used instead of this syscall whenever possible. - * @note Syscall number 0x2B. - */ -Result FlushDataCache(void *address, size_t size); - -/** - * @brief Maps new heap memory at the desired address. [3.0.0+] - * @return Result code. - * @note Syscall number 0x2C. - */ -Result MapPhysicalMemory(void *address, u64 size); - -/** - * @brief Undoes the effects of \ref svcMapPhysicalMemory. [3.0.0+] - * @return Result code. - * @note Syscall number 0x2D. - */ -Result UnmapPhysicalMemory(void *address, u64 size); - -/** - * @brief Gets information about a thread that will be scheduled in the future. [5.0.0+] - * @param[out] out_context Output \ref LastThreadContext for the thread that will be scheduled. - * @param[out] out_thread_id Output thread id for the thread that will be scheduled. - * @param[in] debug Debug handle. - * @param[in] ns Nanoseconds in the future to get scheduled thread at. - * @return Result code. - * @note Syscall number 0x2E. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetDebugFutureThreadInfo(LastThreadContext *out_context, u64 *out_thread_id, Handle debug, s64 ns); - -/** - * @brief Gets information about the previously-scheduled thread. - * @param[out] out_context Output \ref LastThreadContext for the previously scheduled thread. - * @param[out] out_tls_address Output tls address for the previously scheduled thread. - * @param[out] out_flags Output flags for the previously scheduled thread. - * @return Result code. - * @note Syscall number 0x2F. - */ -Result GetLastThreadInfo(LastThreadContext *out_context, u64 *out_tls_address, u32 *out_flags); - -/** - * @brief Gets the maximum value a LimitableResource can have, for a Resource Limit handle. - * @return Result code. - * @note Syscall number 0x30. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetResourceLimitLimitValue(s64 *out, Handle reslimit_h, LimitableResource which); - -/** - * @brief Gets the maximum value a LimitableResource can have, for a Resource Limit handle. - * @return Result code. - * @note Syscall number 0x31. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetResourceLimitCurrentValue(s64 *out, Handle reslimit_h, LimitableResource which); - -/** - * @brief Configures the pause/unpause status of a thread. - * @return Result code. - * @note Syscall number 0x32. - */ -Result SetThreadActivity(Handle thread, ThreadActivity paused); - -/** - * @brief Dumps the registers of a thread paused by @ref svcSetThreadActivity (register groups: all). - * @param[out] ctx Output thread context (register dump). - * @param[in] thread Thread handle. - * @return Result code. - * @note Syscall number 0x33. - * @warning Official kernel will not dump x0..x18 if the thread is currently executing a system call, and prior to 6.0.0 doesn't dump TPIDR_EL0. - */ -Result GetThreadContext3(ThreadContext* ctx, Handle thread); - -/** - * @brief Arbitrates an address depending on type and value. [4.0.0+] - * @param[in] address Address to arbitrate. - * @param[in] arb_type \ref ArbitrationType to use. - * @param[in] value Value to arbitrate on. - * @param[in] timeout Maximum time in nanoseconds to wait. - * @return Result code. - * @note Syscall number 0x34. - */ -Result WaitForAddress(void *address, u32 arb_type, s64 value, s64 timeout); - -/** - * @brief Signals (and updates) an address depending on type and value. [4.0.0+] - * @param[in] address Address to arbitrate. - * @param[in] signal_type \ref SignalType to use. - * @param[in] value Value to arbitrate on. - * @param[in] count Number of waiting threads to signal. - * @return Result code. - * @note Syscall number 0x35. - */ -Result SignalToAddress(void *address, u32 signal_type, s32 value, s32 count); - -/** - * @brief Sets thread preemption state (used during abort/panic). [8.0.0+] - * @note Syscall number 0x36. - */ -void SynchronizePreemptionState(void); - -/** - * @brief Gets the peak value a LimitableResource has had, for a Resource Limit handle. [11.0.0+] - * @return Result code. - * @note Syscall number 0x37. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetResourceLimitPeakValue(s64 *out, Handle reslimit_h, LimitableResource which); - -/** - * @brief Creates an IO Pool. [13.0.0+] - * @return Result code. - * @note Syscall number 0x39. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateIoPool(Handle *out_handle, u32 pool_type); - -/** - * @brief Creates an IO Region. [13.0.0+] - * @return Result code. - * @note Syscall number 0x3A. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateIoRegion(Handle *out_handle, Handle io_pool_h, u64 physical_address, u64 size, u32 memory_mapping, u32 perm); - -/** - * @brief Causes the kernel to dump debug information. [1.0.0-3.0.2] - * @param[in] dump_info_type Type of information to dump. - * @param[in] arg0 Argument to the debugging operation. - * @note Syscall number 0x3C. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -void DumpInfo(u32 dump_info_type, u64 arg0); - -/** - * @brief Performs a debugging operation on the kernel. [4.0.0+] - * @param[in] kern_debug_type Type of debugging operation to perform. - * @param[in] arg0 First argument to the debugging operation. - * @param[in] arg1 Second argument to the debugging operation. - * @param[in] arg2 Third argument to the debugging operation. - * @note Syscall number 0x3C. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -void KernelDebug(u32 kern_debug_type, u64 arg0, u64 arg1, u64 arg2); - -/** - * @brief Performs a debugging operation on the kernel. [4.0.0+] - * @param[in] kern_trace_state Type of tracing the kernel should perform. - * @note Syscall number 0x3D. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -void ChangeKernelTraceState(u32 kern_trace_state); - -/** - * @brief Creates an IPC session. - * @return Result code. - * @note Syscall number 0x40. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateSession(Handle *server_handle, Handle *client_handle, u32 unk0, u64 unk1); - -/** - * @brief Accepts an IPC session. - * @return Result code. - * @note Syscall number 0x41. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result AcceptSession(Handle *session_handle, Handle port_handle); - -/** - * @brief Performs light IPC input/output. - * @return Result code. - * @param[in] handle Server or port handle to act on. - * @note Syscall number 0x42. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ReplyAndReceiveLight(Handle handle); - -/** - * @brief Performs IPC input/output. - * @return Result code. - * @note Syscall number 0x43. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); - -/** - * @brief Performs IPC input/output from an user allocated buffer. - * @return Result code. - * @note Syscall number 0x44. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ReplyAndReceiveWithUserBuffer(s32* index, void* usrBuffer, u64 size, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); - -/** - * @brief Creates a system event. - * @return Result code. - * @note Syscall number 0x45. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateEvent(Handle* server_handle, Handle* client_handle); - -/** - * @brief Maps an IO Region. [13.0.0+] - * @return Result code. - * @note Syscall number 0x46. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapIoRegion(Handle io_region_h, void *address, u64 size, u32 perm); - -/** - * @brief Undoes the effects of \ref svcMapIoRegion. [13.0.0+] - * @return Result code. - * @note Syscall number 0x47. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result UnmapIoRegion(Handle io_region_h, void *address, u64 size); - -/** - * @brief Maps unsafe memory (usable for GPU DMA) for a system module at the desired address. [5.0.0+] - * @return Result code. - * @note Syscall number 0x48. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapPhysicalMemoryUnsafe(void *address, u64 size); - -/** - * @brief Undoes the effects of \ref svcMapPhysicalMemoryUnsafe. [5.0.0+] - * @return Result code. - * @note Syscall number 0x49. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result UnmapPhysicalMemoryUnsafe(void *address, u64 size); - -/** - * @brief Sets the system-wide limit for unsafe memory mappable using \ref svcMapPhysicalMemoryUnsafe. [5.0.0+] - * @return Result code. - * @note Syscall number 0x4A. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result SetUnsafeLimit(u64 size); - -/** - * @brief Creates code memory in the caller's address space [4.0.0+]. - * @return Result code. - * @note Syscall number 0x4B. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateCodeMemory(Handle* code_handle, void* src_addr, u64 size); - -/** - * @brief Maps code memory in the caller's address space [4.0.0+]. - * @return Result code. - * @note Syscall number 0x4C. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ControlCodeMemory(Handle code_handle, CodeMapOperation op, void* dst_addr, u64 size, u64 perm); - -/** - * @brief Causes the system to enter deep sleep. - * @note Syscall number 0x4D. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -void SleepSystem(void); - -/** - * @brief Reads/writes a protected MMIO register. - * @return Result code. - * @note Syscall number 0x4E. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ReadWriteRegister(u32* outVal, u64 regAddr, u32 rwMask, u32 inVal); - -/** - * @brief Configures the pause/unpause status of a process. - * @return Result code. - * @note Syscall number 0x4F. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result SetProcessActivity(Handle process, ProcessActivity paused); - -/** - * @brief Creates a block of shared memory. - * @return Result code. - * @note Syscall number 0x50. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateSharedMemory(Handle* out, size_t size, u32 local_perm, u32 other_perm); - -/** - * @brief Maps a block of transfer memory. - * @return Result code. - * @note Syscall number 0x51. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapTransferMemory(Handle tmem_handle, void* addr, size_t size, u32 perm); - -/** - * @brief Unmaps a block of transfer memory. - * @return Result code. - * @note Syscall number 0x52. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result UnmapTransferMemory(Handle tmem_handle, void* addr, size_t size); - -/** - * @brief Creates an event and binds it to a specific hardware interrupt. - * @return Result code. - * @note Syscall number 0x53. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateInterruptEvent(Handle* handle, u64 irqNum, u32 flag); - -/** - * @brief Queries information about a certain virtual address, including its physical address. - * @return Result code. - * @note Syscall number 0x54. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result QueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr); - -/** - * @brief Returns a virtual address mapped to a given IO range. - * @return Result code. - * @note Syscall number 0x55. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - * @warning Only exists on [10.0.0+]. For older versions use \ref svcLegacyQueryIoMapping. - */ -Result QueryMemoryMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size); - -/** - * @brief Returns a virtual address mapped to a given IO range. - * @return Result code. - * @note Syscall number 0x55. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - * @warning Only exists on [1.0.0-9.2.0]. For newer versions use \ref svcQueryMemoryMapping. - */ -Result LegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size); - -/** - * @brief Creates a virtual address space for binding device address spaces. - * @return Result code. - * @note Syscall number 0x56. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateDeviceAddressSpace(Handle *handle, u64 dev_addr, u64 dev_size); - -/** - * @brief Attaches a device address space to a device. - * @return Result code. - * @note Syscall number 0x57. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result AttachDeviceAddressSpace(u64 device, Handle handle); - -/** - * @brief Detaches a device address space from a device. - * @return Result code. - * @note Syscall number 0x58. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result DetachDeviceAddressSpace(u64 device, Handle handle); - -/** - * @brief Maps an attached device address space to an userspace address. - * @return Result code. - * @remark The userspace destination address must have the \ref MemState_MapDeviceAllowed bit set. - * @note Syscall number 0x59. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option); - -/** - * @brief Maps an attached device address space to an userspace address. - * @return Result code. - * @remark The userspace destination address must have the \ref MemState_MapDeviceAlignedAllowed bit set. - * @note Syscall number 0x5A. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option); - -/** - * @brief Maps an attached device address space to an userspace address. [1.0.0-12.1.0] - * @return Result code. - * @remark The userspace destination address must have the \ref MemState_MapDeviceAlignedAllowed bit set. - * @note Syscall number 0x5B. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapDeviceAddressSpace(u64 *out_mapped_size, Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm); - -/** - * @brief Unmaps an attached device address space from an userspace address. - * @return Result code. - * @note Syscall number 0x5C. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result UnmapDeviceAddressSpace(Handle handle, Handle proc_handle, u64 map_addr, u64 map_size, u64 dev_addr); - -/** - * @brief Invalidates data cache for a virtual address range within a process. - * @param[in] address Address of region to invalidate. - * @param[in] size Size of region to invalidate. - * @note Syscall number 0x5D. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result InvalidateProcessDataCache(Handle process, uintptr_t address, size_t size); - -/** - * @brief Stores data cache for a virtual address range within a process. - * @param[in] address Address of region to store. - * @param[in] size Size of region to store. - * @note Syscall number 0x5E. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result StoreProcessDataCache(Handle process, uintptr_t address, size_t size); - -/** - * @brief Flushes data cache for a virtual address range within a process. - * @param[in] address Address of region to flush. - * @param[in] size Size of region to flush. - * @note Syscall number 0x5F. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result FlushProcessDataCache(Handle process, uintptr_t address, size_t size); - -/** - * @brief Debugs an active process. - * @return Result code. - * @note Syscall number 0x60. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result DebugActiveProcess(Handle* debug, u64 processID); - -/** - * @brief Breaks an active debugging session. - * @return Result code. - * @note Syscall number 0x61. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result BreakDebugProcess(Handle debug); - -/** - * @brief Terminates the process of an active debugging session. - * @return Result code. - * @note Syscall number 0x62. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result TerminateDebugProcess(Handle debug); - -/** - * @brief Gets an incoming debug event from a debugging session. - * @return Result code. - * @note Syscall number 0x63. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetDebugEvent(DebugEventInfo* event_out, Handle debug); - -/** - * @brief Continues a debugging session. - * @return Result code. - * @note Syscall number 0x64. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - * @warning Only exists on [3.0.0+]. For older versions use \ref svcLegacyContinueDebugEvent. - */ -Result ContinueDebugEvent(Handle debug, u32 flags, u64* tid_list, u32 num_tids); - -/** - * @brief Continues a debugging session. - * @return Result code. - * @note Syscall number 0x64. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - * @warning Only exists on [1.0.0-2.3.0]. For newer versions use \ref svcContinueDebugEvent. - */ -Result LegacyContinueDebugEvent(Handle debug, u32 flags, u64 threadID); - -/** - * @brief Gets the context (dump the registers) of a thread in a debugging session. - * @return Result code. - * @param[out] ctx Output thread context (register dump). - * @param[in] debug Debug handle. - * @param[in] threadID ID of the thread to dump the context of. - * @param[in] flags Register groups to select, combination of @ref RegisterGroup flags. - * @note Syscall number 0x67. - * @warning Official kernel will not dump any CPU GPR if the thread is currently executing a system call (except @ref svcBreak and @ref svcReturnFromException). - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetDebugThreadContext(ThreadContext* ctx, Handle debug, u64 threadID, u32 flags); - -/** - * @brief Gets the context (dump the registers) of a thread in a debugging session. - * @return Result code. - * @param[in] debug Debug handle. - * @param[in] threadID ID of the thread to set the context of. - * @param[in] ctx Input thread context (register dump). - * @param[in] flags Register groups to select, combination of @ref RegisterGroup flags. - * @note Syscall number 0x68. - * @warning Official kernel will return an error if the thread is currently executing a system call (except @ref svcBreak and @ref svcReturnFromException). - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result SetDebugThreadContext(Handle debug, u64 threadID, const ThreadContext* ctx, u32 flags); - -/** - * @brief Retrieves a list of all running processes. - * @return Result code. - * @note Syscall number 0x65. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetProcessList(s32 *num_out, u64 *pids_out, u32 max_pids); - -/** - * @brief Retrieves a list of all threads for a debug handle (or zero). - * @return Result code. - * @note Syscall number 0x66. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetThreadList(s32 *num_out, u64 *tids_out, u32 max_tids, Handle debug); - -/** - * @brief Queries memory information from a process that is being debugged. - * @return Result code. - * @note Syscall number 0x69. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result QueryDebugProcessMemory(MemoryInfo* meminfo_ptr, u32* pageinfo, Handle debug, u64 addr); - -/** - * @brief Reads memory from a process that is being debugged. - * @return Result code. - * @note Syscall number 0x6A. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ReadDebugProcessMemory(void* buffer, Handle debug, u64 addr, u64 size); - -/** - * @brief Writes to memory in a process that is being debugged. - * @return Result code. - * @note Syscall number 0x6B. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result WriteDebugProcessMemory(Handle debug, const void* buffer, u64 addr, u64 size); - -/** - * @brief Sets one of the hardware breakpoints. - * @return Result code. - * @note Syscall number 0x6C. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result SetHardwareBreakPoint(u32 which, u64 flags, u64 value); - -/** - * @brief Gets parameters from a thread in a debugging session. - * @return Result code. - * @note Syscall number 0x6D. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetDebugThreadParam(u64* out_64, u32* out_32, Handle debug, u64 threadID, DebugThreadParam param); - -/** - * @brief Retrieves privileged information about the system, or a certain kernel object. - * @param[out] out Variable to which store the information. - * @param[in] id0 First ID of the property to retrieve. - * @param[in] handle Handle of the object to retrieve information from, or \ref INVALID_HANDLE to retrieve information about the system. - * @param[in] id1 Second ID of the property to retrieve. - * @return Result code. - * @remark The full list of property IDs can be found on the switchbrew.org wiki. - * @note Syscall number 0x6F. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetSystemInfo(u64* out, u64 id0, Handle handle, u64 id1); - -/** - * @brief Creates a port. - * @return Result code. - * @note Syscall number 0x70. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreatePort(Handle* portServer, Handle *portClient, s32 max_sessions, bool is_light, const char* name); - -/** - * @brief Manages a named port. - * @return Result code. - * @note Syscall number 0x71. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ManageNamedPort(Handle* portServer, const char* name, s32 maxSessions); - -/** - * @brief Manages a named port. - * @return Result code. - * @note Syscall number 0x72. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result ConnectToPort(Handle* session, Handle port); - -/** - * @brief Sets the memory permissions for the specified memory with the supplied process handle. - * @param[in] proc Process handle. - * @param[in] addr Address of the memory. - * @param[in] size Size of the memory. - * @param[in] perm Permissions (see \ref Permission). - * @return Result code. - * @remark This returns an error (0xD801) when \p perm is >0x5, hence -WX and RWX are not allowed. - * @note Syscall number 0x73. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result SetProcessMemoryPermission(Handle proc, u64 addr, u64 size, u32 perm); - -/** - * @brief Maps the src address from the supplied process handle into the current process. - * @param[in] dst Address to which map the memory in the current process. - * @param[in] proc Process handle. - * @param[in] src Source mapping address. - * @param[in] size Size of the memory. - * @return Result code. - * @remark This allows mapping code and rodata with RW- permission. - * @note Syscall number 0x74. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapProcessMemory(void* dst, Handle proc, u64 src, u64 size); - -/** - * @brief Undoes the effects of \ref svcMapProcessMemory. - * @param[in] dst Destination mapping address - * @param[in] proc Process handle. - * @param[in] src Address of the memory in the process. - * @param[in] size Size of the memory. - * @return Result code. - * @remark This allows mapping code and rodata with RW- permission. - * @note Syscall number 0x75. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result UnmapProcessMemory(void* dst, Handle proc, u64 src, u64 size); - -/** - * @brief Equivalent to \ref svcQueryMemory, for another process. - * @param[out] meminfo_ptr \ref MemoryInfo structure which will be filled in. - * @param[out] pageinfo Page information which will be filled in. - * @param[in] proc Process handle. - * @param[in] addr Address to query. - * @return Result code. - * @note Syscall number 0x76. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result QueryProcessMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, Handle proc, u64 addr); - -/** - * @brief Maps normal heap in a certain process as executable code (used when loading NROs). - * @param[in] proc Process handle (cannot be \ref CUR_PROCESS_HANDLE). - * @param[in] dst Destination mapping address. - * @param[in] src Source mapping address. - * @param[in] size Size of the mapping. - * @return Result code. - * @note Syscall number 0x77. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result MapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size); - -/** - * @brief Undoes the effects of \ref svcMapProcessCodeMemory. - * @param[in] proc Process handle (cannot be \ref CUR_PROCESS_HANDLE). - * @param[in] dst Destination mapping address. - * @param[in] src Source mapping address. - * @param[in] size Size of the mapping. - * @return Result code. - * @note Syscall number 0x78. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result UnmapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size); - -/** - * @brief Creates a new process. - * @return Result code. - * @note Syscall number 0x79. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateProcess(Handle* out, const void* proc_info, const u32* caps, u64 cap_num); - -/** - * @brief Starts executing a freshly created process. - * @return Result code. - * @note Syscall number 0x7A. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result StartProcess(Handle proc, s32 main_prio, s32 default_cpu, u32 stack_size); - -/** - * @brief Terminates a running process. - * @return Result code. - * @note Syscall number 0x7B. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result TerminateProcess(Handle proc); - -/** - * @brief Gets a \ref ProcessInfoType for a process. - * @return Result code. - * @note Syscall number 0x7C. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result GetProcessInfo(s64 *out, Handle proc, ProcessInfoType which); - -/** - * @brief Creates a new Resource Limit handle. - * @return Result code. - * @note Syscall number 0x7D. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result CreateResourceLimit(Handle* out); - -/** - * @brief Sets the value for a \ref LimitableResource for a Resource Limit handle. - * @return Result code. - * @note Syscall number 0x7E. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -Result SetResourceLimitLimitValue(Handle reslimit, LimitableResource which, u64 value); - -/** - * @brief Calls a secure monitor function (TrustZone, EL3). - * @param regs Arguments to pass to the secure monitor. - * @note Syscall number 0x7F. - * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. - */ -void CallSecureMonitor(SecmonArgs* regs); - -/** - * @brief Maps new insecure memory at the desired address. [15.0.0+] - * @return Result code. - * @note Syscall number 0x90. - */ -Result MapInsecurePhysicalMemory(void *address, u64 size); - -/** - * @brief Undoes the effects of \ref svcMapInsecureMemory. [15.0.0+] - * @return Result code. - * @note Syscall number 0x91. - */ -Result UnmapInsecurePhysicalMemory(void *address, u64 size); - -} // namespace svc - -/// @brief C++ wrappers for the `swkbd` API. -/// @details Wraps: switch/applets/swkbd.h. -namespace swkbd { - -using ::SwkbdAppearArg; -/// Base swkbd arg struct. -using ::SwkbdArgCommon; -using ::SwkbdArgV0; -/// Arg struct for version 0x30007+. -using ::SwkbdArgV7; -/// Arg struct for version 0x6000B+. -using ::SwkbdArgVB; -/// Struct data for SwkbdInline Interactive reply storage ChangedString*, at the end following the string. -using ::SwkbdChangedStringArg; -/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString* replies (text changed by the user or by \ref swkbdInlineSetInputText). -/// str is the UTF-8 string for the current text. -using ::SwkbdChangedStringCb; -/// This callback is used by \ref swkbdInlineUpdate when handling ChangedString*V2 replies (text changed by the user or by \ref swkbdInlineSetInputText). -/// str is the UTF-8 string for the current text. -using ::SwkbdChangedStringV2Cb; -using ::SwkbdConfig; -using ::SwkbdCustomizedDictionarySet; -/// Input data for SwkbdInline request SetCustomizeDic. -using ::SwkbdCustomizeDicInfo; -/// Struct data for SwkbdInline Interactive reply storage DecidedEnter*, at the end following the string. -using ::SwkbdDecidedEnterArg; -/// This callback is used by \ref swkbdInlineUpdate when handling DecidedEnter* replies (when the final text was submitted via the button). -/// str is the UTF-8 string for the current text. -using ::SwkbdDecidedEnterCb; -/// User dictionary word. -using ::SwkbdDictWord; -/// InitializeArg for SwkbdInline. -using ::SwkbdInitializeArg; -/// InlineKeyboard -using ::SwkbdInline; -using ::SwkbdInlineCalcArg; -/// Value for \ref SwkbdInitializeArg mode. Controls the LibAppletMode when launching the applet. -using ::SwkbdInlineMode; -/// Struct data for SwkbdInline Interactive reply storage MovedCursor*, at the end following the string. -using ::SwkbdMovedCursorArg; -/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor* replies. -/// str is the UTF-8 string for the current text. -using ::SwkbdMovedCursorCb; -/// This callback is used by \ref swkbdInlineUpdate when handling MovedCursor*V2 replies. -/// str is the UTF-8 string for the current text. -using ::SwkbdMovedCursorV2Cb; -/// Struct data for SwkbdInline Interactive reply storage MovedTab*, at the end following the string. -using ::SwkbdMovedTabArg; -/// This callback is used by \ref swkbdInlineUpdate when handling MovedTab* replies. -/// str is the UTF-8 string for the current text. -using ::SwkbdMovedTabCb; -/// Rect -using ::SwkbdRect; -/// SwkbdInline Interactive output storage reply ID. -using ::SwkbdReplyType; -/// SwkbdInline Interactive input storage request ID. -using ::SwkbdRequestCommand; -/// SwkbdInline State -using ::SwkbdState; -/// TextCheck callback set by \ref swkbdConfigSetTextCheckCallback, for validating the input string when the swkbd ok-button is pressed. This buffer contains an UTF-8 string. This callback should validate the input string, then return a \ref SwkbdTextCheckResult indicating success/failure. On failure, this function must write an error message to the tmp_string buffer, which will then be displayed by swkbd. -using ::SwkbdTextCheckCb; -/// Output result returned by \ref SwkbdTextCheckCb. -using ::SwkbdTextCheckResult; -/// Value for SwkbdArgCommon::textDrawType. Only applies when stringLenMax is 1..32, otherwise swkbd will only use SwkbdTextDrawType_Box. -using ::SwkbdTextDrawType; -/// Type of keyboard. -using ::SwkbdType; - -/** - * @brief Creates a SwkbdConfig struct. - * @param c SwkbdConfig struct. - * @param max_dictwords Max \ref SwkbdDictWord entries, 0 for none. - */ -Result Create(SwkbdConfig* c, s32 max_dictwords); - -/** - * @brief Closes a SwkbdConfig struct. - * @param c SwkbdConfig struct. - */ -void Close(SwkbdConfig* c); - -/** - * @brief Clears the args in the SwkbdConfig struct and initializes it with the Default Preset. - * @note Do not use this before \ref swkbdCreate. - * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_QWERTY, swkbdConfigSetInitialCursorPos() with value 1, swkbdConfigSetReturnButtonFlag() with value 1, and swkbdConfigSetBlurBackground() with value 1. Pre-5.0.0: swkbdConfigSetTextDrawType() with \ref SwkbdTextDrawType_Box. - * @param c SwkbdConfig struct. - */ -void ConfigMakePresetDefault(SwkbdConfig* c); - -/** - * @brief Clears the args in the SwkbdConfig struct and initializes it with the Password Preset. - * @note Do not use this before \ref swkbdCreate. - * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_QWERTY, swkbdConfigSetInitialCursorPos() with value 1, swkbdConfigSetPasswordFlag() with value 1, and swkbdConfigSetBlurBackground() with value 1. - * @param c SwkbdConfig struct. - */ -void ConfigMakePresetPassword(SwkbdConfig* c); - -/** - * @brief Clears the args in the SwkbdConfig struct and initializes it with the UserName Preset. - * @note Do not use this before \ref swkbdCreate. - * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal, swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_UserName, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. - * @param c SwkbdConfig struct. - */ -void ConfigMakePresetUserName(SwkbdConfig* c); - -/** - * @brief Clears the args in the SwkbdConfig struct and initializes it with the DownloadCode Preset. - * @note Do not use this before \ref swkbdCreate. - * @note Uses the following: swkbdConfigSetType() with \ref SwkbdType_Normal (\ref SwkbdType_QWERTY on [5.0.0+]), swkbdConfigSetKeySetDisableBitmask() with SwkbdKeyDisableBitmask_DownloadCode, swkbdConfigSetInitialCursorPos() with value 1, and swkbdConfigSetBlurBackground() with value 1. [5.0.0+]: swkbdConfigSetStringLenMax() with value 16, swkbdConfigSetStringLenMin() with value 1, and swkbdConfigSetTextDrawType() with SwkbdTextDrawType_DownloadCode. Uses swkbdConfigSetTextGrouping() for [0-2] with: 0x3, 0x7, and 0xb. - * @param c SwkbdConfig struct. - */ -void ConfigMakePresetDownloadCode(SwkbdConfig* c); - -/** - * @brief Sets the Ok button text. The default is "". - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetOkButtonText(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the LeftOptionalSymbolKey, for \ref SwkbdType_NumPad. The default is "". - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetLeftOptionalSymbolKey(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the RightOptionalSymbolKey, for \ref SwkbdType_NumPad. The default is "". - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetRightOptionalSymbolKey(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the Header text. The default is "". - * @note See SwkbdArgCommon::stringLenMax. - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetHeaderText(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the Sub text. The default is "". - * @note See SwkbdArgCommon::stringLenMax. - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetSubText(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the Guide text. The default is "". - * @note The swkbd applet only displays this when the current displayed cursor position is 0. - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetGuideText(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the Initial text. The default is "". - * @param c SwkbdConfig struct. - * @param str UTF-8 input string. - */ -void ConfigSetInitialText(SwkbdConfig* c, const char* str); - -/** - * @brief Sets the user dictionary. - * @param c SwkbdConfig struct. - * @param input Input data. - * @param entries Total entries in the buffer. - */ -void ConfigSetDictionary(SwkbdConfig* c, const SwkbdDictWord *input, s32 entries); - -/** - * @brief Sets the CustomizedDictionaries. - * @note Only available on [6.0.0+]. - * @param c SwkbdConfig struct. - * @param dic Input \ref SwkbdCustomizedDictionarySet - */ -Result ConfigSetCustomizedDictionaries(SwkbdConfig* c, const SwkbdCustomizedDictionarySet *dic); - -/** - * @brief Sets the TextCheck callback. - * @param c SwkbdConfig struct. - * @param cb \ref SwkbdTextCheckCb callback. - */ -void ConfigSetTextCheckCallback(SwkbdConfig* c, SwkbdTextCheckCb cb); - -/** - * @brief Sets SwkbdArgCommon::SwkbdType. - * @param c SwkbdConfig struct. - * @param type \ref SwkbdType - */ -void ConfigSetType(SwkbdConfig* c, SwkbdType type); - -/** - * @brief Sets SwkbdArgCommon::dicFlag. - * @param c SwkbdConfig struct. - * @param flag Flag - */ -void ConfigSetDicFlag(SwkbdConfig* c, u8 flag); - -/** - * @brief Sets SwkbdArgCommon::keySetDisableBitmask. - * @param c SwkbdConfig struct. - * @param keySetDisableBitmask keySetDisableBitmask - */ -void ConfigSetKeySetDisableBitmask(SwkbdConfig* c, u32 keySetDisableBitmask); - -/** - * @brief Sets SwkbdArgCommon::initialCursorPos. - * @param c SwkbdConfig struct. - * @param initialCursorPos initialCursorPos - */ -void ConfigSetInitialCursorPos(SwkbdConfig* c, u32 initialCursorPos); - -/** - * @brief Sets SwkbdArgCommon::stringLenMax. - * @param c SwkbdConfig struct. - * @param stringLenMax stringLenMax - */ -void ConfigSetStringLenMax(SwkbdConfig* c, u32 stringLenMax); - -/** - * @brief Sets SwkbdArgCommon::stringLenMin. - * @param c SwkbdConfig struct. - * @param stringLenMin stringLenMin - */ -void ConfigSetStringLenMin(SwkbdConfig* c, u32 stringLenMin); - -/** - * @brief Sets SwkbdArgCommon::passwordFlag. - * @param c SwkbdConfig struct. - * @param flag Flag - */ -void ConfigSetPasswordFlag(SwkbdConfig* c, u32 flag); - -/** - * @brief Sets SwkbdArgCommon::textDrawType. - * @param c SwkbdConfig struct. - * @param textDrawType \ref SwkbdTextDrawType - */ -void ConfigSetTextDrawType(SwkbdConfig* c, SwkbdTextDrawType textDrawType); - -/** - * @brief Sets SwkbdArgCommon::returnButtonFlag. - * @param c SwkbdConfig struct. - * @param flag Flag - */ -void ConfigSetReturnButtonFlag(SwkbdConfig* c, u16 flag); - -/** - * @brief Sets SwkbdArgCommon::blurBackground. - * @param c SwkbdConfig struct. - * @param blurBackground blurBackground - */ -void ConfigSetBlurBackground(SwkbdConfig* c, u8 blurBackground); - -/** - * @brief Sets SwkbdArgV7::textGrouping. - * @param index Array index. - * @param value Value to write. - */ -void ConfigSetTextGrouping(SwkbdConfig* c, u32 index, u32 value); - -/** - * @brief Sets SwkbdConfig::unkFlag, default is 0. Copied to SwkbdArgVB::unkFlag with [8.0.0+]. - * @param flag Flag - */ -void ConfigSetUnkFlag(SwkbdConfig* c, u8 flag); - -/** - * @brief Sets SwkbdConfig::trigger, default is 0. Copied to SwkbdArgVB::trigger with [8.0.0+]. - * @param trigger Trigger - */ -void ConfigSetTrigger(SwkbdConfig* c, u8 trigger); - -/** - * @brief Launch swkbd with the specified config. This will return once swkbd is finished running. - * @note The string buffer is also used for the buffer passed to the \ref SwkbdTextCheckCb, when it's set. Hence, in that case this buffer should be large enough to handle TextCheck string input/output. The size passed to the callback is the same size passed here, -1. - * @param c SwkbdConfig struct. - * @param out_string UTF-8 Output string buffer. - * @param out_string_size UTF-8 Output string buffer size, including NUL-terminator. - */ -Result Show(SwkbdConfig* c, char* out_string, size_t out_string_size); - -/** - * @brief Creates a SwkbdInline object. Only available on [2.0.0+]. - * @note This is essentially an asynchronous version of the regular swkbd. - * @note This calls \ref swkbdInlineSetUtf8Mode internally with flag=true. - * @param s SwkbdInline object. - */ -Result InlineCreate(SwkbdInline* s); - -/** - * @brief Closes a SwkbdInline object. If the applet is running, this will tell the applet to exit, then wait for the applet to exit + applet exit handling. - * @param s SwkbdInline object. - */ -Result InlineClose(SwkbdInline* s); - -/** - * @brief Does setup for \ref SwkbdInitializeArg and launches the applet with the SwkbdInline object. - * @note The initArg is cleared, and on [5.0.0+] unk_x5 is set to 1. - * @param s SwkbdInline object. - */ -Result InlineLaunch(SwkbdInline* s); - -/** - * @brief Same as \ref swkbdInlineLaunch, except mode and unk_x5 for \ref SwkbdInitializeArg are set to the input params. - * @param s SwkbdInline object. - * @param mode Value for SwkbdInitializeArg::mode. - * @param unk_x5 Value for SwkbdInitializeArg::unk_x5. - */ -Result InlineLaunchForLibraryApplet(SwkbdInline* s, u8 mode, u8 unk_x5); - -/** - * @brief GetWindowSize - * @param[out] width Output width. - * @param[out] height Output height. - */ -void InlineGetWindowSize(s32 *width, s32 *height); - -/** - * @brief GetImageMemoryRequirement - * @note Wrapper for \ref viGetIndirectLayerImageRequiredMemoryInfo. - * @param[out] out_size Output size. - * @param[out] out_alignment Output alignment. - */ -Result InlineGetImageMemoryRequirement(u64 *out_size, u64 *out_alignment); - -/** - * @brief GetImage - * @note Only available with ::SwkbdInlineMode_UserDisplay. - * @note For width/height, see \ref swkbdInlineGetWindowSize. - * @param s SwkbdInline object. - * @param[out] buffer Output RGBA8 image buffer, this must use the alignment from \ref swkbdInlineGetImageMemoryRequirement. - * @param[in] size Output buffer size, this must match the size from \ref swkbdInlineGetImageMemoryRequirement. - * @param[out] data_available Whether data is available. - */ -Result InlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_available); - -/** - * @brief Gets the image max height, relative to the bottom of the screen. - * @param s SwkbdInline object. - */ -s32 InlineGetMaxHeight(SwkbdInline* s); - -/** - * @brief Gets the MiniaturizedHeight, relative to the bottom of the screen. - * @param s SwkbdInline object. - */ -s32 InlineGetMiniaturizedHeight(SwkbdInline* s); - -/** - * @brief GetTouchRectangles. Returns number of valid Rects: 1 for only keytop, 2 for keytop/footer. - * @param s SwkbdInline object. - * @param[out] keytop \ref SwkbdRect for keytop. Optional, can be NULL. - * @param[out] footer \ref SwkbdRect for footer. Optional, can be NULL. - */ -s32 InlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *footer); - -/** - * @brief Gets whether the input x/y are within the output from \ref swkbdInlineGetTouchRectangles. - * @param s SwkbdInline object. - * @param[out] x X - * @param[out] y Y - */ -bool InlineIsUsedTouchPointByKeyboard(SwkbdInline* s, s32 x, s32 y); - -/** - * @brief Handles updating SwkbdInline state, this should be called periodically. - * @note Handles applet exit if needed, and also sends the \ref SwkbdInlineCalcArg to the applet if needed. Hence, this should be called at some point after writing to \ref SwkbdInlineCalcArg. - * @note Handles applet Interactive storage output when needed. - * @param s SwkbdInline object. - * @param out_state Optional output \ref SwkbdState. - */ -Result InlineUpdate(SwkbdInline* s, SwkbdState* out_state); - -/** - * @brief Sets the FinishedInitialize callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @param s SwkbdInline object. - * @param cb Callback - */ -void InlineSetFinishedInitializeCallback(SwkbdInline* s, VoidFn cb); - -/** - * @brief Sets the DecidedCancel callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @param s SwkbdInline object. - * @param cb Callback - */ -void InlineSetDecidedCancelCallback(SwkbdInline* s, VoidFn cb); - -/** - * @brief Sets the ChangedString callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @note This clears the callback set by \ref swkbdInlineSetChangedStringV2Callback. - * @note This should be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. - * @param s SwkbdInline object. - * @param cb \ref SwkbdChangedStringCb Callback - */ -void InlineSetChangedStringCallback(SwkbdInline* s, SwkbdChangedStringCb cb); - -/** - * @brief Sets the ChangedStringV2 callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @note Only available with [8.0.0+]. - * @note This must be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. - * @param s SwkbdInline object. - * @param cb \ref SwkbdChangedStringV2Cb Callback - */ -void InlineSetChangedStringV2Callback(SwkbdInline* s, SwkbdChangedStringV2Cb cb); - -/** - * @brief Sets the MovedCursor callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @note This clears the callback set by \ref swkbdInlineSetMovedCursorV2Callback. - * @note This should be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. - * @param s SwkbdInline object. - * @param cb \ref SwkbdMovedCursorCb Callback - */ -void InlineSetMovedCursorCallback(SwkbdInline* s, SwkbdMovedCursorCb cb); - -/** - * @brief Sets the MovedCursorV2 callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @note Only available with [8.0.0+]. - * @note This must be called after \ref swkbdInlineLaunch / \ref swkbdInlineLaunchForLibraryApplet. - * @param s SwkbdInline object. - * @param cb \ref SwkbdMovedCursorV2Cb Callback - */ -void InlineSetMovedCursorV2Callback(SwkbdInline* s, SwkbdMovedCursorV2Cb cb); - -/** - * @brief Sets the MovedTab callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @param s SwkbdInline object. - * @param cb \ref SwkbdMovedTabCb Callback - */ -void InlineSetMovedTabCallback(SwkbdInline* s, SwkbdMovedTabCb cb); - -/** - * @brief Sets the DecidedEnter callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @param s SwkbdInline object. - * @param cb \ref SwkbdDecidedEnterCb Callback - */ -void InlineSetDecidedEnterCallback(SwkbdInline* s, SwkbdDecidedEnterCb cb); - -/** - * @brief Sets the ReleasedUserWordInfo callback, used by \ref swkbdInlineUpdate. The default is NULL for none. - * @param s SwkbdInline object. - * @param cb Callback - */ -void InlineSetReleasedUserWordInfoCallback(SwkbdInline* s, VoidFn cb); - -/** - * @brief Appear the kbd and set \ref SwkbdAppearArg. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Wrapper for \ref swkbdInlineAppearEx, with trigger=0. - * @param s SwkbdInline object. - * @param arg Input SwkbdAppearArg. - */ -void InlineAppear(SwkbdInline* s, const SwkbdAppearArg* arg); - -/** - * @brief Appear the kbd and set \ref SwkbdAppearArg. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param arg Input SwkbdAppearArg. - * @param trigger Trigger, default is 0. Requires [6.0.0+], on eariler versions this will always use value 0 internally. - */ -void InlineAppearEx(SwkbdInline* s, const SwkbdAppearArg* arg, u8 trigger); - -/** - * @brief Disappear the kbd. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - */ -void InlineDisappear(SwkbdInline* s); - -/** - * @brief Creates a \ref SwkbdAppearArg which can then be passed to \ref swkbdInlineAppear. arg is initialized with the defaults, with type being set to the input type. - * @param arg Output \ref SwkbdAppearArg. - * @param type \ref SwkbdType type - */ -void InlineMakeAppearArg(SwkbdAppearArg* arg, SwkbdType type); - -/** - * @brief Sets okButtonText for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg. - * @param arg \ref SwkbdAppearArg - * @param str Input UTF-8 string for the Ok button text, this can be empty/NULL to use the default. - */ -void InlineAppearArgSetOkButtonText(SwkbdAppearArg* arg, const char* str); - -/** - * @brief Sets the LeftButtonText, for \ref SwkbdType_NumPad. The default is "". Equivalent to \ref swkbdConfigSetLeftOptionalSymbolKey. - * @param arg \ref SwkbdAppearArg, previously initialized by \ref swkbdInlineMakeAppearArg. - * @param str UTF-8 input string. - */ -void InlineAppearArgSetLeftButtonText(SwkbdAppearArg* arg, const char* str); - -/** - * @brief Sets the RightButtonText, for \ref SwkbdType_NumPad. The default is "". Equivalent to \ref swkbdConfigSetRightOptionalSymbolKey. - * @param arg \ref SwkbdAppearArg, previously initialized by \ref swkbdInlineMakeAppearArg. - * @param str UTF-8 input string. - */ -void InlineAppearArgSetRightButtonText(SwkbdAppearArg* arg, const char* str); - -/** - * @brief Sets the stringLenMax for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg. - * @param arg \ref SwkbdAppearArg - * @param stringLenMax Max string length - */ -void InlineAppearArgSetStringLenMax(SwkbdAppearArg* arg, s32 stringLenMax); - -/** - * @brief Sets the stringLenMin for the specified SwkbdAppearArg, which was previously initialized with \ref swkbdInlineMakeAppearArg. - * @param arg \ref SwkbdAppearArg - * @param stringLenMin Min string length - */ -void InlineAppearArgSetStringLenMin(SwkbdAppearArg* arg, s32 stringLenMin); - -/** - * @brief Sets the audio volume. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param volume Volume - */ -void InlineSetVolume(SwkbdInline* s, float volume); - -/** - * @brief Sets the current input text string. Overrides the entire user input string if the user previously entered any text. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note This will not affect the cursor position, see \ref swkbdInlineSetCursorPos for that. - * @param s SwkbdInline object. - * @param str UTF-8 input string. - */ -void InlineSetInputText(SwkbdInline* s, const char* str); - -/** - * @brief Sets the cursor character position in the string. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param pos Position - */ -void InlineSetCursorPos(SwkbdInline* s, s32 pos); - -/** - * @brief Sets the UserWordInfo. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this was already used previously. - * @note The specified buffer must not be used after this, until \ref swkbdInlineClose is used. - * @note \ref swkbdInlineUpdate must be called at some point afterwards. - * @note If input==NULL or total_entries==0, this will just call \ref swkbdInlineUnsetUserWordInfo internally. - * @param s SwkbdInline object. - * @param input Input data. - * @param entries Total entries in the buffer. - */ -Result InlineSetUserWordInfo(SwkbdInline* s, const SwkbdDictWord *input, s32 entries); - -/** - * @brief Request UnsetUserWordInfo. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. - * @param s SwkbdInline object. - */ -Result InlineUnsetUserWordInfo(SwkbdInline* s); - -/** - * @brief Sets the utf8Mode. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Automatically used internally by \ref swkbdInlineCreate. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetUtf8Mode(SwkbdInline* s, bool flag); - -/** - * @brief Sets the CustomizeDic. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizedDictionaries was already used previously. - * @note The specified buffer must not be used after this, until \ref swkbdInlineClose is used. However, it will also become available once \ref swkbdInlineUpdate handles SwkbdReplyType_UnsetCustomizeDic internally. - * @param s SwkbdInline object. - * @param buffer 0x1000-byte aligned buffer. - * @param size 0x1000-byte aligned buffer size. - * @param info Input \ref SwkbdCustomizeDicInfo - */ -Result InlineSetCustomizeDic(SwkbdInline* s, void* buffer, size_t size, SwkbdCustomizeDicInfo *info); - -/** - * @brief Request UnsetCustomizeDic. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. - * @param s SwkbdInline object. - */ -void InlineUnsetCustomizeDic(SwkbdInline* s); - -/** - * @brief Sets the CustomizedDictionaries. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. Can't be used if this or \ref swkbdInlineSetCustomizeDic was already used previously. - * @note The specified buffer in dic must not be used after this, until \ref swkbdInlineClose is used. However, it will also become available once \ref swkbdInlineUpdate handles SwkbdReplyType_UnsetCustomizedDictionaries internally. - * @note Only available on [6.0.0+]. - * @param s SwkbdInline object. - * @param dic Input \ref SwkbdCustomizedDictionarySet - */ -Result InlineSetCustomizedDictionaries(SwkbdInline* s, const SwkbdCustomizedDictionarySet *dic); - -/** - * @brief Request UnsetCustomizedDictionaries. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. - * @note Only available on [6.0.0+]. - * @param s SwkbdInline object. - */ -Result InlineUnsetCustomizedDictionaries(SwkbdInline* s); - -/** - * @brief Sets InputModeFadeType. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param type Type - */ -void InlineSetInputModeFadeType(SwkbdInline* s, u8 type); - -/** - * @brief Sets AlphaEnabledInInputMode. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetAlphaEnabledInInputMode(SwkbdInline* s, bool flag); - -/** - * @brief Sets KeytopBgAlpha. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param alpha Alpha, clamped to range 0.0f..1.0f. - */ -void InlineSetKeytopBgAlpha(SwkbdInline* s, float alpha); - -/** - * @brief Sets FooterBgAlpha. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param alpha Alpha, clamped to range 0.0f..1.0f. - */ -void InlineSetFooterBgAlpha(SwkbdInline* s, float alpha); - -/** - * @brief Sets gfx scaling. Configures KeytopScale* and BalloonScale based on the input value. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note The BalloonScale is not updated when \ref SwkbdState is above ::SwkbdState_Initialized. - * @param s SwkbdInline object. - * @param scale Scale - */ -void InlineSetKeytopScale(SwkbdInline* s, float scale); - -/** - * @brief Sets gfx translation for the displayed swkbd image position. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param x X - * @param y Y - */ -void InlineSetKeytopTranslate(SwkbdInline* s, float x, float y); - -/** - * @brief Sets KeytopAsFloating. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Not available when \ref SwkbdState is above ::SwkbdState_Initialized. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetKeytopAsFloating(SwkbdInline* s, bool flag); - -/** - * @brief Sets FooterScalable. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetFooterScalable(SwkbdInline* s, bool flag); - -/** - * @brief Sets whether touch is enabled. The default is enabled. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetTouchFlag(SwkbdInline* s, bool flag); - -/** - * @brief Sets whether Hardware-keyboard is enabled. The default is enabled. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetHardwareKeyboardFlag(SwkbdInline* s, bool flag); - -/** - * @brief Sets whether DirectionalButtonAssign is enabled. The default is disabled. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Only available on [4.0.0+]. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetDirectionalButtonAssignFlag(SwkbdInline* s, bool flag); - -/** - * @brief Sets whether the specified SeGroup (sound effect) is enabled. The default is enabled. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. If called again with a different seGroup, \ref swkbdInlineUpdate must be called prior to calling this again. - * @note Only available on [5.0.0+]. - * @param s SwkbdInline object. - * @param seGroup SeGroup - * @param flag Flag - */ -void InlineSetSeGroup(SwkbdInline* s, u8 seGroup, bool flag); - -/** - * @brief Sets whether the backspace button is enabled. The default is enabled. - * @note \ref swkbdInlineUpdate must be called at some point afterwards for this to take affect. - * @note Only available on [5.0.0+]. - * @param s SwkbdInline object. - * @param flag Flag - */ -void InlineSetBackspaceFlag(SwkbdInline* s, bool flag); - -} // namespace swkbd - -/// @brief C++ wrappers for the `tc` API. -/// @details Wraps: switch/services/tc.h. -namespace tc { - -/// Initialize tc. -Result Initialize(void); - -/// Exit tc. -void Exit(void); - -/// Gets the Service for tc. -Service* GetServiceSession(void); - -Result EnableFanControl(void); - -/// @warning Disabling your fan can damage your system. -Result DisableFanControl(void); - -Result IsFanControlEnabled(bool *status); - -/// Only available on [5.0.0+]. -Result GetSkinTemperatureMilliC(s32 *skinTemp); - -} // namespace tc - -/// @brief C++ wrappers for the `thread` API. -/// @details Wraps: switch/arm/thread_context.h, switch/kernel/thread.h. -namespace thread { - -/// Armv8 CPU register. -using ::CpuRegister; -/// Armv8 NEON register. -using ::FpuRegister; -/// Armv8 register group. @ref svcGetThreadContext3 uses @ref RegisterGroup_All. -using ::RegisterGroup; -/// Thread information structure. -using ::Thread; -/// Thread context structure (register dump) -using ::ThreadContext; -/// This is for \ref ThreadExceptionDump error_desc. -using ::ThreadExceptionDesc; -/// Thread exception dump structure. -using ::ThreadExceptionDump; -using ::ThreadExceptionFrameA32; -using ::ThreadExceptionFrameA64; - -/** - * @brief Determines whether a thread context belong to an AArch64 process based on the PSR. - * @param[in] ctx Thread context to which PSTATE/cspr has been dumped to. - * @return true if and only if the thread context belongs to an AArch64 process. - */ -bool ContextIsAArch64(const ThreadContext *ctx); - -/** - * @brief Determines whether a ThreadExceptionDump belongs to an AArch64 process based on the PSTATE. - * @param[in] ctx ThreadExceptionDump. - * @return true if and only if the ThreadExceptionDump belongs to an AArch64 process. - */ -bool ExceptionIsAArch64(const ThreadExceptionDump *ctx); - -/** - * @brief Creates a thread. - * @param t Thread information structure which will be filled in. - * @param entry Entrypoint of the thread. - * @param arg Argument to pass to the entrypoint. - * @param stack_mem Memory to use as backing for stack/tls/reent. Must be page-aligned. NULL argument means to allocate new memory. - * @param stack_sz If stack_mem is NULL, size to use for stack. If stack_mem is non-NULL, size to use for stack + reent + tls (must be page-aligned). - * @param prio Thread priority (0x00~0x3F); 0x2C is the usual priority of the main thread, 0x3B is a special priority on cores 0..2 that enables preemptive multithreading (0x3F on core 3). - * @param cpuid ID of the core on which to create the thread (0~3); or -2 to use the default core for the current process. - * @return Result code. - */ -Result Create(Thread* t, ThreadFunc entry, void* arg, void *stack_mem, size_t stack_sz, int prio, int cpuid); - -/** - * @brief Starts the execution of a thread. - * @param t Thread information structure. - * @return Result code. - */ -Result Start(Thread* t); - -/** - * @brief Exits the current thread immediately. - */ -[[noreturn]] void Exit(void); - -/** - * @brief Waits for a thread to finish executing. - * @param t Thread information structure. - * @return Result code. - */ -Result WaitForExit(Thread* t); - -/** - * @brief Frees up resources associated with a thread. - * @param t Thread information structure. - * @return Result code. - */ -Result Close(Thread* t); - -/** - * @brief Pauses the execution of a thread. - * @param t Thread information structure. - * @return Result code. - */ -Result Pause(Thread* t); - -/** - * @brief Resumes the execution of a thread, after having been paused. - * @param t Thread information structure. - * @return Result code. - */ -Result Resume(Thread* t); - -/** - * @brief Dumps the registers of a thread paused by @ref threadPause (register groups: all). - * @param[out] ctx Output thread context (register dump). - * @param t Thread information structure. - * @return Result code. - * @warning Official kernel will not dump x0..x18 if the thread is currently executing a system call, and prior to 6.0.0 doesn't dump TPIDR_EL0. - */ -Result DumpContext(ThreadContext* ctx, Thread* t); - -/** - * @brief Gets a pointer to the current thread structure. - * @return Thread information structure. - */ -Thread * GetSelf(void); - -/** - * @brief Gets the raw handle to the current thread. - * @return The current thread's handle. - */ -Handle GetCurHandle(void); - -/** - * @brief Allocates a TLS slot. - * @param destructor Function to run automatically when a thread exits. - * @return TLS slot ID on success, or a negative value on failure. - */ -s32 TlsAlloc(void (* destructor)(void*)); - -/** - * @brief Retrieves the value stored in a TLS slot. - * @param slot_id TLS slot ID. - * @return Value. - */ -void* TlsGet(s32 slot_id); - -/** - * @brief Stores the specified value into a TLS slot. - * @param slot_id TLS slot ID. - * @param value Value. - */ -void TlsSet(s32 slot_id, void* value); - -/** - * @brief Frees a TLS slot. - * @param slot_id TLS slot ID. - */ -void TlsFree(s32 slot_id); - -} // namespace thread - -/// @brief C++ wrappers for the `time` API. -/// @details Wraps: switch/services/time.h. -namespace time { - -using ::TimeCalendarAdditionalInfo; -using ::TimeCalendarTime; -using ::TimeLocationName; -/// Values for __nx_time_service_type. -using ::TimeServiceType; -using ::TimeStandardSteadyClockTimePointType; -using ::TimeSteadyClockTimePoint; -using ::TimeSystemClockContext; -/// Time clock type. -using ::TimeType; -using ::TimeZoneRule; - -/// Initialize time. Used automatically during app startup. -Result Initialize(void); - -/// Exit time. Used automatically during app startup. -void Exit(void); - -/// Gets the Service object for the actual time service session. -Service* GetServiceSession(void); - -/// Gets the Service object for ISystemClock with the specified \ref TimeType. This will return NULL when the type is invalid. -Service* GetServiceSession_SystemClock(TimeType type); - -/// Gets the Service object for ISteadyClock. -Service* GetServiceSession_SteadyClock(void); - -/// Gets the Service object for ITimeZoneService. -Service* GetServiceSession_TimeZoneService(void); - -/// [6.0.0+] Gets the address of the SharedMemory. -void* GetSharedmemAddr(void); - -/** - * @brief Gets the timepoint for the standard steady clock. - * @param[out] out Output timepoint (see \ref TimeSteadyClockTimePoint) - * @remark The standard steady clock counts time since the RTC was configured (usually this happens during manufacturing). - * @return Result code. - */ -Result GetStandardSteadyClockTimePoint(TimeSteadyClockTimePoint *out); - -/** - * @brief [3.0.0+] Gets the internal offset for the standard steady clock. - * @param[out] out Output internal offset. - * @return Result code. - */ -Result GetStandardSteadyClockInternalOffset(s64 *out); - -/** - * @brief Gets the time for the specified clock. - * @param[in] type Clock to use. - * @param[out] timestamp POSIX UTC timestamp. - * @return Result code. - */ -Result GetCurrentTime(TimeType type, u64 *timestamp); - -/** - * @brief Sets the time for the specified clock. - * @param[in] type Clock to use. - * @param[in] timestamp POSIX UTC timestamp. - * @return Result code. - */ -Result SetCurrentTime(TimeType type, u64 timestamp); - -Result GetDeviceLocationName(TimeLocationName *name); - -Result SetDeviceLocationName(const TimeLocationName *name); - -Result GetTotalLocationNameCount(s32 *total_location_name_count); - -Result LoadLocationNameList(s32 index, TimeLocationName *location_name_array, s32 location_name_max, s32 *location_name_count); - -Result LoadTimeZoneRule(const TimeLocationName *name, TimeZoneRule *rule); - -Result ToCalendarTime(const TimeZoneRule *rule, u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info); - -Result ToCalendarTimeWithMyRule(u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info); - -Result ToPosixTime(const TimeZoneRule *rule, const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count); - -Result ToPosixTimeWithMyRule(const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count); - -} // namespace time - -/// @brief C++ wrappers for the `tipc` API. -/// @details Wraps: switch/sf/tipc.h. -namespace tipc { - -using ::TipcCommandType; -using ::TipcDispatchParams; -using ::TipcRequestFormat; -/// tipc Service object structure -using ::TipcService; - -/** - * @brief Creates a tipc service object from an IPC session handle. - * @param[out] s TIPC service object. - * @param[in] h IPC session handle. - */ -void Create(TipcService* s, Handle h); - -/** - * @brief Closes a tipc service. - * @param[in] s TIPC service object. - */ -void Close(TipcService* s); - -void RequestInBuffer(HipcRequest* req, const void* buffer, size_t size, HipcBufferMode mode); - -void RequestOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode); - -void RequestInOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode); - -void RequestHandle(HipcRequest* req, Handle handle); - -void RequestFormatProcessBuffer(TipcRequestFormat* fmt, u32 attr); - -void RequestProcessBuffer(HipcRequest* req, const SfBuffer* buf, u32 attr); - -void* MakeRequest(u32 request_id, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_handles, const Handle* handles); - -Handle ResponseGetCopyHandle(HipcResponse* res); - -Handle ResponseGetMoveHandle(HipcResponse* res); - -void ResponseGetHandle(HipcResponse* res, SfOutHandleAttr type, Handle* out); - -Result ParseResponse(u32 out_size, void** out_data, u32 num_out_objects, TipcService* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles); - -Result DispatchImpl(TipcService* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, TipcDispatchParams disp); - -} // namespace tipc - -/// @brief C++ wrappers for the `tmem` API. -/// @details Wraps: switch/kernel/tmem.h. -namespace tmem { - -/// Transfer memory information structure. -using ::TransferMemory; - -/** - * @brief Creates a transfer memory object. - * @param t Transfer memory information structure that will be filled in. - * @param size Size of the transfer memory object to create. - * @param perm Permissions with which to protect the transfer memory in the local process. - * @return Result code. - */ -Result Create(TransferMemory* t, size_t size, Permission perm); - -/** - * @brief Creates a transfer memory object from existing memory. - * @param t Transfer memory information structure that will be filled in. - * @param buf Pointer to a page-aligned buffer. - * @param size Size of the transfer memory object to create. - * @param perm Permissions with which to protect the transfer memory in the local process. - * @return Result code. - */ -Result CreateFromMemory(TransferMemory* t, void* buf, size_t size, Permission perm); - -/** - * @brief Loads a transfer memory object coming from a remote process. - * @param t Transfer memory information structure which will be filled in. - * @param handle Handle of the transfer memory object. - * @param size Size of the transfer memory object that is being loaded. - * @param perm Permissions which the transfer memory is expected to have in the process that owns the memory. - * @warning This is a privileged operation; in normal circumstances applications shouldn't use this function. - */ -void LoadRemote(TransferMemory* t, Handle handle, size_t size, Permission perm); - -/** - * @brief Maps a transfer memory object. - * @param t Transfer memory information structure. - * @return Result code. - * @warning This is a privileged operation; in normal circumstances applications cannot use this function. - */ -Result Map(TransferMemory* t); - -/** - * @brief Unmaps a transfer memory object. - * @param t Transfer memory information structure. - * @return Result code. - * @warning This is a privileged operation; in normal circumstances applications cannot use this function. - */ -Result Unmap(TransferMemory* t); - -/** - * @brief Retrieves the mapped address of a transfer memory object. - * @param t Transfer memory information structure. - * @return Mapped address of the transfer memory object. - */ -void* GetAddr(TransferMemory* t); - -/** - * @brief Closes handle of a transfer memory object. - * @param t Transfer memory information structure. - * @return Result code. - */ -Result CloseHandle(TransferMemory* t); - -/** - * @brief Waits until source backing memory permissions match perm. - * @param t Transfer memory information structure. - * @param perm Permissions which the source backing memory is expected to have before return. - * @return Result code. - */ -Result WaitForPermission(TransferMemory* t, Permission perm); - -/** - * @brief Frees up resources used by a transfer memory object, unmapping and closing handles, etc. - * @param t Transfer memory information structure. - * @return Result code. - */ -Result Close(TransferMemory* t); - -} // namespace tmem - -/// @brief C++ wrappers for the `ts` API. -/// @details Wraps: switch/services/ts.h. -namespace ts { - -using ::TsDeviceCode; -/// Location -using ::TsLocation; -using ::TsSession; - -/// Initialize ts. -Result Initialize(void); - -/// Exit ts. -void Exit(void); - -/// Gets the Service for ts. -Service* GetServiceSession(void); - -/** - * @brief Gets the min/max temperature for the specified \ref TsLocation. - * @param[in] location \ref TsLocation - * @param[out] min_temperature Output minimum temperature in Celsius. - * @param[out] max_temperature Output maximum temperature in Celsius. - */ -Result GetTemperatureRange(TsLocation location, s32 *min_temperature, s32 *max_temperature); - -/** - * @brief Gets the temperature for the specified \ref TsLocation. - * @param[in] location \ref TsLocation - * @param[out] temperature Output temperature in Celsius. - */ -Result GetTemperature(TsLocation location, s32 *temperature); - -/** - * @brief Gets the temperature for the specified \ref TsLocation, in MilliC. [1.0.0-13.2.1] - * @param[in] location \ref TsLocation - * @param[out] temperature Output temperature in MilliC. - */ -Result GetTemperatureMilliC(TsLocation location, s32 *temperature); - -Result OpenSession(TsSession *s, u32 device_code); - -///< [8.0.0+] -Result SessionGetTemperature(TsSession *s, float *temperature); - -///< [10.0.0+] -void SessionClose(TsSession *s); - -} // namespace ts - -/// @brief C++ wrappers for the `uart` API. -/// @details Wraps: switch/services/uart.h. -namespace uart { - -/// FlowControlMode -using ::UartFlowControlMode; -/// UartPort -using ::UartPort; -/// PortEventType -using ::UartPortEventType; -/// UartPortForDev -using ::UartPortForDev; -/// PortSession -using ::UartPortSession; - -/// Initialize uart. -Result Initialize(void); - -/// Exit uart. -void Exit(void); - -/// Gets the Service object for the actual uart service session. -Service* GetServiceSession(void); - -/** - * @brief HasPort - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPort - * @param[out] out Output success flag. - */ -Result HasPort(UartPort port, bool *out); - -/** - * @brief HasPortForDev - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPortForDev - * @param[out] out Output success flag. - */ -Result HasPortForDev(UartPortForDev port, bool *out); - -/** - * @brief IsSupportedBaudRate - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPort - * @param[in] baud_rate BaudRate - * @param[out] out Output success flag. - */ -Result IsSupportedBaudRate(UartPort port, u32 baud_rate, bool *out); - -/** - * @brief IsSupportedBaudRateForDev - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPortForDev - * @param[in] baud_rate BaudRate - * @param[out] out Output success flag. - */ -Result IsSupportedBaudRateForDev(UartPortForDev port, u32 baud_rate, bool *out); - -/** - * @brief IsSupportedFlowControlMode - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPort - * @param[in] flow_control_mode \ref UartFlowControlMode - * @param[out] out Output success flag. - */ -Result IsSupportedFlowControlMode(UartPort port, UartFlowControlMode flow_control_mode, bool *out); - -/** - * @brief IsSupportedFlowControlModeForDev - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPortForDev - * @param[in] flow_control_mode \ref UartFlowControlMode - * @param[out] out Output success flag. - */ -Result IsSupportedFlowControlModeForDev(UartPortForDev port, UartFlowControlMode flow_control_mode, bool *out); - -/** - * @brief Creates an \ref UartPortSession. - * @note Use \ref uartPortSessionOpenPort or \ref uartPortSessionOpenPortForDev before using any other cmds. - * @param[out] s \ref UartPortSession - */ -Result CreatePortSession(UartPortSession *s); - -/** - * @brief IsSupportedPortEvent - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPort - * @param[in] port_event_type \ref UartPortEventType - * @param[out] out Output success flag. - */ -Result IsSupportedPortEvent(UartPort port, UartPortEventType port_event_type, bool *out); - -/** - * @brief IsSupportedPortEventForDev - * @note Only available on [1.0.0-16.1.0]. - * @param[in] port \ref UartPortForDev - * @param[in] port_event_type \ref UartPortEventType - * @param[out] out Output success flag. - */ -Result IsSupportedPortEventForDev(UartPortForDev port, UartPortEventType port_event_type, bool *out); - -/** - * @brief IsSupportedDeviceVariation - * @note Only available on [7.0.0-16.1.0]. - * @param[in] port \ref UartPort - * @param[in] device_variation DeviceVariation - * @param[out] out Output success flag. - */ -Result IsSupportedDeviceVariation(UartPort port, u32 device_variation, bool *out); - -/** - * @brief IsSupportedDeviceVariationForDev - * @note Only available on [7.0.0-16.1.0]. - * @param[in] port \ref UartPortForDev - * @param[in] device_variation DeviceVariation - * @param[out] out Output success flag. - */ -Result IsSupportedDeviceVariationForDev(UartPortForDev port, u32 device_variation, bool *out); - -/** - * @brief Close an \ref UartPortSession. - * @param s \ref UartPortSession - */ -void PortSessionClose(UartPortSession* s); - -/** - * @brief OpenPort - * @note This is not usable when the specified \ref UartPort is already being used. - * @param s \ref UartPortSession - * @param[out] out Output success flag. - * @param[in] port \ref UartPort - * @param[in] baud_rate BaudRate - * @param[in] flow_control_mode \ref UartFlowControlMode - * @param[in] device_variation [7.0.0+] DeviceVariation - * @param[in] is_invert_tx [6.0.0+] IsInvertTx - * @param[in] is_invert_rx [6.0.0+] IsInvertRx - * @param[in] is_invert_rts [6.0.0+] IsInvertRts - * @param[in] is_invert_cts [6.0.0+] IsInvertCts - * @param[in] send_buffer Send buffer, must be 0x1000-byte aligned. - * @param[in] send_buffer_length Send buffer size, must be 0x1000-byte aligned. - * @param[in] receive_buffer Receive buffer, must be 0x1000-byte aligned. - * @param[in] receive_buffer_length Receive buffer size, must be 0x1000-byte aligned. - */ -Result PortSessionOpenPort(UartPortSession* s, bool *out, UartPort port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length); - -/** - * @brief OpenPortForDev - * @note See the notes for \ref uartPortSessionOpenPort. - * @param s \ref UartPortSession - * @param[out] out Output success flag. - * @param[in] port \ref UartPortForDev - * @param[in] baud_rate BaudRate - * @param[in] flow_control_mode \ref UartFlowControlMode - * @param[in] device_variation [7.0.0+] DeviceVariation - * @param[in] is_invert_tx [6.0.0+] IsInvertTx - * @param[in] is_invert_rx [6.0.0+] IsInvertRx - * @param[in] is_invert_rts [6.0.0+] IsInvertRts - * @param[in] is_invert_cts [6.0.0+] IsInvertCts - * @param[in] send_buffer Send buffer, must be 0x1000-byte aligned. - * @param[in] send_buffer_length Send buffer size, must be 0x1000-byte aligned. - * @param[in] receive_buffer Receive buffer, must be 0x1000-byte aligned. - * @param[in] receive_buffer_length Receive buffer size, must be 0x1000-byte aligned. - */ -Result PortSessionOpenPortForDev(UartPortSession* s, bool *out, UartPortForDev port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length); - -/** - * @brief GetWritableLength - * @param s \ref UartPortSession - * @param[out] out Output WritableLength. - */ -Result PortSessionGetWritableLength(UartPortSession* s, u64 *out); - -/** - * @brief Send - * @param s \ref UartPortSession - * @param[in] in_data Input data buffer. - * @param[in] size Input data buffer size. - * @param[out] out Output size. - */ -Result PortSessionSend(UartPortSession* s, const void* in_data, size_t size, u64 *out); - -/** - * @brief GetReadableLength - * @param s \ref UartPortSession - * @param[out] out Output ReadableLength. - */ -Result PortSessionGetReadableLength(UartPortSession* s, u64 *out); - -/** - * @brief Receive - * @param s \ref UartPortSession - * @param[out] out_data Output data buffer. - * @param[in] size Output data buffer size. - * @param[out] out Output size. - */ -Result PortSessionReceive(UartPortSession* s, void* out_data, size_t size, u64 *out); - -/** - * @brief BindPortEvent - * @note The Event must be closed by the user after using \ref uartPortSessionUnbindPortEvent. - * @param s \ref UartPortSession - * @param[in] port_event_type \ref UartPortEventType - * @param[in] threshold Threshold - * @param[out] out Output success flag. - * @param[out] out_event Output Event with autoclear=false. - */ -Result PortSessionBindPortEvent(UartPortSession* s, UartPortEventType port_event_type, s64 threshold, bool *out, Event *out_event); - -/** - * @brief UnbindPortEvent - * @param s \ref UartPortSession - * @param[in] port_event_type \ref UartPortEventType - * @param[out] out Output success flag. - */ -Result PortSessionUnbindPortEvent(UartPortSession* s, UartPortEventType port_event_type, bool *out); - -} // namespace uart - -/// @brief C++ wrappers for the `uevent` API. -/// @details Wraps: switch/kernel/uevent.h. -namespace uevent { - -using ::UEvent; - -/** - * @brief Creates a user-mode event. - * @param[out] e UEvent object. - * @param[in] auto_clear Whether to automatically clear the event. - * @note It is safe to wait on this event with several threads simultaneously. - * @note If more than one thread is listening on it, at least one thread will get the signal. No other guarantees. - */ -void Create(UEvent* e, bool auto_clear); - -/** - * @brief Clears the event signal. - * @param[in] e UEvent object. - */ -void Clear(UEvent* e); - -/** - * @brief Signals the event. - * @param[in] e UEvent object. - */ -void Signal(UEvent* e); - -} // namespace uevent - -/// @brief C++ wrappers for the `usb` API. -/// @details Wraps: switch/runtime/devices/usb_comms.h, switch/services/usbds.h, switch/services/usbhs.h. -namespace usb { - -/// Imported from libusb, with changed names. -using ::usb_class_code; -/// Imported from libusb, with some adjustments. -using ::usb_config_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_control_setup; -/// Imported from libusb, with changed names. -using ::usb_descriptor_type; -/// Imported from libusb, with some adjustments. -using ::usb_device_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_endpoint_descriptor; -/// Imported from libusb, with changed names. -using ::usb_endpoint_direction; -/// Imported from libusb, with some adjustments. -using ::usb_hid_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_interface_association_descriptor; -/// Imported from libusb, with some adjustments. -using ::usb_interface_descriptor; -/// Imported from libusb, with changed names. -using ::usb_iso_sync_type; -/// Imported from libusb, with changed names. -using ::usb_iso_usage_type; -/// Imported from libusb, with changed names. -using ::usb_request_recipient; -/// Imported from libusb, with changed names. -using ::usb_request_type; -/// Imported from libusb, with some adjustments. -using ::usb_ss_endpoint_companion_descriptor; -/// Imported from libusb, with changed names. -using ::usb_standard_request; -/// Imported from libusb, with some adjustments. -using ::usb_string_descriptor; -/// Imported from libusb, with changed names. -using ::usb_transfer_type; -using ::UsbCommsInterfaceInfo; -using ::UsbComplexId; -using ::UsbDeviceSpeed; -using ::UsbDsDeviceInfo; -using ::UsbDsEndpoint; -using ::UsbDsInterface; -using ::UsbDsReportData; -using ::UsbDsReportEntry; -using ::UsbHsClientEpSession; -/// The interface service object. These Events have autoclear=false. -using ::UsbHsClientIfSession; -/// Interface struct. Note that devices have a seperate \ref UsbHsInterface for each interface. -using ::UsbHsInterface; -/// Interface filtering struct. When the associated flag bit is set, the associated descriptor field and struct field are compared, on mismatch the interface is filtered out. -/// [7.0.0+]: The filter struct has to be unique, it can't be used by anything else (including other processes). Hence, Flags has to be non-zero. When initialized with usb:hs:a and VID and/or PID filtering is enabled, the VID/PID will be checked against a blacklist. -using ::UsbHsInterfaceFilter; -using ::UsbHsInterfaceFilterFlags; -/// Descriptors which are not available are set to all-zero. -/// The INPUT/OUTPUT endpoint descriptors were swapped with [8.0.0+], libnx converts this struct to the newer layout when running on pre-8.0.0. -using ::UsbHsInterfaceInfo; -using ::UsbHsRingHeader; -using ::UsbHsXferReport; -/// USB Device States, per USB 2.0 spec -using ::UsbState; - -/// Initializes usbComms with the default number of interfaces (1) -Result CommsInitialize(void); - -/// Initializes usbComms with a specific number of interfaces. -Result CommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos, u16 idVendor, u16 idProduct); - -/// Exits usbComms. -void CommsExit(void); - -/// Sets whether to throw a fatal error in usbComms{Read/Write}* on failure, or just return the transferred size. By default (false) the latter is used. -void CommsSetErrorHandling(bool flag); - -/// Read data with the default interface. -size_t CommsRead(void* buffer, size_t size); - -/// Write data with the default interface. -size_t CommsWrite(const void* buffer, size_t size); - -/// Same as usbCommsRead except with the specified interface. -size_t CommsReadEx(void* buffer, size_t size, u32 interface); - -/// Same as usbCommsWrite except with the specified interface. -size_t CommsWriteEx(const void* buffer, size_t size, u32 interface); - -/// Retrieve event used for read completion with the given interface. -Event * CommsGetReadCompletionEvent(u32 interface); - -/// Start an asynchronous read. The completion event will be signaled when the read completes. -/// The buffer must be page-aligned and no larger than one page. -Result CommsReadAsync(void *buffer, size_t size, u32 *urbId, u32 interface); - -/// Complete an asynchronous read, clearing the completion event, and return the amount of data which was read. -Result CommsGetReadResult(u32 urbId, u32 *transferredSize, u32 interface); - -/// Retrieve event used for write completion with the given interface. -Event * CommsGetWriteCompletionEvent(u32 interface); - -/// Start an asynchronous write. The completion event will be signaled when the write completes. -/// The buffer must be page-aligned and no larger than one page. -Result CommsWriteAsync(void *buffer, size_t size, u32 *urbId, u32 interface); - -/// Complete an asynchronous write, clearing the completion event, and return the amount of data which was written. -Result CommsGetWriteResult(u32 urbId, u32 *transferredSize, u32 interface); - -/// Opens a session with usb:ds. -Result DsInitialize(void); - -/// Closes the usb:ds session. Any interfaces/endpoints which are left open are automatically closed, since otherwise usb-sysmodule won't fully reset usb:ds to defaults. -void DsExit(void); - -/// Gets the Service object for the actual usb:ds service session. -Service* DsGetServiceSession(void); - -/// Helper func. -Result DsWaitReady(u64 timeout); - -/// Helper func. -Result DsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize); - -Event* DsGetStateChangeEvent(void); - -/// Gets the device state. See \ref UsbState. -Result DsGetState(UsbState* out); - -/// Removed in [5.0.0+]. -Result DsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name); - -/// Removed in [5.0.0+]. -Result DsSetVidPidBcd(const UsbDsDeviceInfo* deviceinfo); - -/// Only available on [5.0.0+]. -Result DsRegisterInterface(UsbDsInterface** out); - -/// Only available on [5.0.0+]. -Result DsRegisterInterfaceEx(UsbDsInterface** out, u8 intf_num); - -/// Only available on [5.0.0+]. -Result DsClearDeviceData(void); - -/// Only available on [5.0.0+]. -Result DsAddUsbStringDescriptor(u8* out_index, const char* string); - -/// Only available on [5.0.0+]. -Result DsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs); - -/// Only available on [5.0.0+]. -Result DsDeleteUsbStringDescriptor(u8 index); - -/// Only available on [5.0.0+]. -Result DsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor* descriptor); - -/// Only available on [5.0.0+]. -Result DsSetBinaryObjectStore(const void* bos, size_t bos_size); - -/// Only available on [5.0.0+]. -Result DsEnable(void); - -/// Only available on [5.0.0+]. -Result DsDisable(void); - -/// Only available on [8.0.0+]. -Result DsGetSpeed(UsbDeviceSpeed *out); - -void DsInterface_Close(UsbDsInterface* interface); - -Result DsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size); - -Result DsInterface_EnableInterface(UsbDsInterface* interface); - -Result DsInterface_DisableInterface(UsbDsInterface* interface); - -Result DsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); - -Result DsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); - -Result DsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out); - -Result DsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out); - -Result DsInterface_StallCtrl(UsbDsInterface* interface); - -/// Removed in [5.0.0+]. -Result DsInterface_GetDsEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, struct usb_endpoint_descriptor* descriptor); - -/// Only available on [5.0.0+]. -Result DsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address); - -/// Only available on [5.0.0+]. -Result DsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, const void* buffer, size_t size); - -void DsEndpoint_Close(UsbDsEndpoint* endpoint); - -Result DsEndpoint_Cancel(UsbDsEndpoint* endpoint); - -Result DsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId); - -Result DsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out); - -Result DsEndpoint_Stall(UsbDsEndpoint* endpoint); - -Result DsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt); - -/// Initialize usb:hs. -Result HsInitialize(void); - -/// Exit usb:hs. -void HsExit(void); - -/// Gets the Service object for the actual usb:hs service session. -Service* HsGetServiceSession(void); - -/// Returns the Event loaded during init with autoclear=false. -/// Signaled when a device was removed. -/// When signaled, the user should use \ref usbHsQueryAcquiredInterfaces and cleanup state for all interfaces which are not listed in the output interfaces (none of the IDs match \ref usbHsIfGetID output). -Event* HsGetInterfaceStateChangeEvent(void); - -/** - * @brief Returns an array of all \ref UsbHsInterface. Internally this loads the same interfaces as \ref usbHsQueryAvailableInterfaces, followed by \ref usbHsQueryAcquiredInterfaces. However, ID in \ref UsbHsInterface is set to -1, hence the output from this should not be used with \ref usbHsAcquireUsbIf. - * @param[in] filter \ref UsbHsInterfaceFilter. - * @param[out] interfaces Array of output interfaces. - * @param[in] interfaces_maxsize Max byte-size of the interfaces buffer. - * @param[out] total_entries Total number of output interfaces. - */ -Result HsQueryAllInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries); - -/** - * @brief Returns an array of \ref UsbHsInterface which are available. - * @param[in] filter \ref UsbHsInterfaceFilter. - * @param[out] interfaces Array of output interfaces. - * @param[in] interfaces_maxsize Max byte-size of the interfaces buffer. - * @param[out] total_entries Total number of output interfaces. - */ -Result HsQueryAvailableInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries); - -/** - * @brief Returns an array of \ref UsbHsInterface which were previously acquired. - * @param[out] interfaces Array of output interfaces. - * @param[in] interfaces_maxsize Max byte-size of the interfaces buffer. - * @param[out] total_entries Total number of output interfaces. - */ -Result HsQueryAcquiredInterfaces(UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries); - -/** - * @brief Creates an event which is signaled when an interface is available which passes the filtering checks. - * @param[out] out_event Event object. - * @param[in] autoclear Event autoclear. - * @param[in] index Event index, must be 0..2. - * @param[in] filter \ref UsbHsInterfaceFilter. - */ -Result HsCreateInterfaceAvailableEvent(Event* out_event, bool autoclear, u8 index, const UsbHsInterfaceFilter* filter); - -/** - * @brief Destroys an event setup by \ref usbHsCreateInterfaceAvailableEvent. This *must* be used at some point during cleanup. - * @param[in] event Event object to close. - * @param[in] index Event index, must be 0..2. - */ -Result HsDestroyInterfaceAvailableEvent(Event* event, u8 index); - -/** - * @brief Acquires/opens the specified interface. This returns an error if the interface was already acquired by another process. - * @param[in] s The service object. - * @param[in] interface Interface to use. - */ -Result HsAcquireUsbIf(UsbHsClientIfSession* s, UsbHsInterface *interface); - -/// UsbHsClientIfSession -/// Closes the specified interface session. -void HsIfClose(UsbHsClientIfSession* s); - -/// Returns whether the specified interface session was initialized. -bool HsIfIsActive(UsbHsClientIfSession* s); - -/// Returns the ID which can be used for comparing with the ID in the output interfaces from \ref usbHsQueryAcquiredInterfaces. -s32 HsIfGetID(UsbHsClientIfSession* s); - -/** - * @brief Selects an interface. - * @param[in] s The service object. - * @param[out] inf The output interface info. If NULL, the output is stored within s instead. - * @param[in] id ID - */ -Result HsIfSetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id); - -/** - * @brief Gets an interface. - * @param[in] s The service object. - * @param[out] inf The output interface info. If NULL, the output is stored within s instead. - */ -Result HsIfGetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf); - -/** - * @brief Gets an alternate interface. - * @param[in] s The service object. - * @param[out] inf The output interface info. If NULL, the output is stored within s instead. - * @param[in] id ID - */ -Result HsIfGetAlternateInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id); - -/// On [1.0.0] this is stubbed, just returns 0 with out=0. -Result HsIfGetCurrentFrame(UsbHsClientIfSession* s, u32* out); - -/// Uses a control transfer, this will block until the transfer finishes. The buffer address and size should be aligned to 0x1000-bytes, where wLength is the original size. -Result HsIfCtrlXfer(UsbHsClientIfSession* s, u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, void* buffer, u32* transferredSize); - -/** - * @brief Opens an endpoint. maxUrbCount*maxXferSize must be non-zero. - * @param[in] s The interface object. - * @param[out] ep The endpoint object. - * @param[in] maxUrbCount maxUrbCount, must be <0x11. - * @param[in] maxXferSize Max transfer size for a packet. This can be desc->wMaxPacketSize. Must be <=0xFF0000. - * @param[in] desc Endpoint descriptor. - */ -Result HsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 maxUrbCount, u32 maxXferSize, struct usb_endpoint_descriptor *desc); - -/// Resets the device: has the same affect as unplugging the device and plugging it back in. -Result HsIfResetDevice(UsbHsClientIfSession* s); - -/// UsbHsClientEpSession -/// Closes the specified endpoint session. -void HsEpClose(UsbHsClientEpSession* s); - -/// Gets the Xfer Event which is signaled when PostBufferAsync finishes. This is only valid for [2.0.0+]. If using \ref eventWait with this, then \ref eventClear should be used if the event was signaled (since the autoclear is false). -Event* HsEpGetXferEvent(UsbHsClientEpSession* s); - -/// Gets the buffer size to use with \ref usbHsEpShareReportRing. -u32 HsEpGetReportRingSize(UsbHsClientEpSession* s); - -/** - * @brief Starts an async data transfer with the specified endpoint. The Event from \ref usbHsEpGetXferEvent can be used to determine when the transfer finished. If you don't need async, \ref usbHsEpPostBuffer can be used instead. - * @note Only available on [2.0.0+]. - * @param[in] s The endpoint object. - * @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes. - * @param[in] size The actual data size. - * @param[in] id This is an arbitrary value which will be later returned in \ref UsbHsXferReport. For example a value starting at 0 can be used, then if sending multiple requests at once this value can be incremented each time (with 0 for the first request in this set of requests). - * @param[out] xferId Output xferId. - */ -Result HsEpPostBufferAsync(UsbHsClientEpSession* s, void* buffer, u32 size, u64 id, u32* xferId); - -/** - * @brief Gets an array of \ref UsbHsXferReport for the specified endpoint. This should be used after waiting on the Event from \ref usbHsEpGetXferEvent. - * @note Only available on [2.0.0+]. - * @param[in] s The endpoint object. - * @param[out] reports Output array of \ref UsbHsXferReport. - * @param[in] max_reports Size of the reports array in entries. - * @param[out] count Number of entries written to the array. - */ -Result HsEpGetXferReport(UsbHsClientEpSession* s, UsbHsXferReport* reports, u32 max_reports, u32* count); - -/** - * @brief Uses a data transfer with the specified endpoint, this will block until the transfer finishes. This wraps \ref usbHsEpPostBufferAsync and \ref usbHsEpGetXferReport, and also handles the Event (on pre-2.0.0 this handles using the relevant cmds instead). If async is needed, use \ref usbHsEpPostBufferAsync instead. - * @param[in] s The endpoint object. - * @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes. - * @param[in] size The actual data size. - * @param[out] transferredSize Output transferred size. - */ -Result HsEpPostBuffer(UsbHsClientEpSession* s, void* buffer, u32 size, u32* transferredSize); - -/** - * @brief This uses the same functionality internally as \ref usbHsEpPostBufferAsync except the urbs array and unk1/unk2 are specified by the user instead. - * @note Only available on [2.0.0+]. - * @param[in] s The endpoint object. - * @param buffer Data buffer. The buffer address and size should be aligned to 0x1000-bytes. - * @param[in] urbs Input array of u32s for the size of each urb. - * @param[in] urbCount Total entries in the urbs array. - * @param[in] id Same as \ref usbHsEpPostBufferAsync. - * @param[in] unk1 \ref usbHsEpPostBufferAsync would internally pass value 0 here. - * @param[in] unk2 \ref usbHsEpPostBufferAsync would internally pass value 0 here. - * @param[out] xferId Output xferId. - */ -Result HsEpBatchBufferAsync(UsbHsClientEpSession* s, void* buffer, u32* urbs, u32 urbCount, u64 id, u32 unk1, u32 unk2, u32* xferId); - -/** - * @brief This can be used to map the specified buffer as devicemem, which can then be used with \ref usbHsEpPostBufferAsync / \ref usbHsEpPostBuffer / \ref usbHsEpBatchBufferAsync. If the buffer address passed to those funcs is within this SmmuSpace, the specified buffer must be within the bounds of the SmmuSpace buffer. - * @note Only available on [4.0.0+]. - * @note A buffer from usbHsEpCreateSmmuSpace can't be reused by another endpoint with the aforementioned funcs. - * @note This can only be used once per UsbHsClientEpSession object. - * @param[in] s The endpoint object. - * @param buffer Buffer address, this must be aligned to 0x1000-bytes. - * @param[in] size Buffer size, this must be aligned to 0x1000-bytes. - */ -Result HsEpCreateSmmuSpace(UsbHsClientEpSession* s, void* buffer, u32 size); - -/** - * @brief This creates TransferMemory which is used to read \ref UsbHsXferReport when \ref usbHsEpGetXferReport is used, instead of using the service cmd. - * @note Only available on [4.0.0+]. - * @param buffer Buffer, must be 0x1000-byte aligned. - * @param[in] size Buffer size, \ref usbHsEpGetReportRingSize can be used to calculate this. - */ -Result HsEpShareReportRing(UsbHsClientEpSession* s, void* buffer, size_t size); - -} // namespace usb - -/// @brief C++ wrappers for the `utf` API. -/// @details Wraps: switch/runtime/util/utf.h. -namespace utf { - -/** Convert a UTF-8 sequence into a UTF-32 codepoint - * - * @param[out] out Output codepoint - * @param[in] in Input sequence - * - * @returns number of input code units consumed - * @returns -1 for error - */ -ssize_t DecodeUtf8(uint32_t *out, const uint8_t *in); - -/** Convert a UTF-16 sequence into a UTF-32 codepoint - * - * @param[out] out Output codepoint - * @param[in] in Input sequence - * - * @returns number of input code units consumed - * @returns -1 for error - */ -ssize_t DecodeUtf16(uint32_t *out, const uint16_t *in); - -/** Convert a UTF-32 codepoint into a UTF-8 sequence - * - * @param[out] out Output sequence - * @param[in] in Input codepoint - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out must be able to store 4 code units - */ -ssize_t EncodeUtf8(uint8_t *out, uint32_t in); - -/** Convert a UTF-32 codepoint into a UTF-16 sequence - * - * @param[out] out Output sequence - * @param[in] in Input codepoint - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out must be able to store 2 code units - */ -ssize_t EncodeUtf16(uint16_t *out, uint32_t in); - -/** Convert a UTF-8 sequence into a UTF-16 sequence - * - * Fills the output buffer up to \a len code units. - * Returns the number of code units that the input would produce; - * if it returns greater than \a len, the output has been - * truncated. - * - * @param[out] out Output sequence - * @param[in] in Input sequence (null-terminated) - * @param[in] len Output length - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out is not null-terminated - */ -ssize_t Utf8ToUtf16(uint16_t *out, const uint8_t *in, size_t len); - -/** Convert a UTF-8 sequence into a UTF-32 sequence - * - * Fills the output buffer up to \a len code units. - * Returns the number of code units that the input would produce; - * if it returns greater than \a len, the output has been - * truncated. - * - * @param[out] out Output sequence - * @param[in] in Input sequence (null-terminated) - * @param[in] len Output length - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out is not null-terminated - */ -ssize_t Utf8ToUtf32(uint32_t *out, const uint8_t *in, size_t len); - -/** Convert a UTF-16 sequence into a UTF-8 sequence - * - * Fills the output buffer up to \a len code units. - * Returns the number of code units that the input would produce; - * if it returns greater than \a len, the output has been - * truncated. - * - * @param[out] out Output sequence - * @param[in] in Input sequence (null-terminated) - * @param[in] len Output length - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out is not null-terminated - */ -ssize_t Utf16ToUtf8(uint8_t *out, const uint16_t *in, size_t len); - -/** Convert a UTF-16 sequence into a UTF-32 sequence - * - * Fills the output buffer up to \a len code units. - * Returns the number of code units that the input would produce; - * if it returns greater than \a len, the output has been - * truncated. - * - * @param[out] out Output sequence - * @param[in] in Input sequence (null-terminated) - * @param[in] len Output length - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out is not null-terminated - */ -ssize_t Utf16ToUtf32(uint32_t *out, const uint16_t *in, size_t len); - -/** Convert a UTF-32 sequence into a UTF-8 sequence - * - * Fills the output buffer up to \a len code units. - * Returns the number of code units that the input would produce; - * if it returns greater than \a len, the output has been - * truncated. - * - * @param[out] out Output sequence - * @param[in] in Input sequence (null-terminated) - * @param[in] len Output length - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out is not null-terminated - */ -ssize_t Utf32ToUtf8(uint8_t *out, const uint32_t *in, size_t len); - -/** Convert a UTF-32 sequence into a UTF-16 sequence - * - * @param[out] out Output sequence - * @param[in] in Input sequence (null-terminated) - * @param[in] len Output length - * - * @returns number of output code units produced - * @returns -1 for error - * - * @note \a out is not null-terminated - */ -ssize_t Utf32ToUtf16(uint16_t *out, const uint32_t *in, size_t len); - -} // namespace utf - -/// @brief C++ wrappers for the `utimer` API. -/// @details Wraps: switch/kernel/utimer.h. -namespace utimer { - -/// Valid types for a user-mode timer. -using ::TimerType; -using ::UTimer; - -/** - * @brief Creates a user-mode timer. - * @param[out] t UTimer object. - * @param[in] interval Interval (in nanoseconds). - * @param[in] type Type of timer to create (see \ref TimerType). - * @note The timer is stopped when it is created. Use \ref utimerStart to start it. - * @note It is safe to wait on this timer with several threads simultaneously. - * @note If more than one thread is listening on it, at least one thread will get the signal. No other guarantees. - * @note For a repeating timer: If the timer triggers twice before you wait on it, you will only get one signal. - */ -void Create(UTimer* t, u64 interval, TimerType type); - -/** - * @brief Starts the timer. - * @param[in] t UTimer object. - */ -void Start(UTimer* t); - -/** - * @brief Stops the timer. - * @param[in] t UTimer object. - */ -void Stop(UTimer* t); - -} // namespace utimer - -/// @brief C++ wrappers for the `vi` API. -/// @details Wraps: switch/services/vi.h. -namespace vi { - -/// Used as argument for certain drawing commands. -using ::ViColorRgba4444; -using ::ViColorRgba8888; -using ::ViDisplay; -using ::ViDisplayName; -using ::ViLayer; -/// Used by viCreateLayer when CreateStrayLayer is used internally. -using ::ViLayerFlags; -/// Used as argument to many capture functions. -using ::ViLayerStack; -/// Used with viSetDisplayPowerState. -using ::ViPowerState; -/// Used with viSetLayerScalingMode. -using ::ViScalingMode; -using ::ViServiceType; - -Result Initialize(ViServiceType service_type); - -void Exit(void); - -Service* GetSession_IApplicationDisplayService(void); - -Service* GetSession_IHOSBinderDriverRelay(void); - -Service* GetSession_ISystemDisplayService(void); - -Service* GetSession_IManagerDisplayService(void); - -Service* GetSession_IHOSBinderDriverIndirect(void); - -Result SetContentVisibility(bool v); - -Result OpenDisplay(const char *display_name, ViDisplay *display); - -Result CloseDisplay(ViDisplay *display); - -Result OpenDefaultDisplay(ViDisplay *display); - -Result GetDisplayResolution(ViDisplay *display, s32 *width, s32 *height); - -Result GetDisplayLogicalResolution(ViDisplay *display, s32 *width, s32 *height); - -/// Only available on [3.0.0+]. -Result SetDisplayMagnification(ViDisplay *display, s32 x, s32 y, s32 width, s32 height); - -Result GetDisplayVsyncEvent(ViDisplay *display, Event *event_out); - -Result SetDisplayPowerState(ViDisplay *display, ViPowerState state); - -Result SetDisplayAlpha(ViDisplay *display, float alpha); - -Result GetZOrderCountMin(ViDisplay *display, s32 *z); - -Result GetZOrderCountMax(ViDisplay *display, s32 *z); - -Result CreateLayer(const ViDisplay *display, ViLayer *layer); - -Result CreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id); - -Result SetLayerSize(ViLayer *layer, s32 width, s32 height); - -Result SetLayerZ(ViLayer *layer, s32 z); - -Result SetLayerPosition(ViLayer *layer, float x, float y); - -Result CloseLayer(ViLayer *layer); - -Result DestroyManagedLayer(ViLayer *layer); - -Result SetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode); - -Result GetIndirectLayerImageMap(void* buffer, size_t size, s32 width, s32 height, u64 IndirectLayerConsumerHandle, u64 *out_size, u64 *out_stride); - -Result GetIndirectLayerImageRequiredMemoryInfo(s32 width, s32 height, u64 *out_size, u64 *out_alignment); - -Result ManagerPrepareFatal(void); - -///< [16.0.0+] -Result ManagerShowFatal(void); - -///< [16.0.0+] -Result ManagerDrawFatalRectangle(s32 x, s32 y, s32 end_x, s32 end_y, ViColorRgba4444 color); - -///< [16.0.0+] -Result ManagerDrawFatalText32(s32 *out_advance, s32 x, s32 y, const u32 *utf32_codepoints, size_t num_codepoints, float scale_x, float scale_y, PlSharedFontType font_type, ViColorRgba8888 bg_color, ViColorRgba8888 fg_color, s32 initial_advance); - -} // namespace vi - -/// @brief C++ wrappers for the `virtmem` API. -/// @details Wraps: switch/kernel/virtmem.h. -namespace virtmem { - -/// Address space reservation type (see \ref virtmemAddReservation) -using ::VirtmemReservation; - -/// Locks the virtual memory manager mutex. -void Lock(void); - -/// Unlocks the virtual memory manager mutex. -void Unlock(void); - -/** - * @brief Finds a random slice of free general purpose address space. - * @param size Desired size of the slice (rounded up to page alignment). - * @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment). - * @return Pointer to the slice of address space, or NULL on failure. - * @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock). - */ -void* FindAslr(size_t size, size_t guard_size); - -/** - * @brief Finds a random slice of free stack address space. - * @param size Desired size of the slice (rounded up to page alignment). - * @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment). - * @return Pointer to the slice of address space, or NULL on failure. - * @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock). - */ -void* FindStack(size_t size, size_t guard_size); - -/** - * @brief Finds a random slice of free code memory address space. - * @param size Desired size of the slice (rounded up to page alignment). - * @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment). - * @return Pointer to the slice of address space, or NULL on failure. - * @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock). - */ -void* FindCodeMemory(size_t size, size_t guard_size); - -/** - * @brief Reserves a range of memory address space. - * @param mem Pointer to the address space slice. - * @param size Size of the slice. - * @return Pointer to a reservation object, or NULL on failure. - * @remark This function is intended to be used in lieu of a memory map operation when the memory won't be mapped straight away. - * @note The virtual memory manager mutex must be held during the find-and-reserve process (see \ref virtmemLock and \ref virtmemUnlock). - */ -VirtmemReservation* AddReservation(void* mem, size_t size); - -/** - * @brief Releases a memory address space reservation. - * @param rv Reservation to release. - * @note The virtual memory manager mutex must be held before calling this function (see \ref virtmemLock and \ref virtmemUnlock). - */ -void RemoveReservation(VirtmemReservation* rv); - -} // namespace virtmem - -/// @brief C++ wrappers for the `wait` API. -/// @details Wraps: switch/kernel/wait.h. -namespace wait { - -using ::Waitable; -using ::WaitableMethods; -using ::WaitableNode; -/// Waiter structure, representing any generic waitable synchronization object; both kernel-mode and user-mode. -using ::Waiter; -using ::WaiterType; - -/** - * @brief Waits for an arbitrary number of generic waitable synchronization objects, optionally with a timeout. - * @param[out] idx_out Variable that will received the index of the signalled object. - * @param[in] objects Array containing \ref Waiter structures. - * @param[in] num_objects Number of objects in the array. - * @param[in] timeout Timeout (in nanoseconds). - * @return Result code. - * @note The number of objects must not be greater than \ref MAX_WAIT_OBJECTS. This is a Horizon kernel limitation. - */ -Result Objects(s32* idx_out, const Waiter* objects, s32 num_objects, u64 timeout); - -/** - * @brief Waits for an arbitrary number of kernel synchronization objects, optionally with a timeout. This function replaces \ref svcWaitSynchronization. - * @param[out] idx_out Variable that will received the index of the signalled object. - * @param[in] handles Array containing handles. - * @param[in] num_handles Number of handles in the array. - * @param[in] timeout Timeout (in nanoseconds). - * @return Result code. - * @note The number of objects must not be greater than \ref MAX_WAIT_OBJECTS. This is a Horizon kernel limitation. - */ -Result Handles(s32* idx_out, const Handle* handles, s32 num_handles, u64 timeout); - -/** - * @brief Waits on a single generic waitable synchronization object, optionally with a timeout. - * @param[in] w \ref Waiter structure. - * @param[in] timeout Timeout (in nanoseconds). - */ -Result Single(Waiter w, u64 timeout); - -/** - * @brief Waits for a single kernel synchronization object, optionally with a timeout. - * @param[in] h \ref Handle of the object. - * @param[in] timeout Timeout (in nanoseconds). - */ -Result SingleHandle(Handle h, u64 timeout); - -} // namespace wait - -/// @brief C++ wrappers for the `waiter` API. -/// @details Wraps: switch/kernel/event.h, switch/kernel/thread.h, switch/kernel/uevent.h, switch/kernel/utimer.h, switch/kernel/wait.h. -namespace waiter { - -/// Kernel-mode event structure. -using ::Event; -/// Thread information structure. -using ::Thread; -/// Valid types for a user-mode timer. -using ::TimerType; -using ::UEvent; -using ::UTimer; -using ::Waitable; -using ::WaitableMethods; -using ::WaitableNode; -/// Waiter structure, representing any generic waitable synchronization object; both kernel-mode and user-mode. -using ::Waiter; -using ::WaiterType; - -/// Creates a \ref Waiter for a kernel-mode event. -Waiter ForEvent(Event* t); - -/// Creates a \ref Waiter for a \ref Thread. -Waiter ForThread(Thread* t); - -/// Creates a waiter for a user-mode event. -Waiter ForUEvent(UEvent* e); - -/// Creates a waiter for a user-mode timer. -Waiter ForUTimer(UTimer* t); - -/// Creates a \ref Waiter for a kernel-mode \ref Handle. -Waiter ForHandle(Handle h); - -} // namespace waiter - -/// @brief C++ wrappers for the `web` API. -/// @details Wraps: switch/applets/web.h. -namespace web { - -/// Header struct at offset 0 in the web Arg storage (non-webWifi). -using ::WebArgHeader; -/// Web TLV used in the web Arg storage. -using ::WebArgTLV; -/// Types for \ref WebArgTLV, input storage. -using ::WebArgType; -/// Kind values for \ref webConfigSetBackgroundKind. Controls the background color while displaying the loading screen during applet boot. Only used when \ref WebBootDisplayKind is ::WebBootDisplayKind_Default. If the applet was not launched by an Application, the applet will only use WebBackgroundKind_Default. -using ::WebBackgroundKind; -/// Kind values for \ref webConfigSetBootDisplayKind. Controls the background color while displaying the loading screen during applet boot. Also controls the BackgroundKind when value is non-zero. -using ::WebBootDisplayKind; -/// Entry data for ::WebArgType_BootFooterButton. -using ::WebBootFooterButtonEntry; -/// Config struct for web applets, non-WebWifi. -using ::WebCommonConfig; -/// Common container struct for applets' reply data, from the output storage. -using ::WebCommonReply; -/// Common struct for the applet output storage, for non-TLV-storage. -using ::WebCommonReturnValue; -/// TLV storage, starts with \ref WebArgHeader followed by \ref WebArgTLV entries. -using ::WebCommonTLVStorage; -/// This controls the kind of content to mount with Offline-applet. -using ::WebDocumentKind; -/// ExitReason -using ::WebExitReason; -/// Button values for \ref webConfigSetBootFooterButtonVisible. -using ::WebFooterButtonId; -/// Kind values for \ref webConfigSetFooterFixedKind. Controls UI footer display behaviour. -using ::WebFooterFixedKind; -/// Mode values for \ref webConfigSetLeftStickMode. Controls the initial mode, this can be toggled by the user via the pressing the left-stick button. If the Pointer flag is set to false (\ref webConfigSetPointer), only ::WebLeftStickMode_Cursor will be used and mode toggle by the user is disabled (input value ignored). -using ::WebLeftStickMode; -/// Types for \ref WebArgTLV, output storage. -using ::WebReplyType; -/// WebSession -using ::WebSession; -/// WebSessionBootMode -using ::WebSessionBootMode; -/// SessionMessageHeader -using ::WebSessionMessageHeader; -/// WebSessionReceiveMessageKind -using ::WebSessionReceiveMessageKind; -/// WebSessionSendMessageKind -using ::WebSessionSendMessageKind; -/// StorageHandleQueue -using ::WebSessionStorageHandleQueue; -/// This controls the initial page for ShareApplet, used by \ref webShareCreate. -using ::WebShareStartPage; -/// This indicates the type of web-applet. -using ::WebShimKind; -/// Config for WebWifi. -using ::WebWifiConfig; -/// Struct for the WebWifi applet input storage. -using ::WebWifiPageArg; -/// Struct for the WebWifi applet output storage. -using ::WebWifiReturnValue; - -/** - * @brief Creates the config for WifiWebAuthApplet. This is the captive portal applet. - * @param config WebWifiConfig object. - * @param conntest_url URL used for the connection-test requests. When empty/NULL the applet will test the connection with nifm and throw an error on failure. - * @param initial_url Initial URL navigated to by the applet. - * @param uuid NIFM Network UUID, for nifm cmd SetNetworkProfileId. Value 0 can be used. Only used by the applet when conntest_url is set. - * @param rev Input value for nifm cmd SetRequirementByRevision. Value 0 can be used. Only used by the applet when conntest_url is set. - */ -void WifiCreate(WebWifiConfig* config, const char* conntest_url, const char* initial_url, Uuid uuid, u32 rev); - -/** - * @brief Launches WifiWebAuthApplet with the specified config and waits for it to exit. - * @param config WebWifiConfig object. - * @param out Optional output applet reply data, can be NULL. - */ -Result WifiShow(WebWifiConfig* config, WebWifiReturnValue *out); - -/** - * @brief Creates the config for WebApplet. This applet uses an URL whitelist loaded from the user-process host Application, which is only loaded when running under an Application. - * @note Sets ::WebArgType_UnknownD, and ::WebArgType_Unknown12 on pre-3.0.0, to value 1. - * @param config WebCommonConfig object. - * @param url Initial URL navigated to by the applet. - */ -Result PageCreate(WebCommonConfig* config, const char* url); - -/** - * @brief Creates the config for WebApplet. This is based on \ref webPageCreate, for News. Hence other functions referencing \ref webPageCreate also apply to this. - * @note The domain from the input URL is automatically whitelisted, in addition to any already loaded whitelist. - * @note Sets ::WebArgType_UnknownD to value 1, and sets ::WebArgType_NewsFlag to true. Also uses \ref webConfigSetEcClientCert and \ref webConfigSetShopJump with flag=true. - * @param config WebCommonConfig object. - * @param url Initial URL navigated to by the applet. - */ -Result NewsCreate(WebCommonConfig* config, const char* url); - -/** - * @brief Creates the config for WebApplet. This is based on \ref webPageCreate, for YouTubeVideo. Hence other functions referencing \ref webPageCreate also apply to this. This uses a whitelist which essentially only allows youtube embed/ URLs (without mounting content from the host Application). - * @note This is only available on [5.0.0+]. - * @note Sets ::WebArgType_UnknownD to value 1, and sets ::WebArgType_YouTubeVideoFlag to true. Also uses \ref webConfigSetBootAsMediaPlayer with flag=true. - * @param config WebCommonConfig object. - * @param url Initial URL navigated to by the applet. - */ -Result YouTubeVideoCreate(WebCommonConfig* config, const char* url); - -/** - * @brief Creates the config for Offline-applet. This applet uses data loaded from content. - * @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor and sets ::WebArgType_BootAsMediaPlayerInverted to false. Uses \ref webConfigSetPointer with flag = docKind == ::WebDocumentKind_OfflineHtmlPage. - * @note For docKind ::WebDocumentKind_ApplicationLegalInformation / ::WebDocumentKind_SystemDataPage, uses \ref webConfigSetFooter with flag=true and \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Default. - * @note For docKind ::WebDocumentKind_SystemDataPage, uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_White. - * @note Sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. With docKind ::WebDocumentKind_ApplicationLegalInformation, uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_White. - * @note Sets ::WebArgType_UnknownC to value 1. - * @note With docKind ::WebDocumentKind_ApplicationLegalInformation, uses \ref webConfigSetEcClientCert with flag=true. - * @note With docKind ::WebDocumentKind_OfflineHtmlPage on pre-3.0.0, sets ::WebArgType_Unknown12 to value 1. - * @note Lastly, sets the TLVs as needed for the input params. - * @param config WebCommonConfig object. - * @param docKind \ref WebDocumentKind - * @param id Id to load the content from. With docKind = ::WebDocumentKind_OfflineHtmlPage, id=0 should be used to specify the user-process application (non-zero is ignored with this docKind). - * @param docPath Initial document path in RomFS, without the leading '/'. For ::WebDocumentKind_OfflineHtmlPage, this is relative to "html-document/" in RomFS. For the other docKind values, this is relative to "/" in RomFS. This path must contain ".htdocs/". - */ -Result OfflineCreate(WebCommonConfig* config, WebDocumentKind docKind, u64 id, const char* docPath); - -/** - * @brief Creates the config for ShareApplet. This applet is for social media posting/settings. - * @note If a non-zero uid isn't set with \ref webConfigSetUid prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account. - * @note An error will be displayed if neither \ref webConfigSetAlbumEntry, nor \ref webConfigSetApplicationAlbumEntry, nor \ref webConfigAddAlbumEntryAndMediaData are used prior to using \ref webConfigShow, with ::WebShareStartPage_Default. - * @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetUid with uid=0, \ref webConfigSetDisplayUrlKind with kind=true, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown3. - * @param config WebCommonConfig object. - * @param page \ref WebShareStartPage - */ -Result ShareCreate(WebCommonConfig* config, WebShareStartPage page); - -/** - * @brief Creates the config for LobbyApplet. This applet is for "Nintendo Switch Online Lounge". - * @note Only available on [2.0.0+]. - * @note If a non-zero uid isn't set with \ref webConfigSetUid prior to using \ref webConfigShow, the applet will launch the profile-selector applet to select an account. - * @note Uses \ref webConfigSetLeftStickMode with ::WebLeftStickMode_Cursor, \ref webConfigSetPointer with flag=false on [3.0.0+], \ref webConfigSetUid with uid=0, and sets ::WebArgType_Unknown14/::WebArgType_Unknown15 to value 1. Uses \ref webConfigSetBootDisplayKind with ::WebBootDisplayKind_Unknown4, \ref webConfigSetBackgroundKind with ::WebBackgroundKind_Unknown2, and sets ::WebArgType_BootAsMediaPlayerInverted to false. - * @param config WebCommonConfig object. - */ -Result LobbyCreate(WebCommonConfig* config); - -/** - * @brief Sets the CallbackUrl. See also \ref webReplyGetLastUrl. - * @note With Offline-applet for LastUrl handling, it compares the domain with "localhost" instead. - * @note Only available with config created by \ref webPageCreate or with Share-applet. - * @param config WebCommonConfig object. - * @param url URL - */ -Result ConfigSetCallbackUrl(WebCommonConfig* config, const char* url); - -/** - * @brief Sets the CallbackableUrl. - * @note Only available with config created by \ref webPageCreate. - * @param config WebCommonConfig object. - * @param url URL - */ -Result ConfigSetCallbackableUrl(WebCommonConfig* config, const char* url); - -/** - * @brief Sets the whitelist. - * @note Only available with config created by \ref webPageCreate. - * @note If the whitelist isn't formatted properly, the applet will exit briefly after the applet is launched. - * @param config WebCommonConfig object. - * @param whitelist Whitelist string, each line is a regex for each whitelisted URL. - */ -Result ConfigSetWhitelist(WebCommonConfig* config, const char* whitelist); - -/** - * @brief Sets the account uid. Controls which user-specific savedata to mount. - * @note Only available with config created by \ref webPageCreate, \ref webLobbyCreate, or with Share-applet. - * @note Used automatically by \ref webShareCreate and \ref webLobbyCreate with uid=0. - * @param config WebCommonConfig object. - * @param uid \ref AccountUid - */ -Result ConfigSetUid(WebCommonConfig* config, AccountUid uid); - -/** - * @brief Sets the Share CapsAlbumEntry. - * @note Only available with config created by \ref webShareCreate. - * @param config WebCommonConfig object. - * @param entry \ref CapsAlbumEntry - */ -Result ConfigSetAlbumEntry(WebCommonConfig* config, const CapsAlbumEntry *entry); - -/** - * @brief Sets the ScreenShot flag, which controls whether screen-shot capture is allowed. - * @note Only available with config created by \ref webPageCreate. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetScreenShot(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the EcClientCert flag. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate. - * @note Used automatically by \ref webOfflineCreate, depending on the docKind. - * @note Used automatically by \ref webNewsCreate with flag=true. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetEcClientCert(WebCommonConfig* config, bool flag); - -/** - * @brief Sets whether PlayReport is enabled. - * @note Only available with config created by \ref webOfflineCreate. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetPlayReport(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the BootDisplayKind. - * @note Only available with config created by \ref webOfflineCreate, \ref webShareCreate, \ref webPageCreate, or \ref webLobbyCreate.. - * @note Used automatically by \ref webOfflineCreate, depending on the docKind. - * @note Used automatically by \ref webShareCreate with kind=::WebBootDisplayKind_Unknown3. - * @note Used automatically by \ref webLobbyCreate with kind=::WebBootDisplayKind_Unknown4. - * @param config WebCommonConfig object. - * @param kind \ref WebBootDisplayKind - */ -Result ConfigSetBootDisplayKind(WebCommonConfig* config, WebBootDisplayKind kind); - -/** - * @brief Sets the BackgroundKind. - * @note Only available with config created by \ref webOfflineCreate, \ref webPageCreate, or \ref webLobbyCreate. - * @note Used automatically by \ref webOfflineCreate, depending on the docKind. - * @note Used automatically by \ref webLobbyCreate with kind=2. - * @param config WebCommonConfig object. - * @param kind \ref WebBackgroundKind - */ -Result ConfigSetBackgroundKind(WebCommonConfig* config, WebBackgroundKind kind); - -/** - * @brief Sets the whether the UI footer is enabled. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate. - * @note Used automatically by \ref webOfflineCreate, depending on the docKind. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetFooter(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the whether the Pointer is enabled. See also \ref WebLeftStickMode. - * @note Only available with config created by \ref webOfflineCreate, \ref webPageCreate, or \ref webLobbyCreate. - * @note Used automatically by \ref webOfflineCreate. - * @note Used automatically by \ref webLobbyCreate with flag=false on [3.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetPointer(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the LeftStickMode. - * @note Only available with config created by \ref webOfflineCreate, \ref webShareCreate, \ref webPageCreate, or \ref webLobbyCreate. - * @note Used automatically by \ref webOfflineCreate, \ref webShareCreate, and \ref webLobbyCreate with ::WebLeftStickMode_Cursor. - * @param config WebCommonConfig object. - * @param mode Mode, different enums for Web and Offline. - */ -Result ConfigSetLeftStickMode(WebCommonConfig* config, WebLeftStickMode mode); - -/** - * @brief Sets the KeyRepeatFrame. - * @note Only available with config created by \ref webOfflineCreate. - * @param config WebCommonConfig object. - * @param inval0 First input param. - * @param inval1 Second input param. - */ -Result ConfigSetKeyRepeatFrame(WebCommonConfig* config, s32 inval0, s32 inval1); - -/** - * @brief Sets the DisplayUrlKind. - * @note Only available with config created by \ref webShareCreate or \ref webPageCreate. - * @param config WebCommonConfig object. - * @note Used automatically by \ref webShareCreate with kind=true. - * @param kind Kind - */ -Result ConfigSetDisplayUrlKind(WebCommonConfig* config, bool kind); - -/** - * @brief Sets the BootAsMediaPlayer flag. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [2.0.0+]. - * @note With config created by \ref webNewsCreate on [3.0.0+], this also sets ::WebArgType_BootAsMediaPlayerInverted to !flag. - * @param config WebCommonConfig object. - * @param flag Flag. true = BootAsMediaPlayer, false = BootAsWebPage. - */ -Result ConfigSetBootAsMediaPlayer(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the ShopJump flag. - * @note Only available with config created by \ref webPageCreate on [2.0.0+]. - * @note Used automatically by \ref webNewsCreate with flag=true. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetShopJump(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the MediaPlayerUserGestureRestriction flag. - * @note Only available with config created by \ref webPageCreate on [2.0.0-5.1.0]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetMediaPlayerUserGestureRestriction(WebCommonConfig* config, bool flag); - -/** - * @brief Sets whether MediaAutoPlay is enabled. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetMediaAutoPlay(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the LobbyParameter. - * @note Only available with config created by \ref webLobbyCreate. - * @param config WebCommonConfig object. - * @param str String - */ -Result ConfigSetLobbyParameter(WebCommonConfig* config, const char* str); - -/** - * @brief Sets the Share CapsApplicationAlbumEntry. - * @note Only available with config created by \ref webShareCreate on [3.0.0+]. - * @param config WebCommonConfig object. - * @param entry \ref CapsApplicationAlbumEntry, see also capssu.h. - */ -Result ConfigSetApplicationAlbumEntry(WebCommonConfig* config, CapsApplicationAlbumEntry *entry); - -/** - * @brief Sets whether JsExtension is enabled. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [3.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetJsExtension(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the Share AdditionalCommentText. - * @note Only available with config created by \ref webShareCreate on [4.0.0+]. - * @param config WebCommonConfig object. - * @param str String - */ -Result ConfigSetAdditionalCommentText(WebCommonConfig* config, const char* str); - -/** - * @brief Sets the TouchEnabledOnContents flag. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetTouchEnabledOnContents(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the UserAgentAdditionalString. " " followed by this string are appended to the normal User-Agent string. - * @note Only available with config created by \ref webPageCreate on [4.0.0+]. - * @param config WebCommonConfig object. - * @param str String - */ -Result ConfigSetUserAgentAdditionalString(WebCommonConfig* config, const char* str); - -/** - * @brief Sets the Share AdditionalMediaData. - * @note Only available with config created by \ref webShareCreate on [4.0.0+]. - * @param config WebCommonConfig object. - * @param data Input data - * @param size Size of the input data, max size is 0x10. - */ -Result ConfigSetAdditionalMediaData(WebCommonConfig* config, const u8* data, size_t size); - -/** - * @brief Sets the MediaPlayerAutoClose flag. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetMediaPlayerAutoClose(WebCommonConfig* config, bool flag); - -/** - * @brief Sets whether PageCache is enabled. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetPageCache(WebCommonConfig* config, bool flag); - -/** - * @brief Sets whether WebAudio is enabled. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [4.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetWebAudio(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the FooterFixedKind. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [5.0.0+]. - * @param config WebCommonConfig object. - * @param kind \ref WebFooterFixedKind - */ -Result ConfigSetFooterFixedKind(WebCommonConfig* config, WebFooterFixedKind kind); - -/** - * @brief Sets the PageFade flag. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [5.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetPageFade(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the Share MediaCreatorApplicationRatingAge. - * @note Only available with config created by \ref webShareCreate on [5.0.0+]. - * @param config WebCommonConfig object. - * @param data 0x20-byte input data - */ -Result ConfigSetMediaCreatorApplicationRatingAge(WebCommonConfig* config, const s8 *data); - -/** - * @brief Sets the BootLoadingIcon flag. - * @note Only available with config created by \ref webOfflineCreate on [5.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetBootLoadingIcon(WebCommonConfig* config, bool flag); - -/** - * @brief Sets the PageScrollIndicator flag. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [5.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetPageScrollIndicator(WebCommonConfig* config, bool flag); - -/** - * @brief Sets whether MediaPlayerSpeedControl is enabled. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetMediaPlayerSpeedControl(WebCommonConfig* config, bool flag); - -/** - * @brief Adds a pair of Share CapsAlbumEntry + optionally AdditionalMediaData. This can be used up to 4 times, for setting multiple pairs. - * @note Only available with config created by \ref webShareCreate on [6.0.0+]. - * @param config WebCommonConfig object. - * @param entry \ref CapsAlbumEntry - * @param data Input data for AdditionalMediaData. Optional, can be NULL. - * @param size Size of the input data, max size is 0x10. Optional, can be 0. - */ -Result ConfigAddAlbumEntryAndMediaData(WebCommonConfig* config, const CapsAlbumEntry *entry, const u8* data, size_t size); - -/** - * @brief Sets whether the specified BootFooterButton is visible. - * @note Only available with config created by \ref webOfflineCreate on [6.0.0+]. - * @param config WebCommonConfig object. - * @param button \ref WebFooterButtonId - * @param visible Visible flag. - */ -Result ConfigSetBootFooterButtonVisible(WebCommonConfig* config, WebFooterButtonId button, bool visible); - -/** - * @brief Sets OverrideWebAudioVolume. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. - * @param config WebCommonConfig object. - * @param value Value - */ -Result ConfigSetOverrideWebAudioVolume(WebCommonConfig* config, float value); - -/** - * @brief Sets OverrideMediaAudioVolume. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [6.0.0+]. - * @param config WebCommonConfig object. - * @param value Value - */ -Result ConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value); - -/** - * @brief Sets \ref WebSessionBootMode. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+]. - * @param config WebCommonConfig object. - * @param mode \ref WebSessionBootMode - */ -Result ConfigSetBootMode(WebCommonConfig* config, WebSessionBootMode mode); - -/** - * @brief Sets whether MediaPlayerUi is enabled. - * @note Only available with config created by \ref webOfflineCreate on [8.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetMediaPlayerUi(WebCommonConfig* config, bool flag); - -/** - * @brief Sets whether TransferMemory is enabled. - * @note Only available with config created by \ref webPageCreate on [11.0.0+]. - * @param config WebCommonConfig object. - * @param flag Flag - */ -Result ConfigSetTransferMemory(WebCommonConfig* config, bool flag); - -/** - * @brief Launches the {web applet} with the specified config and waits for it to exit. - * @param config WebCommonConfig object. - * @param out Optional output applet reply data, can be NULL. - */ -Result ConfigShow(WebCommonConfig* config, WebCommonReply *out); - -/** - * @brief Request the applet to exit after \ref webConfigShow was used, while the applet is still running. This is for use from another thread. - * @param config WebCommonConfig object. - */ -Result ConfigRequestExit(WebCommonConfig* config); - -/** - * @brief Gets the ExitReason from the specified reply. - * @param reply WebCommonReply object. - * @param exitReason Output \ref WebExitReason - */ -Result ReplyGetExitReason(WebCommonReply *reply, WebExitReason *exitReason); - -/** - * @brief Gets the LastUrl from the specified reply. When the applet loads a page where the beginning of the URL matches the URL from \ref webConfigSetCallbackUrl, the applet will exit and set LastUrl to that URL (exit doesn't occur when \ref webConfigSetCallbackableUrl was used). - * @note This is only available with ::WebExitReason_LastUrl (string is empty otherwise). - * @note If you want to allocate a string buffer on heap, you can call this with outstr=NULL/outstr_maxsize=0 to get the out_size, then call it again with the allocated buffer. - * @param reply WebCommonReply object. - * @param outstr Output string buffer. If NULL, the string is not loaded. - * @param outstr_maxsize Size of the buffer, including NUL-terminator. If outstr is set, this size must be >1. The size used for the actual string-copy is this size-1, to make sure the output is NUL-terminated (the entire buffer is cleared first). - * @param out_size Output string length including NUL-terminator, for the original input string in the reply loaded from a separate size field. - */ -Result ReplyGetLastUrl(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size); - -/** - * @brief Gets the SharePostResult from the specified reply. - * @note Only available with reply data from ShareApplet on [3.0.0+]. - * @param reply WebCommonReply object. - * @param sharePostResult Output sharePostResult - */ -Result ReplyGetSharePostResult(WebCommonReply *reply, u32 *sharePostResult); - -/** - * @brief Gets the PostServiceName from the specified reply. - * @note Only available with reply data from ShareApplet on [3.0.0+]. - * @note If you want to allocate a string buffer on heap, you can call this with outstr=NULL/outstr_maxsize=0 to get the out_size, then call it again with the allocated buffer. - * @param reply WebCommonReply object. - * @param outstr Output string buffer. If NULL, the string is not loaded. - * @param outstr_maxsize Size of the buffer, including NUL-terminator. If outstr is set, this size must be >1. The size used for the actual string-copy is this size-1, to make sure the output is NUL-terminated (the entire buffer is cleared first). - * @param out_size Output string length including NUL-terminator, for the original input string in the reply loaded from a separate size field. - */ -Result ReplyGetPostServiceName(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size); - -/** - * @brief Gets the PostId from the specified reply. - * @note Only available with reply data from ShareApplet on [3.0.0+]. - * @note If you want to allocate a string buffer on heap, you can call this with outstr=NULL/outstr_maxsize=0 to get the out_size, then call it again with the allocated buffer. - * @param reply WebCommonReply object. - * @param outstr Output string buffer. If NULL, the string is not loaded. - * @param outstr_maxsize Size of the buffer, including NUL-terminator. If outstr is set, this size must be >1. The size used for the actual string-copy is this size-1, to make sure the output is NUL-terminated (the entire buffer is cleared first). - * @param out_size Output string length including NUL-terminator, for the original input string in the reply loaded from a separate size field. - */ -Result ReplyGetPostId(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size); - -/** - * @brief Gets the MediaPlayerAutoClosedByCompletion flag from the specified reply. - * @note Only available with reply data from Web on [8.0.0+]. - * @param reply WebCommonReply object. - * @param flag Output flag - */ -Result ReplyGetMediaPlayerAutoClosedByCompletion(WebCommonReply *reply, bool *flag); - -/** - * @brief Creates a \ref WebSession object. - * @param s \ref WebSession - * @param config WebCommonConfig object. - */ -void SessionCreate(WebSession *s, WebCommonConfig* config); - -/** - * @brief Closes a \ref WebSession object. - * @param s \ref WebSession - */ -void SessionClose(WebSession *s); - -/** - * @brief Launches the applet for \ref WebSession. - * @note Only available with config created by \ref webOfflineCreate or \ref webPageCreate, on [7.0.0+]. - * @note Do not use \ref webConfigShow when using WebSession. - * @param s \ref WebSession - * @param[out] out_event Output Event with autoclear=false, from \ref appletHolderGetExitEvent. Optional, can be NULL. - */ -Result SessionStart(WebSession *s, Event **out_event); - -/** - * @brief Waits for the applet to exit. - * @note This must be used before \ref webSessionClose, when \ref webSessionStart was used successfully. - * @param s \ref WebSession - * @param out Optional output applet reply data, can be NULL. - */ -Result SessionWaitForExit(WebSession *s, WebCommonReply *out); - -/** - * @brief Request the applet to exit. - * @note Use this instead of \ref webConfigRequestExit, when using WebSession. - * @param s \ref WebSession - */ -Result SessionRequestExit(WebSession *s); - -/** - * @brief Request the applet to Appear, this is only needed with ::WebSessionBootMode_AllForegroundInitiallyHidden. - * @note This should not be used before \ref webSessionStart. - * @param s \ref WebSession - * @param[out] flag Whether the message was sent successfully. - */ -Result SessionAppear(WebSession *s, bool *flag); - -/** - * @brief TrySendContentMessage - * @note This should not be used before \ref webSessionStart. - * @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension. - * @note The JS-side may ignore this if it's sent too soon after the applet launches. - * @param s \ref WebSession - * @param[in] content Input content NUL-terminated string. - * @param[in] size Size of content. - * @param[out] flag Whether the message was sent successfully. - */ -Result SessionTrySendContentMessage(WebSession *s, const char *content, u32 size, bool *flag); - -/** - * @brief TryReceiveContentMessage - * @note This should not be used before \ref webSessionStart. - * @note The JS-side for this is only available when JsExtension is enabled via \ref webConfigSetJsExtension. - * @param s \ref WebSession - * @param[out] content Output content string, always NUL-terminated. - * @param[in] size Max size of content. - * @param[out] out_size Original content size, prior to being clamped to the specified size param. - * @param[out] flag Whether the message was received successfully. - */ -Result SessionTryReceiveContentMessage(WebSession *s, char *content, u64 size, u64 *out_size, bool *flag); - -} // namespace web - -/// @brief C++ wrappers for the `wlaninf` API. -/// @details Wraps: switch/services/wlaninf.h. -namespace wlaninf { - -/// WLAN State. -using ::WlanInfState; - -/// [1.0.0-14.1.2] Initialize wlan:inf. -Result Initialize(void); - -/// Exit wlan:inf. -void Exit(void); - -/// Gets the Service object for the actual wlan:inf service session. -Service* GetServiceSession(void); - -/// Gets \ref WlanInfState. -Result GetState(WlanInfState* out); - -/// Value goes from -30 (really good signal) to -90 (barely enough to stay connected) -/// on a logarithmic scale -Result GetRSSI(s32* out); - -} // namespace wlaninf - -} // namespace nx - -} // extern "C++" (linkage guard, do not remove) diff --git a/Source/hoc-clk/common/src/switch.cpp b/Source/hoc-clk/common/src/switch.cpp deleted file mode 100644 index f1884e97..00000000 --- a/Source/hoc-clk/common/src/switch.cpp +++ /dev/null @@ -1,4804 +0,0 @@ -/** - * @file switch.hpp - * @brief Libnx C++ bindings (AUTO-GENERATED, do not edit). - * @copyright libnx Authors - */ -#include "switch.hpp" - -namespace nx { - -const char *CppBindingsVersion() { - return "libnx C++ bindings v1.0.0 (libnx feebd026)"; -} - -namespace account { - -Result Initialize(AccountServiceType service_type) { return ::accountInitialize(service_type); } -void Exit(void) { ::accountExit(); } -Service* GetServiceSession(void) { return ::accountGetServiceSession(); } -Result GetUserCount(s32* user_count) { return ::accountGetUserCount(user_count); } -Result ListAllUsers(AccountUid* uids, s32 max_uids, s32 *actual_total) { return ::accountListAllUsers(uids, max_uids, actual_total); } -Result GetLastOpenedUser(AccountUid *uid) { return ::accountGetLastOpenedUser(uid); } -Result GetProfile(AccountProfile* out, AccountUid uid) { return ::accountGetProfile(out, uid); } -Result IsUserRegistrationRequestPermitted(bool *out) { return ::accountIsUserRegistrationRequestPermitted(out); } -Result TrySelectUserWithoutInteraction(AccountUid *uid, bool is_network_service_account_required) { return ::accountTrySelectUserWithoutInteraction(uid, is_network_service_account_required); } -void ProfileClose(AccountProfile* profile) { ::accountProfileClose(profile); } -Result ProfileGet(AccountProfile* profile, AccountUserData* userdata, AccountProfileBase* profilebase) { return ::accountProfileGet(profile, userdata, profilebase); } -Result ProfileGetImageSize(AccountProfile* profile, u32* image_size) { return ::accountProfileGetImageSize(profile, image_size); } -Result ProfileLoadImage(AccountProfile* profile, void* buf, size_t len, u32* image_size) { return ::accountProfileLoadImage(profile, buf, len, image_size); } -Result GetPreselectedUser(AccountUid *uid) { return ::accountGetPreselectedUser(uid); } -bool UidIsValid(const AccountUid *Uid) { return ::accountUidIsValid(Uid); } - -} // namespace account - -namespace aes128 { - -void ContextCreate(Aes128Context *out, const void *key, bool is_encryptor) { ::aes128ContextCreate(out, key, is_encryptor); } -void EncryptBlock(const Aes128Context *ctx, void *dst, const void *src) { ::aes128EncryptBlock(ctx, dst, src); } -void DecryptBlock(const Aes128Context *ctx, void *dst, const void *src) { ::aes128DecryptBlock(ctx, dst, src); } -void CbcContextCreate(Aes128CbcContext *out, const void *key, const void *iv, bool is_encryptor) { ::aes128CbcContextCreate(out, key, iv, is_encryptor); } -void CbcContextResetIv(Aes128CbcContext *ctx, const void *iv) { ::aes128CbcContextResetIv(ctx, iv); } -size_t CbcEncrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes128CbcEncrypt(ctx, dst, src, size); } -size_t CbcDecrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes128CbcDecrypt(ctx, dst, src, size); } -void CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr) { ::aes128CtrContextCreate(out, key, ctr); } -void CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr) { ::aes128CtrContextResetCtr(ctx, ctr); } -void CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t size) { ::aes128CtrCrypt(ctx, dst, src, size); } -void XtsContextCreate(Aes128XtsContext *out, const void *key0, const void *key1, bool is_encryptor) { ::aes128XtsContextCreate(out, key0, key1, is_encryptor); } -void XtsContextResetTweak(Aes128XtsContext *ctx, const void *tweak) { ::aes128XtsContextResetTweak(ctx, tweak); } -void XtsContextResetSector(Aes128XtsContext *ctx, uint64_t sector, bool is_nintendo) { ::aes128XtsContextResetSector(ctx, sector, is_nintendo); } -size_t XtsEncrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes128XtsEncrypt(ctx, dst, src, size); } -size_t XtsDecrypt(Aes128XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes128XtsDecrypt(ctx, dst, src, size); } - -} // namespace aes128 - -namespace aes192 { - -void ContextCreate(Aes192Context *out, const void *key, bool is_encryptor) { ::aes192ContextCreate(out, key, is_encryptor); } -void EncryptBlock(const Aes192Context *ctx, void *dst, const void *src) { ::aes192EncryptBlock(ctx, dst, src); } -void DecryptBlock(const Aes192Context *ctx, void *dst, const void *src) { ::aes192DecryptBlock(ctx, dst, src); } -void CbcContextCreate(Aes192CbcContext *out, const void *key, const void *iv, bool is_encryptor) { ::aes192CbcContextCreate(out, key, iv, is_encryptor); } -void CbcContextResetIv(Aes192CbcContext *ctx, const void *iv) { ::aes192CbcContextResetIv(ctx, iv); } -size_t CbcEncrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes192CbcEncrypt(ctx, dst, src, size); } -size_t CbcDecrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes192CbcDecrypt(ctx, dst, src, size); } -void CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr) { ::aes192CtrContextCreate(out, key, ctr); } -void CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr) { ::aes192CtrContextResetCtr(ctx, ctr); } -void CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t size) { ::aes192CtrCrypt(ctx, dst, src, size); } -void XtsContextCreate(Aes192XtsContext *out, const void *key0, const void *key1, bool is_encryptor) { ::aes192XtsContextCreate(out, key0, key1, is_encryptor); } -void XtsContextResetTweak(Aes192XtsContext *ctx, const void *tweak) { ::aes192XtsContextResetTweak(ctx, tweak); } -void XtsContextResetSector(Aes192XtsContext *ctx, uint64_t sector, bool is_nintendo) { ::aes192XtsContextResetSector(ctx, sector, is_nintendo); } -size_t XtsEncrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes192XtsEncrypt(ctx, dst, src, size); } -size_t XtsDecrypt(Aes192XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes192XtsDecrypt(ctx, dst, src, size); } - -} // namespace aes192 - -namespace aes256 { - -void ContextCreate(Aes256Context *out, const void *key, bool is_encryptor) { ::aes256ContextCreate(out, key, is_encryptor); } -void EncryptBlock(const Aes256Context *ctx, void *dst, const void *src) { ::aes256EncryptBlock(ctx, dst, src); } -void DecryptBlock(const Aes256Context *ctx, void *dst, const void *src) { ::aes256DecryptBlock(ctx, dst, src); } -void CbcContextCreate(Aes256CbcContext *out, const void *key, const void *iv, bool is_encryptor) { ::aes256CbcContextCreate(out, key, iv, is_encryptor); } -void CbcContextResetIv(Aes256CbcContext *ctx, const void *iv) { ::aes256CbcContextResetIv(ctx, iv); } -size_t CbcEncrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes256CbcEncrypt(ctx, dst, src, size); } -size_t CbcDecrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size) { return ::aes256CbcDecrypt(ctx, dst, src, size); } -void CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr) { ::aes256CtrContextCreate(out, key, ctr); } -void CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr) { ::aes256CtrContextResetCtr(ctx, ctr); } -void CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size) { ::aes256CtrCrypt(ctx, dst, src, size); } -void XtsContextCreate(Aes256XtsContext *out, const void *key0, const void *key1, bool is_encryptor) { ::aes256XtsContextCreate(out, key0, key1, is_encryptor); } -void XtsContextResetTweak(Aes256XtsContext *ctx, const void *tweak) { ::aes256XtsContextResetTweak(ctx, tweak); } -void XtsContextResetSector(Aes256XtsContext *ctx, uint64_t sector, bool is_nintendo) { ::aes256XtsContextResetSector(ctx, sector, is_nintendo); } -size_t XtsEncrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes256XtsEncrypt(ctx, dst, src, size); } -size_t XtsDecrypt(Aes256XtsContext *ctx, void *dst, const void *src, size_t size) { return ::aes256XtsDecrypt(ctx, dst, src, size); } - -} // namespace aes256 - -namespace album { - -Result LaShowAlbumFiles(void) { return ::albumLaShowAlbumFiles(); } -Result LaShowAllAlbumFiles(void) { return ::albumLaShowAllAlbumFiles(); } -Result LaShowAllAlbumFilesForHomeMenu(void) { return ::albumLaShowAllAlbumFilesForHomeMenu(); } - -} // namespace album - -namespace apm { - -Result Initialize(void) { return ::apmInitialize(); } -void Exit(void) { ::apmExit(); } -Service* GetServiceSession(void) { return ::apmGetServiceSession(); } -Service* GetServiceSession_Session(void) { return ::apmGetServiceSession_Session(); } -Result GetPerformanceMode(ApmPerformanceMode* out_performanceMode) { return ::apmGetPerformanceMode(out_performanceMode); } -Result SetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 PerformanceConfiguration) { return ::apmSetPerformanceConfiguration(PerformanceMode, PerformanceConfiguration); } -Result GetPerformanceConfiguration(ApmPerformanceMode PerformanceMode, u32 *PerformanceConfiguration) { return ::apmGetPerformanceConfiguration(PerformanceMode, PerformanceConfiguration); } - -} // namespace apm - -namespace applet { - -Result Initialize(void) { return ::appletInitialize(); } -void Exit(void) { ::appletExit(); } -Service* GetServiceSession_Proxy(void) { return ::appletGetServiceSession_Proxy(); } -Service* GetServiceSession_AppletCommonFunctions(void) { return ::appletGetServiceSession_AppletCommonFunctions(); } -Service* GetServiceSession_Functions(void) { return ::appletGetServiceSession_Functions(); } -Service* GetServiceSession_GlobalStateController(void) { return ::appletGetServiceSession_GlobalStateController(); } -Service* GetServiceSession_ApplicationCreator(void) { return ::appletGetServiceSession_ApplicationCreator(); } -Service* GetServiceSession_LibraryAppletSelfAccessor(void) { return ::appletGetServiceSession_LibraryAppletSelfAccessor(); } -Service* GetServiceSession_ProcessWindingController(void) { return ::appletGetServiceSession_ProcessWindingController(); } -Service* GetServiceSession_LibraryAppletCreator(void) { return ::appletGetServiceSession_LibraryAppletCreator(); } -Service* GetServiceSession_CommonStateGetter(void) { return ::appletGetServiceSession_CommonStateGetter(); } -Service* GetServiceSession_SelfController(void) { return ::appletGetServiceSession_SelfController(); } -Service* GetServiceSession_WindowController(void) { return ::appletGetServiceSession_WindowController(); } -Service* GetServiceSession_AudioController(void) { return ::appletGetServiceSession_AudioController(); } -Service* GetServiceSession_DisplayController(void) { return ::appletGetServiceSession_DisplayController(); } -Service* GetServiceSession_DebugFunctions(void) { return ::appletGetServiceSession_DebugFunctions(); } -u64 GetAppletResourceUserId(void) { return ::appletGetAppletResourceUserId(); } -AppletType GetAppletType(void) { return ::appletGetAppletType(); } -void SetThemeColorType(AppletThemeColorType theme) { ::appletSetThemeColorType(theme); } -AppletThemeColorType GetThemeColorType(void) { return ::appletGetThemeColorType(); } -Result GetCradleStatus(u8 *status) { return ::appletGetCradleStatus(status); } -Result GetBootMode(PmBootMode *mode) { return ::appletGetBootMode(mode); } -Result RequestToAcquireSleepLock(void) { return ::appletRequestToAcquireSleepLock(); } -Result ReleaseSleepLock(void) { return ::appletReleaseSleepLock(); } -Result ReleaseSleepLockTransiently(void) { return ::appletReleaseSleepLockTransiently(); } -Result GetWakeupCount(u64 *out) { return ::appletGetWakeupCount(out); } -Result PushToGeneralChannel(AppletStorage *s) { return ::appletPushToGeneralChannel(s); } -Result GetHomeButtonReaderLockAccessor(AppletLockAccessor *a) { return ::appletGetHomeButtonReaderLockAccessor(a); } -Result GetReaderLockAccessorEx(AppletLockAccessor *a, u32 inval) { return ::appletGetReaderLockAccessorEx(a, inval); } -Result GetWriterLockAccessorEx(AppletLockAccessor *a, u32 inval) { return ::appletGetWriterLockAccessorEx(a, inval); } -Result GetCradleFwVersion(u32 *out0, u32 *out1, u32 *out2, u32 *out3) { return ::appletGetCradleFwVersion(out0, out1, out2, out3); } -Result IsVrModeEnabled(bool *out) { return ::appletIsVrModeEnabled(out); } -Result SetVrModeEnabled(bool flag) { return ::appletSetVrModeEnabled(flag); } -Result SetLcdBacklightOffEnabled(bool flag) { return ::appletSetLcdBacklightOffEnabled(flag); } -Result IsInControllerFirmwareUpdateSection(bool *out) { return ::appletIsInControllerFirmwareUpdateSection(out); } -Result SetVrPositionForDebug(s32 x, s32 y, s32 width, s32 height) { return ::appletSetVrPositionForDebug(x, y, width, height); } -Result GetDefaultDisplayResolution(s32 *width, s32 *height) { return ::appletGetDefaultDisplayResolution(width, height); } -Result GetDefaultDisplayResolutionChangeEvent(Event *out_event) { return ::appletGetDefaultDisplayResolutionChangeEvent(out_event); } -Result GetHdcpAuthenticationState(s32 *state) { return ::appletGetHdcpAuthenticationState(state); } -Result GetHdcpAuthenticationStateChangeEvent(Event *out_event) { return ::appletGetHdcpAuthenticationStateChangeEvent(out_event); } -Result SetTvPowerStateMatchingMode(AppletTvPowerStateMatchingMode mode) { return ::appletSetTvPowerStateMatchingMode(mode); } -Result GetApplicationIdByContentActionName(u64 *application_id, const char *name) { return ::appletGetApplicationIdByContentActionName(application_id, name); } -Result SetCpuBoostMode(ApmCpuBoostMode mode) { return ::appletSetCpuBoostMode(mode); } -Result CancelCpuBoostMode(void) { return ::appletCancelCpuBoostMode(); } -Result GetBuiltInDisplayType(s32 *out) { return ::appletGetBuiltInDisplayType(out); } -Result PerformSystemButtonPressingIfInFocus(AppletSystemButtonType type) { return ::appletPerformSystemButtonPressingIfInFocus(type); } -Result SetPerformanceConfigurationChangedNotification(bool flag) { return ::appletSetPerformanceConfigurationChangedNotification(flag); } -Result GetCurrentPerformanceConfiguration(u32 *PerformanceConfiguration) { return ::appletGetCurrentPerformanceConfiguration(PerformanceConfiguration); } -Result OpenMyGpuErrorHandler(AppletGpuErrorHandler *g) { return ::appletOpenMyGpuErrorHandler(g); } -Result GetOperationModeSystemInfo(u32 *info) { return ::appletGetOperationModeSystemInfo(info); } -Result GetSettingsPlatformRegion(SetSysPlatformRegion *out) { return ::appletGetSettingsPlatformRegion(out); } -Result ActivateMigrationService(void) { return ::appletActivateMigrationService(); } -Result DeactivateMigrationService(void) { return ::appletDeactivateMigrationService(); } -Result DisableSleepTillShutdown(void) { return ::appletDisableSleepTillShutdown(); } -Result SuppressDisablingSleepTemporarily(u64 val) { return ::appletSuppressDisablingSleepTemporarily(val); } -Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(void) { return ::appletSetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(); } -void GpuErrorHandlerClose(AppletGpuErrorHandler *g) { ::appletGpuErrorHandlerClose(g); } -Result GpuErrorHandlerGetManualGpuErrorInfoSize(AppletGpuErrorHandler *g, u64 *out) { return ::appletGpuErrorHandlerGetManualGpuErrorInfoSize(g, out); } -Result GpuErrorHandlerGetManualGpuErrorInfo(AppletGpuErrorHandler *g, void* buffer, size_t size, u64 *out) { return ::appletGpuErrorHandlerGetManualGpuErrorInfo(g, buffer, size, out); } -Result GpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(AppletGpuErrorHandler *g, Event *out_event) { return ::appletGpuErrorHandlerGetManualGpuErrorDetectionSystemEvent(g, out_event); } -Result GpuErrorHandlerFinishManualGpuErrorHandling(AppletGpuErrorHandler *g) { return ::appletGpuErrorHandlerFinishManualGpuErrorHandling(g); } -Result LockExit(void) { return ::appletLockExit(); } -Result UnlockExit(void) { return ::appletUnlockExit(); } -Result EnterFatalSection(void) { return ::appletEnterFatalSection(); } -Result LeaveFatalSection(void) { return ::appletLeaveFatalSection(); } -Result SetScreenShotPermission(AppletScreenShotPermission permission) { return ::appletSetScreenShotPermission(permission); } -Result SetRestartMessageEnabled(bool flag) { return ::appletSetRestartMessageEnabled(flag); } -Result SetScreenShotAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletSetScreenShotAppletIdentityInfo(info); } -Result SetControllerFirmwareUpdateSection(bool flag) { return ::appletSetControllerFirmwareUpdateSection(flag); } -Result SetRequiresCaptureButtonShortPressedMessage(bool flag) { return ::appletSetRequiresCaptureButtonShortPressedMessage(flag); } -Result SetAlbumImageOrientation(AlbumImageOrientation orientation) { return ::appletSetAlbumImageOrientation(orientation); } -Result SetDesirableKeyboardLayout(SetKeyboardLayout layout) { return ::appletSetDesirableKeyboardLayout(layout); } -Result CreateManagedDisplayLayer(u64 *out) { return ::appletCreateManagedDisplayLayer(out); } -Result IsSystemBufferSharingEnabled(void) { return ::appletIsSystemBufferSharingEnabled(); } -Result GetSystemSharedLayerHandle(u64 *SharedBufferHandle, u64 *SharedLayerHandle) { return ::appletGetSystemSharedLayerHandle(SharedBufferHandle, SharedLayerHandle); } -Result GetSystemSharedBufferHandle(u64 *SharedBufferHandle) { return ::appletGetSystemSharedBufferHandle(SharedBufferHandle); } -Result CreateManagedDisplaySeparableLayer(u64 *display_layer, u64 *recording_layer) { return ::appletCreateManagedDisplaySeparableLayer(display_layer, recording_layer); } -Result SetManagedDisplayLayerSeparationMode(u32 mode) { return ::appletSetManagedDisplayLayerSeparationMode(mode); } -Result SetHandlesRequestToDisplay(bool flag) { return ::appletSetHandlesRequestToDisplay(flag); } -Result ApproveToDisplay(void) { return ::appletApproveToDisplay(); } -Result OverrideAutoSleepTimeAndDimmingTime(s32 inval0, s32 inval1, s32 inval2, s32 inval3) { return ::appletOverrideAutoSleepTimeAndDimmingTime(inval0, inval1, inval2, inval3); } -Result SetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension ext) { return ::appletSetIdleTimeDetectionExtension(ext); } -Result GetIdleTimeDetectionExtension(AppletIdleTimeDetectionExtension *ext) { return ::appletGetIdleTimeDetectionExtension(ext); } -Result SetInputDetectionSourceSet(u32 val) { return ::appletSetInputDetectionSourceSet(val); } -Result ReportUserIsActive(void) { return ::appletReportUserIsActive(); } -Result GetCurrentIlluminance(float *fLux) { return ::appletGetCurrentIlluminance(fLux); } -Result IsIlluminanceAvailable(bool *out) { return ::appletIsIlluminanceAvailable(out); } -Result SetAutoSleepDisabled(bool flag) { return ::appletSetAutoSleepDisabled(flag); } -Result IsAutoSleepDisabled(bool *out) { return ::appletIsAutoSleepDisabled(out); } -Result GetCurrentIlluminanceEx(bool *bOverLimit, float *fLux) { return ::appletGetCurrentIlluminanceEx(bOverLimit, fLux); } -Result SetInputDetectionPolicy(AppletInputDetectionPolicy policy) { return ::appletSetInputDetectionPolicy(policy); } -Result SetWirelessPriorityMode(AppletWirelessPriorityMode mode) { return ::appletSetWirelessPriorityMode(mode); } -Result GetProgramTotalActiveTime(u64 *activeTime) { return ::appletGetProgramTotalActiveTime(activeTime); } -Result SetAlbumImageTakenNotificationEnabled(bool flag) { return ::appletSetAlbumImageTakenNotificationEnabled(flag); } -Result SetApplicationAlbumUserData(const void* buffer, size_t size) { return ::appletSetApplicationAlbumUserData(buffer, size); } -Result SaveCurrentScreenshot(AlbumReportOption option) { return ::appletSaveCurrentScreenshot(option); } -Result GetAppletResourceUserIdOfCallerApplet(u64 *out) { return ::appletGetAppletResourceUserIdOfCallerApplet(out); } -Result SetAppletWindowVisibility(bool flag) { return ::appletSetAppletWindowVisibility(flag); } -Result SetAppletGpuTimeSlice(s64 val) { return ::appletSetAppletGpuTimeSlice(val); } -Result SetExpectedMasterVolume(float mainAppletVolume, float libraryAppletVolume) { return ::appletSetExpectedMasterVolume(mainAppletVolume, libraryAppletVolume); } -Result GetExpectedMasterVolume(float *mainAppletVolume, float *libraryAppletVolume) { return ::appletGetExpectedMasterVolume(mainAppletVolume, libraryAppletVolume); } -Result ChangeMainAppletMasterVolume(float volume, u64 unk) { return ::appletChangeMainAppletMasterVolume(volume, unk); } -Result SetTransparentVolumeRate(float val) { return ::appletSetTransparentVolumeRate(val); } -Result UpdateLastForegroundCaptureImage(void) { return ::appletUpdateLastForegroundCaptureImage(); } -Result UpdateCallerAppletCaptureImage(void) { return ::appletUpdateCallerAppletCaptureImage(); } -Result GetLastForegroundCaptureImageEx(void* buffer, size_t size, bool *flag) { return ::appletGetLastForegroundCaptureImageEx(buffer, size, flag); } -Result GetLastApplicationCaptureImageEx(void* buffer, size_t size, bool *flag) { return ::appletGetLastApplicationCaptureImageEx(buffer, size, flag); } -Result GetCallerAppletCaptureImageEx(void* buffer, size_t size, bool *flag) { return ::appletGetCallerAppletCaptureImageEx(buffer, size, flag); } -Result TakeScreenShotOfOwnLayer(bool flag, AppletCaptureSharedBuffer captureBuf) { return ::appletTakeScreenShotOfOwnLayer(flag, captureBuf); } -Result CopyBetweenCaptureBuffers(AppletCaptureSharedBuffer dstCaptureBuf, AppletCaptureSharedBuffer srcCaptureBuf) { return ::appletCopyBetweenCaptureBuffers(dstCaptureBuf, srcCaptureBuf); } -Result ClearCaptureBuffer(bool flag, AppletCaptureSharedBuffer captureBuf, u32 color) { return ::appletClearCaptureBuffer(flag, captureBuf, color); } -Result ClearAppletTransitionBuffer(u32 color) { return ::appletClearAppletTransitionBuffer(color); } -Result AcquireLastApplicationCaptureSharedBuffer(bool *flag, s32 *id) { return ::appletAcquireLastApplicationCaptureSharedBuffer(flag, id); } -Result ReleaseLastApplicationCaptureSharedBuffer(void) { return ::appletReleaseLastApplicationCaptureSharedBuffer(); } -Result AcquireLastForegroundCaptureSharedBuffer(bool *flag, s32 *id) { return ::appletAcquireLastForegroundCaptureSharedBuffer(flag, id); } -Result ReleaseLastForegroundCaptureSharedBuffer(void) { return ::appletReleaseLastForegroundCaptureSharedBuffer(); } -Result AcquireCallerAppletCaptureSharedBuffer(bool *flag, s32 *id) { return ::appletAcquireCallerAppletCaptureSharedBuffer(flag, id); } -Result ReleaseCallerAppletCaptureSharedBuffer(void) { return ::appletReleaseCallerAppletCaptureSharedBuffer(); } -Result TakeScreenShotOfOwnLayerEx(bool flag0, bool immediately, AppletCaptureSharedBuffer captureBuf) { return ::appletTakeScreenShotOfOwnLayerEx(flag0, immediately, captureBuf); } -Result PushContext(AppletStorage *s) { return ::appletPushContext(s); } -Result PopContext(AppletStorage *s) { return ::appletPopContext(s); } -void LockAccessorClose(AppletLockAccessor *a) { ::appletLockAccessorClose(a); } -Result LockAccessorTryLock(AppletLockAccessor *a, bool *flag) { return ::appletLockAccessorTryLock(a, flag); } -Result LockAccessorLock(AppletLockAccessor *a) { return ::appletLockAccessorLock(a); } -Result LockAccessorUnlock(AppletLockAccessor *a) { return ::appletLockAccessorUnlock(a); } -Result CreateLibraryApplet(AppletHolder *h, AppletId id, LibAppletMode mode) { return ::appletCreateLibraryApplet(h, id, mode); } -Result CreateLibraryAppletSelf(AppletHolder *h, AppletId id, LibAppletMode mode) { return ::appletCreateLibraryAppletSelf(h, id, mode); } -Result TerminateAllLibraryApplets(void) { return ::appletTerminateAllLibraryApplets(); } -Result AreAnyLibraryAppletsLeft(bool *out) { return ::appletAreAnyLibraryAppletsLeft(out); } -void HolderClose(AppletHolder *h) { ::appletHolderClose(h); } -bool HolderActive(AppletHolder *h) { return ::appletHolderActive(h); } -Result HolderGetIndirectLayerConsumerHandle(AppletHolder *h, u64 *out) { return ::appletHolderGetIndirectLayerConsumerHandle(h, out); } -Result HolderStart(AppletHolder *h) { return ::appletHolderStart(h); } -Result HolderJump(AppletHolder *h) { return ::appletHolderJump(h); } -Result HolderRequestExit(AppletHolder *h) { return ::appletHolderRequestExit(h); } -Result HolderTerminate(AppletHolder *h) { return ::appletHolderTerminate(h); } -Result HolderRequestExitOrTerminate(AppletHolder *h, u64 timeout) { return ::appletHolderRequestExitOrTerminate(h, timeout); } -void HolderJoin(AppletHolder *h) { ::appletHolderJoin(h); } -Event * HolderGetExitEvent(AppletHolder *h) { return ::appletHolderGetExitEvent(h); } -bool HolderCheckFinished(AppletHolder *h) { return ::appletHolderCheckFinished(h); } -LibAppletExitReason HolderGetExitReason(AppletHolder *h) { return ::appletHolderGetExitReason(h); } -Result HolderSetOutOfFocusApplicationSuspendingEnabled(AppletHolder *h, bool flag) { return ::appletHolderSetOutOfFocusApplicationSuspendingEnabled(h, flag); } -Result HolderPresetLibraryAppletGpuTimeSliceZero(AppletHolder *h) { return ::appletHolderPresetLibraryAppletGpuTimeSliceZero(h); } -Result HolderGetPopInteractiveOutDataEvent(AppletHolder *h, Event **out_event) { return ::appletHolderGetPopInteractiveOutDataEvent(h, out_event); } -bool HolderWaitInteractiveOut(AppletHolder *h) { return ::appletHolderWaitInteractiveOut(h); } -Result HolderPushInData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPushInData(h, s); } -Result HolderPopOutData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPopOutData(h, s); } -Result HolderPushExtraStorage(AppletHolder *h, AppletStorage *s) { return ::appletHolderPushExtraStorage(h, s); } -Result HolderPushInteractiveInData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPushInteractiveInData(h, s); } -Result HolderPopInteractiveOutData(AppletHolder *h, AppletStorage *s) { return ::appletHolderPopInteractiveOutData(h, s); } -Result HolderGetLibraryAppletInfo(AppletHolder *h, LibAppletInfo *info) { return ::appletHolderGetLibraryAppletInfo(h, info); } -Result CreateStorage(AppletStorage *s, s64 size) { return ::appletCreateStorage(s, size); } -Result CreateTransferMemoryStorage(AppletStorage *s, void* buffer, s64 size, bool writable) { return ::appletCreateTransferMemoryStorage(s, buffer, size, writable); } -Result CreateHandleStorage(AppletStorage *s, s64 inval, Handle handle) { return ::appletCreateHandleStorage(s, inval, handle); } -Result CreateHandleStorageTmem(AppletStorage *s, void* buffer, s64 size) { return ::appletCreateHandleStorageTmem(s, buffer, size); } -void StorageClose(AppletStorage *s) { ::appletStorageClose(s); } -void StorageCloseTmem(AppletStorage *s) { ::appletStorageCloseTmem(s); } -Result StorageGetSize(AppletStorage *s, s64 *size) { return ::appletStorageGetSize(s, size); } -Result StorageWrite(AppletStorage *s, s64 offset, const void* buffer, size_t size) { return ::appletStorageWrite(s, offset, buffer, size); } -Result StorageRead(AppletStorage *s, s64 offset, void* buffer, size_t size) { return ::appletStorageRead(s, offset, buffer, size); } -Result StorageGetHandle(AppletStorage *s, s64 *out, Handle *handle) { return ::appletStorageGetHandle(s, out, handle); } -Result StorageMap(AppletStorage *s, void** addr, size_t *size) { return ::appletStorageMap(s, addr, size); } -Result PopLaunchParameter(AppletStorage *s, AppletLaunchParameterKind kind) { return ::appletPopLaunchParameter(s, kind); } -Result RequestLaunchApplication(u64 application_id, AppletStorage* s) { return ::appletRequestLaunchApplication(application_id, s); } -Result RequestLaunchApplicationForQuest(u64 application_id, AppletStorage* s, const AppletApplicationAttributeForQuest *attr) { return ::appletRequestLaunchApplicationForQuest(application_id, s, attr); } -Result GetDesiredLanguage(u64 *LanguageCode) { return ::appletGetDesiredLanguage(LanguageCode); } -Result GetDisplayVersion(char *displayVersion) { return ::appletGetDisplayVersion(displayVersion); } -Result BeginBlockingHomeButtonShortAndLongPressed(s64 val) { return ::appletBeginBlockingHomeButtonShortAndLongPressed(val); } -Result EndBlockingHomeButtonShortAndLongPressed(void) { return ::appletEndBlockingHomeButtonShortAndLongPressed(); } -Result BeginBlockingHomeButton(s64 val) { return ::appletBeginBlockingHomeButton(val); } -Result EndBlockingHomeButton(void) { return ::appletEndBlockingHomeButton(); } -void NotifyRunning(bool *out) { ::appletNotifyRunning(out); } -Result GetPseudoDeviceId(Uuid *out) { return ::appletGetPseudoDeviceId(out); } -Result SetMediaPlaybackState(bool state) { return ::appletSetMediaPlaybackState(state); } -Result IsGamePlayRecordingSupported(bool *flag) { return ::appletIsGamePlayRecordingSupported(flag); } -Result SetGamePlayRecordingState(bool state) { return ::appletSetGamePlayRecordingState(state); } -Result InitializeGamePlayRecording(void) { return ::appletInitializeGamePlayRecording(); } -Result RequestFlushGamePlayingMovieForDebug(void) { return ::appletRequestFlushGamePlayingMovieForDebug(); } -Result RequestToShutdown(void) { return ::appletRequestToShutdown(); } -Result RequestToReboot(void) { return ::appletRequestToReboot(); } -Result RequestToSleep(void) { return ::appletRequestToSleep(); } -Result ExitAndRequestToShowThanksMessage(void) { return ::appletExitAndRequestToShowThanksMessage(); } -Result InitializeApplicationCopyrightFrameBuffer(void) { return ::appletInitializeApplicationCopyrightFrameBuffer(); } -Result SetApplicationCopyrightImage(const void* buffer, size_t size, s32 x, s32 y, s32 width, s32 height, AppletWindowOriginMode mode) { return ::appletSetApplicationCopyrightImage(buffer, size, x, y, width, height, mode); } -Result SetApplicationCopyrightVisibility(bool visible) { return ::appletSetApplicationCopyrightVisibility(visible); } -Result QueryApplicationPlayStatistics(PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out) { return ::appletQueryApplicationPlayStatistics(stats, application_ids, count, total_out); } -Result QueryApplicationPlayStatisticsByUid(AccountUid uid, PdmApplicationPlayStatistics *stats, const u64 *application_ids, s32 count, s32 *total_out) { return ::appletQueryApplicationPlayStatisticsByUid(uid, stats, application_ids, count, total_out); } -Result ExecuteProgram(s32 programIndex, const void* buffer, size_t size) { return ::appletExecuteProgram(programIndex, buffer, size); } -Result JumpToSubApplicationProgramForDevelopment(u64 application_id, const void* buffer, size_t size) { return ::appletJumpToSubApplicationProgramForDevelopment(application_id, buffer, size); } -Result RestartProgram(const void* buffer, size_t size) { return ::appletRestartProgram(buffer, size); } -Result GetPreviousProgramIndex(s32 *programIndex) { return ::appletGetPreviousProgramIndex(programIndex); } -Result SetDelayTimeToAbortOnGpuError(u64 val) { return ::appletSetDelayTimeToAbortOnGpuError(val); } -Result GetFriendInvitationStorageChannelEvent(Event *out_event) { return ::appletGetFriendInvitationStorageChannelEvent(out_event); } -Result TryPopFromFriendInvitationStorageChannel(AppletStorage *s) { return ::appletTryPopFromFriendInvitationStorageChannel(s); } -Result GetNotificationStorageChannelEvent(Event *out_event) { return ::appletGetNotificationStorageChannelEvent(out_event); } -Result TryPopFromNotificationStorageChannel(AppletStorage *s) { return ::appletTryPopFromNotificationStorageChannel(s); } -Result GetHealthWarningDisappearedSystemEvent(Event *out_event) { return ::appletGetHealthWarningDisappearedSystemEvent(out_event); } -Result SetHdcpAuthenticationActivated(bool flag) { return ::appletSetHdcpAuthenticationActivated(flag); } -Result GetLastApplicationExitReason(s32 *out) { return ::appletGetLastApplicationExitReason(out); } -Result CreateMovieMaker(Service* srv_out, TransferMemory *tmem) { return ::appletCreateMovieMaker(srv_out, tmem); } -Result PrepareForJit(void) { return ::appletPrepareForJit(); } -Result RequestToGetForeground(void) { return ::appletRequestToGetForeground(); } -Result LockForeground(void) { return ::appletLockForeground(); } -Result UnlockForeground(void) { return ::appletUnlockForeground(); } -Result PopFromGeneralChannel(AppletStorage *s) { return ::appletPopFromGeneralChannel(s); } -Result GetPopFromGeneralChannelEvent(Event *out_event) { return ::appletGetPopFromGeneralChannelEvent(out_event); } -Result GetHomeButtonWriterLockAccessor(AppletLockAccessor *a) { return ::appletGetHomeButtonWriterLockAccessor(a); } -Result IsSleepEnabled(bool *out) { return ::appletIsSleepEnabled(out); } -Result PopRequestLaunchApplicationForDebug(AccountUid *uids, s32 count, u64 *application_id, s32 *total_out) { return ::appletPopRequestLaunchApplicationForDebug(uids, count, application_id, total_out); } -Result IsForceTerminateApplicationDisabledForDebug(bool *out) { return ::appletIsForceTerminateApplicationDisabledForDebug(out); } -Result LaunchDevMenu(void) { return ::appletLaunchDevMenu(); } -Result SetLastApplicationExitReason(s32 reason) { return ::appletSetLastApplicationExitReason(reason); } -Result StartSleepSequence(bool flag) { return ::appletStartSleepSequence(flag); } -Result StartShutdownSequence(void) { return ::appletStartShutdownSequence(); } -Result StartRebootSequence(void) { return ::appletStartRebootSequence(); } -Result IsAutoPowerDownRequested(bool *out) { return ::appletIsAutoPowerDownRequested(out); } -Result LoadAndApplyIdlePolicySettings(void) { return ::appletLoadAndApplyIdlePolicySettings(); } -Result NotifyCecSettingsChanged(void) { return ::appletNotifyCecSettingsChanged(); } -Result SetDefaultHomeButtonLongPressTime(s64 val) { return ::appletSetDefaultHomeButtonLongPressTime(val); } -Result UpdateDefaultDisplayResolution(void) { return ::appletUpdateDefaultDisplayResolution(); } -Result ShouldSleepOnBoot(bool *out) { return ::appletShouldSleepOnBoot(out); } -Result GetHdcpAuthenticationFailedEvent(Event *out_event) { return ::appletGetHdcpAuthenticationFailedEvent(out_event); } -Result CreateApplication(AppletApplication *a, u64 application_id) { return ::appletCreateApplication(a, application_id); } -Result PopLaunchRequestedApplication(AppletApplication *a) { return ::appletPopLaunchRequestedApplication(a); } -Result CreateSystemApplication(AppletApplication *a, u64 system_application_id) { return ::appletCreateSystemApplication(a, system_application_id); } -Result PopFloatingApplicationForDevelopment(AppletApplication *a) { return ::appletPopFloatingApplicationForDevelopment(a); } -void ApplicationClose(AppletApplication *a) { ::appletApplicationClose(a); } -bool ApplicationActive(AppletApplication *a) { return ::appletApplicationActive(a); } -Result ApplicationStart(AppletApplication *a) { return ::appletApplicationStart(a); } -Result ApplicationRequestExit(AppletApplication *a) { return ::appletApplicationRequestExit(a); } -Result ApplicationTerminate(AppletApplication *a) { return ::appletApplicationTerminate(a); } -void ApplicationJoin(AppletApplication *a) { ::appletApplicationJoin(a); } -bool ApplicationCheckFinished(AppletApplication *a) { return ::appletApplicationCheckFinished(a); } -AppletApplicationExitReason ApplicationGetExitReason(AppletApplication *a) { return ::appletApplicationGetExitReason(a); } -Result ApplicationRequestForApplicationToGetForeground(AppletApplication *a) { return ::appletApplicationRequestForApplicationToGetForeground(a); } -Result ApplicationTerminateAllLibraryApplets(AppletApplication *a) { return ::appletApplicationTerminateAllLibraryApplets(a); } -Result ApplicationAreAnyLibraryAppletsLeft(AppletApplication *a, bool *out) { return ::appletApplicationAreAnyLibraryAppletsLeft(a, out); } -Result ApplicationRequestExitLibraryAppletOrTerminate(AppletApplication *a, u64 timeout) { return ::appletApplicationRequestExitLibraryAppletOrTerminate(a, timeout); } -Result ApplicationGetApplicationId(AppletApplication *a, u64 *application_id) { return ::appletApplicationGetApplicationId(a, application_id); } -Result ApplicationPushLaunchParameter(AppletApplication *a, AppletLaunchParameterKind kind, AppletStorage* s) { return ::appletApplicationPushLaunchParameter(a, kind, s); } -Result ApplicationGetApplicationControlProperty(AppletApplication *a, NacpStruct *nacp) { return ::appletApplicationGetApplicationControlProperty(a, nacp); } -Result ApplicationGetApplicationLaunchProperty(AppletApplication *a, AppletApplicationLaunchProperty *out) { return ::appletApplicationGetApplicationLaunchProperty(a, out); } -Result ApplicationGetApplicationLaunchRequestInfo(AppletApplication *a, AppletApplicationLaunchRequestInfo *out) { return ::appletApplicationGetApplicationLaunchRequestInfo(a, out); } -Result ApplicationSetUsers(AppletApplication *a, const AccountUid *uids, s32 count, bool flag) { return ::appletApplicationSetUsers(a, uids, count, flag); } -Result ApplicationCheckRightsEnvironmentAvailable(AppletApplication *a, bool *out) { return ::appletApplicationCheckRightsEnvironmentAvailable(a, out); } -Result ApplicationGetNsRightsEnvironmentHandle(AppletApplication *a, u64 *handle) { return ::appletApplicationGetNsRightsEnvironmentHandle(a, handle); } -Result ApplicationGetDesirableUids(AppletApplication *a, AccountUid *uids, s32 count, s32 *total_out) { return ::appletApplicationGetDesirableUids(a, uids, count, total_out); } -Result ApplicationReportApplicationExitTimeout(AppletApplication *a) { return ::appletApplicationReportApplicationExitTimeout(a); } -Result ApplicationSetApplicationAttribute(AppletApplication *a, const AppletApplicationAttribute *attr) { return ::appletApplicationSetApplicationAttribute(a, attr); } -Result ApplicationHasSaveDataAccessPermission(AppletApplication *a, u64 application_id, bool *out) { return ::appletApplicationHasSaveDataAccessPermission(a, application_id, out); } -Result ApplicationPushToFriendInvitationStorageChannel(AppletApplication *a, AccountUid uid, const void* buffer, u64 size) { return ::appletApplicationPushToFriendInvitationStorageChannel(a, uid, buffer, size); } -Result ApplicationPushToNotificationStorageChannel(AppletApplication *a, const void* buffer, u64 size) { return ::appletApplicationPushToNotificationStorageChannel(a, buffer, size); } -Result ApplicationRequestApplicationSoftReset(AppletApplication *a) { return ::appletApplicationRequestApplicationSoftReset(a); } -Result ApplicationRestartApplicationTimer(AppletApplication *a) { return ::appletApplicationRestartApplicationTimer(a); } -Result PopInData(AppletStorage *s) { return ::appletPopInData(s); } -Result PushOutData(AppletStorage *s) { return ::appletPushOutData(s); } -Result PopInteractiveInData(AppletStorage *s) { return ::appletPopInteractiveInData(s); } -Result PushInteractiveOutData(AppletStorage *s) { return ::appletPushInteractiveOutData(s); } -Result GetPopInDataEvent(Event *out_event) { return ::appletGetPopInDataEvent(out_event); } -Result GetPopInteractiveInDataEvent(Event *out_event) { return ::appletGetPopInteractiveInDataEvent(out_event); } -Result GetLibraryAppletInfo(LibAppletInfo *info) { return ::appletGetLibraryAppletInfo(info); } -Result GetMainAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletGetMainAppletIdentityInfo(info); } -Result CanUseApplicationCore(bool *out) { return ::appletCanUseApplicationCore(out); } -Result GetCallerAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletGetCallerAppletIdentityInfo(info); } -Result GetMainAppletApplicationControlProperty(NacpStruct *nacp) { return ::appletGetMainAppletApplicationControlProperty(nacp); } -Result GetMainAppletStorageId(NcmStorageId *storageId) { return ::appletGetMainAppletStorageId(storageId); } -Result GetCallerAppletIdentityInfoStack(AppletIdentityInfo *stack, s32 count, s32 *total_out) { return ::appletGetCallerAppletIdentityInfoStack(stack, count, total_out); } -Result GetNextReturnDestinationAppletIdentityInfo(AppletIdentityInfo *info) { return ::appletGetNextReturnDestinationAppletIdentityInfo(info); } -Result GetDesirableKeyboardLayout(SetKeyboardLayout *layout) { return ::appletGetDesirableKeyboardLayout(layout); } -Result PopExtraStorage(AppletStorage *s) { return ::appletPopExtraStorage(s); } -Result GetPopExtraStorageEvent(Event *out_event) { return ::appletGetPopExtraStorageEvent(out_event); } -Result UnpopInData(AppletStorage *s) { return ::appletUnpopInData(s); } -Result UnpopExtraStorage(AppletStorage *s) { return ::appletUnpopExtraStorage(s); } -Result GetIndirectLayerProducerHandle(u64 *out) { return ::appletGetIndirectLayerProducerHandle(out); } -Result GetMainAppletApplicationDesiredLanguage(u64 *LanguageCode) { return ::appletGetMainAppletApplicationDesiredLanguage(LanguageCode); } -Result GetCurrentApplicationId(u64 *application_id) { return ::appletGetCurrentApplicationId(application_id); } -Result RequestExitToSelf(void) { return ::appletRequestExitToSelf(); } -Result CreateGameMovieTrimmer(Service* srv_out, TransferMemory *tmem) { return ::appletCreateGameMovieTrimmer(srv_out, tmem); } -Result ReserveResourceForMovieOperation(void) { return ::appletReserveResourceForMovieOperation(); } -Result UnreserveResourceForMovieOperation(void) { return ::appletUnreserveResourceForMovieOperation(); } -Result GetMainAppletAvailableUsers(AccountUid *uids, s32 count, bool *flag, s32 *total_out) { return ::appletGetMainAppletAvailableUsers(uids, count, flag, total_out); } -Result SetApplicationMemoryReservation(u64 val) { return ::appletSetApplicationMemoryReservation(val); } -Result ShouldSetGpuTimeSliceManually(bool *out) { return ::appletShouldSetGpuTimeSliceManually(out); } -Result BeginToWatchShortHomeButtonMessage(void) { return ::appletBeginToWatchShortHomeButtonMessage(); } -Result EndToWatchShortHomeButtonMessage(void) { return ::appletEndToWatchShortHomeButtonMessage(); } -Result GetApplicationIdForLogo(u64 *application_id) { return ::appletGetApplicationIdForLogo(application_id); } -Result SetGpuTimeSliceBoost(u64 val) { return ::appletSetGpuTimeSliceBoost(val); } -Result SetAutoSleepTimeAndDimmingTimeEnabled(bool flag) { return ::appletSetAutoSleepTimeAndDimmingTimeEnabled(flag); } -Result TerminateApplicationAndSetReason(Result reason) { return ::appletTerminateApplicationAndSetReason(reason); } -Result SetScreenShotPermissionGlobally(bool flag) { return ::appletSetScreenShotPermissionGlobally(flag); } -Result StartShutdownSequenceForOverlay(void) { return ::appletStartShutdownSequenceForOverlay(); } -Result StartRebootSequenceForOverlay(void) { return ::appletStartRebootSequenceForOverlay(); } -Result SetHealthWarningShowingState(bool flag) { return ::appletSetHealthWarningShowingState(flag); } -Result IsHealthWarningRequired(bool *out) { return ::appletIsHealthWarningRequired(out); } -Result BeginToObserveHidInputForDevelop(void) { return ::appletBeginToObserveHidInputForDevelop(); } -Result ReadThemeStorage(void* buffer, size_t size, u64 offset, u64 *transfer_size) { return ::appletReadThemeStorage(buffer, size, offset, transfer_size); } -Result WriteThemeStorage(const void* buffer, size_t size, u64 offset) { return ::appletWriteThemeStorage(buffer, size, offset); } -Result PushToAppletBoundChannel(AppletStorage *s) { return ::appletPushToAppletBoundChannel(s); } -Result TryPopFromAppletBoundChannel(AppletStorage *s) { return ::appletTryPopFromAppletBoundChannel(s); } -Result GetDisplayLogicalResolution(s32 *width, s32 *height) { return ::appletGetDisplayLogicalResolution(width, height); } -Result SetDisplayMagnification(float x, float y, float width, float height) { return ::appletSetDisplayMagnification(x, y, width, height); } -Result SetHomeButtonDoubleClickEnabled(bool flag) { return ::appletSetHomeButtonDoubleClickEnabled(flag); } -Result GetHomeButtonDoubleClickEnabled(bool *out) { return ::appletGetHomeButtonDoubleClickEnabled(out); } -Result IsHomeButtonShortPressedBlocked(bool *out) { return ::appletIsHomeButtonShortPressedBlocked(out); } -Result IsVrModeCurtainRequired(bool *out) { return ::appletIsVrModeCurtainRequired(out); } -Result SetCpuBoostRequestPriority(s32 priority) { return ::appletSetCpuBoostRequestPriority(priority); } -Result OpenMainApplication(AppletApplication *a) { return ::appletOpenMainApplication(a); } -Result PerformSystemButtonPressing(AppletSystemButtonType type) { return ::appletPerformSystemButtonPressing(type); } -Result InvalidateTransitionLayer(void) { return ::appletInvalidateTransitionLayer(); } -Result RequestLaunchApplicationWithUserAndArgumentForDebug(u64 application_id, const AccountUid *uids, s32 total_uids, bool flag, const void* buffer, size_t size) { return ::appletRequestLaunchApplicationWithUserAndArgumentForDebug(application_id, uids, total_uids, flag, buffer, size); } -Result GetAppletResourceUsageInfo(AppletResourceUsageInfo *info) { return ::appletGetAppletResourceUsageInfo(info); } -Result PushToAppletBoundChannelForDebug(AppletStorage *s, s32 channel) { return ::appletPushToAppletBoundChannelForDebug(s, channel); } -Result TryPopFromAppletBoundChannelForDebug(AppletStorage *s, s32 channel) { return ::appletTryPopFromAppletBoundChannelForDebug(s, channel); } -Result AlarmSettingNotificationEnableAppEventReserve(AppletStorage *s, u64 application_id) { return ::appletAlarmSettingNotificationEnableAppEventReserve(s, application_id); } -Result AlarmSettingNotificationDisableAppEventReserve(void) { return ::appletAlarmSettingNotificationDisableAppEventReserve(); } -Result AlarmSettingNotificationPushAppEventNotify(const void* buffer, u64 size) { return ::appletAlarmSettingNotificationPushAppEventNotify(buffer, size); } -Result FriendInvitationSetApplicationParameter(AppletStorage *s, u64 application_id) { return ::appletFriendInvitationSetApplicationParameter(s, application_id); } -Result FriendInvitationClearApplicationParameter(void) { return ::appletFriendInvitationClearApplicationParameter(); } -Result FriendInvitationPushApplicationParameter(AccountUid uid, const void* buffer, u64 size) { return ::appletFriendInvitationPushApplicationParameter(uid, buffer, size); } -Result CreateGeneralStorageForDebug(u64 id, u64 size) { return ::appletCreateGeneralStorageForDebug(id, size); } -Result ReadGeneralStorageForDebug(void* buffer, size_t size, u64 id, u64 offset, u64 *out_size) { return ::appletReadGeneralStorageForDebug(buffer, size, id, offset, out_size); } -Result WriteGeneralStorageForDebug(const void* buffer, size_t size, u64 id, u64 offset) { return ::appletWriteGeneralStorageForDebug(buffer, size, id, offset); } -Result SetTerminateResult(Result res) { return ::appletSetTerminateResult(res); } -Result GetLaunchStorageInfoForDebug(NcmStorageId *app_storageId, NcmStorageId *update_storageId) { return ::appletGetLaunchStorageInfoForDebug(app_storageId, update_storageId); } -Result GetGpuErrorDetectedSystemEvent(Event *out_event) { return ::appletGetGpuErrorDetectedSystemEvent(out_event); } -Result SetHandlingHomeButtonShortPressedEnabled(bool flag) { return ::appletSetHandlingHomeButtonShortPressedEnabled(flag); } -AppletInfo * GetAppletInfo(void) { return ::appletGetAppletInfo(); } -Event * GetMessageEvent(void) { return ::appletGetMessageEvent(); } -Result GetMessage(u32 *msg) { return ::appletGetMessage(msg); } -bool ProcessMessage(u32 msg) { return ::appletProcessMessage(msg); } -bool MainLoop(void) { return ::appletMainLoop(); } -void Hook(AppletHookCookie* cookie, AppletHookFn callback, void* param) { ::appletHook(cookie, callback, param); } -void Unhook(AppletHookCookie* cookie) { ::appletUnhook(cookie); } -AppletOperationMode GetOperationMode(void) { return ::appletGetOperationMode(); } -ApmPerformanceMode GetPerformanceMode(void) { return ::appletGetPerformanceMode(); } -AppletFocusState GetFocusState(void) { return ::appletGetFocusState(); } -Result SetFocusHandlingMode(AppletFocusHandlingMode mode) { return ::appletSetFocusHandlingMode(mode); } - -} // namespace applet - -namespace arm { - -void DCacheFlush(void* addr, size_t size) { ::armDCacheFlush(addr, size); } -void DCacheClean(void* addr, size_t size) { ::armDCacheClean(addr, size); } -void ICacheInvalidate(void* addr, size_t size) { ::armICacheInvalidate(addr, size); } -void DCacheZero(void* addr, size_t size) { ::armDCacheZero(addr, size); } -u64 GetSystemTick(void) { return ::armGetSystemTick(); } -u64 GetSystemTickFreq(void) { return ::armGetSystemTickFreq(); } -u64 NsToTicks(u64 ns) { return ::armNsToTicks(ns); } -u64 TicksToNs(u64 tick) { return ::armTicksToNs(tick); } -void* GetTls(void) { return ::armGetTls(); } - -} // namespace arm - -namespace async { - -void ValueClose(AsyncValue *a) { ::asyncValueClose(a); } -Result ValueWait(AsyncValue *a, u64 timeout) { return ::asyncValueWait(a, timeout); } -Result ValueGetSize(AsyncValue *a, u64 *size) { return ::asyncValueGetSize(a, size); } -Result ValueGet(AsyncValue *a, void* buffer, size_t size) { return ::asyncValueGet(a, buffer, size); } -Result ValueCancel(AsyncValue *a) { return ::asyncValueCancel(a); } -Result ValueGetErrorContext(AsyncValue *a, ErrorContext *context) { return ::asyncValueGetErrorContext(a, context); } -void ResultClose(AsyncResult *a) { ::asyncResultClose(a); } -Result ResultWait(AsyncResult *a, u64 timeout) { return ::asyncResultWait(a, timeout); } -Result ResultGet(AsyncResult *a) { return ::asyncResultGet(a); } -Result ResultCancel(AsyncResult *a) { return ::asyncResultCancel(a); } -Result ResultGetErrorContext(AsyncResult *a, ErrorContext *context) { return ::asyncResultGetErrorContext(a, context); } - -} // namespace async - -namespace auda { - -Result Initialize(void) { return ::audaInitialize(); } -void Exit(void) { ::audaExit(); } -Service* GetServiceSession(void) { return ::audaGetServiceSession(); } -Result RequestSuspendAudio(u64 pid, u64 delay) { return ::audaRequestSuspendAudio(pid, delay); } -Result RequestResumeAudio(u64 pid, u64 delay) { return ::audaRequestResumeAudio(pid, delay); } -Result GetAudioOutputProcessMasterVolume(u64 pid, float* volume_out) { return ::audaGetAudioOutputProcessMasterVolume(pid, volume_out); } -Result SetAudioOutputProcessMasterVolume(u64 pid, u64 delay, float volume) { return ::audaSetAudioOutputProcessMasterVolume(pid, delay, volume); } -Result GetAudioInputProcessMasterVolume(u64 pid, float* volume_out) { return ::audaGetAudioInputProcessMasterVolume(pid, volume_out); } -Result SetAudioInputProcessMasterVolume(u64 pid, u64 delay, float volume) { return ::audaSetAudioInputProcessMasterVolume(pid, delay, volume); } -Result GetAudioOutputProcessRecordVolume(u64 pid, float* volume_out) { return ::audaGetAudioOutputProcessRecordVolume(pid, volume_out); } -Result SetAudioOutputProcessRecordVolume(u64 pid, u64 delay, float volume) { return ::audaSetAudioOutputProcessRecordVolume(pid, delay, volume); } - -} // namespace auda - -namespace audctl { - -Result Initialize(void) { return ::audctlInitialize(); } -void Exit(void) { ::audctlExit(); } -Service* GetServiceSession(void) { return ::audctlGetServiceSession(); } -Result GetTargetVolume(s32* volume_out, AudioTarget target) { return ::audctlGetTargetVolume(volume_out, target); } -Result SetTargetVolume(AudioTarget target, s32 volume) { return ::audctlSetTargetVolume(target, volume); } -Result GetTargetVolumeMin(s32* volume_out) { return ::audctlGetTargetVolumeMin(volume_out); } -Result GetTargetVolumeMax(s32* volume_out) { return ::audctlGetTargetVolumeMax(volume_out); } -Result IsTargetMute(bool* mute_out, AudioTarget target) { return ::audctlIsTargetMute(mute_out, target); } -Result SetTargetMute(AudioTarget target, bool mute) { return ::audctlSetTargetMute(target, mute); } -Result IsTargetConnected(bool* connected_out, AudioTarget target) { return ::audctlIsTargetConnected(connected_out, target); } -Result SetDefaultTarget(AudioTarget target, u64 fade_in_ns, u64 fade_out_ns) { return ::audctlSetDefaultTarget(target, fade_in_ns, fade_out_ns); } -Result GetDefaultTarget(AudioTarget* target_out) { return ::audctlGetDefaultTarget(target_out); } -Result GetAudioOutputMode(AudioOutputMode* mode_out, AudioTarget target) { return ::audctlGetAudioOutputMode(mode_out, target); } -Result SetAudioOutputMode(AudioTarget target, AudioOutputMode mode) { return ::audctlSetAudioOutputMode(target, mode); } -Result SetForceMutePolicy(AudioForceMutePolicy policy) { return ::audctlSetForceMutePolicy(policy); } -Result GetForceMutePolicy(AudioForceMutePolicy* policy_out) { return ::audctlGetForceMutePolicy(policy_out); } -Result GetOutputModeSetting(AudioOutputMode* mode_out, AudioTarget target) { return ::audctlGetOutputModeSetting(mode_out, target); } -Result SetOutputModeSetting(AudioTarget target, AudioOutputMode mode) { return ::audctlSetOutputModeSetting(target, mode); } -Result SetOutputTarget(AudioTarget target) { return ::audctlSetOutputTarget(target); } -Result SetInputTargetForceEnabled(bool enable) { return ::audctlSetInputTargetForceEnabled(enable); } -Result SetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode mode) { return ::audctlSetHeadphoneOutputLevelMode(mode); } -Result GetHeadphoneOutputLevelMode(AudioHeadphoneOutputLevelMode* mode_out) { return ::audctlGetHeadphoneOutputLevelMode(mode_out); } -Result AcquireAudioVolumeUpdateEventForPlayReport(Event* event_out) { return ::audctlAcquireAudioVolumeUpdateEventForPlayReport(event_out); } -Result AcquireAudioOutputDeviceUpdateEventForPlayReport(Event* event_out) { return ::audctlAcquireAudioOutputDeviceUpdateEventForPlayReport(event_out); } -Result GetAudioOutputTargetForPlayReport(AudioTarget* target_out) { return ::audctlGetAudioOutputTargetForPlayReport(target_out); } -Result NotifyHeadphoneVolumeWarningDisplayedEvent(void) { return ::audctlNotifyHeadphoneVolumeWarningDisplayedEvent(); } -Result SetSystemOutputMasterVolume(float volume) { return ::audctlSetSystemOutputMasterVolume(volume); } -Result GetSystemOutputMasterVolume(float* volume_out) { return ::audctlGetSystemOutputMasterVolume(volume_out); } -Result GetActiveOutputTarget(AudioTarget* target) { return ::audctlGetActiveOutputTarget(target); } - -} // namespace audctl - -namespace audd { - -Result Initialize(void) { return ::auddInitialize(); } -void Exit(void) { ::auddExit(); } -Service* GetServiceSession(void) { return ::auddGetServiceSession(); } -Result RequestSuspendAudioForDebug(u64 pid, u64 delay) { return ::auddRequestSuspendAudioForDebug(pid, delay); } -Result RequestResumeAudioForDebug(u64 pid, u64 delay) { return ::auddRequestResumeAudioForDebug(pid, delay); } - -} // namespace audd - -namespace auddev { - -Result Initialize(void) { return ::auddevInitialize(); } -void Exit(void) { ::auddevExit(); } -Service* GetServiceSession(void) { return ::auddevGetServiceSession(); } -Result ListAudioDeviceName(AudioDeviceName *DeviceNames, s32 max_names, s32 *total_names) { return ::auddevListAudioDeviceName(DeviceNames, max_names, total_names); } -Result SetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float volume) { return ::auddevSetAudioDeviceOutputVolume(DeviceName, volume); } -Result GetAudioDeviceOutputVolume(const AudioDeviceName *DeviceName, float *volume) { return ::auddevGetAudioDeviceOutputVolume(DeviceName, volume); } -Result GetActiveAudioDeviceName(AudioDeviceName *DeviceName) { return ::auddevGetActiveAudioDeviceName(DeviceName); } - -} // namespace auddev - -namespace audin { - -Result Initialize(void) { return ::audinInitialize(); } -void Exit(void) { ::audinExit(); } -Service* GetServiceSession(void) { return ::audinGetServiceSession(); } -Service* GetServiceSession_AudioIn(void) { return ::audinGetServiceSession_AudioIn(); } -Result ListAudioIns(char *DeviceNames, s32 count, u32 *DeviceNamesCount) { return ::audinListAudioIns(DeviceNames, count, DeviceNamesCount); } -Result OpenAudioIn(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioInState *State) { return ::audinOpenAudioIn(DeviceNameIn, DeviceNameOut, SampleRateIn, ChannelCountIn, SampleRateOut, ChannelCountOut, Format, State); } -Result GetAudioInState(AudioInState *State) { return ::audinGetAudioInState(State); } -Result StartAudioIn(void) { return ::audinStartAudioIn(); } -Result StopAudioIn(void) { return ::audinStopAudioIn(); } -Result AppendAudioInBuffer(AudioInBuffer *Buffer) { return ::audinAppendAudioInBuffer(Buffer); } -Result GetReleasedAudioInBuffer(AudioInBuffer **Buffer, u32 *ReleasedBuffersCount) { return ::audinGetReleasedAudioInBuffer(Buffer, ReleasedBuffersCount); } -Result ContainsAudioInBuffer(AudioInBuffer *Buffer, bool *ContainsBuffer) { return ::audinContainsAudioInBuffer(Buffer, ContainsBuffer); } -Result CaptureBuffer(AudioInBuffer *source, AudioInBuffer **released) { return ::audinCaptureBuffer(source, released); } -Result WaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout) { return ::audinWaitCaptureFinish(released, released_count, timeout); } -u32 GetSampleRate(void) { return ::audinGetSampleRate(); } -u32 GetChannelCount(void) { return ::audinGetChannelCount(); } -PcmFormat GetPcmFormat(void) { return ::audinGetPcmFormat(); } -AudioInState GetDeviceState(void) { return ::audinGetDeviceState(); } - -} // namespace audin - -namespace audout { - -Result Initialize(void) { return ::audoutInitialize(); } -void Exit(void) { ::audoutExit(); } -Service* GetServiceSession(void) { return ::audoutGetServiceSession(); } -Service* GetServiceSession_AudioOut(void) { return ::audoutGetServiceSession_AudioOut(); } -Result ListAudioOuts(char *DeviceNames, s32 count, u32 *DeviceNamesCount) { return ::audoutListAudioOuts(DeviceNames, count, DeviceNamesCount); } -Result OpenAudioOut(const char *DeviceNameIn, char *DeviceNameOut, u32 SampleRateIn, u32 ChannelCountIn, u32 *SampleRateOut, u32 *ChannelCountOut, PcmFormat *Format, AudioOutState *State) { return ::audoutOpenAudioOut(DeviceNameIn, DeviceNameOut, SampleRateIn, ChannelCountIn, SampleRateOut, ChannelCountOut, Format, State); } -Result GetAudioOutState(AudioOutState *State) { return ::audoutGetAudioOutState(State); } -Result StartAudioOut(void) { return ::audoutStartAudioOut(); } -Result StopAudioOut(void) { return ::audoutStopAudioOut(); } -Result AppendAudioOutBuffer(AudioOutBuffer *Buffer) { return ::audoutAppendAudioOutBuffer(Buffer); } -Result GetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount) { return ::audoutGetReleasedAudioOutBuffer(Buffer, ReleasedBuffersCount); } -Result ContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer) { return ::audoutContainsAudioOutBuffer(Buffer, ContainsBuffer); } -Result GetAudioOutBufferCount(u32 *count) { return ::audoutGetAudioOutBufferCount(count); } -Result GetAudioOutPlayedSampleCount(u64 *count) { return ::audoutGetAudioOutPlayedSampleCount(count); } -Result FlushAudioOutBuffers(bool *flushed) { return ::audoutFlushAudioOutBuffers(flushed); } -Result SetAudioOutVolume(float volume) { return ::audoutSetAudioOutVolume(volume); } -Result GetAudioOutVolume(float *volume) { return ::audoutGetAudioOutVolume(volume); } -Result PlayBuffer(AudioOutBuffer *source, AudioOutBuffer **released) { return ::audoutPlayBuffer(source, released); } -Result WaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout) { return ::audoutWaitPlayFinish(released, released_count, timeout); } -u32 GetSampleRate(void) { return ::audoutGetSampleRate(); } -u32 GetChannelCount(void) { return ::audoutGetChannelCount(); } -PcmFormat GetPcmFormat(void) { return ::audoutGetPcmFormat(); } -AudioOutState GetDeviceState(void) { return ::audoutGetDeviceState(); } - -} // namespace audout - -namespace audouta { - -Result Initialize(void) { return ::audoutaInitialize(); } -void Exit(void) { ::audoutaExit(); } -Service* GetServiceSession(void) { return ::audoutaGetServiceSession(); } -Result RequestSuspend(u64 pid, u64 delay) { return ::audoutaRequestSuspend(pid, delay); } -Result RequestResume(u64 pid, u64 delay) { return ::audoutaRequestResume(pid, delay); } -Result GetProcessMasterVolume(u64 pid, float* volume_out) { return ::audoutaGetProcessMasterVolume(pid, volume_out); } -Result SetProcessMasterVolume(u64 pid, u64 delay, float volume) { return ::audoutaSetProcessMasterVolume(pid, delay, volume); } -Result GetProcessRecordVolume(u64 pid, float* volume_out) { return ::audoutaGetProcessRecordVolume(pid, volume_out); } -Result SetProcessRecordVolume(u64 pid, u64 delay, float volume) { return ::audoutaSetProcessRecordVolume(pid, delay, volume); } - -} // namespace audouta - -namespace audoutd { - -Result Initialize(void) { return ::audoutdInitialize(); } -void Exit(void) { ::audoutdExit(); } -Service* GetServiceSession(void) { return ::audoutdGetServiceSession(); } -Result RequestSuspendForDebug(u64 pid, u64 delay) { return ::audoutdRequestSuspendForDebug(pid, delay); } -Result RequestResumeForDebug(u64 pid, u64 delay) { return ::audoutdRequestResumeForDebug(pid, delay); } - -} // namespace audoutd - -namespace audrec { - -Result Initialize(void) { return ::audrecInitialize(); } -void Exit(void) { ::audrecExit(); } -Service* GetServiceSession(void) { return ::audrecGetServiceSession(); } -Result OpenFinalOutputRecorder(AudrecRecorder* recorder_out, FinalOutputRecorderParameter* param_in, u64 aruid, FinalOutputRecorderParameterInternal* param_out) { return ::audrecOpenFinalOutputRecorder(recorder_out, param_in, aruid, param_out); } -Result RecorderStart(AudrecRecorder* recorder) { return ::audrecRecorderStart(recorder); } -Result RecorderStop(AudrecRecorder* recorder) { return ::audrecRecorderStop(recorder); } -Result RecorderRegisterBufferEvent(AudrecRecorder* recorder, Event* out_event) { return ::audrecRecorderRegisterBufferEvent(recorder, out_event); } -Result RecorderAppendFinalOutputRecorderBuffer(AudrecRecorder* recorder, u64 buffer_client_ptr, FinalOutputRecorderBuffer* param) { return ::audrecRecorderAppendFinalOutputRecorderBuffer(recorder, buffer_client_ptr, param); } -Result RecorderGetReleasedFinalOutputRecorderBuffers(AudrecRecorder* recorder, u64* out_buffers, u64* inout_count, u64* out_released) { return ::audrecRecorderGetReleasedFinalOutputRecorderBuffers(recorder, out_buffers, inout_count, out_released); } -void RecorderClose(AudrecRecorder* recorder) { ::audrecRecorderClose(recorder); } - -} // namespace audrec - -namespace audren { - -u32 GetRevision(void) { return ::audrenGetRevision(); } -int GetMemPoolCount(const AudioRendererConfig* config) { return ::audrenGetMemPoolCount(config); } -size_t GetInputParamSize(const AudioRendererConfig* config) { return ::audrenGetInputParamSize(config); } -size_t GetOutputParamSize(const AudioRendererConfig* config) { return ::audrenGetOutputParamSize(config); } -Result Initialize(const AudioRendererConfig* config) { return ::audrenInitialize(config); } -void Exit(void) { ::audrenExit(); } -Service* GetServiceSession_AudioRenderer(void) { return ::audrenGetServiceSession_AudioRenderer(); } -Event* GetFrameEvent(void) { return ::audrenGetFrameEvent(); } -void WaitFrame(void) { ::audrenWaitFrame(); } -Result GetState(u32* out_state) { return ::audrenGetState(out_state); } -Result RequestUpdateAudioRenderer(const void* in_param_buf, size_t in_param_buf_size, void* out_param_buf, size_t out_param_buf_size, void* perf_buf, size_t perf_buf_size) { return ::audrenRequestUpdateAudioRenderer(in_param_buf, in_param_buf_size, out_param_buf, out_param_buf_size, perf_buf, perf_buf_size); } -Result StartAudioRenderer(void) { return ::audrenStartAudioRenderer(); } -Result StopAudioRenderer(void) { return ::audrenStopAudioRenderer(); } -Result SetAudioRendererRenderingTimeLimit(int percent) { return ::audrenSetAudioRendererRenderingTimeLimit(percent); } - -} // namespace audren - -namespace audrv { - -Result Create(AudioDriver* d, const AudioRendererConfig* config, int num_final_mix_channels) { return ::audrvCreate(d, config, num_final_mix_channels); } -Result Update(AudioDriver* d) { return ::audrvUpdate(d); } -void Close(AudioDriver* d) { ::audrvClose(d); } -int MemPoolAdd(AudioDriver* d, void* buffer, size_t size) { return ::audrvMemPoolAdd(d, buffer, size); } -bool MemPoolRemove(AudioDriver* d, int id) { return ::audrvMemPoolRemove(d, id); } -bool MemPoolAttach(AudioDriver* d, int id) { return ::audrvMemPoolAttach(d, id); } -bool MemPoolDetach(AudioDriver* d, int id) { return ::audrvMemPoolDetach(d, id); } -bool VoiceInit(AudioDriver* d, int id, int num_channels, PcmFormat format, int sample_rate) { return ::audrvVoiceInit(d, id, num_channels, format, sample_rate); } -void VoiceDrop(AudioDriver* d, int id) { ::audrvVoiceDrop(d, id); } -void VoiceStop(AudioDriver* d, int id) { ::audrvVoiceStop(d, id); } -bool VoiceIsPaused(AudioDriver* d, int id) { return ::audrvVoiceIsPaused(d, id); } -bool VoiceIsPlaying(AudioDriver* d, int id) { return ::audrvVoiceIsPlaying(d, id); } -bool VoiceAddWaveBuf(AudioDriver* d, int id, AudioDriverWaveBuf* wavebuf) { return ::audrvVoiceAddWaveBuf(d, id, wavebuf); } -u32 VoiceGetWaveBufSeq(AudioDriver* d, int id) { return ::audrvVoiceGetWaveBufSeq(d, id); } -u32 VoiceGetPlayedSampleCount(AudioDriver* d, int id) { return ::audrvVoiceGetPlayedSampleCount(d, id); } -u32 VoiceGetVoiceDropsCount(AudioDriver* d, int id) { return ::audrvVoiceGetVoiceDropsCount(d, id); } -void VoiceSetBiquadFilter(AudioDriver* d, int id, int biquad_id, float a0, float a1, float a2, float b0, float b1, float b2) { ::audrvVoiceSetBiquadFilter(d, id, biquad_id, a0, a1, a2, b0, b1, b2); } -void VoiceSetExtraParams(AudioDriver* d, int id, const void* params, size_t params_size) { ::audrvVoiceSetExtraParams(d, id, params, params_size); } -void VoiceSetDestinationMix(AudioDriver* d, int id, int mix_id) { ::audrvVoiceSetDestinationMix(d, id, mix_id); } -void VoiceSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id) { ::audrvVoiceSetMixFactor(d, id, factor, src_channel_id, dest_channel_id); } -void VoiceSetVolume(AudioDriver* d, int id, float volume) { ::audrvVoiceSetVolume(d, id, volume); } -void VoiceSetPitch(AudioDriver* d, int id, float pitch) { ::audrvVoiceSetPitch(d, id, pitch); } -void VoiceSetPriority(AudioDriver* d, int id, int priority) { ::audrvVoiceSetPriority(d, id, priority); } -void VoiceClearBiquadFilter(AudioDriver* d, int id, int biquad_id) { ::audrvVoiceClearBiquadFilter(d, id, biquad_id); } -void VoiceSetPaused(AudioDriver* d, int id, bool paused) { ::audrvVoiceSetPaused(d, id, paused); } -void VoiceStart(AudioDriver* d, int id) { ::audrvVoiceStart(d, id); } -int MixAdd(AudioDriver* d, int sample_rate, int num_channels) { return ::audrvMixAdd(d, sample_rate, num_channels); } -void MixRemove(AudioDriver* d, int id) { ::audrvMixRemove(d, id); } -void MixSetDestinationMix(AudioDriver* d, int id, int mix_id) { ::audrvMixSetDestinationMix(d, id, mix_id); } -void MixSetMixFactor(AudioDriver* d, int id, float factor, int src_channel_id, int dest_channel_id) { ::audrvMixSetMixFactor(d, id, factor, src_channel_id, dest_channel_id); } -void MixSetVolume(AudioDriver* d, int id, float volume) { ::audrvMixSetVolume(d, id, volume); } -int DeviceSinkAdd(AudioDriver* d, const char* device_name, int num_channels, const u8* channel_ids) { return ::audrvDeviceSinkAdd(d, device_name, num_channels, channel_ids); } -void SinkRemove(AudioDriver* d, int id) { ::audrvSinkRemove(d, id); } - -} // namespace audrv - -namespace avm { - -Result Initialize(void) { return ::avmInitialize(); } -void Exit(void) { ::avmExit(); } -Service * GetServiceSession(void) { return ::avmGetServiceSession(); } -Result GetHighestAvailableVersion(u64 id_1, u64 id_2, u32 *version) { return ::avmGetHighestAvailableVersion(id_1, id_2, version); } -Result GetHighestRequiredVersion(u64 id_1, u64 id_2, u32 *version) { return ::avmGetHighestRequiredVersion(id_1, id_2, version); } -Result GetVersionListEntry(u64 application_id, AvmVersionListEntry *entry) { return ::avmGetVersionListEntry(application_id, entry); } -Result GetVersionListImporter(AvmVersionListImporter *out) { return ::avmGetVersionListImporter(out); } -Result GetLaunchRequiredVersion(u64 application_id, u32 *version) { return ::avmGetLaunchRequiredVersion(application_id, version); } -Result UpgradeLaunchRequiredVersion(u64 application_id, u32 version) { return ::avmUpgradeLaunchRequiredVersion(application_id, version); } -Result PushLaunchVersion(u64 application_id, u32 version) { return ::avmPushLaunchVersion(application_id, version); } -Result ListVersionList(AvmVersionListEntry *buffer, size_t count, u32 *out) { return ::avmListVersionList(buffer, count, out); } -Result ListRequiredVersion(AvmRequiredVersionEntry *buffer, size_t count, u32 *out) { return ::avmListRequiredVersion(buffer, count, out); } -void VersionListImporterClose(AvmVersionListImporter *srv) { ::avmVersionListImporterClose(srv); } -Result VersionListImporterSetTimestamp(AvmVersionListImporter *srv, u64 timestamp) { return ::avmVersionListImporterSetTimestamp(srv, timestamp); } -Result VersionListImporterSetData(AvmVersionListImporter *srv, const AvmVersionListEntry *entries, u32 count) { return ::avmVersionListImporterSetData(srv, entries, count); } -Result VersionListImporterFlush(AvmVersionListImporter *srv) { return ::avmVersionListImporterFlush(srv); } - -} // namespace avm - -namespace barrier { - -void Init(Barrier *b, u64 thread_count) { ::barrierInit(b, thread_count); } -void Wait(Barrier *b) { ::barrierWait(b); } - -} // namespace barrier - -namespace binder { - -void Create(Binder* b, s32 id) { ::binderCreate(b, id); } -void Close(Binder* b) { ::binderClose(b); } -Result InitSession(Binder* b, Service* relay) { return ::binderInitSession(b, relay); } -Result TransactParcel(Binder* b, u32 code, void* parcel_data, size_t parcel_data_size, void* parcel_reply, size_t parcel_reply_size, u32 flags) { return ::binderTransactParcel(b, code, parcel_data, parcel_data_size, parcel_reply, parcel_reply_size, flags); } -Result ConvertErrorCode(s32 code) { return ::binderConvertErrorCode(code); } -Result AdjustRefcount(Binder* b, s32 addval, s32 type) { return ::binderAdjustRefcount(b, addval, type); } -Result GetNativeHandle(Binder* b, u32 unk0, Event *event_out) { return ::binderGetNativeHandle(b, unk0, event_out); } -Result IncreaseWeakRef(Binder* b) { return ::binderIncreaseWeakRef(b); } -Result DecreaseWeakRef(Binder* b) { return ::binderDecreaseWeakRef(b); } -Result IncreaseStrongRef(Binder* b) { return ::binderIncreaseStrongRef(b); } -Result DecreaseStrongRef(Binder* b) { return ::binderDecreaseStrongRef(b); } - -} // namespace binder - -namespace bpc { - -Result Initialize(void) { return ::bpcInitialize(); } -void Exit(void) { ::bpcExit(); } -Service* GetServiceSession(void) { return ::bpcGetServiceSession(); } -Result ShutdownSystem(void) { return ::bpcShutdownSystem(); } -Result RebootSystem(void) { return ::bpcRebootSystem(); } -Result GetSleepButtonState(BpcSleepButtonState *out) { return ::bpcGetSleepButtonState(out); } -Result GetPowerButton(bool* out_is_pushed) { return ::bpcGetPowerButton(out_is_pushed); } - -} // namespace bpc - -namespace bq { - -Result RequestBuffer(Binder *b, s32 bufferIdx, BqGraphicBuffer *buf) { return ::bqRequestBuffer(b, bufferIdx, buf); } -Result DequeueBuffer(Binder *b, bool async, u32 width, u32 height, s32 format, u32 usage, s32 *buf, NvMultiFence *fence) { return ::bqDequeueBuffer(b, async, width, height, format, usage, buf, fence); } -Result DetachBuffer(Binder *b, s32 slot) { return ::bqDetachBuffer(b, slot); } -Result QueueBuffer(Binder *b, s32 buf, const BqBufferInput *input, BqBufferOutput *output) { return ::bqQueueBuffer(b, buf, input, output); } -Result CancelBuffer(Binder *b, s32 buf, const NvMultiFence *fence) { return ::bqCancelBuffer(b, buf, fence); } -Result Query(Binder *b, s32 what, s32* value) { return ::bqQuery(b, what, value); } -Result Connect(Binder *b, s32 api, bool producerControlledByApp, BqBufferOutput *output) { return ::bqConnect(b, api, producerControlledByApp, output); } -Result Disconnect(Binder *b, s32 api) { return ::bqDisconnect(b, api); } -Result SetPreallocatedBuffer(Binder *b, s32 buf, const BqGraphicBuffer *input) { return ::bqSetPreallocatedBuffer(b, buf, input); } - -} // namespace bq - -namespace bt { - -Result Initialize(void) { return ::btInitialize(); } -void Exit(void) { ::btExit(); } -Service* GetServiceSession(void) { return ::btGetServiceSession(); } -Result LeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) { return ::btLeClientReadCharacteristic(connection_handle, is_primary, serv_id, char_id, auth_req); } -Result LeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) { return ::btLeClientReadDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, auth_req); } -Result LeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response) { return ::btLeClientWriteCharacteristic(connection_handle, is_primary, serv_id, char_id, buffer, size, auth_req, with_response); } -Result LeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req) { return ::btLeClientWriteDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, buffer, size, auth_req); } -Result LeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btLeClientRegisterNotification(connection_handle, is_primary, serv_id, char_id); } -Result LeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btLeClientDeregisterNotification(connection_handle, is_primary, serv_id, char_id); } -Result SetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size) { return ::btSetLeResponse(server_if, serv_uuid, char_uuid, buffer, size); } -Result LeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm) { return ::btLeSendIndication(server_if, serv_uuid, char_uuid, buffer, size, noconfirm); } -Result GetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { return ::btGetLeEventInfo(buffer, size, type); } -Result RegisterBleEvent(Event* out_event) { return ::btRegisterBleEvent(out_event); } - -} // namespace bt - -namespace btdev { - -Result Initialize(void) { return ::btdevInitialize(); } -void Exit(void) { ::btdevExit(); } -bool GattAttributeUuidIsSame(const BtdrvGattAttributeUuid *a, const BtdrvGattAttributeUuid *b) { return ::btdevGattAttributeUuidIsSame(a, b); } -Result AcquireBleScanEvent(Event* out_event) { return ::btdevAcquireBleScanEvent(out_event); } -Result GetBleScanParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out) { return ::btdevGetBleScanParameter(parameter_id, out); } -Result GetBleScanParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out) { return ::btdevGetBleScanParameter2(parameter_id, out); } -Result StartBleScanGeneral(BtdrvBleAdvertisePacketParameter param) { return ::btdevStartBleScanGeneral(param); } -Result StopBleScanGeneral(void) { return ::btdevStopBleScanGeneral(); } -Result GetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btdevGetBleScanResult(results, count, total_out); } -Result EnableBleAutoConnection(BtdrvBleAdvertisePacketParameter param) { return ::btdevEnableBleAutoConnection(param); } -Result DisableBleAutoConnection(void) { return ::btdevDisableBleAutoConnection(); } -Result StartBleScanSmartDevice(const BtdrvGattAttributeUuid *uuid) { return ::btdevStartBleScanSmartDevice(uuid); } -Result StopBleScanSmartDevice(void) { return ::btdevStopBleScanSmartDevice(); } -Result AcquireBleConnectionStateChangedEvent(Event* out_event) { return ::btdevAcquireBleConnectionStateChangedEvent(out_event); } -Result ConnectToGattServer(BtdrvAddress addr) { return ::btdevConnectToGattServer(addr); } -Result DisconnectFromGattServer(u32 connection_handle) { return ::btdevDisconnectFromGattServer(connection_handle); } -Result GetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) { return ::btdevGetBleConnectionInfoList(info, count, total_out); } -Result AcquireBleServiceDiscoveryEvent(Event* out_event) { return ::btdevAcquireBleServiceDiscoveryEvent(out_event); } -Result GetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out) { return ::btdevGetGattServices(connection_handle, services, count, total_out); } -Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag) { return ::btdevGetGattService(connection_handle, uuid, service, flag); } -Result AcquireBlePairingEvent(Event* out_event) { return ::btdevAcquireBlePairingEvent(out_event); } -Result PairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btdevPairGattServer(connection_handle, param); } -Result UnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btdevUnpairGattServer(connection_handle, param); } -Result UnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) { return ::btdevUnpairGattServer2(addr, param); } -Result GetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out) { return ::btdevGetPairedGattServerAddress(param, addrs, count, total_out); } -Result AcquireBleMtuConfigEvent(Event* out_event) { return ::btdevAcquireBleMtuConfigEvent(out_event); } -Result ConfigureBleMtu(u32 connection_handle, u16 mtu) { return ::btdevConfigureBleMtu(connection_handle, mtu); } -Result GetBleMtu(u32 connection_handle, u16 *out) { return ::btdevGetBleMtu(connection_handle, out); } -Result AcquireBleGattOperationEvent(Event* out_event) { return ::btdevAcquireBleGattOperationEvent(out_event); } -Result RegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid) { return ::btdevRegisterGattOperationNotification(uuid); } -Result UnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid) { return ::btdevUnregisterGattOperationNotification(uuid); } -Result GetGattOperationResult(BtdrvBleClientGattOperationInfo *out) { return ::btdevGetGattOperationResult(out); } -Result ReadGattCharacteristic(BtdevGattCharacteristic *c) { return ::btdevReadGattCharacteristic(c); } -Result WriteGattCharacteristic(BtdevGattCharacteristic *c) { return ::btdevWriteGattCharacteristic(c); } -Result EnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag) { return ::btdevEnableGattCharacteristicNotification(c, flag); } -Result ReadGattDescriptor(BtdevGattDescriptor *d) { return ::btdevReadGattDescriptor(d); } -Result WriteGattDescriptor(BtdevGattDescriptor *d) { return ::btdevWriteGattDescriptor(d); } -void GattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle) { ::btdevGattAttributeCreate(a, uuid, handle, connection_handle); } -u8 GattAttributeGetType(BtdevGattAttribute *a) { return ::btdevGattAttributeGetType(a); } -void GattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out) { ::btdevGattAttributeGetUuid(a, out); } -u16 GattAttributeGetHandle(BtdevGattAttribute *a) { return ::btdevGattAttributeGetHandle(a); } -u32 GattAttributeGetConnectionHandle(BtdevGattAttribute *a) { return ::btdevGattAttributeGetConnectionHandle(a); } -void GattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service) { ::btdevGattServiceCreate(s, uuid, handle, connection_handle, instance_id, end_group_handle, primary_service); } -u16 GattServiceGetInstanceId(BtdevGattService *s) { return ::btdevGattServiceGetInstanceId(s); } -u16 GattServiceGetEndGroupHandle(BtdevGattService *s) { return ::btdevGattServiceGetEndGroupHandle(s); } -u16 GattServiceIsPrimaryService(BtdevGattService *s) { return ::btdevGattServiceIsPrimaryService(s); } -Result GattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out) { return ::btdevGattServiceGetIncludedServices(s, services, count, total_out); } -Result GattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out) { return ::btdevGattServiceGetCharacteristics(s, characteristics, count, total_out); } -Result GattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag) { return ::btdevGattServiceGetCharacteristic(s, uuid, characteristic, flag); } -void GattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties) { ::btdevGattCharacteristicCreate(c, uuid, handle, connection_handle, instance_id, properties); } -u16 GattCharacteristicGetInstanceId(BtdevGattCharacteristic *c) { return ::btdevGattCharacteristicGetInstanceId(c); } -u8 GattCharacteristicGetProperties(BtdevGattCharacteristic *c) { return ::btdevGattCharacteristicGetProperties(c); } -Result GattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service) { return ::btdevGattCharacteristicGetService(c, service); } -Result GattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out) { return ::btdevGattCharacteristicGetDescriptors(c, descriptors, count, total_out); } -Result GattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag) { return ::btdevGattCharacteristicGetDescriptor(c, uuid, descriptor, flag); } -void GattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size) { ::btdevGattCharacteristicSetValue(c, buffer, size); } -u64 GattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size) { return ::btdevGattCharacteristicGetValue(c, buffer, size); } -void GattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle) { ::btdevGattDescriptorCreate(d, uuid, handle, connection_handle); } -Result GattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service) { return ::btdevGattDescriptorGetService(d, service); } -Result GattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic) { return ::btdevGattDescriptorGetCharacteristic(d, characteristic); } -void GattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size) { ::btdevGattDescriptorSetValue(d, buffer, size); } -u64 GattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size) { return ::btdevGattDescriptorGetValue(d, buffer, size); } - -} // namespace btdev - -namespace btdrv { - -Result Initialize(void) { return ::btdrvInitialize(); } -void Exit(void) { ::btdrvExit(); } -Service* GetServiceSession(void) { return ::btdrvGetServiceSession(); } -Result InitializeBluetooth(Event* out_event) { return ::btdrvInitializeBluetooth(out_event); } -Result EnableBluetooth(void) { return ::btdrvEnableBluetooth(); } -Result DisableBluetooth(void) { return ::btdrvDisableBluetooth(); } -Result FinalizeBluetooth(void) { return ::btdrvFinalizeBluetooth(); } -Result LegacyGetAdapterProperties(BtdrvAdapterPropertyOld *properties) { return ::btdrvLegacyGetAdapterProperties(properties); } -Result GetAdapterProperties(BtdrvAdapterPropertySet *properties) { return ::btdrvGetAdapterProperties(properties); } -Result LegacyGetAdapterProperty(BtdrvBluetoothPropertyType type, void* buffer, size_t size) { return ::btdrvLegacyGetAdapterProperty(type, buffer, size); } -Result GetAdapterProperty(BtdrvAdapterPropertyType type, BtdrvAdapterProperty *property) { return ::btdrvGetAdapterProperty(type, property); } -Result LegacySetAdapterProperty(BtdrvBluetoothPropertyType type, const void* buffer, size_t size) { return ::btdrvLegacySetAdapterProperty(type, buffer, size); } -Result SetAdapterProperty(BtdrvAdapterPropertyType type, const BtdrvAdapterProperty *property) { return ::btdrvSetAdapterProperty(type, property); } -Result LegacyStartInquiry(void) { return ::btdrvLegacyStartInquiry(); } -Result StartInquiry(u32 services, s64 duration) { return ::btdrvStartInquiry(services, duration); } -Result StopInquiry(void) { return ::btdrvStopInquiry(); } -Result CreateBond(BtdrvAddress addr, u32 type) { return ::btdrvCreateBond(addr, type); } -Result RemoveBond(BtdrvAddress addr) { return ::btdrvRemoveBond(addr); } -Result CancelBond(BtdrvAddress addr) { return ::btdrvCancelBond(addr); } -Result LegacyRespondToPinRequest(BtdrvAddress addr, bool flag, const BtdrvBluetoothPinCode *pin_code, u8 length) { return ::btdrvLegacyRespondToPinRequest(addr, flag, pin_code, length); } -Result RespondToPinRequest(BtdrvAddress addr, const BtdrvPinCode *pin_code) { return ::btdrvRespondToPinRequest(addr, pin_code); } -Result RespondToSspRequest(BtdrvAddress addr, u32 variant, bool accept, u32 passkey) { return ::btdrvRespondToSspRequest(addr, variant, accept, passkey); } -Result GetEventInfo(void* buffer, size_t size, BtdrvEventType *type) { return ::btdrvGetEventInfo(buffer, size, type); } -Result InitializeHid(Event* out_event) { return ::btdrvInitializeHid(out_event); } -Result OpenHidConnection(BtdrvAddress addr) { return ::btdrvOpenHidConnection(addr); } -Result CloseHidConnection(BtdrvAddress addr) { return ::btdrvCloseHidConnection(addr); } -Result WriteHidData(BtdrvAddress addr, const BtdrvHidReport *buffer) { return ::btdrvWriteHidData(addr, buffer); } -Result WriteHidData2(BtdrvAddress addr, const void* buffer, size_t size) { return ::btdrvWriteHidData2(addr, buffer, size); } -Result SetHidReport(BtdrvAddress addr, BtdrvBluetoothHhReportType type, const BtdrvHidReport *buffer) { return ::btdrvSetHidReport(addr, type, buffer); } -Result GetHidReport(BtdrvAddress addr, u8 report_id, BtdrvBluetoothHhReportType type) { return ::btdrvGetHidReport(addr, report_id, type); } -Result TriggerConnection(BtdrvAddress addr, u16 timeout) { return ::btdrvTriggerConnection(addr, timeout); } -Result AddPairedDeviceInfo(const SetSysBluetoothDevicesSettings *settings) { return ::btdrvAddPairedDeviceInfo(settings); } -Result GetPairedDeviceInfo(BtdrvAddress addr, SetSysBluetoothDevicesSettings *settings) { return ::btdrvGetPairedDeviceInfo(addr, settings); } -Result FinalizeHid(void) { return ::btdrvFinalizeHid(); } -Result GetHidEventInfo(void* buffer, size_t size, BtdrvHidEventType *type) { return ::btdrvGetHidEventInfo(buffer, size, type); } -Result SetTsi(BtdrvAddress addr, u8 tsi) { return ::btdrvSetTsi(addr, tsi); } -Result EnableBurstMode(BtdrvAddress addr, bool flag) { return ::btdrvEnableBurstMode(addr, flag); } -Result SetZeroRetransmission(BtdrvAddress addr, u8 *report_ids, u8 count) { return ::btdrvSetZeroRetransmission(addr, report_ids, count); } -Result EnableMcMode(bool flag) { return ::btdrvEnableMcMode(flag); } -Result EnableLlrScan(void) { return ::btdrvEnableLlrScan(); } -Result DisableLlrScan(void) { return ::btdrvDisableLlrScan(); } -Result EnableRadio(bool flag) { return ::btdrvEnableRadio(flag); } -Result SetVisibility(bool inquiry_scan, bool page_scan) { return ::btdrvSetVisibility(inquiry_scan, page_scan); } -Result EnableTbfcScan(bool flag) { return ::btdrvEnableTbfcScan(flag); } -Result RegisterHidReportEvent(Event* out_event) { return ::btdrvRegisterHidReportEvent(out_event); } -Result GetHidReportEventInfo(void* buffer, size_t size, BtdrvHidEventType *type) { return ::btdrvGetHidReportEventInfo(buffer, size, type); } -void* GetHidReportEventInfoSharedmemAddr(void) { return ::btdrvGetHidReportEventInfoSharedmemAddr(); } -Result GetLatestPlr(BtdrvPlrList *out) { return ::btdrvGetLatestPlr(out); } -Result GetPendingConnections(void) { return ::btdrvGetPendingConnections(); } -Result GetChannelMap(BtdrvChannelMapList *out) { return ::btdrvGetChannelMap(out); } -Result EnableTxPowerBoostSetting(bool flag) { return ::btdrvEnableTxPowerBoostSetting(flag); } -Result IsTxPowerBoostSettingEnabled(bool *out) { return ::btdrvIsTxPowerBoostSettingEnabled(out); } -Result EnableAfhSetting(bool flag) { return ::btdrvEnableAfhSetting(flag); } -Result IsAfhSettingEnabled(bool *out) { return ::btdrvIsAfhSettingEnabled(out); } -Result InitializeBle(Event* out_event) { return ::btdrvInitializeBle(out_event); } -Result EnableBle(void) { return ::btdrvEnableBle(); } -Result DisableBle(void) { return ::btdrvDisableBle(); } -Result FinalizeBle(void) { return ::btdrvFinalizeBle(); } -Result SetBleVisibility(bool discoverable, bool connectable) { return ::btdrvSetBleVisibility(discoverable, connectable); } -Result SetLeConnectionParameter(const BtdrvLeConnectionParams *param) { return ::btdrvSetLeConnectionParameter(param); } -Result SetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool preference) { return ::btdrvSetBleConnectionParameter(addr, param, preference); } -Result SetLeDefaultConnectionParameter(const BtdrvLeConnectionParams *param) { return ::btdrvSetLeDefaultConnectionParameter(param); } -Result SetBleDefaultConnectionParameter(const BtdrvBleConnectionParameter *param) { return ::btdrvSetBleDefaultConnectionParameter(param); } -Result SetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data) { return ::btdrvSetBleAdvertiseData(data); } -Result SetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval) { return ::btdrvSetBleAdvertiseParameter(addr, min_interval, max_interval); } -Result StartBleScan(void) { return ::btdrvStartBleScan(); } -Result StopBleScan(void) { return ::btdrvStopBleScan(); } -Result AddBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter) { return ::btdrvAddBleScanFilterCondition(filter); } -Result DeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter) { return ::btdrvDeleteBleScanFilterCondition(filter); } -Result DeleteBleScanFilter(u8 index) { return ::btdrvDeleteBleScanFilter(index); } -Result ClearBleScanFilters(void) { return ::btdrvClearBleScanFilters(); } -Result EnableBleScanFilter(bool flag) { return ::btdrvEnableBleScanFilter(flag); } -Result RegisterGattClient(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattClient(uuid); } -Result UnregisterGattClient(u8 client_if) { return ::btdrvUnregisterGattClient(client_if); } -Result UnregisterAllGattClients(void) { return ::btdrvUnregisterAllGattClients(); } -Result ConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId) { return ::btdrvConnectGattServer(client_if, addr, is_direct, AppletResourceUserId); } -Result CancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct) { return ::btdrvCancelConnectGattServer(client_if, addr, is_direct); } -Result DisconnectGattServer(u32 conn_id) { return ::btdrvDisconnectGattServer(conn_id); } -Result GetGattAttribute(BtdrvAddress addr, u32 conn_id) { return ::btdrvGetGattAttribute(addr, conn_id); } -Result GetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid) { return ::btdrvGetGattService(conn_id, uuid); } -Result ConfigureAttMtu(u32 conn_id, u16 mtu) { return ::btdrvConfigureAttMtu(conn_id, mtu); } -Result RegisterGattServer(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattServer(uuid); } -Result UnregisterGattServer(u8 server_if) { return ::btdrvUnregisterGattServer(server_if); } -Result ConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct) { return ::btdrvConnectGattClient(server_if, addr, is_direct); } -Result DisconnectGattClient(u8 conn_id, BtdrvAddress addr) { return ::btdrvDisconnectGattClient(conn_id, addr); } -Result AddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary) { return ::btdrvAddGattService(server_if, uuid, num_handle, is_primary); } -Result EnableGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid) { return ::btdrvEnableGattService(server_if, uuid); } -Result AddGattCharacteristic(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u16 permissions, u8 property) { return ::btdrvAddGattCharacteristic(server_if, serv_uuid, char_uuid, permissions, property); } -Result AddGattDescriptor(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions) { return ::btdrvAddGattDescriptor(server_if, serv_uuid, desc_uuid, permissions); } -Result GetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { return ::btdrvGetBleManagedEventInfo(buffer, size, type); } -Result GetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id) { return ::btdrvGetGattFirstCharacteristic(conn_id, serv_id, is_primary, filter_uuid, out_property, out_char_id); } -Result GetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id) { return ::btdrvGetGattNextCharacteristic(conn_id, serv_id, is_primary, char_id, filter_uuid, out_property, out_char_id); } -Result GetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id) { return ::btdrvGetGattFirstDescriptor(conn_id, serv_id, is_primary, char_id, filter_uuid, out_desc_id); } -Result GetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id) { return ::btdrvGetGattNextDescriptor(conn_id, serv_id, is_primary, char_id, desc_id, filter_uuid, out_desc_id); } -Result RegisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattManagedDataPath(uuid); } -Result UnregisterGattManagedDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvUnregisterGattManagedDataPath(uuid); } -Result RegisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattHidDataPath(uuid); } -Result UnregisterGattHidDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvUnregisterGattHidDataPath(uuid); } -Result RegisterGattDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvRegisterGattDataPath(uuid); } -Result UnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid) { return ::btdrvUnregisterGattDataPath(uuid); } -Result ReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) { return ::btdrvReadGattCharacteristic(connection_handle, is_primary, serv_id, char_id, auth_req); } -Result ReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) { return ::btdrvReadGattDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, auth_req); } -Result WriteGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response) { return ::btdrvWriteGattCharacteristic(connection_handle, is_primary, serv_id, char_id, buffer, size, auth_req, with_response); } -Result WriteGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req) { return ::btdrvWriteGattDescriptor(connection_handle, is_primary, serv_id, char_id, desc_id, buffer, size, auth_req); } -Result RegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btdrvRegisterGattNotification(connection_handle, is_primary, serv_id, char_id); } -Result UnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { return ::btdrvUnregisterGattNotification(connection_handle, is_primary, serv_id, char_id); } -Result GetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { return ::btdrvGetLeHidEventInfo(buffer, size, type); } -Result RegisterBleHidEvent(Event* out_event) { return ::btdrvRegisterBleHidEvent(out_event); } -Result SetBleScanParameter(u16 scan_interval, u16 scan_window) { return ::btdrvSetBleScanParameter(scan_interval, scan_window); } -Result MoveToSecondaryPiconet(BtdrvAddress addr) { return ::btdrvMoveToSecondaryPiconet(addr); } -Result IsBluetoothEnabled(bool *out) { return ::btdrvIsBluetoothEnabled(out); } -Result AcquireAudioEvent(Event* out_event, bool autoclear) { return ::btdrvAcquireAudioEvent(out_event, autoclear); } -Result GetAudioEventInfo(void* buffer, size_t size, BtdrvAudioEventType *type) { return ::btdrvGetAudioEventInfo(buffer, size, type); } -Result OpenAudioConnection(BtdrvAddress addr) { return ::btdrvOpenAudioConnection(addr); } -Result CloseAudioConnection(BtdrvAddress addr) { return ::btdrvCloseAudioConnection(addr); } -Result OpenAudioOut(BtdrvAddress addr, u32 *audio_handle) { return ::btdrvOpenAudioOut(addr, audio_handle); } -Result CloseAudioOut(u32 audio_handle) { return ::btdrvCloseAudioOut(audio_handle); } -Result StartAudioOut(u32 audio_handle, const BtdrvPcmParameter *pcm_param, s64 in_latency, s64 *out_latency, u64 *out1) { return ::btdrvStartAudioOut(audio_handle, pcm_param, in_latency, out_latency, out1); } -Result StopAudioOut(u32 audio_handle) { return ::btdrvStopAudioOut(audio_handle); } -Result GetAudioOutState(u32 audio_handle, BtdrvAudioOutState *out) { return ::btdrvGetAudioOutState(audio_handle, out); } -Result GetAudioOutFeedingCodec(u32 audio_handle, BtdrvAudioCodec *out) { return ::btdrvGetAudioOutFeedingCodec(audio_handle, out); } -Result GetAudioOutFeedingParameter(u32 audio_handle, BtdrvPcmParameter *out) { return ::btdrvGetAudioOutFeedingParameter(audio_handle, out); } -Result AcquireAudioOutStateChangedEvent(u32 audio_handle, Event* out_event, bool autoclear) { return ::btdrvAcquireAudioOutStateChangedEvent(audio_handle, out_event, autoclear); } -Result AcquireAudioOutBufferAvailableEvent(u32 audio_handle, Event* out_event, bool autoclear) { return ::btdrvAcquireAudioOutBufferAvailableEvent(audio_handle, out_event, autoclear); } -Result SendAudioData(u32 audio_handle, const void* buffer, size_t size, u64 *transferred_size) { return ::btdrvSendAudioData(audio_handle, buffer, size, transferred_size); } -Result AcquireAudioControlInputStateChangedEvent(Event* out_event, bool autoclear) { return ::btdrvAcquireAudioControlInputStateChangedEvent(out_event, autoclear); } -Result GetAudioControlInputState(BtdrvAudioControlButtonState *states, s32 count, s32 *total_out) { return ::btdrvGetAudioControlInputState(states, count, total_out); } -Result AcquireAudioConnectionStateChangedEvent(Event* out_event, bool autoclear) { return ::btdrvAcquireAudioConnectionStateChangedEvent(out_event, autoclear); } -Result GetConnectedAudioDevice(BtdrvAddress *addrs, s32 count, s32 *total_out) { return ::btdrvGetConnectedAudioDevice(addrs, count, total_out); } -Result CloseAudioControlInput(BtdrvAddress addr) { return ::btdrvCloseAudioControlInput(addr); } -Result RegisterAudioControlNotification(BtdrvAddress addr, u32 event_type) { return ::btdrvRegisterAudioControlNotification(addr, event_type); } -Result SendAudioControlPassthroughCommand(BtdrvAddress addr, u32 op_id, u32 state_type) { return ::btdrvSendAudioControlPassthroughCommand(addr, op_id, state_type); } -Result SendAudioControlSetAbsoluteVolumeCommand(BtdrvAddress addr, s32 val) { return ::btdrvSendAudioControlSetAbsoluteVolumeCommand(addr, val); } -Result IsManufacturingMode(bool *out) { return ::btdrvIsManufacturingMode(out); } -Result EmulateBluetoothCrash(BtdrvFatalReason reason) { return ::btdrvEmulateBluetoothCrash(reason); } -Result GetBleChannelMap(BtdrvChannelMapList *out) { return ::btdrvGetBleChannelMap(out); } -void* CircularBufferRead(BtdrvCircularBuffer *c) { return ::btdrvCircularBufferRead(c); } -bool CircularBufferFree(BtdrvCircularBuffer *c) { return ::btdrvCircularBufferFree(c); } - -} // namespace btdrv - -namespace btm { - -Result Initialize(void) { return ::btmInitialize(); } -void Exit(void) { ::btmExit(); } -Service* GetServiceSession(void) { return ::btmGetServiceSession(); } -Result GetState(BtmState *out) { return ::btmGetState(out); } -Result GetHostDeviceProperty(BtmHostDeviceProperty *out) { return ::btmGetHostDeviceProperty(out); } -Result AcquireDeviceConditionEvent(Event* out_event) { return ::btmAcquireDeviceConditionEvent(out_event); } -Result LegacyGetDeviceCondition(BtmDeviceConditionList *out) { return ::btmLegacyGetDeviceCondition(out); } -Result GetDeviceCondition(BtmProfile profile, BtmDeviceCondition *out, size_t count, s32 *total_out) { return ::btmGetDeviceCondition(profile, out, count, total_out); } -Result SetBurstMode(BtdrvAddress addr, bool flag) { return ::btmSetBurstMode(addr, flag); } -Result SetSlotMode(const BtmDeviceSlotModeList *list) { return ::btmSetSlotMode(list); } -Result SetBluetoothMode(BtmBluetoothMode mode) { return ::btmSetBluetoothMode(mode); } -Result SetWlanMode(BtmWlanMode mode) { return ::btmSetWlanMode(mode); } -Result AcquireDeviceInfoEvent(Event* out_event) { return ::btmAcquireDeviceInfoEvent(out_event); } -Result LegacyGetDeviceInfo(BtmDeviceInfoList *out) { return ::btmLegacyGetDeviceInfo(out); } -Result GetDeviceInfo(BtmProfile profile, BtmDeviceInfo *out, size_t count, s32 *total_out) { return ::btmGetDeviceInfo(profile, out, count, total_out); } -Result LegacyAddDeviceInfo(const BtmDeviceInfoLegacy *info) { return ::btmLegacyAddDeviceInfo(info); } -Result AddDeviceInfo(const BtmDeviceInfo *info) { return ::btmAddDeviceInfo(info); } -Result RemoveDeviceInfo(BtdrvAddress addr) { return ::btmRemoveDeviceInfo(addr); } -Result IncreaseDeviceInfoOrder(BtdrvAddress addr) { return ::btmIncreaseDeviceInfoOrder(addr); } -Result LlrNotify(BtdrvAddress addr, s32 unk) { return ::btmLlrNotify(addr, unk); } -Result EnableRadio(void) { return ::btmEnableRadio(); } -Result DisableRadio(void) { return ::btmDisableRadio(); } -Result HidDisconnect(BtdrvAddress addr) { return ::btmHidDisconnect(addr); } -Result HidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list) { return ::btmHidSetRetransmissionMode(addr, list); } -Result AcquireAwakeReqEvent(Event* out_event) { return ::btmAcquireAwakeReqEvent(out_event); } -Result AcquireLlrStateEvent(Event* out_event) { return ::btmAcquireLlrStateEvent(out_event); } -Result IsLlrStarted(bool *out) { return ::btmIsLlrStarted(out); } -Result EnableSlotSaving(bool flag) { return ::btmEnableSlotSaving(flag); } -Result ProtectDeviceInfo(BtdrvAddress addr, bool flag) { return ::btmProtectDeviceInfo(addr, flag); } -Result AcquireBleScanEvent(Event* out_event) { return ::btmAcquireBleScanEvent(out_event); } -Result GetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out) { return ::btmGetBleScanParameterGeneral(parameter_id, out); } -Result GetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out) { return ::btmGetBleScanParameterSmartDevice(parameter_id, out); } -Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param) { return ::btmStartBleScanForGeneral(param); } -Result StopBleScanForGeneral(void) { return ::btmStopBleScanForGeneral(); } -Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmGetBleScanResultsForGeneral(results, count, total_out); } -Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param) { return ::btmStartBleScanForPaired(param); } -Result StopBleScanForPaired(void) { return ::btmStopBleScanForPaired(); } -Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid) { return ::btmStartBleScanForSmartDevice(uuid); } -Result StopBleScanForSmartDevice(void) { return ::btmStopBleScanForSmartDevice(); } -Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmGetBleScanResultsForSmartDevice(results, count, total_out); } -Result AcquireBleConnectionEvent(Event* out_event) { return ::btmAcquireBleConnectionEvent(out_event); } -Result BleConnect(BtdrvAddress addr) { return ::btmBleConnect(addr); } -Result BleOverrideConnection(u32 id) { return ::btmBleOverrideConnection(id); } -Result BleDisconnect(u32 connection_handle) { return ::btmBleDisconnect(connection_handle); } -Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) { return ::btmBleGetConnectionState(info, count, total_out); } -Result BleGetGattClientConditionList(BtmGattClientConditionList *list) { return ::btmBleGetGattClientConditionList(list); } -Result AcquireBlePairingEvent(Event* out_event) { return ::btmAcquireBlePairingEvent(out_event); } -Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmBlePairDevice(connection_handle, param); } -Result BleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmBleUnpairDeviceOnBoth(connection_handle, param); } -Result BleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) { return ::btmBleUnPairDevice(addr, param); } -Result BleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out) { return ::btmBleGetPairedAddresses(param, addrs, count, total_out); } -Result AcquireBleServiceDiscoveryEvent(Event* out_event) { return ::btmAcquireBleServiceDiscoveryEvent(out_event); } -Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out) { return ::btmGetGattServices(connection_handle, services, count, total_out); } -Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) { return ::btmGetGattService(connection_handle, uuid, service, flag); } -Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out) { return ::btmGetGattIncludedServices(connection_handle, service_handle, services, count, out); } -Result GetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag) { return ::btmGetBelongingService(connection_handle, attribute_handle, service, flag); } -Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) { return ::btmGetGattCharacteristics(connection_handle, service_handle, characteristics, count, total_out); } -Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) { return ::btmGetGattDescriptors(connection_handle, char_handle, descriptors, count, total_out); } -Result AcquireBleMtuConfigEvent(Event* out_event) { return ::btmAcquireBleMtuConfigEvent(out_event); } -Result ConfigureBleMtu(u32 connection_handle, u16 mtu) { return ::btmConfigureBleMtu(connection_handle, mtu); } -Result GetBleMtu(u32 connection_handle, u16 *out) { return ::btmGetBleMtu(connection_handle, out); } -Result RegisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmRegisterBleGattDataPath(path); } -Result UnregisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmUnregisterBleGattDataPath(path); } -Result RegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk) { return ::btmRegisterAppletResourceUserId(AppletResourceUserId, unk); } -Result UnregisterAppletResourceUserId(u64 AppletResourceUserId) { return ::btmUnregisterAppletResourceUserId(AppletResourceUserId); } -Result SetAppletResourceUserId(u64 AppletResourceUserId) { return ::btmSetAppletResourceUserId(AppletResourceUserId); } -Result GetShortenedDeviceInfo(BtmProfile profile, BtmShortenedDeviceInfo *out, size_t count, s32 *total_out) { return ::btmGetShortenedDeviceInfo(profile, out, count, total_out); } -Result GetShortenedDeviceCondition(BtmProfile profile, BtmShortenedDeviceCondition *out, size_t count, s32 *total_out) { return ::btmGetShortenedDeviceCondition(profile, out, count, total_out); } - -} // namespace btm - -namespace btmsys { - -Result Initialize(void) { return ::btmsysInitialize(); } -void Exit(void) { ::btmsysExit(); } -Result GetServiceSession(Service* srv_out) { return ::btmsysGetServiceSession(srv_out); } -Service* GetServiceSession_IBtmSystemCore(void) { return ::btmsysGetServiceSession_IBtmSystemCore(); } -Result StartGamepadPairing(void) { return ::btmsysStartGamepadPairing(); } -Result CancelGamepadPairing(void) { return ::btmsysCancelGamepadPairing(); } -Result ClearGamepadPairingDatabase(void) { return ::btmsysClearGamepadPairingDatabase(); } -Result GetPairedGamepadCount(u8 *out) { return ::btmsysGetPairedGamepadCount(out); } -Result EnableRadio(void) { return ::btmsysEnableRadio(); } -Result DisableRadio(void) { return ::btmsysDisableRadio(); } -Result GetRadioOnOff(bool *out) { return ::btmsysGetRadioOnOff(out); } -Result AcquireRadioEvent(Event* out_event) { return ::btmsysAcquireRadioEvent(out_event); } -Result AcquireGamepadPairingEvent(Event* out_event) { return ::btmsysAcquireGamepadPairingEvent(out_event); } -Result IsGamepadPairingStarted(bool *out) { return ::btmsysIsGamepadPairingStarted(out); } -Result StartAudioDeviceDiscovery(void) { return ::btmsysStartAudioDeviceDiscovery(); } -Result StopAudioDeviceDiscovery(void) { return ::btmsysStopAudioDeviceDiscovery(); } -Result IsDiscoveryingAudioDevice(bool *out) { return ::btmsysIsDiscoveryingAudioDevice(out); } -Result GetDiscoveredAudioDevice(BtmAudioDevice *out, s32 count, s32 *total_out) { return ::btmsysGetDiscoveredAudioDevice(out, count, total_out); } -Result AcquireAudioDeviceConnectionEvent(Event* out_event) { return ::btmsysAcquireAudioDeviceConnectionEvent(out_event); } -Result ConnectAudioDevice(BtdrvAddress addr) { return ::btmsysConnectAudioDevice(addr); } -Result IsConnectingAudioDevice(bool *out) { return ::btmsysIsConnectingAudioDevice(out); } -Result GetConnectedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out) { return ::btmsysGetConnectedAudioDevices(out, count, total_out); } -Result DisconnectAudioDevice(BtdrvAddress addr) { return ::btmsysDisconnectAudioDevice(addr); } -Result AcquirePairedAudioDeviceInfoChangedEvent(Event* out_event) { return ::btmsysAcquirePairedAudioDeviceInfoChangedEvent(out_event); } -Result GetPairedAudioDevices(BtmAudioDevice *out, s32 count, s32 *total_out) { return ::btmsysGetPairedAudioDevices(out, count, total_out); } -Result RemoveAudioDevicePairing(BtdrvAddress addr) { return ::btmsysRemoveAudioDevicePairing(addr); } -Result RequestAudioDeviceConnectionRejection(void) { return ::btmsysRequestAudioDeviceConnectionRejection(); } -Result CancelAudioDeviceConnectionRejection(void) { return ::btmsysCancelAudioDeviceConnectionRejection(); } - -} // namespace btmsys - -namespace btmu { - -Result Initialize(void) { return ::btmuInitialize(); } -void Exit(void) { ::btmuExit(); } -Result GetServiceSession(Service* srv_out) { return ::btmuGetServiceSession(srv_out); } -Service* GetServiceSession_IBtmUserCore(void) { return ::btmuGetServiceSession_IBtmUserCore(); } -Result AcquireBleScanEvent(Event* out_event) { return ::btmuAcquireBleScanEvent(out_event); } -Result GetBleScanFilterParameter(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out) { return ::btmuGetBleScanFilterParameter(parameter_id, out); } -Result GetBleScanFilterParameter2(u16 parameter_id, BtdrvGattAttributeUuid *out) { return ::btmuGetBleScanFilterParameter2(parameter_id, out); } -Result StartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param) { return ::btmuStartBleScanForGeneral(param); } -Result StopBleScanForGeneral(void) { return ::btmuStopBleScanForGeneral(); } -Result GetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmuGetBleScanResultsForGeneral(results, count, total_out); } -Result StartBleScanForPaired(BtdrvBleAdvertisePacketParameter param) { return ::btmuStartBleScanForPaired(param); } -Result StopBleScanForPaired(void) { return ::btmuStopBleScanForPaired(); } -Result StartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid) { return ::btmuStartBleScanForSmartDevice(uuid); } -Result StopBleScanForSmartDevice(void) { return ::btmuStopBleScanForSmartDevice(); } -Result GetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out) { return ::btmuGetBleScanResultsForSmartDevice(results, count, total_out); } -Result AcquireBleConnectionEvent(Event* out_event) { return ::btmuAcquireBleConnectionEvent(out_event); } -Result BleConnect(BtdrvAddress addr) { return ::btmuBleConnect(addr); } -Result BleDisconnect(u32 connection_handle) { return ::btmuBleDisconnect(connection_handle); } -Result BleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) { return ::btmuBleGetConnectionState(info, count, total_out); } -Result AcquireBlePairingEvent(Event* out_event) { return ::btmuAcquireBlePairingEvent(out_event); } -Result BlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmuBlePairDevice(connection_handle, param); } -Result BleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) { return ::btmuBleUnPairDevice(connection_handle, param); } -Result BleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) { return ::btmuBleUnPairDevice2(addr, param); } -Result BleGetPairedDevices(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out) { return ::btmuBleGetPairedDevices(param, addrs, count, total_out); } -Result AcquireBleServiceDiscoveryEvent(Event* out_event) { return ::btmuAcquireBleServiceDiscoveryEvent(out_event); } -Result GetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out) { return ::btmuGetGattServices(connection_handle, services, count, total_out); } -Result GetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) { return ::btmuGetGattService(connection_handle, uuid, service, flag); } -Result GetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out) { return ::btmuGetGattIncludedServices(connection_handle, service_handle, services, count, out); } -Result GetBelongingGattService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag) { return ::btmuGetBelongingGattService(connection_handle, attribute_handle, service, flag); } -Result GetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) { return ::btmuGetGattCharacteristics(connection_handle, service_handle, characteristics, count, total_out); } -Result GetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) { return ::btmuGetGattDescriptors(connection_handle, char_handle, descriptors, count, total_out); } -Result AcquireBleMtuConfigEvent(Event* out_event) { return ::btmuAcquireBleMtuConfigEvent(out_event); } -Result ConfigureBleMtu(u32 connection_handle, u16 mtu) { return ::btmuConfigureBleMtu(connection_handle, mtu); } -Result GetBleMtu(u32 connection_handle, u16 *out) { return ::btmuGetBleMtu(connection_handle, out); } -Result RegisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmuRegisterBleGattDataPath(path); } -Result UnregisterBleGattDataPath(const BtmBleDataPath *path) { return ::btmuUnregisterBleGattDataPath(path); } - -} // namespace btmu - -namespace capmtp { - -Result Initialize(void* mem, size_t size, u32 app_count, u32 max_img, u32 max_vid, const char *other_name) { return ::capmtpInitialize(mem, size, app_count, max_img, max_vid, other_name); } -void Exit(void) { ::capmtpExit(); } -Service* GetRootServiceSession(void) { return ::capmtpGetRootServiceSession(); } -Service* GetServiceSession(void) { return ::capmtpGetServiceSession(); } -Result StartCommandHandler(void) { return ::capmtpStartCommandHandler(); } -Result StopCommandHandler(void) { return ::capmtpStopCommandHandler(); } -bool IsRunning(void) { return ::capmtpIsRunning(); } -Event * GetConnectionEvent(void) { return ::capmtpGetConnectionEvent(); } -bool IsConnected(void) { return ::capmtpIsConnected(); } -Event * GetScanErrorEvent(void) { return ::capmtpGetScanErrorEvent(); } -Result GetScanError(void) { return ::capmtpGetScanError(); } - -} // namespace capmtp - -namespace caps { - -u64 GetShimLibraryVersion(void) { return ::capsGetShimLibraryVersion(); } -CapsAlbumFileDateTime GetDefaultStartDateTime(void) { return ::capsGetDefaultStartDateTime(); } -CapsAlbumFileDateTime GetDefaultEndDateTime(void) { return ::capsGetDefaultEndDateTime(); } -void ConvertApplicationAlbumFileEntryToApplicationAlbumEntry(CapsApplicationAlbumEntry *out, CapsApplicationAlbumFileEntry *in) { ::capsConvertApplicationAlbumFileEntryToApplicationAlbumEntry(out, in); } -void ConvertApplicationAlbumEntryToApplicationAlbumFileEntry(CapsApplicationAlbumFileEntry *out, CapsApplicationAlbumEntry *in) { ::capsConvertApplicationAlbumEntryToApplicationAlbumFileEntry(out, in); } -Result LoadAlbumScreenShotThumbnailImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsLoadAlbumScreenShotThumbnailImageEx0(width, height, attr, file_id, opts, image, image_size, workbuf, workbuf_size); } - -} // namespace caps - -namespace capsa { - -Result Initialize(void) { return ::capsaInitialize(); } -void Exit(void) { ::capsaExit(); } -Service* GetServiceSession(void) { return ::capsaGetServiceSession(); } -Service* GetServiceSession_Accessor(void) { return ::capsaGetServiceSession_Accessor(); } -Result GetAlbumFileCount(CapsAlbumStorage storage, u64 *count) { return ::capsaGetAlbumFileCount(storage, count); } -Result GetAlbumFileList(CapsAlbumStorage storage, u64 *out, CapsAlbumEntry *entries, u64 count) { return ::capsaGetAlbumFileList(storage, out, entries, count); } -Result LoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* filebuf, u64 filebuf_size) { return ::capsaLoadAlbumFile(file_id, out_size, filebuf, filebuf_size); } -Result DeleteAlbumFile(const CapsAlbumFileId *file_id) { return ::capsaDeleteAlbumFile(file_id); } -Result StorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage) { return ::capsaStorageCopyAlbumFile(file_id, dst_storage); } -Result IsAlbumMounted(CapsAlbumStorage storage, bool *is_mounted) { return ::capsaIsAlbumMounted(storage, is_mounted); } -Result GetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out) { return ::capsaGetAlbumUsage(storage, out); } -Result GetAlbumFileSize(const CapsAlbumFileId *file_id, u64 *size) { return ::capsaGetAlbumFileSize(file_id, size); } -Result LoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size) { return ::capsaLoadAlbumFileThumbnail(file_id, out_size, image, image_size); } -Result LoadAlbumScreenShotImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImage(width, height, file_id, image, image_size, workbuf, workbuf_size); } -Result LoadAlbumScreenShotThumbnailImage(u64 *width, u64 *height, const CapsAlbumFileId *file_id, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotThumbnailImage(width, height, file_id, image, image_size, workbuf, workbuf_size); } -Result GetAlbumEntryFromApplicationAlbumEntry(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry, u64 application_id) { return ::capsaGetAlbumEntryFromApplicationAlbumEntry(entry, application_entry, application_id); } -Result LoadAlbumScreenShotImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImageEx(width, height, file_id, opts, image, image_size, workbuf, workbuf_size); } -Result LoadAlbumScreenShotThumbnailImageEx(u64 *width, u64 *height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotThumbnailImageEx(width, height, file_id, opts, image, image_size, workbuf, workbuf_size); } -Result LoadAlbumScreenShotImageEx0(u64 *width, u64 *height, CapsScreenShotAttribute *attr, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImageEx0(width, height, attr, file_id, opts, image, image_size, workbuf, workbuf_size); } -Result GetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out) { return ::capsaGetAlbumUsage3(storage, out); } -Result GetAlbumMountResult(CapsAlbumStorage storage) { return ::capsaGetAlbumMountResult(storage); } -Result GetAlbumUsage16(CapsAlbumStorage storage, u8 flags, CapsAlbumUsage16 *out) { return ::capsaGetAlbumUsage16(storage, flags, out); } -Result GetMinMaxAppletId(bool* success, u64* min, u64* max) { return ::capsaGetMinMaxAppletId(success, min, max); } -Result GetAlbumFileCountEx0(CapsAlbumStorage storage, u8 flags, u64 *count) { return ::capsaGetAlbumFileCountEx0(storage, flags, count); } -Result GetAlbumFileListEx0(CapsAlbumStorage storage, u8 flags, u64 *out, CapsAlbumEntry *entries, u64 count) { return ::capsaGetAlbumFileListEx0(storage, flags, out, entries, count); } -Result GetLastOverlayScreenShotThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size) { return ::capsaGetLastOverlayScreenShotThumbnail(file_id, out_size, image, image_size); } -Result GetLastOverlayMovieThumbnail(CapsAlbumFileId *file_id, u64 *out_size, void* image, u64 image_size) { return ::capsaGetLastOverlayMovieThumbnail(file_id, out_size, image, image_size); } -Result GetAutoSavingStorage(CapsAlbumStorage *storage) { return ::capsaGetAutoSavingStorage(storage); } -Result GetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64 *out) { return ::capsaGetRequiredStorageSpaceSizeToCopyAll(dst_storage, src_storage, out); } -Result LoadAlbumScreenShotImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotImageEx1(file_id, opts, out, image, image_size, workbuf, workbuf_size); } -Result LoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, CapsLoadAlbumScreenShotImageOutput *out, void* image, u64 image_size, void* workbuf, u64 workbuf_size) { return ::capsaLoadAlbumScreenShotThumbnailImageEx1(file_id, opts, out, image, image_size, workbuf, workbuf_size); } -Result ForceAlbumUnmounted(CapsAlbumStorage storage) { return ::capsaForceAlbumUnmounted(storage); } -Result ResetAlbumMountStatus(CapsAlbumStorage storage) { return ::capsaResetAlbumMountStatus(storage); } -Result RefreshAlbumCache(CapsAlbumStorage storage) { return ::capsaRefreshAlbumCache(storage); } -Result GetAlbumCache(CapsAlbumStorage storage, CapsAlbumCache *cache) { return ::capsaGetAlbumCache(storage, cache); } -Result GetAlbumCacheEx(CapsAlbumStorage storage, CapsAlbumFileContents contents, CapsAlbumCache *cache) { return ::capsaGetAlbumCacheEx(storage, contents, cache); } -Result GetAlbumEntryFromApplicationAlbumEntryAruid(CapsAlbumEntry *entry, const CapsApplicationAlbumEntry *application_entry) { return ::capsaGetAlbumEntryFromApplicationAlbumEntryAruid(entry, application_entry); } -Result OpenAlbumMovieStream(u64 *stream, const CapsAlbumFileId *file_id) { return ::capsaOpenAlbumMovieStream(stream, file_id); } -Result CloseAlbumMovieStream(u64 stream) { return ::capsaCloseAlbumMovieStream(stream); } -Result GetAlbumMovieStreamSize(u64 stream, u64 *size) { return ::capsaGetAlbumMovieStreamSize(stream, size); } -Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capsaReadMovieDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } -Result GetAlbumMovieReadStreamBrokenReason(u64 stream) { return ::capsaGetAlbumMovieReadStreamBrokenReason(stream); } -Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size) { return ::capsaGetAlbumMovieReadStreamImageDataSize(stream, size); } -Result ReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capsaReadImageDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } -Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attr) { return ::capsaReadFileAttributeFromAlbumMovieReadStream(stream, attr); } - -} // namespace capsa - -namespace capsc { - -Result Initialize(void) { return ::capscInitialize(); } -void Exit(void) { ::capscExit(); } -Service* GetServiceSession(void) { return ::capscGetServiceSession(); } -Result NotifyAlbumStorageIsAvailable(CapsAlbumStorage storage) { return ::capscNotifyAlbumStorageIsAvailable(storage); } -Result NotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage) { return ::capscNotifyAlbumStorageIsUnAvailable(storage); } -Result RegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id) { return ::capscRegisterAppletResourceUserId(appletResourceUserId, application_id); } -Result UnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id) { return ::capscUnregisterAppletResourceUserId(appletResourceUserId, application_id); } -Result GetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid) { return ::capscGetApplicationIdFromAruid(application_id, aruid); } -Result CheckApplicationIdRegistered(u64 application_id) { return ::capscCheckApplicationIdRegistered(application_id); } -Result GenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id) { return ::capscGenerateCurrentAlbumFileId(application_id, contents, file_id); } -Result GenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id) { return ::capscGenerateApplicationAlbumEntry(appEntry, entry, application_id); } -Result SaveAlbumScreenShotFile(const CapsAlbumFileId *file_id, const void* buffer, u64 buffer_size) { return ::capscSaveAlbumScreenShotFile(file_id, buffer, buffer_size); } -Result SaveAlbumScreenShotFileEx(const CapsAlbumFileId *file_id, u64 version, u64 makernote_offset, u64 makernote_size, const void* buffer, u64 buffer_size) { return ::capscSaveAlbumScreenShotFileEx(file_id, version, makernote_offset, makernote_size, buffer, buffer_size); } -Result SetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size) { return ::capscSetOverlayScreenShotThumbnailData(file_id, image, image_size); } -Result SetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size) { return ::capscSetOverlayMovieThumbnailData(file_id, image, image_size); } -Result OpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id) { return ::capscOpenAlbumMovieReadStream(stream, file_id); } -Result CloseAlbumMovieStream(u64 stream) { return ::capscCloseAlbumMovieStream(stream); } -Result GetAlbumMovieStreamSize(u64 stream, u64 *size) { return ::capscGetAlbumMovieStreamSize(stream, size); } -Result ReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capscReadMovieDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } -Result GetAlbumMovieReadStreamBrokenReason(u64 stream) { return ::capscGetAlbumMovieReadStreamBrokenReason(stream); } -Result GetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size) { return ::capscGetAlbumMovieReadStreamImageDataSize(stream, size); } -Result ReadImageDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capscReadImageDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size); } -Result ReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute) { return ::capscReadFileAttributeFromAlbumMovieReadStream(stream, attribute); } -Result OpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id) { return ::capscOpenAlbumMovieWriteStream(stream, file_id); } -Result FinishAlbumMovieWriteStream(u64 stream) { return ::capscFinishAlbumMovieWriteStream(stream); } -Result CommitAlbumMovieWriteStream(u64 stream) { return ::capscCommitAlbumMovieWriteStream(stream); } -Result DiscardAlbumMovieWriteStream(u64 stream) { return ::capscDiscardAlbumMovieWriteStream(stream); } -Result DiscardAlbumMovieWriteStreamNoDelete(u64 stream) { return ::capscDiscardAlbumMovieWriteStreamNoDelete(stream); } -Result CommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry) { return ::capscCommitAlbumMovieWriteStreamEx(stream, entry); } -Result StartAlbumMovieWriteStreamDataSection(u64 stream) { return ::capscStartAlbumMovieWriteStreamDataSection(stream); } -Result EndAlbumMovieWriteStreamDataSection(u64 stream) { return ::capscEndAlbumMovieWriteStreamDataSection(stream); } -Result StartAlbumMovieWriteStreamMetaSection(u64 stream) { return ::capscStartAlbumMovieWriteStreamMetaSection(stream); } -Result EndAlbumMovieWriteStreamMetaSection(u64 stream) { return ::capscEndAlbumMovieWriteStreamMetaSection(stream); } -Result ReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size) { return ::capscReadDataFromAlbumMovieWriteStream(stream, offset, buffer, size, actual_size); } -Result WriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size) { return ::capscWriteDataToAlbumMovieWriteStream(stream, offset, buffer, size); } -Result WriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, const void* buffer, u64 size) { return ::capscWriteMetaToAlbumMovieWriteStream(stream, offset, buffer, size); } -Result GetAlbumMovieWriteStreamBrokenReason(u64 stream) { return ::capscGetAlbumMovieWriteStreamBrokenReason(stream); } -Result GetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size) { return ::capscGetAlbumMovieWriteStreamDataSize(stream, size); } -Result SetAlbumMovieWriteStreamDataSize(u64 stream, u64 size) { return ::capscSetAlbumMovieWriteStreamDataSize(stream, size); } - -} // namespace capsc - -namespace capsdc { - -Result Initialize(void) { return ::capsdcInitialize(); } -void Exit(void) { ::capsdcExit(); } -Service* GetServiceSession(void) { return ::capsdcGetServiceSession(); } -Result DecodeJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_image, size_t out_image_size) { return ::capsdcDecodeJpeg(width, height, opts, jpeg, jpeg_size, out_image, out_image_size); } -Result ShrinkJpeg(u32 width, u32 height, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size) { return ::capsdcShrinkJpeg(width, height, opts, jpeg, jpeg_size, out_jpeg, out_jpeg_size, out_result_size); } -Result ShrinkJpegEx(u32 scaled_width, u32 scaled_height, u32 jpeg_quality, const CapsScreenShotDecodeOption *opts, const void* jpeg, size_t jpeg_size, void* out_jpeg, size_t out_jpeg_size, u64 *out_result_size) { return ::capsdcShrinkJpegEx(scaled_width, scaled_height, jpeg_quality, opts, jpeg, jpeg_size, out_jpeg, out_jpeg_size, out_result_size); } - -} // namespace capsdc - -namespace capssc { - -Result Initialize(void) { return ::capsscInitialize(); } -void Exit(void) { ::capsscExit(); } -Service* GetServiceSession(void) { return ::capsscGetServiceSession(); } -Result CaptureRawImageWithTimeout(void* buf, size_t size, ViLayerStack layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, s64 timeout) { return ::capsscCaptureRawImageWithTimeout(buf, size, layer_stack, width, height, buffer_count, buffer_index, timeout); } -Result OpenRawScreenShotReadStream(u64 *out_size, u64 *out_width, u64 *out_height, ViLayerStack layer_stack, s64 timeout) { return ::capsscOpenRawScreenShotReadStream(out_size, out_width, out_height, layer_stack, timeout); } -Result CloseRawScreenShotReadStream(void) { return ::capsscCloseRawScreenShotReadStream(); } -Result ReadRawScreenShotReadStream(u64 *bytes_read, void* buf, size_t size, u64 offset) { return ::capsscReadRawScreenShotReadStream(bytes_read, buf, size, offset); } -Result CaptureJpegScreenShot(u64* out_jpeg_size, void* jpeg_buf, size_t jpeg_buf_size, ViLayerStack layer_stack, s64 timeout) { return ::capsscCaptureJpegScreenShot(out_jpeg_size, jpeg_buf, jpeg_buf_size, layer_stack, timeout); } - -} // namespace capssc - -namespace capssu { - -Result Initialize(void) { return ::capssuInitialize(); } -void Exit(void) { ::capssuExit(); } -Service* GetServiceSession(void) { return ::capssuGetServiceSession(); } -Result SaveScreenShot(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShot(buffer, size, reportoption, orientation, out); } -Result SaveScreenShotWithUserData(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const void* userdata, size_t userdata_size, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotWithUserData(buffer, size, reportoption, orientation, userdata, userdata_size, out); } -Result SaveScreenShotWithUserIds(const void* buffer, size_t size, AlbumReportOption reportoption, AlbumImageOrientation orientation, const AccountUid* uids, size_t uid_count, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotWithUserIds(buffer, size, reportoption, orientation, uids, uid_count, out); } -Result SaveScreenShotEx0(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotEx0(buffer, size, attr, reportoption, out); } -Result SaveScreenShotEx1(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsApplicationData *appdata, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotEx1(buffer, size, attr, reportoption, appdata, out); } -Result SaveScreenShotEx2(const void* buffer, size_t size, const CapsScreenShotAttribute *attr, AlbumReportOption reportoption, CapsUserIdList *list, CapsApplicationAlbumEntry *out) { return ::capssuSaveScreenShotEx2(buffer, size, attr, reportoption, list, out); } - -} // namespace capssu - -namespace capsu { - -Result Initialize(void) { return ::capsuInitialize(); } -void Exit(void) { ::capsuExit(); } -Service* GetServiceSession(void) { return ::capsuGetServiceSession(); } -Service* GetServiceSession_Accessor(void) { return ::capsuGetServiceSession_Accessor(); } -Result GetAlbumFileListDeprecated1(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries) { return ::capsuGetAlbumFileListDeprecated1(entries, count, type, start_datetime, end_datetime, total_entries); } -Result GetAlbumFileListDeprecated2(CapsApplicationAlbumFileEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries) { return ::capsuGetAlbumFileListDeprecated2(entries, count, type, start_datetime, end_datetime, uid, total_entries); } -Result GetAlbumFileList3(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, s32 *total_entries) { return ::capsuGetAlbumFileList3(entries, count, type, start_datetime, end_datetime, total_entries); } -Result GetAlbumFileList4(CapsApplicationAlbumEntry *entries, s32 count, CapsContentType type, const CapsAlbumFileDateTime *start_datetime, const CapsAlbumFileDateTime *end_datetime, AccountUid uid, s32 *total_entries) { return ::capsuGetAlbumFileList4(entries, count, type, start_datetime, end_datetime, uid, total_entries); } -Result DeleteAlbumFile(CapsContentType type, const CapsApplicationAlbumFileEntry *entry) { return ::capsuDeleteAlbumFile(type, entry); } -Result GetAlbumFileSize(const CapsApplicationAlbumFileEntry *entry, u64 *size) { return ::capsuGetAlbumFileSize(entry, size); } -Result LoadAlbumScreenShotImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option) { return ::capsuLoadAlbumScreenShotImage(width, height, attr, userdata, userdata_maxsize, userdata_size, image, image_size, workbuf, workbuf_size, entry, option); } -Result LoadAlbumScreenShotThumbnailImage(s32 *width, s32 *height, CapsScreenShotAttributeForApplication *attr, void* userdata, size_t userdata_maxsize, u32 *userdata_size, void* image, size_t image_size, void* workbuf, size_t workbuf_size, const CapsApplicationAlbumFileEntry *entry, const CapsScreenShotDecodeOption *option) { return ::capsuLoadAlbumScreenShotThumbnailImage(width, height, attr, userdata, userdata_maxsize, userdata_size, image, image_size, workbuf, workbuf_size, entry, option); } -Result PrecheckToCreateContents(CapsContentType type, u64 unk) { return ::capsuPrecheckToCreateContents(type, unk); } -Result OpenAlbumMovieStream(u64 *stream, const CapsApplicationAlbumFileEntry *entry) { return ::capsuOpenAlbumMovieStream(stream, entry); } -Result CloseAlbumMovieStream(u64 stream) { return ::capsuCloseAlbumMovieStream(stream); } -Result GetAlbumMovieStreamSize(u64 stream, u64 *size) { return ::capsuGetAlbumMovieStreamSize(stream, size); } -Result ReadAlbumMovieStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) { return ::capsuReadAlbumMovieStream(stream, offset, buffer, size, actual_size); } -Result GetAlbumMovieStreamBrokenReason(u64 stream) { return ::capsuGetAlbumMovieStreamBrokenReason(stream); } - -} // namespace capsu - -namespace clkrst { - -Result Initialize(void) { return ::clkrstInitialize(); } -void Exit(void) { ::clkrstExit(); } -Service* GetServiceSession(void) { return ::clkrstGetServiceSession(); } -Result OpenSession(ClkrstSession* session_out, PcvModuleId module_id, u32 unk) { return ::clkrstOpenSession(session_out, module_id, unk); } -void CloseSession(ClkrstSession* session) { ::clkrstCloseSession(session); } -Result SetClockRate(ClkrstSession* session, u32 hz) { return ::clkrstSetClockRate(session, hz); } -Result GetClockRate(ClkrstSession* session, u32 *out_hz) { return ::clkrstGetClockRate(session, out_hz); } -// Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz) { return ::clkrstSetMinimumVoltageClockRate(session, hz); } -Result GetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count) { return ::clkrstGetPossibleClockRates(session, rates, max_count, out_type, out_count); } -// Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count) { return ::clkrstGetDvfsTable(session, out_rate_table, in_rate_count, out_voltage_table, in_voltage_count, out_count); } - -} // namespace clkrst - -namespace cmac { - -void Aes128ContextCreate(Aes128CmacContext *out, const void *key) { ::cmacAes128ContextCreate(out, key); } -void Aes128ContextUpdate(Aes128CmacContext *ctx, const void *src, size_t size) { ::cmacAes128ContextUpdate(ctx, src, size); } -void Aes128ContextGetMac(Aes128CmacContext *ctx, void *dst) { ::cmacAes128ContextGetMac(ctx, dst); } -void Aes128CalculateMac(void *dst, const void *key, const void *src, size_t size) { ::cmacAes128CalculateMac(dst, key, src, size); } -void Aes192ContextCreate(Aes192CmacContext *out, const void *key) { ::cmacAes192ContextCreate(out, key); } -void Aes192ContextUpdate(Aes192CmacContext *ctx, const void *src, size_t size) { ::cmacAes192ContextUpdate(ctx, src, size); } -void Aes192ContextGetMac(Aes192CmacContext *ctx, void *dst) { ::cmacAes192ContextGetMac(ctx, dst); } -void Aes192CalculateMac(void *dst, const void *key, const void *src, size_t size) { ::cmacAes192CalculateMac(dst, key, src, size); } -void Aes256ContextCreate(Aes256CmacContext *out, const void *key) { ::cmacAes256ContextCreate(out, key); } -void Aes256ContextUpdate(Aes256CmacContext *ctx, const void *src, size_t size) { ::cmacAes256ContextUpdate(ctx, src, size); } -void Aes256ContextGetMac(Aes256CmacContext *ctx, void *dst) { ::cmacAes256ContextGetMac(ctx, dst); } -void Aes256CalculateMac(void *dst, const void *key, const void *src, size_t size) { ::cmacAes256CalculateMac(dst, key, src, size); } - -} // namespace cmac - -namespace cmif { - -void* GetAlignedDataStart(u32* data_words, void* base) { return ::cmifGetAlignedDataStart(data_words, base); } -CmifRequest MakeRequest(void* base, CmifRequestFormat fmt) { return ::cmifMakeRequest(base, fmt); } -void* MakeControlRequest(void* base, u32 request_id, u32 size) { return ::cmifMakeControlRequest(base, request_id, size); } -void MakeCloseRequest(void* base, u32 object_id) { ::cmifMakeCloseRequest(base, object_id); } -void RequestInBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestInBuffer(req, buffer, size, mode); } -void RequestOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestOutBuffer(req, buffer, size, mode); } -void RequestInOutBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestInOutBuffer(req, buffer, size, mode); } -void RequestInPointer(CmifRequest* req, const void* buffer, size_t size) { ::cmifRequestInPointer(req, buffer, size); } -void RequestOutFixedPointer(CmifRequest* req, void* buffer, size_t size) { ::cmifRequestOutFixedPointer(req, buffer, size); } -void RequestOutPointer(CmifRequest* req, void* buffer, size_t size) { ::cmifRequestOutPointer(req, buffer, size); } -void RequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestInAutoBuffer(req, buffer, size, mode); } -void RequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::cmifRequestOutAutoBuffer(req, buffer, size, mode); } -void RequestObject(CmifRequest* req, u32 object_id) { ::cmifRequestObject(req, object_id); } -void RequestHandle(CmifRequest* req, Handle handle) { ::cmifRequestHandle(req, handle); } -Result ParseResponse(CmifResponse* res, void* base, bool is_domain, u32 size) { return ::cmifParseResponse(res, base, is_domain, size); } -u32 ResponseGetObject(CmifResponse* res) { return ::cmifResponseGetObject(res); } -Handle ResponseGetCopyHandle(CmifResponse* res) { return ::cmifResponseGetCopyHandle(res); } -Handle ResponseGetMoveHandle(CmifResponse* res) { return ::cmifResponseGetMoveHandle(res); } -Result ConvertCurrentObjectToDomain(Handle h, u32* out_object_id) { return ::cmifConvertCurrentObjectToDomain(h, out_object_id); } -Result CopyFromCurrentDomain(Handle h, u32 object_id, Handle* out_h) { return ::cmifCopyFromCurrentDomain(h, object_id, out_h); } -Result CloneCurrentObject(Handle h, Handle* out_h) { return ::cmifCloneCurrentObject(h, out_h); } -Result QueryPointerBufferSize(Handle h, u16* out_size) { return ::cmifQueryPointerBufferSize(h, out_size); } -Result CloneCurrentObjectEx(Handle h, u32 tag, Handle* out_h) { return ::cmifCloneCurrentObjectEx(h, tag, out_h); } - -} // namespace cmif - -namespace condvar { - -void Init(CondVar* c) { ::condvarInit(c); } -Result WaitTimeout(CondVar* c, Mutex* m, u64 timeout) { return ::condvarWaitTimeout(c, m, timeout); } -Result Wait(CondVar* c, Mutex* m) { return ::condvarWait(c, m); } -Result Wake(CondVar* c, int num) { return ::condvarWake(c, num); } -Result WakeOne(CondVar* c) { return ::condvarWakeOne(c); } -Result WakeAll(CondVar* c) { return ::condvarWakeAll(c); } - -} // namespace condvar - -namespace console { - -void SetFont(PrintConsole* console, ConsoleFont* font) { ::consoleSetFont(console, font); } -void SetWindow(PrintConsole* console, int x, int y, int width, int height) { ::consoleSetWindow(console, x, y, width, height); } -PrintConsole* GetDefault(void) { return ::consoleGetDefault(); } -PrintConsole * Select(PrintConsole* console) { return ::consoleSelect(console); } -PrintConsole* Init(PrintConsole* console) { return ::consoleInit(console); } -void Exit(PrintConsole* console) { ::consoleExit(console); } -void Update(PrintConsole* console) { ::consoleUpdate(console); } -void DebugInit(debugDevice device) { ::consoleDebugInit(device); } -void Clear(void) { ::consoleClear(); } - -} // namespace console - -namespace crc32 { - -u32 CalculateWithSeed(u32 seed, const void *src, size_t size) { return ::crc32CalculateWithSeed(seed, src, size); } -u32 Calculate(const void *src, size_t size) { return ::crc32Calculate(src, size); } - -} // namespace crc32 - -namespace crc32c { - -u32 CalculateWithSeed(u32 seed, const void *src, size_t size) { return ::crc32cCalculateWithSeed(seed, src, size); } -u32 Calculate(const void *src, size_t size) { return ::crc32cCalculate(src, size); } - -} // namespace crc32c - -namespace csrng { - -Result Initialize(void) { return ::csrngInitialize(); } -void Exit(void) { ::csrngExit(); } -Service* GetServiceSession(void) { return ::csrngGetServiceSession(); } -Result GetRandomBytes(void *out, size_t out_size) { return ::csrngGetRandomBytes(out, out_size); } - -} // namespace csrng - -namespace detect { - -bool Debugger(void) { return ::detectDebugger(); } -bool Mesosphere(void) { return ::detectMesosphere(); } - -} // namespace detect - -namespace diag { - -[[noreturn]] void AbortWithResult(Result res) { ::diagAbortWithResult(res); } - -} // namespace diag - -namespace ectxr { - -Result Initialize(void) { return ::ectxrInitialize(); } -void Exit(void) { ::ectxrExit(); } -Service* GetServiceSession(void) { return ::ectxrGetServiceSession(); } -Result PullContext(s32 *out0, u32 *out_total_size, u32 *out_size, void *dst, size_t dst_size, u32 descriptor, Result result) { return ::ectxrPullContext(out0, out_total_size, out_size, dst, dst_size, descriptor, result); } - -} // namespace ectxr - -namespace env { - -void Setup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr) { ::envSetup(ctx, main_thread, saved_lr); } -const char* GetLoaderInfo(void) { return ::envGetLoaderInfo(); } -u64 GetLoaderInfoSize(void) { return ::envGetLoaderInfoSize(); } -Handle GetMainThreadHandle(void) { return ::envGetMainThreadHandle(); } -bool IsNso(void) { return ::envIsNso(); } -bool HasHeapOverride(void) { return ::envHasHeapOverride(); } -void* GetHeapOverrideAddr(void) { return ::envGetHeapOverrideAddr(); } -u64 GetHeapOverrideSize(void) { return ::envGetHeapOverrideSize(); } -bool HasArgv(void) { return ::envHasArgv(); } -void* GetArgv(void) { return ::envGetArgv(); } -bool IsSyscallHinted(unsigned svc) { return ::envIsSyscallHinted(svc); } -Handle GetOwnProcessHandle(void) { return ::envGetOwnProcessHandle(); } -LoaderReturnFn GetExitFuncPtr(void) { return ::envGetExitFuncPtr(); } -void SetExitFuncPtr(LoaderReturnFn addr) { ::envSetExitFuncPtr(addr); } -Result SetNextLoad(const char* path, const char* argv) { return ::envSetNextLoad(path, argv); } -bool HasNextLoad(void) { return ::envHasNextLoad(); } -Result GetLastLoadResult(void) { return ::envGetLastLoadResult(); } -bool HasRandomSeed(void) { return ::envHasRandomSeed(); } -void GetRandomSeed(u64 out[2]) { ::envGetRandomSeed(out); } -AccountUid* GetUserIdStorage(void) { return ::envGetUserIdStorage(); } - -} // namespace env - -namespace error { - -ErrorCode CodeCreate(u32 low, u32 desc) { return ::errorCodeCreate(low, desc); } -ErrorCode CodeCreateResult(Result res) { return ::errorCodeCreateResult(res); } -ErrorCode CodeCreateInvalid(void) { return ::errorCodeCreateInvalid(); } -bool CodeIsValid(ErrorCode errorCode) { return ::errorCodeIsValid(errorCode); } -Result ResultShow(Result res, bool jumpFlag, const ErrorContext* ctx) { return ::errorResultShow(res, jumpFlag, ctx); } -Result CodeShow(ErrorCode errorCode, bool jumpFlag, const ErrorContext* ctx) { return ::errorCodeShow(errorCode, jumpFlag, ctx); } -Result ResultBacktraceCreate(ErrorResultBacktrace* backtrace, s32 count, const Result* entries) { return ::errorResultBacktraceCreate(backtrace, count, entries); } -Result ResultBacktraceShow(Result res, const ErrorResultBacktrace* backtrace) { return ::errorResultBacktraceShow(res, backtrace); } -Result EulaShow(SetRegion RegionCode) { return ::errorEulaShow(RegionCode); } -Result SystemUpdateEulaShow(SetRegion RegionCode, const ErrorEulaData* eula) { return ::errorSystemUpdateEulaShow(RegionCode, eula); } -Result CodeRecordShow(ErrorCode errorCode, u64 timestamp) { return ::errorCodeRecordShow(errorCode, timestamp); } -Result ResultRecordShow(Result res, u64 timestamp) { return ::errorResultRecordShow(res, timestamp); } -Result SystemCreate(ErrorSystemConfig* c, const char* dialog_message, const char* fullscreen_message) { return ::errorSystemCreate(c, dialog_message, fullscreen_message); } -Result SystemShow(ErrorSystemConfig* c) { return ::errorSystemShow(c); } -void SystemSetCode(ErrorSystemConfig* c, ErrorCode errorCode) { ::errorSystemSetCode(c, errorCode); } -void SystemSetResult(ErrorSystemConfig* c, Result res) { ::errorSystemSetResult(c, res); } -void SystemSetLanguageCode(ErrorSystemConfig* c, u64 LanguageCode) { ::errorSystemSetLanguageCode(c, LanguageCode); } -void SystemSetContext(ErrorSystemConfig* c, const ErrorContext* ctx) { ::errorSystemSetContext(c, ctx); } -Result ApplicationCreate(ErrorApplicationConfig* c, const char* dialog_message, const char* fullscreen_message) { return ::errorApplicationCreate(c, dialog_message, fullscreen_message); } -Result ApplicationShow(ErrorApplicationConfig* c) { return ::errorApplicationShow(c); } -void ApplicationSetNumber(ErrorApplicationConfig* c, u32 errorNumber) { ::errorApplicationSetNumber(c, errorNumber); } -void ApplicationSetLanguageCode(ErrorApplicationConfig* c, u64 LanguageCode) { ::errorApplicationSetLanguageCode(c, LanguageCode); } - -} // namespace error - -namespace event { - -Result Create(Event* t, bool autoclear) { return ::eventCreate(t, autoclear); } -void LoadRemote(Event* t, Handle handle, bool autoclear) { ::eventLoadRemote(t, handle, autoclear); } -void Close(Event* t) { ::eventClose(t); } -bool Active(Event* t) { return ::eventActive(t); } -Result Wait(Event* t, u64 timeout) { return ::eventWait(t, timeout); } -Result Fire(Event* t) { return ::eventFire(t); } -Result Clear(Event* t) { return ::eventClear(t); } - -} // namespace event - -namespace fan { - -Result Initialize(void) { return ::fanInitialize(); } -void Exit(void) { ::fanExit(); } -Service* GetServiceSession(void) { return ::fanGetServiceSession(); } -Result OpenController(FanController *out, u32 device_code) { return ::fanOpenController(out, device_code); } -void ControllerClose(FanController *controller) { ::fanControllerClose(controller); } -Result ControllerSetRotationSpeedLevel(FanController *controller, float level) { return ::fanControllerSetRotationSpeedLevel(controller, level); } -Result ControllerGetRotationSpeedLevel(FanController *controller, float *level) { return ::fanControllerGetRotationSpeedLevel(controller, level); } - -} // namespace fan - -namespace fatal { - -[[noreturn]] void Throw(Result err) { ::fatalThrow(err); } -void ThrowWithPolicy(Result err, FatalPolicy type) { ::fatalThrowWithPolicy(err, type); } -void ThrowWithContext(Result err, FatalPolicy type, FatalCpuContext *ctx) { ::fatalThrowWithContext(err, type, ctx); } - -} // namespace fatal - -namespace framebuffer { - -Result Create(Framebuffer* fb, NWindow *win, u32 width, u32 height, u32 format, u32 num_fbs) { return ::framebufferCreate(fb, win, width, height, format, num_fbs); } -Result MakeLinear(Framebuffer* fb) { return ::framebufferMakeLinear(fb); } -void Close(Framebuffer* fb) { ::framebufferClose(fb); } -void* Begin(Framebuffer* fb, u32* out_stride) { return ::framebufferBegin(fb, out_stride); } -void End(Framebuffer* fb) { ::framebufferEnd(fb); } - -} // namespace framebuffer - -namespace friends { - -Result LaShowFriendList(AccountUid uid) { return ::friendsLaShowFriendList(uid); } -Result LaShowUserDetailInfo(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName) { return ::friendsLaShowUserDetailInfo(uid, id, first_inAppScreenName, second_inAppScreenName); } -Result LaStartSendingFriendRequest(AccountUid uid, AccountNetworkServiceAccountId id, const FriendsInAppScreenName *first_inAppScreenName, const FriendsInAppScreenName *second_inAppScreenName) { return ::friendsLaStartSendingFriendRequest(uid, id, first_inAppScreenName, second_inAppScreenName); } -Result LaShowMethodsOfSendingFriendRequest(AccountUid uid) { return ::friendsLaShowMethodsOfSendingFriendRequest(uid); } -Result LaStartFacedFriendRequest(AccountUid uid) { return ::friendsLaStartFacedFriendRequest(uid); } -Result LaShowReceivedFriendRequestList(AccountUid uid) { return ::friendsLaShowReceivedFriendRequestList(uid); } -Result LaShowBlockedUserList(AccountUid uid) { return ::friendsLaShowBlockedUserList(uid); } -Result LaShowMyProfile(AccountUid uid) { return ::friendsLaShowMyProfile(uid); } -Result LaShowMyProfileForHomeMenu(AccountUid uid) { return ::friendsLaShowMyProfileForHomeMenu(uid); } -Result LaStartFriendInvitation(AccountUid uid, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size) { return ::friendsLaStartFriendInvitation(uid, id_count, desc, userdata, userdata_size); } -Result LaStartSendingFriendInvitation(AccountUid uid, const AccountNetworkServiceAccountId *id_list, s32 id_count, const FriendsFriendInvitationGameModeDescription *desc, const void* userdata, u64 userdata_size) { return ::friendsLaStartSendingFriendInvitation(uid, id_list, id_count, desc, userdata, userdata_size); } -Result LaShowReceivedInvitationDetail(AccountUid uid, FriendsFriendInvitationId invitation_id, FriendsFriendInvitationGroupId invitation_group_id) { return ::friendsLaShowReceivedInvitationDetail(uid, invitation_id, invitation_group_id); } -Result Initialize(FriendsServiceType service_type) { return ::friendsInitialize(service_type); } -void Exit(void) { ::friendsExit(); } -Service* GetServiceSession(void) { return ::friendsGetServiceSession(); } -Service* GetServiceSession_IFriendsService(void) { return ::friendsGetServiceSession_IFriendsService(); } -Result GetUserSetting(AccountUid uid, FriendsUserSetting *user_setting) { return ::friendsGetUserSetting(uid, user_setting); } -Result GetFriendInvitationNotificationEvent(Event *out_event) { return ::friendsGetFriendInvitationNotificationEvent(out_event); } -Result TryPopFriendInvitationNotificationInfo(AccountUid *uid, void* buffer, u64 size, u64 *out_size) { return ::friendsTryPopFriendInvitationNotificationInfo(uid, buffer, size, out_size); } - -} // namespace friends - -namespace fs { - -Result Initialize(void) { return ::fsInitialize(); } -void Exit(void) { ::fsExit(); } -Service* GetServiceSession(void) { return ::fsGetServiceSession(); } -void SetPriority(FsPriority prio) { ::fsSetPriority(prio); } -Result OpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath) { return ::fsOpenFileSystem(out, fsType, contentPath); } -Result OpenDataFileSystemByCurrentProcess(FsFileSystem *out) { return ::fsOpenDataFileSystemByCurrentProcess(out); } -Result OpenFileSystemWithPatch(FsFileSystem* out, u64 id, FsFileSystemType fsType) { return ::fsOpenFileSystemWithPatch(out, id, fsType); } -Result OpenFileSystemWithId(FsFileSystem* out, u64 id, FsFileSystemType fsType, const char* contentPath, FsContentAttributes attr) { return ::fsOpenFileSystemWithId(out, id, fsType, contentPath, attr); } -Result OpenDataFileSystemByProgramId(FsFileSystem *out, u64 program_id) { return ::fsOpenDataFileSystemByProgramId(out, program_id); } -Result OpenBisFileSystem(FsFileSystem* out, FsBisPartitionId partitionId, const char* string) { return ::fsOpenBisFileSystem(out, partitionId, string); } -Result OpenBisStorage(FsStorage* out, FsBisPartitionId partitionId) { return ::fsOpenBisStorage(out, partitionId); } -Result OpenSdCardFileSystem(FsFileSystem* out) { return ::fsOpenSdCardFileSystem(out); } -Result OpenHostFileSystem(FsFileSystem* out, const char *path) { return ::fsOpenHostFileSystem(out, path); } -Result OpenHostFileSystemWithOption(FsFileSystem* out, const char *path, u32 flags) { return ::fsOpenHostFileSystemWithOption(out, path, flags); } -Result DeleteSaveDataFileSystem(u64 application_id) { return ::fsDeleteSaveDataFileSystem(application_id); } -Result CreateSaveDataFileSystem(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info, const FsSaveDataMetaInfo* meta) { return ::fsCreateSaveDataFileSystem(attr, creation_info, meta); } -Result CreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info) { return ::fsCreateSaveDataFileSystemBySystemSaveDataId(attr, creation_info); } -Result DeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID) { return ::fsDeleteSaveDataFileSystemBySaveDataSpaceId(save_data_space_id, saveID); } -Result DeleteSaveDataFileSystemBySaveDataAttribute(FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute* attr) { return ::fsDeleteSaveDataFileSystemBySaveDataAttribute(save_data_space_id, attr); } -Result IsExFatSupported(bool* out) { return ::fsIsExFatSupported(out); } -Result OpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition) { return ::fsOpenGameCardFileSystem(out, handle, partition); } -Result ExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize) { return ::fsExtendSaveDataFileSystem(save_data_space_id, saveID, dataSize, journalSize); } -Result OpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { return ::fsOpenSaveDataFileSystem(out, save_data_space_id, attr); } -Result OpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { return ::fsOpenSaveDataFileSystemBySystemSaveDataId(out, save_data_space_id, attr); } -Result OpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { return ::fsOpenReadOnlySaveDataFileSystem(out, save_data_space_id, attr); } -Result ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID) { return ::fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(buf, len, save_data_space_id, saveID); } -Result ReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID) { return ::fsReadSaveDataFileSystemExtraData(buf, len, saveID); } -Result WriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID) { return ::fsWriteSaveDataFileSystemExtraData(buf, len, save_data_space_id, saveID); } -Result OpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id) { return ::fsOpenSaveDataInfoReader(out, save_data_space_id); } -Result OpenSaveDataInfoReaderWithFilter(FsSaveDataInfoReader* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataFilter *save_data_filter) { return ::fsOpenSaveDataInfoReaderWithFilter(out, save_data_space_id, save_data_filter); } -Result OpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id) { return ::fsOpenImageDirectoryFileSystem(out, image_directory_id); } -Result OpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id) { return ::fsOpenContentStorageFileSystem(out, content_storage_id); } -Result OpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id) { return ::fsOpenCustomStorageFileSystem(out, custom_storage_id); } -Result OpenDataStorageByCurrentProcess(FsStorage* out) { return ::fsOpenDataStorageByCurrentProcess(out); } -Result OpenDataStorageByProgramId(FsStorage *out, u64 program_id) { return ::fsOpenDataStorageByProgramId(out, program_id); } -Result OpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId) { return ::fsOpenDataStorageByDataId(out, dataId, storageId); } -Result OpenPatchDataStorageByCurrentProcess(FsStorage* out) { return ::fsOpenPatchDataStorageByCurrentProcess(out); } -Result OpenDataStorageByCurrentProcessForBatchRead(FsStorageForBatchRead* out) { return ::fsOpenDataStorageByCurrentProcessForBatchRead(out); } -Result OpenDataStorageByProgramIdForBatchRead(FsStorageForBatchRead* out, u64 id) { return ::fsOpenDataStorageByProgramIdForBatchRead(out, id); } -Result OpenDataStorageWithProgramIndexForBatchRead(FsStorageForBatchRead* out, u8 program_index) { return ::fsOpenDataStorageWithProgramIndexForBatchRead(out, program_index); } -Result OpenDataStorageByPathForBatchRead(FsStorageForBatchRead* out, const char* contentPath, FsContentAttributes attributes, FsFileSystemType fsType) { return ::fsOpenDataStorageByPathForBatchRead(out, contentPath, attributes, fsType); } -Result OpenDeviceOperator(FsDeviceOperator* out) { return ::fsOpenDeviceOperator(out); } -Result OpenSdCardDetectionEventNotifier(FsEventNotifier* out) { return ::fsOpenSdCardDetectionEventNotifier(out); } -Result IsSignedSystemPartitionOnSdCardValid(bool *out) { return ::fsIsSignedSystemPartitionOnSdCardValid(out); } -Result GetProgramId(u64* out, const char *path, FsContentAttributes attr) { return ::fsGetProgramId(out, path, attr); } -Result GetRightsIdByPath(const char* path, FsRightsId* out_rights_id) { return ::fsGetRightsIdByPath(path, out_rights_id); } -Result GetRightsIdAndKeyGenerationByPath(const char* path, FsContentAttributes attr, u8* out_key_generation, FsRightsId* out_rights_id) { return ::fsGetRightsIdAndKeyGenerationByPath(path, attr, out_key_generation, out_rights_id); } -Result GetContentStorageInfoIndex(s32 *out) { return ::fsGetContentStorageInfoIndex(out); } -Result DisableAutoSaveDataCreation(void) { return ::fsDisableAutoSaveDataCreation(); } -Result SetGlobalAccessLogMode(u32 mode) { return ::fsSetGlobalAccessLogMode(mode); } -Result GetGlobalAccessLogMode(u32* out_mode) { return ::fsGetGlobalAccessLogMode(out_mode); } -Result OutputAccessLogToSdCard(const char *log, size_t size) { return ::fsOutputAccessLogToSdCard(log, size); } -Result GetAndClearErrorInfo(FsFileSystemProxyErrorInfo *out) { return ::fsGetAndClearErrorInfo(out); } -Result GetAndClearMemoryReportInfo(FsMemoryReportInfo* out) { return ::fsGetAndClearMemoryReportInfo(out); } -Result GetProgramIndexForAccessLog(u32 *out_program_index, u32 *out_program_count) { return ::fsGetProgramIndexForAccessLog(out_program_index, out_program_count); } -Result Create_TemporaryStorage(u64 application_id, u64 owner_id, s64 size, u32 flags) { return ::fsCreate_TemporaryStorage(application_id, owner_id, size, flags); } -Result Create_SystemSaveDataWithOwner(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid, u64 owner_id, s64 size, s64 journal_size, u32 flags) { return ::fsCreate_SystemSaveDataWithOwner(save_data_space_id, system_save_data_id, uid, owner_id, size, journal_size, flags); } -Result Create_SystemSaveData(FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, s64 size, s64 journal_size, u32 flags) { return ::fsCreate_SystemSaveData(save_data_space_id, system_save_data_id, size, journal_size, flags); } -Result Open_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid) { return ::fsOpen_SaveData(out, application_id, uid); } -Result Open_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid) { return ::fsOpen_SaveDataReadOnly(out, application_id, uid); } -Result Open_BcatSaveData(FsFileSystem* out, u64 application_id) { return ::fsOpen_BcatSaveData(out, application_id); } -Result Open_DeviceSaveData(FsFileSystem* out, u64 application_id) { return ::fsOpen_DeviceSaveData(out, application_id); } -Result Open_TemporaryStorage(FsFileSystem* out) { return ::fsOpen_TemporaryStorage(out); } -Result Open_CacheStorage(FsFileSystem* out, u64 application_id, u16 save_data_index) { return ::fsOpen_CacheStorage(out, application_id, save_data_index); } -Result Open_SystemSaveData(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid) { return ::fsOpen_SystemSaveData(out, save_data_space_id, system_save_data_id, uid); } -Result Open_SystemBcatSaveData(FsFileSystem* out, u64 system_save_data_id) { return ::fsOpen_SystemBcatSaveData(out, system_save_data_id); } -Result FsCreateFile(FsFileSystem* fs, const char* path, s64 size, u32 option) { return ::fsFsCreateFile(fs, path, size, option); } -Result FsDeleteFile(FsFileSystem* fs, const char* path) { return ::fsFsDeleteFile(fs, path); } -Result FsCreateDirectory(FsFileSystem* fs, const char* path) { return ::fsFsCreateDirectory(fs, path); } -Result FsDeleteDirectory(FsFileSystem* fs, const char* path) { return ::fsFsDeleteDirectory(fs, path); } -Result FsDeleteDirectoryRecursively(FsFileSystem* fs, const char* path) { return ::fsFsDeleteDirectoryRecursively(fs, path); } -Result FsRenameFile(FsFileSystem* fs, const char* cur_path, const char* new_path) { return ::fsFsRenameFile(fs, cur_path, new_path); } -Result FsRenameDirectory(FsFileSystem* fs, const char* cur_path, const char* new_path) { return ::fsFsRenameDirectory(fs, cur_path, new_path); } -Result FsGetEntryType(FsFileSystem* fs, const char* path, FsDirEntryType* out) { return ::fsFsGetEntryType(fs, path, out); } -Result FsOpenFile(FsFileSystem* fs, const char* path, u32 mode, FsFile* out) { return ::fsFsOpenFile(fs, path, mode, out); } -Result FsOpenDirectory(FsFileSystem* fs, const char* path, u32 mode, FsDir* out) { return ::fsFsOpenDirectory(fs, path, mode, out); } -Result FsCommit(FsFileSystem* fs) { return ::fsFsCommit(fs); } -Result FsGetFreeSpace(FsFileSystem* fs, const char* path, s64* out) { return ::fsFsGetFreeSpace(fs, path, out); } -Result FsGetTotalSpace(FsFileSystem* fs, const char* path, s64* out) { return ::fsFsGetTotalSpace(fs, path, out); } -Result FsGetFileTimeStampRaw(FsFileSystem* fs, const char* path, FsTimeStampRaw *out) { return ::fsFsGetFileTimeStampRaw(fs, path, out); } -Result FsCleanDirectoryRecursively(FsFileSystem* fs, const char* path) { return ::fsFsCleanDirectoryRecursively(fs, path); } -Result FsQueryEntry(FsFileSystem* fs, void *out, size_t out_size, const void *in, size_t in_size, const char* path, FsFileSystemQueryId query_id) { return ::fsFsQueryEntry(fs, out, out_size, in, in_size, path, query_id); } -Result FsGetFileSystemAttribute(FsFileSystem* fs, FsFileSystemAttribute *out) { return ::fsFsGetFileSystemAttribute(fs, out); } -void FsClose(FsFileSystem* fs) { ::fsFsClose(fs); } -Result FsSetConcatenationFileAttribute(FsFileSystem* fs, const char *path) { return ::fsFsSetConcatenationFileAttribute(fs, path); } -Result FsIsValidSignedSystemPartitionOnSdCard(FsFileSystem* fs, bool *out) { return ::fsFsIsValidSignedSystemPartitionOnSdCard(fs, out); } -Result FileRead(FsFile* f, s64 off, void* buf, u64 read_size, u32 option, u64* bytes_read) { return ::fsFileRead(f, off, buf, read_size, option, bytes_read); } -Result FileWrite(FsFile* f, s64 off, const void* buf, u64 write_size, u32 option) { return ::fsFileWrite(f, off, buf, write_size, option); } -Result FileFlush(FsFile* f) { return ::fsFileFlush(f); } -Result FileSetSize(FsFile* f, s64 sz) { return ::fsFileSetSize(f, sz); } -Result FileGetSize(FsFile* f, s64* out) { return ::fsFileGetSize(f, out); } -Result FileOperateRange(FsFile* f, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out) { return ::fsFileOperateRange(f, op_id, off, len, out); } -void FileClose(FsFile* f) { ::fsFileClose(f); } -Result DirRead(FsDir* d, s64* total_entries, size_t max_entries, FsDirectoryEntry *buf) { return ::fsDirRead(d, total_entries, max_entries, buf); } -Result DirGetEntryCount(FsDir* d, s64* count) { return ::fsDirGetEntryCount(d, count); } -void DirClose(FsDir* d) { ::fsDirClose(d); } -Result StorageRead(FsStorage* s, s64 off, void* buf, u64 read_size) { return ::fsStorageRead(s, off, buf, read_size); } -Result StorageWrite(FsStorage* s, s64 off, const void* buf, u64 write_size) { return ::fsStorageWrite(s, off, buf, write_size); } -Result StorageFlush(FsStorage* s) { return ::fsStorageFlush(s); } -Result StorageSetSize(FsStorage* s, s64 sz) { return ::fsStorageSetSize(s, sz); } -Result StorageGetSize(FsStorage* s, s64* out) { return ::fsStorageGetSize(s, out); } -Result StorageOperateRange(FsStorage* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out) { return ::fsStorageOperateRange(s, op_id, off, len, out); } -void StorageClose(FsStorage* s) { ::fsStorageClose(s); } -Result StorageForBatchReadRead(FsStorageForBatchRead* s, s64 off, void* buf, u64 read_size) { return ::fsStorageForBatchReadRead(s, off, buf, read_size); } -Result StorageForBatchReadWrite(FsStorageForBatchRead* s, s64 off, const void* buf, u64 write_size) { return ::fsStorageForBatchReadWrite(s, off, buf, write_size); } -Result StorageForBatchReadFlush(FsStorageForBatchRead* s) { return ::fsStorageForBatchReadFlush(s); } -Result StorageForBatchReadSetSize(FsStorageForBatchRead* s, s64 sz) { return ::fsStorageForBatchReadSetSize(s, sz); } -Result StorageForBatchReadGetSize(FsStorageForBatchRead* s, s64* out) { return ::fsStorageForBatchReadGetSize(s, out); } -Result StorageForBatchReadOperateRange(FsStorageForBatchRead* s, FsOperationId op_id, s64 off, s64 len, FsRangeInfo* out) { return ::fsStorageForBatchReadOperateRange(s, op_id, off, len, out); } -Result StorageForBatchReadBatchRead(FsStorageForBatchRead* s, void* out0, void* out1, void* out2, void* out3, void* out4, void* out5, void* out6, const void* in) { return ::fsStorageForBatchReadBatchRead(s, out0, out1, out2, out3, out4, out5, out6, in); } -void StorageForBatchReadClose(FsStorageForBatchRead* s) { ::fsStorageForBatchReadClose(s); } -Result SaveDataInfoReaderRead(FsSaveDataInfoReader *s, FsSaveDataInfo* buf, size_t max_entries, s64* total_entries) { return ::fsSaveDataInfoReaderRead(s, buf, max_entries, total_entries); } -void SaveDataInfoReaderClose(FsSaveDataInfoReader *s) { ::fsSaveDataInfoReaderClose(s); } -Result EventNotifierGetEventHandle(FsEventNotifier* e, Event* out, bool autoclear) { return ::fsEventNotifierGetEventHandle(e, out, autoclear); } -void EventNotifierClose(FsEventNotifier* e) { ::fsEventNotifierClose(e); } -Result DeviceOperatorIsSdCardInserted(FsDeviceOperator* d, bool* out) { return ::fsDeviceOperatorIsSdCardInserted(d, out); } -Result DeviceOperatorGetSdCardSpeedMode(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetSdCardSpeedMode(d, out); } -Result DeviceOperatorGetSdCardCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetSdCardCid(d, dst, dst_size, size); } -Result DeviceOperatorGetSdCardUserAreaSize(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetSdCardUserAreaSize(d, out); } -Result DeviceOperatorGetSdCardProtectedAreaSize(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetSdCardProtectedAreaSize(d, out); } -Result DeviceOperatorGetAndClearSdCardErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetAndClearSdCardErrorInfo(d, out, out_log_size, dst, dst_size, size); } -Result DeviceOperatorGetMmcCid(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetMmcCid(d, dst, dst_size, size); } -Result DeviceOperatorGetMmcSpeedMode(FsDeviceOperator* d, s64* out) { return ::fsDeviceOperatorGetMmcSpeedMode(d, out); } -Result DeviceOperatorGetMmcPatrolCount(FsDeviceOperator* d, u32* out) { return ::fsDeviceOperatorGetMmcPatrolCount(d, out); } -Result DeviceOperatorGetAndClearMmcErrorInfo(FsDeviceOperator* d, FsStorageErrorInfo* out, s64 *out_log_size, void *dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetAndClearMmcErrorInfo(d, out, out_log_size, dst, dst_size, size); } -Result DeviceOperatorGetMmcExtendedCsd(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetMmcExtendedCsd(d, dst, dst_size, size); } -Result DeviceOperatorIsGameCardInserted(FsDeviceOperator* d, bool* out) { return ::fsDeviceOperatorIsGameCardInserted(d, out); } -Result DeviceOperatorGetGameCardHandle(FsDeviceOperator* d, FsGameCardHandle* out) { return ::fsDeviceOperatorGetGameCardHandle(d, out); } -Result DeviceOperatorGetGameCardUpdatePartitionInfo(FsDeviceOperator* d, const FsGameCardHandle* handle, FsGameCardUpdatePartitionInfo* out) { return ::fsDeviceOperatorGetGameCardUpdatePartitionInfo(d, handle, out); } -Result DeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCardHandle* handle, u8 *out) { return ::fsDeviceOperatorGetGameCardAttribute(d, handle, out); } -Result DeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64* out_size, s64 size) { return ::fsDeviceOperatorGetGameCardDeviceCertificate(d, handle, dst, dst_size, out_size, size); } -Result DeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetGameCardIdSet(d, dst, dst_size, size); } -Result DeviceOperatorGetGameCardErrorReportInfo(FsDeviceOperator* d, FsGameCardErrorReportInfo* out) { return ::fsDeviceOperatorGetGameCardErrorReportInfo(d, out); } -Result DeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return ::fsDeviceOperatorGetGameCardDeviceId(d, dst, dst_size, size); } -Result DeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size) { return ::fsDeviceOperatorChallengeCardExistence(d, handle, dst, dst_size, seed, seed_size, value, value_size); } -void DeviceOperatorClose(FsDeviceOperator* d) { ::fsDeviceOperatorClose(d); } - -} // namespace fs - -namespace fsdev { - -FsDirectoryEntry* DirGetEntries(fsdev_dir_t *dir) { return ::fsdevDirGetEntries(dir); } -Result MountSdmc(void) { return ::fsdevMountSdmc(); } -Result MountSaveData(const char *name, u64 application_id, AccountUid uid) { return ::fsdevMountSaveData(name, application_id, uid); } -Result MountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid) { return ::fsdevMountSaveDataReadOnly(name, application_id, uid); } -Result MountBcatSaveData(const char *name, u64 application_id) { return ::fsdevMountBcatSaveData(name, application_id); } -Result MountDeviceSaveData(const char *name, u64 application_id) { return ::fsdevMountDeviceSaveData(name, application_id); } -Result MountTemporaryStorage(const char *name) { return ::fsdevMountTemporaryStorage(name); } -Result MountCacheStorage(const char *name, u64 application_id, u16 save_data_index) { return ::fsdevMountCacheStorage(name, application_id, save_data_index); } -Result MountSystemSaveData(const char *name, FsSaveDataSpaceId save_data_space_id, u64 system_save_data_id, AccountUid uid) { return ::fsdevMountSystemSaveData(name, save_data_space_id, system_save_data_id, uid); } -Result MountSystemBcatSaveData(const char *name, u64 system_save_data_id) { return ::fsdevMountSystemBcatSaveData(name, system_save_data_id); } -int MountDevice(const char *name, FsFileSystem fs) { return ::fsdevMountDevice(name, fs); } -int UnmountDevice(const char *name) { return ::fsdevUnmountDevice(name); } -Result CommitDevice(const char *name) { return ::fsdevCommitDevice(name); } -FsFileSystem* GetDeviceFileSystem(const char *name) { return ::fsdevGetDeviceFileSystem(name); } -int TranslatePath(const char *path, FsFileSystem** device, char *outpath) { return ::fsdevTranslatePath(path, device, outpath); } -Result SetConcatenationFileAttribute(const char *path) { return ::fsdevSetConcatenationFileAttribute(path); } -Result IsValidSignedSystemPartitionOnSdCard(const char *name, bool *out) { return ::fsdevIsValidSignedSystemPartitionOnSdCard(name, out); } -Result CreateFile(const char* path, size_t size, u32 flags) { return ::fsdevCreateFile(path, size, flags); } -Result DeleteDirectoryRecursively(const char *path) { return ::fsdevDeleteDirectoryRecursively(path); } -Result UnmountAll(void) { return ::fsdevUnmountAll(); } -Result GetLastResult(void) { return ::fsdevGetLastResult(); } - -} // namespace fsdev - -namespace fsldr { - -Result Initialize(void) { return ::fsldrInitialize(); } -void Exit(void) { ::fsldrExit(); } -Service* GetServiceSession(void) { return ::fsldrGetServiceSession(); } -Result OpenCodeFileSystem(FsCodeInfo* out_code_info, u64 tid, NcmStorageId storage_id, const char *path, FsContentAttributes attr, FsFileSystem* out) { return ::fsldrOpenCodeFileSystem(out_code_info, tid, storage_id, path, attr, out); } -Result IsArchivedProgram(u64 pid, bool *out) { return ::fsldrIsArchivedProgram(pid, out); } - -} // namespace fsldr - -namespace fspr { - -Result Initialize(void) { return ::fsprInitialize(); } -void Exit(void) { ::fsprExit(); } -Service* GetServiceSession(void) { return ::fsprGetServiceSession(); } -Result RegisterProgram(u64 pid, u64 tid, NcmStorageId sid, const void *fs_access_header, size_t fah_size, const void *fs_access_control, size_t fac_size, u8 fs_access_control_restriction_mode) { return ::fsprRegisterProgram(pid, tid, sid, fs_access_header, fah_size, fs_access_control, fac_size, fs_access_control_restriction_mode); } -Result UnregisterProgram(u64 pid) { return ::fsprUnregisterProgram(pid); } -Result SetCurrentProcess(void) { return ::fsprSetCurrentProcess(); } -Result SetEnabledProgramVerification(bool enabled) { return ::fsprSetEnabledProgramVerification(enabled); } - -} // namespace fspr - -namespace gpio { - -Result Initialize(void) { return ::gpioInitialize(); } -void Exit(void) { ::gpioExit(); } -Service* GetServiceSession(void) { return ::gpioGetServiceSession(); } -Result OpenSession(GpioPadSession *out, GpioPadName name) { return ::gpioOpenSession(out, name); } -Result OpenSession2(GpioPadSession *out, u32 device_code, u32 access_mode) { return ::gpioOpenSession2(out, device_code, access_mode); } -Result IsWakeEventActive(bool *out, GpioPadName name) { return ::gpioIsWakeEventActive(out, name); } -Result IsWakeEventActive2(bool *out, u32 device_code) { return ::gpioIsWakeEventActive2(out, device_code); } -Result PadSetDirection(GpioPadSession *p, GpioDirection dir) { return ::gpioPadSetDirection(p, dir); } -Result PadGetDirection(GpioPadSession *p, GpioDirection *out) { return ::gpioPadGetDirection(p, out); } -Result PadSetInterruptMode(GpioPadSession *p, GpioInterruptMode mode) { return ::gpioPadSetInterruptMode(p, mode); } -Result PadGetInterruptMode(GpioPadSession *p, GpioInterruptMode *out) { return ::gpioPadGetInterruptMode(p, out); } -Result PadSetInterruptEnable(GpioPadSession *p, bool en) { return ::gpioPadSetInterruptEnable(p, en); } -Result PadGetInterruptEnable(GpioPadSession *p, bool *out) { return ::gpioPadGetInterruptEnable(p, out); } -Result PadGetInterruptStatus(GpioPadSession *p, GpioInterruptStatus *out) { return ::gpioPadGetInterruptStatus(p, out); } -Result PadClearInterruptStatus(GpioPadSession *p) { return ::gpioPadClearInterruptStatus(p); } -Result PadSetValue(GpioPadSession *p, GpioValue val) { return ::gpioPadSetValue(p, val); } -Result PadGetValue(GpioPadSession *p, GpioValue *out) { return ::gpioPadGetValue(p, out); } -Result PadBindInterrupt(GpioPadSession *p, Event *out) { return ::gpioPadBindInterrupt(p, out); } -Result PadUnbindInterrupt(GpioPadSession *p) { return ::gpioPadUnbindInterrupt(p); } -Result PadSetDebounceEnabled(GpioPadSession *p, bool en) { return ::gpioPadSetDebounceEnabled(p, en); } -Result PadGetDebounceEnabled(GpioPadSession *p, bool *out) { return ::gpioPadGetDebounceEnabled(p, out); } -Result PadSetDebounceTime(GpioPadSession *p, s32 ms) { return ::gpioPadSetDebounceTime(p, ms); } -Result PadGetDebounceTime(GpioPadSession *p, s32 *out) { return ::gpioPadGetDebounceTime(p, out); } -void PadClose(GpioPadSession *p) { ::gpioPadClose(p); } - -} // namespace gpio - -namespace grc { - -Result TrimGameMovie(GrcGameMovieId *dst_movieid, const GrcGameMovieId *src_movieid, size_t tmem_size, const void* thumbnail, s32 start, s32 end) { return ::grcTrimGameMovie(dst_movieid, src_movieid, tmem_size, thumbnail, start, end); } -void CreateOffscreenRecordingParameter(GrcOffscreenRecordingParameter *param) { ::grcCreateOffscreenRecordingParameter(param); } -Result CreateMovieMaker(GrcMovieMaker *m, size_t size) { return ::grcCreateMovieMaker(m, size); } -void MovieMakerClose(GrcMovieMaker *m) { ::grcMovieMakerClose(m); } -NWindow* MovieMakerGetNWindow(GrcMovieMaker *m) { return ::grcMovieMakerGetNWindow(m); } -Result MovieMakerAbort(GrcMovieMaker *m) { return ::grcMovieMakerAbort(m); } -Result MovieMakerStart(GrcMovieMaker *m, const GrcOffscreenRecordingParameter *param) { return ::grcMovieMakerStart(m, param); } -Result MovieMakerFinish(GrcMovieMaker *m, s32 width, s32 height, const void* userdata, size_t userdata_size, const void* thumbnail, size_t thumbnail_size, CapsApplicationAlbumEntry *entry) { return ::grcMovieMakerFinish(m, width, height, userdata, userdata_size, thumbnail, thumbnail_size, entry); } -Result MovieMakerGetError(GrcMovieMaker *m) { return ::grcMovieMakerGetError(m); } -Result MovieMakerEncodeAudioSample(GrcMovieMaker *m, const void* buffer, size_t size) { return ::grcMovieMakerEncodeAudioSample(m, buffer, size); } - -} // namespace grc - -namespace grcd { - -Result Initialize(void) { return ::grcdInitialize(); } -void Exit(void) { ::grcdExit(); } -Service* GetServiceSession(void) { return ::grcdGetServiceSession(); } -Result Begin(void) { return ::grcdBegin(); } -Result Transfer(GrcStream stream, void* buffer, size_t size, u32 *num_frames, u32 *data_size, u64 *start_timestamp) { return ::grcdTransfer(stream, buffer, size, num_frames, data_size, start_timestamp); } - -} // namespace grcd - -namespace hid { - -void LaCreateControllerSupportArg(HidLaControllerSupportArg *arg) { ::hidLaCreateControllerSupportArg(arg); } -void LaCreateControllerFirmwareUpdateArg(HidLaControllerFirmwareUpdateArg *arg) { ::hidLaCreateControllerFirmwareUpdateArg(arg); } -void LaCreateControllerKeyRemappingArg(HidLaControllerKeyRemappingArg *arg) { ::hidLaCreateControllerKeyRemappingArg(arg); } -Result LaSetExplainText(HidLaControllerSupportArg *arg, const char *str, HidNpadIdType id) { return ::hidLaSetExplainText(arg, str, id); } -Result LaShowControllerSupport(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg) { return ::hidLaShowControllerSupport(result_info, arg); } -Result LaShowControllerStrapGuide(void) { return ::hidLaShowControllerStrapGuide(); } -Result LaShowControllerFirmwareUpdate(const HidLaControllerFirmwareUpdateArg *arg) { return ::hidLaShowControllerFirmwareUpdate(arg); } -Result LaShowControllerSupportForSystem(HidLaControllerSupportResultInfo *result_info, const HidLaControllerSupportArg *arg, bool flag) { return ::hidLaShowControllerSupportForSystem(result_info, arg, flag); } -Result LaShowControllerFirmwareUpdateForSystem(const HidLaControllerFirmwareUpdateArg *arg, HidLaControllerSupportCaller caller) { return ::hidLaShowControllerFirmwareUpdateForSystem(arg, caller); } -Result LaShowControllerKeyRemappingForSystem(const HidLaControllerKeyRemappingArg *arg, HidLaControllerSupportCaller caller) { return ::hidLaShowControllerKeyRemappingForSystem(arg, caller); } -Result Initialize(void) { return ::hidInitialize(); } -void Exit(void) { ::hidExit(); } -Service* GetServiceSession(void) { return ::hidGetServiceSession(); } -void* GetSharedmemAddr(void) { return ::hidGetSharedmemAddr(); } -void InitializeTouchScreen(void) { ::hidInitializeTouchScreen(); } -size_t GetTouchScreenStates(HidTouchScreenState *states, size_t count) { return ::hidGetTouchScreenStates(states, count); } -void InitializeMouse(void) { ::hidInitializeMouse(); } -size_t GetMouseStates(HidMouseState *states, size_t count) { return ::hidGetMouseStates(states, count); } -void InitializeKeyboard(void) { ::hidInitializeKeyboard(); } -size_t GetKeyboardStates(HidKeyboardState *states, size_t count) { return ::hidGetKeyboardStates(states, count); } -bool KeyboardStateGetKey(const HidKeyboardState *state, HidKeyboardKey key) { return ::hidKeyboardStateGetKey(state, key); } -size_t GetHomeButtonStates(HidHomeButtonState *states, size_t count) { return ::hidGetHomeButtonStates(states, count); } -size_t GetSleepButtonStates(HidSleepButtonState *states, size_t count) { return ::hidGetSleepButtonStates(states, count); } -size_t GetCaptureButtonStates(HidCaptureButtonState *states, size_t count) { return ::hidGetCaptureButtonStates(states, count); } -void InitializeNpad(void) { ::hidInitializeNpad(); } -u32 GetNpadStyleSet(HidNpadIdType id) { return ::hidGetNpadStyleSet(id); } -HidNpadJoyAssignmentMode GetNpadJoyAssignment(HidNpadIdType id) { return ::hidGetNpadJoyAssignment(id); } -Result GetNpadControllerColorSingle(HidNpadIdType id, HidNpadControllerColor *color) { return ::hidGetNpadControllerColorSingle(id, color); } -Result GetNpadControllerColorSplit(HidNpadIdType id, HidNpadControllerColor *color_left, HidNpadControllerColor *color_right) { return ::hidGetNpadControllerColorSplit(id, color_left, color_right); } -u32 GetNpadDeviceType(HidNpadIdType id) { return ::hidGetNpadDeviceType(id); } -void GetNpadSystemProperties(HidNpadIdType id, HidNpadSystemProperties *out) { ::hidGetNpadSystemProperties(id, out); } -void GetNpadSystemButtonProperties(HidNpadIdType id, HidNpadSystemButtonProperties *out) { ::hidGetNpadSystemButtonProperties(id, out); } -void GetNpadPowerInfoSingle(HidNpadIdType id, HidPowerInfo *info) { ::hidGetNpadPowerInfoSingle(id, info); } -void GetNpadPowerInfoSplit(HidNpadIdType id, HidPowerInfo *info_left, HidPowerInfo *info_right) { ::hidGetNpadPowerInfoSplit(id, info_left, info_right); } -u32 GetAppletFooterUiAttributesSet(HidNpadIdType id) { return ::hidGetAppletFooterUiAttributesSet(id); } -HidAppletFooterUiType GetAppletFooterUiTypes(HidNpadIdType id) { return ::hidGetAppletFooterUiTypes(id); } -HidNpadLagerType GetNpadLagerType(HidNpadIdType id) { return ::hidGetNpadLagerType(id); } -size_t GetNpadStatesFullKey(HidNpadIdType id, HidNpadFullKeyState *states, size_t count) { return ::hidGetNpadStatesFullKey(id, states, count); } -size_t GetNpadStatesHandheld(HidNpadIdType id, HidNpadHandheldState *states, size_t count) { return ::hidGetNpadStatesHandheld(id, states, count); } -size_t GetNpadStatesJoyDual(HidNpadIdType id, HidNpadJoyDualState *states, size_t count) { return ::hidGetNpadStatesJoyDual(id, states, count); } -size_t GetNpadStatesJoyLeft(HidNpadIdType id, HidNpadJoyLeftState *states, size_t count) { return ::hidGetNpadStatesJoyLeft(id, states, count); } -size_t GetNpadStatesJoyRight(HidNpadIdType id, HidNpadJoyRightState *states, size_t count) { return ::hidGetNpadStatesJoyRight(id, states, count); } -size_t GetNpadStatesGc(HidNpadIdType id, HidNpadGcState *states, size_t count) { return ::hidGetNpadStatesGc(id, states, count); } -size_t GetNpadStatesPalma(HidNpadIdType id, HidNpadPalmaState *states, size_t count) { return ::hidGetNpadStatesPalma(id, states, count); } -size_t GetNpadStatesLark(HidNpadIdType id, HidNpadLarkState *states, size_t count) { return ::hidGetNpadStatesLark(id, states, count); } -size_t GetNpadStatesHandheldLark(HidNpadIdType id, HidNpadHandheldLarkState *states, size_t count) { return ::hidGetNpadStatesHandheldLark(id, states, count); } -size_t GetNpadStatesLucia(HidNpadIdType id, HidNpadLuciaState *states, size_t count) { return ::hidGetNpadStatesLucia(id, states, count); } -size_t GetNpadStatesLager(HidNpadIdType id, HidNpadLagerState *states, size_t count) { return ::hidGetNpadStatesLager(id, states, count); } -size_t GetNpadStatesSystemExt(HidNpadIdType id, HidNpadSystemExtState *states, size_t count) { return ::hidGetNpadStatesSystemExt(id, states, count); } -size_t GetNpadStatesSystem(HidNpadIdType id, HidNpadSystemState *states, size_t count) { return ::hidGetNpadStatesSystem(id, states, count); } -size_t GetSixAxisSensorStates(HidSixAxisSensorHandle handle, HidSixAxisSensorState *states, size_t count) { return ::hidGetSixAxisSensorStates(handle, states, count); } -void InitializeGesture(void) { ::hidInitializeGesture(); } -size_t GetGestureStates(HidGestureState *states, size_t count) { return ::hidGetGestureStates(states, count); } -Result SendKeyboardLockKeyEvent(u32 events) { return ::hidSendKeyboardLockKeyEvent(events); } -Result GetSixAxisSensorHandles(HidSixAxisSensorHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style) { return ::hidGetSixAxisSensorHandles(handles, total_handles, id, style); } -Result StartSixAxisSensor(HidSixAxisSensorHandle handle) { return ::hidStartSixAxisSensor(handle); } -Result StopSixAxisSensor(HidSixAxisSensorHandle handle) { return ::hidStopSixAxisSensor(handle); } -Result IsSixAxisSensorFusionEnabled(HidSixAxisSensorHandle handle, bool *out) { return ::hidIsSixAxisSensorFusionEnabled(handle, out); } -Result EnableSixAxisSensorFusion(HidSixAxisSensorHandle handle, bool flag) { return ::hidEnableSixAxisSensorFusion(handle, flag); } -Result SetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float unk0, float unk1) { return ::hidSetSixAxisSensorFusionParameters(handle, unk0, unk1); } -Result GetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle, float *unk0, float *unk1) { return ::hidGetSixAxisSensorFusionParameters(handle, unk0, unk1); } -Result ResetSixAxisSensorFusionParameters(HidSixAxisSensorHandle handle) { return ::hidResetSixAxisSensorFusionParameters(handle); } -Result SetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode mode) { return ::hidSetGyroscopeZeroDriftMode(handle, mode); } -Result GetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle, HidGyroscopeZeroDriftMode *mode) { return ::hidGetGyroscopeZeroDriftMode(handle, mode); } -Result ResetGyroscopeZeroDriftMode(HidSixAxisSensorHandle handle) { return ::hidResetGyroscopeZeroDriftMode(handle); } -Result IsSixAxisSensorAtRest(HidSixAxisSensorHandle handle, bool *out) { return ::hidIsSixAxisSensorAtRest(handle, out); } -Result IsFirmwareUpdateAvailableForSixAxisSensor(HidSixAxisSensorHandle handle, bool *out) { return ::hidIsFirmwareUpdateAvailableForSixAxisSensor(handle, out); } -Result SetSupportedNpadStyleSet(u32 style_set) { return ::hidSetSupportedNpadStyleSet(style_set); } -Result GetSupportedNpadStyleSet(u32 *style_set) { return ::hidGetSupportedNpadStyleSet(style_set); } -Result SetSupportedNpadIdType(const HidNpadIdType *ids, size_t count) { return ::hidSetSupportedNpadIdType(ids, count); } -Result AcquireNpadStyleSetUpdateEventHandle(HidNpadIdType id, Event* out_event, bool autoclear) { return ::hidAcquireNpadStyleSetUpdateEventHandle(id, out_event, autoclear); } -Result DisconnectNpad(HidNpadIdType id) { return ::hidDisconnectNpad(id); } -Result GetPlayerLedPattern(HidNpadIdType id, u8 *out) { return ::hidGetPlayerLedPattern(id, out); } -Result SetNpadJoyHoldType(HidNpadJoyHoldType type) { return ::hidSetNpadJoyHoldType(type); } -Result GetNpadJoyHoldType(HidNpadJoyHoldType *type) { return ::hidGetNpadJoyHoldType(type); } -Result SetNpadJoyAssignmentModeSingleByDefault(HidNpadIdType id) { return ::hidSetNpadJoyAssignmentModeSingleByDefault(id); } -Result SetNpadJoyAssignmentModeSingle(HidNpadIdType id, HidNpadJoyDeviceType type) { return ::hidSetNpadJoyAssignmentModeSingle(id, type); } -Result SetNpadJoyAssignmentModeDual(HidNpadIdType id) { return ::hidSetNpadJoyAssignmentModeDual(id); } -Result MergeSingleJoyAsDualJoy(HidNpadIdType id0, HidNpadIdType id1) { return ::hidMergeSingleJoyAsDualJoy(id0, id1); } -Result StartLrAssignmentMode(void) { return ::hidStartLrAssignmentMode(); } -Result StopLrAssignmentMode(void) { return ::hidStopLrAssignmentMode(); } -Result SetNpadHandheldActivationMode(HidNpadHandheldActivationMode mode) { return ::hidSetNpadHandheldActivationMode(mode); } -Result GetNpadHandheldActivationMode(HidNpadHandheldActivationMode *out) { return ::hidGetNpadHandheldActivationMode(out); } -Result SwapNpadAssignment(HidNpadIdType id0, HidNpadIdType id1) { return ::hidSwapNpadAssignment(id0, id1); } -Result EnableUnintendedHomeButtonInputProtection(HidNpadIdType id, bool flag) { return ::hidEnableUnintendedHomeButtonInputProtection(id, flag); } -Result SetNpadJoyAssignmentModeSingleWithDestination(HidNpadIdType id, HidNpadJoyDeviceType type, bool *flag, HidNpadIdType *dest) { return ::hidSetNpadJoyAssignmentModeSingleWithDestination(id, type, flag, dest); } -Result SetNpadAnalogStickUseCenterClamp(bool flag) { return ::hidSetNpadAnalogStickUseCenterClamp(flag); } -Result SetNpadCaptureButtonAssignment(HidNpadStyleTag style, u64 buttons) { return ::hidSetNpadCaptureButtonAssignment(style, buttons); } -Result ClearNpadCaptureButtonAssignment(void) { return ::hidClearNpadCaptureButtonAssignment(); } -Result InitializeVibrationDevices(HidVibrationDeviceHandle *handles, s32 total_handles, HidNpadIdType id, HidNpadStyleTag style) { return ::hidInitializeVibrationDevices(handles, total_handles, id, style); } -Result GetVibrationDeviceInfo(HidVibrationDeviceHandle handle, HidVibrationDeviceInfo *out) { return ::hidGetVibrationDeviceInfo(handle, out); } -Result SendVibrationValue(HidVibrationDeviceHandle handle, const HidVibrationValue *value) { return ::hidSendVibrationValue(handle, value); } -Result GetActualVibrationValue(HidVibrationDeviceHandle handle, HidVibrationValue *out) { return ::hidGetActualVibrationValue(handle, out); } -Result PermitVibration(bool flag) { return ::hidPermitVibration(flag); } -Result IsVibrationPermitted(bool *flag) { return ::hidIsVibrationPermitted(flag); } -Result SendVibrationValues(const HidVibrationDeviceHandle *handles, const HidVibrationValue *values, s32 count) { return ::hidSendVibrationValues(handles, values, count); } -Result SendVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand cmd) { return ::hidSendVibrationGcErmCommand(handle, cmd); } -Result GetActualVibrationGcErmCommand(HidVibrationDeviceHandle handle, HidVibrationGcErmCommand *out) { return ::hidGetActualVibrationGcErmCommand(handle, out); } -Result BeginPermitVibrationSession(void) { return ::hidBeginPermitVibrationSession(); } -Result EndPermitVibrationSession(void) { return ::hidEndPermitVibrationSession(); } -Result IsVibrationDeviceMounted(HidVibrationDeviceHandle handle, bool *flag) { return ::hidIsVibrationDeviceMounted(handle, flag); } -Result StartSevenSixAxisSensor(void) { return ::hidStartSevenSixAxisSensor(); } -Result StopSevenSixAxisSensor(void) { return ::hidStopSevenSixAxisSensor(); } -Result InitializeSevenSixAxisSensor(void) { return ::hidInitializeSevenSixAxisSensor(); } -Result FinalizeSevenSixAxisSensor(void) { return ::hidFinalizeSevenSixAxisSensor(); } -Result SetSevenSixAxisSensorFusionStrength(float strength) { return ::hidSetSevenSixAxisSensorFusionStrength(strength); } -Result GetSevenSixAxisSensorFusionStrength(float *strength) { return ::hidGetSevenSixAxisSensorFusionStrength(strength); } -Result ResetSevenSixAxisSensorTimestamp(void) { return ::hidResetSevenSixAxisSensorTimestamp(); } -Result GetSevenSixAxisSensorStates(HidSevenSixAxisSensorState *states, size_t count, size_t *total_out) { return ::hidGetSevenSixAxisSensorStates(states, count, total_out); } -Result IsSevenSixAxisSensorAtRest(bool *out) { return ::hidIsSevenSixAxisSensorAtRest(out); } -Result GetSensorFusionError(float *out) { return ::hidGetSensorFusionError(out); } -Result GetGyroBias(UtilFloat3 *out) { return ::hidGetGyroBias(out); } -Result IsUsbFullKeyControllerEnabled(bool *out) { return ::hidIsUsbFullKeyControllerEnabled(out); } -Result EnableUsbFullKeyController(bool flag) { return ::hidEnableUsbFullKeyController(flag); } -Result IsUsbFullKeyControllerConnected(HidNpadIdType id, bool *out) { return ::hidIsUsbFullKeyControllerConnected(id, out); } -Result GetNpadInterfaceType(HidNpadIdType id, u8 *out) { return ::hidGetNpadInterfaceType(id, out); } -Result GetNpadOfHighestBatteryLevel(const HidNpadIdType *ids, size_t count, HidNpadIdType *out) { return ::hidGetNpadOfHighestBatteryLevel(ids, count, out); } -Result GetPalmaConnectionHandle(HidNpadIdType id, HidPalmaConnectionHandle *out) { return ::hidGetPalmaConnectionHandle(id, out); } -Result InitializePalma(HidPalmaConnectionHandle handle) { return ::hidInitializePalma(handle); } -Result AcquirePalmaOperationCompleteEvent(HidPalmaConnectionHandle handle, Event* out_event, bool autoclear) { return ::hidAcquirePalmaOperationCompleteEvent(handle, out_event, autoclear); } -Result GetPalmaOperationInfo(HidPalmaConnectionHandle handle, HidPalmaOperationInfo *out) { return ::hidGetPalmaOperationInfo(handle, out); } -Result PlayPalmaActivity(HidPalmaConnectionHandle handle, u16 val) { return ::hidPlayPalmaActivity(handle, val); } -Result SetPalmaFrModeType(HidPalmaConnectionHandle handle, HidPalmaFrModeType type) { return ::hidSetPalmaFrModeType(handle, type); } -Result ReadPalmaStep(HidPalmaConnectionHandle handle) { return ::hidReadPalmaStep(handle); } -Result EnablePalmaStep(HidPalmaConnectionHandle handle, bool flag) { return ::hidEnablePalmaStep(handle, flag); } -Result ResetPalmaStep(HidPalmaConnectionHandle handle) { return ::hidResetPalmaStep(handle); } -Result ReadPalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size) { return ::hidReadPalmaApplicationSection(handle, inval0, size); } -Result WritePalmaApplicationSection(HidPalmaConnectionHandle handle, s32 inval0, u64 size, const HidPalmaApplicationSectionAccessBuffer *buf) { return ::hidWritePalmaApplicationSection(handle, inval0, size, buf); } -Result ReadPalmaUniqueCode(HidPalmaConnectionHandle handle) { return ::hidReadPalmaUniqueCode(handle); } -Result SetPalmaUniqueCodeInvalid(HidPalmaConnectionHandle handle) { return ::hidSetPalmaUniqueCodeInvalid(handle); } -Result WritePalmaActivityEntry(HidPalmaConnectionHandle handle, u16 unk, const HidPalmaActivityEntry *entry) { return ::hidWritePalmaActivityEntry(handle, unk, entry); } -Result WritePalmaRgbLedPatternEntry(HidPalmaConnectionHandle handle, u16 unk, const void* buffer, size_t size) { return ::hidWritePalmaRgbLedPatternEntry(handle, unk, buffer, size); } -Result WritePalmaWaveEntry(HidPalmaConnectionHandle handle, HidPalmaWaveSet wave_set, u16 unk, const void* buffer, size_t tmem_size, size_t size) { return ::hidWritePalmaWaveEntry(handle, wave_set, unk, buffer, tmem_size, size); } -Result SetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle, s32 version) { return ::hidSetPalmaDataBaseIdentificationVersion(handle, version); } -Result GetPalmaDataBaseIdentificationVersion(HidPalmaConnectionHandle handle) { return ::hidGetPalmaDataBaseIdentificationVersion(handle); } -Result SuspendPalmaFeature(HidPalmaConnectionHandle handle, u32 features) { return ::hidSuspendPalmaFeature(handle, features); } -Result ReadPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk) { return ::hidReadPalmaPlayLog(handle, unk); } -Result ResetPalmaPlayLog(HidPalmaConnectionHandle handle, u16 unk) { return ::hidResetPalmaPlayLog(handle, unk); } -Result SetIsPalmaAllConnectable(bool flag) { return ::hidSetIsPalmaAllConnectable(flag); } -Result SetIsPalmaPairedConnectable(bool flag) { return ::hidSetIsPalmaPairedConnectable(flag); } -Result PairPalma(HidPalmaConnectionHandle handle) { return ::hidPairPalma(handle); } -Result CancelWritePalmaWaveEntry(HidPalmaConnectionHandle handle) { return ::hidCancelWritePalmaWaveEntry(handle); } -Result EnablePalmaBoostMode(bool flag) { return ::hidEnablePalmaBoostMode(flag); } -Result GetPalmaBluetoothAddress(HidPalmaConnectionHandle handle, BtdrvAddress *out) { return ::hidGetPalmaBluetoothAddress(handle, out); } -Result SetDisallowedPalmaConnection(const BtdrvAddress *addrs, s32 count) { return ::hidSetDisallowedPalmaConnection(addrs, count); } -Result SetNpadCommunicationMode(HidNpadCommunicationMode mode) { return ::hidSetNpadCommunicationMode(mode); } -Result GetNpadCommunicationMode(HidNpadCommunicationMode *out) { return ::hidGetNpadCommunicationMode(out); } -Result SetTouchScreenConfiguration(const HidTouchScreenConfigurationForNx *config) { return ::hidSetTouchScreenConfiguration(config); } -Result IsFirmwareUpdateNeededForNotification(bool *out) { return ::hidIsFirmwareUpdateNeededForNotification(out); } - -} // namespace hid - -namespace hidbus { - -Result GetServiceSession(Service* srv_out) { return ::hidbusGetServiceSession(srv_out); } -void* GetSharedmemAddr(void) { return ::hidbusGetSharedmemAddr(); } -Result GetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type) { return ::hidbusGetBusHandle(handle, flag, id, bus_type); } -Result Initialize(HidbusBusHandle handle) { return ::hidbusInitialize(handle); } -Result Finalize(HidbusBusHandle handle) { return ::hidbusFinalize(handle); } -Result EnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id) { return ::hidbusEnableExternalDevice(handle, flag, device_id); } -Result SendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size) { return ::hidbusSendAndReceive(handle, inbuf, inbuf_size, outbuf, outbuf_size, out_size); } -Result EnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode) { return ::hidbusEnableJoyPollingReceiveMode(handle, inbuf, inbuf_size, workbuf, workbuf_size, polling_mode); } -Result DisableJoyPollingReceiveMode(HidbusBusHandle handle) { return ::hidbusDisableJoyPollingReceiveMode(handle); } -Result GetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count) { return ::hidbusGetJoyPollingReceivedData(handle, recv_data, count); } - -} // namespace hidbus - -namespace hiddbg { - -Result Initialize(void) { return ::hiddbgInitialize(); } -void Exit(void) { ::hiddbgExit(); } -Service* GetServiceSession(void) { return ::hiddbgGetServiceSession(); } -Result SetDebugPadAutoPilotState(const HiddbgDebugPadAutoPilotState *state) { return ::hiddbgSetDebugPadAutoPilotState(state); } -Result UnsetDebugPadAutoPilotState(void) { return ::hiddbgUnsetDebugPadAutoPilotState(); } -Result SetTouchScreenAutoPilotState(const HidTouchState *states, s32 count) { return ::hiddbgSetTouchScreenAutoPilotState(states, count); } -Result UnsetTouchScreenAutoPilotState(void) { return ::hiddbgUnsetTouchScreenAutoPilotState(); } -Result SetMouseAutoPilotState(const HiddbgMouseAutoPilotState *state) { return ::hiddbgSetMouseAutoPilotState(state); } -Result UnsetMouseAutoPilotState(void) { return ::hiddbgUnsetMouseAutoPilotState(); } -Result SetKeyboardAutoPilotState(const HiddbgKeyboardAutoPilotState *state) { return ::hiddbgSetKeyboardAutoPilotState(state); } -Result UnsetKeyboardAutoPilotState(void) { return ::hiddbgUnsetKeyboardAutoPilotState(); } -Result DeactivateHomeButton(void) { return ::hiddbgDeactivateHomeButton(); } -Result SetSleepButtonAutoPilotState(const HiddbgSleepButtonAutoPilotState *state) { return ::hiddbgSetSleepButtonAutoPilotState(state); } -Result UnsetSleepButtonAutoPilotState(void) { return ::hiddbgUnsetSleepButtonAutoPilotState(); } -Result UpdateControllerColor(u32 colorBody, u32 colorButtons, HidsysUniquePadId unique_pad_id) { return ::hiddbgUpdateControllerColor(colorBody, colorButtons, unique_pad_id); } -Result UpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip, u32 colorRightGrip, u8 inval, HidsysUniquePadId unique_pad_id) { return ::hiddbgUpdateDesignInfo(colorBody, colorButtons, colorLeftGrip, colorRightGrip, inval, unique_pad_id); } -Result AcquireOperationEventHandle(Event* out_event, bool autoclear, HidsysUniquePadId unique_pad_id) { return ::hiddbgAcquireOperationEventHandle(out_event, autoclear, unique_pad_id); } -Result ReadSerialFlash(u32 offset, void* buffer, size_t size, HidsysUniquePadId unique_pad_id) { return ::hiddbgReadSerialFlash(offset, buffer, size, unique_pad_id); } -Result WriteSerialFlash(u32 offset, void* buffer, size_t tmem_size, size_t size, HidsysUniquePadId unique_pad_id) { return ::hiddbgWriteSerialFlash(offset, buffer, tmem_size, size, unique_pad_id); } -Result GetOperationResult(HidsysUniquePadId unique_pad_id) { return ::hiddbgGetOperationResult(unique_pad_id); } -Result GetUniquePadDeviceTypeSetInternal(HidsysUniquePadId unique_pad_id, u32 *out) { return ::hiddbgGetUniquePadDeviceTypeSetInternal(unique_pad_id, out); } -Result GetAbstractedPadHandles(HiddbgAbstractedPadHandle *handles, s32 count, s32 *total_out) { return ::hiddbgGetAbstractedPadHandles(handles, count, total_out); } -Result GetAbstractedPadState(HiddbgAbstractedPadHandle handle, HiddbgAbstractedPadState *state) { return ::hiddbgGetAbstractedPadState(handle, state); } -Result GetAbstractedPadsState(HiddbgAbstractedPadHandle *handles, HiddbgAbstractedPadState *states, s32 count, s32 *total_out) { return ::hiddbgGetAbstractedPadsState(handles, states, count, total_out); } -Result SetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId, const HiddbgAbstractedPadState *state) { return ::hiddbgSetAutoPilotVirtualPadState(AbstractedVirtualPadId, state); } -Result UnsetAutoPilotVirtualPadState(s8 AbstractedVirtualPadId) { return ::hiddbgUnsetAutoPilotVirtualPadState(AbstractedVirtualPadId); } -Result UnsetAllAutoPilotVirtualPadState(void) { return ::hiddbgUnsetAllAutoPilotVirtualPadState(); } -Result AttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, size_t size) { return ::hiddbgAttachHdlsWorkBuffer(session_id, buffer, size); } -Result ReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id) { return ::hiddbgReleaseHdlsWorkBuffer(session_id); } -Result IsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgHdlsHandle handle, bool *out) { return ::hiddbgIsHdlsVirtualDeviceAttached(session_id, handle, out); } -Result DumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgHdlsNpadAssignment *state) { return ::hiddbgDumpHdlsNpadAssignmentState(session_id, state); } -Result DumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList *state) { return ::hiddbgDumpHdlsStates(session_id, state); } -Result ApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const HiddbgHdlsNpadAssignment *state, bool flag) { return ::hiddbgApplyHdlsNpadAssignmentState(session_id, state, flag); } -Result ApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdlsStateList *state) { return ::hiddbgApplyHdlsStateList(session_id, state); } -Result AttachHdlsVirtualDevice(HiddbgHdlsHandle *handle, const HiddbgHdlsDeviceInfo *info) { return ::hiddbgAttachHdlsVirtualDevice(handle, info); } -Result DetachHdlsVirtualDevice(HiddbgHdlsHandle handle) { return ::hiddbgDetachHdlsVirtualDevice(handle); } -Result SetHdlsState(HiddbgHdlsHandle handle, const HiddbgHdlsState *state) { return ::hiddbgSetHdlsState(handle, state); } - -} // namespace hiddbg - -namespace hidsys { - -Result Initialize(void) { return ::hidsysInitialize(); } -void Exit(void) { ::hidsysExit(); } -Service* GetServiceSession(void) { return ::hidsysGetServiceSession(); } -Result SendKeyboardLockKeyEvent(u32 events) { return ::hidsysSendKeyboardLockKeyEvent(events); } -Result AcquireHomeButtonEventHandle(Event* out_event, bool autoclear) { return ::hidsysAcquireHomeButtonEventHandle(out_event, autoclear); } -Result ActivateHomeButton(void) { return ::hidsysActivateHomeButton(); } -Result AcquireSleepButtonEventHandle(Event* out_event, bool autoclear) { return ::hidsysAcquireSleepButtonEventHandle(out_event, autoclear); } -Result ActivateSleepButton(void) { return ::hidsysActivateSleepButton(); } -Result AcquireCaptureButtonEventHandle(Event* out_event, bool autoclear) { return ::hidsysAcquireCaptureButtonEventHandle(out_event, autoclear); } -Result ActivateCaptureButton(void) { return ::hidsysActivateCaptureButton(); } -Result ApplyNpadSystemCommonPolicy(void) { return ::hidsysApplyNpadSystemCommonPolicy(); } -Result GetLastActiveNpad(u32 *out) { return ::hidsysGetLastActiveNpad(out); } -Result GetSupportedNpadStyleSetOfCallerApplet(u32 *out) { return ::hidsysGetSupportedNpadStyleSetOfCallerApplet(out); } -Result GetNpadInterfaceType(HidNpadIdType id, u8 *out) { return ::hidsysGetNpadInterfaceType(id, out); } -Result GetNpadLeftRightInterfaceType(HidNpadIdType id, u8 *out0, u8 *out1) { return ::hidsysGetNpadLeftRightInterfaceType(id, out0, out1); } -Result HasBattery(HidNpadIdType id, bool *out) { return ::hidsysHasBattery(id, out); } -Result HasLeftRightBattery(HidNpadIdType id, bool *out0, bool *out1) { return ::hidsysHasLeftRightBattery(id, out0, out1); } -Result GetUniquePadsFromNpad(HidNpadIdType id, HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out) { return ::hidsysGetUniquePadsFromNpad(id, unique_pad_ids, count, total_out); } -Result SetAppletResourceUserId(void) { return ::hidsysSetAppletResourceUserId(); } -Result EnableAppletToGetInput(bool enable) { return ::hidsysEnableAppletToGetInput(enable); } -Result EnableHandheldHids(void) { return ::hidsysEnableHandheldHids(); } -Result DisableHandheldHids(void) { return ::hidsysDisableHandheldHids(); } -Result SetJoyConRailEnabled(bool enable) { return ::hidsysSetJoyConRailEnabled(enable); } -Result IsJoyConRailEnabled(bool *out) { return ::hidsysIsJoyConRailEnabled(out); } -Result IsHandheldHidsEnabled(bool *out) { return ::hidsysIsHandheldHidsEnabled(out); } -Result IsJoyConAttachedOnAllRail(bool *out) { return ::hidsysIsJoyConAttachedOnAllRail(out); } -Result IsInvertedControllerConnectedOnRail(bool *out) { return ::hidsysIsInvertedControllerConnectedOnRail(out); } -Result AcquireUniquePadConnectionEventHandle(Event *out_event) { return ::hidsysAcquireUniquePadConnectionEventHandle(out_event); } -Result GetUniquePadIds(HidsysUniquePadId *unique_pad_ids, s32 count, s32 *total_out) { return ::hidsysGetUniquePadIds(unique_pad_ids, count, total_out); } -Result AcquireJoyDetachOnBluetoothOffEventHandle(Event *out_event, bool autoclear) { return ::hidsysAcquireJoyDetachOnBluetoothOffEventHandle(out_event, autoclear); } -Result GetUniquePadBluetoothAddress(HidsysUniquePadId unique_pad_id, BtdrvAddress *address) { return ::hidsysGetUniquePadBluetoothAddress(unique_pad_id, address); } -Result DisconnectUniquePad(HidsysUniquePadId unique_pad_id) { return ::hidsysDisconnectUniquePad(unique_pad_id); } -Result GetUniquePadType(HidsysUniquePadId unique_pad_id, HidsysUniquePadType *pad_type) { return ::hidsysGetUniquePadType(unique_pad_id, pad_type); } -Result GetUniquePadInterface(HidsysUniquePadId unique_pad_id, HidNpadInterfaceType *interface) { return ::hidsysGetUniquePadInterface(unique_pad_id, interface); } -Result GetUniquePadSerialNumber(HidsysUniquePadId unique_pad_id, HidsysUniquePadSerialNumber *serial) { return ::hidsysGetUniquePadSerialNumber(unique_pad_id, serial); } -Result GetUniquePadControllerNumber(HidsysUniquePadId unique_pad_id, u64 *number) { return ::hidsysGetUniquePadControllerNumber(unique_pad_id, number); } -Result SetNotificationLedPattern(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id) { return ::hidsysSetNotificationLedPattern(pattern, unique_pad_id); } -Result SetNotificationLedPatternWithTimeout(const HidsysNotificationLedPattern *pattern, HidsysUniquePadId unique_pad_id, u64 timeout) { return ::hidsysSetNotificationLedPatternWithTimeout(pattern, unique_pad_id, timeout); } -Result IsUsbFullKeyControllerEnabled(bool *out) { return ::hidsysIsUsbFullKeyControllerEnabled(out); } -Result EnableUsbFullKeyController(bool flag) { return ::hidsysEnableUsbFullKeyController(flag); } -Result IsUsbConnected(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsUsbConnected(unique_pad_id, out); } -Result GetTouchScreenDefaultConfiguration(HidTouchScreenConfigurationForNx *touch_screen_configuration) { return ::hidsysGetTouchScreenDefaultConfiguration(touch_screen_configuration); } -Result IsFirmwareUpdateNeededForNotification(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsFirmwareUpdateNeededForNotification(unique_pad_id, out); } -Result LegacyIsButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysLegacyIsButtonConfigSupported(unique_pad_id, out); } -Result IsButtonConfigSupported(BtdrvAddress addr, bool *out) { return ::hidsysIsButtonConfigSupported(addr, out); } -Result IsButtonConfigEmbeddedSupported(bool *out) { return ::hidsysIsButtonConfigEmbeddedSupported(out); } -Result LegacyDeleteButtonConfig(HidsysUniquePadId unique_pad_id) { return ::hidsysLegacyDeleteButtonConfig(unique_pad_id); } -Result DeleteButtonConfig(BtdrvAddress addr) { return ::hidsysDeleteButtonConfig(addr); } -Result DeleteButtonConfigEmbedded(void) { return ::hidsysDeleteButtonConfigEmbedded(); } -Result LegacySetButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool flag) { return ::hidsysLegacySetButtonConfigEnabled(unique_pad_id, flag); } -Result SetButtonConfigEnabled(BtdrvAddress addr, bool flag) { return ::hidsysSetButtonConfigEnabled(addr, flag); } -Result SetButtonConfigEmbeddedEnabled(bool flag) { return ::hidsysSetButtonConfigEmbeddedEnabled(flag); } -Result LegacyIsButtonConfigEnabled(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysLegacyIsButtonConfigEnabled(unique_pad_id, out); } -Result IsButtonConfigEnabled(BtdrvAddress addr, bool *out) { return ::hidsysIsButtonConfigEnabled(addr, out); } -Result IsButtonConfigEmbeddedEnabled(bool *out) { return ::hidsysIsButtonConfigEmbeddedEnabled(out); } -Result LegacySetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigEmbedded *config) { return ::hidsysLegacySetButtonConfigEmbedded(unique_pad_id, config); } -Result SetButtonConfigEmbedded(const HidsysButtonConfigEmbedded *config) { return ::hidsysSetButtonConfigEmbedded(config); } -Result LegacySetButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigFull *config) { return ::hidsysLegacySetButtonConfigFull(unique_pad_id, config); } -Result SetButtonConfigFull(BtdrvAddress addr, const HidsysButtonConfigFull *config) { return ::hidsysSetButtonConfigFull(addr, config); } -Result LegacySetButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigLeft *config) { return ::hidsysLegacySetButtonConfigLeft(unique_pad_id, config); } -Result SetButtonConfigLeft(BtdrvAddress addr, const HidsysButtonConfigLeft *config) { return ::hidsysSetButtonConfigLeft(addr, config); } -Result LegacySetButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidsysButtonConfigRight *config) { return ::hidsysLegacySetButtonConfigRight(unique_pad_id, config); } -Result SetButtonConfigRight(BtdrvAddress addr, const HidsysButtonConfigRight *config) { return ::hidsysSetButtonConfigRight(addr, config); } -Result LegacyGetButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidsysButtonConfigEmbedded *config) { return ::hidsysLegacyGetButtonConfigEmbedded(unique_pad_id, config); } -Result GetButtonConfigEmbedded(HidsysButtonConfigEmbedded *config) { return ::hidsysGetButtonConfigEmbedded(config); } -Result LegacyGetButtonConfigFull(HidsysUniquePadId unique_pad_id, HidsysButtonConfigFull *config) { return ::hidsysLegacyGetButtonConfigFull(unique_pad_id, config); } -Result GetButtonConfigFull(BtdrvAddress addr, HidsysButtonConfigFull *config) { return ::hidsysGetButtonConfigFull(addr, config); } -Result LegacyGetButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidsysButtonConfigLeft *config) { return ::hidsysLegacyGetButtonConfigLeft(unique_pad_id, config); } -Result GetButtonConfigLeft(BtdrvAddress addr, HidsysButtonConfigLeft *config) { return ::hidsysGetButtonConfigLeft(addr, config); } -Result LegacyGetButtonConfigRight(HidsysUniquePadId unique_pad_id, HidsysButtonConfigRight *config) { return ::hidsysLegacyGetButtonConfigRight(unique_pad_id, config); } -Result GetButtonConfigRight(BtdrvAddress addr, HidsysButtonConfigRight *config) { return ::hidsysGetButtonConfigRight(addr, config); } -Result IsCustomButtonConfigSupported(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsCustomButtonConfigSupported(unique_pad_id, out); } -Result IsDefaultButtonConfigEmbedded(const HidcfgButtonConfigEmbedded *config, bool *out) { return ::hidsysIsDefaultButtonConfigEmbedded(config, out); } -Result IsDefaultButtonConfigFull(const HidcfgButtonConfigFull *config, bool *out) { return ::hidsysIsDefaultButtonConfigFull(config, out); } -Result IsDefaultButtonConfigLeft(const HidcfgButtonConfigLeft *config, bool *out) { return ::hidsysIsDefaultButtonConfigLeft(config, out); } -Result IsDefaultButtonConfigRight(const HidcfgButtonConfigRight *config, bool *out) { return ::hidsysIsDefaultButtonConfigRight(config, out); } -Result IsButtonConfigStorageEmbeddedEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageEmbeddedEmpty(index, out); } -Result IsButtonConfigStorageFullEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageFullEmpty(index, out); } -Result IsButtonConfigStorageLeftEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageLeftEmpty(index, out); } -Result IsButtonConfigStorageRightEmpty(s32 index, bool *out) { return ::hidsysIsButtonConfigStorageRightEmpty(index, out); } -Result GetButtonConfigStorageEmbeddedDeprecated(s32 index, HidcfgButtonConfigEmbedded *config) { return ::hidsysGetButtonConfigStorageEmbeddedDeprecated(index, config); } -Result GetButtonConfigStorageFullDeprecated(s32 index, HidcfgButtonConfigFull *config) { return ::hidsysGetButtonConfigStorageFullDeprecated(index, config); } -Result GetButtonConfigStorageLeftDeprecated(s32 index, HidcfgButtonConfigLeft *config) { return ::hidsysGetButtonConfigStorageLeftDeprecated(index, config); } -Result GetButtonConfigStorageRightDeprecated(s32 index, HidcfgButtonConfigRight *config) { return ::hidsysGetButtonConfigStorageRightDeprecated(index, config); } -Result SetButtonConfigStorageEmbeddedDeprecated(s32 index, const HidcfgButtonConfigEmbedded *config) { return ::hidsysSetButtonConfigStorageEmbeddedDeprecated(index, config); } -Result SetButtonConfigStorageFullDeprecated(s32 index, const HidcfgButtonConfigFull *config) { return ::hidsysSetButtonConfigStorageFullDeprecated(index, config); } -Result SetButtonConfigStorageLeftDeprecated(s32 index, const HidcfgButtonConfigLeft *config) { return ::hidsysSetButtonConfigStorageLeftDeprecated(index, config); } -Result SetButtonConfigStorageRightDeprecated(s32 index, const HidcfgButtonConfigRight *config) { return ::hidsysSetButtonConfigStorageRightDeprecated(index, config); } -Result DeleteButtonConfigStorageEmbedded(s32 index) { return ::hidsysDeleteButtonConfigStorageEmbedded(index); } -Result DeleteButtonConfigStorageFull(s32 index) { return ::hidsysDeleteButtonConfigStorageFull(index); } -Result DeleteButtonConfigStorageLeft(s32 index) { return ::hidsysDeleteButtonConfigStorageLeft(index); } -Result DeleteButtonConfigStorageRight(s32 index) { return ::hidsysDeleteButtonConfigStorageRight(index); } -Result IsUsingCustomButtonConfig(HidsysUniquePadId unique_pad_id, bool *out) { return ::hidsysIsUsingCustomButtonConfig(unique_pad_id, out); } -Result IsAnyCustomButtonConfigEnabled(bool *out) { return ::hidsysIsAnyCustomButtonConfigEnabled(out); } -Result SetAllCustomButtonConfigEnabled(u64 AppletResourceUserId, bool flag) { return ::hidsysSetAllCustomButtonConfigEnabled(AppletResourceUserId, flag); } -Result SetAllDefaultButtonConfig(void) { return ::hidsysSetAllDefaultButtonConfig(); } -Result SetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigEmbedded *config) { return ::hidsysSetHidButtonConfigEmbedded(unique_pad_id, config); } -Result SetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigFull *config) { return ::hidsysSetHidButtonConfigFull(unique_pad_id, config); } -Result SetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigLeft *config) { return ::hidsysSetHidButtonConfigLeft(unique_pad_id, config); } -Result SetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, const HidcfgButtonConfigRight *config) { return ::hidsysSetHidButtonConfigRight(unique_pad_id, config); } -Result GetHidButtonConfigEmbedded(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigEmbedded *config) { return ::hidsysGetHidButtonConfigEmbedded(unique_pad_id, config); } -Result GetHidButtonConfigFull(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigFull *config) { return ::hidsysGetHidButtonConfigFull(unique_pad_id, config); } -Result GetHidButtonConfigLeft(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigLeft *config) { return ::hidsysGetHidButtonConfigLeft(unique_pad_id, config); } -Result GetHidButtonConfigRight(HidsysUniquePadId unique_pad_id, HidcfgButtonConfigRight *config) { return ::hidsysGetHidButtonConfigRight(unique_pad_id, config); } -Result GetButtonConfigStorageEmbedded(s32 index, HidcfgButtonConfigEmbedded *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageEmbedded(index, config, name); } -Result GetButtonConfigStorageFull(s32 index, HidcfgButtonConfigFull *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageFull(index, config, name); } -Result GetButtonConfigStorageLeft(s32 index, HidcfgButtonConfigLeft *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageLeft(index, config, name); } -Result GetButtonConfigStorageRight(s32 index, HidcfgButtonConfigRight *config, HidcfgStorageName *name) { return ::hidsysGetButtonConfigStorageRight(index, config, name); } -Result SetButtonConfigStorageEmbedded(s32 index, const HidcfgButtonConfigEmbedded *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageEmbedded(index, config, name); } -Result SetButtonConfigStorageFull(s32 index, const HidcfgButtonConfigFull *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageFull(index, config, name); } -Result SetButtonConfigStorageLeft(s32 index, const HidcfgButtonConfigLeft *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageLeft(index, config, name); } -Result SetButtonConfigStorageRight(s32 index, const HidcfgButtonConfigRight *config, const HidcfgStorageName *name) { return ::hidsysSetButtonConfigStorageRight(index, config, name); } - -} // namespace hidsys - -namespace hipc { - -HipcStaticDescriptor MakeSendStatic(const void* buffer, size_t size, u8 index) { return ::hipcMakeSendStatic(buffer, size, index); } -HipcBufferDescriptor MakeBuffer(const void* buffer, size_t size, HipcBufferMode mode) { return ::hipcMakeBuffer(buffer, size, mode); } -HipcRecvListEntry MakeRecvStatic(void* buffer, size_t size) { return ::hipcMakeRecvStatic(buffer, size); } -void* GetStaticAddress(const HipcStaticDescriptor* desc) { return ::hipcGetStaticAddress(desc); } -size_t GetStaticSize(const HipcStaticDescriptor* desc) { return ::hipcGetStaticSize(desc); } -void* GetBufferAddress(const HipcBufferDescriptor* desc) { return ::hipcGetBufferAddress(desc); } -size_t GetBufferSize(const HipcBufferDescriptor* desc) { return ::hipcGetBufferSize(desc); } -HipcRequest CalcRequestLayout(HipcMetadata meta, void* base) { return ::hipcCalcRequestLayout(meta, base); } -HipcRequest MakeRequest(void* base, HipcMetadata meta) { return ::hipcMakeRequest(base, meta); } -HipcParsedRequest ParseRequest(void* base) { return ::hipcParseRequest(base); } -HipcResponse ParseResponse(void* base) { return ::hipcParseResponse(base); } - -} // namespace hipc - -namespace hmac { - -void Sha256ContextCreate(HmacSha256Context *out, const void *key, size_t key_size) { ::hmacSha256ContextCreate(out, key, key_size); } -void Sha256ContextUpdate(HmacSha256Context *ctx, const void *src, size_t size) { ::hmacSha256ContextUpdate(ctx, src, size); } -void Sha256ContextGetMac(HmacSha256Context *ctx, void *dst) { ::hmacSha256ContextGetMac(ctx, dst); } -void Sha256CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size) { ::hmacSha256CalculateMac(dst, key, key_size, src, size); } -void Sha1ContextCreate(HmacSha1Context *out, const void *key, size_t key_size) { ::hmacSha1ContextCreate(out, key, key_size); } -void Sha1ContextUpdate(HmacSha1Context *ctx, const void *src, size_t size) { ::hmacSha1ContextUpdate(ctx, src, size); } -void Sha1ContextGetMac(HmacSha1Context *ctx, void *dst) { ::hmacSha1ContextGetMac(ctx, dst); } -void Sha1CalculateMac(void *dst, const void *key, size_t key_size, const void *src, size_t size) { ::hmacSha1CalculateMac(dst, key, key_size, src, size); } - -} // namespace hmac - -namespace hosversion { - -u32 Get(void) { return ::hosversionGet(); } -void Set(u32 version) { ::hosversionSet(version); } -bool IsAtmosphere(void) { return ::hosversionIsAtmosphere(); } -bool AtLeast(u8 major, u8 minor, u8 micro) { return ::hosversionAtLeast(major, minor, micro); } -bool Before(u8 major, u8 minor, u8 micro) { return ::hosversionBefore(major, minor, micro); } -bool Between(u8 major1, u8 major2) { return ::hosversionBetween(major1, major2); } - -} // namespace hosversion - -namespace hwopus { - -Result DecoderInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount) { return ::hwopusDecoderInitialize(decoder, SampleRate, ChannelCount); } -void DecoderExit(HwopusDecoder* decoder) { ::hwopusDecoderExit(decoder); } -Result DecoderMultistreamInitialize(HwopusDecoder* decoder, s32 SampleRate, s32 ChannelCount, s32 TotalStreamCount, s32 StereoStreamCount, u8 *channel_mapping) { return ::hwopusDecoderMultistreamInitialize(decoder, SampleRate, ChannelCount, TotalStreamCount, StereoStreamCount, channel_mapping); } -Result DecodeInterleaved(HwopusDecoder* decoder, s32 *DecodedDataSize, s32 *DecodedSampleCount, const void* opusin, size_t opusin_size, s16 *pcmbuf, size_t pcmbuf_size) { return ::hwopusDecodeInterleaved(decoder, DecodedDataSize, DecodedSampleCount, opusin, opusin_size, pcmbuf, pcmbuf_size); } - -} // namespace hwopus - -namespace i2c { - -Result Initialize(void) { return ::i2cInitialize(); } -void Exit(void) { ::i2cExit(); } -Service* GetServiceSession(void) { return ::i2cGetServiceSession(); } -Result OpenSession(I2cSession *out, I2cDevice dev) { return ::i2cOpenSession(out, dev); } - -} // namespace i2c - -namespace i2csession { - -Result SendAuto(I2cSession *s, const void *buf, size_t size, I2cTransactionOption option) { return ::i2csessionSendAuto(s, buf, size, option); } -Result ReceiveAuto(I2cSession *s, void *buf, size_t size, I2cTransactionOption option) { return ::i2csessionReceiveAuto(s, buf, size, option); } -Result ExecuteCommandList(I2cSession *s, void *dst, size_t dst_size, const void *cmd_list, size_t cmd_list_size) { return ::i2csessionExecuteCommandList(s, dst, dst_size, cmd_list, cmd_list_size); } -void Close(I2cSession *s) { ::i2csessionClose(s); } - -} // namespace i2csession - -namespace idlesys { - -Result Initialize(void) { return ::idlesysInitialize(); } -void Exit(void) { ::idlesysExit(); } -Service* GetServiceSession(void) { return ::idlesysGetServiceSession(); } -Result ReportUserIsActive(void) { return ::idlesysReportUserIsActive(); } - -} // namespace idlesys - -namespace insr { - -Result Initialize(void) { return ::insrInitialize(); } -void Exit(void) { ::insrExit(); } -Service* GetServiceSession(void) { return ::insrGetServiceSession(); } -Result GetLastTick(u32 id, u64 *tick) { return ::insrGetLastTick(id, tick); } -Result GetReadableEvent(u32 id, Event *out) { return ::insrGetReadableEvent(id, out); } - -} // namespace insr - -namespace inss { - -Result Initialize(void) { return ::inssInitialize(); } -void Exit(void) { ::inssExit(); } -Service* GetServiceSession(void) { return ::inssGetServiceSession(); } -Result GetWritableEvent(u32 id, Event *out) { return ::inssGetWritableEvent(id, out); } - -} // namespace inss - -namespace irs { - -Result Initialize(void) { return ::irsInitialize(); } -void Exit(void) { ::irsExit(); } -Service* GetServiceSession(void) { return ::irsGetServiceSession(); } -void* GetSharedmemAddr(void) { return ::irsGetSharedmemAddr(); } -Result GetIrCameraHandle(IrsIrCameraHandle *handle, HidNpadIdType id) { return ::irsGetIrCameraHandle(handle, id); } -Result GetIrCameraStatus(IrsIrCameraHandle handle, IrsIrCameraStatus *out) { return ::irsGetIrCameraStatus(handle, out); } -Result CheckFirmwareUpdateNecessity(IrsIrCameraHandle handle, bool *out) { return ::irsCheckFirmwareUpdateNecessity(handle, out); } -Result GetImageProcessorStatus(IrsIrCameraHandle handle, IrsImageProcessorStatus *out) { return ::irsGetImageProcessorStatus(handle, out); } -Result StopImageProcessor(IrsIrCameraHandle handle) { return ::irsStopImageProcessor(handle); } -Result StopImageProcessorAsync(IrsIrCameraHandle handle) { return ::irsStopImageProcessorAsync(handle); } -Result RunMomentProcessor(IrsIrCameraHandle handle, const IrsMomentProcessorConfig *config) { return ::irsRunMomentProcessor(handle, config); } -Result GetMomentProcessorStates(IrsIrCameraHandle handle, IrsMomentProcessorState *states, s32 count, s32 *total_out) { return ::irsGetMomentProcessorStates(handle, states, count, total_out); } -IrsMomentStatistic CalculateMomentRegionStatistic(const IrsMomentProcessorState *state, IrsRect rect, s32 region_x, s32 region_y, s32 region_width, s32 region_height) { return ::irsCalculateMomentRegionStatistic(state, rect, region_x, region_y, region_width, region_height); } -Result RunClusteringProcessor(IrsIrCameraHandle handle, const IrsClusteringProcessorConfig *config) { return ::irsRunClusteringProcessor(handle, config); } -Result GetClusteringProcessorStates(IrsIrCameraHandle handle, IrsClusteringProcessorState *states, s32 count, s32 *total_out) { return ::irsGetClusteringProcessorStates(handle, states, count, total_out); } -Result RunImageTransferProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorConfig *config, size_t size) { return ::irsRunImageTransferProcessor(handle, config, size); } -Result RunImageTransferExProcessor(IrsIrCameraHandle handle, const IrsImageTransferProcessorExConfig *config, size_t size) { return ::irsRunImageTransferExProcessor(handle, config, size); } -Result GetImageTransferProcessorState(IrsIrCameraHandle handle, void* buffer, size_t size, IrsImageTransferProcessorState *state) { return ::irsGetImageTransferProcessorState(handle, buffer, size, state); } -Result RunPointingProcessor(IrsIrCameraHandle handle) { return ::irsRunPointingProcessor(handle); } -Result GetPointingProcessorMarkerStates(IrsIrCameraHandle handle, IrsPointingProcessorMarkerState *states, s32 count, s32 *total_out) { return ::irsGetPointingProcessorMarkerStates(handle, states, count, total_out); } -Result GetPointingProcessorStates(IrsIrCameraHandle handle, IrsPointingProcessorState *states, s32 count, s32 *total_out) { return ::irsGetPointingProcessorStates(handle, states, count, total_out); } -Result RunTeraPluginProcessor(IrsIrCameraHandle handle, const IrsTeraPluginProcessorConfig *config) { return ::irsRunTeraPluginProcessor(handle, config); } -Result GetTeraPluginProcessorStates(IrsIrCameraHandle handle, IrsTeraPluginProcessorState *states, s32 count, s64 sampling_number, u32 prefix_data, u32 prefix_bitcount, s32 *total_out) { return ::irsGetTeraPluginProcessorStates(handle, states, count, sampling_number, prefix_data, prefix_bitcount, total_out); } -Result RunIrLedProcessor(IrsIrCameraHandle handle, const IrsIrLedProcessorConfig *config) { return ::irsRunIrLedProcessor(handle, config); } -Result RunAdaptiveClusteringProcessor(IrsIrCameraHandle handle, const IrsAdaptiveClusteringProcessorConfig *config) { return ::irsRunAdaptiveClusteringProcessor(handle, config); } -Result RunHandAnalysis(IrsIrCameraHandle handle, const IrsHandAnalysisConfig *config) { return ::irsRunHandAnalysis(handle, config); } -void GetMomentProcessorDefaultConfig(IrsMomentProcessorConfig *config) { ::irsGetMomentProcessorDefaultConfig(config); } -void GetClusteringProcessorDefaultConfig(IrsClusteringProcessorConfig *config) { ::irsGetClusteringProcessorDefaultConfig(config); } -void GetDefaultImageTransferProcessorConfig(IrsImageTransferProcessorConfig *config) { ::irsGetDefaultImageTransferProcessorConfig(config); } -void GetDefaultImageTransferProcessorExConfig(IrsImageTransferProcessorExConfig *config) { ::irsGetDefaultImageTransferProcessorExConfig(config); } -void GetIrLedProcessorDefaultConfig(IrsIrLedProcessorConfig *config) { ::irsGetIrLedProcessorDefaultConfig(config); } - -} // namespace irs - -namespace jit { - -Result Create(Jit* j, size_t size) { return ::jitCreate(j, size); } -Result TransitionToWritable(Jit* j) { return ::jitTransitionToWritable(j); } -Result TransitionToExecutable(Jit* j) { return ::jitTransitionToExecutable(j); } -Result Close(Jit* j) { return ::jitClose(j); } -void* GetRwAddr(Jit* j) { return ::jitGetRwAddr(j); } -void* GetRxAddr(Jit* j) { return ::jitGetRxAddr(j); } - -} // namespace jit - -namespace lbl { - -Result Initialize(void) { return ::lblInitialize(); } -void Exit(void) { ::lblExit(); } -Service* GetServiceSession(void) { return ::lblGetServiceSession(); } -Result SaveCurrentSetting(void) { return ::lblSaveCurrentSetting(); } -Result LoadCurrentSetting(void) { return ::lblLoadCurrentSetting(); } -Result SetCurrentBrightnessSetting(float brightness) { return ::lblSetCurrentBrightnessSetting(brightness); } -Result GetCurrentBrightnessSetting(float *out_value) { return ::lblGetCurrentBrightnessSetting(out_value); } -Result ApplyCurrentBrightnessSettingToBacklight(void) { return ::lblApplyCurrentBrightnessSettingToBacklight(); } -Result GetBrightnessSettingAppliedToBacklight(float *out_value) { return ::lblGetBrightnessSettingAppliedToBacklight(out_value); } -Result SwitchBacklightOn(u64 fade_time) { return ::lblSwitchBacklightOn(fade_time); } -Result SwitchBacklightOff(u64 fade_time) { return ::lblSwitchBacklightOff(fade_time); } -Result GetBacklightSwitchStatus(LblBacklightSwitchStatus *out_value) { return ::lblGetBacklightSwitchStatus(out_value); } -Result EnableDimming(void) { return ::lblEnableDimming(); } -Result DisableDimming(void) { return ::lblDisableDimming(); } -Result IsDimmingEnabled(bool *out_value) { return ::lblIsDimmingEnabled(out_value); } -Result EnableAutoBrightnessControl(void) { return ::lblEnableAutoBrightnessControl(); } -Result DisableAutoBrightnessControl(void) { return ::lblDisableAutoBrightnessControl(); } -Result IsAutoBrightnessControlEnabled(bool *out_value) { return ::lblIsAutoBrightnessControlEnabled(out_value); } -Result SetAmbientLightSensorValue(float value) { return ::lblSetAmbientLightSensorValue(value); } -Result GetAmbientLightSensorValue(bool *over_limit, float *lux) { return ::lblGetAmbientLightSensorValue(over_limit, lux); } -Result IsAmbientLightSensorAvailable(bool *out_value) { return ::lblIsAmbientLightSensorAvailable(out_value); } -Result SetCurrentBrightnessSettingForVrMode(float brightness) { return ::lblSetCurrentBrightnessSettingForVrMode(brightness); } -Result GetCurrentBrightnessSettingForVrMode(float *out_value) { return ::lblGetCurrentBrightnessSettingForVrMode(out_value); } -Result EnableVrMode(void) { return ::lblEnableVrMode(); } -Result DisableVrMode(void) { return ::lblDisableVrMode(); } -Result IsVrModeEnabled(bool *out_value) { return ::lblIsVrModeEnabled(out_value); } - -} // namespace lbl - -namespace ldn { - -Result Initialize(LdnServiceType service_type) { return ::ldnInitialize(service_type); } -void Exit(void) { ::ldnExit(); } -Service* GetServiceSession_LocalCommunicationService(void) { return ::ldnGetServiceSession_LocalCommunicationService(); } -Service* GetServiceSession_IClientProcessMonitor(void) { return ::ldnGetServiceSession_IClientProcessMonitor(); } -Result GetState(LdnState *out) { return ::ldnGetState(out); } -Result GetNetworkInfo(LdnNetworkInfo *out) { return ::ldnGetNetworkInfo(out); } -Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask) { return ::ldnGetIpv4Address(addr, mask); } -Result GetDisconnectReason(LdnDisconnectReason *out) { return ::ldnGetDisconnectReason(out); } -Result GetSecurityParameter(LdnSecurityParameter *out) { return ::ldnGetSecurityParameter(out); } -Result GetNetworkConfig(LdnNetworkConfig *out) { return ::ldnGetNetworkConfig(out); } -Result GetStateChangeEvent(Event* out_event) { return ::ldnGetStateChangeEvent(out_event); } -Result GetNetworkInfoAndHistory(LdnNetworkInfo *network_info, LdnNodeLatestUpdate *nodes, s32 count) { return ::ldnGetNetworkInfoAndHistory(network_info, nodes, count); } -Result Scan(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out) { return ::ldnScan(channel, filter, network_info, count, total_out); } -Result ScanPrivate(s32 channel, const LdnScanFilter *filter, LdnNetworkInfo *network_info, s32 count, s32 *total_out) { return ::ldnScanPrivate(channel, filter, network_info, count, total_out); } -Result SetWirelessControllerRestriction(LdnWirelessControllerRestriction restriction) { return ::ldnSetWirelessControllerRestriction(restriction); } -Result SetProtocol(LdnProtocol protocol) { return ::ldnSetProtocol(protocol); } -Result OpenAccessPoint(void) { return ::ldnOpenAccessPoint(); } -Result CloseAccessPoint(void) { return ::ldnCloseAccessPoint(); } -Result CreateNetwork(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config) { return ::ldnCreateNetwork(sec_config, user_config, network_config); } -Result CreateNetworkPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, const LdnNetworkConfig *network_config, const LdnAddressEntry *addrs, s32 count) { return ::ldnCreateNetworkPrivate(sec_config, sec_param, user_config, network_config, addrs, count); } -Result DestroyNetwork(void) { return ::ldnDestroyNetwork(); } -Result Reject(LdnIpv4Address addr) { return ::ldnReject(addr); } -Result SetAdvertiseData(const void* buffer, size_t size) { return ::ldnSetAdvertiseData(buffer, size); } -Result SetStationAcceptPolicy(LdnAcceptPolicy policy) { return ::ldnSetStationAcceptPolicy(policy); } -Result AddAcceptFilterEntry(LdnMacAddress addr) { return ::ldnAddAcceptFilterEntry(addr); } -Result ClearAcceptFilter(void) { return ::ldnClearAcceptFilter(); } -Result OpenStation(void) { return ::ldnOpenStation(); } -Result CloseStation(void) { return ::ldnCloseStation(); } -Result Connect(const LdnSecurityConfig *sec_config, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkInfo *network_info) { return ::ldnConnect(sec_config, user_config, version, option, network_info); } -Result ConnectPrivate(const LdnSecurityConfig *sec_config, const LdnSecurityParameter *sec_param, const LdnUserConfig *user_config, s32 version, u32 option, const LdnNetworkConfig *network_config) { return ::ldnConnectPrivate(sec_config, sec_param, user_config, version, option, network_config); } -Result Disconnect(void) { return ::ldnDisconnect(); } -Result SetOperationMode(LdnOperationMode mode) { return ::ldnSetOperationMode(mode); } -Result EnableActionFrame(const LdnActionFrameSettings *settings) { return ::ldnEnableActionFrame(settings); } -Result DisableActionFrame(void) { return ::ldnDisableActionFrame(); } -Result SendActionFrame(const void* data, size_t size, LdnMacAddress destination, LdnMacAddress bssid, s16 channel, u32 flags) { return ::ldnSendActionFrame(data, size, destination, bssid, channel, flags); } -Result RecvActionFrame(void* data, size_t size, LdnMacAddress *addr0, LdnMacAddress *addr1, s16 *channel, u32 *out_size, s32 *link_level, u32 flags) { return ::ldnRecvActionFrame(data, size, addr0, addr1, channel, out_size, link_level, flags); } -Result SetHomeChannel(s16 channel) { return ::ldnSetHomeChannel(channel); } -Result SetTxPower(s16 power) { return ::ldnSetTxPower(power); } -Result ResetTxPower(void) { return ::ldnResetTxPower(); } - -} // namespace ldn - -namespace ldnm { - -Result Initialize(void) { return ::ldnmInitialize(); } -void Exit(void) { ::ldnmExit(); } -Service* GetServiceSession_MonitorService(void) { return ::ldnmGetServiceSession_MonitorService(); } -Result GetState(LdnState *out) { return ::ldnmGetState(out); } -Result GetNetworkInfo(LdnNetworkInfo *out) { return ::ldnmGetNetworkInfo(out); } -Result GetIpv4Address(LdnIpv4Address *addr, LdnSubnetMask *mask) { return ::ldnmGetIpv4Address(addr, mask); } -Result GetSecurityParameter(LdnSecurityParameter *out) { return ::ldnmGetSecurityParameter(out); } -Result GetNetworkConfig(LdnNetworkConfig *out) { return ::ldnmGetNetworkConfig(out); } - -} // namespace ldnm - -namespace ldr { - -Result ShellInitialize(void) { return ::ldrShellInitialize(); } -void ShellExit(void) { ::ldrShellExit(); } -Service* ShellGetServiceSession(void) { return ::ldrShellGetServiceSession(); } -Result DmntInitialize(void) { return ::ldrDmntInitialize(); } -void DmntExit(void) { ::ldrDmntExit(); } -Service* DmntGetServiceSession(void) { return ::ldrDmntGetServiceSession(); } -Result PmInitialize(void) { return ::ldrPmInitialize(); } -void PmExit(void) { ::ldrPmExit(); } -Service* PmGetServiceSession(void) { return ::ldrPmGetServiceSession(); } -Result ShellSetProgramArguments(u64 program_id, const void *args, size_t args_size) { return ::ldrShellSetProgramArguments(program_id, args, args_size); } -Result ShellFlushArguments(void) { return ::ldrShellFlushArguments(); } -Result DmntSetProgramArguments(u64 program_id, const void *args, size_t args_size) { return ::ldrDmntSetProgramArguments(program_id, args, args_size); } -Result DmntFlushArguments(void) { return ::ldrDmntFlushArguments(); } -Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out) { return ::ldrDmntGetProcessModuleInfo(pid, out_module_infos, max_out_modules, num_out); } -Result PmCreateProcess(u64 pin_id, u32 flags, Handle reslimit_h, const LoaderProgramAttributes *attrs, Handle *out_process_h) { return ::ldrPmCreateProcess(pin_id, flags, reslimit_h, attrs, out_process_h); } -Result PmGetProgramInfo(const NcmProgramLocation *loc, const LoaderProgramAttributes *attrs, LoaderProgramInfo *out_program_info) { return ::ldrPmGetProgramInfo(loc, attrs, out_program_info); } -Result PmGetProgramInfoV1(const NcmProgramLocation *loc, LoaderProgramInfoV1 *out_program_info) { return ::ldrPmGetProgramInfoV1(loc, out_program_info); } -Result PmPinProgram(const NcmProgramLocation *loc, u64 *out_pin_id) { return ::ldrPmPinProgram(loc, out_pin_id); } -Result PmUnpinProgram(u64 pin_id) { return ::ldrPmUnpinProgram(pin_id); } -Result PmSetEnabledProgramVerification(bool enabled) { return ::ldrPmSetEnabledProgramVerification(enabled); } -Result RoInitialize(void) { return ::ldrRoInitialize(); } -void RoExit(void) { ::ldrRoExit(); } -Service* RoGetServiceSession(void) { return ::ldrRoGetServiceSession(); } -Result RoLoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { return ::ldrRoLoadNro(out_address, nro_address, nro_size, bss_address, bss_size); } -Result RoUnloadNro(u64 nro_address) { return ::ldrRoUnloadNro(nro_address); } -Result RoLoadNrr(u64 nrr_address, u64 nrr_size) { return ::ldrRoLoadNrr(nrr_address, nrr_size); } -Result RoUnloadNrr(u64 nrr_address) { return ::ldrRoUnloadNrr(nrr_address); } -Result RoLoadNrrEx(u64 nrr_address, u64 nrr_size) { return ::ldrRoLoadNrrEx(nrr_address, nrr_size); } - -} // namespace ldr - -namespace levent { - -void Init(LEvent* le, bool signaled, bool autoclear) { ::leventInit(le, signaled, autoclear); } -bool Wait(LEvent* le, u64 timeout_ns) { return ::leventWait(le, timeout_ns); } -bool TryWait(LEvent* le) { return ::leventTryWait(le); } -void Signal(LEvent* le) { ::leventSignal(le); } -void Clear(LEvent* le) { ::leventClear(le); } - -} // namespace levent - -namespace libapplet { - -void ArgsCreate(LibAppletArgs* a, u32 version) { ::libappletArgsCreate(a, version); } -void ArgsSetPlayStartupSound(LibAppletArgs* a, bool flag) { ::libappletArgsSetPlayStartupSound(a, flag); } -Result CreateWriteStorage(AppletStorage* s, const void* buffer, size_t size) { return ::libappletCreateWriteStorage(s, buffer, size); } -Result ReadStorage(AppletStorage* s, void* buffer, size_t size, size_t *transfer_size) { return ::libappletReadStorage(s, buffer, size, transfer_size); } -Result ArgsPush(LibAppletArgs* a, AppletHolder *h) { return ::libappletArgsPush(a, h); } -Result ArgsPop(LibAppletArgs* a) { return ::libappletArgsPop(a); } -Result PushInData(AppletHolder *h, const void* buffer, size_t size) { return ::libappletPushInData(h, buffer, size); } -Result PopOutData(AppletHolder *h, void* buffer, size_t size, size_t *transfer_size) { return ::libappletPopOutData(h, buffer, size, transfer_size); } -void SetJumpFlag(bool flag) { ::libappletSetJumpFlag(flag); } -Result Start(AppletHolder *h) { return ::libappletStart(h); } -Result Launch(AppletId id, LibAppletArgs *commonargs, const void* arg, size_t arg_size, void* reply, size_t reply_size, size_t *out_reply_size) { return ::libappletLaunch(id, commonargs, arg, arg_size, reply, reply_size, out_reply_size); } -Result RequestHomeMenu(void) { return ::libappletRequestHomeMenu(); } -Result RequestJumpToSystemUpdate(void) { return ::libappletRequestJumpToSystemUpdate(); } -Result RequestToLaunchApplication(u64 application_id, AccountUid uid, const void* buffer, size_t size, u32 sender) { return ::libappletRequestToLaunchApplication(application_id, uid, buffer, size, sender); } -Result RequestJumpToStory(AccountUid uid, u64 application_id) { return ::libappletRequestJumpToStory(uid, application_id); } - -} // namespace libapplet - -namespace lp2p { - -Result Initialize(Lp2pServiceType service_type) { return ::lp2pInitialize(service_type); } -void Exit(void) { ::lp2pExit(); } -Service* GetServiceSession_INetworkService(void) { return ::lp2pGetServiceSession_INetworkService(); } -Service* GetServiceSession_INetworkServiceMonitor(void) { return ::lp2pGetServiceSession_INetworkServiceMonitor(); } -void CreateGroupInfo(Lp2pGroupInfo *info) { ::lp2pCreateGroupInfo(info); } -void CreateGroupInfoScan(Lp2pGroupInfo *info) { ::lp2pCreateGroupInfoScan(info); } -void GroupInfoSetServiceName(Lp2pGroupInfo *info, const char *name) { ::lp2pGroupInfoSetServiceName(info, name); } -void GroupInfoSetFlags(Lp2pGroupInfo *info, s8 *flags, size_t count) { ::lp2pGroupInfoSetFlags(info, flags, count); } -void GroupInfoSetMemberCountMax(Lp2pGroupInfo *info, size_t count) { ::lp2pGroupInfoSetMemberCountMax(info, count); } -void GroupInfoSetFrequencyChannel(Lp2pGroupInfo *info, u16 frequency, s16 channel) { ::lp2pGroupInfoSetFrequencyChannel(info, frequency, channel); } -void GroupInfoSetStealthEnabled(Lp2pGroupInfo *info, bool flag) { ::lp2pGroupInfoSetStealthEnabled(info, flag); } -void GroupInfoSetPresharedKey(Lp2pGroupInfo *info, const void* key, size_t size) { ::lp2pGroupInfoSetPresharedKey(info, key, size); } -Result GroupInfoSetPassphrase(Lp2pGroupInfo *info, const char *passphrase) { return ::lp2pGroupInfoSetPassphrase(info, passphrase); } -Result Scan(const Lp2pGroupInfo *info, Lp2pScanResult *results, s32 count, s32 *total_out) { return ::lp2pScan(info, results, count, total_out); } -Result CreateGroup(const Lp2pGroupInfo *info) { return ::lp2pCreateGroup(info); } -Result DestroyGroup(void) { return ::lp2pDestroyGroup(); } -Result SetAdvertiseData(const void* buffer, size_t size) { return ::lp2pSetAdvertiseData(buffer, size); } -Result SendToOtherGroup(const void* buffer, size_t size, Lp2pMacAddress addr, Lp2pGroupId group_id, s16 frequency, s16 channel, u32 flags) { return ::lp2pSendToOtherGroup(buffer, size, addr, group_id, frequency, channel, flags); } -Result RecvFromOtherGroup(void* buffer, size_t size, u32 flags, Lp2pMacAddress *addr, u16 *unk0, s32 *unk1, u64 *out_size, s32 *unk2) { return ::lp2pRecvFromOtherGroup(buffer, size, flags, addr, unk0, unk1, out_size, unk2); } -Result AddAcceptableGroupId(Lp2pGroupId group_id) { return ::lp2pAddAcceptableGroupId(group_id); } -Result RemoveAcceptableGroupId(void) { return ::lp2pRemoveAcceptableGroupId(); } -Result AttachNetworkInterfaceStateChangeEvent(Event* out_event) { return ::lp2pAttachNetworkInterfaceStateChangeEvent(out_event); } -Result GetNetworkInterfaceLastError(void) { return ::lp2pGetNetworkInterfaceLastError(); } -Result GetRole(u8 *out) { return ::lp2pGetRole(out); } -Result GetAdvertiseData(void* buffer, size_t size, u16 *transfer_size, u16 *original_size) { return ::lp2pGetAdvertiseData(buffer, size, transfer_size, original_size); } -Result GetAdvertiseData2(void* buffer, size_t size, u16 *transfer_size, u16 *original_size) { return ::lp2pGetAdvertiseData2(buffer, size, transfer_size, original_size); } -Result GetGroupInfo(Lp2pGroupInfo *out) { return ::lp2pGetGroupInfo(out); } -Result Join(Lp2pGroupInfo *out, const Lp2pGroupInfo *info) { return ::lp2pJoin(out, info); } -Result GetGroupOwner(Lp2pNodeInfo *out) { return ::lp2pGetGroupOwner(out); } -Result GetIpConfig(Lp2pIpConfig *out) { return ::lp2pGetIpConfig(out); } -Result Leave(u32 *out) { return ::lp2pLeave(out); } -Result AttachJoinEvent(Event* out_event) { return ::lp2pAttachJoinEvent(out_event); } -Result GetMembers(Lp2pNodeInfo *members, s32 count, s32 *total_out) { return ::lp2pGetMembers(members, count, total_out); } - -} // namespace lp2p - -namespace lr { - -Result Initialize(void) { return ::lrInitialize(); } -void Exit(void) { ::lrExit(); } -Service* GetServiceSession(void) { return ::lrGetServiceSession(); } -Result OpenLocationResolver(NcmStorageId storage, LrLocationResolver* out) { return ::lrOpenLocationResolver(storage, out); } -Result OpenRegisteredLocationResolver(LrRegisteredLocationResolver* out) { return ::lrOpenRegisteredLocationResolver(out); } -Result LrResolveProgramPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveProgramPath(lr, tid, out); } -Result LrRedirectProgramPath(LrLocationResolver* lr, u64 tid, const char *path) { return ::lrLrRedirectProgramPath(lr, tid, path); } -Result LrResolveApplicationControlPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveApplicationControlPath(lr, tid, out); } -Result LrResolveApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveApplicationHtmlDocumentPath(lr, tid, out); } -Result LrResolveDataPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveDataPath(lr, tid, out); } -Result LrRedirectApplicationControlPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path) { return ::lrLrRedirectApplicationControlPath(lr, tid, tid2, path); } -Result LrRedirectApplicationHtmlDocumentPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path) { return ::lrLrRedirectApplicationHtmlDocumentPath(lr, tid, tid2, path); } -Result LrResolveApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, char *out) { return ::lrLrResolveApplicationLegalInformationPath(lr, tid, out); } -Result LrRedirectApplicationLegalInformationPath(LrLocationResolver* lr, u64 tid, u64 tid2, const char *path) { return ::lrLrRedirectApplicationLegalInformationPath(lr, tid, tid2, path); } -Result LrRefresh(LrLocationResolver* lr) { return ::lrLrRefresh(lr); } -Result LrEraseProgramRedirection(LrLocationResolver* lr, u64 tid) { return ::lrLrEraseProgramRedirection(lr, tid); } -Result RegLrResolveProgramPath(LrRegisteredLocationResolver* reg, u64 tid, char *out) { return ::lrRegLrResolveProgramPath(reg, tid, out); } - -} // namespace lr - -namespace mii { - -Result LaShowMiiEdit(MiiSpecialKeyCode special_key_code) { return ::miiLaShowMiiEdit(special_key_code); } -Result LaAppendMii(MiiSpecialKeyCode special_key_code, s32 *index) { return ::miiLaAppendMii(special_key_code, index); } -Result LaAppendMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, s32 *index) { return ::miiLaAppendMiiImage(special_key_code, valid_uuid_array, count, index); } -Result LaUpdateMiiImage(MiiSpecialKeyCode special_key_code, const Uuid *valid_uuid_array, s32 count, Uuid used_uuid, s32 *index) { return ::miiLaUpdateMiiImage(special_key_code, valid_uuid_array, count, used_uuid, index); } -Result LaCreateMii(MiiSpecialKeyCode special_key_code, MiiCharInfo *out_char) { return ::miiLaCreateMii(special_key_code, out_char); } -Result LaEditMii(MiiSpecialKeyCode special_key_code, const MiiCharInfo *in_char, MiiCharInfo *out_char) { return ::miiLaEditMii(special_key_code, in_char, out_char); } -Result Initialize(MiiServiceType service_type) { return ::miiInitialize(service_type); } -void Exit(void) { ::miiExit(); } -Service* GetServiceSession(void) { return ::miiGetServiceSession(); } -Result OpenDatabase(MiiDatabase *out, MiiSpecialKeyCode key_code) { return ::miiOpenDatabase(out, key_code); } -Result DatabaseIsUpdated(MiiDatabase *db, bool *out_updated, MiiSourceFlag flag) { return ::miiDatabaseIsUpdated(db, out_updated, flag); } -Result DatabaseIsFull(MiiDatabase *db, bool *out_full) { return ::miiDatabaseIsFull(db, out_full); } -Result DatabaseGetCount(MiiDatabase *db, s32 *out_count, MiiSourceFlag flag) { return ::miiDatabaseGetCount(db, out_count, flag); } -Result DatabaseGet1(MiiDatabase *db, MiiSourceFlag flag, MiiCharInfo *out_infos, s32 count, s32 *total_out) { return ::miiDatabaseGet1(db, flag, out_infos, count, total_out); } -Result DatabaseBuildRandom(MiiDatabase *db, MiiAge age, MiiGender gender, MiiFaceColor face_color, MiiCharInfo *out_info) { return ::miiDatabaseBuildRandom(db, age, gender, face_color, out_info); } -void DatabaseClose(MiiDatabase *db) { ::miiDatabaseClose(db); } - -} // namespace mii - -namespace miiimg { - -Result Initialize(void) { return ::miiimgInitialize(); } -void Exit(void) { ::miiimgExit(); } -Service* GetServiceSession(void) { return ::miiimgGetServiceSession(); } -Result Reload(void) { return ::miiimgReload(); } -Result GetCount(s32 *out_count) { return ::miiimgGetCount(out_count); } -Result IsEmpty(bool *out_empty) { return ::miiimgIsEmpty(out_empty); } -Result IsFull(bool *out_full) { return ::miiimgIsFull(out_full); } -Result GetAttribute(s32 index, MiiimgImageAttribute *out_attr) { return ::miiimgGetAttribute(index, out_attr); } -Result LoadImage(MiiimgImageId id, void* out_image, size_t out_image_size) { return ::miiimgLoadImage(id, out_image, out_image_size); } - -} // namespace miiimg - -namespace mmu { - -Result Initialize(void) { return ::mmuInitialize(); } -void Exit(void) { ::mmuExit(); } -Service* GetServiceSession(void) { return ::mmuGetServiceSession(); } -Result RequestInitialize(MmuRequest *request, MmuModuleId module, u32 unk, bool autoclear) { return ::mmuRequestInitialize(request, module, unk, autoclear); } -Result RequestFinalize(const MmuRequest *request) { return ::mmuRequestFinalize(request); } -Result RequestGet(const MmuRequest *request, u32 *out_freq_hz) { return ::mmuRequestGet(request, out_freq_hz); } -Result RequestSetAndWait(const MmuRequest *request, u32 freq_hz, s32 timeout) { return ::mmuRequestSetAndWait(request, freq_hz, timeout); } - -} // namespace mmu - -namespace mutex { - -void Init(Mutex* m) { ::mutexInit(m); } -void Lock(Mutex* m) { ::mutexLock(m); } -bool TryLock(Mutex* m) { return ::mutexTryLock(m); } -void Unlock(Mutex* m) { ::mutexUnlock(m); } -bool IsLockedByCurrentThread(const Mutex* m) { return ::mutexIsLockedByCurrentThread(m); } - -} // namespace mutex - -namespace nacp { - -Result GetLanguageEntry(NacpStruct* nacp, NacpLanguageEntry** langentry) { return ::nacpGetLanguageEntry(nacp, langentry); } - -} // namespace nacp - -namespace ncm { - -Result Initialize(void) { return ::ncmInitialize(); } -void Exit(void) { ::ncmExit(); } -Service* GetServiceSession(void) { return ::ncmGetServiceSession(); } -Result CreateContentStorage(NcmStorageId storage_id) { return ::ncmCreateContentStorage(storage_id); } -Result CreateContentMetaDatabase(NcmStorageId storage_id) { return ::ncmCreateContentMetaDatabase(storage_id); } -Result VerifyContentStorage(NcmStorageId storage_id) { return ::ncmVerifyContentStorage(storage_id); } -Result VerifyContentMetaDatabase(NcmStorageId storage_id) { return ::ncmVerifyContentMetaDatabase(storage_id); } -Result OpenContentStorage(NcmContentStorage* out_content_storage, NcmStorageId storage_id) { return ::ncmOpenContentStorage(out_content_storage, storage_id); } -Result OpenContentMetaDatabase(NcmContentMetaDatabase* out_content_meta_database, NcmStorageId storage_id) { return ::ncmOpenContentMetaDatabase(out_content_meta_database, storage_id); } -Result CloseContentStorageForcibly(NcmStorageId storage_id) { return ::ncmCloseContentStorageForcibly(storage_id); } -Result CloseContentMetaDatabaseForcibly(NcmStorageId storage_id) { return ::ncmCloseContentMetaDatabaseForcibly(storage_id); } -Result CleanupContentMetaDatabase(NcmStorageId storage_id) { return ::ncmCleanupContentMetaDatabase(storage_id); } -Result ActivateContentStorage(NcmStorageId storage_id) { return ::ncmActivateContentStorage(storage_id); } -Result InactivateContentStorage(NcmStorageId storage_id) { return ::ncmInactivateContentStorage(storage_id); } -Result ActivateContentMetaDatabase(NcmStorageId storage_id) { return ::ncmActivateContentMetaDatabase(storage_id); } -Result InactivateContentMetaDatabase(NcmStorageId storage_id) { return ::ncmInactivateContentMetaDatabase(storage_id); } -Result InvalidateRightsIdCache(void) { return ::ncmInvalidateRightsIdCache(); } -Result ActivateFsContentStorage(FsContentStorageId fs_storage_id) { return ::ncmActivateFsContentStorage(fs_storage_id); } -void ContentStorageClose(NcmContentStorage* cs) { ::ncmContentStorageClose(cs); } -Result ContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmPlaceHolderId* out_id) { return ::ncmContentStorageGeneratePlaceHolderId(cs, out_id); } -Result ContentStorageCreatePlaceHolder(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id, s64 size) { return ::ncmContentStorageCreatePlaceHolder(cs, content_id, placeholder_id, size); } -Result ContentStorageDeletePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageDeletePlaceHolder(cs, placeholder_id); } -Result ContentStorageHasPlaceHolder(NcmContentStorage* cs, bool* out, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageHasPlaceHolder(cs, out, placeholder_id); } -Result ContentStorageWritePlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, u64 offset, const void* data, size_t data_size) { return ::ncmContentStorageWritePlaceHolder(cs, placeholder_id, offset, data, data_size); } -Result ContentStorageRegister(NcmContentStorage* cs, const NcmContentId* content_id, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageRegister(cs, content_id, placeholder_id); } -Result ContentStorageDelete(NcmContentStorage* cs, const NcmContentId* content_id) { return ::ncmContentStorageDelete(cs, content_id); } -Result ContentStorageHas(NcmContentStorage* cs, bool* out, const NcmContentId* content_id) { return ::ncmContentStorageHas(cs, out, content_id); } -Result ContentStorageGetPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmContentId* content_id) { return ::ncmContentStorageGetPath(cs, out_path, out_size, content_id); } -Result ContentStorageGetPlaceHolderPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageGetPlaceHolderPath(cs, out_path, out_size, placeholder_id); } -Result ContentStorageCleanupAllPlaceHolder(NcmContentStorage* cs) { return ::ncmContentStorageCleanupAllPlaceHolder(cs); } -Result ContentStorageListPlaceHolder(NcmContentStorage* cs, NcmPlaceHolderId* out_ids, s32 count, s32* out_count) { return ::ncmContentStorageListPlaceHolder(cs, out_ids, count, out_count); } -Result ContentStorageGetContentCount(NcmContentStorage* cs, s32* out_count) { return ::ncmContentStorageGetContentCount(cs, out_count); } -Result ContentStorageListContentId(NcmContentStorage* cs, NcmContentId* out_ids, s32 count, s32* out_count, s32 start_offset) { return ::ncmContentStorageListContentId(cs, out_ids, count, out_count, start_offset); } -Result ContentStorageGetSizeFromContentId(NcmContentStorage* cs, s64* out_size, const NcmContentId* content_id) { return ::ncmContentStorageGetSizeFromContentId(cs, out_size, content_id); } -Result ContentStorageDisableForcibly(NcmContentStorage* cs) { return ::ncmContentStorageDisableForcibly(cs); } -Result ContentStorageRevertToPlaceHolder(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, const NcmContentId* old_content_id, const NcmContentId* new_content_id) { return ::ncmContentStorageRevertToPlaceHolder(cs, placeholder_id, old_content_id, new_content_id); } -Result ContentStorageSetPlaceHolderSize(NcmContentStorage* cs, const NcmPlaceHolderId* placeholder_id, s64 size) { return ::ncmContentStorageSetPlaceHolderSize(cs, placeholder_id, size); } -Result ContentStorageReadContentIdFile(NcmContentStorage* cs, void* out_data, size_t out_data_size, const NcmContentId* content_id, s64 offset) { return ::ncmContentStorageReadContentIdFile(cs, out_data, out_data_size, content_id, offset); } -Result ContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, FsContentAttributes attr) { return ::ncmContentStorageGetRightsIdFromPlaceHolderId(cs, out_rights_id, placeholder_id, attr); } -Result ContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmContentId* content_id, FsContentAttributes attr) { return ::ncmContentStorageGetRightsIdFromContentId(cs, out_rights_id, content_id, attr); } -Result ContentStorageWriteContentForDebug(NcmContentStorage* cs, const NcmContentId* content_id, s64 offset, const void* data, size_t data_size) { return ::ncmContentStorageWriteContentForDebug(cs, content_id, offset, data, data_size); } -Result ContentStorageGetFreeSpaceSize(NcmContentStorage* cs, s64* out_size) { return ::ncmContentStorageGetFreeSpaceSize(cs, out_size); } -Result ContentStorageGetTotalSpaceSize(NcmContentStorage* cs, s64* out_size) { return ::ncmContentStorageGetTotalSpaceSize(cs, out_size); } -Result ContentStorageFlushPlaceHolder(NcmContentStorage* cs) { return ::ncmContentStorageFlushPlaceHolder(cs); } -Result ContentStorageGetSizeFromPlaceHolderId(NcmContentStorage* cs, s64* out_size, const NcmPlaceHolderId* placeholder_id) { return ::ncmContentStorageGetSizeFromPlaceHolderId(cs, out_size, placeholder_id); } -Result ContentStorageRepairInvalidFileAttribute(NcmContentStorage* cs) { return ::ncmContentStorageRepairInvalidFileAttribute(cs); } -Result ContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, NcmRightsId* out_rights_id, const NcmPlaceHolderId* placeholder_id, const NcmContentId* cache_content_id, FsContentAttributes attr) { return ::ncmContentStorageGetRightsIdFromPlaceHolderIdWithCache(cs, out_rights_id, placeholder_id, cache_content_id, attr); } -Result ContentStorageRegisterPath(NcmContentStorage* cs, const NcmContentId* content_id, const char *path) { return ::ncmContentStorageRegisterPath(cs, content_id, path); } -Result ContentStorageClearRegisteredPath(NcmContentStorage* cs) { return ::ncmContentStorageClearRegisteredPath(cs); } -Result ContentStorageGetProgramId(NcmContentStorage* cs, u64* out, const NcmContentId* content_id, FsContentAttributes attr) { return ::ncmContentStorageGetProgramId(cs, out, content_id, attr); } -void ContentMetaDatabaseClose(NcmContentMetaDatabase* db) { ::ncmContentMetaDatabaseClose(db); } -Result ContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, const void* data, u64 data_size) { return ::ncmContentMetaDatabaseSet(db, key, data, data_size); } -Result ContentMetaDatabaseGet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u64* out_size, void* out_data, u64 out_data_size) { return ::ncmContentMetaDatabaseGet(db, key, out_size, out_data, out_data_size); } -Result ContentMetaDatabaseRemove(NcmContentMetaDatabase* db, const NcmContentMetaKey *key) { return ::ncmContentMetaDatabaseRemove(db, key); } -Result ContentMetaDatabaseGetContentIdByType(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type) { return ::ncmContentMetaDatabaseGetContentIdByType(db, out_content_id, key, type); } -Result ContentMetaDatabaseListContentInfo(NcmContentMetaDatabase* db, s32* out_entries_written, NcmContentInfo* out_info, s32 count, const NcmContentMetaKey* key, s32 start_index) { return ::ncmContentMetaDatabaseListContentInfo(db, out_entries_written, out_info, count, key, start_index); } -Result ContentMetaDatabaseList(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type, u64 id, u64 id_min, u64 id_max, NcmContentInstallType install_type) { return ::ncmContentMetaDatabaseList(db, out_entries_total, out_entries_written, out_keys, count, meta_type, id, id_min, id_max, install_type); } -Result ContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, NcmContentMetaKey* out_key, u64 id) { return ::ncmContentMetaDatabaseGetLatestContentMetaKey(db, out_key, id); } -Result ContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, s32* out_entries_total, s32* out_entries_written, NcmApplicationContentMetaKey* out_keys, s32 count, NcmContentMetaType meta_type) { return ::ncmContentMetaDatabaseListApplication(db, out_entries_total, out_entries_written, out_keys, count, meta_type); } -Result ContentMetaDatabaseHas(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseHas(db, out, key); } -Result ContentMetaDatabaseHasAll(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* keys, s32 count) { return ::ncmContentMetaDatabaseHasAll(db, out, keys, count); } -Result ContentMetaDatabaseGetSize(NcmContentMetaDatabase* db, u64* out_size, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetSize(db, out_size, key); } -Result ContentMetaDatabaseGetRequiredSystemVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetRequiredSystemVersion(db, out_version, key); } -Result ContentMetaDatabaseGetPatchContentMetaId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetPatchContentMetaId(db, out_patch_id, key); } -Result ContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db) { return ::ncmContentMetaDatabaseDisableForcibly(db); } -Result ContentMetaDatabaseLookupOrphanContent(NcmContentMetaDatabase* db, bool* out_orphaned, const NcmContentId* content_ids, s32 count) { return ::ncmContentMetaDatabaseLookupOrphanContent(db, out_orphaned, content_ids, count); } -Result ContentMetaDatabaseCommit(NcmContentMetaDatabase* db) { return ::ncmContentMetaDatabaseCommit(db); } -Result ContentMetaDatabaseHasContent(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key, const NcmContentId* content_id) { return ::ncmContentMetaDatabaseHasContent(db, out, key, content_id); } -Result ContentMetaDatabaseListContentMetaInfo(NcmContentMetaDatabase* db, s32* out_entries_written, void* out_meta_info, s32 count, const NcmContentMetaKey* key, s32 start_index) { return ::ncmContentMetaDatabaseListContentMetaInfo(db, out_entries_written, out_meta_info, count, key, start_index); } -Result ContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u8* out) { return ::ncmContentMetaDatabaseGetAttributes(db, key, out); } -Result ContentMetaDatabaseGetRequiredApplicationVersion(NcmContentMetaDatabase* db, u32* out_version, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetRequiredApplicationVersion(db, out_version, key); } -Result ContentMetaDatabaseGetContentIdByTypeAndIdOffset(NcmContentMetaDatabase* db, NcmContentId* out_content_id, const NcmContentMetaKey* key, NcmContentType type, u8 id_offset) { return ::ncmContentMetaDatabaseGetContentIdByTypeAndIdOffset(db, out_content_id, key, type, id_offset); } -Result ContentMetaDatabaseGetPlatform(NcmContentMetaDatabase* db, u8* out, const NcmContentMetaKey* key) { return ::ncmContentMetaDatabaseGetPlatform(db, out, key); } -void ContentInfoSizeToU64(const NcmContentInfo *info, u64 *out) { ::ncmContentInfoSizeToU64(info, out); } -void U64ToContentInfoSize(const u64 size, NcmContentInfo *info) { ::ncmU64ToContentInfoSize(size, info); } - -} // namespace ncm - -namespace news { - -Result Initialize(NewsServiceType service_type) { return ::newsInitialize(service_type); } -void Exit(void) { ::newsExit(); } -Service * GetServiceSession(void) { return ::newsGetServiceSession(); } -Result CreateNewlyArrivedEventHolder(NewsNewlyArrivedEventHolder *out) { return ::newsCreateNewlyArrivedEventHolder(out); } -Result CreateNewsDataService(NewsDataService *out) { return ::newsCreateNewsDataService(out); } -Result CreateNewsDatabaseService(NewsDatabaseService *out) { return ::newsCreateNewsDatabaseService(out); } -Result CreateOverwriteEventHolder(NewsOverwriteEventHolder *out) { return ::newsCreateOverwriteEventHolder(out); } -Result PostLocalNews(const void *news, size_t size) { return ::newsPostLocalNews(news, size); } -Result SetPassphrase(u64 program_id, const char *passphrase) { return ::newsSetPassphrase(program_id, passphrase); } -Result GetSubscriptionStatus(const char *filter, u32 *status) { return ::newsGetSubscriptionStatus(filter, status); } -Result GetTopicList(u32 channel, u32 *out_count, NewsTopicName *out, u32 max_count) { return ::newsGetTopicList(channel, out_count, out, max_count); } -Result GetSavedataUsage(u64 *current, u64 *total) { return ::newsGetSavedataUsage(current, total); } -Result IsSystemUpdateRequired(bool *out) { return ::newsIsSystemUpdateRequired(out); } -Result GetDatabaseVersion(u32 *version) { return ::newsGetDatabaseVersion(version); } -Result RequestImmediateReception(const char *filter) { return ::newsRequestImmediateReception(filter); } -Result SetSubscriptionStatus(const char *filter, u32 status) { return ::newsSetSubscriptionStatus(filter, status); } -Result ClearStorage(void) { return ::newsClearStorage(); } -Result ClearSubscriptionStatusAll(void) { return ::newsClearSubscriptionStatusAll(); } -Result GetNewsDatabaseDump(void *buffer, u64 size, u64 *out) { return ::newsGetNewsDatabaseDump(buffer, size, out); } -void NewlyArrivedEventHolderClose(NewsNewlyArrivedEventHolder *srv) { ::newsNewlyArrivedEventHolderClose(srv); } -Result NewlyArrivedEventHolderGet(NewsNewlyArrivedEventHolder *srv, Event *out) { return ::newsNewlyArrivedEventHolderGet(srv, out); } -void DataClose(NewsDataService *srv) { ::newsDataClose(srv); } -Result DataOpen(NewsDataService *srv, const char *file_name) { return ::newsDataOpen(srv, file_name); } -Result DataOpenWithNewsRecordV1(NewsDataService *srv, NewsRecordV1 *record) { return ::newsDataOpenWithNewsRecordV1(srv, record); } -Result DataRead(NewsDataService *srv, u64 *bytes_read, u64 offset, void *out, size_t out_size) { return ::newsDataRead(srv, bytes_read, offset, out, out_size); } -Result DataGetSize(NewsDataService *srv, u64 *size) { return ::newsDataGetSize(srv, size); } -Result DataOpenWithNewsRecord(NewsDataService *srv, NewsRecord *record) { return ::newsDataOpenWithNewsRecord(srv, record); } -void DatabaseClose(NewsDatabaseService *srv) { ::newsDatabaseClose(srv); } -Result DatabaseGetListV1(NewsDatabaseService *srv, NewsRecordV1 *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset) { return ::newsDatabaseGetListV1(srv, out, max_count, where, order, count, offset); } -Result DatabaseCount(NewsDatabaseService *srv, const char *filter, u32 *count) { return ::newsDatabaseCount(srv, filter, count); } -Result DatabaseGetList(NewsDatabaseService *srv, NewsRecord *out, u32 max_count, const char *where, const char *order, u32 *count, u32 offset) { return ::newsDatabaseGetList(srv, out, max_count, where, order, count, offset); } -void OverwriteEventHolderClose(NewsOverwriteEventHolder *srv) { ::newsOverwriteEventHolderClose(srv); } -Result OverwriteEventHolderGet(NewsOverwriteEventHolder *srv, Event *out) { return ::newsOverwriteEventHolderGet(srv, out); } - -} // namespace news - -namespace nfc { - -Result Initialize(NfcServiceType service_type) { return ::nfcInitialize(service_type); } -void Exit(void) { ::nfcExit(); } -Result MfInitialize(void) { return ::nfcMfInitialize(); } -void MfExit(void) { ::nfcMfExit(); } -Service* GetServiceSession(void) { return ::nfcGetServiceSession(); } -Service* GetServiceSession_Interface(void) { return ::nfcGetServiceSession_Interface(); } -Service* MfGetServiceSession(void) { return ::nfcMfGetServiceSession(); } -Service* MfGetServiceSession_Interface(void) { return ::nfcMfGetServiceSession_Interface(); } -Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count) { return ::nfcListDevices(total_out, out, count); } -Result StartDetection(const NfcDeviceHandle *handle, NfcProtocol protocol) { return ::nfcStartDetection(handle, protocol); } -Result StopDetection(const NfcDeviceHandle *handle) { return ::nfcStopDetection(handle); } -Result MfListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count) { return ::nfcMfListDevices(total_out, out, count); } -Result MfStartDetection(const NfcDeviceHandle *handle) { return ::nfcMfStartDetection(handle); } -Result MfStopDetection(const NfcDeviceHandle *handle) { return ::nfcMfStopDetection(handle); } -Result GetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out) { return ::nfcGetTagInfo(handle, out); } -Result MfGetTagInfo(const NfcDeviceHandle *handle, NfcTagInfo *out) { return ::nfcMfGetTagInfo(handle, out); } -Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcAttachActivateEvent(handle, out_event); } -Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcAttachDeactivateEvent(handle, out_event); } -Result MfAttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcMfAttachActivateEvent(handle, out_event); } -Result MfAttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfcMfAttachDeactivateEvent(handle, out_event); } -Result GetState(NfcState *out) { return ::nfcGetState(out); } -Result GetDeviceState(const NfcDeviceHandle *handle, NfcDeviceState *out) { return ::nfcGetDeviceState(handle, out); } -Result GetNpadId(const NfcDeviceHandle *handle, u32 *out) { return ::nfcGetNpadId(handle, out); } -Result MfGetState(NfcState *out) { return ::nfcMfGetState(out); } -Result MfGetDeviceState(const NfcDeviceHandle *handle, NfcMifareDeviceState *out) { return ::nfcMfGetDeviceState(handle, out); } -Result MfGetNpadId(const NfcDeviceHandle *handle, u32 *out) { return ::nfcMfGetNpadId(handle, out); } -Result AttachAvailabilityChangeEvent(Event *out_event) { return ::nfcAttachAvailabilityChangeEvent(out_event); } -Result MfAttachAvailabilityChangeEvent(Event *out_event) { return ::nfcMfAttachAvailabilityChangeEvent(out_event); } -Result IsNfcEnabled(bool *out) { return ::nfcIsNfcEnabled(out); } -Result ReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count) { return ::nfcReadMifare(handle, out_block_data, read_block_parameter, count); } -Result WriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count) { return ::nfcWriteMifare(handle, write_block_parameter, count); } -Result MfReadMifare(const NfcDeviceHandle *handle, NfcMifareReadBlockData *out_block_data, const NfcMifareReadBlockParameter *read_block_parameter, s32 count) { return ::nfcMfReadMifare(handle, out_block_data, read_block_parameter, count); } -Result MfWriteMifare(const NfcDeviceHandle *handle, const NfcMifareWriteBlockParameter *write_block_parameter, s32 count) { return ::nfcMfWriteMifare(handle, write_block_parameter, count); } -Result SendCommandByPassThrough(const NfcDeviceHandle *handle, u64 timeout, const void* cmd_buf, size_t cmd_buf_size, void* reply_buf, size_t reply_buf_size, u64 *out_size) { return ::nfcSendCommandByPassThrough(handle, timeout, cmd_buf, cmd_buf_size, reply_buf, reply_buf_size, out_size); } -Result KeepPassThroughSession(const NfcDeviceHandle *handle) { return ::nfcKeepPassThroughSession(handle); } -Result ReleasePassThroughSession(const NfcDeviceHandle *handle) { return ::nfcReleasePassThroughSession(handle); } - -} // namespace nfc - -namespace nfp { - -Result LaStartNicknameAndOwnerSettings(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, const NfpRegisterInfo *in_reg_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle, bool *reg_info_flag, NfpRegisterInfo *out_reg_info) { return ::nfpLaStartNicknameAndOwnerSettings(in_param, in_tag_info, in_reg_info, out_tag_info, handle, reg_info_flag, out_reg_info); } -Result LaStartGameDataEraser(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle) { return ::nfpLaStartGameDataEraser(in_param, in_tag_info, out_tag_info, handle); } -Result LaStartRestorer(const NfpLaAmiiboSettingsStartParam *in_param, const NfpTagInfo *in_tag_info, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle) { return ::nfpLaStartRestorer(in_param, in_tag_info, out_tag_info, handle); } -Result LaStartFormatter(const NfpLaAmiiboSettingsStartParam *in_param, NfpTagInfo *out_tag_info, NfcDeviceHandle *handle) { return ::nfpLaStartFormatter(in_param, out_tag_info, handle); } -Result Initialize(NfpServiceType service_type) { return ::nfpInitialize(service_type); } -void Exit(void) { ::nfpExit(); } -Service* GetServiceSession(void) { return ::nfpGetServiceSession(); } -Service* GetServiceSession_Interface(void) { return ::nfpGetServiceSession_Interface(); } -Result ListDevices(s32 *total_out, NfcDeviceHandle *out, s32 count) { return ::nfpListDevices(total_out, out, count); } -Result StartDetection(const NfcDeviceHandle *handle) { return ::nfpStartDetection(handle); } -Result StopDetection(const NfcDeviceHandle *handle) { return ::nfpStopDetection(handle); } -Result Mount(const NfcDeviceHandle *handle, NfpDeviceType device_type, NfpMountTarget mount_target) { return ::nfpMount(handle, device_type, mount_target); } -Result Unmount(const NfcDeviceHandle *handle) { return ::nfpUnmount(handle); } -Result OpenApplicationArea(const NfcDeviceHandle *handle, u32 app_id) { return ::nfpOpenApplicationArea(handle, app_id); } -Result GetApplicationArea(const NfcDeviceHandle *handle, void* buf, size_t buf_size, u32 *out_size) { return ::nfpGetApplicationArea(handle, buf, buf_size, out_size); } -Result SetApplicationArea(const NfcDeviceHandle *handle, const void* buf, size_t buf_size) { return ::nfpSetApplicationArea(handle, buf, buf_size); } -Result Flush(const NfcDeviceHandle *handle) { return ::nfpFlush(handle); } -Result Restore(const NfcDeviceHandle *handle) { return ::nfpRestore(handle); } -Result CreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size) { return ::nfpCreateApplicationArea(handle, app_id, buf, buf_size); } -Result RecreateApplicationArea(const NfcDeviceHandle *handle, u32 app_id, const void* buf, size_t buf_size) { return ::nfpRecreateApplicationArea(handle, app_id, buf, buf_size); } -Result GetApplicationAreaSize(const NfcDeviceHandle *handle, u32 *out_app_area_size) { return ::nfpGetApplicationAreaSize(handle, out_app_area_size); } -Result DeleteApplicationArea(const NfcDeviceHandle *handle) { return ::nfpDeleteApplicationArea(handle); } -Result ExistsApplicationArea(const NfcDeviceHandle *handle, bool *out) { return ::nfpExistsApplicationArea(handle, out); } -Result GetTagInfo(const NfcDeviceHandle *handle, NfpTagInfo *out) { return ::nfpGetTagInfo(handle, out); } -Result GetRegisterInfo(const NfcDeviceHandle *handle, NfpRegisterInfo *out) { return ::nfpGetRegisterInfo(handle, out); } -Result GetCommonInfo(const NfcDeviceHandle *handle, NfpCommonInfo *out) { return ::nfpGetCommonInfo(handle, out); } -Result GetModelInfo(const NfcDeviceHandle *handle, NfpModelInfo *out) { return ::nfpGetModelInfo(handle, out); } -Result GetAdminInfo(const NfcDeviceHandle *handle, NfpAdminInfo *out) { return ::nfpGetAdminInfo(handle, out); } -Result AttachActivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfpAttachActivateEvent(handle, out_event); } -Result AttachDeactivateEvent(const NfcDeviceHandle *handle, Event *out_event) { return ::nfpAttachDeactivateEvent(handle, out_event); } -Result GetState(NfcState *out) { return ::nfpGetState(out); } -Result GetDeviceState(const NfcDeviceHandle *handle, NfpDeviceState *out) { return ::nfpGetDeviceState(handle, out); } -Result GetNpadId(const NfcDeviceHandle *handle, u32 *out) { return ::nfpGetNpadId(handle, out); } -Result AttachAvailabilityChangeEvent(Event *out_event) { return ::nfpAttachAvailabilityChangeEvent(out_event); } -Result Format(const NfcDeviceHandle *handle) { return ::nfpFormat(handle); } -Result GetRegisterInfoPrivate(const NfcDeviceHandle *handle, NfpRegisterInfoPrivate *out) { return ::nfpGetRegisterInfoPrivate(handle, out); } -Result SetRegisterInfoPrivate(const NfcDeviceHandle *handle, const NfpRegisterInfoPrivate *register_info_private) { return ::nfpSetRegisterInfoPrivate(handle, register_info_private); } -Result DeleteRegisterInfo(const NfcDeviceHandle *handle) { return ::nfpDeleteRegisterInfo(handle); } -Result GetAll(const NfcDeviceHandle *handle, NfpData *out) { return ::nfpGetAll(handle, out); } -Result SetAll(const NfcDeviceHandle *handle, const NfpData *nfp_data) { return ::nfpSetAll(handle, nfp_data); } -Result FlushDebug(const NfcDeviceHandle *handle) { return ::nfpFlushDebug(handle); } -Result BreakTag(const NfcDeviceHandle *handle, NfpBreakType break_type) { return ::nfpBreakTag(handle, break_type); } -Result ReadBackupData(const NfcDeviceHandle *handle, void* out_buf, size_t buf_size, u32 *out_size) { return ::nfpReadBackupData(handle, out_buf, buf_size, out_size); } -Result WriteBackupData(const NfcDeviceHandle *handle, const void* buf, size_t buf_size) { return ::nfpWriteBackupData(handle, buf, buf_size); } -Result WriteNtf(const NfcDeviceHandle *handle, u32 write_type, const void* buf, size_t buf_size) { return ::nfpWriteNtf(handle, write_type, buf, buf_size); } - -} // namespace nfp - -namespace nifm { - -Result LaHandleNetworkRequestResult(NifmRequest* r) { return ::nifmLaHandleNetworkRequestResult(r); } -Result Initialize(NifmServiceType service_type) { return ::nifmInitialize(service_type); } -void Exit(void) { ::nifmExit(); } -Service* GetServiceSession_StaticService(void) { return ::nifmGetServiceSession_StaticService(); } -Service* GetServiceSession_GeneralService(void) { return ::nifmGetServiceSession_GeneralService(); } -NifmClientId GetClientId(void) { return ::nifmGetClientId(); } -Result CreateRequest(NifmRequest* r, bool autoclear) { return ::nifmCreateRequest(r, autoclear); } -Result GetCurrentNetworkProfile(NifmNetworkProfileData *profile) { return ::nifmGetCurrentNetworkProfile(profile); } -Result EnumerateNetworkProfiles(NifmNetworkProfileType type, NifmNetworkProfileBasicInfo* buffer, s32 max_entries, s32* total_entries) { return ::nifmEnumerateNetworkProfiles(type, buffer, max_entries, total_entries); } -Result GetNetworkProfile(Uuid uuid, NifmNetworkProfileData *profile) { return ::nifmGetNetworkProfile(uuid, profile); } -Result SetNetworkProfile(const NifmNetworkProfileData *profile, Uuid *uuid) { return ::nifmSetNetworkProfile(profile, uuid); } -Result GetCurrentIpAddress(u32* out) { return ::nifmGetCurrentIpAddress(out); } -Result GetCurrentIpConfigInfo(u32 *current_addr, u32 *subnet_mask, u32 *gateway, u32 *primary_dns_server, u32 *secondary_dns_server) { return ::nifmGetCurrentIpConfigInfo(current_addr, subnet_mask, gateway, primary_dns_server, secondary_dns_server); } -Result SetWirelessCommunicationEnabled(bool enable) { return ::nifmSetWirelessCommunicationEnabled(enable); } -Result IsWirelessCommunicationEnabled(bool* out) { return ::nifmIsWirelessCommunicationEnabled(out); } -Result GetInternetConnectionStatus(NifmInternetConnectionType* connectionType, u32* wifiStrength, NifmInternetConnectionStatus* connectionStatus) { return ::nifmGetInternetConnectionStatus(connectionType, wifiStrength, connectionStatus); } -Result IsEthernetCommunicationEnabled(bool* out) { return ::nifmIsEthernetCommunicationEnabled(out); } -bool IsAnyInternetRequestAccepted(NifmClientId id) { return ::nifmIsAnyInternetRequestAccepted(id); } -Result IsAnyForegroundRequestAccepted(bool* out) { return ::nifmIsAnyForegroundRequestAccepted(out); } -Result PutToSleep(void) { return ::nifmPutToSleep(); } -Result WakeUp(void) { return ::nifmWakeUp(); } -Result SetWowlDelayedWakeTime(s32 val) { return ::nifmSetWowlDelayedWakeTime(val); } -void RequestClose(NifmRequest* r) { ::nifmRequestClose(r); } -Result GetRequestState(NifmRequest* r, NifmRequestState *out) { return ::nifmGetRequestState(r, out); } -Result GetResult(NifmRequest* r) { return ::nifmGetResult(r); } -Result RequestCancel(NifmRequest* r) { return ::nifmRequestCancel(r); } -Result RequestSubmit(NifmRequest* r) { return ::nifmRequestSubmit(r); } -Result RequestSubmitAndWait(NifmRequest* r) { return ::nifmRequestSubmitAndWait(r); } -Result RequestGetAppletInfo(NifmRequest* r, u32 theme_color, void* buffer, size_t size, u32 *applet_id, u32 *mode, u32 *out_size) { return ::nifmRequestGetAppletInfo(r, theme_color, buffer, size, applet_id, mode, out_size); } -Result RequestSetKeptInSleep(NifmRequest* r, bool flag) { return ::nifmRequestSetKeptInSleep(r, flag); } -Result RequestRegisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::nifmRequestRegisterSocketDescriptor(r, sockfd); } -Result RequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::nifmRequestUnregisterSocketDescriptor(r, sockfd); } -Result RequestSetNetworkProfileId(NifmRequest* r, Uuid uuid) { return ::nifmRequestSetNetworkProfileId(r, uuid); } - -} // namespace nifm - -namespace nim { - -Result Initialize(void) { return ::nimInitialize(); } -void Exit(void) { ::nimExit(); } -Service* GetServiceSession(void) { return ::nimGetServiceSession(); } -Result ListSystemUpdateTask(s32 *out_count, NimSystemUpdateTaskId *out_task_ids, size_t max_task_ids) { return ::nimListSystemUpdateTask(out_count, out_task_ids, max_task_ids); } -Result DestroySystemUpdateTask(const NimSystemUpdateTaskId *task_id) { return ::nimDestroySystemUpdateTask(task_id); } - -} // namespace nim - -namespace notif { - -Result Initialize(NotifServiceType service_type) { return ::notifInitialize(service_type); } -void Exit(void) { ::notifExit(); } -Service* GetServiceSession(void) { return ::notifGetServiceSession(); } -void AlarmSettingCreate(NotifAlarmSetting *alarm_setting) { ::notifAlarmSettingCreate(alarm_setting); } -void AlarmSettingSetIsMuted(NotifAlarmSetting *alarm_setting, bool flag) { ::notifAlarmSettingSetIsMuted(alarm_setting, flag); } -void AlarmSettingSetUid(NotifAlarmSetting *alarm_setting, AccountUid uid) { ::notifAlarmSettingSetUid(alarm_setting, uid); } -Result AlarmSettingIsEnabled(NotifAlarmSetting *alarm_setting, u32 day_of_week, bool *out) { return ::notifAlarmSettingIsEnabled(alarm_setting, day_of_week, out); } -Result AlarmSettingGet(NotifAlarmSetting *alarm_setting, u32 day_of_week, NotifAlarmTime *out) { return ::notifAlarmSettingGet(alarm_setting, day_of_week, out); } -Result AlarmSettingEnable(NotifAlarmSetting *alarm_setting, u32 day_of_week, s32 hour, s32 minute) { return ::notifAlarmSettingEnable(alarm_setting, day_of_week, hour, minute); } -Result AlarmSettingDisable(NotifAlarmSetting *alarm_setting, u32 day_of_week) { return ::notifAlarmSettingDisable(alarm_setting, day_of_week); } -Result RegisterAlarmSetting(u16 *alarm_setting_id, const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size) { return ::notifRegisterAlarmSetting(alarm_setting_id, alarm_setting, buffer, size); } -Result UpdateAlarmSetting(const NotifAlarmSetting *alarm_setting, const void* buffer, size_t size) { return ::notifUpdateAlarmSetting(alarm_setting, buffer, size); } -Result ListAlarmSettings(NotifAlarmSetting *alarm_settings, s32 count, s32 *total_out) { return ::notifListAlarmSettings(alarm_settings, count, total_out); } -Result LoadApplicationParameter(u16 alarm_setting_id, void* buffer, size_t size, u32 *actual_size) { return ::notifLoadApplicationParameter(alarm_setting_id, buffer, size, actual_size); } -Result DeleteAlarmSetting(u16 alarm_setting_id) { return ::notifDeleteAlarmSetting(alarm_setting_id); } -Result GetNotificationSystemEvent(Event *out_event) { return ::notifGetNotificationSystemEvent(out_event); } -Result TryPopNotifiedApplicationParameter(void* buffer, u64 size, u64 *out_size) { return ::notifTryPopNotifiedApplicationParameter(buffer, size, out_size); } - -} // namespace notif - -namespace ns { - -Result Initialize(void) { return ::nsInitialize(); } -void Exit(void) { ::nsExit(); } -Service* GetServiceSession_GetterInterface(void) { return ::nsGetServiceSession_GetterInterface(); } -Service* GetServiceSession_ApplicationManagerInterface(void) { return ::nsGetServiceSession_ApplicationManagerInterface(); } -Result GetDynamicRightsInterface(Service* srv_out) { return ::nsGetDynamicRightsInterface(srv_out); } -Result GetReadOnlyApplicationControlDataInterface(Service* srv_out) { return ::nsGetReadOnlyApplicationControlDataInterface(srv_out); } -Result GetReadOnlyApplicationRecordInterface(Service* srv_out) { return ::nsGetReadOnlyApplicationRecordInterface(srv_out); } -Result GetECommerceInterface(Service* srv_out) { return ::nsGetECommerceInterface(srv_out); } -Result GetApplicationVersionInterface(Service* srv_out) { return ::nsGetApplicationVersionInterface(srv_out); } -Result GetFactoryResetInterface(Service* srv_out) { return ::nsGetFactoryResetInterface(srv_out); } -Result GetAccountProxyInterface(Service* srv_out) { return ::nsGetAccountProxyInterface(srv_out); } -Result GetApplicationManagerInterface(Service* srv_out) { return ::nsGetApplicationManagerInterface(srv_out); } -Result GetDownloadTaskInterface(Service* srv_out) { return ::nsGetDownloadTaskInterface(srv_out); } -Result GetContentManagementInterface(Service* srv_out) { return ::nsGetContentManagementInterface(srv_out); } -Result GetDocumentInterface(Service* srv_out) { return ::nsGetDocumentInterface(srv_out); } -Result GetApplicationControlData(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u64* actual_size) { return ::nsGetApplicationControlData(source, application_id, buffer, size, actual_size); } -Result GetApplicationControlData2(NsApplicationControlSource source, u64 application_id, NsApplicationControlData* buffer, size_t size, u8 flag1, u8 acd_idx, u64* actual_size, u32* unk) { return ::nsGetApplicationControlData2(source, application_id, buffer, size, flag1, acd_idx, actual_size, unk); } -Result GetApplicationDesiredLanguage(NacpStruct *nacp, NacpLanguageEntry **langentry) { return ::nsGetApplicationDesiredLanguage(nacp, langentry); } -Result RequestLinkDevice(AsyncResult *a, AccountUid uid) { return ::nsRequestLinkDevice(a, uid); } -Result RequestSyncRights(AsyncResult *a) { return ::nsRequestSyncRights(a); } -Result RequestUnlinkDevice(AsyncResult *a, AccountUid uid) { return ::nsRequestUnlinkDevice(a, uid); } -Result ResetToFactorySettings(void) { return ::nsResetToFactorySettings(); } -Result ResetToFactorySettingsWithoutUserSaveData(void) { return ::nsResetToFactorySettingsWithoutUserSaveData(); } -Result ResetToFactorySettingsForRefurbishment(void) { return ::nsResetToFactorySettingsForRefurbishment(); } -Result ResetToFactorySettingsWithPlatformRegion(void) { return ::nsResetToFactorySettingsWithPlatformRegion(); } -Result ResetToFactorySettingsWithPlatformRegionAuthentication(void) { return ::nsResetToFactorySettingsWithPlatformRegionAuthentication(); } -Result ListApplicationRecord(NsApplicationRecord* records, s32 count, s32 entry_offset, s32* out_entrycount) { return ::nsListApplicationRecord(records, count, entry_offset, out_entrycount); } -Result GetApplicationRecordUpdateSystemEvent(Event* out_event) { return ::nsGetApplicationRecordUpdateSystemEvent(out_event); } -Result GetApplicationViewDeprecated(NsApplicationViewDeprecated *views, const u64 *application_ids, s32 count) { return ::nsGetApplicationViewDeprecated(views, application_ids, count); } -Result DeleteApplicationEntity(u64 application_id) { return ::nsDeleteApplicationEntity(application_id); } -Result DeleteApplicationCompletely(u64 application_id) { return ::nsDeleteApplicationCompletely(application_id); } -Result DeleteRedundantApplicationEntity(void) { return ::nsDeleteRedundantApplicationEntity(); } -Result IsApplicationEntityMovable(u64 application_id, NcmStorageId storage_id, bool *out) { return ::nsIsApplicationEntityMovable(application_id, storage_id, out); } -Result MoveApplicationEntity(u64 application_id, NcmStorageId storage_id) { return ::nsMoveApplicationEntity(application_id, storage_id); } -Result RequestApplicationUpdateInfo(AsyncValue *a, u64 application_id) { return ::nsRequestApplicationUpdateInfo(a, application_id); } -Result CancelApplicationDownload(u64 application_id) { return ::nsCancelApplicationDownload(application_id); } -Result ResumeApplicationDownload(u64 application_id) { return ::nsResumeApplicationDownload(application_id); } -Result CheckApplicationLaunchVersion(u64 application_id) { return ::nsCheckApplicationLaunchVersion(application_id); } -Result CalculateApplicationDownloadRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size) { return ::nsCalculateApplicationDownloadRequiredSize(application_id, storage_id, size); } -Result CleanupSdCard(void) { return ::nsCleanupSdCard(); } -Result GetSdCardMountStatusChangedEvent(Event* out_event) { return ::nsGetSdCardMountStatusChangedEvent(out_event); } -Result GetGameCardUpdateDetectionEvent(Event* out_event) { return ::nsGetGameCardUpdateDetectionEvent(out_event); } -Result DisableApplicationAutoDelete(u64 application_id) { return ::nsDisableApplicationAutoDelete(application_id); } -Result EnableApplicationAutoDelete(u64 application_id) { return ::nsEnableApplicationAutoDelete(application_id); } -Result SetApplicationTerminateResult(u64 application_id, Result res) { return ::nsSetApplicationTerminateResult(application_id, res); } -Result ClearApplicationTerminateResult(u64 application_id) { return ::nsClearApplicationTerminateResult(application_id); } -Result GetLastSdCardMountUnexpectedResult(void) { return ::nsGetLastSdCardMountUnexpectedResult(); } -Result GetRequestServerStopper(NsRequestServerStopper *r) { return ::nsGetRequestServerStopper(r); } -Result CancelApplicationApplyDelta(u64 application_id) { return ::nsCancelApplicationApplyDelta(application_id); } -Result ResumeApplicationApplyDelta(u64 application_id) { return ::nsResumeApplicationApplyDelta(application_id); } -Result CalculateApplicationApplyDeltaRequiredSize(u64 application_id, NcmStorageId *storage_id, s64 *size) { return ::nsCalculateApplicationApplyDeltaRequiredSize(application_id, storage_id, size); } -Result ResumeAll(void) { return ::nsResumeAll(); } -Result GetStorageSize(NcmStorageId storage_id, s64 *total_space_size, s64 *free_space_size) { return ::nsGetStorageSize(storage_id, total_space_size, free_space_size); } -Result RequestUpdateApplication2(AsyncResult *a, u64 application_id) { return ::nsRequestUpdateApplication2(a, application_id); } -Result DeleteUserSaveDataAll(NsProgressMonitorForDeleteUserSaveDataAll *p, AccountUid uid) { return ::nsDeleteUserSaveDataAll(p, uid); } -Result DeleteUserSystemSaveData(AccountUid uid, u64 system_save_data_id) { return ::nsDeleteUserSystemSaveData(uid, system_save_data_id); } -Result DeleteSaveData(FsSaveDataSpaceId save_data_space_id, u64 save_data_id) { return ::nsDeleteSaveData(save_data_space_id, save_data_id); } -Result UnregisterNetworkServiceAccount(AccountUid uid) { return ::nsUnregisterNetworkServiceAccount(uid); } -Result UnregisterNetworkServiceAccountWithUserSaveDataDeletion(AccountUid uid) { return ::nsUnregisterNetworkServiceAccountWithUserSaveDataDeletion(uid); } -Result RequestDownloadApplicationControlData(AsyncResult *a, u64 application_id) { return ::nsRequestDownloadApplicationControlData(a, application_id); } -Result ListApplicationTitle(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size) { return ::nsListApplicationTitle(a, source, application_ids, count, buffer, size); } -Result ListApplicationTitle2(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size) { return ::nsListApplicationTitle2(a, source, application_ids, count, buffer, size); } -Result ListApplicationIcon(AsyncValue *a, NsApplicationControlSource source, const u64 *application_ids, s32 count, void* buffer, size_t size) { return ::nsListApplicationIcon(a, source, application_ids, count, buffer, size); } -Result RequestCheckGameCardRegistration(AsyncResult *a, u64 application_id) { return ::nsRequestCheckGameCardRegistration(a, application_id); } -Result RequestGameCardRegistrationGoldPoint(AsyncValue *a, AccountUid uid, u64 application_id) { return ::nsRequestGameCardRegistrationGoldPoint(a, uid, application_id); } -Result RequestRegisterGameCard(AsyncResult *a, AccountUid uid, u64 application_id, s32 inval) { return ::nsRequestRegisterGameCard(a, uid, application_id, inval); } -Result GetGameCardMountFailureEvent(Event* out_event) { return ::nsGetGameCardMountFailureEvent(out_event); } -Result IsGameCardInserted(bool *out) { return ::nsIsGameCardInserted(out); } -Result EnsureGameCardAccess(void) { return ::nsEnsureGameCardAccess(); } -Result GetLastGameCardMountFailureResult(void) { return ::nsGetLastGameCardMountFailureResult(); } -Result ListApplicationIdOnGameCard(u64 *application_ids, s32 count, s32 *total_out) { return ::nsListApplicationIdOnGameCard(application_ids, count, total_out); } -Result TouchApplication(u64 application_id) { return ::nsTouchApplication(application_id); } -Result IsApplicationUpdateRequested(u64 application_id, bool *flag, u32 *out) { return ::nsIsApplicationUpdateRequested(application_id, flag, out); } -Result WithdrawApplicationUpdateRequest(u64 application_id) { return ::nsWithdrawApplicationUpdateRequest(application_id); } -Result RequestVerifyAddOnContentsRights(NsProgressAsyncResult *a, u64 application_id) { return ::nsRequestVerifyAddOnContentsRights(a, application_id); } -Result RequestVerifyApplication(NsProgressAsyncResult *a, u64 application_id, u32 unk, void* buffer, size_t size) { return ::nsRequestVerifyApplication(a, application_id, unk, buffer, size); } -Result IsAnyApplicationEntityInstalled(u64 application_id, bool *out) { return ::nsIsAnyApplicationEntityInstalled(application_id, out); } -Result CleanupUnavailableAddOnContents(u64 application_id, AccountUid uid) { return ::nsCleanupUnavailableAddOnContents(application_id, uid); } -Result EstimateSizeToMove(u8 *storage_ids, s32 count, NcmStorageId storage_id, u32 flags, u64 application_id, s64 *out) { return ::nsEstimateSizeToMove(storage_ids, count, storage_id, flags, application_id, out); } -Result FormatSdCard(void) { return ::nsFormatSdCard(); } -Result NeedsSystemUpdateToFormatSdCard(bool *out) { return ::nsNeedsSystemUpdateToFormatSdCard(out); } -Result GetLastSdCardFormatUnexpectedResult(void) { return ::nsGetLastSdCardFormatUnexpectedResult(); } -Result GetApplicationView(NsApplicationView *views, const u64 *application_ids, s32 count) { return ::nsGetApplicationView(views, application_ids, count); } -Result GetApplicationViewDownloadErrorContext(u64 application_id, ErrorContext *context) { return ::nsGetApplicationViewDownloadErrorContext(application_id, context); } -Result GetApplicationViewWithPromotionInfo(NsApplicationViewWithPromotionInfo *out, const u64 *application_ids, s32 count) { return ::nsGetApplicationViewWithPromotionInfo(out, application_ids, count); } -Result RequestDownloadApplicationPrepurchasedRights(AsyncResult *a, u64 application_id) { return ::nsRequestDownloadApplicationPrepurchasedRights(a, application_id); } -Result GetSystemDeliveryInfo(NsSystemDeliveryInfo *info) { return ::nsGetSystemDeliveryInfo(info); } -Result SelectLatestSystemDeliveryInfo(const NsSystemDeliveryInfo *sys_list, s32 sys_count, const NsSystemDeliveryInfo *base_info, const NsApplicationDeliveryInfo *app_list, s32 app_count, s32 *index) { return ::nsSelectLatestSystemDeliveryInfo(sys_list, sys_count, base_info, app_list, app_count, index); } -Result VerifyDeliveryProtocolVersion(const NsSystemDeliveryInfo *info) { return ::nsVerifyDeliveryProtocolVersion(info); } -Result GetApplicationDeliveryInfo(NsApplicationDeliveryInfo *info, s32 count, u64 application_id, u32 attr, s32 *total_out) { return ::nsGetApplicationDeliveryInfo(info, count, application_id, attr, total_out); } -Result HasAllContentsToDeliver(const NsApplicationDeliveryInfo* info, s32 count, bool *out) { return ::nsHasAllContentsToDeliver(info, count, out); } -Result CompareApplicationDeliveryInfo(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, s32 *out) { return ::nsCompareApplicationDeliveryInfo(info0, count0, info1, count1, out); } -Result CanDeliverApplication(const NsApplicationDeliveryInfo *info0, s32 count0, const NsApplicationDeliveryInfo *info1, s32 count1, bool *out) { return ::nsCanDeliverApplication(info0, count0, info1, count1, out); } -Result ListContentMetaKeyToDeliverApplication(NcmContentMetaKey *meta, s32 meta_count, s32 meta_index, const NsApplicationDeliveryInfo *info, s32 info_count, s32 *total_out) { return ::nsListContentMetaKeyToDeliverApplication(meta, meta_count, meta_index, info, info_count, total_out); } -Result NeedsSystemUpdateToDeliverApplication(const NsApplicationDeliveryInfo *info, s32 count, const NsSystemDeliveryInfo *sys_info, bool *out) { return ::nsNeedsSystemUpdateToDeliverApplication(info, count, sys_info, out); } -Result EstimateRequiredSize(const NcmContentMetaKey *meta, s32 count, s64 *out) { return ::nsEstimateRequiredSize(meta, count, out); } -Result RequestReceiveApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count, NcmStorageId storage_id) { return ::nsRequestReceiveApplication(a, addr, port, application_id, meta, count, storage_id); } -Result CommitReceiveApplication(u64 application_id) { return ::nsCommitReceiveApplication(application_id); } -Result GetReceiveApplicationProgress(u64 application_id, NsReceiveApplicationProgress *out) { return ::nsGetReceiveApplicationProgress(application_id, out); } -Result RequestSendApplication(AsyncResult *a, u32 addr, u16 port, u64 application_id, const NcmContentMetaKey *meta, s32 count) { return ::nsRequestSendApplication(a, addr, port, application_id, meta, count); } -Result GetSendApplicationProgress(u64 application_id, NsSendApplicationProgress *out) { return ::nsGetSendApplicationProgress(application_id, out); } -Result CompareSystemDeliveryInfo(const NsSystemDeliveryInfo *info0, const NsSystemDeliveryInfo *info1, s32 *out) { return ::nsCompareSystemDeliveryInfo(info0, info1, out); } -Result ListNotCommittedContentMeta(NcmContentMetaKey *meta, s32 count, u64 application_id, s32 unk, s32 *total_out) { return ::nsListNotCommittedContentMeta(meta, count, application_id, unk, total_out); } -Result GetApplicationDeliveryInfoHash(const NsApplicationDeliveryInfo *info, s32 count, u8 *out_hash) { return ::nsGetApplicationDeliveryInfoHash(info, count, out_hash); } -Result GetApplicationTerminateResult(u64 application_id, Result *res) { return ::nsGetApplicationTerminateResult(application_id, res); } -Result GetApplicationRightsOnClient(NsApplicationRightsOnClient *rights, s32 count, u64 application_id, AccountUid uid, u32 flags, s32 *total_out) { return ::nsGetApplicationRightsOnClient(rights, count, application_id, uid, flags, total_out); } -Result RequestNoDownloadRightsErrorResolution(AsyncValue *a, u64 application_id) { return ::nsRequestNoDownloadRightsErrorResolution(a, application_id); } -Result RequestResolveNoDownloadRightsError(AsyncValue *a, u64 application_id) { return ::nsRequestResolveNoDownloadRightsError(a, application_id); } -Result GetPromotionInfo(NsPromotionInfo *promotion, u64 application_id, AccountUid uid) { return ::nsGetPromotionInfo(promotion, application_id, uid); } -Result ClearTaskStatusList(void) { return ::nsClearTaskStatusList(); } -Result RequestDownloadTaskList(void) { return ::nsRequestDownloadTaskList(); } -Result RequestEnsureDownloadTask(AsyncResult *a) { return ::nsRequestEnsureDownloadTask(a); } -Result ListDownloadTaskStatus(NsDownloadTaskStatus* tasks, s32 count, s32 *total_out) { return ::nsListDownloadTaskStatus(tasks, count, total_out); } -Result RequestDownloadTaskListData(AsyncValue *a) { return ::nsRequestDownloadTaskListData(a); } -Result TryCommitCurrentApplicationDownloadTask(void) { return ::nsTryCommitCurrentApplicationDownloadTask(); } -Result EnableAutoCommit(void) { return ::nsEnableAutoCommit(); } -Result DisableAutoCommit(void) { return ::nsDisableAutoCommit(); } -Result TriggerDynamicCommitEvent(void) { return ::nsTriggerDynamicCommitEvent(); } -Result CalculateApplicationOccupiedSize(u64 application_id, NsApplicationOccupiedSize *out) { return ::nsCalculateApplicationOccupiedSize(application_id, out); } -Result CheckSdCardMountStatus(void) { return ::nsCheckSdCardMountStatus(); } -Result GetTotalSpaceSize(NcmStorageId storage_id, s64 *size) { return ::nsGetTotalSpaceSize(storage_id, size); } -Result GetFreeSpaceSize(NcmStorageId storage_id, s64 *size) { return ::nsGetFreeSpaceSize(storage_id, size); } -Result CountApplicationContentMeta(u64 application_id, s32 *out) { return ::nsCountApplicationContentMeta(application_id, out); } -Result ListApplicationContentMetaStatus(u64 application_id, s32 index, NsApplicationContentMetaStatus* list, s32 count, s32* out_entrycount) { return ::nsListApplicationContentMetaStatus(application_id, index, list, count, out_entrycount); } -Result IsAnyApplicationRunning(bool *out) { return ::nsIsAnyApplicationRunning(out); } -void RequestServerStopperClose(NsRequestServerStopper *r) { ::nsRequestServerStopperClose(r); } -Result ProgressMonitorForDeleteUserSaveDataAllClose(NsProgressMonitorForDeleteUserSaveDataAll *p) { return ::nsProgressMonitorForDeleteUserSaveDataAllClose(p); } -Result ProgressMonitorForDeleteUserSaveDataAllGetSystemEvent(NsProgressMonitorForDeleteUserSaveDataAll *p, Event* out_event) { return ::nsProgressMonitorForDeleteUserSaveDataAllGetSystemEvent(p, out_event); } -Result ProgressMonitorForDeleteUserSaveDataAllIsFinished(NsProgressMonitorForDeleteUserSaveDataAll *p, bool *out) { return ::nsProgressMonitorForDeleteUserSaveDataAllIsFinished(p, out); } -Result ProgressMonitorForDeleteUserSaveDataAllGetResult(NsProgressMonitorForDeleteUserSaveDataAll *p) { return ::nsProgressMonitorForDeleteUserSaveDataAllGetResult(p); } -Result ProgressMonitorForDeleteUserSaveDataAllGetProgress(NsProgressMonitorForDeleteUserSaveDataAll *p, NsProgressForDeleteUserSaveDataAll *progress) { return ::nsProgressMonitorForDeleteUserSaveDataAllGetProgress(p, progress); } -void ProgressAsyncResultClose(NsProgressAsyncResult *a) { ::nsProgressAsyncResultClose(a); } -Result ProgressAsyncResultWait(NsProgressAsyncResult *a, u64 timeout) { return ::nsProgressAsyncResultWait(a, timeout); } -Result ProgressAsyncResultGet(NsProgressAsyncResult *a) { return ::nsProgressAsyncResultGet(a); } -Result ProgressAsyncResultCancel(NsProgressAsyncResult *a) { return ::nsProgressAsyncResultCancel(a); } -Result ProgressAsyncResultGetProgress(NsProgressAsyncResult *a, void* buffer, size_t size) { return ::nsProgressAsyncResultGetProgress(a, buffer, size); } -Result ProgressAsyncResultGetDetailResult(NsProgressAsyncResult *a) { return ::nsProgressAsyncResultGetDetailResult(a); } -Result ProgressAsyncResultGetErrorContext(NsProgressAsyncResult *a, ErrorContext *context) { return ::nsProgressAsyncResultGetErrorContext(a, context); } - -} // namespace ns - -namespace nsdev { - -Result Initialize(void) { return ::nsdevInitialize(); } -void Exit(void) { ::nsdevExit(); } -Service* GetServiceSession(void) { return ::nsdevGetServiceSession(); } -Result LaunchProgram(u64* out_pid, const NsLaunchProperties* properties, u32 flags) { return ::nsdevLaunchProgram(out_pid, properties, flags); } -Result TerminateProcess(u64 pid) { return ::nsdevTerminateProcess(pid); } -Result TerminateProgram(u64 tid) { return ::nsdevTerminateProgram(tid); } -Result GetShellEvent(Event* out_event) { return ::nsdevGetShellEvent(out_event); } -Result GetShellEventInfo(NsShellEventInfo* out) { return ::nsdevGetShellEventInfo(out); } -Result TerminateApplication(void) { return ::nsdevTerminateApplication(); } -Result PrepareLaunchProgramFromHost(NsLaunchProperties* out, const char* path, size_t path_len) { return ::nsdevPrepareLaunchProgramFromHost(out, path, path_len); } -Result LaunchApplicationForDevelop(u64* out_pid, u64 application_id, u32 flags) { return ::nsdevLaunchApplicationForDevelop(out_pid, application_id, flags); } -Result LaunchApplicationFromHost(u64* out_pid, const char* path, size_t path_len, u32 flags) { return ::nsdevLaunchApplicationFromHost(out_pid, path, path_len, flags); } -Result LaunchApplicationWithStorageIdForDevelop(u64* out_pid, u64 application_id, u32 flags, u8 app_storage_id, u8 patch_storage_id) { return ::nsdevLaunchApplicationWithStorageIdForDevelop(out_pid, application_id, flags, app_storage_id, patch_storage_id); } -Result IsSystemMemoryResourceLimitBoosted(bool* out) { return ::nsdevIsSystemMemoryResourceLimitBoosted(out); } -Result GetRunningApplicationProcessIdForDevelop(u64* out_pid) { return ::nsdevGetRunningApplicationProcessIdForDevelop(out_pid); } -Result SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(bool can_be_active) { return ::nsdevSetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop(can_be_active); } - -} // namespace nsdev - -namespace nssu { - -Result Initialize(void) { return ::nssuInitialize(); } -void Exit(void) { ::nssuExit(); } -Service* GetServiceSession(void) { return ::nssuGetServiceSession(); } -Result GetBackgroundNetworkUpdateState(NsBackgroundNetworkUpdateState *out) { return ::nssuGetBackgroundNetworkUpdateState(out); } -Result OpenSystemUpdateControl(NsSystemUpdateControl *c) { return ::nssuOpenSystemUpdateControl(c); } -Result NotifyExFatDriverRequired(void) { return ::nssuNotifyExFatDriverRequired(); } -Result ClearExFatDriverStatusForDebug(void) { return ::nssuClearExFatDriverStatusForDebug(); } -Result RequestBackgroundNetworkUpdate(void) { return ::nssuRequestBackgroundNetworkUpdate(); } -Result NotifyBackgroundNetworkUpdate(const NcmContentMetaKey *key) { return ::nssuNotifyBackgroundNetworkUpdate(key); } -Result NotifyExFatDriverDownloadedForDebug(void) { return ::nssuNotifyExFatDriverDownloadedForDebug(); } -Result GetSystemUpdateNotificationEventForContentDelivery(Event* out_event) { return ::nssuGetSystemUpdateNotificationEventForContentDelivery(out_event); } -Result NotifySystemUpdateForContentDelivery(void) { return ::nssuNotifySystemUpdateForContentDelivery(); } -Result PrepareShutdown(void) { return ::nssuPrepareShutdown(); } -Result DestroySystemUpdateTask(void) { return ::nssuDestroySystemUpdateTask(); } -Result RequestSendSystemUpdate(AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info) { return ::nssuRequestSendSystemUpdate(a, addr, port, info); } -Result GetSendSystemUpdateProgress(NsSystemUpdateProgress *out) { return ::nssuGetSendSystemUpdateProgress(out); } -void ControlClose(NsSystemUpdateControl *c) { ::nssuControlClose(c); } -Result ControlHasDownloaded(NsSystemUpdateControl *c, bool* out) { return ::nssuControlHasDownloaded(c, out); } -Result ControlRequestCheckLatestUpdate(NsSystemUpdateControl *c, AsyncValue *a) { return ::nssuControlRequestCheckLatestUpdate(c, a); } -Result ControlRequestDownloadLatestUpdate(NsSystemUpdateControl *c, AsyncResult *a) { return ::nssuControlRequestDownloadLatestUpdate(c, a); } -Result ControlGetDownloadProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out) { return ::nssuControlGetDownloadProgress(c, out); } -Result ControlApplyDownloadedUpdate(NsSystemUpdateControl *c) { return ::nssuControlApplyDownloadedUpdate(c); } -Result ControlRequestPrepareCardUpdate(NsSystemUpdateControl *c, AsyncResult *a) { return ::nssuControlRequestPrepareCardUpdate(c, a); } -Result ControlGetPrepareCardUpdateProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out) { return ::nssuControlGetPrepareCardUpdateProgress(c, out); } -Result ControlHasPreparedCardUpdate(NsSystemUpdateControl *c, bool* out) { return ::nssuControlHasPreparedCardUpdate(c, out); } -Result ControlApplyCardUpdate(NsSystemUpdateControl *c) { return ::nssuControlApplyCardUpdate(c); } -Result ControlGetDownloadedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize) { return ::nssuControlGetDownloadedEulaDataSize(c, path, filesize); } -Result ControlGetDownloadedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize) { return ::nssuControlGetDownloadedEulaData(c, path, buffer, size, filesize); } -Result ControlSetupCardUpdate(NsSystemUpdateControl *c, void* buffer, size_t size) { return ::nssuControlSetupCardUpdate(c, buffer, size); } -Result ControlGetPreparedCardUpdateEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize) { return ::nssuControlGetPreparedCardUpdateEulaDataSize(c, path, filesize); } -Result ControlGetPreparedCardUpdateEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize) { return ::nssuControlGetPreparedCardUpdateEulaData(c, path, buffer, size, filesize); } -Result ControlSetupCardUpdateViaSystemUpdater(NsSystemUpdateControl *c, void* buffer, size_t size) { return ::nssuControlSetupCardUpdateViaSystemUpdater(c, buffer, size); } -Result ControlHasReceived(NsSystemUpdateControl *c, bool* out) { return ::nssuControlHasReceived(c, out); } -Result ControlRequestReceiveSystemUpdate(NsSystemUpdateControl *c, AsyncResult *a, u32 addr, u16 port, NsSystemDeliveryInfo *info) { return ::nssuControlRequestReceiveSystemUpdate(c, a, addr, port, info); } -Result ControlGetReceiveProgress(NsSystemUpdateControl *c, NsSystemUpdateProgress *out) { return ::nssuControlGetReceiveProgress(c, out); } -Result ControlApplyReceivedUpdate(NsSystemUpdateControl *c) { return ::nssuControlApplyReceivedUpdate(c); } -Result ControlGetReceivedEulaDataSize(NsSystemUpdateControl *c, const char* path, u64 *filesize) { return ::nssuControlGetReceivedEulaDataSize(c, path, filesize); } -Result ControlGetReceivedEulaData(NsSystemUpdateControl *c, const char* path, void* buffer, size_t size, u64 *filesize) { return ::nssuControlGetReceivedEulaData(c, path, buffer, size, filesize); } -Result ControlSetupToReceiveSystemUpdate(NsSystemUpdateControl *c) { return ::nssuControlSetupToReceiveSystemUpdate(c); } -Result ControlRequestCheckLatestUpdateIncludesRebootlessUpdate(NsSystemUpdateControl *c, AsyncValue *a) { return ::nssuControlRequestCheckLatestUpdateIncludesRebootlessUpdate(c, a); } - -} // namespace nssu - -namespace nsvm { - -Result Initialize(void) { return ::nsvmInitialize(); } -void Exit(void) { ::nsvmExit(); } -Service* GetServiceSession(void) { return ::nsvmGetServiceSession(); } -Result NeedsUpdateVulnerability(bool *out) { return ::nsvmNeedsUpdateVulnerability(out); } -Result GetSafeSystemVersion(NcmContentMetaKey *out) { return ::nsvmGetSafeSystemVersion(out); } - -} // namespace nsvm - -namespace nv { - -Result AddressSpaceCreate(NvAddressSpace* a, u32 page_size) { return ::nvAddressSpaceCreate(a, page_size); } -void AddressSpaceClose(NvAddressSpace* a) { ::nvAddressSpaceClose(a); } -Result AddressSpaceAlloc(NvAddressSpace* a, bool sparse, u64 size, iova_t* iova_out) { return ::nvAddressSpaceAlloc(a, sparse, size, iova_out); } -Result AddressSpaceAllocFixed(NvAddressSpace* a, bool sparse, u64 size, iova_t iova) { return ::nvAddressSpaceAllocFixed(a, sparse, size, iova); } -Result AddressSpaceFree(NvAddressSpace* a, iova_t iova, u64 size) { return ::nvAddressSpaceFree(a, iova, size); } -Result AddressSpaceMap(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t* iova_out) { return ::nvAddressSpaceMap(a, nvmap_handle, is_gpu_cacheable, kind, iova_out); } -Result AddressSpaceMapFixed(NvAddressSpace* a, u32 nvmap_handle, bool is_gpu_cacheable, NvKind kind, iova_t iova) { return ::nvAddressSpaceMapFixed(a, nvmap_handle, is_gpu_cacheable, kind, iova); } -Result AddressSpaceModify(NvAddressSpace* a, iova_t iova, u64 offset, u64 size, NvKind kind) { return ::nvAddressSpaceModify(a, iova, offset, size, kind); } -Result AddressSpaceUnmap(NvAddressSpace* a, iova_t iova) { return ::nvAddressSpaceUnmap(a, iova); } -Result ChannelCreate(NvChannel* c, const char* dev) { return ::nvChannelCreate(c, dev); } -void ChannelClose(NvChannel* c) { ::nvChannelClose(c); } -Result ChannelSetPriority(NvChannel* c, NvChannelPriority prio) { return ::nvChannelSetPriority(c, prio); } -Result ChannelSetTimeout(NvChannel* c, u32 timeout) { return ::nvChannelSetTimeout(c, timeout); } -Result FenceInit(void) { return ::nvFenceInit(); } -void FenceExit(void) { ::nvFenceExit(); } -u32 FenceGetFd(void) { return ::nvFenceGetFd(); } -Result FenceWait(NvFence* f, s32 timeout_us) { return ::nvFenceWait(f, timeout_us); } -void MultiFenceCreate(NvMultiFence* mf, const NvFence* fence) { ::nvMultiFenceCreate(mf, fence); } -Result MultiFenceWait(NvMultiFence* mf, s32 timeout_us) { return ::nvMultiFenceWait(mf, timeout_us); } -Result GpuInit(void) { return ::nvGpuInit(); } -void GpuExit(void) { ::nvGpuExit(); } -const nvioctl_gpu_characteristics* GpuGetCharacteristics(void) { return ::nvGpuGetCharacteristics(); } -u32 GpuGetZcullCtxSize(void) { return ::nvGpuGetZcullCtxSize(); } -const nvioctl_zcull_info* GpuGetZcullInfo(void) { return ::nvGpuGetZcullInfo(); } -const u32* GpuGetTpcMasks(u32 *num_masks_out) { return ::nvGpuGetTpcMasks(num_masks_out); } -Result GpuZbcGetActiveSlotMask(u32 *out_slot, u32 *out_mask) { return ::nvGpuZbcGetActiveSlotMask(out_slot, out_mask); } -Result GpuZbcAddColor(const u32 color_l2[4], const u32 color_ds[4], u32 format) { return ::nvGpuZbcAddColor(color_l2, color_ds, format); } -Result GpuZbcAddDepth(float depth) { return ::nvGpuZbcAddDepth(depth); } -Result GpuGetTimestamp(u64 *ts) { return ::nvGpuGetTimestamp(ts); } -Result GpuChannelCreate(NvGpuChannel* c, struct NvAddressSpace* as, NvChannelPriority prio) { return ::nvGpuChannelCreate(c, as, prio); } -void GpuChannelClose(NvGpuChannel* c) { ::nvGpuChannelClose(c); } -Result GpuChannelZcullBind(NvGpuChannel* c, iova_t iova) { return ::nvGpuChannelZcullBind(c, iova); } -Result GpuChannelAppendEntry(NvGpuChannel* c, iova_t start, size_t num_cmds, u32 flags, u32 flush_threshold) { return ::nvGpuChannelAppendEntry(c, start, num_cmds, flags, flush_threshold); } -Result GpuChannelKickoff(NvGpuChannel* c) { return ::nvGpuChannelKickoff(c); } -Result GpuChannelGetErrorNotification(NvGpuChannel* c, NvNotification* notif) { return ::nvGpuChannelGetErrorNotification(c, notif); } -Result GpuChannelGetErrorInfo(NvGpuChannel* c, NvError* error) { return ::nvGpuChannelGetErrorInfo(c, error); } -u32 GpuChannelGetSyncpointId(NvGpuChannel* c) { return ::nvGpuChannelGetSyncpointId(c); } -void GpuChannelGetFence(NvGpuChannel* c, NvFence* fence_out) { ::nvGpuChannelGetFence(c, fence_out); } -void GpuChannelIncrFence(NvGpuChannel* c) { ::nvGpuChannelIncrFence(c); } -Result MapInit(void) { return ::nvMapInit(); } -u32 MapGetFd(void) { return ::nvMapGetFd(); } -void MapExit(void) { ::nvMapExit(); } -Result MapCreate(NvMap* m, void* cpu_addr, u32 size, u32 align, NvKind kind, bool is_cpu_cacheable) { return ::nvMapCreate(m, cpu_addr, size, align, kind, is_cpu_cacheable); } -Result MapLoadRemote(NvMap* m, u32 id) { return ::nvMapLoadRemote(m, id); } -void MapClose(NvMap* m) { ::nvMapClose(m); } -u32 MapGetHandle(NvMap* m) { return ::nvMapGetHandle(m); } -u32 MapGetId(NvMap* m) { return ::nvMapGetId(m); } -u32 MapGetSize(NvMap* m) { return ::nvMapGetSize(m); } -void* MapGetCpuAddr(NvMap* m) { return ::nvMapGetCpuAddr(m); } -bool MapIsRemote(NvMap* m) { return ::nvMapIsRemote(m); } -NvKind MapGetKind(NvMap* m) { return ::nvMapGetKind(m); } -Result Initialize(void) { return ::nvInitialize(); } -void Exit(void) { ::nvExit(); } -Service* GetServiceSession(void) { return ::nvGetServiceSession(); } -Result Open(u32 *fd, const char *devicepath) { return ::nvOpen(fd, devicepath); } -Result Ioctl(u32 fd, u32 request, void* argp) { return ::nvIoctl(fd, request, argp); } -Result Ioctl2(u32 fd, u32 request, void* argp, const void* inbuf, size_t inbuf_size) { return ::nvIoctl2(fd, request, argp, inbuf, inbuf_size); } -Result Ioctl3(u32 fd, u32 request, void* argp, void* outbuf, size_t outbuf_size) { return ::nvIoctl3(fd, request, argp, outbuf, outbuf_size); } -Result Close(u32 fd) { return ::nvClose(fd); } -Result QueryEvent(u32 fd, u32 event_id, Event *event_out) { return ::nvQueryEvent(fd, event_id, event_out); } -Result ConvertError(int rc) { return ::nvConvertError(rc); } - -} // namespace nv - -namespace nvioctl { - -Result NvhostCtrl_SyncptRead(u32 fd, u32 id, u32* out) { return ::nvioctlNvhostCtrl_SyncptRead(fd, id, out); } -Result NvhostCtrl_SyncptIncr(u32 fd, u32 id) { return ::nvioctlNvhostCtrl_SyncptIncr(fd, id); } -Result NvhostCtrl_SyncptWait(u32 fd, u32 id, u32 threshold, u32 timeout) { return ::nvioctlNvhostCtrl_SyncptWait(fd, id, threshold, timeout); } -Result NvhostCtrl_EventSignal(u32 fd, u32 event_id) { return ::nvioctlNvhostCtrl_EventSignal(fd, event_id); } -Result NvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out) { return ::nvioctlNvhostCtrl_EventWait(fd, syncpt_id, threshold, timeout, event_id, out); } -Result NvhostCtrl_EventWaitAsync(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id) { return ::nvioctlNvhostCtrl_EventWaitAsync(fd, syncpt_id, threshold, timeout, event_id); } -Result NvhostCtrl_EventRegister(u32 fd, u32 event_id) { return ::nvioctlNvhostCtrl_EventRegister(fd, event_id); } -Result NvhostCtrl_EventUnregister(u32 fd, u32 event_id) { return ::nvioctlNvhostCtrl_EventUnregister(fd, event_id); } -Result NvhostCtrlGpu_ZCullGetCtxSize(u32 fd, u32 *out) { return ::nvioctlNvhostCtrlGpu_ZCullGetCtxSize(fd, out); } -Result NvhostCtrlGpu_ZCullGetInfo(u32 fd, nvioctl_zcull_info *out) { return ::nvioctlNvhostCtrlGpu_ZCullGetInfo(fd, out); } -Result NvhostCtrlGpu_ZbcSetTable(u32 fd, const u32 color_ds[4], const u32 color_l2[4], u32 depth, u32 format, u32 type) { return ::nvioctlNvhostCtrlGpu_ZbcSetTable(fd, color_ds, color_l2, depth, format, type); } -Result NvhostCtrlGpu_ZbcQueryTable(u32 fd, u32 index, nvioctl_zbc_entry *out) { return ::nvioctlNvhostCtrlGpu_ZbcQueryTable(fd, index, out); } -Result NvhostCtrlGpu_GetCharacteristics(u32 fd, nvioctl_gpu_characteristics *out) { return ::nvioctlNvhostCtrlGpu_GetCharacteristics(fd, out); } -Result NvhostCtrlGpu_GetTpcMasks(u32 fd, void *buffer, size_t size) { return ::nvioctlNvhostCtrlGpu_GetTpcMasks(fd, buffer, size); } -Result NvhostCtrlGpu_ZbcGetActiveSlotMask(u32 fd, nvioctl_zbc_slot_mask *out) { return ::nvioctlNvhostCtrlGpu_ZbcGetActiveSlotMask(fd, out); } -Result NvhostCtrlGpu_GetGpuTime(u32 fd, nvioctl_gpu_time *out) { return ::nvioctlNvhostCtrlGpu_GetGpuTime(fd, out); } -Result NvhostAsGpu_BindChannel(u32 fd, u32 channel_fd) { return ::nvioctlNvhostAsGpu_BindChannel(fd, channel_fd); } -Result NvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align_or_offset, u64 *offset) { return ::nvioctlNvhostAsGpu_AllocSpace(fd, pages, page_size, flags, align_or_offset, offset); } -Result NvhostAsGpu_FreeSpace(u32 fd, u64 offset, u32 pages, u32 page_size) { return ::nvioctlNvhostAsGpu_FreeSpace(fd, offset, pages, page_size); } -Result NvhostAsGpu_MapBufferEx(u32 fd, u32 flags, u32 kind, u32 nvmap_handle, u32 page_size, u64 buffer_offset, u64 mapping_size, u64 input_offset, u64 *offset) { return ::nvioctlNvhostAsGpu_MapBufferEx(fd, flags, kind, nvmap_handle, page_size, buffer_offset, mapping_size, input_offset, offset); } -Result NvhostAsGpu_UnmapBuffer(u32 fd, u64 offset) { return ::nvioctlNvhostAsGpu_UnmapBuffer(fd, offset); } -Result NvhostAsGpu_GetVARegions(u32 fd, nvioctl_va_region regions[2]) { return ::nvioctlNvhostAsGpu_GetVARegions(fd, regions); } -Result NvhostAsGpu_InitializeEx(u32 fd, u32 flags, u32 big_page_size) { return ::nvioctlNvhostAsGpu_InitializeEx(fd, flags, big_page_size); } -Result Nvmap_Create(u32 fd, u32 size, u32 *nvmap_handle) { return ::nvioctlNvmap_Create(fd, size, nvmap_handle); } -Result Nvmap_FromId(u32 fd, u32 id, u32 *nvmap_handle) { return ::nvioctlNvmap_FromId(fd, id, nvmap_handle); } -Result Nvmap_Alloc(u32 fd, u32 nvmap_handle, u32 heapmask, u32 flags, u32 align, u8 kind, void* addr) { return ::nvioctlNvmap_Alloc(fd, nvmap_handle, heapmask, flags, align, kind, addr); } -Result Nvmap_Free(u32 fd, u32 nvmap_handle) { return ::nvioctlNvmap_Free(fd, nvmap_handle); } -Result Nvmap_Param(u32 fd, u32 nvmap_handle, NvMapParam param, u32 *result) { return ::nvioctlNvmap_Param(fd, nvmap_handle, param, result); } -Result Nvmap_GetId(u32 fd, u32 nvmap_handle, u32 *id) { return ::nvioctlNvmap_GetId(fd, nvmap_handle, id); } -Result Channel_SetNvmapFd(u32 fd, u32 nvmap_fd) { return ::nvioctlChannel_SetNvmapFd(fd, nvmap_fd); } -Result Channel_SubmitGpfifo(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout) { return ::nvioctlChannel_SubmitGpfifo(fd, entries, num_entries, flags, fence_inout); } -Result Channel_KickoffPb(u32 fd, nvioctl_gpfifo_entry *entries, u32 num_entries, u32 flags, nvioctl_fence *fence_inout) { return ::nvioctlChannel_KickoffPb(fd, entries, num_entries, flags, fence_inout); } -Result Channel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out) { return ::nvioctlChannel_AllocObjCtx(fd, class_num, flags, id_out); } -Result Channel_ZCullBind(u32 fd, u64 gpu_va, u32 mode) { return ::nvioctlChannel_ZCullBind(fd, gpu_va, mode); } -Result Channel_SetErrorNotifier(u32 fd, u32 enable) { return ::nvioctlChannel_SetErrorNotifier(fd, enable); } -Result Channel_GetErrorInfo(u32 fd, NvError* out) { return ::nvioctlChannel_GetErrorInfo(fd, out); } -Result Channel_GetErrorNotification(u32 fd, NvNotification* out) { return ::nvioctlChannel_GetErrorNotification(fd, out); } -Result Channel_SetPriority(u32 fd, u32 priority) { return ::nvioctlChannel_SetPriority(fd, priority); } -Result Channel_SetTimeout(u32 fd, u32 timeout) { return ::nvioctlChannel_SetTimeout(fd, timeout); } -Result Channel_AllocGpfifoEx2(u32 fd, u32 num_entries, u32 flags, u32 unk0, u32 unk1, u32 unk2, u32 unk3, nvioctl_fence *fence_out) { return ::nvioctlChannel_AllocGpfifoEx2(fd, num_entries, flags, unk0, unk1, unk2, unk3, fence_out); } -Result Channel_SetUserData(u32 fd, void* addr) { return ::nvioctlChannel_SetUserData(fd, addr); } -Result Channel_Submit(u32 fd, const nvioctl_cmdbuf *cmdbufs, u32 num_cmdbufs, const nvioctl_reloc *relocs, const nvioctl_reloc_shift *reloc_shifts, u32 num_relocs, const nvioctl_syncpt_incr *syncpt_incrs, u32 num_syncpt_incrs, nvioctl_fence *fences, u32 num_fences) { return ::nvioctlChannel_Submit(fd, cmdbufs, num_cmdbufs, relocs, reloc_shifts, num_relocs, syncpt_incrs, num_syncpt_incrs, fences, num_fences); } -Result Channel_GetSyncpt(u32 fd, u32 module_id, u32 *syncpt) { return ::nvioctlChannel_GetSyncpt(fd, module_id, syncpt); } -Result Channel_GetModuleClockRate(u32 fd, u32 module_id, u32 *freq) { return ::nvioctlChannel_GetModuleClockRate(fd, module_id, freq); } -Result Channel_SetModuleClockRate(u32 fd, u32 module_id, u32 freq) { return ::nvioctlChannel_SetModuleClockRate(fd, module_id, freq); } -Result Channel_MapCommandBuffer(u32 fd, nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed) { return ::nvioctlChannel_MapCommandBuffer(fd, maps, num_maps, compressed); } -Result Channel_UnmapCommandBuffer(u32 fd, const nvioctl_command_buffer_map *maps, u32 num_maps, bool compressed) { return ::nvioctlChannel_UnmapCommandBuffer(fd, maps, num_maps, compressed); } -Result Channel_SetSubmitTimeout(u32 fd, u32 timeout) { return ::nvioctlChannel_SetSubmitTimeout(fd, timeout); } - -} // namespace nvioctl - -namespace nwindow { - -bool IsValid(NWindow* nw) { return ::nwindowIsValid(nw); } -NWindow* GetDefault(void) { return ::nwindowGetDefault(); } -Result Create(NWindow* nw, Service* binder_session, s32 binder_id, bool producer_controlled_by_app) { return ::nwindowCreate(nw, binder_session, binder_id, producer_controlled_by_app); } -Result CreateFromLayer(NWindow* nw, const ViLayer* layer) { return ::nwindowCreateFromLayer(nw, layer); } -void Close(NWindow* nw) { ::nwindowClose(nw); } -Result GetDimensions(NWindow* nw, u32* out_width, u32* out_height) { return ::nwindowGetDimensions(nw, out_width, out_height); } -Result SetDimensions(NWindow* nw, u32 width, u32 height) { return ::nwindowSetDimensions(nw, width, height); } -Result SetCrop(NWindow* nw, s32 left, s32 top, s32 right, s32 bottom) { return ::nwindowSetCrop(nw, left, top, right, bottom); } -Result SetTransform(NWindow* nw, u32 transform) { return ::nwindowSetTransform(nw, transform); } -Result SetSwapInterval(NWindow* nw, u32 swap_interval) { return ::nwindowSetSwapInterval(nw, swap_interval); } -bool IsConsumerRunningBehind(NWindow* nw) { return ::nwindowIsConsumerRunningBehind(nw); } -Result ConfigureBuffer(NWindow* nw, s32 slot, NvGraphicBuffer* buf) { return ::nwindowConfigureBuffer(nw, slot, buf); } -Result DequeueBuffer(NWindow* nw, s32* out_slot, NvMultiFence* out_fence) { return ::nwindowDequeueBuffer(nw, out_slot, out_fence); } -Result CancelBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence) { return ::nwindowCancelBuffer(nw, slot, fence); } -Result QueueBuffer(NWindow* nw, s32 slot, const NvMultiFence* fence) { return ::nwindowQueueBuffer(nw, slot, fence); } -Result ReleaseBuffers(NWindow* nw) { return ::nwindowReleaseBuffers(nw); } - -} // namespace nwindow - -namespace nxlink { - -int ConnectToHost(bool redirStdout, bool redirStderr) { return ::nxlinkConnectToHost(redirStdout, redirStderr); } -int Stdio(void) { return ::nxlinkStdio(); } -int StdioForDebug(void) { return ::nxlinkStdioForDebug(); } - -} // namespace nxlink - -namespace omm { - -Result Initialize(void) { return ::ommInitialize(); } -void Exit(void) { ::ommExit(); } -Service* GetServiceSession(void) { return ::ommGetServiceSession(); } -Result GetDefaultDisplayResolution(s32* width, s32* height) { return ::ommGetDefaultDisplayResolution(width, height); } -Result GetOperationMode(OmmOperationMode* s) { return ::ommGetOperationMode(s); } -Result SetOperationModePolicy(OmmOperationModePolicy value) { return ::ommSetOperationModePolicy(value); } - -} // namespace omm - -namespace ovlnrcv { - -Result Initialize(void) { return ::ovlnrcvInitialize(); } -void Exit(void) { ::ovlnrcvExit(); } -Service* GetServiceSession(void) { return ::ovlnrcvGetServiceSession(); } -Result OpenReceiver(OvlnReceiver *r) { return ::ovlnrcvOpenReceiver(r); } -void CloseReceiver(OvlnReceiver *r) { ::ovlnrcvCloseReceiver(r); } -Result AddSource(OvlnReceiver *r, const OvlnSourceName *name) { return ::ovlnrcvAddSource(r, name); } -Result RemoveSource(OvlnReceiver *r, const OvlnSourceName *name) { return ::ovlnrcvRemoveSource(r, name); } -Result GetReceiveEventHandle(OvlnReceiver *r, Event* out_event) { return ::ovlnrcvGetReceiveEventHandle(r, out_event); } -Result Receive(OvlnReceiver *r, OvlnRawMessage *message) { return ::ovlnrcvReceive(r, message); } -Result ReceiveWithTick(OvlnReceiver *r, OvlnRawMessage *message, s64 *tick) { return ::ovlnrcvReceiveWithTick(r, message, tick); } - -} // namespace ovlnrcv - -namespace ovlnsnd { - -Result Initialize(void) { return ::ovlnsndInitialize(); } -void Exit(void) { ::ovlnsndExit(); } -Service* GetServiceSession(void) { return ::ovlnsndGetServiceSession(); } -Result OpenSender(OvlnSender *s, const OvlnSourceName *name, OvlnQueueAttribute attribute) { return ::ovlnsndOpenSender(s, name, attribute); } -void CloseSender(OvlnSender *s) { ::ovlnsndCloseSender(s); } -Result Send(OvlnSender *s, OvlnSendOption option, const OvlnRawMessage *message) { return ::ovlnsndSend(s, option, message); } -Result GetUnreceivedMessageCount(OvlnSender *s, u32 *count) { return ::ovlnsndGetUnreceivedMessageCount(s, count); } - -} // namespace ovlnsnd - -namespace pad { - -void ConfigureInput(u32 max_players, u32 style_set) { ::padConfigureInput(max_players, style_set); } -void InitializeWithMask(PadState* pad, u64 mask) { ::padInitializeWithMask(pad, mask); } -void InitializeAny(PadState* pad) { ::padInitializeAny(pad); } -void InitializeDefault(PadState* pad) { ::padInitializeDefault(pad); } -void Update(PadState* pad) { ::padUpdate(pad); } -bool IsHandheld(const PadState* pad) { return ::padIsHandheld(pad); } -bool IsNpadActive(const PadState* pad, HidNpadIdType id) { return ::padIsNpadActive(pad, id); } -u32 GetStyleSet(const PadState* pad) { return ::padGetStyleSet(pad); } -u32 GetAttributes(const PadState* pad) { return ::padGetAttributes(pad); } -bool IsConnected(const PadState* pad) { return ::padIsConnected(pad); } -u64 GetButtons(const PadState* pad) { return ::padGetButtons(pad); } -u64 GetButtonsDown(const PadState* pad) { return ::padGetButtonsDown(pad); } -u64 GetButtonsUp(const PadState* pad) { return ::padGetButtonsUp(pad); } -HidAnalogStickState GetStickPos(const PadState* pad, unsigned i) { return ::padGetStickPos(pad, i); } -u32 GetGcTriggerPos(const PadState* pad, unsigned i) { return ::padGetGcTriggerPos(pad, i); } -void RepeaterInitialize(PadRepeater* r, u16 delay, u16 repeat) { ::padRepeaterInitialize(r, delay, repeat); } -void RepeaterUpdate(PadRepeater* r, u64 button_mask) { ::padRepeaterUpdate(r, button_mask); } -u64 RepeaterGetButtons(const PadRepeater* r) { return ::padRepeaterGetButtons(r); } - -} // namespace pad - -namespace parcel { - -void Create(Parcel *ctx) { ::parcelCreate(ctx); } -Result Transact(Binder *session, u32 code, Parcel *in_parcel, Parcel *reply_parcel) { return ::parcelTransact(session, code, in_parcel, reply_parcel); } -void* WriteData(Parcel *ctx, const void* data, size_t data_size) { return ::parcelWriteData(ctx, data, data_size); } -void* ReadData(Parcel *ctx, void* data, size_t data_size) { return ::parcelReadData(ctx, data, data_size); } -void WriteInt32(Parcel *ctx, s32 val) { ::parcelWriteInt32(ctx, val); } -void WriteUInt32(Parcel *ctx, u32 val) { ::parcelWriteUInt32(ctx, val); } -void WriteString16(Parcel *ctx, const char *str) { ::parcelWriteString16(ctx, str); } -s32 ReadInt32(Parcel *ctx) { return ::parcelReadInt32(ctx); } -u32 ReadUInt32(Parcel *ctx) { return ::parcelReadUInt32(ctx); } -void WriteInterfaceToken(Parcel *ctx, const char *str) { ::parcelWriteInterfaceToken(ctx, str); } -void* ReadFlattenedObject(Parcel *ctx, size_t *size) { return ::parcelReadFlattenedObject(ctx, size); } -void* WriteFlattenedObject(Parcel *ctx, const void* data, size_t size) { return ::parcelWriteFlattenedObject(ctx, data, size); } - -} // namespace parcel - -namespace pctl { - -Result Initialize(void) { return ::pctlInitialize(); } -void Exit(void) { ::pctlExit(); } -Service* GetServiceSession(void) { return ::pctlGetServiceSession(); } -Service* GetServiceSession_Service(void) { return ::pctlGetServiceSession_Service(); } -Result IsRestrictionTemporaryUnlocked(bool *flag) { return ::pctlIsRestrictionTemporaryUnlocked(flag); } -Result ConfirmStereoVisionPermission(void) { return ::pctlConfirmStereoVisionPermission(); } -Result IsRestrictionEnabled(bool *flag) { return ::pctlIsRestrictionEnabled(flag); } -Result GetSafetyLevel(u32 *safety_level) { return ::pctlGetSafetyLevel(safety_level); } -Result GetCurrentSettings(PctlRestrictionSettings *settings) { return ::pctlGetCurrentSettings(settings); } -Result GetFreeCommunicationApplicationListCount(u32 *count) { return ::pctlGetFreeCommunicationApplicationListCount(count); } -Result ResetConfirmedStereoVisionPermission(void) { return ::pctlResetConfirmedStereoVisionPermission(); } -Result IsStereoVisionPermitted(bool *flag) { return ::pctlIsStereoVisionPermitted(flag); } -Result IsPairingActive(bool *flag) { return ::pctlIsPairingActive(flag); } -Result GetSynchronizationEvent(Event* out_event) { return ::pctlGetSynchronizationEvent(out_event); } -Result GetPlayTimerEventToRequestSuspension(Event* out_event) { return ::pctlGetPlayTimerEventToRequestSuspension(out_event); } -Result IsPlayTimerAlarmDisabled(bool *flag) { return ::pctlIsPlayTimerAlarmDisabled(flag); } -Result GetUnlinkedEvent(Event* out_event) { return ::pctlGetUnlinkedEvent(out_event); } - -} // namespace pctl - -namespace pctlauth { - -Result Show(bool flag) { return ::pctlauthShow(flag); } -Result ShowEx(u8 arg0, u8 arg1, u8 arg2) { return ::pctlauthShowEx(arg0, arg1, arg2); } -Result ShowForConfiguration(void) { return ::pctlauthShowForConfiguration(); } -Result RegisterPasscode(void) { return ::pctlauthRegisterPasscode(); } -Result ChangePasscode(void) { return ::pctlauthChangePasscode(); } - -} // namespace pctlauth - -namespace pcv { - -Result Initialize(void) { return ::pcvInitialize(); } -void Exit(void) { ::pcvExit(); } -Service* GetServiceSession(void) { return ::pcvGetServiceSession(); } -Result GetModuleId(PcvModuleId *module_id, PcvModule module) { return ::pcvGetModuleId(module_id, module); } -Result GetClockRate(PcvModule module, u32 *out_hz) { return ::pcvGetClockRate(module, out_hz); } -Result SetClockRate(PcvModule module, u32 hz) { return ::pcvSetClockRate(module, hz); } -Result SetVoltageEnabled(u32 power_domain, bool state) { return ::pcvSetVoltageEnabled(power_domain, state); } -Result GetVoltageEnabled(bool *isEnabled, u32 power_domain) { return ::pcvGetVoltageEnabled(isEnabled, power_domain); } -Result GetPossibleClockRates(PcvModule module, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count) { return ::pcvGetPossibleClockRates(module, rates, max_count, out_type, out_count); } - -} // namespace pcv - -namespace pdm { - -u64 PlayTimestampToPosix(u32 timestamp) { return ::pdmPlayTimestampToPosix(timestamp); } - -} // namespace pdm - -namespace pdmqry { - -Result Initialize(void) { return ::pdmqryInitialize(); } -void Exit(void) { ::pdmqryExit(); } -Service* GetServiceSession(void) { return ::pdmqryGetServiceSession(); } -Result QueryAppletEvent(s32 entry_index, bool flag, PdmAppletEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryAppletEvent(entry_index, flag, events, count, total_out); } -Result QueryPlayStatisticsByApplicationId(u64 application_id, bool flag, PdmPlayStatistics *stats) { return ::pdmqryQueryPlayStatisticsByApplicationId(application_id, flag, stats); } -Result QueryPlayStatisticsByApplicationIdAndUserAccountId(u64 application_id, AccountUid uid, bool flag, PdmPlayStatistics *stats) { return ::pdmqryQueryPlayStatisticsByApplicationIdAndUserAccountId(application_id, uid, flag, stats); } -Result QueryLastPlayTime(bool flag, PdmLastPlayTime *playtimes, const u64 *application_ids, s32 count, s32 *total_out) { return ::pdmqryQueryLastPlayTime(flag, playtimes, application_ids, count, total_out); } -Result QueryPlayEvent(s32 entry_index, PdmPlayEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryPlayEvent(entry_index, events, count, total_out); } -Result GetAvailablePlayEventRange(s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index) { return ::pdmqryGetAvailablePlayEventRange(total_entries, start_entry_index, end_entry_index); } -Result QueryAccountEvent(s32 entry_index, PdmAccountEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryAccountEvent(entry_index, events, count, total_out); } -Result QueryAccountPlayEvent(s32 entry_index, AccountUid uid, PdmAccountPlayEvent *events, s32 count, s32 *total_out) { return ::pdmqryQueryAccountPlayEvent(entry_index, uid, events, count, total_out); } -Result GetAvailableAccountPlayEventRange(AccountUid uid, s32 *total_entries, s32 *start_entry_index, s32 *end_entry_index) { return ::pdmqryGetAvailableAccountPlayEventRange(uid, total_entries, start_entry_index, end_entry_index); } -Result QueryRecentlyPlayedApplication(AccountUid uid, bool flag, u64 *application_ids, s32 count, s32 *total_out) { return ::pdmqryQueryRecentlyPlayedApplication(uid, flag, application_ids, count, total_out); } -Result GetRecentlyPlayedApplicationUpdateEvent(Event* out_event) { return ::pdmqryGetRecentlyPlayedApplicationUpdateEvent(out_event); } - -} // namespace pdmqry - -namespace pgl { - -Result Initialize(void) { return ::pglInitialize(); } -void Exit(void) { ::pglExit(); } -Service* GetServiceSessionCmif(void) { return ::pglGetServiceSessionCmif(); } -TipcService* GetServiceSessionTipc(void) { return ::pglGetServiceSessionTipc(); } -Result LaunchProgram(u64 *out_pid, const NcmProgramLocation *loc, u32 pm_launch_flags, u8 pgl_launch_flags) { return ::pglLaunchProgram(out_pid, loc, pm_launch_flags, pgl_launch_flags); } -Result TerminateProcess(u64 pid) { return ::pglTerminateProcess(pid); } -Result LaunchProgramFromHost(u64 *out_pid, const char *content_path, u32 pm_launch_flags) { return ::pglLaunchProgramFromHost(out_pid, content_path, pm_launch_flags); } -Result GetHostProgramLaunchProperty(PglProgramLaunchProperty *out, const char *content_path) { return ::pglGetHostProgramLaunchProperty(out, content_path); } -Result GetRunningApplicationProcessId(u64 *out_pid) { return ::pglGetRunningApplicationProcessId(out_pid); } -Result BoostSystemMemoryResourceLimit(u64 size) { return ::pglBoostSystemMemoryResourceLimit(size); } -Result IsRunningProcess(bool *out, u64 pid) { return ::pglIsRunningProcess(out, pid); } -Result EnableApplicationCrashReport(bool en) { return ::pglEnableApplicationCrashReport(en); } -Result IsApplicationCrashReportEnabled(bool *out) { return ::pglIsApplicationCrashReportEnabled(out); } -Result EnableApplicationAllThreadDumpOnCrash(bool en) { return ::pglEnableApplicationAllThreadDumpOnCrash(en); } -Result GetProcessId(u64 *out_pid, u64 program_id) { return ::pglGetProcessId(out_pid, program_id); } -Result TriggerSnapShotDumper(PglSnapShotDumpType dump_type, const char *arg) { return ::pglTriggerSnapShotDumper(dump_type, arg); } -Result CreateShellEvent(PglEventObserver *out) { return ::pglCreateShellEvent(out); } -Result EnableApplicationCrashReport2(u64 pid, bool en) { return ::pglEnableApplicationCrashReport2(pid, en); } -Result EventObserverGetShellEvent(PglEventObserver *observer, Event *out) { return ::pglEventObserverGetShellEvent(observer, out); } -Result EventObserverGetShellEventInfo(PglEventObserver *observer, PmProcessEventInfo *out) { return ::pglEventObserverGetShellEventInfo(observer, out); } -void EventObserverClose(PglEventObserver *observer) { ::pglEventObserverClose(observer); } - -} // namespace pgl - -namespace pl { - -Result Initialize(PlServiceType service_type) { return ::plInitialize(service_type); } -void Exit(void) { ::plExit(); } -Service* GetServiceSession(void) { return ::plGetServiceSession(); } -void* GetSharedmemAddr(void) { return ::plGetSharedmemAddr(); } -Result GetSharedFontByType(PlFontData* font, PlSharedFontType SharedFontType) { return ::plGetSharedFontByType(font, SharedFontType); } -Result GetSharedFont(u64 LanguageCode, PlFontData* fonts, s32 max_fonts, s32* total_fonts) { return ::plGetSharedFont(LanguageCode, fonts, max_fonts, total_fonts); } - -} // namespace pl - -namespace pmbm { - -Result Initialize(void) { return ::pmbmInitialize(); } -void Exit(void) { ::pmbmExit(); } -Service* GetServiceSession(void) { return ::pmbmGetServiceSession(); } -Result GetBootMode(PmBootMode *out) { return ::pmbmGetBootMode(out); } -Result SetMaintenanceBoot(void) { return ::pmbmSetMaintenanceBoot(); } - -} // namespace pmbm - -namespace pmdmnt { - -Result Initialize(void) { return ::pmdmntInitialize(); } -void Exit(void) { ::pmdmntExit(); } -Service* GetServiceSession(void) { return ::pmdmntGetServiceSession(); } -Result GetJitDebugProcessIdList(u32* out_count, u64* out_pids, size_t max_pids) { return ::pmdmntGetJitDebugProcessIdList(out_count, out_pids, max_pids); } -Result StartProcess(u64 pid) { return ::pmdmntStartProcess(pid); } -Result GetProcessId(u64* pid_out, u64 program_id) { return ::pmdmntGetProcessId(pid_out, program_id); } -Result HookToCreateProcess(Event* out, u64 program_id) { return ::pmdmntHookToCreateProcess(out, program_id); } -Result GetApplicationProcessId(u64* pid_out) { return ::pmdmntGetApplicationProcessId(pid_out); } -Result HookToCreateApplicationProcess(Event* out) { return ::pmdmntHookToCreateApplicationProcess(out); } -Result ClearHook(u32 which) { return ::pmdmntClearHook(which); } -Result GetProgramId(u64* program_id_out, u64 pid) { return ::pmdmntGetProgramId(program_id_out, pid); } - -} // namespace pmdmnt - -namespace pminfo { - -Result Initialize(void) { return ::pminfoInitialize(); } -void Exit(void) { ::pminfoExit(); } -Service* GetServiceSession(void) { return ::pminfoGetServiceSession(); } -Result GetProgramId(u64* program_id_out, u64 pid) { return ::pminfoGetProgramId(program_id_out, pid); } -Result GetAppletCurrentResourceLimitValues(PmResourceLimitValues* out) { return ::pminfoGetAppletCurrentResourceLimitValues(out); } -Result GetAppletPeakResourceLimitValues(PmResourceLimitValues* out) { return ::pminfoGetAppletPeakResourceLimitValues(out); } - -} // namespace pminfo - -namespace pmshell { - -Result Initialize(void) { return ::pmshellInitialize(); } -void Exit(void) { ::pmshellExit(); } -Service* GetServiceSession(void) { return ::pmshellGetServiceSession(); } -Result LaunchProgram(u32 launch_flags, const NcmProgramLocation *location, u64 *pid) { return ::pmshellLaunchProgram(launch_flags, location, pid); } -Result TerminateProcess(u64 processID) { return ::pmshellTerminateProcess(processID); } -Result TerminateProgram(u64 program_id) { return ::pmshellTerminateProgram(program_id); } -Result GetProcessEventHandle(Event* out) { return ::pmshellGetProcessEventHandle(out); } -Result GetProcessEventInfo(PmProcessEventInfo* out) { return ::pmshellGetProcessEventInfo(out); } -Result CleanupProcess(u64 pid) { return ::pmshellCleanupProcess(pid); } -Result ClearJitDebugOccured(u64 pid) { return ::pmshellClearJitDebugOccured(pid); } -Result NotifyBootFinished(void) { return ::pmshellNotifyBootFinished(); } -Result GetApplicationProcessIdForShell(u64* pid_out) { return ::pmshellGetApplicationProcessIdForShell(pid_out); } -Result BoostSystemMemoryResourceLimit(u64 boost_size) { return ::pmshellBoostSystemMemoryResourceLimit(boost_size); } -Result BoostApplicationThreadResourceLimit(void) { return ::pmshellBoostApplicationThreadResourceLimit(); } -Result BoostSystemThreadResourceLimit(void) { return ::pmshellBoostSystemThreadResourceLimit(); } -Result GetProcessId(u64* pid_out, u64 program_id) { return ::pmshellGetProcessId(pid_out, program_id); } - -} // namespace pmshell - -namespace psc { - -Result PmModuleGetRequest(PscPmModule *module, PscPmState *out_state, u32 *out_flags) { return ::pscPmModuleGetRequest(module, out_state, out_flags); } -Result PmModuleAcknowledge(PscPmModule *module, PscPmState state) { return ::pscPmModuleAcknowledge(module, state); } -Result PmModuleFinalize(PscPmModule *module) { return ::pscPmModuleFinalize(module); } -void PmModuleClose(PscPmModule *module) { ::pscPmModuleClose(module); } - -} // namespace psc - -namespace pscm { - -Result Initialize(void) { return ::pscmInitialize(); } -void Exit(void) { ::pscmExit(); } -Service* GetServiceSession(void) { return ::pscmGetServiceSession(); } -Result GetPmModule(PscPmModule *out, PscPmModuleId module_id, const u32 *dependencies, size_t dependency_count, bool autoclear) { return ::pscmGetPmModule(out, module_id, dependencies, dependency_count, autoclear); } - -} // namespace pscm - -namespace psel { - -Result UiCreate(PselUiSettings *ui, PselUiMode mode) { return ::pselUiCreate(ui, mode); } -void UiAddUser(PselUiSettings *ui, AccountUid user_id) { ::pselUiAddUser(ui, user_id); } -void UiSetAllowUserCreation(PselUiSettings *ui, bool flag) { ::pselUiSetAllowUserCreation(ui, flag); } -void UiSetNetworkServiceRequired(PselUiSettings *ui, bool flag) { ::pselUiSetNetworkServiceRequired(ui, flag); } -void UiSetSkipButtonEnabled(PselUiSettings *ui, bool flag) { ::pselUiSetSkipButtonEnabled(ui, flag); } -Result UiShow(PselUiSettings *ui, AccountUid *out_user) { return ::pselUiShow(ui, out_user); } -Result ShowUserSelectorForSystem(AccountUid *out_user, const PselUserSelectionSettings *settings, const PselUserSelectionSettingsForSystemService *settings_system) { return ::pselShowUserSelectorForSystem(out_user, settings, settings_system); } -Result ShowUserSelectorForLauncher(AccountUid *out_user, const PselUserSelectionSettings *settings, u64 application_id) { return ::pselShowUserSelectorForLauncher(out_user, settings, application_id); } -Result ShowUserSelector(AccountUid *out_user, const PselUserSelectionSettings *settings) { return ::pselShowUserSelector(out_user, settings); } -Result ShowUserCreator(void) { return ::pselShowUserCreator(); } -Result ShowUserIconEditor(AccountUid user) { return ::pselShowUserIconEditor(user); } -Result ShowUserNicknameEditor(AccountUid user) { return ::pselShowUserNicknameEditor(user); } -Result ShowUserCreatorForStarter(void) { return ::pselShowUserCreatorForStarter(); } -Result ShowNintendoAccountNnidLinker(AccountUid user) { return ::pselShowNintendoAccountNnidLinker(user); } -Result ShowUserQualificationPromoter(AccountUid user) { return ::pselShowUserQualificationPromoter(user); } - -} // namespace psel - -namespace psm { - -Result Initialize(void) { return ::psmInitialize(); } -void Exit(void) { ::psmExit(); } -Service* GetServiceSession(void) { return ::psmGetServiceSession(); } -Result GetBatteryChargePercentage(u32 *out) { return ::psmGetBatteryChargePercentage(out); } -Result GetChargerType(PsmChargerType *out) { return ::psmGetChargerType(out); } -Result EnableBatteryCharging(void) { return ::psmEnableBatteryCharging(); } -Result DisableBatteryCharging(void) { return ::psmDisableBatteryCharging(); } -Result IsBatteryChargingEnabled(bool *out) { return ::psmIsBatteryChargingEnabled(out); } -Result AcquireControllerPowerSupply(void) { return ::psmAcquireControllerPowerSupply(); } -Result ReleaseControllerPowerSupply(void) { return ::psmReleaseControllerPowerSupply(); } -Result EnableEnoughPowerChargeEmulation(void) { return ::psmEnableEnoughPowerChargeEmulation(); } -Result DisableEnoughPowerChargeEmulation(void) { return ::psmDisableEnoughPowerChargeEmulation(); } -Result EnableFastBatteryCharging(void) { return ::psmEnableFastBatteryCharging(); } -Result DisableFastBatteryCharging(void) { return ::psmDisableFastBatteryCharging(); } -Result GetBatteryVoltageState(PsmBatteryVoltageState *out) { return ::psmGetBatteryVoltageState(out); } -Result GetRawBatteryChargePercentage(double *out) { return ::psmGetRawBatteryChargePercentage(out); } -Result IsEnoughPowerSupplied(bool *out) { return ::psmIsEnoughPowerSupplied(out); } -Result GetBatteryAgePercentage(double *out) { return ::psmGetBatteryAgePercentage(out); } -Result GetBatteryChargeInfoEvent(Event* out_event, bool autoclear) { return ::psmGetBatteryChargeInfoEvent(out_event, autoclear); } -Result GetBatteryChargeInfoFields(PsmBatteryChargeInfoFields *out_fields) { return ::psmGetBatteryChargeInfoFields(out_fields); } -Result GetBatteryChargeCalibratedEvent(Event* out_event, bool autoclear) { return ::psmGetBatteryChargeCalibratedEvent(out_event, autoclear); } -Result BindStateChangeEvent(PsmSession* s, bool ChargerType, bool PowerSupply, bool BatteryVoltage) { return ::psmBindStateChangeEvent(s, ChargerType, PowerSupply, BatteryVoltage); } -Result WaitStateChangeEvent(PsmSession* s, u64 timeout) { return ::psmWaitStateChangeEvent(s, timeout); } -Result UnbindStateChangeEvent(PsmSession* s) { return ::psmUnbindStateChangeEvent(s); } - -} // namespace psm - -namespace random { - -void Get(void* buf, size_t len) { ::randomGet(buf, len); } -u64 Get64(void) { return ::randomGet64(); } - -} // namespace random - -namespace resolver { - -Result GetLastResult(void) { return ::resolverGetLastResult(); } -u32 GetCancelHandle(void) { return ::resolverGetCancelHandle(); } -bool GetEnableServiceDiscovery(void) { return ::resolverGetEnableServiceDiscovery(); } -bool GetEnableDnsCache(void) { return ::resolverGetEnableDnsCache(); } -void SetEnableServiceDiscovery(bool enable) { ::resolverSetEnableServiceDiscovery(enable); } -void SetEnableDnsCache(bool enable) { ::resolverSetEnableDnsCache(enable); } -Result Cancel(u32 handle) { return ::resolverCancel(handle); } -Result RemoveHostnameFromCache(const char* hostname) { return ::resolverRemoveHostnameFromCache(hostname); } -Result RemoveIpAddressFromCache(u32 ip) { return ::resolverRemoveIpAddressFromCache(ip); } - -} // namespace resolver - -namespace ringcon { - -Result Create(RingCon *c, HidNpadIdType id) { return ::ringconCreate(c, id); } -void Close(RingCon *c) { ::ringconClose(c); } -u32 GetErrorFlags(RingCon *c) { return ::ringconGetErrorFlags(c); } -bool GetErrorFlag(RingCon *c, RingConErrorFlag flag) { return ::ringconGetErrorFlag(c, flag); } -RingConFwVersion GetFwVersion(RingCon *c) { return ::ringconGetFwVersion(c); } -void GetId(RingCon *c, u64 *id_l, u64 *id_h) { ::ringconGetId(c, id_l, id_h); } -s16 GetUnkCal(RingCon *c) { return ::ringconGetUnkCal(c); } -s32 GetTotalPushCount(RingCon *c) { return ::ringconGetTotalPushCount(c); } -void GetManuCal(RingCon *c, RingConManuCal *out) { ::ringconGetManuCal(c, out); } -void GetUserCal(RingCon *c, RingConUserCal *out) { ::ringconGetUserCal(c, out); } -Result UpdateUserCal(RingCon *c, RingConUserCal cal) { return ::ringconUpdateUserCal(c, cal); } -Result ReadFwVersion(RingCon *c, RingConFwVersion *out) { return ::ringconReadFwVersion(c, out); } -Result ReadId(RingCon *c, u64 *id_l, u64 *id_h) { return ::ringconReadId(c, id_l, id_h); } -Result GetPollingData(RingCon *c, RingConPollingData *out, s32 count, s32 *total_out) { return ::ringconGetPollingData(c, out, count, total_out); } -Result Cmdx00020105(RingCon *c, u32 *out) { return ::ringconCmdx00020105(c, out); } -Result ReadManuCal(RingCon *c, RingConManuCal *out) { return ::ringconReadManuCal(c, out); } -Result ReadUnkCal(RingCon *c, s16 *out) { return ::ringconReadUnkCal(c, out); } -Result ReadUserCal(RingCon *c, RingConUserCal *out) { return ::ringconReadUserCal(c, out); } -Result ReadRepCount(RingCon *c, s32 *out, RingConDataValid *data_valid) { return ::ringconReadRepCount(c, out, data_valid); } -Result ReadTotalPushCount(RingCon *c, s32 *out, RingConDataValid *data_valid) { return ::ringconReadTotalPushCount(c, out, data_valid); } -Result ResetRepCount(RingCon *c) { return ::ringconResetRepCount(c); } -Result WriteUserCal(RingCon *c, RingConUserCal cal) { return ::ringconWriteUserCal(c, cal); } - -} // namespace ringcon - -namespace rmutex { - -void Init(RMutex* m) { ::rmutexInit(m); } -void Lock(RMutex* m) { ::rmutexLock(m); } -bool TryLock(RMutex* m) { return ::rmutexTryLock(m); } -void Unlock(RMutex* m) { ::rmutexUnlock(m); } - -} // namespace rmutex - -namespace ro { - -Result DmntInitialize(void) { return ::roDmntInitialize(); } -void DmntExit(void) { ::roDmntExit(); } -Service* DmntGetServiceSession(void) { return ::roDmntGetServiceSession(); } -Result DmntGetProcessModuleInfo(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, s32 *num_out) { return ::roDmntGetProcessModuleInfo(pid, out_module_infos, max_out_modules, num_out); } - -} // namespace ro - -namespace ro1 { - -Result Initialize(void) { return ::ro1Initialize(); } -void Exit(void) { ::ro1Exit(); } -Service* GetServiceSession(void) { return ::ro1GetServiceSession(); } -Result LoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { return ::ro1LoadNro(out_address, nro_address, nro_size, bss_address, bss_size); } -Result UnloadNro(u64 nro_address) { return ::ro1UnloadNro(nro_address); } -Result LoadNrr(u64 nrr_address, u64 nrr_size) { return ::ro1LoadNrr(nrr_address, nrr_size); } -Result UnloadNrr(u64 nrr_address) { return ::ro1UnloadNrr(nrr_address); } -Result LoadNrrEx(u64 nrr_address, u64 nrr_size) { return ::ro1LoadNrrEx(nrr_address, nrr_size); } - -} // namespace ro1 - -namespace romfs { - -Result MountSelf(const char *name) { return ::romfsMountSelf(name); } -Result MountFromFile(FsFile file, u64 offset, const char *name) { return ::romfsMountFromFile(file, offset, name); } -Result MountFromStorage(FsStorage storage, u64 offset, const char *name) { return ::romfsMountFromStorage(storage, offset, name); } -Result MountFromCurrentProcess(const char *name) { return ::romfsMountFromCurrentProcess(name); } -Result MountDataStorageFromProgram(u64 program_id, const char *name) { return ::romfsMountDataStorageFromProgram(program_id, name); } -Result MountFromFsdev(const char *path, u64 offset, const char *name) { return ::romfsMountFromFsdev(path, offset, name); } -Result MountFromDataArchive(u64 dataId, NcmStorageId storageId, const char *name) { return ::romfsMountFromDataArchive(dataId, storageId, name); } -Result Unmount(const char *name) { return ::romfsUnmount(name); } -Result Init(void) { return ::romfsInit(); } -Result Exit(void) { return ::romfsExit(); } - -} // namespace romfs - -namespace rwlock { - -void Init(RwLock* r) { ::rwlockInit(r); } -void ReadLock(RwLock* r) { ::rwlockReadLock(r); } -bool TryReadLock(RwLock* r) { return ::rwlockTryReadLock(r); } -void ReadUnlock(RwLock* r) { ::rwlockReadUnlock(r); } -void WriteLock(RwLock* r) { ::rwlockWriteLock(r); } -bool TryWriteLock(RwLock* r) { return ::rwlockTryWriteLock(r); } -void WriteUnlock(RwLock* r) { ::rwlockWriteUnlock(r); } -bool IsWriteLockHeldByCurrentThread(RwLock* r) { return ::rwlockIsWriteLockHeldByCurrentThread(r); } -bool IsOwnedByCurrentThread(RwLock* r) { return ::rwlockIsOwnedByCurrentThread(r); } - -} // namespace rwlock - -namespace semaphore { - -void Init(Semaphore *s, u64 initial_count) { ::semaphoreInit(s, initial_count); } -void Signal(Semaphore *s) { ::semaphoreSignal(s); } -void Wait(Semaphore *s) { ::semaphoreWait(s); } -bool TryWait(Semaphore *s) { return ::semaphoreTryWait(s); } - -} // namespace semaphore - -namespace service { - -bool IsActive(Service* s) { return ::serviceIsActive(s); } -bool IsOverride(Service* s) { return ::serviceIsOverride(s); } -bool IsDomain(Service* s) { return ::serviceIsDomain(s); } -bool IsDomainSubservice(Service* s) { return ::serviceIsDomainSubservice(s); } -u32 GetObjectId(Service* s) { return ::serviceGetObjectId(s); } -void Create(Service* s, Handle h) { ::serviceCreate(s, h); } -void CreateNonDomainSubservice(Service* s, Service* parent, Handle h) { ::serviceCreateNonDomainSubservice(s, parent, h); } -void CreateDomainSubservice(Service* s, Service* parent, u32 object_id) { ::serviceCreateDomainSubservice(s, parent, object_id); } -void Close(Service* s) { ::serviceClose(s); } -Result Clone(Service* s, Service* out_s) { return ::serviceClone(s, out_s); } -Result CloneEx(Service* s, u32 tag, Service* out_s) { return ::serviceCloneEx(s, tag, out_s); } -Result ConvertToDomain(Service* s) { return ::serviceConvertToDomain(s); } -void RequestFormatProcessBuffer(CmifRequestFormat* fmt, u32 attr) { ::_serviceRequestFormatProcessBuffer(fmt, attr); } -void RequestProcessBuffer(CmifRequest* req, const SfBuffer* buf, u32 attr) { ::_serviceRequestProcessBuffer(req, buf, attr); } -void* MakeRequest(Service* s, u32 request_id, u32 context, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_objects, const Service* const* objects, u32 num_handles, const Handle* handles) { return ::serviceMakeRequest(s, request_id, context, data_size, send_pid, buffer_attrs, buffers, num_objects, objects, num_handles, handles); } -void ResponseGetHandle(CmifResponse* res, SfOutHandleAttr type, Handle* out) { ::_serviceResponseGetHandle(res, type, out); } -Result ParseResponse(Service* s, u32 out_size, void** out_data, u32 num_out_objects, Service* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles) { return ::serviceParseResponse(s, out_size, out_data, num_out_objects, out_objects, out_handle_attrs, out_handles); } -Result DispatchImpl(Service* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, SfDispatchParams disp) { return ::serviceDispatchImpl(s, request_id, in_data, in_data_size, out_data, out_data_size, disp); } - -} // namespace service - -namespace sessionmgr { - -Result Create(SessionMgr* mgr, Handle root_session, u32 num_sessions) { return ::sessionmgrCreate(mgr, root_session, num_sessions); } -void Close(SessionMgr* mgr) { ::sessionmgrClose(mgr); } -int AttachClient(SessionMgr* mgr) { return ::sessionmgrAttachClient(mgr); } -void DetachClient(SessionMgr* mgr, int slot) { ::sessionmgrDetachClient(mgr, slot); } -Handle GetClientSession(SessionMgr* mgr, int slot) { return ::sessionmgrGetClientSession(mgr, slot); } - -} // namespace sessionmgr - -namespace set { - -Result Initialize(void) { return ::setInitialize(); } -void Exit(void) { ::setExit(); } -Service* GetServiceSession(void) { return ::setGetServiceSession(); } -Result MakeLanguage(u64 LanguageCode, SetLanguage *Language) { return ::setMakeLanguage(LanguageCode, Language); } -Result MakeLanguageCode(SetLanguage Language, u64 *LanguageCode) { return ::setMakeLanguageCode(Language, LanguageCode); } -Result GetSystemLanguage(u64 *LanguageCode) { return ::setGetSystemLanguage(LanguageCode); } -Result GetLanguageCode(u64 *LanguageCode) { return ::setGetLanguageCode(LanguageCode); } -Result GetAvailableLanguageCodes(s32 *total_entries, u64 *LanguageCodes, size_t max_entries) { return ::setGetAvailableLanguageCodes(total_entries, LanguageCodes, max_entries); } -Result GetAvailableLanguageCodeCount(s32 *total) { return ::setGetAvailableLanguageCodeCount(total); } -Result GetRegionCode(SetRegion *out) { return ::setGetRegionCode(out); } -Result GetQuestFlag(bool *out) { return ::setGetQuestFlag(out); } -Result GetDeviceNickname(SetSysDeviceNickName *nickname) { return ::setGetDeviceNickname(nickname); } - -} // namespace set - -namespace setcal { - -Result Initialize(void) { return ::setcalInitialize(); } -void Exit(void) { ::setcalExit(); } -Service* GetServiceSession(void) { return ::setcalGetServiceSession(); } -Result GetBdAddress(SetCalBdAddress *out) { return ::setcalGetBdAddress(out); } -Result GetConfigurationId1(SetCalConfigurationId1 *out) { return ::setcalGetConfigurationId1(out); } -Result GetAccelerometerOffset(SetCalAccelerometerOffset *out) { return ::setcalGetAccelerometerOffset(out); } -Result GetAccelerometerScale(SetCalAccelerometerScale *out) { return ::setcalGetAccelerometerScale(out); } -Result GetGyroscopeOffset(SetCalGyroscopeOffset *out) { return ::setcalGetGyroscopeOffset(out); } -Result GetGyroscopeScale(SetCalGyroscopeScale *out) { return ::setcalGetGyroscopeScale(out); } -Result GetWirelessLanMacAddress(SetCalMacAddress *out) { return ::setcalGetWirelessLanMacAddress(out); } -Result GetWirelessLanCountryCodeCount(s32 *out_count) { return ::setcalGetWirelessLanCountryCodeCount(out_count); } -Result GetWirelessLanCountryCodes(s32 *total_out, SetCalCountryCode *codes, s32 count) { return ::setcalGetWirelessLanCountryCodes(total_out, codes, count); } -Result GetSerialNumber(SetCalSerialNumber *out) { return ::setcalGetSerialNumber(out); } -Result SetInitialSystemAppletProgramId(u64 program_id) { return ::setcalSetInitialSystemAppletProgramId(program_id); } -Result SetOverlayDispProgramId(u64 program_id) { return ::setcalSetOverlayDispProgramId(program_id); } -Result GetBatteryLot(SetBatteryLot *out) { return ::setcalGetBatteryLot(out); } -Result GetEciDeviceCertificate(SetCalEccB233DeviceCertificate *out) { return ::setcalGetEciDeviceCertificate(out); } -Result GetEticketDeviceCertificate(SetCalRsa2048DeviceCertificate *out) { return ::setcalGetEticketDeviceCertificate(out); } -Result GetSslKey(SetCalSslKey *out) { return ::setcalGetSslKey(out); } -Result GetSslCertificate(SetCalSslCertificate *out) { return ::setcalGetSslCertificate(out); } -Result GetGameCardKey(SetCalGameCardKey *out) { return ::setcalGetGameCardKey(out); } -Result GetGameCardCertificate(SetCalGameCardCertificate *out) { return ::setcalGetGameCardCertificate(out); } -Result GetEciDeviceKey(SetCalEccB233DeviceKey *out) { return ::setcalGetEciDeviceKey(out); } -Result GetEticketDeviceKey(SetCalRsa2048DeviceKey *out) { return ::setcalGetEticketDeviceKey(out); } -Result GetSpeakerParameter(SetCalSpeakerParameter *out) { return ::setcalGetSpeakerParameter(out); } -Result GetLcdVendorId(u32 *out_vendor_id) { return ::setcalGetLcdVendorId(out_vendor_id); } -Result GetEciDeviceCertificate2(SetCalRsa2048DeviceCertificate *out) { return ::setcalGetEciDeviceCertificate2(out); } -Result GetEciDeviceKey2(SetCalRsa2048DeviceKey *out) { return ::setcalGetEciDeviceKey2(out); } -Result GetAmiiboKey(SetCalAmiiboKey *out) { return ::setcalGetAmiiboKey(out); } -Result GetAmiiboEcqvCertificate(SetCalAmiiboEcqvCertificate *out) { return ::setcalGetAmiiboEcqvCertificate(out); } -Result GetAmiiboEcdsaCertificate(SetCalAmiiboEcdsaCertificate *out) { return ::setcalGetAmiiboEcdsaCertificate(out); } -Result GetAmiiboEcqvBlsKey(SetCalAmiiboEcqvBlsKey *out) { return ::setcalGetAmiiboEcqvBlsKey(out); } -Result GetAmiiboEcqvBlsCertificate(SetCalAmiiboEcqvBlsCertificate *out) { return ::setcalGetAmiiboEcqvBlsCertificate(out); } -Result GetAmiiboEcqvBlsRootCertificate(SetCalAmiiboEcqvBlsRootCertificate *out) { return ::setcalGetAmiiboEcqvBlsRootCertificate(out); } -Result GetUsbTypeCPowerSourceCircuitVersion(u8 *out_version) { return ::setcalGetUsbTypeCPowerSourceCircuitVersion(out_version); } -Result GetAnalogStickModuleTypeL(u8 *out_type) { return ::setcalGetAnalogStickModuleTypeL(out_type); } -Result GetAnalogStickModelParameterL(SetCalAnalogStickModelParameter *out) { return ::setcalGetAnalogStickModelParameterL(out); } -Result GetAnalogStickFactoryCalibrationL(SetCalAnalogStickFactoryCalibration *out) { return ::setcalGetAnalogStickFactoryCalibrationL(out); } -Result GetAnalogStickModuleTypeR(u8 *out_type) { return ::setcalGetAnalogStickModuleTypeR(out_type); } -Result GetAnalogStickModelParameterR(SetCalAnalogStickModelParameter *out) { return ::setcalGetAnalogStickModelParameterR(out); } -Result GetAnalogStickFactoryCalibrationR(SetCalAnalogStickFactoryCalibration *out) { return ::setcalGetAnalogStickFactoryCalibrationR(out); } -Result GetConsoleSixAxisSensorModuleType(u8 *out_type) { return ::setcalGetConsoleSixAxisSensorModuleType(out_type); } -Result GetConsoleSixAxisSensorHorizontalOffset(SetCalConsoleSixAxisSensorHorizontalOffset *out) { return ::setcalGetConsoleSixAxisSensorHorizontalOffset(out); } -Result GetBatteryVersion(u8 *out_version) { return ::setcalGetBatteryVersion(out_version); } -Result GetDeviceId(u64 *out_device_id) { return ::setcalGetDeviceId(out_device_id); } -Result GetConsoleSixAxisSensorMountType(u8 *out_type) { return ::setcalGetConsoleSixAxisSensorMountType(out_type); } - -} // namespace setcal - -namespace setfd { - -Result Initialize(void) { return ::setfdInitialize(); } -void Exit(void) { ::setfdExit(); } -Service* GetServiceSession(void) { return ::setfdGetServiceSession(); } -Result SetSettingsItemValue(const char *name, const char *item_key, const void *value_in, s64 value_in_size) { return ::setfdSetSettingsItemValue(name, item_key, value_in, value_in_size); } -Result ResetSettingsItemValue(const char *name, const char *item_key) { return ::setfdResetSettingsItemValue(name, item_key); } - -} // namespace setfd - -namespace setsys { - -Result Initialize(void) { return ::setsysInitialize(); } -void Exit(void) { ::setsysExit(); } -Service* GetServiceSession(void) { return ::setsysGetServiceSession(); } -Result SetLanguageCode(u64 LanguageCode) { return ::setsysSetLanguageCode(LanguageCode); } -Result SetNetworkSettings(const SetSysNetworkSettings *settings, s32 count) { return ::setsysSetNetworkSettings(settings, count); } -Result GetNetworkSettings(s32 *total_out, SetSysNetworkSettings *settings, s32 count) { return ::setsysGetNetworkSettings(total_out, settings, count); } -Result GetFirmwareVersion(SetSysFirmwareVersion *out) { return ::setsysGetFirmwareVersion(out); } -Result GetFirmwareVersionDigest(SetSysFirmwareVersionDigest *out) { return ::setsysGetFirmwareVersionDigest(out); } -Result GetLockScreenFlag(bool *out) { return ::setsysGetLockScreenFlag(out); } -Result SetLockScreenFlag(bool flag) { return ::setsysSetLockScreenFlag(flag); } -Result GetBacklightSettings(SetSysBacklightSettings *out) { return ::setsysGetBacklightSettings(out); } -Result SetBacklightSettings(const SetSysBacklightSettings *settings) { return ::setsysSetBacklightSettings(settings); } -Result SetBluetoothDevicesSettings(const SetSysBluetoothDevicesSettings *settings, s32 count) { return ::setsysSetBluetoothDevicesSettings(settings, count); } -Result GetBluetoothDevicesSettings(s32 *total_out, SetSysBluetoothDevicesSettings *settings, s32 count) { return ::setsysGetBluetoothDevicesSettings(total_out, settings, count); } -Result GetExternalSteadyClockSourceId(Uuid *out) { return ::setsysGetExternalSteadyClockSourceId(out); } -Result SetExternalSteadyClockSourceId(const Uuid *uuid) { return ::setsysSetExternalSteadyClockSourceId(uuid); } -Result GetUserSystemClockContext(TimeSystemClockContext *out) { return ::setsysGetUserSystemClockContext(out); } -Result SetUserSystemClockContext(const TimeSystemClockContext *context) { return ::setsysSetUserSystemClockContext(context); } -Result GetAccountSettings(SetSysAccountSettings *out) { return ::setsysGetAccountSettings(out); } -Result SetAccountSettings(SetSysAccountSettings settings) { return ::setsysSetAccountSettings(settings); } -Result GetAudioVolume(SetSysAudioDevice device, SetSysAudioVolume *out) { return ::setsysGetAudioVolume(device, out); } -Result SetAudioVolume(SetSysAudioDevice device, const SetSysAudioVolume *volume) { return ::setsysSetAudioVolume(device, volume); } -Result GetEulaVersions(s32 *total_out, SetSysEulaVersion *versions, s32 count) { return ::setsysGetEulaVersions(total_out, versions, count); } -Result SetEulaVersions(const SetSysEulaVersion *versions, s32 count) { return ::setsysSetEulaVersions(versions, count); } -Result GetColorSetId(ColorSetId *out) { return ::setsysGetColorSetId(out); } -Result SetColorSetId(ColorSetId id) { return ::setsysSetColorSetId(id); } -Result GetConsoleInformationUploadFlag(bool *out) { return ::setsysGetConsoleInformationUploadFlag(out); } -Result SetConsoleInformationUploadFlag(bool flag) { return ::setsysSetConsoleInformationUploadFlag(flag); } -Result GetAutomaticApplicationDownloadFlag(bool *out) { return ::setsysGetAutomaticApplicationDownloadFlag(out); } -Result SetAutomaticApplicationDownloadFlag(bool flag) { return ::setsysSetAutomaticApplicationDownloadFlag(flag); } -Result GetNotificationSettings(SetSysNotificationSettings *out) { return ::setsysGetNotificationSettings(out); } -Result SetNotificationSettings(const SetSysNotificationSettings *settings) { return ::setsysSetNotificationSettings(settings); } -Result GetAccountNotificationSettings(s32 *total_out, SetSysAccountNotificationSettings *settings, s32 count) { return ::setsysGetAccountNotificationSettings(total_out, settings, count); } -Result SetAccountNotificationSettings(const SetSysAccountNotificationSettings *settings, s32 count) { return ::setsysSetAccountNotificationSettings(settings, count); } -Result GetVibrationMasterVolume(float *out) { return ::setsysGetVibrationMasterVolume(out); } -Result SetVibrationMasterVolume(float volume) { return ::setsysSetVibrationMasterVolume(volume); } -Result GetSettingsItemValueSize(const char *name, const char *item_key, u64 *size_out) { return ::setsysGetSettingsItemValueSize(name, item_key, size_out); } -Result GetSettingsItemValue(const char *name, const char *item_key, void *value_out, size_t value_out_size, u64 *size_out) { return ::setsysGetSettingsItemValue(name, item_key, value_out, value_out_size, size_out); } -Result GetTvSettings(SetSysTvSettings *out) { return ::setsysGetTvSettings(out); } -Result SetTvSettings(const SetSysTvSettings *settings) { return ::setsysSetTvSettings(settings); } -Result GetEdid(SetSysEdid *out) { return ::setsysGetEdid(out); } -Result SetEdid(const SetSysEdid *edid) { return ::setsysSetEdid(edid); } -Result GetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode *out) { return ::setsysGetAudioOutputMode(target, out); } -Result SetAudioOutputMode(SetSysAudioOutputModeTarget target, SetSysAudioOutputMode mode) { return ::setsysSetAudioOutputMode(target, mode); } -Result GetSpeakerAutoMuteFlag(bool *out) { return ::setsysGetSpeakerAutoMuteFlag(out); } -Result SetSpeakerAutoMuteFlag(bool flag) { return ::setsysSetSpeakerAutoMuteFlag(flag); } -Result GetQuestFlag(bool *out) { return ::setsysGetQuestFlag(out); } -Result SetQuestFlag(bool flag) { return ::setsysSetQuestFlag(flag); } -Result GetDataDeletionSettings(SetSysDataDeletionSettings *out) { return ::setsysGetDataDeletionSettings(out); } -Result SetDataDeletionSettings(const SetSysDataDeletionSettings *settings) { return ::setsysSetDataDeletionSettings(settings); } -Result GetInitialSystemAppletProgramId(u64 *out) { return ::setsysGetInitialSystemAppletProgramId(out); } -Result GetOverlayDispProgramId(u64 *out) { return ::setsysGetOverlayDispProgramId(out); } -Result GetDeviceTimeZoneLocationName(TimeLocationName *out) { return ::setsysGetDeviceTimeZoneLocationName(out); } -Result SetDeviceTimeZoneLocationName(const TimeLocationName *name) { return ::setsysSetDeviceTimeZoneLocationName(name); } -Result GetWirelessCertificationFileSize(u64 *out_size) { return ::setsysGetWirelessCertificationFileSize(out_size); } -Result GetWirelessCertificationFile(void* buffer, size_t size, u64 *out_size) { return ::setsysGetWirelessCertificationFile(buffer, size, out_size); } -Result SetRegionCode(SetRegion region) { return ::setsysSetRegionCode(region); } -Result GetNetworkSystemClockContext(TimeSystemClockContext *out) { return ::setsysGetNetworkSystemClockContext(out); } -Result SetNetworkSystemClockContext(const TimeSystemClockContext *context) { return ::setsysSetNetworkSystemClockContext(context); } -Result IsUserSystemClockAutomaticCorrectionEnabled(bool *out) { return ::setsysIsUserSystemClockAutomaticCorrectionEnabled(out); } -Result SetUserSystemClockAutomaticCorrectionEnabled(bool flag) { return ::setsysSetUserSystemClockAutomaticCorrectionEnabled(flag); } -Result GetDebugModeFlag(bool *out) { return ::setsysGetDebugModeFlag(out); } -Result GetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage *out) { return ::setsysGetPrimaryAlbumStorage(out); } -Result SetPrimaryAlbumStorage(SetSysPrimaryAlbumStorage storage) { return ::setsysSetPrimaryAlbumStorage(storage); } -Result GetUsb30EnableFlag(bool *out) { return ::setsysGetUsb30EnableFlag(out); } -Result SetUsb30EnableFlag(bool flag) { return ::setsysSetUsb30EnableFlag(flag); } -Result GetBatteryLot(SetBatteryLot *out) { return ::setsysGetBatteryLot(out); } -Result GetSerialNumber(SetSysSerialNumber *out) { return ::setsysGetSerialNumber(out); } -Result GetNfcEnableFlag(bool *out) { return ::setsysGetNfcEnableFlag(out); } -Result SetNfcEnableFlag(bool flag) { return ::setsysSetNfcEnableFlag(flag); } -Result GetSleepSettings(SetSysSleepSettings *out) { return ::setsysGetSleepSettings(out); } -Result SetSleepSettings(const SetSysSleepSettings *settings) { return ::setsysSetSleepSettings(settings); } -Result GetWirelessLanEnableFlag(bool *out) { return ::setsysGetWirelessLanEnableFlag(out); } -Result SetWirelessLanEnableFlag(bool flag) { return ::setsysSetWirelessLanEnableFlag(flag); } -Result GetInitialLaunchSettings(SetSysInitialLaunchSettings *out) { return ::setsysGetInitialLaunchSettings(out); } -Result SetInitialLaunchSettings(const SetSysInitialLaunchSettings *settings) { return ::setsysSetInitialLaunchSettings(settings); } -Result GetDeviceNickname(SetSysDeviceNickName *nickname) { return ::setsysGetDeviceNickname(nickname); } -Result SetDeviceNickname(const SetSysDeviceNickName *nickname) { return ::setsysSetDeviceNickname(nickname); } -Result GetProductModel(SetSysProductModel *model) { return ::setsysGetProductModel(model); } -Result GetLdnChannel(s32 *out) { return ::setsysGetLdnChannel(out); } -Result SetLdnChannel(s32 channel) { return ::setsysSetLdnChannel(channel); } -Result AcquireTelemetryDirtyFlagEventHandle(Event *out_event) { return ::setsysAcquireTelemetryDirtyFlagEventHandle(out_event); } -Result GetTelemetryDirtyFlags(u64 *flags_0, u64 *flags_1) { return ::setsysGetTelemetryDirtyFlags(flags_0, flags_1); } -Result GetPtmBatteryLot(SetBatteryLot *out) { return ::setsysGetPtmBatteryLot(out); } -Result SetPtmBatteryLot(const SetBatteryLot *lot) { return ::setsysSetPtmBatteryLot(lot); } -Result GetPtmFuelGaugeParameter(SetSysPtmFuelGaugeParameter *out) { return ::setsysGetPtmFuelGaugeParameter(out); } -Result SetPtmFuelGaugeParameter(const SetSysPtmFuelGaugeParameter *parameter) { return ::setsysSetPtmFuelGaugeParameter(parameter); } -Result GetBluetoothEnableFlag(bool *out) { return ::setsysGetBluetoothEnableFlag(out); } -Result SetBluetoothEnableFlag(bool flag) { return ::setsysSetBluetoothEnableFlag(flag); } -Result GetMiiAuthorId(Uuid *out) { return ::setsysGetMiiAuthorId(out); } -Result SetShutdownRtcValue(u64 value) { return ::setsysSetShutdownRtcValue(value); } -Result GetShutdownRtcValue(u64 *out) { return ::setsysGetShutdownRtcValue(out); } -Result AcquireFatalDirtyFlagEventHandle(Event *out_event) { return ::setsysAcquireFatalDirtyFlagEventHandle(out_event); } -Result GetFatalDirtyFlags(u64 *flags_0, u64 *flags_1) { return ::setsysGetFatalDirtyFlags(flags_0, flags_1); } -Result GetAutoUpdateEnableFlag(bool *out) { return ::setsysGetAutoUpdateEnableFlag(out); } -Result SetAutoUpdateEnableFlag(bool flag) { return ::setsysSetAutoUpdateEnableFlag(flag); } -Result GetNxControllerSettings(s32 *total_out, SetSysNxControllerLegacySettings *settings, s32 count) { return ::setsysGetNxControllerSettings(total_out, settings, count); } -Result SetNxControllerSettings(const SetSysNxControllerLegacySettings *settings, s32 count) { return ::setsysSetNxControllerSettings(settings, count); } -Result GetBatteryPercentageFlag(bool *out) { return ::setsysGetBatteryPercentageFlag(out); } -Result SetBatteryPercentageFlag(bool flag) { return ::setsysSetBatteryPercentageFlag(flag); } -Result GetExternalRtcResetFlag(bool *out) { return ::setsysGetExternalRtcResetFlag(out); } -Result SetExternalRtcResetFlag(bool flag) { return ::setsysSetExternalRtcResetFlag(flag); } -Result GetUsbFullKeyEnableFlag(bool *out) { return ::setsysGetUsbFullKeyEnableFlag(out); } -Result SetUsbFullKeyEnableFlag(bool flag) { return ::setsysSetUsbFullKeyEnableFlag(flag); } -Result SetExternalSteadyClockInternalOffset(u64 offset) { return ::setsysSetExternalSteadyClockInternalOffset(offset); } -Result GetExternalSteadyClockInternalOffset(u64 *out) { return ::setsysGetExternalSteadyClockInternalOffset(out); } -Result GetBacklightSettingsEx(SetSysBacklightSettingsEx *out) { return ::setsysGetBacklightSettingsEx(out); } -Result SetBacklightSettingsEx(const SetSysBacklightSettingsEx *settings) { return ::setsysSetBacklightSettingsEx(settings); } -Result GetHeadphoneVolumeWarningCount(u32 *out) { return ::setsysGetHeadphoneVolumeWarningCount(out); } -Result SetHeadphoneVolumeWarningCount(u32 count) { return ::setsysSetHeadphoneVolumeWarningCount(count); } -Result GetBluetoothAfhEnableFlag(bool *out) { return ::setsysGetBluetoothAfhEnableFlag(out); } -Result SetBluetoothAfhEnableFlag(bool flag) { return ::setsysSetBluetoothAfhEnableFlag(flag); } -Result GetBluetoothBoostEnableFlag(bool *out) { return ::setsysGetBluetoothBoostEnableFlag(out); } -Result SetBluetoothBoostEnableFlag(bool flag) { return ::setsysSetBluetoothBoostEnableFlag(flag); } -Result GetInRepairProcessEnableFlag(bool *out) { return ::setsysGetInRepairProcessEnableFlag(out); } -Result SetInRepairProcessEnableFlag(bool flag) { return ::setsysSetInRepairProcessEnableFlag(flag); } -Result GetHeadphoneVolumeUpdateFlag(bool *out) { return ::setsysGetHeadphoneVolumeUpdateFlag(out); } -Result SetHeadphoneVolumeUpdateFlag(bool flag) { return ::setsysSetHeadphoneVolumeUpdateFlag(flag); } -Result NeedsToUpdateHeadphoneVolume(u8 *a0, u8 *a1, u8 *a2, bool flag) { return ::setsysNeedsToUpdateHeadphoneVolume(a0, a1, a2, flag); } -Result GetPushNotificationActivityModeOnSleep(u32 *out) { return ::setsysGetPushNotificationActivityModeOnSleep(out); } -Result SetPushNotificationActivityModeOnSleep(u32 mode) { return ::setsysSetPushNotificationActivityModeOnSleep(mode); } -Result GetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings *out) { return ::setsysGetServiceDiscoveryControlSettings(out); } -Result SetServiceDiscoveryControlSettings(SetSysServiceDiscoveryControlSettings settings) { return ::setsysSetServiceDiscoveryControlSettings(settings); } -Result GetErrorReportSharePermission(SetSysErrorReportSharePermission *out) { return ::setsysGetErrorReportSharePermission(out); } -Result SetErrorReportSharePermission(SetSysErrorReportSharePermission permission) { return ::setsysSetErrorReportSharePermission(permission); } -Result GetAppletLaunchFlags(u32 *out) { return ::setsysGetAppletLaunchFlags(out); } -Result SetAppletLaunchFlags(u32 flags) { return ::setsysSetAppletLaunchFlags(flags); } -Result GetConsoleSixAxisSensorAccelerationBias(SetSysConsoleSixAxisSensorAccelerationBias *out) { return ::setsysGetConsoleSixAxisSensorAccelerationBias(out); } -Result SetConsoleSixAxisSensorAccelerationBias(const SetSysConsoleSixAxisSensorAccelerationBias *bias) { return ::setsysSetConsoleSixAxisSensorAccelerationBias(bias); } -Result GetConsoleSixAxisSensorAngularVelocityBias(SetSysConsoleSixAxisSensorAngularVelocityBias *out) { return ::setsysGetConsoleSixAxisSensorAngularVelocityBias(out); } -Result SetConsoleSixAxisSensorAngularVelocityBias(const SetSysConsoleSixAxisSensorAngularVelocityBias *bias) { return ::setsysSetConsoleSixAxisSensorAngularVelocityBias(bias); } -Result GetConsoleSixAxisSensorAccelerationGain(SetSysConsoleSixAxisSensorAccelerationGain *out) { return ::setsysGetConsoleSixAxisSensorAccelerationGain(out); } -Result SetConsoleSixAxisSensorAccelerationGain(const SetSysConsoleSixAxisSensorAccelerationGain *gain) { return ::setsysSetConsoleSixAxisSensorAccelerationGain(gain); } -Result GetConsoleSixAxisSensorAngularVelocityGain(SetSysConsoleSixAxisSensorAngularVelocityGain *out) { return ::setsysGetConsoleSixAxisSensorAngularVelocityGain(out); } -Result SetConsoleSixAxisSensorAngularVelocityGain(const SetSysConsoleSixAxisSensorAngularVelocityGain *gain) { return ::setsysSetConsoleSixAxisSensorAngularVelocityGain(gain); } -Result GetKeyboardLayout(::SetKeyboardLayout *out) { return ::setsysGetKeyboardLayout(out); } -Result SetKeyboardLayout(::SetKeyboardLayout layout) { return ::setsysSetKeyboardLayout(layout); } -Result GetWebInspectorFlag(bool *out) { return ::setsysGetWebInspectorFlag(out); } -Result GetAllowedSslHosts(s32 *total_out, SetSysAllowedSslHosts *out, s32 count) { return ::setsysGetAllowedSslHosts(total_out, out, count); } -Result GetHostFsMountPoint(SetSysHostFsMountPoint *out) { return ::setsysGetHostFsMountPoint(out); } -Result GetRequiresRunRepairTimeReviser(bool *out) { return ::setsysGetRequiresRunRepairTimeReviser(out); } -Result SetRequiresRunRepairTimeReviser(bool flag) { return ::setsysSetRequiresRunRepairTimeReviser(flag); } -Result SetBlePairingSettings(const SetSysBlePairingSettings *settings, s32 count) { return ::setsysSetBlePairingSettings(settings, count); } -Result GetBlePairingSettings(s32 *total_out, SetSysBlePairingSettings *settings, s32 count) { return ::setsysGetBlePairingSettings(total_out, settings, count); } -Result GetConsoleSixAxisSensorAngularVelocityTimeBias(SetSysConsoleSixAxisSensorAngularVelocityTimeBias *out) { return ::setsysGetConsoleSixAxisSensorAngularVelocityTimeBias(out); } -Result SetConsoleSixAxisSensorAngularVelocityTimeBias(const SetSysConsoleSixAxisSensorAngularVelocityTimeBias *bias) { return ::setsysSetConsoleSixAxisSensorAngularVelocityTimeBias(bias); } -Result GetConsoleSixAxisSensorAngularAcceleration(SetSysConsoleSixAxisSensorAngularAcceleration *out) { return ::setsysGetConsoleSixAxisSensorAngularAcceleration(out); } -Result SetConsoleSixAxisSensorAngularAcceleration(const SetSysConsoleSixAxisSensorAngularAcceleration *acceleration) { return ::setsysSetConsoleSixAxisSensorAngularAcceleration(acceleration); } -Result GetRebootlessSystemUpdateVersion(SetSysRebootlessSystemUpdateVersion *out) { return ::setsysGetRebootlessSystemUpdateVersion(out); } -Result GetDeviceTimeZoneLocationUpdatedTime(TimeSteadyClockTimePoint *out) { return ::setsysGetDeviceTimeZoneLocationUpdatedTime(out); } -Result SetDeviceTimeZoneLocationUpdatedTime(const TimeSteadyClockTimePoint *time_point) { return ::setsysSetDeviceTimeZoneLocationUpdatedTime(time_point); } -Result GetUserSystemClockAutomaticCorrectionUpdatedTime(TimeSteadyClockTimePoint *out) { return ::setsysGetUserSystemClockAutomaticCorrectionUpdatedTime(out); } -Result SetUserSystemClockAutomaticCorrectionUpdatedTime(const TimeSteadyClockTimePoint *time_point) { return ::setsysSetUserSystemClockAutomaticCorrectionUpdatedTime(time_point); } -Result GetAccountOnlineStorageSettings(s32 *total_out, SetSysAccountOnlineStorageSettings *settings, s32 count) { return ::setsysGetAccountOnlineStorageSettings(total_out, settings, count); } -Result SetAccountOnlineStorageSettings(const SetSysAccountOnlineStorageSettings *settings, s32 count) { return ::setsysSetAccountOnlineStorageSettings(settings, count); } -Result GetPctlReadyFlag(bool *out) { return ::setsysGetPctlReadyFlag(out); } -Result SetPctlReadyFlag(bool flag) { return ::setsysSetPctlReadyFlag(flag); } -Result GetAnalogStickUserCalibrationL(SetSysAnalogStickUserCalibration *out) { return ::setsysGetAnalogStickUserCalibrationL(out); } -Result SetAnalogStickUserCalibrationL(const SetSysAnalogStickUserCalibration *calibration) { return ::setsysSetAnalogStickUserCalibrationL(calibration); } -Result GetAnalogStickUserCalibrationR(SetSysAnalogStickUserCalibration *out) { return ::setsysGetAnalogStickUserCalibrationR(out); } -Result SetAnalogStickUserCalibrationR(const SetSysAnalogStickUserCalibration *calibration) { return ::setsysSetAnalogStickUserCalibrationR(calibration); } -Result GetPtmBatteryVersion(u8 *out) { return ::setsysGetPtmBatteryVersion(out); } -Result SetPtmBatteryVersion(u8 version) { return ::setsysSetPtmBatteryVersion(version); } -Result GetUsb30HostEnableFlag(bool *out) { return ::setsysGetUsb30HostEnableFlag(out); } -Result SetUsb30HostEnableFlag(bool flag) { return ::setsysSetUsb30HostEnableFlag(flag); } -Result GetUsb30DeviceEnableFlag(bool *out) { return ::setsysGetUsb30DeviceEnableFlag(out); } -Result SetUsb30DeviceEnableFlag(bool flag) { return ::setsysSetUsb30DeviceEnableFlag(flag); } -Result GetThemeId(s32 type, SetSysThemeId *out) { return ::setsysGetThemeId(type, out); } -Result SetThemeId(s32 type, const SetSysThemeId *theme_id) { return ::setsysSetThemeId(type, theme_id); } -Result GetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod *out) { return ::setsysGetChineseTraditionalInputMethod(out); } -Result SetChineseTraditionalInputMethod(::SetChineseTraditionalInputMethod method) { return ::setsysSetChineseTraditionalInputMethod(method); } -Result GetPtmCycleCountReliability(SetSysPtmCycleCountReliability *out) { return ::setsysGetPtmCycleCountReliability(out); } -Result SetPtmCycleCountReliability(SetSysPtmCycleCountReliability reliability) { return ::setsysSetPtmCycleCountReliability(reliability); } -Result GetHomeMenuScheme(SetSysHomeMenuScheme *out) { return ::setsysGetHomeMenuScheme(out); } -Result GetThemeSettings(SetSysThemeSettings *out) { return ::setsysGetThemeSettings(out); } -Result SetThemeSettings(const SetSysThemeSettings *settings) { return ::setsysSetThemeSettings(settings); } -Result GetThemeKey(FsArchiveMacKey *out) { return ::setsysGetThemeKey(out); } -Result SetThemeKey(const FsArchiveMacKey *key) { return ::setsysSetThemeKey(key); } -Result GetZoomFlag(bool *out) { return ::setsysGetZoomFlag(out); } -Result SetZoomFlag(bool flag) { return ::setsysSetZoomFlag(flag); } -Result GetT(bool *out) { return ::setsysGetT(out); } -Result SetT(bool flag) { return ::setsysSetT(flag); } -Result GetPlatformRegion(SetSysPlatformRegion *out) { return ::setsysGetPlatformRegion(out); } -Result SetPlatformRegion(SetSysPlatformRegion region) { return ::setsysSetPlatformRegion(region); } -Result GetHomeMenuSchemeModel(u32 *out) { return ::setsysGetHomeMenuSchemeModel(out); } -Result GetMemoryUsageRateFlag(bool *out) { return ::setsysGetMemoryUsageRateFlag(out); } -Result GetTouchScreenMode(SetSysTouchScreenMode *out) { return ::setsysGetTouchScreenMode(out); } -Result SetTouchScreenMode(SetSysTouchScreenMode mode) { return ::setsysSetTouchScreenMode(mode); } -Result GetButtonConfigSettingsFull(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsFull(total_out, settings, count); } -Result SetButtonConfigSettingsFull(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsFull(settings, count); } -Result GetButtonConfigSettingsEmbedded(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsEmbedded(total_out, settings, count); } -Result SetButtonConfigSettingsEmbedded(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsEmbedded(settings, count); } -Result GetButtonConfigSettingsLeft(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsLeft(total_out, settings, count); } -Result SetButtonConfigSettingsLeft(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsLeft(settings, count); } -Result GetButtonConfigSettingsRight(s32 *total_out, SetSysButtonConfigSettings *settings, s32 count) { return ::setsysGetButtonConfigSettingsRight(total_out, settings, count); } -Result SetButtonConfigSettingsRight(const SetSysButtonConfigSettings *settings, s32 count) { return ::setsysSetButtonConfigSettingsRight(settings, count); } -Result GetButtonConfigRegisteredSettingsEmbedded(SetSysButtonConfigRegisteredSettings *settings) { return ::setsysGetButtonConfigRegisteredSettingsEmbedded(settings); } -Result SetButtonConfigRegisteredSettingsEmbedded(const SetSysButtonConfigRegisteredSettings *settings) { return ::setsysSetButtonConfigRegisteredSettingsEmbedded(settings); } -Result GetButtonConfigRegisteredSettings(s32 *total_out, SetSysButtonConfigRegisteredSettings *settings, s32 count) { return ::setsysGetButtonConfigRegisteredSettings(total_out, settings, count); } -Result SetButtonConfigRegisteredSettings(const SetSysButtonConfigRegisteredSettings *settings, s32 count) { return ::setsysSetButtonConfigRegisteredSettings(settings, count); } -Result GetFieldTestingFlag(bool *out) { return ::setsysGetFieldTestingFlag(out); } -Result SetFieldTestingFlag(bool flag) { return ::setsysSetFieldTestingFlag(flag); } -Result GetNxControllerSettingsEx(s32 *total_out, SetSysNxControllerSettings *settings, s32 count) { return ::setsysGetNxControllerSettingsEx(total_out, settings, count); } -Result SetNxControllerSettingsEx(const SetSysNxControllerSettings *settings, s32 count) { return ::setsysSetNxControllerSettingsEx(settings, count); } - -} // namespace setsys - -namespace sha1 { - -void ContextCreate(Sha1Context *out) { ::sha1ContextCreate(out); } -void ContextUpdate(Sha1Context *ctx, const void *src, size_t size) { ::sha1ContextUpdate(ctx, src, size); } -void ContextGetHash(Sha1Context *ctx, void *dst) { ::sha1ContextGetHash(ctx, dst); } -void CalculateHash(void *dst, const void *src, size_t size) { ::sha1CalculateHash(dst, src, size); } - -} // namespace sha1 - -namespace sha256 { - -void ContextCreate(Sha256Context *out) { ::sha256ContextCreate(out); } -void ContextUpdate(Sha256Context *ctx, const void *src, size_t size) { ::sha256ContextUpdate(ctx, src, size); } -void ContextGetHash(Sha256Context *ctx, void *dst) { ::sha256ContextGetHash(ctx, dst); } -void CalculateHash(void *dst, const void *src, size_t size) { ::sha256CalculateHash(dst, src, size); } - -} // namespace sha256 - -namespace shmem { - -Result Create(SharedMemory* s, size_t size, Permission local_perm, Permission remote_perm) { return ::shmemCreate(s, size, local_perm, remote_perm); } -void LoadRemote(SharedMemory* s, Handle handle, size_t size, Permission perm) { ::shmemLoadRemote(s, handle, size, perm); } -Result Map(SharedMemory* s) { return ::shmemMap(s); } -Result Unmap(SharedMemory* s) { return ::shmemUnmap(s); } -void* GetAddr(SharedMemory* s) { return ::shmemGetAddr(s); } -Result Close(SharedMemory* s) { return ::shmemClose(s); } - -} // namespace shmem - -namespace sm { - -u64 ServiceNameToU64(SmServiceName name) { return ::smServiceNameToU64(name); } -SmServiceName ServiceNameFromU64(u64 name) { return ::smServiceNameFromU64(name); } -bool ServiceNamesAreEqual(SmServiceName a, SmServiceName b) { return ::smServiceNamesAreEqual(a, b); } -SmServiceName EncodeName(const char* name) { return ::smEncodeName(name); } -Result Initialize(void) { return ::smInitialize(); } -void Exit(void) { ::smExit(); } -Result GetServiceWrapper(Service* service_out, SmServiceName name) { return ::smGetServiceWrapper(service_out, name); } -Result GetServiceOriginal(Handle* handle_out, SmServiceName name) { return ::smGetServiceOriginal(handle_out, name); } -Result GetService(Service* service_out, const char* name) { return ::smGetService(service_out, name); } -Handle GetServiceOverride(SmServiceName name) { return ::smGetServiceOverride(name); } -Result RegisterService(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions) { return ::smRegisterService(handle_out, name, is_light, max_sessions); } -Result RegisterServiceCmif(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions) { return ::smRegisterServiceCmif(handle_out, name, is_light, max_sessions); } -Result RegisterServiceTipc(Handle* handle_out, SmServiceName name, bool is_light, s32 max_sessions) { return ::smRegisterServiceTipc(handle_out, name, is_light, max_sessions); } -Result UnregisterService(SmServiceName name) { return ::smUnregisterService(name); } -Result UnregisterServiceCmif(SmServiceName name) { return ::smUnregisterServiceCmif(name); } -Result UnregisterServiceTipc(SmServiceName name) { return ::smUnregisterServiceTipc(name); } -Result DetachClient(void) { return ::smDetachClient(); } -Result DetachClientCmif(void) { return ::smDetachClientCmif(); } -Result DetachClientTipc(void) { return ::smDetachClientTipc(); } -Service * GetServiceSession(void) { return ::smGetServiceSession(); } -TipcService * GetServiceSessionTipc(void) { return ::smGetServiceSessionTipc(); } -void AddOverrideHandle(SmServiceName name, Handle handle) { ::smAddOverrideHandle(name, handle); } -Result ManagerInitialize(void) { return ::smManagerInitialize(); } -void ManagerExit(void) { ::smManagerExit(); } -Result ManagerRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { return ::smManagerRegisterProcess(pid, acid_sac, acid_sac_size, aci0_sac, aci0_sac_size); } -Result ManagerUnregisterProcess(u64 pid) { return ::smManagerUnregisterProcess(pid); } -Result ManagerCmifInitialize(void) { return ::smManagerCmifInitialize(); } -void ManagerCmifExit(void) { ::smManagerCmifExit(); } -Service* ManagerCmifGetServiceSession(void) { return ::smManagerCmifGetServiceSession(); } -Result ManagerCmifRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { return ::smManagerCmifRegisterProcess(pid, acid_sac, acid_sac_size, aci0_sac, aci0_sac_size); } -Result ManagerCmifUnregisterProcess(u64 pid) { return ::smManagerCmifUnregisterProcess(pid); } -Result ManagerTipcInitialize(void) { return ::smManagerTipcInitialize(); } -void ManagerTipcExit(void) { ::smManagerTipcExit(); } -TipcService* ManagerTipcGetServiceSession(void) { return ::smManagerTipcGetServiceSession(); } -Result ManagerTipcRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) { return ::smManagerTipcRegisterProcess(pid, acid_sac, acid_sac_size, aci0_sac, aci0_sac_size); } -Result ManagerTipcUnregisterProcess(u64 pid) { return ::smManagerTipcUnregisterProcess(pid); } - -} // namespace sm - -namespace socket { - -const SocketInitConfig * GetDefaultInitConfig(void) { return ::socketGetDefaultInitConfig(); } -Result Initialize(const SocketInitConfig *config) { return ::socketInitialize(config); } -Result GetLastResult(void) { return ::socketGetLastResult(); } -void Exit(void) { ::socketExit(); } -Result InitializeDefault(void) { return ::socketInitializeDefault(); } -int SslConnectionSetSocketDescriptor(SslConnection *c, int sockfd) { return ::socketSslConnectionSetSocketDescriptor(c, sockfd); } -int SslConnectionGetSocketDescriptor(SslConnection *c) { return ::socketSslConnectionGetSocketDescriptor(c); } -#ifdef _SOCKLEN_T_DECLARED -int SslConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const struct sockaddr *addr, socklen_t addrlen) { return ::socketSslConnectionSetDtlsSocketDescriptor(c, sockfd, addr, addrlen); } -#endif -int NifmRequestRegisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::socketNifmRequestRegisterSocketDescriptor(r, sockfd); } -int NifmRequestUnregisterSocketDescriptor(NifmRequest* r, int sockfd) { return ::socketNifmRequestUnregisterSocketDescriptor(r, sockfd); } - -} // namespace socket - -namespace spl { - -Result Initialize(void) { return ::splInitialize(); } -void Exit(void) { ::splExit(); } -Service* GetServiceSession(void) { return ::splGetServiceSession(); } -Result CryptoInitialize(void) { return ::splCryptoInitialize(); } -void CryptoExit(void) { ::splCryptoExit(); } -Service* CryptoGetServiceSession(void) { return ::splCryptoGetServiceSession(); } -Result SslInitialize(void) { return ::splSslInitialize(); } -void SslExit(void) { ::splSslExit(); } -Service* SslGetServiceSession(void) { return ::splSslGetServiceSession(); } -Result EsInitialize(void) { return ::splEsInitialize(); } -void EsExit(void) { ::splEsExit(); } -Service* EsGetServiceSession(void) { return ::splEsGetServiceSession(); } -Result FsInitialize(void) { return ::splFsInitialize(); } -void FsExit(void) { ::splFsExit(); } -Service* FsGetServiceSession(void) { return ::splFsGetServiceSession(); } -Result ManuInitialize(void) { return ::splManuInitialize(); } -void ManuExit(void) { ::splManuExit(); } -Service* ManuGetServiceSession(void) { return ::splManuGetServiceSession(); } -Result GetConfig(SplConfigItem config_item, u64 *out_config) { return ::splGetConfig(config_item, out_config); } -Result UserExpMod(const void *input, const void *modulus, const void *exp, size_t exp_size, void *dst) { return ::splUserExpMod(input, modulus, exp, exp_size, dst); } -Result SetConfig(SplConfigItem config_item, u64 value) { return ::splSetConfig(config_item, value); } -Result GetRandomBytes(void *out, size_t out_size) { return ::splGetRandomBytes(out, out_size); } -Result IsDevelopment(bool *out_is_development) { return ::splIsDevelopment(out_is_development); } -Result SetBootReason(u32 value) { return ::splSetBootReason(value); } -Result GetBootReason(u32 *out_value) { return ::splGetBootReason(out_value); } -Result CryptoGenerateAesKek(const void *wrapped_kek, u32 key_generation, u32 option, void *out_sealed_kek) { return ::splCryptoGenerateAesKek(wrapped_kek, key_generation, option, out_sealed_kek); } -Result CryptoLoadAesKey(const void *sealed_kek, const void *wrapped_key, u32 keyslot) { return ::splCryptoLoadAesKey(sealed_kek, wrapped_key, keyslot); } -Result CryptoGenerateAesKey(const void *sealed_kek, const void *wrapped_key, void *out_sealed_key) { return ::splCryptoGenerateAesKey(sealed_kek, wrapped_key, out_sealed_key); } -Result CryptoDecryptAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key) { return ::splCryptoDecryptAesKey(wrapped_key, key_generation, option, out_sealed_key); } -Result CryptoCryptAesCtr(const void *input, void *output, size_t size, u32 keyslot, const void *ctr) { return ::splCryptoCryptAesCtr(input, output, size, keyslot, ctr); } -Result CryptoComputeCmac(const void *input, size_t size, u32 keyslot, void *out_cmac) { return ::splCryptoComputeCmac(input, size, keyslot, out_cmac); } -Result CryptoLockAesEngine(u32 *out_keyslot) { return ::splCryptoLockAesEngine(out_keyslot); } -Result CryptoUnlockAesEngine(u32 keyslot) { return ::splCryptoUnlockAesEngine(keyslot); } -Result CryptoGetSecurityEngineEvent(Event *out_event) { return ::splCryptoGetSecurityEngineEvent(out_event); } -Result RsaDecryptPrivateKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version, void *dst, size_t dst_size) { return ::splRsaDecryptPrivateKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size, version, dst, dst_size); } -Result SslLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size) { return ::splSslLoadSecureExpModKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size); } -Result SslSecureExpMod(const void *input, const void *modulus, void *dst) { return ::splSslSecureExpMod(input, modulus, dst); } -Result EsLoadRsaOaepKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version) { return ::splEsLoadRsaOaepKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size, version); } -Result EsUnwrapRsaOaepWrappedTitlekey(const void *rsa_wrapped_titlekey, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_titlekey) { return ::splEsUnwrapRsaOaepWrappedTitlekey(rsa_wrapped_titlekey, modulus, label_hash, label_hash_size, key_generation, out_sealed_titlekey); } -Result EsUnwrapAesWrappedTitlekey(const void *aes_wrapped_titlekey, u32 key_generation, void *out_sealed_titlekey) { return ::splEsUnwrapAesWrappedTitlekey(aes_wrapped_titlekey, key_generation, out_sealed_titlekey); } -Result EsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size) { return ::splEsLoadSecureExpModKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size); } -Result EsSecureExpMod(const void *input, const void *modulus, void *dst) { return ::splEsSecureExpMod(input, modulus, dst); } -Result EsUnwrapElicenseKey(const void *rsa_wrapped_elicense_key, const void *modulus, const void *label_hash, size_t label_hash_size, u32 key_generation, void *out_sealed_elicense_key) { return ::splEsUnwrapElicenseKey(rsa_wrapped_elicense_key, modulus, label_hash, label_hash_size, key_generation, out_sealed_elicense_key); } -Result EsLoadElicenseKey(const void *sealed_elicense_key, u32 keyslot) { return ::splEsLoadElicenseKey(sealed_elicense_key, keyslot); } -Result FsLoadSecureExpModKey(const void *sealed_kek, const void *wrapped_key, const void *wrapped_rsa_key, size_t wrapped_rsa_key_size, RsaKeyVersion version) { return ::splFsLoadSecureExpModKey(sealed_kek, wrapped_key, wrapped_rsa_key, wrapped_rsa_key_size, version); } -Result FsSecureExpMod(const void *input, const void *modulus, void *dst) { return ::splFsSecureExpMod(input, modulus, dst); } -Result FsGenerateSpecificAesKey(const void *wrapped_key, u32 key_generation, u32 option, void *out_sealed_key) { return ::splFsGenerateSpecificAesKey(wrapped_key, key_generation, option, out_sealed_key); } -Result FsLoadTitlekey(const void *sealed_titlekey, u32 keyslot) { return ::splFsLoadTitlekey(sealed_titlekey, keyslot); } -Result FsGetPackage2Hash(void *out_hash) { return ::splFsGetPackage2Hash(out_hash); } -Result ManuEncryptRsaKeyForImport(const void *sealed_kek_pre, const void *wrapped_key_pre, const void *sealed_kek_post, const void *wrapped_kek_post, u32 option, const void *wrapped_rsa_key, void *out_wrapped_rsa_key, size_t rsa_key_size) { return ::splManuEncryptRsaKeyForImport(sealed_kek_pre, wrapped_key_pre, sealed_kek_post, wrapped_kek_post, option, wrapped_rsa_key, out_wrapped_rsa_key, rsa_key_size); } - -} // namespace spl - -namespace spsm { - -Result Initialize(void) { return ::spsmInitialize(); } -void Exit(void) { ::spsmExit(); } -Service* GetServiceSession(void) { return ::spsmGetServiceSession(); } -Result Shutdown(bool reboot) { return ::spsmShutdown(reboot); } -Result PutErrorState(void) { return ::spsmPutErrorState(); } - -} // namespace spsm - -namespace ssl { - -Result Initialize(u32 num_sessions) { return ::sslInitialize(num_sessions); } -void Exit(void) { ::sslExit(); } -Service* GetServiceSession(void) { return ::sslGetServiceSession(); } -Result CreateContext(SslContext *c, u32 ssl_version) { return ::sslCreateContext(c, ssl_version); } -Result GetContextCount(u32 *out) { return ::sslGetContextCount(out); } -Result GetCertificates(void* buffer, u32 size, u32 *ca_cert_ids, u32 count, u32 *total_out) { return ::sslGetCertificates(buffer, size, ca_cert_ids, count, total_out); } -Result GetCertificateBufSize(u32 *ca_cert_ids, u32 count, u32 *out) { return ::sslGetCertificateBufSize(ca_cert_ids, count, out); } -Result FlushSessionCache(const char *str, size_t str_bufsize, SslFlushSessionCacheOptionType type, u32 *out) { return ::sslFlushSessionCache(str, str_bufsize, type, out); } -Result SetDebugOption(const void* buffer, size_t size, SslDebugOptionType type) { return ::sslSetDebugOption(buffer, size, type); } -Result GetDebugOption(void* buffer, size_t size, SslDebugOptionType type) { return ::sslGetDebugOption(buffer, size, type); } -Result ClearTls12FallbackFlag(void) { return ::sslClearTls12FallbackFlag(); } -Result SetThreadCoreMask(u64 mask) { return ::sslSetThreadCoreMask(mask); } -Result GetThreadCoreMask(u64 *out) { return ::sslGetThreadCoreMask(out); } -void ContextClose(SslContext *c) { ::sslContextClose(c); } -Result ContextSetOption(SslContext *c, SslContextOption option, s32 value) { return ::sslContextSetOption(c, option, value); } -Result ContextGetOption(SslContext *c, SslContextOption option, s32 *out) { return ::sslContextGetOption(c, option, out); } -Result ContextCreateConnection(SslContext *c, SslConnection *conn) { return ::sslContextCreateConnection(c, conn); } -Result ContextGetConnectionCount(SslContext *c, u32 *out) { return ::sslContextGetConnectionCount(c, out); } -Result ContextImportServerPki(SslContext *c, const void* buffer, u32 size, SslCertificateFormat format, u64 *id) { return ::sslContextImportServerPki(c, buffer, size, format, id); } -Result ContextImportClientPki(SslContext *c, const void* pkcs12, u32 pkcs12_size, const char *pw, u32 pw_size, u64 *id) { return ::sslContextImportClientPki(c, pkcs12, pkcs12_size, pw, pw_size, id); } -Result ContextRemovePki(SslContext *c, u64 id) { return ::sslContextRemovePki(c, id); } -Result ContextRegisterInternalPki(SslContext *c, SslInternalPki internal_pki, u64 *id) { return ::sslContextRegisterInternalPki(c, internal_pki, id); } -Result ContextAddPolicyOid(SslContext *c, const char *str, u32 str_bufsize) { return ::sslContextAddPolicyOid(c, str, str_bufsize); } -Result ContextImportCrl(SslContext *c, const void* buffer, u32 size, u64 *id) { return ::sslContextImportCrl(c, buffer, size, id); } -Result ContextImportClientCertKeyPki(SslContext *c, const void* cert, u32 cert_size, const void* key, u32 key_size, SslCertificateFormat format, u64 *id) { return ::sslContextImportClientCertKeyPki(c, cert, cert_size, key, key_size, format, id); } -Result ContextGeneratePrivateKeyAndCert(SslContext *c, void* cert, u32 cert_size, void* key, u32 key_size, u32 val, const SslKeyAndCertParams *params, u32 *out_certsize, u32 *out_keysize) { return ::sslContextGeneratePrivateKeyAndCert(c, cert, cert_size, key, key_size, val, params, out_certsize, out_keysize); } -Result ContextCreateConnectionForSystem(SslContext *c, SslConnection *conn) { return ::sslContextCreateConnectionForSystem(c, conn); } -void ConnectionClose(SslConnection *c) { ::sslConnectionClose(c); } -Result ConnectionSetSocketDescriptor(SslConnection *c, int sockfd, int *out_sockfd) { return ::sslConnectionSetSocketDescriptor(c, sockfd, out_sockfd); } -Result ConnectionSetHostName(SslConnection *c, const char* str, u32 str_bufsize) { return ::sslConnectionSetHostName(c, str, str_bufsize); } -Result ConnectionSetVerifyOption(SslConnection *c, u32 verify_option) { return ::sslConnectionSetVerifyOption(c, verify_option); } -Result ConnectionSetIoMode(SslConnection *c, SslIoMode mode) { return ::sslConnectionSetIoMode(c, mode); } -Result ConnectionGetSocketDescriptor(SslConnection *c, int *sockfd) { return ::sslConnectionGetSocketDescriptor(c, sockfd); } -Result ConnectionGetHostName(SslConnection *c, char *str, u32 str_bufsize, u32 *out) { return ::sslConnectionGetHostName(c, str, str_bufsize, out); } -Result ConnectionGetVerifyOption(SslConnection *c, u32 *out) { return ::sslConnectionGetVerifyOption(c, out); } -Result ConnectionGetIoMode(SslConnection *c, SslIoMode *out) { return ::sslConnectionGetIoMode(c, out); } -Result ConnectionDoHandshake(SslConnection *c, u32 *out_size, u32 *total_certs, void* server_certbuf, u32 server_certbuf_size) { return ::sslConnectionDoHandshake(c, out_size, total_certs, server_certbuf, server_certbuf_size); } -Result ConnectionGetServerCertDetail(const void* certbuf, u32 certbuf_size, u32 cert_index, void** cert, u32 *cert_size) { return ::sslConnectionGetServerCertDetail(certbuf, certbuf_size, cert_index, cert, cert_size); } -Result ConnectionRead(SslConnection *c, void* buffer, u32 size, u32 *out_size) { return ::sslConnectionRead(c, buffer, size, out_size); } -Result ConnectionWrite(SslConnection *c, const void* buffer, u32 size, u32 *out_size) { return ::sslConnectionWrite(c, buffer, size, out_size); } -Result ConnectionPending(SslConnection *c, s32 *out) { return ::sslConnectionPending(c, out); } -Result ConnectionPeek(SslConnection *c, void* buffer, u32 size, u32 *out_size) { return ::sslConnectionPeek(c, buffer, size, out_size); } -Result ConnectionPoll(SslConnection *c, u32 in_pollevent, u32 *out_pollevent, u32 timeout) { return ::sslConnectionPoll(c, in_pollevent, out_pollevent, timeout); } -Result ConnectionGetVerifyCertError(SslConnection *c) { return ::sslConnectionGetVerifyCertError(c); } -Result ConnectionGetNeededServerCertBufferSize(SslConnection *c, u32 *out) { return ::sslConnectionGetNeededServerCertBufferSize(c, out); } -Result ConnectionSetSessionCacheMode(SslConnection *c, SslSessionCacheMode mode) { return ::sslConnectionSetSessionCacheMode(c, mode); } -Result ConnectionGetSessionCacheMode(SslConnection *c, SslSessionCacheMode *out) { return ::sslConnectionGetSessionCacheMode(c, out); } -Result ConnectionFlushSessionCache(SslConnection *c) { return ::sslConnectionFlushSessionCache(c); } -Result ConnectionSetRenegotiationMode(SslConnection *c, SslRenegotiationMode mode) { return ::sslConnectionSetRenegotiationMode(c, mode); } -Result ConnectionGetRenegotiationMode(SslConnection *c, SslRenegotiationMode *out) { return ::sslConnectionGetRenegotiationMode(c, out); } -Result ConnectionSetOption(SslConnection *c, SslOptionType option, bool flag) { return ::sslConnectionSetOption(c, option, flag); } -Result ConnectionGetOption(SslConnection *c, SslOptionType option, bool *out) { return ::sslConnectionGetOption(c, option, out); } -Result ConnectionGetVerifyCertErrors(SslConnection *c, u32 *out0, u32 *out1, Result *errors, u32 count) { return ::sslConnectionGetVerifyCertErrors(c, out0, out1, errors, count); } -Result ConnectionGetCipherInfo(SslConnection *c, SslCipherInfo *out) { return ::sslConnectionGetCipherInfo(c, out); } -Result ConnectionSetNextAlpnProto(SslConnection *c, const u8 *buffer, u32 size) { return ::sslConnectionSetNextAlpnProto(c, buffer, size); } -Result ConnectionGetNextAlpnProto(SslConnection *c, SslAlpnProtoState *state, u32 *out, u8 *buffer, u32 size) { return ::sslConnectionGetNextAlpnProto(c, state, out, buffer, size); } -Result ConnectionSetDtlsSocketDescriptor(SslConnection *c, int sockfd, const void* buf, size_t size, int *out_sockfd) { return ::sslConnectionSetDtlsSocketDescriptor(c, sockfd, buf, size, out_sockfd); } -Result ConnectionGetDtlsHandshakeTimeout(SslConnection *c, u64 *out) { return ::sslConnectionGetDtlsHandshakeTimeout(c, out); } -Result ConnectionSetPrivateOption(SslConnection *c, SslPrivateOptionType option, u32 value) { return ::sslConnectionSetPrivateOption(c, option, value); } -Result ConnectionSetSrtpCiphers(SslConnection *c, const u16 *ciphers, u32 count) { return ::sslConnectionSetSrtpCiphers(c, ciphers, count); } -Result ConnectionGetSrtpCipher(SslConnection *c, u16 *out) { return ::sslConnectionGetSrtpCipher(c, out); } -Result ConnectionExportKeyingMaterial(SslConnection *c, u8 *outbuf, u32 outbuf_size, const char *label, u32 label_size, const void* context, u32 context_size) { return ::sslConnectionExportKeyingMaterial(c, outbuf, outbuf_size, label, label_size, context, context_size); } -Result ConnectionSetIoTimeout(SslConnection *c, u32 timeout) { return ::sslConnectionSetIoTimeout(c, timeout); } -Result ConnectionGetIoTimeout(SslConnection *c, u32 *out) { return ::sslConnectionGetIoTimeout(c, out); } - -} // namespace ssl - -namespace svc { - -Result SetHeapSize(void** out_addr, u64 size) { return ::svcSetHeapSize(out_addr, size); } -Result SetMemoryPermission(void* addr, u64 size, u32 perm) { return ::svcSetMemoryPermission(addr, size, perm); } -Result SetMemoryAttribute(void* addr, u64 size, u32 val0, u32 val1) { return ::svcSetMemoryAttribute(addr, size, val0, val1); } -Result MapMemory(void* dst_addr, void* src_addr, u64 size) { return ::svcMapMemory(dst_addr, src_addr, size); } -Result UnmapMemory(void* dst_addr, void* src_addr, u64 size) { return ::svcUnmapMemory(dst_addr, src_addr, size); } -Result QueryMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, u64 addr) { return ::svcQueryMemory(meminfo_ptr, pageinfo, addr); } -[[noreturn]] void ExitProcess(void) { ::svcExitProcess(); } -Result CreateThread(Handle* out, void* entry, void* arg, void* stack_top, int prio, int cpuid) { return ::svcCreateThread(out, entry, arg, stack_top, prio, cpuid); } -Result StartThread(Handle handle) { return ::svcStartThread(handle); } -[[noreturn]] void ExitThread(void) { ::svcExitThread(); } -void SleepThread(s64 nano) { ::svcSleepThread(nano); } -Result GetThreadPriority(s32* priority, Handle handle) { return ::svcGetThreadPriority(priority, handle); } -Result SetThreadPriority(Handle handle, u32 priority) { return ::svcSetThreadPriority(handle, priority); } -Result GetThreadCoreMask(s32* preferred_core, u64* affinity_mask, Handle handle) { return ::svcGetThreadCoreMask(preferred_core, affinity_mask, handle); } -Result SetThreadCoreMask(Handle handle, s32 preferred_core, u32 affinity_mask) { return ::svcSetThreadCoreMask(handle, preferred_core, affinity_mask); } -u32 GetCurrentProcessorNumber(void) { return ::svcGetCurrentProcessorNumber(); } -Result SignalEvent(Handle handle) { return ::svcSignalEvent(handle); } -Result ClearEvent(Handle handle) { return ::svcClearEvent(handle); } -Result MapSharedMemory(Handle handle, void* addr, size_t size, u32 perm) { return ::svcMapSharedMemory(handle, addr, size, perm); } -Result UnmapSharedMemory(Handle handle, void* addr, size_t size) { return ::svcUnmapSharedMemory(handle, addr, size); } -Result CreateTransferMemory(Handle* out, void* addr, size_t size, u32 perm) { return ::svcCreateTransferMemory(out, addr, size, perm); } -Result CloseHandle(Handle handle) { return ::svcCloseHandle(handle); } -Result ResetSignal(Handle handle) { return ::svcResetSignal(handle); } -Result WaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout) { return ::svcWaitSynchronization(index, handles, handleCount, timeout); } -Result WaitSynchronizationSingle(Handle handle, u64 timeout) { return ::svcWaitSynchronizationSingle(handle, timeout); } -Result CancelSynchronization(Handle thread) { return ::svcCancelSynchronization(thread); } -Result ArbitrateLock(u32 wait_tag, u32* tag_location, u32 self_tag) { return ::svcArbitrateLock(wait_tag, tag_location, self_tag); } -Result ArbitrateUnlock(u32* tag_location) { return ::svcArbitrateUnlock(tag_location); } -Result WaitProcessWideKeyAtomic(u32* key, u32* tag_location, u32 self_tag, u64 timeout) { return ::svcWaitProcessWideKeyAtomic(key, tag_location, self_tag, timeout); } -void SignalProcessWideKey(u32* key, s32 num) { ::svcSignalProcessWideKey(key, num); } -u64 GetSystemTick(void) { return ::svcGetSystemTick(); } -Result ConnectToNamedPort(Handle* session, const char* name) { return ::svcConnectToNamedPort(session, name); } -Result SendSyncRequestLight(Handle session) { return ::svcSendSyncRequestLight(session); } -Result SendSyncRequest(Handle session) { return ::svcSendSyncRequest(session); } -Result SendSyncRequestWithUserBuffer(void* usrBuffer, u64 size, Handle session) { return ::svcSendSyncRequestWithUserBuffer(usrBuffer, size, session); } -Result SendAsyncRequestWithUserBuffer(Handle* handle, void* usrBuffer, u64 size, Handle session) { return ::svcSendAsyncRequestWithUserBuffer(handle, usrBuffer, size, session); } -Result GetProcessId(u64 *processID, Handle handle) { return ::svcGetProcessId(processID, handle); } -Result GetThreadId(u64 *threadID, Handle handle) { return ::svcGetThreadId(threadID, handle); } -Result Break(u32 breakReason, uintptr_t address, uintptr_t size) { return ::svcBreak(breakReason, address, size); } -Result OutputDebugString(const char *str, u64 size) { return ::svcOutputDebugString(str, size); } -[[noreturn]] void ReturnFromException(Result res) { ::svcReturnFromException(res); } -Result GetInfo(u64* out, u32 id0, Handle handle, u64 id1) { return ::svcGetInfo(out, id0, handle, id1); } -void FlushEntireDataCache(void) { ::svcFlushEntireDataCache(); } -Result FlushDataCache(void *address, size_t size) { return ::svcFlushDataCache(address, size); } -Result MapPhysicalMemory(void *address, u64 size) { return ::svcMapPhysicalMemory(address, size); } -Result UnmapPhysicalMemory(void *address, u64 size) { return ::svcUnmapPhysicalMemory(address, size); } -Result GetDebugFutureThreadInfo(LastThreadContext *out_context, u64 *out_thread_id, Handle debug, s64 ns) { return ::svcGetDebugFutureThreadInfo(out_context, out_thread_id, debug, ns); } -Result GetLastThreadInfo(LastThreadContext *out_context, u64 *out_tls_address, u32 *out_flags) { return ::svcGetLastThreadInfo(out_context, out_tls_address, out_flags); } -Result GetResourceLimitLimitValue(s64 *out, Handle reslimit_h, LimitableResource which) { return ::svcGetResourceLimitLimitValue(out, reslimit_h, which); } -Result GetResourceLimitCurrentValue(s64 *out, Handle reslimit_h, LimitableResource which) { return ::svcGetResourceLimitCurrentValue(out, reslimit_h, which); } -Result SetThreadActivity(Handle thread, ThreadActivity paused) { return ::svcSetThreadActivity(thread, paused); } -Result GetThreadContext3(ThreadContext* ctx, Handle thread) { return ::svcGetThreadContext3(ctx, thread); } -Result WaitForAddress(void *address, u32 arb_type, s64 value, s64 timeout) { return ::svcWaitForAddress(address, arb_type, value, timeout); } -Result SignalToAddress(void *address, u32 signal_type, s32 value, s32 count) { return ::svcSignalToAddress(address, signal_type, value, count); } -void SynchronizePreemptionState(void) { ::svcSynchronizePreemptionState(); } -Result GetResourceLimitPeakValue(s64 *out, Handle reslimit_h, LimitableResource which) { return ::svcGetResourceLimitPeakValue(out, reslimit_h, which); } -Result CreateIoPool(Handle *out_handle, u32 pool_type) { return ::svcCreateIoPool(out_handle, pool_type); } -Result CreateIoRegion(Handle *out_handle, Handle io_pool_h, u64 physical_address, u64 size, u32 memory_mapping, u32 perm) { return ::svcCreateIoRegion(out_handle, io_pool_h, physical_address, size, memory_mapping, perm); } -void DumpInfo(u32 dump_info_type, u64 arg0) { ::svcDumpInfo(dump_info_type, arg0); } -void KernelDebug(u32 kern_debug_type, u64 arg0, u64 arg1, u64 arg2) { ::svcKernelDebug(kern_debug_type, arg0, arg1, arg2); } -void ChangeKernelTraceState(u32 kern_trace_state) { ::svcChangeKernelTraceState(kern_trace_state); } -Result CreateSession(Handle *server_handle, Handle *client_handle, u32 unk0, u64 unk1) { return ::svcCreateSession(server_handle, client_handle, unk0, unk1); } -Result AcceptSession(Handle *session_handle, Handle port_handle) { return ::svcAcceptSession(session_handle, port_handle); } -Result ReplyAndReceiveLight(Handle handle) { return ::svcReplyAndReceiveLight(handle); } -Result ReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout) { return ::svcReplyAndReceive(index, handles, handleCount, replyTarget, timeout); } -Result ReplyAndReceiveWithUserBuffer(s32* index, void* usrBuffer, u64 size, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout) { return ::svcReplyAndReceiveWithUserBuffer(index, usrBuffer, size, handles, handleCount, replyTarget, timeout); } -Result CreateEvent(Handle* server_handle, Handle* client_handle) { return ::svcCreateEvent(server_handle, client_handle); } -Result MapIoRegion(Handle io_region_h, void *address, u64 size, u32 perm) { return ::svcMapIoRegion(io_region_h, address, size, perm); } -Result UnmapIoRegion(Handle io_region_h, void *address, u64 size) { return ::svcUnmapIoRegion(io_region_h, address, size); } -Result MapPhysicalMemoryUnsafe(void *address, u64 size) { return ::svcMapPhysicalMemoryUnsafe(address, size); } -Result UnmapPhysicalMemoryUnsafe(void *address, u64 size) { return ::svcUnmapPhysicalMemoryUnsafe(address, size); } -Result SetUnsafeLimit(u64 size) { return ::svcSetUnsafeLimit(size); } -Result CreateCodeMemory(Handle* code_handle, void* src_addr, u64 size) { return ::svcCreateCodeMemory(code_handle, src_addr, size); } -Result ControlCodeMemory(Handle code_handle, CodeMapOperation op, void* dst_addr, u64 size, u64 perm) { return ::svcControlCodeMemory(code_handle, op, dst_addr, size, perm); } -void SleepSystem(void) { ::svcSleepSystem(); } -Result ReadWriteRegister(u32* outVal, u64 regAddr, u32 rwMask, u32 inVal) { return ::svcReadWriteRegister(outVal, regAddr, rwMask, inVal); } -Result SetProcessActivity(Handle process, ProcessActivity paused) { return ::svcSetProcessActivity(process, paused); } -Result CreateSharedMemory(Handle* out, size_t size, u32 local_perm, u32 other_perm) { return ::svcCreateSharedMemory(out, size, local_perm, other_perm); } -Result MapTransferMemory(Handle tmem_handle, void* addr, size_t size, u32 perm) { return ::svcMapTransferMemory(tmem_handle, addr, size, perm); } -Result UnmapTransferMemory(Handle tmem_handle, void* addr, size_t size) { return ::svcUnmapTransferMemory(tmem_handle, addr, size); } -Result CreateInterruptEvent(Handle* handle, u64 irqNum, u32 flag) { return ::svcCreateInterruptEvent(handle, irqNum, flag); } -Result QueryPhysicalAddress(PhysicalMemoryInfo *out, u64 virtaddr) { return ::svcQueryPhysicalAddress(out, virtaddr); } -Result QueryMemoryMapping(u64* virtaddr, u64* out_size, u64 physaddr, u64 size) { return ::svcQueryMemoryMapping(virtaddr, out_size, physaddr, size); } -Result LegacyQueryIoMapping(u64* virtaddr, u64 physaddr, u64 size) { return ::svcLegacyQueryIoMapping(virtaddr, physaddr, size); } -Result CreateDeviceAddressSpace(Handle *handle, u64 dev_addr, u64 dev_size) { return ::svcCreateDeviceAddressSpace(handle, dev_addr, dev_size); } -Result AttachDeviceAddressSpace(u64 device, Handle handle) { return ::svcAttachDeviceAddressSpace(device, handle); } -Result DetachDeviceAddressSpace(u64 device, Handle handle) { return ::svcDetachDeviceAddressSpace(device, handle); } -Result MapDeviceAddressSpaceByForce(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option) { return ::svcMapDeviceAddressSpaceByForce(handle, proc_handle, map_addr, dev_size, dev_addr, option); } -Result MapDeviceAddressSpaceAligned(Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 option) { return ::svcMapDeviceAddressSpaceAligned(handle, proc_handle, map_addr, dev_size, dev_addr, option); } -Result MapDeviceAddressSpace(u64 *out_mapped_size, Handle handle, Handle proc_handle, u64 map_addr, u64 dev_size, u64 dev_addr, u32 perm) { return ::svcMapDeviceAddressSpace(out_mapped_size, handle, proc_handle, map_addr, dev_size, dev_addr, perm); } -Result UnmapDeviceAddressSpace(Handle handle, Handle proc_handle, u64 map_addr, u64 map_size, u64 dev_addr) { return ::svcUnmapDeviceAddressSpace(handle, proc_handle, map_addr, map_size, dev_addr); } -Result InvalidateProcessDataCache(Handle process, uintptr_t address, size_t size) { return ::svcInvalidateProcessDataCache(process, address, size); } -Result StoreProcessDataCache(Handle process, uintptr_t address, size_t size) { return ::svcStoreProcessDataCache(process, address, size); } -Result FlushProcessDataCache(Handle process, uintptr_t address, size_t size) { return ::svcFlushProcessDataCache(process, address, size); } -Result DebugActiveProcess(Handle* debug, u64 processID) { return ::svcDebugActiveProcess(debug, processID); } -Result BreakDebugProcess(Handle debug) { return ::svcBreakDebugProcess(debug); } -Result TerminateDebugProcess(Handle debug) { return ::svcTerminateDebugProcess(debug); } -Result GetDebugEvent(DebugEventInfo* event_out, Handle debug) { return ::svcGetDebugEvent(event_out, debug); } -Result ContinueDebugEvent(Handle debug, u32 flags, u64* tid_list, u32 num_tids) { return ::svcContinueDebugEvent(debug, flags, tid_list, num_tids); } -Result LegacyContinueDebugEvent(Handle debug, u32 flags, u64 threadID) { return ::svcLegacyContinueDebugEvent(debug, flags, threadID); } -Result GetDebugThreadContext(ThreadContext* ctx, Handle debug, u64 threadID, u32 flags) { return ::svcGetDebugThreadContext(ctx, debug, threadID, flags); } -Result SetDebugThreadContext(Handle debug, u64 threadID, const ThreadContext* ctx, u32 flags) { return ::svcSetDebugThreadContext(debug, threadID, ctx, flags); } -Result GetProcessList(s32 *num_out, u64 *pids_out, u32 max_pids) { return ::svcGetProcessList(num_out, pids_out, max_pids); } -Result GetThreadList(s32 *num_out, u64 *tids_out, u32 max_tids, Handle debug) { return ::svcGetThreadList(num_out, tids_out, max_tids, debug); } -Result QueryDebugProcessMemory(MemoryInfo* meminfo_ptr, u32* pageinfo, Handle debug, u64 addr) { return ::svcQueryDebugProcessMemory(meminfo_ptr, pageinfo, debug, addr); } -Result ReadDebugProcessMemory(void* buffer, Handle debug, u64 addr, u64 size) { return ::svcReadDebugProcessMemory(buffer, debug, addr, size); } -Result WriteDebugProcessMemory(Handle debug, const void* buffer, u64 addr, u64 size) { return ::svcWriteDebugProcessMemory(debug, buffer, addr, size); } -Result SetHardwareBreakPoint(u32 which, u64 flags, u64 value) { return ::svcSetHardwareBreakPoint(which, flags, value); } -Result GetDebugThreadParam(u64* out_64, u32* out_32, Handle debug, u64 threadID, DebugThreadParam param) { return ::svcGetDebugThreadParam(out_64, out_32, debug, threadID, param); } -Result GetSystemInfo(u64* out, u64 id0, Handle handle, u64 id1) { return ::svcGetSystemInfo(out, id0, handle, id1); } -Result CreatePort(Handle* portServer, Handle *portClient, s32 max_sessions, bool is_light, const char* name) { return ::svcCreatePort(portServer, portClient, max_sessions, is_light, name); } -Result ManageNamedPort(Handle* portServer, const char* name, s32 maxSessions) { return ::svcManageNamedPort(portServer, name, maxSessions); } -Result ConnectToPort(Handle* session, Handle port) { return ::svcConnectToPort(session, port); } -Result SetProcessMemoryPermission(Handle proc, u64 addr, u64 size, u32 perm) { return ::svcSetProcessMemoryPermission(proc, addr, size, perm); } -Result MapProcessMemory(void* dst, Handle proc, u64 src, u64 size) { return ::svcMapProcessMemory(dst, proc, src, size); } -Result UnmapProcessMemory(void* dst, Handle proc, u64 src, u64 size) { return ::svcUnmapProcessMemory(dst, proc, src, size); } -Result QueryProcessMemory(MemoryInfo* meminfo_ptr, u32 *pageinfo, Handle proc, u64 addr) { return ::svcQueryProcessMemory(meminfo_ptr, pageinfo, proc, addr); } -Result MapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size) { return ::svcMapProcessCodeMemory(proc, dst, src, size); } -Result UnmapProcessCodeMemory(Handle proc, u64 dst, u64 src, u64 size) { return ::svcUnmapProcessCodeMemory(proc, dst, src, size); } -Result CreateProcess(Handle* out, const void* proc_info, const u32* caps, u64 cap_num) { return ::svcCreateProcess(out, proc_info, caps, cap_num); } -Result StartProcess(Handle proc, s32 main_prio, s32 default_cpu, u32 stack_size) { return ::svcStartProcess(proc, main_prio, default_cpu, stack_size); } -Result TerminateProcess(Handle proc) { return ::svcTerminateProcess(proc); } -Result GetProcessInfo(s64 *out, Handle proc, ProcessInfoType which) { return ::svcGetProcessInfo(out, proc, which); } -Result CreateResourceLimit(Handle* out) { return ::svcCreateResourceLimit(out); } -Result SetResourceLimitLimitValue(Handle reslimit, LimitableResource which, u64 value) { return ::svcSetResourceLimitLimitValue(reslimit, which, value); } -void CallSecureMonitor(SecmonArgs* regs) { ::svcCallSecureMonitor(regs); } -Result MapInsecurePhysicalMemory(void *address, u64 size) { return ::svcMapInsecurePhysicalMemory(address, size); } -Result UnmapInsecurePhysicalMemory(void *address, u64 size) { return ::svcUnmapInsecurePhysicalMemory(address, size); } - -} // namespace svc - -namespace swkbd { - -Result Create(SwkbdConfig* c, s32 max_dictwords) { return ::swkbdCreate(c, max_dictwords); } -void Close(SwkbdConfig* c) { ::swkbdClose(c); } -void ConfigMakePresetDefault(SwkbdConfig* c) { ::swkbdConfigMakePresetDefault(c); } -void ConfigMakePresetPassword(SwkbdConfig* c) { ::swkbdConfigMakePresetPassword(c); } -void ConfigMakePresetUserName(SwkbdConfig* c) { ::swkbdConfigMakePresetUserName(c); } -void ConfigMakePresetDownloadCode(SwkbdConfig* c) { ::swkbdConfigMakePresetDownloadCode(c); } -void ConfigSetOkButtonText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetOkButtonText(c, str); } -void ConfigSetLeftOptionalSymbolKey(SwkbdConfig* c, const char* str) { ::swkbdConfigSetLeftOptionalSymbolKey(c, str); } -void ConfigSetRightOptionalSymbolKey(SwkbdConfig* c, const char* str) { ::swkbdConfigSetRightOptionalSymbolKey(c, str); } -void ConfigSetHeaderText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetHeaderText(c, str); } -void ConfigSetSubText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetSubText(c, str); } -void ConfigSetGuideText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetGuideText(c, str); } -void ConfigSetInitialText(SwkbdConfig* c, const char* str) { ::swkbdConfigSetInitialText(c, str); } -void ConfigSetDictionary(SwkbdConfig* c, const SwkbdDictWord *input, s32 entries) { ::swkbdConfigSetDictionary(c, input, entries); } -Result ConfigSetCustomizedDictionaries(SwkbdConfig* c, const SwkbdCustomizedDictionarySet *dic) { return ::swkbdConfigSetCustomizedDictionaries(c, dic); } -void ConfigSetTextCheckCallback(SwkbdConfig* c, SwkbdTextCheckCb cb) { ::swkbdConfigSetTextCheckCallback(c, cb); } -void ConfigSetType(SwkbdConfig* c, SwkbdType type) { ::swkbdConfigSetType(c, type); } -void ConfigSetDicFlag(SwkbdConfig* c, u8 flag) { ::swkbdConfigSetDicFlag(c, flag); } -void ConfigSetKeySetDisableBitmask(SwkbdConfig* c, u32 keySetDisableBitmask) { ::swkbdConfigSetKeySetDisableBitmask(c, keySetDisableBitmask); } -void ConfigSetInitialCursorPos(SwkbdConfig* c, u32 initialCursorPos) { ::swkbdConfigSetInitialCursorPos(c, initialCursorPos); } -void ConfigSetStringLenMax(SwkbdConfig* c, u32 stringLenMax) { ::swkbdConfigSetStringLenMax(c, stringLenMax); } -void ConfigSetStringLenMin(SwkbdConfig* c, u32 stringLenMin) { ::swkbdConfigSetStringLenMin(c, stringLenMin); } -void ConfigSetPasswordFlag(SwkbdConfig* c, u32 flag) { ::swkbdConfigSetPasswordFlag(c, flag); } -void ConfigSetTextDrawType(SwkbdConfig* c, SwkbdTextDrawType textDrawType) { ::swkbdConfigSetTextDrawType(c, textDrawType); } -void ConfigSetReturnButtonFlag(SwkbdConfig* c, u16 flag) { ::swkbdConfigSetReturnButtonFlag(c, flag); } -void ConfigSetBlurBackground(SwkbdConfig* c, u8 blurBackground) { ::swkbdConfigSetBlurBackground(c, blurBackground); } -void ConfigSetTextGrouping(SwkbdConfig* c, u32 index, u32 value) { ::swkbdConfigSetTextGrouping(c, index, value); } -void ConfigSetUnkFlag(SwkbdConfig* c, u8 flag) { ::swkbdConfigSetUnkFlag(c, flag); } -void ConfigSetTrigger(SwkbdConfig* c, u8 trigger) { ::swkbdConfigSetTrigger(c, trigger); } -Result Show(SwkbdConfig* c, char* out_string, size_t out_string_size) { return ::swkbdShow(c, out_string, out_string_size); } -Result InlineCreate(SwkbdInline* s) { return ::swkbdInlineCreate(s); } -Result InlineClose(SwkbdInline* s) { return ::swkbdInlineClose(s); } -Result InlineLaunch(SwkbdInline* s) { return ::swkbdInlineLaunch(s); } -Result InlineLaunchForLibraryApplet(SwkbdInline* s, u8 mode, u8 unk_x5) { return ::swkbdInlineLaunchForLibraryApplet(s, mode, unk_x5); } -void InlineGetWindowSize(s32 *width, s32 *height) { ::swkbdInlineGetWindowSize(width, height); } -Result InlineGetImageMemoryRequirement(u64 *out_size, u64 *out_alignment) { return ::swkbdInlineGetImageMemoryRequirement(out_size, out_alignment); } -Result InlineGetImage(SwkbdInline* s, void* buffer, u64 size, bool *data_available) { return ::swkbdInlineGetImage(s, buffer, size, data_available); } -s32 InlineGetMaxHeight(SwkbdInline* s) { return ::swkbdInlineGetMaxHeight(s); } -s32 InlineGetMiniaturizedHeight(SwkbdInline* s) { return ::swkbdInlineGetMiniaturizedHeight(s); } -s32 InlineGetTouchRectangles(SwkbdInline* s, SwkbdRect *keytop, SwkbdRect *footer) { return ::swkbdInlineGetTouchRectangles(s, keytop, footer); } -bool InlineIsUsedTouchPointByKeyboard(SwkbdInline* s, s32 x, s32 y) { return ::swkbdInlineIsUsedTouchPointByKeyboard(s, x, y); } -Result InlineUpdate(SwkbdInline* s, SwkbdState* out_state) { return ::swkbdInlineUpdate(s, out_state); } -void InlineSetFinishedInitializeCallback(SwkbdInline* s, VoidFn cb) { ::swkbdInlineSetFinishedInitializeCallback(s, cb); } -void InlineSetDecidedCancelCallback(SwkbdInline* s, VoidFn cb) { ::swkbdInlineSetDecidedCancelCallback(s, cb); } -void InlineSetChangedStringCallback(SwkbdInline* s, SwkbdChangedStringCb cb) { ::swkbdInlineSetChangedStringCallback(s, cb); } -void InlineSetChangedStringV2Callback(SwkbdInline* s, SwkbdChangedStringV2Cb cb) { ::swkbdInlineSetChangedStringV2Callback(s, cb); } -void InlineSetMovedCursorCallback(SwkbdInline* s, SwkbdMovedCursorCb cb) { ::swkbdInlineSetMovedCursorCallback(s, cb); } -void InlineSetMovedCursorV2Callback(SwkbdInline* s, SwkbdMovedCursorV2Cb cb) { ::swkbdInlineSetMovedCursorV2Callback(s, cb); } -void InlineSetMovedTabCallback(SwkbdInline* s, SwkbdMovedTabCb cb) { ::swkbdInlineSetMovedTabCallback(s, cb); } -void InlineSetDecidedEnterCallback(SwkbdInline* s, SwkbdDecidedEnterCb cb) { ::swkbdInlineSetDecidedEnterCallback(s, cb); } -void InlineSetReleasedUserWordInfoCallback(SwkbdInline* s, VoidFn cb) { ::swkbdInlineSetReleasedUserWordInfoCallback(s, cb); } -void InlineAppear(SwkbdInline* s, const SwkbdAppearArg* arg) { ::swkbdInlineAppear(s, arg); } -void InlineAppearEx(SwkbdInline* s, const SwkbdAppearArg* arg, u8 trigger) { ::swkbdInlineAppearEx(s, arg, trigger); } -void InlineDisappear(SwkbdInline* s) { ::swkbdInlineDisappear(s); } -void InlineMakeAppearArg(SwkbdAppearArg* arg, SwkbdType type) { ::swkbdInlineMakeAppearArg(arg, type); } -void InlineAppearArgSetOkButtonText(SwkbdAppearArg* arg, const char* str) { ::swkbdInlineAppearArgSetOkButtonText(arg, str); } -void InlineAppearArgSetLeftButtonText(SwkbdAppearArg* arg, const char* str) { ::swkbdInlineAppearArgSetLeftButtonText(arg, str); } -void InlineAppearArgSetRightButtonText(SwkbdAppearArg* arg, const char* str) { ::swkbdInlineAppearArgSetRightButtonText(arg, str); } -void InlineAppearArgSetStringLenMax(SwkbdAppearArg* arg, s32 stringLenMax) { ::swkbdInlineAppearArgSetStringLenMax(arg, stringLenMax); } -void InlineAppearArgSetStringLenMin(SwkbdAppearArg* arg, s32 stringLenMin) { ::swkbdInlineAppearArgSetStringLenMin(arg, stringLenMin); } -void InlineSetVolume(SwkbdInline* s, float volume) { ::swkbdInlineSetVolume(s, volume); } -void InlineSetInputText(SwkbdInline* s, const char* str) { ::swkbdInlineSetInputText(s, str); } -void InlineSetCursorPos(SwkbdInline* s, s32 pos) { ::swkbdInlineSetCursorPos(s, pos); } -Result InlineSetUserWordInfo(SwkbdInline* s, const SwkbdDictWord *input, s32 entries) { return ::swkbdInlineSetUserWordInfo(s, input, entries); } -Result InlineUnsetUserWordInfo(SwkbdInline* s) { return ::swkbdInlineUnsetUserWordInfo(s); } -void InlineSetUtf8Mode(SwkbdInline* s, bool flag) { ::swkbdInlineSetUtf8Mode(s, flag); } -Result InlineSetCustomizeDic(SwkbdInline* s, void* buffer, size_t size, SwkbdCustomizeDicInfo *info) { return ::swkbdInlineSetCustomizeDic(s, buffer, size, info); } -void InlineUnsetCustomizeDic(SwkbdInline* s) { ::swkbdInlineUnsetCustomizeDic(s); } -Result InlineSetCustomizedDictionaries(SwkbdInline* s, const SwkbdCustomizedDictionarySet *dic) { return ::swkbdInlineSetCustomizedDictionaries(s, dic); } -Result InlineUnsetCustomizedDictionaries(SwkbdInline* s) { return ::swkbdInlineUnsetCustomizedDictionaries(s); } -void InlineSetInputModeFadeType(SwkbdInline* s, u8 type) { ::swkbdInlineSetInputModeFadeType(s, type); } -void InlineSetAlphaEnabledInInputMode(SwkbdInline* s, bool flag) { ::swkbdInlineSetAlphaEnabledInInputMode(s, flag); } -void InlineSetKeytopBgAlpha(SwkbdInline* s, float alpha) { ::swkbdInlineSetKeytopBgAlpha(s, alpha); } -void InlineSetFooterBgAlpha(SwkbdInline* s, float alpha) { ::swkbdInlineSetFooterBgAlpha(s, alpha); } -void InlineSetKeytopScale(SwkbdInline* s, float scale) { ::swkbdInlineSetKeytopScale(s, scale); } -void InlineSetKeytopTranslate(SwkbdInline* s, float x, float y) { ::swkbdInlineSetKeytopTranslate(s, x, y); } -void InlineSetKeytopAsFloating(SwkbdInline* s, bool flag) { ::swkbdInlineSetKeytopAsFloating(s, flag); } -void InlineSetFooterScalable(SwkbdInline* s, bool flag) { ::swkbdInlineSetFooterScalable(s, flag); } -void InlineSetTouchFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetTouchFlag(s, flag); } -void InlineSetHardwareKeyboardFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetHardwareKeyboardFlag(s, flag); } -void InlineSetDirectionalButtonAssignFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetDirectionalButtonAssignFlag(s, flag); } -void InlineSetSeGroup(SwkbdInline* s, u8 seGroup, bool flag) { ::swkbdInlineSetSeGroup(s, seGroup, flag); } -void InlineSetBackspaceFlag(SwkbdInline* s, bool flag) { ::swkbdInlineSetBackspaceFlag(s, flag); } - -} // namespace swkbd - -namespace tc { - -Result Initialize(void) { return ::tcInitialize(); } -void Exit(void) { ::tcExit(); } -Service* GetServiceSession(void) { return ::tcGetServiceSession(); } -Result EnableFanControl(void) { return ::tcEnableFanControl(); } -Result DisableFanControl(void) { return ::tcDisableFanControl(); } -Result IsFanControlEnabled(bool *status) { return ::tcIsFanControlEnabled(status); } -Result GetSkinTemperatureMilliC(s32 *skinTemp) { return ::tcGetSkinTemperatureMilliC(skinTemp); } - -} // namespace tc - -namespace thread { - -bool ContextIsAArch64(const ThreadContext *ctx) { return ::threadContextIsAArch64(ctx); } -bool ExceptionIsAArch64(const ThreadExceptionDump *ctx) { return ::threadExceptionIsAArch64(ctx); } -Result Create(Thread* t, ThreadFunc entry, void* arg, void *stack_mem, size_t stack_sz, int prio, int cpuid) { return ::threadCreate(t, entry, arg, stack_mem, stack_sz, prio, cpuid); } -Result Start(Thread* t) { return ::threadStart(t); } -[[noreturn]] void Exit(void) { ::threadExit(); } -Result WaitForExit(Thread* t) { return ::threadWaitForExit(t); } -Result Close(Thread* t) { return ::threadClose(t); } -Result Pause(Thread* t) { return ::threadPause(t); } -Result Resume(Thread* t) { return ::threadResume(t); } -Result DumpContext(ThreadContext* ctx, Thread* t) { return ::threadDumpContext(ctx, t); } -Thread * GetSelf(void) { return ::threadGetSelf(); } -Handle GetCurHandle(void) { return ::threadGetCurHandle(); } -s32 TlsAlloc(void (* destructor)(void*)) { return ::threadTlsAlloc(destructor); } -void* TlsGet(s32 slot_id) { return ::threadTlsGet(slot_id); } -void TlsSet(s32 slot_id, void* value) { ::threadTlsSet(slot_id, value); } -void TlsFree(s32 slot_id) { ::threadTlsFree(slot_id); } - -} // namespace thread - -namespace time { - -Result Initialize(void) { return ::timeInitialize(); } -void Exit(void) { ::timeExit(); } -Service* GetServiceSession(void) { return ::timeGetServiceSession(); } -Service* GetServiceSession_SystemClock(TimeType type) { return ::timeGetServiceSession_SystemClock(type); } -Service* GetServiceSession_SteadyClock(void) { return ::timeGetServiceSession_SteadyClock(); } -Service* GetServiceSession_TimeZoneService(void) { return ::timeGetServiceSession_TimeZoneService(); } -void* GetSharedmemAddr(void) { return ::timeGetSharedmemAddr(); } -Result GetStandardSteadyClockTimePoint(TimeSteadyClockTimePoint *out) { return ::timeGetStandardSteadyClockTimePoint(out); } -Result GetStandardSteadyClockInternalOffset(s64 *out) { return ::timeGetStandardSteadyClockInternalOffset(out); } -Result GetCurrentTime(TimeType type, u64 *timestamp) { return ::timeGetCurrentTime(type, timestamp); } -Result SetCurrentTime(TimeType type, u64 timestamp) { return ::timeSetCurrentTime(type, timestamp); } -Result GetDeviceLocationName(TimeLocationName *name) { return ::timeGetDeviceLocationName(name); } -Result SetDeviceLocationName(const TimeLocationName *name) { return ::timeSetDeviceLocationName(name); } -Result GetTotalLocationNameCount(s32 *total_location_name_count) { return ::timeGetTotalLocationNameCount(total_location_name_count); } -Result LoadLocationNameList(s32 index, TimeLocationName *location_name_array, s32 location_name_max, s32 *location_name_count) { return ::timeLoadLocationNameList(index, location_name_array, location_name_max, location_name_count); } -Result LoadTimeZoneRule(const TimeLocationName *name, TimeZoneRule *rule) { return ::timeLoadTimeZoneRule(name, rule); } -Result ToCalendarTime(const TimeZoneRule *rule, u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info) { return ::timeToCalendarTime(rule, timestamp, caltime, info); } -Result ToCalendarTimeWithMyRule(u64 timestamp, TimeCalendarTime *caltime, TimeCalendarAdditionalInfo *info) { return ::timeToCalendarTimeWithMyRule(timestamp, caltime, info); } -Result ToPosixTime(const TimeZoneRule *rule, const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count) { return ::timeToPosixTime(rule, caltime, timestamp_list, timestamp_list_count, timestamp_count); } -Result ToPosixTimeWithMyRule(const TimeCalendarTime *caltime, u64 *timestamp_list, s32 timestamp_list_count, s32 *timestamp_count) { return ::timeToPosixTimeWithMyRule(caltime, timestamp_list, timestamp_list_count, timestamp_count); } - -} // namespace time - -namespace tipc { - -void Create(TipcService* s, Handle h) { ::tipcCreate(s, h); } -void Close(TipcService* s) { ::tipcClose(s); } -void RequestInBuffer(HipcRequest* req, const void* buffer, size_t size, HipcBufferMode mode) { ::tipcRequestInBuffer(req, buffer, size, mode); } -void RequestOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::tipcRequestOutBuffer(req, buffer, size, mode); } -void RequestInOutBuffer(HipcRequest* req, void* buffer, size_t size, HipcBufferMode mode) { ::tipcRequestInOutBuffer(req, buffer, size, mode); } -void RequestHandle(HipcRequest* req, Handle handle) { ::tipcRequestHandle(req, handle); } -void RequestFormatProcessBuffer(TipcRequestFormat* fmt, u32 attr) { ::_tipcRequestFormatProcessBuffer(fmt, attr); } -void RequestProcessBuffer(HipcRequest* req, const SfBuffer* buf, u32 attr) { ::_tipcRequestProcessBuffer(req, buf, attr); } -void* MakeRequest(u32 request_id, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_handles, const Handle* handles) { return ::tipcMakeRequest(request_id, data_size, send_pid, buffer_attrs, buffers, num_handles, handles); } -Handle ResponseGetCopyHandle(HipcResponse* res) { return ::tipcResponseGetCopyHandle(res); } -Handle ResponseGetMoveHandle(HipcResponse* res) { return ::tipcResponseGetMoveHandle(res); } -void ResponseGetHandle(HipcResponse* res, SfOutHandleAttr type, Handle* out) { ::_tipcResponseGetHandle(res, type, out); } -Result ParseResponse(u32 out_size, void** out_data, u32 num_out_objects, TipcService* out_objects, const SfOutHandleAttrs out_handle_attrs, Handle* out_handles) { return ::tipcParseResponse(out_size, out_data, num_out_objects, out_objects, out_handle_attrs, out_handles); } -Result DispatchImpl(TipcService* s, u32 request_id, const void* in_data, u32 in_data_size, void* out_data, u32 out_data_size, TipcDispatchParams disp) { return ::tipcDispatchImpl(s, request_id, in_data, in_data_size, out_data, out_data_size, disp); } - -} // namespace tipc - -namespace tmem { - -Result Create(TransferMemory* t, size_t size, Permission perm) { return ::tmemCreate(t, size, perm); } -Result CreateFromMemory(TransferMemory* t, void* buf, size_t size, Permission perm) { return ::tmemCreateFromMemory(t, buf, size, perm); } -void LoadRemote(TransferMemory* t, Handle handle, size_t size, Permission perm) { ::tmemLoadRemote(t, handle, size, perm); } -Result Map(TransferMemory* t) { return ::tmemMap(t); } -Result Unmap(TransferMemory* t) { return ::tmemUnmap(t); } -void* GetAddr(TransferMemory* t) { return ::tmemGetAddr(t); } -Result CloseHandle(TransferMemory* t) { return ::tmemCloseHandle(t); } -Result WaitForPermission(TransferMemory* t, Permission perm) { return ::tmemWaitForPermission(t, perm); } -Result Close(TransferMemory* t) { return ::tmemClose(t); } - -} // namespace tmem - -namespace ts { - -Result Initialize(void) { return ::tsInitialize(); } -void Exit(void) { ::tsExit(); } -Service* GetServiceSession(void) { return ::tsGetServiceSession(); } -Result GetTemperatureRange(TsLocation location, s32 *min_temperature, s32 *max_temperature) { return ::tsGetTemperatureRange(location, min_temperature, max_temperature); } -Result GetTemperature(TsLocation location, s32 *temperature) { return ::tsGetTemperature(location, temperature); } -Result GetTemperatureMilliC(TsLocation location, s32 *temperature) { return ::tsGetTemperatureMilliC(location, temperature); } -Result OpenSession(TsSession *s, u32 device_code) { return ::tsOpenSession(s, device_code); } -Result SessionGetTemperature(TsSession *s, float *temperature) { return ::tsSessionGetTemperature(s, temperature); } -void SessionClose(TsSession *s) { ::tsSessionClose(s); } - -} // namespace ts - -namespace uart { - -Result Initialize(void) { return ::uartInitialize(); } -void Exit(void) { ::uartExit(); } -Service* GetServiceSession(void) { return ::uartGetServiceSession(); } -Result HasPort(UartPort port, bool *out) { return ::uartHasPort(port, out); } -Result HasPortForDev(UartPortForDev port, bool *out) { return ::uartHasPortForDev(port, out); } -Result IsSupportedBaudRate(UartPort port, u32 baud_rate, bool *out) { return ::uartIsSupportedBaudRate(port, baud_rate, out); } -Result IsSupportedBaudRateForDev(UartPortForDev port, u32 baud_rate, bool *out) { return ::uartIsSupportedBaudRateForDev(port, baud_rate, out); } -Result IsSupportedFlowControlMode(UartPort port, UartFlowControlMode flow_control_mode, bool *out) { return ::uartIsSupportedFlowControlMode(port, flow_control_mode, out); } -Result IsSupportedFlowControlModeForDev(UartPortForDev port, UartFlowControlMode flow_control_mode, bool *out) { return ::uartIsSupportedFlowControlModeForDev(port, flow_control_mode, out); } -Result CreatePortSession(UartPortSession *s) { return ::uartCreatePortSession(s); } -Result IsSupportedPortEvent(UartPort port, UartPortEventType port_event_type, bool *out) { return ::uartIsSupportedPortEvent(port, port_event_type, out); } -Result IsSupportedPortEventForDev(UartPortForDev port, UartPortEventType port_event_type, bool *out) { return ::uartIsSupportedPortEventForDev(port, port_event_type, out); } -Result IsSupportedDeviceVariation(UartPort port, u32 device_variation, bool *out) { return ::uartIsSupportedDeviceVariation(port, device_variation, out); } -Result IsSupportedDeviceVariationForDev(UartPortForDev port, u32 device_variation, bool *out) { return ::uartIsSupportedDeviceVariationForDev(port, device_variation, out); } -void PortSessionClose(UartPortSession* s) { ::uartPortSessionClose(s); } -Result PortSessionOpenPort(UartPortSession* s, bool *out, UartPort port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length) { return ::uartPortSessionOpenPort(s, out, port, baud_rate, flow_control_mode, device_variation, is_invert_tx, is_invert_rx, is_invert_rts, is_invert_cts, send_buffer, send_buffer_length, receive_buffer, receive_buffer_length); } -Result PortSessionOpenPortForDev(UartPortSession* s, bool *out, UartPortForDev port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length) { return ::uartPortSessionOpenPortForDev(s, out, port, baud_rate, flow_control_mode, device_variation, is_invert_tx, is_invert_rx, is_invert_rts, is_invert_cts, send_buffer, send_buffer_length, receive_buffer, receive_buffer_length); } -Result PortSessionGetWritableLength(UartPortSession* s, u64 *out) { return ::uartPortSessionGetWritableLength(s, out); } -Result PortSessionSend(UartPortSession* s, const void* in_data, size_t size, u64 *out) { return ::uartPortSessionSend(s, in_data, size, out); } -Result PortSessionGetReadableLength(UartPortSession* s, u64 *out) { return ::uartPortSessionGetReadableLength(s, out); } -Result PortSessionReceive(UartPortSession* s, void* out_data, size_t size, u64 *out) { return ::uartPortSessionReceive(s, out_data, size, out); } -Result PortSessionBindPortEvent(UartPortSession* s, UartPortEventType port_event_type, s64 threshold, bool *out, Event *out_event) { return ::uartPortSessionBindPortEvent(s, port_event_type, threshold, out, out_event); } -Result PortSessionUnbindPortEvent(UartPortSession* s, UartPortEventType port_event_type, bool *out) { return ::uartPortSessionUnbindPortEvent(s, port_event_type, out); } - -} // namespace uart - -namespace uevent { - -void Create(UEvent* e, bool auto_clear) { ::ueventCreate(e, auto_clear); } -void Clear(UEvent* e) { ::ueventClear(e); } -void Signal(UEvent* e) { ::ueventSignal(e); } - -} // namespace uevent - -namespace usb { - -Result CommsInitialize(void) { return ::usbCommsInitialize(); } -Result CommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *infos, u16 idVendor, u16 idProduct) { return ::usbCommsInitializeEx(num_interfaces, infos, idVendor, idProduct); } -void CommsExit(void) { ::usbCommsExit(); } -void CommsSetErrorHandling(bool flag) { ::usbCommsSetErrorHandling(flag); } -size_t CommsRead(void* buffer, size_t size) { return ::usbCommsRead(buffer, size); } -size_t CommsWrite(const void* buffer, size_t size) { return ::usbCommsWrite(buffer, size); } -size_t CommsReadEx(void* buffer, size_t size, u32 interface) { return ::usbCommsReadEx(buffer, size, interface); } -size_t CommsWriteEx(const void* buffer, size_t size, u32 interface) { return ::usbCommsWriteEx(buffer, size, interface); } -Event * CommsGetReadCompletionEvent(u32 interface) { return ::usbCommsGetReadCompletionEvent(interface); } -Result CommsReadAsync(void *buffer, size_t size, u32 *urbId, u32 interface) { return ::usbCommsReadAsync(buffer, size, urbId, interface); } -Result CommsGetReadResult(u32 urbId, u32 *transferredSize, u32 interface) { return ::usbCommsGetReadResult(urbId, transferredSize, interface); } -Event * CommsGetWriteCompletionEvent(u32 interface) { return ::usbCommsGetWriteCompletionEvent(interface); } -Result CommsWriteAsync(void *buffer, size_t size, u32 *urbId, u32 interface) { return ::usbCommsWriteAsync(buffer, size, urbId, interface); } -Result CommsGetWriteResult(u32 urbId, u32 *transferredSize, u32 interface) { return ::usbCommsGetWriteResult(urbId, transferredSize, interface); } -Result DsInitialize(void) { return ::usbDsInitialize(); } -void DsExit(void) { ::usbDsExit(); } -Service* DsGetServiceSession(void) { return ::usbDsGetServiceSession(); } -Result DsWaitReady(u64 timeout) { return ::usbDsWaitReady(timeout); } -Result DsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize) { return ::usbDsParseReportData(reportdata, urbId, requestedSize, transferredSize); } -Event* DsGetStateChangeEvent(void) { return ::usbDsGetStateChangeEvent(); } -Result DsGetState(UsbState* out) { return ::usbDsGetState(out); } -Result DsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name) { return ::usbDsGetDsInterface(out, descriptor, interface_name); } -Result DsSetVidPidBcd(const UsbDsDeviceInfo* deviceinfo) { return ::usbDsSetVidPidBcd(deviceinfo); } -Result DsRegisterInterface(UsbDsInterface** out) { return ::usbDsRegisterInterface(out); } -Result DsRegisterInterfaceEx(UsbDsInterface** out, u8 intf_num) { return ::usbDsRegisterInterfaceEx(out, intf_num); } -Result DsClearDeviceData(void) { return ::usbDsClearDeviceData(); } -Result DsAddUsbStringDescriptor(u8* out_index, const char* string) { return ::usbDsAddUsbStringDescriptor(out_index, string); } -Result DsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs) { return ::usbDsAddUsbLanguageStringDescriptor(out_index, lang_ids, num_langs); } -Result DsDeleteUsbStringDescriptor(u8 index) { return ::usbDsDeleteUsbStringDescriptor(index); } -Result DsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor* descriptor) { return ::usbDsSetUsbDeviceDescriptor(speed, descriptor); } -Result DsSetBinaryObjectStore(const void* bos, size_t bos_size) { return ::usbDsSetBinaryObjectStore(bos, bos_size); } -Result DsEnable(void) { return ::usbDsEnable(); } -Result DsDisable(void) { return ::usbDsDisable(); } -Result DsGetSpeed(UsbDeviceSpeed *out) { return ::usbDsGetSpeed(out); } -void DsInterface_Close(UsbDsInterface* interface) { ::usbDsInterface_Close(interface); } -Result DsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size) { return ::usbDsInterface_GetSetupPacket(interface, buffer, size); } -Result DsInterface_EnableInterface(UsbDsInterface* interface) { return ::usbDsInterface_EnableInterface(interface); } -Result DsInterface_DisableInterface(UsbDsInterface* interface) { return ::usbDsInterface_DisableInterface(interface); } -Result DsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId) { return ::usbDsInterface_CtrlInPostBufferAsync(interface, buffer, size, urbId); } -Result DsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId) { return ::usbDsInterface_CtrlOutPostBufferAsync(interface, buffer, size, urbId); } -Result DsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out) { return ::usbDsInterface_GetCtrlInReportData(interface, out); } -Result DsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out) { return ::usbDsInterface_GetCtrlOutReportData(interface, out); } -Result DsInterface_StallCtrl(UsbDsInterface* interface) { return ::usbDsInterface_StallCtrl(interface); } -Result DsInterface_GetDsEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, struct usb_endpoint_descriptor* descriptor) { return ::usbDsInterface_GetDsEndpoint(interface, endpoint, descriptor); } -Result DsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address) { return ::usbDsInterface_RegisterEndpoint(interface, endpoint, endpoint_address); } -Result DsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, const void* buffer, size_t size) { return ::usbDsInterface_AppendConfigurationData(interface, speed, buffer, size); } -void DsEndpoint_Close(UsbDsEndpoint* endpoint) { ::usbDsEndpoint_Close(endpoint); } -Result DsEndpoint_Cancel(UsbDsEndpoint* endpoint) { return ::usbDsEndpoint_Cancel(endpoint); } -Result DsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId) { return ::usbDsEndpoint_PostBufferAsync(endpoint, buffer, size, urbId); } -Result DsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out) { return ::usbDsEndpoint_GetReportData(endpoint, out); } -Result DsEndpoint_Stall(UsbDsEndpoint* endpoint) { return ::usbDsEndpoint_Stall(endpoint); } -Result DsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt) { return ::usbDsEndpoint_SetZlt(endpoint, zlt); } -Result HsInitialize(void) { return ::usbHsInitialize(); } -void HsExit(void) { ::usbHsExit(); } -Service* HsGetServiceSession(void) { return ::usbHsGetServiceSession(); } -Event* HsGetInterfaceStateChangeEvent(void) { return ::usbHsGetInterfaceStateChangeEvent(); } -Result HsQueryAllInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries) { return ::usbHsQueryAllInterfaces(filter, interfaces, interfaces_maxsize, total_entries); } -Result HsQueryAvailableInterfaces(const UsbHsInterfaceFilter* filter, UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries) { return ::usbHsQueryAvailableInterfaces(filter, interfaces, interfaces_maxsize, total_entries); } -Result HsQueryAcquiredInterfaces(UsbHsInterface* interfaces, size_t interfaces_maxsize, s32* total_entries) { return ::usbHsQueryAcquiredInterfaces(interfaces, interfaces_maxsize, total_entries); } -Result HsCreateInterfaceAvailableEvent(Event* out_event, bool autoclear, u8 index, const UsbHsInterfaceFilter* filter) { return ::usbHsCreateInterfaceAvailableEvent(out_event, autoclear, index, filter); } -Result HsDestroyInterfaceAvailableEvent(Event* event, u8 index) { return ::usbHsDestroyInterfaceAvailableEvent(event, index); } -Result HsAcquireUsbIf(UsbHsClientIfSession* s, UsbHsInterface *interface) { return ::usbHsAcquireUsbIf(s, interface); } -void HsIfClose(UsbHsClientIfSession* s) { ::usbHsIfClose(s); } -bool HsIfIsActive(UsbHsClientIfSession* s) { return ::usbHsIfIsActive(s); } -s32 HsIfGetID(UsbHsClientIfSession* s) { return ::usbHsIfGetID(s); } -Result HsIfSetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id) { return ::usbHsIfSetInterface(s, inf, id); } -Result HsIfGetInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf) { return ::usbHsIfGetInterface(s, inf); } -Result HsIfGetAlternateInterface(UsbHsClientIfSession* s, UsbHsInterfaceInfo* inf, u8 id) { return ::usbHsIfGetAlternateInterface(s, inf, id); } -Result HsIfGetCurrentFrame(UsbHsClientIfSession* s, u32* out) { return ::usbHsIfGetCurrentFrame(s, out); } -Result HsIfCtrlXfer(UsbHsClientIfSession* s, u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, void* buffer, u32* transferredSize) { return ::usbHsIfCtrlXfer(s, bmRequestType, bRequest, wValue, wIndex, wLength, buffer, transferredSize); } -Result HsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 maxUrbCount, u32 maxXferSize, struct usb_endpoint_descriptor *desc) { return ::usbHsIfOpenUsbEp(s, ep, maxUrbCount, maxXferSize, desc); } -Result HsIfResetDevice(UsbHsClientIfSession* s) { return ::usbHsIfResetDevice(s); } -void HsEpClose(UsbHsClientEpSession* s) { ::usbHsEpClose(s); } -Event* HsEpGetXferEvent(UsbHsClientEpSession* s) { return ::usbHsEpGetXferEvent(s); } -u32 HsEpGetReportRingSize(UsbHsClientEpSession* s) { return ::usbHsEpGetReportRingSize(s); } -Result HsEpPostBufferAsync(UsbHsClientEpSession* s, void* buffer, u32 size, u64 id, u32* xferId) { return ::usbHsEpPostBufferAsync(s, buffer, size, id, xferId); } -Result HsEpGetXferReport(UsbHsClientEpSession* s, UsbHsXferReport* reports, u32 max_reports, u32* count) { return ::usbHsEpGetXferReport(s, reports, max_reports, count); } -Result HsEpPostBuffer(UsbHsClientEpSession* s, void* buffer, u32 size, u32* transferredSize) { return ::usbHsEpPostBuffer(s, buffer, size, transferredSize); } -Result HsEpBatchBufferAsync(UsbHsClientEpSession* s, void* buffer, u32* urbs, u32 urbCount, u64 id, u32 unk1, u32 unk2, u32* xferId) { return ::usbHsEpBatchBufferAsync(s, buffer, urbs, urbCount, id, unk1, unk2, xferId); } -Result HsEpCreateSmmuSpace(UsbHsClientEpSession* s, void* buffer, u32 size) { return ::usbHsEpCreateSmmuSpace(s, buffer, size); } -Result HsEpShareReportRing(UsbHsClientEpSession* s, void* buffer, size_t size) { return ::usbHsEpShareReportRing(s, buffer, size); } - -} // namespace usb - -namespace utf { - -ssize_t DecodeUtf8(uint32_t *out, const uint8_t *in) { return ::decode_utf8(out, in); } -ssize_t DecodeUtf16(uint32_t *out, const uint16_t *in) { return ::decode_utf16(out, in); } -ssize_t EncodeUtf8(uint8_t *out, uint32_t in) { return ::encode_utf8(out, in); } -ssize_t EncodeUtf16(uint16_t *out, uint32_t in) { return ::encode_utf16(out, in); } -ssize_t Utf8ToUtf16(uint16_t *out, const uint8_t *in, size_t len) { return ::utf8_to_utf16(out, in, len); } -ssize_t Utf8ToUtf32(uint32_t *out, const uint8_t *in, size_t len) { return ::utf8_to_utf32(out, in, len); } -ssize_t Utf16ToUtf8(uint8_t *out, const uint16_t *in, size_t len) { return ::utf16_to_utf8(out, in, len); } -ssize_t Utf16ToUtf32(uint32_t *out, const uint16_t *in, size_t len) { return ::utf16_to_utf32(out, in, len); } -ssize_t Utf32ToUtf8(uint8_t *out, const uint32_t *in, size_t len) { return ::utf32_to_utf8(out, in, len); } -ssize_t Utf32ToUtf16(uint16_t *out, const uint32_t *in, size_t len) { return ::utf32_to_utf16(out, in, len); } - -} // namespace utf - -namespace utimer { - -void Create(UTimer* t, u64 interval, TimerType type) { ::utimerCreate(t, interval, type); } -void Start(UTimer* t) { ::utimerStart(t); } -void Stop(UTimer* t) { ::utimerStop(t); } - -} // namespace utimer - -namespace vi { - -Result Initialize(ViServiceType service_type) { return ::viInitialize(service_type); } -void Exit(void) { ::viExit(); } -Service* GetSession_IApplicationDisplayService(void) { return ::viGetSession_IApplicationDisplayService(); } -Service* GetSession_IHOSBinderDriverRelay(void) { return ::viGetSession_IHOSBinderDriverRelay(); } -Service* GetSession_ISystemDisplayService(void) { return ::viGetSession_ISystemDisplayService(); } -Service* GetSession_IManagerDisplayService(void) { return ::viGetSession_IManagerDisplayService(); } -Service* GetSession_IHOSBinderDriverIndirect(void) { return ::viGetSession_IHOSBinderDriverIndirect(); } -Result SetContentVisibility(bool v) { return ::viSetContentVisibility(v); } -Result OpenDisplay(const char *display_name, ViDisplay *display) { return ::viOpenDisplay(display_name, display); } -Result CloseDisplay(ViDisplay *display) { return ::viCloseDisplay(display); } -Result OpenDefaultDisplay(ViDisplay *display) { return ::viOpenDefaultDisplay(display); } -Result GetDisplayResolution(ViDisplay *display, s32 *width, s32 *height) { return ::viGetDisplayResolution(display, width, height); } -Result GetDisplayLogicalResolution(ViDisplay *display, s32 *width, s32 *height) { return ::viGetDisplayLogicalResolution(display, width, height); } -Result SetDisplayMagnification(ViDisplay *display, s32 x, s32 y, s32 width, s32 height) { return ::viSetDisplayMagnification(display, x, y, width, height); } -Result GetDisplayVsyncEvent(ViDisplay *display, Event *event_out) { return ::viGetDisplayVsyncEvent(display, event_out); } -Result SetDisplayPowerState(ViDisplay *display, ViPowerState state) { return ::viSetDisplayPowerState(display, state); } -Result SetDisplayAlpha(ViDisplay *display, float alpha) { return ::viSetDisplayAlpha(display, alpha); } -Result GetZOrderCountMin(ViDisplay *display, s32 *z) { return ::viGetZOrderCountMin(display, z); } -Result GetZOrderCountMax(ViDisplay *display, s32 *z) { return ::viGetZOrderCountMax(display, z); } -Result CreateLayer(const ViDisplay *display, ViLayer *layer) { return ::viCreateLayer(display, layer); } -Result CreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id) { return ::viCreateManagedLayer(display, layer_flags, aruid, layer_id); } -Result SetLayerSize(ViLayer *layer, s32 width, s32 height) { return ::viSetLayerSize(layer, width, height); } -Result SetLayerZ(ViLayer *layer, s32 z) { return ::viSetLayerZ(layer, z); } -Result SetLayerPosition(ViLayer *layer, float x, float y) { return ::viSetLayerPosition(layer, x, y); } -Result CloseLayer(ViLayer *layer) { return ::viCloseLayer(layer); } -Result DestroyManagedLayer(ViLayer *layer) { return ::viDestroyManagedLayer(layer); } -Result SetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode) { return ::viSetLayerScalingMode(layer, scaling_mode); } -Result GetIndirectLayerImageMap(void* buffer, size_t size, s32 width, s32 height, u64 IndirectLayerConsumerHandle, u64 *out_size, u64 *out_stride) { return ::viGetIndirectLayerImageMap(buffer, size, width, height, IndirectLayerConsumerHandle, out_size, out_stride); } -Result GetIndirectLayerImageRequiredMemoryInfo(s32 width, s32 height, u64 *out_size, u64 *out_alignment) { return ::viGetIndirectLayerImageRequiredMemoryInfo(width, height, out_size, out_alignment); } -Result ManagerPrepareFatal(void) { return ::viManagerPrepareFatal(); } -Result ManagerShowFatal(void) { return ::viManagerShowFatal(); } -Result ManagerDrawFatalRectangle(s32 x, s32 y, s32 end_x, s32 end_y, ViColorRgba4444 color) { return ::viManagerDrawFatalRectangle(x, y, end_x, end_y, color); } -Result ManagerDrawFatalText32(s32 *out_advance, s32 x, s32 y, const u32 *utf32_codepoints, size_t num_codepoints, float scale_x, float scale_y, PlSharedFontType font_type, ViColorRgba8888 bg_color, ViColorRgba8888 fg_color, s32 initial_advance) { return ::viManagerDrawFatalText32(out_advance, x, y, utf32_codepoints, num_codepoints, scale_x, scale_y, font_type, bg_color, fg_color, initial_advance); } - -} // namespace vi - -namespace virtmem { - -void Lock(void) { ::virtmemLock(); } -void Unlock(void) { ::virtmemUnlock(); } -void* FindAslr(size_t size, size_t guard_size) { return ::virtmemFindAslr(size, guard_size); } -void* FindStack(size_t size, size_t guard_size) { return ::virtmemFindStack(size, guard_size); } -void* FindCodeMemory(size_t size, size_t guard_size) { return ::virtmemFindCodeMemory(size, guard_size); } -VirtmemReservation* AddReservation(void* mem, size_t size) { return ::virtmemAddReservation(mem, size); } -void RemoveReservation(VirtmemReservation* rv) { ::virtmemRemoveReservation(rv); } - -} // namespace virtmem - -namespace wait { - -Result Objects(s32* idx_out, const Waiter* objects, s32 num_objects, u64 timeout) { return ::waitObjects(idx_out, objects, num_objects, timeout); } -Result Handles(s32* idx_out, const Handle* handles, s32 num_handles, u64 timeout) { return ::waitHandles(idx_out, handles, num_handles, timeout); } -Result Single(Waiter w, u64 timeout) { return ::waitSingle(w, timeout); } -Result SingleHandle(Handle h, u64 timeout) { return ::waitSingleHandle(h, timeout); } - -} // namespace wait - -namespace waiter { - -Waiter ForEvent(Event* t) { return ::waiterForEvent(t); } -Waiter ForThread(Thread* t) { return ::waiterForThread(t); } -Waiter ForUEvent(UEvent* e) { return ::waiterForUEvent(e); } -Waiter ForUTimer(UTimer* t) { return ::waiterForUTimer(t); } -Waiter ForHandle(Handle h) { return ::waiterForHandle(h); } - -} // namespace waiter - -namespace web { - -void WifiCreate(WebWifiConfig* config, const char* conntest_url, const char* initial_url, Uuid uuid, u32 rev) { ::webWifiCreate(config, conntest_url, initial_url, uuid, rev); } -Result WifiShow(WebWifiConfig* config, WebWifiReturnValue *out) { return ::webWifiShow(config, out); } -Result PageCreate(WebCommonConfig* config, const char* url) { return ::webPageCreate(config, url); } -Result NewsCreate(WebCommonConfig* config, const char* url) { return ::webNewsCreate(config, url); } -Result YouTubeVideoCreate(WebCommonConfig* config, const char* url) { return ::webYouTubeVideoCreate(config, url); } -Result OfflineCreate(WebCommonConfig* config, WebDocumentKind docKind, u64 id, const char* docPath) { return ::webOfflineCreate(config, docKind, id, docPath); } -Result ShareCreate(WebCommonConfig* config, WebShareStartPage page) { return ::webShareCreate(config, page); } -Result LobbyCreate(WebCommonConfig* config) { return ::webLobbyCreate(config); } -Result ConfigSetCallbackUrl(WebCommonConfig* config, const char* url) { return ::webConfigSetCallbackUrl(config, url); } -Result ConfigSetCallbackableUrl(WebCommonConfig* config, const char* url) { return ::webConfigSetCallbackableUrl(config, url); } -Result ConfigSetWhitelist(WebCommonConfig* config, const char* whitelist) { return ::webConfigSetWhitelist(config, whitelist); } -Result ConfigSetUid(WebCommonConfig* config, AccountUid uid) { return ::webConfigSetUid(config, uid); } -Result ConfigSetAlbumEntry(WebCommonConfig* config, const CapsAlbumEntry *entry) { return ::webConfigSetAlbumEntry(config, entry); } -Result ConfigSetScreenShot(WebCommonConfig* config, bool flag) { return ::webConfigSetScreenShot(config, flag); } -Result ConfigSetEcClientCert(WebCommonConfig* config, bool flag) { return ::webConfigSetEcClientCert(config, flag); } -Result ConfigSetPlayReport(WebCommonConfig* config, bool flag) { return ::webConfigSetPlayReport(config, flag); } -Result ConfigSetBootDisplayKind(WebCommonConfig* config, WebBootDisplayKind kind) { return ::webConfigSetBootDisplayKind(config, kind); } -Result ConfigSetBackgroundKind(WebCommonConfig* config, WebBackgroundKind kind) { return ::webConfigSetBackgroundKind(config, kind); } -Result ConfigSetFooter(WebCommonConfig* config, bool flag) { return ::webConfigSetFooter(config, flag); } -Result ConfigSetPointer(WebCommonConfig* config, bool flag) { return ::webConfigSetPointer(config, flag); } -Result ConfigSetLeftStickMode(WebCommonConfig* config, WebLeftStickMode mode) { return ::webConfigSetLeftStickMode(config, mode); } -Result ConfigSetKeyRepeatFrame(WebCommonConfig* config, s32 inval0, s32 inval1) { return ::webConfigSetKeyRepeatFrame(config, inval0, inval1); } -Result ConfigSetDisplayUrlKind(WebCommonConfig* config, bool kind) { return ::webConfigSetDisplayUrlKind(config, kind); } -Result ConfigSetBootAsMediaPlayer(WebCommonConfig* config, bool flag) { return ::webConfigSetBootAsMediaPlayer(config, flag); } -Result ConfigSetShopJump(WebCommonConfig* config, bool flag) { return ::webConfigSetShopJump(config, flag); } -Result ConfigSetMediaPlayerUserGestureRestriction(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerUserGestureRestriction(config, flag); } -Result ConfigSetMediaAutoPlay(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaAutoPlay(config, flag); } -Result ConfigSetLobbyParameter(WebCommonConfig* config, const char* str) { return ::webConfigSetLobbyParameter(config, str); } -Result ConfigSetApplicationAlbumEntry(WebCommonConfig* config, CapsApplicationAlbumEntry *entry) { return ::webConfigSetApplicationAlbumEntry(config, entry); } -Result ConfigSetJsExtension(WebCommonConfig* config, bool flag) { return ::webConfigSetJsExtension(config, flag); } -Result ConfigSetAdditionalCommentText(WebCommonConfig* config, const char* str) { return ::webConfigSetAdditionalCommentText(config, str); } -Result ConfigSetTouchEnabledOnContents(WebCommonConfig* config, bool flag) { return ::webConfigSetTouchEnabledOnContents(config, flag); } -Result ConfigSetUserAgentAdditionalString(WebCommonConfig* config, const char* str) { return ::webConfigSetUserAgentAdditionalString(config, str); } -Result ConfigSetAdditionalMediaData(WebCommonConfig* config, const u8* data, size_t size) { return ::webConfigSetAdditionalMediaData(config, data, size); } -Result ConfigSetMediaPlayerAutoClose(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerAutoClose(config, flag); } -Result ConfigSetPageCache(WebCommonConfig* config, bool flag) { return ::webConfigSetPageCache(config, flag); } -Result ConfigSetWebAudio(WebCommonConfig* config, bool flag) { return ::webConfigSetWebAudio(config, flag); } -Result ConfigSetFooterFixedKind(WebCommonConfig* config, WebFooterFixedKind kind) { return ::webConfigSetFooterFixedKind(config, kind); } -Result ConfigSetPageFade(WebCommonConfig* config, bool flag) { return ::webConfigSetPageFade(config, flag); } -Result ConfigSetMediaCreatorApplicationRatingAge(WebCommonConfig* config, const s8 *data) { return ::webConfigSetMediaCreatorApplicationRatingAge(config, data); } -Result ConfigSetBootLoadingIcon(WebCommonConfig* config, bool flag) { return ::webConfigSetBootLoadingIcon(config, flag); } -Result ConfigSetPageScrollIndicator(WebCommonConfig* config, bool flag) { return ::webConfigSetPageScrollIndicator(config, flag); } -Result ConfigSetMediaPlayerSpeedControl(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerSpeedControl(config, flag); } -Result ConfigAddAlbumEntryAndMediaData(WebCommonConfig* config, const CapsAlbumEntry *entry, const u8* data, size_t size) { return ::webConfigAddAlbumEntryAndMediaData(config, entry, data, size); } -Result ConfigSetBootFooterButtonVisible(WebCommonConfig* config, WebFooterButtonId button, bool visible) { return ::webConfigSetBootFooterButtonVisible(config, button, visible); } -Result ConfigSetOverrideWebAudioVolume(WebCommonConfig* config, float value) { return ::webConfigSetOverrideWebAudioVolume(config, value); } -Result ConfigSetOverrideMediaAudioVolume(WebCommonConfig* config, float value) { return ::webConfigSetOverrideMediaAudioVolume(config, value); } -Result ConfigSetBootMode(WebCommonConfig* config, WebSessionBootMode mode) { return ::webConfigSetBootMode(config, mode); } -Result ConfigSetMediaPlayerUi(WebCommonConfig* config, bool flag) { return ::webConfigSetMediaPlayerUi(config, flag); } -Result ConfigSetTransferMemory(WebCommonConfig* config, bool flag) { return ::webConfigSetTransferMemory(config, flag); } -Result ConfigShow(WebCommonConfig* config, WebCommonReply *out) { return ::webConfigShow(config, out); } -Result ConfigRequestExit(WebCommonConfig* config) { return ::webConfigRequestExit(config); } -Result ReplyGetExitReason(WebCommonReply *reply, WebExitReason *exitReason) { return ::webReplyGetExitReason(reply, exitReason); } -Result ReplyGetLastUrl(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size) { return ::webReplyGetLastUrl(reply, outstr, outstr_maxsize, out_size); } -Result ReplyGetSharePostResult(WebCommonReply *reply, u32 *sharePostResult) { return ::webReplyGetSharePostResult(reply, sharePostResult); } -Result ReplyGetPostServiceName(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size) { return ::webReplyGetPostServiceName(reply, outstr, outstr_maxsize, out_size); } -Result ReplyGetPostId(WebCommonReply *reply, char *outstr, size_t outstr_maxsize, size_t *out_size) { return ::webReplyGetPostId(reply, outstr, outstr_maxsize, out_size); } -Result ReplyGetMediaPlayerAutoClosedByCompletion(WebCommonReply *reply, bool *flag) { return ::webReplyGetMediaPlayerAutoClosedByCompletion(reply, flag); } -void SessionCreate(WebSession *s, WebCommonConfig* config) { ::webSessionCreate(s, config); } -void SessionClose(WebSession *s) { ::webSessionClose(s); } -Result SessionStart(WebSession *s, Event **out_event) { return ::webSessionStart(s, out_event); } -Result SessionWaitForExit(WebSession *s, WebCommonReply *out) { return ::webSessionWaitForExit(s, out); } -Result SessionRequestExit(WebSession *s) { return ::webSessionRequestExit(s); } -Result SessionAppear(WebSession *s, bool *flag) { return ::webSessionAppear(s, flag); } -Result SessionTrySendContentMessage(WebSession *s, const char *content, u32 size, bool *flag) { return ::webSessionTrySendContentMessage(s, content, size, flag); } -Result SessionTryReceiveContentMessage(WebSession *s, char *content, u64 size, u64 *out_size, bool *flag) { return ::webSessionTryReceiveContentMessage(s, content, size, out_size, flag); } - -} // namespace web - -namespace wlaninf { - -Result Initialize(void) { return ::wlaninfInitialize(); } -void Exit(void) { ::wlaninfExit(); } -Service* GetServiceSession(void) { return ::wlaninfGetServiceSession(); } -Result GetState(WlanInfState* out) { return ::wlaninfGetState(out); } -Result GetRSSI(s32* out) { return ::wlaninfGetRSSI(out); } - -} // namespace wlaninf - -} // namespace nx - diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index 11427b48..9b9be7a2 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -71,8 +71,6 @@ CFLAGS += -DUI_OVERRIDE_PATH="\"$(UI_OVERRIDE_PATH)\"" CXXFLAGS := $(CFLAGS) -fno-exceptions -std=gnu++23 -switch.o: CXXFLAGS += -fno-lto - ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map),-wrap,__cxa_throw -Wl,-wrap,_Unwind_Resume -Wl,-wrap,__gxx_personality_v0 diff --git a/Source/hoc-clk/overlay/src/ipc.h b/Source/hoc-clk/overlay/src/ipc.h index db4a256c..7f514aaa 100644 --- a/Source/hoc-clk/overlay/src/ipc.h +++ b/Source/hoc-clk/overlay/src/ipc.h @@ -26,14 +26,14 @@ #pragma once -#include - #if defined(__cplusplus) #include "cpp_util.hpp" extern "C" { #endif +#include + #include #if defined(__cplusplus) diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index 6999308e..03b7eb07 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -22,7 +22,7 @@ CONFIG_DIR := horizon-oc BUILD := build OUTDIR := out RESOURCES := res -SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util ../common/src +SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util DATA := data INCLUDES := ../common/include src/hos src/soc src/i2c src/util src/pwr src/ipc EXEFS_SRC := exefs_src diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 1d691252..0a71ed1c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -26,13 +26,13 @@ #include #include -#include -#include +#include +#include #include #include #include #include -#include +#include #include "../display/display_refresh_rate.hpp" #include "../file/file_utils.hpp" @@ -46,7 +46,7 @@ #include "board_load.hpp" #include "board_misc.hpp" #include "board_volt.hpp" -#include +#include #include #include "../mapping/mem_map.hpp" #include "../soc/dram_mrr.hpp" @@ -97,8 +97,8 @@ namespace board { rc = pscPmModuleGetRequest(&s_pscModule, &state, &flags); if (R_SUCCEEDED(rc)) { if (state == PscPmState_ReadyAwaken) { - HocI2c::wdt::ResetWdtEnableState(); - HocI2c::wdt::Pet(); + i2c::wdt::ResetWdtEnableState(); + i2c::wdt::Pet(); if(board::GetSocType() == HocClkSocType_Mariko && file::config::GetConfigValue(HocClkConfigValue_CPUDVFSMode) == CPUDVFSMode_Modify) { @@ -117,7 +117,7 @@ namespace board { s_isAwake = true; } else if (state == PscPmState_ReadySleep) { - HocI2c::wdt::Disarm(); + i2c::wdt::Disarm(); ResetToStockMem(); ResetToStockCpu(); @@ -127,7 +127,7 @@ namespace board { s_isAwake = false; } else if (state == PscPmState_ReadyShutdown) { - HocI2c::wdt::Disarm(); + i2c::wdt::Disarm(); ResetToStockMem(); ResetToStockCpu(); @@ -326,7 +326,7 @@ namespace board { pscPmModuleClose(&s_pscModule); pscmExit(); - HocI2c::wdt::Disarm(); + i2c::wdt::Disarm(); } HocClkSocType GetSocType() { diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 5ed302ce..0e8944aa 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -25,11 +25,11 @@ */ #include -#include -#include +#include +#include #include -#include -#include +#include +#include #include "../display/display_refresh_rate.hpp" #include "../file/config.hpp" @@ -40,11 +40,8 @@ #include "../soc/pllmb.hpp" #include "board.hpp" #include "board_name.hpp" -#include +#include #include -#include - -using namespace nx; namespace board { static u32 currentInjectedHz = 0; @@ -70,18 +67,18 @@ namespace board { PcvModuleId GetPcvModuleId(HocClkModule hocclkModule) { PcvModuleId pcvModuleId; - Result rc = nx::pcv::GetModuleId(&pcvModuleId, GetPcvModule(hocclkModule)); + Result rc = pcvGetModuleId(&pcvModuleId, GetPcvModule(hocclkModule)); ASSERT_RESULT_OK(rc, "pcvGetModuleId"); return pcvModuleId; } void ClkrstSetHz(ClkrstSession &session, u32 hz) { - ASSERT_RESULT_OK(nx::clkrst::SetClockRate(&session, hz), "clkrstSetClockRate"); + ASSERT_RESULT_OK(clkrstSetClockRate(&session, hz), "clkrstSetClockRate"); } void PcvSetHz(PcvModule moduleID, u32 hz) { - ASSERT_RESULT_OK(nx::pcv::SetClockRate(moduleID, hz), "pcvSetClockRate"); + ASSERT_RESULT_OK(pcvSetClockRate(moduleID, hz), "pcvSetClockRate"); } void HandleCpuUv() { @@ -115,22 +112,22 @@ namespace board { if (HOSSVC_HAS_CLKRST) { ClkrstSession session = {}; - rc = nx::clkrst::OpenSession(&session, GetPcvModuleId(module), 3); + rc = clkrstOpenSession(&session, GetPcvModuleId(module), 3); ASSERT_RESULT_OK(rc, "clkrstOpenSession"); ClkrstSetHz(session, pcvHz); /* Voltage bug workaround. */ if (module == HocClkModule_CPU) { - svc::SleepThread(300'000); + svcSleepThread(300'000); ClkrstSetHz(session, pcvHz); } - nx::clkrst::CloseSession(&session); + clkrstCloseSession(&session); } else { PcvSetHz(GetPcvModule(module), pcvHz); if (module == HocClkModule_CPU) { - svc::SleepThread(300'000); + svcSleepThread(300'000); PcvSetHz(GetPcvModule(module), pcvHz); } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp index eaa3d0c7..b0a91b6f 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp @@ -26,14 +26,14 @@ #pragma once #include -#include -#include +#include +#include #include -#include +#include #include "../file/errors.hpp" #include "../hos/apm_ext.h" -#include +#include #include diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index 13f5c9a3..bf814453 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -27,23 +27,21 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include -#include -#include -#include +#include +#include #include "../hos/apm_ext.h" #include "board.hpp" #include "board_misc.hpp" -#include +#include #include -using namespace nx; namespace board { @@ -76,7 +74,7 @@ namespace board { gpu_load_array[i++ % gpu_samples_average] = temp; gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; } - svc::SleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) + svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) } while (true); } diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp index 3e6dd7fc..b2315cf1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp @@ -27,10 +27,6 @@ #include #include #include -#include -#include - -using namespace nx; namespace board { @@ -54,7 +50,7 @@ namespace board { } fanLevel = static_cast(rotationDuty); - svc::SleepThread(300'000'000); + svcSleepThread(300'000'000); } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp index 8f9ef7a3..eadeba8a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp @@ -25,14 +25,14 @@ */ #include -#include -#include +#include +#include #include -#include +#include #include "../hos/apm_ext.h" #include "board.hpp" -#include +#include #include namespace board { diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index c3f0c4e7..2bdf42ae 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -27,11 +27,11 @@ #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include "../file/config.hpp" #include "../hos/apm_ext.h" @@ -41,7 +41,7 @@ #include "../tsensor/bq24193.hpp" #include "../tsensor/soctherm.hpp" #include "board.hpp" -#include +#include #include @@ -53,7 +53,7 @@ namespace board { u32 gDramMr4Tick = DramMr4PollDivisor; s32 gDramMr4Millis = 30000; /* 4x refresh default */ - [[maybe_unused]] s32 PollDramMr4TempMilli() { + s32 PollDramMr4TempMilli() { u8 mr4 = 0; if (!soc::ReadRamMr4(&mr4)) return 0; /* stock exosphere */ diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 071f4a23..6a1b8639 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -31,8 +31,6 @@ #include "board_freq.hpp" #include "board_volt.hpp" -using namespace nx; - namespace board { GpuVoltData voltData = {}; @@ -659,7 +657,7 @@ namespace board { constexpr u32 KNOWN_GOOD_WAR_FREQUENCY = 1'785'000'000; u32 hz = board::GetHz(HocClkModule_CPU); board::SetHz(HocClkModule_CPU, KNOWN_GOOD_WAR_FREQUENCY); - svc::SleepThread(5'000'000); + svcSleepThread(5'000'000); board::SetHz(HocClkModule_CPU, hz); } diff --git a/Source/hoc-clk/sysmodule/src/display/aula.cpp b/Source/hoc-clk/sysmodule/src/display/aula.cpp index dd0447df..bb8e4eca 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.cpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.cpp @@ -19,9 +19,7 @@ #include "aula.hpp" #include "common.hpp" -#include -using namespace nx; // I *think* HOS changes this in some ways, so look into it more namespace display { @@ -33,7 +31,7 @@ namespace display { DSI(DSI_TRIGGER) = DSI_TRIGGER_HOST; if (wait) - svc::SleepThread(wait * 1000); // usleep-equivalant + svcSleepThread(wait * 1000); // usleep-equivalant } void SetDisplayColorMode(AulaColorMode mode) { diff --git a/Source/hoc-clk/sysmodule/src/display/common.hpp b/Source/hoc-clk/sysmodule/src/display/common.hpp index a96a773d..b88ac496 100644 --- a/Source/hoc-clk/sysmodule/src/display/common.hpp +++ b/Source/hoc-clk/sysmodule/src/display/common.hpp @@ -15,9 +15,6 @@ * along with this program. If not, see . */ -#pragma once -#include - #ifndef _DI_H_ #define _DI_H_ diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp index ee6510b0..50ea9caa 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp @@ -19,11 +19,8 @@ #include #include #include -#include -#include "display_refresh_rate.hpp" -#include -using namespace nx; +#include "display_refresh_rate.hpp" namespace display { #define DSI_CLOCK_HZ 234000000llu @@ -145,7 +142,7 @@ namespace display { #define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 dsi[DSI_VIDEO_MODE_CONTROL] = true; - svc::SleepThread(20000000); + svcSleepThread(20000000); dsi[DSI_WR_DATA] = MIPI_DSI_DCS_LONG_WRITE | (5 << 8); dsi[DSI_WR_DATA] = 0x5A5A5AE2; @@ -165,7 +162,7 @@ namespace display { dsi[DSI_TRIGGER] = 0; dsi[DSI_VIDEO_MODE_CONTROL] = false; - svc::SleepThread(20000000); + svcSleepThread(20000000); } void SetDockedState(bool isDocked) { g_config.isDocked = isDocked; @@ -241,9 +238,9 @@ namespace display { uint32_t fd = fd_in; if (!fd) - nv::Open(&fd, "/dev/nvdisp-disp1"); + nvOpen(&fd, "/dev/nvdisp-disp1"); NvdcModeDB2 db2 = { 0 }; - int rc = nv::Ioctl(fd, NVDISP_GET_MODE_DB2, &db2); + int rc = nvIoctl(fd, NVDISP_GET_MODE_DB2, &db2); if (rc == 0) { for (size_t i = 0; i < db2.num_modes; i++) { @@ -266,7 +263,7 @@ namespace display { highestRefreshRate = g_dockedRefreshRates[numRates - 1]; NvdcMode2 display_b = { 0 }; - rc = nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b); + rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); struct dpaux_read_0x100 { uint32_t cmd; @@ -284,7 +281,7 @@ namespace display { } set; } dpaux = { 6, 0x100, 0x10 }; - rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); if (rc == 0) { g_dockedLinkRate = dpaux.set.link_rate; // if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && ) @@ -292,7 +289,7 @@ namespace display { } if (!fd_in) - nv::Close(fd); + nvClose(fd); g_dockedHighestRefreshRate = highestRefreshRate; } @@ -320,8 +317,8 @@ namespace display { } DPCD; } dpaux = { 6, 0, 0x10 }; - int rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); - nv::Close(fd); + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + nvClose(fd); if (rc != 0x75c) return false; @@ -382,19 +379,19 @@ namespace display { return false; uint32_t fd = 0; - if (nv::Open(&fd, "/dev/nvdisp-disp1")) { + if (nvOpen(&fd, "/dev/nvdisp-disp1")) { return false; } NvdcMode2 display_b = { 0 }; - int rc = nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b); + int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { - nv::Close(fd); + nvClose(fd); return false; } if (!display_b.pclkKHz) { - nv::Close(fd); + nvClose(fd); return false; } @@ -457,7 +454,7 @@ namespace display { } if (refreshRateNow == g_dockedRefreshRates[itr]) { - nv::Close(fd); + nvClose(fd); return true; } @@ -479,13 +476,13 @@ namespace display { display_b.bitsPerPixel = 24; } - rc = nv::Ioctl(fd, NVDISP_VALIDATE_MODE2, &display_b); + rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b); if (rc == 0) { - rc = nv::Ioctl(fd, NVDISP_SET_MODE2, &display_b); + rc = nvIoctl(fd, NVDISP_SET_MODE2, &display_b); } } - nv::Close(fd); + nvClose(fd); return true; } @@ -496,31 +493,31 @@ namespace display { if (!g_config.displaySync) { g_wasRetroSuperTurnedOff = false; } else if (g_wasRetroSuperTurnedOff) { - svc::SleepThread(2000000000); + svcSleepThread(2000000000); g_wasRetroSuperTurnedOff = false; } - svc::SleepThread(1000000000); + svcSleepThread(1000000000); uint32_t fd = 0; - if (nv::Open(&fd, "/dev/nvdisp-disp0")) { + if (nvOpen(&fd, "/dev/nvdisp-disp0")) { return false; } NvdcMode2 display_b = { 0 }; - int rc = nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b); + int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { - nv::Close(fd); + nvClose(fd); return false; } if (!display_b.pclkKHz) { - nv::Close(fd); + nvClose(fd); return false; } if ((display_b.vActive == 1280 && display_b.hActive == 720) == false) { - nv::Close(fd); + nvClose(fd); return false; } @@ -566,14 +563,14 @@ namespace display { display_b.vBackPorch = g_handheldTimingsRETRO[itr].vBackPorch; display_b.pclkKHz = g_handheldTimingsRETRO[itr].pixelClock_kHz; - rc = nv::Ioctl(fd, NVDISP_VALIDATE_MODE2, &display_b); + rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b); if (rc == 0) { for (size_t i = 0; i < 5; i++) { - nv::Ioctl(fd, NVDISP_SET_MODE2, &display_b); + nvIoctl(fd, NVDISP_SET_MODE2, &display_b); } } - nv::Close(fd); + nvClose(fd); return true; } @@ -606,8 +603,8 @@ namespace display { } DPCD; } dpaux = { 6, 0, 0x10 }; - int rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); - nv::Close(fd); + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + nvClose(fd); if (rc != 0) { if (!g_config.isRetroSUPER) { @@ -640,15 +637,15 @@ namespace display { value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4; if (value != 0 && value != 80) { - if (!nv::Open(&fd, "/dev/nvdisp-disp0")) { + if (!nvOpen(&fd, "/dev/nvdisp-disp0")) { NvdcMode2 display_b = { 0 }; - if (nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { + if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; uint64_t pixelClock = display_b.pclkKHz * 1000 + 999; value = (u32)(pixelClock / (h_total * v_total)); } - nv::Close(fd); + nvClose(fd); } else { return false; } @@ -672,7 +669,7 @@ namespace display { if (!g_canChangeRefreshRateDocked) { uint32_t fd = 0; - if (!nv::Open(&fd, "/dev/nvdisp-disp1")) { + if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { struct dpaux_read_0x100 { uint32_t cmd; uint32_t addr; @@ -689,14 +686,14 @@ namespace display { } set; } dpaux = { 6, 0x100, 0x10 }; - int rc = nv::Ioctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); - nv::Close(fd); + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); + nvClose(fd); if (rc == 0) { _getDockedHighestRefreshRate(0); g_canChangeRefreshRateDocked = true; } else { - svc::SleepThread(1000000000); + svcSleepThread(1000000000); return false; } } else { @@ -708,11 +705,11 @@ namespace display { return true; } uint32_t fd = 0; - if (!nv::Open(&fd, "/dev/nvdisp-disp1")) { + if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { NvdcMode2 display_b = { 0 }; - if (nv::Ioctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { + if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { if (!display_b.pclkKHz) { - nv::Close(fd); + nvClose(fd); return false; } @@ -728,7 +725,7 @@ namespace display { } else { value = 60; } - nv::Close(fd); + nvClose(fd); } else { value = 60; } diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index 9e504d8a..92eb9053 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -29,13 +29,13 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include -#include +#include #include #include "../board/board.hpp" @@ -44,7 +44,7 @@ #include "errors.hpp" #include "file_utils.hpp" #include -#include +#include #include #include #include diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 212e4033..9d049d7b 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -24,13 +24,13 @@ * -------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "../hos/apm_ext.h" #include "file_utils.hpp" -#include +#include #include extern "C" void __libnx_init_time(void); @@ -108,7 +108,7 @@ namespace file::utils { // Debug UART log if (g_uart_enabled) { - svc::OutputDebugString(buff, len); + svcOutputDebugString(buff, len); } if (g_log_enabled) { @@ -188,27 +188,27 @@ namespace file::utils { void InitializeAsync() { Thread initThread = { 0 }; - thread::Create(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0); - thread::Start(&initThread); + threadCreate(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0); + threadStart(&initThread); } Result Initialize() { Result rc = 0; if (R_SUCCEEDED(rc)) { - rc = time::Initialize(); + rc = timeInitialize(); } __libnx_init_time(); - time::Exit(); + timeExit(); SetBootTime(); if (R_SUCCEEDED(rc)) { - rc = fs::Initialize(); + rc = fsInitialize(); } if (R_SUCCEEDED(rc)) { - rc = fsdev::MountSdmc(); + rc = fsdevMountSdmc(); } if (R_SUCCEEDED(rc)) { @@ -230,8 +230,8 @@ namespace file::utils { g_log_enabled = false; g_uart_enabled = false; - fsdev::UnmountAll(); - fs::Exit(); + fsdevUnmountAll(); + fsExit(); } } // namespace file::utils diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index 2f47e2c6..1ffc5c27 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -33,7 +33,6 @@ #include #include #include -#include #define FILE_CONFIG_DIR "/config/" CONFIG_DIR #define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv" diff --git a/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp b/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp deleted file mode 100644 index 6e653444..00000000 --- a/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "clkrst_ext.hpp" - -namespace hos::clkrst { - /// @brief Sets the minimum voltage for a session's module to the one required for @param hz. Does not work with cpu module - /// @param session A ClkrstSession pointer - /// @param hz The hz to set the vmin for - /// @return Result code - Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz) { - return serviceDispatchIn(&session->s, 9, hz); - } - - Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count) { - const struct { - s32 rate_count; - s32 voltage_count; - } in = { in_rate_count, in_voltage_count }; - - s32 out = 0; - Result rc = serviceDispatchInOut(&session->s, 11, in, out, - .buffer_attrs = { - SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect, - SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect, - }, - .buffers = { - { out_rate_table, in_rate_count * sizeof(u32) }, - { out_voltage_table, in_voltage_count * sizeof(u32) }, - }, - ); - - if (R_SUCCEEDED(rc) && out_count) { - *out_count = out; - } - - return rc; - } -} // namespace hos::clkrst diff --git a/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp b/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp deleted file mode 100644 index 39650641..00000000 --- a/Source/hoc-clk/sysmodule/src/hos/clkrst_ext.hpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include - -namespace hos::clkrst { - Result SetMinimumVoltageClockRate(ClkrstSession *session, u32 hz); - Result GetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count); -} // namespace hos::clkrst \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index af329f46..2398d44b 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -20,9 +20,6 @@ #include "integrations.hpp" #include "process_management.hpp" #include -#include - -using namespace nx; namespace hos { @@ -38,21 +35,21 @@ namespace hos { Handle saltysd; for (int i = 0; i < 67; i++) { - if (R_SUCCEEDED(svc::ConnectToNamedPort(&saltysd, "InjectServ"))) { - svc::CloseHandle(saltysd); + if (R_SUCCEEDED(svcConnectToNamedPort(&saltysd, "InjectServ"))) { + svcCloseHandle(saltysd); break; } if (i == 66) return false; - svc::SleepThread(1'000'000); + svcSleepThread(1'000'000); } for (int i = 0; i < 67; i++) { - if (R_SUCCEEDED(svc::ConnectToNamedPort(&saltysd, "InjectServ"))) { - svc::CloseHandle(saltysd); + if (R_SUCCEEDED(svcConnectToNamedPort(&saltysd, "InjectServ"))) { + svcCloseHandle(saltysd); return true; } - svc::SleepThread(1'000'000); + svcSleepThread(1'000'000); } return false; @@ -74,8 +71,8 @@ namespace hos { return; SaltySD_GetSharedMemoryHandle(&gRemoteSharedMemory); SaltySD_Term(); - shmem::LoadRemote(&gSharedMemory, gRemoteSharedMemory, 0x1000, Perm_Rw); - if (!shmem::Map(&gSharedMemory)) + shmemLoadRemote(&gSharedMemory, gRemoteSharedMemory, 0x1000, Perm_Rw); + if (!shmemMap(&gSharedMemory)) gSharedMemoryUsed = true; } @@ -111,7 +108,7 @@ namespace hos { } if (!gNxFps) { - uintptr_t base = (uintptr_t)shmem::GetAddr(&gSharedMemory); + uintptr_t base = (uintptr_t)shmemGetAddr(&gSharedMemory); SearchSharedMemoryBlock(base); } @@ -133,7 +130,7 @@ namespace hos { } if (!gNxFps) { - uintptr_t base = (uintptr_t)shmem::GetAddr(&gSharedMemory); + uintptr_t base = (uintptr_t)shmemGetAddr(&gSharedMemory); SearchSharedMemoryBlock(base); } diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index f2008427..7c9e4654 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -30,7 +30,6 @@ #include "../file/file_utils.hpp" #include "process_management.hpp" -using namespace nx; namespace hos { @@ -43,18 +42,18 @@ namespace hos { void InitializeProcessManagement() { Result rc = 0; - rc = pmdmnt::Initialize(); + rc = pmdmntInitialize(); ASSERT_RESULT_OK(rc, "pmdmntInitialize"); - rc = pminfo::Initialize(); + rc = pminfoInitialize(); ASSERT_RESULT_OK(rc, "pminfoInitialize"); - rc = pdmqry::Initialize(); + rc = pdmqryInitialize(); ASSERT_RESULT_OK(rc, "pdmqryInitialize"); - Service *pdmqrySrv = pdmqry::GetServiceSession(); - service::Clone(pdmqrySrv, &pdmqryClone); - service::Close(pdmqrySrv); + Service *pdmqrySrv = pdmqryGetServiceSession(); + serviceClone(pdmqrySrv, &pdmqryClone); + serviceClose(pdmqrySrv); memcpy(pdmqrySrv, &pdmqryClone, sizeof(Service)); } @@ -62,8 +61,8 @@ namespace hos { Result rc = 0; u64 pid = 0; do { - rc = pmdmnt::GetProcessId(&pid, Qlaunch); - svc::SleepThread(50 * 1000000ULL); // 50ms + rc = pmdmntGetProcessId(&pid, Qlaunch); + svcSleepThread(50 * 1000000ULL); // 50ms } while (R_FAILED(rc)); } @@ -77,14 +76,14 @@ namespace hos { u64 TIDnow; u64 PIDnow; - Result rc = pmdmnt::GetApplicationProcessId(&PIDnow); + Result rc = pmdmntGetApplicationProcessId(&PIDnow); if (R_FAILED(rc)) return rc; - rc = pmdmnt::GetProgramId(&TIDnow, PIDnow); + rc = pmdmntGetProgramId(&TIDnow, PIDnow); if (R_FAILED(rc)) return rc; - rc = pdmqry::GetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index); + rc = pdmqryGetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index); if (R_FAILED(rc)) return rc; if (total_entries == last_total_entries) { @@ -98,7 +97,7 @@ namespace hos { s32 start_entry = end_entry_index - 15; if (start_entry < 0) start_entry = 0; - rc = pdmqry::QueryPlayEvent(start_entry, events, sizeof(events) / sizeof(events[0]), &out); + rc = pdmqryQueryPlayEvent(start_entry, events, sizeof(events) / sizeof(events[0]), &out); if (R_FAILED(rc)) return rc; if (out == 0) @@ -140,7 +139,7 @@ namespace hos { Result rc = 0; u64 pid = 0; u64 tid = 0; - rc = pmdmnt::GetApplicationProcessId(&pid); + rc = pmdmntGetApplicationProcessId(&pid); if (rc == IsQlaunch) { return Qlaunch; @@ -148,7 +147,7 @@ namespace hos { ASSERT_RESULT_OK(rc, "pmdmntGetApplicationProcessId"); - rc = pminfo::GetProgramId(&tid, pid); + rc = pminfoGetProgramId(&tid, pid); if (rc == IsQlaunch) { return Qlaunch; @@ -160,9 +159,9 @@ namespace hos { } void ExitProcessManagement() { - pmdmnt::Exit(); - pminfo::Exit(); - pdmqry::Exit(); + pmdmntExit(); + pminfoExit(); + pdmqryExit(); } } // namespace hos diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2c.c similarity index 90% rename from Source/hoc-clk/sysmodule/src/i2c/i2c.cpp rename to Source/hoc-clk/sysmodule/src/i2c/i2c.c index 42564897..cfdeb177 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.c @@ -24,10 +24,7 @@ * -------------------------------------------------------------------------- */ -#include "i2c.hpp" -#include - -using namespace nx; +#include "i2c.h" #define I2C_CMD_SND 0 #define I2C_CMD_RCV 1 @@ -37,5 +34,5 @@ Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size) { I2C_CMD_RCV | (I2cTransactionOption_All << 6), out_size }; - return i2csession::ExecuteCommandList(s, out, out_size, cmdlist, sizeof(cmdlist)); + return i2csessionExecuteCommandList(s, out, out_size, cmdlist, sizeof(cmdlist)); } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.hpp b/Source/hoc-clk/sysmodule/src/i2c/i2c.h similarity index 93% rename from Source/hoc-clk/sysmodule/src/i2c/i2c.hpp rename to Source/hoc-clk/sysmodule/src/i2c/i2c.h index 75a41f0f..91a099de 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.hpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.h @@ -25,7 +25,15 @@ */ #pragma once -#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size); +#ifdef __cplusplus +} +#endif diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index 9843d7b8..93222148 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -15,9 +15,6 @@ * */ #include "i2cDrv.h" -#include - -using namespace nx; Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { // ams::fatal::srv::StopSoundTask::StopSound() @@ -28,14 +25,14 @@ Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { } __attribute__((packed)) cmd; I2cSession _session; - Result res = i2c::OpenSession(&_session, dev); + Result res = i2cOpenSession(&_session, dev); if (res) return res; cmd.reg = reg; cmd.val = val; - res = i2csession::SendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); - i2csession::Close(&_session); + res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + i2csessionClose(&_session); return res; } @@ -48,19 +45,19 @@ Result I2cRead_OutU8(I2cDevice dev, u8 reg, u8 *out) { } __attribute__((packed)) rec; I2cSession _session; - Result res = i2c::OpenSession(&_session, dev); + Result res = i2cOpenSession(&_session, dev); if (res) return res; cmd.reg = reg; - res = i2csession::SendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); if (res) { - i2csession::Close(&_session); + i2csessionClose(&_session); return res; } - res = i2csession::ReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); - i2csession::Close(&_session); + res = i2csessionReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); + i2csessionClose(&_session); if (res) { return res; } @@ -78,19 +75,19 @@ Result I2cRead_OutU16(I2cDevice dev, u8 reg, u16 *out) { } __attribute__((packed)) rec; I2cSession _session; - Result res = i2c::OpenSession(&_session, dev); + Result res = i2cOpenSession(&_session, dev); if (res) return res; cmd.reg = reg; - res = i2csession::SendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); + res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All); if (res) { - i2csession::Close(&_session); + i2csessionClose(&_session); return res; } - res = i2csession::ReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); - i2csession::Close(&_session); + res = i2csessionReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All); + i2csessionClose(&_session); if (res) { return res; } @@ -136,7 +133,7 @@ u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain) { return 0u; // Wait 1us - svc::SleepThread(1E3); + svcSleepThread(1E3); if (!domain->por_val || val != domain->por_val) break; @@ -152,7 +149,7 @@ u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain) { return 0u; // Wait 1us - svc::SleepThread(1E3); + svcSleepThread(1E3); if (!domain->por_val || val != domain->por_val) break; @@ -175,7 +172,7 @@ Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mv return res; // 5ms Ramp delay - svc::SleepThread(5E6); + svcSleepThread(5E6); u8 new_val; res = I2cRead_OutU8(domain->device, domain->reg, &new_val); if (R_FAILED(res)) diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h index 40f9c4d0..3f561045 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h @@ -6,7 +6,7 @@ #pragma once #include -#include + // To use i2c service, sm and i2c should be intialized via smInitialize() and i2cInitialize(). Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val); diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.cpp b/Source/hoc-clk/sysmodule/src/i2c/max17050.c similarity index 98% rename from Source/hoc-clk/sysmodule/src/i2c/max17050.cpp rename to Source/hoc-clk/sysmodule/src/i2c/max17050.c index df89c3fa..8f82c14c 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max17050.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max17050.c @@ -22,8 +22,8 @@ * */ -#include "i2c.hpp" -#include "max17050.hpp" +#include "i2c.h" +#include "max17050.h" #define MAX17050_WAIT_NS 1000000000UL diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.hpp b/Source/hoc-clk/sysmodule/src/i2c/max17050.h similarity index 100% rename from Source/hoc-clk/sysmodule/src/i2c/max17050.hpp rename to Source/hoc-clk/sysmodule/src/i2c/max17050.h diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp index 92521b89..22937f8b 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.cpp @@ -47,7 +47,7 @@ /* Is this a watchdog or a watchcat, that is the question */ -namespace HocI2c::wdt { +namespace i2c::wdt { static bool isWdtEnabled = false; @@ -128,7 +128,7 @@ namespace HocI2c::wdt { const bool watchdogEnabled = file::config::GetConfigValue(HocClkConfigValue_Watchdog); if (watchdogEnabled) { - Arm(HocI2c::wdt::MAX77620_WDT_2S); + Arm(i2c::wdt::MAX77620_WDT_2S); Result rc = update_bits(MAX77620_REG_CNFGGLBL3, MAX77620_WDTC_MASK, MAX77620_WDTC_KICK); ASSERT_RESULT_OK(rc, "update_bits"); } else { @@ -136,4 +136,4 @@ namespace HocI2c::wdt { } } -} // namespace HocI2c::wdt +} // namespace i2c::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp index 8ae9c0d7..005ef6e0 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp +++ b/Source/hoc-clk/sysmodule/src/i2c/max77620_wdt.hpp @@ -22,7 +22,7 @@ #include "i2cDrv.h" #include "../file/errors.hpp" -namespace HocI2c::wdt { +namespace i2c::wdt { typedef enum { MAX77620_WDT_2S = 0, /* ~2 seconds */ @@ -38,4 +38,4 @@ namespace HocI2c::wdt { void ResetWdtEnableState(); bool IsWdtEnabled(); -} // namespace HocI2c::wdt +} // namespace i2c::wdt diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.cpp b/Source/hoc-clk/sysmodule/src/i2c/tmp451.c similarity index 83% rename from Source/hoc-clk/sysmodule/src/i2c/tmp451.cpp rename to Source/hoc-clk/sysmodule/src/i2c/tmp451.c index ab0bb546..e82383b4 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.c @@ -17,11 +17,8 @@ * along with this program. If not, see . */ -#include "i2c.hpp" -#include "tmp451.hpp" -#include - -using namespace nx; +#include "i2c.h" +#include "tmp451.h" #define TMP451_WAIT_NS 1000000000UL @@ -53,14 +50,14 @@ static Result _tmp451_get_temp(u8 reg, u8 dec_reg, s32 *out) { } static void _tmp451_update() { - u64 ticks = arm::GetSystemTick(); - if (arm::TicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) { + u64 ticks = armGetSystemTick(); + if (armTicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) { return; } g_update_ticks = ticks; - if (!service::IsActive(&g_i2c_session.s)) { + if (!serviceIsActive(&g_i2c_session.s)) { return; } @@ -69,18 +66,18 @@ static void _tmp451_update() { } Result tmp451Initialize(void) { - Result rc = i2c::Initialize(); + Result rc = i2cInitialize(); if (R_SUCCEEDED(rc)) { - rc = i2c::OpenSession(&g_i2c_session, I2cDevice_Tmp451); + rc = i2cOpenSession(&g_i2c_session, I2cDevice_Tmp451); } return rc; } void tmp451Exit(void) { - i2csession::Close(&g_i2c_session); - i2c::Exit(); + i2csessionClose(&g_i2c_session); + i2cExit(); } s32 tmp451TempPcb(void) { diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.hpp b/Source/hoc-clk/sysmodule/src/i2c/tmp451.h similarity index 93% rename from Source/hoc-clk/sysmodule/src/i2c/tmp451.hpp rename to Source/hoc-clk/sysmodule/src/i2c/tmp451.h index e61d3329..7872b59e 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.hpp +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.h @@ -26,9 +26,17 @@ #pragma once -#include -using namespace nx; +#ifdef __cplusplus +extern "C" { +#endif + +#include + Result tmp451Initialize(void); void tmp451Exit(void); s32 tmp451TempPcb(void); s32 tmp451TempSoc(void); + +#ifdef __cplusplus +} +#endif diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c similarity index 81% rename from Source/hoc-clk/sysmodule/src/ipc/ipc_server.cpp rename to Source/hoc-clk/sysmodule/src/ipc/ipc_server.c index 25f03881..340d9b18 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c @@ -26,20 +26,18 @@ #include -#include "ipc_server.hpp" - -using namespace nx; +#include "ipc_server.h" Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions) { if (max_sessions < 1 || max_sessions > (MAX_WAIT_OBJECTS - 1)) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } - server->srvName = sm::EncodeName(name); + server->srvName = smEncodeName(name); server->max = max_sessions + 1; server->count = 0; - Result rc = sm::RegisterService(&server->handles[0], server->srvName, false, max_sessions); + Result rc = smRegisterService(&server->handles[0], server->srvName, false, max_sessions); if (R_SUCCEEDED(rc)) { server->count = 1; } @@ -48,10 +46,10 @@ Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions) { Result ipcServerExit(IpcServer *server) { for (u32 i = 0; i < server->count; i++) { - svc::CloseHandle(server->handles[i]); + svcCloseHandle(server->handles[i]); } server->count = 0; - return sm::UnregisterService(server->srvName); + return smUnregisterService(server->srvName); } static Result _ipcServerAddSession(IpcServer *server, Handle session) { @@ -69,7 +67,7 @@ static Result _ipcServerDeleteSession(IpcServer *server, u32 index) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } - svc::CloseHandle(server->handles[index]); + svcCloseHandle(server->handles[index]); for (u32 j = index; j < (server->count - 1); j++) { server->handles[j] = server->handles[j + 1]; @@ -79,15 +77,15 @@ static Result _ipcServerDeleteSession(IpcServer *server, u32 index) { } static Result _ipcServerParseRequest(IpcServerRequest *r) { - u8 *base = (u8*)armGetTls(); + u8 *base = armGetTls(); - r->hipc = hipc::ParseRequest(base); + r->hipc = hipcParseRequest(base); r->data.cmdId = 0; r->data.size = 0; r->data.ptr = NULL; if (r->hipc.meta.type == CmifCommandType_Request) { - IpcServerRawHeader *header = (IpcServerRawHeader*)cmif::GetAlignedDataStart(r->hipc.data.data_words, base); + IpcServerRawHeader *header = cmifGetAlignedDataStart(r->hipc.data.data_words, base); size_t dataSize = r->hipc.meta.num_data_words * 4; if (!header || dataSize < sizeof(IpcServerRawHeader) || header->magic != CMIF_IN_HEADER_MAGIC) { @@ -105,11 +103,11 @@ static Result _ipcServerParseRequest(IpcServerRequest *r) { } static void _ipcServerPrepareResponse(Result rc, void *data, size_t dataSize) { - u8 *base = (u8*)arm::GetTls(); + u8 *base = armGetTls(); HipcRequest hipc = - hipcMakeRequestInline(base, .type = CmifCommandType_Request, .num_data_words = (u32)(sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, ); + hipcMakeRequestInline(base, .type = CmifCommandType_Request, .num_data_words = (sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, ); - IpcServerRawHeader *rawHeader = (IpcServerRawHeader*)cmif::GetAlignedDataStart(hipc.data_words, base); + IpcServerRawHeader *rawHeader = cmifGetAlignedDataStart(hipc.data_words, base); rawHeader->magic = CMIF_OUT_HEADER_MAGIC; rawHeader->result = rc; @@ -120,9 +118,9 @@ static void _ipcServerPrepareResponse(Result rc, void *data, size_t dataSize) { static Result _ipcServerProcessNewSession(IpcServer *server) { Handle session; - Result rc = svc::AcceptSession(&session, server->handles[0]); + Result rc = svcAcceptSession(&session, server->handles[0]); if (R_SUCCEEDED(rc) && R_FAILED(rc = _ipcServerAddSession(server, session))) { - svc::CloseHandle(session); + svcCloseHandle(session); } return rc; } @@ -134,7 +132,7 @@ static Result _ipcServerProcessSession(IpcServer *server, IpcServerRequestHandle u8 data[IPC_SERVER_EXT_RESPONSE_MAX_DATA_SIZE]; bool close = false; - Result rc = svc::ReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 1, 0, UINT64_MAX); + Result rc = svcReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 1, 0, UINT64_MAX); if (R_SUCCEEDED(rc)) { rc = _ipcServerParseRequest(&r); } @@ -168,9 +166,9 @@ static Result _ipcServerProcessSession(IpcServer *server, IpcServerRequestHandle Result ipcServerProcess(IpcServer *server, IpcServerRequestHandler handler, void *userdata) { s32 handleIndex = -1; - Result rc = svc::WaitSynchronization(&handleIndex, server->handles, server->count, UINT64_MAX); + Result rc = svcWaitSynchronization(&handleIndex, server->handles, server->count, UINT64_MAX); - if (R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= (s32)server->count)) { + if (R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= server->count)) { rc = MAKERESULT(Module_Libnx, LibnxError_NotFound); } diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.hpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h similarity index 99% rename from Source/hoc-clk/sysmodule/src/ipc/ipc_server.hpp rename to Source/hoc-clk/sysmodule/src/ipc/ipc_server.h index 1357eb14..7b5a24c8 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.hpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h @@ -31,7 +31,6 @@ extern "C" { #endif #include -#include #define IPC_SERVER_EXT_RESPONSE_MAX_DATA_SIZE (0x100 - 0x10 - sizeof(IpcServerRawHeader)) diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index feffcf81..81247151 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -25,11 +25,10 @@ */ #include -#include -#include +#include +#include #include -#include -#include +#include #include "../file/config.hpp" #include "../file/errors.hpp" @@ -38,11 +37,8 @@ #include "../hos/apm_ext.h" #include "../mgr/clock_manager.hpp" #include "ipc_service.hpp" -#include +#include #include - -using namespace nx; - namespace ipcService { namespace { @@ -274,7 +270,7 @@ namespace ipcService { void Initialize() { std::int32_t priority; - Result rc = svc::GetThreadPriority(&priority, CUR_THREAD_HANDLE); + Result rc = svcGetThreadPriority(&priority, CUR_THREAD_HANDLE); ASSERT_RESULT_OK(rc, "svcGetThreadPriority"); rc = ipcServerInit(&gServer, HOCCLK_IPC_SERVICE_NAME, 42); ASSERT_RESULT_OK(rc, "ipcServerInit"); @@ -285,7 +281,7 @@ namespace ipcService { void Exit() { SetRunning(false); - Result rc = thread::Close(&gThread); + Result rc = threadClose(&gThread); ASSERT_RESULT_OK(rc, "threadClose"); rc = ipcServerExit(&gServer); ASSERT_RESULT_OK(rc, "ipcServerExit"); @@ -300,11 +296,11 @@ namespace ipcService { gRunning = running; if (running) { - Result rc = thread::Start(&gThread); + Result rc = threadStart(&gThread); ASSERT_RESULT_OK(rc, "threadStart"); } else { - svc::CancelSynchronization(gThread.handle); - thread::WaitForExit(&gThread); + svcCancelSynchronization(gThread.handle); + threadWaitForExit(&gThread); } } diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 2efc031d..2a785506 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -28,7 +28,7 @@ #include #include #include -#include + #include "board/board.hpp" #include "file/config.hpp" #include "file/errors.hpp" @@ -41,7 +41,6 @@ #define INNER_HEAP_SIZE 0x40000 extern "C" { -using namespace nx; void virtmemSetup(void); extern std::uint32_t __start__; @@ -87,43 +86,43 @@ void __libnx_initheap(void) { } void __appInit(void) { - if (R_FAILED(sm::Initialize())) { + if (R_FAILED(smInitialize())) { fatalThrow(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); } - Result rc = setsys::Initialize(); + Result rc = setsysInitialize(); if (R_SUCCEEDED(rc)) { SetSysFirmwareVersion fw; - rc = setsys::GetFirmwareVersion(&fw); + rc = setsysGetFirmwareVersion(&fw); if (R_SUCCEEDED(rc)) - hosversion::Set(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); - setsys::Exit(); + hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); + setsysExit(); } - + // rc = fanInitialize(); // if (R_FAILED(rc)) // diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); - rc = i2c::Initialize(); + rc = i2cInitialize(); if (R_FAILED(rc)) - diag::AbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); + diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); } void __appExit(void) { // CloseFanControllerThread(); // fanExit(); - i2c::Exit(); - setsys::Exit(); - fsdev::UnmountAll(); - fs::Exit(); - sm::Exit(); + i2cExit(); + setsysExit(); + fsdevUnmountAll(); + fsExit(); + smExit(); } } int main(int argc, char **argv) { Result rc = file::utils::Initialize(); if (R_FAILED(rc)) { - fatal::Throw(rc); + fatalThrow(rc); return 1; } file::config::Initialize(); @@ -157,7 +156,7 @@ int main(int argc, char **argv) { board::Exit(); file::config::Exit(); file::utils::LogLine("Exiting hoc-clk"); - svc::SleepThread(1000000ULL); + svcSleepThread(1000000ULL); file::utils::Exit(); return 0; diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index b303c040..0f807665 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -16,18 +16,15 @@ */ #include -#include #include "../file/file_utils.hpp" -using namespace nx; - Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size) { if (hosversionAtLeast(10, 0, 0)) { u64 out_size; - return svc::QueryMemoryMapping(virtaddr, &out_size, physaddr, size); + return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); } else { - return svc::LegacyQueryIoMapping(virtaddr, physaddr, size); + return svcLegacyQueryIoMapping(virtaddr, physaddr, size); } } diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index d6942317..8c7865e1 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "../board/board.hpp" #include "../display/aula.hpp" @@ -45,10 +45,7 @@ #include "clock_manager.hpp" #include "governor.hpp" #include "../i2c/max77620_wdt.hpp" -#include "../hos/clkrst_ext.hpp" -#include -using namespace nx; #define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) @@ -812,7 +809,7 @@ namespace mgr { else gContext.resolutionHeight = 0; // N/A - gContext.isWdtEnabled = HocI2c::wdt::IsWdtEnabled(); + gContext.isWdtEnabled = i2c::wdt::IsWdtEnabled(); return hasChanged; } @@ -871,7 +868,6 @@ namespace mgr { } mgr::StartThreads(); - } void Exit() { @@ -917,7 +913,7 @@ namespace mgr { } void WaitForNextTick() { - HocI2c::wdt::Pet(); - svc::SleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); + i2c::wdt::Pet(); + svcSleepThread(file::config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); } } // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index cb0900a1..8ab39d21 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -19,8 +19,6 @@ #include "governor.hpp" #include -using namespace nx; - namespace mgr { #define DOWN_HOLD_TICKS_DEFAULT 10 // 50 ms at 5ms poll – how long to hold while ramping down @@ -142,7 +140,7 @@ namespace mgr { cpuLastHz = 0; gpuDownHoldRemaining = 0; gpuLastHz = 0; - svc::SleepThread(pollNs); + svcSleepThread(pollNs); continue; } @@ -304,23 +302,23 @@ namespace mgr { if (++vrrTick > 50) { vrrTick = 0; board::SetHz(HocClkModule_Display, maxDisplay); - svc::SleepThread(50'000'000); + svcSleepThread(50'000'000); } } } } } - svc::SleepThread(pollNs); + svcSleepThread(pollNs); } } void StartThreads() { - thread::Create(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); - thread::Start(&governorTHREAD); + threadCreate(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); + threadStart(&governorTHREAD); } void ExitThreads() { - thread::Close(&governorTHREAD); + threadClose(&governorTHREAD); } } // namespace mgr diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.cpp b/Source/hoc-clk/sysmodule/src/soc/t210.c similarity index 96% rename from Source/hoc-clk/sysmodule/src/soc/t210.cpp rename to Source/hoc-clk/sysmodule/src/soc/t210.c index 20be3485..d787976f 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/t210.c @@ -17,15 +17,11 @@ * along with this program. If not, see . */ -#include "t210.hpp" -#include -#include - -using namespace nx; +#include "t210.h" #define WAIT_NS 1000000000UL -#define usleep(x) (svc::SleepThread(1000UL * x)) +#define usleep(x) svcSleepThread(1000UL * x) #define GPU_TRIM_SYS_GPCPLL_COEFF 0x4 #define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(g_gpu_base + 0x137000ul + (x))) @@ -177,9 +173,9 @@ static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) { static inline Result _svcQueryMemoryMappingFallback(u64 *virtaddr, u64 physaddr, u64 size) { if (hosversionAtLeast(10, 0, 0)) { u64 out_size; - return svc::QueryMemoryMapping(virtaddr, &out_size, physaddr, size); + return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); } else { - return svc::LegacyQueryIoMapping(virtaddr, physaddr, size); + return svcLegacyQueryIoMapping(virtaddr, physaddr, size); } } diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.hpp b/Source/hoc-clk/sysmodule/src/soc/t210.h similarity index 100% rename from Source/hoc-clk/sysmodule/src/soc/t210.hpp rename to Source/hoc-clk/sysmodule/src/soc/t210.h diff --git a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp index c1520e1a..23b41fa7 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/bq24193.hpp @@ -17,7 +17,7 @@ * */ -#include +#include #include "../board/board.hpp" #include "../i2c/i2cDrv.h" diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index 5339135b..b483e8cf 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -30,7 +30,6 @@ #include "soctherm.hpp" #include "tsensor_common.hpp" -using namespace nx; namespace tsensor { @@ -506,7 +505,7 @@ namespace tsensor { } /* Wait for HW recalibration */ - svc::SleepThread(25'000); + svcSleepThread(25'000); temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); @@ -529,7 +528,7 @@ namespace tsensor { WriteReg(carVa, CAR_CLK_SOURCE_TSENSOR, CAR_CLK_SOURCE_TSENSOR_VAL); SetBits(carVa, CAR_CLK_OUT_ENB_V, 0x10); - svc::SleepThread(2000); + svcSleepThread(2000); TSensorSharedCalib sharedCal = {}; CalcSharedCal(&tfuse, &sharedCal, fuseVa); From 1a0fddf7ea2b16ce6feaff05ef3460e592486019 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 15:43:00 +0200 Subject: [PATCH 175/205] hoc-clk: remove unstuck delay and clarify workaround --- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 6a1b8639..91dcb959 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -652,12 +652,12 @@ namespace board { VolatileCopyDwords(cpuVoltData.table, cpuVoltData.lut, LutSize); } - /* TODO: Dynamically get this from the PCV LUT */ + /* TODO: Dynamically get this from the PCV LUT? */ void UnstuckFreqWar() { - constexpr u32 KNOWN_GOOD_WAR_FREQUENCY = 1'785'000'000; u32 hz = board::GetHz(HocClkModule_CPU); - board::SetHz(HocClkModule_CPU, KNOWN_GOOD_WAR_FREQUENCY); - svcSleepThread(5'000'000); + /* Voltage needs to be above the forced minimum voltage, so we set max for a short time. */ + /* This frequency is only applied for ~250ms. */ + board::SetHz(HocClkModule_CPU, ~0); board::SetHz(HocClkModule_CPU, hz); } From 5b1cc026d160a4fc19902dba1ccec871d7c74fc0 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 18:32:35 +0200 Subject: [PATCH 176/205] add lto --- Source/hoc-clk/sysmodule/Makefile | 4 ++-- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index 03b7eb07..d9954b2b 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -39,7 +39,7 @@ DEFINES := -DDISABLE_IPC -DKIP_VERSION=$(KIP_VERSION) -DCUST_REV=$(CUST_REV) -DT ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE -CFLAGS := -g -Wall -Os \ +CFLAGS := -g -Wall -Os -flto=auto \ -ffast-math -ffunction-sections -fdata-sections -fno-asynchronous-unwind-tables -fno-unwind-tables \ $(ARCH) $(DEFINES) @@ -48,7 +48,7 @@ CFLAGS += $(INCLUDE) -D__SWITCH__ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++23 ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -Wl,-wrap,__cxa_throw -Wl,-wrap,_Unwind_Resume -Wl,-wrap,__gxx_personality_v0 +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Os -flto=auto -Wl,-Map,$(notdir $*.map) -Wl,-wrap,__cxa_throw -Wl,-wrap,_Unwind_Resume -Wl,-wrap,__gxx_personality_v0 LIBS := $(foreach lib,$(LIBNAMES),-l$(lib)) -lnx diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 91dcb959..ffbff8f9 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -780,7 +780,6 @@ namespace board { return; } - u32 tmpLut[LutSize]; std::memcpy(tmpLut, cpuVoltData.table, sizeof(tmpLut)); From 010cdaafcccb1041b5798e42004ee214812bec3d Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 18:42:30 +0200 Subject: [PATCH 177/205] hoc-clk: update makefiles to recursively scan instead of hardcoding source paths --- Source/hoc-clk/overlay/Makefile | 7 ++++++- Source/hoc-clk/sysmodule/Makefile | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index 9b9be7a2..63f6f254 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -17,11 +17,16 @@ include $(DEVKITPRO)/libnx/switch_rules # INCLUDES is a list of directories containing header files # EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". #--------------------------------------------------------------------------------- +rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) + TARGET := horizon-oc-overlay BUILD := build OUTDIR := out RESOURCES := res -SOURCES := src src/ui/gui src/ui/elements ../common/src ../common/src/client +CSOURCES := $(call rwildcard,src/,*.c) $(call rwildcard,../common/src/,*.c) +CPPSOURCES := $(call rwildcard,src/,*.cpp) $(call rwildcard,../common/src/,*.cpp) +SSOURCES := $(call rwildcard,src/,*.s) $(call rwildcard,../common/src/,*.s) +SOURCES := $(sort $(dir $(CSOURCES) $(CPPSOURCES) $(SSOURCES))) DATA := data ../assets INCLUDES := ../common/include EXEFS_SRC := exefs_src diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index d9954b2b..362b95f5 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -17,12 +17,18 @@ include $(DEVKITPRO)/libnx/switch_rules # INCLUDES is a list of directories containing header files # EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". #--------------------------------------------------------------------------------- + +rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) + TARGET := hoc-clk CONFIG_DIR := horizon-oc BUILD := build OUTDIR := out RESOURCES := res -SOURCES := src src/hos src/i2c src/ipc src/board src/display src/tsensor src/mgr src/file src/soc src/mapping src/pwr src/util +CSOURCES := $(call rwildcard,src/,*.c) $(call rwildcard,../common/src/,*.c) +CPPSOURCES := $(call rwildcard,src/,*.cpp) $(call rwildcard,../common/src/,*.cpp) +SSOURCES := $(call rwildcard,src/,*.s) $(call rwildcard,../common/src/,*.s) +SOURCES := $(sort $(dir $(CSOURCES) $(CPPSOURCES) $(SSOURCES))) DATA := data INCLUDES := ../common/include src/hos src/soc src/i2c src/util src/pwr src/ipc EXEFS_SRC := exefs_src From d98da35604f5da8573b96d8321ab590978665686 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 19:43:52 +0200 Subject: [PATCH 178/205] hoc-clk: properly adjust CL_DVFS_OUTPUT_CFG after lut write --- .../sysmodule/src/board/board_volt.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index ffbff8f9..576ff298 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -619,6 +619,7 @@ namespace board { volatile u32 *lut = nullptr; u32 table[LutSize] = {}; u32 lastVmin = 0; + u32 outputCfg = 0; bool initialized = false; } cpuVoltData; } @@ -661,9 +662,27 @@ namespace board { board::SetHz(HocClkModule_CPU, hz); } + void AdjustMinLutIndex() { + constexpr u32 Shift = 8; + constexpr u32 Mask = 0x3F << Shift; + /* Index is always 0 for us. */ + constexpr u32 Value = 0; + + volatile u32 *reg = reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); + + *reg = (*reg & ~Mask) | ((Value << Shift) & Mask); + + static_cast(*reg); + } + + void RestoreMinLutIndex() { + *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0) = cpuVoltData.outputCfg; + } + void RestoreCpuLut() { cpuVoltData.lastVmin = 0; VolatileCopyDwords(cpuVoltData.lut, cpuVoltData.table, LutSize); + RestoreMinLutIndex(); UnstuckFreqWar(); } @@ -724,6 +743,7 @@ namespace board { void InitializeCpuLut() { InitializeLutPtr(); CacheCpuLut(); + cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); cpuVoltData.initialized = true; } @@ -802,6 +822,7 @@ namespace board { PadLutTail(tmpLut, valid); VolatileCopyDwords(cpuVoltData.lut, tmpLut, LutSize); + AdjustMinLutIndex(); UnstuckFreqWar(); From c3137f56d6da5158a2fd04e4f5608ddcc6f6ceeb Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 19:46:13 +0200 Subject: [PATCH 179/205] hoc-clk: better variable names for minLut --- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 576ff298..a14136af 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -666,11 +666,11 @@ namespace board { constexpr u32 Shift = 8; constexpr u32 Mask = 0x3F << Shift; /* Index is always 0 for us. */ - constexpr u32 Value = 0; + constexpr u32 MinLutIndex = 0; volatile u32 *reg = reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); - *reg = (*reg & ~Mask) | ((Value << Shift) & Mask); + *reg = (*reg & ~Mask) | ((MinLutIndex << Shift) & Mask); static_cast(*reg); } From 2b3883998aef18e4867bb76b65f812af961d4cbf Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 19:49:15 +0200 Subject: [PATCH 180/205] hoc-clk: code style ocd or something --- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index a14136af..93cc4fb9 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -743,7 +743,7 @@ namespace board { void InitializeCpuLut() { InitializeLutPtr(); CacheCpuLut(); - cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); + cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); cpuVoltData.initialized = true; } From 2c4020e71fb742d8ff5055ef1d21da49085baa53 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 19:56:02 +0200 Subject: [PATCH 181/205] hoc-clk: auto cpu ram oc --- Source/hoc-clk/common/include/hocclk/config.h | 19 ----- Source/hoc-clk/overlay/lang/ru.json | 3 - Source/hoc-clk/overlay/lang/zh-cn.json | 3 - Source/hoc-clk/overlay/lang/zh-tw.json | 3 - .../src/ui/gui/config_info_strings.cpp | 18 ----- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 79 ------------------- .../sysmodule/src/mgr/clock_manager.cpp | 17 +--- Source/hoc-clk/sysmodule/src/mgr/governor.cpp | 9 --- 8 files changed, 2 insertions(+), 149 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index 34d2994b..b3c33af4 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -79,10 +79,6 @@ typedef enum { HocClkConfigValue_MarikoMiddleFreqs, HocClkConfigValue_LiveGpuVoltage, - HocClkConfigValue_AutoRAMCPUOverclock, - HocClkConfigValue_AutoRamCpuCpuOCFreq, - HocClkConfigValue_AutoRamCpuRamOCThreshold, - HocClkConfigValue_Watchdog, KipConfigValue_custRev, @@ -343,12 +339,6 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_LiveGpuVoltage: return pretty ? "GPU Voltage Request" : "gpu_voltage_request"; - case HocClkConfigValue_AutoRAMCPUOverclock: - return pretty ? "Auto High RAM CPU OC" : "auto_high_ram_cpu_oc"; - case HocClkConfigValue_AutoRamCpuCpuOCFreq: - return pretty ? "Auto High RAM CPU OC Freq" : "auto_ram_cpu_cpu_oc_freq"; - case HocClkConfigValue_AutoRamCpuRamOCThreshold: - return pretty ? "Auto High RAM CPU OC RAM Threshold" : "auto_ram_cpu_ram_oc_threshold"; case HocClkConfigValue_Watchdog: return pretty ? "Watchcat" : "watchdog"; // More dignified // KIP config values @@ -617,12 +607,6 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_GPUDVFSMode: case HocClkConfigValue_CPUDVFSMode: return 1ULL; - case HocClkConfigValue_AutoRAMCPUOverclock: - return 0ULL; - case HocClkConfigValue_AutoRamCpuCpuOCFreq: - return 1683000ULL; - case HocClkConfigValue_AutoRamCpuRamOCThreshold: - return 2666000ULL; case HocClkConfigValue_ThermalThrottleThreshold: return 70ULL; case HocClkConfigValue_CpuGovernorMinimumFreq: @@ -669,7 +653,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_GPUSchedulingMethod: case HocClkConfigValue_MarikoMiddleFreqs: case HocClkConfigValue_LiveGpuVoltage: - case HocClkConfigValue_AutoRAMCPUOverclock: case HocClkConfigValue_Watchdog: return (input & 0x1) == input; @@ -821,8 +804,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_MemoryFrequencyMeasurementMode: case HocClkConfigValue_RamDisplayUnit: case HocClkConfigValue_AulaDisplayColorPreset: - case HocClkConfigValue_AutoRamCpuCpuOCFreq: - case HocClkConfigValue_AutoRamCpuRamOCThreshold: case KipConfigValue_PcvDebugVerbosity: return true; case HocClkConfigValue_BatteryChargeCurrent: diff --git a/Source/hoc-clk/overlay/lang/ru.json b/Source/hoc-clk/overlay/lang/ru.json index 027d23e0..19365e69 100644 --- a/Source/hoc-clk/overlay/lang/ru.json +++ b/Source/hoc-clk/overlay/lang/ru.json @@ -152,9 +152,6 @@ "JEDEC.": "JEDEC.", "CPU Boost Clock": "Частота буста", - "Auto CPU RAM OC": "Буст CPU → Разг. RAM", - "Auto CPU RAM OC CPU clock": "Буст CPU: частота CPU", - "Auto CPU RAM OC Threshold": "Буст CPU: порог RAM", "Overwrite Boost Mode": "Перезаписать буст", "CPU UV": "Андервольт CPU", "CPU Unlock": "Разблокировка CPU", diff --git a/Source/hoc-clk/overlay/lang/zh-cn.json b/Source/hoc-clk/overlay/lang/zh-cn.json index 538c4178..bce28e3f 100644 --- a/Source/hoc-clk/overlay/lang/zh-cn.json +++ b/Source/hoc-clk/overlay/lang/zh-cn.json @@ -149,9 +149,6 @@ "RAM-Timing tBreak": "内存时序切换阈值", "CPU Boost Clock": "CPU加速频率", - "Auto CPU RAM OC": "高内存频率自动提频CPU", - "Auto CPU RAM OC CPU clock": "自动提频CPU频率", - "Auto CPU RAM OC Threshold": "自动提频触发阈值", "Overwrite Boost Mode": "接管系统CPU调度", "CPU UV": "CPU降压", "CPU Unlock": "CPU解锁", diff --git a/Source/hoc-clk/overlay/lang/zh-tw.json b/Source/hoc-clk/overlay/lang/zh-tw.json index 7b71ad2a..d791e049 100644 --- a/Source/hoc-clk/overlay/lang/zh-tw.json +++ b/Source/hoc-clk/overlay/lang/zh-tw.json @@ -147,9 +147,6 @@ "RAM-Timing tBreak": "記憶體時序切換閾值", "CPU Boost Clock": "CPU加速頻率", - "Auto CPU RAM OC": "高記憶體頻率自動提頻CPU", - "Auto CPU RAM OC CPU clock": "自動提頻CPU頻率", - "Auto CPU RAM OC Threshold": "自動提頻觸發閾值", "Overwrite Boost Mode": "接管系統CPU調度", "CPU UV": "CPU降壓", "CPU Unlock": "CPU解鎖", diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index 76cbbf1d..cecdd7ab 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -457,24 +457,6 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "The clock used for the CPU in \"boost mode\"", "Default: 1785 MHz" }; - case HocClkConfigValue_AutoRAMCPUOverclock: - return { - "When enabled, automatically raises the CPU clock to the configured OC frequency when RAM clock meets or exceeds the threshold to meet the increased voltage requirement.", - "Default: ON" - }; - - case HocClkConfigValue_AutoRamCpuCpuOCFreq: - return { - "The CPU clock (in MHz) applied when Auto High RAM CPU OC is enabled and the RAM threshold is met.", - "Default: 1683 MHz" - }; - - case HocClkConfigValue_AutoRamCpuRamOCThreshold: - return { - "The RAM clock threshold (in MHz) at or above which the Auto High RAM CPU OC will activate.", - "Default: 2133MHz" - }; - case HocClkConfigValue_OverwriteBoostMode: return { "If enabled, profiles can override the boost mode setting", diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 5b0226d5..d9f742e0 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -868,85 +868,6 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { addConfigButton(HocClkConfigValue_GPUSchedulingMethod, "GPU Scheduling Override Method", ValueRange(0, 0, 1, "", 0), "GPU Scheduling Override Method", &thresholdsDisabled, {}, gpuSchedMethodValues, false); - if (IsMariko()) { - addHeaderSpacer(); - this->listElement->addItem(new CompactCategoryHeader("RAM Settings")); - std::vector clkOptionsRamOc = { - NamedValue("1122 MHz", 1122000), NamedValue("1224 MHz", 1224000), NamedValue("1326 MHz", 1326000), NamedValue("1428 MHz", 1428000), - NamedValue("1581 MHz", 1581000), NamedValue("1683 MHz", 1683000, "Default"), NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), - NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), - NamedValue("2805 MHz", 2805000), - }; - - std::vector emcMaxClock = { - NamedValue("1600 MHz", 1600000), - NamedValue("1633 MHz", 1633000), - NamedValue("1666 MHz", 1666000), - NamedValue("1700 MHz", 1700000), - NamedValue("1733 MHz", 1733000), - NamedValue("1766 MHz", 1766000), - NamedValue("1800 MHz", 1800000), - NamedValue("1833 MHz", 1833000), - NamedValue("1866 MHz", 1866000, "JEDEC."), - NamedValue("1900 MHz", 1900000), - NamedValue("1933 MHz", 1933000), - NamedValue("1966 MHz", 1966000), - NamedValue("1996 MHz", 1996800, "JEDEC."), - NamedValue("2000 MHz", 2000000), - NamedValue("2033 MHz", 2033000), - NamedValue("2066 MHz", 2066000), - NamedValue("2100 MHz", 2100000), - NamedValue("2133 MHz", 2133000, "JEDEC."), - NamedValue("2166 MHz", 2166000), - NamedValue("2200 MHz", 2200000), - NamedValue("2233 MHz", 2233000), - NamedValue("2266 MHz", 2266000), - NamedValue("2300 MHz", 2300000), - NamedValue("2333 MHz", 2333000), - NamedValue("2366 MHz", 2366000), - NamedValue("2400 MHz", 2400000, "JEDEC."), - NamedValue("2433 MHz", 2433000), - NamedValue("2466 MHz", 2466000), - NamedValue("2500 MHz", 2500000), - NamedValue("2533 MHz", 2533000), - NamedValue("2566 MHz", 2566000), - NamedValue("2600 MHz", 2600000), - NamedValue("2633 MHz", 2633000), - NamedValue("2666 MHz", 2666000, "JEDEC."), - NamedValue("2700 MHz", 2700000), - NamedValue("2733 MHz", 2733000), - NamedValue("2766 MHz", 2766000), - NamedValue("2800 MHz", 2800000), - NamedValue("2833 MHz", 2833000), - NamedValue("2866 MHz", 2866000), - NamedValue("2900 MHz", 2900000), - NamedValue("2933 MHz", 2933000, "JEDEC."), - NamedValue("2966 MHz", 2966000), - NamedValue("3000 MHz", 3000000), - NamedValue("3033 MHz", 3033000), - NamedValue("3066 MHz", 3066000), - NamedValue("3100 MHz", 3100000), - NamedValue("3133 MHz", 3133000), - NamedValue("3166 MHz", 3166000), - NamedValue("3200 MHz", 3200000, "JEDEC."), - NamedValue("3233 MHz", 3233000, "±1720 speedo"), - NamedValue("3266 MHz", 3266000, "±1740 speedo"), - NamedValue("3300 MHz", 3300000, "±1760 speedo"), - NamedValue("3333 MHz", 3333000, "±1780 speedo"), - NamedValue("3366 MHz", 3366000, "±1800 speedo"), - NamedValue("3400 MHz", 3400000, "±1820 speedo"), - NamedValue("3433 MHz", 3433000, "±???? speedo"), - NamedValue("3466 MHz", 3466000, "±???? speedo"), - NamedValue("3500 MHz", 3500000, "±???? speedo"), - }; - addConfigToggle(HocClkConfigValue_AutoRAMCPUOverclock, "Auto CPU RAM OC"); - addConfigButton(HocClkConfigValue_AutoRamCpuCpuOCFreq, "Auto CPU RAM OC CPU clock", ValueRange(0, 0, 1, "", 1), "CPU Clock", - &thresholdsDisabled, {}, clkOptionsRamOc, false, false); - addConfigButton(HocClkConfigValue_AutoRamCpuRamOCThreshold, "Auto CPU RAM OC Threshold", ValueRange(0, 0, 1, "", 1), "RAM Clock", - &thresholdsDisabled, {}, emcMaxClock, false, false); - } - tsl::elm::CustomDrawer *chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Overriding the charge current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("can be dangerous and may cause", false, x + 20, y + 50, 18, tsl::style::color::ColorText); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 8c7865e1..0f2582e4 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -558,8 +558,6 @@ namespace mgr { prepareBoostExit = false; } - u32 ramTargetHz = GetNearestOverrideHz(HocClkModule_MEM); - bool returnRaw = false; // Return a value scaled to MHz instead of raw value for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { u32 oldHz = board::GetHz((HocClkModule)module); // Get Old hz (used primarily for DVFS Logic) @@ -608,20 +606,9 @@ namespace mgr { if (noGPU && module == HocClkModule_GPU) continue; - u32 autoCpuOcHz = 0; - if (module == HocClkModule_CPU && file::config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock) && !isBoost && - !mgr::isCpuGovernorEnabled && (board::GetSocType() == HocClkSocType_Mariko)) { - u32 threshold = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; - if (ramTargetHz >= threshold) - autoCpuOcHz = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; - } - - if (targetHz || autoCpuOcHz) { + if (targetHz) { maxHz = GetMaxAllowedHz((HocClkModule)module, gContext.profile); - nearestHz = targetHz ? GetNearestHz((HocClkModule)module, targetHz, maxHz) : 0; - - if (autoCpuOcHz > nearestHz) - nearestHz = GetNearestHz(HocClkModule_CPU, autoCpuOcHz, maxHz); + nearestHz = GetNearestHz((HocClkModule)module, targetHz, maxHz); if (nearestHz != gContext.freqs[module]) { file::utils::LogLine("[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", board::GetModuleName((HocClkModule)module, true), diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 8ab39d21..f72fe387 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -182,15 +182,6 @@ namespace mgr { if (++cpuTick > 50) { minHz = file::config::GetConfigValue(HocClkConfigValue_CpuGovernorMinimumFreq); - if (file::config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock)) { - u32 ramHz = mgr::gContext.freqs[HocClkModule_MEM]; - u32 threshold = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; - if (ramHz >= threshold) { - u32 overrideHz = (u32)file::config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; - if (overrideHz > minHz) - minHz = overrideHz; - } - } cpuTick = 0; } From e28d7d1206b69c95e0b614813eaffb5646a309e1 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 21:12:55 +0200 Subject: [PATCH 182/205] add back delay --- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 93cc4fb9..0819e1ee 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -656,9 +656,11 @@ namespace board { /* TODO: Dynamically get this from the PCV LUT? */ void UnstuckFreqWar() { u32 hz = board::GetHz(HocClkModule_CPU); - /* Voltage needs to be above the forced minimum voltage, so we set max for a short time. */ - /* This frequency is only applied for ~250ms. */ - board::SetHz(HocClkModule_CPU, ~0); + /* Voltage needs to be above the forced minimum voltage, so we set a high frequency (will be capped by pcv) for a short time. */ + /* This frequency is only applied for ~255ms. */ + constexpr u32 HighFreqVoltBump = 2091'000'000; + board::SetHz(HocClkModule_CPU, HighFreqVoltBump); + svcSleepThread(5'000'000); board::SetHz(HocClkModule_CPU, hz); } From 8403386f1a0080c57c85b483281adafd3337c821 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 7 Oct 2026 19:43:05 -0400 Subject: [PATCH 183/205] 64lut --- .../loader/source/oc/oc_common.hpp | 67 +++++----- .../source/oc/pcv/mariko/pcv_mariko.cpp | 6 + .../source/oc/pcv/mariko/pcv_mariko.hpp | 4 + .../source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 122 ++++++++++++++++++ .../source/oc/pcv/mariko/pcv_mariko_cpu.hpp | 33 ++++- .../source/oc/pcv/mariko/pcv_mariko_log.cpp | 2 + .../stratosphere/loader/source/oc/pcv/pcv.cpp | 31 +++-- .../loader/source/oc/pcv/pcv_asm.hpp | 26 ++++ Source/hoc-clk/sysmodule/src/board/board.cpp | 4 +- .../sysmodule/src/board/board_freq.cpp | 1 - .../sysmodule/src/board/board_volt.cpp | 13 +- .../sysmodule/src/board/board_volt.hpp | 6 +- Source/hoc-clk/sysmodule/src/file/kip.cpp | 29 +++-- Source/hoc-clk/sysmodule/src/file/kip.hpp | 1 + 14 files changed, 277 insertions(+), 68 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index cb360cdb..9c51fff8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -60,39 +60,42 @@ *(offset) = value; namespace ams::ldr { - R_DEFINE_ERROR_RESULT(OutOfRange, 1000); - R_DEFINE_ERROR_RESULT(InvalidMemPllmEntry, 1001); - R_DEFINE_ERROR_RESULT(InvalidMtcMagic, 1002); - R_DEFINE_ERROR_RESULT(InvalidMtcTable, 1003); - R_DEFINE_ERROR_RESULT(InvalidDvbTable, 1004); - R_DEFINE_ERROR_RESULT(InvalidCpuFreqVddEntry, 1005); - R_DEFINE_ERROR_RESULT(InvalidCpuVoltDfllEntry, 1006); - R_DEFINE_ERROR_RESULT(InvalidCpuDvfs, 1007); - R_DEFINE_ERROR_RESULT(InvalidCpuMinVolt, 1008); - R_DEFINE_ERROR_RESULT(InvalidGpuDvfs, 1009); - R_DEFINE_ERROR_RESULT(InvalidGpuFreqMaxPattern, 1010); - R_DEFINE_ERROR_RESULT(InvalidGpuPllEntry, 1011); - R_DEFINE_ERROR_RESULT(InvalidRegulatorEntry, 1012); - R_DEFINE_ERROR_RESULT(UninitializedPatcher, 1013); - R_DEFINE_ERROR_RESULT(UnsuccessfulPatcher, 1014); - R_DEFINE_ERROR_RESULT(SafetyCheckFailure, 1015); - R_DEFINE_ERROR_RESULT(InvalidMtcTablePattern, 1016); - R_DEFINE_ERROR_RESULT(InvalidSocVoltPattern, 1017); - R_DEFINE_ERROR_RESULT(InvalidSocVoltLimit, 1018); - R_DEFINE_ERROR_RESULT(InvalidEmcDvfsCount, 1019); - R_DEFINE_ERROR_RESULT(InvalidEmcSocLut, 1020); - R_DEFINE_ERROR_RESULT(InvalidEmcRateList, 1021); - R_DEFINE_ERROR_RESULT(InvalidNvLogRedirect, 1022); - R_DEFINE_ERROR_RESULT(InvalidBusFreqReloc, 1023); - R_DEFINE_ERROR_RESULT(HookArenaOutOfMemory, 1024); - R_DEFINE_ERROR_RESULT(HookPayloadTooLarge, 1025); - R_DEFINE_ERROR_RESULT(HookRelocationUnsupported, 1026); - R_DEFINE_ERROR_RESULT(HookSiteInvalid, 1027); - R_DEFINE_ERROR_RESULT(HookPayloadEscapes, 1028); - R_DEFINE_ERROR_RESULT(HookDataOutOfMemory, 1029); - R_DEFINE_ERROR_RESULT(HookUnavailable, 1030); - R_DEFINE_ERROR_RESULT(InvalidNvsrvDevTable, 1031); + R_DEFINE_ERROR_RESULT(OutOfRange, 1000); + R_DEFINE_ERROR_RESULT(InvalidMemPllmEntry, 1001); + R_DEFINE_ERROR_RESULT(InvalidMtcMagic, 1002); + R_DEFINE_ERROR_RESULT(InvalidMtcTable, 1003); + R_DEFINE_ERROR_RESULT(InvalidDvbTable, 1004); + R_DEFINE_ERROR_RESULT(InvalidCpuFreqVddEntry, 1005); + R_DEFINE_ERROR_RESULT(InvalidCpuVoltDfllEntry, 1006); + R_DEFINE_ERROR_RESULT(InvalidCpuDvfs, 1007); + R_DEFINE_ERROR_RESULT(InvalidCpuMinVolt, 1008); + R_DEFINE_ERROR_RESULT(InvalidGpuDvfs, 1009); + R_DEFINE_ERROR_RESULT(InvalidGpuFreqMaxPattern, 1010); + R_DEFINE_ERROR_RESULT(InvalidGpuPllEntry, 1011); + R_DEFINE_ERROR_RESULT(InvalidRegulatorEntry, 1012); + R_DEFINE_ERROR_RESULT(UninitializedPatcher, 1013); + R_DEFINE_ERROR_RESULT(UnsuccessfulPatcher, 1014); + R_DEFINE_ERROR_RESULT(SafetyCheckFailure, 1015); + R_DEFINE_ERROR_RESULT(InvalidMtcTablePattern, 1016); + R_DEFINE_ERROR_RESULT(InvalidSocVoltPattern, 1017); + R_DEFINE_ERROR_RESULT(InvalidSocVoltLimit, 1018); + R_DEFINE_ERROR_RESULT(InvalidEmcDvfsCount, 1019); + R_DEFINE_ERROR_RESULT(InvalidEmcSocLut, 1020); + R_DEFINE_ERROR_RESULT(InvalidEmcRateList, 1021); + R_DEFINE_ERROR_RESULT(InvalidNvLogRedirect, 1022); + R_DEFINE_ERROR_RESULT(InvalidBusFreqReloc, 1023); + R_DEFINE_ERROR_RESULT(HookArenaOutOfMemory, 1024); + R_DEFINE_ERROR_RESULT(HookPayloadTooLarge, 1025); + R_DEFINE_ERROR_RESULT(HookRelocationUnsupported, 1026); + R_DEFINE_ERROR_RESULT(HookSiteInvalid, 1027); + R_DEFINE_ERROR_RESULT(HookPayloadEscapes, 1028); + R_DEFINE_ERROR_RESULT(HookDataOutOfMemory, 1029); + R_DEFINE_ERROR_RESULT(HookUnavailable, 1030); + R_DEFINE_ERROR_RESULT(InvalidNvsrvDevTable, 1031); R_DEFINE_ERROR_RESULT(InvalidForceVerbosityPattern, 1032); + R_DEFINE_ERROR_RESULT(InvalidCpuLutMaxAsmPattern, 1033); + R_DEFINE_ERROR_RESULT(InvalidCpuLutHook, 1034); + } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 4db531f9..75479c91 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -48,6 +48,8 @@ namespace ams::ldr::hoc::pcv::mariko { R_TRY(SharedClkBusInstallHooks(data)); + R_TRY(LutWriterInstallHooks(data)); + #if HOC_UART_LOG R_TRY(ForceVebosityInstallHooks(data)); #endif @@ -90,6 +92,10 @@ namespace ams::ldr::hoc::pcv::mariko { { "Bus Freq Reloc", &BusFreqReloc, 1, &BusFreqRelocPatternFn }, { "SOC Volt Asm", &SocVoltAsm, 1, &SocVoltPatternFn }, { "SOC Volt Limit", &SocVoltLimit, 1, nullptr, SocVoltLimitOfficial }, + { "CPU Lut Max Asm", &CpuLutMaxAsm, 1, &CpuLutAsmPatternFn }, + { "CPU Lut Max Asm2", &CpuLutMaxAsm2, 1, &CpuLutAsmPatternFn2 }, + { "CPU Lut Writer", &LutWriterFind, 1, &LutWriterPatternFn }, + /* Debugging patches */ #if HOC_UART_LOG { "NvLog Redirect", &NvLogUartRedirect, 1, &NvLogVsnprintfPatternFn, 0, 0, true }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index 0bc99c18..fc41c7b2 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -23,6 +23,7 @@ #include "../../oc_common.hpp" #include "../pcv_common.hpp" #include "../pcv_asm.hpp" +#include "../pcv_hook.hpp" namespace ams::ldr::hoc::pcv::mariko { @@ -34,6 +35,9 @@ namespace ams::ldr::hoc::pcv::mariko { uintptr_t originalFnCallback; u32 table[BusFreqTableCount][EmcDvfsTableEntryCount]; /* Original bus table size: 32. */ } busData; + struct { + uintptr_t orig; /* ClDvfsLut64ExpandImpl to CLDVFS LUT writer trampoline. */ + } lut64; #if HOC_UART_LOG u32 verbosityLevel; #endif diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 64e48b70..68665a5e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -235,4 +235,126 @@ namespace ams::ldr::hoc::pcv::mariko { R_SUCCEED(); } + /* Little helper for ORR:LSL pairs which are found in here */ + inline bool IsOrrLsl(u32 w) { + if (!_asm::IsOp(w, _asm::op::OrrShifted32, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm, _asm::field::Shift, _asm::field::Imm6)) + return false; + return _asm::Get(w, _asm::field::Shift) == 0; /* 0=LSL, 1=LSR, 2=ASR, 3=ROR */ + } + + /* Probably overcomplicated but I wanted to have a rock-solid way to do this regardless of FW version */ + Result CpuLutMaxAsm(u32* ptr) { + /* Check for the dual ORR-LSL pairs*/ + R_UNLESS(IsOrrLsl(ptr[2]), ldr::ResultInvalidCpuLutMaxAsmPattern()); + R_UNLESS(IsOrrLsl(ptr[3]), ldr::ResultInvalidCpuLutMaxAsmPattern()); + /* We can safely assume that we are in the right place now */ + + /* Safety check */ + R_UNLESS(ptr - 10 >= nsoStart, ldr::ResultInvalidCpuLutMaxAsmPattern()); + + /* Search for the STRB */ + u32* strb = _asm::ScanAssembly(ptr - 10, 10, _asm::Encode(_asm::op::StrbImm, + {_asm::field::Rt, 0}, {_asm::field::Rn, 0}, {_asm::field::Off1, 0x25D}), _asm::field::Rt, + _asm::field::Rn); + R_UNLESS(strb != nullptr, ldr::ResultInvalidCpuLutMaxAsmPattern()); + + /* Probably a cleaner way to do this?*/ + u32 *prod = strb + 2; + const u32 rd = _asm::Get(*prod, _asm::field::Rd); + const u32 off = static_cast(prod - nsoStart) * 4; + const u32 old = *prod; + if (_asm::IsOp(*prod, _asm::op::Ubfm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Immr, _asm::field::Imm6)) { + /* replacement must carry LSL#16 to make up for ubfiz's remoal */ + const u32 nw = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, 0x3F}, {_asm::field::Hw, 1}); + PATCH_OFFSET(prod, nw); /* movz wD,#0x3F,LSL#16 */ + } else { + /* Imm12 is 7 for 0xff*/ + R_UNLESS(_asm::IsOp(*prod, _asm::op::AndImm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) && _asm::Get(*prod, _asm::field::Imm12) == 7, ldr::ResultInvalidCpuLutMaxAsmPattern()); + /* No need to do the lsl */ + const u32 nw = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, 0x3F}); + PATCH_OFFSET(prod, nw); /* movz wD,#0x3F */ + } + + /* Set SAFE to entry 32 */ + PATCH_OFFSET(ptr + 1, _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, _asm::Get(ptr[1], _asm::field::Rd)}, {_asm::field::Imm16, 0x20})); + + R_SUCCEED(); + } + + namespace { + struct { + u32 *site = nullptr; /* LUT writer prologue. */ + } lutWriterCache; + } + + HOOK_PAYLOAD_FN void CpuLutWriterExpandImpl(u64 param) { + HookPayloadData *data = HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); + reinterpret_cast(data->lut64.orig)(param); + + /* *(param+8) = CLDVFS mapping */ + const u64 base = *reinterpret_cast(param + 8); + u32 *lut = reinterpret_cast(base + 0x200); + + /* Expand the LUT in place */ + const u32 last = lut[31]; + lut[62] = last; + lut[63] = last; + + for (int i = 30; i >= 0; --i) { + const u32 a = lut[i]; + const u32 b = lut[i + 1]; /* dst 2*(i+1) > src i+1 */ + lut[2 * i] = a; + lut[2 * i + 1] = (a + b) >> 1; + } + __asm__ volatile("dsb st" ::: "memory"); + } + + Result LutWriterFind(u32 *ptr) { + R_UNLESS(LutWriterPatternFn(ptr), ldr::ResultInvalidCpuLutHook()); + + u32 *prog = _asm::FindFnPrologue(ptr, 140, nsoStart); + R_UNLESS(prog != nullptr, ldr::ResultInvalidCpuLutHook()); + + /* Prolouge must hold MMIO base, so obtain it. */ + bool ok = false; + for (u32 i = 0; i < 8; ++i) { + if (_asm::IsOp(prog[i], _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(prog[i], _asm::field::Rn) == 0 + && _asm::Get(prog[i], _asm::field::Off8) == 0x8) { + ok = true; + break; + } + } + + R_UNLESS(ok, ldr::ResultInvalidCpuLutHook()); + lutWriterCache.site = prog; + + R_SUCCEED(); + } + + Result LutWriterInstallHooks(HookPayloadData *data) { + R_UNLESS(lutWriterCache.site != nullptr, ldr::ResultInvalidCpuLutHook()); + + uintptr_t orig = 0; + R_TRY(INSTALL_IMPL_HOOK_ORIG(lutWriterCache.site, CpuLutWriterExpandImpl, &orig)); + data->lut64.orig = orig; + + R_SUCCEED(); + } + + Result CpuLutMaxAsm2(u32* ptr) { + /* movk w?,#0xFFC0,LSL#16 */ + R_UNLESS(_asm::IsOp(ptr[1], _asm::op::MovkW, _asm::field::Rd, _asm::field::Imm16, _asm::field::Hw) + && _asm::Get(ptr[1], _asm::field::Imm16) == 0xFFC0 + && _asm::Get(ptr[1], _asm::field::Hw) == 1, ldr::ResultInvalidCpuLutMaxAsmPattern()); + + /* and x, x, #0xff */ + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::AndImm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) || + _asm::Get(ptr[2], _asm::field::Imm12) != 7, ldr::ResultInvalidCpuLutMaxAsmPattern()); + + const u32 rd = _asm::Get(ptr[2], _asm::field::Rd); + PATCH_OFFSET(ptr + 2, _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, 0x3F})); /* movz wD,#0x3F */ + + R_SUCCEED(); + } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp index 0ab58912..a7b5bb4c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp @@ -23,9 +23,28 @@ #pragma once #include "../pcv.hpp" +#include "../pcv_asm.hpp" +#include "../pcv_hook.hpp" namespace ams::ldr::hoc::pcv::mariko { + extern u32 *nsoStart; + + /* Maybe a cleaner way to do this? */ + inline bool LutWriterPatternFn(u32 *ptr) { + if (_asm::IsOp(*ptr, _asm::op::AndImm64, _asm::field::Rd, _asm::field::Rn, _asm::field::Immr, _asm::field::Imm6) + && _asm::Get(*ptr, _asm::field::Immr) == 61 && _asm::Get(*ptr, _asm::field::Imm6) == 7) + return true; + if (_asm::IsOp(*ptr, _asm::op::AndImm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) + && _asm::Get(*ptr, _asm::field::Imm12) == 0x747) + return true; + return false; + } + + HOOK_PAYLOAD_FN void CpuLutWriterExpandImpl(u64 param); + Result LutWriterFind(u32 *ptr); + Result LutWriterInstallHooks(HookPayloadData *data); + constexpr cvb_entry_t CpuCvbTableDefault[] = { { 204000, { 721589, -12695, 27 }, { } }, { 306000, { 747134, -14195, 27 }, { } }, @@ -63,10 +82,22 @@ namespace ams::ldr::hoc::pcv::mariko { /* Refer to customize.cpp for more information */ static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, 2'805'000 }; - Result CpuFreqVdd(u32 *ptr); Result CpuVoltDVFS(u32 *ptr); Result CpuVoltThermals(u32 *ptr); Result CpuVoltDfll(u32 *ptr); + Result CpuLutMaxAsm(u32* ptr); + Result CpuLutMaxAsm2(u32* ptr); + ALWAYS_INLINE bool CpuLutAsmPatternFn(u32* ptr) { + /* Check if it is a DSB ST, a common indication of CL-DVFS related functions */ + return *ptr == _asm::Dsb(_asm::barrier::St); + } + + ALWAYS_INLINE bool CpuLutAsmPatternFn2(u32* ptr) { + /* Note: We are doing multiple checks here as it is the cleanest method */ + return _asm::IsOp(*ptr, _asm::op::MovzW, _asm::field::Rd, _asm::field::Imm16, _asm::field::Hw) + && _asm::Get(*ptr, _asm::field::Imm16) == 0xC0FF + && _asm::Get(*ptr, _asm::field::Hw) == 0; + } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp index 5f24e677..0377aade 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_log.cpp @@ -231,6 +231,8 @@ namespace ams::ldr::hoc::pcv::mariko { R_DISCARD(INSTALL_IMPL_HOOK(forceVerbosityCache.sites[i], ForceVerbosityImpl)); } } + + R_SUCCEED(); } #endif diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index bd35f3bd..42fd2423 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -82,6 +82,7 @@ namespace ams::ldr::hoc::pcv { u32 max; u32 panic; bool value_required = false; + const char *name = "unnamed"; Result Check() { if (!value_required && !value) { @@ -147,26 +148,28 @@ namespace ams::ldr::hoc::pcv { } Validator validators[] = { - { C.eristaCpuBoostClock, 1020'000, 2397'000, panic::Cpu, true }, - { C.marikoCpuBoostClock, 1020'000, 2805'000, panic::Cpu, true }, - { C.eristaCpuMaxVolt, 1000, 1260, panic::Cpu, }, - { C.marikoCpuMaxVolt, 1000, 1235, panic::Cpu, }, - { eristaCpuDvfsMaxFreq, 1785'000, 2397'000, panic::Cpu, }, - { marikoCpuDvfsMaxFreq, 1785'000, 2805'000, panic::Cpu, }, - { C.commonEmcMemVolt, 912'500, 1350'000, panic::Emc, }, /* Official vmax for the RAMs is 1400-1500mV */ - { C.eristaEmcMaxClock, 1600'000, 2600'000, panic::Emc, }, - { C.marikoEmcMaxClock, 1600'000, 3500'000, panic::Emc, }, - { C.marikoEmcVddqVolt, 400'000, 750'000, panic::Emc, }, - { C.marikoSocVmax, 1000, 1200, panic::Emc, }, - { eristaGpuDvfsMaxFreq, 768'000, 1152'000, panic::Gpu, }, - { marikoGpuDvfsMaxFreq, 768'000, 1574'400, panic::Gpu, }, - { C.marikoGpuVmax, 800, 995, panic::Gpu, }, /* Official GPU vMax is 1050mV */ + { C.eristaCpuBoostClock, 1020'000, 2397'000, panic::Cpu, true, "eristaCpuBoostClock" }, + { C.marikoCpuBoostClock, 1020'000, 2805'000, panic::Cpu, true, "marikoCpuBoostClock" }, + { C.eristaCpuMaxVolt, 1000, 1260, panic::Cpu, false, "eristaCpuMaxVolt" }, + { C.marikoCpuMaxVolt, 1000, 1235, panic::Cpu, false, "marikoCpuMaxVolt" }, + { eristaCpuDvfsMaxFreq, 1785'000, 2397'000, panic::Cpu, false, "eristaCpuDvfsMaxFreq"}, + { marikoCpuDvfsMaxFreq, 1785'000, 2805'000, panic::Cpu, false, "marikoCpuDvfsMaxFreq"}, + { C.commonEmcMemVolt, 912'500, 1350'000, panic::Emc, false, "commonEmcMemVolt" }, /* Official vmax for the RAMs is 1400-1500mV */ + { C.eristaEmcMaxClock, 1600'000, 2600'000, panic::Emc, false, "eristaEmcMaxClock" }, + { C.marikoEmcMaxClock, 1600'000, 3500'000, panic::Emc, false, "marikoEmcMaxClock" }, + { C.marikoEmcVddqVolt, 400'000, 750'000, panic::Emc, false, "marikoEmcVddqVolt" }, + { C.marikoSocVmax, 1000, 1200, panic::Emc, false, "marikoSocVmax" }, + { eristaGpuDvfsMaxFreq, 768'000, 1152'000, panic::Gpu, false, "eristaGpuDvfsMaxFreq"}, + { marikoGpuDvfsMaxFreq, 768'000, 1574'400, panic::Gpu, false, "marikoGpuDvfsMaxFreq"}, + { C.marikoGpuVmax, 800, 995, panic::Gpu, false, "marikoGpuVmax" }, /* Official GPU vMax is 1050mV */ }; for (auto &v : validators) { if (R_FAILED(v.Check())) { + LOGGING("Validation FAIL: %s value=%u min=%u max=%u", v.name, static_cast(v.value), v.min, v.max); panic::SmcError(v.panic); CRASH("Validation FAIL"); + } } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp index c5d030a8..86c5f044 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp @@ -66,6 +66,7 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr Descriptor Sh {22, 1}; constexpr Descriptor Shift {22, 2}; /* ADD/SUB (shifted register) shift type */ constexpr Descriptor Imm6 {10, 6}; /* ADD/SUB (shifted register) shift amount */ + constexpr Descriptor Immr {16, 6}; /* UBFM immr */ constexpr Descriptor Imm16 { 5, 16}; /* MOVZ/MOVK/MOVN immediate */ constexpr Descriptor Imm12 {10, 12}; /* ADD/SUB (immediate) */ @@ -77,6 +78,8 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr Descriptor Off1 {10, 12, 0}; /* LDRB/STRB */ constexpr Descriptor Off4 {10, 12, 2}; /* 32-bit LDR/STR */ + + constexpr Descriptor Barrier { 8, 4}; /* DSB/DMB option (CRm) */ constexpr Descriptor Off8 {10, 12, 3}; /* 64-bit LDR/STR */ constexpr Descriptor PairOff8 {15, 7, 3}; /* X pairs */ @@ -114,6 +117,9 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr u32 MovnW = 0x12800000; constexpr u32 AddShifted64 = 0x8B000000; + constexpr u32 AndImm32 = 0x12000000; + constexpr u32 AndImm64 = 0x92400000; + constexpr u32 Ubfm32 = 0x53000000; /* UBFIZ/UBFX/LSL aliases */ constexpr u32 OrrShifted32 = 0x2A000000; constexpr u32 OrrShifted64 = 0xAA000000; constexpr u32 SubsShifted32 = 0x6B000000; @@ -140,6 +146,18 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr u32 Adrp = 0x90000000; constexpr u32 Svc = 0xD4000001; + + constexpr u32 Dsb = 0xD503309F; /* DSB, option cleared */ + constexpr u32 Dmb = 0xD50330BF; /* DMB, option cleared */ + constexpr u32 Isb = 0xD5033FDF; /* ISB SY (only valid option) */ + } + + /* Barrier options (CRm). */ + namespace barrier { + constexpr u32 Sy = 0xFu, St = 0xEu, Ld = 0xDu; + constexpr u32 Ish = 0xBu, Ishst = 0xAu, Ishld = 0x9u; + constexpr u32 Nsh = 0x7u, Nshst = 0x6u, Nshld = 0x5u; + constexpr u32 Osh = 0x3u, Oshst = 0x2u, Oshld = 0x1u; } constexpr u32 Get(u32 ins, field::Descriptor f) { @@ -217,6 +235,14 @@ namespace ams::ldr::hoc::pcv::_asm { return Set(Set(ins, field::ImmAdrpHi, imm21 >> 2), field::ImmAdrpLo, imm21 & 0x3u); } + constexpr u32 Dsb(u32 opt) { + return Encode(op::Dsb, {field::Barrier, opt}); + } + + constexpr u32 Dmb(u32 opt) { + return Encode(op::Dmb, {field::Barrier, opt}); + } + constexpr u32 MovReg64(u32 rd, u32 rm) { return Encode(op::OrrShifted64, {field::Rd, rd}, {field::Rn, reg::Xzr}, {field::Rm, rm}); } diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 0a71ed1c..de2a7ede 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -53,6 +53,8 @@ #include "../i2c/max77620_wdt.hpp" #include "../mgr/clock_manager.hpp" #include "../file/config.hpp" +#include "../file/kip.hpp" + namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -271,7 +273,7 @@ namespace board { display::Initialize(&cfg); CacheDfllData(); - InitializeCpuLut(); + InitializeCpuLut(file::kip::IsKipLoaded()); CacheGpuVoltTable(); rc = pscmInitialize(); diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 0e8944aa..5e714da8 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -121,7 +121,6 @@ namespace board { svcSleepThread(300'000); ClkrstSetHz(session, pcvHz); } - clkrstCloseSession(&session); } else { PcvSetHz(GetPcvModule(module), pcvHz); diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 0819e1ee..c0502b24 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -611,13 +611,14 @@ namespace board { } namespace { - constexpr size_t LutSize = 33; + constexpr size_t MaxPotentialLutSize = 64; + size_t LutSize = 33; constexpr u32 PmicVmin = 250; constexpr u32 PmicStep = 5; struct { volatile u32 *lut = nullptr; - u32 table[LutSize] = {}; + u32 table[MaxPotentialLutSize] = {}; u32 lastVmin = 0; u32 outputCfg = 0; bool initialized = false; @@ -742,11 +743,13 @@ namespace board { } } - void InitializeCpuLut() { + void InitializeCpuLut(bool kip) { InitializeLutPtr(); CacheCpuLut(); cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); - + if(kip) { + LutSize = 63; /* Account for patched LUT by KIP */ + } cpuVoltData.initialized = true; } @@ -786,7 +789,6 @@ namespace board { return baseVolt; } - void ApplyCpuMinVolt(u32 vmin, bool force) { if(!force) { if (!cpuVoltData.initialized || (vmin == cpuVoltData.lastVmin)) { @@ -830,5 +832,4 @@ namespace board { cpuVoltData.lastVmin = vmin; } - } diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index 215afaf1..49fa4be8 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -59,8 +59,10 @@ namespace board { void PcvHijackGpuVolts(u32 vmin); void PcvHijackGpuFrequency(u32 voltage, u32 hz); u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); - - void InitializeCpuLut(); + void ClDvfsSetOutputCfg(u8 safe, u8 max, u8 min); + void LogOutputCfg(const char *tag); + void SetSafeToMaxAndRelock(); + void InitializeCpuLut(bool kip); void ApplyCpuMinVolt(u32 vmin, bool force); u32 GetMinimumCpuVmin(u32 freqMhz, u32 bracket); diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 17277af6..6ee37cb7 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -173,21 +173,28 @@ namespace file::kip { } bool IsKipLoaded() { - constexpr u32 ExpectedMagic = 0x686F634D; - constexpr uintptr_t LoadMagicAddress = 0x4003DC00; - u32 iramValue = {}; + static bool ran = false; + static bool loaded = false; + if(!ran) { + constexpr u32 ExpectedMagic = 0x686F634D; + constexpr uintptr_t LoadMagicAddress = 0x4003DC00; + u32 iramValue = {}; - SmcCopyFromIram(&iramValue, LoadMagicAddress, sizeof(iramValue)); + SmcCopyFromIram(&iramValue, LoadMagicAddress, sizeof(iramValue)); - if (iramValue == ExpectedMagic) { - iramValue = 0; - SmcCopyToIram(LoadMagicAddress, &iramValue, sizeof(iramValue)); - return true; + if (iramValue == ExpectedMagic) { + iramValue = 0; + SmcCopyToIram(LoadMagicAddress, &iramValue, sizeof(iramValue)); + loaded = true; + } else { + hos::WriteNotification("Kip is not loaded!"); + file::utils::LogLine("Kip was not loaded!"); + loaded = false; + } + ran = true; } - hos::WriteNotification("Kip is not loaded!"); - file::utils::LogLine("Kip was not loaded!"); - return false; + return loaded; } // I know this is very hacky, but the config system in the sysmodule doesn't really support writing diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 9c692cfe..7c229ff9 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -825,4 +825,5 @@ namespace file::kip { void MigrateKipData(u32 custRev, u32 version); void SetKipData(); void GetKipData(); + bool IsKipLoaded(); } // namespace file::kip \ No newline at end of file From 87d02142882eae449ca485994520274c5d4ac31c Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 7 Oct 2026 19:49:11 -0400 Subject: [PATCH 184/205] remove some unused logging variables --- .../loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 68665a5e..d394a160 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -261,8 +261,6 @@ namespace ams::ldr::hoc::pcv::mariko { /* Probably a cleaner way to do this?*/ u32 *prod = strb + 2; const u32 rd = _asm::Get(*prod, _asm::field::Rd); - const u32 off = static_cast(prod - nsoStart) * 4; - const u32 old = *prod; if (_asm::IsOp(*prod, _asm::op::Ubfm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Immr, _asm::field::Imm6)) { /* replacement must carry LSL#16 to make up for ubfiz's remoal */ const u32 nw = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, 0x3F}, {_asm::field::Hw, 1}); @@ -299,7 +297,7 @@ namespace ams::ldr::hoc::pcv::mariko { const u32 last = lut[31]; lut[62] = last; lut[63] = last; - + for (int i = 30; i >= 0; --i) { const u32 a = lut[i]; const u32 b = lut[i + 1]; /* dst 2*(i+1) > src i+1 */ From 9ca050d3b516e17f33cab16d3f8faa4c6b99328e Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 8 Oct 2026 18:41:44 -0400 Subject: [PATCH 185/205] cpu lut patch fixes + crash fixes --- .../loader/source/oc/oc_common.hpp | 2 +- .../source/oc/pcv/mariko/pcv_mariko.cpp | 1 + .../source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 99 ++++++++++++++++++- .../source/oc/pcv/mariko/pcv_mariko_cpu.hpp | 9 +- .../loader/source/oc/pcv/pcv_asm.hpp | 4 + .../sysmodule/src/board/board_volt.cpp | 20 +++- 6 files changed, 126 insertions(+), 9 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 9c51fff8..f7d797a7 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -95,7 +95,7 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(InvalidForceVerbosityPattern, 1032); R_DEFINE_ERROR_RESULT(InvalidCpuLutMaxAsmPattern, 1033); R_DEFINE_ERROR_RESULT(InvalidCpuLutHook, 1034); - + R_DEFINE_ERROR_RESULT(InvalidDvcoRateConfig, 1035); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 75479c91..5bbda9a8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -95,6 +95,7 @@ namespace ams::ldr::hoc::pcv::mariko { { "CPU Lut Max Asm", &CpuLutMaxAsm, 1, &CpuLutAsmPatternFn }, { "CPU Lut Max Asm2", &CpuLutMaxAsm2, 1, &CpuLutAsmPatternFn2 }, { "CPU Lut Writer", &LutWriterFind, 1, &LutWriterPatternFn }, + { "CPU Dvco Rate Cfg", &CpuLutDvcoRateCfg, 1, &CpuLutDvcoRateCfgPatternFn }, /* Debugging patches */ #if HOC_UART_LOG diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index d394a160..37d4709c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -273,8 +273,8 @@ namespace ams::ldr::hoc::pcv::mariko { PATCH_OFFSET(prod, nw); /* movz wD,#0x3F */ } - /* Set SAFE to entry 32 */ - PATCH_OFFSET(ptr + 1, _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, _asm::Get(ptr[1], _asm::field::Rd)}, {_asm::field::Imm16, 0x20})); + /* Set SAFE to entry 31 */ + PATCH_OFFSET(ptr + 1, _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, _asm::Get(ptr[1], _asm::field::Rd)}, {_asm::field::Imm16, 0x1F})); R_SUCCEED(); } @@ -355,4 +355,99 @@ namespace ams::ldr::hoc::pcv::mariko { R_SUCCEED(); } + + + /* FW 20.4.0 + 71000571dc 01 01 00 d0 adrp param_2=>aCldvfssetdvcor,aSSRequestedDKh+0x1f = "ClDvfsSetDvcoRateMin" + = " %s divider %#x diff %d\n" + 71000571e0 21 40 27 91 add param_2=>aCldvfssetdvcor,param_2,#0x9d0 = "ClDvfsSetDvcoRateMin" + 71000571e4 c3 9f ff 97 bl nn::pcv::NvLog undefined NvLog(char * fmt, ...) + loc_71000571E8 XREF[1]: 71000571b4(j) + 71000571e8 69 aa 42 a9 ldp x9,x10,[x19, #0x28] + 71000571ec 4a fd 41 d3 lsr x10,x10,#0x1 + 71000571f0 68 26 41 f9 ldr x8,[x19, #0x248] Anchor + 71000571f4 0b 0d 0a cb sub x11,x8,x10, LSL #0x3 Target + 71000571f8 6b 4e 01 f9 str x11,[x19, #0x298] Verify1 + 71000571fc 2c 0d 40 f9 ldr x12,[x9, #0x18] Verify2 + 7100057200 7f 01 0c eb cmp x11,x12 + 7100057204 6b 81 8c 9a csel x11,x11,x12,hi + 7100057208 6b 4e 01 f9 str x11,[x19, #0x298] + 710005720c 2b c9 40 f9 ldr x11,[x9, #0x190] + 7100057210 6b 52 01 f9 str x11,[x19, #0x2a0] + 7100057214 8b 00 00 b4 cbz x11,loc_7100057224 + 7100057218 f4 4f 41 a9 ldp x20,x19,[sp, #local_10] + 710005721c fd 7b c2 a8 ldp x29=>local_20,x30,[sp], #0x20 + 7100057220 c0 03 5f d6 ret + loc_7100057224 XREF[1]: 7100057214(j) + 7100057224 08 15 0a 8b add x8,x8,x10, LSL #0x5 Target + 7100057228 2a 55 81 b9 ldrsw x10,[x9, #0x154] Anchor + 710005722c 68 52 01 f9 str x8,[x19, #0x2a0] Verify1 + + */ + + Result CpuLutDvcoRateCfg(u32* ptr) { + /* Anchor via scanning to prevent ordering issues */ + u32 *sub = _asm::ScanAssembly(ptr + 1, 4, + _asm::Encode(_asm::op::SubShifted64, {_asm::field::Rd, 0}, {_asm::field::Rn, 0}, {_asm::field::Rm, 0}, + {_asm::field::Shift, 0}, {_asm::field::Imm6, 3}), + _asm::field::Rd, _asm::field::Rn, _asm::field::Rm); + R_UNLESS(sub != nullptr, ldr::ResultInvalidDvcoRateConfig()); + + /* Verify */ + R_UNLESS(_asm::IsOp(sub[1], _asm::op::StrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(sub[1], _asm::field::Off8) == 0x298, ldr::ResultInvalidDvcoRateConfig()); + + /* 22.x uses pre-index ldr x?,[x?,#0x18]! here (0xF8418D6D class). */ + const bool isLdr18 = _asm::IsOp(sub[2], _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(sub[2], _asm::field::Off8) == 0x18; + const bool isLdrPre18 = _asm::IsOp(sub[2], _asm::op::LdrPreImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Imm9) + && _asm::Get(sub[2], _asm::field::Imm9) == 0x18; + R_UNLESS(isLdr18 || isLdrPre18, ldr::ResultInvalidDvcoRateConfig()); + + /* Patch the target */ + PATCH_OFFSET(sub, _asm::Encode(_asm::op::SubShifted64, + {_asm::field::Rd, _asm::Get(*sub, _asm::field::Rd)}, + {_asm::field::Rn, _asm::Get(*sub, _asm::field::Rn)}, + {_asm::field::Rm, _asm::Get(*sub, _asm::field::Rm)}, + {_asm::field::Shift, 0}, {_asm::field::Imm6, 4})); + + /* Search for the second anchor */ + u32* ldrsw = _asm::ScanAssembly(sub, 20, + _asm::Encode(_asm::op::LdrsWImm64, {_asm::field::Rt, 0}, {_asm::field::Rn, 0}, {_asm::field::Off4, 0x154}), + _asm::field::Rt, _asm::field::Rn); + + R_UNLESS(ldrsw != nullptr, ldr::ResultInvalidDvcoRateConfig()); + + /* Validate the str #0x2a0 */ + auto isCorrectStr = [](u32 w) { + return _asm::IsOp(w, _asm::op::StrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(w, _asm::field::Off8) == 0x2a0; + }; + R_UNLESS(isCorrectStr(ldrsw[1]) || isCorrectStr(ldrsw[2]), ldr::ResultInvalidDvcoRateConfig()); + + /* Validate the target in both directuins */ + /* Due to codegen difference */ + u32 *add = nullptr; + if (_asm::IsOp(ldrsw[-1], _asm::op::AddShifted64, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm, _asm::field::Shift, _asm::field::Imm6) + && _asm::Get(ldrsw[-1], _asm::field::Shift) == 0 + && _asm::Get(ldrsw[-1], _asm::field::Imm6) == 5) { + add = ldrsw - 1; + } + else if (_asm::IsOp(ldrsw[1], _asm::op::AddShifted64, _asm::field::Rd, _asm::field::Rn, _asm::field::Rm, _asm::field::Shift, _asm::field::Imm6) + && _asm::Get(ldrsw[1], _asm::field::Shift) == 0 + && _asm::Get(ldrsw[1], _asm::field::Imm6) == 5) { + add = ldrsw + 1; + } + + R_UNLESS(add != nullptr, ldr::ResultInvalidDvcoRateConfig()); + + /* Patch the second target */ + PATCH_OFFSET(add, _asm::Encode(_asm::op::AddShifted64, + {_asm::field::Rd, _asm::Get(*add, _asm::field::Rd)}, + {_asm::field::Rn, _asm::Get(*add, _asm::field::Rn)}, + {_asm::field::Rm, _asm::Get(*add, _asm::field::Rm)}, + {_asm::field::Shift, 0}, {_asm::field::Imm6, 6})); + + R_SUCCEED(); + } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp index a7b5bb4c..bbd5b7c8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp @@ -88,7 +88,8 @@ namespace ams::ldr::hoc::pcv::mariko { Result CpuVoltDfll(u32 *ptr); Result CpuLutMaxAsm(u32* ptr); Result CpuLutMaxAsm2(u32* ptr); - + Result CpuLutDvcoRateCfg(u32* ptr); + ALWAYS_INLINE bool CpuLutAsmPatternFn(u32* ptr) { /* Check if it is a DSB ST, a common indication of CL-DVFS related functions */ return *ptr == _asm::Dsb(_asm::barrier::St); @@ -100,4 +101,10 @@ namespace ams::ldr::hoc::pcv::mariko { && _asm::Get(*ptr, _asm::field::Imm16) == 0xC0FF && _asm::Get(*ptr, _asm::field::Hw) == 0; } + + ALWAYS_INLINE bool CpuLutDvcoRateCfgPatternFn(u32* ptr) { + /* Again, cleaner to ensure we are on the correct instruction here */ + return _asm::IsOp(*ptr, _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) + && _asm::Get(*ptr, _asm::field::Off8) == 0x248; + } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp index 86c5f044..5f9171ee 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp @@ -78,6 +78,7 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr Descriptor Off1 {10, 12, 0}; /* LDRB/STRB */ constexpr Descriptor Off4 {10, 12, 2}; /* 32-bit LDR/STR */ + constexpr Descriptor Imm9 {12, 9}; /* pre/post-index offset */ constexpr Descriptor Barrier { 8, 4}; /* DSB/DMB option (CRm) */ constexpr Descriptor Off8 {10, 12, 3}; /* 64-bit LDR/STR */ @@ -117,6 +118,7 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr u32 MovnW = 0x12800000; constexpr u32 AddShifted64 = 0x8B000000; + constexpr u32 SubShifted64 = 0xCB000000; constexpr u32 AndImm32 = 0x12000000; constexpr u32 AndImm64 = 0x92400000; constexpr u32 Ubfm32 = 0x53000000; /* UBFIZ/UBFX/LSL aliases */ @@ -130,8 +132,10 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr u32 LdrbImm = 0x39400000; constexpr u32 StrbImm = 0x39000000; constexpr u32 LdrImm32 = 0xB9400000; + constexpr u32 LdrsWImm64 = 0xB9800000; /* LDRSW x, 32-bit mem, Off4-scaled */ constexpr u32 StrImm32 = 0xB9000000; constexpr u32 LdrImm64 = 0xF9400000; + constexpr u32 LdrPreImm64 = 0xF8400C00; /* LDR (pre-index): bits 11:10 fixed */ constexpr u32 StrImm64 = 0xF9000000; constexpr u32 StpImm64 = 0xA9000000; diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index c0502b24..36f4aadc 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -659,7 +659,7 @@ namespace board { u32 hz = board::GetHz(HocClkModule_CPU); /* Voltage needs to be above the forced minimum voltage, so we set a high frequency (will be capped by pcv) for a short time. */ /* This frequency is only applied for ~255ms. */ - constexpr u32 HighFreqVoltBump = 2091'000'000; + constexpr u32 HighFreqVoltBump = 1963'000'000; board::SetHz(HocClkModule_CPU, HighFreqVoltBump); svcSleepThread(5'000'000); board::SetHz(HocClkModule_CPU, hz); @@ -737,6 +737,8 @@ namespace board { } void PadLutTail(u32 *lut, u32 validCount) { + if (validCount == 0) + return; for (u32 i = validCount; i < LutSize; ++i) { lut[i] = lut[validCount - 1]; } @@ -744,13 +746,21 @@ namespace board { } void InitializeCpuLut(bool kip) { - InitializeLutPtr(); - CacheCpuLut(); - cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); if(kip) { LutSize = 63; /* Account for patched LUT by KIP */ } + + InitializeLutPtr(); + + CacheCpuLut(); + + cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); + cpuVoltData.initialized = true; + + for(u32 i = 0; i < LutSize; i++) { + file::utils::LogLine("[dvfs] CPU Real LUT %d: %dmV", i, GetLutVolt(*(u32*)(cldvfs + CL_DVFS_LUT_TABLE_0 + (i * sizeof(u32))))); + } } /* TODO: Verify table on consoles */ @@ -804,7 +814,7 @@ namespace board { return; } - u32 tmpLut[LutSize]; + u32 tmpLut[MaxPotentialLutSize]; std::memcpy(tmpLut, cpuVoltData.table, sizeof(tmpLut)); const u32 minCode = std::min(GetLutCode(vmin), tmpLut[LutSize - 1]); From 6fa9e5ae299760d8e3fb1602c5c627aaa5ddb34f Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 8 Oct 2026 18:48:53 -0400 Subject: [PATCH 186/205] Update board_volt.cpp --- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 36f4aadc..4283cfff 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -758,7 +758,7 @@ namespace board { cpuVoltData.initialized = true; - for(u32 i = 0; i < LutSize; i++) { + for(u32 i = 0; i < LutSize + 1; i++) { file::utils::LogLine("[dvfs] CPU Real LUT %d: %dmV", i, GetLutVolt(*(u32*)(cldvfs + CL_DVFS_LUT_TABLE_0 + (i * sizeof(u32))))); } } From 9b1aab41280752081cda3b36571f67f83998ee44 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 9 Oct 2026 17:13:08 +0200 Subject: [PATCH 187/205] fix 64 lut off by one --- .../source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 28 +++++++++---------- .../sysmodule/src/board/board_volt.cpp | 10 +++---- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 37d4709c..4b8d905b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -253,8 +253,8 @@ namespace ams::ldr::hoc::pcv::mariko { R_UNLESS(ptr - 10 >= nsoStart, ldr::ResultInvalidCpuLutMaxAsmPattern()); /* Search for the STRB */ - u32* strb = _asm::ScanAssembly(ptr - 10, 10, _asm::Encode(_asm::op::StrbImm, - {_asm::field::Rt, 0}, {_asm::field::Rn, 0}, {_asm::field::Off1, 0x25D}), _asm::field::Rt, + u32* strb = _asm::ScanAssembly(ptr - 10, 10, _asm::Encode(_asm::op::StrbImm, + {_asm::field::Rt, 0}, {_asm::field::Rn, 0}, {_asm::field::Off1, 0x25D}), _asm::field::Rt, _asm::field::Rn); R_UNLESS(strb != nullptr, ldr::ResultInvalidCpuLutMaxAsmPattern()); @@ -272,9 +272,9 @@ namespace ams::ldr::hoc::pcv::mariko { const u32 nw = _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, rd}, {_asm::field::Imm16, 0x3F}); PATCH_OFFSET(prod, nw); /* movz wD,#0x3F */ } - - /* Set SAFE to entry 31 */ - PATCH_OFFSET(ptr + 1, _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, _asm::Get(ptr[1], _asm::field::Rd)}, {_asm::field::Imm16, 0x1F})); + + /* Set SAFE to entry 32 */ + PATCH_OFFSET(ptr + 1, _asm::Encode(_asm::op::MovzW, {_asm::field::Rd, _asm::Get(ptr[1], _asm::field::Rd)}, {_asm::field::Imm16, 32})); R_SUCCEED(); } @@ -294,16 +294,16 @@ namespace ams::ldr::hoc::pcv::mariko { u32 *lut = reinterpret_cast(base + 0x200); /* Expand the LUT in place */ - const u32 last = lut[31]; - lut[62] = last; - lut[63] = last; + const u32 top = lut[32]; - for (int i = 30; i >= 0; --i) { + for (int i = 31; i >= 0; --i) { const u32 a = lut[i]; const u32 b = lut[i + 1]; /* dst 2*(i+1) > src i+1 */ lut[2 * i] = a; lut[2 * i + 1] = (a + b) >> 1; } + + lut[63] = top; __asm__ volatile("dsb st" ::: "memory"); } @@ -318,7 +318,7 @@ namespace ams::ldr::hoc::pcv::mariko { for (u32 i = 0; i < 8; ++i) { if (_asm::IsOp(prog[i], _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) && _asm::Get(prog[i], _asm::field::Rn) == 0 - && _asm::Get(prog[i], _asm::field::Off8) == 0x8) { + && _asm::Get(prog[i], _asm::field::Off8) == 0x8) { ok = true; break; } @@ -347,7 +347,7 @@ namespace ams::ldr::hoc::pcv::mariko { && _asm::Get(ptr[1], _asm::field::Hw) == 1, ldr::ResultInvalidCpuLutMaxAsmPattern()); /* and x, x, #0xff */ - R_UNLESS(_asm::IsOp(ptr[2], _asm::op::AndImm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) || + R_UNLESS(_asm::IsOp(ptr[2], _asm::op::AndImm32, _asm::field::Rd, _asm::field::Rn, _asm::field::Imm12) || _asm::Get(ptr[2], _asm::field::Imm12) != 7, ldr::ResultInvalidCpuLutMaxAsmPattern()); const u32 rd = _asm::Get(ptr[2], _asm::field::Rd); @@ -362,7 +362,7 @@ namespace ams::ldr::hoc::pcv::mariko { = " %s divider %#x diff %d\n" 71000571e0 21 40 27 91 add param_2=>aCldvfssetdvcor,param_2,#0x9d0 = "ClDvfsSetDvcoRateMin" 71000571e4 c3 9f ff 97 bl nn::pcv::NvLog undefined NvLog(char * fmt, ...) - loc_71000571E8 XREF[1]: 71000571b4(j) + loc_71000571E8 XREF[1]: 71000571b4(j) 71000571e8 69 aa 42 a9 ldp x9,x10,[x19, #0x28] 71000571ec 4a fd 41 d3 lsr x10,x10,#0x1 71000571f0 68 26 41 f9 ldr x8,[x19, #0x248] Anchor @@ -378,7 +378,7 @@ namespace ams::ldr::hoc::pcv::mariko { 7100057218 f4 4f 41 a9 ldp x20,x19,[sp, #local_10] 710005721c fd 7b c2 a8 ldp x29=>local_20,x30,[sp], #0x20 7100057220 c0 03 5f d6 ret - loc_7100057224 XREF[1]: 7100057214(j) + loc_7100057224 XREF[1]: 7100057214(j) 7100057224 08 15 0a 8b add x8,x8,x10, LSL #0x5 Target 7100057228 2a 55 81 b9 ldrsw x10,[x9, #0x154] Anchor 710005722c 68 52 01 f9 str x8,[x19, #0x2a0] Verify1 @@ -438,7 +438,7 @@ namespace ams::ldr::hoc::pcv::mariko { && _asm::Get(ldrsw[1], _asm::field::Imm6) == 5) { add = ldrsw + 1; } - + R_UNLESS(add != nullptr, ldr::ResultInvalidDvcoRateConfig()); /* Patch the second target */ diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 4283cfff..903136a1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -746,19 +746,19 @@ namespace board { } void InitializeCpuLut(bool kip) { - if(kip) { - LutSize = 63; /* Account for patched LUT by KIP */ + if (kip) { + LutSize = 64; /* Account for patched LUT by KIP */ } - + InitializeLutPtr(); CacheCpuLut(); - + cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); cpuVoltData.initialized = true; - for(u32 i = 0; i < LutSize + 1; i++) { + for (u32 i = 0; i < LutSize; i++) { file::utils::LogLine("[dvfs] CPU Real LUT %d: %dmV", i, GetLutVolt(*(u32*)(cldvfs + CL_DVFS_LUT_TABLE_0 + (i * sizeof(u32))))); } } From 740f9ca61a39b0d4464bd2433594fb1868292107 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 9 Oct 2026 20:01:48 +0200 Subject: [PATCH 188/205] ldr: build 64 lut table ourselves instead of interpolating --- .../loader/source/oc/oc_common.hpp | 2 + .../source/oc/pcv/mariko/pcv_mariko.hpp | 1 + .../source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 198 ++++++++++++++++-- .../source/oc/pcv/mariko/pcv_mariko_cpu.hpp | 5 +- .../source/oc/pcv/mariko/pcv_mariko_soc.cpp | 2 +- .../loader/source/oc/pcv/pcv_common.hpp | 4 + 6 files changed, 190 insertions(+), 22 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index f7d797a7..7b44b948 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -96,6 +96,8 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(InvalidCpuLutMaxAsmPattern, 1033); R_DEFINE_ERROR_RESULT(InvalidCpuLutHook, 1034); R_DEFINE_ERROR_RESULT(InvalidDvcoRateConfig, 1035); + R_DEFINE_ERROR_RESULT(InvalidVoltCode, 1036); + R_DEFINE_ERROR_RESULT(InvalidVoltLutIndex, 1037); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp index fc41c7b2..d94273ca 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.hpp @@ -37,6 +37,7 @@ namespace ams::ldr::hoc::pcv::mariko { } busData; struct { uintptr_t orig; /* ClDvfsLut64ExpandImpl to CLDVFS LUT writer trampoline. */ + u32 table[ClDvfsLutSize]; } lut64; #if HOC_UART_LOG u32 verbosityLevel; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 4b8d905b..ca144674 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -25,17 +25,183 @@ namespace ams::ldr::hoc::pcv::mariko { - u32 CapCpuClock() { - u32 cpuCap = allowedCpuMaxFrequencies[0]; + namespace { + u32 CapCpuClock() { + u32 cpuCap = allowedCpuMaxFrequencies[0]; - for (u32 freq : allowedCpuMaxFrequencies) { - if (C.marikoCpuMaxClock >= freq) { - cpuCap = freq; - } else { - break; + for (u32 freq : allowedCpuMaxFrequencies) { + if (C.marikoCpuMaxClock >= freq) { + cpuCap = freq; + } else { + break; + } + } + return cpuCap; + } + + /* TODO: Reduce code duplication. */ + cvb_entry_t *GetDvfsTable() { + switch (C.tableConf) { + case TBREAK_1683: return const_cast(C.marikoCpuDvfsTable1683Tbreak); + case TBREAK_1581: return const_cast(C.marikoCpuDvfsTable1581Tbreak); + case EXTREME_TABLE: return const_cast(C.marikoCpuDvfsTableExtreme); + case DEFAULT_TABLE: + default: + return const_cast(mariko::CpuCvbTableDefault); } } - return cpuCap; + + /* Todo: Reduce code duplication of this. */ + Result GetCpuSpeedo(u32 &cpuSpeedo) { + constexpr u64 FusePhysicalAddress = 0x7000F000; + u64 virtualAddress = 0; + constexpr u64 Size = 0x1000; + + u64 outSize; + /* TODO: use svc::QueryMemoryMapping instead. */ + R_TRY(svcQueryMemoryMapping(&virtualAddress, &outSize, FusePhysicalAddress, Size)); + + constexpr u32 FuseOffset = 2048; + constexpr u32 CpuSpeedoOffset = 0x12C; + cpuSpeedo = *reinterpret_cast(virtualAddress + FuseOffset + CpuSpeedoOffset); + + R_SUCCEED(); + } + + u32 CalculateCvbVoltage(cvb_entry_t *entry, u32 speedo, u32 speedoScale) { + float speedDiv = static_cast(speedo) / speedoScale; + return ((entry->cvb_dfll_param.c2 * speedDiv + entry->cvb_dfll_param.c1) * speedDiv + entry->cvb_dfll_param.c0); + } + + u32 DivRoundUp(u32 n, u32 d) { + return (n + d - 1) / d; + } + + u32 RoundCvbVoltage(u32 mv, u32 vScale, u32 stepUv) { + u32 step = (stepUv ? stepUv : 1000) * vScale; + + u32 uv = mv * 1000; + uv = DivRoundUp(uv, step) * stepUv; + return uv / 1000; + } + + u32 EffVmin() { return C.marikoCpuLowVmin ? C.marikoCpuLowVmin : CpuVminOfficial; } + u32 EffVmax() { return C.marikoCpuMaxVolt ? C.marikoCpuMaxVolt : CpuVoltOfficial; } + + u32 ClampVoltage(u32 mv) { + return std::clamp(mv, EffVmin(), EffVmax()); + } + + constexpr u32 PmicBaseMv = 250; + constexpr u32 PmicStepMv = 5; + constexpr u32 PmicVoltCount = 256; + + u32 GetExactVoltCode(u32 mv) { + u32 alignMult = mv / PmicStepMv; + + for (u32 i = 0; i < PmicVoltCount; ++i) { + u32 regMult = (PmicBaseMv + i * PmicStepMv) / PmicStepMv; + if (alignMult == regMult) { + return i; + } + } + + return UINT32_MAX; + } + + u32 GetVoltCode(u32 mv) { + u32 alignMult = DivRoundUp(mv, PmicStepMv); + + for (u32 i = 0; i < PmicVoltCount; i++) { + u32 regMult = (PmicBaseMv + i * PmicStepMv) / PmicStepMv; + if (alignMult <= regMult) { + return i; + } + } + + return UINT32_MAX; + } + + Result BuildLut(u32 *lut, const u32 *voltArray) { + const u32 vMin = EffVmin(); + const u32 vMax = *std::max_element(voltArray, voltArray + ClDvfsLutSize); + R_UNLESS(vMin <= vMax, ldr::ResultInvalidCpuMinVolt()); + + u32 voltage = vMin; + u32 code = GetExactVoltCode(voltage); + R_UNLESS(code != UINT32_MAX, ldr::ResultInvalidVoltCode()); + lut[0] = code; + + u32 j = 1; + for (u32 i = 0; i < ClDvfsLutSize; ++i) { + for (;;) { + R_UNLESS(j < ClDvfsLutSize, ldr::ResultInvalidVoltLutIndex()); + + voltage += std::max(1u, (vMax - voltage) / (ClDvfsLutSize - j)); + if (voltage >= voltArray[i]) { + break; + } + + code = GetVoltCode(voltage); + R_UNLESS(code != UINT32_MAX, ldr::ResultInvalidVoltCode()); + if (code != lut[j - 1]) { + lut[j++] = code; + } + } + + voltage = (j == ClDvfsLutSize - 1) ? vMax : voltArray[i]; + code = GetExactVoltCode(voltage); + R_UNLESS(code != UINT32_MAX, ldr::ResultInvalidVoltCode()); + + if (code != lut[j - 1]) { + R_UNLESS(j < ClDvfsLutSize, ldr::ResultInvalidVoltLutIndex()); + lut[j++] = code; + } + + if (voltage >= vMax) { + break; + } + } + + for (u32 k = j; k < ClDvfsLutSize; ++k) { + lut[k] = lut[j - 1]; + } + + R_SUCCEED(); + } + + /* Since doing the proper lut creation in pcv is wasteful, we'll do it ourselves */ + Result FillLutTable(HookPayloadData *data) { + /* Step 1: Get the speedo. */ + u32 cpuSpeedo = 0; + R_TRY(GetCpuSpeedo(cpuSpeedo)); + + /* Step 2: Select the appropriate table. */ + cvb_entry_t *table = GetDvfsTable(); + constexpr u32 SpeedoScale = 100; + constexpr u32 VoltageScale = 1000; + constexpr u32 StepUv = 5000; + + /* Step 3: Fill the voltage array. */ + u32 voltArray[ClDvfsLutSize] = {}; + for (u32 i = 0; i < DvfsTableEntryLimit; ++i) { + u32 voltage = CalculateCvbVoltage(&table[i], cpuSpeedo, SpeedoScale); + voltage = RoundCvbVoltage(voltage, VoltageScale, StepUv); + voltage = ClampVoltage(voltage); + + voltArray[i] = voltage; + } + + /* Step 4: Build the lut table. */ + u32 lut[ClDvfsLutSize] = {}; + R_TRY(BuildLut(lut, voltArray)); + + /* Step 5: Copy it. */ + std::memcpy(data->lut64.table, lut, sizeof(lut)); + + /* Step 6: Finally done. */ + R_SUCCEED(); + } } Result CpuFreqVdd(u32 *ptr) { @@ -291,19 +457,11 @@ namespace ams::ldr::hoc::pcv::mariko { /* *(param+8) = CLDVFS mapping */ const u64 base = *reinterpret_cast(param + 8); - u32 *lut = reinterpret_cast(base + 0x200); + u32 *lut = reinterpret_cast(base + 0x200); - /* Expand the LUT in place */ - const u32 top = lut[32]; - - for (int i = 31; i >= 0; --i) { - const u32 a = lut[i]; - const u32 b = lut[i + 1]; /* dst 2*(i+1) > src i+1 */ - lut[2 * i] = a; - lut[2 * i + 1] = (a + b) >> 1; + for (u32 i = 0; i < ClDvfsLutSize; ++i) { + lut[i] = data->lut64.table[i]; } - - lut[63] = top; __asm__ volatile("dsb st" ::: "memory"); } @@ -333,6 +491,8 @@ namespace ams::ldr::hoc::pcv::mariko { Result LutWriterInstallHooks(HookPayloadData *data) { R_UNLESS(lutWriterCache.site != nullptr, ldr::ResultInvalidCpuLutHook()); + R_TRY(FillLutTable(data)); + uintptr_t orig = 0; R_TRY(INSTALL_IMPL_HOOK_ORIG(lutWriterCache.site, CpuLutWriterExpandImpl, &orig)); data->lut64.orig = orig; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp index bbd5b7c8..52a400cf 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.hpp @@ -78,7 +78,7 @@ namespace ams::ldr::hoc::pcv::mariko { static_assert(sizeof(cpuVoltagePatchValues) == sizeof(cpuVoltagePatchOffsets), "Invalid cpuVoltagePatch size"); static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 }; - + /* Refer to customize.cpp for more information */ static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, 2'805'000 }; @@ -89,7 +89,7 @@ namespace ams::ldr::hoc::pcv::mariko { Result CpuLutMaxAsm(u32* ptr); Result CpuLutMaxAsm2(u32* ptr); Result CpuLutDvcoRateCfg(u32* ptr); - + ALWAYS_INLINE bool CpuLutAsmPatternFn(u32* ptr) { /* Check if it is a DSB ST, a common indication of CL-DVFS related functions */ return *ptr == _asm::Dsb(_asm::barrier::St); @@ -107,4 +107,5 @@ namespace ams::ldr::hoc::pcv::mariko { return _asm::IsOp(*ptr, _asm::op::LdrImm64, _asm::field::Rt, _asm::field::Rn, _asm::field::Off8) && _asm::Get(*ptr, _asm::field::Off8) == 0x248; } + } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp index 432a7fab..e053248f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_soc.cpp @@ -35,7 +35,7 @@ namespace ams::ldr::hoc::pcv::mariko { R_TRY(svcQueryMemoryMapping(&virtualAddress, &outSize, FusePhysicalAddress, Size)); constexpr u32 FuseOffset = 2048; - constexpr u32 SocSpeedoOffset = 308; + constexpr u32 SocSpeedoOffset = 0x134; socSpeedo = *reinterpret_cast(virtualAddress + FuseOffset + SocSpeedoOffset); R_SUCCEED(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index 156da655..5f87b578 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -194,6 +194,7 @@ namespace ams::ldr::hoc::pcv { #define R_SKIP() R_SUCCEED() // Count 32 / Index 31 is reserved to be empty + /* The actual lut table has a size of 33. */ constexpr size_t DvfsTableEntryCount = 32; constexpr size_t DvfsTableEntryLimit = DvfsTableEntryCount - 1; @@ -204,6 +205,9 @@ namespace ams::ldr::hoc::pcv { // The pcv SoC-voltage DVB table is a fixed 32-entry region. (it doesn't need to be larger) constexpr size_t DvbTableCapacity = 32; + /* Note: According to TRM the lut size is 33, but up to 64 LUT is possible. */ + constexpr size_t ClDvfsLutSize = 64; + inline uintptr_t g_pcv_cave = 0; inline size_t g_pcv_cave_size = 0; From 69bd7e088f976d6301c64aa1e4f7147eaa0060f1 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 10 Oct 2026 13:49:53 +0200 Subject: [PATCH 189/205] ldr: fix offset --- .../stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index ca144674..0ffd0c5f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -62,7 +62,7 @@ namespace ams::ldr::hoc::pcv::mariko { R_TRY(svcQueryMemoryMapping(&virtualAddress, &outSize, FusePhysicalAddress, Size)); constexpr u32 FuseOffset = 2048; - constexpr u32 CpuSpeedoOffset = 0x12C; + constexpr u32 CpuSpeedoOffset = 0x114; cpuSpeedo = *reinterpret_cast(virtualAddress + FuseOffset + CpuSpeedoOffset); R_SUCCEED(); From dbc37c698295811a0a0b1b8aba3b3fd6ca4c2fc0 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 10 Oct 2026 15:45:07 +0200 Subject: [PATCH 190/205] ldr: avoid out of cave memory with a warcrime (overwriting dead destructor) --- .../loader/source/oc/oc_common.hpp | 1 + .../source/oc/pcv/mariko/pcv_mariko.cpp | 4 + .../source/oc/pcv/mariko/pcv_mariko_cave.cpp | 80 +++++++++++++++++++ .../source/oc/pcv/mariko/pcv_mariko_cave.hpp | 77 ++++++++++++++++++ .../loader/source/oc/pcv/pcv_asm.hpp | 36 +++++++++ .../loader/source/oc/pcv/pcv_hook.hpp | 10 +++ 6 files changed, 208 insertions(+) create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.cpp create mode 100644 Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.hpp diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 7b44b948..566cf14b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -98,6 +98,7 @@ namespace ams::ldr { R_DEFINE_ERROR_RESULT(InvalidDvcoRateConfig, 1035); R_DEFINE_ERROR_RESULT(InvalidVoltCode, 1036); R_DEFINE_ERROR_RESULT(InvalidVoltLutIndex, 1037); + R_DEFINE_ERROR_RESULT(InvalidHookCave, 1038); } namespace ams::ldr::hoc { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 5bbda9a8..253e0707 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -29,6 +29,7 @@ #include "pcv_mariko_mtc.hpp" #include "pcv_mariko_soc.hpp" #include "pcv_mariko_log.hpp" +#include "pcv_mariko_cave.hpp" #include "calculate_timings_mariko.hpp" namespace ams::ldr::hoc::pcv::mariko { @@ -39,6 +40,8 @@ namespace ams::ldr::hoc::pcv::mariko { DEFINE_HOOK_PAYLOAD_PTR(HookPayloadData, m_HookPayloadData); Result InstallHooks() { + R_TRY(CaveInstall()); + R_TRY(Hooks().CheckEnabled()); R_TRY(Hooks().CopyPayload()); @@ -96,6 +99,7 @@ namespace ams::ldr::hoc::pcv::mariko { { "CPU Lut Max Asm2", &CpuLutMaxAsm2, 1, &CpuLutAsmPatternFn2 }, { "CPU Lut Writer", &LutWriterFind, 1, &LutWriterPatternFn }, { "CPU Dvco Rate Cfg", &CpuLutDvcoRateCfg, 1, &CpuLutDvcoRateCfgPatternFn }, + { "Hook Cave", &DeadDestructorCaveFind, 0, &CaveFlagRunPatternFn, 0, 0, true }, /* Debugging patches */ #if HOC_UART_LOG diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.cpp new file mode 100644 index 00000000..e468d64b --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "pcv_mariko_cave.hpp" + +namespace ams::ldr::hoc::pcv::mariko { + + namespace { + + struct { + u32 *site = nullptr; + u32 *end = nullptr; + } caveCache; + + bool HasDirectCaller(const u32 *target, const u32 *begin, const u32 *end) { + for (const u32 *ptr = begin; ptr < end; ++ptr) { + const u32 top6 = *ptr & 0xFC000000u; + if (top6 != _asm::op::B && top6 != _asm::op::Bl) { + continue; + } + + if (_asm::Target26(*ptr, reinterpret_cast(ptr)) == reinterpret_cast(target)) { + return true; + } + } + + return false; + } + + } + + Result DeadDestructorCaveFind(u32 *ptr) { + u32 *textEnd = reinterpret_cast(g_pcv_cave); + + u32 *site = _asm::FindFnPrologue(ptr, CavePrologueMargin, nsoStart); + R_UNLESS(site != nullptr, ldr::ResultInvalidHookCave()); + + u32 *end = _asm::FindFnEnd(site, textEnd); + R_UNLESS(end != nullptr, ldr::ResultInvalidHookCave()); + + /* Ensure this function is never called. */ + R_UNLESS(!HasDirectCaller(site, nsoStart, textEnd), ldr::ResultInvalidHookCave()); + + caveCache.site = site; + caveCache.end = end; + R_SUCCEED(); + } + + Result CaveInstall() { + if (Hooks().CaveFree() >= HookContext::RequiredCaveSize()) { + R_SUCCEED(); + } + + R_UNLESS(caveCache.site != nullptr, ldr::ResultInvalidHookCave()); + + const uintptr_t start = util::AlignUp(reinterpret_cast(caveCache.site + 1), sizeof(u64)); + const uintptr_t end = reinterpret_cast(caveCache.end); + R_UNLESS(start < end && end - start >= HookContext::RequiredCaveSize(), ldr::ResultHookPayloadTooLarge()); + + /* Insert a break in case this function gets called for whatever reason. */ + *caveCache.site = _asm::BrkIns; + + Hooks().SetCave(start, end - start); + R_SUCCEED(); + } + +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.hpp new file mode 100644 index 00000000..7d177b49 --- /dev/null +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cave.hpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "../pcv.hpp" +#include "../pcv_asm.hpp" +#include "../pcv_hook.hpp" + +namespace ams::ldr::hoc::pcv::mariko { + + extern u32 *nsoStart; + + constexpr u32 CaveFlagChunkCount = 4; + constexpr u32 CaveFlagChunkInsCount = 4; + constexpr u32 CaveFlagLdrbDelta = 0x30; + constexpr u32 CavePrologueMargin = 8; + + /* This function consists of multiple chunks. */ + /* Each chunk does a load, a comparison and a conditional branch. The next chunk's address setup (adrp) follows right after it. */ + inline bool IsFlagCheckChunk(const u32 *ptr) { + return _asm::IsOp(ptr[0], _asm::op::LdrbImm, _asm::field::Rt, _asm::field::Rn, _asm::field::Off1) + && _asm::Ignoring(ptr[1], _asm::CmpImm32(0, 1), _asm::field::Rn) + && _asm::Ignoring(ptr[2], _asm::Encode(_asm::op::BCond, {_asm::field::BCond, _asm::cond::Eq}), _asm::field::Imm19); + } + + inline bool IsChunkDeltaValid(const u32 *prev, const u32 *next) { + return IsFlagCheckChunk(next) && _asm::Get(*next, _asm::field::Off1) == _asm::Get(*prev, _asm::field::Off1) + CaveFlagLdrbDelta; + } + + inline bool ValidateChunkConsistency(const u32 *first) { + for (u32 i = 1; i < CaveFlagChunkCount; ++i) { + if (!IsChunkDeltaValid(first + (i - 1) * CaveFlagChunkInsCount, first + i * CaveFlagChunkInsCount)) { + return false; + } + } + + return true; + } + + inline bool CaveFlagRunPatternFn(u32 *ptr) { + if (Hooks().CaveFree() >= HookContext::RequiredCaveSize()) { + return false; + } + /* In case we don't have enough cave memory, we need to commit this warcrime. */ + + /* Ensure we don't dereference invalid memory. */ + u32 *textEnd = reinterpret_cast(g_pcv_cave); + if (ptr - CaveFlagChunkInsCount < nsoStart || ptr + CaveFlagChunkCount * CaveFlagChunkInsCount > textEnd) { + return false; + } + + /* Validate the current chunk and the previous chunk and ensure the delta of the ldrb instructions is consistent. */ + if (!IsFlagCheckChunk(ptr) || IsChunkDeltaValid(ptr - CaveFlagChunkInsCount, ptr)) { + return false; + } + + return ValidateChunkConsistency(ptr); + } + + Result DeadDestructorCaveFind(u32 *ptr); + Result CaveInstall(); + +} diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp index 5f9171ee..5e901a52 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp @@ -26,6 +26,7 @@ namespace ams::ldr::hoc::pcv::_asm { constexpr u32 NopIns = 0xD503201F; constexpr u32 RetIns = 0xD65F03C0; + constexpr u32 BrkIns = 0xD4200000; constexpr u32 GetField(u32 ins, u8 lsb, u8 width) { return (ins >> lsb) & ((1u << width) - 1u); @@ -294,6 +295,41 @@ namespace ams::ldr::hoc::pcv::_asm { return IsFramePushPre(ins) || IsFramePushOffset(ins); } + constexpr bool IsCondBranch(u32 ins) { + return (ins & 0xFF000010u) == op::BCond; + } + + constexpr bool IsCompareBranch(u32 ins) { + return (ins & 0x7E000000u) == op::Cbz; + } + + constexpr bool IsTestBranch(u32 ins) { + return (ins & 0x7E000000u) == 0x36000000u; + } + + inline u32 *FindFnEnd(u32 *prologue, u32 *limit) { + u32 *furthest = prologue; + for (u32 *ptr = prologue; ptr < limit; ++ptr) { + const u32 ins = *ptr; + if (ins == RetIns && ptr >= furthest) { + return ptr + 1; + } + + s64 delta = 0; + if (IsCondBranch(ins) || IsCompareBranch(ins)) { + delta = SignExtend(static_cast(Get(ins, field::Imm19)) << 2, 21); + } else if (IsTestBranch(ins)) { + delta = SignExtend(static_cast(GetField(ins, 5, 14)) << 2, 16); + } + + if (ptr + (delta >> 2) > furthest) { + furthest = ptr + (delta >> 2); + } + } + + return nullptr; + } + inline u32 *FindFnPrologue(u32 *ptr, u32 margin, u32 *nsoStart) { for (u32 i = 0; i <= margin; ++i) { u32 *candidate = ptr - i; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp index d4a5eca5..ff66c42c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_hook.hpp @@ -55,6 +55,7 @@ namespace ams::ldr::hoc::pcv { constexpr size_t HookPageSize = 0x1000; constexpr size_t PcvDataArenaSize = 0x1000; + constexpr size_t HookStubReserve = 0x80; inline s64 SignExtend(u64 value, int bits) { const int shift = 64 - bits; @@ -127,6 +128,15 @@ namespace ams::ldr::hoc::pcv { m_data_used = 0; } + void SetCave(uintptr_t cave, size_t cave_size) { + m_cave = cave; + m_cave_size = cave_size; + } + + static size_t RequiredCaveSize() { + return util::AlignUp(static_cast(__stop_hoc_hookpayload - __start_hoc_hookpayload), sizeof(u32)) + HookStubReserve; + } + bool IsEnabled() const { return m_cave != 0 && m_cave_size != 0; } Result CheckEnabled() const { From b1b4ead2e22523ef6f0137e374700312304141fb Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 16 Oct 2026 20:55:06 +0200 Subject: [PATCH 191/205] ldr: odt has always seemingly been used? --- .../stratosphere/loader/source/oc/mtc_timing_value.hpp | 2 ++ .../source/oc/pcv/common/calculate_timings_common.cpp | 2 +- .../source/oc/pcv/common/calculate_timings_common.hpp | 2 +- .../source/oc/pcv/erista/calculate_timings_erista.cpp | 6 ++---- .../source/oc/pcv/mariko/calculate_timings_mariko.cpp | 6 ++---- .../loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 3 +++ 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 67c1370f..9ec9f726 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -75,6 +75,8 @@ namespace ams::ldr::hoc::pcv { /* Round trace routing delay(?) Guessed based on tK1 (ns) */ const double roundTripDelay = 0.5; + const double tODTon = 1.5; + inline u32 RL; inline u32 WL; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp index 1c5f98f3..e55a0520 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.cpp @@ -123,7 +123,7 @@ namespace ams::ldr::hoc::pcv { } } - u32 GetWdqsOn() { + u32 GetOdtLon() { /* Set A. */ switch (WL) { case WL_1333: diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp index e6d37e18..76bda88e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/common/calculate_timings_common.hpp @@ -26,7 +26,7 @@ namespace ams::ldr::hoc::pcv { void HandleLatency(u32 freq); u32 GetRlFrequency(); u32 GetWlFrequency(); - u32 GetWdqsOn(); + u32 GetOdtLon(); u32 CalculateNWr(); u32 CalculateNTRTP(); u8 CalculateMrw2(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp index 63454858..e10a5fea 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/erista/calculate_timings_erista.cpp @@ -56,10 +56,8 @@ namespace ams::ldr::hoc::pcv::erista { double fullRoundDelay = flyByTime + tDQSCK_max; /* Read to write turnaround. */ - /* Nvidia seem to use a 0.25 constant here for tK1, I am 99% certain this is tDQSTA. */ - /* This still left a mismatch; after some brute forcing I got GET_CYCLE_FLOOR(1.5) - 8 (using a static latency) as the cleanest result. */ - /* The latency definitely is not WL, but when testing for every latency, it lines up perfectly with wqsOn and wl seems to cancel out? */ - tR2W = RL + (BL / 2) + CEIL((fullRoundDelay / tCK_avg) + tDQSTA) - GET_CYCLE_FLOOR(1.5) - GetWdqsOn() + tWPRE - (C.t6_tRTW * 3) + finetRTW; + /* Switch seemingly uses odt. */ + tR2W = RL + (BL / 2) + CEIL((fullRoundDelay / tCK_avg) + tDQSTA) - GET_CYCLE_FLOOR(tODTon) - GetOdtLon() + tWPRE - (C.t6_tRTW * 3) + finetRTW; /* Read data valid: Read command -> data ready to be latched into the registers. */ rdv = RL + GET_CYCLE_CEIL(fullRoundDelay) + 18; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index a939a2d4..4b433ce7 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -86,10 +86,8 @@ namespace ams::ldr::hoc::pcv::mariko { tR2P = CalculateNTRTP(); /* Read to write turnaround. */ - /* Nvidia seem to use a 0.25 constant here for tK1, I am 99% certain this is tDQSTA. */ - /* This still left a mismatch; after some brute forcing I got GET_CYCLE_FLOOR(1.5) - 8 (using a static latency) as the cleanest result. */ - /* The latency definitely is not WL, but when testing for every latency, it lines up perfectly with wqsOn and wl seems to cancel out? */ - tR2W = RL + (BL / 2) + CEIL((fullRoundDelay / tCK_avg) + tDQSTA) - GET_CYCLE_FLOOR(1.5) - GetWdqsOn() - (tRTW * 3) + finetRTW; + /* Switch seemingly uses odt. */ + tR2W = RL + (BL / 2) + CEIL((fullRoundDelay / tCK_avg) + tDQSTA) - GET_CYCLE_FLOOR(tODTon) - GetOdtLon() - (tRTW * 3) + finetRTW; tRTM = FLOOR((10.0 + RL) + (3.502 / tCK_avg)) + GET_CYCLE_FLOOR(7.489); tRATM = CEIL((tRTM - 10.0) + (RL * 0.426)); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index f95f5484..69172f85 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -235,6 +235,9 @@ namespace ams::ldr::hoc::pcv::mariko { const u32 tRFCabStock = tRFC_values[0] * 2; table->dram_timings.t_rfc = tRFCabStock; + /* dram_timings.rl is used on Erista to calculate specific RL related timings during memory training for a workaround. */ + /* See fusee or minerva for more details. */ + /* This is unused on Mariko but we will set it regardless for completion. */ table->dram_timings.rl = RL; table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); table->emc_mrw = (table->emc_mrw & ~0x70u) | 0x40; /* nWR */ From 9d73f7bd1e1078044f178393ff7e442005078dac Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 14:24:30 +0200 Subject: [PATCH 192/205] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a4d59b9b..a0ca119d 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration to * [Atmosphere](https://github.com/Atmosphere-NX/Atmosphere) * [Ultrahand Overlay](https://github.com/ppkantorski/Ultrahand-Overlay) -2. Download and extract the **Horizon OC Package** to the root of your SD card. +2. Download and extract **Horizon OC** to the root of your SD card. 3. If using **Hekate**, edit `hekate_ipl.ini` to include: ``` From fe90a1df14df5aba5d93062fa712b1493b2ffffa Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 14:25:33 +0200 Subject: [PATCH 193/205] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a0ca119d..456f3334 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration to ## Default clocks -* **CPU:** Up to 1963MHz (Mariko) / 1785MHz (Erista) -* **GPU:** Up to 1152MHz (Mariko) / 921MHz (Erista) -* **RAM:** Up to 2133MHz (Mariko) / 1600MHz (Erista) +* **CPU:** 1963MHz (Mariko) / 1785MHz (Erista) +* **GPU:** 1152MHz (Mariko) / 921MHz (Erista) +* **RAM:** 2133MHz (Mariko) / 1600MHz (Erista) * Over/undervolting support * Built-in configurator * Compatible with most homebrew From b27701debb969a313e477be0bb7dae4a3583b09c Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 14:26:35 +0200 Subject: [PATCH 194/205] Readme: Clarify max clocks --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 456f3334..d9ddc497 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,8 @@ Refer to COMPILATION.md --- +Higher clocks are achievable via undervolting or further configuration, refer to this table for more details. +

    Clock table

    From 6df88693fedb7242f9556427079f8928d2e50d72 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 14:28:10 +0200 Subject: [PATCH 195/205] Readme: Update clock table --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d9ddc497..b99d8133 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,8 @@ Higher clocks are achievable via undervolting or further configuration, refer to * 612 → sleep mode ### GPU clocks (mhz) -* 1536 → absolute max clock on mariko. Dangerous +* 1574 → absolute max clock on mariko. Dangerous +* 1536 * 1497 → max mariko unsafe clock * 1459 * 1420 From c5ded00cc54a106d0e620317573295815837c32f Mon Sep 17 00:00:00 2001 From: Souldbminer <162390887+souldbminerr@users.noreply.github.com> Date: Sat, 17 Oct 2026 12:03:35 -0400 Subject: [PATCH 196/205] Update README.md --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b99d8133..2fcd6ede 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ Refer to COMPILATION.md --- Higher clocks are achievable via undervolting or further configuration, refer to this table for more details. +The averages are only for reference. Each ram is different and must be tuned independently. Refer to the guide for more details!

    Clock table

    @@ -96,9 +97,9 @@ Higher clocks are achievable via undervolting or further configuration, refer to * 3300 * 3266 * 3233 -* 3200 → JEDEC. +* 3200 → JEDEC, Hynix NEE/x267 Average * 3166 -* 3133 +* 3133 → Micron WT:B Average * 3100 * 3066 * 3033 @@ -107,20 +108,20 @@ Higher clocks are achievable via undervolting or further configuration, refer to * 2933 → JEDEC. * 2900 * 2866 -* 2833 +* 2833 → Samsung AA-MGCL Average * 2800 * 2766 -* 2733 +* 2733 → Samsung AM-MGCJ/Micron WT:E Average * 2700 -* 2666 → JEDEC. +* 2666 → JEDEC, Micron WT:F Average * 2633 * 2600 -* 2566 +* 2566 → Samsung AB-MGCL Average * 2533 * 2500 * 2466 * 2433 -* 2400 → max on erista, JEDEC. +* 2400 → max on erista, JEDEC, Hynix NME Average * 2366 * 2333 * 2300 @@ -133,7 +134,7 @@ Higher clocks are achievable via undervolting or further configuration, refer to * 2066 * 2033 * 2000 -* 1996 → JEDEC standard +* 1996 → JEDEC, Erista Average * 1966 * 1933 * 1900 From a707d4f2c479942b8dff9749146b7ac668464234 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:16:58 +0200 Subject: [PATCH 197/205] clk-mgr: properly apply gpu ram oc dvfs during GameStartMemWar --- Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 0f2582e4..c5811bb5 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -531,10 +531,12 @@ namespace mgr { u32 nearestFreq = GetCurrentNearestFrequency(HocClkModule_MEM); - if (targetRamHz != nearestFreq) { + if (targetRamHz > nearestFreq) { ApplyRamOcDvfs(targetRamHz); - board::SetHz(HocClkModule_MEM, targetRamHz); + } else if (targetRamHz < nearestFreq) { + board::SetHz(HocClkModule_MEM, targetRamHz); + ApplyRamOcDvfs(targetRamHz); } } From f349afd00bdd6965ee4de4742452a5d07a107c13 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:20:35 +0200 Subject: [PATCH 198/205] lang: update translation template --- Source/hoc-clk/overlay/lang/template.json | 109 +++++++++++++++++----- 1 file changed, 84 insertions(+), 25 deletions(-) diff --git a/Source/hoc-clk/overlay/lang/template.json b/Source/hoc-clk/overlay/lang/template.json index 3d4e5610..ad312a46 100644 --- a/Source/hoc-clk/overlay/lang/template.json +++ b/Source/hoc-clk/overlay/lang/template.json @@ -40,7 +40,6 @@ "General Settings": "", "Governor Settings": "", "Safety Settings": "", - "Save KIP Settings": "", "RAM Settings": "", "CPU Settings": "", "GPU Settings": "", @@ -63,9 +62,6 @@ "GPU Scheduling Override Method": "", "GPU Scheduling Override": "", - "GPU Boot Volt": "", - "GPU Boot Voltage": "", - "Memory Frequency Measurement Mode": "", " Overriding the charge current": "", "can be dangerous and may cause": "", "damage to your battery or charger!": "", @@ -91,8 +87,6 @@ "Display Voltage": "", "Thermal Throttle Limit": "", - "Official Rating": "", - "TDP Threshold": "", "Power": "", "HP Mode": "", @@ -102,7 +96,6 @@ "RAM VDD2 Voltage": "", "RAM VDDQ Voltage": "", "Voltage": "", - "RAM Frequency Editor": "", "Ram Max Clock": "", "RAM Latency Editor": "", "RAM Timing Reductions": "", @@ -112,16 +105,8 @@ "tRTW Fine Tune": "", "t7 tWTR Fine Tune": "", "tWTR Fine Tune": "", - "Memory Latencies": "", "Read Latency": "", "Write Latency": "", - "High speedo needed!": "", - "3333MHz (Needs extreme Speedo/PLL)": "", - "3366MHz (Needs extreme Speedo/PLL)": "", - "3400MHz (Needs extreme Speedo/PLL)": "", - "3433MHz (Needs ridiculous Speedo/PLL)": "", - "3466MHz (Needs ridiculous Speedo/PLL)": "", - "3500MHz (Needs ridiculous Speedo/PLL)": "", "JEDEC.": "", "CPU Boost Clock": "", @@ -154,14 +139,8 @@ "96.6% limit": "", "99.7% limit": "", " Setting GPU Clocks past": "", - "1228MHz without a proper undervolt": "", "can cause degradation or damage": "", "to your console!": "", - "1075MHz without UV, 1152MHz on SLT": "", - "or 1228MHz on HiOPT can cause ": "", - "permanent damage to your Switch!": "", - "921MHz without UV and 960MHz on": "", - "SLT or HiOPT can cause ": "", "Default (Mariko)": "", "Default (Erista)": "", @@ -195,21 +174,101 @@ "KIP version:": "", "sys-dock status:": "", "SaltyNX status:": "", - "RR Display status:": "", "Wafer Position:": "", "IDDQ:": "", "Module: ": "", "Board": "", "Display": "", + "hoc-clk is not running.\\n\\n": "", + "Please make sure it is correctly\\n\\n": "", + "installed and enabled.": "", + "Could not connect to hoc-clk.\\n\\n": "", + "Overlay not compatible with\\n\\n": "", + "the running hoc-clk version.\\n\\n": "", + "installed and up to date.": "", + "Install Update": "", + " (Live)": "", + "Debug Settings": "", + "VDD2/VDDQ": "", + "MHz and MT/s": "", + "Live GPU Volt Request": "", + "NV Service": "", + " Overriding the input current": "", + "limit increases power draw from": "", + "your charger. And board stress ": "", + "use 1500mA max.": "", + "Default (Lite)": "", + "Input Current Limit Override": "", + "PCV Log Verbosity": "", + "Governor Poll Rate": "", + "Governor Down Hold": "", + "Governor Step Divisor": "", + "SOC Voltage Table": "", + "Timing Presets": "", + "t1 tRCD": "", + "t2 tRP": "", + "t3 tRAS": "", + "t4 tRRD": "", + "t5 tRFC": "", + "t6 tRTW": "", + "t7 tWTR": "", + "t8 tREFI": "", + "RAM-Timing tBreak": "", + "Low t1 tRCD": "", + "Low t2 tRP": "", + "Low t3 tRAS": "", + "Low t4 tRRD": "", + "Low t5 tRFC": "", + "Low t6 tRTW": "", + "Low t7 tWTR": "", + "Low t8 tREFI": "", + "Timing Presets: ": "", + " Timing presets are only a baseline and": "", + "may need adjustment for your particular": "", + "DRAM Module": "", + "Apply Common Preset": "", + "Apply Super Tight (ST) Preset": "", + "Timing presets are not available": "", + "for your RAM module.": "", + "Latency Max": "", + "Latency Graph": "", + "LUT Modify": "", + "CPU DVFS Mode": "", + "CPU DVFS Offset": "", + "HOS Default": "", + "HOC Default": "", + "HiOPT - 15mV": "", + "High UV Table": "", + "PCV Hijack": "", + "SOC Custom Voltages": "", + "No Override": "", + "Failed to create thread": "", + "Download cancelled": "", + "Download failed -- check network": "", + "Extraction cancelled": "", + "Extraction failed -- archive may be corrupt": "", + "Update complete! Restart required.": "", + "Changelog fetch cancelled": "", + "Could not fetch changelog -- check network": "", + "Could not parse changelog": "", + "No changelog available for this release.": "", + "Updates cannot be performed on a 4MB overlay heap": "", + "Fetching changelog...": "", + "App ID": "", + "USB Charger": "", + "DRAM Temp:": "", + "KIP status:": "", + "Watchcat:": "", + "General Info": "", + " (Cust Rev ": "", + "Not Loaded": "", + "Developers": "", "Contributors": "", "Testers": "", - "Translators": "", "Special Thanks": "", - "X: %u Y: %u": "", - "%u.%u%u mV": "", "Compiling with minimal features": "", "Horizon OC\nKip opening failed": "", "Horizon OC\nKip read failed": "", From abfe4774a30314c2391b198b8d9d88c6c94e2c3c Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:21:08 +0200 Subject: [PATCH 199/205] add (experimental) uv13 --- .../loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp | 4 ++++ Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- Source/hoc-clk/sysmodule/src/board/board_volt.cpp | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp index 0ffd0c5f..d106668a 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_cpu.cpp @@ -394,6 +394,10 @@ namespace ams::ldr::hoc::pcv::mariko { PATCH_OFFSET(&(entry->tune0_high), 0xdfff); PATCH_OFFSET(&(entry->tune1_high), 0x27f07ff); break; + case 13: + PATCH_OFFSET(&(entry->tune0_high), 0xdfff); + PATCH_OFFSET(&(entry->tune1_high), 0x27FF7FF); + break; default: break; } diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index d9f742e0..6fb5a89a 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2364,7 +2364,7 @@ class CpuSubmenuGui : public MiscGui { this->listElement->addItem(new CompactCategoryHeader("CPU Settings")); if (IsMariko()) { addConfigTrackbar(KipConfigValue_marikoCpuUVLow, "CPU Low UV", ValueRange(0, 8, 1)); - addConfigTrackbar(KipConfigValue_marikoCpuUVHigh, "CPU High UV", ValueRange(0, 12, 1)); + addConfigTrackbar(KipConfigValue_marikoCpuUVHigh, "CPU High UV", ValueRange(0, 13, 1)); std::vector marikoTableConf = { // NamedValue("Auto", 0), NamedValue("Default", 1), NamedValue("1581MHz Tbreak", 2), NamedValue("1683MHz Tbreak", 3), diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index 903136a1..12f2b293 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -70,10 +70,11 @@ namespace board { { 0xdfff, 0xdfff, 0x21707ff, 0x27d07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27e07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27f07ff }, }; - MarikoCpuUvEntry marikoCpuUvHigh[12] = { + MarikoCpuUvEntry marikoCpuUvHigh[13] = { { 0x0, 0xffff, 0, 0 }, { 0x0, 0xffdf, 0, 0x27207ff }, { 0x0, 0xffdf, 0, 0x27307ff }, { 0x0, 0xffdf, 0, 0x27407ff }, { 0x0, 0xffdf, 0, 0x27707ff }, { 0x0, 0xffdf, 0, 0x27807ff }, { 0x0, 0xdfff, 0, 0x27b07ff }, { 0x0, 0xdfff, 0, 0x27c07ff }, { 0x0, 0xdfff, 0, 0x27d07ff }, { 0x0, 0xdfff, 0, 0x27e07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, + { 0x0, 0xdfff, 0, 0x27ff7ff }, }; } // namespace From 2fd78d6c30540b2ceba913382cfd0447d853252e Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 19:18:24 +0200 Subject: [PATCH 200/205] hoc-clk: make logging toggle config based --- Source/hoc-clk/common/include/hocclk/config.h | 14 +++- .../src/ui/gui/config_info_strings.cpp | 12 ++++ .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 7 ++ .../hoc-clk/sysmodule/src/file/file_utils.cpp | 72 ++++++++++++------- .../hoc-clk/sysmodule/src/file/file_utils.hpp | 3 +- Source/hoc-clk/sysmodule/src/main.cpp | 3 +- 6 files changed, 82 insertions(+), 29 deletions(-) diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index b3c33af4..f72a18b6 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -81,6 +81,9 @@ typedef enum { HocClkConfigValue_Watchdog, + HocClkConfigValue_FileLogging, + HocClkConfigValue_UartLogging, + KipConfigValue_custRev, KipConfigValue_KipVersion, // KipConfigValue_mtcConf, @@ -341,6 +344,11 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_Watchdog: return pretty ? "Watchcat" : "watchdog"; // More dignified + + case HocClkConfigValue_FileLogging: + return pretty ? "File Logging" : "file_logging"; + case HocClkConfigValue_UartLogging: + return pretty ? "UART Logging" : "uart_logging"; // KIP config values case KipConfigValue_custRev: return pretty ? "Custom Revision" : "kip_cust_rev"; @@ -593,6 +601,8 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_MemoryFrequencyMeasurementMode: case HocClkConfigValue_MarikoMiddleFreqs: case HocClkConfigValue_LiveGpuVoltage: + case HocClkConfigValue_FileLogging: + case HocClkConfigValue_UartLogging: return 0ULL; case HocClkConfigValue_RamDisplayUnit: return (uint64_t)RamDisplayUnit_MHz; @@ -654,6 +664,9 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_MarikoMiddleFreqs: case HocClkConfigValue_LiveGpuVoltage: case HocClkConfigValue_Watchdog: + case HocClkConfigValue_FileLogging: + case HocClkConfigValue_UartLogging: + case KipConfigValue_eristaCpuUnlock: return (input & 0x1) == input; case KipConfigValue_KipVersion: @@ -790,7 +803,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_g_soc_volt_3266000: case KipConfigValue_g_soc_volt_3333000: case KipConfigValue_eristaCpuVmin: - case KipConfigValue_eristaCpuUnlock: case KipConfigValue_t6_tRTW_fine_tune: case KipConfigValue_t7_tWTR_fine_tune: case KipCrc32: diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index cecdd7ab..f799175e 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -560,6 +560,18 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Voltage applies globally across all frequencies.", "\"Reset\" restores default or RAM-stable minimum." }; + case HocClkConfigValue_FileLogging: + return { + "Write sysmodule logs to log.txt in the config folder.", + "Takes effect after a reboot.", + "Default: Off" + }; + case HocClkConfigValue_UartLogging: + return { + "Output sysmodule logs over UART.", + "Takes effect after a reboot.", + "Default: Off" + }; default: return {}; } diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 6fb5a89a..c8b4afab 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -806,6 +806,13 @@ class GeneralSettingsSubMenuGui : public MiscGui { addConfigButton(HocClkConfigValue_PollingIntervalMs, "Polling Interval", ValueRange(50, 1000, 50, "ms", 1), "Polling Interval", &thresholdsDisabled, {}, {}, false); + tsl::elm::CustomDrawer *loggingSpacer = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); + loggingSpacer->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 12); + this->listElement->addItem(loggingSpacer); + this->listElement->addItem(new CompactCategoryHeader("Logging")); + addConfigToggle(HocClkConfigValue_FileLogging, nullptr); + addConfigToggle(HocClkConfigValue_UartLogging, nullptr); + tsl::elm::CustomDrawer *exSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Experimental Settings are incomplete ", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("and may not work correctly or at all!", false, x + 20, y + 50, 18, tsl::style::color::ColorText); diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index 9d049d7b..5aa9cce7 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -30,8 +30,12 @@ #include "../hos/apm_ext.h" #include "file_utils.hpp" +#include "config.hpp" #include #include +#include +#include +#include extern "C" void __libnx_init_time(void); @@ -45,19 +49,24 @@ namespace file::utils { std::atomic_bool g_has_initialized = false; bool g_log_enabled = false; bool g_uart_enabled = false; + bool g_flags_resolved = false; - bool FlagExists(const char *path) { - FILE *file = fopen(path, "r"); - if (file) { - fclose(file); - return true; + constexpr size_t MaxPendingLines = 64; + std::vector> g_pending_lines; + + void EmitLine(u64 secs, const char *buff, int len) { + if (g_uart_enabled) { + svcOutputDebugString(buff, len); } - return false; - } - void RefreshFlags() { - g_log_enabled = FlagExists(FILE_LOG_FLAG_PATH); - g_uart_enabled = FlagExists(FILE_UART_FLAG_PATH); + if (g_log_enabled) { + FILE *file = fopen(FILE_LOG_FILE_PATH, "a"); + + if (file) { + fprintf(file, "[%luls] %s", secs, buff); + fclose(file); + } + } } void InitializeThreadFunc(void *args) { @@ -66,6 +75,24 @@ namespace file::utils { } // namespace + void InitializeLogging() { + const bool logEnabled = config::GetConfigValue(HocClkConfigValue_FileLogging); + const bool uartEnabled = config::GetConfigValue(HocClkConfigValue_UartLogging); + + std::scoped_lock lock{ g_log_mutex }; + g_log_enabled = logEnabled; + g_uart_enabled = uartEnabled; + g_flags_resolved = true; + + if (g_log_enabled || g_uart_enabled) { + for (const auto &[secs, line] : g_pending_lines) { + EmitLine(secs, line.c_str(), (int)line.size()); + } + } + g_pending_lines.clear(); + g_pending_lines.shrink_to_fit(); + } + bool IsInitialized() { return g_has_initialized; } @@ -85,7 +112,7 @@ namespace file::utils { return; } - if (!g_log_enabled && !g_uart_enabled) { + if (g_flags_resolved && !g_log_enabled && !g_uart_enabled) { return; } @@ -106,22 +133,18 @@ namespace file::utils { buff[len++] = '\n'; buff[len] = '\0'; - // Debug UART log - if (g_uart_enabled) { - svcOutputDebugString(buff, len); - } + timespec now = {}; + clock_gettime(CLOCK_REALTIME, &now); + const u64 secs = now.tv_sec - bootTimeS; - if (g_log_enabled) { - FILE *file = fopen(FILE_LOG_FILE_PATH, "a"); - - if (file) { - timespec now = {}; - clock_gettime(CLOCK_REALTIME, &now); - - fprintf(file, "[%luls] %s", now.tv_sec - bootTimeS, buff); - fclose(file); + if (!g_flags_resolved) { + if (g_pending_lines.size() < MaxPendingLines) { + g_pending_lines.emplace_back(secs, std::string(buff, len)); } + return; } + + EmitLine(secs, buff, len); } void WriteContextToCsv(const HocClkContext *context) { @@ -212,7 +235,6 @@ namespace file::utils { } if (R_SUCCEEDED(rc)) { - RefreshFlags(); g_has_initialized = true; LogLine("=== hoc-clk " TARGET_VERSION " ==="); LogLine("by m4xw, natinusala, p-sam, Souldbminer, Lightos_ and Dominatorul"); diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index 1ffc5c27..340a6676 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -36,8 +36,6 @@ #define FILE_CONFIG_DIR "/config/" CONFIG_DIR #define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv" -#define FILE_LOG_FLAG_PATH FILE_CONFIG_DIR "/log.flag" -#define FILE_UART_FLAG_PATH FILE_CONFIG_DIR "/uart.flag" #define FILE_LOG_FILE_PATH FILE_CONFIG_DIR "/log.txt" #define FILE_SETTINGS_PATH FILE_CONFIG_DIR "/settings.ini" #define FILE_KIP_DIR FILE_CONFIG_DIR "/kip" @@ -53,6 +51,7 @@ namespace file::utils { bool IsLogEnabled(); bool IsUartEnabled(); void InitializeAsync(); + void InitializeLogging(); void LogLine(const char *format, ...); void WriteContextToCsv(const HocClkContext *context); diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 2a785506..5ddac8dd 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -126,7 +126,8 @@ int main(int argc, char **argv) { return 1; } file::config::Initialize(); - file::config::Refresh(); // Get config from file + file::config::Refresh(); + file::utils::InitializeLogging(); board::Initialize(); hos::InitializeProcessManagement(); From cc0245f15c11aa46d1c6c81896379228d6af5681 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 19:19:16 +0200 Subject: [PATCH 201/205] update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 76dc4eee..ccaedb2d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build Source/hekate dist/* !dist/.gitignore +Status-Monitor-Overlay.ovl* \ No newline at end of file From aafc8b11695832bfe5faade3398d3061d8f0a4ca Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 20:37:14 +0200 Subject: [PATCH 202/205] add Portuguese translation by Wivi --- Source/hoc-clk/overlay/lang/pt.json | 374 ++++++++++++++++------------ 1 file changed, 216 insertions(+), 158 deletions(-) diff --git a/Source/hoc-clk/overlay/lang/pt.json b/Source/hoc-clk/overlay/lang/pt.json index 86b7dea1..ce85cd59 100644 --- a/Source/hoc-clk/overlay/lang/pt.json +++ b/Source/hoc-clk/overlay/lang/pt.json @@ -2,228 +2,286 @@ "Information": "Informação", "Unknown": "Desconhecido", "Installed": "Instalado", - "Not Installed": "Não instalado", + "Not Installed": "Ausente", "Default": "Padrão", - "Do Not Override": "Não substituir", - "Do not override": "Não substitua", - "Disabled": "Desativado", + "Do Not Override": "", + "Do not override": "Padrão", + "Disabled": "Desabilitado", "Enabled": "Habilitado", - "Enabled (Default)": "Habilitado (padrão)", + "Enabled (Default)": "Habilitado (Padrão)", "Enable": "Habilitar", "Fatal error": "Erro fatal", - "Could not connect to hoc-clk sysmodule.\\n\\n": "Não foi possível conectar-se ao sysmodule hoc-clk.\\n\\n", - "Please make sure everything is\\n\\n": "Verifique se tudo está\\n\\n", - "correctly installed and enabled.": "corretamente instalado e ativado.", + "Could not connect to hoc-clk sysmodule.\\n\\n": "Má conexão com o sysmodule hoc-clk.\\n\\n", + "Please make sure everything is\\n\\n": "Cheque se tudo está corretamente\\n\\n", + "correctly installed and enabled.": "instalado e habilitado", - "Edit App Profile": "Editar perfil do aplicativo", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Substituições temporárias", - "Temporary Overrides ": "Substituições temporárias", + "Edit App Profile": "Editar perfil do app atual", + "Edit Global Profile": "Editar perfil geral", + "Temporary Overrides": "Editar perfil temporário", + "Temporary Overrides ": "Perfil temporário ", "  Reset": " Redefinir", "Settings": "Configurações", "About": "Sobre", "Credits": "Créditos", "Application changed\\n\\n": "Aplicativo alterado\\n\\n", - "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", - "while editing was going on.": "enquanto a edição estava acontecendo.", + "The running application changed\\n\\n": "O app em execução foi alterado\\n\\n", + "while editing was going on.": "enquanto uma edição estava ocorrendo.", - "Sleep Mode": "Modo de suspensão", - "Stock": "Padrão de fábrica", - "Dev OC": "Desenvolvedor OC", - "Boost Mode": "Modo de reforço", - "Safe Max": "Máx. Seguro", - "Unsafe Max": "Máximo inseguro", - "Absolute Max": "Máximo absoluto", - "Handheld Safe Max": "Portátil Seguro Máx.", + "Sleep Mode": "Mod de descanso", + "Stock": "Padrão", + "Dev OC": "Dev OC", + "Boost Mode": "Modo boost", + "Safe Max": "Max. seguro", + "Unsafe Max": "Max. perigoso", + "Absolute Max": "Max. absoluto", + "Handheld Safe Max": "Seguro max. no modo portátil", - "General Settings": "Configurações Gerais", - "Governor Settings": "Configurações do Governador", - "Safety Settings": "Configurações de segurança", - "Save KIP Settings": "Salvar configurações KIP", - "RAM Settings": "Configurações de RAM", - "CPU Settings": "Configurações de CPU", - "GPU Settings": "Configurações de GPU", - "Display Settings": "Configurações de exibição", - "Experimental Settings": "Configurações experimentais", + "General Settings": "Configs gerais", + "Governor Settings": "Configs de Governor", + "Safety Settings": "Configs de segurança", + "RAM Settings": "Configs de RAM", + "CPU Settings": "Configs de CPU", + "GPU Settings": "Configs de GPU", + "Display Settings": "Configs de display", + "Experimental Settings": "Configs experimentais", "Experimental": "Experimental", - " Settings marked in blue": "Configurações marcadas em azul", - "don't require a reboot to apply!": "não requerem reinicialização para aplicar!", - "You can also press  to show": "Pressione também  para mostrar", - "information about each setting.": "informações sobre cada configuração.", + " Settings marked in blue": "Configs marcadas em azul não", + "don't require a reboot to apply!": "precisam de um reboot para aplicar", + "You can also press  to show": "Pressione  para mostrar informações", + "information about each setting.": "sobre cada configuração.", - " Experimental Settings are incomplete ": "Configurações experimentais incompletas", - "and may not work correctly or at all!": "e podem não funcionar corretamente!", - "Here be dragons!": "Aqui há dragões!", + " Experimental Settings are incomplete ": " As configs experimentais estão", + "and may not work correctly or at all!": "incompletas e podem ser instáveis", + "Here be dragons!": "Você foi avisado.", - "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", - "RAM Display Unit": "Unidade de exibição de RAM", - "Polling Interval": "Intervalo de sondagem", + "RAM Voltage Display Mode": "Setor de tensão da RAM exibido", + "RAM Display Unit": "Unidade de exibição da RAM", + "Polling Interval": "Intervado de registro", - "GPU Scheduling Override Method": "Método de substituição de agendamento de GPU", - "GPU Scheduling Override": "Substituição de agendamento de GPU", - "GPU Boot Volt": "Tensão de inicialização da GPU", - "GPU Boot Voltage": "Tensão de inicialização da GPU", - "Memory Frequency Measurement Mode": "Modo de medição de frequência de memória", - " Overriding the charge current": "Substituir a corrente de carga", - "can be dangerous and may cause": "pode ser perigoso e causar", - "damage to your battery or charger!": "danos à sua bateria ou carregador!", - "Charge Current Override": "Substituição de corrente de carga", + "GPU Scheduling Override Method": "Método de substituição de scheduler da GPU", + "GPU Scheduling Override": " Substituição do scheduler da GPU ", + " Overriding the charge current": " Mexer na corrente de carga", + "can be dangerous and may cause": "pode ser perigoso e pode causar", + "damage to your battery or charger!": "danos a sua bateria e carregador!", + "Charge Current Override": "Corrente de carga custom", "Display Color Preset": "Predefinição de cor", "Basic": "Básico", "Saturated": "Saturado", "Washed": "Desbotado", "Natural": "Natural", - "Vivid": "Vívido", + "Vivid": "Vívo", - "CPU Governor Minimum Frequency": "Frequência Mínima do Governador da CPU", - " Usage of unsafe display": "O uso de frequências de tela", - "refresh rates may cause stress": "taxas de atualização podem causar estresse", - "or damage to your display! ": "ou danos ao seu monitor!", - "Proceed at your own risk!": "Prossiga por sua conta e risco!", - "Max Handheld Display": "Visor portátil máximo", - "Max Handheld Display Hz": "Hz máximo em modo portátil", - "Display Clock": "Exibir relógio", - " Adjust the display voltage": "Ajuste a tensão do display", + "CPU Governor Minimum Frequency": "Freq mínima do Governor ", + " Usage of unsafe display": " O uso de freqências de atualização", + "refresh rates may cause stress": "altas podem causar danos temporários", + "or damage to your display! ": "ou permanentes ao seu display!", + "Proceed at your own risk!": "Prossiga, mas você foi avisado.", + "Max Handheld Display": "Max. do display em modo portátil ", + "Max Handheld Display Hz": "Taxa de atualização max. no modo portáril", + "Display Clock": "Clock do display", + " Adjust the display voltage": " Ajuste a tensão do display", "with caution to avoid damage": "com cuidado para evitar danos", - "to your display panel! ": "ao painel do display!", + "to your display panel! ": "permanentes!", "Display Voltage": "Tensão do display", - "Thermal Throttle Limit": "Limite de aceleração térmica", - "Official Rating": "Classificação Oficial", - "TDP Threshold": "Limite de TDP", + "Thermal Throttle Limit": "Limite térmico", "Power": "Potência", "HP Mode": "Modo HP", - "DVB Shift": "Deslocamento DVB", - "SoC Max Volt": "Tensão máxima do SoC", - "Step Mode": "Modo passo", - "RAM VDD2 Voltage": "Tensão RAM VDD2", - "RAM VDDQ Voltage": "Tensão RAM VDDQ", + "DVB Shift": "DVB Shift", + "SoC Max Volt": "vSOC Máximo", + "Step Mode": "Modo de Step", + "RAM VDD2 Voltage": "Tensão VDD2", + "RAM VDDQ Voltage": "Tensão VDDQ", "Voltage": "Tensão", - "RAM Frequency Editor": "Editor de frequência RAM", - "Ram Max Clock": "Frequência máxima de Ram", - "RAM Latency Editor": "Editor de latência de RAM", - "RAM Timing Reductions": "Reduções de tempo de RAM", - "Memory Timings": "Tempos de memória", + "Ram Max Clock": "Clock Max da RAM", + "RAM Latency Editor": "Editor de latências", + "RAM Timing Reductions": "Reducão de latências", + "Memory Timings": "Latências da RAM", "Advanced": "Avançado", - "t6 tRTW Fine Tune": "t6 tRTW Ajuste fino", - "tRTW Fine Tune": "Ajuste fino tRTW", - "t7 tWTR Fine Tune": "t7 tWTR Ajuste fino", - "tWTR Fine Tune": "Ajuste fino tWTR", - "Memory Latencies": "Latências de memória", + "t6 tRTW Fine Tune": "t6 tRTW - Ajuste fino", + "tRTW Fine Tune": "tRTW - Ajuste fino", + "t7 tWTR Fine Tune": "t7 tWTR - Ajuste fino", + "tWTR Fine Tune": "tWTR - Ajuste fino", "Read Latency": "Latência de leitura", - "Write Latency": "Latência de gravação", - "High speedo needed!": "Alto valor de Speedo necessário!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", + "Write Latency": "Latência de escrita", "JEDEC.": "JEDEC.", - "CPU Boost Clock": "Relógio de aumento da CPU", + "CPU Boost Clock": "Clock boost", "CPU UV": "UV da CPU", - "CPU Unlock": "Desbloqueio da CPU", - "CPU VMIN": "CPU VMIN", + "CPU Unlock": "Destrave da CPU", + "CPU VMIN": "CPU vMin", "CPU Max Voltage": "Tensão máxima da CPU", - "CPU Max Clock": "Relógio máximo da CPU", - "Extreme UV Table": "Mesa UV Extrema", - "CPU UV Table": "Tabela UV da CPU", - "CPU Low UV": "UV baixo da CPU", - "CPU High UV": "CPU alta UV", - "CPU Low VMIN": "CPU baixa VMIN", - "CPU High VMIN": "VMIN alto da CPU", + "CPU Max Clock": "Clock máximo da CPU", + "Extreme UV Table": "Tabela Extreme UV", + "CPU UV Table": "Table de UV", + "CPU Low UV": "Low UV da CPU", + "CPU High UV": "High UV da CPU", + "CPU Low VMIN": "Low vMin da CPU", + "CPU High VMIN": "High vMin da CPU", - "No Undervolt": "Sem subtensão", + "No Undervolt": "Sem Undervolt", "SLT Table": "Tabela SLT", "HiOPT Table": "Tabela HiOPT", - "GPU Undervolt Table": "Tabela de subtensão da GPU", + "GPU Undervolt Table": "Tabela de undervolt da GPU", "GPU Minimum Voltage": "Tensão mínima da GPU", - "Calculate GPU Vmin": "Calcular Vmin da GPU", - "GPU VMIN": "GPU VMIN", + "Calculate GPU Vmin": "Tensão mínima calculada", + "GPU VMIN": "GPU vMin", "GPU Maximum Voltage": "Tensão máxima da GPU", - "GPU Voltage Offset": "Compensação de tensão da GPU", - "GPU DVFS Mode": "Modo GPU DVFS", - "GPU DVFS Offset": "Deslocamento DVFS da GPU", + "GPU Voltage Offset": "Offset de tensão", + "GPU DVFS Mode": "Modo de DVFS da GPU", + "GPU DVFS Offset": "Offset de DVFS da GPU", "GPU Voltage Table": "Tabela de tensão da GPU", - "GPU Custom Table (mV)": "Tabela personalizada de GPU (mV)", - "Official Service": "Serviço Oficial", - "96.6% limit": "Limite de 96,6%", - "99.7% limit": "Limite de 99,7%", - " Setting GPU Clocks past": "Definir clocks de GPU além de", - "1228MHz without a proper undervolt": "1228MHz sem undervolt adequado", + "GPU Custom Table (mV)": "Tabela custom da GPU (mV)", + "Official Service": "Padrão Oficial", + "96.6% limit": "Limite de 96.6%", + "99.7% limit": "Limite de 99.7%", + " Setting GPU Clocks past": " Definir os clocks acima de", "can cause degradation or damage": "pode causar degradação ou danos", - "to your console!": "ao seu console!", - "1075MHz without UV, 1152MHz on SLT": "1075 MHz sem UV, 1152 MHz em SLT", - "or 1228MHz on HiOPT can cause ": "ou 1228 MHz em HiOPT pode causar", - "permanent damage to your Switch!": "danos permanentes ao seu Switch!", - "921MHz without UV and 960MHz on": "921 MHz sem UV e 960 MHz ativado", - "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar", + "to your console!": "permanentes ao seu console!", "Default (Mariko)": "Padrão (Mariko)", "Default (Erista)": "Padrão (Erista)", - "Rating": "Avaliação", - "Safe Max (Mariko)": "Máximo Seguro (Mariko)", - "Safe Max (Erista)": "Seguro Max (Erista)", + "Rating": "Padrão NVidia", + "Safe Max (Mariko)": "Max. seguro (Mariko)", + "Safe Max (Erista)": "Max. seguro (Mariko)", "Voltages": "Tensões", - "RAM Voltage:": "Tensão RAM:", - "Display Voltage:": "Tensão do display:", + "RAM Voltage:": "Tensão de RAM", + "Display Voltage:": "Tensão de display", "Temperatures": "Temperaturas", - "PLLX Temp:": "PLLX Temp:", - "AOTAG Temp:": "AOTAG Temp:", - "BQ24193 Temp:": "BQ24193 Temp:", + "PLLX Temp:": "Temp PLLX", + "AOTAG Temp:": "Temp AOTAG", + "BQ24193 Temp:": "Temp BQ24193", "Normal": "Normal", "Warm": "Morno", "Hot": "Quente", - "Overheat": "Superaquecimento", - "Not Patched": "Não corrigido", + "Overheat": "Superaquecido", + "Not Patched": "Sem patch", "Invalid": "Inválido", - "RAM Bandwidth": "Largura de banda RAM", - "RAM BW (Peak):": "BW RAM (Pico):", - "RAM BW (All):": "BW RAM (Total):", - "RAM BW (CPU):": "BW RAM (CPU):", - "RAM BW (GPU):": "BW RAM (GPU):", - "Hardware Info": "Info de hardware", + "RAM Bandwidth": "Largura de banda da RAM", + "RAM BW (Peak):": "RAM BW (Pico):", + "RAM BW (All):": "RAM BW (Geral):", + "RAM BW (CPU):": "RAM BW (CPU):", + "RAM BW (GPU):": "RAM BW (GPU):", + "Hardware Info": "Informação de hardware", "Console Type:": "Tipo de console:", "Speedo:": "Speedo:", "DRAM Module: ": "Módulo DRAM: ", - "Software Info": "Info de software", - "KIP version:": "Versão KIP:", - "sys-dock status:": "status do dock do sistema:", + "Software Info": "Informação de software", + "KIP version:": "Versão do KIP:", + "sys-dock status:": "Status do sys-dock:", "SaltyNX status:": "Status do SaltyNX:", - "RR Display status:": "Status de exibição do RR:", "Wafer Position:": "Posição do wafer:", "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", + "Module: ": "Módulo: ", "Board": "Placa", - "Display": "Exibição", + "Display": "Display", + + "hoc-clk is not running.\\n\\n": "hoc-clk não está funcionando.\\n\\n", + "Please make sure it is correctly\\n\\n": " Verifique se tudo está corretamente\\n\\n", + "installed and enabled.": "instalado e habilitado.", + "Could not connect to hoc-clk.\\n\\n": "Não foi possível conectar com hoc-clk.\\n\\n", + "Overlay not compatible with\\n\\n": "Versão do overlay não é compatível com\\n\\n", + "the running hoc-clk version.\\n\\n": "a versão instalada do hoc-clk.", + "installed and up to date.": "Instalado e atualizado.", + "Install Update": "Instalar atualização", + " (Live)": " (Live)", + "Debug Settings": "Configs de debug", + "VDD2/VDDQ": "VDD2/VDDQ", + "MHz and MT/s": "MHz e MT/s", + "Live GPU Volt Request": "Pedido de tensão de GPU ao vivo", + "NV Service": "Serviço NV", + " Overriding the input current": " Mexer no limite de corrente", + "limit increases power draw from": "de entrada aumenta o consumo total", + "your charger. And board stress ": "do seu carregador e estresse na placa ", + "use 1500mA max.": "Use 1500 mA no máximo", + "Default (Lite)": "Padrão (Lite)", + "Input Current Limit Override": "Subistituição do limite de corrente", + "PCV Log Verbosity": "Verbosity do log de PCV", + "Governor Poll Rate": "Intervalo do Governor", + "Governor Down Hold": "Intervalo baixo do Governor", + "Governor Step Divisor": "Divisor de etapa do Governor", + "SOC Voltage Table": "Tabela de tensão de SOC", + "Timing Presets": "Presets de latência", + "t1 tRCD": "t1 tRCD", + "t2 tRP": "t2 tRP", + "t3 tRAS": "t3 tRAS", + "t4 tRRD": "t4 tRRD", + "t5 tRFC": "t5 tRFC", + "t6 tRTW": "t6 tRTW", + "t7 tWTR": "t7 tWTR", + "t8 tREFI": "t8 tREFI", + "RAM-Timing tBreak": "tBreak de latências", + "Low t1 tRCD": "Low t1 tRCD", + "Low t2 tRP": "Low t2 tRP", + "Low t3 tRAS": "Low t3 tRAS", + "Low t4 tRRD": "Low t4 tRRD", + "Low t5 tRFC": "Low t5 tRFC", + "Low t6 tRTW": "Low t6 tRTW", + "Low t7 tWTR": "Low t7 tWTR", + "Low t8 tREFI": "Low t8 tREFI", + "Timing Presets: ": "Presets de latência: ", + " Timing presets are only a baseline and": " Os presets de latência são somente", + "may need adjustment for your particular": "uma base e podem precisar de ajustes", + "DRAM Module": "para o seu módulo de RAM em particular", + "Apply Common Preset": "Aplicar o preset comum", + "Apply Super Tight (ST) Preset": "Aplicar o preset Super Tight (ST)", + "Timing presets are not available": "Os presets de latência não estão", + "for your RAM module.": "disponíveis para o seu módulo de RAM", + "Latency Max": "Latência máxima", + "Latency Graph": "Gráfico de latência", + "LUT Modify": "Modificador LUT", + "CPU DVFS Mode": "Modo DVFS da CPU", + "CPU DVFS Offset": "Offset DVFS da CPU", + "HOS Default": "Padrão HOS", + "HOC Default": "Padrão HOC", + "HiOPT - 15mV": "HiOPT - 15mV", + "High UV Table": "Tabela High UV", + "PCV Hijack": "Hijack de PCV", + "SOC Custom Voltages": "Tensão custom do SOC", + "No Override": "Padrão", + "Failed to create thread": "Falha ao criar um thread", + "Download cancelled": "Download cancelado", + "Download failed -- check network": "Falha no donwload -- Cheque a conexão", + "Extraction cancelled": "Extração cancelada", + "Extraction failed -- archive may be corrupt": "Falha na extração -- Arquivo pode estar corrompido", + "Update complete! Restart required.": "Atualização completa! Reinicie o dispositivo.", + "Changelog fetch cancelled": "Procura de changelog cancelada", + "Could not fetch changelog -- check network": "Não foi possível procurar o changelog -- Cheque a conexão", + "Could not parse changelog": "Não foi possível ler o changelog", + "No changelog available for this release.": "Sem changelog disponível para esta versão", + "Updates cannot be performed on a 4MB overlay heap": "Update não pode ser feita em overlays com 4 MB dedicados", + "Fetching changelog...": "Procurando changelog...", + "App ID": "ID de APP", + "USB Charger": "Carregador USB", + "DRAM Temp:": "Temp da DRAM", + "KIP status:": "Status do KIP", + "Watchcat:": "Watchcat", + "General Info": "Informação geral", + " (Cust Rev ": " (Cust Rev ", + "Not Loaded": "Ausente", "Developers": "Desenvolvedores", - "Contributors": "Colaboradores", - "Testers": "Testadores", - "Translators": "Tradutores", + "Contributors": "Contribuidores", + "Testers": "Cobaias", "Special Thanks": "Agradecimentos especiais", - "X: %u Y: %u": "X: %u Y: %u", - "%u.%u%u mV": "%u.%u%u mV", - "Compiling with minimal features": "Compilando com recursos mínimos", - "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA", - "Horizon OC\nKip opening failed": "Horizon OC\nFalha ao abrir o KIP", - "Horizon OC\nKip read failed": "Horizon OC\nFalha ao ler o KIP", - "Horizon OC\nOutdated kip detected!\nPlease update Horizon OC": "Horizon OC\nKIP desatualizado detectado!\nAtualize o Horizon OC", - "Horizon OC\nOutdated sysmodule detected!\nPlease update Horizon OC": "Horizon OC\nSysmodule desatualizado detectado!\nAtualize o Horizon OC", - "Horizon OC\nKip write failed": "Horizon OC\nFalha ao gravar o KIP", - "Horizon OC\nKip config set failed": "Horizon OC\nFalha ao configurar o KIP", - "Kip is not loaded!": "O KIP não está carregado!", - "Horizon OC\nKIP has been updated\nPlease reboot your console": "Horizon OC\nO KIP foi atualizado\nReinicie o console", + "Compiling with minimal features": "Compilado com features mínimas", + "Horizon OC\nKip opening failed": "Horizon OC\nFalha na abertua de KIP", + "Horizon OC\nKip read failed": "Horizon OC\nFalha na leitura", + "Horizon OC\nOutdated kip detected!\nPlease update Horizon OC": "Horizon OC\nKIP desatulizado detectado!\nAtualize o Horizon OC!", + "Horizon OC\nOutdated sysmodule detected!\nPlease update Horizon OC": "Horizon OC\nSysmodule desatualizado detectado!\nAtualize o Horizon OC!", + "Horizon OC\nKip write failed": "Horizon OC\nFalha na escrita do KIP", + "Horizon OC\nKip config set failed": "Horizon OC\nFalha ao aplicar configurações", + "Kip is not loaded!": "KIP não carregado!", + "Horizon OC\nKIP has been updated\nPlease reboot your console": "Horizon OC\nKIP foi atualizado\nReinicie o dispositivo", "Horizon OC has been installed": "Horizon OC foi instalado", - "Horizon OC\nConfig Buffer Mismatch": "Horizon OC\nIncompatibilidade do buffer de configuração", - "Horizon OC\nDeactivated frequency.\nReboot to apply.": "Horizon OC\nFrequência desativada.\nReinicie para aplicar.", - "Horizon OC\nSecmon read failed!\n This may be a hardware issue!": "Horizon OC\nFalha na leitura do Secmon!\n Isso pode ser um problema de hardware!", - "Horizon OC\nFailed to write I2C\nwhile setting vddq": "Horizon OC\nFalha ao gravar I2C\nao definir VDDQ", - "Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC": "Horizon OC\nVersão do KIP incompatível\nReinstale o Horizon OC" + "Horizon OC\nConfig Buffer Mismatch": "Horizon OC\nBuffer mismatch da config", + "Horizon OC\nDeactivated frequency.\nReboot to apply.": "Horizon OC\nFrequencia desativada.\n Reinicie para aplicar.", + "Horizon OC\nSecmon read failed!\n This may be a hardware issue!": "Horizon OC\nFalha na leitura do Secmon!\nIsso pode ser um problema de hardware!", + "Horizon OC\nFailed to write I2C\nwhile setting vddq": "Horizon OC\nFalha ao escrever no bus I2C\nenquanto configurava o vddq", + "Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC": "Horizon OC\nVersão errada do KIP!\nRe-instale o Horizon OC" } From 8798b1de760a5a605bcb1c0f7ec4cfbebc6b5488 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 17 Oct 2026 20:38:27 +0200 Subject: [PATCH 203/205] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2fcd6ede..54efce12 100644 --- a/README.md +++ b/README.md @@ -243,5 +243,6 @@ The averages are only for reference. Each ram is different and must be tuned ind * **q1332348216-glitch, nangongjing1, xinluochenjiang** - Chinese translations * **th3-ne0undr5c0r** - French translations * **redraz** - Russian translations +* **Wivi** - Portuguese translations * **Niklas080208** - JSON language support for sysmodule notifications. * **Nvidia** - [Tegra X1 Technical Reference Manual](https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual), soctherm driver, L4T From 03789095db09a72ca3bf304f36c37685bf079232 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:00:53 +0200 Subject: [PATCH 204/205] ldr: properly truncate dvb freq tables using 64 lut. --- .../source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 72 ++++++++++++------- .../loader/source/oc/pcv/pcv_common.hpp | 3 - 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index 69172f85..fb1e35d8 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -301,6 +301,16 @@ namespace ams::ldr::hoc::pcv::mariko { } } + void AppendMaxEmc(std::vector &emcList) { + if (emcList.back() != C.marikoEmcMaxClock) { + emcList.push_back(static_cast(C.marikoEmcMaxClock)); + } + } + + void TruncateToLutLimit(std::vector &emcList, size_t limit) { + emcList.resize(std::min(emcList.size(), limit)); + } + void MtcGenerateJedecTable() { const u32 jedecFreqs[] = { 1866000, 1996800, 2133000, 2400000, 2666000, 2933000, 3200000 }; constexpr u32 JedecFreqCount = std::size(jedecFreqs); @@ -313,11 +323,8 @@ namespace ams::ldr::hoc::pcv::mariko { } } - if (newEmcList.back() != C.marikoEmcMaxClock) { - newEmcList.push_back(static_cast(C.marikoEmcMaxClock)); - } - - newEmcList.resize(std::min(newEmcList.size(), EmcDvfsTableEntryLimit)); + AppendMaxEmc(newEmcList); + TruncateToLutLimit(newEmcList, EmcDvfsTableEntryLimit); } void MtcGenerate133StepTable() { @@ -332,11 +339,8 @@ namespace ams::ldr::hoc::pcv::mariko { } } - if (newEmcList.back() != C.marikoEmcMaxClock) { - newEmcList.push_back(static_cast(C.marikoEmcMaxClock)); - } - - newEmcList.resize(std::min(newEmcList.size(), EmcDvfsTableEntryLimit)); + AppendMaxEmc(newEmcList); + TruncateToLutLimit(newEmcList, EmcDvfsTableEntryLimit); } void MtcGenerate33StepTable() { @@ -359,11 +363,8 @@ namespace ams::ldr::hoc::pcv::mariko { } } - if (newEmcList.back() != C.marikoEmcMaxClock) { - newEmcList.push_back(static_cast(C.marikoEmcMaxClock)); - } - - newEmcList.resize(std::min(newEmcList.size(), EmcDvfsTableEntryLimit)); + AppendMaxEmc(newEmcList); + TruncateToLutLimit(newEmcList, EmcDvfsTableEntryLimit); } void MtcGenerateFreqTables() { @@ -402,15 +403,13 @@ namespace ams::ldr::hoc::pcv::mariko { u32 newFreq = EmcClkOSLimit + stepIndex * stepRate; newFreq = (newFreq / RoundHz) * RoundHz; if (newFreq > C.marikoEmcMaxClock) { - if (newEmcList.back() != C.marikoEmcMaxClock) { - newEmcList.push_back(static_cast(C.marikoEmcMaxClock)); - } + AppendMaxEmc(newEmcList); break; } newEmcList.push_back(newFreq); } - newEmcList.resize(std::min(newEmcList.size(), EmcDvfsTableEntryLimit)); + TruncateToLutLimit(newEmcList, EmcDvfsTableEntryLimit); } Result VerifyMtcTable(MarikoMtcTable *tableStart, u32 expectedFreq) { @@ -524,6 +523,24 @@ namespace ams::ldr::hoc::pcv::mariko { R_SUCCEED(); } + void Get32LutEmcList(std::vector &emcList) { + /* No need to reduce outside of 33MHz stepmode. */ + if (C.stepMode != StepMode_33MHz || emcList.size() <= mariko::MtcTableCountDefault) { + return; + } + + /* Add every other oc entry. */ + std::vector reduced(emcList.begin(), emcList.begin() + mariko::MtcTableCountDefault); + for (size_t i = mariko::MtcTableCountDefault; i < emcList.size(); i += 2) { + reduced.push_back(emcList[i]); + } + + TruncateToLutLimit(reduced, DvfsTableEntryLimit); + AppendMaxEmc(reduced); + + emcList = std::move(reduced); + } + Result MemFreqDvbTable(u32 *ptr) { DvbEntry *default_end = reinterpret_cast(ptr); DvbEntry *new_start = default_end + 1; @@ -537,9 +554,9 @@ namespace ams::ldr::hoc::pcv::mariko { R_SKIP(); } - s32 max0 = 1050; - s32 max1 = 1025; - s32 max2 = 1000; + s32 max0 = 1050; + s32 max1 = 1025; + s32 max2 = 1000; if (C.marikoSocVmax && C.marikoSocVmax > 1000) { max0 = C.marikoSocVmax; @@ -614,12 +631,15 @@ namespace ams::ldr::hoc::pcv::mariko { #undef DVB #undef DVB_OC - const size_t dvbCount = std::min(newEmcList.size(), DvbTableCapacity); - DvbEntry emcDvbTableOc[DvbTableCapacity] = {}; + std::vector reducedEmcList = newEmcList; + Get32LutEmcList(reducedEmcList); + + const size_t dvbCount = std::min(reducedEmcList.size(), DvfsTableEntryCount); + DvbEntry emcDvbTableOc[DvfsTableEntryCount] = {}; u32 bracketIndex = 0; for (size_t i = 0; i < dvbCount; ++i) { - const u32 freq = (i == dvbCount - 1) ? static_cast(newEmcList.back()) : newEmcList[i]; + const u32 freq = reducedEmcList[i]; while (freq >= emcDvbOcTableBrackets[bracketIndex + 1].freq) { ++bracketIndex; } @@ -629,7 +649,7 @@ namespace ams::ldr::hoc::pcv::mariko { } /* Clear the entire 32-entry region */ - std::memset(mem_dvb_table_head, 0, DvbTableCapacity * sizeof(DvbEntry)); + std::memset(mem_dvb_table_head, 0, DvfsTableEntryCount * sizeof(DvbEntry)); std::memcpy(mem_dvb_table_head, emcDvbTableOc, dvbCount * sizeof(DvbEntry)); R_SUCCEED(); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index 5f87b578..878f60e2 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -202,9 +202,6 @@ namespace ams::ldr::hoc::pcv { constexpr size_t EmcDvfsTableEntryCount = 64; constexpr size_t EmcDvfsTableEntryLimit = EmcDvfsTableEntryCount - 1; - // The pcv SoC-voltage DVB table is a fixed 32-entry region. (it doesn't need to be larger) - constexpr size_t DvbTableCapacity = 32; - /* Note: According to TRM the lut size is 33, but up to 64 LUT is possible. */ constexpr size_t ClDvfsLutSize = 64; From d7c9ad8515abf8513e0e52d47fb769e3b18322db Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:05:16 +0200 Subject: [PATCH 205/205] ldr: use the correct size and don't be stupid --- .../stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp index fb1e35d8..49fadc9b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.cpp @@ -525,7 +525,7 @@ namespace ams::ldr::hoc::pcv::mariko { void Get32LutEmcList(std::vector &emcList) { /* No need to reduce outside of 33MHz stepmode. */ - if (C.stepMode != StepMode_33MHz || emcList.size() <= mariko::MtcTableCountDefault) { + if (C.stepMode != StepMode_33MHz || emcList.size() <= DvfsTableEntryLimit) { return; }

    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

  • 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%0ABz9>xQN*L6$A7OIoX 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%0Dbv+P3I?k#$?f35IBV6kigN(nhNOE4Vv8w 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 z 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

    +GF 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⋘rHiGnQoZ^d4Y~$QC%gjc6oNg`D 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 z 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

    mRzUq*RB0nLoRLHQiX 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%0DALo5#si@q1MDd8bl!xW4$J9s;X0ZN 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
    wmn;pp5D@I(;HbfGDF4CcM%is{Sk+ET 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 #H&h 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
    cgYOH%3$=+4C=+@kb;Z7gxg(14W{lMwfLSL2T2s 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%0AXVC@!#3-_UEDc;MZ>)4 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