1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: os_MemoryBlock.h 4 5 Copyright (C)2009-2012 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: 47236 $ 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 64 */ 65 class MemoryBlock : public MemoryBlockBase 66 { 67 public: 68 /* Please see man pages for details 69 70 71 72 73 74 */ MemoryBlock()75 MemoryBlock() {} 76 77 /* Please see man pages for details 78 79 80 81 82 83 84 85 86 */ MemoryBlock(size_t size)87 explicit MemoryBlock(size_t size) { Initialize(size); } 88 89 /* Please see man pages for details 90 91 92 93 94 95 96 97 */ 98 void Initialize(size_t size); 99 100 /* Please see man pages for details 101 102 103 104 105 */ ~MemoryBlock()106 ~MemoryBlock() { Finalize(); } 107 108 /* Please see man pages for details 109 110 */ 111 void Finalize(); 112 113 /* Please see man pages for details 114 115 116 117 */ 118 void SetReadOnly(bool readOnly = true); 119 GetPageAlignedSize(size_t size)120 static size_t GetPageAlignedSize(size_t size) { return (size + NN_OS_MEMORY_PAGE_SIZE - 1) & ~(NN_OS_MEMORY_PAGE_SIZE - 1); } 121 }; 122 123 /* 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 */ 144 void InitializeMemoryBlock(uptr begin, size_t size); 145 146 147 }} // namespace nn::os 148 149 #endif // __cplusplus 150 151 // Below is the C declaration 152 153 #include <nn/util/detail/util_CLibImpl.h> 154 155 /* Please see man pages for details 156 157 158 159 160 161 162 163 164 */ 165 166 /* Please see man pages for details 167 168 169 170 171 */ 172 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosMemoryBlock, nn::os::MemoryBlock, 20, u32); 173 174 /* Please see man pages for details 175 176 */ 177 NN_EXTERN_C void nnosMemoryBlockAllocate(nnosMemoryBlock* p, size_t size); 178 179 /* Please see man pages for details 180 181 */ 182 NN_EXTERN_C void nnosMemoryBlockSetReadOnly(nnosMemoryBlock* p, bool readOnly); 183 184 /* 185 186 */ 187 NN_EXTERN_C void nnosMemoryBlockFree(nnosMemoryBlock* p); 188 189 /* Please see man pages for details 190 191 */ 192 NN_EXTERN_C uptr nnosMemoryBlockGetAddress(nnosMemoryBlock* p); 193 194 /* Please see man pages for details 195 196 */ 197 NN_EXTERN_C size_t nnosMemoryBlockGetSize(nnosMemoryBlock* p); 198 199 /* Please see man pages for details 200 201 */ 202 NN_EXTERN_C bool nnosMemoryBlockIsReadOnly(nnosMemoryBlock* p); 203 204 /* 205 206 207 208 */ 209 210 #endif // if NN_PLATFORM_HAS_MMU 211 #endif /* NN_OS_OS_MEMORYBLOCK_H_ */ 212