Difference between revisions of "SceSysmem"

From Vita Development Wiki
Jump to navigation Jump to search
(One intermediate revision by the same user not shown)
Line 8,142: Line 8,142:
 
#define SCE_CACHED_SECURE_MODULE_ENDEC_W_PORTABILITY 2  // os0:sm/encdec_w_portability_sm.self
 
#define SCE_CACHED_SECURE_MODULE_ENDEC_W_PORTABILITY 2  // os0:sm/encdec_w_portability_sm.self
  
typedef struct SceCachedSecureModule { // size is 0xC
+
typedef struct SceCachedSecureModuleInfo { // size is 0xC
 
   SceSize size;    // Size of this structure
 
   SceSize size;    // Size of this structure
   void *pSelfData; // Virtual address of the SM
+
   void *pSelfData; // Virtual address of the SM
   SceSize SelfSize; // Size of the SM
+
   SceSize selfSize; // Size of the SM
} SceCachedSecureModule;
+
} SceCachedSecureModuleInfo;
  
 
int sceKernelSysrootGetCachedSecureModuleForKernel(SceCachedSecureModule id, SceCachedSecureModuleInfo *pInfo);
 
int sceKernelSysrootGetCachedSecureModuleForKernel(SceCachedSecureModule id, SceCachedSecureModuleInfo *pInfo);

Revision as of 02:34, 29 June 2020

SceSysmem is a kernel module that acts as the heart of the kernel. It exports multiple libraries for various features. SceSysmem is the first module that is loaded in the kernel load sequence and its libraries are imported by almost all other modules. See Virtual Memory and Physical Memory for more details on the memory subsystem.

Contents

Module

This module exists in both non-secure and secure world. The non-secure world SELF can be found in os0:kd/sysmem.skprx. It also can be found in the Boot Image.

Known NIDs

Version Name World Privilege NID
1.50 SceSysmem Non-secure Kernel 0x78D8AA34
1.69 SceSysmem Non-secure Kernel 0xB93950C6
3.57 SceSysmem Non-secure Kernel 0x00CFDC77
3.60-3.61 SceSysmem Non-secure Kernel 0x3380B323
1.69 SceSysmem Secure Kernel 0x502BE0E5
1.80 SceSysmem Secure Kernel 0x72425377

Libraries

Known NIDs

Version Name World Visibility NID
1.50-3.60 SceSysmemForKernel Non-secure Kernel 0x63A519E5
3.65 SceSysmemForKernel Non-secure Kernel 0x02451F0F
1.50-3.60 SceSysmemForDriver Non-secure Kernel 0x6F25E18A
1.50-1.692 SceSysmemForDebugger Non-secure Kernel 0xC7309957
1.50-3.60 SceSysmem Non-secure User 0x37FE725A
1.50-3.60 SceDipsw Non-secure User 0xB36D5922
1.50-3.60 SceDipswForDriver Non-secure Kernel 0xC9E26388
1.50-3.60 SceUartForKernel Non-secure Kernel 0xC03DBE40
1.50-3.60 SceCpu Non-secure User 0x45265161
1.50-3.60 SceCpuForKernel Non-secure Kernel 0x54BF2BAB
3.65 SceCpuForKernel Non-secure Kernel 0xA5195D20
1.50-3.60 SceCpuForDriver Non-secure Kernel 0x40ECDB0E
1.50-1.69 SceSysclibForKernel Non-secure Kernel 0x24878615
3.60 SceSysclibForKernel Non-secure Kernel removed
1.50-3.60 SceSysclibForDriver Non-secure Kernel 0x7EE45391
1.50-3.60 SceSysrootForKernel Non-secure Kernel 0x3691DA45
1.50-3.60 SceSysrootForDriver Non-secure Kernel 0x2ED7F97A
1.50-3.60 SceKernelUtilsForDriver Non-secure Kernel 0x496AD8B4
1.50 SceZlibForDriver Non-secure Kernel 0xE241534E
1.50-3.60 SceKernelSuspendForDriver Non-secure Kernel 0x7290B21C
1.50-3.60 SceQafMgrForDriver Non-secure Kernel 0x4E29D3B6
1.50-3.60 ScePmMgrForDriver Non-secure Kernel 0xF13F32F9
1.50-3.60 SceSblAIMgrForDriver Non-secure Kernel 0xFD00C69A
1.50-3.60 SceProcEventForDriver Non-secure Kernel 0x887F19D0
1.50-3.60 SceDebugLed Non-secure User 0xAE004C0A
1.50-3.60 SceDebugLedForDriver Non-secure Kernel 0x7BC05EAD
1.50-3.60 SceDebugForKernel Non-secure Kernel 0x88C17370
1.50-3.60 SceDebugForDriver Non-secure Kernel 0x88758561
1.69-1.80 SceSysmemForTZS Secure Kernel 0x8680060
1.69-1.80 SceDipswForTZS Secure Kernel 0x9DBF584C
1.80 SceUartForTZS Secure Kernel 0xA1D740D7
1.80 SceDebugForTZS Secure Kernel 0x028FFADB
1.69-1.80 SceCpuForTZS Secure Kernel 0xC516B23E
1.69-1.80 SceSysclibForTZS Secure Kernel 0xC839BB78
1.69-1.80 SceSysrootForTZS Secure Kernel 0xFEFF641D
1.69-1.80 SceQafMgrForTZS Secure Kernel 0x637069DD
1.69-1.80 ScePmMgrForTZS Secure Kernel 0x27F1AFD8
1.69-1.80 SceSblAIMgrForTZS Secure Kernel 0x60D19047

Types

typedef int threadmgr_core_ctx;

typedef struct tctx_holder {
  int unk0;
  int unk4;
  int unk8;
  int unkC;
  int unk10;
  int unk14;
  int unk18;
  int unk1C;
  int unk20;
  int unk24;
  int unk28;
  int unk2C;
  int unk30;
  threadmgr_core_ctx *tctx_34;
} tctx_holder;

typedef struct callback_holder1 {
  int unk0;
  int (*unk4)(void);
  int (*unk8)(void);
  int (*unkC)(void);
  int unk10;
  int unk14;
  int unk18;
  int unk1C;
  int (*unk20)(void);
  int unk24;
  int unk28;
  int unk2C;
  int unk30;
  int unk34;
  int unk38;
  int (*unk3C)(void);
} callback_holder1;

typedef struct callback_holder2 {
  int size;
  int (__cdecl *unk4)(int result, int *a2);
  int (__cdecl *unk8)(SceUID *a1);
  int (__cdecl *unkC)(int, int *);
  int (__cdecl *sceKernelSysrootGetProcessSelfAuthInfoForKernel)(SceUID pid, SceSelfAuthInfo* self_auth_info);
  int (__cdecl *sceKernelSysrootGetProcessTitleIdForKernel)(SceUID pid, char *title_id, SceSize len);
  int (__cdecl *unk18)(unsigned int a1);
  int (__cdecl *unk1c)(int a1);
} callback_holder2;

typedef struct callback_holder3 {
  int unk0;
  int (*unk4)(void);
  int (*unk8)(void);
  int (__fastcall *unkC)(int);
  int (__fastcall *unk10)(int);
  int (*unk14)(void);
} callback_holder3;

typedef struct sysbase_t {
  tctx_holder *hldr[6];
  char unk[84];
  char *kbl_param;
  int unk70;
  char unk74[616];
  char unk2dc[52];
  int unk310;
  int unk314;
  int unk318;
  int unk31C;
  int unk320;
  int unk324;
  int unk328;
  int unk32C;
  int unk330;
  int unk334;
  int unk338;
  int unk33C;
  int unk340;
  int (__cdecl *GetThreadAccessLevel)();
  int unk348;
  int (*unk34C_some_callback1)(void);
  callback_holder3 *unk350;
  int unk354;
  callback_holder1 *unk358;
  callback_holder2 *unk35C;
  int (*unk360)(void);
  int (*unk364)(void);
  int (__fastcall *unk368)(int, int, int);
  char unk36C[20];
  int (__cdecl *sceSblLicMgrGetLicenseStatusForDriver)();
  int (__cdecl *SceSblPostSsMgrForDriver_22599675)();
  int (__cdecl *SceSblPostSsMgrForDriver_9b49c249)();
  int (__cdecl *SceSblPostSsMgrForDriver_d8a2d465)(unsigned long long);
  int (__cdecl *SceSblPostSsMgrForDriver_abdd68cd)(void *);
  int (__cdecl *sceSblUtMgrHasNpTestFlagForDriver)();
  int (*SceSblUpdateMgr_smth)(void);
  int (*ScePower_smth)(void);
} sysbase_t;

typedef struct sysbase360_t {
	int unk_0x00; // 0
	void *unk_0x04;
	SceSize sysbase_size; // 3.60:0x41C
	uint32_t sysbase_magic1;
	int unk_0x10; // 0
	int unk_0x14; // 0x400
	void *unk_0x18;
	int unk_0x1C; // 0x4
	void *unk_0x20;
	int unk_0x24; // 0
	int unk_0x28; // 0x10
	int unk_0x2C; // 0x1

	int unk_0x30; // 0x40004
	int unk_0x34; // 0
	int unk_0x38; // 0
	void *unk_0x3C;

	void *unk_0x40;
	void *unk_0x44; // SceExcpmgr data vaddr?
	void *unk_0x48; // SceKernelIntrMgr data vaddr?
	void *unk_0x4C;

	void *unk_0x50;
	int unk_0x54; // 0
	void *unk_0x58;
	int unk_0x5C; // 0

	int unk_0x60; // 0
	int unk_0x64; // 0
	int unk_0x68; // 0
	SceBootArgs *KblParam; // old name is sysroot buff

	int unk_0x70; // 0x51030100, paddr?
	int unk_0x74; // 0x80000115
	int unk_0x78; // 0
	int unk_0x7C; // 0x115

	int unk_0x80; // 0x10200
	int unk_0x84; // 0x704
	int unk_0x88; // 0x2800D000
	int unk_0x8C; // 0

	int unk_0x90; // 0x5
	int unk_0x94; // 0
	int unk_0x98; // 0
	int unk_0x9C; // 0

	int unk_0xA0[0x18]; // 0
	int unk_0x100[0x34]; // 0

	int unk_0x1D0; // 0
	int unk_0x1D4; // func ptr?, paddr:0x51003581
	int unk_0x1D8; // 0
	int (* sceKernelSysrootMountDummyTtypDevFs)(void);		// SceIofilemgr + 0x1
	int unk_0x1E0[0x8]; // 0
	int unk_0x200[0x14]; // 0

	int unk_0x250; // 0
	int (* sceKernelSysrootPowerTriggerFlag0x10000)(int a1);	// Temp name, ScePower + 0x21F5
	int unk_0x258; // 0
	int unk_0x25C; // 0

	int unk_0x260[0xC]; // 0

	int unk_0x290; // 0
	int (* sceKernelSysrootDisplayRev1)();				// SceDisplay + 0x1
	int unk_0x298; // 0
	int (* sceKernelSysrootMsifStart)(void);			// SceMsif + 0x3811

	int unk_0x2A0; // 0
	int (* sceKernelSysrootPowerRev1)();				// Temp name, ScePower + 0x7BCD
	int unk_0x2A8; // 0
	int (* sceKernelSysrootPowerTriggerFlag0x10000_2)(void);	// Temp name, ScePower + 0x218D

	int unk_0x2B0; // 0
	int (* sceKernelSysrootPowerEnableSubIntr)(void);		// Temp name, ScePower + 0x5B51
	int unk_0x2B8; // 0
	int unk_0x2BC; // 0

	int unk_0x2C0[0x4]; // 0

	int unk_0x2D0; // 0
	int (* sceKernelSysrootThreadFunction1)(void);			// Temp name, SceKernelThreadMgr + 0x4D85
	int (* sceKernelSysrootIofilemgrStart)(void);			// SceIofilemgr + 0x3E5
	void *unk_0x2DC;

	void *unk_0x2E0;
	void *unk_0x2E4;
	void *unk_0x2E8;
	void *unk_0x2EC;

	void *unk_0x2F0;
	void *unk_0x2F4;
	void *unk_0x2F8;
	void *unk_0x2FC;

	void *unk_0x300;
	void *unk_0x304;
	int unk_0x308; // 0x10001
	void *unk_0x30C;

	void *unk_0x310;
	void *unk_0x314;
	void *unk_0x318;
	int unk_0x31C; // 0

	void *unk_0x320;
	void *unk_0x324;
	SceUID (* sceKernelSysrootGetThreadId)(void);				// Temp name, SceKernelThreadMgr + 0x895
	int (* sceKernelSysrootGetThreadFunction3)(void);			// Temp name, SceKernelThreadMgr + 0xC79,  SceThreadmgrForDriver_91382762

	SceUID (* sceKernelSysrootGetProcessId)(void);				// Temp name, SceKernelThreadMgr + 0x8A9
	int (* sceKernelSysrootGetThreadFunction4)(void);			// Temp name, SceKernelThreadMgr + 0x8D1
	int (* sceKernelSysrootGetThreadFunction5)(void);			// Temp name, SceKernelThreadMgr + 0x8ED
	int (* sceKernelSysrootGetThreadFunction6)(void);			// Temp name, SceKernelThreadMgr + 0x90D

	void (* sceKernelSysrootGetThreadFunction7);				// Temp name, SceKernelThreadMgr + 0xE69
	int (* sceKernelSysrootGetThreadFunction8)(void);			// Temp name, SceKernelThreadMgr + 0x8BD, SceThreadmgrForDriver_332E127C
	int (* sceKernelSysrootThreadFunction9)(int a1, int a2, int a3);	// Temp name, SceKernelThreadMgr + 0x2541
	int (* sceKernelSysrootThreadFunction10)(int a1);			// Temp name, SceKernelThreadMgr + 0xC99, SceThreadmgrForDriver_AB977C72

	void *unk_0x350;
	int unk_0x354; // 0xFFFFFFFF
	void *unk_0x358;
	void *unk_0x35C;

	int unk_0x360;
	int (* sceKernelSysrootGetBusError)(void *dst, uint32_t len);		// SceKernelBusError + 0x23, SceBusErrorForKernel_EBB1F135
	int (* sceKernelSysrootAppMgrFunction1)(int a1, int a2, int a3, int a4, int a5, int a6); // SceAppMgr + 0x2795, SceAppMgrForDriver_324DD34E
	SceUID (* sceKernelSysrootGetShellPid)(void);	// SceAppMgr + 0x101F9, SceAppMgrForDriver_2FEACA9F

	void *unk_func_0x370;				// SceCoredump + 0x7109, SceCoredumpForDriver_A7D214A7
	void *unk_func_0x374;				// SceCoredump + 0x74F9, SceCoredumpForDriver_340856F7
	void *unk_func_0x378;				// SceCoredump + 0x132ED, SceCoredumpForDriver_EF20949F
	int unk_0x37C; // 0

	void *unk_func_0x380;				// SceSblPostSsMgr + 0x9001, sceSblLicMgrGetLicenseStatusForDriver
	int (* unk_func_0x384)(void);			// SceSblPostSsMgr + 0xB005, SceSblPostSsMgrForDriver_22599675, get flag
	int (* unk_func_0x388)(void);			// SceSblPostSsMgr + 0xB011, SceSblPostSsMgrForDriver_9B49C249, get flag
	void *unk_func_0x38C;				// SceSblPostSsMgr + 0xB4ED, SceSblPostSsMgrForDriver_D8A2D465

	void *unk_func_0x390;				// SceSblPostSsMgr + 0xB111, sceSblUtMgrGetTrilithiumBufferForDriver
	int (* sceKernelSysrootHasNpTestFlag)(void);	// SceSblPostSsMgr + 0xB01D
	void *unk_func_0x398;				// SceSblUpdateMgr + 0x8B01
	int (* sceKernelSysrootLedSetMode)(int led, int mode, void *led_configuration); // ScePower + 0x7C05

	void *unk_0x3A0;
	int unk_0x3A4; // 0
	int unk_0x3A8; // 0
	int unk_0x3AC; // 0

	int unk_0x3B0[0x4]; // 0

	int unk_0x3C0; // 0
	int unk_0x3C4; // 0
	int unk_0x3C8; // 0
	void *unk_func_0x3CC; // SceNetPs + 0x3E51, SceNetPsForDriver_83A12CCC

	void *unk_func_0x3D0; // SceNetPs + 0x3F4D, SceNetPsForDriver_C000CA8F
	int unk_0x3D4; // 0
	int unk_0x3D8; // 0
	void *unk_func_0x3DC; // SceNetPs + 0x3E51, SceNetPsForDriver_83A12CCC

	void *unk_func_0x3E0; // SceNetPs + 0x3F4D, SceNetPsForDriver_C000CA8F
	int (* sceKernelSysrootAppMgrFunction3)(int a1, int a2); // SceAppMgr + 0x9F49
	int (* sceKernelSysrootAppMgrFunction4)(int a1, int a2); // SceAppMgr + 0x9EED
	int (* sceKernelSysrootAppMgrFunction5)(int a1);	 // SceAppMgr + 0x9D31

	void *unk_func_0x3F0; // ScePfsMgr + 0x1, ScePfsMgrForKernel_4C148288
	void *unk_0x3F4;
	void *unk_0x3F8;
	int unk_0x3FC; // 0

	int unk_0x400[0x6]; // 0
	uint32_t sysbase_magic2;
} sysbase360_t;

typedef struct SceKernelFreeMemorySizeInfo {
	SceSize size;
	SceSize sizeMain;
	SceSize sizeCdram;
	SceSize sizePhycont;
} SceKernelFreeMemorySizeInfo;

typedef int (*SceClassCallback)(void *item);

typedef struct SceClass_0990 { // size is 0x10 on FW 0.990
	SceSize size; // Size of this structure
	struct SceClass *next;
	struct SceClass *root; // to confirm
	struct SceClass *prev; // to confirm
} SceClass_0990;

typedef struct SceClass { // size is 0x2C on FW 3.60
	struct SceClass *next;				// 0x00
	struct SceClass *root;				// 0x04
	struct SceClass *prev;				// 0x08
	const char *name;				// 0x0C
	struct SceClass *uid_class;			// 0x10
	unsigned int attr;				// 0x14
	unsigned short item_size;			// 0x18
	unsigned short unk_1A;				// 0x1A
	SceClassCallback constructor;			// 0x1C
	SceClassCallback destructor;			// 0x20
	const unsigned int magic;			// 0x24 - 0xABCE9DA5
	SceClassCallback allocMethod;			// 0x28
} SceClass;

typedef struct SceKernelObject { // size is at least 0x24
	void *pObject;			// 0x0
	SceClass pClass;		// 0x4
	uint32_t type;			// 0x8
	uint16_t lcount;		// 0xC
	uint16_t ucount;		// 0xE
	uint16_t ccount;		// 0x10
	uint32_t unk_12;		// 0x12 - 0x54c3
	uint16_t unk_16;		// 0x16
	uint32_t uid;			// 0x18
	char unk_1C[4];			// 0x1C
	const char *name;		// 0x20
	uint32_t indexRaw;		// 0x24
} SceKernelObject;

/** @name Memory types that can be specified with sceKernelAllocMemBlock
 */
/*@{*/

/**
 * @brief User readable / writable LPDDR2 memory
 *
 * This type secures a readable / writable memory block in user space.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RW			0x0c20d060U

#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA			SCE_KERNEL_MEMBLOCK_TYPE_USER_RW

/**
 * @brief User readable / writable LPDDR2 non-cache memory
 *
 * A type to secure a memory block on LPDDR2 that is readable
 * and writable in user space and does not use cache.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW			0x0c208060U

/**
 * @brief An alias for SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE		SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW

/**
 * @brief An alias for SCE_KERNEL_MEMBLOCK_TYPE_USER_NC_RW.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE		SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE

/**
 * @brief User readable and writable LPDDR2 physical continuous memory
 *
 * A type that can read and write in user space and secure
 * memory blocks from the physical continuous memory area.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_RW		0x0c80d060U

/**
 * @brief User-readable and non-cacheable physical continuous memory
 *
 * A type for on-cacheable read / write in user space and to secure
 * memory blocks from the physical continuous memory area.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW	0x0d808060U

/**
 * @brief User-readable and non-cacheable CDRAM memory
 *
 * A type that can be read and written in user space and secures
 * memory blocks on CDRAM.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW			0x09408060U

/**
 * @brief An alias for SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW.
 */
#define SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RWDATA		SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW

/*@}*/

/**
 * @brief A type representing a memory type
 *
 * A type that represents the type of memory block secured by sceKernelAllocMemBlock.
 */
typedef int		SceKernelMemoryType;

/**
 * @brief Memory block information structure
 *
 * A structure for obtaining information about memory blocks. Size is 0x14 bytes on FW 0.990.
 */
typedef struct SceKernelMemBlockInfo0990 {
	SceSize				size;			/**< Size of the structure itself */
	void				*mappedBase;		/**< Map base address */
	SceSize				mappedSize;		/**< Mapped size */
	SceKernelMemoryType		memoryType;		/**< Memory type */
	SceUInt32			access;			/**< Access right */
} SceKernelMemBlockInfo0990;

/**
 * @brief Memory block information structure
 *
 * A structure for obtaining information about memory blocks. Size is 0x18 bytes on FWs 0.996+.
 */
typedef struct SceKernelMemBlockInfo {
	SceSize				size;			/**< Size of the structure itself */
	void				*mappedBase;		/**< Map base address */
	SceSize				mappedSize;		/**< Mapped size */
	SceKernelMemoryType		memoryType;		/**< Memory type */
	SceUInt32			access;			/**< Access right */
	SceKernelMemBlockType		type;			/**< Memory block type */
} SceKernelMemBlockInfo;

typedef struct SceKernelMemBlockInfoExDetails {
    SceKernelMemBlockType type;
    SceUID memblk_uid;
    const char *name;
    void *mappedBase;
    SceSize mappedSize;
    SceSize memblock_some_size_or_alignment;
    int extraLow;
    int extraHigh;
    int unk20;
    SceUID unk24; // ex: 0x10045, maybe some pid
    SceKernelObject *SceUIDPhyMemPartClass_obj;
} SceKernelMemBlockInfoExDetails;

typedef struct SceKernelMemBlockInfoEx { // size is 0xAC on FW 0.990, 0xB8 on FW 3.60
    SceSize size; // Size of this structure
    SceKernelMemBlockInfoExDetails details;
    SceSize unk30; // paddr num
    SceSize unk34; // paddr size num?
    void *paddr_list[0x10];
    SceSize size_list[0x10];
} SceKernelMemBlockInfoEx;

typedef struct SceKernelMemBlockInfoSimple { // size is 0x24 on FW 0.990
    SceSize size; // Size of this structure
    SceKernelMemBlockType type;
    SceUID uid;
    char *name; // "SceNULL" by default
    char unk_0x10[0x14];
} SceKernelMemBlockInfoSimple;

/*----- memory access permission -----*/

/**
 * @brief readable memory
 */
#define SCE_KERNEL_MEMORY_ACCESS_R		0x04U

/**
 * @brief writable memory
 */
#define SCE_KERNEL_MEMORY_ACCESS_W		0x02U

/**
 * @brief executable memory (kernel only)
 */
#define SCE_KERNEL_MEMORY_ACCESS_X		0x01U

/*----- memory type -----*/

/**
 * @brief uncache normal memory
 */
#define SCE_KERNEL_MEMORY_TYPE_NORMAL_NC	0x80

/**
 * @brief cache normal memory
 */
#define SCE_KERNEL_MEMORY_TYPE_NORMAL		0xD0

/**
 * Optional parameter of sceKernelAllocMemBlock for FWs <=0.940.
 */
 typedef struct SceKernelAllocMemBlockOpt0940 {
	SceSize		size;				/**< Size of this structure */
	SceUInt32	attr;				/**< Attributes field */
	SceSize		alignment;			/**< Specify alignment.
							SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT must be set for the attr member. */
	SceUID		uidBaseBlock;			/**< Base memory block UID */
	const char	*strBaseBlockName;		/**< Base memory block UID name */
} SceKernelAllocMemBlockOpt0940;

/**
 * Option parameter of sceKernelAllocMemBlock
 */
 typedef struct SceKernelAllocMemBlockOpt {
	/**
	 * Size of this structure
	 */
	SceSize		size;

	/**
	 * Attributes field
	 */
	SceUInt32	attr;

	/**
	 * Specify alignment.
	 * SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT must be set for the attr member.
	 */
	SceSize		alignment;

	/**
	 * reserved
	 */
	 SceUInt32	uidBaseBlock;

	/**
	 * 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;

/**
 * Option parameter of kernel sceKernelAllocMemBlock on old FWs (as seen on FWs 0.900-0.990)
 */
typedef struct SceKernelAllocMemBlockOptKernel_old { // size is 0x28 on 0.900, 0x2C on 0.910, 0x30 on 0.931-0.990, 0x34 on ?.??
    SceSize size;			// Size of this structure
    SceUInt32 unk_4;
    SceUInt32 attr;
    void *vbase;
    void *pbase;			// Physical address to use as base
    SceSize alignment;
    SceUInt32 extraLow;
    SceUInt32 extraHigh;
    void *base;
    SceUID pid;
    SceKernelPAVector *pPAV;
    SceSize vsize;
    SceUInt32 unk_30;
} SceKernelAllocMemBlockOptKernel_old;

/**
 * Option parameter of kernel sceKernelAllocMemBlock on recent FWs (as seen on FW 3.60)
 */
typedef struct SceKernelAllocMemBlockOptKernel { // size is 0x58 on FW 3.60
	SceSize size;			// Size of this structure
	SceUInt32 unk_4;
	SceUInt32 attr;
	void *vbase;
	void *pbase;			// Physical address to use as base
	SceSize alignment;
	SceUInt32 extraLow;
	SceUInt32 extraHigh;
	void *base;
	SceUID pid;
	SceKernelPAVector *pPAV;
	SceSize vsize;
	SceUInt32 unk_30;
	SceUInt32 unk_34;
	SceUInt32 unk_38;
	SceUInt32 unk_3C;
	SceUInt32 unk_40;
	SceUInt32 unk_44;
	SceUInt32 unk_48;
	SceUInt32 unk_4C;
	SceUInt32 unk_50;
	SceUInt32 unk_54;
} SceKernelAllocMemBlockOptKernel;

/**
 * Attributes to enable some SceKernelAllocMemBlockOpt members.
 */
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_VBASE		0x00000001
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_PBASE		0x00000002
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT		0x00000004
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_EXTRA_LOW		0x00000008
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_EXTRA_HIGH		0x00000010
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_BASE			0x00000040
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_PID			0x00000080
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_BASENAME		0x00000200 // Need to find where basename is located in the structure
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_PPAV			0x00001000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_SIZE			0x00002000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_FIELD_30		0x00010000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_NOPHYPAGE		0x00020000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_PHYCONT			0x00200000 // Memory area is physically continuous.
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_UNK			0x00400000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_SHARE_VBASE		0x00800000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_SHARE_PHYPAGE		0x01000000
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_ALLOW_PARTIAL_OP		0x04000000 // Allow partial operation. ?What does that mean?

/**
 * UID is created by sceKernelOpen***()
 */
#define SCE_UID_ATTR_OPEN_FLAG			0x00080000U

typedef struct SceKernelHeapInfo { // size is 0xCC on FW 0.990
	SceSize size;			// Size of this structure
	char unk_4[0xC8];
} SceKernelHeapInfo;

typedef struct SceKernelHeapObject { // size is 0x40 on FW 0.990
	SceSize size;				// Size of this structure
	uint32_t unk_4;				// 0x4
	uint32_t unk_8;				// 0x8
	uint32_t unk_C;				// 0xC
	uint32_t unk_10;			// 0x10
	uint32_t unk_14;			// 0x14
	uint32_t unk_18;			// 0x18
	uint32_t unk_1C;			// 0x1C
	uint32_t unk_20;			// 0x20
	uint32_t unk_24;			// 0x24
	uint32_t unk_28;			// 0x28
	uint32_t unk_2C;			// 0x2C
	uint32_t unk_30;			// 0x30
	uint32_t magic;				// 0x34 - 0xD2BBDEC3
	uint32_t unk_38;			// 0x38
	uint32_t unk_3C;			// 0x3C
	uint32_t unk_40;			// 0x40
} SceKernelHeapObject;

typedef struct SceKernelFixedHeap { // size is 0x40 on FW 0.990
	SceSize size;				// Size of this structure
	SceClass pClass;			// 0x4
	uint32_t unk_8;				// 0x8
	uint32_t unk_C;				// 0xC
	uint32_t unk_10;			// 0x10
	uint32_t unk_14;			// 0x14
	uint32_t pageSize;			// 0x18 - min 0x1000 on FW 0.990
	uint16_t itemSize;			// 0x1C
	uint16_t unk_1E;			// 0x1E
	uint32_t unk_20;			// 0x20
	uint32_t unk_24;			// 0x24
	uint32_t magic;				// 0x28 - 0xFD9B28A6
	uint16_t sizeInWords;			// 0x2C
	uint16_t index;				// 0x2E
	SceKernelHeapObject *heapObject;	// 0x30
	uint32_t unk_34;			// 0x34
	uint32_t unk_38;			// 0x38
	uint16_t unk_3C;			// 0x3C
} SceKernelFixedHeap;

typedef struct SceKernelFixedHeapInfo { // size is 0x14 on FW 0.990
	SceSize size;			// Size of this structure
	uint32_t unk_4;			// = (uint32_t)*(uint16_t *)(pObject + 0x1C)
	uint32_t unk_8;			// = *(uint32_t *)(pObject + 0x18) + (uint32_t)*(uint16_t *)(pObject + 0x2E)
	uint32_t unk_C;			// = (uint32_t)*(uint16_t *)(pObject + 0x1E)
	uint32_t unk_10;		// = (uint32_t)*(uint16_t *)(pObject + 0x20)
} SceKernelFixedHeapInfo;

typedef struct SceKernelHeapMemoryOpt { // size is 0x14 on FW 0.990
	SceSize size;			// Size of this structure
	uint32_t unk_4;
	uint32_t unk_8;
	uint32_t unk_C;			// example: 0x20
	uint32_t unk_10;
} SceKernelHeapMemoryOpt;

typedef struct SceAddressSpace { // size is at least 0xEC
	char unk[0x14];
	SceKernelMMUContext *context;
	char unk[0xC4];
	void *funcAlloc;
	char unk2[0x8];
	uint32_t magic;			// always 0x4d95AEEC
} SceAddressSpace;

typedef struct SceKernelAddressSpace { // size is 0x10 bytes on FW 0.940-3.60
    SceSize size; // Size of this structure
    int flag;
    void *data_0x08; // info dst buff ptr, need AddrSpace.flag  = 2;
    void *data_0x0C; // info dst buff ptr, need AddrSpace.flag |= 4;
} SceKernelAddressSpace;

typedef struct SceKernelVARange {
	uint32_t vaddr;
	uint32_t length;
} SceKernelVARange;

typedef struct SceKernelPARange {
	uint32_t paddr;
	uint32_t length;
} SceKernelPARange;

typedef struct SceKernelPAVector {
	SceSize size;			// Size of this structure (0x14 on 0.990)
	uint32_t pRanges_size;		// Ex: 8
	uint32_t nDataInVector;		// Must be <= 8
	uint32_t count;
	SceKernelPARange *pRanges;
} SceKernelPAVector;

#define SCE_KERNEL_PROCESS_ID_SELF 0 // Current running process ID is always 0.

typedef struct SceKernelPhyMemPart { // size is at least 0x9C on FW 0.931
    uint32_t field_0x0;
    uint32_t field_0x4;
    uint32_t some_counter; // always positive
    uint32_t field_0xc;
    char *name;
    int type; // 0x10000 for Lpddr2Main, 0x30000 for Cdram
    int mutex;
    uint32_t field_0x1c;
    SceSize psize;
    int field_0x24;
    int pRoot;
    uint32_t field_0x2c;
    uint32_t field_0x30;
    uint32_t field_0x34;
    uint32_t field_0x38;
    int status;
    int pindex40; //1
    int field_0x44;
    int pindex48; //2
    int field_0x4c;
    int pindex50; //3
    int field_0x54;
    int pindex58; //4
    int field_0x5c;
    int pindex60; //5
    int field_0x64;
    int pindex68; //6
    int field_0x6c;
    int pindex70; //7
    int field_0x74;
    int pindex78; //8
    int field_0x7c;
    int pindex80; //9
    SceSize psize2;
    int min;
    int pindex8C; //10
    int field_0x90;
    int nClient;
    SceSize freeSize;
} SceKernelPhyMemPart;

/**
 * An enumeration to represent the various logging levels which can be output by sceDbgLoggingHandler().
 */
typedef enum SceDbgLogLevel {
    SCE_DBG_LOG_LEVEL_TRACE = 0, /* An extremely verbose logging level, mostly useful for internal developers. */
    SCE_DBG_LOG_LEVEL_DEBUG,     /* A diagnostic logging level. */
    SCE_DBG_LOG_LEVEL_INFO,      /* An informational logging level. */
    SCE_DBG_LOG_LEVEL_WARNING,   /* A logging level that gives warnings of situations detrimental to proper execution. */
    SCE_DBG_LOG_LEVEL_ERROR,     /* A logging level that will report erroneous conditions in execution. */
    SCE_DBG_NUM_LOG_LEVELS       /* The number of logging levels available. */
} SceDbgLogLevel;

typedef struct SceSyscallInfo { // size is 0x3C on FW 3.60
    SceSize size; // Size of this structure
    SceUInt32 moduleFingerprint;
    SceUInt32 maybeModuleAttr;
    char moduleName[0x20];
    char *libName;
    SceUInt32 maybeLibAttr;
    SceUInt32 libVer;
    SceUInt32 libNid;
} SceSyscallInfo;

typedef struct SceSyscallFrame { // size is at least 0x5C on FW 3.60
	SceUInt32 r0; // 0x00
	SceUInt32 r1; // 0x04
	SceUInt32 r2; // 0x08
	SceUInt32 r3; // 0x0C
	SceUInt32 r4; // 0x10
	SceUInt32 r5; // 0x14
	SceUInt32 r6; // 0x18
	SceUInt32 r7; // 0x1C
	SceUInt32 r8; // 0x20
	SceUInt32 r9; // 0x24
	SceUInt32 r10; // 0x28
	SceUInt32 r11; // 0x2C
	SceUInt32 r12; // 0x30
	SceUInt32 unk_34; // 0x34
	void *entry; // 0x38
	SceUInt32 unk_3C; // 0x3C
	SceUInt32 resultType; // 0x40, 0-3
	int unk_44[3]; // 0x44
	SceUInt32 SP; // 0x50
	SceUInt32 LR; // 0x54
	SceUInt32 PC; // 0x58
} SceSyscallFrame;

GetPhyMemPartIndex

uint GetPhyMemPartIndex(uint param_1) {
  uint cpuId;
  
  if (param_1 == 0xea0d050) goto LAB_81009494;
  if (param_1 < 0xea0d051) {
    if (param_1 == 0x620d004) {
      return 6;
    }
    if (param_1 < 0x620d005) {
      if (param_1 != 0x3b0d060) {
        if (param_1 < 0x3b0d061) {
          if (param_1 != 0x3a0d060) {
            if (param_1 < 0x3a0d061) {
              if (param_1 == 0x3a0d040) goto LAB_81009494;
              if (param_1 == 0x3a0d050) {
                return 10;
              }
            }
            else {
              if (param_1 == 0x3b0d040) goto LAB_81009494;
              if (param_1 == 0x3b0d050) {
                return 0xb;
              }
            }
            goto LAB_81009402;
          }
        }
        else {
          if (param_1 != 0x3f0d060) {
            if (param_1 < 0x3f0d061) {
              if ((param_1 == 0x3f0d040) || (param_1 == 0x3f0d050)) goto LAB_81009494;
            }
            else {
              if (param_1 == 0x6208004) {
                return 6;
              }
              if (param_1 == 0x6208006) {
                return 6;
              }
            }
            goto LAB_81009402;
          }
        }
      }
LAB_81009494:
      return (param_1 << 8) >> 0x1c;
    }
    if (param_1 == 0xc208060) {
      return 0xb;
    }
    if (param_1 < 0xc208061) {
      if (param_1 == 0x9408060) {
        return 0xc;
      }
      if (param_1 < 0x9408061) {
        if (param_1 == 0x620d006) {
          return 6;
        }
        if (param_1 == 0x9404060) {
          return 0xc;
        }
      }
      else {
        if (param_1 == 0xb100860) {
          return 1;
        }
        if (param_1 == 0xc200860) {
          return 0xb;
        }
      }
    }
    else {
      if (param_1 == 0xea08040) goto LAB_81009494;
      if (param_1 < 0xea08041) {
        if (param_1 == 0xc20d050) {
          return 0xb;
        }
        if (param_1 == 0xc20d060) {
          return 0xb;
        }
      }
      else {
        if (param_1 == 0xea08060) goto LAB_81009494;
        if (param_1 == 0xea0d040) {
          return 10;
        }
      }
    }
  }
  else {
    if (param_1 == 0x20108004) {
      return 1;
    }
    if (param_1 < 0x20108005) {
      if (param_1 == 0x1020d006) {
        return 6;
      }
      if (param_1 < 0x1020d007) {
        if (param_1 == 0x10208004) {
          return 6;
        }
        if (param_1 < 0x10208005) {
          if (param_1 == 0xea0d060) goto LAB_81009494;
          if (param_1 == 0x10200806) {
            return 6;
          }
        }
        else {
          if (param_1 == 0x10208006) {
            return 6;
          }
          if (param_1 == 0x1020d004) {
            return 6;
          }
        }
      }
      else {
        if (param_1 == 0x20100206) {
          return 1;
        }
        if (param_1 < 0x20100207) {
          if (param_1 == 0x1050d006) {
            return 5;
          }
          if (param_1 == 0x20100204) {
            return 1;
          }
        }
        else {
          if (param_1 == 0x20100804) {
            return 1;
          }
          if (param_1 == 0x20100806) {
            return 1;
          }
        }
      }
    }
    else {
      if (param_1 == 0x60208006) {
        return 6;
      }
      if (param_1 < 0x60208007) {
        if (param_1 == 0x40404006) {
          return 0xc;
        }
        if (param_1 < 0x40404007) {
          if (param_1 == 0x20108006) {
            return 1;
          }
          if (param_1 == 0x2010d006) {
            return 1;
          }
        }
        else {
          if (param_1 == 0x40408006) {
            return 0xc;
          }
          if (param_1 == 0x60208004) {
            return 6;
          }
        }
      }
      else {
        if (param_1 == 0x6050d006) goto LAB_81009494;
        if (param_1 < 0x6050d007) {
          if (param_1 == 0x6020d004) {
            return 6;
          }
          if (param_1 == 0x6020d006) {
            return 6;
          }
        }
        else {
          if (0x70f0d003 < param_1) {
            if (param_1 < 0x70f0d007) goto LAB_81009494;
            if (param_1 == 0xa0408006) {
              return 0xc;
            }
          }
        }
      }
    }
  }
LAB_81009402:
  cpuId = ksceKernelCpuGetCpuId();
  SceDebugForDriver_1A3F2AA4
            (1,
             "%d:address_space.c:%s:Warning:Using SCE_KERNEL_PHYMEMPART_LPDDR2MAIN_KERNEL_INDEX for0x%08x\n"
             ,cpuId,"GetPhyMemPartIndex",param_1);
  return 6;
}

Memory Block Type

The type parameter indicates what kind of memory to allocate. Here is a mapping of type flags to ARM MMU flags. Higher bits are used for other options including where to allocate from. Not all flag values are valid, there is a table of valid types in the kernel. You cannot, for example, allocate RWX memory.

memtype bit value

Mask Value Description
0x10000 0x10000 Global. nG bit NOT set
0xFF00 0x800 B bit set. Sharable device memory.
0xFF00 0x2000 TEX[2] and TEX[0] bit set. Outer cache Write-back, Write-Allocate. Inner cache non-cachable.
0xFF00 0x4000 TEX[2] and B bit set. Outer cache non-cachable. Inner cache Write-back, Write-Allocate
0xFF00 0x8000 TEX[0] bit set. S bit unset. Outer and inner non-cachable. Not sharable.
0xFF00 0xD000 TEX[0] bit set. C,B bit