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