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