Difference between revisions of "SceSysmem"

From Vita Development Wiki
Jump to navigation Jump to search
 
(63 intermediate revisions by 3 users not shown)
Line 770: Line 770:
 
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_DOMAIN      0x00010000
 
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_HAS_DOMAIN      0x00010000
 
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_NOPHYPAGE        0x00020000
 
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_NOPHYPAGE        0x00020000
 +
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_DONT_MAP        0x00040000 // Do not map the memory block in the virtual address space (unofficial name)
 
#define SCE_KERNEL_ALLOC_MEMBLOCK_ATTR_PHYCONT         0x00200000 // Memory area is physically continuous.
 
#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_UNK              0x00400000
Line 978: Line 979:
 
#define SCE_KERNEL_PHYMEMLOW_TYPE_UNK 0x10002
 
#define SCE_KERNEL_PHYMEMLOW_TYPE_UNK 0x10002
 
#define SCE_KERNEL_PHYMEMLOW_TYPE_CDRAM 0x20001
 
#define SCE_KERNEL_PHYMEMLOW_TYPE_CDRAM 0x20001
 +
 +
typedef struct kernel_message_ctx { // size is 0x18 on FW 3.60
 +
  SceUInt32 fileHash; //First 4 bytes of SHA1(__FILE__) - e.g. 0x123EC4E8 = "processmgr.c"
 +
  SceUInt32 lineHash; //First 4 bytes of SHA1("%s:%d" % (__FILE__, __LINE__)) - e.g. 0x7D3F4B00 = "boot.c:1868"
 +
  SceUInt32 funcHash; //First 4 bytes of SHA1(__FUNC__) - e.g. 0x197C5ED2 = "LedModuleStart"
 +
  const char *pFile;  //Pointer to file name - can be NULL.
 +
  int line; //Line in file - ignored if pFile is NULL.
 +
  const char *pFunc; //Pointer to function name - ignored if pFile is NULL.
 +
} kernel_message_ctx;
  
 
/**
 
/**
Line 1,088: Line 1,098:
 
#define SCE_KERNEL_MEMORY_REF_PERM_0x10 0x10
 
#define SCE_KERNEL_MEMORY_REF_PERM_0x10 0x10
 
#define SCE_KERNEL_MEMORY_REF_PERM_0x20 0x20
 
#define SCE_KERNEL_MEMORY_REF_PERM_0x20 0x20
 +
 +
typedef struct SceKernelModulePrivate9 { // size is 0xAC-bytes on 3.60
 +
SceClass SceUIDModuleClass;
 +
SceClass SceUIDLibraryClass;
 +
SceClass SceUIDLibStubClass;
 +
SceKernelProcessModuleInfo ProcModuleInfo;
 +
SceUID ScePsp2BootConfig_modid;
 +
} SceKernelModulePrivate9;
 
</source>
 
</source>
  
Line 1,964: Line 1,982:
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60-3.61 || 0xF8E95A5A
+
| 0.990-3.61 || 0xF8E95A5A
 
|-
 
|-
| 3.63 || 0x0B1B4ACA
+
| 3.63-3.65 || 0x0B1B4ACA
 
|}
 
|}
  
 
<source lang="C">void *sceKernelGetPhyPartToolForKernel(void);</source>
 
<source lang="C">void *sceKernelGetPhyPartToolForKernel(void);</source>
 +
 +
=== SceSysmemForKernel_54E85275 ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 0.990-1.50 || not present
 +
|-
 +
| 3.60 || 0x54E85275
 +
|}
 +
 +
Uses result from [[SceSysmem#sceKernelGetPhyPartToolForKernel]].
 +
 +
<source lang="C">
 +
// pPhyPartTool comes from sceKernelGetPhyPartToolForKernel
 +
// pOut points to a structure of size 0xB0 bytes
 +
int SceSysmemForKernel_54E85275(void *pPhyPartTool, void *pOut);
 +
</source>
  
 
=== sceKernelGetPhyPartGameForKernel ===
 
=== sceKernelGetPhyPartGameForKernel ===
Line 2,855: Line 2,891:
 
<source lang="C">int sceKernelCopyFromUser32DomainForKernel(SceUID pid, void *dst, const void *src, SceSize size);</source>
 
<source lang="C">int sceKernelCopyFromUser32DomainForKernel(SceUID pid, void *dst, const void *src, SceSize size);</source>
  
=== sceKernelProcCopyToUserRxForKernel ===
+
=== sceKernelCopyToUserProcTextDomainForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x30931572
+
| 0.931-3.60 || 0x30931572
 
|-
 
|-
 
| 3.65 || 0x2995558D
 
| 3.65 || 0x2995558D
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelRxMemcpyKernelToUserForPidForKernel.
+
Temp name was sceKernelRxMemcpyKernelToUserForPidForKernel, sceKernelProcCopyToUserRxForKernel.
 +
 
 +
Same as [[SceSysmem#sceKernelCopyToUserProcDomainForDriver|sceKernelCopyToUserProcDomain]], but performs a DCache clean after the copy. Use this function if you want to write code in user pages.
  
Unrestricted memcpy to the virtual address space for process <code>pid</code>. Both <code>dst</code> and <code>src</code> must be in the address space of <code>pid</code> but <code>src</code> must also be accessible in the address space of the caller. This is normally used for resolving stubs in module loads. Same as write to RO but does a cache flush.
+
This function is usually called when resolving stubs during a module loads. In 3.60, DACR is set to 0x15450FC3 instead of 0xFFFFFFFF.
  
<source lang="c">int sceKernelProcCopyToUserRxForKernel(SceUID pid, void *dst, const void *src, SceSize size);</source>
+
<source lang="c">SceInt32 sceKernelCopyToUserProcTextDomainForKernel(SceUID pid, void *uaddr, const void *kaddr, SceSize size);</source>
  
=== sceKernelCopyToUserRxForKernel ===
+
=== sceKernelCopyToUserTextDomainForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 2,881: Line 2,919:
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelMemcpyToUserRxForKernel.
+
This is a guessed name. Temp names were sceKernelMemcpyToUserRxForKernel, sceKernelCopyToUserRxForKernel.
 +
 
 +
Similar to [[SceSysmem#sceKernelCopyToUserProcTextDomainForKernel|sceKernelCopyToUserProcTextDomain]], but performed in the current address space.
  
<source lang="c">int sceKernelCopyToUserRxForKernel(void *dst, const void *src, SceSize len);</source>
+
In 3.60, sceKernelCopyToUserProcTextDomain calls this function to perform the copy after changing address space.
  
=== sceKernelCopyToUserRoForKernel ===
+
<source lang="c">SceInt32 sceKernelCopyToUserTextDomainForKernel(void *dst, const void *src, SceSize len);</source>
 +
 
 +
=== sceKernelCopyToUserDomainForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 +
|-
 +
| 0.931 || Not present
 
|-
 
|-
 
| 3.60 || 0xA6F95838
 
| 3.60 || 0xA6F95838
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelMemcpyToUserRoForKernel.
+
This is a guessed name. Temp names were sceKernelMemcpyToUserRoForKernel, sceKernelCopyToUserRoForKernel.
  
<source lang="c">int sceKernelCopyToUserRoForKernel(void *dst, const void *src, SceSize len);</source>
+
Similar to [[SceSysmem#sceKernelCopyToUserTextDomainForKernel|sceKernelCopyToUserTextDomain]], but doesn't perform any DCache clean.
 +
 
 +
Uses the same DACR, 0x15450FC3, for the copy.
 +
 
 +
<source lang="c">int sceKernelCopyToUserDomainForKernel(void *dst, const void *src, SceSize len);</source>
  
 
=== sceUIDtoObjectForKernel ===
 
=== sceUIDtoObjectForKernel ===
Line 3,126: Line 3,174:
  
 
<source lang="c">SceClass *sceKernelGetUIDDLinkClassForKernel(void);</source>
 
<source lang="c">SceClass *sceKernelGetUIDDLinkClassForKernel(void);</source>
 
=== SceSysmemForKernel_F8E95A5A ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 0.990-3.60 || 0xF8E95A5A
 
|-
 
| 3.65 || 0x0B1B4ACA
 
|}
 
 
Certainly returns address to a structure.
 
 
<source lang="C">int SceSysmemForKernel_F8E95A5A(void);</source>
 
 
=== SceSysmemForKernel_54E85275 ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 0.990-1.50 || not present
 
|-
 
| 3.60 || 0x54E85275
 
|}
 
 
Uses result from [[SceSysmem#SceSysmemForKernel_F8E95A5A]].
 
 
<source lang="C">
 
// some_struct comes from SceSysmemForKernel_F8E95A5A
 
// out_struct size is 0xB0 bytes
 
int SceSysmemForKernel_54E85275(void *some_struct, void *out_struct);
 
</source>
 
  
 
=== SceSysmemForKernel_7BD56D6D ===
 
=== SceSysmemForKernel_7BD56D6D ===
Line 4,284: Line 4,300:
 
<source lang="C">SceUID sceKernelProcUserMapForDriver(SceUID pid, const char *name, int permission, const void *user_buf, SceSize size, void **kernel_page, SceSize *kernel_size, SceUInt32 *kernel_offset);</source>
 
<source lang="C">SceUID sceKernelProcUserMapForDriver(SceUID pid, const char *name, int permission, const void *user_buf, SceSize size, void **kernel_page, SceSize *kernel_size, SceUInt32 *kernel_offset);</source>
  
=== sceKernelMapUserBlockForDriver ===
+
=== sceKernelUserMapWithFlagsForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,293: Line 4,309:
 
| 1.50-3.60 || 0x7D4F8B5F
 
| 1.50-3.60 || 0x7D4F8B5F
 
|}
 
|}
 +
 +
Temp name was sceKernelMapUserBlockForDriver.
  
 
Permission is either "1" for read only, no execute or "2"/"3" for read write, no execute. Type is either 0, 1, or 17 and affects the block type. 0 is default. This will allocate kernel memory starting at kernel_page. To get the same memory as the user pointer, add the kernel_offset. kernel_size is how much is allocated.
 
Permission is either "1" for read only, no execute or "2"/"3" for read write, no execute. Type is either 0, 1, or 17 and affects the block type. 0 is default. This will allocate kernel memory starting at kernel_page. To get the same memory as the user pointer, add the kernel_offset. kernel_size is how much is allocated.
Line 4,298: Line 4,316:
 
<source lang="c">
 
<source lang="c">
 
// this signature is for FW 1.50-1.69
 
// this signature is for FW 1.50-1.69
int sceKernelMapUserBlockForDriver(int permission, int type, void *user_buf, int size, void **kernel_page, int *kernel_size, int *kernel_offset);
+
int sceKernelUserMapWithFlagsForDriver(int permission, int type, void *user_buf, int size, void **kernel_page, int *kernel_size, int *kernel_offset);
  
 
// this signature is for FW 3.60 - it now allows to give a name
 
// this signature is for FW 3.60 - it now allows to give a name
int sceKernelMapUserBlockForDriver(char *name, int permission, int type, void *user_buf, int size, void **kernel_page, int *kernel_size, int *kernel_offset);
+
int sceKernelUserMapWithFlagsForDriver(char *name, int permission, int type, void *user_buf, int size, void **kernel_page, int *kernel_size, int *kernel_offset);
 
</source>
 
</source>
  
Line 4,402: Line 4,420:
 
<source lang="c">int sceKernelMemBlockTypeGetUnknownForDriver(SceKernelMemBlockType type);</source>
 
<source lang="c">int sceKernelMemBlockTypeGetUnknownForDriver(SceKernelMemBlockType type);</source>
  
=== sceKernelMemRangeReleaseForDriver ===
+
=== sceKernelUnlockRangeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,410: Line 4,428:
 
|}
 
|}
  
<source lang="c">int sceKernelMemRangeReleaseForDriver(void *addr, SceSize size);</source>
+
Temp name was sceKernelMemRangeReleaseForDriver.
 +
 
 +
<source lang="c">int sceKernelUnlockRangeForDriver(void *addr, SceSize size);</source>
  
=== sceKernelMemRangeReleaseForPidForDriver ===
+
=== sceKernelUnlockRangeProcForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,420: Line 4,440:
 
|}
 
|}
  
<source lang="c">int sceKernelMemRangeReleaseForPidForDriver(SceUID pid, void *addr, SceSize size);</source>
+
This is a guessed name. Temp name was sceKernelMemRangeReleaseForPidForDriver.
 +
 
 +
<source lang="c">int sceKernelUnlockRangeProcForDriver(SceUID pid, void *addr, SceSize size);</source>
  
=== sceKernelMemRangeReleaseWithPermForDriver ===
+
=== sceKernelUnlockRangeWithPermForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,429: Line 4,451:
 
| 3.60 || 0x22CBE925
 
| 3.60 || 0x22CBE925
 
|}
 
|}
 +
 +
This is a guessed name. Temp name was sceKernelMemRangeReleaseWithPermForDriver.
  
 
Decrease references to pages.
 
Decrease references to pages.
  
<source lang="c">int sceKernelMemRangeReleaseWithPermForDriver(SceKernelMemoryRefPerm perm, void *addr, SceSize size);</source>
+
<source lang="c">int sceKernelUnlockRangeWithPermForDriver(SceKernelMemoryRefPerm perm, void *addr, SceSize size);</source>
  
=== sceKernelMemRangeRetainForDriver ===
+
=== sceKernelLockRangeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,442: Line 4,466:
 
|}
 
|}
  
<source lang="c">int sceKernelMemRangeRetainForDriver(void *addr, SceSize size);</source>
+
Temp name was sceKernelMemRangeRetainForDriver.
 +
 
 +
<source lang="c">int sceKernelLockRangeForDriver(void *addr, SceSize size);</source>
  
=== sceKernelMemRangeRetainForPidForDriver ===
+
=== sceKernelLockRangeProcForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,452: Line 4,478:
 
|}
 
|}
  
<source lang="c">int sceKernelMemRangeRetainForPidForDriver(SceUID pid, void *addr, SceSize size);</source>
+
This is a guessed name. Temp name was sceKernelMemRangeRetainForPidForDriver.
  
=== sceKernelMemRangeRetainWithPermForDriver ===
+
<source lang="c">int sceKernelLockRangeProcForDriver(SceUID pid, void *addr, SceSize size);</source>
 +
 
 +
=== sceKernelLockRangeWithPermForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 4,461: Line 4,489:
 
| 3.60 || 0xBC0A1D60
 
| 3.60 || 0xBC0A1D60
 
|}
 
|}
 +
 +
This is a guessed name. Temp name was sceKernelMemRangeRetainWithPermForDriver.
  
 
Increase references to pages.
 
Increase references to pages.
  
<source lang="c">int sceKernelMemRangeRetainWithPermForDriver(SceKernelMemoryRefPerm perm, void *addr, SceSize size);</source>
+
<source lang="c">int sceKernelLockRangeWithPermForDriver(SceKernelMemoryRefPerm perm, void *addr, SceSize size);</source>
  
=== sceKernelProcCopyToUserRoForDriver ===
+
=== sceKernelCopyToUserProcDomainForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.69 || 0x571D2739
+
| 0.931-1.69 || 0x571D2739
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
This is a guessed name Temp name was sceKernelRoMemcpyKernelToUserForPidForDriver.
+
Temp names were sceKernelRoMemcpyKernelToUserForPidForDriver, sceKernelProcCopyToUserRoForDriver.
 +
 
 +
Same as [[SceSysmem#sceKernelCopyToUserProcForDriver|sceKernelCopyToUserProc]], but sets DACR to 0xFFFFFFFF (ignore access permission bits in page table) before the copy then restores it. Use this function instead of sceKernelCopyToUserProc if you need to write data to read-only pages.
  
<source lang="c">int sceKernelProcCopyToUserRoForDriver(SceUID pid, void *dst, const void *src, SceSize size);</source>
+
<source lang="c">SceInt32 sceKernelCopyToUserProcDomainForDriver(SceUID pid, void *dst, const void *src, SceSize size);</source>
  
 
=== sceKernelCopyToUserForDriver ===
 
=== sceKernelCopyToUserForDriver ===
Line 4,485: Line 4,517:
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x6D88EF8A
+
| 0.931-3.60 || 0x6D88EF8A
 
|}
 
|}
  
 
Temp name was sceKernelMemcpyKernelToUserForDriver.
 
Temp name was sceKernelMemcpyKernelToUserForDriver.
  
<source lang="c">int sceKernelCopyToUserForDriver(void *dst, const void *src, SceSize size);</source>
+
Copies <code>size</code> bytes from a kernel buffer to a user buffer. Writes to <code>uaddr</code> are performed using <code>strt</code>-type instructions which cause a Data Abort if the pages are not user-accessible. If any Data Abort occurs during the operation, the exception is swallowed and an error is returned. Otherwise, the function returns <code>SCE_OK</code>.
 +
 
 +
<source lang="c">SceInt32 sceKernelCopyToUserForDriver(void *uaddr, const void *kaddr, SceSize size);</source>
  
=== sceKernelProcCopyToUserForDriver ===
+
=== sceKernelCopyToUserProcForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x6B825479
+
| 0.931-3.60 || 0x6B825479
 
|}
 
|}
  
Temp name was sceKernelMemcpyKernelToUserForPidForDriver. Possible name is sceKernelCopyoutProcForDriver.
+
Temp name was sceKernelMemcpyKernelToUserForPidForDriver, sceKernelProcCopyToUserForDriver.
  
This will not crash on invalid user pointers, but instead return error.
+
Temporarily switches to specified process' address space for a call to [[SceSysmem#sceKernelCopyToUserForDriver|sceKernelCopyToUser]].
  
<source lang="c">int sceKernelProcCopyToUserForDriver(SceUID pid, void *dst, const void *src, SceSize size);</source>
+
<source lang="c">SceInt32 sceKernelProcCopyToUserForDriver(ScePID pid, void *uaddr, const void *kaddr, SceSize size);</source>
  
 
=== sceKernelReadUserForDriver ===
 
=== sceKernelReadUserForDriver ===
Line 4,528: Line 4,562:
 
Temp name was sceKernelMemcpyUserToKernelForDriver.
 
Temp name was sceKernelMemcpyUserToKernelForDriver.
  
<source lang="c">int sceKernelCopyFromUserForDriver(void *dst, const void *src, SceSize size);</source>
+
Copies <code>size</code> bytes from a user buffer to a kernel buffer. Reads from <code>uaddr</code> are performed using <code>ldrt</code>-type instructions which cause a Data Abort if the pages are not user-accessible. If any Data Abort occurs during the operation, the exception is swallowed and an error is returned. Otherwise, the function returns <code>SCE_OK</code>.
 +
 
 +
<source lang="c">SceInt32 sceKernelCopyFromUserForDriver(void *kaddr, const void *uaddr, SceSize size);</source>
  
=== sceKernelProcCopyFromUserForDriver ===
+
=== sceKernelCopyFromUserProcForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x605275F8
+
| 0.931-3.60 || 0x605275F8
 
|}
 
|}
  
Temp name was sceKernelMemcpyUserToKernelForPidForDriver.
+
Temp names were sceKernelMemcpyUserToKernelForPidForDriver, sceKernelProcCopyFromUserForDriver.
 +
 
 +
Temporarily switches to specified process' address space for a call to [[SceSysmem#sceKernelCopyFromUserForDriver|sceKernelCopyFromUser]].
  
<source lang="c">int sceKernelProcCopyFromUserForDriver(SceUID pid, void *dst, void *src, SceSize size);</source>
+
<source lang="c">SceInt32 sceKernelCopyFromUserProcForDriver(SceUID pid, void *dst, void *src, SceSize size);</source>
  
 
=== sceKernelUserCopyForDriver ===
 
=== sceKernelUserCopyForDriver ===
Line 5,051: Line 5,089:
 
The SceSysmem library is responsible for both low-level and high-level memory management. There are functions for allocating raw blocks of memory (similar to Linux <code>sbrk</code>) as well as functions for maintaining a heap-like structure (similar to <code>malloc</code>) for kernel, however [[SceLibKernel]] implements a proper heap and that is used for user code.
 
The SceSysmem library is responsible for both low-level and high-level memory management. There are functions for allocating raw blocks of memory (similar to Linux <code>sbrk</code>) as well as functions for maintaining a heap-like structure (similar to <code>malloc</code>) for kernel, however [[SceLibKernel]] implements a proper heap and that is used for user code.
  
== SceDipsw ==
+
=== sceKernelMapMemBlock ===
 
 
=== sceKernelCheckDipsw ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x1C783FB2
+
| 0.990-1.69 || 0x7B763A21
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
=== sceKernelClearDipsw ===
+
=== sceKernelRemapMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x800EDCC1
+
| 0.990-1.69 || 0x3B29E0F5
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
=== sceKernelSetDipsw ===
+
=== sceKernelPartialMapMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x817053D4
+
| 0.990 || not present
 +
|-
 +
| 1.69 || 0xC0A59868
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
== SceDipswForDriver ==
+
=== sceKernelUnmapMemBlock ===
 
 
=== sceKernelCheckDipswForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA98FC2FD
+
| 0.990-1.69 || 0xEE30D976
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelCheckDipswForDriver(int no);</source>
+
<source lang="C">int sceKernelUnmapMemBlock(SceUID uid);</source>
  
=== sceKernelGetDipswInfoForDriver ===
+
=== sceKernelPartialUnmapMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB2AD48BE
+
| 0.990 || not present
 +
|-
 +
| 1.69 || 0xCA99929B
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
This is a guessed name (cannot find an evidence).
+
=== sceKernelGetMemBlockInfoByRange ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 0.990 || not present
 +
|-
 +
| 0.996-3.60 || 0x006F3DB4
 +
|}
  
<source lang="C">return *(int *)(dipsw_addr + 4 * info_id);</source>
+
<source lang="c">
 +
/**
 +
* @brief Get memory block informaton by virtual address range
  
info_id:
+
* @param[in] vbase base address
* 0: CP timestamp 1
+
* @param[in] vsize  size
* 1: CP Version, CP Board ID
+
* @param[inout] pInfo information structure
* 2: CP timestamp 2
+
*/
* 3: ASLR Seed
+
int sceKernelGetMemBlockInfoByRange(void *vbase, SceSize vsize, SceKernelMemBlockInfo *pInfo);
 +
