1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_StackMemoryBlock.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_STACKMEMORYBLOCK_H_
23 #define NN_OS_OS_STACKMEMORYBLOCK_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     namespace detail
43     {
44         void InitializeStackMemoryBlock();
45     }
46 
47 
48 /*!
49     @brief ヒープ上の指定された領域内からスタック用のメモリを確保するクラスです。
50 
51     このクラスを使用する前にあらかじめ @ref InitializeMemoryBlock を呼んでおく必要があります。
52 
53 */
54 class StackMemoryBlock : public MemoryBlockBase
55 {
56 private:
57     uptr    m_MemoryAddress;
58 
59 public:
60     /*!
61         :overload notinit
62 
63         @brief オブジェクトを構築します。
64 
65                引数を指定しない場合は初期化を行いません。別途 @ref Initialize を呼び出す必要があります。
66     */
StackMemoryBlock()67     StackMemoryBlock() {}
68 
69     /*!
70         :overload init
71 
72         @brief オブジェクトを構築し、メモリを確保します。
73 
74                内部で Initialize を呼び出すためメモリの確保も行います。
75 
76         @param[in] size 確保するメモリのサイズ。
77                         size は 4096 の倍数でなければなりません。
78     */
StackMemoryBlock(size_t size)79     explicit StackMemoryBlock(size_t size) { Initialize(size); }
80 
81     /*!
82         @brief メモリを確保します。
83 
84         InitializeMemoryBlock で指定した領域のうち、未使用の領域から
85         size 分の領域を確保します。
86 
87         @param[in] size 確保するメモリのサイズ。
88                         size は 4096 の倍数でなければなりません。
89     */
90     void Initialize(size_t size);
91 
92     /*!
93         @brief オブジェクトを破棄します。
94 
95         メモリの解放が行われていない場合は
96         メモリの解放も行います。
97     */
~StackMemoryBlock()98     ~StackMemoryBlock() { Finalize(); }
99 
100     /*!
101         @brief メモリを解放します。
102     */
103     void Finalize();
104 
105     /*!
106         @brief 確保しているメモリ領域の終端アドレスを取得します。
107 
108         Thread::Start に StackMemoryBlock のインスタンスを
109         直接渡すためのインターフェイスです。
110 
111         @return 確保しているメモリ領域の終端アドレスを返します。
112     */
GetStackBottom()113     uptr GetStackBottom() const { return GetAddress() + GetSize(); }
114 
115     /*!
116         @brief 確保しているメモリ領域のサイズを取得します。
117 
118         Thread::Start に StackMemoryBlock のインスタンスを
119         直接渡すためのインターフェイスです。
120 
121         @return 確保しているメモリ領域のサイズを返します。
122     */
GetStackSize()123     size_t GetStackSize() const { return GetSize(); }
124 };
125 
126     namespace detail
127     {
128         void Switch(StackMemoryBlock* pTo, StackMemoryBlock* pFrom);
129     }
130 
131 }} // namespace nn::os
132 
133 #endif // __cplusplus
134 
135 // 以下、C 用宣言
136 
137 #include <nn/util/detail/util_CLibImpl.h>
138 
139 /*!
140   @addtogroup   nn_os               os
141   @{
142 
143   @defgroup     nn_os_MemoryBlock_c       MemoryBlock (C)
144 
145   @brief        @ref nn::os::MemoryBlock の C インタフェースモジュールです。
146 
147   @{
148 */
149 
150 /*!
151   @struct       nnosStackMemoryBlock
152   @brief        スタックから確保したメモリブロックを表す C の構造体です。
153 
154   @brief 対応するクラス @ref nn::os::StackMemoryBlock を参照してください。
155 */
156 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosStackMemoryBlock, nn::os::StackMemoryBlock, 24, u32);
157 
158 NN_EXTERN_C void nnosStackMemoryBlockInitialize(nnosStackMemoryBlock* p);
159 
160 /*!
161   @brief 対応する C++ 関数 @ref nn::os::StackMemoryBlock::Initialize を参照してください。
162 */
163 NN_EXTERN_C void nnosStackMemoryBlockAllocate(nnosStackMemoryBlock* p, size_t size);
164 
165 /*
166   @brief 対応する C++ 関数 @ref nn::os::MemoryBlock::Finalize を参照してください。
167 */
168 NN_EXTERN_C void nnosStackMemoryBlockFree(nnosStackMemoryBlock* p);
169 
170 /*!
171   @brief 対応する C++ 関数 @ref nn::os::StackMemoryBlock::GetAddress を参照してください。
172 */
173 NN_EXTERN_C uptr nnosStackMemoryBlockGetAddress(nnosStackMemoryBlock* p);
174 
175 /*!
176   @brief 対応する C++ 関数 @ref nn::os::StackMemoryBlock::GetSize を参照してください。
177 */
178 NN_EXTERN_C size_t nnosStackMemoryBlockGetSize(nnosStackMemoryBlock* p);
179 
180 /*!
181   @brief 対応する C++ 関数 @ref nn::os::StackMemoryBlock::GetStackBottom を参照してください。
182 */
183 NN_EXTERN_C uptr nnosStackMemoryBlockGetStackBottom(nnosStackMemoryBlock* p);
184 
185 /*!
186   @}
187 
188   @}
189 */
190 
191 #endif  // if NN_PLATFORM_HAS_MMU
192 #endif /* NN_OS_OS_STACKMEMORYBLOCK_H_ */
193