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