</source>
  
See [[KBL Param#DIP Switches]].
+
=== sceKernelGetMemBlockInfoByAddr ===
 
 
<source lang="C">int sceKernelGetDipswInfoForDriver(SceUInt32 info_id);</source>
 
 
 
=== sceKernelClearDipswForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF1F3E9FE
+
| 0.990-3.60 || 0x4010AD65
 
|}
 
|}
  
<source lang="C">void sceKernelClearDipswForDriver(int no);</source>
+
<source lang="c">
 +
/**
 +
* @brief Get memory block information.
 +
*
 +
* Get information about a memory block.
 +
* @param[in] vbase Base address
 +
* @param[inout] pInfo Information structure
 +
*/
 +
int sceKernelGetMemBlockInfoByAddr(void *vbase, SceKernelMemBlockInfo *pInfo);
 +
</source>
  
=== sceKernelSetDipswForDriver ===
+
=== sceKernelGetSubbudgetInfo ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x82E45FBF
+
| 0.990 || not present
 +
|-
 +
| 1.69-3.60 || 0x832B4A65
 
|}
 
|}
  
<source lang="C">void sceKernelSetDipswForDriver(int no);</source>
+
<source lang="c">
 +
typedef struct SceKernelSubbudgetInfo { // size is 0xC on FW 3.60
 +
  int size; // Size of this structure
 +
  int unk_4;
 +
  int unk_8;
 +
} SceKernelSubbudgetInfo;
  
== SceUartForKernel ==
+
int sceKernelGetSubbudgetInfo(SceBool unk_boolean, SceKernelSubbudgetInfo *pInfo);
 +
</source>
  
=== sceKernelUartInitForKernel ===
+
=== sceKernelGetFreeMemorySize ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xA9C74212
+
| 1.69-3.60 || 0x87CC580B
 
|}
 
|}
 
Temp name was sceUartInitForKernel.
 
 
It initializes the clock generator registers for the UART <code>port</code>. See [[UART Registers]]. The default baud rate is 115200 for ports 0-5 and 250000 for port 6.
 
  
 
<source lang="C">
 
<source lang="C">
// port: 0-6
+
/**
int sceKernelUartInitForKernel(SceUInt32 port);
+
* Get free memory size
 +
*/
 +
int sceKernelGetFreeMemorySize(SceKernelFreeMemorySizeInfo *info);
 
</source>
 
</source>
  
=== sceKernelUartReadAvailableForKernel ===
+
=== sceKernelOpenMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || not present
+
| 0.990-3.60 || 0x8EB8DFBB
|-
 
| 3.60 || 0x38DB7629
 
 
|}
 
|}
  
Temp name was sceUartReadAvailableForKernel.
+
<source lang="c">
 
+
// on FW <= 1.691, flags is not used
Returns the number of words available to read from the read FIFO.
+
SceUID sceKernelOpenMemBlock(const char *name, int flags);
 +
</source>
  
<source lang="c">int sceKernelUartReadAvailableForKernel(int port);</source>
+
=== sceKernelFindMemBlockByAddr ===
 
 
=== sceKernelUartReadForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x9BBF1255
+
| 0.990-3.60 || 0xA33B99D1
 
|}
 
|}
  
Temp name was sceUartReadForKernel.
+
<source lang="c">
 
+
/**
<source lang="c">int sceKernelUartReadForKernel(int port);</source>
+
* Find memory block by virtual range (base address and size)
 +
* If size == 0, API returns a memory block which contains 'start'
 +
* If size > 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 <SCE_OK error
 +
*/
 +
SceUID sceKernelFindMemBlockByAddr(void *vaddr, SceSize size);
 +
</source>
  
=== sceKernelUartWriteForKernel ===
+
=== sceKernelFreeMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x41973874
+
| 0.990-3.60 || 0xA91E15EE
 
|}
 
|}
  
Temp name was sceUartWriteForKernel.
+
<source lang="c">
 
+
/**
<source lang="c">int sceKernelUartWriteForKernel(int port, char c);</source>
+
* Free memory block.
 +
*
 +
* @param[in] uid block uid
 +
* @retval SCE_OK Success
 +
* @retval <SCE_OK Error code
 +
*/
 +
int sceKernelFreeMemBlock(SceUID uid);
 +
</source>
  
=== sceKernelUartPutcharForKernel ===
+
=== sceKernelFreeMemBlockForVM ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0xAF243C6A
+
| 3.60 || 0x4EA13FEA
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="c">int sceKernelUartPutcharForKernel(char c);</source>
+
<source lang="c">int sceKernelFreeMemBlockForVM(SceUID uid);</source>
  
== SceCpu ==
+
=== sceKernelCloseMemBlock ===
This library provides wrapper for much ARM CP15 co-processor access as well as low level support of spinlocks and other synchronization primitives.
 
 
 
=== sceKernelCpuId ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x2704CFEE
+
| 0.990-3.60 || 0xB680E3A0
 
|}
 
|}
  
Return the CPU ID of the current core.
+
<source lang="c">int sceKernelCloseMemBlock(SceUID uid);</source>
 
 
<source lang="c">SceUInt sceKernelCpuId(void);</source>
 
  
== SceCpuForKernel ==
+
=== sceKernelGetMemBlockBase ===
 
 
=== sceKernelSendEventForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x45885327
+
| 0.996-3.60 || 0xB8EF5818
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">void sceKernelSendEventForKernel(void);</source>
+
<source lang="C">
 +
/**
 +
* @brief Get mapped base address of memory block.
 +
*
 +
* Get base address of memory block.
 +
* @param[in] uid block id
 +
* @param[out] ppBase base address of memory block
 +
* @retval SCE_OK success
 +
* @retval <SCE_OK Error
 +
*/
 +
int sceKernelGetMemBlockBase(SceUID uid, void **ppBase);
 +
</source>
  
=== sceKernelWaitForEventForKernel ===
+
=== sceKernelAllocMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xD2629465
+
| 0.990-3.60 || 0xB9D5EBDE
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">void sceKernelWaitForEventForKernel(void);</source>
+
<source lang="c">
 +
/**
 +
* Reserve a new memory block.
 +
*
 +
* The memory types that can be specified for type are as follows.
 +
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_RW
 +
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE
 +
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_RW
 +
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW
 +
* - SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW
 +
*
 +
* Allocate a 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 <SCE_OK Error code
 +
*/
 +
SceUID sceKernelAllocMemBlock(const char *name, SceKernelMemBlockType type, SceSize vsize, const struct SceKernelAllocMemBlockOpt *pOpt);
 +
</source>
  
=== sceKernelPrintCpuModeForKernel ===
+
=== sceKernelAllocUnmapMemBlock ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xDC99515C
+
| 3.60 || 0xEC636BCB
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
=== sceKernelTlsKernelSetForKernel ===
+
<source lang="c">int sceKernelAllocUnmapMemBlock(char *name, SceSize size);</source>
 +
 
 +
=== sceKernelOpenVMDomain ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.940 || 0x7A180AA4
+
| 1.69-3.60 || 0x9CA3EB2B
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">
+
<source lang="c">int sceKernelOpenVMDomain();</source>
// thread_index must be < 8
 
void *sceKernelTlsKernelSetForKernel(SceUInt32 thread_index, void *tls);
 
</source>
 
  
=== sceKernelTlsKernelGetForKernel ===
+
=== sceKernelSyncVMDomain ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.940 || 0x28E080BC
+
| 1.69-3.60 || 0x19D2A81A
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">
+
<source lang="c">int sceKernelSyncVMDomain(SceUID uid, void *data, SceSize size);</source>
// thread_index must be < 8
 
void *sceKernelTlsKernelGetForKernel(SceUInt32 thread_index);
 
</source>
 
  
=== sceKernelRoundupDCacheLineForKernel ===
+
=== sceKernelCloseVMDomain ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0xED512F50
+
| 1.69-3.60 || 0xD6CA56CA
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
Calls the function previously registered by [[SceSysmem#sceKernelSetRoundupDCacheLineFuncForKernel]].
+
<source lang="c">int sceKernelCloseVMDomain();</source>
 
 
<source lang="C">int sceKernelRoundupDCacheLineForKernel(int a1);</source>
 
  
=== sceKernelSetRoundupDCacheLineFuncForKernel ===
+
=== sceKernelAllocMemBlockForVM ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x66C3AA93
+
| 1.69-3.60 || 0xE2D7E137
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
Uses CTR and CTR-DMINLINE to determine which function to return.
+
<source lang="c">SceUID sceKernelAllocMemBlockForVM(const char *name, SceSize vsize);</source>
  
<source lang="C">(int sceKernelRoundupDCacheLineForKernel(int) *) sceKernelSetRoundupDCacheLineFuncForKernel(void);</source>
+
=== sceKernelCheckModelCapability ===
 
 
=== sceKernelReadUser8ForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x942B92C3
+
| 3.60 || 0x0144FBD9
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelReadUser8ForKernel(uint8_t *dest, uint8_t *psrc);</source>
+
<source lang="c">int sceKernelCheckModelCapability(int bit);</source>
  
=== sceKernelReadUser16ForKernel ===
+
=== sceKernelGetModelForCDialog ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || maybe present
+
| 3.60 || 0xA2CB322F
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelReadUser16ForKernel(uint16_t *dest, uint16_t *psrc);</source>
+
<source lang="c">int sceKernelGetModelForCDialog();</source>
  
=== sceKernelReadUser32ForKernel ===
+
=== sceKernelGetModel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x6091086F
+
| 3.60 || 0xD0D4F729
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelReadUser32ForKernel(uint32_t *dest, uint32_t *psrc);</source>
+
<source lang="c">int sceKernelGetModel();</source>
  
=== sceKernelWriteUser8ForKernel ===
+
=== sceKernelIsPSVitaTV ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x13B7B151
+
| 3.60 || 0x1453A5E5
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelWriteUser8ForKernel(uint8_t *dest, uint8_t val);</source>
+
<source lang="c">int sceKernelIsPSVitaTV();</source>
 +
 
 +
== SceDipsw ==
  
=== sceKernelWriteUser16ForKernel ===
+
=== sceKernelCheckDipsw ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || maybe present
+
| 1.69-3.60 || 0x1C783FB2
 +
|}
 +
 
 +
=== sceKernelClearDipsw ===
 +
{| class="wikitable"
 
|-
 
|-
| 3.60 || not present
+
! Version !! NID
 +
|-
 +
| 1.69-3.60 || 0x800EDCC1
 
|}
 
|}
  
<source lang="C">int sceKernelWriteUser16ForKernel(uint16_t *dest, uint16_t val);</source>
+
=== sceKernelSetDipsw ===
 
 
=== sceKernelWriteUser32ForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x101894E0
+
| 1.69-3.60 || 0x817053D4
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelWriteUser32ForKernel(uint32_t *dest, uint32_t val);</source>
+
== SceDipswForDriver ==
  
=== sceKernelVMRead8ForKernel ===
+
=== sceKernelCheckDipswForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xA2F0FE9D
+
| 3.60 || 0xA98FC2FD
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelVMRead8ForKernel(uint8_t *dest, uint8_t *psrc);</source>
+
<source lang="C">int sceKernelCheckDipswForDriver(int no);</source>
  
=== sceKernelVMRead16ForKernel ===
+
=== sceKernelGetDipswInfoForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xF31D4D10
+
| 3.60 || 0xB2AD48BE
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelVMRead16ForKernel(uint16_t *dest, uint16_t *psrc);</source>
+
This is a guessed name (cannot find an evidence).
 +
 
 +
<source lang="C">return *(int *)(dipsw_addr + 4 * info_id);</source>
 +
 
 +
info_id:
 +
* 0: CP timestamp 1
 +
* 1: CP Version, CP Board ID
 +
* 2: CP timestamp 2
 +
* 3: ASLR Seed
 +
 
 +
See [[KBL Param#DIP Switches]].
 +
 
 +
<source lang="C">int sceKernelGetDipswInfoForDriver(SceUInt32 info_id);</source>
  
=== sceKernelVMRead32ForKernel ===
+
=== sceKernelClearDipswForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x316574B1
+
| 3.60 || 0xF1F3E9FE
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelVMRead32ForKernel(uint32_t *dest, uint32_t *psrc);</source>
+
<source lang="C">void sceKernelClearDipswForDriver(int no);</source>
  
=== sceKernelVMWrite8ForKernel ===
+
=== sceKernelSetDipswForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xA3C65664
+
| 3.60 || 0x82E45FBF
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelVMWrite8ForKernel(uint8_t *dest, uint8_t val);</source>
+
<source lang="C">void sceKernelSetDipswForDriver(int no);</source>
 +
 
 +
== SceUartForKernel ==
  
=== sceKernelVMWrite16ForKernel ===
+
=== sceKernelUartInitForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xBF38A460
+
| 0.931-3.60 || 0xA9C74212
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelVMWrite16ForKernel(uint16_t *dest, uint16_t val);</source>
+
Temp name was sceUartInitForKernel.
 +
 
 +
It initializes the clock generator registers for the UART <code>port</code>. See [[UART Registers]]. The default baud rate is 115200 for ports 0-5 and 250000 for port 6.
 +
 
 +
<source lang="C">
 +
// port: 0-6
 +
int sceKernelUartInitForKernel(SceUInt32 port);
 +
</source>
  
=== sceKernelVMWrite32ForKernel ===
+
=== sceKernelUartReadAvailableForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x04D129B2
+
| 0.990 || not present
 
|-
 
|-
| 3.60 || not present
+
| 3.60 || 0x38DB7629
 
|}
 
|}
  
<source lang="C">int sceKernelVMWrite32ForKernel(uint32_t *dest, uint32_t val);</source>
+
Temp name was sceUartReadAvailableForKernel.
 +
 
 +
Returns the number of words available to read from the read FIFO.
 +
 
 +
<source lang="c">int sceKernelUartReadAvailableForKernel(int port);</source>
  
=== sceKernelMMUIsValidMapForKernel ===
+
=== sceKernelUartReadForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x4891F923
+
| 0.931-3.60 || 0x9BBF1255
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelMMUIsValidMapForKernel(SceKernelMMUContext *context, const void *vbase, SceSize size, const void *pbase);</source>
+
Temp name was sceUartReadForKernel.
 +
 
 +
<source lang="c">int sceKernelUartReadForKernel(int port);</source>
  
=== sceKernelMMUIsValidUnmapForKernel ===
+
=== sceKernelUartWriteForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x60EA8433
+
| 0.931-3.60 || 0x41973874
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelMMUIsValidUnmapForKernel(SceKernelMMUContext *context, const void *vbase, SceSize size);</source>
+
Temp name was sceUartWriteForKernel.
 +
 
 +
<source lang="c">int sceKernelUartWriteForKernel(int port, char c);</source>
  
=== sceKernelMMUL1GetInfoForKernel ===
+
=== sceKernelUartPutcharForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x9D346F87
+
| 0.931-0.990 || 0xAF243C6A
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
Parses a L1PT for information about a specific entry. Pass the address of the L1PT in <code>l1pt</code>. Used by [[SceSysmem#sceKernelAddressSpaceGetMMUL1InfoForKernel|sceKernelAddressSpaceGetMMUL1InfoForKernel]].
+
<source lang="c">int sceKernelUartPutcharForKernel(char c);</source>
  
<source lang="C">SceInt32 sceKernelMMUL1GetInfoForKernel(void* l1pt, const void *addr, SceKernelMMUL1Info *pInfo);</source>
+
== SceCpu ==
 +
This library provides wrapper for much ARM CP15 co-processor access as well as low level support of spinlocks and other synchronization primitives.
  
=== sceKernelMMUL2GetInfoForKernel ===
+
=== sceKernelCpuId ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x247629A7
+
| 1.69-3.60 || 0x2704CFEE
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelMMUL2GetInfoForKernel(int a1, void *addr, void *pInfo);</source>
+
Return the CPU ID of the current core.
 +
 
 +
<source lang="c">SceUInt sceKernelCpuId(void);</source>
 +
 
 +
== SceCpuForKernel ==
  
=== sceKernelMMUMapSectionsForKernel ===
+
=== sceKernelSendEventForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x868B471A
+
| 0.990 || 0x45885327
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
|-
 
| 3.65 || Present, but not exported
 
 
|}
 
|}
  
<source lang="C">SceInt32 sceKernelMMUMapSectionsForKernel(const void *ttbr, SceKernelMemoryType code, SceUInt32 domain, void *vaddr, SceSize vsize, void *paddr);</source>
+
<source lang="C">void sceKernelSendEventForKernel(void);</source>
  
=== sceKernelMMUMapSupersectionsForKernel ===
+
=== sceKernelWaitForEventForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x0D9DA15F
+
| 0.931 || 0xD2629465
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
|-
 
| 3.65 || Present, but not exported
 
 
|}
 
|}
  
<source lang="C">SceInt32 sceKernelMMUMapSupersectionsForKernel(const void *ttbr, SceKernelMemoryType code, SceUInt32 domain, void *vaddr, SceSize vsize, void *paddr);</source>
+
<source lang="C">void sceKernelWaitForEventForKernel(void);</source>
  
=== sceKernelMMUMapSmallPagesForKernel ===
+
=== sceKernelPrintCpuModeForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0xB953E022
+
| 0.931 || 0xDC99515C
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
|-
 
| 3.65 || Present, but not exported
 
 
|}
 
|}
  
<source lang="C">int sceKernelMMUMapSmallPagesForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, SceSize vsize, void *paddr);</source>
+
=== sceKernelTlsKernelSetForKernel ===
 
 
=== sceKernelMMUMapSmallPageForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0xCC7C16F8
+
| 0.940 || 0x7A180AA4
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUMapSmallPageForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, void *paddr);</source>
+
<source lang="C">
 +
// thread_index must be < 8
 +
void *sceKernelTlsKernelSetForKernel(SceUInt32 thread_index, void *tls);
 +
</source>
  
=== sceKernelMMUMapLargePagesForKernel ===
+
=== sceKernelTlsKernelGetForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x78D32D38
+
| 0.940 || 0x28E080BC
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
|-
 
| 3.65 || Present, but not exported
 
 
|}
 
|}
  
<source lang="C">int sceKernelMMUMapLargePagesForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, SceSize vsize, void *paddr);</source>
+
<source lang="C">
 +
// thread_index must be < 8
 +
void *sceKernelTlsKernelGetForKernel(SceUInt32 thread_index);
 +
</source>
  
=== sceKernelMMUUnmapSectionsWithFlagsForKernel ===
+
=== sceKernelRoundupDCacheLineForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0xFC657FD1
+
| 0.931-0.990 || 0xED512F50
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUUnmapSectionsWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceSize vsize, SceUInt32 flags);</source>
+
Calls the function previously registered by [[SceSysmem#sceKernelSetRoundupDCacheLineFuncForKernel]].
 +
 
 +
<source lang="C">int sceKernelRoundupDCacheLineForKernel(int a1);</source>
  
=== sceKernelMMUUnmapSupersectionsWithFlagsForKernel ===
+
=== sceKernelSetRoundupDCacheLineFuncForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x0E4D29C6
+
| 0.931-0.990 || 0x66C3AA93
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUUnmapSupersectionsWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceSize vsize, SceUInt32 flags);</source>
+
Uses CTR and CTR-DMINLINE to determine which function to return.
 +
 
 +
<source lang="C">(int sceKernelRoundupDCacheLineForKernel(int) *) sceKernelSetRoundupDCacheLineFuncForKernel(void);</source>
  
=== sceKernelMMUUnmapSmallPagesWithFlagsForKernel ===
+
=== sceKernelReadUser8ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x11EBA8CE
+
| 0.990 || 0x942B92C3
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUUnmapSmallPagesWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceUInt32 voffset, SceSize vsize, SceUInt32 flags);</source>
+
<source lang="C">int sceKernelReadUser8ForKernel(uint8_t *dest, uint8_t *psrc);</source>
  
=== sceKernelMMUUnmapLargePagesWithFlagsForKernel ===
+
=== sceKernelReadUser16ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x44319918
+
| 0.990 || maybe present
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUUnmapLargePagesWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceUInt32 voffset, SceSize vsize, SceUInt32 flags);</source>
+
<source lang="C">int sceKernelReadUser16ForKernel(uint16_t *dest, uint16_t *psrc);</source>
  
=== sceKernelMMUL1VAtoPABySWForKernel ===
+
=== sceKernelReadUser32ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x8E4ECF17
+
| 0.990 || 0x6091086F
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUL1VAtoPABySWForKernel(const void *table, void *pVA, void **pPA);</source>
+
<source lang="C">int sceKernelReadUser32ForKernel(uint32_t *dest, uint32_t *psrc);</source>
  
=== sceKernelMMUSetL2PageTableForKernel ===
+
=== sceKernelWriteUser8ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xAECA0820
+
| 0.990 || 0x13B7B151
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUSetL2PageTableForKernel(const void *ttbr, const void *map, const void *pbase);</source>
+
<source lang="C">int sceKernelWriteUser8ForKernel(uint8_t *dest, uint8_t val);</source>
  
