From 70004ae88d2bdb1feb56e5d2b4ba35c3b309dc92 Mon Sep 17 00:00:00 2001 From: Reiko Asakura Date: Sat, 10 Oct 2020 15:27:06 -0400 Subject: Add memblock.h --- include/user/kernel/sysmem.h | 83 +---------- include/user/kernel/sysmem/memblock.h | 263 ++++++++++++++++++++++++++++++++++ 2 files changed, 267 insertions(+), 79 deletions(-) create mode 100644 include/user/kernel/sysmem/memblock.h (limited to 'include') diff --git a/include/user/kernel/sysmem.h b/include/user/kernel/sysmem.h index 6a55a46..04e3ea2 100644 --- a/include/user/kernel/sysmem.h +++ b/include/user/kernel/sysmem.h @@ -1,99 +1,24 @@ #ifndef _PSP2_KERNEL_SYSMEM_H_ #define _PSP2_KERNEL_SYSMEM_H_ -#include +#include #ifdef __cplusplus extern "C" { #endif -typedef enum _SceKernelMemBlockType { - SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE = 0x0C208060, - SCE_KERNEL_MEMBLOCK_TYPE_USER_RX = 0x0C20D050, - SCE_KERNEL_MEMBLOCK_TYPE_USER_RW = 0x0C20D060, - SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_RW = 0x0C80D060, - SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW = 0x0D808060, - SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW = 0x09408060 -} _SceKernelMemBlockType; - -typedef struct SceKernelAllocMemBlockOpt { - SceSize size; - SceUInt32 attr; - SceSize alignment; - SceUInt32 uidBaseBlock; - const char *strBaseBlockName; - int flags; //! Unknown flags 0x10 or 0x30 for ::sceKernelOpenMemBlock - int reserved[10]; -} SceKernelAllocMemBlockOpt; - typedef struct SceKernelFreeMemorySizeInfo { int size; //!< sizeof(SceKernelFreeMemorySizeInfo) int size_user; //!< Free memory size for *_USER_RW memory int size_cdram; //!< Free memory size for USER_CDRAM_RW memory int size_phycont; //!< Free memory size for USER_MAIN_PHYCONT_*_RW memory -} SceKernelFreeMemorySizeInfo; - +} SceKernelFreeMemorySizeInfo; + typedef enum SceKernelModel { SCE_KERNEL_MODEL_VITA = 0x10000, SCE_KERNEL_MODEL_VITATV = 0x20000 } SceKernelModel; -typedef struct SceKernelMemBlockInfo { - SceSize size; - void *mappedBase; - SceSize mappedSize; - int memoryType; - SceUInt32 access; - SceKernelMemBlockType type; -} SceKernelMemBlockInfo; - -typedef enum SceKernelMemoryAccessType { - SCE_KERNEL_MEMORY_ACCESS_X = 0x01, - SCE_KERNEL_MEMORY_ACCESS_W = 0x02, - SCE_KERNEL_MEMORY_ACCESS_R = 0x04 -} SceKernelMemoryAccessType; - -typedef enum SceKernelMemoryType { - SCE_KERNEL_MEMORY_TYPE_NORMAL_NC = 0x80, - SCE_KERNEL_MEMORY_TYPE_NORMAL = 0xD0 -} SceKernelMemoryType; - -/** - * Allocates a new memory block - * - * @param[in] name - Name for the memory block - * @param[in] type - Type of the memory to allocate - * @param[in] size - Size of the memory to allocate - * @param[in] opt - Memory block options? - * - * @return SceUID of the memory block on success, < 0 on error. -*/ -SceUID sceKernelAllocMemBlock(const char *name, SceKernelMemBlockType type, SceSize size, SceKernelAllocMemBlockOpt *opt); - -/** - * Frees new memory block - * - * @param[in] uid - SceUID of the memory block to free - * - * @return 0 on success, < 0 on error. -*/ -int sceKernelFreeMemBlock(SceUID uid); - -/** - * Gets the base address of a memory block - * - * @param[in] uid - SceUID of the memory block to free - * @param[out] base - Base address of the memory block identified by SceUID - * - * @return 0 on success, < 0 on error. -*/ -int sceKernelGetMemBlockBase(SceUID uid, void **base); - -SceUID sceKernelFindMemBlockByAddr(const void *addr, SceSize size); - -int sceKernelGetMemBlockInfoByAddr(void *base, SceKernelMemBlockInfo *info); -int sceKernelGetMemBlockInfoByRange(void *base, SceSize size, SceKernelMemBlockInfo *info); - SceUID sceKernelAllocMemBlockForVM(const char *name, SceSize size); int sceKernelSyncVMDomain(SceUID uid, void *data, SceSize size); int sceKernelOpenVMDomain(void); @@ -115,7 +40,7 @@ int sceKernelGetModelForCDialog(void); * @return A value from SCE_KERNEL_MODEL */ int sceKernelGetModel(void); - + /** * Get free memory size in bytes * diff --git a/include/user/kernel/sysmem/memblock.h b/include/user/kernel/sysmem/memblock.h new file mode 100644 index 0000000..4d720cb --- /dev/null +++ b/include/user/kernel/sysmem/memblock.h @@ -0,0 +1,263 @@ +#ifndef _DOLCESDK_PSP2_KERNEL_SYSMEM_MEMBLOCK_H_ +#define _DOLCESDK_PSP2_KERNEL_SYSMEM_MEMBLOCK_H_ + +#include +#include + +/** @name sceKernelAllocMemBlockで指定可能なメモリタイプ + */ +/*@{*/ + +/** + * memory block type for read write cache allocated on LPDDR2 + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RW 0x0c20d060U + +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA SCE_KERNEL_MEMBLOCK_TYPE_USER_RW + +/** + * memory block type for read execute cache allocated on LPDDR2 + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RX 0x0c20d050U + +/** + * memory block type for read write uncache allocated on LPDDR2 + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW 0x0c208060U + +/** + * alias of SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW + +/** + * alias of SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE + +/** + * memory block type for read write cache allocated on LPDDR2 physical continuous area + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_RW 0x0c80d060U + +/** + * memory block type for read write uncache allocated on LPDDR2 physical continuous area + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW 0x0d808060U + +/** + * memory block type for read write uncache allocated on CDRAM + */ +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW 0x09408060U + +#define SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RWDATA SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW + +/*@}*/ + +SCE_CDECL_BEGIN + +#if !defined(_LANGUAGE_ASSEMBLY) + +typedef struct SceKernelAllocMemBlockOpt0940 { + SceSize size; + SceUInt32 attr; + SceSize alignment; + SceUID uidBaseBlock; + const char *strBaseBlockName; +} SceKernelAllocMemBlockOpt0940; + +/** + * Option parameter for sceKernelAllocMemBlock + */ + typedef struct SceKernelAllocMemBlockOpt { + /** + * size of this + */ + SceSize size; + + /** + * attributes field + */ + SceUInt32 attr; + + /** + * alignment option + * must set SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT to 'attr' + */ + SceSize alignment; + + /** + * reserved + */ + SceUInt32 reserved; + + /** + * reserved2 + */ + const char *strBaseBlockName; + +#if 0 + /** + * mapped base address [out] + */ + void *mappedBase; + + /** + * mapped size [out] + */ + SceSize mappedSize; + + /** + * memory type [out] + */ + SceKernelMemoryType memoryType; + + SceUInt32 access; +#endif +} SceKernelAllocMemBlockOpt; + +/** + * Enable 'alignment' member + */ +#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT 0x00000004U + +#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_PHYCONT 0x00200000U + +/** + * Allocating memory block + * + * @param[in] name memory block name + * @param[in] vsize memory block virtual size + * @param[in] flags options + * @retval id UID of memory block + * @retval 0, API returns a memory block just fit range [start, start + size]. + * @param[in] vaddr base address + * @param[in] size address size + * @retval >=SCE_OK block id + * @retval