From e3eadcd2e368430fbcb433d2244e28a304a048f9 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Thu, 14 May 2020 15:57:22 -0700 Subject: [PATCH] exo2: Implement SmcReadWriteRegister --- .../source/smc/secmon_define_access_table.inc | 30 +++ .../smc/secmon_define_mc01_access_table.inc | 25 ++ .../smc/secmon_define_mc_access_table.inc | 25 ++ .../smc/secmon_define_pmc_access_table.inc | 25 ++ .../smc/secmon_mc01_access_table_data.inc | 43 ++++ .../smc/secmon_mc_access_table_data.inc | 195 ++++++++++++++++ .../smc/secmon_pmc_access_table_data.inc | 47 ++++ .../program/source/smc/secmon_smc_aes.cpp | 12 +- .../program/source/smc/secmon_smc_aes.hpp | 12 +- .../source/smc/secmon_smc_carveout.cpp | 2 +- .../source/smc/secmon_smc_carveout.hpp | 2 +- .../smc/secmon_smc_device_unique_data.cpp | 8 +- .../smc/secmon_smc_device_unique_data.hpp | 8 +- .../program/source/smc/secmon_smc_error.cpp | 2 +- .../program/source/smc/secmon_smc_error.hpp | 2 +- .../program/source/smc/secmon_smc_es.cpp | 4 +- .../program/source/smc/secmon_smc_es.hpp | 4 +- .../program/source/smc/secmon_smc_handler.cpp | 2 +- .../program/source/smc/secmon_smc_handler.hpp | 2 +- .../program/source/smc/secmon_smc_info.cpp | 8 +- .../program/source/smc/secmon_smc_info.hpp | 8 +- .../source/smc/secmon_smc_memory_access.cpp | 4 +- .../source/smc/secmon_smc_memory_access.hpp | 4 +- .../smc/secmon_smc_power_management.cpp | 6 +- .../smc/secmon_smc_power_management.hpp | 6 +- .../program/source/smc/secmon_smc_random.cpp | 4 +- .../program/source/smc/secmon_smc_random.hpp | 4 +- .../source/smc/secmon_smc_register_access.cpp | 176 +++++++++++++- .../source/smc/secmon_smc_register_access.hpp | 2 +- .../program/source/smc/secmon_smc_result.cpp | 4 +- .../program/source/smc/secmon_smc_result.hpp | 4 +- .../program/source/smc/secmon_smc_rsa.cpp | 4 +- .../program/source/smc/secmon_smc_rsa.hpp | 4 +- .../include/exosphere/tegra/tegra_mc.hpp | 214 +++++++++++++++++- .../include/exosphere/tegra/tegra_pmc.hpp | 155 +++++++------ 35 files changed, 918 insertions(+), 139 deletions(-) create mode 100644 exosphere2/program/source/smc/secmon_define_access_table.inc create mode 100644 exosphere2/program/source/smc/secmon_define_mc01_access_table.inc create mode 100644 exosphere2/program/source/smc/secmon_define_mc_access_table.inc create mode 100644 exosphere2/program/source/smc/secmon_define_pmc_access_table.inc create mode 100644 exosphere2/program/source/smc/secmon_mc01_access_table_data.inc create mode 100644 exosphere2/program/source/smc/secmon_mc_access_table_data.inc create mode 100644 exosphere2/program/source/smc/secmon_pmc_access_table_data.inc diff --git a/exosphere2/program/source/smc/secmon_define_access_table.inc b/exosphere2/program/source/smc/secmon_define_access_table.inc new file mode 100644 index 000000000..d8875231b --- /dev/null +++ b/exosphere2/program/source/smc/secmon_define_access_table.inc @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2020 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 . + */ + +using __ACCESS_TABLE_NAME__ = AccessTable<__ACCESS_TABLE_ADDRESS__, [] { + /* Declare a table. */ + std::array table = {}; + + /* Declare a helper. */ + auto SetRegisterAllowed = [&](uintptr_t reg) { SetRegisterTableAllowed(table, reg); }; + + /* Populate the table. */ + #include __ACCESS_TABLE_INC__ + + return table; +}()>; + +static_assert(__ACCESS_TABLE_NAME__::Address >= __ACCESS_TABLE_ADDRESS__); diff --git a/exosphere2/program/source/smc/secmon_define_mc01_access_table.inc b/exosphere2/program/source/smc/secmon_define_mc01_access_table.inc new file mode 100644 index 000000000..ecb142b4b --- /dev/null +++ b/exosphere2/program/source/smc/secmon_define_mc01_access_table.inc @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2020 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__ Mc01AccessTable +#define __ACCESS_TABLE_ADDRESS__ 0 +#define __ACCESS_TABLE_INC__ "secmon_mc01_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/exosphere2/program/source/smc/secmon_define_mc_access_table.inc b/exosphere2/program/source/smc/secmon_define_mc_access_table.inc new file mode 100644 index 000000000..bfc3da5db --- /dev/null +++ b/exosphere2/program/source/smc/secmon_define_mc_access_table.inc @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2020 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__ McAccessTable +#define __ACCESS_TABLE_ADDRESS__ MemoryRegionPhysicalDeviceMemoryController.GetAddress() +#define __ACCESS_TABLE_INC__ "secmon_mc_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/exosphere2/program/source/smc/secmon_define_pmc_access_table.inc b/exosphere2/program/source/smc/secmon_define_pmc_access_table.inc new file mode 100644 index 000000000..9ce0f5236 --- /dev/null +++ b/exosphere2/program/source/smc/secmon_define_pmc_access_table.inc @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2020 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__ PmcAccessTable +#define __ACCESS_TABLE_ADDRESS__ MemoryRegionPhysicalDevicePmc.GetAddress() +#define __ACCESS_TABLE_INC__ "secmon_pmc_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/exosphere2/program/source/smc/secmon_mc01_access_table_data.inc b/exosphere2/program/source/smc/secmon_mc01_access_table_data.inc new file mode 100644 index 000000000..4e4f68d1f --- /dev/null +++ b/exosphere2/program/source/smc/secmon_mc01_access_table_data.inc @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2020 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(MC_STAT_CONTROL); /* 0x100 */ +SetRegisterAllowed(MC_STAT_EMC_CLOCK_LIMIT); /* 0x108 */ +SetRegisterAllowed(MC_STAT_EMC_CLOCK_LIMIT_MSBS); /* 0x10C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_LO); /* 0x118 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_HI); /* 0x11C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_SPARE); /* 0x124 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_CLIENT_0); /* 0x128 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_CLIENT_1); /* 0x12C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_CLIENT_2); /* 0x130 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_CLIENT_3); /* 0x134 */ +SetRegisterAllowed(MC_STAT_EMC_SET0_COUNT); /* 0x138 */ +SetRegisterAllowed(MC_STAT_EMC_SET0_COUNT_MSBS); /* 0x13C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_LO); /* 0x158 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_HI); /* 0x15C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_SPARE); /* 0x164 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_CLIENT_0); /* 0x168 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_CLIENT_1); /* 0x16C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_CLIENT_2); /* 0x170 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_CLIENT_3); /* 0x174 */ +SetRegisterAllowed(MC_STAT_EMC_SET1_COUNT); /* 0x178 */ +SetRegisterAllowed(MC_STAT_EMC_SET1_COUNT_MSBS); /* 0x17C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_UPPER); /* 0xA20 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_UPPER); /* 0xA24 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_CLIENT_4); /* 0xB88 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_CLIENT_4); /* 0xB8C */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET0_CLIENT_5); /* 0xBC4 */ +SetRegisterAllowed(MC_STAT_EMC_FILTER_SET1_CLIENT_5); /* 0xBC8 */ \ No newline at end of file diff --git a/exosphere2/program/source/smc/secmon_mc_access_table_data.inc b/exosphere2/program/source/smc/secmon_mc_access_table_data.inc new file mode 100644 index 000000000..5b97b8f3f --- /dev/null +++ b/exosphere2/program/source/smc/secmon_mc_access_table_data.inc @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2018-2020 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(MC_INTSTATUS); /* 0x000 */ +SetRegisterAllowed(MC_INTMASK); /* 0x004 */ +SetRegisterAllowed(MC_ERR_STATUS); /* 0x008 */ +SetRegisterAllowed(MC_ERR_ADR); /* 0x00C */ +SetRegisterAllowed(MC_SMMU_CONFIG); /* 0x010 */ +SetRegisterAllowed(MC_SMMU_PTB_ASID); /* 0x01C */ +SetRegisterAllowed(MC_SMMU_PTB_DATA); /* 0x020 */ +SetRegisterAllowed(MC_SMMU_TLB_FLUSH); /* 0x030 */ +SetRegisterAllowed(MC_SMMU_PTC_FLUSH); /* 0x034 */ +SetRegisterAllowed(MC_EMEM_CFG); /* 0x050 */ +SetRegisterAllowed(MC_EMEM_ADR_CFG); /* 0x054 */ +SetRegisterAllowed(MC_EMEM_ARB_CFG); /* 0x090 */ +SetRegisterAllowed(MC_EMEM_ARB_OUTSTANDING_REQ); /* 0x094 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RCD); /* 0x098 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RP); /* 0x09C */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RC); /* 0x0A0 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RAS); /* 0x0A4 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_FAW); /* 0x0A8 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RRD); /* 0x0AC */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RAP2PRE); /* 0x0B0 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_WAP2PRE); /* 0x0B4 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_R2R); /* 0x0B8 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_W2W); /* 0x0BC */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_R2W); /* 0x0C0 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_W2R); /* 0x0C4 */ +SetRegisterAllowed(MC_EMEM_ARB_MISC2); /* 0x0C8 */ +SetRegisterAllowed(MC_EMEM_ARB_DA_TURNS); /* 0x0D0 */ +SetRegisterAllowed(MC_EMEM_ARB_DA_COVERS); /* 0x0D4 */ +SetRegisterAllowed(MC_EMEM_ARB_MISC0); /* 0x0D8 */ +SetRegisterAllowed(MC_EMEM_ARB_MISC1); /* 0x0DC */ +SetRegisterAllowed(MC_EMEM_ARB_RING1_THROTTLE); /* 0x0E0 */ +SetRegisterAllowed(MC_CLIENT_HOTRESET_CTRL); /* 0x200 */ +SetRegisterAllowed(MC_CLIENT_HOTRESET_STATUS); /* 0x204 */ +SetRegisterAllowed(MC_SMMU_AFI_ASID); /* 0x238 */ +SetRegisterAllowed(MC_SMMU_DC_ASID); /* 0x240 */ +SetRegisterAllowed(MC_SMMU_DCB_ASID); /* 0x244 */ +SetRegisterAllowed(MC_SMMU_HC_ASID); /* 0x250 */ +SetRegisterAllowed(MC_SMMU_HDA_ASID); /* 0x254 */ +SetRegisterAllowed(MC_SMMU_ISP2_ASID); /* 0x258 */ +SetRegisterAllowed(MC_SMMU_NVENC_ASID); /* 0x264 */ +SetRegisterAllowed(MC_SMMU_NV_ASID); /* 0x268 */ +SetRegisterAllowed(MC_SMMU_NV2_ASID); /* 0x26C */ +SetRegisterAllowed(MC_SMMU_PPCS_ASID); /* 0x270 */ +SetRegisterAllowed(MC_SMMU_SATA_ASID); /* 0x274 */ +SetRegisterAllowed(MC_SMMU_VI_ASID); /* 0x280 */ +SetRegisterAllowed(MC_SMMU_VIC_ASID); /* 0x284 */ +SetRegisterAllowed(MC_SMMU_XUSB_HOST_ASID); /* 0x288 */ +SetRegisterAllowed(MC_SMMU_XUSB_DEV_ASID); /* 0x28C */ +SetRegisterAllowed(MC_SMMU_TSEC_ASID); /* 0x294 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_AVPC_0); /* 0x2E4 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_DC_0); /* 0x2E8 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_DC_1); /* 0x2EC */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_DCB_0); /* 0x2F4 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_DCB_1); /* 0x2F8 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_HC_0); /* 0x310 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_HC_1); /* 0x314 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_MPCORE_0); /* 0x320 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_NVENC_0); /* 0x328 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_PPCS_0); /* 0x344 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_PPCS_1); /* 0x348 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_ISP2_0); /* 0x370 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_ISP2_1); /* 0x374 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_XUSB_0); /* 0x37C */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_XUSB_1); /* 0x380 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_TSEC_0); /* 0x390 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_VIC_0); /* 0x394 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_VI2_0); /* 0x398 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_GPU_0); /* 0x3AC */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_SDMMCA_0); /* 0x3B8 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_SDMMCAA_0); /* 0x3BC */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_SDMMC_0); /* 0x3C0 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_SDMMCAB_0); /* 0x3C4 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_NVDEC_0); /* 0x3D8 */ +SetRegisterAllowed(MC_LATENCY_ALLOWANCE_GPU2_0); /* 0x3E8 */ +SetRegisterAllowed(MC_DIS_PTSA_RATE); /* 0x41C */ +SetRegisterAllowed(MC_DIS_PTSA_MIN); /* 0x420 */ +SetRegisterAllowed(MC_DIS_PTSA_MAX); /* 0x424 */ +SetRegisterAllowed(MC_DISB_PTSA_RATE); /* 0x428 */ +SetRegisterAllowed(MC_DISB_PTSA_MIN); /* 0x42C */ +SetRegisterAllowed(MC_DISB_PTSA_MAX); /* 0x430 */ +SetRegisterAllowed(MC_VE_PTSA_RATE); /* 0x434 */ +SetRegisterAllowed(MC_VE_PTSA_MIN); /* 0x438 */ +SetRegisterAllowed(MC_VE_PTSA_MAX); /* 0x43C */ +SetRegisterAllowed(MC_MLL_MPCORER_PTSA_RATE); /* 0x44C */ +SetRegisterAllowed(MC_RING1_PTSA_RATE); /* 0x47C */ +SetRegisterAllowed(MC_RING1_PTSA_MIN); /* 0x480 */ +SetRegisterAllowed(MC_RING1_PTSA_MAX); /* 0x484 */ +SetRegisterAllowed(MC_PCX_PTSA_RATE); /* 0x4AC */ +SetRegisterAllowed(MC_PCX_PTSA_MIN); /* 0x4B0 */ +SetRegisterAllowed(MC_PCX_PTSA_MAX); /* 0x4B4 */ +SetRegisterAllowed(MC_MSE_PTSA_RATE); /* 0x4C4 */ +SetRegisterAllowed(MC_MSE_PTSA_MIN); /* 0x4C8 */ +SetRegisterAllowed(MC_MSE_PTSA_MAX); /* 0x4CC */ +SetRegisterAllowed(MC_AHB_PTSA_RATE); /* 0x4DC */ +SetRegisterAllowed(MC_AHB_PTSA_MIN); /* 0x4E0 */ +SetRegisterAllowed(MC_AHB_PTSA_MAX); /* 0x4E4 */ +SetRegisterAllowed(MC_APB_PTSA_RATE); /* 0x4E8 */ +SetRegisterAllowed(MC_APB_PTSA_MIN); /* 0x4EC */ +SetRegisterAllowed(MC_APB_PTSA_MAX); /* 0x4F0 */ +SetRegisterAllowed(MC_FTOP_PTSA_RATE); /* 0x50C */ +SetRegisterAllowed(MC_HOST_PTSA_RATE); /* 0x518 */ +SetRegisterAllowed(MC_HOST_PTSA_MIN); /* 0x51C */ +SetRegisterAllowed(MC_HOST_PTSA_MAX); /* 0x520 */ +SetRegisterAllowed(MC_USBX_PTSA_RATE); /* 0x524 */ +SetRegisterAllowed(MC_USBX_PTSA_MIN); /* 0x528 */ +SetRegisterAllowed(MC_USBX_PTSA_MAX); /* 0x52C */ +SetRegisterAllowed(MC_USBD_PTSA_RATE); /* 0x530 */ +SetRegisterAllowed(MC_USBD_PTSA_MIN); /* 0x534 */ +SetRegisterAllowed(MC_USBD_PTSA_MAX); /* 0x538 */ +SetRegisterAllowed(MC_GK_PTSA_RATE); /* 0x53C */ +SetRegisterAllowed(MC_GK_PTSA_MIN); /* 0x540 */ +SetRegisterAllowed(MC_GK_PTSA_MAX); /* 0x544 */ +SetRegisterAllowed(MC_AUD_PTSA_RATE); /* 0x548 */ +SetRegisterAllowed(MC_AUD_PTSA_MIN); /* 0x54C */ +SetRegisterAllowed(MC_AUD_PTSA_MAX); /* 0x550 */ +SetRegisterAllowed(MC_VICPC_PTSA_RATE); /* 0x554 */ +SetRegisterAllowed(MC_VICPC_PTSA_MIN); /* 0x558 */ +SetRegisterAllowed(MC_VICPC_PTSA_MAX); /* 0x55C */ +SetRegisterAllowed(MC_JPG_PTSA_RATE); /* 0x584 */ +SetRegisterAllowed(MC_JPG_PTSA_MIN); /* 0x588 */ +SetRegisterAllowed(MC_JPG_PTSA_MAX); /* 0x58C */ +SetRegisterAllowed(MC_GK2_PTSA_RATE); /* 0x610 */ +SetRegisterAllowed(MC_GK2_PTSA_MIN); /* 0x614 */ +SetRegisterAllowed(MC_GK2_PTSA_MAX); /* 0x618 */ +SetRegisterAllowed(MC_SDM_PTSA_RATE); /* 0x61C */ +SetRegisterAllowed(MC_SDM_PTSA_MIN); /* 0x620 */ +SetRegisterAllowed(MC_SDM_PTSA_MAX); /* 0x624 */ +SetRegisterAllowed(MC_HDAPC_PTSA_RATE); /* 0x628 */ +SetRegisterAllowed(MC_HDAPC_PTSA_MIN); /* 0x62C */ +SetRegisterAllowed(MC_HDAPC_PTSA_MAX); /* 0x630 */ +SetRegisterAllowed(MC_SEC_CARVEOUT_BOM); /* 0x670 */ +SetRegisterAllowed(MC_SEC_CARVEOUT_SIZE_MB); /* 0x674 */ +SetRegisterAllowed(MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A); /* 0x690 */ +SetRegisterAllowed(MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB); /* 0x694 */ +SetRegisterAllowed(MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B); /* 0x698 */ +SetRegisterAllowed(MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB); /* 0x69C */ +SetRegisterAllowed(MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C); /* 0x6A0 */ +SetRegisterAllowed(MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB); /* 0x6A4 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_RFCPB); /* 0x6C0 */ +SetRegisterAllowed(MC_EMEM_ARB_TIMING_CCDMW); /* 0x6C4 */ +SetRegisterAllowed(MC_EMEM_ARB_REFPB_HP_CTRL); /* 0x6F0 */ +SetRegisterAllowed(MC_EMEM_ARB_REFPB_BANK_CTRL); /* 0x6F4 */ +SetRegisterAllowed(MC_PTSA_GRANT_DECREMENT); /* 0x960 */ +SetRegisterAllowed(MC_CLIENT_HOTRESET_CTRL_1); /* 0x970 */ +SetRegisterAllowed(MC_CLIENT_HOTRESET_STATUS_1); /* 0x974 */ +SetRegisterAllowed(MC_SMMU_PTC_FLUSH_1); /* 0x9B8 */ +SetRegisterAllowed(MC_SMMU_DC1_ASID); /* 0xA88 */ +SetRegisterAllowed(MC_SMMU_SDMMC1A_ASID); /* 0xA94 */ +SetRegisterAllowed(MC_SMMU_SDMMC2A_ASID); /* 0xA98 */ +SetRegisterAllowed(MC_SMMU_SDMMC3A_ASID); /* 0xA9C */ +SetRegisterAllowed(MC_SMMU_SDMMC4A_ASID); /* 0xAA0 */ +SetRegisterAllowed(MC_SMMU_ISP2B_ASID); /* 0xAA4 */ +SetRegisterAllowed(MC_SMMU_GPU_ASID); /* 0xAA8 */ +SetRegisterAllowed(MC_SMMU_GPUB_ASID); /* 0xAAC */ +SetRegisterAllowed(MC_SMMU_PPCS2_ASID); /* 0xAB0 */ +SetRegisterAllowed(MC_SMMU_NVDEC_ASID); /* 0xAB4 */ +SetRegisterAllowed(MC_SMMU_APE_ASID); /* 0xAB8 */ +SetRegisterAllowed(MC_SMMU_SE_ASID); /* 0xABC */ +SetRegisterAllowed(MC_SMMU_NVJPG_ASID); /* 0xAC0 */ +SetRegisterAllowed(MC_SMMU_HC1_ASID); /* 0xAC4 */ +SetRegisterAllowed(MC_SMMU_SE1_ASID); /* 0xAC8 */ +SetRegisterAllowed(MC_SMMU_AXIAP_ASID); /* 0xACC */ +SetRegisterAllowed(MC_SMMU_ETR_ASID); /* 0xAD0 */ +SetRegisterAllowed(MC_SMMU_TSECB_ASID); /* 0xAD4 */ +SetRegisterAllowed(MC_SMMU_TSEC1_ASID); /* 0xAD8 */ +SetRegisterAllowed(MC_SMMU_TSECB1_ASID); /* 0xADC */ +SetRegisterAllowed(MC_SMMU_NVDEC1_ASID); /* 0xAE0 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_CTRL); /* 0xBCC */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_0); /* 0xBD0 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_1); /* 0xBD4 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_2); /* 0xBD8 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_3); /* 0xBDC */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_4); /* 0xBE0 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_5); /* 0xBE4 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_6); /* 0xBE8 */ +SetRegisterAllowed(MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_7); /* 0xBEC */ +SetRegisterAllowed(MC_ERR_GENERALIZED_CARVEOUT_STATUS); /* 0xC00 */ +SetRegisterAllowed(MC_SECURITY_CARVEOUT2_BOM); /* 0xC5C */ +SetRegisterAllowed(MC_SECURITY_CARVEOUT3_BOM); /* 0xCAC */ \ No newline at end of file diff --git a/exosphere2/program/source/smc/secmon_pmc_access_table_data.inc b/exosphere2/program/source/smc/secmon_pmc_access_table_data.inc new file mode 100644 index 000000000..e94be6d8d --- /dev/null +++ b/exosphere2/program/source/smc/secmon_pmc_access_table_data.inc @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2020 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(APBDEV_PMC_CNTRL); /* 0x000 */ +SetRegisterAllowed(APBDEV_PMC_WAKE_MASK); /* 0x00C */ +SetRegisterAllowed(APBDEV_PMC_WAKE_LVL); /* 0x010 */ +SetRegisterAllowed(APBDEV_PMC_WAKE_STATUS); /* 0x014 */ +SetRegisterAllowed(APBDEV_PMC_DPD_PADS_ORIDE); /* 0x01C */ +SetRegisterAllowed(APBDEV_PMC_DPD_SAMPLE); /* 0x020 */ +SetRegisterAllowed(APBDEV_PMC_CLAMP_STATUS); /* 0x02C */ +SetRegisterAllowed(APBDEV_PMC_PWRGATE_TOGGLE); /* 0x030 */ +SetRegisterAllowed(APBDEV_PMC_REMOVE_CLAMPING_CMD ); /* 0x034 */ +SetRegisterAllowed(APBDEV_PMC_PWRGATE_STATUS); /* 0x038 */ +SetRegisterAllowed(APBDEV_PMC_PWRGOOD_TIMER); /* 0x03C */ +SetRegisterAllowed(APBDEV_PMC_BLINK_TIMER); /* 0x040 */ +SetRegisterAllowed(APBDEV_PMC_NO_IOPOWER); /* 0x044 */ +SetRegisterAllowed(APBDEV_PMC_PWR_DET); /* 0x048 */ +SetRegisterAllowed(APBDEV_PMC_AUTO_WAKE_LVL_MASK); /* 0x0DC */ +SetRegisterAllowed(APBDEV_PMC_WAKE_DELAY); /* 0x0E0 */ +SetRegisterAllowed(APBDEV_PMC_PWR_DET_VAL); /* 0x0E4 */ +SetRegisterAllowed(APBDEV_PMC_WAKE2_MASK); /* 0x160 */ +SetRegisterAllowed(APBDEV_PMC_WAKE2_LVL); /* 0x164 */ +SetRegisterAllowed(APBDEV_PMC_WAKE2_STATUS); /* 0x168 */ +SetRegisterAllowed(APBDEV_PMC_AUTO_WAKE2_LVL_MASK ); /* 0x170 */ +SetRegisterAllowed(APBDEV_PMC_CLK_OUT_CNTRL); /* 0x1A8 */ +SetRegisterAllowed(APBDEV_PMC_IO_DPD_REQ); /* 0x1B8 */ +SetRegisterAllowed(APBDEV_PMC_IO_DPD_STATUS); /* 0x1BC */ +SetRegisterAllowed(APBDEV_PMC_IO_DPD2_REQ); /* 0x1C0 */ +SetRegisterAllowed(APBDEV_PMC_IO_DPD2_STATUS); /* 0x1C4 */ +SetRegisterAllowed(APBDEV_PMC_SEL_DPD_TIM); /* 0x1C8 */ +SetRegisterAllowed(APBDEV_PMC_TSC_MULT); /* 0x2B4 */ +SetRegisterAllowed(APBDEV_PMC_GPU_RG_CNTRL); /* 0x2D4 */ +SetRegisterAllowed(APBDEV_PMC_CNTRL2); /* 0x440 */ +SetRegisterAllowed(APBDEV_PMC_WAKE_DEBOUNCE_EN); /* 0x4D8 */ \ No newline at end of file diff --git a/exosphere2/program/source/smc/secmon_smc_aes.cpp b/exosphere2/program/source/smc/secmon_smc_aes.cpp index 9283a278c..2edd1d812 100644 --- a/exosphere2/program/source/smc/secmon_smc_aes.cpp +++ b/exosphere2/program/source/smc/secmon_smc_aes.cpp @@ -19,32 +19,32 @@ namespace ams::secmon::smc { - SmcResult SmcGenerateAesKek(const SmcArguments &args) { + SmcResult SmcGenerateAesKek(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcLoadAesKey(const SmcArguments &args) { + SmcResult SmcLoadAesKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcComputeAes(const SmcArguments &args) { + SmcResult SmcComputeAes(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcGenerateSpecificAesKey(const SmcArguments &args) { + SmcResult SmcGenerateSpecificAesKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcComputeCmac(const SmcArguments &args) { + SmcResult SmcComputeCmac(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcLoadPreparedAesKey(const SmcArguments &args) { + SmcResult SmcLoadPreparedAesKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_aes.hpp b/exosphere2/program/source/smc/secmon_smc_aes.hpp index b0b3c3d95..8aa55fd81 100644 --- a/exosphere2/program/source/smc/secmon_smc_aes.hpp +++ b/exosphere2/program/source/smc/secmon_smc_aes.hpp @@ -19,11 +19,11 @@ namespace ams::secmon::smc { - SmcResult SmcGenerateAesKek(const SmcArguments &args); - SmcResult SmcLoadAesKey(const SmcArguments &args); - SmcResult SmcComputeAes(const SmcArguments &args); - SmcResult SmcGenerateSpecificAesKey(const SmcArguments &args); - SmcResult SmcComputeCmac(const SmcArguments &args); - SmcResult SmcLoadPreparedAesKey(const SmcArguments &args); + SmcResult SmcGenerateAesKek(SmcArguments &args); + SmcResult SmcLoadAesKey(SmcArguments &args); + SmcResult SmcComputeAes(SmcArguments &args); + SmcResult SmcGenerateSpecificAesKey(SmcArguments &args); + SmcResult SmcComputeCmac(SmcArguments &args); + SmcResult SmcLoadPreparedAesKey(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_carveout.cpp b/exosphere2/program/source/smc/secmon_smc_carveout.cpp index ba037d498..2f947431e 100644 --- a/exosphere2/program/source/smc/secmon_smc_carveout.cpp +++ b/exosphere2/program/source/smc/secmon_smc_carveout.cpp @@ -19,7 +19,7 @@ namespace ams::secmon::smc { - SmcResult SmcSetKernelCarveoutRegion(const SmcArguments &args) { + SmcResult SmcSetKernelCarveoutRegion(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_carveout.hpp b/exosphere2/program/source/smc/secmon_smc_carveout.hpp index f3d346d97..bc09fcd13 100644 --- a/exosphere2/program/source/smc/secmon_smc_carveout.hpp +++ b/exosphere2/program/source/smc/secmon_smc_carveout.hpp @@ -19,6 +19,6 @@ namespace ams::secmon::smc { - SmcResult SmcSetKernelCarveoutRegion(const SmcArguments &args); + SmcResult SmcSetKernelCarveoutRegion(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_device_unique_data.cpp b/exosphere2/program/source/smc/secmon_smc_device_unique_data.cpp index 39fb28dcb..b9ac92699 100644 --- a/exosphere2/program/source/smc/secmon_smc_device_unique_data.cpp +++ b/exosphere2/program/source/smc/secmon_smc_device_unique_data.cpp @@ -19,23 +19,23 @@ namespace ams::secmon::smc { - SmcResult SmcDecryptDeviceUniqueData(const SmcArguments &args) { + SmcResult SmcDecryptDeviceUniqueData(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcReencryptDeviceUniqueData(const SmcArguments &args) { + SmcResult SmcReencryptDeviceUniqueData(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } /* Legacy APIs. */ - SmcResult SmcDecryptAndImportEsDeviceKey(const SmcArguments &args) { + SmcResult SmcDecryptAndImportEsDeviceKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcDecryptAndImportLotusKey(const SmcArguments &args) { + SmcResult SmcDecryptAndImportLotusKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_device_unique_data.hpp b/exosphere2/program/source/smc/secmon_smc_device_unique_data.hpp index 9def74026..1c36ec1f8 100644 --- a/exosphere2/program/source/smc/secmon_smc_device_unique_data.hpp +++ b/exosphere2/program/source/smc/secmon_smc_device_unique_data.hpp @@ -19,11 +19,11 @@ namespace ams::secmon::smc { - SmcResult SmcDecryptDeviceUniqueData(const SmcArguments &args); - SmcResult SmcReencryptDeviceUniqueData(const SmcArguments &args); + SmcResult SmcDecryptDeviceUniqueData(SmcArguments &args); + SmcResult SmcReencryptDeviceUniqueData(SmcArguments &args); /* Legacy APIs. */ - SmcResult SmcDecryptAndImportEsDeviceKey(const SmcArguments &args); - SmcResult SmcDecryptAndImportLotusKey(const SmcArguments &args); + SmcResult SmcDecryptAndImportEsDeviceKey(SmcArguments &args); + SmcResult SmcDecryptAndImportLotusKey(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_error.cpp b/exosphere2/program/source/smc/secmon_smc_error.cpp index 309a2e832..70ea8f1db 100644 --- a/exosphere2/program/source/smc/secmon_smc_error.cpp +++ b/exosphere2/program/source/smc/secmon_smc_error.cpp @@ -19,7 +19,7 @@ namespace ams::secmon::smc { - SmcResult SmcShowError(const SmcArguments &args) { + SmcResult SmcShowError(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_error.hpp b/exosphere2/program/source/smc/secmon_smc_error.hpp index 62eff45da..25b74f1a6 100644 --- a/exosphere2/program/source/smc/secmon_smc_error.hpp +++ b/exosphere2/program/source/smc/secmon_smc_error.hpp @@ -19,6 +19,6 @@ namespace ams::secmon::smc { - SmcResult SmcShowError(const SmcArguments &args); + SmcResult SmcShowError(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_es.cpp b/exosphere2/program/source/smc/secmon_smc_es.cpp index a707c35f0..939e12b44 100644 --- a/exosphere2/program/source/smc/secmon_smc_es.cpp +++ b/exosphere2/program/source/smc/secmon_smc_es.cpp @@ -19,12 +19,12 @@ namespace ams::secmon::smc { - SmcResult SmcPrepareEsDeviceUniqueKey(const SmcArguments &args) { + SmcResult SmcPrepareEsDeviceUniqueKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcPrepareEsCommonKey(const SmcArguments &args) { + SmcResult SmcPrepareEsCommonKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_es.hpp b/exosphere2/program/source/smc/secmon_smc_es.hpp index 1aabbc210..a9d2d30d9 100644 --- a/exosphere2/program/source/smc/secmon_smc_es.hpp +++ b/exosphere2/program/source/smc/secmon_smc_es.hpp @@ -26,7 +26,7 @@ namespace ams::secmon::smc { EsKeyType_Count = 2, }; - SmcResult SmcPrepareEsDeviceUniqueKey(const SmcArguments &args); - SmcResult SmcPrepareEsCommonKey(const SmcArguments &args); + SmcResult SmcPrepareEsDeviceUniqueKey(SmcArguments &args); + SmcResult SmcPrepareEsCommonKey(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_handler.cpp b/exosphere2/program/source/smc/secmon_smc_handler.cpp index 346af6f3d..918824504 100644 --- a/exosphere2/program/source/smc/secmon_smc_handler.cpp +++ b/exosphere2/program/source/smc/secmon_smc_handler.cpp @@ -207,7 +207,7 @@ namespace ams::secmon::smc { return (info.restriction_mask & secmon::GetRestrictedSmcMask()) != 0; } - SmcResult InvokeSmcHandler(const HandlerInfo &info, const SmcArguments &args) { + SmcResult InvokeSmcHandler(const HandlerInfo &info, SmcArguments &args) { /* Check if the smc is restricted. */ if (AMS_UNLIKELY(IsHandlerRestricted(info))) { return SmcResult::NotPermitted; diff --git a/exosphere2/program/source/smc/secmon_smc_handler.hpp b/exosphere2/program/source/smc/secmon_smc_handler.hpp index 9c5d4b317..f05120951 100644 --- a/exosphere2/program/source/smc/secmon_smc_handler.hpp +++ b/exosphere2/program/source/smc/secmon_smc_handler.hpp @@ -19,6 +19,6 @@ namespace ams::secmon::smc { - using SmcHandler = SmcResult (*)(const SmcArguments &args); + using SmcHandler = SmcResult (*)(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_info.cpp b/exosphere2/program/source/smc/secmon_smc_info.cpp index 2be199d28..fba5f75ad 100644 --- a/exosphere2/program/source/smc/secmon_smc_info.cpp +++ b/exosphere2/program/source/smc/secmon_smc_info.cpp @@ -19,23 +19,23 @@ namespace ams::secmon::smc { - SmcResult SmcGetConfigUser(const SmcArguments &args) { + SmcResult SmcGetConfigUser(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcGetConfigKern(const SmcArguments &args) { + SmcResult SmcGetConfigKern(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcSetConfig(const SmcArguments &args) { + SmcResult SmcSetConfig(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } /* This is an atmosphere extension smc. */ - SmcResult SmcGetEmummcConfig(const SmcArguments &args) { + SmcResult SmcGetEmummcConfig(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_info.hpp b/exosphere2/program/source/smc/secmon_smc_info.hpp index 8a0e3c5d5..907682b8a 100644 --- a/exosphere2/program/source/smc/secmon_smc_info.hpp +++ b/exosphere2/program/source/smc/secmon_smc_info.hpp @@ -49,11 +49,11 @@ namespace ams::secmon::smc { ExosphereAllowCalWrites = 65006, }; - SmcResult SmcGetConfigUser(const SmcArguments &args); - SmcResult SmcGetConfigKern(const SmcArguments &args); - SmcResult SmcSetConfig(const SmcArguments &args); + SmcResult SmcGetConfigUser(SmcArguments &args); + SmcResult SmcGetConfigKern(SmcArguments &args); + SmcResult SmcSetConfig(SmcArguments &args); /* This is an atmosphere extension smc. */ - SmcResult SmcGetEmummcConfig(const SmcArguments &args); + SmcResult SmcGetEmummcConfig(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_memory_access.cpp b/exosphere2/program/source/smc/secmon_smc_memory_access.cpp index 47f29fc8d..d68dcf879 100644 --- a/exosphere2/program/source/smc/secmon_smc_memory_access.cpp +++ b/exosphere2/program/source/smc/secmon_smc_memory_access.cpp @@ -20,12 +20,12 @@ namespace ams::secmon::smc { /* This is an atmosphere extension smc. */ - SmcResult SmcIramCopy(const SmcArguments &args) { + SmcResult SmcIramCopy(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcWriteAddress(const SmcArguments &args) { + SmcResult SmcWriteAddress(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_memory_access.hpp b/exosphere2/program/source/smc/secmon_smc_memory_access.hpp index 2b44fe292..310657601 100644 --- a/exosphere2/program/source/smc/secmon_smc_memory_access.hpp +++ b/exosphere2/program/source/smc/secmon_smc_memory_access.hpp @@ -20,7 +20,7 @@ namespace ams::secmon::smc { /* This is an atmosphere extension smc. */ - SmcResult SmcIramCopy(const SmcArguments &args); - SmcResult SmcWriteAddress(const SmcArguments &args); + SmcResult SmcIramCopy(SmcArguments &args); + SmcResult SmcWriteAddress(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_power_management.cpp b/exosphere2/program/source/smc/secmon_smc_power_management.cpp index 2bfdaae52..7ccd6ef77 100644 --- a/exosphere2/program/source/smc/secmon_smc_power_management.cpp +++ b/exosphere2/program/source/smc/secmon_smc_power_management.cpp @@ -96,12 +96,12 @@ namespace ams::secmon::smc { } - SmcResult SmcPowerOffCpu(const SmcArguments &args) { + SmcResult SmcPowerOffCpu(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcPowerOnCpu(const SmcArguments &args) { + SmcResult SmcPowerOnCpu(SmcArguments &args) { /* Get and validate the core to power on. */ const int which_core = args.r[1]; if (!(0 <= which_core && which_core < NumCores)) { @@ -128,7 +128,7 @@ namespace ams::secmon::smc { return SmcResult::PsciSuccess; } - SmcResult SmcSuspendCpu(const SmcArguments &args) { + SmcResult SmcSuspendCpu(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_power_management.hpp b/exosphere2/program/source/smc/secmon_smc_power_management.hpp index bc6f45229..65bd53df2 100644 --- a/exosphere2/program/source/smc/secmon_smc_power_management.hpp +++ b/exosphere2/program/source/smc/secmon_smc_power_management.hpp @@ -19,10 +19,10 @@ namespace ams::secmon::smc { - SmcResult SmcPowerOffCpu(const SmcArguments &args); - SmcResult SmcPowerOnCpu(const SmcArguments &args); + SmcResult SmcPowerOffCpu(SmcArguments &args); + SmcResult SmcPowerOnCpu(SmcArguments &args); - SmcResult SmcSuspendCpu(const SmcArguments &args); + SmcResult SmcSuspendCpu(SmcArguments &args); bool IsChargerHiZModeEnabled(); void SetChargerHiZModeEnabled(bool en); diff --git a/exosphere2/program/source/smc/secmon_smc_random.cpp b/exosphere2/program/source/smc/secmon_smc_random.cpp index 283e8d736..693080aa7 100644 --- a/exosphere2/program/source/smc/secmon_smc_random.cpp +++ b/exosphere2/program/source/smc/secmon_smc_random.cpp @@ -19,12 +19,12 @@ namespace ams::secmon::smc { - SmcResult SmcGenerateRandomBytes(const SmcArguments &args) { + SmcResult SmcGenerateRandomBytes(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcGenerateRandomBytesNonBlocking(const SmcArguments &args) { + SmcResult SmcGenerateRandomBytesNonBlocking(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_random.hpp b/exosphere2/program/source/smc/secmon_smc_random.hpp index 27b20b241..98c299079 100644 --- a/exosphere2/program/source/smc/secmon_smc_random.hpp +++ b/exosphere2/program/source/smc/secmon_smc_random.hpp @@ -19,7 +19,7 @@ namespace ams::secmon::smc { - SmcResult SmcGenerateRandomBytes(const SmcArguments &args); - SmcResult SmcGenerateRandomBytesNonBlocking(const SmcArguments &args); + SmcResult SmcGenerateRandomBytes(SmcArguments &args); + SmcResult SmcGenerateRandomBytesNonBlocking(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_register_access.cpp b/exosphere2/program/source/smc/secmon_smc_register_access.cpp index a656174f3..0f3e6e08e 100644 --- a/exosphere2/program/source/smc/secmon_smc_register_access.cpp +++ b/exosphere2/program/source/smc/secmon_smc_register_access.cpp @@ -19,9 +19,179 @@ namespace ams::secmon::smc { - SmcResult SmcReadWriteRegister(const SmcArguments &args) { - /* TODO */ - return SmcResult::NotImplemented; + namespace { + + template + constexpr void SetRegisterTableAllowed(std::array &arr, uintptr_t reg) { + /* All registers should be four byte aligned. */ + if (reg % sizeof(u32) != 0) { + __builtin_unreachable(); + } + + /* Reduce the register to an index. */ + reg /= sizeof(u32); + + /* Get the index and mask. */ + const auto index = reg / BITSIZEOF(u8); + const auto mask = (1u << (reg % BITSIZEOF(u8))); + + /* Check that the permission bit isn't already set. */ + if ((arr[index] & mask) != 0) { + __builtin_unreachable(); + } + + /* Set the permission bit. */ + arr[index] |= mask; + + /* Ensure that indices are set in sorted order. */ + for (auto i = (reg % BITSIZEOF(u8)) + 1; i < 8; ++i) { + if ((arr[index] & (1u << i)) != 0) { + __builtin_unreachable(); + } + } + + for (auto i = index + 1; i < arr.size(); ++i) { + if (arr[i] != 0) { + __builtin_unreachable(); + } + } + } + + template + consteval std::pair GetReducedAccessTableInfo(const std::array &arr) { + for (int last = arr.size() - 1; last >= 0; --last) { + if (arr[last] != 0) { + const int end = last + 1; + for (int start = 0; start < end; ++start) { + if (arr[start] != 0) { + return std::make_pair(static_cast(start), static_cast(end)); + } + } + return std::make_pair(static_cast(0), static_cast(end)); + } + } + + /* All empty perm table is disallowed. */ + __builtin_unreachable(); + } + + + template + struct AccessTable { + static constexpr inline auto ReducedAccessTableInfo = GetReducedAccessTableInfo(RawTable); + static constexpr inline size_t ReducedAccessTableSize = ReducedAccessTableInfo.second - ReducedAccessTableInfo.first; + static constexpr inline auto ReducedAccessTable = []() -> std::array { + std::array reduced = {}; + + for (size_t i = ReducedAccessTableInfo.first; i < ReducedAccessTableInfo.second; ++i) { + reduced[i - ReducedAccessTableInfo.first] = RawTable[i]; + } + + return reduced; + }(); + + static constexpr u32 Address = _Address + (ReducedAccessTableInfo.first * sizeof(u32) * BITSIZEOF(u8)); + static constexpr u32 Size = static_cast(ReducedAccessTableSize * sizeof(u32) * BITSIZEOF(u8)); + + static_assert(Size <= 0x1000); + }; + + struct AccessTableEntry { + const u8 * const table; + uintptr_t virtual_address; + u32 address; + u32 size; + }; + + /* Include the access tables. */ + #include "secmon_define_pmc_access_table.inc" + #include "secmon_define_mc_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, }, + { Mc01AccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController0.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController0.GetAddress(), Mc01AccessTable::Size, }, + { Mc01AccessTable::ReducedAccessTable.data(), MemoryRegionVirtualDeviceMemoryController1.GetAddress(), Mc01AccessTable::Address + MemoryRegionPhysicalDeviceMemoryController1.GetAddress(), Mc01AccessTable::Size, }, + }; + + constexpr bool IsAccessAllowed(const AccessTableEntry &entry, uintptr_t address) { + /* Check if the address is within range. */ + if (!(entry.address <= address && address < entry.address + entry.size)) { + return false; + } + + /* Get the offset. */ + const auto offset = address - entry.address; + + /* Convert it to an index. */ + const auto reg_index = offset / sizeof(u32); + + /* Get the bit fields. */ + const auto index = reg_index / BITSIZEOF(u8); + const auto mask = (1u << (reg_index % BITSIZEOF(u8))); + + /* Validate that we're not going out of bounds. */ + if (index >= entry.size / sizeof(u32)) { + return false; + } + + return (entry.table[index] & mask) != 0; + } + + constexpr const AccessTableEntry *GetAccessTableEntry(uintptr_t address) { + for (const auto &entry : AccessTables) { + if (IsAccessAllowed(entry, address)) { + return std::addressof(entry); + } + } + + return nullptr; + } + + } + + SmcResult SmcReadWriteRegister(SmcArguments &args) { + /* Get the arguments. */ + const uintptr_t address = args.r[1]; + const u32 mask = args.r[2]; + const u32 value = args.r[3]; + + /* Validate that the address is aligned. */ + if (!util::IsAligned(address, alignof(u32))) { + return SmcResult::InvalidArgument; + } + + /* Find the access table. */ + const AccessTableEntry * const entry = GetAccessTableEntry(address); + + /* If we have no table, don't perform the write. */ + if (entry == nullptr) { + /* For no clearly discernable reason, SmcReadWriteRegister returns success despite not doing the read/write */ + /* when accessing the SMMU controls for the BPMP and for APB-DMA. */ + /* 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 = MemoryRegionVirtualDeviceMemoryController.GetAddress(); + if (address == (MC + MC_SMMU_AVPC_ASID) || address == (MC + MC_SMMU_PPCS1_ASID)) { + return SmcResult::Success; + } + + return SmcResult::InvalidArgument; + } + + /* Get the address to read or write. */ + const uintptr_t virtual_address = entry->virtual_address + (address - entry->address); + u32 out = 0; + + if (mask != ~static_cast(0)) { + out = reg::Read(virtual_address); + } + if (mask != static_cast(0)) { + reg::Write(virtual_address, (out & ~mask) | (value & mask)); + } + + args.r[1] = out; + return SmcResult::Success; } } diff --git a/exosphere2/program/source/smc/secmon_smc_register_access.hpp b/exosphere2/program/source/smc/secmon_smc_register_access.hpp index d364b27f8..6a74cdc96 100644 --- a/exosphere2/program/source/smc/secmon_smc_register_access.hpp +++ b/exosphere2/program/source/smc/secmon_smc_register_access.hpp @@ -19,6 +19,6 @@ namespace ams::secmon::smc { - SmcResult SmcReadWriteRegister(const SmcArguments &args); + SmcResult SmcReadWriteRegister(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_result.cpp b/exosphere2/program/source/smc/secmon_smc_result.cpp index 6b17b8e56..5223ceca5 100644 --- a/exosphere2/program/source/smc/secmon_smc_result.cpp +++ b/exosphere2/program/source/smc/secmon_smc_result.cpp @@ -19,12 +19,12 @@ namespace ams::secmon::smc { - SmcResult SmcGetResult(const SmcArguments &args) { + SmcResult SmcGetResult(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcGetResultData(const SmcArguments &args) { + SmcResult SmcGetResultData(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_result.hpp b/exosphere2/program/source/smc/secmon_smc_result.hpp index 9355f22af..853772e50 100644 --- a/exosphere2/program/source/smc/secmon_smc_result.hpp +++ b/exosphere2/program/source/smc/secmon_smc_result.hpp @@ -25,7 +25,7 @@ namespace ams::secmon::smc { void CancelAsyncOperation(u64 async_key); void EndAsyncOperation(); - SmcResult SmcGetResult(const SmcArguments &args); - SmcResult SmcGetResultData(const SmcArguments &args); + SmcResult SmcGetResult(SmcArguments &args); + SmcResult SmcGetResultData(SmcArguments &args); } diff --git a/exosphere2/program/source/smc/secmon_smc_rsa.cpp b/exosphere2/program/source/smc/secmon_smc_rsa.cpp index 78c98e620..881a9ea65 100644 --- a/exosphere2/program/source/smc/secmon_smc_rsa.cpp +++ b/exosphere2/program/source/smc/secmon_smc_rsa.cpp @@ -19,12 +19,12 @@ namespace ams::secmon::smc { - SmcResult SmcModularExponentiate(const SmcArguments &args) { + SmcResult SmcModularExponentiate(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } - SmcResult SmcModularExponentiateByStorageKey(const SmcArguments &args) { + SmcResult SmcModularExponentiateByStorageKey(SmcArguments &args) { /* TODO */ return SmcResult::NotImplemented; } diff --git a/exosphere2/program/source/smc/secmon_smc_rsa.hpp b/exosphere2/program/source/smc/secmon_smc_rsa.hpp index c2dcd5cbe..cfa4301fe 100644 --- a/exosphere2/program/source/smc/secmon_smc_rsa.hpp +++ b/exosphere2/program/source/smc/secmon_smc_rsa.hpp @@ -19,7 +19,7 @@ namespace ams::secmon::smc { - SmcResult SmcModularExponentiate(const SmcArguments &args); - SmcResult SmcModularExponentiateByStorageKey(const SmcArguments &args); + SmcResult SmcModularExponentiate(SmcArguments &args); + SmcResult SmcModularExponentiateByStorageKey(SmcArguments &args); } diff --git a/libraries/libexosphere/include/exosphere/tegra/tegra_mc.hpp b/libraries/libexosphere/include/exosphere/tegra/tegra_mc.hpp index 7f309daf1..72947de8e 100644 --- a/libraries/libexosphere/include/exosphere/tegra/tegra_mc.hpp +++ b/libraries/libexosphere/include/exosphere/tegra/tegra_mc.hpp @@ -17,17 +17,186 @@ #include #include -#define MC_INTSTATUS (0x000) -#define MC_INTMASK (0x004) -#define MC_ERR_STATUS (0x008) -#define MC_ERR_ADR (0x00c) -#define MC_SMMU_CONFIG (0x010) +#define MC_INTSTATUS (0x000) +#define MC_INTMASK (0x004) +#define MC_ERR_STATUS (0x008) +#define MC_ERR_ADR (0x00C) +#define MC_SMMU_CONFIG (0x010) +#define MC_SMMU_PTB_ASID (0x01C) +#define MC_SMMU_PTB_DATA (0x020) +#define MC_SMMU_TLB_FLUSH (0x030) +#define MC_SMMU_PTC_FLUSH (0x034) +#define MC_EMEM_CFG (0x050) +#define MC_EMEM_ADR_CFG (0x054) +#define MC_EMEM_ARB_CFG (0x090) +#define MC_EMEM_ARB_OUTSTANDING_REQ (0x094) +#define MC_EMEM_ARB_TIMING_RCD (0x098) +#define MC_EMEM_ARB_TIMING_RP (0x09C) +#define MC_EMEM_ARB_TIMING_RC (0x0A0) +#define MC_EMEM_ARB_TIMING_RAS (0x0A4) +#define MC_EMEM_ARB_TIMING_FAW (0x0A8) +#define MC_EMEM_ARB_TIMING_RRD (0x0AC) +#define MC_EMEM_ARB_TIMING_RAP2PRE (0x0B0) +#define MC_EMEM_ARB_TIMING_WAP2PRE (0x0B4) +#define MC_EMEM_ARB_TIMING_R2R (0x0B8) +#define MC_EMEM_ARB_TIMING_W2W (0x0BC) +#define MC_EMEM_ARB_TIMING_R2W (0x0C0) +#define MC_EMEM_ARB_TIMING_W2R (0x0C4) +#define MC_EMEM_ARB_MISC2 (0x0C8) +#define MC_EMEM_ARB_DA_TURNS (0x0D0) +#define MC_EMEM_ARB_DA_COVERS (0x0D4) +#define MC_EMEM_ARB_MISC0 (0x0D8) +#define MC_EMEM_ARB_MISC1 (0x0DC) +#define MC_EMEM_ARB_RING1_THROTTLE (0x0E0) +#define MC_CLIENT_HOTRESET_CTRL (0x200) +#define MC_CLIENT_HOTRESET_STATUS (0x204) +#define MC_SMMU_AFI_ASID (0x238) +#define MC_SMMU_DC_ASID (0x240) +#define MC_SMMU_DCB_ASID (0x244) +#define MC_SMMU_HC_ASID (0x250) +#define MC_SMMU_HDA_ASID (0x254) +#define MC_SMMU_ISP2_ASID (0x258) +#define MC_SMMU_NVENC_ASID (0x264) +#define MC_SMMU_NV_ASID (0x268) +#define MC_SMMU_NV2_ASID (0x26C) +#define MC_SMMU_PPCS_ASID (0x270) +#define MC_SMMU_SATA_ASID (0x274) +#define MC_SMMU_VI_ASID (0x280) +#define MC_SMMU_VIC_ASID (0x284) +#define MC_SMMU_XUSB_HOST_ASID (0x288) +#define MC_SMMU_XUSB_DEV_ASID (0x28C) +#define MC_SMMU_TSEC_ASID (0x294) +#define MC_LATENCY_ALLOWANCE_AVPC_0 (0x2E4) +#define MC_LATENCY_ALLOWANCE_DC_0 (0x2E8) +#define MC_LATENCY_ALLOWANCE_DC_1 (0x2EC) +#define MC_LATENCY_ALLOWANCE_DCB_0 (0x2F4) +#define MC_LATENCY_ALLOWANCE_DCB_1 (0x2F8) +#define MC_LATENCY_ALLOWANCE_HC_0 (0x310) +#define MC_LATENCY_ALLOWANCE_HC_1 (0x314) +#define MC_LATENCY_ALLOWANCE_MPCORE_0 (0x320) +#define MC_LATENCY_ALLOWANCE_NVENC_0 (0x328) +#define MC_LATENCY_ALLOWANCE_PPCS_0 (0x344) +#define MC_LATENCY_ALLOWANCE_PPCS_1 (0x348) +#define MC_LATENCY_ALLOWANCE_ISP2_0 (0x370) +#define MC_LATENCY_ALLOWANCE_ISP2_1 (0x374) +#define MC_LATENCY_ALLOWANCE_XUSB_0 (0x37C) +#define MC_LATENCY_ALLOWANCE_XUSB_1 (0x380) +#define MC_LATENCY_ALLOWANCE_TSEC_0 (0x390) +#define MC_LATENCY_ALLOWANCE_VIC_0 (0x394) +#define MC_LATENCY_ALLOWANCE_VI2_0 (0x398) +#define MC_LATENCY_ALLOWANCE_GPU_0 (0x3AC) +#define MC_LATENCY_ALLOWANCE_SDMMCA_0 (0x3B8) +#define MC_LATENCY_ALLOWANCE_SDMMCAA_0 (0x3BC) +#define MC_LATENCY_ALLOWANCE_SDMMC_0 (0x3C0) +#define MC_LATENCY_ALLOWANCE_SDMMCAB_0 (0x3C4) +#define MC_LATENCY_ALLOWANCE_NVDEC_0 (0x3D8) +#define MC_LATENCY_ALLOWANCE_GPU2_0 (0x3E8) +#define MC_DIS_PTSA_RATE (0x41C) +#define MC_DIS_PTSA_MIN (0x420) +#define MC_DIS_PTSA_MAX (0x424) +#define MC_DISB_PTSA_RATE (0x428) +#define MC_DISB_PTSA_MIN (0x42C) +#define MC_DISB_PTSA_MAX (0x430) +#define MC_VE_PTSA_RATE (0x434) +#define MC_VE_PTSA_MIN (0x438) +#define MC_VE_PTSA_MAX (0x43C) +#define MC_MLL_MPCORER_PTSA_RATE (0x44C) +#define MC_RING1_PTSA_RATE (0x47C) +#define MC_RING1_PTSA_MIN (0x480) +#define MC_RING1_PTSA_MAX (0x484) +#define MC_PCX_PTSA_RATE (0x4AC) +#define MC_PCX_PTSA_MIN (0x4B0) +#define MC_PCX_PTSA_MAX (0x4B4) +#define MC_MSE_PTSA_RATE (0x4C4) +#define MC_MSE_PTSA_MIN (0x4C8) +#define MC_MSE_PTSA_MAX (0x4CC) +#define MC_AHB_PTSA_RATE (0x4DC) +#define MC_AHB_PTSA_MIN (0x4E0) +#define MC_AHB_PTSA_MAX (0x4E4) +#define MC_APB_PTSA_RATE (0x4E8) +#define MC_APB_PTSA_MIN (0x4EC) +#define MC_APB_PTSA_MAX (0x4F0) +#define MC_FTOP_PTSA_RATE (0x50C) +#define MC_HOST_PTSA_RATE (0x518) +#define MC_HOST_PTSA_MIN (0x51C) +#define MC_HOST_PTSA_MAX (0x520) +#define MC_USBX_PTSA_RATE (0x524) +#define MC_USBX_PTSA_MIN (0x528) +#define MC_USBX_PTSA_MAX (0x52C) +#define MC_USBD_PTSA_RATE (0x530) +#define MC_USBD_PTSA_MIN (0x534) +#define MC_USBD_PTSA_MAX (0x538) +#define MC_GK_PTSA_RATE (0x53C) +#define MC_GK_PTSA_MIN (0x540) +#define MC_GK_PTSA_MAX (0x544) +#define MC_AUD_PTSA_RATE (0x548) +#define MC_AUD_PTSA_MIN (0x54C) +#define MC_AUD_PTSA_MAX (0x550) +#define MC_VICPC_PTSA_RATE (0x554) +#define MC_VICPC_PTSA_MIN (0x558) +#define MC_VICPC_PTSA_MAX (0x55C) +#define MC_JPG_PTSA_RATE (0x584) +#define MC_JPG_PTSA_MIN (0x588) +#define MC_JPG_PTSA_MAX (0x58C) +#define MC_GK2_PTSA_RATE (0x610) +#define MC_GK2_PTSA_MIN (0x614) +#define MC_GK2_PTSA_MAX (0x618) +#define MC_SDM_PTSA_RATE (0x61C) +#define MC_SDM_PTSA_MIN (0x620) +#define MC_SDM_PTSA_MAX (0x624) +#define MC_HDAPC_PTSA_RATE (0x628) +#define MC_HDAPC_PTSA_MIN (0x62C) +#define MC_HDAPC_PTSA_MAX (0x630) +#define MC_SEC_CARVEOUT_BOM (0x670) +#define MC_SEC_CARVEOUT_SIZE_MB (0x674) +#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A (0x690) +#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB (0x694) +#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B (0x698) +#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB (0x69C) +#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C (0x6A0) +#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB (0x6A4) +#define MC_EMEM_ARB_TIMING_RFCPB (0x6C0) +#define MC_EMEM_ARB_TIMING_CCDMW (0x6C4) +#define MC_EMEM_ARB_REFPB_HP_CTRL (0x6F0) +#define MC_EMEM_ARB_REFPB_BANK_CTRL (0x6F4) +#define MC_PTSA_GRANT_DECREMENT (0x960) +#define MC_CLIENT_HOTRESET_CTRL_1 (0x970) +#define MC_CLIENT_HOTRESET_STATUS_1 (0x974) +#define MC_SMMU_PTC_FLUSH_1 (0x9B8) +#define MC_SMMU_DC1_ASID (0xA88) +#define MC_SMMU_SDMMC1A_ASID (0xA94) +#define MC_SMMU_SDMMC2A_ASID (0xA98) +#define MC_SMMU_SDMMC3A_ASID (0xA9C) +#define MC_SMMU_SDMMC4A_ASID (0xAA0) +#define MC_SMMU_ISP2B_ASID (0xAA4) +#define MC_SMMU_GPU_ASID (0xAA8) +#define MC_SMMU_GPUB_ASID (0xAAC) +#define MC_SMMU_PPCS2_ASID (0xAB0) +#define MC_SMMU_NVDEC_ASID (0xAB4) +#define MC_SMMU_APE_ASID (0xAB8) +#define MC_SMMU_SE_ASID (0xABC) +#define MC_SMMU_NVJPG_ASID (0xAC0) +#define MC_SMMU_HC1_ASID (0xAC4) +#define MC_SMMU_SE1_ASID (0xAC8) +#define MC_SMMU_AXIAP_ASID (0xACC) +#define MC_SMMU_ETR_ASID (0xAD0) +#define MC_SMMU_TSECB_ASID (0xAD4) +#define MC_SMMU_TSEC1_ASID (0xAD8) +#define MC_SMMU_TSECB1_ASID (0xADC) +#define MC_SMMU_NVDEC1_ASID (0xAE0) +#define MC_EMEM_ARB_DHYST_CTRL (0xBCC) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_0 (0xBD0) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_1 (0xBD4) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_2 (0xBD8) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_3 (0xBDC) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_4 (0xBE0) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_5 (0xBE4) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_6 (0xBE8) +#define MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_7 (0xBEC) +#define MC_ERR_GENERALIZED_CARVEOUT_STATUS (0xC00) + #define MC_SMMU_TLB_CONFIG (0x014) #define MC_SMMU_PTC_CONFIG (0x018) -#define MC_SMMU_PTB_ASID (0x01c) -#define MC_SMMU_PTB_DATA (0x020) -#define MC_SMMU_TLB_FLUSH (0x030) -#define MC_SMMU_PTC_FLUSH (0x034) #define MC_SMMU_AVPC_ASID (0x23C) #define MC_SMMU_PPCS1_ASID (0x298) @@ -145,6 +314,33 @@ #define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS3 (0xd78) #define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS4 (0xd7c) +#define MC_STAT_CONTROL (0x100) +#define MC_STAT_EMC_CLOCK_LIMIT (0x108) +#define MC_STAT_EMC_CLOCK_LIMIT_MSBS (0x10c) +#define MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_LO (0x118) +#define MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_HI (0x11c) +#define MC_STAT_EMC_FILTER_SET0_SPARE (0x124) +#define MC_STAT_EMC_FILTER_SET0_CLIENT_0 (0x128) +#define MC_STAT_EMC_FILTER_SET0_CLIENT_1 (0x12c) +#define MC_STAT_EMC_FILTER_SET0_CLIENT_2 (0x130) +#define MC_STAT_EMC_FILTER_SET0_CLIENT_3 (0x134) +#define MC_STAT_EMC_SET0_COUNT (0x138) +#define MC_STAT_EMC_SET0_COUNT_MSBS (0x13c) +#define MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_LO (0x158) +#define MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_HI (0x15c) +#define MC_STAT_EMC_FILTER_SET1_SPARE (0x164) +#define MC_STAT_EMC_FILTER_SET1_CLIENT_0 (0x168) +#define MC_STAT_EMC_FILTER_SET1_CLIENT_1 (0x16c) +#define MC_STAT_EMC_FILTER_SET1_CLIENT_2 (0x170) +#define MC_STAT_EMC_FILTER_SET1_CLIENT_3 (0x174) +#define MC_STAT_EMC_SET1_COUNT (0x178) +#define MC_STAT_EMC_SET1_COUNT_MSBS (0x17c) +#define MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_UPPER (0xa20) +#define MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_UPPER (0xa24) +#define MC_STAT_EMC_FILTER_SET0_CLIENT_4 (0xb88) +#define MC_STAT_EMC_FILTER_SET1_CLIENT_4 (0xb8c) +#define MC_STAT_EMC_FILTER_SET0_CLIENT_5 (0xbc4) +#define MC_STAT_EMC_FILTER_SET1_CLIENT_5 (0xbc8) #define MC_REG_BITS_MASK(NAME) REG_NAMED_BITS_MASK (MC, NAME) #define MC_REG_BITS_VALUE(NAME, VALUE) REG_NAMED_BITS_VALUE (MC, NAME, VALUE) diff --git a/libraries/libexosphere/include/exosphere/tegra/tegra_pmc.hpp b/libraries/libexosphere/include/exosphere/tegra/tegra_pmc.hpp index 27a809567..3f1d90eda 100644 --- a/libraries/libexosphere/include/exosphere/tegra/tegra_pmc.hpp +++ b/libraries/libexosphere/include/exosphere/tegra/tegra_pmc.hpp @@ -17,72 +17,95 @@ #include #include -#define APBDEV_PMC_CNTRL (0x000) -#define APBDEV_PMC_DPD_SAMPLE (0x020) -#define APBDEV_PMC_DPD_ENABLE (0x024) -#define APBDEV_PMC_CLAMP_STATUS (0x02C) -#define APBDEV_PMC_PWRGATE_TOGGLE (0x030) -#define APBDEV_PMC_PWRGATE_STATUS (0x038) -#define APBDEV_PMC_SCRATCH0 (0x050) -#define APBDEV_PMC_SCRATCH1 (0x054) -#define APBDEV_PMC_SCRATCH12 (0x080) -#define APBDEV_PMC_SCRATCH13 (0x084) -#define APBDEV_PMC_SCRATCH18 (0x098) -#define APBDEV_PMC_SCRATCH20 (0x0A0) -#define APBDEV_PMC_CRYPTO_OP (0x0F4) -#define APBDEV_PM (0x014) -#define APBDEV_PMC_WAKE2_STATUS (0x168) -#define APBDEV_PMC_WEAK_BIAS (0x2C8) -#define APBDEV_PMC_CNTRL2 (0x440) -#define APBDEV_PMC_FUSE_CTRL (0x450) -#define APBDEV_PMC_IO_DPD3_REQ (0x45C) -#define APBDEV_PMC_IO_DPD3_STATUS (0x460) -#define APBDEV_PMC_IO_DPD4_REQ (0x464) -#define APBDEV_PMC_IO_DPD4_STATUS (0x468) -#define APBDEV_PMC_SET_SW_CLAMP (0x47C) -#define APBDEV_PMC_DDR_CNTRL (0x4E4) -#define APBDEV_PMC_SEC_DISABLE (0x004) -#define APBDEV_PMC_SEC_DISABLE2 (0x2C4) -#define APBDEV_PMC_SEC_DISABLE3 (0x2D8) -#define APBDEV_PMC_SEC_DISABLE4 (0x5B0) -#define APBDEV_PMC_SEC_DISABLE5 (0x5B4) -#define APBDEV_PMC_SEC_DISABLE6 (0x5B8) -#define APBDEV_PMC_SEC_DISABLE7 (0x5BC) -#define APBDEV_PMC_SEC_DISABLE8 (0x5C0) -#define APBDEV_PMC_SCRATCH43 (0x22C) -#define APBDEV_PMC_SCRATCH190 (0x818) -#define APBDEV_PMC_SCRATCH200 (0x840) -#define APBDEV_PMC_SEC_DISABLE3 (0x2D8) -#define APBDEV_PMC_SECURE_SCRATCH4 (0x0C0) -#define APBDEV_PMC_SECURE_SCRATCH5 (0x0C4) -#define APBDEV_PMC_SECURE_SCRATCH6 (0x224) -#define APBDEV_PMC_SECURE_SCRATCH7 (0x228) -#define APBDEV_PMC_SECURE_SCRATCH16 (0x320) -#define APBDEV_PMC_SECURE_SCRATCH21 (0x334) -#define APBDEV_PMC_SECURE_SCRATCH24 (0x340) -#define APBDEV_PMC_SECURE_SCRATCH25 (0x344) -#define APBDEV_PMC_SECURE_SCRATCH26 (0x348) -#define APBDEV_PMC_SECURE_SCRATCH27 (0x34C) -#define APBDEV_PMC_SECURE_SCRATCH32 (0x360) -#define APBDEV_PMC_SECURE_SCRATCH34 (0x368) -#define APBDEV_PMC_SECURE_SCRATCH35 (0x36C) -#define APBDEV_PMC_SECURE_SCRATCH39 (0x37C) -#define APBDEV_PMC_SECURE_SCRATCH51 (0x3AC) -#define APBDEV_PMC_SECURE_SCRATCH55 (0x3BC) -#define APBDEV_PMC_SECURE_SCRATCH74 (0x408) -#define APBDEV_PMC_SECURE_SCRATCH75 (0x40C) -#define APBDEV_PMC_SECURE_SCRATCH76 (0x410) -#define APBDEV_PMC_SECURE_SCRATCH77 (0x414) -#define APBDEV_PMC_SECURE_SCRATCH78 (0x418) -#define APBDEV_PMC_SECURE_SCRATCH99 (0xAE4) -#define APBDEV_PMC_SECURE_SCRATCH100 (0xAE8) -#define APBDEV_PMC_SECURE_SCRATCH101 (0xAEC) -#define APBDEV_PMC_SECURE_SCRATCH102 (0xAF0) -#define APBDEV_PMC_SECURE_SCRATCH103 (0xAF4) -#define APBDEV_PMC_SECURE_SCRATCH112 (0xB18) -#define APBDEV_PMC_SECURE_SCRATCH113 (0xB1C) -#define APBDEV_PMC_SECURE_SCRATCH114 (0xB20) -#define APBDEV_PMC_SECURE_SCRATCH115 (0xB24) +#define APBDEV_PMC_CNTRL (0x000) +#define APBDEV_PMC_WAKE_MASK (0x00C) +#define APBDEV_PMC_WAKE_LVL (0x010) +#define APBDEV_PMC_WAKE_STATUS (0x014) +#define APBDEV_PMC_DPD_PADS_ORIDE (0x01C) +#define APBDEV_PMC_DPD_SAMPLE (0x020) +#define APBDEV_PMC_DPD_ENABLE (0x024) +#define APBDEV_PMC_CLAMP_STATUS (0x02C) +#define APBDEV_PMC_PWRGATE_TOGGLE (0x030) +#define APBDEV_PMC_REMOVE_CLAMPING_CMD (0x034) +#define APBDEV_PMC_PWRGATE_STATUS (0x038) +#define APBDEV_PMC_PWRGOOD_TIMER (0x03C) +#define APBDEV_PMC_BLINK_TIMER (0x040) +#define APBDEV_PMC_NO_IOPOWER (0x044) +#define APBDEV_PMC_PWR_DET (0x048) +#define APBDEV_PMC_SCRATCH0 (0x050) +#define APBDEV_PMC_SCRATCH1 (0x054) +#define APBDEV_PMC_SCRATCH12 (0x080) +#define APBDEV_PMC_SCRATCH13 (0x084) +#define APBDEV_PMC_SCRATCH18 (0x098) +#define APBDEV_PMC_SCRATCH20 (0x0A0) +#define APBDEV_PMC_AUTO_WAKE_LVL_MASK (0x0DC) +#define APBDEV_PMC_WAKE_DELAY (0x0E0) +#define APBDEV_PMC_PWR_DET_VAL (0x0E4) +#define APBDEV_PMC_CRYPTO_OP (0x0F4) +#define APBDEV_PMC_WAKE2_MASK (0x160) +#define APBDEV_PMC_WAKE2_LVL (0x164) +#define APBDEV_PMC_WAKE2_STATUS (0x168) +#define APBDEV_PMC_AUTO_WAKE2_LVL_MASK (0x170) +#define APBDEV_PMC_CLK_OUT_CNTRL (0x1A8) +#define APBDEV_PMC_IO_DPD_REQ (0x1B8) +#define APBDEV_PMC_IO_DPD_STATUS (0x1BC) +#define APBDEV_PMC_IO_DPD2_REQ (0x1C0) +#define APBDEV_PMC_IO_DPD2_STATUS (0x1C4) +#define APBDEV_PMC_SEL_DPD_TIM (0x1C8) +#define APBDEV_PMC_TSC_MULT (0x2B4) +#define APBDEV_PMC_WEAK_BIAS (0x2C8) +#define APBDEV_PMC_GPU_RG_CNTRL (0x2D4) +#define APBDEV_PMC_CNTRL2 (0x440) +#define APBDEV_PMC_FUSE_CTRL (0x450) +#define APBDEV_PMC_IO_DPD3_REQ (0x45C) +#define APBDEV_PMC_IO_DPD3_STATUS (0x460) +#define APBDEV_PMC_IO_DPD4_REQ (0x464) +#define APBDEV_PMC_IO_DPD4_STATUS (0x468) +#define APBDEV_PMC_SET_SW_CLAMP (0x47C) +#define APBDEV_PMC_WAKE_DEBOUNCE_EN (0x4D8) +#define APBDEV_PMC_DDR_CNTRL (0x4E4) +#define APBDEV_PMC_SEC_DISABLE (0x004) +#define APBDEV_PMC_SEC_DISABLE2 (0x2C4) +#define APBDEV_PMC_SEC_DISABLE3 (0x2D8) +#define APBDEV_PMC_SEC_DISABLE4 (0x5B0) +#define APBDEV_PMC_SEC_DISABLE5 (0x5B4) +#define APBDEV_PMC_SEC_DISABLE6 (0x5B8) +#define APBDEV_PMC_SEC_DISABLE7 (0x5BC) +#define APBDEV_PMC_SEC_DISABLE8 (0x5C0) +#define APBDEV_PMC_SCRATCH43 (0x22C) +#define APBDEV_PMC_SCRATCH190 (0x818) +#define APBDEV_PMC_SCRATCH200 (0x840) +#define APBDEV_PMC_SEC_DISABLE3 (0x2D8) +#define APBDEV_PMC_SECURE_SCRATCH4 (0x0C0) +#define APBDEV_PMC_SECURE_SCRATCH5 (0x0C4) +#define APBDEV_PMC_SECURE_SCRATCH6 (0x224) +#define APBDEV_PMC_SECURE_SCRATCH7 (0x228) +#define APBDEV_PMC_SECURE_SCRATCH16 (0x320) +#define APBDEV_PMC_SECURE_SCRATCH21 (0x334) +#define APBDEV_PMC_SECURE_SCRATCH24 (0x340) +#define APBDEV_PMC_SECURE_SCRATCH25 (0x344) +#define APBDEV_PMC_SECURE_SCRATCH26 (0x348) +#define APBDEV_PMC_SECURE_SCRATCH27 (0x34C) +#define APBDEV_PMC_SECURE_SCRATCH32 (0x360) +#define APBDEV_PMC_SECURE_SCRATCH34 (0x368) +#define APBDEV_PMC_SECURE_SCRATCH35 (0x36C) +#define APBDEV_PMC_SECURE_SCRATCH39 (0x37C) +#define APBDEV_PMC_SECURE_SCRATCH51 (0x3AC) +#define APBDEV_PMC_SECURE_SCRATCH55 (0x3BC) +#define APBDEV_PMC_SECURE_SCRATCH74 (0x408) +#define APBDEV_PMC_SECURE_SCRATCH75 (0x40C) +#define APBDEV_PMC_SECURE_SCRATCH76 (0x410) +#define APBDEV_PMC_SECURE_SCRATCH77 (0x414) +#define APBDEV_PMC_SECURE_SCRATCH78 (0x418) +#define APBDEV_PMC_SECURE_SCRATCH99 (0xAE4) +#define APBDEV_PMC_SECURE_SCRATCH100 (0xAE8) +#define APBDEV_PMC_SECURE_SCRATCH101 (0xAEC) +#define APBDEV_PMC_SECURE_SCRATCH102 (0xAF0) +#define APBDEV_PMC_SECURE_SCRATCH103 (0xAF4) +#define APBDEV_PMC_SECURE_SCRATCH112 (0xB18) +#define APBDEV_PMC_SECURE_SCRATCH113 (0xB1C) +#define APBDEV_PMC_SECURE_SCRATCH114 (0xB20) +#define APBDEV_PMC_SECURE_SCRATCH115 (0xB24) #define PMC_REG_BITS_MASK(NAME) REG_NAMED_BITS_MASK (APBDEV_PMC, NAME)