1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: crt0.cpp
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 #include <nn/types.h>
17 #include <nn/os/os_MemoryMapSelect.h>
18 #include <nn/init/init_StartUp.h>
19 #include <rt_sys.h>
20 #include <rt_locale.h>
21 #include <nn/os/os_SharedInfo.h>
22 #include <nn/svc.h>
23 #include <nn/assert.h>
24 #include <nn/version.h>
25 #include <nn/middleware.h>
26
27 namespace
28 {
29 #if defined(NN_BUILD_NOOPT) || defined(NN_BUILD_VERBOSE)
30 NN_DEFINE_MIDDLEWARE(s_DebugIndicator, "NINTENDO", "DEBUG");
31 #endif
32
33 NN_DEFINE_MIDDLEWARE(s_SdkVersion, "NINTENDO", NN_CURRENT_SDK_VERSION);
34 NN_DEFINE_MIDDLEWARE(s_FirmwareVersion, "NINTENDO", NN_CURRENT_FIRMWARE_VERSION);
35 }
36
37
38 extern "C" void nninitLocale();
39 extern "C" void nninitRegion();
40
41 extern "C" NN_WEAK_SYMBOL void __cpp_initialize__aeabi_(void);
42 extern "C" bit32* __rt_locale(void);
43 extern "C" void _fp_init(void);
44
45 extern "C" bit8 Image$$ZI$$ZI$$Base[];
46 extern "C" bit8 Image$$ZI$$ZI$$Limit[];
47
48 #include <nn/hw/ARM/code32.h>
__ctr_start(void)49 extern "C" asm void __ctr_start( void )
50 {
51 PRESERVE8
52
53 // Initialization of the ZI region
54 bl __cpp(nninitRegion)
55 bl __cpp(nninitLocale)
56
57 // Initialization
58 blx __cpp(nninitSystem)
59 blx __cpp(nninitStartUp)
60
61 // Calls the C++ static initializer
62 blx __cpp(__cpp_initialize__aeabi_)
63 // Calls the C static initializer
64 blx __cpp(nninitCallStaticInitializers)
65
66 // Library setup
67 blx __cpp(nninitSetup)
68
69 //---- Start (to 16-bit code)
70 blx __cpp(nnMain)
71
72 terminate
73 b __cpp(nn::svc::ExitProcess)
74 }
75 #include <nn/hw/ARM/codereset.h>
76
77
78
nninitLocale()79 extern "C" void nninitLocale()
80 {
81 #if defined(NN_BUILD_NOOPT) || defined(NN_BUILD_VERBOSE)
82 NN_UTIL_REFER_SYMBOL(s_DebugIndicator);
83 #endif
84 NN_UTIL_REFER_SYMBOL(s_SdkVersion);
85 NN_UTIL_REFER_SYMBOL(s_FirmwareVersion);
86
87 bit32* p = __rt_locale();
88 *(p + 1) = (bit32)_get_lc_ctype(0, 0) + 1;
89 *(p + 3) = (bit32)_get_lc_numeric(0, 0);
90 }
91
92 #include <nn/hw/ARM/code32.h>
nninitRegion(void)93 extern "C" asm void nninitRegion(void)
94 {
95 ldr r0, =__cpp(Image$$ZI$$ZI$$Base)
96 ldr r1, =__cpp(Image$$ZI$$ZI$$Limit)
97 mov r2, #0
98 loop
99 cmp r0, r1
100 strcc r2, [r0], #4
101 bcc loop
102 bx lr
103 }
104 #include <nn/hw/ARM/codereset.h>
105
106
107
108
109