=== sceKernelMMUUnsetL2PageTableForKernel ===
+
=== sceKernelWriteUser16ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xCB519DF3
+
| 0.990 || maybe present
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">int sceKernelMMUUnsetL2PageTableForKernel(const void *ttbr, const void *PTE);</source>
+
<source lang="C">int sceKernelWriteUser16ForKernel(uint16_t *dest, uint16_t val);</source>
  
=== SceCpuForKernel_CA4124DE ===
+
=== sceKernelWriteUser32ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xCA4124DE
+
| 0.990 || 0x101894E0
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
Returns 1, 2 or 6 based on some page/section properties.
+
<source lang="C">int sceKernelWriteUser32ForKernel(uint32_t *dest, uint32_t val);</source>
  
<source lang="C">int SceCpuForKernel_CA4124DE(const void *table, void *pVA, void **pPA);</source>
+
=== sceKernelVMRead8ForKernel ===
 
 
=== sceKernelMMUGetContextForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x211B89DA
+
| 0.990 || 0xA2F0FE9D
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
Temp name was sceKernelCpuSaveContextForKernel.
+
<source lang="C">int sceKernelVMRead8ForKernel(uint8_t *dest, uint8_t *psrc);</source>
  
<source lang="C">
+
=== sceKernelVMRead16ForKernel ===
typedef struct SceKernelMMUContext { // size is 0xC on FW 0.931
 
  uint32_t unk_0;
 
  uint32_t unk_4;
 
  uint32_t unk_8;
 
} SceKernelMMUContext;
 
 
 
int sceKernelMMUGetContextForKernel(SceKernelMMUContext *context);</source>
 
 
 
=== sceKernelMMUChangeContextForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x0A4F0FB9
+
| 0.990 || 0xF31D4D10
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
Temp name was sceKernelCpuRestoreContextForKernel.
+
<source lang="C">int sceKernelVMRead16ForKernel(uint16_t *dest, uint16_t *psrc);</source>
  
<source lang="C">int sceKernelMMUChangeContextForKernel(SceKernelMMUContext *context);</source>
+
=== sceKernelVMRead32ForKernel ===
 
 
=== sceKernelMMUVAtoPAWithModeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x67343A07
+
| 0.931-0.990 || 0x316574B1
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Temp name was sceKernelCpuGetPaddrWithMaskForKernel.
+
<source lang="C">int sceKernelVMRead32ForKernel(uint32_t *dest, uint32_t *psrc);</source>
  
mode (maskPAR) is usually 0x33, sometimes 2.
+
=== sceKernelVMWrite8ForKernel ===
 
 
<source lang="c">int sceKernelMMUVAtoPAWithModeForKernel(int mode, void *pVA, void **ppPA);</source>
 
 
 
=== sceKernelMMUCheckRangeWithModeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xCCDA3B8C
+
| 0.931 || 0xA3C65664
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
Return 0 if all pages are valid, < 0 else.
+
<source lang="C">int sceKernelVMWrite8ForKernel(uint8_t *dest, uint8_t val);</source>
  
<source lang="C">int sceKernelMMUCheckRangeWithModeForKernel(int mode, void *start, SceSize size);</source>
+
=== sceKernelVMWrite16ForKernel ===
 
 
=== sceKernelMMUVAtoPAForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x2A46E800
+
| 0.931 || 0xBF38A460
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Temp name was sceKernelCpuGetPaddrForKernel.
+
<source lang="C">int sceKernelVMWrite16ForKernel(uint16_t *dest, uint16_t val);</source>
  
Uses mode (maskPAR) 0x33.
+
=== sceKernelVMWrite32ForKernel ===
 
 
This will write the physical address for a virtual address <code>pVA</code> to memory pointed to by <code>pPA</code>.
 
 
 
Returns <0 on error, values >=0 indicate success.
 
 
 
<source lang="c">int sceKernelMMUVAtoPAForKernel(void *pVA, void **pPA);</source>
 
 
 
=== sceKernelCpuGetCONTEXTIDRForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5B6B3274
+
| 0.931 || 0x04D129B2
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
The CONTEXTIDR, bits [31:0] contain the process ID number.
+
<source lang="C">int sceKernelVMWrite32ForKernel(uint32_t *dest, uint32_t val);</source>
  
<source lang="C">
+
=== sceKernelMMUIsValidMapForKernel ===
  return (unsigned __int8)__mrc(15, 0, 13, 0, 1); // Read CONTEXTIDR (Context ID Register)
 
</source>
 
 
 
<source lang="C">void sceKernelCpuGetCONTEXTIDRForKernel(void);</source>
 
 
 
=== sceKernelCpuUpdateSCTLRForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x04008CF7
+
| 0.931 || 0x4891F923
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
<source lang="C">
+
<source lang="C">int sceKernelMMUIsValidMapForKernel(SceKernelMMUContext *context, const void *vbase, SceSize size, const void *pbase);</source>
  int result;
 
  result = __mrc(15, 0, 1, 0, 0) | 0x1806; // Read SCTLR (System Control Register)
 
  __mcr(15, 0, result, 1, 0, 0); // Write SCTLR (System Control Register)
 
  return result;
 
</source>
 
  
<source lang="C">void sceKernelCpuUpdateSCTLRForKernel(void); // SCTLR (System Control Register)</source>
+
=== sceKernelMMUIsValidUnmapForKernel ===
 
 
=== sceKernelCpuBranchPredictorInvalidateAllISForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1BB2BB8D
+
| 0.931 || 0x60EA8433
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
<source lang="C">void sceKernelCpuBranchPredictorInvalidateAllISForKernel(void); // BPIALLIS, Branch predictor invalidate all (IS)</source>
 
  
=== sceKernelCpuBranchPredictorInvalidateAllForKernel ===
+
<source lang="C">int sceKernelMMUIsValidUnmapForKernel(SceKernelMMUContext *context, const void *vbase, SceSize size);</source>
 +
 
 +
=== sceKernelMMUL1GetInfoForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4C4C7D6B
+
| 0.931-0.990 || 0x9D346F87
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
<source lang="C">void sceKernelCpuBranchPredictorInvalidateAllForKernel(void); // BPIALL, Branch predictor invalidate all</source>
 
  
=== sceKernelDcacheCleanInvalidateAll ===
+
Parses a L1PT for information about a specific entry. Pass the address of the L1PT in <code>l1pt</code>. Used by [[SceSysmem#sceKernelAddressSpaceGetMMUL1InfoForKernel|sceKernelAddressSpaceGetMMUL1InfoForKernel]].
 +
 
 +
<source lang="C">SceInt32 sceKernelMMUL1GetInfoForKernel(void* l1pt, const void *addr, SceKernelMMUL1Info *pInfo);</source>
 +
 
 +
=== sceKernelMMUL2GetInfoForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0x85A27F98
+
| 0.931-0.990 || 0x247629A7
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Flushes PLE then cleans and invalidates L1 Dcache and L2 cache in this order.
+
<source lang="C">int sceKernelMMUL2GetInfoForKernel(int a1, void *addr, void *pInfo);</source>
  
<source lang="c">void sceKernelDcacheCleanInvalidateAll(void);</source>
+
=== sceKernelMMUMapSectionsForKernel ===
 
 
=== sceKernelCpuDcacheInvalidateMVACForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x470EAE1E
+
| 0.931-0.990 || 0x868B471A
 +
|-
 +
| 3.60 || not present
 +
|-
 +
| 3.65 || Present, but not exported
 
|}
 
|}
<source lang="C">void sceKernelCpuDcacheInvalidateMVACForKernel(int mva); // DCIMVAC, Data cache invalidate by MVA (PoC)</source>
 
  
=== sceKernelL1DcacheInvalidateRangeForKernel ===
+
<source lang="C">SceInt32 sceKernelMMUMapSectionsForKernel(const void *ttbr, SceKernelMemoryType code, SceUInt32 domain, void *vaddr, SceSize vsize, void *paddr);</source>
 +
 
 +
=== sceKernelMMUMapSupersectionsForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x583F30D1
+
| 0.931-0.990 || 0x0D9DA15F
 +
|-
 +
| 3.60 || not present
 +
|-
 +
| 3.65 || Present, but not exported
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelCpuDcacheInvalidateMVACRangeForKernel.
+
<source lang="C">SceInt32 sceKernelMMUMapSupersectionsForKernel(const void *ttbr, SceKernelMemoryType code, SceUInt32 domain, void *vaddr, SceSize vsize, void *paddr);</source>
  
<source lang="C">void sceKernelL1DcacheInvalidateRangeForKernel(void *addr, unsigned int size); // DCIMVAC, Data cache invalidate by MVA (PoC)</source>
+
=== sceKernelMMUMapSmallPagesForKernel ===
 
 
=== sceKernelL1DcacheCleanInvalidateRangeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x6BA2E51C
+
| 0.931-0.990 || 0xB953E022
 +
|-
 +
| 3.60 || not present
 +
|-
 +
| 3.65 || Present, but not exported
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelCpuDcacheCleanInvalidateMVACRangeForKernel, sceKernelCpuDcacheWritebackInvalidateRangeForKernel, sceKernelDcacheWritebackInvalidateRangeForKernel.
+
<source lang="C">int sceKernelMMUMapSmallPagesForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, SceSize vsize, void *paddr);</source>
  
<source lang="C">
+
=== sceKernelMMUMapSmallPageForKernel ===
// DCCIMVAC, Data cache clean and invalidate by MVA (PoC)
 
void sceKernelL1DcacheCleanInvalidateRangeForKernel(const void *addr, unsigned int size);
 
</source>
 
 
 
=== sceKernelL1DcacheInvalidateAllForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2F3BF020
+
| 0.931-0.990 || 0xCC7C16F8
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelCpuDcacheInvalidateSWForKernel.
+
<source lang="C">int sceKernelMMUMapSmallPageForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, void *paddr);</source>
  
<source lang="C">void sceKernelL1DcacheInvalidateAllForKernel(void); // DCISW, Data cache invalidate by set/way (all the cache)</source>
+
=== sceKernelMMUMapLargePagesForKernel ===
 
 
=== sceKernelL1DcacheCleanAllForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x73A30DB2
+
| 0.931-0.990 || 0x78D32D38
|}
+
|-
 +
| 3.60 || not present
 +
|-
 +
| 3.65 || Present, but not exported
 +
|}
  
This is a guessed name. Temp name was sceKernelCpuDcacheCleanSWForKernel.
+
<source lang="C">int sceKernelMMUMapLargePagesForKernel(const void *table, SceKernelMemoryType code, void *vbase, SceUInt32 voffset, SceSize vsize, void *paddr);</source>
  
<source lang="C">void sceKernelL1DcacheCleanAllForKernel(void); // DCCSW, Data cache clean by set/way (all the cache)</source>
+
=== sceKernelMMUUnmapSectionsWithFlagsForKernel ===
 
 
=== sceKernelL1DcacheCleanInvalidateAllForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x76DAB4D0
+
| 0.931-0.990 || 0xFC657FD1
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Guessed name was sceKernelCpuDcacheCleanInvalidateSWForKernel.
+
<source lang="C">int sceKernelMMUUnmapSectionsWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceSize vsize, SceUInt32 flags);</source>
  
<source lang="C">void sceKernelL1DcacheCleanInvalidateAllForKernel(void);</source>
+
=== sceKernelMMUUnmapSupersectionsWithFlagsForKernel ===
 
 
=== sceKernelCpuDcacheCleanMVACForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF7159B55
+
| 0.931-0.990 || 0x0E4D29C6
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
<source lang="C">void sceKernelCpuDcacheCleanMVACForKernel(int mva); // DCCMVAC, Data cache clean by MVA (PoC)</source>
 
  
=== sceKernelL1DcacheCleanRangeForKernel ===
+
<source lang="C">int sceKernelMMUUnmapSupersectionsWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceSize vsize, SceUInt32 flags);</source>
 +
 
 +
=== sceKernelMMUUnmapSmallPagesWithFlagsForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xC5C1EE4E
+
| 0.931-0.990 || 0x11EBA8CE
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Guessed name was sceKernelCpuDcacheCleanMVACRangeForKernel.
+
<source lang="C">int sceKernelMMUUnmapSmallPagesWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceUInt32 voffset, SceSize vsize, SceUInt32 flags);</source>
  
<source lang="C">void sceKernelL1DcacheCleanRangeForKernel(void *addr, unsigned int size); // DCCMVAC, Data cache clean by MVA (PoC)</source>
+
=== sceKernelMMUUnmapLargePagesWithFlagsForKernel ===
 
 
=== sceKernelL1DcacheInvalidateRangeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC8E8C9E9
+
| 0.931-0.990 || 0x44319918
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelCpuDcacheCleanInvalidateMVACForKernel.
+
<source lang="C">int sceKernelMMUUnmapLargePagesWithFlagsForKernel(const void *table, uint32_t maybe_ttbr0, void *vbase, SceUInt32 voffset, SceSize vsize, SceUInt32 flags);</source>
  
<source lang="C">void sceKernelL1DcacheInvalidateRangeForKernel(int mva); // DCCIMVAC, Data cache clean and invalidate by MVA (PoC)</source>
+
=== sceKernelMMUL1VAtoPABySWForKernel ===
 
 
=== sceKernelL1IcacheInvalidateEntireAllCoreForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x264DA250
+
| 0.990 || 0x8E4ECF17
 
|-
 
|-
| 3.65 || 0x803C84BF
+
| 3.60 || not present
 
|}
 
|}
  
Guessed name was sceKernelCpuIcacheInvalidateAllUISForKernel.
+
<source lang="C">int sceKernelMMUL1VAtoPABySWForKernel(const void *table, void *pVA, void **pPA);</source>
  
Invalidates the L1 Icache for all cores.
+
=== sceKernelMMUSetL2PageTableForKernel ===
 
 
<source lang="C">void sceKernelL1IcacheInvalidateEntireAllCoreForKernel(void);</source>
 
 
 
=== sceKernelL1CacheInvalidateEntireForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xAEE0B489
+
| 0.990 || 0xAECA0820
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelCpuIcacheInvalidateAllUForKernel.
+
<source lang="C">int sceKernelMMUSetL2PageTableForKernel(const void *ttbr, const void *map, const void *pbase);</source>
  
Invalidates the entire L1 Icache of this core.
+
=== sceKernelMMUUnsetL2PageTableForKernel ===
 
 
<source lang="C">void sceKernelL1CacheInvalidateEntireForKernel(void); // ICIALLU, Instruction cache invalidate all (PoU)</source>
 
 
 
=== sceKernelL1IcacheInvalidateRangeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xF4C7F578
+
| 0.990 || 0xCB519DF3
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Temp name was sceKernelCpuIcacheInvalidateRangeForKernel, sceKernelCpuIcacheInvalidateMVAURange.
+
<source lang="C">int sceKernelMMUUnsetL2PageTableForKernel(const void *ttbr, const void *PTE);</source>
  
Invalidates a range in L1 Icache of this core.
+
=== SceCpuForKernel_CA4124DE ===
 
 
<source lang="C">
 
// ICIMVAU, Instruction cache invalidate by MVA (PoU)
 
void sceKernelL1IcacheInvalidateRangeForKernel(void *start, SceSize size);
 
</source>
 
 
 
=== sceKernelIcacheInvalidateRangeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x19F17BD0
+
| 0.990 || 0xCA4124DE
 
|-
 
|-
| 3.65-3.68 || 0x73E895EA
+
| 3.60 || not present
 
|}
 
|}
  
Temp name was sceKernelCpuIcacheAndL2InvalidateMVAURangeForKernel, sceKernelCpuIcacheAndL2WritebackInvalidateRangeForKernel.
+
Returns 1, 2 or 6 based on some page/section properties.
  
Cleans and invalidates range in L2 cache, then in L1 Icache of core.
+
<source lang="C">int SceCpuForKernel_CA4124DE(const void *table, void *pVA, void **pPA);</source>
  
<source lang="c">int sceKernelIcacheInvalidateRangeForKernel(void *start, SceSize size);</source>
+
=== sceKernelMMUGetContextForKernel ===
 
 
=== sceKernelPleFlushRequest ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD0D85FF8
+
| 0.931 || 0x211B89DA
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Temporary name was <code>sceKernelCpuPreloadEngineKill</code>.
+
Temp name was sceKernelCpuSaveContextForKernel.
  
*NSACR (Non-Secure Access Control Register)
+
<source lang="C">
*Test bit NS access to the Preload Engine resources
+
typedef struct SceKernelMMUContext { // size is 0xC on FW 0.931
*[>] PLEFF (Preload Engine FIFO flush operation)
+
  uint32_t unk_0;
*[>] PLEKC (Preload Engine kill channel operation)
+
  uint32_t unk_4;
*[<] PLEASR (Preload Engine Activity Status Register)
+
  uint32_t unk_8;
 +
} SceKernelMMUContext;
  
<source lang="c">void sceKernelPleFlushRequest(void);</source>
+
int sceKernelMMUGetContextForKernel(SceKernelMMUContext *context);</source>
  
=== sceKernelDomainTextMemcpyForKernel ===
+
=== sceKernelMMUChangeContextForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x8C683DEC
+
| 0.931 || 0x0A4F0FB9
 
|-
 
|-
| 3.65 || Removed
+
| 3.60 || not present
 
|}
 
|}
  
Guessed name was <code>sceKernelCpuUnrestrictedMemcpy</code>.
+
Temp name was sceKernelCpuRestoreContextForKernel.
  
Unrestricted memcpy by first setting the <code>DACR</code> register to <code>0xFFFF0000</code> and then doing a memcpy.
+
<source lang="C">int sceKernelMMUChangeContextForKernel(SceKernelMMUContext *context);</source>
  
In old firmware (0.931), <code>DACR</code> is set to <code>0xFFFFFFFF</code> instead and interrupts are disabled for the operation.
+
=== sceKernelMMUVAtoPAWithModeForKernel ===
 
 
<source lang="c">int sceKernelDomainTextMemcpyForKernel(void *dest, const void *src, SceSize len);</source>
 
 
 
=== sceKernelCpuForKernel_9B8173F4 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x9B8173F4
+
| 0.931-3.60 || 0x67343A07
 
|}
 
|}
  
Might be get_vaddr_memory_type.
+
Temp name was sceKernelCpuGetPaddrWithMaskForKernel.
  
Return value can be:
+
mode (maskPAR) is usually 0x33, sometimes 2.
* 2
 
* 8
 
* 0x40
 
* 0x80
 
* 0xD0
 
* 0x80022007 (SCE_KERNEL_ERROR_VA2PA_FAULT)
 
  
<source lang="c">int sceKernelCpuForKernel_9B8173F4(void *vaddr);</source>
+
<source lang="c">int sceKernelMMUVAtoPAWithModeForKernel(int mode, void *pVA, void **ppPA);</source>
  
=== sceKernelCoreSyncAllForKernel ===
+
=== sceKernelMMUCheckRangeWithModeForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA5C9DBBA
+
| 0.931 || 0xCCDA3B8C
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
This is a guessed name. Temp name was sceKernelWaitCore3ForKernel.
+
Return 0 if all pages are valid, < 0 else.
  
<source lang="c">
+
<source lang="C">int sceKernelMMUCheckRangeWithModeForKernel(int mode, void *start, SceSize size);</source>
typedef struct SceCpuCoreSyncCtx {
 
int lock;
 
int16_t core_count;
 
int16_t last_wait_core; // 0:core3, 1:core0, 2:core1, 3:core2
 
} SceCpuCoreSyncCtx;
 
  
void sceKernelCoreSyncAllForKernel(SceCpuCoreSyncCtx *pCtx);
+
=== sceKernelMMUVAtoPAForKernel ===
</source>
 
 
 
=== sceKernelCoreSyncWaitForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x9D72DD1B
+
| 0.931-3.60 || 0x2A46E800
 
|}
 
|}
  
This is a temp name.
+
Temp name was sceKernelCpuGetPaddrForKernel.
 +
 
 +
Uses mode (maskPAR) 0x33.
 +
 
 +
This will write the physical address for a virtual address <code>pVA</code> to memory pointed to by <code>pPA</code>.
  
<source lang="c">
+
Returns <0 on error, values >=0 indicate success.
#define SCE_CPU_WAIT_CORE_0 1
 
#define SCE_CPU_WAIT_CORE_1 2
 
#define SCE_CPU_WAIT_CORE_2 3
 
#define SCE_CPU_WAIT_CORE_3 0
 
  
void sceKernelCoreSyncWaitForKernel(SceCpuCoreSyncCtx *pCtx, int core);
+
<source lang="c">int sceKernelMMUVAtoPAForKernel(void *pVA, void **pPA);</source>
</source>
 
  
=== sceKernelInitCpuCoreSyncCtxForKernel ===
+
=== sceKernelCpuGetCONTEXTIDRForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x4CD4D921
+
| 3.60 || 0x5B6B3274
 
|}
 
|}
  
This is a temp name.
+
The CONTEXTIDR, bits [31:0] contain the process ID number.
 +
 
 +
<source lang="C">
 +
  return (unsigned __int8)__mrc(15, 0, 13, 0, 1); // Read CONTEXTIDR (Context ID Register)
 +
</source>
  
<source lang="C">void sceKernelInitCpuCoreSyncCtxForKernel(SceCpuCoreSyncCtx *pCtx);</source>
+
<source lang="C">void sceKernelCpuGetCONTEXTIDRForKernel(void);</source>
  
=== SceCpuForKernel_43CC6E20 ===
+
=== sceKernelCpuUpdateSCTLRForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x43CC6E20
+
| 3.60 || 0x04008CF7
 
|}
 
|}
  
DACR off
+
<source lang="C">
 +
  int result;
 +
  result = __mrc(15, 0, 1, 0, 0) | 0x1806; // Read SCTLR (System Control Register)
 +
  __mcr(15, 0, result, 1, 0, 0); // Write SCTLR (System Control Register)
 +
  return result;
 +
