1 /*---------------------------------------------------------------------------* 2 3 Copyright (C) Nintendo. All rights reserved. 4 5 These coded instructions, statements, and computer programs contain 6 proprietary information of Nintendo of America Inc. and/or Nintendo 7 Company Ltd., and are protected by Federal copyright law. They may 8 not be disclosed to third parties or copied or duplicated in any form, 9 in whole or in part, without the prior written consent of Nintendo. 10 11 *---------------------------------------------------------------------------*/ 12 private: 13 static const s32 SIZE_LEGACY_DESCRIPTION = 10; 14 static const s32 SIZE_LEGACY_SUMMARY = 4; 15 static const s32 SIZE_LEGACY_LEVEL = 4; 16 static const s32 SIZE_LEGACY_RESERVED1 = 2; 17 static const s32 SIZE_LEGACY_MODULE = 7; 18 static const s32 SIZE_LEGACY_SIGNATURE = 2; 19 20 static const s32 SHIFTS_LEGACY_DESCRIPTION = 0; 21 static const s32 SHIFTS_LEGACY_SUMMARY = SHIFTS_LEGACY_DESCRIPTION + SIZE_LEGACY_DESCRIPTION; 22 static const s32 SHIFTS_LEGACY_LEVEL = SHIFTS_LEGACY_SUMMARY + SIZE_LEGACY_SUMMARY; 23 static const s32 SHIFTS_LEGACY_RESERVED1 = SHIFTS_LEGACY_LEVEL + SIZE_LEGACY_LEVEL; 24 static const s32 SHIFTS_LEGACY_MODULE = SHIFTS_LEGACY_RESERVED1 + SIZE_LEGACY_RESERVED1; 25 static const s32 SHIFTS_LEGACY_SIGNATURE = SHIFTS_LEGACY_MODULE + SIZE_LEGACY_MODULE; 26 27 //NN_STATIC_ASSERT( SHIFTS_LEGACY_SIGNATURE + SIZE_LEGACY_SIGNATURE == SIZE_DESCRIPTION + SIZE_MODULE ); 28 29 #define NN_RESULT_H_MAKE_MASK(size, shift) (((~0u) >> (32 - (size))) << (shift)) 30 #define NN_RESULT_H_MAKE_MASK_HELPER(c) \ 31 static const u32 MASK_ ## c = NN_RESULT_H_MAKE_MASK(SIZE_ ## c, SHIFTS_ ## c) 32 NN_RESULT_H_MAKE_MASK_HELPER(LEGACY_DESCRIPTION); 33 NN_RESULT_H_MAKE_MASK_HELPER(LEGACY_SUMMARY); 34 NN_RESULT_H_MAKE_MASK_HELPER(LEGACY_LEVEL); 35 NN_RESULT_H_MAKE_MASK_HELPER(LEGACY_MODULE); 36 NN_RESULT_H_MAKE_MASK_HELPER(LEGACY_SIGNATURE); 37 #undef NN_RESULT_H_MAKE_MASK_HELPER 38 #undef NN_RESULT_H_MAKE_MASK 39 40 #define NN_RESULT_H_MAKE_MAX(size) ((~0u) >> (32 - (size))) 41 #define NN_RESULT_H_MAKE_MAX_HELPER(c) \ 42 static const s32 MAX_ ## c = NN_RESULT_H_MAKE_MAX(SIZE_ ## c) 43 NN_RESULT_H_MAKE_MAX_HELPER(LEGACY_DESCRIPTION); 44 NN_RESULT_H_MAKE_MAX_HELPER(LEGACY_SUMMARY); 45 NN_RESULT_H_MAKE_MAX_HELPER(LEGACY_LEVEL); 46 NN_RESULT_H_MAKE_MAX_HELPER(LEGACY_MODULE); 47 NN_RESULT_H_MAKE_MAX_HELPER(LEGACY_SIGNATURE); 48 #undef NN_RESULT_H_MAKE_MAX_HELPER 49 #undef NN_RESULT_H_MAKE_MAX 50 51 public: 52 enum LegacyLevelImpl 53 { 54 // Success. There is additional information. 55 LEVEL_INFO = 1, 56 // Fatal system level error. Software recovery is not possible. Jump to the support center guide sequence. 57 LEVEL_RESET = -4, 58 // Error that requires the module to be reinitialized. 59 LEVEL_REINIT = -5, 60 // Common error. You cannot try again. 61 LEVEL_PERMANENT = -6, 62 // Temporary failure. You can try again immediately with the same argument. Succeeds if the number of attempts is relatively low. 63 LEVEL_TEMPORARY = -7 64 }; 65 66 typedef int LegacyLevel; 67 68 /* 69 * @brief Enumeration type that indicates an overview of the errors. (Do not use this type for error handling.) 70 */ 71 enum Summary 72 { 73 SUMMARY_SUCCESS = 0, // Succeeded. 74 SUMMARY_NOTHING_HAPPENED = 1, // Nothing happened. 75 SUMMARY_WOULD_BLOCK = 2, // The process may be blocked. 76 SUMMARY_OUT_OF_RESOURCE = 3, // The resources needed for the process could not be allocated. 77 SUMMARY_NOT_FOUND = 4, // The object does not exist. 78 SUMMARY_INVALID_STATE = 5, // The requested process cannot be executed with the current internal state. 79 SUMMARY_NOT_SUPPORTED = 6, // Not currently supported by the SDK. 80 SUMMARY_INVALID_ARGUMENT = 7, // The argument is invalid. 81 SUMMARY_WRONG_ARGUMENT = 8, // A parameter other than the argument is invalid. 82 SUMMARY_CANCELLED = 9, // Process was canceled. 83 SUMMARY_STATUS_CHANGED = 10, // Status changed. (Example: Internal status changed while the process was running.) 84 SUMMARY_INTERNAL = 11, // Error that is used within the library. 85 86 SUMMARY_INVALID_RESULT_VALUE = MAX_LEGACY_SUMMARY // These values are not used. 87 }; 88 89 /* 90 * @brief Enumerated type that indicates the modules in which errors occurred. (Do not use this type for error handling.) 91 * 92 * The enumerated type definitions may change in the future. 93 * 94 * With the exception of <tt>MODULE_APPLICATION</tt>, these values are defined for use inside the SDK. Do not use. 95 */ 96 enum 97 { 98 MODULE_COMMON = 0, 99 MODULE_NN_KERNEL = 1, 100 MODULE_NN_UTIL, 101 MODULE_NN_FILE_SERVER, 102 MODULE_NN_LOADER_SERVER, 103 MODULE_NN_TCB, 104 MODULE_NN_OS, 105 MODULE_NN_DBG, 106 MODULE_NN_DMNT, 107 MODULE_NN_PDN, 108 MODULE_NN_GX, 109 MODULE_NN_I2C, 110 MODULE_NN_GPIO, 111 MODULE_NN_DD, 112 MODULE_NN_CODEC, 113 MODULE_NN_SPI, 114 MODULE_NN_PXI, 115 MODULE_NN_FS, 116 MODULE_NN_DI, 117 MODULE_NN_HID, 118 MODULE_NN_CAMERA, 119 MODULE_NN_PI, 120 MODULE_NN_PM, 121 MODULE_NN_PMLOW, 122 MODULE_NN_FSI, 123 MODULE_NN_SRV, 124 MODULE_NN_NDM, 125 MODULE_NN_NWM, 126 MODULE_NN_SOCKET, 127 MODULE_NN_LDR, 128 MODULE_NN_ACC, 129 MODULE_NN_ROMFS, 130 MODULE_NN_AM, 131 MODULE_NN_HIO, 132 MODULE_NN_UPDATER, 133 MODULE_NN_MIC, 134 MODULE_NN_FND, 135 MODULE_NN_MP, 136 MODULE_NN_MPWL, 137 MODULE_NN_AC, 138 MODULE_NN_HTTP, 139 MODULE_NN_DSP, 140 MODULE_NN_SND, 141 MODULE_NN_DLP, 142 MODULE_NN_HIOLOW, 143 MODULE_NN_CSND, 144 MODULE_NN_SSL, 145 MODULE_NN_AMLOW, 146 MODULE_NN_NEX, 147 MODULE_NN_FRIENDS, 148 MODULE_NN_RDT, 149 MODULE_NN_APPLET, 150 MODULE_NN_NIM, 151 MODULE_NN_PTM, 152 MODULE_NN_MIDI, 153 MODULE_NN_MC, 154 MODULE_NN_SWC, 155 MODULE_NN_FATFS, 156 MODULE_NN_NGC, 157 MODULE_NN_CARD, 158 MODULE_NN_CARDNOR, 159 MODULE_NN_SDMC, 160 MODULE_NN_BOSS, 161 MODULE_NN_DBM, 162 MODULE_NN_CFG, 163 MODULE_NN_PS, 164 MODULE_NN_CEC, 165 MODULE_NN_IR, 166 MODULE_NN_UDS, 167 MODULE_NN_PL, 168 MODULE_NN_CUP, 169 MODULE_NN_GYROSCOPE, 170 MODULE_NN_MCU, 171 MODULE_NN_NS, 172 MODULE_NN_NEWS, 173 MODULE_NN_RO, 174 MODULE_NN_GD, 175 MODULE_NN_CARDSPI, 176 MODULE_NN_EC, 177 MODULE_NN_WEBBRS, 178 MODULE_NN_TEST, 179 MODULE_NN_ENC, 180 MODULE_NN_PIA 181 }; 182 183 typedef s32 Module; 184 185 /* 186 * @brief Enumeration type that indicates the details of errors. (Do not use this type for error handling.) 187 * 188 * Negative values are common to all SDK libraries. Positive values are defined independently by each library. 189 */ 190 enum Description 191 { 192 DESCRIPTION_INVALID_SELECTION = MAX_LEGACY_DESCRIPTION - 23, // An invalid value was specified (when a specifiable value is discrete). 193 DESCRIPTION_TOO_LARGE = MAX_LEGACY_DESCRIPTION - 22, // The value is too large. 194 DESCRIPTION_NOT_AUTHORIZED = MAX_LEGACY_DESCRIPTION - 21, // Unauthorized operation. 195 DESCRIPTION_ALREADY_DONE = MAX_LEGACY_DESCRIPTION - 20, // The internal status has already been specified. 196 DESCRIPTION_INVALID_SIZE = MAX_LEGACY_DESCRIPTION - 19, // Invalid size. 197 DESCRIPTION_INVALID_ENUM_VALUE = MAX_LEGACY_DESCRIPTION - 18, // The value is outside the range for enum values. 198 DESCRIPTION_INVALID_COMBINATION = MAX_LEGACY_DESCRIPTION - 17, // Invalid parameter combination. 199 DESCRIPTION_NO_DATA = MAX_LEGACY_DESCRIPTION - 16, // No data. 200 DESCRIPTION_BUSY = MAX_LEGACY_DESCRIPTION - 15, // Could not be run because another process was already being performed. 201 DESCRIPTION_MISALIGNED_ADDRESS = MAX_LEGACY_DESCRIPTION - 14, // Invalid address alignment. 202 DESCRIPTION_MISALIGNED_SIZE = MAX_LEGACY_DESCRIPTION - 13, // Invalid size alignment. 203 DESCRIPTION_OUT_OF_MEMORY = MAX_LEGACY_DESCRIPTION - 12, // Insufficient memory. 204 DESCRIPTION_NOT_IMPLEMENTED = MAX_LEGACY_DESCRIPTION - 11, // Not yet implemented. 205 DESCRIPTION_INVALID_ADDRESS = MAX_LEGACY_DESCRIPTION - 10, // Invalid address. 206 DESCRIPTION_INVALID_POINTER = MAX_LEGACY_DESCRIPTION - 9, // Invalid pointer. 207 DESCRIPTION_INVALID_HANDLE = MAX_LEGACY_DESCRIPTION - 8, // Invalid handle. 208 DESCRIPTION_NOT_INITIALIZED = MAX_LEGACY_DESCRIPTION - 7, // Not initialized. 209 DESCRIPTION_ALREADY_INITIALIZED = MAX_LEGACY_DESCRIPTION - 6, // Already initialized. 210 DESCRIPTION_NOT_FOUND = MAX_LEGACY_DESCRIPTION - 5, // The object does not exist. 211 DESCRIPTION_CANCEL_REQUESTED = MAX_LEGACY_DESCRIPTION - 4, // Request canceled. 212 DESCRIPTION_ALREADY_EXISTS = MAX_LEGACY_DESCRIPTION - 3, // The object already exists. 213 DESCRIPTION_OUT_OF_RANGE = MAX_LEGACY_DESCRIPTION - 2, // The value is outside of the defined range. 214 DESCRIPTION_TIMEOUT = MAX_LEGACY_DESCRIPTION - 1 // The process timed out. 215 }; 216 217 private: 218 219 static const u32 LEGACY_SIGNATURE = 0x3; 220 MakeLevelFromLegacyLevel(LegacyLevel legacyLevel)221 static Level MakeLevelFromLegacyLevel(LegacyLevel legacyLevel) 222 { 223 switch(legacyLevel) 224 { 225 case LEVEL_INFO: 226 return LEVEL_SUCCESS; 227 case LEVEL_RESET: 228 case LEVEL_REINIT: 229 case LEVEL_PERMANENT: 230 return LEVEL_FATAL; 231 case LEVEL_TEMPORARY: 232 return LEVEL_STATUS; 233 } 234 return static_cast<Level>(legacyLevel); 235 } 236 237 template <Result::LegacyLevel TLegacyLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> 238 class TemplateMakeLegacyResult 239 { 240 private: 241 static const s32 Level = 242 TLegacyLevel == LEVEL_INFO ? LEVEL_SUCCESS : 243 TLegacyLevel == LEVEL_RESET ? LEVEL_FATAL : 244 TLegacyLevel == LEVEL_REINIT ? LEVEL_FATAL : 245 TLegacyLevel == LEVEL_PERMANENT ? LEVEL_FATAL : 246 TLegacyLevel == LEVEL_TEMPORARY ? LEVEL_STATUS : 247 TLegacyLevel; 248 249 public: 250 static const bit32 Value = 251 static_cast<bit32>( 252 ((static_cast<bit32>(Level) << SHIFTS_LEVEL) & MASK_LEVEL) | 253 ((static_cast<bit32>(LEGACY_SIGNATURE) << SHIFTS_LEGACY_SIGNATURE) & MASK_LEGACY_SIGNATURE) | 254 ((static_cast<bit32>(TModule) << SHIFTS_LEGACY_MODULE) & MASK_LEGACY_MODULE) | 255 ((static_cast<bit32>(TLegacyLevel) << SHIFTS_LEGACY_LEVEL) & MASK_LEGACY_LEVEL) | 256 ((static_cast<bit32>(TSummary) << SHIFTS_LEGACY_SUMMARY) & MASK_LEGACY_SUMMARY) | 257 ((static_cast<bit32>(TDescription) << SHIFTS_LEGACY_DESCRIPTION) & MASK_LEGACY_DESCRIPTION) 258 ); 259 }; 260 MakeLegacyResultValue(LegacyLevel legacyLevel,Summary summary,Module module,int description)261 static bit32 MakeLegacyResultValue(LegacyLevel legacyLevel, Summary summary, Module module, int description) 262 { 263 return static_cast<bit32>( 264 ((MakeLevelFromLegacyLevel(legacyLevel) << SHIFTS_LEVEL) & MASK_LEVEL) | 265 ((static_cast<bit32>(LEGACY_SIGNATURE) << SHIFTS_LEGACY_SIGNATURE) & MASK_LEGACY_SIGNATURE) | 266 ((static_cast<bit32>(module) << SHIFTS_LEGACY_MODULE) & MASK_LEGACY_MODULE) | 267 ((static_cast<bit32>(legacyLevel) << SHIFTS_LEGACY_LEVEL) & MASK_LEGACY_LEVEL) | 268 ((static_cast<bit32>(summary) << SHIFTS_LEGACY_SUMMARY) & MASK_LEGACY_SUMMARY) | 269 ((static_cast<bit32>(description) << SHIFTS_LEGACY_DESCRIPTION) & MASK_LEGACY_DESCRIPTION) 270 ); 271 } 272 GetLegacyLevel()273 LegacyLevel GetLegacyLevel() const 274 { 275 return static_cast<LegacyLevel>(GetCodeBits(MASK_LEGACY_LEVEL, SHIFTS_LEGACY_LEVEL)); 276 } 277 GetLegacyModule()278 Module GetLegacyModule() const 279 { 280 return static_cast<Module>(GetCodeBits(MASK_LEGACY_MODULE, SHIFTS_LEGACY_MODULE)); 281 } 282 GetLegacySummary()283 Summary GetLegacySummary() const 284 { 285 return static_cast<Summary>(GetCodeBits(MASK_LEGACY_SUMMARY, SHIFTS_LEGACY_SUMMARY)); 286 } 287 GetLegacyDescription()288 int GetLegacyDescription() const 289 { 290 return static_cast<int>(GetCodeBits(MASK_LEGACY_DESCRIPTION, SHIFTS_LEGACY_DESCRIPTION)); 291 } 292 293 public: Result(int legacyLevel,int summary,int module,int description)294 Result(int legacyLevel, int summary, int module, int description) 295 : m_Code( MakeLegacyResultValue(legacyLevel, static_cast<Summary>(summary), static_cast<Module>(module), description) ) 296 { } 297 298 template <Result::LegacyLevel TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const; 299 template <Result::LegacyLevel TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const; 300 301 template <Result::LegacyLevel TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM; 302 template <Result::LegacyLevel TLevel, Result::Module TModule> struct Const_LM; 303 template <Result::LegacyLevel TLevel, Result::Summary TSummary> struct Const_LS; 304 template <Result::LegacyLevel TLevel> struct Const_L; 305 IsLegacy()306 bool IsLegacy() const 307 { 308 return GetCodeBits(MASK_LEGACY_SIGNATURE, SHIFTS_LEGACY_SIGNATURE) == LEGACY_SIGNATURE; 309 } 310 GetSummary()311 int GetSummary() const 312 { 313 if (IsLegacy()) 314 return GetLegacySummary(); 315 return 0; 316 } 317