1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: Result.h
4
5 Copyright (C)2009-2012 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 46347 $
14 *---------------------------------------------------------------------------*/
15
16 /* Please see man pages for details
17
18
19
20
21 */
22
23 #ifndef NN_RESULT_H_
24 #define NN_RESULT_H_
25
26 #include <nn/types.h>
27
28 //-------------------------------------------------------------------
29 // for C / C++
30
31 /* Please see man pages for details
32
33
34 */
35
36 /* Please see man pages for details
37
38
39
40
41
42 */
43
44
45 #ifdef __cplusplus
46 extern "C" {
47 #endif // ifdef __cplusplus
48
49 /* Please see man pages for details
50
51 */
52 typedef struct nnResult
53 {
54 bit32 value;
55 }
56 nnResult;
57
58 #ifdef __cplusplus
59 }
60 #endif // ifdef __cplusplus
61
62 /*
63
64 */
65 /*
66
67 */
68
69
70 //-------------------------------------------------------------------
71 // for C++
72
73 #ifdef __cplusplus
74
75 namespace nn {
76
77 /* Please see man pages for details
78
79 */
80
81 class Result
82 {
83 private:
84 static const bit32 MASK_FAIL_BIT = 0x80000000u; // Most Significant Bit
85
86 static const s32 SIZE_DESCRIPTION = 10;
87 static const s32 SIZE_MODULE = 8;
88 static const s32 SIZE_RESERVE = 3;
89 static const s32 SIZE_SUMMARY = 6;
90 static const s32 SIZE_LEVEL = 5;
91
92 static const s32 SHIFTS_DESCRIPTION = 0;
93 static const s32 SHIFTS_MODULE = SHIFTS_DESCRIPTION + SIZE_DESCRIPTION;
94 static const s32 SHIFTS_RESERVE = SHIFTS_MODULE + SIZE_MODULE;
95 static const s32 SHIFTS_SUMMARY = SHIFTS_RESERVE + SIZE_RESERVE;
96 static const s32 SHIFTS_LEVEL = SHIFTS_SUMMARY + SIZE_SUMMARY;
97 //NN_STATIC_ASSERT( SHIFTS_LEVEL + SIZE_LEVEL == 32 );
98
99 static const bit32 MASK_NEGATIVE_LEVEL = (~0u) << SIZE_LEVEL;
100
101 #define NN_RESULT_H_MAKE_MASK(size, shift) (((~0u) >> (32 - (size))) << (shift))
102 #define NN_RESULT_H_MAKE_MASK_HELPER(c) \
103 static const bit32 MASK_ ## c = NN_RESULT_H_MAKE_MASK(SIZE_ ## c, SHIFTS_ ## c)
104 NN_RESULT_H_MAKE_MASK_HELPER(DESCRIPTION);
105 NN_RESULT_H_MAKE_MASK_HELPER(MODULE);
106 NN_RESULT_H_MAKE_MASK_HELPER(SUMMARY);
107 NN_RESULT_H_MAKE_MASK_HELPER(LEVEL);
108 #undef NN_RESULT_H_MAKE_MASK_HELPER
109 #undef NN_RESULT_H_MAKE_MASK
110
111 #define NN_RESULT_H_MAKE_MAX(size) ((~0u) >> (32 - (size)))
112 #define NN_RESULT_H_MAKE_MAX_HELPER(c) \
113 static const s32 MAX_ ## c = NN_RESULT_H_MAKE_MAX(SIZE_ ## c)
114 NN_RESULT_H_MAKE_MAX_HELPER(DESCRIPTION);
115 NN_RESULT_H_MAKE_MAX_HELPER(MODULE);
116 NN_RESULT_H_MAKE_MAX_HELPER(SUMMARY);
117 NN_RESULT_H_MAKE_MAX_HELPER(LEVEL);
118 #undef NN_RESULT_H_MAKE_MAX_HELPER
119 #undef NN_RESULT_H_MAKE_MAX
120
121 public:
122 /* Please see man pages for details
123
124 */
125 enum Level
126 {
127 //
128 LEVEL_INFO = 1,
129 //
130 LEVEL_SUCCESS = 0,
131 //
132 LEVEL_FATAL = -1,
133 //
134 LEVEL_RESET = -2,
135 //
136 LEVEL_REINIT = -3,
137 //
138 LEVEL_USAGE = -4,
139 //
140 LEVEL_PERMANENT = -5,
141 //
142 LEVEL_TEMPORARY = -6,
143 //
144 LEVEL_STATUS = -7,
145 //
146 LEVEL_END
147 };
148
149 /* Please see man pages for details
150
151 */
152 enum Summary
153 {
154 SUMMARY_SUCCESS = 0, //
155 SUMMARY_NOTHING_HAPPENED = 1, //
156 SUMMARY_WOULD_BLOCK = 2, //
157 SUMMARY_OUT_OF_RESOURCE = 3, //
158 SUMMARY_NOT_FOUND = 4, //
159 SUMMARY_INVALID_STATE = 5, //
160 SUMMARY_NOT_SUPPORTED = 6, //
161 SUMMARY_INVALID_ARGUMENT = 7, //
162 SUMMARY_WRONG_ARGUMENT = 8, //
163 SUMMARY_CANCELLED = 9, //
164 SUMMARY_STATUS_CHANGED = 10, //
165 SUMMARY_INTERNAL = 11, //
166
167 SUMMARY_INVALID_RESULT_VALUE = MAX_SUMMARY //
168 };
169
170 /* Please see man pages for details
171
172
173
174
175
176 */
177 enum Module
178 {
179 MODULE_COMMON = 0,
180 MODULE_NN_KERNEL = 1,
181 MODULE_NN_UTIL,
182 MODULE_NN_FILE_SERVER,
183 MODULE_NN_LOADER_SERVER,
184 MODULE_NN_TCB,
185 MODULE_NN_OS,
186 MODULE_NN_DBG,
187 MODULE_NN_DMNT,
188 MODULE_NN_PDN,
189 MODULE_NN_GX,
190 MODULE_NN_I2C,
191 MODULE_NN_GPIO,
192 MODULE_NN_DD,
193 MODULE_NN_CODEC,
194 MODULE_NN_SPI,
195 MODULE_NN_PXI,
196 MODULE_NN_FS,
197 MODULE_NN_DI,
198 MODULE_NN_HID,
199 MODULE_NN_CAMERA,
200 MODULE_NN_PI,
201 MODULE_NN_PM,
202 MODULE_NN_PMLOW,
203 MODULE_NN_FSI,
204 MODULE_NN_SRV,
205 MODULE_NN_NDM,
206 MODULE_NN_NWM,
207 MODULE_NN_SOCKET,
208 MODULE_NN_LDR,
209 MODULE_NN_ACC,
210 MODULE_NN_ROMFS,
211 MODULE_NN_AM,
212 MODULE_NN_HIO,
213 MODULE_NN_UPDATER,
214 MODULE_NN_MIC,
215 MODULE_NN_FND,
216 MODULE_NN_MP,
217 MODULE_NN_MPWL,
218 MODULE_NN_AC,
219 MODULE_NN_HTTP,
220 MODULE_NN_DSP,
221 MODULE_NN_SND,
222 MODULE_NN_DLP,
223 MODULE_NN_HIOLOW,
224 MODULE_NN_CSND,
225 MODULE_NN_SSL,
226 MODULE_NN_AMLOW,
227 MODULE_NN_NEX,
228 MODULE_NN_FRIENDS,
229 MODULE_NN_RDT,
230 MODULE_NN_APPLET,
231 MODULE_NN_NIM,
232 MODULE_NN_PTM,
233 MODULE_NN_MIDI,
234 MODULE_NN_MC,
235 MODULE_NN_SWC,
236 MODULE_NN_FATFS,
237 MODULE_NN_NGC,
238 MODULE_NN_CARD,
239 MODULE_NN_CARDNOR,
240 MODULE_NN_SDMC,
241 MODULE_NN_BOSS,
242 MODULE_NN_DBM,
243 MODULE_NN_CFG,
244 MODULE_NN_PS,
245 MODULE_NN_CEC,
246 MODULE_NN_IR,
247 MODULE_NN_UDS,
248 MODULE_NN_PL,
249 MODULE_NN_CUP,
250 MODULE_NN_GYROSCOPE,
251 MODULE_NN_MCU,
252 MODULE_NN_NS,
253 MODULE_NN_NEWS,
254 MODULE_NN_RO,
255 MODULE_NN_GD,
256 MODULE_NN_CARDSPI,
257 MODULE_NN_EC,
258 MODULE_NN_WEBBRS,
259 MODULE_NN_TEST,
260 MODULE_NN_ENC,
261 MODULE_NN_PIA,
262
263 MODULE_APPLICATION = MAX_MODULE - 1, //
264
265 MODULE_INVALID_RESULT_VALUE = MAX_MODULE //
266 };
267
268 /* Please see man pages for details
269
270
271
272 */
273 enum Description
274 {
275 DESCRIPTION_SUCCESS = 0, //
276
277 DESCRIPTION_INVALID_SELECTION = MAX_DESCRIPTION - 23, //
278 DESCRIPTION_TOO_LARGE = MAX_DESCRIPTION - 22, //
279 DESCRIPTION_NOT_AUTHORIZED = MAX_DESCRIPTION - 21, //
280 DESCRIPTION_ALREADY_DONE = MAX_DESCRIPTION - 20, //
281 DESCRIPTION_INVALID_SIZE = MAX_DESCRIPTION - 19, //
282 DESCRIPTION_INVALID_ENUM_VALUE = MAX_DESCRIPTION - 18, //
283 DESCRIPTION_INVALID_COMBINATION = MAX_DESCRIPTION - 17, //
284 DESCRIPTION_NO_DATA = MAX_DESCRIPTION - 16, //
285 DESCRIPTION_BUSY = MAX_DESCRIPTION - 15, //
286 DESCRIPTION_MISALIGNED_ADDRESS = MAX_DESCRIPTION - 14, //
287 DESCRIPTION_MISALIGNED_SIZE = MAX_DESCRIPTION - 13, //
288 DESCRIPTION_OUT_OF_MEMORY = MAX_DESCRIPTION - 12, //
289 DESCRIPTION_NOT_IMPLEMENTED = MAX_DESCRIPTION - 11, //
290 DESCRIPTION_INVALID_ADDRESS = MAX_DESCRIPTION - 10, //
291 DESCRIPTION_INVALID_POINTER = MAX_DESCRIPTION - 9, //
292 DESCRIPTION_INVALID_HANDLE = MAX_DESCRIPTION - 8, //
293 DESCRIPTION_NOT_INITIALIZED = MAX_DESCRIPTION - 7, //
294 DESCRIPTION_ALREADY_INITIALIZED = MAX_DESCRIPTION - 6, //
295 DESCRIPTION_NOT_FOUND = MAX_DESCRIPTION - 5, //
296 DESCRIPTION_CANCEL_REQUESTED = MAX_DESCRIPTION - 4, //
297 DESCRIPTION_ALREADY_EXISTS = MAX_DESCRIPTION - 3, //
298 DESCRIPTION_OUT_OF_RANGE = MAX_DESCRIPTION - 2, //
299 DESCRIPTION_TIMEOUT = MAX_DESCRIPTION - 1, //
300 DESCRIPTION_INVALID_RESULT_VALUE = MAX_DESCRIPTION - 0 //
301 };
302
303 private:
304
305 bit32 m_Code;
306
307 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const;
308 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> friend struct ConstRange;
Result(bit32 code)309 explicit Result(bit32 code) : m_Code(code) {}
310
311 public:
Result()312 Result()
313 : m_Code( static_cast<bit32>(
314 ((static_cast<bit32>(LEVEL_USAGE) << SHIFTS_LEVEL) & MASK_LEVEL) |
315 ((SUMMARY_INVALID_RESULT_VALUE << SHIFTS_SUMMARY) & MASK_SUMMARY) |
316 ((MODULE_INVALID_RESULT_VALUE << SHIFTS_MODULE) & MASK_MODULE) |
317 ((DESCRIPTION_INVALID_RESULT_VALUE << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
318 {
319 }
320
Result(Level level,Summary summary,Module module,int description)321 Result(Level level, Summary summary, Module module, int description)
322 : m_Code( static_cast<bit32>(
323 ((level << SHIFTS_LEVEL) & MASK_LEVEL) |
324 ((summary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
325 ((module << SHIFTS_MODULE) & MASK_MODULE) |
326 ((description << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
327 {
328 }
329
Result(nnResult result)330 Result(nnResult result) : m_Code(result.value) {}
331 /* Please see man pages for details
332
333
334 */
335 /* Please see man pages for details
336
337 */
IsFailure()338 bool IsFailure() const
339 {
340 return (m_Code & MASK_FAIL_BIT) != 0;
341 }
342
343 /* Please see man pages for details
344
345 */
IsSuccess()346 bool IsSuccess() const
347 {
348 return !IsFailure();
349 }
350 /*
351
352 */
353 /* Please see man pages for details
354
355
356
357
358 */
GetLevel()359 Level GetLevel() const
360 {
361 // TODO: Should create a platform-dependent arithmetic shift inline function and call it
362 if(m_Code & MASK_FAIL_BIT)
363 {
364 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) | MASK_NEGATIVE_LEVEL);
365 }
366 else
367 {
368 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) );
369 }
370 }
371
372 /* Please see man pages for details
373
374
375
376
377 */
GetSummary()378 Summary GetSummary() const
379 {
380 return static_cast<Summary>( GetCodeBits(MASK_SUMMARY, SHIFTS_SUMMARY) );
381 }
382
383 /* Please see man pages for details
384
385
386
387
388 */
GetModule()389 Module GetModule() const
390 {
391 return static_cast<Module>( GetCodeBits(MASK_MODULE, SHIFTS_MODULE) );
392 }
393
394 /* Please see man pages for details
395
396
397
398
399 */
GetDescription()400 int GetDescription() const
401 {
402 return static_cast<int>( GetCodeBits(MASK_DESCRIPTION, SHIFTS_DESCRIPTION) );
403 }
404
GetValue()405 bit32 GetValue() const { return m_Code; }
406 /* Please see man pages for details
407
408
409 */
410 /* Please see man pages for details
411
412
413
414 */
GetPrintableBits()415 bit32 GetPrintableBits() const { return m_Code; }
416
nnResult()417 operator nnResult() const
418 {
419 nnResult r = {m_Code};
420 return r;
421 }
422 /*
423
424 */
425 /* Please see man pages for details
426
427
428 */
429 /* Please see man pages for details
430
431
432
433
434
435
436
437 */
438 bool operator ==(const Result& rhs) const { return this->m_Code == rhs.m_Code; }
439
440 /* Please see man pages for details
441
442
443
444
445
446
447
448 */
449 bool operator !=(const Result& rhs) const { return this->m_Code != rhs.m_Code; }
450 /*
451
452 */
453 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const;
454 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> struct ConstRange;
455 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM;
456 template <Result::Level TLevel, Result::Module TModule> struct Const_LM;
457 template <Result::Level TLevel> struct Const_L;
458
459 private:
GetCodeBits(bit32 mask,s32 shift)460 bit32 GetCodeBits(bit32 mask, s32 shift) const
461 {
462 return ((m_Code & mask) >> shift);
463 }
464
465 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
466 bool operator==(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
467 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
468 bool operator!=(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
469 };
470
471 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
472 struct Result::Const : public Result
473 {
474 static const Result::Level Level = TLevel;
475 static const Result::Summary Summary = TSummary;
476 static const Result::Module Module = TModule;
477 static const int Description = TDescription;
478
479 static const bit32 Value = static_cast<bit32>(
480 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
481 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
482 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
483 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
484
ConstConst485 Const() : Result(Value) {}
486
IncludesConst487 static bool Includes(Result result)
488 {
489 return result.GetModule() == TModule && result.GetDescription() == TDescription;
490 }
491 };
492
493 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
494 struct Result::ConstRange : public Result
495 {
496 static const Result::Level Level = TLevel;
497 static const Result::Summary Summary = TSummary;
498 static const Result::Module Module = TModule;
499 static const int Description = TDescription;
500 static const int DescriptionMin = TDescriptionMin;
501 static const int DescriptionMax = TDescriptionMax;
502
503 static const bit32 Value = static_cast<bit32>(
504 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
505 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
506 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
507 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
508
ConstRangeConstRange509 ConstRange() : Result(Value) {}
510
IncludesConstRange511 static bool Includes(Result result)
512 {
513 return result.GetModule() == TModule && (TDescriptionMin <= result.GetDescription() && result.GetDescription() <= TDescriptionMax);
514 }
515
516 friend bool operator<=(Result lhs, ConstRange) { return ConstRange::Includes(lhs); }
517 friend bool operator>=(ConstRange, Result rhs) { return ConstRange::Includes(rhs); }
518 private:
519 bool operator==(Result) const;
520 bool operator!=(Result) const;
521 };
522
523 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule>
524 struct Result::Const_LSM : public Result
525 {
526 static const Result::Level Level = TLevel;
527 static const Result::Summary Summary = TSummary;
528 static const Result::Module Module = TModule;
529
530 template <int TDescription>
531 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
532
Const_LSMConst_LSM533 Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
534 };
535
536 template <Result::Level TLevel, Result::Module TModule>
537 struct Result::Const_LM : public Result
538 {
539 static const Result::Level Level = TLevel;
540 static const Result::Module Module = TModule;
541
542 template <Result::Summary TSummary, int TDescription>
543 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
544
Const_LMConst_LM545 Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
546 };
547
548 template <Result::Level TLevel>
549 struct Result::Const_L : public Result
550 {
551 static const Result::Level Level = TLevel;
552
553 template <Result::Summary TSummary, Result::Module TModule, int TDescription>
554 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
555
Const_LConst_L556 Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
557 };
558
559 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
560 typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
561
562 #define NN_DEFINE_RESULT_CONST_RANGE(name, level, summary, module, description, descriptionMin, descriptionMax) \
563 typedef ::nn::Result::ConstRange<(level), (summary), (module), (description), (descriptionMin), (descriptionMax)> name
564
565 NN_DEFINE_RESULT_CONST(ResultSuccess, Result::LEVEL_SUCCESS, Result::SUMMARY_SUCCESS, Result::MODULE_COMMON, Result::DESCRIPTION_SUCCESS);
566
567 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
568 typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
569
570 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
571 typedef f::Const<(description)> name
572
573 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
574 typedef ::nn::Result::Const_LM<(level), (module)> name
575
576 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
577 typedef f::Const<(summary), (description)> name
578
579 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
580 typedef ::nn::Result::Const_L<(level)> name
581
582 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
583 typedef f::Const<(summary), (module), (description)> name
584
MakeInfoResult(Result::Summary summary,Result::Module module,int description)585 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
586 { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)587 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
588 { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)589 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
590 { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)591 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
592 { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)593 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
594 { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)595 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
596 { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)597 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
598 { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)599 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
600 { return Result(Result::LEVEL_STATUS, summary, module, description); }
601
602 }
603
604
605 #endif // __cplusplus
606
607 #endif /* NN_RESULT_H_ */
608