</source>
  
Does some memory copies between the args.
+
<source lang="C">void sceKernelCpuUpdateSCTLRForKernel(void); // SCTLR (System Control Register)</source>
  
<source lang="c">int SceCpuForKernel_43CC6E20(void *addr, int a2, int a3, int a4);</source>
+
=== sceKernelCpuBranchPredictorInvalidateAllISForKernel ===
 
 
=== sceCpuUnrestrictedBzeroIntForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x76EB0DD4
+
| 3.60 || 0x1BB2BB8D
 
|}
 
|}
 +
<source lang="C">void sceKernelCpuBranchPredictorInvalidateAllISForKernel(void); // BPIALLIS, Branch predictor invalidate all (IS)</source>
  
DACR off
+
=== sceKernelCpuBranchPredictorInvalidateAllForKernel ===
 
 
<source lang="c">int sceCpuUnrestrictedBzeroIntForKernel(int *addr);</source>
 
 
 
=== SceCpuForKernel_337473B5 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x337473B5
+
| 3.60 || 0x4C4C7D6B
 
|}
 
|}
 +
<source lang="C">void sceKernelCpuBranchPredictorInvalidateAllForKernel(void); // BPIALL, Branch predictor invalidate all</source>
  
DACR off
+
=== sceKernelDcacheCleanInvalidateAll ===
 
 
If addr.unk_0 equals 0, changes addr.unk_0 to new_val, else increase addr.unk_4.
 
 
 
<source lang="c">int SceCpuForKernel_337473B5(CpuUnkStruct *addr, unsigned int new_val);</source>
 
 
 
=== sceKernelCpuAtomicSubIfGreater64ForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x37FBFD12
+
| 0.931 || 0x85A27F98
 
|}
 
|}
  
DACR is not disabled
+
Flushes PLE then cleans and invalidates L1 Dcache and L2 cache in this order.
  
<source lang="c">int sceKernelCpuAtomicSubIfGreater64ForKernel(unsigned long long *a1, unsigned int a2);</source>
+
<source lang="c">void sceKernelDcacheCleanInvalidateAll(void);</source>
  
=== sceKernelCpuAtomicLimit64ForKernel ===
+
=== sceKernelCpuDcacheInvalidateMVACForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6190A018
+
| 3.60 || 0x470EAE1E
 
|}
 
|}
 +
<source lang="C">void sceKernelCpuDcacheInvalidateMVACForKernel(int mva); // DCIMVAC, Data cache invalidate by MVA (PoC)</source>
  
DACR is not disabled
+
=== sceKernelL1DcacheInvalidateRangeForKernel ===
 
 
<source lang="c">int sceKernelCpuAtomicLimit64ForKernel(unsigned long long *result, int limit);</source>
 
 
 
=== sceKernelCpuAtomicAdd32AndGet64InRangeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD8A7216C
+
| 3.60 || 0x583F30D1
 
|}
 
|}
  
DACR is not disabled
+
This is a guessed name. Temp name was sceKernelCpuDcacheInvalidateMVACRangeForKernel.
  
<source lang="C">int sceKernelCpuAtomicAdd32AndGet64InRangeForKernel(unsigned long long *val, int add_val, int limit);</source>
+
<source lang="C">void sceKernelL1DcacheInvalidateRangeForKernel(void *addr, unsigned int size); // DCIMVAC, Data cache invalidate by MVA (PoC)</source>
  
=== sceKernelCpuAtomicAdd32AndGet64InHiLoRangeForKernel ===
+
=== sceKernelL1DcacheCleanInvalidateRangeForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD37AABE5
+
| 0.931-3.60 || 0x6BA2E51C
 
|}
 
|}
  
DACR is not disabled
+
This is a guessed name. Temp name was sceKernelCpuDcacheCleanInvalidateMVACRangeForKernel, sceKernelCpuDcacheWritebackInvalidateRangeForKernel, sceKernelDcacheWritebackInvalidateRangeForKernel.
  
<source lang="c">int sceKernelCpuAtomicAdd32AndGet64InHiLoRangeForKernel(unsigned long long *val, int add_val, int limit);</source>
+
<source lang="C">
 +
// DCCIMVAC, Data cache clean and invalidate by MVA (PoC)
 +
void sceKernelL1DcacheCleanInvalidateRangeForKernel(const void *addr, unsigned int size);
 +
</source>
  
=== sceKernelCpuAtomicGet32AndSet64ForKernel ===
+
=== sceKernelL1DcacheInvalidateAllForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || not present
+
| 3.60 || 0x2F3BF020
|-
 
| 3.60 || 0x4553FBDE
 
 
|}
 
|}
  
DACR is not disabled
+
This is a guessed name. Temp name was sceKernelCpuDcacheInvalidateSWForKernel.
  
<source lang="c">int sceKernelCpuAtomicGet32AndSet64ForKernel(unsigned long long *result, int src);</source>
+
<source lang="C">void sceKernelL1DcacheInvalidateAllForKernel(void); // DCISW, Data cache invalidate by set/way (all the cache)</source>
  
=== sceKernelCpuAtomicGet32AndSet64_2ForKernel ===
+
=== sceKernelL1DcacheCleanAllForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || not present
+
| 3.60 || 0x73A30DB2
|-
 
| 3.60 || 0x7FB4E7AC
 
 
|}
 
|}
  
Exact same code as SceCpuForKernel_4553FBDE.
+
This is a guessed name. Temp name was sceKernelCpuDcacheCleanSWForKernel.
  
DACR is not disabled
+
<source lang="C">void sceKernelL1DcacheCleanAllForKernel(void); // DCCSW, Data cache clean by set/way (all the cache)</source>
  
<source lang="c">int sceKernelCpuAtomicGet32AndSet64_2ForKernel(unsigned long long *result, int src);</source>
+
=== sceKernelL1DcacheCleanInvalidateAllForKernel ===
 
 
=== sceKernelCpuAtomicDecIfLowPositive32ForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x8510FA52
+
| 0.931-3.60 || 0x76DAB4D0
 
|}
 
|}
  
DACR is not disabled
+
Guessed name was sceKernelCpuDcacheCleanInvalidateSWForKernel.
  
<source lang="c">int sceKernelCpuAtomicDecIfLowPositive32ForKernel(unsigned int *addr);</source>
+
<source lang="C">void sceKernelL1DcacheCleanInvalidateAllForKernel(void);</source>
  
=== sceKernelCpuAtomicHiLoAlgorithmForKernel ===
+
=== sceKernelCpuDcacheCleanMVACForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5F64E5ED
+
| 3.60 || 0xF7159B55
 
|}
 
|}
 +
<source lang="C">void sceKernelCpuDcacheCleanMVACForKernel(int mva); // DCCMVAC, Data cache clean by MVA (PoC)</source>
  
DACR is not disabled
+
=== sceKernelL1DcacheCleanRangeForKernel ===
 
 
Returns current value (high + low), and sets it to max_low.
 
 
 
<source lang="c">int sceKernelCpuAtomicHiLoAlgorithmForKernel(SceUInt32 *max_low);</source>
 
 
 
=== sceKernelCpuAtomicAddAndGetPositive32InRangeForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x98E91C1C
+
| 0.931-3.60 || 0xC5C1EE4E
 
|}
 
|}
  
DACR is not disabled
+
Guessed name was sceKernelCpuDcacheCleanMVACRangeForKernel.
  
If val is negative, returns 2 and does not override val.
+
<source lang="C">void sceKernelL1DcacheCleanRangeForKernel(void *addr, unsigned int size); // DCCMVAC, Data cache clean by MVA (PoC)</source>
  
<source lang="C">int sceKernelCpuAtomicAddAndGetPositive32InRangeForKernel(int *val, int add_val, int limit);</source>
+
=== sceKernelL1DcacheInvalidateRangeForKernel ===
 
 
=== SceCpuForKernel_6C7E7B57 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x6C7E7B57
+
| 3.60 || 0xC8E8C9E9
 
|}
 
|}
  
Set TTBR lower value (0x4A).
+
This is a guessed name. Temp name was sceKernelCpuDcacheCleanInvalidateMVACForKernel.
  
<source lang="c">int SceCpuForKernel_6C7E7B57(uintptr_t ttbr);</source>
+
<source lang="C">void sceKernelL1DcacheInvalidateRangeForKernel(int mva); // DCCIMVAC, Data cache clean and invalidate by MVA (PoC)</source>
  
=== SceCpuForKernel_AED8F8D7 ===
+
=== sceKernelL1IcacheInvalidateEntireAllCoreForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || 0xAED8F8D7
+
| 0.931-3.60 || 0x264DA250
 
|-
 
|-
| 3.60 || not present
+
| 3.65 || 0x803C84BF
 
|}
 
|}
  
Initialize TTBR.
+
Guessed name was sceKernelCpuIcacheInvalidateAllUISForKernel.
  
<source lang="C">int SceCpuForKernel_AED8F8D7(const void *ttbr);</source>
+
Invalidates the L1 Icache for all cores.
 +
 
 +
<source lang="C">void sceKernelL1IcacheInvalidateEntireAllCoreForKernel(void);</source>
  
=== SceCpuForKernel_9A3281C0 ===
+
=== sceKernelL1CacheInvalidateEntireForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x9A3281C0
+
| 3.60 || 0xAEE0B489
|-
 
| 3.65 || 0xC32687D0
 
 
|}
 
|}
  
Gets start and end of a special code area in which the kernel<->user memory copy routines reside.
+
This is a guessed name. Temp name was sceKernelCpuIcacheInvalidateAllUForKernel.
See [[SceExcpmgr]] page for more information about how this is used.
 
  
In older firmware, this function also provides the start and end of the "memory access error range" code area (see [[SceExcpmgr#SceExcpmgrForKernel_C45C0D3D|SceExcpmgrForKernel_C45C0D3D]] for what this range is for).
+
Invalidates the entire L1 Icache of this core.
  
<source lang="c">
+
<source lang="C">void sceKernelL1CacheInvalidateEntireForKernel(void); // ICIALLU, Instruction cache invalidate all (PoU)</source>
//0.990
 
void SceCpuForKernel_9A3281C0(SceUIntPtr *pMemErrorAreaStart, SceUIntPtr* pMemErrorAreaEnd, SceUIntPtr *pUKCopyAreaStart, SceUIntPtr* pUKCopyAreaEnd)
 
  
//3.60+
+
=== sceKernelL1IcacheInvalidateRangeForKernel ===
void SceCpuForKernel_9A3281C0(SceUIntPtr *pUKCopyAreaStart, SceUIntPtr* pUKCopyAreaEnd);
 
</source>
 
 
 
=== SceCpuForKernel_9CB82EB0 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x9CB82EB0
+
| 0.931-3.60 || 0xF4C7F578
 
|}
 
|}
 +
 +
Temp name was sceKernelCpuIcacheInvalidateRangeForKernel, sceKernelCpuIcacheInvalidateMVAURange.
 +
 +
Invalidates a range in L1 Icache of this core.
  
 
<source lang="C">
 
<source lang="C">
return;
+
// ICIMVAU, Instruction cache invalidate by MVA (PoU)
 +
void sceKernelL1IcacheInvalidateRangeForKernel(void *start, SceSize size);
 
</source>
 
</source>
  
<source lang="c">int SceCpuForKernel_9CB82EB0(void);</source>
+
=== sceKernelIcacheInvalidateRangeForKernel ===
 
 
== SceCpuForDriver ==
 
 
 
=== sceKernelRoundupDCacheLine3ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0xF0849812
+
| 0.931-3.60 || 0x19F17BD0
 
|-
 
|-
| 3.60 || not present
+
| 3.65-3.68 || 0x73E895EA
 
|}
 
|}
  
<source lang="C">int sceKernelRoundupDCacheLine3ForDriver(int a1);</source>
+
Temp name was sceKernelCpuIcacheAndL2InvalidateMVAURangeForKernel, sceKernelCpuIcacheAndL2WritebackInvalidateRangeForKernel.
  
=== sceKernelAbortForDriver ===
+
Cleans and invalidates range in L2 cache, then in L1 Icache of core.
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 0.931-0.990 || 0x6DCA6903
 
|-
 
| 3.60 || not present
 
|}
 
  
<source lang="C">void sceKernelAbortForDriver(void);</source>
+
<source lang="c">int sceKernelIcacheInvalidateRangeForKernel(void *start, SceSize size);</source>
  
=== sceKernelCpuIdForDriver ===
+
=== sceKernelPleFlushRequest ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x5E4D5DE1
+
| 3.60 || 0xD0D85FF8
 
|}
 
|}
  
Return the CPU ID of the current core.
+
Temporary name was <code>sceKernelCpuPreloadEngineKill</code>.
  
<source lang="c">int sceKernelCpuIdForDriver(void);</source>
+
*NSACR (Non-Secure Access Control Register)
 +
*Test bit NS access to the Preload Engine resources
 +
*[>] PLEFF (Preload Engine FIFO flush operation)
 +
*[>] PLEKC (Preload Engine kill channel operation)
 +
*[<] PLEASR (Preload Engine Activity Status Register)
  
<hr>
+
<source lang="c">void sceKernelPleFlushRequest(void);</source>
  
=== sceKernelCpuAtomicAddAndGet8ForDriver ===
+
=== sceKernelDomainTextMemcpyForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1E850481
+
| 0.931-3.60 || 0x8C683DEC
 +
|-
 +
| 3.65 || Removed
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicAddAndGet8ForDriver (unsigned char *addr, unsigned char val);</source>
+
Guessed name was <code>sceKernelCpuUnrestrictedMemcpy</code>.
 +
 
 +
Unrestricted memcpy by first setting the <code>DACR</code> register to <code>0xFFFF0000</code> and then doing a memcpy.
  
=== sceKernelCpuAtomicAddAndGet16ForDriver ===
+
In old firmware (0.931), <code>DACR</code> is set to <code>0xFFFFFFFF</code> instead and interrupts are disabled for the operation.
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 3.60 || 0x59F74E94
 
|}
 
  
<source lang="c">unsigned short sceKernelCpuAtomicAddAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">int sceKernelDomainTextMemcpyForKernel(void *dest, const void *src, SceSize len);</source>
  
=== sceKernelCpuAtomicAddAndGet32ForDriver ===
+
=== sceKernelCpuForKernel_9B8173F4 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x5F6A8743
+
| 3.60 || 0x9B8173F4
 
|}
 
|}
  
Adds <code>val</code> to <code>*addr</code> atomically, and returns the result.
+
Might be get_vaddr_memory_type.
 +
 
 +
Return value can be:
 +
* 2
 +
* 8
 +
* 0x40
 +
* 0x80
 +
* 0xD0
 +
* 0x80022007 (SCE_KERNEL_ERROR_VA2PA_FAULT)
  
<source lang="c">unsigned int sceKernelCpuAtomicAddAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">int sceKernelCpuForKernel_9B8173F4(void *vaddr);</source>
  
=== sceKernelCpuAtomicAddAndGet64ForDriver ===
+
=== sceKernelCoreSyncAllForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4E459A03
+
| 3.60 || 0xA5C9DBBA
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicAddAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
This is a guessed name. Temp name was sceKernelWaitCore3ForKernel.
 +
 
 +
<source lang="c">
 +
typedef struct SceCpuCoreSyncCtx {
 +
int lock;
 +
int16_t core_count;
 +
int16_t last_wait_core; // 0:core3, 1:core0, 2:core1, 3:core2
 +
} SceCpuCoreSyncCtx;
  
<hr>
+
void sceKernelCoreSyncAllForKernel(SceCpuCoreSyncCtx *pCtx);
 +
</source>
  
=== sceKernelCpuAtomicAddUnless8ForDriver ===
+
=== sceKernelCoreSyncWaitForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5CC62CEC
+
| 0.931-3.60 || 0x9D72DD1B
 
|}
 
|}
  
<source lang="c">int sceKernelCpuAtomicAddUnless8ForDriver(unsigned char *addr, unsigned char val, unsigned char cmp);</source>
+
This is a temp name.
  
=== sceKernelCpuAtomicAddUnless16ForDriver ===
+
<source lang="c">
{| class="wikitable"
+
#define SCE_CPU_WAIT_CORE_0 1
|-
+
#define SCE_CPU_WAIT_CORE_1 2
! Version !! NID
+
#define SCE_CPU_WAIT_CORE_2 3
|-
+
#define SCE_CPU_WAIT_CORE_3 0
| 3.60 || 0x0F84AFE9
 
|}
 
  
<source lang="c">int sceKernelCpuAtomicAddUnless16ForDriver(unsigned short *addr, unsigned short val, unsigned short cmp);</source>
+
void sceKernelCoreSyncWaitForKernel(SceCpuCoreSyncCtx *pCtx, int core);
 +
</source>
  
=== sceKernelCpuAtomicAddUnless32ForDriver ===
+
=== sceKernelInitCpuCoreSyncCtxForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1F157DC3
+
| 0.931-3.60 || 0x4CD4D921
 
|}
 
|}
  
<source lang="c">int sceKernelCpuAtomicAddUnless32ForDriver(unsigned int *addr, unsigned int val, unsigned int cmp);</source>
+
This is a temp name.
 +
 
 +
<source lang="C">void sceKernelInitCpuCoreSyncCtxForKernel(SceCpuCoreSyncCtx *pCtx);</source>
  
=== sceKernelCpuAtomicAddUnless64ForDriver ===
+
=== SceCpuForKernel_43CC6E20 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x06CCFA4B
+
| 3.60 || 0x43CC6E20
 
|}
 
|}
  
<source lang="c">int sceKernelCpuAtomicAddUnless64ForDriver(unsigned long long *addr, int unused, unsigned long long val, unsigned long long cmp);</source>
+
DACR off
 +
 
 +
Does some memory copies between the args.
  
<hr>
+
<source lang="c">int SceCpuForKernel_43CC6E20(void *addr, int a2, int a3, int a4);</source>
  
=== sceKernelCpuAtomicAndAndGet8ForDriver ===
+
=== sceCpuUnrestrictedBzeroIntForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x32B62B1A
+
| 3.60 || 0x76EB0DD4
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicAndAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
DACR off
 +
 
 +
<source lang="c">int sceCpuUnrestrictedBzeroIntForKernel(int *addr);</source>
  
=== sceKernelCpuAtomicAndAndGet16ForDriver ===
+
=== SceCpuForKernel_337473B5 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB281D52A
+
| 0.931-3.60 || 0x337473B5
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicAndAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
DACR off
 +
 
 +
If addr.unk_0 equals 0, changes addr.unk_0 to new_val, else increase addr.unk_4.
 +
 
 +
<source lang="c">int SceCpuForKernel_337473B5(CpuUnkStruct *addr, unsigned int new_val);</source>
  
=== sceKernelCpuAtomicAndAndGet32ForDriver ===
+
=== sceKernelCpuAtomicSubIfGreater64ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xDF899E4B
+
| 3.60 || 0x37FBFD12
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicAndAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
DACR is not disabled
 +
 
 +
<source lang="c">int sceKernelCpuAtomicSubIfGreater64ForKernel(unsigned long long *a1, unsigned int a2);</source>
  
=== sceKernelCpuAtomicAndAndGet64ForDriver ===
+
=== sceKernelCpuAtomicLimit64ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD18E7B54
+
| 3.60 || 0x6190A018
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicAndAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
DACR is not disabled
  
<hr>
+
<source lang="c">int sceKernelCpuAtomicLimit64ForKernel(unsigned long long *result, int limit);</source>
  
=== sceKernelCpuAtomicClearAndGet8ForDriver ===
+
=== sceKernelCpuAtomicAdd32AndGet64InRangeForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x8E538AB5
+
| 3.60 || 0xD8A7216C
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicClearAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
DACR is not disabled
 +
 
 +
<source lang="C">int sceKernelCpuAtomicAdd32AndGet64InRangeForKernel(unsigned long long *val, int add_val, int limit);</source>
  
=== sceKernelCpuAtomicClearAndGet16ForDriver ===
+
=== sceKernelCpuAtomicAdd32AndGet64InHiLoRangeForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6B050D7C
+
| 3.60 || 0xD37AABE5
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicClearAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
DACR is not disabled
 +
 
 +
<source lang="c">int sceKernelCpuAtomicAdd32AndGet64InHiLoRangeForKernel(unsigned long long *val, int add_val, int limit);</source>
  
=== sceKernelCpuAtomicClearAndGet32ForDriver ===
+
=== sceKernelCpuAtomicGet32AndSet64ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x78C1F148
+
| 0.990 || not present
 +
|-
 +
| 3.60 || 0x4553FBDE
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicClearAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
DACR is not disabled
 +
 
 +
<source lang="c">int sceKernelCpuAtomicGet32AndSet64ForKernel(unsigned long long *result, int src);</source>
  
=== sceKernelCpuAtomicClearAndGet64ForDriver ===
+
=== sceKernelCpuAtomicGet32AndSet64_2ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2149CD4C
+
| 0.990 || not present
 +
|-
 +
| 3.60 || 0x7FB4E7AC
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicClearAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
Exact same code as SceCpuForKernel_4553FBDE.
 +
 
 +
DACR is not disabled
  
<hr>
+
<source lang="c">int sceKernelCpuAtomicGet32AndSet64_2ForKernel(unsigned long long *result, int src);</source>
  
=== sceKernelCpuAtomicClearMask8ForDriver ===
+
=== sceKernelCpuAtomicDecIfLowPositive32ForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1B3336B0
+
| 3.60 || 0x8510FA52
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicClearMask8ForDriver(unsigned char *addr, unsigned char val);</source>
+
DACR is not disabled
 +
 
 +
<source lang="c">int sceKernelCpuAtomicDecIfLowPositive32ForKernel(unsigned int *addr);</source>
  
=== sceKernelCpuAtomicClearMask16ForDriver ===
+
=== sceKernelCpuAtomicHiLoAlgorithmForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1BE58599
+
| 3.60 || 0x5F64E5ED
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicClearMask16ForDriver(unsigned short *addr, unsigned short val);</source>
+
DACR is not disabled
 +
 
 +
Returns current value (high + low), and sets it to max_low.
 +
 
 +
<source lang="c">int sceKernelCpuAtomicHiLoAlgorithmForKernel(SceUInt32 *max_low);</source>
  
=== sceKernelCpuAtomicClearMask32ForDriver ===
+
=== sceKernelCpuAtomicAddAndGetPositive32InRangeForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4AE1BCC0
+
| 3.60 || 0x98E91C1C
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicClearMask32ForDriver(unsigned int *addr, unsigned int val);</source>
+
DACR is not disabled
 +
 
 +
If val is negative, returns 2 and does not override val.
 +
 
 +
<source lang="C">int sceKernelCpuAtomicAddAndGetPositive32InRangeForKernel(int *val, int add_val, int limit);</source>
  
=== sceKernelCpuAtomicClearMask64ForDriver ===
+
=== SceCpuForKernel_6C7E7B57 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x55760309
+
| 0.931-3.60 || 0x6C7E7B57
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicClearMask64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
Set TTBR lower value (0x4A).
  
<hr>
+
<source lang="c">int SceCpuForKernel_6C7E7B57(uintptr_t ttbr);</source>
  
=== sceKernelCpuAtomicCompareAndSet8ForDriver ===
+
=== SceCpuForKernel_AED8F8D7 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3627F4E0
+
| 0.931 || 0xAED8F8D7
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicCompareAndSet8ForDriver(unsigned char *addr, unsigned char cmp, unsigned char val);</source>
+
Initialize TTBR.
 +
 
 +
<source lang="C">int SceCpuForKernel_AED8F8D7(const void *ttbr);</source>
  
=== sceKernelCpuAtomicCompareAndSet16ForDriver ===
+
=== SceCpuForKernel_9A3281C0 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x6F63F56D
+
| 0.990-3.60 || 0x9A3281C0
 +
|-
 +
| 3.65 || 0xC32687D0
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicCompareAndSet16ForDriver(unsigned short *addr, unsigned short cmp, unsigned short val);</source>
+
Gets start and end of a special code area in which the kernel<->user memory copy routines reside.
 +
See [[SceExcpmgr]] page for more information about how this is used.
 +
 
 +
In older firmware, this function also provides the start and end of the "memory access error range" code area (see [[SceExcpmgr#SceExcpmgrForKernel_C45C0D3D|SceExcpmgrForKernel_C45C0D3D]] for what this range is for).
 +
 
 +
<source lang="c">
 +
//0.990
 +
void SceCpuForKernel_9A3281C0(SceUIntPtr *pMemErrorAreaStart, SceUIntPtr* pMemErrorAreaEnd, SceUIntPtr *pUKCopyAreaStart, SceUIntPtr* pUKCopyAreaEnd)
 +
 
 +
//3.60+
 +
void SceCpuForKernel_9A3281C0(SceUIntPtr *pUKCopyAreaStart, SceUIntPtr* pUKCopyAreaEnd);
 +
</source>
  
=== sceKernelCpuAtomicCompareAndSet32ForDriver ===
+
=== SceCpuForKernel_9CB82EB0 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCDA96E81
+
| 3.60 || 0x9CB82EB0
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicCompareAndSet32ForDriver(unsigned int *addr, unsigned int cmp, unsigned int val);</source>
+
<source lang="C">
 +
return;
 +
</source>
 +
 
 +
<source lang="c">int SceCpuForKernel_9CB82EB0(void);</source>
 +
 
 +
== SceCpuForDriver ==
  
=== sceKernelCpuAtomicCompareAndSet64ForDriver ===
+
=== sceKernelRoundupDCacheLine3ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4B527009
+
| 0.931-0.990 || 0xF0849812
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicCompareAndSet64ForDriver(unsigned long long *addr, int unused, unsigned long long cmp, unsigned long long val);</source>
+
<source lang="C">int sceKernelRoundupDCacheLine3ForDriver(int a1);</source>
  
<hr>
+
=== sceKernelAbortForDriver ===
 
 
=== sceKernelCpuAtomicDecIfPositive8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x45153D4E
+
| 0.931-0.990 || 0x6DCA6903
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicDecIfPositive8ForDriver(unsigned char *addr);</source>
+
<source lang="C">void sceKernelAbortForDriver(void);</source>
  
=== sceKernelCpuAtomicDecIfPositive16ForDriver ===
+
=== sceKernelCpuIdForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x9A693F5B
+
| 0.990-3.60 || 0x5E4D5DE1
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicDecIfPositive16ForDriver(unsigned short *addr);</source>
+
Return the CPU ID of the current core.
 +
 
 +
<source lang="c">int sceKernelCpuIdForDriver(void);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicDecIfPositive32ForDriver ===
+
=== sceKernelCpuAtomicAddAndGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2A71B03C
+
| 3.60 || 0x1E850481
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicDecIfPositive32ForDriver(unsigned int *addr);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicAddAndGet8ForDriver (unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicDecIfPositive64ForDriver ===
+
=== sceKernelCpuAtomicAddAndGet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x267D0B33
+
| 3.60 || 0x59F74E94
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicDecIfPositive64ForDriver(unsigned long long *addr);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicAddAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicAddAndGet32ForDriver ===
 
 
=== sceKernelCpuAtomicGetAndAdd8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xFCDCD4DE
+
| 0.990-3.60 || 0x5F6A8743
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndAdd8ForDriver(unsigned char *addr, unsigned char val);</source>
+
Adds <code>val</code> to <code>*addr</code> atomically, and returns the result.
 +
 
 +
<source lang="c">unsigned int sceKernelCpuAtomicAddAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicGetAndAdd16ForDriver ===
+
=== sceKernelCpuAtomicAddAndGet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x225DF91A
+
| 3.60 || 0x4E459A03
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndAdd16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicAddAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicGetAndAdd32ForDriver ===
+
=== sceKernelCpuAtomicAddUnless8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x341B6E81
+
| 3.60 || 0x5CC62CEC
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndAdd32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">int sceKernelCpuAtomicAddUnless8ForDriver(unsigned char *addr, unsigned char val, unsigned char cmp);</source>
  
=== sceKernelCpuAtomicGetAndAdd64ForDriver ===
+
=== sceKernelCpuAtomicAddUnless16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x043FD446
+
| 3.60 || 0x0F84AFE9
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndAdd64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">int sceKernelCpuAtomicAddUnless16ForDriver(unsigned short *addr, unsigned short val, unsigned short cmp);</source>
  
<hr>
+
=== sceKernelCpuAtomicAddUnless32ForDriver ===
 
 
=== sceKernelCpuAtomicGetAndAnd8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD8E675C0
+
| 3.60 || 0x1F157DC3
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndAnd8ForDriver(unsigned char *a1, unsigned char a2);</source>
+
<source lang="c">int sceKernelCpuAtomicAddUnless32ForDriver(unsigned int *addr, unsigned int val, unsigned int cmp);</source>
  
=== sceKernelCpuAtomicGetAndAnd16ForDriver ===
+
=== sceKernelCpuAtomicAddUnless64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4A820BC5
+
| 3.60 || 0x06CCFA4B
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndAnd16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">int sceKernelCpuAtomicAddUnless64ForDriver(unsigned long long *addr, int unused, unsigned long long val, unsigned long long cmp);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicGetAndAnd32ForDriver ===
+
=== sceKernelCpuAtomicAndAndGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x10EB35EB
+
| 3.60 || 0x32B62B1A
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndAnd32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicAndAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicGetAndAnd64ForDriver ===
+
=== sceKernelCpuAtomicAndAndGet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x18A17E07
+
| 3.60 || 0xB281D52A
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndAnd64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicAndAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicAndAndGet32ForDriver ===
 
 
=== sceKernelCpuAtomicGetAndClear8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x382D1466
+
| 3.60 || 0xDF899E4B
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndClear8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicAndAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicGetAndClear16ForDriver ===
+
=== sceKernelCpuAtomicAndAndGet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x8E9C086D
+
| 3.60 || 0xD18E7B54
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndClear16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicAndAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicGetAndClear32ForDriver ===
+
=== sceKernelCpuAtomicClearAndGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xE36F3A46
+
| 3.60 || 0x8E538AB5
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndClear32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicClearAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicGetAndClear64ForDriver ===
+
=== sceKernelCpuAtomicClearAndGet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x88BA6002
+
| 3.60 || 0x6B050D7C
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndClear64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicClearAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicClearAndGet32ForDriver ===
 
 
=== sceKernelCpuAtomicGetAndOr8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xBDF6F8E4
+
| 3.60 || 0x78C1F148
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndOr8ForDriver(unsigned char *var, unsigned char value);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicClearAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicGetAndOr16ForDriver ===
+
=== sceKernelCpuAtomicClearAndGet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x004F09D1
+
| 3.60 || 0x2149CD4C
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndOr16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicClearAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicGetAndOr32ForDriver ===
+
=== sceKernelCpuAtomicClearMask8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2A40BB93
+
| 3.60 || 0x1B3336B0
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndOr32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">void sceKernelCpuAtomicClearMask8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicGetAndOr64ForDriver ===
+
=== sceKernelCpuAtomicClearMask16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCB73D6D5
+
| 3.60 || 0x1BE58599
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndOr64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">void sceKernelCpuAtomicClearMask16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicClearMask32ForDriver ===
 
+
{| class="wikitable"
=== sceKernelCpuAtomicGetAndSet8ForDriver ===
 
{| class="wikitable"
 
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x29599FC8
+
| 3.60 || 0x4AE1BCC0
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndSet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">void sceKernelCpuAtomicClearMask32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicGetAndSet16ForDriver ===
+
=== sceKernelCpuAtomicClearMask64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x085532C8
+
| 3.60 || 0x55760309
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndSet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">void sceKernelCpuAtomicClearMask64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicGetAndSet32ForDriver ===
+
=== sceKernelCpuAtomicCompareAndSet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0EE04C03
+
| 3.60 || 0x3627F4E0
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndSet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicCompareAndSet8ForDriver(unsigned char *addr, unsigned char cmp, unsigned char val);</source>
  
=== sceKernelCpuAtomicGetAndSet64ForDriver ===
+
=== sceKernelCpuAtomicCompareAndSet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xD2DEE625
+
| 3.60 || 0x6F63F56D
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndSet64ForDriver(unsigned long long *addr, int unused, unsigned int lo_val, unsigned int hi_val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicCompareAndSet16ForDriver(unsigned short *addr, unsigned short cmp, unsigned short val);</source>
  
=== sceKernelCpuAtomicGetAndSub8ForDriver ===
+
=== sceKernelCpuAtomicCompareAndSet32ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7B43D0D7
+
| 3.60 || 0xCDA96E81
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndSub8ForDriver (unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicCompareAndSet32ForDriver(unsigned int *addr, unsigned int cmp, unsigned int val);</source>
  
=== sceKernelCpuAtomicGetAndSub16ForDriver ===
+
=== sceKernelCpuAtomicCompareAndSet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3EE9B5B8
+
| 3.60 || 0x4B527009
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndSub16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicCompareAndSet64ForDriver(unsigned long long *addr, int unused, unsigned long long cmp, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicGetAndSub32ForDriver ===
+
=== sceKernelCpuAtomicDecIfPositive8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF891CF2A
+
| 3.60 || 0x45153D4E
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndSub32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicDecIfPositive8ForDriver(unsigned char *addr);</source>
  
=== sceKernelCpuAtomicGetAndSub64ForDriver ===
+
=== sceKernelCpuAtomicDecIfPositive16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA7585370
+
| 3.60 || 0x9A693F5B
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndSub64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicDecIfPositive16ForDriver(unsigned short *addr);</source>
  
<hr>
+
=== sceKernelCpuAtomicDecIfPositive32ForDriver ===
 
 
=== sceKernelCpuAtomicGetAndXor8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xBAF47F7B
+
| 3.60 || 0x2A71B03C
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicGetAndXor8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicDecIfPositive32ForDriver(unsigned int *addr);</source>
  
=== sceKernelCpuAtomicGetAndXor16ForDriver ===
+
=== sceKernelCpuAtomicDecIfPositive64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x711801E6
+
| 3.60 || 0x267D0B33
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicGetAndXor16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicDecIfPositive64ForDriver(unsigned long long *addr);</source>
  
=== sceKernelCpuAtomicGetAndXor32ForDriver ===
+
<hr>
 +
 
 +
=== sceKernelCpuAtomicGetAndAdd8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x77E34309
+
| 3.60 || 0xFCDCD4DE
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicGetAndXor32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndAdd8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicGetAndXor64ForDriver ===
+
=== sceKernelCpuAtomicGetAndAdd16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xE212ECAD
+
| 3.60 || 0x225DF91A
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndXor64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndAdd16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicGetAndAdd32ForDriver ===
 
 
=== sceKernelCpuAtomicOrAndGet8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5D515F1B
+
| 3.60 || 0x341B6E81
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicOrAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndAdd32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicOrAndGet16ForDriver ===
+
=== sceKernelCpuAtomicGetAndAdd64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xADD39B84
+
| 3.60 || 0x043FD446
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicOrAndGet16ForDriver (unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndAdd64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicOrAndGet32ForDriver ===
+
=== sceKernelCpuAtomicGetAndAnd8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xBC248C30
+
| 3.60 || 0xD8E675C0
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicOrAndGet32ForDriver (unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndAnd8ForDriver(unsigned char *a1, unsigned char a2);</source>
  
=== sceKernelCpuAtomicOrAndGet64ForDriver ===
+
=== sceKernelCpuAtomicGetAndAnd16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3E218AF7
+
| 3.60 || 0x4A820BC5
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicOrAndGet64ForDriver(unsigned long long *addr, int unused, long long val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndAnd16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicGetAndAnd32ForDriver ===
 
 
=== sceKernelCpuAtomicSet8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x0836537E
+
| 3.60 || 0x10EB35EB
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicSet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndAnd32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicSet16ForDriver ===
+
=== sceKernelCpuAtomicGetAndAnd64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x532CA3E8
+
| 3.60 || 0x18A17E07
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicSet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndAnd64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuAtomicSet32ForDriver ===
+
=== sceKernelCpuAtomicGetAndClear8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3168BC57
+
| 3.60 || 0x382D1466
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicSet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndClear8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicSet64ForDriver ===
+
=== sceKernelCpuAtomicGetAndClear16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC381CE8C
+
| 3.60 || 0x8E9C086D
 
|}
 
|}
  
<source lang="c">void sceKernelCpuAtomicSet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndClear16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicGetAndClear32ForDriver ===
 
 
=== sceKernelCpuAtomicSetIfGreaterGet8ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xC3868071
+
| 3.60 || 0xE36F3A46
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicSetIfGreaterGet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndClear32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicSetIfGreaterGet16ForDriver ===
+
=== sceKernelCpuAtomicGetAndClear64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x875B094D
+
| 3.60 || 0x88BA6002
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicSetIfGreaterGet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndClear64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 
 
=== sceKernelCpuAtomicSetIfGreaterGet32ForDriver ===
 
{| class="wikitable"
 
|-
 
! Version !! NID
 
|-
 
| 3.60 || 0x26F71995
 
|}
 
 
 
<source lang="c">unsigned int sceKernelCpuAtomicSetIfGreaterGet32ForDriver(unsigned int *a1, unsigned int val);</source>
 
  
 
<hr>
 
<hr>
  
=== sceKernelCpuAtomicSubAndGet8ForDriver ===
+
=== sceKernelCpuAtomicGetAndOr8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xEB085370
+
| 3.60 || 0xBDF6F8E4
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicSubAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndOr8ForDriver(unsigned char *var, unsigned char value);</source>
  
=== sceKernelCpuAtomicSubAndGet16ForDriver ===
+
=== sceKernelCpuAtomicGetAndOr16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x515682C9
+
| 3.60 || 0x004F09D1
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicSubAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndOr16ForDriver(unsigned short *addr, unsigned short val);</source>
  
=== sceKernelCpuAtomicSubAndGet32ForDriver ===
+
=== sceKernelCpuAtomicGetAndOr32ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xA4884C4E
+
| 3.60 || 0x2A40BB93
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicSubAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndOr32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicSubAndGet64ForDriver ===
+
=== sceKernelCpuAtomicGetAndOr64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB5F8919C
+
| 3.60 || 0xCB73D6D5
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicSubAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndOr64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
  
 
<hr>
 
<hr>
  
=== sceKernelCpuAtomicXorAndGet8ForDriver ===
+
=== sceKernelCpuAtomicGetAndSet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x03887992
+
| 3.60 || 0x29599FC8
 
|}
 
|}
  
<source lang="c">unsigned char sceKernelCpuAtomicXorAndGet8ForDriver (unsigned char *a1, unsigned char a2);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndSet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuAtomicXorAndGet16ForDriver ===
+
=== sceKernelCpuAtomicGetAndSet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x646003D6
+
| 3.60 || 0x085532C8
 
|}
 
|}
  
<source lang="c">unsigned short sceKernelCpuAtomicXorAndGet16ForDriver (unsigned short *addr, unsigned short val);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndSet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
=== sceKernelCpuAtomicXorAndGet32ForDriver ===
+
=== sceKernelCpuAtomicGetAndSet32ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4244BE65
+
| 3.60 || 0x0EE04C03
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuAtomicXorAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndSet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuAtomicXorAndGet64ForDriver ===
+
=== sceKernelCpuAtomicGetAndSet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x692C51B3
+
| 3.60 || 0xD2DEE625
 
|}
 
|}
  
<source lang="c">unsigned long long sceKernelCpuAtomicXorAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndSet64ForDriver(unsigned long long *addr, int unused, unsigned int lo_val, unsigned int hi_val);</source>
  
<hr>
+
=== sceKernelCpuAtomicGetAndSub8ForDriver ===
 
 
=== sceKernelDcacheInvalidateRange_1ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x02796361
+
| 3.60 || 0x7B43D0D7
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheAndL2InvalidateMVACRange_1ForDriver, sceKernelCpuDcacheAndL2InvalidateRangeForDriver.
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndSub8ForDriver (unsigned char *addr, unsigned char val);</source>
  
<source lang="c">int sceKernelDcacheInvalidateRange_1ForDriver(const void *start, SceSize size);</source>
+
=== sceKernelCpuAtomicGetAndSub16ForDriver ===
 
 
=== sceKernelDcacheInvalidateRange_0x10ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x614C6698
+
| 3.60 || 0x3EE9B5B8
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheAndL2InvalidateMVACRange_10ForDriver.
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndSub16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<source lang="c">int sceKernelDcacheInvalidateRange_0x10ForDriver(const void *start, SceSize size);</source>
+
=== sceKernelCpuAtomicGetAndSub32ForDriver ===
 
 
=== sceKernelDcacheInvalidateRange_0x20ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x8B4C26DF
+
| 3.60 || 0xF891CF2A
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheInvalidateRangeForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_20ForDriver.
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndSub32ForDriver(unsigned int *addr, unsigned int val);</source>
  
<source lang="c">int sceKernelDcacheInvalidateRange_0x20ForDriver(const void *start, SceSize size);</source>
+
=== sceKernelCpuAtomicGetAndSub64ForDriver ===
 
 
=== sceKernelDcacheCleanInvalidateRange_1ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x364E68A4
+
| 3.60 || 0xA7585370
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheAndL2CleanInvalidateMVACRange_1ForDriver, sceKernelCpuDcacheAndL2WritebackInvalidateRangeForDriver.
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndSub64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
  
<source lang="c">int sceKernelDcacheCleanInvalidateRange_1ForDriver(const void *start, SceSize size);</source>
+
<hr>
  
=== sceKernelDcacheCleanInvalidateRange_0x10ForDriver ===
+
=== sceKernelCpuAtomicGetAndXor8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x364E68A4
+
| 3.60 || 0xBAF47F7B
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="c">
+
<source lang="c">unsigned char sceKernelCpuAtomicGetAndXor8ForDriver(unsigned char *addr, unsigned char val);</source>
int sceKernelDcacheCleanInvalidateRange_0x10ForDriver(const void *start, SceSize size);
 
</source>
 
  
=== sceKernelDcacheCleanInvalidateRange_0x20ForDriver ===
+
=== sceKernelCpuAtomicGetAndXor16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xE551F99B
+
| 3.60 || 0x711801E6
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheAndL2CleanInvalidateMVACRange_20ForDriver.
+
<source lang="c">unsigned short sceKernelCpuAtomicGetAndXor16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<source lang="c">int sceKernelDcacheCleanInvalidateRange_0x20ForDriver(const void *start, SceSize);</source>
+
=== sceKernelCpuAtomicGetAndXor32ForDriver ===
 
 
=== sceKernelDcacheCleanRange_1ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x103872A5
+
| 3.60 || 0x77E34309
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheAndL2WritebackRangeForDriver, sceKernelCpuDcacheAndL2CleanMVACRange_1ForDriver.
+
<source lang="c">unsigned int sceKernelCpuAtomicGetAndXor32ForDriver(unsigned int *addr, unsigned int val);</source>
  
<source lang="c">int sceKernelDcacheCleanRange_1ForDriver(const void *start, SceSize size);</source>
+
=== sceKernelCpuAtomicGetAndXor64ForDriver ===
 
 
=== sceKernelDcacheCleanRange_0x10ForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x2A5344B7
+
| 3.60 || 0xE212ECAD
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="c">int sceKernelDcacheCleanRange_0x10ForDriver(const void *start, SceSize size);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicGetAndXor64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelDcacheCleanRange_0x20ForDriver ===
+
=== sceKernelCpuAtomicOrAndGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.68 || 0x9CB9F0CE
+
| 3.60 || 0x5D515F1B
 
|}
 
|}
  
Temp name was sceKernelCpuDcacheWritebackRangeForDriver, flush_dcache, sceKernelCpuDcacheAndL2CleanMVACRange_20ForDriver.
+
<source lang="c">unsigned char sceKernelCpuAtomicOrAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
<source lang="c">int sceKernelDcacheCleanRange_0x20ForDriver(const void *start, SceSize size);</source>
+
=== sceKernelCpuAtomicOrAndGet16ForDriver ===
 
 
=== SceCpuForDriver_E813EBB2 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xE813EBB2
+
| 3.60 || 0xADD39B84
 
|}
 
|}
  
Cleans L2 memory? A name could be sceKernelWaitL2CacheReg.
+
<source lang="c">unsigned short sceKernelCpuAtomicOrAndGet16ForDriver (unsigned short *addr, unsigned short val);</source>
  
<source lang="C">
+
=== sceKernelCpuAtomicOrAndGet32ForDriver ===
#define SceL2CacheReg 0x1A002000
+
{| class="wikitable"
__dsb();
+
|-
*(int *)(SceL2CacheReg + 0x730) = 0;
+
! Version !! NID
while ( *(int *)(SceL2CacheReg + 0x730) & 1 )
+
|-
    ;
+
| 3.60 || 0xBC248C30
__dmb();
+
|}
</source>
 
  
<source lang="c">int SceCpuForDriver_E813EBB2(void);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicOrAndGet32ForDriver (unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuIsVaddrMappedForDriver ===
+
=== sceKernelCpuAtomicOrAndGet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x337CBDF3
+
| 3.60 || 0x3E218AF7
 
|}
 
|}
  
<source lang="C">
+
<source lang="c">unsigned long long sceKernelCpuAtomicOrAndGet64ForDriver(unsigned long long *addr, int unused, long long val);</source>
  uint32_t vaddr_memory_type = SceCpuForKernel_9B8173F4(vaddr);
 
  if (vaddr_memory_type != 8) {
 
    if (vaddr_memory_type <= 8) {
 
      if (vaddr_memory_type != 2)
 
        return 0;
 
    } else if (vaddr_memory_type != 0x40 && vaddr_memory_type != 0x80)
 
      return 0;
 
  }
 
  return 1;
 
</source>
 
 
 
<source lang="c">int sceKernelCpuIsVaddrMappedForDriver(void *vaddr);</source>
 
  
 
<hr>
 
<hr>
  
These functions implement a simple mutual exclusive access on a resource address using LDREX/STREX.
+
=== sceKernelCpuAtomicSet8ForDriver ===
 
 
=== sceKernelCpuLockStoreLRForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.60-3.60 || 0xBF82DEB2
+
| 3.60 || 0x0836537E
 
|}
 
|}
  
<source lang="c">void sceKernelCpuLockStoreLRForDriver(unsigned int *addr);</source>
+
<source lang="c">void sceKernelCpuAtomicSet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuTryLockStoreLRForDriver ===
+
=== sceKernelCpuAtomicSet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5AC9D394
+
| 3.60 || 0x532CA3E8
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuTryLockStoreLRForDriver(unsigned int *addr);</source>
+
<source lang="c">void sceKernelCpuAtomicSet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
=== sceKernelCpuUnlockStoreLRForDriver ===
+
=== sceKernelCpuAtomicSet32ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.60-3.60 || 0xD6ED0C46
+
| 3.60 || 0x3168BC57
 
|}
 
|}
  
<source lang="c">void sceKernelCpuUnlockStoreLRForDriver(unsigned int *addr);</source>
+
<source lang="c">void sceKernelCpuAtomicSet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
<hr>
+
=== sceKernelCpuAtomicSet64ForDriver ===
 
 
=== sceKernelCpuLockStoreFlagForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x3F42B434
+
| 3.60 || 0xC381CE8C
 
|}
 
|}
  
<source lang="c">void sceKernelCpuLockStoreFlagForDriver(unsigned int *result);</source>
+
<source lang="c">void sceKernelCpuAtomicSet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuTryLockStoreFlagForDriver ===
+
=== sceKernelCpuAtomicSetIfGreaterGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4F7790B4
+
| 3.60 || 0xC3868071
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuTryLockStoreFlagForDriver(unsigned int *addr);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicSetIfGreaterGet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuUnlockStoreFlagForDriver ===
+
=== sceKernelCpuAtomicSetIfGreaterGet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCB8ABDF0
+
| 3.60 || 0x875B094D
 
|}
 
|}
  
<source lang="c">void sceKernelCpuUnlockStoreFlagForDriver(unsigned int *addr);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicSetIfGreaterGet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<hr>
+
=== sceKernelCpuAtomicSetIfGreaterGet32ForDriver ===
 
 
These functions implement a simple mutual exclusive access on a resource addr using LDREX/STREX.
 
 
 
LR is stored as addr value.
 
 
 
While mutex is held, interrupts are disabled.
 
 
 
Used like this:
 
 
 
<source lang="c">
 
int prev_state = sceKernelCpuLockSuspendIntrStoreLRForDriver(mutex);
 
// do work
 
sceKernelCpuUnlockResumeIntrStoreLRForDriver(mutex, prev_state);
 
</source>
 
 
 
=== sceKernelCpuLockSuspendIntrStoreLRForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xD32ACE9E
+
| 3.60 || 0x26F71995
 
|}
 
|}
  
Temp name was sceKernelCpuSuspendIntrForDriver.
+
<source lang="c">unsigned int sceKernelCpuAtomicSetIfGreaterGet32ForDriver(unsigned int *a1, unsigned int val);</source>
  
<source lang="c">SceUInt32 sceKernelCpuLockSuspendIntrStoreLRForDriver(SceUInt32 *addr);</source>
+
<hr>
  
=== sceKernelCpuTryLockSuspendIntrStoreLRForDriver ===
+
=== sceKernelCpuAtomicSubAndGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x27C0B340
+
| 3.60 || 0xEB085370
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuTryLockSuspendIntrStoreLRForDriver(int *addr);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicSubAndGet8ForDriver(unsigned char *addr, unsigned char val);</source>
  
=== sceKernelCpuUnlockResumeIntrStoreLRForDriver ===
+
=== sceKernelCpuAtomicSubAndGet16ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x7BB9D5DF
+
| 3.60 || 0x515682C9
 
|}
 
|}
  
Temp name was sceKernelCpuResumeIntrForDriver.
+
<source lang="c">unsigned short sceKernelCpuAtomicSubAndGet16ForDriver(unsigned short *addr, unsigned short val);</source>
  
<source lang="c">void sceKernelCpuUnlockResumeIntrStoreLRForDriver(SceUInt32 *addr, int prev_state);</source>
+
=== sceKernelCpuAtomicSubAndGet32ForDriver ===
 
 
<hr>
 
 
 
These functions implement a simple mutual exclusive access on a resource addr using LDREX/STREX.
 
 
 
0x80000000 is stored as addr value.
 
 
 
While mutex is held, interrupts are disabled.
 
 
 
Used like this:
 
 
 
<source lang="c">
 
int prev_state = sceKernelCpuLockSuspendIntrStoreFlagForDriver(mutex);
 
// do work
 
sceKernelCpuUnlockResumeIntrStoreFlagForDriver(mutex, prev_state);
 
</source>
 
 
 
=== sceKernelCpuLockSuspendIntrStoreFlagForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x4C38CE4D
+
| 3.60 || 0xA4884C4E
 
|}
 
|}
  
<source lang="c">int sceKernelCpuLockSuspendIntrStoreFlagForDriver(void *addr);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicSubAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuTryLockSuspendIntrStoreFlagForDriver ===
+
=== sceKernelCpuAtomicSubAndGet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xDE6482C6
+
| 3.60 || 0xB5F8919C
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuTryLockSuspendIntrStoreFlagForDriver(unsigned int *addr);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicSubAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
 +
 
 +
<hr>
  
=== sceKernelCpuUnlockResumeIntrStoreFlagForDriver ===
+
=== sceKernelCpuAtomicXorAndGet8ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x9EC91017
+
| 3.60 || 0x03887992
 
|}
 
|}
  
<source lang="c">void sceKernelCpuUnlockResumeIntrStoreFlagForDriver(void *addr, unsigned int prev_state);</source>
+
<source lang="c">unsigned char sceKernelCpuAtomicXorAndGet8ForDriver (unsigned char *a1, unsigned char a2);</source>
  
<hr>
+
=== sceKernelCpuAtomicXorAndGet16ForDriver ===
 
 
=== sceKernelCpuSpinLockStoreLRForDriver ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCAC9AE80
+
| 3.60 || 0x646003D6
 
|}
 
|}
  
<source lang="c">void sceKernelCpuSpinLockStoreLRForDriver(unsigned int *result);</source>
+
<source lang="c">unsigned short sceKernelCpuAtomicXorAndGet16ForDriver (unsigned short *addr, unsigned short val);</source>
  
=== sceKernelCpuTrySpinLockStoreLRForDriver ===
+
=== sceKernelCpuAtomicXorAndGet32ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x093925BD
+
| 3.60 || 0x4244BE65
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuTrySpinLockStoreLRForDriver(unsigned int *addr);</source>
+
<source lang="c">unsigned int sceKernelCpuAtomicXorAndGet32ForDriver(unsigned int *addr, unsigned int val);</source>
  
=== sceKernelCpuSpinUnlockStoreLRForDriver ===
+
=== sceKernelCpuAtomicXorAndGet64ForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF5FD5676
+
| 3.60 || 0x692C51B3
 
|}
 
|}
  
<source lang="c">void sceKernelCpuSpinUnlockStoreLRForDriver(unsigned int *result);</source>
+
<source lang="c">unsigned long long sceKernelCpuAtomicXorAndGet64ForDriver(unsigned long long *addr, int unused, unsigned long long val);</source>
  
 
<hr>
 
<hr>
  
=== sceKernelCpuSpinLockSuspendIntrStoreLRForDriver ===
+
=== sceKernelDcacheInvalidateRangeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xEC53D007
+
| 0.931-3.60 || 0x02796361
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuSpinLockSuspendIntrStoreLRForDriver(unsigned int *addr);</source>
+
Temp name was sceKernelDcacheInvalidateRange_1ForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_1ForDriver, sceKernelCpuDcacheAndL2InvalidateRangeForDriver.
 +
 
 +
<source lang="c">int sceKernelDcacheInvalidateRangeForDriver(const void *start, SceSize size);</source>
  
=== sceKernelCpuTrySpinLockSuspendIntrStoreLRForDriver ===
+
=== sceKernelDcacheInvalidateRangeForL2WBWAForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xF02467D1
+
| 0.990 || 0x614C6698
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
<source lang="c">unsigned int sceKernelCpuTrySpinLockSuspendIntrStoreLRForDriver(unsigned int *addr);</source>
+
Temp name was sceKernelDcacheInvalidateRange_0x10ForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_10ForDriver.
 +
 
 +
<source lang="c">int sceKernelDcacheInvalidateRangeForL2WBWAForDriver(const void *start, SceSize size);</source>
  
=== sceKernelCpuSpinUnlockResumeIntrStoreLRForDriver ===
+
=== sceKernelDcacheInvalidateRangeForL1WBWAForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x740A0750
+
| 0.990-3.60 || 0x8B4C26DF
 
|}
 
|}
  
<source lang="c">void sceKernelCpuSpinUnlockResumeIntrStoreLRForDriver(unsigned int *addr, unsigned int prev_state);</source>
+
Temp name was sceKernelDcacheInvalidateRange_0x20ForDriver, sceKernelCpuDcacheInvalidateRangeForDriver, sceKernelCpuDcacheAndL2InvalidateMVACRange_20ForDriver.
  
<hr>
+
<source lang="c">int sceKernelDcacheInvalidateRangeForL1WBWAForDriver(const void *start, SceSize size);</source>
  
=== sceKernelCpuDisableInterruptsForDriver ===
+
=== sceKernelDcacheCleanInvalidateRangeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.60-3.60 || 0x821FC0EE
+
| 0.931-3.60 || 0x364E68A4
 
|}
 
|}
  
Disable irq (but not fiq) and returns previous interrupt bit status (so either 0 or 0x80).
+
Temp name was sceKernelDcacheCleanInvalidateRange_1ForDriver, sceKernelCpuDcacheAndL2CleanInvalidateMVACRange_1ForDriver, sceKernelCpuDcacheAndL2WritebackInvalidateRangeForDriver.
  
<source lang="c">unsigned int sceKernelCpuDisableInterruptsForDriver(void);</source>
+
<source lang="c">int sceKernelDcacheCleanInvalidateRangeForDriver(const void *start, SceSize size);</source>
  
=== sceKernelCpuEnableInterruptsForDriver ===
+
=== sceKernelDcacheCleanInvalidateRangeForL2WBWAForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.60-3.60 || 0xF5BAD43B
+
| 0.990 || 0x364E68A4
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Restore previous irq state, pass either 0 or 0x80.
+
Temp name was sceKernelDcacheCleanInvalidateRange_0x10ForDriver.
 
 
<source lang="c">unsigned int sceKernelCpuEnableInterruptsForDriver(unsigned int prev_state);</source>
 
 
 
== SceSysclibForKernel ==
 
  
Was present on 1.69. Doesn't exist on 3.60.
+
<source lang="c">int sceKernelDcacheCleanInvalidateRangeForL2WBWAForDriver(const void *start, SceSize size);</source>
  
=== __vsnprintf_internal ===
+
=== sceKernelDcacheCleanInvalidateRangeForL1WBWAForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-1.50 || 0xE38E7605
+
| 0.990-3.60 || 0xE551F99B
|-
 
| 3.60 || moved to ForDriver
 
 
|}
 
|}
  
=== SceSysclibForKernel_F7E34376 ===
+
Temp name was sceKernelDcacheCleanInvalidateRange_0x20ForDriver, sceKernelCpuDcacheAndL2CleanInvalidateMVACRange_20ForDriver.
 +
 
 +
<source lang="c">int sceKernelDcacheCleanInvalidateRangeForL1WBWAForDriver(const void *start, SceSize);</source>
 +
 
 +
=== sceKernelDcacheCleanRangeForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
! Version !! NID
 
 
|-
 
|-
| 1.50 || 0xF7E34376
 
|}
 
 
=== SceSysclibForKernel_FA746181 ===
 
{| class="wikitable"
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-1.50 || 0xFA746181
+
| 0.931-3.60 || 0x103872A5
 
|}
 
|}
  
return a1 * (- 0x6e19295b) - 0x6e19295b;
+
Temp name was sceKernelDcacheCleanRange_1ForDriver, sceKernelCpuDcacheAndL2WritebackRangeForDriver, sceKernelCpuDcacheAndL2CleanMVACRange_1ForDriver.
  
In SceSysmem it is used internally to modify a global variable, like a multiplication hash function would do.
+
<source lang="c">int sceKernelDcacheCleanRange_1ForDriver(const void *start, SceSize size);</source>
 
 
<source lang="C">int SceSysclibForKernel_FA746181(int a1);</source>
 
 
 
== SceSysclibForDriver ==
 
 
 
The C standard library for use in kernel only. Usermode has access to [[SceLibKernel]], which confusingly is usermode only.
 
 
 
Includes standard string functions (no insecure variants like <code>strcpy</code>).
 
  
=== __aeabi_idiv ===
+
=== sceKernelDcacheCleanRangeForL2WBWAForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x2518CD9E
+
| 0.990 || 0x2A5344B7
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
=== __aeabi_lcmp ===
+
Temp name was sceKernelDcacheCleanRange_0x10ForDriver.
 +
 
 +
<source lang="c">int sceKernelDcacheCleanRangeForL2WBWAForDriver(const void *start, SceSize size);</source>
 +
 
 +
=== sceKernelDcacheCleanRangeForL1WBWAForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x709077A1
+
| 0.990-3.68 || 0x9CB9F0CE
 
|}
 
|}
  
=== __aeabi_lmul ===
+
Temp name was sceKernelCpuDcacheWritebackRangeForDriver, flush_dcache, sceKernelDcacheCleanRange_0x20ForDriver, sceKernelCpuDcacheAndL2CleanMVACRange_20ForDriver.
 +
 
 +
<source lang="c">int sceKernelDcacheCleanRange_0x20ForDriver(const void *start, SceSize size);</source>
 +
 
 +
=== SceCpuForDriver_E813EBB2 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xFEE5E751
+
| 1.69-3.60 || 0xE813EBB2
 
|}
 
|}
  
=== __aeabi_uidiv ===
+
Cleans L2 memory? A name could be sceKernelWaitL2CacheReg.
{| class="wikitable"
+
 
! Version !! NID
+
<source lang="C">
|-
+
#define SceL2CacheReg 0x1A002000
| 0.990-3.60 || 0xA9FF1205
+
__dsb();
|}
+
*(int *)(SceL2CacheReg + 0x730) = 0;
 +
while ( *(int *)(SceL2CacheReg + 0x730) & 1 )
 +
    ;
 +
__dmb();
 +
</source>
  
=== __aeabi_uidivmod ===
+
<source lang="c">int SceCpuForDriver_E813EBB2(void);</source>
{| class="wikitable"
 
! Version !! NID
 
|-
 
| 0.990-3.60 || 0xA46CB7DE
 
|}
 
  
=== __aeabi_ldivmod ===
+
=== sceKernelIsUncacheAddressInTmpFsGameForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7554AB04
+
| 3.60 || 0x337CBDF3
 
|}
 
|}
  
=== __aeabi_ulcmp ===
+
Temp name was sceKernelCpuIsVaddrMappedForDriver.
{| class="wikitable"
+
 
|-
+
<source lang="C">
! Version !! NID
+
  uint32_t vaddr_memory_type = SceCpuForKernel_9B8173F4(vaddr);
|-
+
  if (vaddr_memory_type != 8) {
| 0.931-3.60 || 0xFE900DE8
+
    if (vaddr_memory_type <= 8) {
|}
+
      if (vaddr_memory_type != 2)
 +
        return 0;
 +
    } else if (vaddr_memory_type != 0x40 && vaddr_memory_type != 0x80)
 +
      return 0;
 +
  }
 +
  return 1;
 +
</source>
 +
 
 +
<source lang="c">int sceKernelIsUncacheAddressInTmpFsGameForDriver(void *vaddr);</source>
 +
 
 +
<hr>
 +
 
 +
These functions implement a simple mutual exclusive access on a resource address using LDREX/STREX.
  
=== __memcpy_chk ===
+
=== sceKernelSpinlockLowLockForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x8A0B0815
+
| 1.60-3.60 || 0xBF82DEB2
 
|}
 
|}
  
=== __memmove_chk ===
+
Temp name was sceKernelCpuLockStoreLRForDriver.
 +
 
 +
<source lang="c">void sceKernelSpinlockLowLockForDriver(SceUInt32 *addr);</source>
 +
 
 +
=== sceKernelCpuTryLockStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x35DBB110
+
| 3.60 || 0x5AC9D394
 
|}
 
|}
  
=== __memset_chk ===
+
<source lang="c">unsigned int sceKernelCpuTryLockStoreLRForDriver(unsigned int *addr);</source>
 +
 
 +
=== sceKernelSpinlockLowUnlockForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1A30BB28
+
| 1.60-3.60 || 0xD6ED0C46
 
|}
 
|}
  
=== __stack_chk_fail ===
+
Temp name was sceKernelCpuUnlockStoreLRForDriver.
{| class="wikitable"
 
! Version !! NID
 
|-
 
| 1.50-3.60 || 0xB997493D
 
|}
 
  
=== __stack_chk_guard ===
+
<source lang="c">void sceKernelSpinlockLowUnlockForDriver(unsigned int *addr);</source>
{| class="wikitable"
 
! Version !! NID
 
|-
 
| 3.60 || 0x99EEBD1F
 
|}
 
  
This is a variable.
+
<hr>
  
=== __strlcat_chk ===
+
=== sceKernelCpuLockStoreFlagForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x224BE33F
+
| 3.60 || 0x3F42B434
 
|}
 
|}
  
=== __strlcpy_chk ===
+
<source lang="c">void sceKernelCpuLockStoreFlagForDriver(unsigned int *result);</source>
 +
 
 +
=== sceKernelCpuTryLockStoreFlagForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCF86EA38
+
| 3.60 || 0x4F7790B4
 
|}
 
|}
  
=== __strncat_chk ===
+
<source lang="c">unsigned int sceKernelCpuTryLockStoreFlagForDriver(unsigned int *addr);</source>
 +
 
 +
=== sceKernelCpuUnlockStoreFlagForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x33EE298B
+
| 3.60 || 0xCB8ABDF0
 
|}
 
|}
  
=== __strncpy_chk ===
+
<source lang="c">void sceKernelCpuUnlockStoreFlagForDriver(unsigned int *addr);</source>
{| class="wikitable"
+
 
 +
<hr>
 +
 
 +
These functions implement a simple mutual exclusive access on a resource addr using LDREX/STREX.
 +
 
 +
LR is stored as addr value.
 +
 
 +
While mutex is held, interrupts are disabled.
 +
 
 +
Used like this:
 +
 
 +
<source lang="c">
 +
int prev_state = sceKernelCpuLockSuspendIntrStoreLRForDriver(mutex);
 +
// do work
 +
sceKernelCpuUnlockResumeIntrStoreLRForDriver(mutex, prev_state);
 +
</source>
 +
 
 +
=== sceKernelSpinlockLowLockCpuSuspendIntrForDriver ===
 +
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x96268C53
+
| 0.990-3.60 || 0xD32ACE9E
 
|}
 
|}
  
=== __snprintf_chk ===
+
Temp name was sceKernelCpuSuspendIntrForDriver, sceKernelCpuLockSuspendIntrStoreLRForDriver.
 +
 
 +
Lock can be unlocked by [[SceSysmem#sceKernelSpinlockLowUnlockCpuResumeIntrForDriver|sceKernelSpinlockLowUnlockCpuResumeIntrForDriver]].
 +
 
 +
<source lang="c">SceUInt32 sceKernelSpinlockLowLockCpuSuspendIntrForDriver(SceUInt32 *addr);</source>
 +
 
 +
=== sceKernelCpuTryLockSuspendIntrStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7DBE7007
+
| 3.60 || 0x27C0B340
 
|}
 
|}
  
=== __vsnprintf_chk ===
+
<source lang="c">unsigned int sceKernelCpuTryLockSuspendIntrStoreLRForDriver(int *addr);</source>
 +
 
 +
=== sceKernelSpinlockLowUnlockCpuResumeIntrForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || not present
+
| 0.990-3.60 || 0x7BB9D5DF
|-
 
| 3.60 || 0xCBF64DF6
 
 
|}
 
|}
  
=== __vsnprintf_internal ===
+
Temp name was sceKernelCpuUnlockResumeIntrStoreLRForDriver, sceKernelCpuResumeIntrForDriver.
 +
 
 +
Lock can be set by [[SceSysmem#sceKernelSpinlockLowLockCpuSuspendIntrForDriver|sceKernelSpinlockLowLockCpuSuspendIntrForDriver]].
 +
 
 +
<source lang="c">void sceKernelSpinlockLowUnlockCpuResumeIntrForDriver(SceUInt32 *addr, int prev_state);</source>
 +
 
 +
<hr>
 +
 
 +
These functions implement a simple mutual exclusive access on a resource addr using LDREX/STREX.
 +
 
 +
0x80000000 is stored as addr value.
 +
 
 +
While mutex is held, interrupts are disabled.
 +
 
 +
Used like this:
 +
 
 +
<source lang="c">
 +
int prev_state = sceKernelCpuLockSuspendIntrStoreFlagForDriver(mutex);
 +
// do work
 +
sceKernelCpuUnlockResumeIntrStoreFlagForDriver(mutex, prev_state);
 +
</source>
 +
 
 +
=== sceKernelCpuLockSuspendIntrStoreFlagForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || in ForKernel
+
| 0.990-3.60 || 0x4C38CE4D
|-
 
| 3.60 || 0xE38E7605
 
 
|}
 
|}
  
<source lang="C">void __vsnprintf_internal(void (* cb)(void *argp, int ch), void *argp, const char *fmt, va_list list);</source>
+
<source lang="c">int sceKernelCpuLockSuspendIntrStoreFlagForDriver(void *addr);</source>
 
 
Supported format
 
  
 +
=== sceKernelCpuTryLockSuspendIntrStoreFlagForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Format !! Description
+
! Version !! NID
 
|-
 
|-
| \x20 || maybe space fill
+
| 3.60 || 0xDE6482C6
|-
 
| # || unknown
 
|-
 
| * || unknown
 
|-
 
| - || Left align
 
|-
 
| + || unknown
 
|-
 
| . || unknown
 
|-
 
| 0 || Padding number and Enter zero padding
 
|-
 
| 1~9 || Padding number
 
|-
 
| D || unknown (maybe with long?)
 
|-
 
| L || unknown (maybe with long?)
 
|-
 
| O || unknown (maybe with long?)
 
|-
 
| U || unknown (maybe with long?)
 
|-
 
| X || print hex number as uppercase
 
|-
 
| c || print char
 
|-
 
| d || print decimal number
 
|-
 
| h || unknown
 
|-
 
| l || long
 
|-
 
| o || unknown
 
|-
 
| p || print pointer as lowercase
 
|-
 
| s || print strings
 
|-
 
| u || unsigned number
 
|-
 
| x || print hex number as lowercase
 
 
|}
 
|}
  
=== sortof_vsnprintf ===
+
<source lang="c">unsigned int sceKernelCpuTryLockSuspendIntrStoreFlagForDriver(unsigned int *addr);</source>
 +
 
 +
=== sceKernelCpuUnlockResumeIntrStoreFlagForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x589BAF6B
+
| 0.990-3.60 || 0x9EC91017
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
This is a temporary name.
+
<source lang="c">void sceKernelCpuUnlockResumeIntrStoreFlagForDriver(void *addr, unsigned int prev_state);</source>
 +
 
 +
<hr>
  
=== sortof_vsnprintf_2 ===
+
=== sceKernelCpuSpinLockStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x658EA38E
+
| 3.60 || 0xCAC9AE80
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
This is a temporary name.
+
<source lang="c">void sceKernelCpuSpinLockStoreLRForDriver(unsigned int *result);</source>
  
=== vsnprintf ===
+
=== sceKernelCpuTrySpinLockStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x3DDBE2E1
+
| 3.60 || 0x093925BD
 
|}
 
|}
  
<source>int vsnprintf(char *s, size_t n, const char *fmt, va_list arg);</source>
+
<source lang="c">unsigned int sceKernelCpuTrySpinLockStoreLRForDriver(unsigned int *addr);</source>
  
=== get_ctype_table ===
+
=== sceKernelCpuSpinUnlockStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x0614B013
+
| 3.60 || 0xF5FD5676
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
=== look_ctype_table ===
+
<source lang="c">void sceKernelCpuSpinUnlockStoreLRForDriver(unsigned int *result);</source>
 +
 
 +
<hr>
 +
 
 +
=== sceKernelCpuSpinLockSuspendIntrStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xCDF7F155
+
| 3.60 || 0xEC53D007
 
|}
 
|}
  
=== memchr ===
+
<source lang="c">unsigned int sceKernelCpuSpinLockSuspendIntrStoreLRForDriver(unsigned int *addr);</source>
 +
 
 +
=== sceKernelCpuTrySpinLockSuspendIntrStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x60DAEA30
+
| 3.60 || 0xF02467D1
 
|}
 
|}
  
=== timingsafe_memcmp ===
+
<source lang="c">unsigned int sceKernelCpuTrySpinLockSuspendIntrStoreLRForDriver(unsigned int *addr);</source>
 +
 
 +
=== sceKernelCpuSpinUnlockResumeIntrStoreLRForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0xB5A4D745
+
| 3.60 || 0x740A0750
 
|}
 
|}
  
timing constant memcmp
+
<source lang="c">void sceKernelCpuSpinUnlockResumeIntrStoreLRForDriver(unsigned int *addr, unsigned int prev_state);</source>
 +
 
 +
<hr>
  
=== memcmp ===
+
=== sceKernelCpuSuspendIntrForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xF939E83D
+
| 1.60-3.60 || 0x821FC0EE
 
|}
 
|}
  
=== memcpy ===
+
Temp name was sceKernelCpuDisableInterruptsForDriver.
 +
 
 +
Disable irq (but not fiq) and returns previous interrupt bit status (so either 0 or 0x80).
 +
 
 +
<source lang="c">unsigned int sceKernelCpuSuspendIntrForDriver(void);</source>
 +
 
 +
=== sceKernelCpuResumeIntrForDriver ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x40C88316
+
| 1.60-3.60 || 0xF5BAD43B
 
|}
 
|}
  
=== memmove ===
+
Temp name was sceKernelCpuEnableInterruptsForDriver.
 +
 
 +
Restore previous irq state, pass either 0 or 0x80.
 +
 
 +
<source lang="c">unsigned int sceKernelCpuResumeIntrForDriver(unsigned int prev_state);</source>
 +
 
 +
== SceSysclibForKernel ==
 +
 
 +
Was present on 1.69. Doesn't exist on 3.60.
 +
 
 +
=== __vsnprintf_internal ===
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Version !! NID
 
|-
 
|-
! Version !! NID
+
| 0.931-1.50 || 0xE38E7605
 
|-
 
|-
| 1.50-3.60 || 0x6CC9C1A1
+
| 3.60 || moved to ForDriver
 
|}
 
|}
  
On 1.69, this seems to be implemented incorrectly.
+
=== SceSysclibForKernel_F7E34376 ===
 
 
=== memset ===
 
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x0AB9BF5C
+
| 1.50 || 0xF7E34376
 
|}
 
|}
  
=== memset2 ===
+
=== SceSysclibForKernel_FA746181 ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-1.69 || 0x502B000D
+
| 0.990-1.50 || 0xFA746181
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
=== lshift_1 ===
+
return a1 * (- 0x6e19295b) - 0x6e19295b;
{| class="wikitable"
+
 
|-
+
In SceSysmem it is used internally to modify a global variable, like a multiplication hash function would do.
! Version !! NID
+
 
|-
+
<source lang="C">int SceSysclibForKernel_FA746181(int a1);</source>
| 0.931-3.60 || 0xE46C47E6
+
 
|}
+
== SceSysclibForDriver ==
  
This is a temporary name.
+
The C standard library for use in kernel only. Usermode has access to [[SceLibKernel]], which confusingly is usermode only.
  
Returns the computation of a lot of shifts using the three arguments.
+
Includes standard string functions (no insecure variants like <code>strcpy</code>).
  
=== lshift_2 ===
+
=== __aeabi_idiv ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x72D31F9D
+
| 3.60 || 0x2518CD9E
 
|}
 
|}
  
This is a temporary name.
+
=== __aeabi_lcmp ===
 
 
Returns the computation of a lot of shifts using the three arguments.
 
 
 
=== rshift ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x1D89F6C0
+
| 3.60 || 0x709077A1
 
|}
 
|}
  
=== snprintf ===
+
=== __aeabi_lmul ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xAE7A8981
+
| 3.60 || 0xFEE5E751
 
|}
 
|}
  
=== strchr ===
+
=== __aeabi_uidiv ===
 
{| class="wikitable"
 
{| class="wikitable"
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.50-3.60 || 0x38463759
+
| 0.990-3.60 || 0xA9FF1205
 
|}
 
|}
  
=== strcmp ===
+
=== __aeabi_uidivmod ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x0B33BC43
+
| 0.990-3.60 || 0xA46CB7DE
 
|}
 
|}
  
=== strlcat ===
+
=== __aeabi_ldivmod ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x12504E09
+
| 3.60 || 0x7554AB04
 
|}
 
|}
  
=== strlcpy ===
+
=== __aeabi_ulcmp ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7FB4EBEC
+
| 0.931-3.60 || 0xFE900DE8
 
|}
 
|}
  
=== strlen ===
+
=== __memcpy_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xCFC6A9AC
+
| 3.60 || 0x8A0B0815
 
|}
 
|}
  
=== strncat ===
+
=== __memmove_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xA1D1C32C
+
| 3.60 || 0x35DBB110
 
|}
 
|}
  
=== strncmp ===
+
=== __memset_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.60-3.60 || 0x12CEE649
+
| 3.60 || 0x1A30BB28
 
|}
 
|}
  
=== strncpy ===
+
=== __stack_chk_fail ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x6D286146
+
| 1.50-3.60 || 0xB997493D
 
|}
 
|}
  
=== strncpy_s ===
+
=== __stack_chk_guard ===
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || not present
+
| 3.60 || 0x99EEBD1F
|-
 
| 0.990-3.60 || 0xFE39AEAC
 
 
|}
 
|}
  
=== strnlen ===
+
This is a variable.
 +
 
 +
=== __strlcat_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0xCD4BD884
+
| 3.60 || 0x224BE33F
 
|}
 
|}
  
=== strrchr ===
+
=== __strlcpy_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x7F0E0835
+
| 3.60 || 0xCF86EA38
 
|}
 
|}
  
=== strstr ===
+
=== __strncat_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 1.69-3.60 || 0x1304A69D
+
| 3.60 || 0x33EE298B
 
|}
 
|}
  
=== strtol ===
+
=== __strncpy_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xAB77C5AA
+
| 3.60 || 0x96268C53
 
|}
 
|}
  
=== SceSysclibForDriver_32373DF7 ===
+
=== __snprintf_chk ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x32373DF7
+
| 3.60 || 0x7DBE7007
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
Helper for strtol in base 10.
+
=== __vsnprintf_chk ===
 
 
<source lang="C">int SceSysclibForDriver_32373DF7(char *__nptr, long *plResult);</source>
 
 
 
=== strtoll ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x87AAAFA2
+
| 0.931-0.990 || not present
 +
|-
 +
| 3.60 || 0xCBF64DF6
 
|}
 
|}
  
=== strtoul ===
+
=== __vsnprintf_internal ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x4E5042DA
+
| 0.931 || in ForKernel
 +
|-
 +
| 3.60 || 0xE38E7605
 
|}
 
|}
  
=== tolower ===
+
<source lang="C">void __vsnprintf_internal(void (* cb)(void *argp, int ch), void *argp, const char *fmt, va_list list);</source>
 +
 
 +
Supported format
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Version !! NID
+
! Format !! Description
 
|-
 
|-
| 3.60 || 0x0021DAF9
+
| \x20 || maybe space fill
|}
 
 
 
=== toupper ===
 
{| class="wikitable"
 
 
|-
 
|-
! Version !! NID
+
| # || unknown
 
|-
 
|-
| 3.60 || 0xA685DCB1
+
| * || unknown
 +
|-
 +
| - || Left align
 +
|-
 +
| + || unknown
 +
|-
 +
| . || unknown
 +
|-
 +
| 0 || Padding number and Enter zero padding
 +
|-
 +
| 1~9 || Padding number
 +
|-
 +
| D || unknown (maybe with long?)
 +
|-
 +
| L || unknown (maybe with long?)
 +
|-
 +
| O || unknown (maybe with long?)
 +
|-
 +
| U || unknown (maybe with long?)
 +
|-
 +
| X || print hex number as uppercase
 +
|-
 +
| c || print char
 +
|-
 +
| d || print decimal number
 +
|-
 +
| h || unknown
 +
|-
 +
| l || long
 +
|-
 +
| o || unknown
 +
|-
 +
| p || print pointer as lowercase
 +
|-
 +
| s || print strings
 +
|-
 +
| u || unsigned number
 +
|-
 +
| x || print hex number as lowercase
 
|}
 
|}
  
=== SceSysclibForDriver_9D148CDE ===
+
=== sortof_vsnprintf ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x9D148CDE
+
| 0.931-0.990 || 0x589BAF6B
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
might __aeabi_uldivmod.
+
This is a temporary name.
  
Returns the 64-bit quotient of the division of dividend by divisor.
+
=== sortof_vsnprintf_2 ===
 
 
Used for example to convert [[SceRtc]] ticks to a simpler format (divide by time unit in ms) or to compute the number of storage device blocks in [[SceSdstor]] (divide by block size).
 
 
 
<source lang="C">
 
// ex: SceSysclibForDriver_9D148CDE(tick[0] + 0xd44000, (tick[1] - 0xdcbfff) + (uint)(0xff2bbfff < tick[0]), 1000000,0);
 
SceUInt64 SceSysclibForDriver_9D148CDE(SceUInt32 dividend_low, SceUInt32 dividend_hi, SceUInt32 divisor_low, SceUInt32 divisor_hi);
 
</source>
 
 
 
=== SceSysclibForDriver_33388DBC ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x33388DBC
+
| 0.931-0.990 || 0x658EA38E
 
|-
 
|-
 
| 3.60 || not present
 
| 3.60 || not present
 
|}
 
|}
  
Calculates xor of a1 and a2, then does some calculation with a3.
+
This is a temporary name.
  
=== SceSysclibForDriver_72429909 ===
+
=== vsnprintf ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x72429909
+
| 0.931-3.60 || 0x3DDBE2E1
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
== SceSysrootForKernel ==
+
<source>int vsnprintf(char *s, size_t n, const char *fmt, va_list arg);</source>
  
=== SceSysrootForKernel_611F17A4 ===
+
=== get_ctype_table ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x611F17A4
+
| 0.931-0.990 || 0x0614B013
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Registers the function called by [[#SceSysrootForKernel_118657C6]].
+
=== look_ctype_table ===
 
 
<source lang="C">int SceSysrootForKernel_611F17A4(void *func);</source>
 
 
 
=== SceSysrootForKernel_118657C6 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.65 || 0x118657C6
+
| 3.60 || 0xCDF7F155
 
|}
 
|}
  
Calls the function registered by [[#SceSysrootForKernel_611F17A4]].
+
=== memchr ===
 
 
Used in [[SceExcpmgr]].
 
 
 
<source lang="C">SceKernelProcessContext* SceSysrootForKernel_118657C6(void);</source>
 
 
 
=== SceSysrootForKernel_081F2C20 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || not present
+
| 3.60 || 0x60DAEA30
 +
|}
 +
 
 +
=== timingsafe_memcmp ===
 +
{| class="wikitable"
 
|-
 
|-
| 1.60-1.69 || 0x081F2C20
+
! Version !! NID
 
|-
 
|-
| 3.60 || not present
+
| 3.60 || 0xB5A4D745
 
|}
 
|}
  
Registers sceKernelGetProcessId_2 from [[SceKernelThreadMgr]].
+
timing constant memcmp
  
<source lang="C">int SceSysrootForKernel_081F2C20(void *func);</source>
+
=== memcmp ===
 
 
=== SceSysrootForKernel_C5EAF5F7 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xC5EAF5F7
+
| 0.931-3.60 || 0xF939E83D
 
|}
 
|}
  
Registers the function called by [[#SceSysrootForKernel_47724459]].
+
=== memcpy ===
 
 
<source lang="C">int SceSysrootForKernel_C5EAF5F7(void *func);</source>
 
 
 
=== SceSysrootForKernel_47724459 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x47724459
+
| 0.931-3.60 || 0x40C88316
 
|}
 
|}
  
Calls the function registered by [[#SceSysrootForKernel_C5EAF5F7]].
+
=== memmove ===
 
 
=== SceSysrootForKernel_8747D415 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x8747D415
+
| 1.50-3.60 || 0x6CC9C1A1
 
|}
 
|}
  
Registers the function used by [[#SceSysrootForKernel_B27B7530]].
+
On 1.69, this seems to be implemented incorrectly.
  
<source lang="C">int SceSysrootForKernel_8747D415(void *func);</source>
+
=== memset ===
 
 
=== SceSysrootForKernel_B27B7530 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xB27B7530
+
| 0.931-3.60 || 0x0AB9BF5C
 
|}
 
|}
  
Calls the function registered by [[#SceSysrootForKernel_8747D415]].
+
=== memset2 ===
 
 
Used by [[SceKernelBusError]].
 
 
 
=== SceSysrootForKernel_82FC6405 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x82FC6405
+
| 0.931-1.69 || 0x502B000D
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Registers the function used by [[#SceSysrootForKernel_CD4B84F7]].
+
=== lshift_1 ===
 
 
Used by [[SceKernelBusError]].
 
 
 
<source lang="C">int SceSysrootForKernel_82FC6405(void *func);</source>
 
 
 
=== SceSysrootForKernel_CD4B84F7 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xCD4B84F7
+
| 0.931-3.60 || 0xE46C47E6
 
|}
 
|}
  
Calls the function registered by [[#SceSysrootForKernel_82FC6405]].
+
This is a temporary name.
  
Used by [[SceKernelBusError]].
+
Returns the computation of a lot of shifts using the three arguments.
  
=== SceSysrootForKernel_733C243E ===
+
=== lshift_2 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x733C243E
+
| 0.931-3.60 || 0x72D31F9D
 
|}
 
|}
  
Registers many Sysroot [[SceProcessmgr]] callbacks.
+
This is a temporary name.
  
<source lang="C">int SceSysrootForKernel_733C243E(const SceSysrootForKernel_733C243E_struct *pParam);</source>
+
Returns the computation of a lot of shifts using the three arguments.
  
=== SceSysrootForKernel_7334F1E8 ===
+
=== rshift ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x7334F1E8
+
| 0.931-3.60 || 0x1D89F6C0
 
|}
 
|}
  
Calls [[SceProcessmgr#SceProcessmgrForKernel_C77C2085]] function registered by [[#SceSysrootForKernel_733C243E]].
+
=== snprintf ===
 
 
<source lang="C">int SceSysrootForKernel_7334F1E8(SceUID pid);</source>
 
 
 
=== SceSysrootForKernel_D29BCA77 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xD29BCA77
+
| 1.69-3.60 || 0xAE7A8981
 
|}
 
|}
  
Registers many Sysroot [[SceProcessmgr]] callbacks.
+
=== strchr ===
 
 
<source lang="C">int SceSysrootForKernel_D29BCA77(const SceSysrootForKernel_D29BCA77_struct *pParam);</source>
 
 
 
=== SceSysrootForKernel_DD7821AA ===
 
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xDD7821AA
+
| 1.50-3.60 || 0x38463759
 
|}
 
|}
  
Register the function called by [[#SceSysrootForKernel_340575CB]].
+
=== strcmp ===
 
 
<source lang="C">int SceSysrootForKernel_DD7821AA(void *func);</source>
 
 
 
=== SceSysrootForKernel_340575CB ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x340575CB
+
| 1.69-3.60 || 0x0B33BC43
 
|}
 
|}
  
Return some PID.
+
=== strlcat ===
 
 
<source lang="C">SceUID SceSysrootForKernel_340575CB(void);</source>
 
 
 
=== sceKernelSysrootSetCheckRemapCodeForUserFuncForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xBE1EF51C
+
| 3.60 || 0x12504E09
 
|}
 
|}
  
