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: 24156 $
14  *---------------------------------------------------------------------------*/
15 
16 /*! @file
17     @brief    OS からメモリを確保するための API の宣言
18 
19     :include nn/os.h
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 /*!
55     @brief ヒープ上の指定された領域内からメモリを確保するクラスです。
56 
57     このクラスを使用する前にあらかじめ @ref InitializeMemoryBlock を呼んでおく必要があります。
58 
59 */
60 class MemoryBlock : public MemoryBlockBase
61 {
62 public:
63     /*!
64         :overload notinit
65 
66         @brief オブジェクトを構築します。
67 
68                引数を指定しない場合は初期化を行いません。別途 @ref Initialize を呼び出す必要があります。
69     */
MemoryBlock()70     MemoryBlock() {}
71 
72     /*!
73         :overload init
74 
75         @brief オブジェクトを構築し、メモリを確保します。
76 
77                内部で Initialize を呼び出すためメモリの確保も行います。
78 
79         @param[in] size 確保するメモリのサイズ
80                         size は 4096 の倍数でなければなりません。
81     */
MemoryBlock(size_t size)82     explicit MemoryBlock(size_t size) { Initialize(size); }
83 
84     /*!
85         @brief メモリを確保します。
86 
87         InitializeMemoryBlock で指定した領域のうち、未使用の領域から
88         size 分の領域を確保します。
89 
90         @param[in] size 確保するメモリのサイズ
91                         size は 4096 の倍数でなければなりません。
92     */
93     void Initialize(size_t size);
94 
95     /*!
96         @brief オブジェクトを破棄します。
97 
98         メモリの解放が行われていない場合は
99         メモリの解放も行います。
100     */
~MemoryBlock()101     ~MemoryBlock() { Finalize(); }
102 
103     /*!
104         @brief メモリを解放します。
105     */
106     void Finalize();
107 
108     /*!
109          @brief 読み込み専用属性を設定します。
110 
111          @param[in] readOnly 読み込み専用かどうか
112     */
113     void SetReadOnly(bool readOnly = true);
114 
GetPageAlignedSize(size_t size)115     static size_t GetPageAlignedSize(size_t size) { return (size + NN_OS_MEMORY_PAGE_SIZE - 1) & ~(NN_OS_MEMORY_PAGE_SIZE - 1); }
116 };
117 
118 /*!--------------------------------------------------------------------------*
119   @brief        MemoryBlock クラスおよび StackMemoryBlock クラスを
120                 使用できるようにします。
121 
122                 MemoryBlock クラスおよび StackMemoryBlock クラスを
123                 構築する前に、これらのクラスが管理するメモリ領域を
124                 指定する必要があります。
125                 これらのクラスは
126                 @arg begin および @arg size で指定された領域から
127                 メモリを割り当てていきます。
128 
129 
130   @param[in]    begin   MemoryBlock クラスおよび StackMemoryBlock クラスで
131                         管理するメモリ領域の先頭アドレスを指定します。
132   @param[in]    size    MemoryBlock クラスおよび StackMemoryBlock クラスで
133                         管理するメモリ領域のサイズを指定します。
134                         size は 4096 の倍数でなければなりません。
135 
136   @return
137 
138  *---------------------------------------------------------------------------*/
139 void InitializeMemoryBlock(uptr begin, size_t size);
140 
141 
142 }} // namespace nn::os
143 
144 #endif // __cplusplus
145 
146 // 以下、C 用宣言
147 
148 #include <nn/util/detail/util_CLibImpl.h>
149 
150 /*!
151   @addtogroup   nn_os               os
152   @{
153 
154   @defgroup     nn_os_MemoryBlock_c       MemoryBlock (C)
155 
156   @brief        @ref nn::os::MemoryBlock の C インタフェースモジュールです。
157 
158   @{
159 */
160 
161 /*!
162   @struct       nnosMemoryBlock
163   @brief        メモリブロックを表す C の構造体です。
164 
165   @brief 対応するクラス @ref nn::os::MemoryBlock を参照してください。
166 */
167 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosMemoryBlock, nn::os::MemoryBlock, 20, u32);
168 
169 /*!
170   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::Initialize を参照してください。
171 */
172 NN_EXTERN_C void nnosMemoryBlockAllocate(nnosMemoryBlock* p, size_t size);
173 
174 /*!
175   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::SetReadOnly を参照してください。
176 */
177 NN_EXTERN_C void nnosMemoryBlockSetReadOnly(nnosMemoryBlock* p, bool readOnly);
178 
179 /*
180   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::Finalize を参照してください。
181 */
182 NN_EXTERN_C void nnosMemoryBlockFree(nnosMemoryBlock* p);
183 
184 /*!
185   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::GetAddress を参照してください。
186 */
187 NN_EXTERN_C uptr nnosMemoryBlockGetAddress(nnosMemoryBlock* p);
188 
189 /*!
190   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::GetSize を参照してください。
191 */
192 NN_EXTERN_C size_t nnosMemoryBlockGetSize(nnosMemoryBlock* p);
193 
194 /*!
195   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::IsReadOnly を参照してください。
196 */
197 NN_EXTERN_C bool nnosMemoryBlockIsReadOnly(nnosMemoryBlock* p);
198 
199 /*!
200   @}
201 
202   @}
203 */
204 
205 #endif  // if NN_PLATFORM_HAS_MMU
206 #endif /* NN_OS_OS_MEMORYBLOCK_H_ */
207