/* * 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 . */ #pragma once #include namespace ams::kern::smc { /* Types. */ enum MemorySize { MemorySize_4GB = 0, MemorySize_6GB = 1, MemorySize_8GB = 2, }; enum MemoryArrangement { MemoryArrangement_4GB = 0, MemoryArrangement_4GBForAppletDev = 1, MemoryArrangement_4GBForSystemDev = 2, MemoryArrangement_6GB = 3, MemoryArrangement_6GBForAppletDev = 4, MemoryArrangement_8GB = 5, }; enum class ConfigItem : u32 { /* Standard config items. */ DisableProgramVerification = 1, DramId = 2, SecurityEngineIrqNumber = 3, Version = 4, HardwareType = 5, IsRetail = 6, IsRecoveryBoot = 7, DeviceId = 8, BootReason = 9, MemoryMode = 10, IsDebugMode = 11, KernelConfiguration = 12, IsChargerHiZModeEnabled = 13, IsQuest = 14, RegulatorType = 15, DeviceUniqueKeyGeneration = 16, Package2Hash = 17, /* Extension config items for exosphere. */ ExosphereApiVersion = 65000, ExosphereNeedsReboot = 65001, ExosphereNeedsShutdown = 65002, ExosphereGitCommitHash = 65003, ExosphereHasRcmBugPatch = 65004, }; enum class SmcResult { Success = 0, NotImplemented = 1, InvalidArgument = 2, InProgress = 3, NoAsyncOperation = 4, InvalidAsyncOperation = 5, NotPermitted = 6, }; struct KernelConfiguration { using DebugFillMemory = util::BitPack32::Field<0, 1, bool>; using EnableUserExceptionHandlers = util::BitPack32::Field; using EnableUserPmuAccess = util::BitPack32::Field; using IncreaseThreadResourceLimit = util::BitPack32::Field; using Reserved4 = util::BitPack32::Field; using UseSecureMonitorPanicCall = util::BitPack32::Field; using Reserved9 = util::BitPack32::Field; using MemorySize = util::BitPack32::Field; }; /* TODO: Rest of Secure Monitor API. */ void NORETURN Panic(u32 color); namespace init { void CpuOn(u64 core_id, uintptr_t entrypoint, uintptr_t arg); void GetConfig(u64 *out, size_t num_qwords, ConfigItem config_item); void GenerateRandomBytes(void *dst, size_t size); bool ReadWriteRegister(u32 *out, u64 address, u32 mask, u32 value); } }