Registers the function called by [[#sceKernelSysrootCheckRemapCodeForUserForKernel]].
+
=== strlcpy ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 3.60 || 0x7FB4EBEC
 +
|}
  
<source lang="C">int sceKernelSysrootSetCheckRemapCodeForUserFuncForKernel(void *func);</source>
+
=== strlen ===
 +
{| class="wikitable"
 +
|-
 +
! Version !! NID
 +
|-
 +
| 0.931-3.60 || 0xCFC6A9AC
 +
|}
  
=== sceKernelSysrootCheckRemapCodeForUserForKernel ===
+
=== strncat ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xF8769E86
+
| 1.69-3.60 || 0xA1D1C32C
 
|}
 
|}
  
=== sceKernelSysrootAllocCurrentProcessHeapForKernel ===
+
=== strncmp ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x2F75C1DC
+
| 1.60-3.60 || 0x12CEE649
 
|}
 
|}
  
<source lang="C">void *sceKernelSysrootAllocCurrentProcessHeapForKernel(SceSize size);</source>
+
=== strncpy ===
 
 
=== sceKernelSysrootCorelockUnlockForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xAE55B7CC
+
| 0.931-3.60 || 0x6D286146
 
|}
 
|}
  
Calls [[#SceCpuForKernel_A5C9DBBA]].
+
=== strncpy_s ===
 
 
<source lang="C">void sceKernelSysrootCorelockUnlockForKernel(void);</source>
 
 
 
=== SceSysrootForKernel_21F5790B ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
Line 8,362: Line 8,414:
 
| 0.931 || not present
 
| 0.931 || not present
 
|-
 
|-
| 3.60 || 0x21F5790B
+
| 0.990-3.60 || 0xFE39AEAC
 
|}
 
|}
  
Registers a function related to kernel panic.
+
=== strnlen ===
 
 
<source lang="C">int SceSysrootForKernel_21F5790B(void *func);</source>
 
 
 
=== SceSysrootForKernel_0DF574A9 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || not present
+
| 1.69-3.60 || 0xCD4BD884
|-
 
| 3.60 || 0x0DF574A9
 
 
|}
 
|}
  
Calls the function related to kernel panic registered by [[#SceSysrootForKernel_21F5790B]].
+
=== strrchr ===
 
 
<source lang="C">int SceSysrootForKernel_0DF574A9(void);</source>
 
 
 
=== SceSysrootForKernel_2D6B2A79 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x2D6B2A79
+
| 1.69-3.60 || 0x7F0E0835
 
|}
 
|}
  
Registers a function related to kernel panic, called by [[#SceSysrootForKernel_CC7A0E63]].
+
=== strstr ===
 
 
=== SceSysrootForKernel_CC7A0E63 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xCC7A0E63
+
| 1.69-3.60 || 0x1304A69D
 
|}
 
|}
  
Calls a function related to kernel panic, registered by [[#SceSysrootForKernel_2D6B2A79]].
+
=== strtol ===
 
 
<source lang="C">
 
// type: 1: kernel_assertion_or_panic, 3: kernel_exception
 
// size: must be <= 0x1000
 
// pBuf: address of the buffer got using SceDebugForKernel_BEF921A2
 
int SceSysrootForKernel_CC7A0E63(int type, SceSize size, const char *pBuf);
 
</source>
 
 
 
=== SceSysrootForKernel_1D84C4D4 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || not present
+
| 0.931-3.60 || 0xAB77C5AA
|-
 
| 3.60-3.65 || 0x1D84C4D4
 
 
|}
 
|}
  
Get module name, dbgFingerprint and base from address.
+
=== SceSysclibForDriver_32373DF7 ===
 
 
<source lang="C">
 
int SceSysrootForKernel_1D84C4D4(SceUID pid, uintptr_t address, SceUInt32 *pDbgFingerprint, SceUInt32 *pModuleBase, char *module_name);</source>
 
 
 
=== SceSysrootForKernel_5B5EBFB1 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x5B5EBFB1
+
| 0.931-0.990 || 0x32373DF7
 +
|-
 +
| 3.60 || not present
 
|}
 
|}
  
Registers pointer to SceLT5 used by [[#SceSysrootForKernel_E20F6FC8]].
+
Helper for strtol in base 10.
  
<source lang="C">int SceSysrootForKernel_5B5EBFB1(uint a1);</source>
+
<source lang="C">int SceSysclibForDriver_32373DF7(char *__nptr, long *plResult);</source>
  
=== SceSysrootForKernel_41636522 ===
+
=== strtoll ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x41636522
+
| 3.60 || 0x87AAAFA2
 
|}
 
|}
  
Returns current SceLT5 value pointed by pointer registered using [[#SceSysrootForKernel_E20F6FC8]]. Long/low (64bit) time in microseconds. It is about "awake" uptime from system boot.
+
=== strtoul ===
 
 
<source lang="C">uint64_t SceSysrootForKernel_41636522(void);</source>
 
 
 
=== SceSysrootForKernel_E20F6FC8 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931 || not present
+
| 3.60 || 0x4E5042DA
|-
 
| 3.60-3.65 || 0xE20F6FC8
 
 
|}
 
|}
  
Same as [[#SceSysrootForKernel_41636522]] but "asynchronous".
+
=== tolower ===
 
 
Used by SceDebug Kernel Exceptions handlers.
 
 
 
<source lang="C">uint64_t SceSysrootForKernel_E20F6FC8(void);</source>
 
 
 
=== SceSysrootForKernel_1D8DB3A5 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x1D8DB3A5
+
| 3.60 || 0x0021DAF9
 
|}
 
|}
  
Same as [[#SceSysrootForKernel_41636522]] but "asynchronous".
+
=== toupper ===
 
 
Returns 0 on success, 0x80020006 if pTime is a NULL pointer.
 
 
 
<source lang="C">int SceSysrootForKernel_1D8DB3A5(SceUInt64 *pTime);</source>
 
 
 
=== sceKernelSysrootCorelockLockForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x8E4B61F1
+
| 3.60 || 0xA685DCB1
 
|}
 
|}
  
Calls SceCpuForKernel_9D72DD1B.
+
=== SceSysclibForDriver_9D148CDE ===
 
 
<source lang="C">int sceKernelSysrootCorelockLockForKernel(SceUInt32 core);</source>
 
 
 
=== SceSysrootForKernel_06182D59 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 3.60 || 0x06182D59
+
| 0.931-3.60 || 0x9D148CDE
 
|}
 
|}
  
Reimplementation:
+
might __aeabi_uldivmod.
 +
 
 +
Returns the 64-bit quotient of the division of dividend by divisor.
 +
 
 +
Used for example to convert [[SceRtc]] ticks to a simpler format (divide by time unit in ms) or to compute the number of storage device blocks in [[SceSdstor]] (divide by block size).
 +
 
 
<source lang="C">
 
<source lang="C">
int SceSysrootForKernel_06182D59(int a1) {
+
// ex: SceSysclibForDriver_9D148CDE(tick[0] + 0xd44000, (tick[1] - 0xdcbfff) + (uint)(0xff2bbfff < tick[0]), 1000000,0);
return *(uint32_t *)(pSysroot + 0x20) + (a1 << 0x5);
+
SceUInt64 SceSysclibForDriver_9D148CDE(SceUInt32 dividend_low, SceUInt32 dividend_hi, SceUInt32 divisor_low, SceUInt32 divisor_hi);
}
 
 
</source>
 
</source>
  
<source>int SceSysrootForKernel_06182D59(int a1);</source>
+
=== SceSysclibForDriver_33388DBC ===
 
 
=== SceSysrootForKernel_7385CADE ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || not present
+
| 0.931-0.990 || 0x33388DBC
 
|-
 
|-
| 3.60 || 0x7385CADE
+
| 3.60 || not present
 
|}
 
|}
  
Get current syscall PID.
+
Calculates xor of a1 and a2, then does some calculation with a3.
  
<source lang="C">
+
=== SceSysclibForDriver_72429909 ===
// Returns KERNEL_PID if the function has not been set
 
SceUID SceSysrootForKernel_7385CADE(void);
 
</source>
 
 
 
=== SceSysrootForKernel_D441DC34 ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || not present
+
| 0.931-0.990 || 0x72429909
 
|-
 
|-
| 3.60 || 0xD441DC34
+
| 3.60 || not present
 
|}
 
|}
  
Executes a function registered by [[#SceSysrootForKernel_26458702]], related to syscall frame printing on kernel panic.
+
== SceSysrootForKernel ==
  
=== get_SceKernelSysrootClass_itemsize ===
+
=== sceKernelSysrootRegisterDbgpHandlerForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xEEB867C0
+
| 3.60 || 0x3999F917
 
|}
 
|}
  
On FW 0.990 return hardcoded value 0x470.
+
<source lang="C">int sceKernelSysrootRegisterDbgpHandlerForKernel(SceSysrootDbgpHandler *handler);</source>
  
On FW 3.60 return hardcoded value 0x41C.
+
=== SceSysrootForKernel_611F17A4 ===
 
 
<source lang="C">SceSize get_SceKernelSysrootClass_itemsize(void);</source>
 
 
 
=== get_SceKernelSysrootClass_object ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x085C2BCB
+
| 0.931-3.60 || 0x611F17A4
 
|}
 
|}
  
<source lang="C">SceKernelObject *get_SceKernelSysrootClass_object(void);</source>
+
Registers the function called by [[#SceSysrootForKernel_118657C6]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_611F17A4(void *func);</source>
  
=== sceKernelSysrootGetLibraryDBForKernel ===
+
=== SceSysrootForKernel_118657C6 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xCD70C9D7
+
| 0.931-3.65 || 0x118657C6
 
|}
 
|}
  
=== sceKernelSysrootSetLibraryDBForKernel ===
+
Calls the function registered by [[#SceSysrootForKernel_611F17A4]].
 +
 
 +
Used in [[SceExcpmgr]].
 +
 
 +
<source lang="C">SceKernelProcessContext* SceSysrootForKernel_118657C6(void);</source>
 +
 
 +
=== SceSysrootForKernel_081F2C20 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xCB58A0F4
+
| 0.931-0.990 || not present
|}
+
|-
 +
| 1.60-1.69 || 0x081F2C20
 +
|-
 +
| 3.60 || not present
 +
|}
  
=== sceKernelSysrootAllocForKernel ===
+
Registers sceKernelGetProcessId_2 from [[SceKernelThreadMgr]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_081F2C20(void *func);</source>
 +
 
 +
=== SceSysrootForKernel_C5EAF5F7 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.940-0.990 || 0xB0149E69
+
| 0.990-3.60 || 0xC5EAF5F7
 
|}
 
|}
  
<source lang="C">void *sceKernelSysrootAllocForKernel(SceSize size);</source>
+
Registers the function called by [[#SceSysrootForKernel_47724459]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_C5EAF5F7(void *func);</source>
  
=== sceKernelSysrootSetStatusForKernel ===
+
=== SceSysrootForKernel_47724459 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xA84676E3
+
| 0.990-3.60 || 0x47724459
 
|}
 
|}
  
 +
Calls the function registered by [[#SceSysrootForKernel_C5EAF5F7]].
 +
 +
=== SceSysrootForKernel_8747D415 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! status !! description
+
! Version !! NID
 
|-
 
|-
| 3 || Global malloc heap initialization completed.
+
| 0.990-3.60 || 0x8747D415
|-
 
| 4 || Start initialization for load the module
 
|-
 
| 0x10 || Initialization to load the module is complete
 
|-
 
| 0x100 || First process create
 
|-
 
| 0x1000 || Kernel boot completed.
 
 
|}
 
|}
  
<source lang="C">int sceKernelSysrootSetStatusForKernel(SceUInt32 status);</source>
+
Registers the function used by [[#SceSysrootForKernel_B27B7530]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_8747D415(void *func);</source>
  
=== sceKernelSysrootGetProcessCBExitDeleteThreadForKernel ===
+
=== SceSysrootForKernel_B27B7530 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xBBFD2E3C
+
| 0.990-3.60 || 0xB27B7530
 
|}
 
|}
  
=== sceKernelSysrootGetCurrentProcessCBForKernel ===
+
Calls the function registered by [[#SceSysrootForKernel_8747D415]].
 +
 
 +
Used by [[SceKernelBusError]].
 +
 
 +
=== SceSysrootForKernel_82FC6405 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x9991B1AF
+
| 0.990-3.60 || 0x82FC6405
 
|}
 
|}
  
=== sceKernelSysrootGetCurrentThreadAttrForKernel ===
+
Registers the function used by [[#SceSysrootForKernel_CD4B84F7]].
 +
 
 +
Used by [[SceKernelBusError]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_82FC6405(void *func);</source>
 +
 
 +
=== SceSysrootForKernel_CD4B84F7 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x73601453
+
| 0.990-3.60 || 0xCD4B84F7
 
|}
 
|}
  
<source lang="C">int sceKernelSysrootGetCurrentThreadAttrForKernel(SceUint32 *pThrAttr);</source>
+
Calls the function registered by [[#SceSysrootForKernel_82FC6405]].
 +
 
 +
Used by [[SceKernelBusError]].
  
=== sceKernelSysrootGetCurrentTimeForKernel ===
+
=== SceSysrootForKernel_733C243E ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x4FCFA359
+
| 0.990-3.60 || 0x733C243E
 
|}
 
|}
  
<source lang="C">SceRtcTick *sceKernelSysrootGetCurrentTimeForKernel(void);</source>
+
Registers many Sysroot [[SceProcessmgr]] callbacks.
 +
 
 +
<source lang="C">int SceSysrootForKernel_733C243E(const SceSysrootForKernel_733C243E_struct *pParam);</source>
  
=== sceKernelSysrootGetSystemTimeForKernel ===
+
=== SceSysrootForKernel_7334F1E8 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0xE0D41319
+
| 3.60 || 0x7334F1E8
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelSysrootGetSystemTimeForKernel(SceRtcTick *pTick)</source>
+
Calls [[SceProcessmgr#SceProcessmgrForKernel_C77C2085]] function registered by [[#SceSysrootForKernel_733C243E]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_7334F1E8(SceUID pid);</source>
  
=== sceKernelSysrootGetSystemTimeLowForKernel ===
+
=== SceSysrootForKernel_D29BCA77 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x2464329D
+
| 0.990-3.60 || 0xD29BCA77
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="C">int sceKernelSysrootGetSystemTimeLowForKernel(void);</source>
+
Registers many Sysroot [[SceProcessmgr]] callbacks.
 +
 
 +
<source lang="C">int SceSysrootForKernel_D29BCA77(const SceSysrootForKernel_D29BCA77_struct *pParam);</source>
  
=== sceKernelSysrootAssertSysrootForKernel ===
+
=== SceSysrootForKernel_DD7821AA ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990 || 0x1B7F150F
+
| 0.990-3.60 || 0xDD7821AA
 
|}
 
|}
  
Check sysroot->magic (offset 0xC must be 0xBA97F5A1) and sysroot->magic2 (offset 0x20C must be 0xA008B0C3‬).
+
Register the function called by [[#SceSysrootForKernel_340575CB]].
  
<source lang="C">int sceKernelSysrootAssertSysrootForKernel(void *sysroot);</source>
+
<source lang="C">int SceSysrootForKernel_DD7821AA(void *func);</source>
  
=== sceKernelSysrootSetVbaseResetVectorForKernel ===
+
=== SceSysrootForKernel_340575CB ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x0F2F2B4E
+
| 0.990-3.60 || 0x340575CB
 
|}
 
|}
  
=== sceKernelSysrootThreadMgrStartAfterProcessForKernel ===
+
Return some PID.
 +
 
 +
<source lang="C">SceUID SceSysrootForKernel_340575CB(void);</source>
 +
 
 +
=== sceKernelSysrootSetCheckRemapCodeForUserFuncForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x0EB5D7CD
+
| 0.990-3.60 || 0xBE1EF51C
 
|}
 
|}
  
=== sceKernelSysrootGetCurrentProcessForKernel ===
+
Registers the function called by [[#sceKernelSysrootCheckRemapCodeForUserForKernel]].
 +
 
 +
<source lang="C">int sceKernelSysrootSetCheckRemapCodeForUserFuncForKernel(void *func);</source>
 +
 
 +
=== sceKernelSysrootCheckRemapCodeForUserForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-0.990 || 0x5B7570C5
+
| 0.990-3.60 || 0xF8769E86
 
|}
 
|}
  
Return the current process id.
+
=== sceKernelSysrootAllocCurrentProcessHeapForKernel ===
 
 
<source lang="C">SceUID sceKernelSysrootGetCurrentProcessForKernel(void);</source>
 
 
 
=== sceKernelSysrootTrapThreadAfterSyscallForKernel ===
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x9139E22B
+
| 0.990-3.60 || 0x2F75C1DC
 
|}
 
|}
  
=== sceKernelSysrootReturnFromExcpToThreadForKernel ===
+
<source lang="C">void *sceKernelSysrootAllocCurrentProcessHeapForKernel(SceSize size);</source>
 +
 
 +
=== sceKernelSysrootCorelockUnlockForKernel ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.65 || 0xDADFF828
+
| 0.931-3.60 || 0xAE55B7CC
 
|}
 
|}
  
Used in [[SceExcpmgr]].
+
Calls [[#SceCpuForKernel_A5C9DBBA]].
  
<source lang="C">int sceKernelSysrootReturnFromExcpToThreadForKernel(void);</source>
+
<source lang="C">void sceKernelSysrootCorelockUnlockForKernel(void);</source>
  
=== sceKernelSysrootBacktraceForKernel ===
+
=== SceSysrootForKernel_21F5790B ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0xCC893F37
+
| 0.931 || not present
 +
|-
 +
| 3.60 || 0x21F5790B
 
|}
 
|}
  
See also [[SceKernelModulemgr#SceBacktraceForDriver]].
+
Registers a function related to kernel panic.
  
<source lang="C">int sceKernelSysrootBacktraceForKernel(SceUID threadId, SceKernelCallFrame *pCallFrameBuffer, SceSize numBytesBuffer, SceUInt32 *pNumReturn, SceInt32 mode);</source>
+
<source lang="C">int SceSysrootForKernel_21F5790B(void *func);</source>
  
=== sceKernelSysrootPrintBacktraceForKernel ===
+
=== SceSysrootForKernel_0DF574A9 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.931-3.60 || 0x491CE8DF
+
| 0.931 || not present
 +
|-
 +
| 3.60 || 0x0DF574A9
 
|}
 
|}
  
See also [[SceKernelModulemgr#SceBacktraceForDriver]].
+
Calls the function related to kernel panic registered by [[#SceSysrootForKernel_21F5790B]].
  
<source lang="C">int sceKernelSysrootPrintBacktraceForKernel(SceUID processId, const SceKernelCallFrame *pCallFrame, SceUInt32 numFrames);</source>
+
<source lang="C">int SceSysrootForKernel_0DF574A9(void);</source>
  
=== sceKernelSysrootRegisterBacktraceForKernel ===
+
=== SceSysrootForKernel_2D6B2A79 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.940 || 0x1C307A31
+
| 0.990-3.60 || 0x2D6B2A79
|-
 
| 3.60 || not present
 
 
|}
 
|}
  
<source lang="c">int sceKernelSysrootRegisterBacktraceForKernel(int (__cdecl *func)());</source>
+
Registers a function related to kernel panic, called by [[#SceSysrootForKernel_CC7A0E63]].
  
=== sceKernelSysrootGetSharedMemoryForKernel ===
+
=== SceSysrootForKernel_CC7A0E63 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xC8C8C321
+
| 0.990-3.60 || 0xCC7A0E63
 
|}
 
|}
  
=== sceKernelSysrootSetSharedMemoryForKernel ===
+
Calls a function related to kernel panic, registered by [[#SceSysrootForKernel_2D6B2A79]].
 +
 
 +
<source lang="C">
 +
// type: 1: kernel_assertion_or_panic, 3: kernel_exception
 +
// size: must be <= 0x1000
 +
// pBuf: address of the buffer got using SceDebugForKernel_BEF921A2
 +
int SceSysrootForKernel_CC7A0E63(int type, SceSize size, const char *pBuf);
 +
</source>
 +
 
 +
=== SceSysrootForKernel_1D84C4D4 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0xFBB91741
+
| 0.931 || not present
 +
|-
 +
| 3.60-3.65 || 0x1D84C4D4
 
|}
 
|}
  
=== sceKernelSysrootGetPUIDEntryHeapForKernel ===
+
Get module name, dbgFingerprint and base from address.
 +
 
 +
<source lang="C">
 +
int SceSysrootForKernel_1D84C4D4(SceUID pid, uintptr_t address, SceUInt32 *pDbgFingerprint, SceUInt32 *pModuleBase, char *module_name);</source>
 +
 
 +
=== SceSysrootForKernel_5B5EBFB1 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x88DE85EF
+
| 3.60 || 0x5B5EBFB1
 
|}
 
|}
  
<source lang="C">int sceKernelSysrootGetPUIDEntryHeapForKernel(SceUID pid, void **entryHeap);</source>
+
Registers pointer to SceLT5 used by [[#SceSysrootForKernel_E20F6FC8]].
 +
 
 +
<source lang="C">int SceSysrootForKernel_5B5EBFB1(uint a1);</source>
  
=== sceKernelSysrootGetStatusForKernel ===
+
=== SceSysrootForKernel_41636522 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
 
! Version !! NID
 
! Version !! NID
 
|-
 
|-
| 0.990-3.60 || 0x5C426B19
+
| 3.60 || 0x41636522
 
|}
 
|}
  
<source lang="C">int sceKernelSysrootGetStatusForKernel(void);</source>
+
Returns current SceLT5 value pointed by pointer registered using [[#SceSysrootForKernel_E20F6FC8]]. Long/low (64bit) time in microseconds. It is about "awake" uptime from system bo