mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2025-02-22 17:21:40 +00:00
util: move T(V)SNPrintf from kernel to util
This commit is contained in:
parent
2c7f32bbde
commit
631de13133
15 changed files with 464 additions and 986 deletions
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define EVP_COP_RESET_VECTOR 0x200
|
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define FLOW_CTLR_HALT_COP_EVENTS 0x004
|
|
||||||
#define FLOW_CTLR_CC4_HVC_CONTROL 0x060
|
|
||||||
#define FLOW_CTLR_CC4_RETENTION_CONTROL 0x064
|
|
||||||
#define FLOW_CTLR_CC4_HVC_RETRY 0x08C
|
|
|
@ -14,7 +14,6 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include <mesosphere.hpp>
|
#include <mesosphere.hpp>
|
||||||
#include "kern_mc_registers.hpp"
|
|
||||||
|
|
||||||
#if defined(MESOSPHERE_BUILD_FOR_DEBUGGING) || defined(MESOSPHERE_BUILD_FOR_AUDITING)
|
#if defined(MESOSPHERE_BUILD_FOR_DEBUGGING) || defined(MESOSPHERE_BUILD_FOR_AUDITING)
|
||||||
#define MESOSPHERE_ENABLE_MEMORY_CONTROLLER_INTERRUPT
|
#define MESOSPHERE_ENABLE_MEMORY_CONTROLLER_INTERRUPT
|
||||||
|
|
|
@ -78,13 +78,11 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
|
|
||||||
void WaitOtherCpuPowerOff() {
|
void WaitOtherCpuPowerOff() {
|
||||||
constexpr u64 PmcPhysicalAddress = 0x7000E400;
|
constexpr u64 PmcPhysicalAddress = 0x7000E400;
|
||||||
constexpr u64 APBDEV_PMC_PWRGATE_STATUS = PmcPhysicalAddress + 0x38;
|
|
||||||
|
|
||||||
constexpr u32 PWRGATE_STATUS_CE123_MASK = ((1u << 3) - 1) << 9;
|
constexpr u32 PWRGATE_STATUS_CE123_MASK = ((1u << 3) - 1) << 9;
|
||||||
|
|
||||||
u32 value;
|
u32 value;
|
||||||
do {
|
do {
|
||||||
bool res = smc::ReadWriteRegister(std::addressof(value), APBDEV_PMC_PWRGATE_STATUS, 0, 0);
|
bool res = smc::ReadWriteRegister(std::addressof(value), PmcPhysicalAddress + APBDEV_PMC_PWRGATE_STATUS, 0, 0);
|
||||||
MESOSPHERE_ASSERT(res);
|
MESOSPHERE_ASSERT(res);
|
||||||
} while ((value & PWRGATE_STATUS_CE123_MASK) != 0);
|
} while ((value & PWRGATE_STATUS_CE123_MASK) != 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,7 @@
|
||||||
|
|
||||||
#include "kern_bpmp_api.hpp"
|
#include "kern_bpmp_api.hpp"
|
||||||
#include "kern_atomics_registers.hpp"
|
#include "kern_atomics_registers.hpp"
|
||||||
#include "kern_clkrst_registers.hpp"
|
|
||||||
#include "kern_evp_registers.hpp"
|
|
||||||
#include "kern_flow_registers.hpp"
|
|
||||||
#include "kern_ictlr_registers.hpp"
|
#include "kern_ictlr_registers.hpp"
|
||||||
#include "kern_pmc_registers.hpp"
|
|
||||||
#include "kern_sema_registers.hpp"
|
#include "kern_sema_registers.hpp"
|
||||||
|
|
||||||
namespace ams::kern::board::nintendo::nx::lps {
|
namespace ams::kern::board::nintendo::nx::lps {
|
||||||
|
|
|
@ -1,526 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define MC_INTSTATUS 0x0
|
|
||||||
#define MC_INTMASK 0x4
|
|
||||||
#define MC_ERR_STATUS 0x8
|
|
||||||
#define MC_ERR_ADR 0xc
|
|
||||||
#define MC_SMMU_CONFIG 0x10
|
|
||||||
#define MC_SMMU_TLB_CONFIG 0x14
|
|
||||||
#define MC_SMMU_PTC_CONFIG 0x18
|
|
||||||
#define MC_SMMU_PTB_ASID 0x1c
|
|
||||||
#define MC_SMMU_PTB_DATA 0x20
|
|
||||||
#define MC_SMMU_TLB_FLUSH 0x30
|
|
||||||
#define MC_SMMU_PTC_FLUSH_0 0x34
|
|
||||||
#define MC_SMMU_PTC_FLUSH_1 0x9b8
|
|
||||||
#define MC_SMMU_ASID_SECURITY 0x38
|
|
||||||
#define MC_SMMU_ASID_SECURITY_1 0x3c
|
|
||||||
#define MC_SMMU_ASID_SECURITY_2 0x9e0
|
|
||||||
#define MC_SMMU_ASID_SECURITY_3 0x9e4
|
|
||||||
#define MC_SMMU_ASID_SECURITY_4 0x9e8
|
|
||||||
#define MC_SMMU_ASID_SECURITY_5 0x9ec
|
|
||||||
#define MC_SMMU_ASID_SECURITY_6 0x9f0
|
|
||||||
#define MC_SMMU_ASID_SECURITY_7 0x9f4
|
|
||||||
#define MC_SMMU_AFI_ASID 0x238
|
|
||||||
#define MC_SMMU_AVPC_ASID 0x23c
|
|
||||||
#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_MSENC_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_VDE_ASID 0x27c
|
|
||||||
#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_SMMU_PPCS1_ASID 0x298
|
|
||||||
#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_SMMU_TRANSLATION_ENABLE_0 0x228
|
|
||||||
#define MC_SMMU_TRANSLATION_ENABLE_1 0x22c
|
|
||||||
#define MC_SMMU_TRANSLATION_ENABLE_2 0x230
|
|
||||||
#define MC_SMMU_TRANSLATION_ENABLE_3 0x234
|
|
||||||
#define MC_SMMU_TRANSLATION_ENABLE_4 0xb98
|
|
||||||
#define MC_PCFIFO_CLIENT_CONFIG0 0xdd0
|
|
||||||
#define MC_PCFIFO_CLIENT_CONFIG1 0xdd4
|
|
||||||
#define MC_PCFIFO_CLIENT_CONFIG2 0xdd8
|
|
||||||
#define MC_PCFIFO_CLIENT_CONFIG3 0xddc
|
|
||||||
#define MC_PCFIFO_CLIENT_CONFIG4 0xde0
|
|
||||||
#define MC_EMEM_CFG 0x50
|
|
||||||
#define MC_EMEM_ADR_CFG 0x54
|
|
||||||
#define MC_EMEM_ADR_CFG_DEV0 0x58
|
|
||||||
#define MC_EMEM_ADR_CFG_DEV1 0x5c
|
|
||||||
#define MC_EMEM_ADR_CFG_CHANNEL_MASK 0x60
|
|
||||||
#define MC_EMEM_ADR_CFG_BANK_MASK_0 0x64
|
|
||||||
#define MC_EMEM_ADR_CFG_BANK_MASK_1 0x68
|
|
||||||
#define MC_EMEM_ADR_CFG_BANK_MASK_2 0x6c
|
|
||||||
#define MC_SECURITY_CFG0 0x70
|
|
||||||
#define MC_SECURITY_CFG1 0x74
|
|
||||||
#define MC_SECURITY_CFG3 0x9bc
|
|
||||||
#define MC_SECURITY_RSV 0x7c
|
|
||||||
#define MC_EMEM_ARB_CFG 0x90
|
|
||||||
#define MC_EMEM_ARB_OUTSTANDING_REQ 0x94
|
|
||||||
#define MC_EMEM_ARB_TIMING_RCD 0x98
|
|
||||||
#define MC_EMEM_ARB_TIMING_RP 0x9c
|
|
||||||
#define MC_EMEM_ARB_TIMING_RC 0xa0
|
|
||||||
#define MC_EMEM_ARB_TIMING_RAS 0xa4
|
|
||||||
#define MC_EMEM_ARB_TIMING_FAW 0xa8
|
|
||||||
#define MC_EMEM_ARB_TIMING_RRD 0xac
|
|
||||||
#define MC_EMEM_ARB_TIMING_RAP2PRE 0xb0
|
|
||||||
#define MC_EMEM_ARB_TIMING_WAP2PRE 0xb4
|
|
||||||
#define MC_EMEM_ARB_TIMING_R2R 0xb8
|
|
||||||
#define MC_EMEM_ARB_TIMING_W2W 0xbc
|
|
||||||
#define MC_EMEM_ARB_TIMING_R2W 0xc0
|
|
||||||
#define MC_EMEM_ARB_TIMING_W2R 0xc4
|
|
||||||
#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_EMEM_ARB_DA_TURNS 0xd0
|
|
||||||
#define MC_EMEM_ARB_DA_COVERS 0xd4
|
|
||||||
#define MC_EMEM_ARB_MISC0 0xd8
|
|
||||||
#define MC_EMEM_ARB_MISC1 0xdc
|
|
||||||
#define MC_EMEM_ARB_MISC2 0xc8
|
|
||||||
#define MC_EMEM_ARB_RING1_THROTTLE 0xe0
|
|
||||||
#define MC_EMEM_ARB_RING3_THROTTLE 0xe4
|
|
||||||
#define MC_EMEM_ARB_NISO_THROTTLE 0x6b0
|
|
||||||
#define MC_EMEM_ARB_OVERRIDE 0xe8
|
|
||||||
#define MC_EMEM_ARB_RSV 0xec
|
|
||||||
#define MC_CLKEN_OVERRIDE 0xf4
|
|
||||||
#define MC_TIMING_CONTROL_DBG 0xf8
|
|
||||||
#define MC_TIMING_CONTROL 0xfc
|
|
||||||
#define MC_STAT_CONTROL 0x100
|
|
||||||
#define MC_STAT_STATUS 0x104
|
|
||||||
#define MC_STAT_EMC_CLOCK_LIMIT 0x108
|
|
||||||
#define MC_STAT_EMC_CLOCK_LIMIT_MSBS 0x10c
|
|
||||||
#define MC_STAT_EMC_CLOCKS 0x110
|
|
||||||
#define MC_STAT_EMC_CLOCKS_MSBS 0x114
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_LO 0x118
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_LO 0x158
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_HI 0x11c
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_HI 0x15c
|
|
||||||
#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_VIRTUAL_ADR_LIMIT_LO 0x198
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_VIRTUAL_ADR_LIMIT_LO 0x1a8
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_VIRTUAL_ADR_LIMIT_HI 0x19c
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_VIRTUAL_ADR_LIMIT_HI 0x1ac
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_VIRTUAL_ADR_LIMIT_UPPER 0xa28
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_VIRTUAL_ADR_LIMIT_UPPER 0xa2c
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_ASID 0x1a0
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_ASID 0x1b0
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_SLACK_LIMIT 0x120
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_SLACK_LIMIT 0x160
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_CLIENT_0 0x128
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_CLIENT_0 0x168
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_CLIENT_1 0x12c
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_CLIENT_1 0x16c
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_CLIENT_2 0x130
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_CLIENT_2 0x170
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_CLIENT_3 0x134
|
|
||||||
#define MC_STAT_EMC_FILTER_SET0_CLIENT_4 0xb88
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_CLIENT_3 0x174
|
|
||||||
#define MC_STAT_EMC_FILTER_SET1_CLIENT_4 0xb8c
|
|
||||||
#define MC_STAT_EMC_SET0_COUNT 0x138
|
|
||||||
#define MC_STAT_EMC_SET0_COUNT_MSBS 0x13c
|
|
||||||
#define MC_STAT_EMC_SET1_COUNT 0x178
|
|
||||||
#define MC_STAT_EMC_SET1_COUNT_MSBS 0x17c
|
|
||||||
#define MC_STAT_EMC_SET0_SLACK_ACCUM 0x140
|
|
||||||
#define MC_STAT_EMC_SET0_SLACK_ACCUM_MSBS 0x144
|
|
||||||
#define MC_STAT_EMC_SET1_SLACK_ACCUM 0x180
|
|
||||||
#define MC_STAT_EMC_SET1_SLACK_ACCUM_MSBS 0x184
|
|
||||||
#define MC_STAT_EMC_SET0_HISTO_COUNT 0x148
|
|
||||||
#define MC_STAT_EMC_SET0_HISTO_COUNT_MSBS 0x14c
|
|
||||||
#define MC_STAT_EMC_SET1_HISTO_COUNT 0x188
|
|
||||||
#define MC_STAT_EMC_SET1_HISTO_COUNT_MSBS 0x18c
|
|
||||||
#define MC_STAT_EMC_SET0_MINIMUM_SLACK_OBSERVED 0x150
|
|
||||||
#define MC_STAT_EMC_SET1_MINIMUM_SLACK_OBSERVED 0x190
|
|
||||||
#define MC_STAT_EMC_SET0_IDLE_CYCLE_COUNT 0x1b8
|
|
||||||
#define MC_STAT_EMC_SET0_IDLE_CYCL_COUNT_MSBS 0x1bc
|
|
||||||
#define MC_STAT_EMC_SET1_IDLE_CYCLE_COUNT 0x1c8
|
|
||||||
#define MC_STAT_EMC_SET1_IDLE_CYCL_COUNT_MSBS 0x1cc
|
|
||||||
#define MC_STAT_EMC_SET0_IDLE_CYCLE_PARTITION_SELECT 0x1c0
|
|
||||||
#define MC_STAT_EMC_SET1_IDLE_CYCLE_PARTITION_SELECT 0x1d0
|
|
||||||
#define MC_CLIENT_HOTRESET_CTRL 0x200
|
|
||||||
#define MC_CLIENT_HOTRESET_CTRL_1 0x970
|
|
||||||
#define MC_CLIENT_HOTRESET_STATUS 0x204
|
|
||||||
#define MC_CLIENT_HOTRESET_STATUS_1 0x974
|
|
||||||
#define MC_EMEM_ARB_ISOCHRONOUS_0 0x208
|
|
||||||
#define MC_EMEM_ARB_ISOCHRONOUS_1 0x20c
|
|
||||||
#define MC_EMEM_ARB_ISOCHRONOUS_2 0x210
|
|
||||||
#define MC_EMEM_ARB_ISOCHRONOUS_3 0x214
|
|
||||||
#define MC_EMEM_ARB_ISOCHRONOUS_4 0xb94
|
|
||||||
#define MC_EMEM_ARB_HYSTERESIS_0 0x218
|
|
||||||
#define MC_EMEM_ARB_HYSTERESIS_1 0x21c
|
|
||||||
#define MC_EMEM_ARB_HYSTERESIS_2 0x220
|
|
||||||
#define MC_EMEM_ARB_HYSTERESIS_3 0x224
|
|
||||||
#define MC_EMEM_ARB_HYSTERESIS_4 0xb84
|
|
||||||
#define MC_EMEM_ARB_DHYSTERESIS_0 0xbb0
|
|
||||||
#define MC_EMEM_ARB_DHYSTERESIS_1 0xbb4
|
|
||||||
#define MC_EMEM_ARB_DHYSTERESIS_2 0xbb8
|
|
||||||
#define MC_EMEM_ARB_DHYSTERESIS_3 0xbbc
|
|
||||||
#define MC_EMEM_ARB_DHYSTERESIS_4 0xbc0
|
|
||||||
#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_RESERVED_RSV 0x3fc
|
|
||||||
#define MC_DISB_EXTRA_SNAP_LEVELS 0x408
|
|
||||||
#define MC_APB_EXTRA_SNAP_LEVELS 0x2a4
|
|
||||||
#define MC_AHB_EXTRA_SNAP_LEVELS 0x2a0
|
|
||||||
#define MC_USBD_EXTRA_SNAP_LEVELS 0xa18
|
|
||||||
#define MC_ISP_EXTRA_SNAP_LEVELS 0xa08
|
|
||||||
#define MC_AUD_EXTRA_SNAP_LEVELS 0xa10
|
|
||||||
#define MC_MSE_EXTRA_SNAP_LEVELS 0x40c
|
|
||||||
#define MC_GK2_EXTRA_SNAP_LEVELS 0xa40
|
|
||||||
#define MC_A9AVPPC_EXTRA_SNAP_LEVELS 0x414
|
|
||||||
#define MC_FTOP_EXTRA_SNAP_LEVELS 0x2bc
|
|
||||||
#define MC_JPG_EXTRA_SNAP_LEVELS 0xa3c
|
|
||||||
#define MC_HOST_EXTRA_SNAP_LEVELS 0xa14
|
|
||||||
#define MC_SAX_EXTRA_SNAP_LEVELS 0x2c0
|
|
||||||
#define MC_DIS_EXTRA_SNAP_LEVELS 0x2ac
|
|
||||||
#define MC_VICPC_EXTRA_SNAP_LEVELS 0xa1c
|
|
||||||
#define MC_HDAPC_EXTRA_SNAP_LEVELS 0xa48
|
|
||||||
#define MC_AVP_EXTRA_SNAP_LEVELS 0x2a8
|
|
||||||
#define MC_USBX_EXTRA_SNAP_LEVELS 0x404
|
|
||||||
#define MC_PCX_EXTRA_SNAP_LEVELS 0x2b8
|
|
||||||
#define MC_SD_EXTRA_SNAP_LEVELS 0xa04
|
|
||||||
#define MC_DFD_EXTRA_SNAP_LEVELS 0xa4c
|
|
||||||
#define MC_VE_EXTRA_SNAP_LEVELS 0x2d8
|
|
||||||
#define MC_GK_EXTRA_SNAP_LEVELS 0xa00
|
|
||||||
#define MC_VE2_EXTRA_SNAP_LEVELS 0x410
|
|
||||||
#define MC_SDM_EXTRA_SNAP_LEVELS 0xa44
|
|
||||||
#define MC_VIDEO_PROTECT_BOM 0x648
|
|
||||||
#define MC_VIDEO_PROTECT_SIZE_MB 0x64c
|
|
||||||
#define MC_VIDEO_PROTECT_BOM_ADR_HI 0x978
|
|
||||||
#define MC_VIDEO_PROTECT_REG_CTRL 0x650
|
|
||||||
#define MC_ERR_VPR_STATUS 0x654
|
|
||||||
#define MC_ERR_VPR_ADR 0x658
|
|
||||||
#define MC_VIDEO_PROTECT_VPR_OVERRIDE 0x418
|
|
||||||
#define MC_VIDEO_PROTECT_VPR_OVERRIDE1 0x590
|
|
||||||
#define MC_IRAM_BOM 0x65c
|
|
||||||
#define MC_IRAM_TOM 0x660
|
|
||||||
#define MC_IRAM_ADR_HI 0x980
|
|
||||||
#define MC_IRAM_REG_CTRL 0x964
|
|
||||||
#define MC_EMEM_CFG_ACCESS_CTRL 0x664
|
|
||||||
#define MC_TZ_SECURITY_CTRL 0x668
|
|
||||||
#define MC_EMEM_ARB_OUTSTANDING_REQ_RING3 0x66c
|
|
||||||
#define MC_EMEM_ARB_OUTSTANDING_REQ_NISO 0x6b4
|
|
||||||
#define MC_EMEM_ARB_RING0_THROTTLE_MASK 0x6bc
|
|
||||||
#define MC_EMEM_ARB_NISO_THROTTLE_MASK 0x6b8
|
|
||||||
#define MC_EMEM_ARB_NISO_THROTTLE_MASK_1 0xb80
|
|
||||||
#define MC_SEC_CARVEOUT_BOM 0x670
|
|
||||||
#define MC_SEC_CARVEOUT_SIZE_MB 0x674
|
|
||||||
#define MC_SEC_CARVEOUT_ADR_HI 0x9d4
|
|
||||||
#define MC_SEC_CARVEOUT_REG_CTRL 0x678
|
|
||||||
#define MC_ERR_SEC_STATUS 0x67c
|
|
||||||
#define MC_ERR_SEC_ADR 0x680
|
|
||||||
#define MC_PC_IDLE_CLOCK_GATE_CONFIG 0x684
|
|
||||||
#define MC_STUTTER_CONTROL 0x688
|
|
||||||
#define MC_RESERVED_RSV_1 0x958
|
|
||||||
#define MC_DVFS_PIPE_SELECT 0x95c
|
|
||||||
#define MC_AHB_PTSA_MIN 0x4e0
|
|
||||||
#define MC_AUD_PTSA_MIN 0x54c
|
|
||||||
#define MC_MLL_MPCORER_PTSA_RATE 0x44c
|
|
||||||
#define MC_RING2_PTSA_RATE 0x440
|
|
||||||
#define MC_USBD_PTSA_RATE 0x530
|
|
||||||
#define MC_USBX_PTSA_MIN 0x528
|
|
||||||
#define MC_USBD_PTSA_MIN 0x534
|
|
||||||
#define MC_APB_PTSA_MAX 0x4f0
|
|
||||||
#define MC_JPG_PTSA_RATE 0x584
|
|
||||||
#define MC_DIS_PTSA_MIN 0x420
|
|
||||||
#define MC_AVP_PTSA_MAX 0x4fc
|
|
||||||
#define MC_AVP_PTSA_RATE 0x4f4
|
|
||||||
#define MC_RING1_PTSA_MIN 0x480
|
|
||||||
#define MC_DIS_PTSA_MAX 0x424
|
|
||||||
#define MC_SD_PTSA_MAX 0x4d8
|
|
||||||
#define MC_MSE_PTSA_RATE 0x4c4
|
|
||||||
#define MC_VICPC_PTSA_MIN 0x558
|
|
||||||
#define MC_PCX_PTSA_MAX 0x4b4
|
|
||||||
#define MC_ISP_PTSA_RATE 0x4a0
|
|
||||||
#define MC_A9AVPPC_PTSA_MIN 0x48c
|
|
||||||
#define MC_RING2_PTSA_MAX 0x448
|
|
||||||
#define MC_AUD_PTSA_RATE 0x548
|
|
||||||
#define MC_HOST_PTSA_MIN 0x51c
|
|
||||||
#define MC_MLL_MPCORER_PTSA_MAX 0x454
|
|
||||||
#define MC_SD_PTSA_MIN 0x4d4
|
|
||||||
#define MC_RING1_PTSA_RATE 0x47c
|
|
||||||
#define MC_JPG_PTSA_MIN 0x588
|
|
||||||
#define MC_HDAPC_PTSA_MIN 0x62c
|
|
||||||
#define MC_AVP_PTSA_MIN 0x4f8
|
|
||||||
#define MC_JPG_PTSA_MAX 0x58c
|
|
||||||
#define MC_VE_PTSA_MAX 0x43c
|
|
||||||
#define MC_DFD_PTSA_MAX 0x63c
|
|
||||||
#define MC_VICPC_PTSA_RATE 0x554
|
|
||||||
#define MC_GK_PTSA_MAX 0x544
|
|
||||||
#define MC_VICPC_PTSA_MAX 0x55c
|
|
||||||
#define MC_SDM_PTSA_MAX 0x624
|
|
||||||
#define MC_SAX_PTSA_RATE 0x4b8
|
|
||||||
#define MC_PCX_PTSA_MIN 0x4b0
|
|
||||||
#define MC_APB_PTSA_MIN 0x4ec
|
|
||||||
#define MC_GK2_PTSA_MIN 0x614
|
|
||||||
#define MC_PCX_PTSA_RATE 0x4ac
|
|
||||||
#define MC_RING1_PTSA_MAX 0x484
|
|
||||||
#define MC_HDAPC_PTSA_RATE 0x628
|
|
||||||
#define MC_MLL_MPCORER_PTSA_MIN 0x450
|
|
||||||
#define MC_GK2_PTSA_MAX 0x618
|
|
||||||
#define MC_AUD_PTSA_MAX 0x550
|
|
||||||
#define MC_GK2_PTSA_RATE 0x610
|
|
||||||
#define MC_ISP_PTSA_MAX 0x4a8
|
|
||||||
#define MC_DISB_PTSA_RATE 0x428
|
|
||||||
#define MC_VE2_PTSA_MAX 0x49c
|
|
||||||
#define MC_DFD_PTSA_MIN 0x638
|
|
||||||
#define MC_FTOP_PTSA_RATE 0x50c
|
|
||||||
#define MC_A9AVPPC_PTSA_RATE 0x488
|
|
||||||
#define MC_VE2_PTSA_MIN 0x498
|
|
||||||
#define MC_USBX_PTSA_MAX 0x52c
|
|
||||||
#define MC_DIS_PTSA_RATE 0x41c
|
|
||||||
#define MC_USBD_PTSA_MAX 0x538
|
|
||||||
#define MC_A9AVPPC_PTSA_MAX 0x490
|
|
||||||
#define MC_USBX_PTSA_RATE 0x524
|
|
||||||
#define MC_FTOP_PTSA_MAX 0x514
|
|
||||||
#define MC_HDAPC_PTSA_MAX 0x630
|
|
||||||
#define MC_SD_PTSA_RATE 0x4d0
|
|
||||||
#define MC_DFD_PTSA_RATE 0x634
|
|
||||||
#define MC_FTOP_PTSA_MIN 0x510
|
|
||||||
#define MC_SDM_PTSA_RATE 0x61c
|
|
||||||
#define MC_AHB_PTSA_RATE 0x4dc
|
|
||||||
#define MC_SMMU_SMMU_PTSA_MAX 0x460
|
|
||||||
#define MC_RING2_PTSA_MIN 0x444
|
|
||||||
#define MC_SDM_PTSA_MIN 0x620
|
|
||||||
#define MC_APB_PTSA_RATE 0x4e8
|
|
||||||
#define MC_MSE_PTSA_MIN 0x4c8
|
|
||||||
#define MC_HOST_PTSA_RATE 0x518
|
|
||||||
#define MC_VE_PTSA_RATE 0x434
|
|
||||||
#define MC_AHB_PTSA_MAX 0x4e4
|
|
||||||
#define MC_SAX_PTSA_MIN 0x4bc
|
|
||||||
#define MC_SMMU_SMMU_PTSA_MIN 0x45c
|
|
||||||
#define MC_ISP_PTSA_MIN 0x4a4
|
|
||||||
#define MC_HOST_PTSA_MAX 0x520
|
|
||||||
#define MC_SAX_PTSA_MAX 0x4c0
|
|
||||||
#define MC_VE_PTSA_MIN 0x438
|
|
||||||
#define MC_GK_PTSA_MIN 0x540
|
|
||||||
#define MC_MSE_PTSA_MAX 0x4cc
|
|
||||||
#define MC_DISB_PTSA_MAX 0x430
|
|
||||||
#define MC_DISB_PTSA_MIN 0x42c
|
|
||||||
#define MC_SMMU_SMMU_PTSA_RATE 0x458
|
|
||||||
#define MC_VE2_PTSA_RATE 0x494
|
|
||||||
#define MC_GK_PTSA_RATE 0x53c
|
|
||||||
#define MC_PTSA_GRANT_DECREMENT 0x960
|
|
||||||
#define MC_LATENCY_ALLOWANCE_AVPC_0 0x2e4
|
|
||||||
#define MC_LATENCY_ALLOWANCE_AXIAP_0 0x3a0
|
|
||||||
#define MC_LATENCY_ALLOWANCE_XUSB_1 0x380
|
|
||||||
#define MC_LATENCY_ALLOWANCE_ISP2B_0 0x384
|
|
||||||
#define MC_LATENCY_ALLOWANCE_SDMMCAA_0 0x3bc
|
|
||||||
#define MC_LATENCY_ALLOWANCE_SDMMCA_0 0x3b8
|
|
||||||
#define MC_LATENCY_ALLOWANCE_ISP2_0 0x370
|
|
||||||
#define MC_LATENCY_ALLOWANCE_SE_0 0x3e0
|
|
||||||
#define MC_LATENCY_ALLOWANCE_ISP2_1 0x374
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DC_0 0x2e8
|
|
||||||
#define MC_LATENCY_ALLOWANCE_VIC_0 0x394
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DCB_1 0x2f8
|
|
||||||
#define MC_LATENCY_ALLOWANCE_NVDEC_0 0x3d8
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DCB_2 0x2fc
|
|
||||||
#define MC_LATENCY_ALLOWANCE_TSEC_0 0x390
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DC_2 0x2f0
|
|
||||||
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB 0x694
|
|
||||||
#define MC_LATENCY_ALLOWANCE_PPCS_1 0x348
|
|
||||||
#define MC_LATENCY_ALLOWANCE_XUSB_0 0x37c
|
|
||||||
#define MC_LATENCY_ALLOWANCE_PPCS_0 0x344
|
|
||||||
#define MC_LATENCY_ALLOWANCE_TSECB_0 0x3f0
|
|
||||||
#define MC_LATENCY_ALLOWANCE_AFI_0 0x2e0
|
|
||||||
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B 0x698
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DC_1 0x2ec
|
|
||||||
#define MC_LATENCY_ALLOWANCE_APE_0 0x3dc
|
|
||||||
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C 0x6a0
|
|
||||||
#define MC_LATENCY_ALLOWANCE_A9AVP_0 0x3a4
|
|
||||||
#define MC_LATENCY_ALLOWANCE_GPU2_0 0x3e8
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DCB_0 0x2f4
|
|
||||||
#define MC_LATENCY_ALLOWANCE_HC_1 0x314
|
|
||||||
#define MC_LATENCY_ALLOWANCE_SDMMC_0 0x3c0
|
|
||||||
#define MC_LATENCY_ALLOWANCE_NVJPG_0 0x3e4
|
|
||||||
#define MC_LATENCY_ALLOWANCE_PTC_0 0x34c
|
|
||||||
#define MC_LATENCY_ALLOWANCE_ETR_0 0x3ec
|
|
||||||
#define MC_LATENCY_ALLOWANCE_MPCORE_0 0x320
|
|
||||||
#define MC_LATENCY_ALLOWANCE_VI2_0 0x398
|
|
||||||
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB 0x69c
|
|
||||||
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB 0x6a4
|
|
||||||
#define MC_LATENCY_ALLOWANCE_SATA_0 0x350
|
|
||||||
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A 0x690
|
|
||||||
#define MC_LATENCY_ALLOWANCE_HC_0 0x310
|
|
||||||
#define MC_LATENCY_ALLOWANCE_DC_3 0x3c8
|
|
||||||
#define MC_LATENCY_ALLOWANCE_GPU_0 0x3ac
|
|
||||||
#define MC_LATENCY_ALLOWANCE_SDMMCAB_0 0x3c4
|
|
||||||
#define MC_LATENCY_ALLOWANCE_ISP2B_1 0x388
|
|
||||||
#define MC_LATENCY_ALLOWANCE_NVENC_0 0x328
|
|
||||||
#define MC_LATENCY_ALLOWANCE_HDA_0 0x318
|
|
||||||
#define MC_MIN_LENGTH_APE_0 0xb34
|
|
||||||
#define MC_MIN_LENGTH_DCB_2 0x8a8
|
|
||||||
#define MC_MIN_LENGTH_A9AVP_0 0x950
|
|
||||||
#define MC_MIN_LENGTH_TSEC_0 0x93c
|
|
||||||
#define MC_MIN_LENGTH_DC_1 0x898
|
|
||||||
#define MC_MIN_LENGTH_AXIAP_0 0x94c
|
|
||||||
#define MC_MIN_LENGTH_ISP2B_0 0x930
|
|
||||||
#define MC_MIN_LENGTH_VI2_0 0x944
|
|
||||||
#define MC_MIN_LENGTH_DCB_0 0x8a0
|
|
||||||
#define MC_MIN_LENGTH_DCB_1 0x8a4
|
|
||||||
#define MC_MIN_LENGTH_PPCS_1 0x8f4
|
|
||||||
#define MC_MIN_LENGTH_NVJPG_0 0xb3c
|
|
||||||
#define MC_MIN_LENGTH_HDA_0 0x8c4
|
|
||||||
#define MC_MIN_LENGTH_NVENC_0 0x8d4
|
|
||||||
#define MC_MIN_LENGTH_SDMMC_0 0xb18
|
|
||||||
#define MC_MIN_LENGTH_ISP2B_1 0x934
|
|
||||||
#define MC_MIN_LENGTH_HC_1 0x8c0
|
|
||||||
#define MC_MIN_LENGTH_DC_3 0xb20
|
|
||||||
#define MC_MIN_LENGTH_AVPC_0 0x890
|
|
||||||
#define MC_MIN_LENGTH_VIC_0 0x940
|
|
||||||
#define MC_MIN_LENGTH_ISP2_0 0x91c
|
|
||||||
#define MC_MIN_LENGTH_HC_0 0x8bc
|
|
||||||
#define MC_MIN_LENGTH_SE_0 0xb38
|
|
||||||
#define MC_MIN_LENGTH_NVDEC_0 0xb30
|
|
||||||
#define MC_MIN_LENGTH_SATA_0 0x8fc
|
|
||||||
#define MC_MIN_LENGTH_DC_0 0x894
|
|
||||||
#define MC_MIN_LENGTH_XUSB_1 0x92c
|
|
||||||
#define MC_MIN_LENGTH_DC_2 0x89c
|
|
||||||
#define MC_MIN_LENGTH_SDMMCAA_0 0xb14
|
|
||||||
#define MC_MIN_LENGTH_GPU_0 0xb04
|
|
||||||
#define MC_MIN_LENGTH_ETR_0 0xb44
|
|
||||||
#define MC_MIN_LENGTH_AFI_0 0x88c
|
|
||||||
#define MC_MIN_LENGTH_PPCS_0 0x8f0
|
|
||||||
#define MC_MIN_LENGTH_ISP2_1 0x920
|
|
||||||
#define MC_MIN_LENGTH_XUSB_0 0x928
|
|
||||||
#define MC_MIN_LENGTH_MPCORE_0 0x8cc
|
|
||||||
#define MC_MIN_LENGTH_TSECB_0 0xb48
|
|
||||||
#define MC_MIN_LENGTH_SDMMCA_0 0xb10
|
|
||||||
#define MC_MIN_LENGTH_GPU2_0 0xb40
|
|
||||||
#define MC_MIN_LENGTH_SDMMCAB_0 0xb1c
|
|
||||||
#define MC_MIN_LENGTH_PTC_0 0x8f8
|
|
||||||
#define MC_EMEM_ARB_OVERRIDE_1 0x968
|
|
||||||
#define MC_VIDEO_PROTECT_GPU_OVERRIDE_0 0x984
|
|
||||||
#define MC_VIDEO_PROTECT_GPU_OVERRIDE_1 0x988
|
|
||||||
#define MC_EMEM_ARB_STATS_0 0x990
|
|
||||||
#define MC_EMEM_ARB_STATS_1 0x994
|
|
||||||
#define MC_MTS_CARVEOUT_BOM 0x9a0
|
|
||||||
#define MC_MTS_CARVEOUT_SIZE_MB 0x9a4
|
|
||||||
#define MC_MTS_CARVEOUT_ADR_HI 0x9a8
|
|
||||||
#define MC_MTS_CARVEOUT_REG_CTRL 0x9ac
|
|
||||||
#define MC_ERR_MTS_STATUS 0x9b0
|
|
||||||
#define MC_ERR_MTS_ADR 0x9b4
|
|
||||||
#define MC_ERR_GENERALIZED_CARVEOUT_STATUS 0xc00
|
|
||||||
#define MC_ERR_GENERALIZED_CARVEOUT_ADR 0xc04
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS2 0xd74
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CFG0 0xcf8
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_ACCESS2 0xd10
|
|
||||||
#define MC_SECURITY_CARVEOUT4_SIZE_128KB 0xd04
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_ACCESS4 0xc28
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS1 0xc30
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS4 0xc8c
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS0 0xd1c
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS1 0xd70
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS0 0xc2c
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS4 0xd7c
|
|
||||||
#define MC_SECURITY_CARVEOUT3_SIZE_128KB 0xcb4
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CFG0 0xc58
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CFG0 0xc08
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS2 0xc84
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_ACCESS0 0xc68
|
|
||||||
#define MC_SECURITY_CARVEOUT3_BOM 0xcac
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_ACCESS2 0xc70
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS3 0xd78
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS0 0xc7c
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_ACCESS4 0xd18
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_ACCESS1 0xcbc
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS3 0xc38
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS2 0xc34
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_ACCESS2 0xcc0
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_ACCESS2 0xd60
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CFG0 0xca8
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_ACCESS0 0xcb8
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS3 0xc88
|
|
||||||
#define MC_SECURITY_CARVEOUT2_SIZE_128KB 0xc64
|
|
||||||
#define MC_SECURITY_CARVEOUT5_BOM_HI 0xd50
|
|
||||||
#define MC_SECURITY_CARVEOUT1_SIZE_128KB 0xc14
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_ACCESS3 0xd14
|
|
||||||
#define MC_SECURITY_CARVEOUT1_BOM 0xc0c
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS4 0xd2c
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_ACCESS4 0xd68
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_ACCESS4 0xcc8
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_ACCESS0 0xd58
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS2 0xd24
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_ACCESS3 0xcc4
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_ACCESS4 0xc78
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_ACCESS1 0xc1c
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_ACCESS0 0xc18
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS3 0xd28
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_ACCESS1 0xd5c
|
|
||||||
#define MC_SECURITY_CARVEOUT3_BOM_HI 0xcb0
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS3 0xcd8
|
|
||||||
#define MC_SECURITY_CARVEOUT2_BOM_HI 0xc60
|
|
||||||
#define MC_SECURITY_CARVEOUT4_BOM_HI 0xd00
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_ACCESS3 0xd64
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS4 0xcdc
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS1 0xc80
|
|
||||||
#define MC_SECURITY_CARVEOUT5_SIZE_128KB 0xd54
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS1 0xd20
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS2 0xcd4
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_ACCESS1 0xd0c
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_ACCESS3 0xc74
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS0 0xccc
|
|
||||||
#define MC_SECURITY_CARVEOUT4_BOM 0xcfc
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CFG0 0xd48
|
|
||||||
#define MC_SECURITY_CARVEOUT2_BOM 0xc5c
|
|
||||||
#define MC_SECURITY_CARVEOUT5_BOM 0xd4c
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_ACCESS3 0xc24
|
|
||||||
#define MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS0 0xd6c
|
|
||||||
#define MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS1 0xcd0
|
|
||||||
#define MC_SECURITY_CARVEOUT1_BOM_HI 0xc10
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_ACCESS2 0xc20
|
|
||||||
#define MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS4 0xc3c
|
|
||||||
#define MC_SECURITY_CARVEOUT2_CLIENT_ACCESS1 0xc6c
|
|
||||||
#define MC_SECURITY_CARVEOUT4_CLIENT_ACCESS0 0xd08
|
|
||||||
#define MC_ERR_APB_ASID_UPDATE_STATUS 0x9d0
|
|
||||||
#define MC_DA_CONFIG0 0x9dc
|
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define APBDEV_PMC_DPD_ENABLE 0x024
|
|
||||||
#define APBDEV_PMC_SCRATCH0 0x050
|
|
||||||
#define APBDEV_PMC_SCRATCH4 0x060
|
|
||||||
#define APBDEV_PMC_SCRATCH39 0x138
|
|
|
@ -17,386 +17,9 @@
|
||||||
#include "kern_debug_log_impl.hpp"
|
#include "kern_debug_log_impl.hpp"
|
||||||
|
|
||||||
namespace ams::kern {
|
namespace ams::kern {
|
||||||
#pragma GCC push_options
|
|
||||||
#pragma GCC optimize ("-Os")
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
/* Useful definitions for our VSNPrintf implementation. */
|
|
||||||
enum FormatSpecifierFlag : u32 {
|
|
||||||
FormatSpecifierFlag_None = 0,
|
|
||||||
FormatSpecifierFlag_EmptySign = (1 << 0),
|
|
||||||
FormatSpecifierFlag_ForceSign = (1 << 1),
|
|
||||||
FormatSpecifierFlag_Hash = (1 << 2),
|
|
||||||
FormatSpecifierFlag_LeftJustify = (1 << 3),
|
|
||||||
FormatSpecifierFlag_ZeroPad = (1 << 4),
|
|
||||||
FormatSpecifierFlag_Char = (1 << 5),
|
|
||||||
FormatSpecifierFlag_Short = (1 << 6),
|
|
||||||
FormatSpecifierFlag_Long = (1 << 7),
|
|
||||||
FormatSpecifierFlag_LongLong = (1 << 8),
|
|
||||||
FormatSpecifierFlag_Uppercase = (1 << 9),
|
|
||||||
FormatSpecifierFlag_HasPrecision = (1 << 10),
|
|
||||||
};
|
|
||||||
|
|
||||||
using FormatSpecifierFlagStorage = std::underlying_type<FormatSpecifierFlag>::type;
|
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE bool IsDigit(char c) {
|
|
||||||
return '0' <= c && c <= '9';
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE u32 ParseU32(const char *&str) {
|
|
||||||
u32 value = 0;
|
|
||||||
do {
|
|
||||||
value = (value * 10) + static_cast<u32>(*(str++) - '0');
|
|
||||||
} while (IsDigit(*str));
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE size_t Strnlen(const char *str, size_t max) {
|
|
||||||
const char *cur = str;
|
|
||||||
while (*cur && max--) {
|
|
||||||
cur++;
|
|
||||||
}
|
|
||||||
return static_cast<size_t>(cur - str);
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE void VSNPrintfImpl(char * const dst, const size_t dst_size, const char *format, ::std::va_list vl) {
|
|
||||||
size_t dst_index = 0;
|
|
||||||
|
|
||||||
auto WriteCharacter = [dst, dst_size, &dst_index](char c) ALWAYS_INLINE_LAMBDA {
|
|
||||||
if (dst_index < dst_size) {
|
|
||||||
dst[dst_index++] = c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Loop over every character in the string, looking for format specifiers. */
|
|
||||||
while (*format) {
|
|
||||||
if (const char c = *(format++); c != '%') {
|
|
||||||
WriteCharacter(c);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have to parse a format specifier. */
|
|
||||||
/* Start by parsing flags. */
|
|
||||||
FormatSpecifierFlagStorage flags = FormatSpecifierFlag_None;
|
|
||||||
auto SetFlag = [&flags](FormatSpecifierFlag f) ALWAYS_INLINE_LAMBDA { flags |= f; };
|
|
||||||
auto ClearFlag = [&flags](FormatSpecifierFlag f) ALWAYS_INLINE_LAMBDA { flags &= ~f; };
|
|
||||||
auto HasFlag = [&flags](FormatSpecifierFlag f) ALWAYS_INLINE_LAMBDA { return (flags & f) != 0; };
|
|
||||||
{
|
|
||||||
bool parsed_flags = false;
|
|
||||||
while (!parsed_flags) {
|
|
||||||
switch (*format) {
|
|
||||||
case ' ': SetFlag(FormatSpecifierFlag_EmptySign); format++; break;
|
|
||||||
case '+': SetFlag(FormatSpecifierFlag_ForceSign); format++; break;
|
|
||||||
case '#': SetFlag(FormatSpecifierFlag_Hash); format++; break;
|
|
||||||
case '-': SetFlag(FormatSpecifierFlag_LeftJustify); format++; break;
|
|
||||||
case '0': SetFlag(FormatSpecifierFlag_ZeroPad); format++; break;
|
|
||||||
default:
|
|
||||||
parsed_flags = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Next, parse width. */
|
|
||||||
u32 width = 0;
|
|
||||||
if (IsDigit(*format)) {
|
|
||||||
/* Integer width. */
|
|
||||||
width = ParseU32(format);
|
|
||||||
} else if (*format == '*') {
|
|
||||||
/* Dynamic width. */
|
|
||||||
const int _width = va_arg(vl, int);
|
|
||||||
if (_width >= 0) {
|
|
||||||
width = static_cast<u32>(_width);
|
|
||||||
} else {
|
|
||||||
SetFlag(FormatSpecifierFlag_LeftJustify);
|
|
||||||
width = static_cast<u32>(-_width);
|
|
||||||
}
|
|
||||||
format++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Next, parse precision if present. */
|
|
||||||
u32 precision = 0;
|
|
||||||
if (*format == '.') {
|
|
||||||
SetFlag(FormatSpecifierFlag_HasPrecision);
|
|
||||||
format++;
|
|
||||||
|
|
||||||
if (IsDigit(*format)) {
|
|
||||||
/* Integer precision. */
|
|
||||||
precision = ParseU32(format);
|
|
||||||
} else if (*format == '*') {
|
|
||||||
/* Dynamic precision. */
|
|
||||||
const int _precision = va_arg(vl, int);
|
|
||||||
if (_precision > 0) {
|
|
||||||
precision = static_cast<u32>(_precision);
|
|
||||||
}
|
|
||||||
format++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse length. */
|
|
||||||
constexpr bool SizeIsLong = sizeof(size_t) == sizeof(long);
|
|
||||||
constexpr bool IntMaxIsLong = sizeof(intmax_t) == sizeof(long);
|
|
||||||
constexpr bool PtrDiffIsLong = sizeof(ptrdiff_t) == sizeof(long);
|
|
||||||
switch (*format) {
|
|
||||||
case 'z':
|
|
||||||
SetFlag(SizeIsLong ? FormatSpecifierFlag_Long : FormatSpecifierFlag_LongLong);
|
|
||||||
format++;
|
|
||||||
break;
|
|
||||||
case 'j':
|
|
||||||
SetFlag(IntMaxIsLong ? FormatSpecifierFlag_Long : FormatSpecifierFlag_LongLong);
|
|
||||||
format++;
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
SetFlag(PtrDiffIsLong ? FormatSpecifierFlag_Long : FormatSpecifierFlag_LongLong);
|
|
||||||
format++;
|
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
SetFlag(FormatSpecifierFlag_Short);
|
|
||||||
format++;
|
|
||||||
if (*format == 'h') {
|
|
||||||
SetFlag(FormatSpecifierFlag_Char);
|
|
||||||
format++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'l':
|
|
||||||
SetFlag(FormatSpecifierFlag_Long);
|
|
||||||
format++;
|
|
||||||
if (*format == 'l') {
|
|
||||||
SetFlag(FormatSpecifierFlag_LongLong);
|
|
||||||
format++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char specifier = *(format++);
|
|
||||||
switch (specifier) {
|
|
||||||
case 'p':
|
|
||||||
if constexpr (sizeof(uintptr_t) == sizeof(long long)) {
|
|
||||||
SetFlag(FormatSpecifierFlag_LongLong);
|
|
||||||
} else {
|
|
||||||
SetFlag(FormatSpecifierFlag_Long);
|
|
||||||
}
|
|
||||||
SetFlag(FormatSpecifierFlag_Hash);
|
|
||||||
[[fallthrough]];
|
|
||||||
case 'd':
|
|
||||||
case 'i':
|
|
||||||
case 'u':
|
|
||||||
case 'b':
|
|
||||||
case 'o':
|
|
||||||
case 'x':
|
|
||||||
case 'X':
|
|
||||||
{
|
|
||||||
/* Determine the base to print with. */
|
|
||||||
u32 base;
|
|
||||||
switch (specifier) {
|
|
||||||
case 'b':
|
|
||||||
base = 2;
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
base = 8;
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
SetFlag(FormatSpecifierFlag_Uppercase);
|
|
||||||
[[fallthrough]];
|
|
||||||
case 'p':
|
|
||||||
case 'x':
|
|
||||||
base = 16;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
base = 10;
|
|
||||||
ClearFlag(FormatSpecifierFlag_Hash);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Precision implies no zero-padding. */
|
|
||||||
if (HasFlag(FormatSpecifierFlag_HasPrecision)) {
|
|
||||||
ClearFlag(FormatSpecifierFlag_ZeroPad);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unsigned types don't get signs. */
|
|
||||||
const bool is_unsigned = base != 10 || specifier == 'u';
|
|
||||||
if (is_unsigned) {
|
|
||||||
ClearFlag(FormatSpecifierFlag_EmptySign);
|
|
||||||
ClearFlag(FormatSpecifierFlag_ForceSign);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto PrintInteger = [&](bool negative, uintmax_t value) {
|
|
||||||
constexpr size_t BufferSize = 64; /* Binary digits for 64-bit numbers may use 64 digits. */
|
|
||||||
char buf[BufferSize];
|
|
||||||
size_t len = 0;
|
|
||||||
|
|
||||||
/* No hash flag for zero. */
|
|
||||||
if (value == 0) {
|
|
||||||
ClearFlag(FormatSpecifierFlag_Hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!HasFlag(FormatSpecifierFlag_HasPrecision) || value != 0) {
|
|
||||||
do {
|
|
||||||
const char digit = static_cast<char>(value % base);
|
|
||||||
buf[len++] = (digit < 10) ? ('0' + digit) : ((HasFlag(FormatSpecifierFlag_Uppercase) ? 'A' : 'a') + digit - 10);
|
|
||||||
value /= base;
|
|
||||||
} while (value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Determine our prefix length. */
|
|
||||||
size_t prefix_len = 0;
|
|
||||||
const bool has_sign = negative || HasFlag(FormatSpecifierFlag_ForceSign) || HasFlag(FormatSpecifierFlag_EmptySign);
|
|
||||||
if (has_sign) {
|
|
||||||
prefix_len++;
|
|
||||||
}
|
|
||||||
if (HasFlag(FormatSpecifierFlag_Hash)) {
|
|
||||||
prefix_len += (base != 8) ? 2 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Determine zero-padding count. */
|
|
||||||
size_t num_zeroes = (len < precision) ? precision - len : 0;
|
|
||||||
if (!HasFlag(FormatSpecifierFlag_LeftJustify) && HasFlag(FormatSpecifierFlag_ZeroPad)) {
|
|
||||||
num_zeroes = (len + prefix_len < width) ? width - len - prefix_len : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print out left padding. */
|
|
||||||
if (!HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
|
||||||
for (size_t i = len + prefix_len + num_zeroes; i < static_cast<size_t>(width); i++) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print out sign. */
|
|
||||||
if (negative) {
|
|
||||||
WriteCharacter('-');
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_ForceSign)) {
|
|
||||||
WriteCharacter('+');
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_EmptySign)) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print out base prefix. */
|
|
||||||
if (HasFlag(FormatSpecifierFlag_Hash)) {
|
|
||||||
WriteCharacter('0');
|
|
||||||
if (base == 2) {
|
|
||||||
WriteCharacter('b');
|
|
||||||
} else if (base == 16) {
|
|
||||||
WriteCharacter('x');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print out zeroes. */
|
|
||||||
for (size_t i = 0; i < num_zeroes; i++) {
|
|
||||||
WriteCharacter('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print out digits. */
|
|
||||||
for (size_t i = 0; i < len; i++) {
|
|
||||||
WriteCharacter(buf[len - 1 - i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print out right padding. */
|
|
||||||
if (HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
|
||||||
for (size_t i = len + prefix_len + num_zeroes; i < static_cast<size_t>(width); i++) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Output the integer. */
|
|
||||||
if (is_unsigned) {
|
|
||||||
uintmax_t n = 0;
|
|
||||||
if (HasFlag(FormatSpecifierFlag_LongLong)) {
|
|
||||||
n = static_cast<unsigned long long>(va_arg(vl, unsigned long long));
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_Long)) {
|
|
||||||
n = static_cast<unsigned long>(va_arg(vl, unsigned long));
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_Char)) {
|
|
||||||
n = static_cast<unsigned char>(va_arg(vl, unsigned int));
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_Short)) {
|
|
||||||
n = static_cast<unsigned short>(va_arg(vl, unsigned int));
|
|
||||||
} else {
|
|
||||||
n = static_cast<unsigned int>(va_arg(vl, unsigned int));
|
|
||||||
}
|
|
||||||
if (specifier == 'p' && n == 0) {
|
|
||||||
WriteCharacter('(');
|
|
||||||
WriteCharacter('n');
|
|
||||||
WriteCharacter('i');
|
|
||||||
WriteCharacter('l');
|
|
||||||
WriteCharacter(')');
|
|
||||||
} else {
|
|
||||||
PrintInteger(false, n);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
intmax_t n = 0;
|
|
||||||
if (HasFlag(FormatSpecifierFlag_LongLong)) {
|
|
||||||
n = static_cast<signed long long>(va_arg(vl, signed long long));
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_Long)) {
|
|
||||||
n = static_cast<signed long>(va_arg(vl, signed long));
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_Char)) {
|
|
||||||
n = static_cast<signed char>(va_arg(vl, signed int));
|
|
||||||
} else if (HasFlag(FormatSpecifierFlag_Short)) {
|
|
||||||
n = static_cast<signed short>(va_arg(vl, signed int));
|
|
||||||
} else {
|
|
||||||
n = static_cast<signed int>(va_arg(vl, signed int));
|
|
||||||
}
|
|
||||||
const bool negative = n < 0;
|
|
||||||
const uintmax_t u = (negative) ? static_cast<uintmax_t>(-n) : static_cast<uintmax_t>(n);
|
|
||||||
PrintInteger(negative, u);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
{
|
|
||||||
size_t len = 1;
|
|
||||||
if (!HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
|
||||||
while (len++ < width) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WriteCharacter(static_cast<char>(va_arg(vl, int)));
|
|
||||||
if (HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
|
||||||
while (len++ < width) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
{
|
|
||||||
const char *str = va_arg(vl, char *);
|
|
||||||
if (str == nullptr) {
|
|
||||||
str = "(null)";
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t len = Strnlen(str, precision > 0 ? precision : std::numeric_limits<size_t>::max());
|
|
||||||
if (HasFlag(FormatSpecifierFlag_HasPrecision)) {
|
|
||||||
len = (len < precision) ? len : precision;
|
|
||||||
}
|
|
||||||
if (!HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
|
||||||
while (len++ < width) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (*str && (!HasFlag(FormatSpecifierFlag_HasPrecision) || (precision--) != 0)) {
|
|
||||||
WriteCharacter(*(str++));
|
|
||||||
}
|
|
||||||
if (HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
|
||||||
while (len++ < width) {
|
|
||||||
WriteCharacter(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '%':
|
|
||||||
default:
|
|
||||||
WriteCharacter(specifier);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure null termination. */
|
|
||||||
WriteCharacter('\0');
|
|
||||||
dst[dst_size - 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
KSpinLock g_debug_log_lock;
|
KSpinLock g_debug_log_lock;
|
||||||
bool g_initialized_impl;
|
bool g_initialized_impl;
|
||||||
|
|
||||||
|
@ -452,9 +75,6 @@ namespace ams::kern {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma GCC pop_options
|
|
||||||
|
|
||||||
void KDebugLog::Initialize() {
|
void KDebugLog::Initialize() {
|
||||||
if (KTargetSystem::IsDebugLoggingEnabled()) {
|
if (KTargetSystem::IsDebugLoggingEnabled()) {
|
||||||
KScopedInterruptDisable di;
|
KScopedInterruptDisable di;
|
||||||
|
@ -486,7 +106,7 @@ namespace ams::kern {
|
||||||
}
|
}
|
||||||
|
|
||||||
void KDebugLog::VSNPrintf(char *dst, const size_t dst_size, const char *format, ::std::va_list vl) {
|
void KDebugLog::VSNPrintf(char *dst, const size_t dst_size, const char *format, ::std::va_list vl) {
|
||||||
VSNPrintfImpl(dst, dst_size, format, vl);
|
::ams::util::TVSNPrintf(dst, dst_size, format, vl);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result KDebugLog::PrintUserString(ams::kern::svc::KUserPointer<const char *> user_str, size_t len) {
|
Result KDebugLog::PrintUserString(ams::kern::svc::KUserPointer<const char *> user_str, size_t len) {
|
||||||
|
|
|
@ -103,6 +103,7 @@ DEFINE_CLK_RST_REG_TWO_BIT_ENUM(SPARE_REG0_CLK_M_DIVISOR, 2, CLK_M_DIVISOR1, CLK
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_UARTA (0x178)
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_UARTA (0x178)
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_UARTB (0x17C)
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_UARTB (0x17C)
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_UARTC (0x1A0)
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_UARTC (0x1A0)
|
||||||
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_CSITE (0x1D4)
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT (0x3B4)
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT (0x3B4)
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_ACTMON (0x3E8)
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_ACTMON (0x3E8)
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_DVFS_REF (0x62C)
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_DVFS_REF (0x62C)
|
||||||
|
|
|
@ -23,9 +23,13 @@
|
||||||
|
|
||||||
#define FLOW_CTLR_RAM_REPAIR (0x040)
|
#define FLOW_CTLR_RAM_REPAIR (0x040)
|
||||||
#define FLOW_CTLR_FLOW_DBG_QUAL (0x050)
|
#define FLOW_CTLR_FLOW_DBG_QUAL (0x050)
|
||||||
|
#define FLOW_CTLR_CC4_HVC_CONTROL (0x060)
|
||||||
|
#define FLOW_CTLR_CC4_RETENTION_CONTROL (0x064)
|
||||||
|
#define FLOW_CTLR_CC4_HVC_RETRY (0x08C)
|
||||||
#define FLOW_CTLR_L2FLUSH_CONTROL (0x094)
|
#define FLOW_CTLR_L2FLUSH_CONTROL (0x094)
|
||||||
#define FLOW_CTLR_BPMP_CLUSTER_CONTROL (0x098)
|
#define FLOW_CTLR_BPMP_CLUSTER_CONTROL (0x098)
|
||||||
|
|
||||||
|
|
||||||
#define FLOW_CTLR_CPU0_CSR (0x008)
|
#define FLOW_CTLR_CPU0_CSR (0x008)
|
||||||
#define FLOW_CTLR_CPU1_CSR (0x018)
|
#define FLOW_CTLR_CPU1_CSR (0x018)
|
||||||
#define FLOW_CTLR_CPU2_CSR (0x020)
|
#define FLOW_CTLR_CPU2_CSR (0x020)
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#define MC_SMMU_PTB_ASID (0x01C)
|
#define MC_SMMU_PTB_ASID (0x01C)
|
||||||
#define MC_SMMU_PTB_DATA (0x020)
|
#define MC_SMMU_PTB_DATA (0x020)
|
||||||
#define MC_SMMU_TLB_FLUSH (0x030)
|
#define MC_SMMU_TLB_FLUSH (0x030)
|
||||||
#define MC_SMMU_PTC_FLUSH (0x034)
|
#define MC_SMMU_PTC_FLUSH_0 (0x034)
|
||||||
#define MC_EMEM_CFG (0x050)
|
#define MC_EMEM_CFG (0x050)
|
||||||
#define MC_EMEM_ADR_CFG (0x054)
|
#define MC_EMEM_ADR_CFG (0x054)
|
||||||
#define MC_EMEM_ARB_CFG (0x090)
|
#define MC_EMEM_ARB_CFG (0x090)
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
#define MC_SMMU_HC_ASID (0x250)
|
#define MC_SMMU_HC_ASID (0x250)
|
||||||
#define MC_SMMU_HDA_ASID (0x254)
|
#define MC_SMMU_HDA_ASID (0x254)
|
||||||
#define MC_SMMU_ISP2_ASID (0x258)
|
#define MC_SMMU_ISP2_ASID (0x258)
|
||||||
#define MC_SMMU_NVENC_ASID (0x264)
|
#define MC_SMMU_MSENC_NVENC_ASID (0x264)
|
||||||
#define MC_SMMU_NV_ASID (0x268)
|
#define MC_SMMU_NV_ASID (0x268)
|
||||||
#define MC_SMMU_NV2_ASID (0x26C)
|
#define MC_SMMU_NV2_ASID (0x26C)
|
||||||
#define MC_SMMU_PPCS_ASID (0x270)
|
#define MC_SMMU_PPCS_ASID (0x270)
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#define APBDEV_PMC_PWR_DET (0x048)
|
#define APBDEV_PMC_PWR_DET (0x048)
|
||||||
#define APBDEV_PMC_SCRATCH0 (0x050)
|
#define APBDEV_PMC_SCRATCH0 (0x050)
|
||||||
#define APBDEV_PMC_SCRATCH1 (0x054)
|
#define APBDEV_PMC_SCRATCH1 (0x054)
|
||||||
|
#define APBDEV_PMC_SCRATCH4 (0x060)
|
||||||
#define APBDEV_PMC_SCRATCH12 (0x080)
|
#define APBDEV_PMC_SCRATCH12 (0x080)
|
||||||
#define APBDEV_PMC_SCRATCH13 (0x084)
|
#define APBDEV_PMC_SCRATCH13 (0x084)
|
||||||
#define APBDEV_PMC_SCRATCH18 (0x098)
|
#define APBDEV_PMC_SCRATCH18 (0x098)
|
||||||
|
@ -49,6 +50,7 @@
|
||||||
#define APBDEV_PMC_SCRATCH31 (0x118)
|
#define APBDEV_PMC_SCRATCH31 (0x118)
|
||||||
#define APBDEV_PMC_SCRATCH32 (0x11C)
|
#define APBDEV_PMC_SCRATCH32 (0x11C)
|
||||||
#define APBDEV_PMC_SCRATCH33 (0x120)
|
#define APBDEV_PMC_SCRATCH33 (0x120)
|
||||||
|
#define APBDEV_PMC_SCRATCH39 (0x138)
|
||||||
#define APBDEV_PMC_SCRATCH40 (0x13C)
|
#define APBDEV_PMC_SCRATCH40 (0x13C)
|
||||||
#define APBDEV_PMC_WAKE2_MASK (0x160)
|
#define APBDEV_PMC_WAKE2_MASK (0x160)
|
||||||
#define APBDEV_PMC_WAKE2_LVL (0x164)
|
#define APBDEV_PMC_WAKE2_LVL (0x164)
|
||||||
|
|
|
@ -40,3 +40,4 @@
|
||||||
#include <vapours/util/util_overlap.hpp>
|
#include <vapours/util/util_overlap.hpp>
|
||||||
#include <vapours/util/util_string_util.hpp>
|
#include <vapours/util/util_string_util.hpp>
|
||||||
#include <vapours/util/util_variadic.hpp>
|
#include <vapours/util/util_variadic.hpp>
|
||||||
|
#include <vapours/util/util_format_string.hpp>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License
|
* under the terms and conditions of the GNU General Public License,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
@ -13,8 +13,17 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_CSITE 0x1D4
|
#pragma once
|
||||||
#define CLK_RST_CONTROLLER_RST_DEV_L_SET 0x300
|
#include <vapours/common.hpp>
|
||||||
#define CLK_RST_CONTROLLER_RST_DEV_L_CLR 0x304
|
#include <vapours/assert.hpp>
|
||||||
|
|
||||||
|
namespace ams::util {
|
||||||
|
|
||||||
|
int SNPrintf(char *dst, size_t dst_size, const char *fmt, ...);
|
||||||
|
int VSNPrintf(char *dst, size_t dst_size, const char *fmt, std::va_list vl);
|
||||||
|
|
||||||
|
int TSNPrintf(char *dst, size_t dst_size, const char *fmt, ...);
|
||||||
|
int TVSNPrintf(char *dst, size_t dst_size, const char *fmt, std::va_list vl);
|
||||||
|
|
||||||
|
}
|
434
libraries/libvapours/source/util/util_format_string.cpp
Normal file
434
libraries/libvapours/source/util/util_format_string.cpp
Normal file
|
@ -0,0 +1,434 @@
|
||||||
|
/*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <vapours.hpp>
|
||||||
|
|
||||||
|
namespace ams::util {
|
||||||
|
|
||||||
|
#pragma GCC push_options
|
||||||
|
#pragma GCC optimize ("-Os")
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
/* Useful definitions for our VSNPrintf implementation. */
|
||||||
|
enum FormatSpecifierFlag : u32 {
|
||||||
|
FormatSpecifierFlag_None = 0,
|
||||||
|
FormatSpecifierFlag_EmptySign = (1 << 0),
|
||||||
|
FormatSpecifierFlag_ForceSign = (1 << 1),
|
||||||
|
FormatSpecifierFlag_Hash = (1 << 2),
|
||||||
|
FormatSpecifierFlag_LeftJustify = (1 << 3),
|
||||||
|
FormatSpecifierFlag_ZeroPad = (1 << 4),
|
||||||
|
FormatSpecifierFlag_Char = (1 << 5),
|
||||||
|
FormatSpecifierFlag_Short = (1 << 6),
|
||||||
|
FormatSpecifierFlag_Long = (1 << 7),
|
||||||
|
FormatSpecifierFlag_LongLong = (1 << 8),
|
||||||
|
FormatSpecifierFlag_Uppercase = (1 << 9),
|
||||||
|
FormatSpecifierFlag_HasPrecision = (1 << 10),
|
||||||
|
};
|
||||||
|
|
||||||
|
using FormatSpecifierFlagStorage = std::underlying_type<FormatSpecifierFlag>::type;
|
||||||
|
|
||||||
|
constexpr ALWAYS_INLINE bool IsDigit(char c) {
|
||||||
|
return '0' <= c && c <= '9';
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ALWAYS_INLINE u32 ParseU32(const char *&str) {
|
||||||
|
u32 value = 0;
|
||||||
|
do {
|
||||||
|
value = (value * 10) + static_cast<u32>(*(str++) - '0');
|
||||||
|
} while (IsDigit(*str));
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ALWAYS_INLINE size_t Strnlen(const char *str, size_t max) {
|
||||||
|
const char *cur = str;
|
||||||
|
while (*cur && max--) {
|
||||||
|
cur++;
|
||||||
|
}
|
||||||
|
return static_cast<size_t>(cur - str);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TVSNPrintfImpl(char * const dst, const size_t dst_size, const char *format, ::std::va_list vl) {
|
||||||
|
size_t dst_index = 0;
|
||||||
|
|
||||||
|
auto WriteCharacter = [dst, dst_size, &dst_index](char c) ALWAYS_INLINE_LAMBDA {
|
||||||
|
if (const size_t i = (dst_index++); i < dst_size) {
|
||||||
|
dst[i] = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Loop over every character in the string, looking for format specifiers. */
|
||||||
|
while (*format) {
|
||||||
|
if (const char c = *(format++); c != '%') {
|
||||||
|
WriteCharacter(c);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We have to parse a format specifier. */
|
||||||
|
/* Start by parsing flags. */
|
||||||
|
FormatSpecifierFlagStorage flags = FormatSpecifierFlag_None;
|
||||||
|
auto SetFlag = [&flags](FormatSpecifierFlag f) ALWAYS_INLINE_LAMBDA { flags |= f; };
|
||||||
|
auto ClearFlag = [&flags](FormatSpecifierFlag f) ALWAYS_INLINE_LAMBDA { flags &= ~f; };
|
||||||
|
auto HasFlag = [&flags](FormatSpecifierFlag f) ALWAYS_INLINE_LAMBDA { return (flags & f) != 0; };
|
||||||
|
{
|
||||||
|
bool parsed_flags = false;
|
||||||
|
while (!parsed_flags) {
|
||||||
|
switch (*format) {
|
||||||
|
case ' ': SetFlag(FormatSpecifierFlag_EmptySign); format++; break;
|
||||||
|
case '+': SetFlag(FormatSpecifierFlag_ForceSign); format++; break;
|
||||||
|
case '#': SetFlag(FormatSpecifierFlag_Hash); format++; break;
|
||||||
|
case '-': SetFlag(FormatSpecifierFlag_LeftJustify); format++; break;
|
||||||
|
case '0': SetFlag(FormatSpecifierFlag_ZeroPad); format++; break;
|
||||||
|
default:
|
||||||
|
parsed_flags = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next, parse width. */
|
||||||
|
u32 width = 0;
|
||||||
|
if (IsDigit(*format)) {
|
||||||
|
/* Integer width. */
|
||||||
|
width = ParseU32(format);
|
||||||
|
} else if (*format == '*') {
|
||||||
|
/* Dynamic width. */
|
||||||
|
const int _width = va_arg(vl, int);
|
||||||
|
if (_width >= 0) {
|
||||||
|
width = static_cast<u32>(_width);
|
||||||
|
} else {
|
||||||
|
SetFlag(FormatSpecifierFlag_LeftJustify);
|
||||||
|
width = static_cast<u32>(-_width);
|
||||||
|
}
|
||||||
|
format++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next, parse precision if present. */
|
||||||
|
u32 precision = 0;
|
||||||
|
if (*format == '.') {
|
||||||
|
SetFlag(FormatSpecifierFlag_HasPrecision);
|
||||||
|
format++;
|
||||||
|
|
||||||
|
if (IsDigit(*format)) {
|
||||||
|
/* Integer precision. */
|
||||||
|
precision = ParseU32(format);
|
||||||
|
} else if (*format == '*') {
|
||||||
|
/* Dynamic precision. */
|
||||||
|
const int _precision = va_arg(vl, int);
|
||||||
|
if (_precision > 0) {
|
||||||
|
precision = static_cast<u32>(_precision);
|
||||||
|
}
|
||||||
|
format++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse length. */
|
||||||
|
constexpr bool SizeIsLong = sizeof(size_t) == sizeof(long);
|
||||||
|
constexpr bool IntMaxIsLong = sizeof(intmax_t) == sizeof(long);
|
||||||
|
constexpr bool PtrDiffIsLong = sizeof(ptrdiff_t) == sizeof(long);
|
||||||
|
switch (*format) {
|
||||||
|
case 'z':
|
||||||
|
SetFlag(SizeIsLong ? FormatSpecifierFlag_Long : FormatSpecifierFlag_LongLong);
|
||||||
|
format++;
|
||||||
|
break;
|
||||||
|
case 'j':
|
||||||
|
SetFlag(IntMaxIsLong ? FormatSpecifierFlag_Long : FormatSpecifierFlag_LongLong);
|
||||||
|
format++;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
SetFlag(PtrDiffIsLong ? FormatSpecifierFlag_Long : FormatSpecifierFlag_LongLong);
|
||||||
|
format++;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
SetFlag(FormatSpecifierFlag_Short);
|
||||||
|
format++;
|
||||||
|
if (*format == 'h') {
|
||||||
|
SetFlag(FormatSpecifierFlag_Char);
|
||||||
|
format++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
SetFlag(FormatSpecifierFlag_Long);
|
||||||
|
format++;
|
||||||
|
if (*format == 'l') {
|
||||||
|
SetFlag(FormatSpecifierFlag_LongLong);
|
||||||
|
format++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char specifier = *(format++);
|
||||||
|
switch (specifier) {
|
||||||
|
case 'p':
|
||||||
|
if constexpr (sizeof(uintptr_t) == sizeof(long long)) {
|
||||||
|
SetFlag(FormatSpecifierFlag_LongLong);
|
||||||
|
} else {
|
||||||
|
SetFlag(FormatSpecifierFlag_Long);
|
||||||
|
}
|
||||||
|
SetFlag(FormatSpecifierFlag_Hash);
|
||||||
|
[[fallthrough]];
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
case 'u':
|
||||||
|
case 'b':
|
||||||
|
case 'o':
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
{
|
||||||
|
/* Determine the base to print with. */
|
||||||
|
u32 base;
|
||||||
|
switch (specifier) {
|
||||||
|
case 'b':
|
||||||
|
base = 2;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
base = 8;
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
SetFlag(FormatSpecifierFlag_Uppercase);
|
||||||
|
[[fallthrough]];
|
||||||
|
case 'p':
|
||||||
|
case 'x':
|
||||||
|
base = 16;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
base = 10;
|
||||||
|
ClearFlag(FormatSpecifierFlag_Hash);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Precision implies no zero-padding. */
|
||||||
|
if (HasFlag(FormatSpecifierFlag_HasPrecision)) {
|
||||||
|
ClearFlag(FormatSpecifierFlag_ZeroPad);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unsigned types don't get signs. */
|
||||||
|
const bool is_unsigned = base != 10 || specifier == 'u';
|
||||||
|
if (is_unsigned) {
|
||||||
|
ClearFlag(FormatSpecifierFlag_EmptySign);
|
||||||
|
ClearFlag(FormatSpecifierFlag_ForceSign);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto PrintInteger = [&](bool negative, uintmax_t value) {
|
||||||
|
constexpr size_t BufferSize = 64; /* Binary digits for 64-bit numbers may use 64 digits. */
|
||||||
|
char buf[BufferSize];
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
/* No hash flag for zero. */
|
||||||
|
if (value == 0) {
|
||||||
|
ClearFlag(FormatSpecifierFlag_Hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HasFlag(FormatSpecifierFlag_HasPrecision) || value != 0) {
|
||||||
|
do {
|
||||||
|
const char digit = static_cast<char>(value % base);
|
||||||
|
buf[len++] = (digit < 10) ? ('0' + digit) : ((HasFlag(FormatSpecifierFlag_Uppercase) ? 'A' : 'a') + digit - 10);
|
||||||
|
value /= base;
|
||||||
|
} while (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine our prefix length. */
|
||||||
|
size_t prefix_len = 0;
|
||||||
|
const bool has_sign = negative || HasFlag(FormatSpecifierFlag_ForceSign) || HasFlag(FormatSpecifierFlag_EmptySign);
|
||||||
|
if (has_sign) {
|
||||||
|
prefix_len++;
|
||||||
|
}
|
||||||
|
if (HasFlag(FormatSpecifierFlag_Hash)) {
|
||||||
|
prefix_len += (base != 8) ? 2 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine zero-padding count. */
|
||||||
|
size_t num_zeroes = (len < precision) ? precision - len : 0;
|
||||||
|
if (!HasFlag(FormatSpecifierFlag_LeftJustify) && HasFlag(FormatSpecifierFlag_ZeroPad)) {
|
||||||
|
num_zeroes = (len + prefix_len < width) ? width - len - prefix_len : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out left padding. */
|
||||||
|
if (!HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
||||||
|
for (size_t i = len + prefix_len + num_zeroes; i < static_cast<size_t>(width); i++) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out sign. */
|
||||||
|
if (negative) {
|
||||||
|
WriteCharacter('-');
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_ForceSign)) {
|
||||||
|
WriteCharacter('+');
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_EmptySign)) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out base prefix. */
|
||||||
|
if (HasFlag(FormatSpecifierFlag_Hash)) {
|
||||||
|
WriteCharacter('0');
|
||||||
|
if (base == 2) {
|
||||||
|
WriteCharacter('b');
|
||||||
|
} else if (base == 16) {
|
||||||
|
WriteCharacter('x');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out zeroes. */
|
||||||
|
for (size_t i = 0; i < num_zeroes; i++) {
|
||||||
|
WriteCharacter('0');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out digits. */
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
WriteCharacter(buf[len - 1 - i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out right padding. */
|
||||||
|
if (HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
||||||
|
for (size_t i = len + prefix_len + num_zeroes; i < static_cast<size_t>(width); i++) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Output the integer. */
|
||||||
|
if (is_unsigned) {
|
||||||
|
uintmax_t n = 0;
|
||||||
|
if (HasFlag(FormatSpecifierFlag_LongLong)) {
|
||||||
|
n = static_cast<unsigned long long>(va_arg(vl, unsigned long long));
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_Long)) {
|
||||||
|
n = static_cast<unsigned long>(va_arg(vl, unsigned long));
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_Char)) {
|
||||||
|
n = static_cast<unsigned char>(va_arg(vl, unsigned int));
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_Short)) {
|
||||||
|
n = static_cast<unsigned short>(va_arg(vl, unsigned int));
|
||||||
|
} else {
|
||||||
|
n = static_cast<unsigned int>(va_arg(vl, unsigned int));
|
||||||
|
}
|
||||||
|
if (specifier == 'p' && n == 0) {
|
||||||
|
WriteCharacter('(');
|
||||||
|
WriteCharacter('n');
|
||||||
|
WriteCharacter('i');
|
||||||
|
WriteCharacter('l');
|
||||||
|
WriteCharacter(')');
|
||||||
|
} else {
|
||||||
|
PrintInteger(false, n);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
intmax_t n = 0;
|
||||||
|
if (HasFlag(FormatSpecifierFlag_LongLong)) {
|
||||||
|
n = static_cast<signed long long>(va_arg(vl, signed long long));
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_Long)) {
|
||||||
|
n = static_cast<signed long>(va_arg(vl, signed long));
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_Char)) {
|
||||||
|
n = static_cast<signed char>(va_arg(vl, signed int));
|
||||||
|
} else if (HasFlag(FormatSpecifierFlag_Short)) {
|
||||||
|
n = static_cast<signed short>(va_arg(vl, signed int));
|
||||||
|
} else {
|
||||||
|
n = static_cast<signed int>(va_arg(vl, signed int));
|
||||||
|
}
|
||||||
|
const bool negative = n < 0;
|
||||||
|
const uintmax_t u = (negative) ? static_cast<uintmax_t>(-n) : static_cast<uintmax_t>(n);
|
||||||
|
PrintInteger(negative, u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
{
|
||||||
|
size_t len = 1;
|
||||||
|
if (!HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
||||||
|
while (len++ < width) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WriteCharacter(static_cast<char>(va_arg(vl, int)));
|
||||||
|
if (HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
||||||
|
while (len++ < width) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
{
|
||||||
|
const char *str = va_arg(vl, char *);
|
||||||
|
if (str == nullptr) {
|
||||||
|
str = "(null)";
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t len = Strnlen(str, precision > 0 ? precision : std::numeric_limits<size_t>::max());
|
||||||
|
if (HasFlag(FormatSpecifierFlag_HasPrecision)) {
|
||||||
|
len = (len < precision) ? len : precision;
|
||||||
|
}
|
||||||
|
if (!HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
||||||
|
while (len++ < width) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (*str && (!HasFlag(FormatSpecifierFlag_HasPrecision) || (precision--) != 0)) {
|
||||||
|
WriteCharacter(*(str++));
|
||||||
|
}
|
||||||
|
if (HasFlag(FormatSpecifierFlag_LeftJustify)) {
|
||||||
|
while (len++ < width) {
|
||||||
|
WriteCharacter(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
default:
|
||||||
|
WriteCharacter(specifier);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure null termination. */
|
||||||
|
WriteCharacter('\0');
|
||||||
|
dst[dst_size - 1] = '\0';
|
||||||
|
|
||||||
|
/* Return number of characters that would have been printed sans the null terminator. */
|
||||||
|
return static_cast<int>(dst_index) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma GCC pop_options
|
||||||
|
|
||||||
|
int TVSNPrintf(char *dst, size_t dst_size, const char *fmt, std::va_list vl) {
|
||||||
|
return TVSNPrintfImpl(dst, dst_size, fmt, vl);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TSNPrintf(char *dst, size_t dst_size, const char *fmt, ...) {
|
||||||
|
std::va_list vl;
|
||||||
|
va_start(vl, fmt);
|
||||||
|
const int len = TVSNPrintf(dst, dst_size, fmt, vl);
|
||||||
|
va_end(vl);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int VSNPrintf(char *dst, size_t dst_size, const char *fmt, std::va_list vl) {
|
||||||
|
/* TODO: floating point support? */
|
||||||
|
return TVSNPrintfImpl(dst, dst_size, fmt, vl);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SNPrintf(char *dst, size_t dst_size, const char *fmt, ...) {
|
||||||
|
std::va_list vl;
|
||||||
|
va_start(vl, fmt);
|
||||||
|
const int len = VSNPrintf(dst, dst_size, fmt, vl);
|
||||||
|
va_end(vl);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue