summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/kernel/kernel/sysmem.h127
1 files changed, 81 insertions, 46 deletions
diff --git a/include/kernel/kernel/sysmem.h b/include/kernel/kernel/sysmem.h
index 6373324..ca5902c 100644
--- a/include/kernel/kernel/sysmem.h
+++ b/include/kernel/kernel/sysmem.h
@@ -20,50 +20,55 @@ typedef enum SceKernelMemBlockType {
SCE_KERNEL_MEMBLOCK_TYPE_RW_UNK0 = 0x6020D006
} SceKernelMemBlockType;
+#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_PADDR 0x00000002U
+#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT 0x00000004U
+#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_MIRROR_BLOCKID 0x00000040U
+#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_PID 0x00000080U
+
// specific to 3.60
typedef struct SceKernelAllocMemBlockKernelOpt {
- SceSize size;
- SceUInt32 field_4;
- SceUInt32 attr;
- SceUInt32 field_C;
- SceUInt32 paddr;
- SceSize alignment;
- SceUInt32 field_18;
- SceUInt32 field_1C;
- SceUInt32 mirror_blkid;
- SceUID pid;
- SceUInt32 field_28;
- SceUInt32 field_2C;
- SceUInt32 field_30;
- SceUInt32 field_34;
- SceUInt32 field_38;
- SceUInt32 field_3C;
- SceUInt32 field_40;
- SceUInt32 field_44;
- SceUInt32 field_48;
- SceUInt32 field_4C;
- SceUInt32 field_50;
- SceUInt32 field_54;
+ SceSize size;
+ SceUInt32 field_4;
+ SceUInt32 attr;
+ SceUInt32 field_C;
+ SceUInt32 paddr;
+ SceSize alignment;
+ SceUInt32 field_18;
+ SceUInt32 field_1C;
+ SceUInt32 mirror_blkid;
+ SceUID pid;
+ SceUInt32 field_28;
+ SceUInt32 field_2C;
+ SceUInt32 field_30;
+ SceUInt32 field_34;
+ SceUInt32 field_38;
+ SceUInt32 field_3C;
+ SceUInt32 field_40;
+ SceUInt32 field_44;
+ SceUInt32 field_48;
+ SceUInt32 field_4C;
+ SceUInt32 field_50;
+ SceUInt32 field_54;
} SceKernelAllocMemBlockKernelOpt;
typedef struct SceKernelHeapCreateOpt {
- SceSize size;
- SceUInt32 uselock;
- SceUInt32 field_8;
- SceUInt32 field_C;
- SceUInt32 field_10;
- SceUInt32 field_14;
- SceUInt32 field_18;
+ SceSize size;
+ SceUInt32 uselock;
+ SceUInt32 field_8;
+ SceUInt32 field_C;
+ SceUInt32 field_10;
+ SceUInt32 field_14;
+ SceUInt32 field_18;
} SceKernelHeapCreateOpt;
typedef struct SceCreateUidObjOpt {
- SceUInt32 flags;
- SceUInt32 field_4;
- SceUInt32 field_8;
- SceUInt32 pid;
- SceUInt32 field_10;
- SceUInt32 field_14;
- SceUInt32 field_18;
+ SceUInt32 flags;
+ SceUInt32 field_4;
+ SceUInt32 field_8;
+ SceUInt32 pid;
+ SceUInt32 field_10;
+ SceUInt32 field_14;
+ SceUInt32 field_18;
} SceCreateUidObjOpt;
typedef enum SceKernelModel {
@@ -71,7 +76,33 @@ typedef enum SceKernelModel {
SCE_KERNEL_MODEL_VITATV = 0x20000
} SceKernelModel;
-#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_ALIGNMENT 0x00000004U
+typedef struct SceClass {
+ char data[0x2C];
+} SceClass;
+
+typedef struct SceObjectBase {
+ uint32_t sce_reserved[2];
+ uint32_t data[];
+} SceObjectBase;
+
+typedef struct SceKernelAddrPair {
+ uint32_t addr; //!< Address
+ uint32_t length; //!< Length
+} SceKernelAddrPair;
+
+typedef struct SceKernelPaddrListReq {
+ uint32_t size; //!< sizeof(SceKernelPaddrListReq)
+ uint32_t list_size; //!< Size in elements of the list array
+ uint32_t ret_length; //!< Total physical size of the memory pairs
+ uint32_t ret_count; //!< Number of elements of list filled by sceKernelGetPaddrList
+ SceKernelAddrPair *list; //!< Array of physical addresses and their lengths pairs
+} SceKernelPaddrListReq;
+
+typedef struct SceKernelProcessContext {
+ SceUInt32 TTBR1;
+ SceUInt32 DACR;
+ SceUInt32 CONTEXTIDR;
+} SceKernelProcessContext;
/***
* Allocates a new memory block
@@ -114,6 +145,17 @@ int sceKernelGetMemBlockBase(SceUID uid, void **basep);
*/
SceUID sceKernelFindMemBlockByAddr(const void *addr, SceSize size);
+/***
+ * Find the SceUID of a memory block for a PID
+ *
+ * @param[in] pid - PID of the process
+ * @param[in] addr - Base address of the memory block
+ * @param[in] size - Size to search for (usally set to 0)
+ *
+ * @return SceUID of the memory block on success, < 0 on error.
+*/
+SceUID sceKernelFindMemBlockByAddrForPid(SceUID pid, const void *addr, SceSize size);
+
/**
* Changes the block type
*
@@ -138,14 +180,6 @@ int sceKernelStrncpyUserToKernel(void *dst, uintptr_t src, size_t len);
int sceKernelStrncpyKernelToUser(uintptr_t dst, const void *src, size_t len);
int sceKernelStrncpyUserForPid(SceUID pid, void *dst, uintptr_t src, size_t len);
-typedef struct {
- char data[0x2C];
-} SceClass;
-
-typedef struct {
- uint32_t sce_reserved[2];
-} SceObjectBase;
-
SceUID sceKernelKernelUidForUserUid(SceUID pid, SceUID user_uid);
SceUID sceKernelCreateUserUid(SceUID pid, SceUID kern_uid);
SceUID sceKernelCreateUidObj(SceClass *cls, const char *name, SceCreateUidObjOpt *opt, SceObjectBase **obj);
@@ -195,13 +229,14 @@ int sceKernelDeleteUid(SceUID uid);
int sceKernelSwitchVmaForPid(SceUID pid);
void *sceKernelGetSysrootBuffer(void);
-int sceKernelGetPidContext(SceUID pid, int **ctx);
+int sceKernelGetPidContext(SceUID pid, SceKernelProcessContext **ctx);
int sceKernelGetProcessTitleId(SceUID pid, char *titleid, size_t len);
int sceKernelMapBlockUserVisible(SceUID uid);
int sceKernelGetPaddr(void *addr, uintptr_t *paddr);
+int sceKernelGetPaddrList(const SceKernelAddrPair *input, SceKernelPaddrListReq *req)
int sceSysrootIsManufacturingMode(void);