1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_MemoryBlock.h
4 
5   Copyright (C)2009 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: 38846 $
14  *---------------------------------------------------------------------------*/
15 
16 /* Please see man pages for details
17 
18 
19 
20 */
21 
22 #ifndef NN_OS_OS_MEMORYBLOCK_H_
23 #define NN_OS_OS_MEMORYBLOCK_H_
24 
25 #include <nn/config.h>
26 #if NN_PLATFORM_HAS_MMU
27 
28 #include <nn/types.h>
29 #include <nn/Handle.h>
30 #include <nn/svc.h>
31 #include <nn/os/CTR/os_MemoryConfig.h>
32 #include <nn/os/os_MemoryBlockBase.h>
33 
34 #ifdef __cplusplus
35 
36 #include <nn/util/util_NonCopyable.h>
37 #include <nn/os/os_SvcTypes.autogen.h>
38 #include <nn/util/util_Result.h>
39 
40 namespace nn{ namespace os{
41 
42     class MemoryBlock;
43 
44     namespace detail
45     {
46         uptr AllocateFromMemoryBlockSpace(MemoryBlockBase* p, size_t s);
47         void FreeToMemoryBlockSpace(MemoryBlockBase* p);
48         void Switch(MemoryBlock* pTo, MemoryBlock* pFrom);
49 
50         bool IsMemoryBlockEnabled();
51     }
52 
53 
54 /* Please see man pages for details
55 
56 
57 
58 
59 
60 
61 
62 */
63 class MemoryBlock : public MemoryBlockBase
64 {
65 public:
66     /* Please see man pages for details
67 
68 
69 
70 
71 
72     */
MemoryBlock()73     MemoryBlock() {}
74 
75     /* Please see man pages for details
76 
77 
78 
79 
80 
81 
82 
83 
84     */
MemoryBlock(size_t size)85     explicit MemoryBlock(size_t size) { Initialize(size); }
86 
87     /* Please see man pages for details
88 
89 
90 
91 
92 
93 
94 
95     */
96     void Initialize(size_t size);
97 
98     /* Please see man pages for details
99 
100 
101 
102 
103     */
~MemoryBlock()104     ~MemoryBlock() { Finalize(); }
105 
106     /* Please see man pages for details
107 
108     */
109     void Finalize();
110 
111     /* Please see man pages for details
112 
113 
114 
115     */
116     void SetReadOnly(bool readOnly = true);
117 
GetPageAlignedSize(size_t size)118     static size_t GetPageAlignedSize(size_t size) { return (size + NN_OS_MEMORY_PAGE_SIZE - 1) & ~(NN_OS_MEMORY_PAGE_SIZE - 1); }
119 };
120 
121 /*
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141  */
142 void InitializeMemoryBlock(uptr begin, size_t size);
143 
144 
145 }} // namespace nn::os
146 
147 #endif // __cplusplus
148 
149 // Below is the C declaration
150 
151 #include <nn/util/detail/util_CLibImpl.h>
152 
153 /* Please see man pages for details
154 
155 
156 
157 
158 
159 
160 
161 
162 */
163 
164 /* Please see man pages for details
165 
166 
167 
168 
169 */
170 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosMemoryBlock, nn::os::MemoryBlock, 20, u32);
171 
172 /* Please see man pages for details
173 
174 */
175 NN_EXTERN_C void nnosMemoryBlockAllocate(nnosMemoryBlock* p, size_t size);
176 
177 /* Please see man pages for details
178 
179 */
180 NN_EXTERN_C void nnosMemoryBlockSetReadOnly(nnosMemoryBlock* p, bool readOnly);
181 
182 /*
183 
184 */
185 NN_EXTERN_C void nnosMemoryBlockFree(nnosMemoryBlock* p);
186 
187 /* Please see man pages for details
188 
189 */
190 NN_EXTERN_C uptr nnosMemoryBlockGetAddress(nnosMemoryBlock* p);
191 
192 /* Please see man pages for details
193 
194 */
195 NN_EXTERN_C size_t nnosMemoryBlockGetSize(nnosMemoryBlock* p);
196 
197 /* Please see man pages for details
198 
199 */
200 NN_EXTERN_C bool nnosMemoryBlockIsReadOnly(nnosMemoryBlock* p);
201 
202 /*
203 
204 
205 
206 */
207 
208 #endif  // if NN_PLATFORM_HAS_MMU
209 #endif /* NN_OS_OS_MEMORYBLOCK_H_ */
210