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